├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── images
├── bad.svg
├── good.svg
├── na.svg
└── partially.svg
├── index.html
├── scripts
├── moment-2.13.0.min.js
└── scripts.js
└── styles
└── styles.css
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## May 19th 2016
4 |
5 | * Add Spanish sites.
6 | * Add gazzetta.it and abc.net.au/news to bump up to 100 sites. 🎉
7 |
8 | ## May 18th 2016
9 |
10 | * Add Swiss sites.
11 |
12 | ## May 17th 2016
13 |
14 | * Update chip.de metrics.
15 | * Add skynews.com metrics.
16 |
17 | ## May 6th 2016
18 |
19 | * Add Australian sites.
20 | * “partially” for W3C validation errors now is for “less than 50 errors”. It’s less strict now.
21 | * Add 20minutes.fr.
22 | * Add total websites count at the end of the table.
23 | * Add Dutch sites.
24 |
25 | ## May 4th 2016
26 |
27 | * Add Italian sites.
28 | * Add Austrian sites.
29 | * Show values of metrics like page weight or validation errors.
30 | * Add average calculation on the bottom of certain metrics.
31 | * Add heute.de and tagesschau.de.
32 |
33 | ## May 3rd 2016
34 |
35 | * Fix https://github.com/isellsoap/front-end-side-of-news/issues/19 where I accidently tested the wrong NBC site.
36 | * Fix https://github.com/isellsoap/front-end-side-of-news/issues/20 where I accidently tested the wrong ABC site.
37 |
38 | ## May 2nd 2016
39 |
40 | * Use “good” instead of “very good” for SSL encryption metric.
41 | * Use fixed categories for page weight metrics. This results in a much clearer result. Before that a “good”/“bad” measure wouldn’t have been per see “good”/“bad”, but only “good”/“bad” in comparison to all other websites.
42 | * Remove [chroma.js](http://gka.github.io/chroma.js/) dependency (not longer needed).
43 | * Add french sites.
44 |
45 | ## May 1st 2016
46 |
47 | * Added UK sites.
48 |
49 | ## April 29th 2016
50 |
51 | * New metric: usage of security headers (as defined by [securityheaders.io](https://securityheaders.io/)).
52 | * Tiny styling fixes for main data table.
53 |
54 | ## April 28th 2016
55 |
56 | * Initial release ([blog post](https://francescoschwarz.de/en/blog/the-front-end-side-of-news/)).
57 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Francesco Schwarz
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # The front-end side of news
2 |
3 | Front-end metrics from big news sites around the world. https://isellsoap.github.io/front-end-side-of-news/
4 |
5 | ## Motivation
6 |
7 | On March 30th 2015 [I tweeted an image](https://twitter.com/isellsoap/status/582456573139804160) of a weekend project I did showing a chart of HTTP requests and page weights of big news sites from various countries. I got a lot of feedback from that tweet (at least for my standards). [Anselm Hannemann asked](https://twitter.com/helloanselm/status/582457282111356928) if I would put up a HTML version of the image, so this is it.
8 |
9 | I think especially big news sites have a certain responsibility of delivering a certain quality of front-end code to their customers because they normally have **massive reach**, **massive traffic**, **loyal readers** and are confronted with a **heterogenous pallet of end-user devices** they have to serve. Last but not least they offer **information people want to consume** if they visit their site, so the information should be served as **fast** and **accessible** as possible.
10 |
11 | ## Contributing
12 |
13 | Do you miss any metrics? Did you spot an error? Please be sure to check out [the list of existing issues](https://github.com/isellsoap/front-end-side-of-news/issues) before creating [one of your own](https://github.com/isellsoap/front-end-side-of-news/issues/new). You are most welcome to do so, I appreciate every feedback, criticism and help.
14 |
15 | ## Credits and links
16 |
17 | * [blog post introducing this repository](https://francescoschwarz.com/blog/the-front-end-side-of-news/)
18 | * [Website](https://isellsoap.github.io/front-end-side-of-news/)
19 | * [CHANGELOG.md](https://github.com/isellsoap/front-end-side-of-news/blob/gh-pages/CHANGELOG.md) detailing what changed over time
20 | * created by [Francesco Schwarz](https://francescoschwarz.com/) ([@isellsoap](https://twitter.com/isellsoap))
21 | * type face: [Fira Sans](https://www.google.com/fonts/specimen/Fira+Sans)
22 | * relative time calculation: [moment.js](https://github.com/moment/moment/)
23 | * accessible color concept: [Say Goodbye to Red-Green Color Scales](http://vis4.net/blog/posts/goodbye-redgreen-scales/)
24 | * information about page weight of websites: [Measuring page weight](https://mobiforge.com/design-development/measuring-page-weight)
25 |
26 | ## License
27 |
28 | This repository is published under the [MIT License](https://opensource.org/licenses/mit-license).
29 |
--------------------------------------------------------------------------------
/images/bad.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/images/good.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/images/na.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/images/partially.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | The front-end side of news
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | The front-end side of news
16 | Front-end metrics from big news sites around the world.
17 |
18 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | Website
32 | Country
33 | Last time checked
34 | Transferred page weight
35 | W3C validation
36 | Security
37 | Usage of heading elements
38 | Markup and implementation of site logo
39 | Usability without JavaScript
40 |
41 |
42 | not cached in MB
43 | cached in KB
44 | Markup errors
45 | CSS errors
46 | SSL encryption
47 | Usage of security headers
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | Ø
56 | Ø
57 | Ø
58 | Ø
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | abc.net.au/news
69 | Australia
70 | May 19th 2016
71 | 0.58
72 | 45
73 | 10
74 | 43
75 |
76 | F
77 |
78 |
79 |
80 |
81 |
82 | afr.com
83 | Australia
84 | May 6th 2016
85 | 1.3
86 | 316
87 | 28
88 | 201
89 |
90 | F
91 |
92 |
93 |
94 |
95 |
96 | dailytelegraph.com.au
97 | Australia
98 | May 6th 2016
99 | 3.6
100 | 256
101 | 133
102 | 388
103 |
104 | F
105 |
106 |
107 |
108 |
109 |
110 | smh.com.au
111 | Australia
112 | May 6th 2016
113 | 2.4
114 | 112
115 | 150
116 | 254
117 |
118 | F
119 |
120 |
121 |
122 |
123 |
124 | theaustralian.com.au
125 | Australia
126 | May 6th 2016
127 | 1.9
128 | 224
129 | 196
130 | 47
131 |
132 | F
133 |
134 |
135 |
136 |
137 |
138 | derstandard.at
139 | Austria
140 | May 4th 2016
141 | 1.7
142 | 98
143 | 127
144 | 34
145 |
146 | F
147 |
148 |
149 |
150 |
151 |
152 | diepresse.com
153 | Austria
154 | May 4th 2016
155 | 2.1
156 | 135
157 | 77
158 | 4
159 |
160 | F
161 |
162 |
163 |
164 |
165 |
166 | heute.at
167 | Austria
168 | May 4th 2016
169 | 6.9
170 | 120
171 | 271
172 | 51
173 |
174 | F
175 |
176 |
177 |
178 |
179 |
180 | kleinezeitung.at
181 | Austria
182 | May 4th 2016
183 | 1.8
184 | 176
185 | 565
186 | 137
187 |
188 | F
189 |
190 |
191 |
192 |
193 |
194 | krone.at
195 | Austria
196 | May 4th 2016
197 | 2.8
198 | 339
199 | 10
200 | 20
201 |
202 | F
203 |
204 |
205 |
206 |
207 |
208 | kurier.at
209 | Austria
210 | May 4th 2016
211 | 1.8
212 | 52
213 | 90
214 | 67
215 |
216 | F
217 |
218 |
219 |
220 |
221 |
222 | nachrichten.at
223 | Austria
224 | May 4th 2016
225 | 1.3
226 | 59
227 | 461
228 | 17
229 |
230 | F
231 |
232 |
233 |
234 |
235 |
236 | oe24.at
237 | Austria
238 | May 4th 2016
239 | 7.3
240 | 632
241 | 68
242 | 41
243 |
244 | F
245 |
246 |
247 |
248 |
249 |
250 | orf.at
251 | Austria
252 | May 4th 2016
253 | 0.44
254 | 2
255 | 40
256 | 13
257 |
258 | F
259 |
260 |
261 |
262 |
263 |
264 | tt.com
265 | Austria
266 | May 4th 2016
267 | 3.5
268 | 420
269 | 135
270 | 77
271 |
272 | F
273 |
274 |
275 |
276 |
277 |
278 | 20minutes.fr
279 | France
280 | May 6nd 2016
281 | 1.3
282 | 151
283 | 4
284 | 90
285 |
286 | F
287 |
288 |
289 |
290 |
291 |
292 | la-croix.com
293 | France
294 | May 2nd 2016
295 | 3.0
296 | 77
297 | 9
298 | 179
299 |
300 | F
301 |
302 |
303 |
304 |
305 |
306 | lequipe.fr
307 | France
308 | May 2nd 2016
309 | 1.4
310 | 129
311 | 556
312 | 79
313 |
314 | F
315 |
316 |
317 |
318 |
319 |
320 | lexpress.fr
321 | France
322 | May 2nd 2016
323 | 2.5
324 | 914
325 | 160
326 | 314
327 |
328 | F
329 |
330 |
331 |
332 |
333 |
334 | lefigaro.fr
335 | France
336 | May 2nd 2016
337 | 1.5
338 | 225
339 | 92
340 | 873
341 |
342 | F
343 |
344 |
345 |
346 |
347 |
348 | lemonde.fr
349 | France
350 | May 2nd 2016
351 | 2.3
352 | 147
353 | 151
354 | 41
355 |
356 | F
357 |
358 |
359 |
360 |
361 |
362 | lesechos.fr
363 | France
364 | May 2nd 2016
365 | 3.1
366 | 120
367 | 8
368 | 32
369 |
370 | F
371 |
372 |
373 |
374 |
375 |
376 | liberation.fr
377 | France
378 | May 2nd 2016
379 | 2.7
380 | 41
381 | 20
382 | 101
383 |
384 | F
385 |
386 |
387 |
388 |
389 |
390 | bild.de
391 | Germany
392 | May 19th 2016
393 | 3.4*
394 | 70*
395 | 3
396 | 35
397 |
398 | F
399 |
400 |
401 |
402 |
403 |
404 | chip.de
405 | Germany
406 | May 17th 2016
407 | 0.96
408 | 39
409 | 47
410 | 94
411 |
412 | F
413 |
414 |
415 |
416 |
417 |
418 | faz.net
419 | Germany
420 | April 28th 2016
421 | 2.4
422 | 40
423 | 545
424 | 32
425 |
426 | F
427 |
428 |
429 |
430 |
431 |
432 | focus.de
433 | Germany
434 | April 28th 2016
435 | 3.3
436 | 78
437 | 615
438 | 15
439 |
440 | F
441 |
442 |
443 |
444 |
445 |
446 | golem.de
447 | Germany
448 | April 28th 2016
449 | 1.0
450 | 66
451 | 121
452 | 28
453 |
454 | F
455 |
456 |
457 |
458 |
459 |
460 | handelsblatt.com
461 | Germany
462 | April 28th 2016
463 | 3.7
464 | 115
465 | 116
466 | 146
467 |
468 | F
469 |
470 |
471 |
472 |
473 |
474 | heise.de
475 | Germany
476 | April 28th 2016
477 | 2.6
478 | 30
479 | 46
480 | 59
481 |
482 | F
483 |
484 |
485 |
486 |
487 |
488 | heute.de
489 | Germany
490 | May 4th 2016
491 | 2.6
492 | 47
493 | 316
494 | 141
495 |
496 | F
497 |
498 |
499 |
500 |
501 |
502 | morgenweb.de
503 | Germany
504 | May 4th 2016
505 | 4.5
506 | 324
507 | 20
508 | 101
509 |
510 | F
511 |
512 |
513 |
514 |
515 |
516 | pnp.de
517 | Germany
518 | April 28th 2016
519 | 1.9
520 | 93
521 | 226
522 | 21
523 |
524 | F
525 |
526 |
527 |
528 |
529 |
530 | rp-online.de
531 | Germany
532 | April 28th 2016
533 | 1.5
534 | 15
535 | 115
536 | 40
537 |
538 | F
539 |
540 |
541 |
542 |
543 |
544 | spiegel.de
545 | Germany
546 | April 28th 2016
547 | 1.4
548 | 58
549 | 220
550 | 217
551 |
552 | F
553 |
554 |
555 |
556 |
557 |
558 | stern.de
559 | Germany
560 | April 28th 2016
561 | 4.6
562 | 82
563 | 11
564 | 181
565 |
566 | F
567 |
568 |
569 |
570 |
571 |
572 | sueddeutsche.de
573 | Germany
574 | April 28th 2016
575 | 2.4
576 | 62
577 | 251
578 | 42
579 |
580 | F
581 |
582 |
583 |
584 |
585 |
586 | t3n.de
587 | Germany
588 | April 28th 2016
589 | 1.5
590 | 72
591 | 130
592 | 106
593 |
594 | F
595 |
596 |
597 |
598 |
599 |
600 | tagesschau.de
601 | Germany
602 | May 4th 2016
603 | 1.7
604 | 45
605 | 8
606 | 59
607 |
608 | F
609 |
610 |
611 |
612 |
613 |
614 | welt.de
615 | Germany
616 | September 14th 2016
617 | 0.78
618 | 4
619 | 27
620 | 30
621 |
622 | F
623 |
624 |
625 |
626 |
627 |
628 | wiwo.de
629 | Germany
630 | April 28th 2016
631 | 4.9
632 | 184
633 | 111
634 | 91
635 |
636 | F
637 |
638 |
639 |
640 |
641 |
642 | zeit.de
643 | Germany
644 | April 28th 2016
645 | 1.4
646 | 136
647 | 7
648 | 89
649 |
650 | F
651 |
652 |
653 |
654 |
655 |
656 | corriere.it
657 | Italy
658 | May 4th 2016
659 | 1.7
660 | 107
661 | 71
662 | 194
663 |
664 | F
665 |
666 |
667 |
668 |
669 |
670 | gazzetta.it
671 | Italy
672 | May 19th 2016
673 | 2.1
674 | 117
675 | 163
676 | 2354
677 |
678 | F
679 |
680 |
681 |
682 |
683 |
684 | ilfattoquotidiano.it
685 | Italy
686 | May 4th 2016
687 | 3.0
688 | 83
689 | 513
690 | 19
691 |
692 | F
693 |
694 |
695 |
696 |
697 |
698 | ilgiornale.it
699 | Italy
700 | May 4th 2016
701 | 2.2
702 | 21
703 | 160
704 | 2
705 |
706 | F
707 |
708 |
709 |
710 |
711 |
712 | ilmattino.it
713 | Italy
714 | May 4th 2016
715 | 4.5
716 | 78
717 | 757
718 | 73
719 |
720 | F
721 |
722 |
723 |
724 |
725 |
726 | lastampa.it
727 | Italy
728 | May 4th 2016
729 | 1.4
730 | 78
731 | 305
732 | 106
733 |
734 | F
735 |
736 |
737 |
738 |
739 |
740 | repubblica.it
741 | Italy
742 | May 4th 2016
743 | 1.4
744 | 144
745 | 104
746 | 254
747 |
748 | F
749 |
750 |
751 |
752 |
753 |
754 | ad.nl
755 | Netherlands
756 | May 6th 2016
757 | 3.4
758 | 42
759 | 1
760 | 1
761 |
762 | F
763 |
764 |
765 |
766 |
767 |
768 | nos.nl
769 | Netherlands
770 | May 6th 2016
771 | 3.3
772 | 22
773 | 2
774 | 15
775 |
776 | F
777 |
778 |
779 |
780 |
781 |
782 | nrc.nl
783 | Netherlands
784 | May 6th 2016
785 | 0.71
786 | 34
787 | 162
788 | 555
789 |
790 | F
791 |
792 |
793 |
794 |
795 |
796 | nu.nl
797 | Netherlands
798 | May 6th 2016
799 | 1.1
800 | 69
801 | 27
802 | 290
803 |
804 | F
805 |
806 |
807 |
808 |
809 |
810 | telegraaf.nl
811 | Netherlands
812 | May 6th 2016
813 | 2.2
814 | 209
815 | 247
816 | 147
817 |
818 | F
819 |
820 |
821 |
822 |
823 |
824 | volkskrant.nl
825 | Netherlands
826 | May 6th 2016
827 | 1.5
828 | 42
829 | 56
830 | 73
831 |
832 | F
833 |
834 |
835 |
836 |
837 |
838 | bbc.com
839 | UK
840 | May 1st 2016
841 | 1.5
842 | 4
843 | 9
844 | 216
845 |
846 | F
847 |
848 |
849 |
850 |
851 |
852 | dailymail.co.uk
853 | UK
854 | May 1st 2016
855 | 8.0
856 | 74
857 | 274
858 | 369
859 |
860 | F
861 |
862 |
863 |
864 |
865 |
866 | ft.com
867 | UK
868 | May 1st 2016
869 | 3.2
870 | 139
871 | 6
872 | 27
873 |
874 | E
875 |
876 |
877 |
878 |
879 |
880 | independent.co.uk
881 | UK
882 | May 1st 2016
883 | 2.0
884 | 75
885 | 126
886 | 4
887 |
888 | E
889 |
890 |
891 |
892 |
893 |
894 | mirror.co.uk
895 | UK
896 | May 1st 2016
897 | 2.3
898 | 98
899 | 11
900 | 272
901 |
902 | F
903 |
904 |
905 |
906 |
907 |
908 | skynews.com
909 | UK
910 | May 17th 2016
911 | 1.0
912 | 37
913 | 48
914 | 1
915 |
916 | F
917 |
918 |
919 |
920 |
921 |
922 | telegraph.co.uk
923 | UK
924 | May 1st 2016
925 | 5.1
926 | 133
927 | 185
928 | 290
929 |
930 | E
931 |
932 |
933 |
934 |
935 |
936 | theguardian.com
937 | UK
938 | May 1st 2016
939 | 1.3
940 | 19
941 | 85
942 | 643
943 |
944 | B
945 |
946 |
947 |
948 |
949 |
950 | thesun.co.uk
951 | UK
952 | May 1st 2016
953 | 0.96
954 | 68
955 | 3
956 | 130
957 |
958 | F
959 |
960 |
961 |
962 |
963 |
964 | abcnews.com
965 | USA
966 | May 3rd 2016
967 | 2.1
968 | 117
969 | 165
970 | 210
971 |
972 | F
973 |
974 |
975 |
976 |
977 |
978 | arstechnica.com
979 | USA
980 | April 26th 2016
981 | 1.3
982 | 58
983 | 218
984 | 48
985 |
986 | F
987 |
988 |
989 |
990 |
991 |
992 | bostonglobe.com
993 | USA
994 | April 26th 2016
995 | 2.5
996 | 214
997 | 9
998 | 391
999 |
1000 | F
1001 |
1002 |
1003 |
1004 |
1005 |
1006 | cnet.com
1007 | USA
1008 | April 26th 2016
1009 | 3.1
1010 | 33
1011 | 146
1012 | 124
1013 |
1014 | F
1015 |
1016 |
1017 |
1018 |
1019 |
1020 | cnn.com
1021 | USA
1022 | April 26th 2016
1023 | 3.5
1024 | 965
1025 | 33
1026 | 110
1027 |
1028 | C
1029 |
1030 |
1031 |
1032 |
1033 |
1034 | espn.com
1035 | USA
1036 | April 26th 2016
1037 | 2.3
1038 | 48
1039 | 409
1040 | 267
1041 |
1042 | F
1043 |
1044 |
1045 |
1046 |
1047 |
1048 | foxnews.com
1049 | USA
1050 | April 26th 2016
1051 | 1.7
1052 | 159
1053 | 26
1054 | 44
1055 |
1056 | F
1057 |
1058 |
1059 |
1060 |
1061 |
1062 | gizmodo.com
1063 | USA
1064 | April 26th 2016
1065 | 3.5
1066 | 74
1067 | 253
1068 | 67
1069 |
1070 | D
1071 |
1072 |
1073 |
1074 |
1075 |
1076 | huffingtonpost.com
1077 | USA
1078 | April 26th 2016
1079 | 2.7
1080 | 95
1081 | 240
1082 | 332
1083 |
1084 | F
1085 |
1086 |
1087 |
1088 |
1089 |
1090 | latimes.com
1091 | USA
1092 | April 26th 2016
1093 | 0.62
1094 | 26
1095 | 215
1096 | 83
1097 |
1098 | F
1099 |
1100 |
1101 |
1102 |
1103 |
1104 | nbcnews.com
1105 | USA
1106 | May 3rd 2016
1107 | 1.8
1108 | 96
1109 | 10
1110 | 61
1111 |
1112 | F
1113 |
1114 |
1115 |
1116 |
1117 |
1118 | nytimes.com
1119 | USA
1120 | April 26th 2016
1121 | 2.0
1122 | 138
1123 | 26
1124 | 47
1125 |
1126 | E
1127 |
1128 |
1129 |
1130 |
1131 |
1132 | recode.net
1133 | USA
1134 | April 26th 2016
1135 | 1.7
1136 | 100
1137 | 26
1138 | 176
1139 |
1140 | F
1141 |
1142 |
1143 |
1144 |
1145 |
1146 | techcrunch.com
1147 | USA
1148 | April 26th 2016
1149 | 1.5
1150 | 170
1151 | 96
1152 | 61
1153 |
1154 | F
1155 |
1156 |
1157 |
1158 |
1159 |
1160 | time.com
1161 | USA
1162 | April 26th 2016
1163 | 3.1
1164 | 85
1165 | 66
1166 | 69
1167 |
1168 | F
1169 |
1170 |
1171 |
1172 |
1173 |
1174 | usatoday.com
1175 | USA
1176 | April 26th 2016
1177 | 2.7
1178 | 24
1179 | 88
1180 | 245
1181 |
1182 | F
1183 |
1184 |
1185 |
1186 |
1187 |
1188 | vox.com
1189 | USA
1190 | April 26th 2016
1191 | 1.9
1192 | 224
1193 | 9
1194 | 166
1195 |
1196 | B
1197 |
1198 |
1199 |
1200 |
1201 |
1202 | washingtonpost.com
1203 | USA
1204 | April 26th 2016
1205 | 1.8
1206 | 50
1207 | 170
1208 | 115
1209 |
1210 | E
1211 |
1212 |
1213 |
1214 |
1215 |
1216 | wsj.com
1217 | USA
1218 | April 26th 2016
1219 | 2.6
1220 | 199
1221 | 266
1222 | 175
1223 |
1224 | F
1225 |
1226 |
1227 |
1228 |
1229 |
1230 | abc.es
1231 | Spain
1232 | May 19th 2016
1233 | 1
1234 | 690
1235 | 12
1236 | 48
1237 |
1238 | F
1239 |
1240 |
1241 |
1242 |
1243 |
1244 | elmundo.es
1245 | Spain
1246 | May 19th 2016
1247 | 2.6
1248 | 66
1249 | 35
1250 | 95
1251 |
1252 | F
1253 |
1254 |
1255 |
1256 |
1257 |
1258 | elpais.com
1259 | Spain
1260 | May 19th 2016
1261 | 2
1262 | 73
1263 | 47
1264 | 31
1265 |
1266 | F
1267 |
1268 |
1269 |
1270 |
1271 |
1272 | elperiodico.com
1273 | Spain
1274 | May 19th 2016
1275 | 5.6
1276 | 64
1277 | 189
1278 | 73
1279 |
1280 | F
1281 |
1282 |
1283 |
1284 |
1285 |
1286 | larazon.es
1287 | Spain
1288 | May 19th 2016
1289 | 2.3
1290 | 110
1291 | 762
1292 | 253
1293 |
1294 | F
1295 |
1296 |
1297 |
1298 |
1299 |
1300 | lavanguardia.com
1301 | Spain
1302 | May 19th 2016
1303 | 1.9
1304 | 62
1305 | 22
1306 | 221
1307 |
1308 | F
1309 |
1310 |
1311 |
1312 |
1313 |
1314 | publico.es
1315 | Spain
1316 | May 19th 2016
1317 | 7.3
1318 | 58
1319 | 6
1320 | 89
1321 |
1322 | F
1323 |
1324 |
1325 |
1326 |
1327 |
1328 | 20min.ch
1329 | Switzerland
1330 | May 18th 2016
1331 | 4.4
1332 | 200
1333 | 222
1334 | 28
1335 |
1336 | F
1337 |
1338 |
1339 |
1340 |
1341 |
1342 | 24heures.ch
1343 | Switzerland
1344 | May 18th 2016
1345 | 6.6
1346 | 300
1347 | 401
1348 | 163
1349 |
1350 | F
1351 |
1352 |
1353 |
1354 |
1355 |
1356 | bernerzeitung.ch
1357 | Switzerland
1358 | May 18th 2016
1359 | 6.0
1360 | 330
1361 | 354
1362 | 180
1363 |
1364 | F
1365 |
1366 |
1367 |
1368 |
1369 |
1370 | blick.ch
1371 | Switzerland
1372 | May 18th 2016
1373 | 32.0
1374 | 3
1375 | 9
1376 | 303
1377 |
1378 | F
1379 |
1380 |
1381 |
1382 |
1383 |
1384 | blickamabend.ch
1385 | Switzerland
1386 | May 18th 2016
1387 | 2.7
1388 | 2
1389 | 14
1390 | 366
1391 |
1392 | F
1393 |
1394 |
1395 |
1396 |
1397 |
1398 | nzz.ch
1399 | Switzerland
1400 | May 18th 2016
1401 | 0.70
1402 | 105
1403 | 165
1404 | 37
1405 |
1406 | E
1407 |
1408 |
1409 |
1410 |
1411 |
1412 | srf.ch
1413 | Switzerland
1414 | May 18th 2016
1415 | 1.5
1416 | 1
1417 | 21
1418 | 417
1419 |
1420 | F
1421 |
1422 |
1423 |
1424 |
1425 |
1426 | tagblatt.ch
1427 | Switzerland
1428 | May 18th 2016
1429 | 2.2
1430 | 63
1431 | 135
1432 | 123
1433 |
1434 | F
1435 |
1436 |
1437 |
1438 |
1439 |
1440 | tagesanzeiger.ch
1441 | Switzerland
1442 | May 18th 2016
1443 | 7.6
1444 | 395
1445 | 458
1446 | 161
1447 |
1448 | F
1449 |
1450 |
1451 |
1452 |
1453 |
1454 | watson.ch
1455 | Switzerland
1456 | May 18th 2016
1457 | 2.3
1458 | 66
1459 | 157
1460 | 48
1461 |
1462 | F
1463 |
1464 |
1465 |
1466 |
1467 |
1468 |
1469 |
1470 |
1471 | Legend and metrics
1472 |
1473 |
1474 | Transferred page weight
1475 | Metrics for not cached measurements:
1476 |
1477 | Legend
1478 |
1479 |
1480 |
1481 | less than 1 MB
1482 |
1483 |
1484 |
1485 |
1486 |
1487 | between 1 and 1.49 MB
1488 |
1489 |
1490 |
1491 |
1492 |
1493 | between 1.5 and 1.99 MB
1494 |
1495 |
1496 |
1497 |
1498 |
1499 | between 2 and 2.99 MB
1500 |
1501 |
1502 |
1503 |
1504 |
1505 | 3 MB and more
1506 |
1507 |
1508 |
1509 | Metrics for cached measurements:
1510 |
1511 | Legend
1512 |
1513 |
1514 |
1515 | less than 50 KB
1516 |
1517 |
1518 |
1519 |
1520 |
1521 | between 50 and 99 KB
1522 |
1523 |
1524 |
1525 |
1526 |
1527 | between 100 and 199 KB
1528 |
1529 |
1530 |
1531 |
1532 |
1533 | between 200 and 299 KB
1534 |
1535 |
1536 |
1537 |
1538 |
1539 | 300 KB and more
1540 |
1541 |
1542 |
1543 | “Transferred page weight” measures the total content transferred to the browser, which may be reduced due to compression. Measured on the home page with a 15 inch MacBook and
1544 |
1545 | latest Chrome Canary in fullscreen mode
1546 | Chrome DevTools network tab
1547 | ad-blocking enabled (for more comparable results)
1548 | without scrolling (so things like lazy loading of images have the appropriate effect)
1549 |
1550 | The not cached metric was measured as follows:
1551 |
1552 | open Chrome DevTools and activate “Disable cache”
1553 | navigate to website
1554 | wait for at least 10 second after full loaded page before noting the result
1555 |
1556 | The cached metric was measured as follows:
1557 |
1558 | open Chrome DevTools and deactivate “Disable cache”
1559 | navigate to website
1560 | wait for at least 10 second after full loaded page
1561 | retype the URL of the website in the address bar and hit enter
1562 | wait for at least 10 second after full loaded page before noting the result
1563 |
1564 | * = with ads enabled
1565 |
1566 |
1567 | W3C markup and CSS validation
1568 | Total amount of W3C markup and CSS validation errors using Markup Validation Service and CSS Validation Service .
1569 | Please note: As pointed out in this GitHub issue a valid website isn’t per se a well-crafted website. But I do think that developers should try to keep validation errors to an absolute minimum.
1570 |
1571 | Legend
1572 |
1573 |
1574 | no errors
1575 |
1576 |
1577 |
1578 | less than 50 errors
1579 |
1580 |
1581 |
1582 | between 50 and 100 errors
1583 |
1584 |
1585 |
1586 | more than 100 errors
1587 |
1588 |
1589 |
1590 |
1591 | SSL encryption
1592 |
1593 | Legend
1594 |
1595 |
1596 |
1597 | fully encrypted, no mixed unsecure content, automatic redirect to SSL version of page URL
1598 |
1599 |
1600 |
1601 |
1602 |
1603 | encryption is theoretically available, mixed unsecure content, no automatic redirect to SSL version of page URL
1604 |
1605 |
1606 |
1607 |
1608 |
1609 | no encryption whatsoever
1610 |
1611 |
1612 |
1613 |
1614 |
1615 | Usage of security headers
1616 | Grades as defined by securityheaders.io :
1617 |
1618 | Legend
1619 |
1620 |
1621 |
1624 |
1625 |
1626 |
1627 |
1630 |
1631 |
1632 |
1633 |
1636 |
1637 |
1638 |
1639 |
1642 |
1643 |
1644 |
1645 |
1646 | Markup and usage of headings
1647 |
1648 | Legend
1649 |
1650 |
1651 |
1652 | excellent usage of headings, order of heading levels makes sense
1653 |
1654 |
1655 |
1656 |
1657 |
1658 | pretty good and consistent usage of headings, order of heading levels sometimes not optimal (e.g. h6
followed by h2
), maybe tiny fraction of actual headings aren’t marked up as heading elements
1659 |
1660 |
1661 |
1662 |
1663 |
1664 | overall good and frequent usage of headings, still some or many actual headings aren’t marked up as heading elements
1665 |
1666 |
1667 |
1668 |
1669 |
1670 | (very) rare usage of headings, most actual headings aren’t marked up as such
1671 |
1672 |
1673 |
1674 |
1675 |
1676 | no usage of heading elements whatsoever
1677 |
1678 |
1679 |
1680 |
1681 |
1682 | Markup and implementation of site logo
1683 |
1684 | Legend
1685 |
1686 |
1687 |
1688 | image in markup, existing textual representation, schema.org markup
1689 |
1690 |
1691 |
1692 |
1693 |
1694 | image in markup, existing textual representation, overall good implementation
1695 |
1696 |
1697 |
1698 |
1699 |
1700 | CSS background image, existing textual representation, sometimes text hidden with CSS
1701 |
1702 |
1703 |
1704 |
1705 |
1706 | no textual representation in the markup
1707 |
1708 |
1709 |
1710 |
1711 |
1712 | Usability without JavaScript
1713 |
1714 | Legend
1715 |
1716 |
1717 |
1718 | almost no difference
1719 |
1720 |
1721 |
1722 |
1723 |
1724 | most content visible and clickable, main navigation and search are usable, some images not visible but placeholder images exist
1725 |
1726 |
1727 |
1728 |
1729 |
1730 | most content visible and clickable, sometimes main navigation and/or search not usable, some or all images underneath the fold not visible
1731 |
1732 |
1733 |
1734 |
1735 |
1736 | no or only some images visible, main navigation and/or search not usable
1737 |
1738 |
1739 |
1740 |
1741 |
1742 | most content not visible or usable, main navigation and search not usable
1743 |
1744 |
1745 |
1746 |
1747 |
1748 |
1749 |
1750 |
1751 | Motivation
1752 | On March 30th 2015 I tweeted an image of a weekend project I did showing a chart of HTTP requests and page weights of big news sites from various countries. I got a lot of feedback from that tweet (at least for my standards). Anselm Hannemann asked if I would put up a HTML version of the image, so this is it.
1753 | I think especially big news sites have a certain responsibility of delivering a certain quality of front-end code to their customers because they normally have massive reach , massive traffic , loyal readers and are confronted with a heterogenous pallet of end-user devices they have to serve. Last but not least they offer information people want to consume if they visit their site, so the information should be served as fast and accessible as possible.
1754 |
1755 |
1756 | Contributing
1757 | Do you miss any metrics? Did you spot an error? Please be sure to check out the list of existing issues before creating one of your own . You are most welcome to do so, I appreciate every feedback, criticism and help.
1758 |
1759 |
1760 | Credits and links
1761 |
1771 |
1772 |
1773 | License
1774 | This repository is published under the MIT License .
1775 |
1776 |
1777 |
1778 |
1779 |
1780 |
1781 |
1782 |
1783 |
--------------------------------------------------------------------------------
/scripts/moment-2.13.0.min.js:
--------------------------------------------------------------------------------
1 | //! moment.js
2 | //! version : 2.13.0
3 | //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
4 | //! license : MIT
5 | //! momentjs.com
6 | !function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return fd.apply(null,arguments)}function b(a){fd=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function e(a,b){var c,d=[];for(c=0;c0)for(c in hd)d=hd[c],e=b[d],m(e)||(a[d]=e);return a}function o(b){n(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),id===!1&&(id=!0,a.updateOffset(this),id=!1)}function p(a){return a instanceof o||null!=a&&null!=a._isAMomentObject}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=q(b)),c}function s(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&r(a[d])!==r(b[d]))&&g++;return g+f}function t(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function u(b,c){var d=!0;return g(function(){return null!=a.deprecationHandler&&a.deprecationHandler(null,b),d&&(t(b+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),d=!1),c.apply(this,arguments)},c)}function v(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),jd[b]||(t(c),jd[b]=!0)}function w(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function x(a){return"[object Object]"===Object.prototype.toString.call(a)}function y(a){var b,c;for(c in a)b=a[c],w(b)?this[c]=b:this["_"+c]=b;this._config=a,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function z(a,b){var c,d=g({},a);for(c in b)f(b,c)&&(x(a[c])&&x(b[c])?(d[c]={},g(d[c],a[c]),g(d[c],b[c])):null!=b[c]?d[c]=b[c]:delete d[c]);return d}function A(a){null!=a&&this.set(a)}function B(a){return a?a.toLowerCase().replace("_","-"):a}function C(a){for(var b,c,d,e,f=0;f0;){if(d=D(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&s(e,c,!0)>=b-1)break;b--}f++}return null}function D(a){var b=null;if(!nd[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=ld._abbr,require("./locale/"+a),E(b)}catch(c){}return nd[a]}function E(a,b){var c;return a&&(c=m(b)?H(a):F(a,b),c&&(ld=c)),ld._abbr}function F(a,b){return null!==b?(b.abbr=a,null!=nd[a]?(v("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),b=z(nd[a]._config,b)):null!=b.parentLocale&&(null!=nd[b.parentLocale]?b=z(nd[b.parentLocale]._config,b):v("parentLocaleUndefined","specified parentLocale is not defined yet")),nd[a]=new A(b),E(a),nd[a]):(delete nd[a],null)}function G(a,b){if(null!=b){var c;null!=nd[a]&&(b=z(nd[a]._config,b)),c=new A(b),c.parentLocale=nd[a],nd[a]=c,E(a)}else null!=nd[a]&&(null!=nd[a].parentLocale?nd[a]=nd[a].parentLocale:null!=nd[a]&&delete nd[a]);return nd[a]}function H(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return ld;if(!c(a)){if(b=D(a))return b;a=[a]}return C(a)}function I(){return kd(nd)}function J(a,b){var c=a.toLowerCase();od[c]=od[c+"s"]=od[b]=a}function K(a){return"string"==typeof a?od[a]||od[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)f(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(b,c){return function(d){return null!=d?(O(this,b,d),a.updateOffset(this,c),this):N(this,b)}}function N(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function O(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function P(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=K(a),w(this[a]))return this[a](b);return this}function Q(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function R(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(sd[a]=e),b&&(sd[b[0]]=function(){return Q(e.apply(this,arguments),b[1],b[2])}),c&&(sd[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function S(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function T(a){var b,c,d=a.match(pd);for(b=0,c=d.length;c>b;b++)sd[d[b]]?d[b]=sd[d[b]]:d[b]=S(d[b]);return function(b){var e,f="";for(e=0;c>e;e++)f+=d[e]instanceof Function?d[e].call(b,a):d[e];return f}}function U(a,b){return a.isValid()?(b=V(b,a.localeData()),rd[b]=rd[b]||T(b),rd[b](a)):a.localeData().invalidDate()}function V(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(qd.lastIndex=0;d>=0&&qd.test(a);)a=a.replace(qd,c),qd.lastIndex=0,d-=1;return a}function W(a,b,c){Kd[a]=w(b)?b:function(a,d){return a&&c?c:b}}function X(a,b){return f(Kd,a)?Kd[a](b._strict,b._locale):new RegExp(Y(a))}function Y(a){return Z(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function Z(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function $(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=r(a)}),c=0;cd;++d)f=h([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=md.call(this._shortMonthsParse,g),-1!==e?e:null):(e=md.call(this._longMonthsParse,g),-1!==e?e:null):"MMM"===b?(e=md.call(this._shortMonthsParse,g),-1!==e?e:(e=md.call(this._longMonthsParse,g),-1!==e?e:null)):(e=md.call(this._longMonthsParse,g),-1!==e?e:(e=md.call(this._shortMonthsParse,g),-1!==e?e:null))}function fa(a,b,c){var d,e,f;if(this._monthsParseExact)return ea.call(this,a,b,c);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=h([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function ga(a,b){var c;if(!a.isValid())return a;if("string"==typeof b)if(/^\d+$/.test(b))b=r(b);else if(b=a.localeData().monthsParse(b),"number"!=typeof b)return a;return c=Math.min(a.date(),ba(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ha(b){return null!=b?(ga(this,b),a.updateOffset(this,!0),this):N(this,"Month")}function ia(){return ba(this.year(),this.month())}function ja(a){return this._monthsParseExact?(f(this,"_monthsRegex")||la.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex}function ka(a){return this._monthsParseExact?(f(this,"_monthsRegex")||la.call(this),a?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex}function la(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=h([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=Z(d[b]),e[b]=Z(e[b]),f[b]=Z(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}function ma(a){var b,c=a._a;return c&&-2===j(a).overflow&&(b=c[Nd]<0||c[Nd]>11?Nd:c[Od]<1||c[Od]>ba(c[Md],c[Nd])?Od:c[Pd]<0||c[Pd]>24||24===c[Pd]&&(0!==c[Qd]||0!==c[Rd]||0!==c[Sd])?Pd:c[Qd]<0||c[Qd]>59?Qd:c[Rd]<0||c[Rd]>59?Rd:c[Sd]<0||c[Sd]>999?Sd:-1,j(a)._overflowDayOfYear&&(Md>b||b>Od)&&(b=Od),j(a)._overflowWeeks&&-1===b&&(b=Td),j(a)._overflowWeekday&&-1===b&&(b=Ud),j(a).overflow=b),a}function na(a){var b,c,d,e,f,g,h=a._i,i=$d.exec(h)||_d.exec(h);if(i){for(j(a).iso=!0,b=0,c=be.length;c>b;b++)if(be[b][1].exec(i[1])){e=be[b][0],d=be[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=ce.length;c>b;b++)if(ce[b][1].exec(i[3])){f=(i[2]||" ")+ce[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!ae.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),Ca(a)}else a._isValid=!1}function oa(b){var c=de.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(na(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function pa(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function qa(a){var b=new Date(Date.UTC.apply(null,arguments));return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function ra(a){return sa(a)?366:365}function sa(a){return a%4===0&&a%100!==0||a%400===0}function ta(){return sa(this.year())}function ua(a,b,c){var d=7+b-c,e=(7+qa(a,0,d).getUTCDay()-b)%7;return-e+d-1}function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=ra(f)+j):j>ra(a)?(f=a+1,g=j-ra(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(ra(a)-d+e)/7}function ya(a,b,c){return null!=a?a:null!=b?b:c}function za(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function Aa(a){var b,c,d,e,f=[];if(!a._d){for(d=za(a),a._w&&null==a._a[Od]&&null==a._a[Nd]&&Ba(a),a._dayOfYear&&(e=ya(a._a[Md],d[Md]),a._dayOfYear>ra(e)&&(j(a)._overflowDayOfYear=!0),c=qa(e,0,a._dayOfYear),a._a[Nd]=c.getUTCMonth(),a._a[Od]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[Pd]&&0===a._a[Qd]&&0===a._a[Rd]&&0===a._a[Sd]&&(a._nextDay=!0,a._a[Pd]=0),a._d=(a._useUTC?qa:pa).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Pd]=24)}}function Ba(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=ya(b.GG,a._a[Md],wa(Ka(),1,4).year),d=ya(b.W,1),e=ya(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=ya(b.gg,a._a[Md],wa(Ka(),f,g).year),d=ya(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>xa(c,f,g)?j(a)._overflowWeeks=!0:null!=i?j(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[Md]=h.year,a._dayOfYear=h.dayOfYear)}function Ca(b){if(b._f===a.ISO_8601)return void na(b);b._a=[],j(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,k=0;for(e=V(b._f,b._locale).match(pd)||[],c=0;c0&&j(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),k+=d.length),sd[f]?(d?j(b).empty=!1:j(b).unusedTokens.push(f),aa(f,d,b)):b._strict&&!d&&j(b).unusedTokens.push(f);j(b).charsLeftOver=i-k,h.length>0&&j(b).unusedInput.push(h),j(b).bigHour===!0&&b._a[Pd]<=12&&b._a[Pd]>0&&(j(b).bigHour=void 0),j(b).parsedDateParts=b._a.slice(0),j(b).meridiem=b._meridiem,b._a[Pd]=Da(b._locale,b._a[Pd],b._meridiem),Aa(b),ma(b)}function Da(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function Ea(a){var b,c,d,e,f;if(0===a._f.length)return j(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;ef)&&(d=f,c=b));g(a,c||b)}function Fa(a){if(!a._d){var b=L(a._i);a._a=e([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),Aa(a)}}function Ga(a){var b=new o(ma(Ha(a)));return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function Ha(a){var b=a._i,e=a._f;return a._locale=a._locale||H(a._l),null===b||void 0===e&&""===b?l({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),p(b)?new o(ma(b)):(c(e)?Ea(a):e?Ca(a):d(b)?a._d=b:Ia(a),k(a)||(a._d=null),a))}function Ia(b){var f=b._i;void 0===f?b._d=new Date(a.now()):d(f)?b._d=new Date(f.valueOf()):"string"==typeof f?oa(b):c(f)?(b._a=e(f.slice(0),function(a){return parseInt(a,10)}),Aa(b)):"object"==typeof f?Fa(b):"number"==typeof f?b._d=new Date(f):a.createFromInputFallback(b)}function Ja(a,b,c,d,e){var f={};return"boolean"==typeof c&&(d=c,c=void 0),f._isAMomentObject=!0,f._useUTC=f._isUTC=e,f._l=c,f._i=a,f._f=b,f._strict=d,Ga(f)}function Ka(a,b,c,d){return Ja(a,b,c,d,!1)}function La(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return Ka();for(d=b[0],e=1;ea&&(a=-a,c="-"),c+Q(~~(a/60),2)+b+Q(~~a%60,2)})}function Ra(a,b){var c=(b||"").match(a)||[],d=c[c.length-1]||[],e=(d+"").match(ie)||["-",0,0],f=+(60*e[1])+r(e[2]);return"+"===e[0]?f:-f}function Sa(b,c){var e,f;return c._isUTC?(e=c.clone(),f=(p(b)||d(b)?b.valueOf():Ka(b).valueOf())-e.valueOf(),e._d.setTime(e._d.valueOf()+f),a.updateOffset(e,!1),e):Ka(b).local()}function Ta(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Ua(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?("string"==typeof b?b=Ra(Hd,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ta(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?jb(this,db(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ta(this):null!=b?this:NaN}function Va(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Wa(a){return this.utcOffset(0,a)}function Xa(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ta(this),"m")),this}function Ya(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Ra(Gd,this._i)),this}function Za(a){return this.isValid()?(a=a?Ka(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function $a(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function _a(){if(!m(this._isDSTShifted))return this._isDSTShifted;var a={};if(n(a,this),a=Ha(a),a._a){var b=a._isUTC?h(a._a):Ka(a._a);this._isDSTShifted=this.isValid()&&s(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function ab(){return this.isValid()?!this._isUTC:!1}function bb(){return this.isValid()?this._isUTC:!1}function cb(){return this.isValid()?this._isUTC&&0===this._offset:!1}function db(a,b){var c,d,e,g=a,h=null;return Pa(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(g={},b?g[b]=a:g.milliseconds=a):(h=je.exec(a))?(c="-"===h[1]?-1:1,g={y:0,d:r(h[Od])*c,h:r(h[Pd])*c,m:r(h[Qd])*c,s:r(h[Rd])*c,ms:r(h[Sd])*c}):(h=ke.exec(a))?(c="-"===h[1]?-1:1,g={y:eb(h[2],c),M:eb(h[3],c),w:eb(h[4],c),d:eb(h[5],c),h:eb(h[6],c),m:eb(h[7],c),s:eb(h[8],c)}):null==g?g={}:"object"==typeof g&&("from"in g||"to"in g)&&(e=gb(Ka(g.from),Ka(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new Oa(g),Pa(a)&&f(a,"_locale")&&(d._locale=a._locale),d}function eb(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function fb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function gb(a,b){var c;return a.isValid()&&b.isValid()?(b=Sa(b,a),a.isBefore(b)?c=fb(a,b):(c=fb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function hb(a){return 0>a?-1*Math.round(-1*a):Math.round(a)}function ib(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(v(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=db(c,d),jb(this,e,a),this}}function jb(b,c,d,e){var f=c._milliseconds,g=hb(c._days),h=hb(c._months);b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&O(b,"Date",N(b,"Date")+g*d),h&&ga(b,N(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function kb(a,b){var c=a||Ka(),d=Sa(c,this).startOf("day"),e=this.diff(d,"days",!0),f=-6>e?"sameElse":-1>e?"lastWeek":0>e?"lastDay":1>e?"sameDay":2>e?"nextDay":7>e?"nextWeek":"sameElse",g=b&&(w(b[f])?b[f]():b[f]);return this.format(g||this.localeData().calendar(f,this,Ka(c)))}function lb(){return new o(this)}function mb(a,b){var c=p(a)?a:Ka(a);return this.isValid()&&c.isValid()?(b=K(m(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function ub(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function vb(){var a=this.clone().utc();return 0f&&(b=f),Vb.call(this,a,b,c,d,e))}function Vb(a,b,c,d,e){var f=va(a,b,c,d,e),g=qa(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Wb(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Xb(a){return wa(a,this._week.dow,this._week.doy).week}function Yb(){return this._week.dow}function Zb(){return this._week.doy}function $b(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function _b(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function ac(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function bc(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]}function cc(a){return this._weekdaysShort[a.day()]}function dc(a){return this._weekdaysMin[a.day()]}function ec(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;7>d;++d)f=h([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=md.call(this._weekdaysParse,g),-1!==e?e:null):"ddd"===b?(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:null):(e=md.call(this._minWeekdaysParse,g),-1!==e?e:null):"dddd"===b?(e=md.call(this._weekdaysParse,g),-1!==e?e:(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:(e=md.call(this._minWeekdaysParse,g),-1!==e?e:null))):"ddd"===b?(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:(e=md.call(this._weekdaysParse,g),-1!==e?e:(e=md.call(this._minWeekdaysParse,g),-1!==e?e:null))):(e=md.call(this._minWeekdaysParse,g),-1!==e?e:(e=md.call(this._weekdaysParse,g),-1!==e?e:(e=md.call(this._shortWeekdaysParse,g),-1!==e?e:null)))}function fc(a,b,c){var d,e,f;if(this._weekdaysParseExact)return ec.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){if(e=h([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function gc(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=ac(a,this.localeData()),this.add(a-b,"d")):b}function hc(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function ic(a){return this.isValid()?null==a?this.day()||7:this.day(this.day()%7?a:a-7):null!=a?this:NaN}function jc(a){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||mc.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex}function kc(a){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||mc.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}function lc(a){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||mc.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}function mc(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],i=[],j=[],k=[];for(b=0;7>b;b++)c=h([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),i.push(e),j.push(f),k.push(d),k.push(e),k.push(f);for(g.sort(a),i.sort(a),j.sort(a),k.sort(a),b=0;7>b;b++)i[b]=Z(i[b]),j[b]=Z(j[b]),k[b]=Z(k[b]);this._weekdaysRegex=new RegExp("^("+k.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}function nc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function oc(){return this.hours()%12||12}function pc(){return this.hours()||24}function qc(a,b){R(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function rc(a,b){return b._meridiemParse}function sc(a){return"p"===(a+"").toLowerCase().charAt(0)}function tc(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function uc(a,b){b[Sd]=r(1e3*("0."+a))}function vc(){return this._isUTC?"UTC":""}function wc(){return this._isUTC?"Coordinated Universal Time":""}function xc(a){return Ka(1e3*a)}function yc(){return Ka.apply(null,arguments).parseZone()}function zc(a,b,c){var d=this._calendar[a];return w(d)?d.call(b,c):d}function Ac(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function Bc(){return this._invalidDate}function Cc(a){return this._ordinal.replace("%d",a)}function Dc(a){return a}function Ec(a,b,c,d){var e=this._relativeTime[c];return w(e)?e(a,b,c,d):e.replace(/%d/i,a)}function Fc(a,b){var c=this._relativeTime[a>0?"future":"past"];return w(c)?c(b):c.replace(/%s/i,b)}function Gc(a,b,c,d){var e=H(),f=h().set(d,b);return e[c](f,a)}function Hc(a,b,c){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return Gc(a,b,c,"month");var d,e=[];for(d=0;12>d;d++)e[d]=Gc(a,d,c,"month");return e}function Ic(a,b,c,d){"boolean"==typeof a?("number"==typeof b&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,"number"==typeof b&&(c=b,b=void 0),b=b||"");var e=H(),f=a?e._week.dow:0;if(null!=c)return Gc(b,(c+f)%7,d,"day");var g,h=[];for(g=0;7>g;g++)h[g]=Gc(b,(g+f)%7,d,"day");return h}function Jc(a,b){return Hc(a,b,"months")}function Kc(a,b){return Hc(a,b,"monthsShort")}function Lc(a,b,c){return Ic(a,b,c,"weekdays")}function Mc(a,b,c){return Ic(a,b,c,"weekdaysShort")}function Nc(a,b,c){return Ic(a,b,c,"weekdaysMin")}function Oc(){var a=this._data;return this._milliseconds=Le(this._milliseconds),this._days=Le(this._days),this._months=Le(this._months),a.milliseconds=Le(a.milliseconds),a.seconds=Le(a.seconds),a.minutes=Le(a.minutes),a.hours=Le(a.hours),a.months=Le(a.months),a.years=Le(a.years),this}function Pc(a,b,c,d){var e=db(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function Qc(a,b){return Pc(this,a,b,1)}function Rc(a,b){return Pc(this,a,b,-1)}function Sc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Tc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Sc(Vc(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=q(f/1e3),i.seconds=a%60,b=q(a/60),i.minutes=b%60,c=q(b/60),i.hours=c%24,g+=q(c/24),e=q(Uc(g)),h+=e,g-=Sc(Vc(e)),d=q(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function Uc(a){return 4800*a/146097}function Vc(a){return 146097*a/4800}function Wc(a){var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+Uc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(Vc(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function Xc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*r(this._months/12)}function Yc(a){return function(){return this.as(a)}}function Zc(a){
7 | return a=K(a),this[a+"s"]()}function $c(a){return function(){return this._data[a]}}function _c(){return q(this.days()/7)}function ad(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function bd(a,b,c){var d=db(a).abs(),e=_e(d.as("s")),f=_e(d.as("m")),g=_e(d.as("h")),h=_e(d.as("d")),i=_e(d.as("M")),j=_e(d.as("y")),k=e=f&&["m"]||f=g&&["h"]||g=h&&["d"]||h=i&&["M"]||i=j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,ad.apply(null,k)}function cd(a,b){return void 0===af[a]?!1:void 0===b?af[a]:(af[a]=b,!0)}function dd(a){var b=this.localeData(),c=bd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function ed(){var a,b,c,d=bf(this._milliseconds)/1e3,e=bf(this._days),f=bf(this._months);a=q(d/60),b=q(a/60),d%=60,a%=60,c=q(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var fd,gd;gd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;c>d;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};var hd=a.momentProperties=[],id=!1,jd={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var kd;kd=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)f(a,b)&&c.push(b);return c};var ld,md,nd={},od={},pd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,qd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,rd={},sd={},td=/\d/,ud=/\d\d/,vd=/\d{3}/,wd=/\d{4}/,xd=/[+-]?\d{6}/,yd=/\d\d?/,zd=/\d\d\d\d?/,Ad=/\d\d\d\d\d\d?/,Bd=/\d{1,3}/,Cd=/\d{1,4}/,Dd=/[+-]?\d{1,6}/,Ed=/\d+/,Fd=/[+-]?\d+/,Gd=/Z|[+-]\d\d:?\d\d/gi,Hd=/Z|[+-]\d\d(?::?\d\d)?/gi,Id=/[+-]?\d+(\.\d{1,3})?/,Jd=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Kd={},Ld={},Md=0,Nd=1,Od=2,Pd=3,Qd=4,Rd=5,Sd=6,Td=7,Ud=8;md=Array.prototype.indexOf?Array.prototype.indexOf:function(a){var b;for(b=0;b=a?""+a:"+"+a}),R(0,["YY",2],0,function(){return this.year()%100}),R(0,["YYYY",4],0,"year"),R(0,["YYYYY",5],0,"year"),R(0,["YYYYYY",6,!0],0,"year"),J("year","y"),W("Y",Fd),W("YY",yd,ud),W("YYYY",Cd,wd),W("YYYYY",Dd,xd),W("YYYYYY",Dd,xd),$(["YYYYY","YYYYYY"],Md),$("YYYY",function(b,c){c[Md]=2===b.length?a.parseTwoDigitYear(b):r(b)}),$("YY",function(b,c){c[Md]=a.parseTwoDigitYear(b)}),$("Y",function(a,b){b[Md]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return r(a)+(r(a)>68?1900:2e3)};var ee=M("FullYear",!0);a.ISO_8601=function(){};var fe=u("moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=Ka.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:l()}),ge=u("moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=Ka.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:l()}),he=function(){return Date.now?Date.now():+new Date};Qa("Z",":"),Qa("ZZ",""),W("Z",Hd),W("ZZ",Hd),$(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ra(Hd,a)});var ie=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var je=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,ke=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;db.fn=Oa.prototype;var le=ib(1,"add"),me=ib(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ne=u("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});R(0,["gg",2],0,function(){return this.weekYear()%100}),R(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Pb("gggg","weekYear"),Pb("ggggg","weekYear"),Pb("GGGG","isoWeekYear"),Pb("GGGGG","isoWeekYear"),J("weekYear","gg"),J("isoWeekYear","GG"),W("G",Fd),W("g",Fd),W("GG",yd,ud),W("gg",yd,ud),W("GGGG",Cd,wd),W("gggg",Cd,wd),W("GGGGG",Dd,xd),W("ggggg",Dd,xd),_(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=r(a)}),_(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),R("Q",0,"Qo","quarter"),J("quarter","Q"),W("Q",td),$("Q",function(a,b){b[Nd]=3*(r(a)-1)}),R("w",["ww",2],"wo","week"),R("W",["WW",2],"Wo","isoWeek"),J("week","w"),J("isoWeek","W"),W("w",yd),W("ww",yd,ud),W("W",yd),W("WW",yd,ud),_(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=r(a)});var oe={dow:0,doy:6};R("D",["DD",2],"Do","date"),J("date","D"),W("D",yd),W("DD",yd,ud),W("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),$(["D","DD"],Od),$("Do",function(a,b){b[Od]=r(a.match(yd)[0],10)});var pe=M("Date",!0);R("d",0,"do","day"),R("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),R("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),R("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),R("e",0,0,"weekday"),R("E",0,0,"isoWeekday"),J("day","d"),J("weekday","e"),J("isoWeekday","E"),W("d",yd),W("e",yd),W("E",yd),W("dd",function(a,b){return b.weekdaysMinRegex(a)}),W("ddd",function(a,b){return b.weekdaysShortRegex(a)}),W("dddd",function(a,b){return b.weekdaysRegex(a)}),_(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:j(c).invalidWeekday=a}),_(["d","e","E"],function(a,b,c,d){b[d]=r(a)});var qe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),re="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),se="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),te=Jd,ue=Jd,ve=Jd;R("DDD",["DDDD",3],"DDDo","dayOfYear"),J("dayOfYear","DDD"),W("DDD",Bd),W("DDDD",vd),$(["DDD","DDDD"],function(a,b,c){c._dayOfYear=r(a)}),R("H",["HH",2],0,"hour"),R("h",["hh",2],0,oc),R("k",["kk",2],0,pc),R("hmm",0,0,function(){return""+oc.apply(this)+Q(this.minutes(),2)}),R("hmmss",0,0,function(){return""+oc.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),R("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),R("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)}),qc("a",!0),qc("A",!1),J("hour","h"),W("a",rc),W("A",rc),W("H",yd),W("h",yd),W("HH",yd,ud),W("hh",yd,ud),W("hmm",zd),W("hmmss",Ad),W("Hmm",zd),W("Hmmss",Ad),$(["H","HH"],Pd),$(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),$(["h","hh"],function(a,b,c){b[Pd]=r(a),j(c).bigHour=!0}),$("hmm",function(a,b,c){var d=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d)),j(c).bigHour=!0}),$("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d,2)),b[Rd]=r(a.substr(e)),j(c).bigHour=!0}),$("Hmm",function(a,b,c){var d=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d))}),$("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[Pd]=r(a.substr(0,d)),b[Qd]=r(a.substr(d,2)),b[Rd]=r(a.substr(e))});var we=/[ap]\.?m?\.?/i,xe=M("Hours",!0);R("m",["mm",2],0,"minute"),J("minute","m"),W("m",yd),W("mm",yd,ud),$(["m","mm"],Qd);var ye=M("Minutes",!1);R("s",["ss",2],0,"second"),J("second","s"),W("s",yd),W("ss",yd,ud),$(["s","ss"],Rd);var ze=M("Seconds",!1);R("S",0,0,function(){return~~(this.millisecond()/100)}),R(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),R(0,["SSS",3],0,"millisecond"),R(0,["SSSS",4],0,function(){return 10*this.millisecond()}),R(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),R(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),R(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),R(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),R(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),J("millisecond","ms"),W("S",Bd,td),W("SS",Bd,ud),W("SSS",Bd,vd);var Ae;for(Ae="SSSS";Ae.length<=9;Ae+="S")W(Ae,Ed);for(Ae="S";Ae.length<=9;Ae+="S")$(Ae,uc);var Be=M("Milliseconds",!1);R("z",0,0,"zoneAbbr"),R("zz",0,0,"zoneName");var Ce=o.prototype;Ce.add=le,Ce.calendar=kb,Ce.clone=lb,Ce.diff=sb,Ce.endOf=Eb,Ce.format=wb,Ce.from=xb,Ce.fromNow=yb,Ce.to=zb,Ce.toNow=Ab,Ce.get=P,Ce.invalidAt=Nb,Ce.isAfter=mb,Ce.isBefore=nb,Ce.isBetween=ob,Ce.isSame=pb,Ce.isSameOrAfter=qb,Ce.isSameOrBefore=rb,Ce.isValid=Lb,Ce.lang=ne,Ce.locale=Bb,Ce.localeData=Cb,Ce.max=ge,Ce.min=fe,Ce.parsingFlags=Mb,Ce.set=P,Ce.startOf=Db,Ce.subtract=me,Ce.toArray=Ib,Ce.toObject=Jb,Ce.toDate=Hb,Ce.toISOString=vb,Ce.toJSON=Kb,Ce.toString=ub,Ce.unix=Gb,Ce.valueOf=Fb,Ce.creationData=Ob,Ce.year=ee,Ce.isLeapYear=ta,Ce.weekYear=Qb,Ce.isoWeekYear=Rb,Ce.quarter=Ce.quarters=Wb,Ce.month=ha,Ce.daysInMonth=ia,Ce.week=Ce.weeks=$b,Ce.isoWeek=Ce.isoWeeks=_b,Ce.weeksInYear=Tb,Ce.isoWeeksInYear=Sb,Ce.date=pe,Ce.day=Ce.days=gc,Ce.weekday=hc,Ce.isoWeekday=ic,Ce.dayOfYear=nc,Ce.hour=Ce.hours=xe,Ce.minute=Ce.minutes=ye,Ce.second=Ce.seconds=ze,Ce.millisecond=Ce.milliseconds=Be,Ce.utcOffset=Ua,Ce.utc=Wa,Ce.local=Xa,Ce.parseZone=Ya,Ce.hasAlignedHourOffset=Za,Ce.isDST=$a,Ce.isDSTShifted=_a,Ce.isLocal=ab,Ce.isUtcOffset=bb,Ce.isUtc=cb,Ce.isUTC=cb,Ce.zoneAbbr=vc,Ce.zoneName=wc,Ce.dates=u("dates accessor is deprecated. Use date instead.",pe),Ce.months=u("months accessor is deprecated. Use month instead",ha),Ce.years=u("years accessor is deprecated. Use year instead",ee),Ce.zone=u("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Va);var De=Ce,Ee={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Fe={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Ge="Invalid date",He="%d",Ie=/\d{1,2}/,Je={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ke=A.prototype;Ke._calendar=Ee,Ke.calendar=zc,Ke._longDateFormat=Fe,Ke.longDateFormat=Ac,Ke._invalidDate=Ge,Ke.invalidDate=Bc,Ke._ordinal=He,Ke.ordinal=Cc,Ke._ordinalParse=Ie,Ke.preparse=Dc,Ke.postformat=Dc,Ke._relativeTime=Je,Ke.relativeTime=Ec,Ke.pastFuture=Fc,Ke.set=y,Ke.months=ca,Ke._months=Wd,Ke.monthsShort=da,Ke._monthsShort=Xd,Ke.monthsParse=fa,Ke._monthsRegex=Zd,Ke.monthsRegex=ka,Ke._monthsShortRegex=Yd,Ke.monthsShortRegex=ja,Ke.week=Xb,Ke._week=oe,Ke.firstDayOfYear=Zb,Ke.firstDayOfWeek=Yb,Ke.weekdays=bc,Ke._weekdays=qe,Ke.weekdaysMin=dc,Ke._weekdaysMin=se,Ke.weekdaysShort=cc,Ke._weekdaysShort=re,Ke.weekdaysParse=fc,Ke._weekdaysRegex=te,Ke.weekdaysRegex=jc,Ke._weekdaysShortRegex=ue,Ke.weekdaysShortRegex=kc,Ke._weekdaysMinRegex=ve,Ke.weekdaysMinRegex=lc,Ke.isPM=sc,Ke._meridiemParse=we,Ke.meridiem=tc,E("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===r(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=u("moment.lang is deprecated. Use moment.locale instead.",E),a.langData=u("moment.langData is deprecated. Use moment.localeData instead.",H);var Le=Math.abs,Me=Yc("ms"),Ne=Yc("s"),Oe=Yc("m"),Pe=Yc("h"),Qe=Yc("d"),Re=Yc("w"),Se=Yc("M"),Te=Yc("y"),Ue=$c("milliseconds"),Ve=$c("seconds"),We=$c("minutes"),Xe=$c("hours"),Ye=$c("days"),Ze=$c("months"),$e=$c("years"),_e=Math.round,af={s:45,m:45,h:22,d:26,M:11},bf=Math.abs,cf=Oa.prototype;cf.abs=Oc,cf.add=Qc,cf.subtract=Rc,cf.as=Wc,cf.asMilliseconds=Me,cf.asSeconds=Ne,cf.asMinutes=Oe,cf.asHours=Pe,cf.asDays=Qe,cf.asWeeks=Re,cf.asMonths=Se,cf.asYears=Te,cf.valueOf=Xc,cf._bubble=Tc,cf.get=Zc,cf.milliseconds=Ue,cf.seconds=Ve,cf.minutes=We,cf.hours=Xe,cf.days=Ye,cf.weeks=_c,cf.months=Ze,cf.years=$e,cf.humanize=dd,cf.toISOString=ed,cf.toString=ed,cf.toJSON=ed,cf.locale=Bb,cf.localeData=Cb,cf.toIsoString=u("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ed),cf.lang=ne,R("X",0,0,"unix"),R("x",0,0,"valueOf"),W("x",Fd),W("X",Id),$("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),$("x",function(a,b,c){c._d=new Date(r(a))}),a.version="2.13.0",b(Ka),a.fn=De,a.min=Ma,a.max=Na,a.now=he,a.utc=h,a.unix=xc,a.months=Jc,a.isDate=d,a.locale=E,a.invalid=l,a.duration=db,a.isMoment=p,a.weekdays=Lc,a.parseZone=yc,a.localeData=H,a.isDuration=Pa,a.monthsShort=Kc,a.weekdaysMin=Nc,a.defineLocale=F,a.updateLocale=G,a.locales=I,a.weekdaysShort=Mc,a.normalizeUnits=K,a.relativeTimeThreshold=cd,a.prototype=De;var df=a;return df});
--------------------------------------------------------------------------------
/scripts/scripts.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | var mainTable = document.querySelector('.main-table');
3 | var mainTableTbodyRows = mainTable.querySelectorAll('tbody tr');
4 | var mainTableTfootRow = mainTable.querySelector('tfoot tr');
5 |
6 | // store all cells of a certain column into an array
7 | function tbodyCellsofColumn(columnNumber) {
8 | var cells = [];
9 | for (var i = 0, len = mainTableTbodyRows.length; i < len; i++) {
10 | var cell = mainTableTbodyRows[i].cells[columnNumber];
11 | cells.push(cell);
12 | }
13 | return cells;
14 | }
15 |
16 | // transform the last time checked dates to relative time (e.g. "3 days ago")
17 | function timeAgo() {
18 | var cells = tbodyCellsofColumn(2);
19 |
20 | cells.forEach(function (cell) {
21 | if (cell.innerHTML !== '') {
22 | cell.innerHTML = moment(cell.innerHTML, 'MMMM Do YYYY').fromNow();
23 | }
24 | });
25 | }
26 |
27 | timeAgo();
28 |
29 | // calculate the average amount of all cells from a certain column
30 | function averageForColumn(columnNumber) {
31 | var cells = tbodyCellsofColumn(columnNumber);
32 | var sum = 0;
33 | var average;
34 | var cellText;
35 |
36 | cells.forEach(function (cell) {
37 | if (cell.innerHTML !== '') {
38 | sum += parseFloat(cell.innerHTML);
39 | }
40 | });
41 |
42 | average = Math.round((sum / mainTableTbodyRows.length) * 100) / 100;
43 | cellText = document.createTextNode(average);
44 |
45 | mainTableTfootRow.cells[columnNumber].appendChild(cellText);
46 | }
47 |
48 | averageForColumn(3);
49 | averageForColumn(4);
50 | averageForColumn(5);
51 | averageForColumn(6);
52 |
53 | function totalSitesCount(columnNumber) {
54 | var cellText = document.createTextNode(tbodyCellsofColumn(columnNumber).length + ' websites');
55 | mainTableTfootRow.cells[columnNumber].appendChild(cellText);
56 | }
57 |
58 | totalSitesCount(0);
59 |
60 | function totalCountriesCount(columnNumber) {
61 | var cells = tbodyCellsofColumn(columnNumber);
62 | var countries = [];
63 | var cellText;
64 |
65 | cells.forEach(function (cell) {
66 | var cellHTML = cell.innerHTML;
67 | if (cellHTML !== '' && countries.indexOf(cellHTML) === -1) {
68 | countries.push(cellHTML);
69 | }
70 | });
71 |
72 | cellText = document.createTextNode(countries.length + ' countries');
73 |
74 | mainTableTfootRow.cells[columnNumber].appendChild(cellText);
75 | }
76 |
77 | totalCountriesCount(1);
78 | })();
79 |
--------------------------------------------------------------------------------
/styles/styles.css:
--------------------------------------------------------------------------------
1 | /* universal */
2 |
3 | *,
4 | *::before,
5 | *::after {
6 | box-sizing: inherit;
7 | }
8 |
9 | * {
10 | font-size: 100%;
11 | margin: 0;
12 | padding: 0;
13 | }
14 |
15 | /* root */
16 |
17 | html {
18 | background: #f7f7f7;
19 | border: 1rem solid #fff;
20 | box-sizing: border-box;
21 | color: #444;
22 | font-family: "fira sans", "helvetica neue", helvetica, sans-serif;
23 | line-height: 1.3;
24 | padding: 2rem;
25 | }
26 |
27 | /* general styling */
28 |
29 | h1,
30 | h2,
31 | h3,
32 | th {
33 | font-weight: 700;
34 | }
35 |
36 | h1 {
37 | font-size: 2rem;
38 | margin-bottom: 1rem;
39 | }
40 |
41 | h2 {
42 | font-size: 1.5rem;
43 | margin: 2rem 0 1rem;
44 | }
45 |
46 | p,
47 | ul {
48 | font-size: 1.25rem;
49 | margin-top: 1rem;
50 | }
51 |
52 | /* mono */
53 |
54 | code {
55 | font-family: consolas, monaco, "andale mono", "ubuntu mono", monospace;
56 | font-size: 1em;
57 | }
58 |
59 | /* lists */
60 |
61 | ul {
62 | margin-left: 2rem;
63 | }
64 |
65 | /* links */
66 |
67 | a {
68 | color: #1160bb;
69 | text-decoration: underline;
70 | }
71 |
72 | a:focus,
73 | a:hover {
74 | text-decoration: none;
75 | }
76 |
77 | /* table */
78 |
79 | table {
80 | background-color: #fff;
81 | border-collapse: collapse;
82 | border-spacing: 0;
83 | line-height: 1;
84 | }
85 |
86 | caption {
87 | caption-side: bottom;
88 | color: #888;
89 | font-size: .875em;
90 | padding: .5rem .5rem 0;
91 | }
92 |
93 | th,
94 | td {
95 | border-bottom: 1px solid #ccc;
96 | border-left: 1px solid #eee;
97 | padding: .375rem .5rem .25rem;
98 | text-align: left;
99 | }
100 |
101 | thead th {
102 | vertical-align: bottom;
103 | }
104 |
105 | tbody th,
106 | td {
107 | vertical-align: top;
108 | }
109 |
110 | th:not(.automatic-width),
111 | td:not(.automatic-width) {
112 | min-width: 7rem;
113 | }
114 |
115 | /* icons */
116 |
117 | td[aria-describedby^="metric-"] {
118 | background-position: center;
119 | background-repeat: no-repeat;
120 | background-size: auto;
121 | -ms-high-contrast-adjust: none;
122 | max-width: 4rem;
123 | overflow: hidden;
124 | }
125 |
126 | td[aria-describedby$="-good"] {
127 | background-image: url("../images/good.svg");
128 | }
129 |
130 | td[aria-describedby$="-very-good"] {
131 | background-color: rgba(74, 131, 62, .25) !important;
132 | }
133 |
134 | td[aria-describedby$="-bad"] {
135 | background-image: url("../images/bad.svg");
136 | }
137 |
138 | td[aria-describedby$="-very-bad"] {
139 | background-color: rgba(131, 77, 142, .25) !important;
140 | }
141 |
142 | td[aria-describedby$="-partially"] {
143 | background-image: url("../images/partially.svg");
144 | }
145 |
146 | td[aria-describedby$="-not-available"] {
147 | background-image: url("../images/na.svg");
148 | }
149 |
150 | /* main wrapper */
151 |
152 | .main-wrapper {
153 | margin: auto;
154 | max-width: 93.75rem;
155 | }
156 |
157 | /* main header */
158 |
159 | .main-header ul {
160 | list-style-type: none;
161 | margin-left: 0;
162 | }
163 |
164 | .main-header li {
165 | display: inline-block;
166 | margin-right: 1rem;
167 | }
168 |
169 | /* main table */
170 |
171 | .main-table-wrapper {
172 | margin: 2rem -2rem;
173 | overflow-x: scroll;
174 | }
175 |
176 | .main-table {
177 | font-size: .75em;
178 | margin-bottom: 0;
179 | }
180 |
181 | .main-table thead th[colspan] {
182 | text-align: center;
183 | }
184 |
185 | .main-table thead tr:first-child th:first-child,
186 | .main-table tbody th {
187 | border-left: 0;
188 | }
189 |
190 | .main-table tbody tr:hover {
191 | background-color: #eee;
192 | }
193 |
194 | .main-table th:not(.automatic-width),
195 | .main-table td:not(.automatic-width) {
196 | max-width: 7rem;
197 | }
198 |
199 | .main-table td[aria-describedby^="metric-page-weight-"],
200 | .main-table td[aria-describedby^="metric-w3c-validation-"],
201 | .main-table td[aria-describedby^="metric-security-headers"] {
202 | background-position: 90%;
203 | }
204 |
205 | .main-table td[aria-describedby$="-not-available"] {
206 | background-position: center;
207 | }
208 |
209 | .no-js .main-table tfoot {
210 | display: none;
211 | }
212 |
213 | /* metrics */
214 |
215 | .metrics section {
216 | background: #fff;
217 | margin-bottom: 1.5rem;
218 | padding: 1rem;
219 | }
220 |
221 | .metrics section *:last-child {
222 | margin-bottom: 0;
223 | }
224 |
225 | .metrics h3,
226 | .metrics p,
227 | .metrics ul,
228 | .metrics table {
229 | font-size: 1rem;
230 | margin-bottom: 1rem;
231 | }
232 |
233 | /* helpers */
234 |
235 | .visually-hidden {
236 | border: 0;
237 | clip: rect(0 0 0 0);
238 | height: 1px;
239 | margin: -1px;
240 | overflow: hidden;
241 | padding: 0;
242 | position: absolute;
243 | width: 1px;
244 | }
245 |
246 | @media screen and (max-width: 50em) {
247 | html {
248 | border: 0;
249 | padding: 1rem;
250 | }
251 |
252 | h1 {
253 | font-size: 1.5rem;
254 | }
255 |
256 | h2 {
257 | font-size: 1.25rem;
258 | }
259 |
260 | p,
261 | ul {
262 | font-size: 1rem;
263 | }
264 |
265 | .main-header li {
266 | margin-right: .5rem;
267 | }
268 |
269 | .main-table-wrapper {
270 | margin-left: -1rem;
271 | margin-right: -1rem;
272 | }
273 | }
274 |
275 | @media screen and (min-width: 93.75rem) {
276 | .main-table-wrapper {
277 | margin-left: 0;
278 | margin-right: 0;
279 | }
280 | }
281 |
--------------------------------------------------------------------------------