├── .gitignore ├── LICENSE ├── README.md ├── TODO.md ├── USAGE.md ├── main.go ├── photo.go ├── puppies.sqlite └── static ├── bower.json ├── css ├── app.css └── icono.min.css ├── index.html ├── js ├── app.js ├── controllers.js └── factory.js ├── package.json └── partials ├── puppies.html └── top-puppies.html /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files, Static and Dynamic libs (Shared Objects) 2 | *.o 3 | *.a 4 | *.so 5 | 6 | # Folders 7 | _obj 8 | _test 9 | 10 | # Architecture specific extensions/prefixes 11 | *.[568vq] 12 | [568vq].out 13 | 14 | *.cgo1.go 15 | *.cgo2.c 16 | _cgo_defun.c 17 | _cgo_gotypes.go 18 | _cgo_export.* 19 | 20 | _testmain.go 21 | 22 | *.exe 23 | *.test 24 | *.prof 25 | go-angular 26 | 27 | bower_components/ 28 | node_modules/ 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Seshachalam Malisetti 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # go-angular 2 | 1. [USAGE](https://github.com/mseshachalam/go-angular/blob/master/USAGE.md) 3 | 2. [TODO](https://github.com/mseshachalam/go-angular/blob/master/TODO.md) 4 | 5 | angular js web app(backed by golang) to show and rate cute puppies 6 | 7 | 1. create http server with golang 8 | * expose apis 9 | * fetch puppies 10 | * like a puppy 11 | * dislike a puppy :( 12 | 13 | 2. fetch cute puppies(all are cute) images from [Flickr Photo Search API](https://flickr https://www.flickr.com/services/api/flickr.photos.search.html "Flickr Photo Search") 14 | 15 | * add models to represent the photos from flickr 16 | * initialize votes on a new photo to 0 17 | * add orm to deal with databases(sqlite/mysql) 18 | 19 | 3. web app 20 | * use bootstrap 21 | * use angular js 22 | * call fetch puppies api 23 | * display fetched puppies in a grid with pagination 24 | * give options to like or dislike 25 | * options to sort based on most voted/by time 26 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | return error messages for http apis 2 | 3 | display error messages in web app 4 | 5 | beautify the web app 6 | 7 | move the common functions between the angular controllers 8 | 9 | use node http server to serve the static files from `static` directory and update the urls from relative to absolute in the web app 10 | -------------------------------------------------------------------------------- /USAGE.md: -------------------------------------------------------------------------------- 1 | use bower install in the static directory 2 | 3 | to install bowe use npm install in the static directory 4 | 5 | build and run(??) go files and visi http://localhost:8080 6 | 7 | click on any image to view it in full screen 8 | 9 | up/down vote by clicking smile/frown 10 | 11 | use the top links to switch between the all puppies and most voted puppies 12 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | // go-angular project main.go 2 | package main 3 | 4 | import ( 5 | "encoding/json" 6 | "encoding/xml" 7 | "github.com/gorilla/mux" 8 | "io/ioutil" 9 | "log" 10 | "net/http" 11 | "net/url" 12 | "strconv" 13 | ) 14 | 15 | const ( 16 | FlickrEndPoint = "https://api.flickr.com/services/rest" 17 | FlickrQuery = "flickr.photos.search" 18 | FlickrKey = "300d436fa36986e197efe2a62682e05b" 19 | PathPrefix = "/pups" 20 | TopPupsPrefix = "/top" 21 | ) 22 | 23 | // badRequest is handled by setting the status code in the reply to StatusBadRequest. 24 | type badRequest struct{ error } 25 | 26 | // notFound is handled by setting the status code in the reply to StatusNotFound. 27 | type notFound struct{ error } 28 | 29 | // errorHandler wraps a function returning an error by handling the error and returning a http.Handler. 30 | // If the error is of the one of the types defined above, it is handled as described for every type. 31 | // If the error is of another type, it is considered as an internal error and its message is logged. 32 | func errorHandler(f func(w http.ResponseWriter, r *http.Request) error) http.HandlerFunc { 33 | return func(w http.ResponseWriter, r *http.Request) { 34 | err := f(w, r) 35 | if err == nil { 36 | return 37 | } 38 | switch err.(type) { 39 | case badRequest: 40 | http.Error(w, err.Error(), http.StatusBadRequest) 41 | case notFound: 42 | http.Error(w, "task not found", http.StatusNotFound) 43 | default: 44 | log.Println(err) 45 | http.Error(w, "oops", http.StatusInternalServerError) 46 | } 47 | } 48 | } 49 | 50 | func ListTopPuppies(w http.ResponseWriter, r *http.Request) { 51 | page := mux.Vars(r)["page"] 52 | if page == "" { 53 | page = "0" 54 | } 55 | 56 | imageManager := NewImageManager() 57 | dbError := imageManager.InitDB(false) 58 | if dbError != nil { 59 | log.Printf("%q\n", dbError) 60 | return 61 | } 62 | 63 | defer imageManager.GetDB().Close() 64 | 65 | pageInt, err := strconv.Atoi(page) 66 | if err != nil { 67 | pageInt = 0 68 | } 69 | 70 | puppies := imageManager.GetPuppiesByMostVotes(pageInt) 71 | count := imageManager.GetPuppiesCount() 72 | 73 | perPage := 10 74 | pages := count / perPage 75 | 76 | searchResponse := PuppiesResponse{pageInt, pages, perPage, count, puppies} 77 | 78 | response, err := json.Marshal(searchResponse) 79 | 80 | if err != nil { 81 | http.Error(w, err.Error(), http.StatusInternalServerError) 82 | } 83 | w.Header().Set("Content-Type", "application/json") 84 | w.Write(response) 85 | 86 | } 87 | 88 | func UpdatePuppy(w http.ResponseWriter, r *http.Request) { 89 | var v Vote 90 | if err := json.NewDecoder(r.Body).Decode(&v); err != nil { 91 | //return badRequest{err} 92 | 93 | println("some error") 94 | } 95 | 96 | imageManager := NewImageManager() 97 | 98 | dbError := imageManager.InitDB(false) 99 | if dbError != nil { 100 | log.Printf("%q\n", dbError) 101 | return 102 | } 103 | 104 | defer imageManager.GetDB().Close() 105 | id, err := strconv.Atoi(v.ID) 106 | imageManager.UpdateVotes(id, v.VT) 107 | 108 | response, err := json.Marshal(v) 109 | 110 | if err != nil { 111 | http.Error(w, err.Error(), http.StatusInternalServerError) 112 | } 113 | 114 | w.Header().Set("Content-Type", "application/json") 115 | w.Write(response) 116 | } 117 | 118 | func ListPuppies(w http.ResponseWriter, r *http.Request) { 119 | page := mux.Vars(r)["page"] 120 | if page == "" { 121 | page = "1" 122 | } 123 | //tags := mux.Vars(r)["tags"] 124 | tags := "puppies,dogs,cute" 125 | 126 | baseUrl, err := url.Parse(FlickrEndPoint) 127 | if err != nil { 128 | log.Fatal(err) 129 | } 130 | 131 | params := url.Values{} 132 | params.Add("method", FlickrQuery) 133 | params.Add("api_key", FlickrKey) 134 | params.Add("tags", tags) 135 | params.Add("per_page", "10") 136 | params.Add("page", page) 137 | params.Add("safe_search", "2") 138 | params.Add("sort", "date-posted-desc") 139 | 140 | baseUrl.RawQuery = params.Encode() 141 | 142 | resp, err := http.Get(baseUrl.String()) 143 | if err != nil { 144 | // handle error, send proper error response 145 | log.Println(err) 146 | } 147 | defer resp.Body.Close() 148 | 149 | body, err := ioutil.ReadAll(resp.Body) 150 | if err != nil { 151 | // handle error, send proper error response 152 | log.Println(err) 153 | } 154 | 155 | flickrResponse := struct { 156 | Stat string `xml:"stat,attr"` 157 | Err flickrError `xml:"err"` 158 | Photos SearchResponse `xml:"photos"` 159 | }{} 160 | 161 | xml.Unmarshal([]byte(body), &flickrResponse) 162 | 163 | //stat := flickrResult.Stat 164 | //if stat is "ok" 165 | if flickrResponse.Stat != "ok" { 166 | println(flickrResponse.Err.Msg) 167 | //return error message 168 | } 169 | 170 | searchResponse := flickrResponse.Photos 171 | flickrPhotos := searchResponse.Photos 172 | 173 | var tempIDs []string 174 | imageManager := NewImageManager() 175 | for _, ph := range flickrPhotos { 176 | img := imageManager.NewImage(ph) 177 | imageManager.Save(img) 178 | tempIDs = append(tempIDs, img.ID) 179 | } 180 | 181 | dbError := imageManager.InitDB(false) 182 | if dbError != nil { 183 | log.Printf("%q\n", dbError) 184 | return 185 | } 186 | defer imageManager.GetDB().Close() 187 | 188 | all := imageManager.All() 189 | 190 | dbPuppies := imageManager.FindOldPuppies(tempIDs) 191 | 192 | var newPuppies []*Image 193 | 194 | if len(dbPuppies) == 0 { 195 | imageManager.InsertPuppies(all) 196 | } else { 197 | for _, puppy := range dbPuppies { 198 | id := puppy.ID 199 | for _, allP := range all { 200 | //allPID, _ := strconv.Atoi(allP.ID) 201 | if allP.ID == id { 202 | allP.DownVotes = puppy.DownVotes 203 | allP.UpVotes = puppy.UpVotes 204 | } else { 205 | exists := true 206 | var existingPuppy *Image 207 | for _, np := range newPuppies { 208 | //nPID, _ := strconv.Atoi(np.ID) 209 | if np.ID == allP.ID { 210 | exists = false 211 | existingPuppy = allP 212 | break 213 | } 214 | } 215 | if exists == false { 216 | newPuppies = append(newPuppies, existingPuppy) 217 | } 218 | } 219 | } 220 | } 221 | 222 | imageManager.InsertPuppies(newPuppies) 223 | } 224 | 225 | puppiesResponse := imageManager.GetPuppiesResponse(&searchResponse) 226 | response, err := json.Marshal(puppiesResponse) 227 | 228 | if err != nil { 229 | http.Error(w, err.Error(), http.StatusInternalServerError) 230 | } 231 | 232 | w.Header().Set("Content-Type", "application/json") 233 | w.Write(response) 234 | } 235 | 236 | func main() { 237 | imageManager := NewImageManager() 238 | dbError := imageManager.InitDB(false) 239 | 240 | defer imageManager.GetDB().Close() 241 | 242 | if dbError != nil { 243 | log.Printf("%q\n", dbError) 244 | return 245 | } else { 246 | imageManager.CreateTables() 247 | } 248 | 249 | r := mux.NewRouter().StrictSlash(false) 250 | 251 | pups := r.Path(PathPrefix).Subrouter() 252 | pups.Methods("GET").HandlerFunc(ListPuppies) 253 | 254 | pupsPerPage := r.Path(PathPrefix + "/{page}").Subrouter() 255 | pupsPerPage.Methods("GET").HandlerFunc(ListPuppies) 256 | 257 | topPups := r.Path(TopPupsPrefix).Subrouter() 258 | topPups.Methods("GET").HandlerFunc(ListTopPuppies) 259 | 260 | topPupsPerPage := r.Path(TopPupsPrefix + "/{page}").Subrouter() 261 | topPupsPerPage.Methods("GET").HandlerFunc(ListTopPuppies) 262 | 263 | pupsUpdate := r.Path(PathPrefix).Subrouter() 264 | pupsUpdate.Methods("PUT").HandlerFunc(UpdatePuppy) 265 | 266 | r.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/"))) 267 | http.Handle("/", r) 268 | 269 | http.ListenAndServe(":8080", nil) 270 | } 271 | 272 | func checkErr(err error) { 273 | if err != nil { 274 | panic(err) 275 | } 276 | } 277 | -------------------------------------------------------------------------------- /photo.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "database/sql" 5 | "fmt" 6 | _ "github.com/mattn/go-sqlite3" 7 | "log" 8 | "os" 9 | "strconv" 10 | "strings" 11 | ) 12 | 13 | // Image sizes supported by Flickr. See 14 | // http://www.flickr.com/services/api/misc.urls.html for more information. 15 | const ( 16 | SizeSmallSquare = "s" 17 | SizeThumbnail = "t" 18 | SizeSmall = "m" 19 | SizeMedium500 = "-" 20 | SizeMedium640 = "z" 21 | SizeLarge = "b" 22 | SizeOriginal = "o" 23 | DatabaseName = "puppies.sqlite" 24 | ) 25 | 26 | // Response for photo search requests. 27 | type SearchResponse struct { 28 | Page string `xml:"page,attr"` 29 | Pages string `xml:"pages,attr"` 30 | PerPage string `xml:"perpage,attr"` 31 | Total string `xml:"total,attr"` 32 | Photos []Photo `xml:"photo"` 33 | } 34 | 35 | // Represents a Flickr photo. 36 | type Photo struct { 37 | ID string `xml:"id,attr"` 38 | Owner string `xml:"owner,attr"` 39 | Secret string `xml:"secret,attr"` 40 | Server string `xml:"server,attr"` 41 | Farm string `xml:"farm,attr"` 42 | Title string `xml:"title,attr"` 43 | IsPublic string `xml:"ispublic,attr"` 44 | IsFriend string `xml:"isfriend,attr"` 45 | IsFamily string `xml:"isfamily,attr"` 46 | Thumbnail_T string `xml:"thumbnail_t,attr"` 47 | Large_T string `xml:"large_t,attr"` 48 | } 49 | 50 | type flickrError struct { 51 | Code string `xml:"code,attr"` 52 | Msg string `xml:"msg,attr"` 53 | } 54 | 55 | type Image struct { 56 | ID string `json:"id"` 57 | Title string `json:"title"` 58 | Thumbnail string `json:"thumbnail"` 59 | Large string `json:"large"` 60 | UpVotes int `json:"upvotes"` 61 | DownVotes int `json:"downvotes"` 62 | } 63 | 64 | type PuppiesResponse struct { 65 | Page int `json:"page"` 66 | Pages int `json:"pages"` 67 | PerPage int `json:"perpage"` 68 | Total int `json:"total"` 69 | Images []*Image `json:"images"` 70 | } 71 | 72 | type ImageManager struct { 73 | images []*Image 74 | db *sql.DB 75 | } 76 | 77 | type Vote struct { 78 | ID string `json:"id"` 79 | VT bool `json:"vt"` 80 | } 81 | 82 | func NewImageManager() *ImageManager { 83 | return &ImageManager{} 84 | } 85 | 86 | func (m *ImageManager) GetPuppiesResponse(searchResponse *SearchResponse) *PuppiesResponse { 87 | page, err := strconv.Atoi(searchResponse.Page) 88 | pages, err := strconv.Atoi(searchResponse.Pages) 89 | perPage, err := strconv.Atoi(searchResponse.PerPage) 90 | total, err := strconv.Atoi(searchResponse.Total) 91 | if err != nil { 92 | log.Println(err) 93 | return nil 94 | } 95 | return &PuppiesResponse{page, pages, perPage, total, m.images} 96 | } 97 | 98 | func (m *ImageManager) NewImage(photo Photo) *Image { 99 | return &Image{photo.ID, photo.Title, photo.URL(SizeThumbnail), photo.URL(SizeLarge), 0, 0} 100 | } 101 | 102 | func (m *ImageManager) Save(image *Image) error { 103 | for _, im := range m.images { 104 | if im.ID == image.ID { 105 | return nil 106 | } 107 | } 108 | 109 | m.images = append(m.images, cloneImage(image)) 110 | return nil 111 | } 112 | 113 | func (m *ImageManager) Find(ID string) (*Image, bool) { 114 | for _, im := range m.images { 115 | if im.ID == ID { 116 | return im, true 117 | } 118 | } 119 | 120 | return nil, false 121 | } 122 | 123 | func (m *ImageManager) Update(image *Image, upOrDown bool) (int, int) { 124 | if upOrDown == true { 125 | image.UpVotes++ 126 | } else { 127 | image.DownVotes-- 128 | } 129 | 130 | for _, im := range m.images { 131 | if im.ID == image.ID { 132 | im.UpVotes = image.UpVotes 133 | im.DownVotes = image.DownVotes 134 | } 135 | } 136 | 137 | return image.UpVotes, image.DownVotes 138 | } 139 | 140 | func (m *ImageManager) UpdateVotes(puppy_id int, up_vote bool) { 141 | sqlStmt := "update votes set " 142 | if up_vote == true { 143 | sqlStmt += " up_votes = up_votes + 1" 144 | } else { 145 | sqlStmt += " down_votes = down_votes + 1" 146 | } 147 | 148 | sqlStmt += " where puppy_id = ?" 149 | 150 | stmt, err := m.db.Prepare(sqlStmt) 151 | if err != nil { 152 | log.Fatal(err) 153 | } 154 | 155 | defer stmt.Close() 156 | 157 | res, _ := stmt.Exec(puppy_id) 158 | 159 | affect, _ := res.RowsAffected() 160 | 161 | fmt.Println(affect) 162 | 163 | return 164 | } 165 | 166 | func (m *ImageManager) GetPuppiesCount() int { 167 | query := "select count(id) from votes" 168 | 169 | rows, err := m.db.Query(query) 170 | if err != nil { 171 | log.Fatal(err) 172 | } 173 | defer rows.Close() 174 | count := 0 175 | for rows.Next() { 176 | rows.Scan(&count) 177 | } 178 | 179 | return count 180 | } 181 | 182 | func (m *ImageManager) GetPuppiesByMostVotes(pageId int) []*Image { 183 | perPage := 10 184 | if pageId != 0{ 185 | pageId-- 186 | } 187 | start := perPage * pageId 188 | query := "select * from votes order by up_votes desc limit ?,?" 189 | 190 | stmt, err := m.db.Prepare(query) 191 | if err != nil { 192 | log.Fatal(err) 193 | } 194 | 195 | defer stmt.Close() 196 | rows, err := stmt.Query(start, perPage) 197 | if err != nil { 198 | log.Fatal(err) 199 | } 200 | 201 | defer rows.Close() 202 | 203 | var rs []*Image 204 | 205 | for rows.Next() { 206 | var dbImage Image 207 | var id int 208 | rows.Scan(&id, &dbImage.ID, &dbImage.Title, &dbImage.Thumbnail, &dbImage.Large, &dbImage.UpVotes, &dbImage.DownVotes) 209 | rs = append(rs, &dbImage) 210 | } 211 | 212 | if err = rows.Err(); err != nil { 213 | log.Fatal(err) 214 | } 215 | 216 | return rs 217 | 218 | } 219 | 220 | // All returns the list of all the Tasks in the TaskManager. 221 | func (m *ImageManager) All() []*Image { 222 | return m.images 223 | } 224 | 225 | func cloneImage(i *Image) *Image { 226 | c := *i 227 | return &c 228 | } 229 | 230 | // Returns the URL to this photo in the specified size. 231 | func (p *Photo) URL(size string) string { 232 | if size == "-" { 233 | return fmt.Sprintf("http://farm%s.static.flickr.com/%s/%s_%s.jpg", 234 | p.Farm, p.Server, p.ID, p.Secret) 235 | } 236 | return fmt.Sprintf("http://farm%s.static.flickr.com/%s/%s_%s_%s.jpg", 237 | p.Farm, p.Server, p.ID, p.Secret, size) 238 | } 239 | 240 | func (m *ImageManager) InitDB(removeDb bool) error { 241 | if removeDb == true { 242 | os.Remove("./" + DatabaseName) 243 | } 244 | 245 | db, err := sql.Open("sqlite3", "./"+DatabaseName) 246 | if err != nil { 247 | log.Fatal(err) 248 | return err 249 | } 250 | 251 | m.db = db 252 | return nil 253 | } 254 | 255 | func (m *ImageManager) GetDB() *sql.DB { 256 | return m.db 257 | } 258 | 259 | func (m *ImageManager) CreateTables() { 260 | createSqlStmt := ` 261 | create table if not exists votes (id integer not null primary key, puppy_id integer unique, title string, thumbnail string, large string, up_votes integer, down_votes integer); 262 | delete from votes; 263 | ` 264 | _, err := m.db.Exec(createSqlStmt) 265 | if err != nil { 266 | log.Printf("%q: %s\n", err, createSqlStmt) 267 | } 268 | } 269 | 270 | func (m *ImageManager) InsertPuppies(images []*Image) { 271 | tx, err := m.db.Begin() 272 | if err != nil { 273 | log.Fatal(err) 274 | } 275 | 276 | stmt, err := tx.Prepare("insert into votes(puppy_id, title, thumbnail, large, up_votes, down_votes) values(?, ?, ?, ?, ?, ?)") 277 | if err != nil { 278 | log.Fatal(err) 279 | } 280 | 281 | defer stmt.Close() 282 | 283 | for _, im := range images { 284 | _, err = stmt.Exec(im.ID, im.Title, im.Thumbnail, im.Large, im.UpVotes, im.DownVotes) 285 | if err != nil { 286 | log.Fatal(err) 287 | } 288 | } 289 | 290 | tx.Commit() 291 | } 292 | 293 | func (m *ImageManager) FindOldPuppies(ids []string) []*Image { 294 | 295 | //sqlStmt = "select * from votes where puppy_id in (?" + strings.Repeat(",?", len(ids)-1) + ")" 296 | 297 | query := fmt.Sprintf("select * from votes where puppy_id in (%s)", 298 | strings.Join(strings.Split(strings.Repeat("?", len(ids)), ""), ",")) 299 | 300 | stmt, err := m.db.Prepare(query) 301 | if err != nil { 302 | log.Fatal(err) 303 | } 304 | 305 | var params []interface{} 306 | for _, id := range ids { 307 | params = append(params, id) 308 | } 309 | defer stmt.Close() 310 | rows, err := stmt.Query(params...) 311 | if err != nil { 312 | log.Fatal(err) 313 | } 314 | 315 | defer rows.Close() 316 | 317 | var rs []*Image 318 | 319 | for rows.Next() { 320 | var dbImage Image 321 | var id int 322 | rows.Scan(&id, &dbImage.ID, &dbImage.Title, &dbImage.Thumbnail, &dbImage.Large, &dbImage.UpVotes, &dbImage.DownVotes) 323 | rs = append(rs, &dbImage) 324 | } 325 | 326 | if err = rows.Err(); err != nil { 327 | log.Fatal(err) 328 | } 329 | 330 | return rs 331 | } 332 | -------------------------------------------------------------------------------- /puppies.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/malisetti/go-angular/88d7c75dae74a6c3ffd3ba7b5a88019584d7bf78/puppies.sqlite -------------------------------------------------------------------------------- /static/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "go-angular", 3 | "description": "angular js web app(backed by golang) to show and rate cute puppies", 4 | "version": "0.0.1", 5 | "homepage": "https://github.com/mseshachalam/go-angular", 6 | "license": "MIT", 7 | "private": true, 8 | "dependencies": { 9 | "angular": "1.3.x", 10 | "bootstrap": "~3.1.1", 11 | "angular-route": "1.3.x", 12 | "angular-resource": "1.3.x", 13 | "ngDialog": "0.3.x" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /static/css/app.css: -------------------------------------------------------------------------------- 1 | .nav, .pagination, .carousel, .panel-title a { cursor: pointer; } 2 | -------------------------------------------------------------------------------- /static/css/icono.min.css: -------------------------------------------------------------------------------- 1 | .icono-areaChart,.icono-barChart,.icono-book,.icono-book:after,.icono-book:before,.icono-bookmarkEmpty,.icono-bookmarkEmpty:before,.icono-camera,.icono-chain:after,.icono-chain:before,.icono-clock,.icono-commentEmpty,.icono-creditCard,.icono-crop,.icono-crop:before,.icono-display,.icono-document,.icono-eye,.icono-file,.icono-flag:after,.icono-flag:before,.icono-folder,.icono-forbidden,.icono-frown,.icono-frown:after,.icono-headphone,.icono-heart,.icono-heart:after,.icono-heart:before,.icono-home,.icono-home:after,.icono-home:before,.icono-imac,.icono-imacBold,.icono-image,.icono-infinity:after,.icono-infinity:before,.icono-iphone,.icono-iphoneBold,.icono-keyboard,.icono-macbook:before,.icono-macbookBold:before,.icono-mail,.icono-mail:before,.icono-market,.icono-market:after,.icono-meh,.icono-meh:after,.icono-microphone,.icono-microphone:before,.icono-mouse,.icono-mouse:before,.icono-nexus,.icono-paperClip,.icono-paperClip:after,.icono-paperClip:before,.icono-piano,.icono-pin,.icono-pin:before,.icono-power,.icono-rename,.icono-ruler,.icono-search,.icono-signIn,.icono-signIn:before,.icono-signOut,.icono-signOut:before,.icono-smile,.icono-smile:after,.icono-stroke,.icono-sync,.icono-tag,.icono-tag:after,.icono-terminal,.icono-trash,.icono-user,.icono-user:before,.icono-video,.icono-volumeHigh:after,.icono-volumeHigh:before,.icono-volumeLow:before,.icono-volumeMedium:before,.icono-youtube,.icono-youtube:before,[class*=icono-][class*=Circle],[class*=icono-][class*=Square],[class*=icono-check][class*=Circle]{border:2px solid}.icono-chain:after,.icono-chain:before,.icono-downArrow:before,.icono-dropper:before,.icono-flickr:after,.icono-flickr:before,.icono-indent:before,.icono-leftArrow:before,.icono-list:before,.icono-outdent:before,.icono-paperClip:before,.icono-rename:before,.icono-rightArrow:before,.icono-upArrow:before,.icono-video:before,.icono-volumeDecrease:after,.icono-volumeDecrease:before,.icono-volumeHigh:after,.icono-volumeHigh:before,.icono-volumeIncrease:after,.icono-volumeIncrease:before,.icono-volumeLow:before,.icono-volumeMedium:before,.icono-volumeMute:after,.icono-volumeMute:before,.stickCenterV{position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}.icono-cup:after,.icono-display:after,.icono-display:before,.icono-imac:after,.icono-imacBold:after,.icono-imacBold:before,.icono-iphone:after,.icono-iphone:before,.icono-macbook:before,.icono-macbookBold:before,.icono-market:after,.icono-microphone:after,.icono-microphone:before,.icono-mouse:after,.icono-mouse:before,.icono-search:before,.icono-sitemap:after,.icono-sitemap:before,.icono-tag:after,.icono-trash:before,.icono-user:before,.stickCenterH,[class*=icono-exclamation]:after,[class*=icono-textAlign].icono-textAlignCenter:after,[class*=icono-textAlign].icono-textAlignCenter:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%)}.icono-camera:before,.icono-clock:after,.icono-clock:before,.icono-document:after,.icono-eye:before,.icono-forbidden:before,.icono-gear:before,.icono-gplus:after,.icono-instagram:before,.icono-keyboard:before,.icono-pin:before,.icono-video:after,.icono-youtube:after,.stickCenter,[class*=icono-check]:before,[class*=icono-cross]:after,[class*=icono-cross]:before,[class*=icono-plus]:after,[class*=icono-plus]:before{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.spin[class*=spin]{-webkit-animation:loading-spinner 2s infinite linear;-moz-animation:loading-spinner 2s infinite linear;-o-animation:loading-spinner 2s infinite linear;animation:loading-spinner 2s infinite linear}@-webkit-keyframes loading-spinner{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-spinner{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-spinner{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-spinner{0%{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.icono-icono{width:13px;height:4px;box-shadow:inset 0 0 0 32px,0 16px,17px -18px;transform:skew(0,30deg);margin:11px 19px 19px 2px}.icono-icono:before{position:absolute;width:13px;height:4px;box-shadow:inset 0 0 0 32px,0 16px,-17px -17px;right:-17px;top:-10px;transform:skew(0,-48deg)}.icono-icono:after{position:absolute;width:22px;height:15px;left:0;top:-5px;border:4px solid;border-top-color:transparent;border-bottom:none;transform:skew(0,-30deg) scaleY(0.6)}.icono-home{width:22px;height:16px;border-top:none;margin:15px 6px 3px}.icono-home:before{width:18px;height:18px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);position:absolute;left:-2px;top:-7px;border-right-color:transparent;border-bottom-color:transparent}.icono-home:after{width:6px;height:10px;bottom:0;position:absolute;left:50%;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);border-width:1px;border-bottom:none}.icono-mail{width:28px;height:18px;overflow:hidden;margin:8px 3px}.icono-mail:before{position:absolute;width:24.62px;height:24.62px;-webkit-transform:rotate(50deg) skew(-10deg,-20deg);-moz-transform:rotate(50deg) skew(-10deg,-20deg);-ms-transform:rotate(50deg) skew(-10deg,-20deg);-o-transform:rotate(50deg) skew(-10deg,-20deg);transform:rotate(50deg) skew(-10deg,-20deg);top:-20px;left:-3px}.icono-rss{width:22px;height:22px;overflow:hidden;margin:6px}.icono-rss:after,.icono-rss:before{position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-rss:before{width:6px;height:6px;box-shadow:0 0 32px inset;left:0;bottom:0}.icono-rss:after{width:27px;height:27px;right:15%;top:15%;border:4px solid transparent;box-shadow:inset 0 0 0 2px,0 0 0 2px}.icono-bars,.icono-hamburger{width:20px;height:2px;box-shadow:inset 0 0 0 32px,0 -6px,0 6px;margin:16px 7px}[class*=icono-cross],[class*=icono-plus]{width:30px;height:30px;margin:2px}[class*=icono-check]:before,[class*=icono-cross]:after,[class*=icono-cross]:before,[class*=icono-plus]:after,[class*=icono-plus]:before{box-shadow:inset 0 0 0 32px}[class*=icono-check]:before,[class*=icono-cross]:before,[class*=icono-plus]:before{width:20px;height:2px}[class*=icono-cross]:after,[class*=icono-plus]:after{height:20px;width:2px}[class*=icono-cross][class*=Circle]:before,[class*=icono-plus][class*=Circle]:before{width:18px}[class*=icono-cross][class*=Circle]:after,[class*=icono-plus][class*=Circle]:after{height:18px}.icono-cross,.icono-crossCircle{-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}[class*=icono-check]{width:28px;height:28px;margin:3px 0 3px 6px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}[class*=icono-check]:after,[class*=icono-check]:before{box-shadow:inset 0 0 0 32px}[class*=icono-check]:after{position:absolute;height:12px;width:2px;left:4px;bottom:14px}[class*=icono-check][class*=Circle]{-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;width:30px;height:30px;margin:2px}[class*=icono-check][class*=Circle]:before{width:14px;top:15px;left:14px}[class*=icono-check][class*=Circle]:after{height:8px;left:7px;bottom:10px}.icono-power{width:22px;height:22px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;border-top-color:transparent;margin:6px}.icono-power:before{position:absolute;top:-15%;left:8px;width:2px;height:60%;box-shadow:inset 0 0 0 32px}.icono-heart{width:20px;height:20px;border-top-color:transparent;border-left-color:transparent;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);-webkit-border-radius:4px 0;-moz-border-radius:4px 0;-o-border-radius:4px 0;border-radius:4px 0;margin:9px 7px 5px}.icono-heart:after,.icono-heart:before{position:absolute}.icono-heart:before{width:8px;height:14px;left:-10px;bottom:-2px;-webkit-border-radius:20px 0 0 20px;-moz-border-radius:20px 0 0 20px;-o-border-radius:20px 0 0 20px;border-radius:20px 0 0 20px;border-right-color:transparent}.icono-heart:after{width:14px;height:8px;right:-2px;top:-10px;-webkit-border-radius:20px 20px 0 0;-moz-border-radius:20px 20px 0 0;-o-border-radius:20px 20px 0 0;border-radius:20px 20px 0 0;border-bottom-color:transparent}.icono-infinity{width:32px;height:16px;margin:9px 1px}.icono-infinity:after,.icono-infinity:before{width:10px;height:10px;position:absolute;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.icono-infinity:before{left:0;-webkit-border-radius:32px 0 32px 32px;-moz-border-radius:32px 0 32px 32px;-o-border-radius:32px 0 32px 32px;border-radius:32px 0 32px 32px}.icono-infinity:after{right:1px;-webkit-border-radius:32px 32px 32px 0;-moz-border-radius:32px 32px 32px 0;-o-border-radius:32px 32px 32px 0;border-radius:32px 32px 32px 0}.icono-flag{width:22px;height:25px;border-left:3px solid;margin:5px 6px 4px}.icono-flag:after,.icono-flag:before{position:absolute;width:9px;height:8px}.icono-flag:before{left:-2px;top:1px;-webkit-border-radius:0 2px 0 0;-moz-border-radius:0 2px 0 0;-o-border-radius:0 2px 0 0;border-radius:0 2px 0 0;border-right-width:3px}.icono-flag:after{width:5px;left:9px;top:4px;border-left-width:3px;-webkit-border-radius:2px 2px 0;-moz-border-radius:2px 2px 0;-o-border-radius:2px 2px 0;border-radius:2px 2px 0}.icono-file{width:26px;height:32px;-webkit-border-radius:0 12px 0 0;-moz-border-radius:0 12px 0 0;-o-border-radius:0 12px 0 0;border-radius:0 12px 0 0;margin:1px 4px}.icono-file:before{position:absolute;top:-2px;right:-2px;border-style:solid;width:0;height:0;border-width:5px;border-top-color:transparent;border-right-color:transparent}.icono-document{width:26px;height:32px;-webkit-border-radius:0 0 0 10px;-moz-border-radius:0 0 0 10px;-o-border-radius:0 0 0 10px;border-radius:0 0 0 10px;margin:1px 4px}.icono-document:before{position:absolute;width:0;height:0;left:-3px;bottom:-3px;border-width:5px;border-style:solid;border-bottom-color:transparent;border-left-color:transparent}.icono-document:after{width:13px;height:2px;box-shadow:inset 0 0 0 32px,0 -5px 0 0,0 5px 0 0}.icono-folder{width:18px;height:22px;border-left-width:0;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;-o-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin:8px 2px 4px 14px}.icono-folder:before{position:absolute;width:12px;height:20px;left:-12px;bottom:-2px;border-width:0 0 2px 2px;border-style:solid;-webkit-border-radius:0 0 0 3px;-moz-border-radius:0 0 0 3px;-o-border-radius:0 0 0 3px;border-radius:0 0 0 3px}.icono-folder:after{position:absolute;width:10px;height:5px;left:-12px;top:-7px;border-width:2px 2px 0;border-style:solid;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;-o-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.icono-pin{width:26px;height:26px;-webkit-border-radius:50% 50% 50% 0;-moz-border-radius:50% 50% 50% 0;-o-border-radius:50% 50% 50% 0;border-radius:50% 50% 50% 0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);margin:1px 4px 7px}.icono-pin:before{position:absolute;width:6px;height:6px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-frown,.icono-meh,.icono-smile{-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;height:30px;width:30px;margin:2px}.icono-frown:before,.icono-meh:before,.icono-smile:before{-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:8px 0 0 0,0 0 0 2px inset;height:4px;width:4px;left:7px;position:absolute;top:27%}.icono-frown:after,.icono-meh:after,.icono-smile:after{-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;height:16px;left:50%;position:absolute;top:6%;width:16px}.icono-eye{-webkit-border-radius:80% 20%;-moz-border-radius:80% 20%;-o-border-radius:80% 20%;border-radius:80% 20%;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);border-width:2px 1px 1px 2px;height:28px;width:28px;margin:3px}.icono-eye:before{-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:0 -3px 0 3px inset;height:11px;width:11px}.icono-sliders{height:30px;width:30px;margin:2px}.icono-sliders:after,.icono-sliders:before{-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);-o-transform:translateX(-50%);transform:translateX(-50%);left:50%;position:absolute}.icono-sliders:before{width:8px;height:7px;-webkit-border-radius:2px;-moz-border-radius:2px;-o-border-radius:2px;border-radius:2px;top:67%;box-shadow:inset 0 0 0 32px,10px -10px,-10px -14px}.icono-sliders:after{position:absolute;width:2px;height:100%;box-shadow:inset 0 0 0 32px,10px 0,-10px 0}.icono-share{height:9px;width:9px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:inset 0 0 0 32px,22px -11px 0 0,22px 11px 0 0;margin:12px 24px 13px 1px}.icono-share:after,.icono-share:before{position:absolute;width:24px;height:2px;box-shadow:inset 0 0 0 32px;left:0}.icono-share:before{top:-2px;-webkit-transform:rotate(-25deg);-moz-transform:rotate(-25deg);-ms-transform:rotate(-25deg);-o-transform:rotate(-25deg);transform:rotate(-25deg)}.icono-share:after{top:9px;-webkit-transform:rotate(25deg);-moz-transform:rotate(25deg);-ms-transform:rotate(25deg);-o-transform:rotate(25deg);transform:rotate(25deg)}.icono-sync{width:26px;height:26px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;border-right-color:transparent;border-left-color:transparent;margin:4px}.icono-sync:after,.icono-sync:before{position:absolute;width:0;height:0;border-width:6px;border-style:solid;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.icono-sync:before{-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);right:-7px;top:0}.icono-sync:after{-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg);left:-7px;bottom:0}.icono-reset{width:26px;height:26px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;border-width:2px;border-style:solid;border-left-color:transparent;margin:4px}.icono-reset:before{position:absolute;width:0;height:0;left:-7px;bottom:0;border-width:6px;border-style:solid;border-right-color:transparent;border-left-color:transparent;border-bottom-color:transparent;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}.icono-gear{width:32px;height:32px;border:3px dotted;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;margin:1px}.icono-gear:before{width:22px;height:22px;box-shadow:0 0 0 3px,0 0 0 2px inset;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;border:6px solid transparent;box-sizing:border-box}.icono-signIn{width:18px;height:32px;border-left:none;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;-o-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin:1px 8px}.icono-signIn:before{position:absolute;width:11px;height:11px;left:-10px;top:7px;border-bottom:none;border-left:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;-o-border-radius:0 4px 0 0;border-radius:0 4px 0 0}.icono-signOut{width:18px;height:32px;border-right:none;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;-o-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;margin:1px 8px}.icono-signOut:before{position:absolute;width:11px;height:11px;right:-2px;top:7px;border-bottom:none;border-left:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;-o-border-radius:0 4px 0 0;border-radius:0 4px 0 0}.icono-support{width:26px;height:26px;border:5px solid transparent;box-shadow:0 0 0 2px inset,0 0 0 2px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;margin:4px}.icono-support:before{position:absolute;width:7px;height:7px;top:-3px;left:-3px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);box-shadow:inset 0 0 0 32px,21px 0 0 0}.icono-support:after{position:absolute;width:7px;height:7px;top:-3px;right:-3px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg);box-shadow:inset 0 0 0 32px,21px 0 0 0}.icono-dropper{width:40px;height:14px;border-width:3px;border-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent;box-shadow:-9px 0 0 2px inset,0 0 0 2px inset;-webkit-border-radius:50% 6px 6px 50%;-moz-border-radius:50% 6px 6px 50%;-o-border-radius:50% 6px 6px 50%;border-radius:50% 6px 6px 50%;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);margin:12px -2px 8px -4px}.icono-dropper:before{width:4px;height:14px;right:10px;box-shadow:inset 0 0 0 32px}.icono-tiles{width:4px;height:4px;box-shadow:0 -8px 0,-8px -8px 0,8px -8px 0,0 0 0 32px inset,-8px 0 0,8px 0 0,0 8px 0,-8px 8px 0,8px 8px 0;margin:15px}.icono-list{width:4px;height:4px;box-shadow:inset 0 0 0 32px,0 -8px 0 0,0 8px 0 0;margin:15px 26px 15px 4px}.icono-list:before{width:18px;height:4px;left:8px;box-shadow:inset 0 0 0 32px,0 -8px 0 0,0 8px 0 0}.icono-chain{width:16px;height:2px;box-shadow:inset 0 0 0 32px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);margin:16px 9px}.icono-chain:after,.icono-chain:before{width:12px;height:8px;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px}.icono-chain:before{right:-10px}.icono-chain:after{left:-10px}.icono-youtube{border-right-color:transparent;border-left-color:transparent;-webkit-border-radius:10px;-moz-border-radius:10px;-o-border-radius:10px;border-radius:10px;width:32px;height:22.29px;margin:6px 1px}.icono-youtube:before{position:absolute;top:0;right:0;bottom:0;left:0;border-top-color:transparent;border-bottom-color:transparent;-webkit-border-radius:6px/3px;-moz-border-radius:6px/3px;-o-border-radius:6px/3px;border-radius:6px/3px}.icono-youtube:after{width:0;height:0;border-width:4px 0 4px 8px;border-style:solid;border-top-color:transparent;border-bottom-color:transparent}.icono-rename{width:26px;height:10px;border-color:transparent;border-width:3px;box-shadow:0 0 0 1px,11px 0 0 0 inset;margin:12px 4px}.icono-rename:before{width:1px;height:18px;left:9px;border-width:2px 4px;border-style:solid;border-right-color:transparent;border-left-color:transparent;box-shadow:0 0 0 1px inset}.icono-search{width:22px;height:22px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);margin:4px 4px 8px 8px}.icono-search:before{width:4px;height:11px;box-shadow:inset 0 0 0 32px;top:19px;-webkit-border-radius:0 0 1px 1px;-moz-border-radius:0 0 1px 1px;-o-border-radius:0 0 1px 1px;border-radius:0 0 1px 1px}.icono-book{width:26px;height:22px;-webkit-border-radius:0 0 0 6px;-moz-border-radius:0 0 0 6px;-o-border-radius:0 0 0 6px;border-radius:0 0 0 6px;border-top:none;margin:10px 4px 2px}.icono-book:before{position:absolute;width:24px;height:7px;box-sizing:border-box;border-top:none;border-right:none;left:-2px;top:-5px;-webkit-border-radius:0 0 0 6px;-moz-border-radius:0 0 0 6px;-o-border-radius:0 0 0 6px;border-radius:0 0 0 6px}.icono-book:after{position:absolute;width:24px;height:8px;box-sizing:border-box;left:-2px;top:-8px;border-bottom:none;-webkit-border-radius:6px 0 0;-moz-border-radius:6px 0 0;-o-border-radius:6px 0 0;border-radius:6px 0 0}.icono-forbidden{width:28px;height:28px;border-width:3px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;margin:3px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.icono-forbidden:before{width:24px;height:4px;box-shadow:inset 0 0 0 32px}.icono-trash{width:22px;height:22px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;-o-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;border-top:none;margin:9px 6px 3px}.icono-trash:before{width:8px;height:2px;top:-6px;box-shadow:inset 0 0 0 32px,-10px 2px 0 0,-6px 2px 0 0,0 2px 0 0,6px 2px 0 0,10px 2px 0 0}.icono-keyboard{width:32px;height:22px;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px;margin:6px 1px}.icono-keyboard:before{width:2px;height:2px;box-shadow:-2px -4px 0,-6px -4px 0,-10px -4px 0,2px -4px 0,6px -4px 0,8px -4px 0,10px -4px 0,-4px 0 0,-8px 0 0,-10px 0 0,inset 0 0 0 32px,4px 0 0,8px 0 0,10px 0 0,4px 4px 0,2px 4px 0,0 4px 0,-2px 4px 0,-6px 4px 0,-10px 4px 0,6px 4px 0,10px 4px 0}.icono-mouse{width:23px;height:32px;-webkit-border-radius:11px 11px 12px 12px;-moz-border-radius:11px 11px 12px 12px;-o-border-radius:11px 11px 12px 12px;border-radius:11px 11px 12px 12px;margin:1px 5px 1px 6px}.icono-mouse:before{width:1px;height:6px;-webkit-border-radius:2px;-moz-border-radius:2px;-o-border-radius:2px;border-radius:2px;border-color:transparent;border-width:1px;top:5px;box-shadow:0 0 0 1px,0 0 0 2px inset}.icono-mouse:after{width:1px;height:4px;top:0;box-shadow:inset 0 0 0 32px,0 13px 0 0}.icono-user{width:32px;height:14px;-webkit-border-radius:64px 64px 0 0/64px;-moz-border-radius:64px 64px 0 0/64px;-o-border-radius:64px 64px 0 0/64px;border-radius:64px 64px 0 0/64px;margin:18px 1px 2px}.icono-user:before{width:12px;height:12px;top:-20px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-crop{width:21px;height:21px;border-left:none;border-bottom:none;margin:9px 9px 4px 4px}.icono-crop:before{position:absolute;width:21px;height:21px;top:-7px;right:-7px;border-top:none;border-right:none;box-sizing:border-box}.icono-crop:after{position:absolute;width:27px;height:1px;left:2px;top:3px;box-shadow:inset 0 0 0 32px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-display{width:26px;height:22px;margin:4px 4px 8px}.icono-display:before{width:4px;height:3px;bottom:-5px;box-shadow:inset 0 0 0 32px}.icono-display:after{width:14px;height:2px;bottom:-6px;box-shadow:inset 0 0 0 32px}.icono-imac{width:28px;height:24px;border-width:2px 2px 6px;border-color:transparent;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px;box-shadow:0 0 0 1px,0 0 0 1px inset;margin:3px 3px 7px}.icono-imac:before{position:absolute;height:4px;right:-3px;left:-3px;bottom:-6px;box-shadow:inset 0 0 0 32px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;-o-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.icono-imac:after{width:9px;height:7px;box-shadow:inset 0 0 0 32px;bottom:-12px;-webkit-border-radius:32px 32px 0 0/64px;-moz-border-radius:32px 32px 0 0/64px;-o-border-radius:32px 32px 0 0/64px;border-radius:32px 32px 0 0/64px}.icono-imacBold{width:28px;height:22px;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;margin:4px 3px 8px}.icono-imacBold:before{width:9px;height:7px;box-shadow:inset 0 0 0 32px;bottom:-6px;-webkit-border-radius:32px 32px 0 0/64px;-moz-border-radius:32px 32px 0 0/64px;-o-border-radius:32px 32px 0 0/64px;border-radius:32px 32px 0 0/64px}.icono-imacBold:after{width:24px;height:3px;box-shadow:inset 0 0 0 32px;bottom:0}.icono-iphone{width:19px;height:31px;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px;border-width:5px 1px;border-color:transparent;box-shadow:0 0 0 1px,0 0 0 1px inset;margin:2px 8px 1px 7px}.icono-iphone:after,.icono-iphone:before{box-shadow:inset 0 0 0 32px}.icono-iphone:before{width:3px;height:1px;top:-3px}.icono-iphone:after{width:3px;height:3px;bottom:-4px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-iphoneBold{width:20px;height:32px;margin:1px 7px;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;border-width:5px 2px}.icono-macbook{width:32px;height:2px;box-shadow:inset 0 0 0 32px;-webkit-border-radius:0 0 32px 32px/3px;-moz-border-radius:0 0 32px 32px/3px;-o-border-radius:0 0 32px 32px/3px;border-radius:0 0 32px 32px/3px;margin:25px 1px 7px}.icono-macbook:before{width:20px;height:14px;bottom:2px;border-width:3px 1px 1px;border-color:transparent;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;-o-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;box-shadow:0 0 0 1px,0 0 0 1px inset}.icono-macbookBold{width:32px;height:2px;box-shadow:inset 0 0 0 32px;margin:25px 1px 7px}.icono-macbookBold:before{width:20px;height:14px;bottom:2px;border-width:3px 2px 1px;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;-o-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.icono-image{width:30px;height:26px;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px;overflow:hidden;margin:4px 2px}.icono-image:before{position:absolute;width:20px;height:20px;left:-2px;top:14px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);box-shadow:inset 0 0 0 32px,10px -6px 0 0}.icono-image:after{position:absolute;width:4px;height:4px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:inset 0 0 0 32px;top:5px;right:5px}.icono-headphone{width:30px;height:27px;border-bottom-color:transparent;-webkit-border-radius:32px/32px 32px 16px 16px;-moz-border-radius:32px/32px 32px 16px 16px;-o-border-radius:32px/32px 32px 16px 16px;border-radius:32px/32px 32px 16px 16px;margin:2px 2px 5px}.icono-headphone:before{position:absolute;width:4px;height:12px;left:1px;bottom:-4px;-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px;box-shadow:inset 0 0 0 32px,20px 0 0 0}.icono-music{width:18px;height:6px;-webkit-transform:skewY(-15deg);-moz-transform:skewY(-15deg);-ms-transform:skewY(-15deg);-o-transform:skewY(-15deg);transform:skewY(-15deg);box-shadow:inset 0 0 0 32px;-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;margin:4px 5px 24px 11px}.icono-music:before{position:absolute;width:2px;height:16px;left:0;top:4px;box-shadow:inset 0 0 0 32px,16px 0 0 0}.icono-music:after{position:absolute;width:10px;height:8px;left:-8px;top:17px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:inset 0 0 0 32px,16px 0 0 0}.icono-video{width:20px;height:20px;margin:7px}.icono-video:before{width:3px;height:3px;left:-8px;box-shadow:inset 0 0 0 32px,0 -8px 0 0,0 8px 0 0,29px 0 0 0,29px -8px 0 0,29px 8px 0 0}.icono-video:after{width:0;height:0;border-width:4px 0 4px 6px;border-style:solid;border-top-color:transparent;border-bottom-color:transparent}.icono-nexus{width:21px;height:32px;border-width:3px 1px;-webkit-border-radius:16px/3px;-moz-border-radius:16px/3px;-o-border-radius:16px/3px;border-radius:16px/3px;margin:1px 7px 1px 6px}.icono-microphone{width:22px;height:15px;border-width:0 2px 2px;-webkit-border-radius:20px/0 0 20px 20px;-moz-border-radius:20px/0 0 20px 20px;-o-border-radius:20px/0 0 20px 20px;border-radius:20px/0 0 20px 20px;margin:12px 6px 7px}.icono-microphone:before{width:10px;height:18px;top:-11px;-webkit-border-radius:20px;-moz-border-radius:20px;-o-border-radius:20px;border-radius:20px}.icono-microphone:after{width:2px;height:2px;bottom:-4px;box-shadow:inset 0 0 0 32px,0 2px,0 4px,-2px 4px,-4px 4px,-6px 4px,2px 4px,4px 4px,6px 4px}.icono-asterisk,.icono-asterisk:after,.icono-asterisk:before{width:4px;height:20px;box-shadow:inset 0 0 0 32px;-webkit-border-radius:1px;-moz-border-radius:1px;-o-border-radius:1px;border-radius:1px;margin:7px 15px}.icono-asterisk:after,.icono-asterisk:before{position:absolute;margin:0;left:0;top:0}.icono-asterisk:before{-webkit-transform:rotate(-58deg);-moz-transform:rotate(-58deg);-ms-transform:rotate(-58deg);-o-transform:rotate(-58deg);transform:rotate(-58deg)}.icono-asterisk:after{-webkit-transform:rotate(58deg);-moz-transform:rotate(58deg);-ms-transform:rotate(58deg);-o-transform:rotate(58deg);transform:rotate(58deg)}.icono-terminal{width:28px;height:24px;margin:5px 3px}.icono-terminal:before{width:5px;height:5px;position:absolute;top:50%;-webkit-transform:translateY(-50%) rotate(45deg);-moz-transform:translateY(-50%) rotate(45deg);-ms-transform:translateY(-50%) rotate(45deg);-o-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg);left:3px;border-width:2px 2px 0 0;border-style:solid}.icono-terminal:after{position:absolute;width:5px;height:0;border-bottom:2px solid;right:6px;bottom:4px}.icono-paperClip{width:24px;height:18px;border-left:none;-webkit-border-radius:0 16px 16px 0;-moz-border-radius:0 16px 16px 0;-o-border-radius:0 16px 16px 0;border-radius:0 16px 16px 0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);margin:5px 0 11px 10px}.icono-paperClip:before{width:18px;height:6px;right:2px;-webkit-border-radius:0 16px 16px 0;-moz-border-radius:0 16px 16px 0;-o-border-radius:0 16px 16px 0;border-radius:0 16px 16px 0;border-left:none}.icono-paperClip:after{position:absolute;width:12px;height:10px;left:-12px;top:-2px;border-right:none;-webkit-border-radius:16px 0 0 16px;-moz-border-radius:16px 0 0 16px;-o-border-radius:16px 0 0 16px;border-radius:16px 0 0 16px}.icono-market{width:32px;height:12px;border-top:none;margin:19px 1px 3px}.icono-market:before{width:6px;height:13px;position:absolute;top:-15px;left:-5px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;-o-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;border-left:none;box-shadow:inset 0 0 0 32px,8px 0 0,16px 0 0,24px 0 0,32px 0 0}.icono-market:after{width:6px;height:6px;bottom:-2px}.icono-clock{width:26px;height:26px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;margin:4px}.icono-clock:after,.icono-clock:before{top:35%;box-shadow:inset 0 0 0 32px;-webkit-border-radius:2px;-moz-border-radius:2px;-o-border-radius:2px;border-radius:2px}.icono-clock:before{width:2px;height:9px}.icono-clock:after{width:6px;height:2px;transform-origin:left center;-webkit-transform:rotate(45deg) translate(1px,2px);-moz-transform:rotate(45deg) translate(1px,2px);-ms-transform:rotate(45deg) translate(1px,2px);-o-transform:rotate(45deg) translate(1px,2px);transform:rotate(45deg) translate(1px,2px)}[class*=icono-textAlign]{width:28px;height:22px;margin:6px 3px}[class*=icono-textAlign]:after,[class*=icono-textAlign]:before{position:absolute;height:2px;box-shadow:inset 0 0 0 32px,0 8px 0 0,0 16px 0 0;right:0}[class*=icono-textAlign]:before{width:28px;top:0}[class*=icono-textAlign]:after{width:18px;top:4px}[class*=icono-textAlign].icono-textAlignLeft:after,[class*=icono-textAlign].icono-textAlignLeft:before{left:0}[class*=icono-exclamation]{overflow:visible;width:30px;border-bottom:2px solid;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin:26px 2px 6px}[class*=icono-exclamation]:before{position:absolute;width:26px;height:26px;left:1px;top:-14px;border-width:2px 0 0 2px;border-style:solid;-webkit-border-radius:4px 0;-moz-border-radius:4px 0;-o-border-radius:4px 0;border-radius:4px 0;-webkit-transform:rotate(45deg) skew(12deg,12deg);-moz-transform:rotate(45deg) skew(12deg,12deg);-ms-transform:rotate(45deg) skew(12deg,12deg);-o-transform:rotate(45deg) skew(12deg,12deg);transform:rotate(45deg) skew(12deg,12deg)}[class*=icono-exclamation]:after{width:4px;height:3px;top:-14px;box-shadow:inset 0 0 0 32px,0 3px,0 8px}[class*=icono-exclamation][class*=Circle]{margin:2px}[class*=icono-exclamation][class*=Circle]:before{display:none}[class*=icono-exclamation][class*=Circle]:after{box-shadow:inset 0 0 0 32px,0 3px,0 5px,0 10px;top:6px}.icono-frown:after{-webkit-transform:translateX(-50%) rotate(180deg);-moz-transform:translateX(-50%) rotate(180deg);-ms-transform:translateX(-50%) rotate(180deg);-o-transform:translateX(-50%) rotate(180deg);transform:translateX(-50%) rotate(180deg);transform-origin:center 85%}.icono-meh:after{top:0;width:12px;border-left-width:0;border-right-width:0;-webkit-border-radius:0;-moz-border-radius:0;-o-border-radius:0;border-radius:0}.icono-indent,.icono-outdent{width:20px;height:16px;border-width:4px 0 4px 8px;border-style:solid;border-color:transparent;box-shadow:0 -2px,0 2px,inset 0 2px,inset 0 -2px;margin:9px 7px}.icono-indent:before,.icono-outdent:before{left:-8px;border:5px solid;border-top-color:transparent;border-bottom-color:transparent;border-right-width:0}.icono-outdent:before{border-left-width:0;border-right-width:5px}.icono-locationArrow{width:32px;height:32px;margin:1px}.icono-locationArrow:before{position:absolute;left:7px;top:16px;border-width:6px 0 6px 6px;border-style:solid;border-left-color:transparent;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-locationArrow:after{position:absolute;top:10px;left:2px;border-width:10px;border-style:solid;border-bottom-color:transparent;border-left-color:transparent;-webkit-transform:skew(-30deg,-30deg);-moz-transform:skew(-30deg,-30deg);-ms-transform:skew(-30deg,-30deg);-o-transform:skew(-30deg,-30deg);transform:skew(-30deg,-30deg)}.icono-commentEmpty{width:30px;height:22px;-webkit-border-radius:4px 4px 7px 7px;-moz-border-radius:4px 4px 7px 7px;-o-border-radius:4px 4px 7px 7px;border-radius:4px 4px 7px 7px;border-bottom-color:transparent;margin:5px 2px 7px}.icono-commentEmpty:before{position:absolute;width:6px;height:6px;border-width:0 0 2px 2px;border-style:solid;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);bottom:-4px;left:6px}.icono-commentEmpty:after{position:absolute;width:8px;height:2px;border-width:0 12px 0 6px;border-style:solid;bottom:0;left:0}.icono-comment{width:30px;height:20px;box-shadow:inset 0 0 0 32px;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;margin:5px 2px 9px}.icono-comment:before{position:absolute;width:8px;height:8px;box-shadow:inset 0 0 0 32px;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);bottom:-4px;left:6px}.icono-areaChart,.icono-barChart{width:30px;height:22px;border-top-width:0;border-right-width:0;border-color:transparent;box-shadow:-2px 2px;overflow:hidden;margin:4px 0 8px 4px}.icono-areaChart:before{position:absolute;left:0;bottom:7px;border:6px solid transparent;border-bottom-color:currentColor;box-shadow:0 7px}.icono-areaChart:after{position:absolute;left:11px;bottom:4px;border-width:0 6px 13px;border-style:solid;border-color:transparent transparent currentColor;box-shadow:0 4px}.icono-barChart{border-color:transparent;box-shadow:-2px 2px;margin:4px 0 8px 4px}.icono-barChart:before{position:absolute;left:0;bottom:0;width:4px;height:15px;box-shadow:inset 0 -8px 0 0,6px 0,12px 7px,18px 5px}.icono-pieChart{width:0;height:0;border:15px solid;border-right-color:transparent;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg);margin:2px}.icono-pieChart:before{position:absolute;width:0;height:0;left:-11px;top:-14px;border:14px solid;border-left-color:transparent;border-bottom-color:transparent;border-top-color:transparent;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-bookmark{width:0;height:0;border:9px solid;border-bottom-color:transparent;box-shadow:0 -4px;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;-o-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;margin:10px 8px 6px}.icono-bookmarkEmpty{width:18px;height:22px;border-bottom:none;-webkit-border-radius:3px 3px 2px 2px;-moz-border-radius:3px 3px 2px 2px;-o-border-radius:3px 3px 2px 2px;border-radius:3px 3px 2px 2px;overflow:hidden;margin:6px 8px}.icono-bookmarkEmpty:before{position:absolute;width:12px;height:12px;bottom:0;left:0;border-right:none;border-bottom:none;-webkit-transform:rotate(45deg) translate(35%,35%);-moz-transform:rotate(45deg) translate(35%,35%);-ms-transform:rotate(45deg) translate(35%,35%);-o-transform:rotate(45deg) translate(35%,35%);transform:rotate(45deg) translate(35%,35%)}.icono-filter{width:0;height:0;border:10px solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent;padding:3px;box-shadow:inset 0 7px;margin:9px 4px}.icono-volume,.icono-volumeDecrease,.icono-volumeHigh,.icono-volumeIncrease,.icono-volumeLow,.icono-volumeMedium,.icono-volumeMute{width:0;height:0;border:7px solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent;padding:6px 3px;box-shadow:inset 4px 0;margin:4px 10px 4px 11px}.icono-volumeHigh,.icono-volumeLow,.icono-volumeMedium{margin:4px 14px 4px 7px}.icono-volumeHigh:after,.icono-volumeHigh:before,.icono-volumeLow:before,.icono-volumeMedium:before{width:15px;height:15px;position:absolute;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent;left:2px}.icono-volumeHigh,.icono-volumeMedium{margin:4px 16px 4px 5px}.icono-volumeHigh:before,.icono-volumeMedium:before{border-style:double;border-width:6px;left:-2px}.icono-volumeHigh{margin:4px 18px 4px 3px}.icono-volumeHigh:after{width:32px;height:32px;left:-7px}.icono-volumeDecrease,.icono-volumeIncrease,.icono-volumeMute{margin:4px 16px 4px 5px}.icono-volumeDecrease:after,.icono-volumeDecrease:before,.icono-volumeIncrease:after,.icono-volumeIncrease:before,.icono-volumeMute:after,.icono-volumeMute:before{box-shadow:inset 0 0 0 32px}.icono-volumeDecrease:before,.icono-volumeIncrease:before,.icono-volumeMute:before{width:10px;height:2px;left:17px}.icono-volumeIncrease:after,.icono-volumeMute:after{height:10px;width:2px;left:21px}.icono-volumeMute:after,.icono-volumeMute:before{-webkit-transform:translateY(-50%) rotate(45deg);-moz-transform:translateY(-50%) rotate(45deg);-ms-transform:translateY(-50%) rotate(45deg);-o-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.icono-tag{width:18px;height:24px;-webkit-border-radius:6px 6px 4px 4px;-moz-border-radius:6px 6px 4px 4px;-o-border-radius:6px 6px 4px 4px;border-radius:6px 6px 4px 4px;border-top:none;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);margin:5px 8px}.icono-tag:before{position:absolute;top:-4px;left:1px;width:10px;height:10px;border-width:2px 0 0 2px;border-style:solid;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg);-webkit-border-radius:5px 0 0;-moz-border-radius:5px 0 0;-o-border-radius:5px 0 0;border-radius:5px 0 0}.icono-tag:after{top:1px;width:3px;height:3px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-calendar{width:32px;height:28px;border-width:4px 2px 2px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;margin:5px 1px 1px}.icono-calendar:before{position:absolute;width:4px;height:4px;top:3px;left:3px;box-shadow:inset 0 0 0 32px,6px 0,12px 0,18px 0,0 6px,6px 6px,12px 6px,18px 6px,0 12px,6px 12px,12px 12px,18px 12px}.icono-calendar:after{position:absolute;width:4px;height:8px;box-shadow:inset 0 0 0 32px,16px 0;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;top:-8px;left:4px}.icono-camera{width:32px;height:24px;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;margin:5px 1px}.icono-camera:before{width:10px;height:10px;border:1px solid transparent;box-shadow:inset 0 0 0 1px,0 0 0 2px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-camera:after{position:absolute;width:4px;height:2px;right:2px;top:2px;box-shadow:inset 0 0 0 32px}.icono-piano{width:28px;height:22px;margin:6px 3px}.icono-piano:before{position:absolute;left:4px;top:0;width:1px;height:100%;box-shadow:inset 0 0 0 32px,5px 0,10px 0,15px 0}.icono-piano:after{position:absolute;width:3px;height:12px;left:3px;top:0;box-shadow:inset 0 0 0 32px,5px 0,10px 0,15px 0}.icono-ruler{width:27px;height:12px;margin:11px 4px 11px 3px}.icono-ruler:before{position:absolute;width:1px;height:4px;box-shadow:inset 0 0 0 32px,6px 0,12px 0;left:5px;top:0}.icono-ruler:after{position:absolute;width:1px;height:2px;box-shadow:inset 0 0 0 32px,2px 0,6px 0,8px 0,12px 0,14px 0,18px 0,20px 0;left:1px;top:0}.icono-facebook{width:9px;height:26px;box-shadow:inset 2px 4px 0 0;border-left:3px solid;-webkit-border-radius:5px 0 0;-moz-border-radius:5px 0 0;-o-border-radius:5px 0 0;border-radius:5px 0 0;margin:4px 11px 4px 14px}.icono-facebook:before{position:absolute;top:9px;left:-6px;width:11px;height:0;border-top:4px solid;border-right:1px solid transparent}.icono-twitter{width:14px;height:23px;-webkit-border-radius:0 0 0 8px;-moz-border-radius:0 0 0 8px;-o-border-radius:0 0 0 8px;border-radius:0 0 0 8px;box-shadow:-6px 2px 0 0;margin:4px 7px 7px 13px}.icono-twitter:before{position:absolute;bottom:-2px;left:-6px;width:17px;height:6px;-webkit-border-radius:0 0 0 8px;-moz-border-radius:0 0 0 8px;-o-border-radius:0 0 0 8px;border-radius:0 0 0 8px;box-shadow:inset 4px -6px,0 -11px}.icono-twitter:after{position:absolute;width:6px;height:6px;box-shadow:inset 0 0 0 32px,13px 8px,13px 19px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;left:-6px}.icono-gplus{width:10px;height:2px;box-shadow:inset 0 0 0 32px;margin:14px 4px 18px 20px}.icono-gplus:before{position:absolute;top:-5px;right:10px;content:"g"!important;font-family:georgia;font-size:32px;text-indent:0;line-height:0}.icono-gplus:after{width:2px;height:10px;box-shadow:inset 0 0 0 32px}.icono-linkedIn{width:5px;height:16px;box-shadow:inset 0 0 0 32px,8px 0;margin:12px 24px 6px 5px}.icono-linkedIn:before{position:absolute;width:5px;height:5px;box-shadow:inset 0 0 0 32px;top:-7px;left:0;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-linkedIn:after{position:absolute;width:12px;height:16px;border-right:1px solid;left:11px;bottom:0;-webkit-border-radius:8px 5px 0 0/11px 5px 0 0;-moz-border-radius:8px 5px 0 0/11px 5px 0 0;-o-border-radius:8px 5px 0 0/11px 5px 0 0;border-radius:8px 5px 0 0/11px 5px 0 0;box-shadow:inset -4px 4px}.icono-instagram{width:26px;height:26px;box-shadow:inset 0 0 0 2px;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;margin:4px}.icono-instagram:before{width:10px;height:10px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:0 0 0 3px}.icono-instagram:after{position:absolute;width:5px;height:5px;-webkit-border-radius:1px;-moz-border-radius:1px;-o-border-radius:1px;border-radius:1px;right:3px;top:3px;box-shadow:0 0 0 2px,1px 1px 0 2px,-5px -1px 0 1px,-10px -1px 0 1px,-16px 1px 0 2px}.icono-flickr{width:24px;height:24px;overflow:hidden;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;margin:5px}.icono-flickr:after,.icono-flickr:before{width:7px;height:7px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%}.icono-flickr:before{left:4px;box-shadow:0 0 0 1px,0 -10px 0 6px,0 10px 0 6px,-4px 0 0 3px}.icono-flickr:after{right:4px;box-shadow:0 0 0 1px,0 -10px 0 6px,0 10px 0 6px,4px 0 0 3px}.icono-delicious{width:24px;height:24px;overflow:hidden;-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;box-shadow:inset 0 0 0 2px;margin:5px}.icono-delicious:before{position:absolute;width:12px;height:12px;box-shadow:inset 0 0 0 32px,12px -12px 0 0;left:0;bottom:0}.icono-codepen{width:2px;height:10px;box-shadow:inset 0 0 0 32px,0 15px,-11px 7px,11px 7px;margin:4px 16px 20px}.icono-codepen:before{position:absolute;right:2px;top:3px;width:11px;height:4px;transform:skew(0,-35deg) scaleY(0.6);box-shadow:inset 0 0 0 32px,0 13px,11px 26px,12px 39px}.icono-codepen:after{position:absolute;left:2px;top:3px;width:11px;height:4px;transform:skew(0,35deg) scaleY(0.6);box-shadow:inset 0 0 0 32px,0 13px,-11px 26px,-12px 39px}.icono-blogger{width:24px;height:14px;-webkit-border-radius:0 0 7px 7px;-moz-border-radius:0 0 7px 7px;-o-border-radius:0 0 7px 7px;border-radius:0 0 7px 7px;margin:14px 5px 6px}.icono-blogger,.icono-blogger:before{border-width:6px;border-style:solid}.icono-blogger:before{position:absolute;width:8px;height:2px;left:-6px;top:-15px;-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;-o-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.icono-disqus{width:31px;height:31px;box-shadow:inset 0 0 0 32px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;margin:1px 1px 2px 2px}.icono-disqus:before{position:absolute;width:0;height:0;border:5px solid transparent;border-top:10px solid;-webkit-transform:rotate(50deg);-moz-transform:rotate(50deg);-ms-transform:rotate(50deg);-o-transform:rotate(50deg);transform:rotate(50deg);left:-5px;top:20px}.icono-dribbble{width:26px;height:26px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:inset 0 0 0 2px;overflow:hidden;position:relative;background-image:radial-gradient(50% 100%,transparent 0,transparent 9px,currentColor 10px,currentColor 11px,transparent 12px);background-repeat:no-repeat;background-position:-8px center;-webkit-transform:rotate(-25deg);-moz-transform:rotate(-25deg);-ms-transform:rotate(-25deg);-o-transform:rotate(-25deg);transform:rotate(-25deg);margin:4px}.icono-dribbble:after,.icono-dribbble:before{position:absolute;border-radius:50%;border:2px solid;width:40px;height:30px}.icono-dribbble:after{top:14px;left:-7px;width:32px}.icono-dribbble:before{left:-6px;top:-23px}.icono-creditCard{width:32px;height:24px;-webkit-border-radius:3px;-moz-border-radius:3px;-o-border-radius:3px;border-radius:3px;margin:5px 1px}.icono-creditCard:before{position:absolute;top:4px;width:100%;height:6px;box-shadow:inset 0 0 0 32px}.icono-creditCard:after{left:3px;bottom:3px;position:absolute;width:4px;height:2px;box-shadow:inset 0 0 0 32px,6px 0}.icono-cup{width:22px;height:16px;box-shadow:inset 0 0 0 32px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-o-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;margin:6px 6px 12px}.icono-cup:before{position:absolute;right:-3px;top:4px;width:5px;height:5px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:0 0 0 2px}.icono-cup:after{bottom:-5px;width:26px;height:3px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;-o-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;box-shadow:inset 0 0 0 32px}.icono-play{width:0;height:0;border-width:10px 0 10px 16px;border-style:solid;border-top-color:transparent;border-bottom-color:transparent;margin:7px 9px}.icono-pause{width:6px;height:20px;margin:7px 20px 7px 8px;box-shadow:inset 0 0 0 32px,12px 0 0 0}.icono-stop{width:0;height:0;border:10px solid;margin:7px}.icono-rewind{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icono-forward,.icono-rewind{width:0;height:0;border:10px solid transparent;border-left:10px solid;margin:7px}.icono-forward:before,.icono-rewind:before{position:absolute;left:0;top:-10px;width:0;height:0;border:10px solid transparent;border-left:10px solid}.icono-next,.icono-previous{width:0;height:0;border:10px solid transparent;border-left:10px solid;border-right:none;margin:7px 14px 7px 10px;box-shadow:4px 0}.icono-previous{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);margin:7px 10px 7px 14px}.icono-caretDown,.icono-caretDownCircle,.icono-caretDownSquare,.icono-caretLeft,.icono-caretLeftCircle,.icono-caretLeftSquare,.icono-caretRight,.icono-caretRightCircle,.icono-caretRightSquare,.icono-caretUp,.icono-caretUpCircle,.icono-caretUpSquare{width:12px;height:20px;margin:7px 11px}.icono-caretDown:after,.icono-caretDown:before,.icono-caretDownCircle:after,.icono-caretDownCircle:before,.icono-caretDownSquare:after,.icono-caretDownSquare:before,.icono-caretLeft:after,.icono-caretLeft:before,.icono-caretLeftCircle:after,.icono-caretLeftCircle:before,.icono-caretLeftSquare:after,.icono-caretLeftSquare:before,.icono-caretRight:after,.icono-caretRight:before,.icono-caretRightCircle:after,.icono-caretRightCircle:before,.icono-caretRightSquare:after,.icono-caretRightSquare:before,.icono-caretUp:after,.icono-caretUp:before,.icono-caretUpCircle:after,.icono-caretUpCircle:before,.icono-caretUpSquare:after,.icono-caretUpSquare:before{width:14px;height:2px;position:absolute;bottom:0;margin:auto 0;right:2px;box-shadow:inset 0 0 0 32px;transform-origin:right}.icono-caretDown:before,.icono-caretDownCircle:before,.icono-caretDownSquare:before,.icono-caretLeft:before,.icono-caretLeftCircle:before,.icono-caretLeftSquare:before,.icono-caretRight:before,.icono-caretRightCircle:before,.icono-caretRightSquare:before,.icono-caretUp:before,.icono-caretUpCircle:before,.icono-caretUpSquare:before{top:2px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.icono-caretDown:after,.icono-caretDownCircle:after,.icono-caretDownSquare:after,.icono-caretLeft:after,.icono-caretLeftCircle:after,.icono-caretLeftSquare:after,.icono-caretRight:after,.icono-caretRightCircle:after,.icono-caretRightSquare:after,.icono-caretUp:after,.icono-caretUpCircle:after,.icono-caretUpSquare:after{top:0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.icono-caretLeft,.icono-caretLeftCircle,.icono-caretLeftSquare{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icono-caretUp,.icono-caretUpCircle,.icono-caretUpSquare{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.icono-caretDown,.icono-caretDownCircle,.icono-caretDownSquare{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}[class*=icono-caret][class*=Circle]:after,[class*=icono-caret][class*=Circle]:before,[class*=icono-caret][class*=Square]:after,[class*=icono-caret][class*=Square]:before{width:11px;right:8px}.icono-downArrow,.icono-leftArrow,.icono-rightArrow,.icono-upArrow{width:16px;height:4px;margin:15px 9px;box-shadow:inset 0 0 0 2px;-webkit-transform:translateX(-3px);-moz-transform:translateX(-3px);-ms-transform:translateX(-3px);-o-transform:translateX(-3px);transform:translateX(-3px)}.icono-downArrow:before,.icono-leftArrow:before,.icono-rightArrow:before,.icono-upArrow:before{border-style:solid;border-width:8px 0 8px 8px;border-color:transparent;border-left-color:inherit;left:100%;right:auto}.icono-leftArrow{-webkit-transform:translateX(3px) rotate(180deg);-moz-transform:translateX(3px) rotate(180deg);-ms-transform:translateX(3px) rotate(180deg);-o-transform:translateX(3px) rotate(180deg);transform:translateX(3px) rotate(180deg)}.icono-upArrow{-webkit-transform:translateY(3px) rotate(-90deg);-moz-transform:translateY(3px) rotate(-90deg);-ms-transform:translateY(3px) rotate(-90deg);-o-transform:translateY(3px) rotate(-90deg);transform:translateY(3px) rotate(-90deg)}.icono-downArrow{-webkit-transform:translateY(-3px) rotate(90deg);-moz-transform:translateY(-3px) rotate(90deg);-ms-transform:translateY(-3px) rotate(90deg);-o-transform:translateY(-3px) rotate(90deg);transform:translateY(-3px) rotate(90deg)}.icono-sun{width:22px;height:22px;border:2px solid;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:-15px 0 0 -9px,15px 0 0 -9px,0 -15px 0 -9px,0 15px 0 -9px,11px 11px 0 -9px,-11px -11px 0 -9px,11px -11px 0 -9px,-11px 11px 0 -9px;margin:6px}.icono-moon{width:22px;height:22px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;overflow:hidden;margin:6px}.icono-moon:before{position:absolute;width:20px;height:20px;top:-2px;left:6px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:0 0 0 32px}.icono-cart{width:22px;height:0;border-width:14px 6px 0 2px;border-style:solid;border-right-color:transparent;border-left-color:transparent;margin:9px 3px 11px 9px}.icono-cart:before{position:absolute;width:4px;height:4px;-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;box-shadow:inset 0 0 0 32px,13px 0,-4px -20px 0 1px;top:2px;left:-3px}.icono-sitemap{width:24px;height:2px;box-shadow:0 -5px;margin:21px 5px 11px}.icono-sitemap:before{width:6px;height:6px;-webkit-border-radius:2px;-moz-border-radius:2px;-o-border-radius:2px;border-radius:2px;box-shadow:inset 0 0 0 32px,11px 0,-11px 0,0 -14px 0 1px}.icono-sitemap:after{width:2px;height:10px;box-shadow:0 -7px,11px -5px,-11px -5px}[class*=icono-]{display:inline-block;vertical-align:middle;position:relative;font-style:normal;color:#ddd;text-align:left;text-indent:-9999px;direction:ltr}[class*=icono-]:after,[class*=icono-]:before{content:'';pointer-events:none}[class*=icono-][class*=Circle]{-webkit-border-radius:50%;-moz-border-radius:50%;-o-border-radius:50%;border-radius:50%;width:30px;height:30px;margin:2px}[class*=icono-][class*=Square]{-webkit-border-radius:4px;-moz-border-radius:4px;-o-border-radius:4px;border-radius:4px;width:30px;height:30px;margin:2px}[class*=icono-],[class*=icono-] *{box-sizing:border-box} -------------------------------------------------------------------------------- /static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |