├── .gitignore
├── README.md
├── about.html
├── bg-mobile.jpg
├── bg.jpg
├── birds-dark.png
├── birds-darker.png
├── birds.png
├── build
├── basscss.min.css
├── fonts
│ ├── icomoon.eot
│ ├── icomoon.svg
│ ├── icomoon.ttf
│ └── icomoon.woff
├── icon.css
├── icon.min.css
├── main.js
├── main.min.js
├── script.js
├── script.min.js
├── styles.css
└── styles.min.css
├── data.json
├── ellipsis.svg
├── favicon.ico
├── favicon.png
├── gulpfile.js
├── index.html
├── package.json
├── ring.svg
├── src
├── js
│ ├── AllBirdsWrapper.jsx
│ ├── BirdAttribute.jsx
│ ├── BirdImage.jsx
│ ├── BirdInfo.jsx
│ ├── BirdStats.jsx
│ ├── BirdStatus.jsx
│ ├── BirdThreats.jsx
│ ├── BirdTitle.jsx
│ ├── BirdWrapper.jsx
│ └── main.js
└── sass
│ ├── _card.scss
│ ├── _footer.scss
│ ├── _global.scss
│ ├── _header.scss
│ ├── _layout.scss
│ ├── _list.scss
│ ├── _structure.scss
│ ├── _type.scss
│ └── styles.scss
└── threat.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # node-waf configuration
20 | .lock-wscript
21 |
22 | # Compiled binary addons (http://nodejs.org/api/addons.html)
23 | build/Release
24 |
25 | # Dependency directory
26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
27 | node_modules
28 | .sass-cache
29 | *.css.map
30 | .DS_Store
31 | .module-cache
32 | images
33 | imgs
34 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #Endangered birds in NSW
2 |
3 | ###[Check it out here](http://chloechen.io/bird)
4 |
5 | ##Data source:
6 | [Endangered birds in NSW](http://data.gov.au/dataset/threatened-species-state-lists/resource/ab6c9078-ac64-41e0-9987-3e38da53d277)
7 |
8 |
9 | ##Image Attributes(in progress)
10 |
11 | THANKS TO ALL THE GENEROUS PEOPLE WHO ALLOW ME TO USE THEIR PHOTOS IN THIS PROJECT.
12 |
13 | The following is a complete list of bird images used in this project. The licence of the project does not cover any of the images, please contact the creators of the image for reuse.
14 |
15 | Black-eared Miner(Manorina melanotis)
16 |
17 | [Intro Image](https://flic.kr/p/8LkeCd) by [Planettrekker](https://www.flickr.com/photos/planettrekker/)
18 |
19 |
20 | Eastern Bristlebird (Dasyornis brachypterus)
21 |
22 | [Intro Image](https://flic.kr/p/ckjKfo) by [David Cook](https://flic.kr/p/4UUpTw) CC 2.0 Generic
23 |
24 | [High Res](http://tim-dolby.blogspot.com.au) by [Tim Dolly](http://tim-dolby.blogspot.com.au)
25 |
26 |
27 | Swift Parrot (Lathamus discolor)
28 |
29 | [Intro Image](https://flic.kr/p/8EHCTt) by [Julian Robinson](https://www.flickr.com/photos/ozjulian/)
30 |
31 | [High Res](https://flic.kr/p/4Hqysg) by [Tobias Hayashi](https://www.flickr.com/photos/callocephalon/)
32 |
33 |
34 | Australasian Bittern (Botaurus poiciloptilus)
35 |
36 | [High Res](https://flic.kr/p/ormTq2) by [David Cook](https://www.flickr.com/photos/frankzed/) CC 2.0
37 |
38 |
39 | Southern Giant Petrel (Macronectes giganteus)
40 |
41 | [Intro Image](https://flic.kr/p/dGZLrv) by [Oliver Dodd](https://www.flickr.com/photos/oliverdodd/)
42 |
43 | [High Res](https://flic.kr/p/kqb1ai) by [Harold Moses](https://www.flickr.com/photos/mosesharold/)
44 |
45 |
46 | Star Finch (eastern), Star Finch (southern)(Neochmia ruficauda ruficauda)
47 |
48 | [Image](https://flic.kr/p/uByw92) by [Jim Bendon](https://www.flickr.com/photos/jim_bendon_1957/) CC 2.0
49 |
50 |
51 | Gould's Petrel(Pterodroma leucoptera leucoptera)
52 |
53 |
54 | [High Res](https://flic.kr/p/dN1mWz) by [Todd Burrows](https://www.flickr.com/photos/toddburrows/)
55 |
56 |
57 |
58 | Mallee Emu-wren (Stipiturus mallee)
59 |
60 | [High Res](https://flic.kr/p/diYjwY) by [Ron Knight](https://www.flickr.com/photos/sussexbirder/)
61 | [Intro Image](https://flic.kr/p/qaiN8e) by [Wild~Life](https://www.flickr.com/photos/andrew_alderson/)
62 |
63 |
64 |
65 | Coxen's Fig-Parrot (Cyclopsitta diophthalma coxeni)
66 |
67 |
68 | [High Res](https://upload.wikimedia.org/wikipedia/commons/b/b3/Cyclopsitta_diophthalma_-Birdworld_Kuranda%2C_Queensland%2C_Australia_-male-8a.jpg)
69 |
70 |
71 | Black-throated Finch (southern) (Poephila cincta cincta)
72 |
73 | [Intro Image](https://flic.kr/p/9qfMzH) by [Aunty Marsy](https://www.flickr.com/photos/auntymarsy/)
74 |
75 |
76 | Chatham Albatross (Thalassarche eremita)
77 |
78 | [Intro Image](https://flic.kr/p/8UexwV) by [Jon Irvine](https://www.flickr.com/photos/calidris-photos/)
79 |
80 | [High Res](https://flic.kr/p/8UeweH) by [Jon Irvine](https://www.flickr.com/photos/calidris-photos/)
81 |
82 |
83 |
84 | Grey Grasswren (Bulloo) (Amytornis barbatus barbatus)
85 |
86 | [Intro Image](https://flic.kr/p/diYmzg) by [Ron Knight](https://www.flickr.com/photos/sussexbirder/) CC 2.0
87 |
88 |
89 | Australian Painted Snipe (Rostratula australis)
90 |
91 | [Intro Image](https://flic.kr/p/dQDDLd) by [Patrick_K59](https://www.flickr.com/photos/patrick_k59/)
92 |
93 | [High Res](https://flic.kr/p/dUx4r5) [Patrick_K59](https://www.flickr.com/photos/patrick_k59/)
94 |
95 |
96 | Amsterdam Albatross(Diomedea exulans amsterdamensis)
97 |
98 | Vincent Legendre [Intro Image](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Albatros_d%27amsterdam_poussin.jpg/500px-Albatros_d%27amsterdam_poussin.jpg)
99 |
100 | [High Res](https://en.wikipedia.org/wiki/Amsterdam_albatross#/media/File:Albatros_d%27amsterdam.jpg)
101 |
102 |
103 | Northern Royal Albatross(Diomedea epomophora sanfordi)
104 |
105 | [Intro Image](https://flic.kr/p/qavMD1) by [Ed Dunens](https://www.flickr.com/photos/blachswan/) CC 2.0
106 |
107 | [High Res](https://en.wikipedia.org/wiki/Northern_royal_albatross#/media/File:Diomedea_sanfordi_-_SE_Tasmania.jpg)
108 |
109 |
110 | Tristan Albatross (Diomedea exulans exulans)
111 |
112 | [Intro Image](https://flic.kr/p/6aFUqB) by [Chantal Steyn](https://www.flickr.com/photos/chantal_steyn/)
113 |
114 | [High Res](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Diomedea_exulans_in_flight_-_SE_Tasmania.jpg/440px-Diomedea_exulans_in_flight_-_SE_Tasmania.jpg)
115 |
--------------------------------------------------------------------------------
/about.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Endangered Birds NSW | About
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | About this project
19 |
20 | This is a project about endangered birds in NSW. It uses a subset of data of the Threatened Species State Lists (July 2015) published by the Australian Government Department of the Environment.
21 | Please get in touch if you spot any errors.
22 | This is a open source project using ReactJs, the source code can be found here.
23 |
24 | I would like to thank the following people for generously making their photographies free to use to the public or giving me the right to use them in this project. They are all amazing wildlife photographers, be sure to check them out.
25 |
26 |
27 |
49 |
50 | About me
51 | I am Chloe Chen, I'm a Sydney-based Front End Developer.
52 | You can find me on Twitter or checkout my other project on Github
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/bg-mobile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/bg-mobile.jpg
--------------------------------------------------------------------------------
/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/bg.jpg
--------------------------------------------------------------------------------
/birds-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/birds-dark.png
--------------------------------------------------------------------------------
/birds-darker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/birds-darker.png
--------------------------------------------------------------------------------
/birds.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/birds.png
--------------------------------------------------------------------------------
/build/basscss.min.css:
--------------------------------------------------------------------------------
1 | body{margin:0}img{max-width:100%}svg{max-height:100%}fieldset,input,select,textarea{font-family:inherit;font-size:1rem;box-sizing:border-box;margin-top:0;margin-bottom:0}label{vertical-align:middle}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{height:2.25rem;padding:.5rem .5rem;vertical-align:middle;-webkit-appearance:none}select{line-height:1.75;padding:.5rem .5rem}select:not([multiple]){height:2.25rem;vertical-align:middle}textarea{line-height:1.75;padding:.5rem .5rem}table{border-collapse:separate;border-spacing:0;max-width:100%;width:100%}th{text-align:left;font-weight:700}td,th{padding:.25rem 1rem;line-height:inherit}th{vertical-align:bottom}td{vertical-align:top}body{font-family:'Helvetica Neue',Helvetica,sans-serif;line-height:1.5;font-size:100%}h1,h2,h3,h4,h5,h6{font-family:'Helvetica Neue',Helvetica,sans-serif;font-weight:700;line-height:1.25;margin-top:1em;margin-bottom:.5em}p{margin-top:0;margin-bottom:1rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}code,pre,samp{font-family:'Source Code Pro',Consolas,monospace;font-size:inherit}pre{margin-top:0;margin-bottom:1rem;overflow-x:scroll}h1{font-size:2rem}h2{font-size:1.5rem}h3{font-size:1.25rem}h4{font-size:1rem}h5{font-size:.875rem}h6{font-size:.75rem}body{color:#111;background-color:#fff}a{color:#0074d9;text-decoration:none}a:hover{text-decoration:underline}code,pre{background-color:transparent;border-radius:3px}hr{border:0;border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:rgba(0,0,0,.125)}.field{border-style:solid;border-width:1px;border-color:rgba(0,0,0,.125);border-radius:3px}.field.is-focused,.field:focus{outline:0;border-color:#0074d9;box-shadow:0 0 0 2px rgba(0,116,217,.5)}.field.is-disabled,.field:disabled{background-color:rgba(0,0,0,.125);opacity:.5}.field.is-read-only,.field:read-only:not(select){background-color:rgba(0,0,0,.125)}.field.is-success{border-color:#2ecc40}.field.is-success.is-focused,.field.is-success:focus{box-shadow:0 0 0 2px rgba(46,204,64,.5)}.field.is-warning{border-color:#ffdc00}.field.is-warning.is-focused,.field.is-warning:focus{box-shadow:0 0 0 2px rgba(255,220,0,.5)}.field.is-error,.field:invalid{border-color:#ff4136}.field.is-error.is-focused,.field.is-error:focus,.field:invalid.is-focused,.field:invalid:focus{box-shadow:0 0 0 2px rgba(255,65,54,.5)}.table-light td,.table-light th{border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgba(0,0,0,.125)}.table-light tr:last-child td{border-bottom:0}.btn{font-family:inherit;font-size:inherit;font-weight:700;text-decoration:none;cursor:pointer;display:inline-block;line-height:1.125rem;padding:.5rem 1rem;margin:0;height:auto;border:1px solid transparent;vertical-align:middle;-webkit-appearance:none;color:inherit;background-color:transparent}.btn:hover{text-decoration:none}.btn:focus{outline:0;border-color:rgba(0,0,0,.125);box-shadow:0 0 0 3px rgba(0,0,0,.25)}::-moz-focus-inner{border:0;padding:0}.btn-primary{color:#fff;background-color:#0074d9;border-radius:3px}.btn-primary:hover{box-shadow:inset 0 0 0 20rem rgba(0,0,0,.0625)}.btn-primary:active{box-shadow:inset 0 0 0 20rem rgba(0,0,0,.125),inset 0 3px 4px 0 rgba(0,0,0,.25),0 0 1px rgba(0,0,0,.125)}.btn-primary.is-disabled,.btn-primary:disabled{opacity:.5}.btn-outline,.btn-outline:hover{border-color:currentcolor}.btn-outline{border-radius:3px}.btn-outline:hover{box-shadow:inset 0 0 0 20rem rgba(0,0,0,.0625)}.btn-outline:active{box-shadow:inset 0 0 0 20rem rgba(0,0,0,.125),inset 0 3px 4px 0 rgba(0,0,0,.25),0 0 1px rgba(0,0,0,.125)}.btn-outline.is-disabled,.btn-outline:disabled{opacity:.5}.h1{font-size:2rem}.h2{font-size:1.5rem}.h3{font-size:1.25rem}.h4{font-size:1rem}.h5{font-size:.875rem}.h6{font-size:.75rem}.bold{font-weight:700}.regular{font-weight:400}.italic{font-style:italic}.caps{text-transform:uppercase;letter-spacing:.2em}.left-align{text-align:left}.center{text-align:center}.right-align{text-align:right}.justify{text-align:justify}.nowrap{white-space:nowrap}.break-word{word-wrap:break-word}.truncate{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-reset{list-style:none;padding-left:0}.inline{display:inline}.block{display:block}.inline-block{display:inline-block}.table{display:table}.table-cell{display:table-cell}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-auto{overflow:auto}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.left{float:left}.right{float:right}.fit{max-width:100%}.border-box{box-sizing:border-box}.align-baseline{vertical-align:baseline}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.m0{margin:0}.mt0{margin-top:0}.mr0{margin-right:0}.mb0{margin-bottom:0}.ml0{margin-left:0}.m1{margin:.5rem}.mt1{margin-top:.5rem}.mr1{margin-right:.5rem}.mb1{margin-bottom:.5rem}.ml1{margin-left:.5rem}.m2{margin:1rem}.mt2{margin-top:1rem}.mr2{margin-right:1rem}.mb2{margin-bottom:1rem}.ml2{margin-left:1rem}.m3{margin:2rem}.mt3{margin-top:2rem}.mr3{margin-right:2rem}.mb3{margin-bottom:2rem}.ml3{margin-left:2rem}.m4{margin:4rem}.mt4{margin-top:4rem}.mr4{margin-right:4rem}.mb4{margin-bottom:4rem}.ml4{margin-left:4rem}.mxn1{margin-left:-.5rem;margin-right:-.5rem}.mxn2{margin-left:-1rem;margin-right:-1rem}.mxn3{margin-left:-2rem;margin-right:-2rem}.mxn4{margin-left:-4rem;margin-right:-4rem}.mx-auto{margin-left:auto;margin-right:auto}.p0{padding:0}.p1{padding:.5rem}.py1{padding-top:.5rem;padding-bottom:.5rem}.px1{padding-left:.5rem;padding-right:.5rem}.p2{padding:1rem}.py2{padding-top:1rem;padding-bottom:1rem}.px2{padding-left:1rem;padding-right:1rem}.p3{padding:2rem}.py3{padding-top:2rem;padding-bottom:2rem}.px3{padding-left:2rem;padding-right:2rem}.p4{padding:4rem}.py4{padding-top:4rem;padding-bottom:4rem}.px4{padding-left:4rem;padding-right:4rem}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.z1{z-index:1}.z2{z-index:2}.z3{z-index:3}.z4{z-index:4}.lg-show,.md-show,.sm-show{display:none!important}@media (min-width:40em){.sm-show{display:block!important}}@media (min-width:52em){.md-show{display:block!important}}@media (min-width:64em){.lg-show{display:block!important}}@media (min-width:40em){.sm-hide{display:none!important}}@media (min-width:52em){.md-hide{display:none!important}}@media (min-width:64em){.lg-hide{display:none!important}}.display-none{display:none!important}.hide{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}.container{max-width:64em;margin-left:auto;margin-right:auto}.col{float:left;box-sizing:border-box}.col-right{float:right;box-sizing:border-box}.col-1{width:8.33333%}.col-2{width:16.66667%}.col-3{width:25%}.col-4{width:33.33333%}.col-5{width:41.66667%}.col-6{width:50%}.col-7{width:58.33333%}.col-8{width:66.66667%}.col-9{width:75%}.col-10{width:83.33333%}.col-11{width:91.66667%}.col-12{width:100%}@media (min-width:40em){.sm-col{float:left;box-sizing:border-box}.sm-col-right{float:right;box-sizing:border-box}.sm-col-1{width:8.33333%}.sm-col-2{width:16.66667%}.sm-col-3{width:25%}.sm-col-4{width:33.33333%}.sm-col-5{width:41.66667%}.sm-col-6{width:50%}.sm-col-7{width:58.33333%}.sm-col-8{width:66.66667%}.sm-col-9{width:75%}.sm-col-10{width:83.33333%}.sm-col-11{width:91.66667%}.sm-col-12{width:100%}}@media (min-width:52em){.md-col{float:left;box-sizing:border-box}.md-col-right{float:right;box-sizing:border-box}.md-col-1{width:8.33333%}.md-col-2{width:16.66667%}.md-col-3{width:25%}.md-col-4{width:33.33333%}.md-col-5{width:41.66667%}.md-col-6{width:50%}.md-col-7{width:58.33333%}.md-col-8{width:66.66667%}.md-col-9{width:75%}.md-col-10{width:83.33333%}.md-col-11{width:91.66667%}.md-col-12{width:100%}}@media (min-width:64em){.lg-col{float:left;box-sizing:border-box}.lg-col-right{float:right;box-sizing:border-box}.lg-col-1{width:8.33333%}.lg-col-2{width:16.66667%}.lg-col-3{width:25%}.lg-col-4{width:33.33333%}.lg-col-5{width:41.66667%}.lg-col-6{width:50%}.lg-col-7{width:58.33333%}.lg-col-8{width:66.66667%}.lg-col-9{width:75%}.lg-col-10{width:83.33333%}.lg-col-11{width:91.66667%}.lg-col-12{width:100%}}.flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.flex-center{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.flex-baseline{-webkit-box-align:baseline;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline}.flex-stretch{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.flex-start{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.flex-end{-webkit-box-align:end;-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}.flex-justify{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.flex-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;min-width:0;min-height:0}.flex-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-none{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.flex-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.flex-last{-webkit-box-ordinal-group:100000;-webkit-order:99999;-ms-flex-order:99999;order:99999}@media (min-width:40em){.sm-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}@media (min-width:52em){.md-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}@media (min-width:64em){.lg-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}.border{border-style:solid;border-width:1px;border-color:rgba(0,0,0,.125)}.border-top{border-top-style:solid;border-top-width:1px;border-top-color:rgba(0,0,0,.125)}.border-right{border-right-style:solid;border-right-width:1px;border-right-color:rgba(0,0,0,.125)}.border-bottom{border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:rgba(0,0,0,.125)}.border-left{border-left-style:solid;border-left-width:1px;border-left-color:rgba(0,0,0,.125)}.border-none{border:0}.rounded{border-radius:3px}.circle{border-radius:50%}.rounded-top{border-radius:3px 3px 0 0}.rounded-right{border-radius:0 3px 3px 0}.rounded-bottom{border-radius:0 0 3px 3px}.rounded-left{border-radius:3px 0 0 3px}.not-rounded{border-radius:0}.black{color:#111}.gray{color:#aaa}.silver{color:#ddd}.white{color:#fff}.aqua{color:#7fdbff}.blue{color:#0074d9}.navy{color:#001f3f}.teal{color:#39cccc}.green{color:#2ecc40}.olive{color:#3d9970}.lime{color:#01ff70}.yellow{color:#ffdc00}.orange{color:#ff851b}.red{color:#ff4136}.fuchsia{color:#f012be}.purple{color:#b10dc9}.maroon{color:#85144b}.color-inherit{color:inherit}.muted{opacity:.5}.bg-black{background-color:#111}.bg-gray{background-color:#aaa}.bg-silver{background-color:#ddd}.bg-white{background-color:#fff}.bg-aqua{background-color:#7fdbff}.bg-blue{background-color:#0074d9}.bg-navy{background-color:#001f3f}.bg-teal{background-color:#39cccc}.bg-green{background-color:#2ecc40}.bg-olive{background-color:#3d9970}.bg-lime{background-color:#01ff70}.bg-yellow{background-color:#ffdc00}.bg-orange{background-color:#ff851b}.bg-red{background-color:#ff4136}.bg-fuchsia{background-color:#f012be}.bg-purple{background-color:#b10dc9}.bg-maroon{background-color:#85144b}.bg-darken-1{background-color:rgba(0,0,0,.0625)}.bg-darken-2{background-color:rgba(0,0,0,.125)}.bg-darken-3{background-color:rgba(0,0,0,.25)}.bg-darken-4{background-color:rgba(0,0,0,.5)}.bg-lighten-1{background-color:rgba(255,255,255,.0625)}.bg-lighten-2{background-color:rgba(255,255,255,.125)}.bg-lighten-3{background-color:rgba(255,255,255,.25)}.bg-lighten-4{background-color:rgba(255,255,255,.5)}
2 |
--------------------------------------------------------------------------------
/build/fonts/icomoon.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/build/fonts/icomoon.eot
--------------------------------------------------------------------------------
/build/fonts/icomoon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Generated by IcoMoon
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/build/fonts/icomoon.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/build/fonts/icomoon.ttf
--------------------------------------------------------------------------------
/build/fonts/icomoon.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/build/fonts/icomoon.woff
--------------------------------------------------------------------------------
/build/icon.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'icomoon';
3 | src:url('fonts/icomoon.eot?-fg2jbl');
4 | src:url('fonts/icomoon.eot?#iefix-fg2jbl') format('embedded-opentype'),
5 | url('fonts/icomoon.ttf?-fg2jbl') format('truetype'),
6 | url('fonts/icomoon.woff?-fg2jbl') format('woff'),
7 | url('fonts/icomoon.svg?-fg2jbl#icomoon') format('svg');
8 | font-weight: normal;
9 | font-style: normal;
10 | }
11 |
12 | [class^="icon-"], [class*=" icon-"] {
13 | font-family: 'icomoon';
14 | speak: none;
15 | font-style: normal;
16 | font-weight: normal;
17 | font-variant: normal;
18 | text-transform: none;
19 | line-height: 1;
20 |
21 | /* Better Font Rendering =========== */
22 | -webkit-font-smoothing: antialiased;
23 | -moz-osx-font-smoothing: grayscale;
24 | }
25 |
26 | .icon-arrow-left:before {
27 | content: "\e606";
28 | }
29 | .icon-link-external:before {
30 | content: "\e600";
31 | }
32 | .icon-info:before {
33 | content: "\e601";
34 | }
35 | .icon-cross:before {
36 | content: "\e602";
37 | }
38 | .icon-bird:before {
39 | content: "\e603";
40 | }
41 |
--------------------------------------------------------------------------------
/build/icon.min.css:
--------------------------------------------------------------------------------
1 | @font-face{font-family:icomoon;src:url(fonts/icomoon.eot?-fg2jbl);src:url(fonts/icomoon.eot?#iefix-fg2jbl) format('embedded-opentype'),url(fonts/icomoon.ttf?-fg2jbl) format('truetype'),url(fonts/icomoon.woff?-fg2jbl) format('woff'),url(fonts/icomoon.svg?-fg2jbl#icomoon) format('svg');font-weight:400;font-style:normal}[class*=" icon-"],[class^=icon-]{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-arrow-left:before{content:"\e606"}.icon-link-external:before{content:"\e600"}.icon-info:before{content:"\e601"}.icon-cross:before{content:"\e602"}.icon-bird:before{content:"\e603"}
--------------------------------------------------------------------------------
/build/script.js:
--------------------------------------------------------------------------------
1 | ;(function() {
2 | 'use strict';
3 | var imghero = document.getElementById('tilt-mover'),
4 | header = document.getElementById('header'),
5 | tilt = document.getElementById('tilt'),
6 | btn = document.getElementById('start'),
7 | body = document.getElementById('body');
8 |
9 |
10 | btn.addEventListener('click', function(ev){
11 | ev.preventDefault();
12 | body.classList.toggle('front');
13 | });
14 |
15 | var win = { width: window.innerWidth, height: window.innerHeight };
16 | function throttle(fn, delay) {
17 | var allowSample = true;
18 | return function(e) {
19 | if (allowSample) {
20 | allowSample = false;
21 | setTimeout(function() { allowSample = true; }, delay);
22 | fn(e);
23 | }
24 | };
25 | }
26 |
27 |
28 | function is_touch_device() {
29 | return (('ontouchstart' in window) || (navigator.MaxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0));
30 | }
31 |
32 | if (!is_touch_device()) {
33 | var exHandler = function(ev){
34 | imghero.style.WebkitTransform = 'perspective(1000px) translate3d(0,0,0) rotate3d(1,1,1,0deg)';
35 | imghero.style.transform = 'perspective(1000px) translate3d(0,0,0) rotate3d(1,1,1,0deg)';
36 | };
37 |
38 | var moveHandler = throttle(function(ev) {
39 | var xVal = -1/(win.height/2)*ev.clientY + 1,
40 | yVal = 1/(win.width/2)*ev.clientX - 1,
41 | transX = 20/(win.width)*ev.clientX - 10,
42 | transY = 20/(win.height)*ev.clientY - 10,
43 | transZ = 100/(win.height)*ev.clientY - 50;
44 | imghero.style.WebkitTransform = 'perspective(1000px) translate3d(' + transX + 'px,' + transY + 'px,' + transZ + 'px) rotate3d(' + xVal + ',' + yVal + ',0,2deg)';
45 | imghero.style.transform = 'perspective(1000px) translate3d(' + transX + 'px,' + transY + 'px,' + transZ + 'px) rotate3d(' + xVal + ',' + yVal + ',0,2deg)';
46 | }, 100);
47 |
48 | header.addEventListener('mouseenter', exHandler);
49 | window.addEventListener('mousemove', moveHandler);
50 | header.addEventListener('mouseleave', exHandler);
51 | }
52 |
53 | }());
54 |
--------------------------------------------------------------------------------
/build/script.min.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function t(t,e){var n=!0;return function(i){n&&(n=!1,setTimeout(function(){n=!0},e),t(i))}}function e(){return"ontouchstart"in window||navigator.MaxTouchPoints>0||navigator.msMaxTouchPoints>0}var n=document.getElementById("tilt-mover"),i=document.getElementById("header"),r=(document.getElementById("tilt"),document.getElementById("start")),o=document.getElementById("body");r.addEventListener("click",function(t){t.preventDefault(),o.classList.toggle("front")});var d={width:window.innerWidth,height:window.innerHeight};if(!e()){var a=function(t){n.style.WebkitTransform="perspective(1000px) translate3d(0,0,0) rotate3d(1,1,1,0deg)",n.style.transform="perspective(1000px) translate3d(0,0,0) rotate3d(1,1,1,0deg)"},s=t(function(t){var e=-1/(d.height/2)*t.clientY+1,i=1/(d.width/2)*t.clientX-1,r=20/d.width*t.clientX-10,o=20/d.height*t.clientY-10,a=100/d.height*t.clientY-50;n.style.WebkitTransform="perspective(1000px) translate3d("+r+"px,"+o+"px,"+a+"px) rotate3d("+e+","+i+",0,2deg)",n.style.transform="perspective(1000px) translate3d("+r+"px,"+o+"px,"+a+"px) rotate3d("+e+","+i+",0,2deg)"},100);i.addEventListener("mouseenter",a),window.addEventListener("mousemove",s),i.addEventListener("mouseleave",a)}}();
--------------------------------------------------------------------------------
/build/styles.css:
--------------------------------------------------------------------------------
1 | @import url(http://fonts.googleapis.com/css?family=Marck+Script);
2 | @import url(http://fonts.googleapis.com/css?family=Viga);
3 | img.loaded {
4 | width: 100%;
5 | height: auto;
6 | -moz-transition: all, 1s;
7 | -o-transition: all, 1s;
8 | -webkit-transition: all, 1s;
9 | transition: all, 1s;
10 | }
11 |
12 | img.loading {
13 | opacity: 0;
14 | width: 100%;
15 | }
16 |
17 | img.loaded {
18 | opacity: 1;
19 | }
20 |
21 | body {
22 | color: #bdc3c7;
23 | font-family: "Viga", sans-serif;
24 | }
25 |
26 | a {
27 | color: #ef5350;
28 | }
29 | a a:hover, a a:focus {
30 | color: #f3817f;
31 | }
32 |
33 | h1, h2, h3 {
34 | font-family: "Viga", sans-serif;
35 | font-weight: 700;
36 | }
37 |
38 | .sci-name {
39 | font-family: "Marck Script", cursive;
40 | font-size: 1.5em;
41 | }
42 |
43 | label {
44 | font-family: "Viga", Helvetica, sans-serif;
45 | }
46 |
47 | body {
48 | background: #212121;
49 | overflow-x: hidden;
50 | background-image: url("./../birds-darker.png");
51 | }
52 | body.front {
53 | overflow: hidden;
54 | height: 100vh;
55 | }
56 | body.front #main {
57 | display: none;
58 | }
59 |
60 | #content {
61 | min-height: 100vh;
62 | }
63 |
64 | .fix {
65 | overflow-y: hidden;
66 | padding-right: 0;
67 | }
68 | @media screen and (min-width: 40em) {
69 | .fix {
70 | padding-right: 1em;
71 | }
72 | }
73 |
74 | .all-birds-wrapper {
75 | max-width: 30em;
76 | margin: 0 auto;
77 | padding-bottom: 15em;
78 | }
79 |
80 | header #start:focus, header #start:hover, header #start:active {
81 | -webkit-tap-highlight-color: transparent !important;
82 | outline: 0 !important;
83 | outline: none !important;
84 | box-shadow: none;
85 | }
86 |
87 | header {
88 | position: relative;
89 | background-image: url("./../bg-mobile.jpg");
90 | background-repeat: no-repeat;
91 | background-attachment: fixed;
92 | background-position: center;
93 | background-size: cover;
94 | height: 5em;
95 | width: 5em;
96 | top: 1em;
97 | transform: scale3d(0.8, 0.8, 1);
98 | -webkit-backface-visibility: hidden;
99 | backface-visibility: hidden;
100 | border-radius: 50%;
101 | border: 1px solid transparent;
102 | margin: 0 auto;
103 | -moz-transition: all, 1s;
104 | -o-transition: all, 1s;
105 | -webkit-transition: all, 1s;
106 | transition: all, 1s;
107 | }
108 | header h1 {
109 | display: none;
110 | }
111 | header nav {
112 | display: none;
113 | position: absolute;
114 | right: 2em;
115 | top: 2em;
116 | }
117 | header nav .icon {
118 | font-size: 2em;
119 | text-decoration: none;
120 | color: #bdc3c7;
121 | }
122 | header nav .icon:hover, header nav .icon:focus {
123 | color: #bdc3c7;
124 | }
125 | @media screen and (min-width: 40em) {
126 | header {
127 | background-image: url("./../bg.jpg");
128 | -webkit-backface-visibility: hidden;
129 | backface-visibility: hidden;
130 | background-size: cover;
131 | }
132 | }
133 | header #start {
134 | width: 100%;
135 | height: 100%;
136 | border-radius: 50%;
137 | border: 1px solid transparent;
138 | color: #ef5350;
139 | font-size: 1em;
140 | -webkit-transform-style: preserve-3d;
141 | -moz-transform-style: preserve-3d;
142 | transform-style: preserve-3d;
143 | }
144 | header #start .start {
145 | display: none;
146 | }
147 | header #start:disabled {
148 | display: none;
149 | }
150 | header i.home {
151 | font-size: 2em;
152 | }
153 |
154 | body.front header {
155 | background-image: url("./../bg-mobile.jpg");
156 | background-size: cover;
157 | height: 100vh;
158 | width: 100%;
159 | transform: scale3d(1, 1, 1);
160 | border-radius: 0;
161 | top: 0;
162 | }
163 | body.front header #start {
164 | width: 100%;
165 | height: auto;
166 | }
167 | body.front header #start .start {
168 | display: inline-block;
169 | color: #bdc3c7;
170 | border: 1px solid #bdc3c7;
171 | }
172 | body.front header h1 {
173 | display: block;
174 | margin: 0;
175 | padding: 25vh 0.5em;
176 | }
177 | body.front header .tilt {
178 | display: none;
179 | }
180 | @media screen and (min-width: 40em) {
181 | body.front header {
182 | background-image: none;
183 | }
184 | body.front header h1, body.front header a, body.front header .front-loader, body.front header nav {
185 | z-index: 9999;
186 | opacity: 0.9;
187 | }
188 | body.front header .tilt {
189 | display: block;
190 | position: absolute;
191 | top: 0;
192 | left: 0;
193 | width: 100%;
194 | height: 100%;
195 | z-index: 0;
196 | }
197 | body.front header .tilt-inner {
198 | position: absolute;
199 | top: 0;
200 | left: 0;
201 | width: 100%;
202 | height: 100%;
203 | background-image: url("./../bg.jpg");
204 | -webkit-backface-visibility: hidden;
205 | backface-visibility: hidden;
206 | background-size: cover;
207 | }
208 | body.front header .tilt-back, body.front header .tilt-front {
209 | opacity: 0.2;
210 | -moz-transition: opacity, 0.5s;
211 | -o-transition: opacity, 0.5s;
212 | -webkit-transition: opacity, 0.5s;
213 | transition: opacity, 0.5s;
214 | -moz-transition: transform, 0.5s;
215 | -o-transition: transform, 0.5s;
216 | -webkit-transition: transform, 0.5s;
217 | transition: transform, 0.5s;
218 | moz-transform-origin: 50%;
219 | -o-transform-origin: 50%;
220 | -ms-transform-origin: 50%;
221 | -webkit-transform-origin: 50%;
222 | transform-origin: 50%;
223 | -webkit-transition-timing-function: cubic-bezier(0.6, 0, 0.4, 1);
224 | transition-timing-function: cubic-bezier(0.6, 0, 0.4, 1);
225 | }
226 | body.front header .tilt-back {
227 | z-index: -15;
228 | }
229 | body.front header .tilt-front {
230 | z-index: -9;
231 | }
232 | body.front header .tilt-mover {
233 | opacity: 0.6;
234 | z-index: -10;
235 | -moz-transition: transform, 0.5s;
236 | -o-transition: transform, 0.5s;
237 | -webkit-transition: transform, 0.5s;
238 | transition: transform, 0.5s;
239 | }
240 | }
241 |
242 | .front-loader {
243 | background-image: url("./../ellipsis.svg");
244 | width: 60px;
245 | height: 60px;
246 | margin: 0 auto;
247 | background-repeat: no-repeat;
248 | }
249 | .ready .front-loader {
250 | display: none;
251 | }
252 |
253 | .ready.front header nav {
254 | display: block;
255 | }
256 |
257 | .status {
258 | margin-bottom: 0.5em;
259 | }
260 | .status label {
261 | font-size: 0.8em;
262 | width: 5em;
263 | display: inline-block;
264 | padding-right: 0.5em;
265 | line-height: 0.8;
266 | }
267 | @media screen and (min-width: 40em) {
268 | .status {
269 | text-align: right;
270 | margin-top: 3.5em;
271 | }
272 | }
273 | .status .critically-endangered {
274 | color: #e74c3c;
275 | font-size: 1.2em;
276 | }
277 | .status .endangered {
278 | color: #d35400;
279 | font-size: 1.2em;
280 | }
281 | .status .vulnerable {
282 | color: #e67e22;
283 | }
284 | .status .presumed-extinct {
285 | color: #d14233;
286 | }
287 |
288 | .stats {
289 | text-align: center;
290 | margin: 3em auto;
291 | }
292 | .stats .number {
293 | font-size: 4em;
294 | -webkit-animation-delay: 2s;
295 | -webkit-animation-duration: 5s;
296 | -webkit-animation-name: color;
297 | -webkit-animation-fill-mode: forwards;
298 | /* this prevents the animation from restarting! */
299 | -moz-animation-delay: 2s;
300 | -moz-animation-duration: 5s;
301 | -moz-animation-name: color;
302 | -moz-animation-fill-mode: forwards;
303 | /* this prevents the animation from restarting! */
304 | -o-animation-delay: 2s;
305 | -o-animation-duration: 5s;
306 | -o-animation-name: color;
307 | -o-animation-fill-mode: forwards;
308 | /* this prevents the animation from restarting! */
309 | animation-delay: 2s;
310 | animation-duration: 5s;
311 | animation-name: color;
312 | animation-fill-mode: forwards;
313 | /* this prevents the animation from restarting! */
314 | color: #ef5350;
315 | }
316 |
317 | @-webkit-keyframes color {
318 | from {
319 | color: #fff;
320 | }
321 | to {
322 | color: #ef5350;
323 | }
324 | }
325 | @-moz-keyframes color {
326 | from {
327 | color: #fff;
328 | }
329 | to {
330 | color: #ef5350;
331 | }
332 | }
333 | @-ms-keyframes color {
334 | from {
335 | color: #fff;
336 | }
337 | to {
338 | color: #ef5350;
339 | }
340 | }
341 | @keyframes color {
342 | from {
343 | color: #fff;
344 | }
345 | to {
346 | color: #ef5350;
347 | }
348 | }
349 | .btn-close {
350 | cursor: pointer;
351 | }
352 | .btn-close:hover, .btn-close:focus {
353 | color: #ef5350;
354 | }
355 |
356 | .profile a {
357 | padding-right: 2em;
358 | position: relative;
359 | }
360 | .profile span.icon {
361 | display: inline-block;
362 | padding-left: 0.3em;
363 | position: absolute;
364 | right: 0;
365 | bottom: 0;
366 | width: 1.5em;
367 | height: 1.1em;
368 | font-size: 1.3em;
369 | }
370 |
371 | .threats {
372 | text-align: center;
373 | width: 100%;
374 | }
375 | .threats label {
376 | margin-bottom: 2em;
377 | }
378 | .threats .chart {
379 | margin: 0 auto;
380 | width: 100%;
381 | }
382 | .threats .chart canvas {
383 | max-width: 100%;
384 | height: auto !important;
385 | }
386 |
387 | ul.attribute a {
388 | color: #bdc3c7;
389 | font-size: 0.8em;
390 | }
391 | ul.attribute a:hover, ul.attribute a:focus {
392 | color: #aab1b7;
393 | }
394 |
395 | .open .bird-card-wrapper, .closing .bird-card-wrapper {
396 | position: fixed;
397 | top: 0;
398 | left: 0;
399 | width: 100%;
400 | height: 100%;
401 | -webkit-transform: translate3d(0, 0, 0);
402 | /* prevents flicker */
403 | -webkit-overflow-scrolling: touch;
404 | }
405 |
406 | .bird-card-wrapper {
407 | position: absolute;
408 | overflow: hidden;
409 | }
410 |
411 | .bird-card-wrapper {
412 | -moz-transition: all, 1s;
413 | -o-transition: all, 1s;
414 | -webkit-transition: all, 1s;
415 | transition: all, 1s;
416 | }
417 | .bird-card-wrapper .bird-hero {
418 | -moz-transition: all, 1s;
419 | -o-transition: all, 1s;
420 | -webkit-transition: all, 1s;
421 | transition: all, 1s;
422 | line-height: 1;
423 | height: 29.412vw;
424 | background: url("./../birds.png");
425 | }
426 | .bird-card-wrapper .bird-hero img {
427 | height: 29.412vw;
428 | width: auto;
429 | max-width: 100%;
430 | overflow: hidden;
431 | }
432 | .bird-card-wrapper .bird-info {
433 | -moz-transition: all, 1s;
434 | -o-transition: all, 1s;
435 | -webkit-transition: all, 1s;
436 | transition: all, 1s;
437 | background-color: #1b1b1b;
438 | background-image: url("./../birds-dark.png");
439 | z-index: 100;
440 | }
441 | .opening .bird-card-wrapper {
442 | overflow: hidden;
443 | }
444 | .opening .bird-card-wrapper .bird-hero {
445 | -moz-transform: translate(0, -100%);
446 | -o-transform: translate(0, -100%);
447 | -ms-transform: translate(0, -100%);
448 | -webkit-transform: translate(0, -100%);
449 | transform: translate(0, -100%);
450 | }
451 | .opening .bird-card-wrapper .bird-info {
452 | -moz-transform: translate(0, 100%);
453 | -o-transform: translate(0, 100%);
454 | -ms-transform: translate(0, 100%);
455 | -webkit-transform: translate(0, 100%);
456 | transform: translate(0, 100%);
457 | }
458 | .open .bird-card-wrapper {
459 | overflow-x: hidden;
460 | overflow-y: auto;
461 | }
462 | .open .bird-card-wrapper .bird-hero {
463 | -moz-transform: translate(0, 0);
464 | -o-transform: translate(0, 0);
465 | -ms-transform: translate(0, 0);
466 | -webkit-transform: translate(0, 0);
467 | transform: translate(0, 0);
468 | }
469 | .open .bird-card-wrapper .bird-info {
470 | -moz-transform: translate(0, 0);
471 | -o-transform: translate(0, 0);
472 | -ms-transform: translate(0, 0);
473 | -webkit-transform: translate(0, 0);
474 | transform: translate(0, 0);
475 | min-height: calc(100vh - 30vw);
476 | }
477 | .closing .bird-card-wrapper {
478 | overflow: hidden;
479 | }
480 | .closing .bird-card-wrapper .bird-hero {
481 | -moz-transform: translate(0, -100%);
482 | -o-transform: translate(0, -100%);
483 | -ms-transform: translate(0, -100%);
484 | -webkit-transform: translate(0, -100%);
485 | transform: translate(0, -100%);
486 | }
487 | .closing .bird-card-wrapper .bird-info {
488 | -moz-transform: translate(0, 100%);
489 | -o-transform: translate(0, 100%);
490 | -ms-transform: translate(0, 100%);
491 | -webkit-transform: translate(0, 100%);
492 | transform: translate(0, 100%);
493 | }
494 | .bird-card-wrapper h1 {
495 | margin: 0.5em 0;
496 | }
497 |
498 | .bird-list-wrapper {
499 | -webkit-transform: translate3d(0, 0, 0);
500 | /* prevents flicker */
501 | -webkit-overflow-scrolling: touch;
502 | }
503 |
504 | .bird-wrapper {
505 | cursor: pointer;
506 | color: #9d9d9d;
507 | -moz-transition: all, 0.1s, ease-out;
508 | -o-transition: all, 0.1s, ease-out;
509 | -webkit-transition: all, 0.1s, ease-out;
510 | transition: all, 0.1s, ease-out;
511 | }
512 | .bird-wrapper figure {
513 | position: relative;
514 | width: 100%;
515 | margin: 0;
516 | background: url("./../ring.svg");
517 | background-position: center;
518 | background-repeat: no-repeat;
519 | width: 100%;
520 | height: calc((100vw - 3em)*0.625);
521 | max-height: 18.125em;
522 | background-color: #3b3b3b;
523 | overflow: hidden;
524 | }
525 | .bird-wrapper figure img {
526 | -webkit-filter: grayscale(100%);
527 | filter: grayscale(100%);
528 | }
529 | .bird-wrapper h3 {
530 | margin-top: 0.5em;
531 | text-transform: uppercase;
532 | }
533 | .bird-wrapper.active {
534 | color: #ef5350;
535 | }
536 | .bird-wrapper.active img {
537 | filter: grayscale(0);
538 | -webkit-filter: grayscale(0);
539 | }
540 | @media screen and (min-width: 52em) {
541 | .bird-wrapper:hover, .bird-wrapper:focus {
542 | color: #ef5350;
543 | }
544 | .bird-wrapper:hover img, .bird-wrapper:focus img {
545 | filter: grayscale(0);
546 | -webkit-filter: grayscale(0);
547 | }
548 | }
549 |
550 | .opening .bird-wrapper, .open .bird-wrapper, .closing .bird-wrapper {
551 | opacity: 0;
552 | }
553 | .opening .active.bird-wrapper, .open .active.bird-wrapper, .closing .active.bird-wrapper {
554 | opacity: 1;
555 | }
556 | .opening .bird-wrapper .figcaption, .open .bird-wrapper .figcaption, .closing .bird-wrapper .figcaption {
557 | opacity: 0;
558 | }
559 |
560 | .bird-wrapper {
561 | overflow: hidden;
562 | -moz-transition: all, 0.5s;
563 | -o-transition: all, 0.5s;
564 | -webkit-transition: all, 0.5s;
565 | transition: all, 0.5s;
566 | }
567 | .bird-wrapper.active {
568 | -moz-transition: all, 1s;
569 | -o-transition: all, 1s;
570 | -webkit-transition: all, 1s;
571 | transition: all, 1s;
572 | -moz-transform: scale(1);
573 | -o-transform: scale(1);
574 | -ms-transform: scale(1);
575 | -webkit-transform: scale(1);
576 | transform: scale(1);
577 | }
578 | .opening .bird-wrapper.active {
579 | -moz-transform: scale(0);
580 | -o-transform: scale(0);
581 | -ms-transform: scale(0);
582 | -webkit-transform: scale(0);
583 | transform: scale(0);
584 | }
585 | .open .bird-wrapper.active {
586 | -moz-transform: scale(0);
587 | -o-transform: scale(0);
588 | -ms-transform: scale(0);
589 | -webkit-transform: scale(0);
590 | transform: scale(0);
591 | }
592 | .closing .bird-wrapper.active {
593 | -moz-transform: scale(1);
594 | -o-transform: scale(1);
595 | -ms-transform: scale(1);
596 | -webkit-transform: scale(1);
597 | transform: scale(1);
598 | }
599 |
--------------------------------------------------------------------------------
/build/styles.min.css:
--------------------------------------------------------------------------------
1 | @import url(http://fonts.googleapis.com/css?family=Marck+Script);@import url(http://fonts.googleapis.com/css?family=Viga);body,h1,h2,h3{font-family:Viga,sans-serif}body.front #main,header #start .start,header #start:disabled,header h1,header nav{display:none}.bird-wrapper,.btn-close{cursor:pointer}img.loading{opacity:0;width:100%}img.loaded{width:100%;height:auto;-moz-transition:all,1s;-o-transition:all,1s;-webkit-transition:all,1s;transition:all,1s;opacity:1}body{color:#bdc3c7;background:url(./../birds-darker.png) #212121;overflow-x:hidden}.front-loader,header{background-repeat:no-repeat}a{color:#ef5350}a a:focus,a a:hover{color:#f3817f}h1,h2,h3{font-weight:700}.sci-name{font-family:"Marck Script",cursive;font-size:1.5em}label{font-family:Viga,Helvetica,sans-serif}body.front{overflow:hidden;height:100vh}#content{min-height:100vh}.fix{overflow-y:hidden;padding-right:0}.all-birds-wrapper{max-width:30em;margin:0 auto;padding-bottom:15em}header #start:active,header #start:focus,header #start:hover{-webkit-tap-highlight-color:transparent!important;outline:0!important;box-shadow:none}header{position:relative;background-image:url(./../bg-mobile.jpg);background-attachment:fixed;background-position:center;background-size:cover;height:5em;width:5em;top:1em;transform:scale3d(.8,.8,1);-webkit-backface-visibility:hidden;backface-visibility:hidden;border-radius:50%;border:1px solid transparent;margin:0 auto;-moz-transition:all,1s;-o-transition:all,1s;-webkit-transition:all,1s;transition:all,1s}header nav{position:absolute;right:2em;top:2em}header nav .icon{font-size:2em;text-decoration:none;color:#bdc3c7}header nav .icon:focus,header nav .icon:hover{color:#bdc3c7}@media screen and (min-width:40em){.fix{padding-right:1em}header{background-image:url(./../bg.jpg);-webkit-backface-visibility:hidden;backface-visibility:hidden;background-size:cover}}header #start{width:100%;height:100%;border-radius:50%;border:1px solid transparent;color:#ef5350;font-size:1em;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;transform-style:preserve-3d}header i.home{font-size:2em}body.front header{background-image:url(./../bg-mobile.jpg);background-size:cover;height:100vh;width:100%;transform:scale3d(1,1,1);border-radius:0;top:0}body.front header #start{width:100%;height:auto}body.front header #start .start{display:inline-block;color:#bdc3c7;border:1px solid #bdc3c7}body.front header h1{display:block;margin:0;padding:25vh .5em}body.front header .tilt{display:none}@media screen and (min-width:40em){body.front header .tilt,body.front header .tilt-inner{position:absolute;top:0;left:0;width:100%;height:100%}body.front header{background-image:none}body.front header .front-loader,body.front header a,body.front header h1,body.front header nav{z-index:9999;opacity:.9}body.front header .tilt{display:block;z-index:0}body.front header .tilt-inner{background-image:url(./../bg.jpg);-webkit-backface-visibility:hidden;backface-visibility:hidden;background-size:cover}body.front header .tilt-back,body.front header .tilt-front{opacity:.2;-moz-transition:transform,.5s;-o-transition:transform,.5s;-webkit-transition:transform,.5s;transition:transform,.5s;moz-transform-origin:50%;-o-transform-origin:50%;-ms-transform-origin:50%;-webkit-transform-origin:50%;transform-origin:50%;-webkit-transition-timing-function:cubic-bezier(.6,0,.4,1);transition-timing-function:cubic-bezier(.6,0,.4,1)}body.front header .tilt-back{z-index:-15}body.front header .tilt-front{z-index:-9}body.front header .tilt-mover{opacity:.6;z-index:-10;-moz-transition:transform,.5s;-o-transition:transform,.5s;-webkit-transition:transform,.5s;transition:transform,.5s}}.bird-card-wrapper,.bird-card-wrapper .bird-hero{-moz-transition:all,1s;-o-transition:all,1s;-webkit-transition:all,1s}.front-loader{background-image:url(./../ellipsis.svg);width:60px;height:60px;margin:0 auto}.ready .front-loader{display:none}.ready.front header nav{display:block}.status{margin-bottom:.5em}.status label{font-size:.8em;width:5em;display:inline-block;padding-right:.5em;line-height:.8}@media screen and (min-width:40em){.status{text-align:right;margin-top:3.5em}}.stats,.threats{text-align:center}.status .critically-endangered{color:#e74c3c;font-size:1.2em}.status .endangered{color:#d35400;font-size:1.2em}.status .vulnerable{color:#e67e22}.status .presumed-extinct{color:#d14233}.stats{margin:3em auto}.stats .number{font-size:4em;-webkit-animation-delay:2s;-webkit-animation-duration:5s;-webkit-animation-name:color;-webkit-animation-fill-mode:forwards;-moz-animation-delay:2s;-moz-animation-duration:5s;-moz-animation-name:color;-moz-animation-fill-mode:forwards;-o-animation-delay:2s;-o-animation-duration:5s;-o-animation-name:color;-o-animation-fill-mode:forwards;animation-delay:2s;animation-duration:5s;animation-name:color;animation-fill-mode:forwards;color:#ef5350}@-webkit-keyframes color{from{color:#fff}to{color:#ef5350}}@-moz-keyframes color{from{color:#fff}to{color:#ef5350}}@-ms-keyframes color{from{color:#fff}to{color:#ef5350}}@keyframes color{from{color:#fff}to{color:#ef5350}}.btn-close:focus,.btn-close:hover{color:#ef5350}.profile a{padding-right:2em;position:relative}.profile span.icon{display:inline-block;padding-left:.3em;position:absolute;right:0;bottom:0;width:1.5em;height:1.1em;font-size:1.3em}.threats{width:100%}.threats label{margin-bottom:2em}.threats .chart{margin:0 auto;width:100%}.threats .chart canvas{max-width:100%;height:auto!important}ul.attribute a{color:#bdc3c7;font-size:.8em}ul.attribute a:focus,ul.attribute a:hover{color:#aab1b7}.closing .bird-card-wrapper,.open .bird-card-wrapper{position:fixed;top:0;left:0;width:100%;height:100%;-webkit-transform:translate3d(0,0,0);-webkit-overflow-scrolling:touch}.bird-card-wrapper{position:absolute;overflow:hidden;transition:all,1s}.bird-card-wrapper .bird-hero{transition:all,1s;line-height:1;height:29.412vw;background:url(./../birds.png)}.bird-card-wrapper .bird-hero img{height:29.412vw;width:auto;max-width:100%;overflow:hidden}.bird-card-wrapper .bird-info{-moz-transition:all,1s;-o-transition:all,1s;-webkit-transition:all,1s;transition:all,1s;background-color:#1b1b1b;background-image:url(./../birds-dark.png);z-index:100}.opening .bird-card-wrapper{overflow:hidden}.opening .bird-card-wrapper .bird-hero{-moz-transform:translate(0,-100%);-o-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}.opening .bird-card-wrapper .bird-info{-moz-transform:translate(0,100%);-o-transform:translate(0,100%);-ms-transform:translate(0,100%);-webkit-transform:translate(0,100%);transform:translate(0,100%)}.open .bird-card-wrapper{overflow-x:hidden;overflow-y:auto}.open .bird-card-wrapper .bird-hero{-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);-webkit-transform:translate(0,0);transform:translate(0,0)}.open .bird-card-wrapper .bird-info{-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);-webkit-transform:translate(0,0);transform:translate(0,0);min-height:calc(100vh - 30vw)}.closing .bird-card-wrapper{overflow:hidden}.closing .bird-card-wrapper .bird-hero{-moz-transform:translate(0,-100%);-o-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}.closing .bird-card-wrapper .bird-info{-moz-transform:translate(0,100%);-o-transform:translate(0,100%);-ms-transform:translate(0,100%);-webkit-transform:translate(0,100%);transform:translate(0,100%)}.bird-card-wrapper h1{margin:.5em 0}.bird-list-wrapper{-webkit-transform:translate3d(0,0,0);-webkit-overflow-scrolling:touch}.bird-wrapper{color:#9d9d9d;overflow:hidden;-moz-transition:all,.5s;-o-transition:all,.5s;-webkit-transition:all,.5s;transition:all,.5s}.bird-wrapper figure{position:relative;margin:0;background:url(./../ring.svg) center no-repeat #3b3b3b;width:100%;height:calc((100vw - 3em) *.625);max-height:18.125em;overflow:hidden}.bird-wrapper figure img{-webkit-filter:grayscale(100%);filter:grayscale(100%)}.bird-wrapper h3{margin-top:.5em;text-transform:uppercase}.bird-wrapper.active{color:#ef5350;-moz-transition:all,1s;-o-transition:all,1s;-webkit-transition:all,1s;transition:all,1s;-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}.bird-wrapper.active img{filter:grayscale(0);-webkit-filter:grayscale(0)}@media screen and (min-width:52em){.bird-wrapper:focus,.bird-wrapper:hover{color:#ef5350}.bird-wrapper:focus img,.bird-wrapper:hover img{filter:grayscale(0);-webkit-filter:grayscale(0)}}.closing .bird-wrapper,.open .bird-wrapper,.opening .bird-wrapper{opacity:0}.closing .active.bird-wrapper,.open .active.bird-wrapper,.opening .active.bird-wrapper{opacity:1}.closing .bird-wrapper .figcaption,.open .bird-wrapper .figcaption,.opening .bird-wrapper .figcaption{opacity:0}.open .bird-wrapper.active,.opening .bird-wrapper.active{-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);-webkit-transform:scale(0);transform:scale(0)}.closing .bird-wrapper.active{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1)}
--------------------------------------------------------------------------------
/data.json:
--------------------------------------------------------------------------------
1 | [ {
2 | "attributes" : [ {
3 | "author" : "Planettrekker",
4 | "bio" : "https://www.flickr.com/photos/planettrekker",
5 | "link" : "https://flic.kr/p/8LkeCd"
6 | } ],
7 | "commonName" : "Black-eared Miner",
8 | "commonwealthStatus" : "Critically Endangered",
9 | "id" : "mm",
10 | "nswStatus" : "Endangered",
11 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=449",
12 | "scientificName" : "Manorina melanotis",
13 | "stats" : "50",
14 | "statsFor" : "NSW (2000)",
15 | "threats" : [ 9, 5, 2, 5, 6, 0, 0, 5 ]
16 | }, {
17 | "attributes" : [ {
18 | "author" : "David Cook(CC 2.0)",
19 | "bio" : "https://flic.kr/p/4UUpTw",
20 | "link" : "https://flic.kr/p/ckjKfo"
21 | }, {
22 | "author" : "Tim Dolby",
23 | "bio" : "https://www.blogger.com/profile/05959326240924026673",
24 | "link" : "http://tim-dolby.blogspot.com.au"
25 | } ],
26 | "commonName" : "Eastern Bristlebird",
27 | "commonwealthStatus" : "Endangered",
28 | "id" : "db",
29 | "nswStatus" : "Endangered",
30 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=533",
31 | "scientificName" : "Dasyornis brachypterus",
32 | "stats" : "2000",
33 | "statsFor" : "Australia(1998)",
34 | "threats" : [ 8, 4, 6, 5, 6, 0, 5, 5 ]
35 | }, {
36 | "attributes" : [ {
37 | "author" : "Julian Robinson",
38 | "bio" : "https://www.flickr.com/photos/ozjulian",
39 | "link" : "https://flic.kr/p/8EHCTt"
40 | }, {
41 | "author" : "Tobias Hayashi",
42 | "bio" : "https://www.flickr.com/photos/callocephalon/",
43 | "link" : "https://flic.kr/p/4Hqysg"
44 | } ],
45 | "commonName" : "Swift Parrot",
46 | "commonwealthStatus" : "Endangered",
47 | "id" : "ld",
48 | "nswStatus" : "Endangered",
49 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=744",
50 | "scientificName" : "Lathamus discolor",
51 | "stats" : "2000",
52 | "statsFor" : "Australia(2000)",
53 | "threats" : [ 9, 3, 5, 5, 4, 0, 6, 5 ]
54 | }, {
55 | "attributes" : [ {
56 | "author" : "David Cook CC 2.0",
57 | "bio" : "https://www.flickr.com/photos/frankzed/",
58 | "link" : "https://flic.kr/p/ormTq2"
59 | } ],
60 | "commonName" : "Australasian Bittern",
61 | "commonwealthStatus" : "Endangered",
62 | "id" : "bp",
63 | "nswStatus" : "Endangered",
64 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=1001",
65 | "scientificName" : "Botaurus poiciloptilus",
66 | "stats" : "1000",
67 | "statsFor" : "Austrlia(2001)",
68 | "threats" : [ 8, 6, 6, 2, 1, 0, 5, 8 ]
69 | }, {
70 | "attributes" : [ {
71 | "author" : "Oliver Dodd",
72 | "bio" : "https://www.flickr.com/photos/oliverdodd/",
73 | "link" : "https://flic.kr/p/dGZLrv"
74 | }, {
75 | "author" : "Harold Moses",
76 | "bio" : "https://www.flickr.com/photos/mosesharold/",
77 | "link" : "https://flic.kr/p/kqb1ai"
78 | } ],
79 | "commonName" : "Southern Giant Petrel",
80 | "commonwealthStatus" : "Endangered",
81 | "id" : "mg",
82 | "nswStatus" : "Endangered",
83 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=1060",
84 | "scientificName" : "Macronectes giganteus",
85 | "stats" : "7090",
86 | "statsFor" : "Austrlia(2001)",
87 | "threats" : [ 5, 5, 4, 2, 0, 9, 8, 5 ]
88 | }, {
89 | "attributes" : [ {
90 | "author" : "Jim Bendon CC 2.0",
91 | "bio" : "https://www.flickr.com/photos/jim_bendon_1957",
92 | "link" : "https://flic.kr/p/uByw92"
93 | } ],
94 | "commonName" : "Star Finch (eastern), Star Finch (southern)",
95 | "commonwealthStatus" : "Endangered",
96 | "id" : "nrr",
97 | "nswStatus" : "Presumed Extinct",
98 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=26027",
99 | "scientificName" : "Neochmia ruficauda ruficauda",
100 | "stats" : "50",
101 | "statsFor" : "Austrlia",
102 | "threats" : [ 6, 5, 5, 2, 1, 0, 8, 5 ]
103 | }, {
104 | "attributes" : [ {
105 | "author" : "Todd Burrows",
106 | "bio" : "https://www.flickr.com/photos/toddburrows/",
107 | "link" : "https://flic.kr/p/dN1mWz"
108 | } ],
109 | "commonName" : "Gould's Petrel",
110 | "commonwealthStatus" : "Endangered",
111 | "id" : "pll",
112 | "nswStatus" : "Vulnerable",
113 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=26033",
114 | "scientificName" : "Pterodroma leucoptera leucoptera",
115 | "stats" : "2500",
116 | "statsFor" : "Austrlia (20090",
117 | "threats" : [ 2, 5, 4, 2, 4, 2, 7, 5 ]
118 | }, {
119 | "attributes" : [ {
120 | "author" : "Ron Knight CC2.0",
121 | "bio" : "https://www.flickr.com/photos/sussexbirder/",
122 | "link" : "https://flic.kr/p/diYjwY"
123 | }, {
124 | "author" : "Wild~Life",
125 | "bio" : "https://www.flickr.com/photos/andrew_alderson/",
126 | "link" : "https://flic.kr/p/qaiN8e"
127 | } ],
128 | "commonName" : "Mallee Emu-wren",
129 | "commonwealthStatus" : "Endangered",
130 | "id" : "sm",
131 | "nswStatus" : "Endangered",
132 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=59459",
133 | "scientificName" : "Stipiturus mallee",
134 | "stats" : "4000",
135 | "statsFor" : "Austrlia(2006)",
136 | "threats" : [ 9, 4, 5, 2, 6, 0, 4, 2 ]
137 | }, {
138 | "attributes" : [ {
139 | "author" : "snowmanradio CC2.0",
140 | "bio" : "https://commons.wikimedia.org/wiki/User:Snowmanradio",
141 | "link" : "https://upload.wikimedia.org/wikipedia/commons/b/b3/Cyclopsitta_diophthalma_-Birdworld_Kuranda%2C_Queensland%2C_Australia_-male-8a.jpg"
142 | } ],
143 | "commonName" : "Coxen's Fig-Parrot",
144 | "commonwealthStatus" : "Critically Endangered",
145 | "id" : "cdc",
146 | "nswStatus" : "Endangered",
147 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=59714",
148 | "scientificName" : "Cyclopsitta diophthalma coxeni",
149 | "stats" : "100",
150 | "statsFor" : "Austrlia(2000)",
151 | "threats" : [ 9, 2, 2, 4, 4, 0, 8, 8 ]
152 | }, {
153 | "attributes" : [ {
154 | "author" : "Aunty Marsy",
155 | "bio" : "https://www.flickr.com/photos/auntymarsy/",
156 | "link" : "https://flic.kr/p/9qfMzH"
157 | } ],
158 | "commonName" : "Black-throated Finch (southern)",
159 | "commonwealthStatus" : "Endangered",
160 | "id" : "pcc",
161 | "nswStatus" : "Endangered",
162 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=64447",
163 | "scientificName" : "Poephila cincta cincta",
164 | "stats" : "10 000",
165 | "statsFor" : "Austrlia (2011)",
166 | "threats" : [ 8, 3, 7, 1, 5, 0, 6, 2 ]
167 | }, {
168 | "attributes" : [ {
169 | "author" : "Jon Irvine",
170 | "bio" : "https://www.flickr.com/photos/calidris-photos/",
171 | "link" : "https://flic.kr/p/8UexwV"
172 | }, {
173 | "author" : "Jon Irvine",
174 | "bio" : "https://www.flickr.com/photos/calidris-photos/",
175 | "link" : "https://flic.kr/p/8UeweH"
176 | } ],
177 | "commonName" : "Chatham Albatross",
178 | "commonwealthStatus" : "Endangered",
179 | "id" : "te",
180 | "nswStatus" : "Endangered",
181 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=64457",
182 | "scientificName" : "Thalassarche eremita",
183 | "stats" : "11 000",
184 | "statsFor" : "Globally(2003)",
185 | "threats" : [ 2, 5, 8, 1, 1, 8, 8, 2 ]
186 | }, {
187 | "attributes" : [ {
188 | "author" : "Ron Knight",
189 | "bio" : "https://www.flickr.com/photos/sussexbirder",
190 | "link" : "https://flic.kr/p/diYmzg"
191 | } ],
192 | "commonName" : "Grey Grasswren (Bulloo)",
193 | "commonwealthStatus" : "Endangered",
194 | "id" : "abb",
195 | "nswStatus" : "Endangered",
196 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=67065",
197 | "scientificName" : "Amytornis barbatus barbatus",
198 | "stats" : "1600",
199 | "statsFor" : "NSW(2010)",
200 | "threats" : [ 9, 6, 8, 1, 1, 1, 1, 2 ]
201 | }, {
202 | "attributes" : [ {
203 | "author" : "Patrick_K59 CC 2.0",
204 | "bio" : "https://www.flickr.com/photos/patrick_k59",
205 | "link" : "https://flic.kr/p/dQDDLd"
206 | }, {
207 | "author" : "Patrick_K59 CC 2.0",
208 | "bio" : "https://www.flickr.com/photos/patrick_k59",
209 | "link" : "https://flic.kr/p/dUx4r5"
210 | } ],
211 | "commonName" : "Australian Painted Snipe",
212 | "commonwealthStatus" : "Endangered",
213 | "id" : "ra",
214 | "nswStatus" : "Endangered",
215 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=77037",
216 | "scientificName" : "Rostratula australis",
217 | "stats" : "5000",
218 | "statsFor" : "Austrlia(2000)",
219 | "threats" : [ 9, 5, 4, 1, 5, 1, 6, 3 ]
220 | }, {
221 | "attributes" : [ {
222 | "author" : "Vincent Legendre CC3.0",
223 | "bio" : " ",
224 | "link" : "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Albatros_d%27amsterdam_poussin.jpg/500px-Albatros_d%27amsterdam_poussin.jpg"
225 | }, {
226 | "author" : "Vincent Legendre CC3.0",
227 | "bio" : "",
228 | "link" : "https://en.wikipedia.org/wiki/File:Albatros_d%27amsterdam.jpg"
229 | } ],
230 | "commonName" : "Amsterdam Albatross",
231 | "commonwealthStatus" : "Endangered",
232 | "id" : "dea",
233 | "nswStatus" : "Endangered",
234 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=82330",
235 | "scientificName" : "Diomedea exulans amsterdamensis",
236 | "stats" : "130",
237 | "statsFor" : "the World(2008)",
238 | "threats" : [ 8, 5, 3, 5, 1, 3, 8, 4 ]
239 | }, {
240 | "attributes" : [ {
241 | "author" : "Ed Dunens CC2.0",
242 | "bio" : "https://www.flickr.com/photos/blachswan",
243 | "link" : "https://flic.kr/p/qavMD1"
244 | }, {
245 | "author" : "JJ Harrison",
246 | "bio" : "jjharrison89@facebook.com",
247 | "link" : "https://en.wikipedia.org/wiki/File:Diomedea_sanfordi_-_SE_Tasmania.jpg"
248 | } ],
249 | "commonName" : "Northern Royal Albatross",
250 | "commonwealthStatus" : "Endangered",
251 | "id" : "des",
252 | "nswStatus" : "Endangered",
253 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=82331",
254 | "scientificName" : "Diomedea epomophora sanfordi",
255 | "stats" : "20,000",
256 | "statsFor" : "the World(2012)",
257 | "threats" : [ 2, 5, 1, 1, 1, 9, 8, 4 ]
258 | }, {
259 | "attributes" : [ {
260 | "author" : "Chantal Steyn",
261 | "bio" : "https://www.flickr.com/photos/chantal_steyn/",
262 | "link" : "https://flic.kr/p/6aFUqB"
263 | }, {
264 | "author" : "JJ Harrison CC3.0",
265 | "bio" : "jjharrison89@facebook.com",
266 | "link" : "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Diomedea_exulans_in_flight_-_SE_Tasmania.jpg/440px-Diomedea_exulans_in_flight_-_SE_Tasmania.jpg"
267 | } ],
268 | "commonName" : "Tristan Albatross",
269 | "commonwealthStatus" : "Endangered",
270 | "id" : "dee",
271 | "nswStatus" : "Endangered",
272 | "profile" : "http://www.environment.gov.au/cgi-bin/sprat/public/publicspecies.pl?taxon_id=82337",
273 | "scientificName" : "Diomedea exulans exulans",
274 | "stats" : "2000",
275 | "statsFor" : "Austrlia(2001)",
276 | "threats" : [ 2, 6, 6, 1, 1, 9, 6, 2 ]
277 | } ]
278 |
--------------------------------------------------------------------------------
/ellipsis.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/favicon.ico
--------------------------------------------------------------------------------
/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/favicon.png
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var gulp = require('gulp'),
3 | gutil = require('gulp-util'),
4 | browserify = require('browserify'),
5 | source = require("vinyl-source-stream"),
6 | reactify = require('reactify'),
7 | sass = require('gulp-ruby-sass'),
8 | watch = require('gulp-watch'),
9 | watchify = require('watchify'),
10 | uglify = require('gulp-uglify'),
11 | cssmin = require('gulp-cssmin'),
12 | rename = require('gulp-rename');
13 |
14 | var path = {
15 | BUILD: './build',
16 | SASS: './src/sass/',
17 | SRC: './src/sass/styles.scss',
18 | JS: './src/js/**',
19 | MAIN: './src/js/main.js',
20 | OUT: 'main.js',
21 |
22 | };
23 |
24 |
25 | gulp.task('sass', function(){
26 | return sass(path.SRC, { style: 'expanded', loadPath: path.SASS })
27 | .pipe(gulp.dest(path.BUILD));
28 | });
29 |
30 | // use browserify to package js, transform react jsx files, and bundle all together
31 | gulp.task('js', function() {
32 | var b = browserify({ debug:true });
33 | var stream = b
34 | .add(path.MAIN)
35 | .transform({}, reactify)
36 | .on('error', function (err) {
37 | console.log(err.toString());
38 | this.emit("end");
39 | })
40 | .bundle();
41 | return stream
42 | .on('error', function (err) {
43 | console.log(err.toString());
44 | this.emit("end");
45 | })
46 | .pipe(source(path.OUT))
47 | .pipe(gulp.dest(path.BUILD));
48 | });
49 |
50 | gulp.task('compress', function() {
51 | return gulp.src('./build/*.js')
52 | .pipe(uglify())
53 | .pipe(rename({suffix: '.min'}))
54 | .pipe(gulp.dest('./build'));
55 | });
56 |
57 | gulp.task('minify', function () {
58 | gulp.src('./build/*.css')
59 | .pipe(cssmin())
60 | .pipe(rename({suffix: '.min'}))
61 | .pipe(gulp.dest('./build'));
62 | });
63 |
64 | gulp.task('watch', function(){
65 | //gulp.watch(path.JS, ['transform']);
66 | gulp.watch(path.SASS +'*.scss', ['sass']);
67 | gulp.watch(path.JS, ['js']);
68 |
69 | });
70 |
71 |
72 |
73 | gulp.task('default', ['watch']);
74 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Endangered Birds NSW
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "birds",
3 | "version": "1.0.0",
4 | "description": "##Image Attributes(in progress)",
5 | "main": "gulpfile.js",
6 | "dependencies": {
7 | "browserify": "^11.0.1",
8 | "chart.js": "^1.0.2",
9 | "gulp": "^3.9.0",
10 | "gulp-ruby-sass": "^1.0.5",
11 | "gulp-util": "^3.0.6",
12 | "gulp-watch": "^4.3.4",
13 | "react": "^0.13.3",
14 | "react-chartjs": "^0.6.0",
15 | "reactify": "^1.1.1",
16 | "vinyl-source-stream": "^1.1.0"
17 | },
18 | "devDependencies": {
19 | "browserify": "^11.0.1",
20 | "chart.js": "^1.0.2",
21 | "gulp": "^3.9.0",
22 | "gulp-cssmin": "^0.1.7",
23 | "gulp-rename": "^1.2.2",
24 | "gulp-ruby-sass": "^1.0.5",
25 | "gulp-uglify": "^1.2.0",
26 | "gulp-util": "^3.0.6",
27 | "gulp-watch": "^4.3.4",
28 | "react": "^0.13.3",
29 | "react-chartjs": "^0.6.0",
30 | "react-timer-mixin": "^0.13.2",
31 | "reactify": "^1.1.1",
32 | "vinyl-source-stream": "^1.1.0",
33 | "watchify": "^3.3.1"
34 | },
35 | "scripts": {
36 | "test": "echo \"Error: no test specified\" && exit 1"
37 | },
38 | "repository": {
39 | "type": "git",
40 | "url": "https://github.com/chloeleichen/birds.git"
41 | },
42 | "author": "",
43 | "license": "ISC",
44 | "bugs": {
45 | "url": "https://github.com/chloeleichen/birds/issues"
46 | },
47 | "homepage": "https://github.com/chloeleichen/birds"
48 | }
49 |
--------------------------------------------------------------------------------
/ring.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/js/AllBirdsWrapper.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var BirdWrapper = require('./BirdWrapper.jsx');
3 | var BirdInfo = require('./BirdInfo.jsx');
4 | var buttonStart = document.getElementById('start');
5 | var activeEl, transitionEvent, birds, birdImg;
6 |
7 | var AllBirdsWrapper = React.createClass({
8 | whichTransitionEvent: function(el){
9 | var t;
10 | var transitions = {
11 | 'transition':'transitionend',
12 | 'OTransition':'oTransitionEnd',
13 | 'MozTransition':'transitionend',
14 | 'WebkitTransition':'webkitTransitionEnd'
15 | };
16 | for(t in transitions){
17 | if( el.style[t] !== undefined ){
18 | return transitions[t];
19 | }
20 | }
21 | },
22 |
23 | getInitialState: function() {
24 | return {
25 | data: [],
26 | activeBirdId: '',
27 | wrapperClass: 'closed'
28 | };
29 | },
30 |
31 | componentWillMount: function() {
32 | //prepare data
33 | this.firebaseRef = new Firebase("https://endangered-birds-nsw.firebaseio.com/");
34 | this.firebaseRef.on("child_added", function(dataSnapshot) {
35 | this.setState({
36 | data: this.state.data.concat(dataSnapshot.val())
37 | });
38 | }.bind(this));
39 | },
40 |
41 | componentDidMount:function(){
42 | birds = this.refs.birds;
43 | this.el = React.findDOMNode(birds);
44 | },
45 |
46 | componentDidUpdate: function(){
47 | if(!body.classList.contains("ready")){
48 | birdImg = this.el.getElementsByTagName("img");
49 | //check data loaded
50 | if(birdImg.length === 16){
51 | body.classList.add("ready");
52 | buttonStart.disabled = false;
53 | }
54 | }
55 | },
56 |
57 | handleClose: function(){
58 | this.setState({
59 | wrapperClass:'closing'
60 | });
61 |
62 | activeEl = this.el.querySelector('.active');
63 | transitionEvent = this.whichTransitionEvent(activeEl);
64 | if(transitionEvent){
65 | activeEl.addEventListener(transitionEvent, this.listenerClose);
66 | }
67 | },
68 |
69 | handleClick: function (i) {
70 | this.setState({
71 | activeBirdId: i,
72 | wrapperClass:'opening',
73 | });
74 | body.classList.add("fix");
75 | activeEl = this.el.getElementsByTagName('li')[i];
76 | transitionEvent = this.whichTransitionEvent(activeEl);
77 | if(transitionEvent){
78 | activeEl.addEventListener(transitionEvent, this.listenerOpen);
79 | }
80 | },
81 |
82 | //seperate for better readability
83 | listenerOpen: function (event){
84 | if((event.propertyName === "transform") || (event.propertyName === "-ms-transform" )||(event.propertyName === "-webkit-transform")){
85 | this.setState({
86 | wrapperClass: "open"
87 | });
88 | event.target.removeEventListener(event.type, this.listenerOpen);
89 | }
90 | },
91 |
92 | listenerClose: function (event){
93 | if((event.propertyName === "transform") || (event.propertyName === "-ms-transform" )||(event.propertyName === "-webkit-transform")){
94 | body.classList.remove("fix");
95 | this.setState({
96 | wrapperClass: "closed",
97 | activeBirdId: null
98 | });
99 | event.target.removeEventListener(event.type, this.listenerClose);
100 | }
101 | },
102 |
103 | render: function(){
104 | //Get Active Bird
105 | var activeBird = this.state.data[this.state.activeBirdId];
106 | var outputInfo = null;
107 | if(activeBird){
108 | outputInfo = ;
109 | };
110 |
111 | return(
112 |
113 |
114 |
115 | {this.state.data.map(function(bird, i) {
116 | return ();
117 | }, this)}
118 |
119 |
120 |
121 | {outputInfo}
122 |
123 |
124 | );
125 | }
126 | });
127 |
128 | module.exports = AllBirdsWrapper;
129 |
--------------------------------------------------------------------------------
/src/js/BirdAttribute.jsx:
--------------------------------------------------------------------------------
1 | var BirdAttribute = React.createClass({
2 | render: function(){
3 | var atts = this.props.attribute;
4 | return (
5 | {atts.map(function(att, i) {
6 | return()
7 | })}
8 |
9 | ) ;
10 | }
11 | });
12 |
13 | var BirdAttributeItem = React.createClass({
14 | render: function() {
15 | return (Image {this.props.index} © {this.props.author} );
16 | }
17 | });
18 |
19 | module.exports = BirdAttribute;
20 |
--------------------------------------------------------------------------------
/src/js/BirdImage.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var BirdImage = React.createClass({
3 | getInitialState: function() {
4 | return {
5 | loaded: false
6 | };
7 | },
8 |
9 | componentDidMount: function(){
10 | var self = this;
11 | var img = document.createElement('img');
12 | img.onload = function(){
13 | self.setState({ loaded: true});
14 | };
15 | img.src = this.props.src;
16 | },
17 |
18 | render: function(){
19 | return ( );
20 | }
21 | });
22 |
23 | module.exports = BirdImage;
24 |
--------------------------------------------------------------------------------
/src/js/BirdInfo.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var BirdTitle = require('./BirdTitle.jsx');
3 | var BirdStats = require('./BirdStats.jsx');
4 | var BirdThreats = require('./BirdThreats.jsx');
5 | var BirdStatus = require('./BirdStatus.jsx');
6 | var BirdImage = require('./BirdImage.jsx');
7 | var BirdAttribute = require('./BirdAttribute.jsx');
8 |
9 |
10 | var BirdInfo = React.createClass({
11 | handleClose: function(){
12 | this.props.onClick(this);
13 | },
14 | render: function(){
15 | var src = "http://www.chloechen.io/images/birds/highres/" + this.props.data.id + ".jpg";
16 | return(
17 |
18 |
19 |
20 |
21 |
22 |
23 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | );
38 | }
39 | });
40 |
41 | module.exports = BirdInfo;
42 |
--------------------------------------------------------------------------------
/src/js/BirdStats.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var c = null;
3 | var BirdStats = React.createClass({
4 | render: function(){
5 | return (
6 |
Population in {this.props.statsFor}
7 |
{this.props.stats}
8 |
9 | );
10 | }
11 | });
12 |
13 | module.exports = BirdStats;
14 |
--------------------------------------------------------------------------------
/src/js/BirdStatus.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var BirdStatus = React.createClass({
3 | render: function(){
4 | function transform(str){
5 | var strNew = str.replace(/\s/g, "-").toLowerCase();
6 | return strNew;
7 | }
8 | return (
9 |
10 |
11 | National
12 | {this.props.cmStatus}
13 |
14 |
15 | NSW
16 | {this.props.nswStatus.replace(/\s/g, "-")}
17 |
18 |
19 | );
20 | }
21 | });
22 |
23 | module.exports = BirdStatus;
24 |
--------------------------------------------------------------------------------
/src/js/BirdThreats.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var Chart = require("chart.js");
3 | var RadarChart = require("react-chartjs").Radar;
4 | // To change other default settings, refer to : http://www.chartjs.org/docs/#getting-started-global-chart-configuration
5 |
6 | Chart.defaults.global.scaleOverride=true;
7 | Chart.defaults.global.scaleSteps=1;
8 | Chart.defaults.global.scaleStepWidth=10;
9 | Chart.defaults.global.scaleStartValue=0;
10 |
11 |
12 | var chartOptions ={
13 | scaleShowLine : true,
14 | angleShowLineOut : false,
15 | scaleShowLabels : false,
16 | scaleBeginAtZero : true,
17 | angleLineColor : "rgba(255,255,255,.3)",
18 | scaleLineColor: "rgba(255,255,255,.4)",
19 | angleLineWidth : 1,
20 | responsive: true,
21 | pointLabelFontFamily : "'Viga', sans-serif",
22 | pointLabelFontStyle : "normal",
23 | pointLabelFontSize : 10,
24 | pointLabelFontColor : "#bdc3c7",
25 | pointDot : true,
26 | pointDotRadius : 3,
27 | pointDotStrokeWidth : 1,
28 | pointHitDetectionRadius : 20,
29 | datasetStroke : true,
30 | datasetStrokeWidth : 2,
31 | datasetFill : true,
32 | tooltipTemplate:"<%=label%>",
33 | tooltipFillColor: "rgba(0,0,0,0.8)",
34 | tooltipFontFamily: "'Viga', sans-serif",
35 | legendTemplate : ""
36 | };
37 |
38 | var BirdThreats = React.createClass({
39 | render: function(){
40 | var chartData = {
41 | labels: ["Habitat loss", "Climate change", "Alien Species", "Disease", "Fire", "Fishing Activities", "Other Human Activities", "Others"],
42 | datasets: [
43 | {
44 | label: "Threats",
45 | fillColor: "rgba(239,83,80,0.4)",
46 | strokeColor: "#ef5350",
47 | pointColor: "rgba(220,220,220,1)",
48 | pointStrokeColor: "#fff",
49 | pointHighlightFill: "#fff",
50 | pointHighlightStroke: "rgba(220,220,220,1)",
51 | data: this.props.threats
52 | }
53 | ]
54 | };
55 | return ();
56 | }
57 | });
58 |
59 | module.exports = BirdThreats;
60 |
61 |
--------------------------------------------------------------------------------
/src/js/BirdTitle.jsx:
--------------------------------------------------------------------------------
1 | var BirdTitle = React.createClass({
2 | render: function(){
3 | return (
4 |
{this.props.sciName}
5 |
{this.props.comName}
6 |
7 | ) ;
8 | }
9 | });
10 |
11 | module.exports = BirdTitle;
12 |
--------------------------------------------------------------------------------
/src/js/BirdWrapper.jsx:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var BirdImage = require('./BirdImage.jsx');
4 |
5 | var BirdWrapper = React.createClass({
6 | handleClick: function () {
7 | this.props.onClick(this);
8 | },
9 |
10 | render: function() {
11 | var listItemClassList = this.props.active + " block bird-wrapper p1 col col-12 mt1 mb1";
12 | var src = "http://www.chloechen.io/images/birds/thumbnail/" + this.props.data.id + ".jpg";
13 | return (
14 |
15 |
16 |
17 |
18 | {this.props.data.commonName}
19 |
20 | );
21 | }
22 | });
23 |
24 | module.exports = BirdWrapper;
25 |
--------------------------------------------------------------------------------
/src/js/main.js:
--------------------------------------------------------------------------------
1 | /** @jsx React.DOM */
2 |
3 | var React = require('react');
4 |
5 | // Here we put our React instance to the global scope. Make sure you do not put it
6 | // into production and make sure that you close and open your console if the
7 | // DEV-TOOLS does not display
8 | window.React = React;
9 |
10 | var AllBirdsWrapper = require('./AllBirdsWrapper.jsx');
11 |
12 | var body = document.getElementById('body'),
13 | main = document.getElementById('main');
14 |
15 |
16 |
17 |
18 | React.render( , document.getElementById('content'));
19 |
--------------------------------------------------------------------------------
/src/sass/_card.scss:
--------------------------------------------------------------------------------
1 | %fixed{
2 | position: fixed;
3 | top: 0;
4 | left: 0;
5 | width: 100%;
6 | height: 100%;
7 | -webkit-transform: translate3d(0, 0, 0);
8 | /* prevents flicker */
9 | -webkit-overflow-scrolling: touch;
10 | }
11 |
12 | %absolute{
13 | position: absolute;
14 | overflow: hidden;
15 | }
16 |
17 |
18 | .bird-card-wrapper{
19 | @extend %absolute;
20 | @include transition(all, $delay);
21 | .bird-hero{
22 | @include transition(all, $delay);
23 | line-height: 1;
24 | height: 29.412vw;
25 | background: url("./../birds.png");
26 | img{
27 | height: 29.412vw;
28 | width: auto;
29 | max-width: 100%;
30 | overflow: hidden;
31 | }
32 | }
33 | .bird-info{
34 | @include transition(all, $delay);
35 | background-color: $darker;
36 | background-image: url("./../birds-dark.png");
37 | z-index: 100;
38 | }
39 | .opening &{
40 | overflow: hidden;
41 | .bird-hero{
42 | @include translate(0, -100%);
43 | }
44 | .bird-info{
45 | @include translate(0, 100%);
46 | }
47 | }
48 | .open &{
49 | @extend %fixed;
50 | overflow-x: hidden;
51 | overflow-y: auto;
52 |
53 |
54 | .bird-hero{
55 | @include translate(0, 0);
56 | }
57 | .bird-info{
58 | @include translate(0, 0);
59 | min-height: calc(100vh - 30vw);
60 | }
61 | }
62 | .closing &{
63 | overflow: hidden;
64 | @extend %fixed;
65 | .bird-hero{
66 | @include translate(0, -100%);
67 | }
68 | .bird-info{
69 | @include translate(0, 100%);
70 | }
71 |
72 | }
73 | .closed &{
74 | }
75 | h1{
76 | margin: 0.5em 0;
77 | }
78 | }
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/src/sass/_footer.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chloeleichen/birds/e01bf7584f1572878ecea33bb4a2281bbfa5ed6a/src/sass/_footer.scss
--------------------------------------------------------------------------------
/src/sass/_global.scss:
--------------------------------------------------------------------------------
1 | @import url(http://fonts.googleapis.com/css?family=Marck+Script);
2 | @import url(http://fonts.googleapis.com/css?family=Viga);
3 |
4 | $sm: 40em;
5 | $md: 52em;
6 | $lg: 64em;
7 | $dark: #212121;
8 | $grey: #9d9d9d;
9 | $darker: #1b1b1b;
10 | $red: #ef5350;
11 | $red-lighter: lighten($red, 10%);
12 | $light: #bdc3c7;
13 | $presumed-extinct: #d14233;
14 | $critically-endangered: #e74c3c;
15 | $endangered:#d35400;
16 | $vulnerable:#e67e22;
17 |
18 |
19 | $open:'Viga', sans-serif;
20 | $script:'Marck Script', cursive;
21 | $normal: "Viga", Helvetica, sans-serif;
22 |
23 |
24 | $delay: 1s;
25 |
26 | @mixin transition($transition...) {
27 | -moz-transition: $transition;
28 | -o-transition: $transition;
29 | -webkit-transition: $transition;
30 | transition: $transition;
31 | }
32 |
33 | // generic transform
34 | @mixin transform($transforms) {
35 | -moz-transform: $transforms;
36 | -o-transform: $transforms;
37 | -ms-transform: $transforms;
38 | -webkit-transform: $transforms;
39 | transform: $transforms;
40 | }
41 |
42 | //transform origin
43 | @mixin transform-origin ($origin) {
44 | moz-transform-origin: $origin;
45 | -o-transform-origin: $origin;
46 | -ms-transform-origin: $origin;
47 | -webkit-transform-origin: $origin;
48 | transform-origin: $origin;
49 | }
50 |
51 | // translate
52 | @mixin translate ($x, $y) {
53 | @include transform(translate($x, $y));
54 | }
55 |
56 | // rotate
57 | @mixin rotate ($deg) {
58 | @include transform(rotate(#{$deg}deg));
59 | }
60 |
61 | // scale
62 | @mixin scale($scale) {
63 | @include transform(scale($scale));
64 | }
65 | // translate
66 | @mixin translate ($x, $y) {
67 | @include transform(translate($x, $y));
68 | }
69 | // skew
70 | @mixin skew ($x, $y) {
71 | @include transform(skew(#{$x}deg, #{$y}deg));
72 | }
73 |
74 | //Vertical align
75 | @mixin vertical-align {
76 | position: relative;
77 | top: 50%;
78 | -webkit-transform: translateY(-50%);
79 | -ms-transform: translateY(-50%);
80 | transform: translateY(-50%);
81 | }
82 |
83 | // keyframes mixin
84 | @mixin keyframes($name) {
85 | @-webkit-keyframes #{$name} {
86 | @content;
87 | }
88 | @-moz-keyframes #{$name} {
89 | @content;
90 | }
91 | @-ms-keyframes #{$name} {
92 | @content;
93 | }
94 | @keyframes #{$name} {
95 | @content;
96 | }
97 | }
98 |
99 | //animation
100 | @mixin animation ($delay, $duration, $animation) {
101 | -webkit-animation-delay: $delay;
102 | -webkit-animation-duration: $duration;
103 | -webkit-animation-name: $animation;
104 | -webkit-animation-fill-mode: forwards; /* this prevents the animation from restarting! */
105 |
106 | -moz-animation-delay: $delay;
107 | -moz-animation-duration: $duration;
108 | -moz-animation-name: $animation;
109 | -moz-animation-fill-mode: forwards; /* this prevents the animation from restarting! */
110 |
111 | -o-animation-delay: $delay;
112 | -o-animation-duration: $duration;
113 | -o-animation-name: $animation;
114 | -o-animation-fill-mode: forwards; /* this prevents the animation from restarting! */
115 |
116 | animation-delay: $delay;
117 | animation-duration: $duration;
118 | animation-name: $animation;
119 | animation-fill-mode: forwards; /* this prevents the animation from restarting! */
120 | }
121 |
122 | //Img styles
123 | img.loaded{
124 | width: 100%;
125 | height: auto;
126 | @include transition(all, 1s);
127 | }
128 |
129 | img.loading{
130 | opacity: 0;
131 | width: 100%;
132 | }
133 |
134 | img.loaded{
135 | opacity: 1;
136 | }
137 |
--------------------------------------------------------------------------------
/src/sass/_header.scss:
--------------------------------------------------------------------------------
1 | %no-outline{
2 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;
3 | outline: 0 !important;
4 | outline: none !important;
5 | box-shadow: none;
6 | }
7 | header{
8 | position: relative;
9 | background-image: url("./../bg-mobile.jpg");
10 | background-repeat: no-repeat;
11 | background-attachment: fixed;
12 | background-position: center;
13 | background-size: cover;
14 | height: 5em;
15 | width: 5em;
16 | top: 1em;
17 | transform: scale3d(0.8,0.8,1);
18 | -webkit-backface-visibility: hidden;
19 | backface-visibility: hidden;
20 | border-radius: 50%;
21 | border: 1px solid rgba(0, 0, 0, 0);
22 | margin: 0 auto;
23 | h1{
24 | display: none;
25 | }
26 | nav{
27 | display: none;
28 | position: absolute;
29 | right: 2em;
30 | top: 2em;
31 | .icon{
32 | font-size: 2em;
33 | text-decoration: none;
34 | color: $light;
35 | &:hover, &:focus{
36 | color: $light;
37 | }
38 | }
39 | }
40 | @include transition(all, 1s);
41 | @media screen and (min-width: $sm){
42 | background-image: url("./../bg.jpg");
43 | -webkit-backface-visibility: hidden;
44 | backface-visibility: hidden;
45 | background-size: cover;
46 | }
47 | #start{
48 | width: 100%;
49 | height: 100%;
50 | border-radius: 50%;
51 | border: 1px solid transparent;
52 | color: $red;
53 | font-size: 1em;
54 | -webkit-transform-style: preserve-3d;
55 | -moz-transform-style: preserve-3d;
56 | transform-style: preserve-3d;
57 | .start{
58 | display: none;
59 | }
60 | &:disabled {
61 | display: none;
62 | }
63 | &:focus, &:hover, &:active{
64 | @extend %no-outline;
65 | }
66 | }
67 | i.home{
68 | font-size: 2em;
69 | }
70 | }
71 |
72 | body.front {
73 | header{
74 | background-image: url("./../bg-mobile.jpg");
75 | background-size: cover;
76 | height: 100vh;
77 | width: 100%;
78 | transform: scale3d(1,1,1);
79 | border-radius: 0;
80 | top: 0;
81 | #start{
82 | width: 100%;
83 | height: auto;
84 | .start{
85 | display: inline-block;
86 | color: $light;
87 | border: 1px solid $light;
88 | }
89 | }
90 | h1{
91 | display: block;
92 | margin: 0;
93 | padding: 25vh 0.5em;
94 | }
95 | .tilt{
96 | display: none;
97 | }
98 |
99 | @media screen and (min-width: $sm){
100 | background-image: none;
101 | h1, a, .front-loader, nav{
102 | z-index: 9999;
103 | opacity: 0.9
104 | }
105 | .tilt{
106 | display: block;
107 | position: absolute;
108 | top: 0;
109 | left: 0;
110 | width: 100%;
111 | height: 100%;
112 | z-index: 0;
113 | }
114 |
115 | .tilt-inner{
116 | position: absolute;
117 | top: 0;
118 | left: 0;
119 | width: 100%;
120 | height: 100%;
121 | background-image: url("./../bg.jpg");
122 | -webkit-backface-visibility: hidden;
123 | backface-visibility: hidden;
124 | background-size: cover;
125 | }
126 |
127 | .tilt-back, .tilt-front{
128 | opacity: 0.2;
129 | @include transition(opacity, 0.5s);
130 | @include transition(transform, 0.5s);
131 | @include transform-origin(50%);
132 | -webkit-transition-timing-function: cubic-bezier(0.6,0,0.4,1);
133 | transition-timing-function: cubic-bezier(0.6,0,0.4,1);
134 | }
135 |
136 | .tilt-back{
137 | z-index: -15;
138 | }
139 | .tilt-front{
140 | z-index: -9;
141 | }
142 | .tilt-mover{
143 | opacity: 0.6;
144 | z-index: -10;
145 | @include transition(transform, 0.5s);
146 | }
147 | }
148 | }
149 | }
150 |
151 |
152 | .front-loader{
153 | background-image: url("./../ellipsis.svg");
154 | width: 60px;
155 | height: 60px;
156 | margin: 0 auto;
157 | background-repeat: no-repeat;
158 | .ready &{
159 | display: none;
160 | }
161 | }
162 |
163 | .ready.front header{
164 | nav{
165 | display: block;
166 | }
167 | }
168 |
169 |
--------------------------------------------------------------------------------
/src/sass/_layout.scss:
--------------------------------------------------------------------------------
1 | body{
2 | background: $dark;
3 | overflow-x: hidden;
4 | background-image: url("./../birds-darker.png");
5 | &.front{
6 | overflow: hidden;
7 | height: 100vh;
8 | #main{
9 | display: none;
10 | }
11 | }
12 | }
13 |
14 | #content{
15 | min-height: 100vh;
16 | }
17 |
18 | .fix{
19 | overflow-y: hidden;
20 | padding-right: 0;
21 | @media screen and (min-width: $sm){
22 | padding-right: 1em;
23 | }
24 | }
25 |
26 | .all-birds-wrapper{
27 | max-width: 30em;
28 | margin: 0 auto;
29 | padding-bottom: 15em;
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/src/sass/_list.scss:
--------------------------------------------------------------------------------
1 | @mixin active{
2 | color: $red;
3 | img{
4 | filter: grayscale(0);
5 | -webkit-filter: grayscale(0);
6 | }
7 | }
8 |
9 | .bird-list-wrapper{
10 | -webkit-transform: translate3d(0, 0, 0);
11 | /* prevents flicker */
12 | -webkit-overflow-scrolling: touch;
13 | }
14 | //Sizes
15 | .bird-wrapper{
16 | cursor: pointer;
17 | color: $grey;
18 | @include transition(all, 0.1s, ease-out);
19 | figure{
20 | position: relative;
21 | width: 100%;
22 | margin: 0;
23 | background: url("./../ring.svg");
24 | background-position: center;
25 | background-repeat: no-repeat;
26 | width: 100%;
27 | height: calc((100vw - 3em)*0.625);
28 | max-height: 18.125em;
29 | background-color: lighten($dark, 10%);
30 | overflow: hidden;
31 | img{
32 | -webkit-filter: grayscale(100%);
33 | filter: grayscale(100%);
34 | }
35 | }
36 | h3{
37 | margin-top: 0.5em;
38 | text-transform: uppercase;
39 | }
40 | &.active{
41 | @include active;
42 | }
43 |
44 | @media screen and (min-width: $md){
45 | &:hover, &:focus{
46 | @include active;
47 | }
48 | }
49 |
50 | }
51 |
52 | %fade{
53 | opacity: 0;
54 | &.active{
55 | opacity: 1;
56 | }
57 | .figcaption{
58 | opacity: 0;
59 | }
60 | }
61 |
62 | //State
63 | .bird-wrapper{
64 | overflow: hidden;
65 | @include transition(all, 0.5s);
66 | &.active{
67 | @include transition(all, $delay);
68 | @include scale(1);
69 | }
70 |
71 | .opening &{
72 | @extend %fade;
73 | &.active{
74 | @include scale(0);
75 | //opacity: 0.1;
76 | }
77 | }
78 | .open &{
79 | @extend %fade;
80 | &.active{
81 | //opacity: 0;
82 | @include scale(0);
83 | }
84 | }
85 |
86 | .closing &{
87 | @extend %fade;
88 | &.active{
89 | //@include transition(all, 5s);
90 | @include scale(1);
91 | }
92 | }
93 | .closed &{
94 | &.active{
95 | }
96 | }
97 | }
98 |
99 |
100 |
--------------------------------------------------------------------------------
/src/sass/_structure.scss:
--------------------------------------------------------------------------------
1 | .status{
2 | margin-bottom:0.5em;
3 | label{
4 | font-size: 0.8em;
5 | width: 5em;
6 | display: inline-block;
7 | padding-right: 0.5em;
8 | line-height: 0.8;
9 | }
10 | @media screen and (min-width: $sm){
11 | text-align: right;
12 | margin-top: 3.5em;
13 |
14 | }
15 | .critically-endangered{
16 | color: $critically-endangered;
17 | font-size: 1.2em;
18 | }
19 |
20 | .endangered{
21 | color: $endangered;
22 | font-size: 1.2em;
23 | }
24 |
25 | .vulnerable{
26 | color: $vulnerable;
27 |
28 | }
29 | .presumed-extinct{
30 | color: $presumed-extinct;
31 | }
32 | }
33 |
34 |
35 | .stats{
36 | text-align: center;
37 | margin: 3em auto;
38 |
39 | .number{
40 | font-size: 4em;
41 | @include animation(2s, 5s, color);
42 | color: $red;
43 |
44 | }
45 | }
46 |
47 | @include keyframes(color){
48 | from {color: #fff;}
49 | to {color: $red;}
50 | }
51 |
52 |
53 | .btn-close{
54 | cursor: pointer;
55 | &:hover, &:focus{
56 | color: $red;
57 | }
58 | }
59 |
60 | .profile{
61 | a{
62 | padding-right: 2em;
63 | position: relative;
64 | }
65 | span.icon{
66 | display: inline-block;
67 | padding-left: 0.3em;
68 | position: absolute;
69 | right: 0;
70 | bottom: 0;
71 | width: 1.5em;
72 | height: 1.1em;
73 | font-size: 1.3em;
74 | }
75 | }
76 | .threats{
77 | text-align: center;
78 | width: 100%;
79 | label{
80 | margin-bottom: 2em;
81 | }
82 | .chart{
83 | margin: 0 auto;
84 | width: 100%;
85 |
86 | canvas{
87 | max-width: 100%;
88 | height: auto !important;
89 | }
90 | }
91 | }
92 |
93 | ul.attribute{
94 | a{
95 | color: $light;
96 | font-size: 0.8em;
97 | &:hover, &:focus{
98 | color: darken($light, 7%);
99 |
100 | }
101 | span{
102 |
103 | }
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/src/sass/_type.scss:
--------------------------------------------------------------------------------
1 | body{
2 | color: $light;
3 | font-family: $open;
4 | }
5 | a{
6 | color: $red;
7 | a:hover, a:focus{
8 | color: $red-lighter;
9 | }
10 | }
11 |
12 | h1, h2, h3{
13 | font-family: $open;
14 | font-weight: 700;
15 | }
16 |
17 | .sci-name{
18 | font-family: $script;
19 | font-size: 1.5em;
20 | }
21 |
22 | label{
23 | font-family: $normal;
24 | }
25 |
--------------------------------------------------------------------------------
/src/sass/styles.scss:
--------------------------------------------------------------------------------
1 | @import "global";
2 | @import "type";
3 | @import "layout";
4 | @import "header";
5 | @import "footer";
6 | @import "structure";
7 | @import "card";
8 | @import "list";
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/threat.txt:
--------------------------------------------------------------------------------
1 | 0 Habitat loss
2 | 1 Climate change
3 | 2 Alien Species
4 | 3 Disease
5 | 4 Fire
6 | 5 Fishing activities
7 | 6 Other human
8 | 7 Others
9 |
10 | Other human activities:
11 | Hunting, trapping, egg collection, litter ingestion, road accident, water pollution collision with window, etc
12 |
--------------------------------------------------------------------------------