`) or as a parent
+class. If you use the parent class, be sure to apply `.stack-nav__list` to
+activate reset styles. This is the recommended pattern for
+[headed/nested](<#headed-(nested)>) contexts.
diff --git a/src/component-library/stack-nav/stack-nav.njk b/src/component-library/stack-nav/stack-nav.njk
new file mode 100644
index 00000000000..e11c2825f4c
--- /dev/null
+++ b/src/component-library/stack-nav/stack-nav.njk
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/src/component-library/stack-nav/variants/nested/nested.json b/src/component-library/stack-nav/variants/nested/nested.json
new file mode 100644
index 00000000000..a7e2a8eb59c
--- /dev/null
+++ b/src/component-library/stack-nav/variants/nested/nested.json
@@ -0,0 +1,64 @@
+{
+ "title": "Headed (Nested)",
+ "context": {
+ "topItems": [
+ {
+ "text": "Lorem ipsum dolor",
+ "url": "#",
+ "active": false,
+ "icon": "done.svg",
+ "prefix": "001"
+ },
+ {
+ "text": "Tristique Ornare Commodo",
+ "url": "#",
+ "active": true,
+ "icon": "done.svg",
+ "prefix": "002"
+ },
+ {
+ "text": "Adipiscing Amet Ullamcorper",
+ "url": "#",
+ "active": false,
+ "prefix": "003"
+ },
+ {
+ "text": "Risus Adipiscing",
+ "url": "#",
+ "active": false,
+ "icon": "done.svg",
+ "prefix": "004"
+ }
+ ],
+ "heading": "A heading for a section",
+ "headedItems": [
+ {
+ "text": "Lorem ipsum dolor",
+ "url": "#",
+ "active": false,
+ "icon": "done.svg",
+ "prefix": "005"
+ },
+ {
+ "text": "Tristique Ornare Commodo",
+ "url": "#",
+ "active": false,
+ "icon": "done.svg",
+ "prefix": "006"
+ },
+ {
+ "text": "Adipiscing Amet Ullamcorper",
+ "url": "#",
+ "active": false,
+ "prefix": "007"
+ },
+ {
+ "text": "Risus Adipiscing",
+ "url": "#",
+ "active": false,
+ "icon": "done.svg",
+ "prefix": "008"
+ }
+ ]
+ }
+}
diff --git a/src/component-library/stack-nav/variants/nested/nested.njk b/src/component-library/stack-nav/variants/nested/nested.njk
new file mode 100644
index 00000000000..527463eea37
--- /dev/null
+++ b/src/component-library/stack-nav/variants/nested/nested.njk
@@ -0,0 +1,37 @@
+
+
+
{{ data.heading }}
+
+
\ No newline at end of file
diff --git a/src/component-library/stats/stats.json b/src/component-library/stats/stats.json
new file mode 100644
index 00000000000..0d5f2ef5742
--- /dev/null
+++ b/src/component-library/stats/stats.json
@@ -0,0 +1,37 @@
+{
+ "title": "Stats",
+ "keyLinks": [
+ {
+ "label": "Sass File",
+ "url": "https://github.com/GoogleChrome/web.dev/tree/main/src/scss/blocks/_stats.scss"
+ }
+ ],
+ "context": {
+ "items": [
+ {
+ "stat": "30",
+ "sub": "%",
+ "desc": "Lower cost per conversion"
+ },
+ {
+ "stat": "13",
+ "sub": "%",
+ "desc": "Higher CTR"
+ },
+ {
+ "stat": "4",
+ "sub": "x",
+ "desc": "Faster load times"
+ }
+ ]
+ },
+ "variants": [
+ {
+ "name": "alternative-look-and-feel",
+ "title": "Alternative Look And Feel",
+ "context": {
+ "utilities": "bg-state-info-bg color-state-info-text"
+ }
+ }
+ ]
+}
diff --git a/src/component-library/stats/stats.md b/src/component-library/stats/stats.md
new file mode 100644
index 00000000000..45fd66a65c8
--- /dev/null
+++ b/src/component-library/stats/stats.md
@@ -0,0 +1,6 @@
+Use the Stats component to call out important statistics about a product or
+service discussed in a post. (Stats are primarily used in case studies.)
+
+You can modify the look and feel of stats by using utility classes that
+reference [theme colors](/design-system/colors#theme-usage). It's recommended
+that you add these theme classes to the root, `.stats` element.
diff --git a/src/component-library/stats/stats.njk b/src/component-library/stats/stats.njk
new file mode 100644
index 00000000000..a175ff320e7
--- /dev/null
+++ b/src/component-library/stats/stats.njk
@@ -0,0 +1,13 @@
+
diff --git a/src/component-library/status-list/status-list.json b/src/component-library/status-list/status-list.json
new file mode 100644
index 00000000000..231cc6acce5
--- /dev/null
+++ b/src/component-library/status-list/status-list.json
@@ -0,0 +1,42 @@
+{
+ "title": "Status List",
+ "summary": "A simple state-based variant on an unordered or ordered list.",
+ "context": {
+ "icon": "check",
+ "items": [
+ {
+ "text": "Overview",
+ "url": "#"
+ },
+ {
+ "text": "Web Vitals Metrics",
+ "url": "#"
+ },
+ {
+ "text": "Measure Web Vitals",
+ "url": "#"
+ },
+ {
+ "text": "Debug Web Vitals",
+ "url": "#"
+ },
+ {
+ "text": "Improve Web Vitals",
+ "url": "#"
+ },
+ {
+ "text": "Best Practices",
+ "url": "#"
+ }
+ ]
+ },
+ "variants": [
+ {
+ "name": "bad",
+ "title": "Bad state",
+ "context": {
+ "state": "bad"
+ }
+ }
+ ]
+}
diff --git a/src/component-library/status-list/status-list.md b/src/component-library/status-list/status-list.md
new file mode 100644
index 00000000000..f6a9e1e5d7e
--- /dev/null
+++ b/src/component-library/status-list/status-list.md
@@ -0,0 +1 @@
+By default, this pattern is in a success (good) state. To switch the icon to crosses, add a `data-state="bad"` to the pattern instance.
diff --git a/src/component-library/status-list/status-list.njk b/src/component-library/status-list/status-list.njk
new file mode 100644
index 00000000000..86c3c6801df
--- /dev/null
+++ b/src/component-library/status-list/status-list.njk
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/src/component-library/tables/tables.json b/src/component-library/tables/tables.json
new file mode 100644
index 00000000000..efb404a7ae2
--- /dev/null
+++ b/src/component-library/tables/tables.json
@@ -0,0 +1,11 @@
+{
+ "title": "Tables",
+ "summary": "Core table styles, wrapper block and scrolling utility.",
+ "keyLinks": [
+ {
+ "label": "Sass File",
+ "url": "https://github.com/GoogleChrome/web.dev/tree/main/src/scss/blocks/_table-wrapper.scss"
+ }
+ ],
+ "context": {}
+}
diff --git a/src/component-library/tables/tables.md b/src/component-library/tables/tables.md
new file mode 100644
index 00000000000..442619493ad
--- /dev/null
+++ b/src/component-library/tables/tables.md
@@ -0,0 +1,9 @@
+Use HTML markup for tables. Do _not_ use Markdown syntax. It is also
+recommended that you use the `table-wrapper` and `scrollbar` classes to
+provide a good user experience for smaller viewports.
+
+If you want content in `` elements to be vertically aligned to the top of
+the cell, add the `[data-align="top"]` [exception](https://cube.fyi/exception) to the `` element. You can also
+add `[data-align="baseline"]` for baseline alignment. The default alignment
+is center and bottom alignment isn't available because it provides a poor
+reading experience.
diff --git a/src/component-library/tables/tables.njk b/src/component-library/tables/tables.njk
new file mode 100644
index 00000000000..f509c8962e7
--- /dev/null
+++ b/src/component-library/tables/tables.njk
@@ -0,0 +1,41 @@
+
diff --git a/src/component-library/tables/variants/align-top/align-top.json b/src/component-library/tables/variants/align-top/align-top.json
new file mode 100644
index 00000000000..4949766edc1
--- /dev/null
+++ b/src/component-library/tables/variants/align-top/align-top.json
@@ -0,0 +1,4 @@
+{
+ "title": "Aligment exception example",
+ "context": {}
+}
diff --git a/src/component-library/tables/variants/align-top/align-top.njk b/src/component-library/tables/variants/align-top/align-top.njk
new file mode 100644
index 00000000000..f68888cc41f
--- /dev/null
+++ b/src/component-library/tables/variants/align-top/align-top.njk
@@ -0,0 +1,49 @@
+
diff --git a/src/component-library/tables/variants/misc-content-examples/misc-content-examples.json b/src/component-library/tables/variants/misc-content-examples/misc-content-examples.json
new file mode 100644
index 00000000000..9b16ae0d116
--- /dev/null
+++ b/src/component-library/tables/variants/misc-content-examples/misc-content-examples.json
@@ -0,0 +1,4 @@
+{
+ "title": "Misc content examples",
+ "context": {}
+}
diff --git a/src/component-library/tables/variants/misc-content-examples/misc-content-examples.njk b/src/component-library/tables/variants/misc-content-examples/misc-content-examples.njk
new file mode 100644
index 00000000000..363a9dfeb55
--- /dev/null
+++ b/src/component-library/tables/variants/misc-content-examples/misc-content-examples.njk
@@ -0,0 +1,82 @@
+
\ No newline at end of file
diff --git a/src/component-library/tabs/tabs.json b/src/component-library/tabs/tabs.json
new file mode 100644
index 00000000000..af11d39fb2a
--- /dev/null
+++ b/src/component-library/tabs/tabs.json
@@ -0,0 +1,16 @@
+{
+ "title": "Tabs",
+ "keyLinks": [
+ {
+ "label": "Sass File",
+ "url": "https://github.com/GoogleChrome/web.dev/tree/main/src/scss/web-components/_web-tabs.scss"
+ }
+ ],
+ "context": {
+ "items": [
+ "Sodales curabitur pretium",
+ "Ultricies interdum",
+ "Senectus aliquet"
+ ]
+ }
+}
diff --git a/src/component-library/tabs/tabs.md b/src/component-library/tabs/tabs.md
new file mode 100644
index 00000000000..4180cca168b
--- /dev/null
+++ b/src/component-library/tabs/tabs.md
@@ -0,0 +1,8 @@
+To change the active color, set a Custom Property value for
+`--tabs-active-color` and it will override the default, which is
+the primary color.
+
+It’s also recommended that panels passed into `` have padding—
+using `pad-inline-size-1`, for example—to make them render nicely where
+JavaScript isn’t available and also, prevents us having to add unnecessary
+spacing in the `_web-tab.scss` component styles.
diff --git a/src/component-library/tabs/tabs.njk b/src/component-library/tabs/tabs.njk
new file mode 100644
index 00000000000..b8f7c4a9d8a
--- /dev/null
+++ b/src/component-library/tabs/tabs.njk
@@ -0,0 +1,8 @@
+
+ {% for item in data.items %}
+
+ {{ item }}
+ Accumsan egestas suscipit quam hendrerit molestie ultrices vehicula bibendum nunc.
+
+ {% endfor %}
+
\ No newline at end of file
diff --git a/src/component-library/toc/toc.json b/src/component-library/toc/toc.json
new file mode 100644
index 00000000000..0036648852d
--- /dev/null
+++ b/src/component-library/toc/toc.json
@@ -0,0 +1,11 @@
+{
+ "title": "Generated table of contents",
+ "summary": "",
+ "keyLinks": [
+ {
+ "label": "Sass File",
+ "url": "https://github.com/GoogleChrome/web.dev/tree/main/src/scss/blocks/_toc.scss"
+ }
+ ],
+ "context": {}
+}
diff --git a/src/component-library/toc/toc.md b/src/component-library/toc/toc.md
new file mode 100644
index 00000000000..384296e513c
--- /dev/null
+++ b/src/component-library/toc/toc.md
@@ -0,0 +1 @@
+A consistent table of contents that is part of an article content/template that is generated.
diff --git a/src/component-library/toc/toc.njk b/src/component-library/toc/toc.njk
new file mode 100644
index 00000000000..b4ccb47a299
--- /dev/null
+++ b/src/component-library/toc/toc.njk
@@ -0,0 +1,67 @@
+
+
\ No newline at end of file
diff --git a/src/component-library/toggle-switch/toggle-switch.json b/src/component-library/toggle-switch/toggle-switch.json
new file mode 100644
index 00000000000..8aa6b714b2f
--- /dev/null
+++ b/src/component-library/toggle-switch/toggle-switch.json
@@ -0,0 +1,21 @@
+{
+ "title": "Toggle Switch",
+ "keyLinks": [
+ {
+ "label": "Sass File",
+ "url": "https://github.com/GoogleChrome/web.dev/tree/main/src/scss/blocks/_toggle-switch.scss"
+ }
+ ],
+ "context": {
+ "label": "Dark theme",
+ "inputId": "toggle-switch"
+ },
+ "variants": [
+ {
+ "name": "Hidden label",
+ "context": {
+ "hiddenLabel": true
+ }
+ }
+ ]
+}
diff --git a/src/component-library/toggle-switch/toggle-switch.md b/src/component-library/toggle-switch/toggle-switch.md
new file mode 100644
index 00000000000..24469c621c8
--- /dev/null
+++ b/src/component-library/toggle-switch/toggle-switch.md
@@ -0,0 +1,11 @@
+The toggle switch extends a standard checkbox by adding a `switch` role and
+switch-like decorative styling.
+
+It's really important that the input (`toggle-switch__input`) sits **before**
+the decor (`toggle-switch__decor`) because the Sass block uses [next sibling
+combinator selectors]
+(/learn/css/selectors/#next-sibling-combinator) to create
+visual state changes.
+
+You can visually hide the text label with the `visually-hidden` utility, but
+this pattern **must** contain one for accessibility purposes.
diff --git a/src/component-library/toggle-switch/toggle-switch.njk b/src/component-library/toggle-switch/toggle-switch.njk
new file mode 100644
index 00000000000..0fa68dd2d21
--- /dev/null
+++ b/src/component-library/toggle-switch/toggle-switch.njk
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/src/component-library/tooltips/tooltips.json b/src/component-library/tooltips/tooltips.json
new file mode 100644
index 00000000000..ca5c3fe5999
--- /dev/null
+++ b/src/component-library/tooltips/tooltips.json
@@ -0,0 +1,33 @@
+{
+ "title": "Tooltips",
+ "summary": "Use tooltips to provide information about UI controls that are too small to have a label.",
+ "extraSampleCSS": ".tooltip { margin-block: 3rem; margin-inline: auto; }",
+ "keyLinks": [
+ {
+ "label": "Sass File",
+ "url": "https://github.com/GoogleChrome/web.dev/tree/main/src/scss/blocks/_tooltip.scss"
+ }
+ ],
+ "context": {
+ "tooltip": "Standard alignment",
+ "tooltipID": "mytooltip"
+ },
+ "variants": [
+ {
+ "name": "left-aligned",
+ "title": "Left aligned",
+ "context": {
+ "tooltip": "Left aligment",
+ "modifier": "left"
+ }
+ },
+ {
+ "name": "right-aligned",
+ "title": "Right aligned",
+ "context": {
+ "tooltip": "Right aligment",
+ "modifier": "right"
+ }
+ }
+ ]
+}
diff --git a/src/component-library/tooltips/tooltips.md b/src/component-library/tooltips/tooltips.md
new file mode 100644
index 00000000000..de00235a6bf
--- /dev/null
+++ b/src/component-library/tooltips/tooltips.md
@@ -0,0 +1 @@
+Tooltips use `position: absolute`, so it's crucial that the element that your tooltip is assigned to has plenty of space around it.
diff --git a/src/component-library/tooltips/tooltips.njk b/src/component-library/tooltips/tooltips.njk
new file mode 100644
index 00000000000..d226f00a55e
--- /dev/null
+++ b/src/component-library/tooltips/tooltips.njk
@@ -0,0 +1,6 @@
+
+
+ {{ data.tooltip }}
+
\ No newline at end of file
diff --git a/src/fonts/google-sans/bold/cyrillic.woff2 b/src/fonts/google-sans/bold/cyrillic.woff2
new file mode 100644
index 00000000000..bd5e0fbb3e2
Binary files /dev/null and b/src/fonts/google-sans/bold/cyrillic.woff2 differ
diff --git a/src/fonts/google-sans/bold/greek.woff2 b/src/fonts/google-sans/bold/greek.woff2
new file mode 100644
index 00000000000..31d76c59b76
Binary files /dev/null and b/src/fonts/google-sans/bold/greek.woff2 differ
diff --git a/src/fonts/google-sans/bold/latin-ext.woff2 b/src/fonts/google-sans/bold/latin-ext.woff2
new file mode 100644
index 00000000000..7b7e987bfaf
Binary files /dev/null and b/src/fonts/google-sans/bold/latin-ext.woff2 differ
diff --git a/src/fonts/google-sans/bold/latin.woff2 b/src/fonts/google-sans/bold/latin.woff2
new file mode 100644
index 00000000000..cd76c558553
Binary files /dev/null and b/src/fonts/google-sans/bold/latin.woff2 differ
diff --git a/src/fonts/google-sans/bold/vietnamese.woff2 b/src/fonts/google-sans/bold/vietnamese.woff2
new file mode 100644
index 00000000000..6fdde1a6f5f
Binary files /dev/null and b/src/fonts/google-sans/bold/vietnamese.woff2 differ
diff --git a/src/fonts/google-sans/regular/cyrillic.woff2 b/src/fonts/google-sans/regular/cyrillic.woff2
new file mode 100644
index 00000000000..21e1fca365d
Binary files /dev/null and b/src/fonts/google-sans/regular/cyrillic.woff2 differ
diff --git a/src/fonts/google-sans/regular/greek.woff2 b/src/fonts/google-sans/regular/greek.woff2
new file mode 100644
index 00000000000..ff13fb8f924
Binary files /dev/null and b/src/fonts/google-sans/regular/greek.woff2 differ
diff --git a/src/fonts/google-sans/regular/latin-ext.woff2 b/src/fonts/google-sans/regular/latin-ext.woff2
new file mode 100644
index 00000000000..2b545f5d241
Binary files /dev/null and b/src/fonts/google-sans/regular/latin-ext.woff2 differ
diff --git a/src/fonts/google-sans/regular/latin.woff2 b/src/fonts/google-sans/regular/latin.woff2
new file mode 100644
index 00000000000..f8ab3e45f4d
Binary files /dev/null and b/src/fonts/google-sans/regular/latin.woff2 differ
diff --git a/src/fonts/google-sans/regular/vietnamese.woff2 b/src/fonts/google-sans/regular/vietnamese.woff2
new file mode 100644
index 00000000000..fb35f96651a
Binary files /dev/null and b/src/fonts/google-sans/regular/vietnamese.woff2 differ
diff --git a/src/fonts/material-icons/regular.woff2 b/src/fonts/material-icons/regular.woff2
new file mode 100644
index 00000000000..9fa21125208
Binary files /dev/null and b/src/fonts/material-icons/regular.woff2 differ
diff --git a/src/images/android-chrome-192x192.png b/src/images/android-chrome-192x192.png
index cbd9ba269bd..b2d7d876faf 100644
Binary files a/src/images/android-chrome-192x192.png and b/src/images/android-chrome-192x192.png differ
diff --git a/src/images/android-chrome-512x512.png b/src/images/android-chrome-512x512.png
index 576372bbb1e..c17581bd3db 100644
Binary files a/src/images/android-chrome-512x512.png and b/src/images/android-chrome-512x512.png differ
diff --git a/src/images/android-chrome-maskable-192x192.png b/src/images/android-chrome-maskable-192x192.png
new file mode 100644
index 00000000000..b2d7d876faf
Binary files /dev/null and b/src/images/android-chrome-maskable-192x192.png differ
diff --git a/src/images/apple-touch-icon.png b/src/images/apple-touch-icon.png
index 5ccf096bff1..48cbaffe443 100644
Binary files a/src/images/apple-touch-icon.png and b/src/images/apple-touch-icon.png differ
diff --git a/src/images/authors/abdshomad.jpg b/src/images/authors/abdshomad.jpg
deleted file mode 100644
index 08c73e77296..00000000000
Binary files a/src/images/authors/abdshomad.jpg and /dev/null differ
diff --git a/src/images/authors/abdshomad@2x.jpg b/src/images/authors/abdshomad@2x.jpg
deleted file mode 100644
index 057d7faf9c2..00000000000
Binary files a/src/images/authors/abdshomad@2x.jpg and /dev/null differ
diff --git a/src/images/authors/adamargyle.jpg b/src/images/authors/adamargyle.jpg
deleted file mode 100644
index 954724f1cdd..00000000000
Binary files a/src/images/authors/adamargyle.jpg and /dev/null differ
diff --git a/src/images/authors/adamargyle@2x.jpg b/src/images/authors/adamargyle@2x.jpg
deleted file mode 100644
index bad8b7bc545..00000000000
Binary files a/src/images/authors/adamargyle@2x.jpg and /dev/null differ
diff --git a/src/images/authors/addyosmani.jpg b/src/images/authors/addyosmani.jpg
deleted file mode 100644
index 816f49b33de..00000000000
Binary files a/src/images/authors/addyosmani.jpg and /dev/null differ
diff --git a/src/images/authors/addyosmani@2x.jpg b/src/images/authors/addyosmani@2x.jpg
deleted file mode 100644
index f4ec47f8bad..00000000000
Binary files a/src/images/authors/addyosmani@2x.jpg and /dev/null differ
diff --git a/src/images/authors/agektmr.jpg b/src/images/authors/agektmr.jpg
deleted file mode 100644
index 3ccc2dfa63e..00000000000
Binary files a/src/images/authors/agektmr.jpg and /dev/null differ
diff --git a/src/images/authors/agektmr@2x.jpg b/src/images/authors/agektmr@2x.jpg
deleted file mode 100644
index 983a194b47c..00000000000
Binary files a/src/images/authors/agektmr@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ahmadawais.jpg b/src/images/authors/ahmadawais.jpg
deleted file mode 100644
index d4a6afa83f4..00000000000
Binary files a/src/images/authors/ahmadawais.jpg and /dev/null differ
diff --git a/src/images/authors/ahmadawais@2x.jpg b/src/images/authors/ahmadawais@2x.jpg
deleted file mode 100644
index d4a6afa83f4..00000000000
Binary files a/src/images/authors/ahmadawais@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ajain.jpg b/src/images/authors/ajain.jpg
deleted file mode 100644
index 2c5554f8aee..00000000000
Binary files a/src/images/authors/ajain.jpg and /dev/null differ
diff --git a/src/images/authors/ajain@2x.jpg b/src/images/authors/ajain@2x.jpg
deleted file mode 100644
index f7f72478ecb..00000000000
Binary files a/src/images/authors/ajain@2x.jpg and /dev/null differ
diff --git a/src/images/authors/aleshalamov.jpg b/src/images/authors/aleshalamov.jpg
deleted file mode 100644
index fd4f07969d1..00000000000
Binary files a/src/images/authors/aleshalamov.jpg and /dev/null differ
diff --git a/src/images/authors/aleshalamov@2x.jpg b/src/images/authors/aleshalamov@2x.jpg
deleted file mode 100644
index 36d404fbcd3..00000000000
Binary files a/src/images/authors/aleshalamov@2x.jpg and /dev/null differ
diff --git a/src/images/authors/alexdanilo.jpg b/src/images/authors/alexdanilo.jpg
deleted file mode 100644
index 1c20fb016a3..00000000000
Binary files a/src/images/authors/alexdanilo.jpg and /dev/null differ
diff --git a/src/images/authors/alexdanilo@2x.jpg b/src/images/authors/alexdanilo@2x.jpg
deleted file mode 100644
index 474ed7e2bc3..00000000000
Binary files a/src/images/authors/alexdanilo@2x.jpg and /dev/null differ
diff --git a/src/images/authors/aliceboxhall.jpg b/src/images/authors/aliceboxhall.jpg
deleted file mode 100644
index 24736f5e5aa..00000000000
Binary files a/src/images/authors/aliceboxhall.jpg and /dev/null differ
diff --git a/src/images/authors/aliceboxhall@2x.jpg b/src/images/authors/aliceboxhall@2x.jpg
deleted file mode 100644
index 41cc0881940..00000000000
Binary files a/src/images/authors/aliceboxhall@2x.jpg and /dev/null differ
diff --git a/src/images/authors/alsan.jpg b/src/images/authors/alsan.jpg
deleted file mode 100644
index bd0948f9ad6..00000000000
Binary files a/src/images/authors/alsan.jpg and /dev/null differ
diff --git a/src/images/authors/alsan@2x.jpg b/src/images/authors/alsan@2x.jpg
deleted file mode 100644
index a4f723d4e44..00000000000
Binary files a/src/images/authors/alsan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/andismith.jpg b/src/images/authors/andismith.jpg
deleted file mode 100644
index 0e9ef56b8a3..00000000000
Binary files a/src/images/authors/andismith.jpg and /dev/null differ
diff --git a/src/images/authors/andismith@2x.jpg b/src/images/authors/andismith@2x.jpg
deleted file mode 100644
index 9abb6dfd244..00000000000
Binary files a/src/images/authors/andismith@2x.jpg and /dev/null differ
diff --git a/src/images/authors/andreban.jpg b/src/images/authors/andreban.jpg
deleted file mode 100644
index 820d2a05944..00000000000
Binary files a/src/images/authors/andreban.jpg and /dev/null differ
diff --git a/src/images/authors/andreban@2x.jpg b/src/images/authors/andreban@2x.jpg
deleted file mode 100644
index b5e6e41a28e..00000000000
Binary files a/src/images/authors/andreban@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ansteychris.jpg b/src/images/authors/ansteychris.jpg
deleted file mode 100644
index ec46f3b07a6..00000000000
Binary files a/src/images/authors/ansteychris.jpg and /dev/null differ
diff --git a/src/images/authors/ansteychris@2x.jpg b/src/images/authors/ansteychris@2x.jpg
deleted file mode 100644
index 7bfababb403..00000000000
Binary files a/src/images/authors/ansteychris@2x.jpg and /dev/null differ
diff --git a/src/images/authors/antonkarlovskiy.jpg b/src/images/authors/antonkarlovskiy.jpg
deleted file mode 100644
index 21308d881f5..00000000000
Binary files a/src/images/authors/antonkarlovskiy.jpg and /dev/null differ
diff --git a/src/images/authors/antonkarlovskiy@2x.jpg b/src/images/authors/antonkarlovskiy@2x.jpg
deleted file mode 100644
index 073dd6015a4..00000000000
Binary files a/src/images/authors/antonkarlovskiy@2x.jpg and /dev/null differ
diff --git a/src/images/authors/arthurevans.jpg b/src/images/authors/arthurevans.jpg
deleted file mode 100644
index 632e2a9d2c9..00000000000
Binary files a/src/images/authors/arthurevans.jpg and /dev/null differ
diff --git a/src/images/authors/arthurevans@2x.jpg b/src/images/authors/arthurevans@2x.jpg
deleted file mode 100644
index bb3587ffd16..00000000000
Binary files a/src/images/authors/arthurevans@2x.jpg and /dev/null differ
diff --git a/src/images/authors/beaufortfrancois.jpg b/src/images/authors/beaufortfrancois.jpg
deleted file mode 100644
index 518355b3d9c..00000000000
Binary files a/src/images/authors/beaufortfrancois.jpg and /dev/null differ
diff --git a/src/images/authors/beaufortfrancois@2x.jpg b/src/images/authors/beaufortfrancois@2x.jpg
deleted file mode 100644
index 92c0cafe2dd..00000000000
Binary files a/src/images/authors/beaufortfrancois@2x.jpg and /dev/null differ
diff --git a/src/images/authors/bmcquade.jpg b/src/images/authors/bmcquade.jpg
deleted file mode 100644
index b18810d2bad..00000000000
Binary files a/src/images/authors/bmcquade.jpg and /dev/null differ
diff --git a/src/images/authors/bmcquade@2x.jpg b/src/images/authors/bmcquade@2x.jpg
deleted file mode 100644
index 5079a177e6f..00000000000
Binary files a/src/images/authors/bmcquade@2x.jpg and /dev/null differ
diff --git a/src/images/authors/bojanpavic.jpg b/src/images/authors/bojanpavic.jpg
deleted file mode 100644
index 0dbb1f3a1da..00000000000
Binary files a/src/images/authors/bojanpavic.jpg and /dev/null differ
diff --git a/src/images/authors/bojanpavic@2x.jpg b/src/images/authors/bojanpavic@2x.jpg
deleted file mode 100644
index 4e5199f8b90..00000000000
Binary files a/src/images/authors/bojanpavic@2x.jpg and /dev/null differ
diff --git a/src/images/authors/bokan.jpg b/src/images/authors/bokan.jpg
deleted file mode 100644
index cfd0219a66f..00000000000
Binary files a/src/images/authors/bokan.jpg and /dev/null differ
diff --git a/src/images/authors/bokan@2x.jpg b/src/images/authors/bokan@2x.jpg
deleted file mode 100644
index 607d258ff2b..00000000000
Binary files a/src/images/authors/bokan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/borissmus.jpg b/src/images/authors/borissmus.jpg
deleted file mode 100644
index e654db95839..00000000000
Binary files a/src/images/authors/borissmus.jpg and /dev/null differ
diff --git a/src/images/authors/borissmus@2x.jpg b/src/images/authors/borissmus@2x.jpg
deleted file mode 100644
index e7996a78bb5..00000000000
Binary files a/src/images/authors/borissmus@2x.jpg and /dev/null differ
diff --git a/src/images/authors/bpj.jpg b/src/images/authors/bpj.jpg
deleted file mode 100644
index 89f164f431d..00000000000
Binary files a/src/images/authors/bpj.jpg and /dev/null differ
diff --git a/src/images/authors/bpj@2x.jpg b/src/images/authors/bpj@2x.jpg
deleted file mode 100644
index 747b3107183..00000000000
Binary files a/src/images/authors/bpj@2x.jpg and /dev/null differ
diff --git a/src/images/authors/brendankenny.jpg b/src/images/authors/brendankenny.jpg
deleted file mode 100644
index 5803a43929c..00000000000
Binary files a/src/images/authors/brendankenny.jpg and /dev/null differ
diff --git a/src/images/authors/brendankenny@2x.jpg b/src/images/authors/brendankenny@2x.jpg
deleted file mode 100644
index 71901b77d86..00000000000
Binary files a/src/images/authors/brendankenny@2x.jpg and /dev/null differ
diff --git a/src/images/authors/captainpangyo.jpg b/src/images/authors/captainpangyo.jpg
deleted file mode 100644
index 4355647110a..00000000000
Binary files a/src/images/authors/captainpangyo.jpg and /dev/null differ
diff --git a/src/images/authors/captainpangyo@2x.jpg b/src/images/authors/captainpangyo@2x.jpg
deleted file mode 100644
index 0d220014bff..00000000000
Binary files a/src/images/authors/captainpangyo@2x.jpg and /dev/null differ
diff --git a/src/images/authors/cbrand.jpg b/src/images/authors/cbrand.jpg
deleted file mode 100644
index 1d7b9b1fc38..00000000000
Binary files a/src/images/authors/cbrand.jpg and /dev/null differ
diff --git a/src/images/authors/cbrand@2x.jpg b/src/images/authors/cbrand@2x.jpg
deleted file mode 100644
index 2d3731c113f..00000000000
Binary files a/src/images/authors/cbrand@2x.jpg and /dev/null differ
diff --git a/src/images/authors/chriswilson.jpg b/src/images/authors/chriswilson.jpg
deleted file mode 100644
index 8bb96b2dc3f..00000000000
Binary files a/src/images/authors/chriswilson.jpg and /dev/null differ
diff --git a/src/images/authors/chriswilson@2x.jpg b/src/images/authors/chriswilson@2x.jpg
deleted file mode 100644
index 95a4b85d24f..00000000000
Binary files a/src/images/authors/chriswilson@2x.jpg and /dev/null differ
diff --git a/src/images/authors/cjamcl.jpg b/src/images/authors/cjamcl.jpg
deleted file mode 100644
index 53a053ca111..00000000000
Binary files a/src/images/authors/cjamcl.jpg and /dev/null differ
diff --git a/src/images/authors/cjamcl@2x.jpg b/src/images/authors/cjamcl@2x.jpg
deleted file mode 100644
index 07af7efdb24..00000000000
Binary files a/src/images/authors/cjamcl@2x.jpg and /dev/null differ
diff --git a/src/images/authors/crystallambert.jpg b/src/images/authors/crystallambert.jpg
deleted file mode 100644
index 7c2785cebcf..00000000000
Binary files a/src/images/authors/crystallambert.jpg and /dev/null differ
diff --git a/src/images/authors/crystallambert@2x.jpg b/src/images/authors/crystallambert@2x.jpg
deleted file mode 100644
index 80a89853d30..00000000000
Binary files a/src/images/authors/crystallambert@2x.jpg and /dev/null differ
diff --git a/src/images/authors/cwdoh.jpg b/src/images/authors/cwdoh.jpg
deleted file mode 100644
index ad6567a9ed5..00000000000
Binary files a/src/images/authors/cwdoh.jpg and /dev/null differ
diff --git a/src/images/authors/cwdoh@2x.jpg b/src/images/authors/cwdoh@2x.jpg
deleted file mode 100644
index 8d672add434..00000000000
Binary files a/src/images/authors/cwdoh@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dalecurtis.jpg b/src/images/authors/dalecurtis.jpg
deleted file mode 100644
index f204d286268..00000000000
Binary files a/src/images/authors/dalecurtis.jpg and /dev/null differ
diff --git a/src/images/authors/dalecurtis@2x.jpg b/src/images/authors/dalecurtis@2x.jpg
deleted file mode 100644
index 108f5663fc8..00000000000
Binary files a/src/images/authors/dalecurtis@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dalmaer.jpg b/src/images/authors/dalmaer.jpg
deleted file mode 100644
index 4118967fbb8..00000000000
Binary files a/src/images/authors/dalmaer.jpg and /dev/null differ
diff --git a/src/images/authors/dalmaer@2x.jpg b/src/images/authors/dalmaer@2x.jpg
deleted file mode 100644
index 09adca125ff..00000000000
Binary files a/src/images/authors/dalmaer@2x.jpg and /dev/null differ
diff --git a/src/images/authors/danyao.jpg b/src/images/authors/danyao.jpg
deleted file mode 100644
index 53a6dc02410..00000000000
Binary files a/src/images/authors/danyao.jpg and /dev/null differ
diff --git a/src/images/authors/danyao@2x.jpg b/src/images/authors/danyao@2x.jpg
deleted file mode 100644
index 05acc3154a8..00000000000
Binary files a/src/images/authors/danyao@2x.jpg and /dev/null differ
diff --git a/src/images/authors/demianrenzulli.jpg b/src/images/authors/demianrenzulli.jpg
deleted file mode 100644
index 648548aec3a..00000000000
Binary files a/src/images/authors/demianrenzulli.jpg and /dev/null differ
diff --git a/src/images/authors/demianrenzulli@2x.jpg b/src/images/authors/demianrenzulli@2x.jpg
deleted file mode 100644
index 4d472d94b56..00000000000
Binary files a/src/images/authors/demianrenzulli@2x.jpg and /dev/null differ
diff --git a/src/images/authors/developit.jpg b/src/images/authors/developit.jpg
deleted file mode 100644
index 011230d6ad6..00000000000
Binary files a/src/images/authors/developit.jpg and /dev/null differ
diff --git a/src/images/authors/developit@2x.jpg b/src/images/authors/developit@2x.jpg
deleted file mode 100644
index 4252824b741..00000000000
Binary files a/src/images/authors/developit@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dgash.jpg b/src/images/authors/dgash.jpg
deleted file mode 100644
index dbb93e86aa3..00000000000
Binary files a/src/images/authors/dgash.jpg and /dev/null differ
diff --git a/src/images/authors/dgash@2x.jpg b/src/images/authors/dgash@2x.jpg
deleted file mode 100644
index 5c3bcc733e3..00000000000
Binary files a/src/images/authors/dgash@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dgrogan.jpg b/src/images/authors/dgrogan.jpg
deleted file mode 100644
index f186d67cfbd..00000000000
Binary files a/src/images/authors/dgrogan.jpg and /dev/null differ
diff --git a/src/images/authors/dgrogan@2x.jpg b/src/images/authors/dgrogan@2x.jpg
deleted file mode 100644
index 998da0fcaef..00000000000
Binary files a/src/images/authors/dgrogan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dmitryskripunov.jpg b/src/images/authors/dmitryskripunov.jpg
deleted file mode 100644
index 838083a842a..00000000000
Binary files a/src/images/authors/dmitryskripunov.jpg and /dev/null differ
diff --git a/src/images/authors/dmitryskripunov@2x.jpg b/src/images/authors/dmitryskripunov@2x.jpg
deleted file mode 100644
index 61af81e5a1b..00000000000
Binary files a/src/images/authors/dmitryskripunov@2x.jpg and /dev/null differ
diff --git a/src/images/authors/domenic.jpg b/src/images/authors/domenic.jpg
deleted file mode 100644
index b6d7ac3f16e..00000000000
Binary files a/src/images/authors/domenic.jpg and /dev/null differ
diff --git a/src/images/authors/domenic@2x.jpg b/src/images/authors/domenic@2x.jpg
deleted file mode 100644
index e6e1afe9434..00000000000
Binary files a/src/images/authors/domenic@2x.jpg and /dev/null differ
diff --git a/src/images/authors/douglasparker.jpg b/src/images/authors/douglasparker.jpg
deleted file mode 100644
index 21b851c9919..00000000000
Binary files a/src/images/authors/douglasparker.jpg and /dev/null differ
diff --git a/src/images/authors/douglasparker@2x.jpg b/src/images/authors/douglasparker@2x.jpg
deleted file mode 100644
index 95c2af01aad..00000000000
Binary files a/src/images/authors/douglasparker@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dougsillars.jpg b/src/images/authors/dougsillars.jpg
deleted file mode 100644
index da9ac18ba92..00000000000
Binary files a/src/images/authors/dougsillars.jpg and /dev/null differ
diff --git a/src/images/authors/dougsillars@2x.jpg b/src/images/authors/dougsillars@2x.jpg
deleted file mode 100644
index 629608bcf83..00000000000
Binary files a/src/images/authors/dougsillars@2x.jpg and /dev/null differ
diff --git a/src/images/authors/drott.jpg b/src/images/authors/drott.jpg
deleted file mode 100644
index 374e4632dbd..00000000000
Binary files a/src/images/authors/drott.jpg and /dev/null differ
diff --git a/src/images/authors/drott@2x.jpg b/src/images/authors/drott@2x.jpg
deleted file mode 100644
index 877e32a6546..00000000000
Binary files a/src/images/authors/drott@2x.jpg and /dev/null differ
diff --git a/src/images/authors/dtapuska.jpg b/src/images/authors/dtapuska.jpg
deleted file mode 100644
index 672ac4586c1..00000000000
Binary files a/src/images/authors/dtapuska.jpg and /dev/null differ
diff --git a/src/images/authors/dtapuska@2x.jpg b/src/images/authors/dtapuska@2x.jpg
deleted file mode 100644
index c7f65df587a..00000000000
Binary files a/src/images/authors/dtapuska@2x.jpg and /dev/null differ
diff --git a/src/images/authors/durgapandey.jpg b/src/images/authors/durgapandey.jpg
deleted file mode 100644
index a24a77803be..00000000000
Binary files a/src/images/authors/durgapandey.jpg and /dev/null differ
diff --git a/src/images/authors/durgapandey@2x.jpg b/src/images/authors/durgapandey@2x.jpg
deleted file mode 100644
index 22906116b84..00000000000
Binary files a/src/images/authors/durgapandey@2x.jpg and /dev/null differ
diff --git a/src/images/authors/egsweeny.jpg b/src/images/authors/egsweeny.jpg
deleted file mode 100644
index f03a9ba17b3..00000000000
Binary files a/src/images/authors/egsweeny.jpg and /dev/null differ
diff --git a/src/images/authors/egsweeny@2x.jpg b/src/images/authors/egsweeny@2x.jpg
deleted file mode 100644
index 1da75539011..00000000000
Binary files a/src/images/authors/egsweeny@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ekharvey.jpg b/src/images/authors/ekharvey.jpg
deleted file mode 100644
index 8789be8412e..00000000000
Binary files a/src/images/authors/ekharvey.jpg and /dev/null differ
diff --git a/src/images/authors/ekharvey@2x.jpg b/src/images/authors/ekharvey@2x.jpg
deleted file mode 100644
index 109aa3de4cc..00000000000
Binary files a/src/images/authors/ekharvey@2x.jpg and /dev/null differ
diff --git a/src/images/authors/emilystark.jpg b/src/images/authors/emilystark.jpg
deleted file mode 100644
index 4b249ad30bd..00000000000
Binary files a/src/images/authors/emilystark.jpg and /dev/null differ
diff --git a/src/images/authors/emilystark@2x.jpg b/src/images/authors/emilystark@2x.jpg
deleted file mode 100644
index 3a9313651b8..00000000000
Binary files a/src/images/authors/emilystark@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ericbidelman.jpg b/src/images/authors/ericbidelman.jpg
deleted file mode 100644
index 9c2f8e5eef4..00000000000
Binary files a/src/images/authors/ericbidelman.jpg and /dev/null differ
diff --git a/src/images/authors/ericbidelman@2x.jpg b/src/images/authors/ericbidelman@2x.jpg
deleted file mode 100644
index 21c4b3aed87..00000000000
Binary files a/src/images/authors/ericbidelman@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ericlawrence.jpg b/src/images/authors/ericlawrence.jpg
deleted file mode 100644
index 8a7f781846e..00000000000
Binary files a/src/images/authors/ericlawrence.jpg and /dev/null differ
diff --git a/src/images/authors/ericlawrence@2x.jpg b/src/images/authors/ericlawrence@2x.jpg
deleted file mode 100644
index 0427cca1d5b..00000000000
Binary files a/src/images/authors/ericlawrence@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ewagasperowicz.jpg b/src/images/authors/ewagasperowicz.jpg
deleted file mode 100644
index d4b13c31b01..00000000000
Binary files a/src/images/authors/ewagasperowicz.jpg and /dev/null differ
diff --git a/src/images/authors/ewagasperowicz@2x.jpg b/src/images/authors/ewagasperowicz@2x.jpg
deleted file mode 100644
index 4b5d89fb460..00000000000
Binary files a/src/images/authors/ewagasperowicz@2x.jpg and /dev/null differ
diff --git a/src/images/authors/exterkamp.jpg b/src/images/authors/exterkamp.jpg
deleted file mode 100644
index 18d61b5f346..00000000000
Binary files a/src/images/authors/exterkamp.jpg and /dev/null differ
diff --git a/src/images/authors/exterkamp@2x.jpg b/src/images/authors/exterkamp@2x.jpg
deleted file mode 100644
index bdfd4445ad4..00000000000
Binary files a/src/images/authors/exterkamp@2x.jpg and /dev/null differ
diff --git a/src/images/authors/flaviocopes.jpg b/src/images/authors/flaviocopes.jpg
deleted file mode 100644
index bed58604975..00000000000
Binary files a/src/images/authors/flaviocopes.jpg and /dev/null differ
diff --git a/src/images/authors/flaviocopes@2x.jpg b/src/images/authors/flaviocopes@2x.jpg
deleted file mode 100644
index 9423c6bb26e..00000000000
Binary files a/src/images/authors/flaviocopes@2x.jpg and /dev/null differ
diff --git a/src/images/authors/franktang.jpg b/src/images/authors/franktang.jpg
deleted file mode 100644
index 1c92cbc73bc..00000000000
Binary files a/src/images/authors/franktang.jpg and /dev/null differ
diff --git a/src/images/authors/franktang@2x.jpg b/src/images/authors/franktang@2x.jpg
deleted file mode 100644
index ad31769b9df..00000000000
Binary files a/src/images/authors/franktang@2x.jpg and /dev/null differ
diff --git a/src/images/authors/geddski.jpg b/src/images/authors/geddski.jpg
deleted file mode 100644
index d9e0f9ef3aa..00000000000
Binary files a/src/images/authors/geddski.jpg and /dev/null differ
diff --git a/src/images/authors/geddski@2x.jpg b/src/images/authors/geddski@2x.jpg
deleted file mode 100644
index 506ab0876c5..00000000000
Binary files a/src/images/authors/geddski@2x.jpg and /dev/null differ
diff --git a/src/images/authors/gernberg.jpg b/src/images/authors/gernberg.jpg
deleted file mode 100644
index ebd2fe3ecbd..00000000000
Binary files a/src/images/authors/gernberg.jpg and /dev/null differ
diff --git a/src/images/authors/gernberg@2x.jpg b/src/images/authors/gernberg@2x.jpg
deleted file mode 100644
index 25921ca5eca..00000000000
Binary files a/src/images/authors/gernberg@2x.jpg and /dev/null differ
diff --git a/src/images/authors/gilbertococchi.jpg b/src/images/authors/gilbertococchi.jpg
deleted file mode 100644
index 2ef0d04e967..00000000000
Binary files a/src/images/authors/gilbertococchi.jpg and /dev/null differ
diff --git a/src/images/authors/gilbertococchi@2x.jpg b/src/images/authors/gilbertococchi@2x.jpg
deleted file mode 100644
index 4b8445afe2f..00000000000
Binary files a/src/images/authors/gilbertococchi@2x.jpg and /dev/null differ
diff --git a/src/images/authors/glenshires.jpg b/src/images/authors/glenshires.jpg
deleted file mode 100644
index d7e1ea72e8a..00000000000
Binary files a/src/images/authors/glenshires.jpg and /dev/null differ
diff --git a/src/images/authors/glenshires@2x.jpg b/src/images/authors/glenshires@2x.jpg
deleted file mode 100644
index 3b75cb4b481..00000000000
Binary files a/src/images/authors/glenshires@2x.jpg and /dev/null differ
diff --git a/src/images/authors/gmimani.jpg b/src/images/authors/gmimani.jpg
deleted file mode 100644
index 2c6b0cdf787..00000000000
Binary files a/src/images/authors/gmimani.jpg and /dev/null differ
diff --git a/src/images/authors/gmimani@2x.jpg b/src/images/authors/gmimani@2x.jpg
deleted file mode 100644
index 01184a7e810..00000000000
Binary files a/src/images/authors/gmimani@2x.jpg and /dev/null differ
diff --git a/src/images/authors/greenido.jpg b/src/images/authors/greenido.jpg
deleted file mode 100644
index c7923a02f33..00000000000
Binary files a/src/images/authors/greenido.jpg and /dev/null differ
diff --git a/src/images/authors/greenido@2x.jpg b/src/images/authors/greenido@2x.jpg
deleted file mode 100644
index 7816673cf4f..00000000000
Binary files a/src/images/authors/greenido@2x.jpg and /dev/null differ
diff --git a/src/images/authors/hbatra.jpg b/src/images/authors/hbatra.jpg
deleted file mode 100644
index 9aafa1af95f..00000000000
Binary files a/src/images/authors/hbatra.jpg and /dev/null differ
diff --git a/src/images/authors/hbatra@2x.jpg b/src/images/authors/hbatra@2x.jpg
deleted file mode 100644
index dd36efc86f3..00000000000
Binary files a/src/images/authors/hbatra@2x.jpg and /dev/null differ
diff --git a/src/images/authors/heathermahan.jpg b/src/images/authors/heathermahan.jpg
deleted file mode 100644
index e72f9ef3c4c..00000000000
Binary files a/src/images/authors/heathermahan.jpg and /dev/null differ
diff --git a/src/images/authors/heathermahan@2x.jpg b/src/images/authors/heathermahan@2x.jpg
deleted file mode 100644
index 8438247fe5d..00000000000
Binary files a/src/images/authors/heathermahan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/henrylim.jpg b/src/images/authors/henrylim.jpg
deleted file mode 100644
index b1931c4f7b2..00000000000
Binary files a/src/images/authors/henrylim.jpg and /dev/null differ
diff --git a/src/images/authors/henrylim@2x.jpg b/src/images/authors/henrylim@2x.jpg
deleted file mode 100644
index d083ad2f37f..00000000000
Binary files a/src/images/authors/henrylim@2x.jpg and /dev/null differ
diff --git a/src/images/authors/hongchanchoi.jpg b/src/images/authors/hongchanchoi.jpg
deleted file mode 100644
index 23859eb5d04..00000000000
Binary files a/src/images/authors/hongchanchoi.jpg and /dev/null differ
diff --git a/src/images/authors/hongchanchoi@2x.jpg b/src/images/authors/hongchanchoi@2x.jpg
deleted file mode 100644
index 8bafb8bb2d1..00000000000
Binary files a/src/images/authors/hongchanchoi@2x.jpg and /dev/null differ
diff --git a/src/images/authors/houssein.jpg b/src/images/authors/houssein.jpg
deleted file mode 100644
index e74ef406143..00000000000
Binary files a/src/images/authors/houssein.jpg and /dev/null differ
diff --git a/src/images/authors/houssein@2x.jpg b/src/images/authors/houssein@2x.jpg
deleted file mode 100644
index e4a9e8421b7..00000000000
Binary files a/src/images/authors/houssein@2x.jpg and /dev/null differ
diff --git a/src/images/authors/iamakulov.jpg b/src/images/authors/iamakulov.jpg
deleted file mode 100644
index 827f2b5e7f9..00000000000
Binary files a/src/images/authors/iamakulov.jpg and /dev/null differ
diff --git a/src/images/authors/iamakulov@2x.jpg b/src/images/authors/iamakulov@2x.jpg
deleted file mode 100644
index 357b7d7e855..00000000000
Binary files a/src/images/authors/iamakulov@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ianbarber.jpg b/src/images/authors/ianbarber.jpg
deleted file mode 100644
index 9384a7975d8..00000000000
Binary files a/src/images/authors/ianbarber.jpg and /dev/null differ
diff --git a/src/images/authors/ianbarber@2x.jpg b/src/images/authors/ianbarber@2x.jpg
deleted file mode 100644
index 66c21fc2b16..00000000000
Binary files a/src/images/authors/ianbarber@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ilmariheikkinen.jpg b/src/images/authors/ilmariheikkinen.jpg
deleted file mode 100644
index 8fdf512eb55..00000000000
Binary files a/src/images/authors/ilmariheikkinen.jpg and /dev/null differ
diff --git a/src/images/authors/ilmariheikkinen@2x.jpg b/src/images/authors/ilmariheikkinen@2x.jpg
deleted file mode 100644
index 1ba9e8c7aa2..00000000000
Binary files a/src/images/authors/ilmariheikkinen@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ilyagrigorik.jpg b/src/images/authors/ilyagrigorik.jpg
deleted file mode 100644
index f1855ca829b..00000000000
Binary files a/src/images/authors/ilyagrigorik.jpg and /dev/null differ
diff --git a/src/images/authors/ilyagrigorik@2x.jpg b/src/images/authors/ilyagrigorik@2x.jpg
deleted file mode 100644
index f917c7c18fe..00000000000
Binary files a/src/images/authors/ilyagrigorik@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jacquerie.jpg b/src/images/authors/jacquerie.jpg
deleted file mode 100644
index 3f74b966d86..00000000000
Binary files a/src/images/authors/jacquerie.jpg and /dev/null differ
diff --git a/src/images/authors/jacquerie@2x.jpg b/src/images/authors/jacquerie@2x.jpg
deleted file mode 100644
index c5ccd87ef2c..00000000000
Binary files a/src/images/authors/jacquerie@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jakearchibald.jpg b/src/images/authors/jakearchibald.jpg
deleted file mode 100644
index 76e9bb900d3..00000000000
Binary files a/src/images/authors/jakearchibald.jpg and /dev/null differ
diff --git a/src/images/authors/jakearchibald@2x.jpg b/src/images/authors/jakearchibald@2x.jpg
deleted file mode 100644
index 2c8b5f045cc..00000000000
Binary files a/src/images/authors/jakearchibald@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jasonpark.jpg b/src/images/authors/jasonpark.jpg
deleted file mode 100644
index 019c4b1c3ce..00000000000
Binary files a/src/images/authors/jasonpark.jpg and /dev/null differ
diff --git a/src/images/authors/jasonpark@2x.jpg b/src/images/authors/jasonpark@2x.jpg
deleted file mode 100644
index 2d73adcd32c..00000000000
Binary files a/src/images/authors/jasonpark@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jbnicolai.jpg b/src/images/authors/jbnicolai.jpg
deleted file mode 100644
index cfa4c144d1f..00000000000
Binary files a/src/images/authors/jbnicolai.jpg and /dev/null differ
diff --git a/src/images/authors/jbnicolai@2x.jpg b/src/images/authors/jbnicolai@2x.jpg
deleted file mode 100644
index 13904258919..00000000000
Binary files a/src/images/authors/jbnicolai@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jeffposnick.jpg b/src/images/authors/jeffposnick.jpg
deleted file mode 100644
index 9020daf2eff..00000000000
Binary files a/src/images/authors/jeffposnick.jpg and /dev/null differ
diff --git a/src/images/authors/jeffposnick@2x.jpg b/src/images/authors/jeffposnick@2x.jpg
deleted file mode 100644
index 2b27778534e..00000000000
Binary files a/src/images/authors/jeffposnick@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jennygove.jpg b/src/images/authors/jennygove.jpg
deleted file mode 100644
index 7f0fe3afa19..00000000000
Binary files a/src/images/authors/jennygove.jpg and /dev/null differ
diff --git a/src/images/authors/jennygove@2x.jpg b/src/images/authors/jennygove@2x.jpg
deleted file mode 100644
index 3ec76468a6e..00000000000
Binary files a/src/images/authors/jennygove@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jeokrang.jpg b/src/images/authors/jeokrang.jpg
deleted file mode 100644
index c9dd77f03b5..00000000000
Binary files a/src/images/authors/jeokrang.jpg and /dev/null differ
diff --git a/src/images/authors/jeokrang@2x.jpg b/src/images/authors/jeokrang@2x.jpg
deleted file mode 100644
index 106963542e2..00000000000
Binary files a/src/images/authors/jeokrang@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jeremywagner.jpg b/src/images/authors/jeremywagner.jpg
deleted file mode 100644
index 647eb29b399..00000000000
Binary files a/src/images/authors/jeremywagner.jpg and /dev/null differ
diff --git a/src/images/authors/jeremywagner@2x.jpg b/src/images/authors/jeremywagner@2x.jpg
deleted file mode 100644
index 911b0235405..00000000000
Binary files a/src/images/authors/jeremywagner@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jimper.jpg b/src/images/authors/jimper.jpg
deleted file mode 100644
index f75fdd24c66..00000000000
Binary files a/src/images/authors/jimper.jpg and /dev/null differ
diff --git a/src/images/authors/jimper@2x.jpg b/src/images/authors/jimper@2x.jpg
deleted file mode 100644
index 8206a21f703..00000000000
Binary files a/src/images/authors/jimper@2x.jpg and /dev/null differ
diff --git a/src/images/authors/joelriley.jpg b/src/images/authors/joelriley.jpg
deleted file mode 100644
index 289cd505c8b..00000000000
Binary files a/src/images/authors/joelriley.jpg and /dev/null differ
diff --git a/src/images/authors/joelriley@2x.jpg b/src/images/authors/joelriley@2x.jpg
deleted file mode 100644
index 9afa01bc25e..00000000000
Binary files a/src/images/authors/joelriley@2x.jpg and /dev/null differ
diff --git a/src/images/authors/joemedley.jpg b/src/images/authors/joemedley.jpg
deleted file mode 100644
index 7f792519064..00000000000
Binary files a/src/images/authors/joemedley.jpg and /dev/null differ
diff --git a/src/images/authors/joemedley@2x.jpg b/src/images/authors/joemedley@2x.jpg
deleted file mode 100644
index fdbfe1a3041..00000000000
Binary files a/src/images/authors/joemedley@2x.jpg and /dev/null differ
diff --git a/src/images/authors/johyphenel.jpg b/src/images/authors/johyphenel.jpg
deleted file mode 100644
index 5023fc2461a..00000000000
Binary files a/src/images/authors/johyphenel.jpg and /dev/null differ
diff --git a/src/images/authors/johyphenel@2x.jpg b/src/images/authors/johyphenel@2x.jpg
deleted file mode 100644
index bef0c8384e8..00000000000
Binary files a/src/images/authors/johyphenel@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jonathangarbee.jpg b/src/images/authors/jonathangarbee.jpg
deleted file mode 100644
index 60360d6f5b6..00000000000
Binary files a/src/images/authors/jonathangarbee.jpg and /dev/null differ
diff --git a/src/images/authors/jonathangarbee@2x.jpg b/src/images/authors/jonathangarbee@2x.jpg
deleted file mode 100644
index d67cfbd112d..00000000000
Binary files a/src/images/authors/jonathangarbee@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jonchen.jpg b/src/images/authors/jonchen.jpg
deleted file mode 100644
index 34990975c42..00000000000
Binary files a/src/images/authors/jonchen.jpg and /dev/null differ
diff --git a/src/images/authors/jonchen@2x.jpg b/src/images/authors/jonchen@2x.jpg
deleted file mode 100644
index 21872b7e271..00000000000
Binary files a/src/images/authors/jonchen@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jormears.jpg b/src/images/authors/jormears.jpg
deleted file mode 100644
index ba04ff5185e..00000000000
Binary files a/src/images/authors/jormears.jpg and /dev/null differ
diff --git a/src/images/authors/jormears@2x.jpg b/src/images/authors/jormears@2x.jpg
deleted file mode 100644
index 9ee4ae22fa6..00000000000
Binary files a/src/images/authors/jormears@2x.jpg and /dev/null differ
diff --git a/src/images/authors/jungkees.jpg b/src/images/authors/jungkees.jpg
deleted file mode 100644
index eb7ed25fd1e..00000000000
Binary files a/src/images/authors/jungkees.jpg and /dev/null differ
diff --git a/src/images/authors/jungkees@2x.jpg b/src/images/authors/jungkees@2x.jpg
deleted file mode 100644
index 231d7fa4d2a..00000000000
Binary files a/src/images/authors/jungkees@2x.jpg and /dev/null differ
diff --git a/src/images/authors/katejeffreys.jpg b/src/images/authors/katejeffreys.jpg
deleted file mode 100644
index b45f7d6fed1..00000000000
Binary files a/src/images/authors/katejeffreys.jpg and /dev/null differ
diff --git a/src/images/authors/katejeffreys@2x.jpg b/src/images/authors/katejeffreys@2x.jpg
deleted file mode 100644
index 4320c802aca..00000000000
Binary files a/src/images/authors/katejeffreys@2x.jpg and /dev/null differ
diff --git a/src/images/authors/katiehempenius.jpg b/src/images/authors/katiehempenius.jpg
deleted file mode 100644
index d796362dfd8..00000000000
Binary files a/src/images/authors/katiehempenius.jpg and /dev/null differ
diff --git a/src/images/authors/katiehempenius@2x.jpg b/src/images/authors/katiehempenius@2x.jpg
deleted file mode 100644
index 9dbba7721b2..00000000000
Binary files a/src/images/authors/katiehempenius@2x.jpg and /dev/null differ
diff --git a/src/images/authors/katjackson.jpg b/src/images/authors/katjackson.jpg
deleted file mode 100644
index 8271b212223..00000000000
Binary files a/src/images/authors/katjackson.jpg and /dev/null differ
diff --git a/src/images/authors/katjackson@2x.jpg b/src/images/authors/katjackson@2x.jpg
deleted file mode 100644
index c2c7b440392..00000000000
Binary files a/src/images/authors/katjackson@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kaycebasques.jpg b/src/images/authors/kaycebasques.jpg
deleted file mode 100644
index 95b809b01a6..00000000000
Binary files a/src/images/authors/kaycebasques.jpg and /dev/null differ
diff --git a/src/images/authors/kaycebasques@2x.jpg b/src/images/authors/kaycebasques@2x.jpg
deleted file mode 100644
index 0236f743137..00000000000
Binary files a/src/images/authors/kaycebasques@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kenchris.jpg b/src/images/authors/kenchris.jpg
deleted file mode 100644
index 32a463fc9fd..00000000000
Binary files a/src/images/authors/kenchris.jpg and /dev/null differ
diff --git a/src/images/authors/kenchris@2x.jpg b/src/images/authors/kenchris@2x.jpg
deleted file mode 100644
index 8df7b3aa856..00000000000
Binary files a/src/images/authors/kenchris@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kenjibaheux.jpg b/src/images/authors/kenjibaheux.jpg
deleted file mode 100644
index 448875e51c0..00000000000
Binary files a/src/images/authors/kenjibaheux.jpg and /dev/null differ
diff --git a/src/images/authors/kenjibaheux@2x.jpg b/src/images/authors/kenjibaheux@2x.jpg
deleted file mode 100644
index c1a8155351a..00000000000
Binary files a/src/images/authors/kenjibaheux@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kento_tsuji.jpg b/src/images/authors/kento_tsuji.jpg
deleted file mode 100644
index 0f1749644f9..00000000000
Binary files a/src/images/authors/kento_tsuji.jpg and /dev/null differ
diff --git a/src/images/authors/kento_tsuji@2x.jpg b/src/images/authors/kento_tsuji@2x.jpg
deleted file mode 100644
index 18f05b11439..00000000000
Binary files a/src/images/authors/kento_tsuji@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kevinellis.jpg b/src/images/authors/kevinellis.jpg
deleted file mode 100644
index 5c037ee82b8..00000000000
Binary files a/src/images/authors/kevinellis.jpg and /dev/null differ
diff --git a/src/images/authors/kevinellis@2x.jpg b/src/images/authors/kevinellis@2x.jpg
deleted file mode 100644
index a4967e66589..00000000000
Binary files a/src/images/authors/kevinellis@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kinukoyasuda.jpg b/src/images/authors/kinukoyasuda.jpg
deleted file mode 100644
index 61d8b7c4b2f..00000000000
Binary files a/src/images/authors/kinukoyasuda.jpg and /dev/null differ
diff --git a/src/images/authors/kinukoyasuda@2x.jpg b/src/images/authors/kinukoyasuda@2x.jpg
deleted file mode 100644
index ad39171ce4a..00000000000
Binary files a/src/images/authors/kinukoyasuda@2x.jpg and /dev/null differ
diff --git a/src/images/authors/kosamari.jpg b/src/images/authors/kosamari.jpg
deleted file mode 100644
index 007fa91b7ce..00000000000
Binary files a/src/images/authors/kosamari.jpg and /dev/null differ
diff --git a/src/images/authors/kosamari@2x.jpg b/src/images/authors/kosamari@2x.jpg
deleted file mode 100644
index 102e9b5ea9c..00000000000
Binary files a/src/images/authors/kosamari@2x.jpg and /dev/null differ
diff --git a/src/images/authors/koto.jpg b/src/images/authors/koto.jpg
deleted file mode 100644
index 5c0a104f702..00000000000
Binary files a/src/images/authors/koto.jpg and /dev/null differ
diff --git a/src/images/authors/koto@2.jpg b/src/images/authors/koto@2.jpg
deleted file mode 100644
index 416afe5a973..00000000000
Binary files a/src/images/authors/koto@2.jpg and /dev/null differ
diff --git a/src/images/authors/kumagi.jpg b/src/images/authors/kumagi.jpg
deleted file mode 100644
index b717057bff4..00000000000
Binary files a/src/images/authors/kumagi.jpg and /dev/null differ
diff --git a/src/images/authors/kumagi@2x.jpg b/src/images/authors/kumagi@2x.jpg
deleted file mode 100644
index 56cc6959307..00000000000
Binary files a/src/images/authors/kumagi@2x.jpg and /dev/null differ
diff --git a/src/images/authors/leszeks.jpg b/src/images/authors/leszeks.jpg
deleted file mode 100644
index 5cd5e5e499b..00000000000
Binary files a/src/images/authors/leszeks.jpg and /dev/null differ
diff --git a/src/images/authors/leszeks@2x.jpg b/src/images/authors/leszeks@2x.jpg
deleted file mode 100644
index d2db5fc67c8..00000000000
Binary files a/src/images/authors/leszeks@2x.jpg and /dev/null differ
diff --git a/src/images/authors/linahansson.jpg b/src/images/authors/linahansson.jpg
deleted file mode 100644
index 35984dfa0d2..00000000000
Binary files a/src/images/authors/linahansson.jpg and /dev/null differ
diff --git a/src/images/authors/linahansson@2x.jpg b/src/images/authors/linahansson@2x.jpg
deleted file mode 100644
index c7f280ce398..00000000000
Binary files a/src/images/authors/linahansson@2x.jpg and /dev/null differ
diff --git a/src/images/authors/lucaberton.jpg b/src/images/authors/lucaberton.jpg
deleted file mode 100644
index e4b86be6811..00000000000
Binary files a/src/images/authors/lucaberton.jpg and /dev/null differ
diff --git a/src/images/authors/lucaberton@2x.jpg b/src/images/authors/lucaberton@2x.jpg
deleted file mode 100644
index 4d426db5bd5..00000000000
Binary files a/src/images/authors/lucaberton@2x.jpg and /dev/null differ
diff --git a/src/images/authors/lunalu.jpg b/src/images/authors/lunalu.jpg
deleted file mode 100644
index 7cc4d5a7b1e..00000000000
Binary files a/src/images/authors/lunalu.jpg and /dev/null differ
diff --git a/src/images/authors/lunalu@2x.jpg b/src/images/authors/lunalu@2x.jpg
deleted file mode 100644
index cd7cf109a1a..00000000000
Binary files a/src/images/authors/lunalu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/lwe.jpg b/src/images/authors/lwe.jpg
deleted file mode 100644
index 019b16a1a47..00000000000
Binary files a/src/images/authors/lwe.jpg and /dev/null differ
diff --git a/src/images/authors/lwe@2x.jpg b/src/images/authors/lwe@2x.jpg
deleted file mode 100644
index 019b16a1a47..00000000000
Binary files a/src/images/authors/lwe@2x.jpg and /dev/null differ
diff --git a/src/images/authors/majidvp.jpg b/src/images/authors/majidvp.jpg
deleted file mode 100644
index 8269623ab12..00000000000
Binary files a/src/images/authors/majidvp.jpg and /dev/null differ
diff --git a/src/images/authors/majidvp@2x.jpg b/src/images/authors/majidvp@2x.jpg
deleted file mode 100644
index 42ea1849549..00000000000
Binary files a/src/images/authors/majidvp@2x.jpg and /dev/null differ
diff --git a/src/images/authors/martinschierle.jpg b/src/images/authors/martinschierle.jpg
deleted file mode 100644
index f124c0013b1..00000000000
Binary files a/src/images/authors/martinschierle.jpg and /dev/null differ
diff --git a/src/images/authors/martinschierle@2x.jpg b/src/images/authors/martinschierle@2x.jpg
deleted file mode 100644
index 601d9c9c4f1..00000000000
Binary files a/src/images/authors/martinschierle@2x.jpg and /dev/null differ
diff --git a/src/images/authors/martinsplitt.jpg b/src/images/authors/martinsplitt.jpg
deleted file mode 100644
index 301b7bb2bd6..00000000000
Binary files a/src/images/authors/martinsplitt.jpg and /dev/null differ
diff --git a/src/images/authors/martinsplitt@2x.jpg b/src/images/authors/martinsplitt@2x.jpg
deleted file mode 100644
index ba6afcaabb5..00000000000
Binary files a/src/images/authors/martinsplitt@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mathiasbynens.jpg b/src/images/authors/mathiasbynens.jpg
deleted file mode 100644
index 9f48120527f..00000000000
Binary files a/src/images/authors/mathiasbynens.jpg and /dev/null differ
diff --git a/src/images/authors/mathiasbynens@2x.jpg b/src/images/authors/mathiasbynens@2x.jpg
deleted file mode 100644
index e44e7fe717f..00000000000
Binary files a/src/images/authors/mathiasbynens@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mattgaunt.jpg b/src/images/authors/mattgaunt.jpg
deleted file mode 100644
index 0b847dc8b7f..00000000000
Binary files a/src/images/authors/mattgaunt.jpg and /dev/null differ
diff --git a/src/images/authors/mattgaunt@2x.jpg b/src/images/authors/mattgaunt@2x.jpg
deleted file mode 100644
index bb7dc035f0c..00000000000
Binary files a/src/images/authors/mattgaunt@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mattreynolds.jpg b/src/images/authors/mattreynolds.jpg
deleted file mode 100644
index c5a3439eac0..00000000000
Binary files a/src/images/authors/mattreynolds.jpg and /dev/null differ
diff --git a/src/images/authors/mattreynolds@2x.jpg b/src/images/authors/mattreynolds@2x.jpg
deleted file mode 100644
index 1a42db674f2..00000000000
Binary files a/src/images/authors/mattreynolds@2x.jpg and /dev/null differ
diff --git a/src/images/authors/maudn.jpg b/src/images/authors/maudn.jpg
deleted file mode 100644
index c926b55cf13..00000000000
Binary files a/src/images/authors/maudn.jpg and /dev/null differ
diff --git a/src/images/authors/maudn@2x.jpg b/src/images/authors/maudn@2x.jpg
deleted file mode 100644
index c20796b4e74..00000000000
Binary files a/src/images/authors/maudn@2x.jpg and /dev/null differ
diff --git a/src/images/authors/maudnalpas.jpg b/src/images/authors/maudnalpas.jpg
deleted file mode 100644
index 8cca275ce70..00000000000
Binary files a/src/images/authors/maudnalpas.jpg and /dev/null differ
diff --git a/src/images/authors/mcasas.jpg b/src/images/authors/mcasas.jpg
deleted file mode 100644
index fa2b0762a65..00000000000
Binary files a/src/images/authors/mcasas.jpg and /dev/null differ
diff --git a/src/images/authors/mcasas@2x.jpg b/src/images/authors/mcasas@2x.jpg
deleted file mode 100644
index e5193e07f16..00000000000
Binary files a/src/images/authors/mcasas@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mco.jpg b/src/images/authors/mco.jpg
deleted file mode 100644
index bfc8163f77b..00000000000
Binary files a/src/images/authors/mco.jpg and /dev/null differ
diff --git a/src/images/authors/mco@2x.jpg b/src/images/authors/mco@2x.jpg
deleted file mode 100644
index b034c5caf55..00000000000
Binary files a/src/images/authors/mco@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mdiblasio.jpg b/src/images/authors/mdiblasio.jpg
deleted file mode 100644
index e3eab6efa69..00000000000
Binary files a/src/images/authors/mdiblasio.jpg and /dev/null differ
diff --git a/src/images/authors/mdiblasio@2x.jpg b/src/images/authors/mdiblasio@2x.jpg
deleted file mode 100644
index dad5ec896fd..00000000000
Binary files a/src/images/authors/mdiblasio@2x.jpg and /dev/null differ
diff --git a/src/images/authors/megginkearney.jpg b/src/images/authors/megginkearney.jpg
deleted file mode 100644
index b9d6be453f3..00000000000
Binary files a/src/images/authors/megginkearney.jpg and /dev/null differ
diff --git a/src/images/authors/megginkearney@2x.jpg b/src/images/authors/megginkearney@2x.jpg
deleted file mode 100644
index 954fea8e0d0..00000000000
Binary files a/src/images/authors/megginkearney@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mfriesenhahn.jpg b/src/images/authors/mfriesenhahn.jpg
deleted file mode 100644
index cd83915ca3d..00000000000
Binary files a/src/images/authors/mfriesenhahn.jpg and /dev/null differ
diff --git a/src/images/authors/mfriesenhahn@2x.jpg b/src/images/authors/mfriesenhahn@2x.jpg
deleted file mode 100644
index 833c98579d2..00000000000
Binary files a/src/images/authors/mfriesenhahn@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mgechev.jpg b/src/images/authors/mgechev.jpg
deleted file mode 100644
index 25e3a0e7f68..00000000000
Binary files a/src/images/authors/mgechev.jpg and /dev/null differ
diff --git a/src/images/authors/mgechev@2x.jpg b/src/images/authors/mgechev@2x.jpg
deleted file mode 100644
index bdb6336fd98..00000000000
Binary files a/src/images/authors/mgechev@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mihajlija.jpg b/src/images/authors/mihajlija.jpg
deleted file mode 100644
index fe522b08027..00000000000
Binary files a/src/images/authors/mihajlija.jpg and /dev/null differ
diff --git a/src/images/authors/mihajlija@2x.jpg b/src/images/authors/mihajlija@2x.jpg
deleted file mode 100644
index 088e342ba92..00000000000
Binary files a/src/images/authors/mihajlija@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mikemahemoff.jpg b/src/images/authors/mikemahemoff.jpg
deleted file mode 100644
index 6c59f1271ff..00000000000
Binary files a/src/images/authors/mikemahemoff.jpg and /dev/null differ
diff --git a/src/images/authors/mikemahemoff@2x.jpg b/src/images/authors/mikemahemoff@2x.jpg
deleted file mode 100644
index 0ee20be6722..00000000000
Binary files a/src/images/authors/mikemahemoff@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mikewest.jpg b/src/images/authors/mikewest.jpg
deleted file mode 100644
index aba12505c28..00000000000
Binary files a/src/images/authors/mikewest.jpg and /dev/null differ
diff --git a/src/images/authors/mikewest@2x.jpg b/src/images/authors/mikewest@2x.jpg
deleted file mode 100644
index c0c894a221a..00000000000
Binary files a/src/images/authors/mikewest@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mkazi.jpg b/src/images/authors/mkazi.jpg
deleted file mode 100644
index fe1ab3dfa20..00000000000
Binary files a/src/images/authors/mkazi.jpg and /dev/null differ
diff --git a/src/images/authors/mkazi@2x.jpg b/src/images/authors/mkazi@2x.jpg
deleted file mode 100644
index 2b855384102..00000000000
Binary files a/src/images/authors/mkazi@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mlamouri.jpg b/src/images/authors/mlamouri.jpg
deleted file mode 100644
index e5bc10a26bd..00000000000
Binary files a/src/images/authors/mlamouri.jpg and /dev/null differ
diff --git a/src/images/authors/mlamouri@2x.jpg b/src/images/authors/mlamouri@2x.jpg
deleted file mode 100644
index 0910be456d6..00000000000
Binary files a/src/images/authors/mlamouri@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mohamedzamakhan.jpg b/src/images/authors/mohamedzamakhan.jpg
deleted file mode 100644
index 3bb5297721d..00000000000
Binary files a/src/images/authors/mohamedzamakhan.jpg and /dev/null differ
diff --git a/src/images/authors/mohamedzamakhan@2x.jpg b/src/images/authors/mohamedzamakhan@2x.jpg
deleted file mode 100644
index fa0b7c4dc37..00000000000
Binary files a/src/images/authors/mohamedzamakhan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/morss.jpg b/src/images/authors/morss.jpg
deleted file mode 100644
index 53e158fd902..00000000000
Binary files a/src/images/authors/morss.jpg and /dev/null differ
diff --git a/src/images/authors/morss@2x.jpg b/src/images/authors/morss@2x.jpg
deleted file mode 100644
index a0a14c19529..00000000000
Binary files a/src/images/authors/morss@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mscales.jpg b/src/images/authors/mscales.jpg
deleted file mode 100644
index 83bd731a631..00000000000
Binary files a/src/images/authors/mscales.jpg and /dev/null differ
diff --git a/src/images/authors/mscales@2x.jpg b/src/images/authors/mscales@2x.jpg
deleted file mode 100644
index c631e033a47..00000000000
Binary files a/src/images/authors/mscales@2x.jpg and /dev/null differ
diff --git a/src/images/authors/msdikla.jpg b/src/images/authors/msdikla.jpg
deleted file mode 100644
index c419922c322..00000000000
Binary files a/src/images/authors/msdikla.jpg and /dev/null differ
diff --git a/src/images/authors/msdikla@2x.jpg b/src/images/authors/msdikla@2x.jpg
deleted file mode 100644
index 3ebb61fcf17..00000000000
Binary files a/src/images/authors/msdikla@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mustafakurtuldu.jpg b/src/images/authors/mustafakurtuldu.jpg
deleted file mode 100644
index f0e0f9438e2..00000000000
Binary files a/src/images/authors/mustafakurtuldu.jpg and /dev/null differ
diff --git a/src/images/authors/mustafakurtuldu@2x.jpg b/src/images/authors/mustafakurtuldu@2x.jpg
deleted file mode 100644
index cb046ea3ec3..00000000000
Binary files a/src/images/authors/mustafakurtuldu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/mychaelgo.jpg b/src/images/authors/mychaelgo.jpg
deleted file mode 100644
index e3eb65b86a6..00000000000
Binary files a/src/images/authors/mychaelgo.jpg and /dev/null differ
diff --git a/src/images/authors/mychaelgo@2x.jpg b/src/images/authors/mychaelgo@2x.jpg
deleted file mode 100644
index f609d343365..00000000000
Binary files a/src/images/authors/mychaelgo@2x.jpg and /dev/null differ
diff --git a/src/images/authors/nainar.jpg b/src/images/authors/nainar.jpg
deleted file mode 100644
index 523835f4160..00000000000
Binary files a/src/images/authors/nainar.jpg and /dev/null differ
diff --git a/src/images/authors/nainar@2x.jpg b/src/images/authors/nainar@2x.jpg
deleted file mode 100644
index 9d49c60d517..00000000000
Binary files a/src/images/authors/nainar@2x.jpg and /dev/null differ
diff --git a/src/images/authors/nattestad.jpg b/src/images/authors/nattestad.jpg
deleted file mode 100644
index 868d417cdc2..00000000000
Binary files a/src/images/authors/nattestad.jpg and /dev/null differ
diff --git a/src/images/authors/nattestad@2x.jpg b/src/images/authors/nattestad@2x.jpg
deleted file mode 100644
index 0fb179c2b46..00000000000
Binary files a/src/images/authors/nattestad@2x.jpg and /dev/null differ
diff --git a/src/images/authors/no-photo.jpg b/src/images/authors/no-photo.jpg
deleted file mode 100644
index 679a74d4730..00000000000
Binary files a/src/images/authors/no-photo.jpg and /dev/null differ
diff --git a/src/images/authors/no-photo.svg b/src/images/authors/no-photo.svg
deleted file mode 100644
index c1d995086d2..00000000000
--- a/src/images/authors/no-photo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/images/authors/no-photo@2x.jpg b/src/images/authors/no-photo@2x.jpg
deleted file mode 100644
index 617518e5113..00000000000
Binary files a/src/images/authors/no-photo@2x.jpg and /dev/null differ
diff --git a/src/images/authors/nurinamu.jpg b/src/images/authors/nurinamu.jpg
deleted file mode 100644
index 941758fd30c..00000000000
Binary files a/src/images/authors/nurinamu.jpg and /dev/null differ
diff --git a/src/images/authors/nurinamu@2x.jpg b/src/images/authors/nurinamu@2x.jpg
deleted file mode 100644
index a85bde4f738..00000000000
Binary files a/src/images/authors/nurinamu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/olgademidova.jpg b/src/images/authors/olgademidova.jpg
deleted file mode 100644
index 19539cbd111..00000000000
Binary files a/src/images/authors/olgademidova.jpg and /dev/null differ
diff --git a/src/images/authors/olgademidova@2x.jpg b/src/images/authors/olgademidova@2x.jpg
deleted file mode 100644
index a3018dd23ba..00000000000
Binary files a/src/images/authors/olgademidova@2x.jpg and /dev/null differ
diff --git a/src/images/authors/owencm.jpg b/src/images/authors/owencm.jpg
deleted file mode 100644
index 0aeaad45fc9..00000000000
Binary files a/src/images/authors/owencm.jpg and /dev/null differ
diff --git a/src/images/authors/owencm@2x.jpg b/src/images/authors/owencm@2x.jpg
deleted file mode 100644
index 48d98ceeb20..00000000000
Binary files a/src/images/authors/owencm@2x.jpg and /dev/null differ
diff --git a/src/images/authors/patrickhulce.jpg b/src/images/authors/patrickhulce.jpg
deleted file mode 100644
index 440167eb423..00000000000
Binary files a/src/images/authors/patrickhulce.jpg and /dev/null differ
diff --git a/src/images/authors/patrickhulce@2x.jpg b/src/images/authors/patrickhulce@2x.jpg
deleted file mode 100644
index 5b4d9f84ecd..00000000000
Binary files a/src/images/authors/patrickhulce@2x.jpg and /dev/null differ
diff --git a/src/images/authors/patrickkettner.jpg b/src/images/authors/patrickkettner.jpg
deleted file mode 100644
index 6c6bb977f92..00000000000
Binary files a/src/images/authors/patrickkettner.jpg and /dev/null differ
diff --git a/src/images/authors/patrickkettner@2x.jpg b/src/images/authors/patrickkettner@2x.jpg
deleted file mode 100644
index 04723948547..00000000000
Binary files a/src/images/authors/patrickkettner@2x.jpg and /dev/null differ
diff --git a/src/images/authors/paulirish.jpg b/src/images/authors/paulirish.jpg
deleted file mode 100644
index f6bbb327636..00000000000
Binary files a/src/images/authors/paulirish.jpg and /dev/null differ
diff --git a/src/images/authors/paulirish@2x.jpg b/src/images/authors/paulirish@2x.jpg
deleted file mode 100644
index 312c8c76714..00000000000
Binary files a/src/images/authors/paulirish@2x.jpg and /dev/null differ
diff --git a/src/images/authors/paulkinlan.jpg b/src/images/authors/paulkinlan.jpg
deleted file mode 100644
index 7f9b9977209..00000000000
Binary files a/src/images/authors/paulkinlan.jpg and /dev/null differ
diff --git a/src/images/authors/paulkinlan@2x.jpg b/src/images/authors/paulkinlan@2x.jpg
deleted file mode 100644
index 42f6ecc8382..00000000000
Binary files a/src/images/authors/paulkinlan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/paullewis.jpg b/src/images/authors/paullewis.jpg
deleted file mode 100644
index 31bc43ae333..00000000000
Binary files a/src/images/authors/paullewis.jpg and /dev/null differ
diff --git a/src/images/authors/paullewis@2x.jpg b/src/images/authors/paullewis@2x.jpg
deleted file mode 100644
index 0327e60e96e..00000000000
Binary files a/src/images/authors/paullewis@2x.jpg and /dev/null differ
diff --git a/src/images/authors/pbakaus.jpg b/src/images/authors/pbakaus.jpg
deleted file mode 100644
index 53345e5537a..00000000000
Binary files a/src/images/authors/pbakaus.jpg and /dev/null differ
diff --git a/src/images/authors/pbakaus@2x.jpg b/src/images/authors/pbakaus@2x.jpg
deleted file mode 100644
index 7ad523de945..00000000000
Binary files a/src/images/authors/pbakaus@2x.jpg and /dev/null differ
diff --git a/src/images/authors/petelepage.jpg b/src/images/authors/petelepage.jpg
deleted file mode 100644
index ff37ffa29e9..00000000000
Binary files a/src/images/authors/petelepage.jpg and /dev/null differ
diff --git a/src/images/authors/petelepage@2x.jpg b/src/images/authors/petelepage@2x.jpg
deleted file mode 100644
index 3fdb5ae298b..00000000000
Binary files a/src/images/authors/petelepage@2x.jpg and /dev/null differ
diff --git a/src/images/authors/philipwalton.jpg b/src/images/authors/philipwalton.jpg
deleted file mode 100644
index 7481f481e0d..00000000000
Binary files a/src/images/authors/philipwalton.jpg and /dev/null differ
diff --git a/src/images/authors/philipwalton@2x.jpg b/src/images/authors/philipwalton@2x.jpg
deleted file mode 100644
index 450a847c3d1..00000000000
Binary files a/src/images/authors/philipwalton@2x.jpg and /dev/null differ
diff --git a/src/images/authors/phillipkriegel.jpg b/src/images/authors/phillipkriegel.jpg
deleted file mode 100644
index c900525e3b2..00000000000
Binary files a/src/images/authors/phillipkriegel.jpg and /dev/null differ
diff --git a/src/images/authors/pjmclachlan.jpg b/src/images/authors/pjmclachlan.jpg
deleted file mode 100644
index 3b1a4152856..00000000000
Binary files a/src/images/authors/pjmclachlan.jpg and /dev/null differ
diff --git a/src/images/authors/pjmclachlan@2x.jpg b/src/images/authors/pjmclachlan@2x.jpg
deleted file mode 100644
index 1b0ae2a44eb..00000000000
Binary files a/src/images/authors/pjmclachlan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/plegner.jpg b/src/images/authors/plegner.jpg
deleted file mode 100644
index 4081e7a6059..00000000000
Binary files a/src/images/authors/plegner.jpg and /dev/null differ
diff --git a/src/images/authors/plegner@2x.jpg b/src/images/authors/plegner@2x.jpg
deleted file mode 100644
index 63c85c38f00..00000000000
Binary files a/src/images/authors/plegner@2x.jpg and /dev/null differ
diff --git a/src/images/authors/pozdnyakov.jpg b/src/images/authors/pozdnyakov.jpg
deleted file mode 100644
index ad78a057d08..00000000000
Binary files a/src/images/authors/pozdnyakov.jpg and /dev/null differ
diff --git a/src/images/authors/pozdnyakov@2x.jpg b/src/images/authors/pozdnyakov@2x.jpg
deleted file mode 100644
index 88734947e2f..00000000000
Binary files a/src/images/authors/pozdnyakov@2x.jpg and /dev/null differ
diff --git a/src/images/authors/rachelandrew.jpg b/src/images/authors/rachelandrew.jpg
deleted file mode 100644
index b107b33b763..00000000000
Binary files a/src/images/authors/rachelandrew.jpg and /dev/null differ
diff --git a/src/images/authors/rachelandrew@2x.jpg b/src/images/authors/rachelandrew@2x.jpg
deleted file mode 100644
index 3dfe14c3b64..00000000000
Binary files a/src/images/authors/rachelandrew@2x.jpg and /dev/null differ
diff --git a/src/images/authors/renatomangini.jpg b/src/images/authors/renatomangini.jpg
deleted file mode 100644
index fce5dfcc2b8..00000000000
Binary files a/src/images/authors/renatomangini.jpg and /dev/null differ
diff --git a/src/images/authors/renatomangini@2x.jpg b/src/images/authors/renatomangini@2x.jpg
deleted file mode 100644
index 1ff4f0f79d2..00000000000
Binary files a/src/images/authors/renatomangini@2x.jpg and /dev/null differ
diff --git a/src/images/authors/rkochman.jpg b/src/images/authors/rkochman.jpg
deleted file mode 100644
index 9d1061e9530..00000000000
Binary files a/src/images/authors/rkochman.jpg and /dev/null differ
diff --git a/src/images/authors/rkochman@2x.jpg b/src/images/authors/rkochman@2x.jpg
deleted file mode 100644
index 24420e4c756..00000000000
Binary files a/src/images/authors/rkochman@2x.jpg and /dev/null differ
diff --git a/src/images/authors/robdodson.jpg b/src/images/authors/robdodson.jpg
deleted file mode 100644
index 1d677e076db..00000000000
Binary files a/src/images/authors/robdodson.jpg and /dev/null differ
diff --git a/src/images/authors/robdodson@2x.jpg b/src/images/authors/robdodson@2x.jpg
deleted file mode 100644
index dd8c9f3a3dc..00000000000
Binary files a/src/images/authors/robdodson@2x.jpg and /dev/null differ
diff --git a/src/images/authors/robertnyman.jpg b/src/images/authors/robertnyman.jpg
deleted file mode 100644
index eaa8db0dacb..00000000000
Binary files a/src/images/authors/robertnyman.jpg and /dev/null differ
diff --git a/src/images/authors/robertnyman@2x.jpg b/src/images/authors/robertnyman@2x.jpg
deleted file mode 100644
index c95eb12cf09..00000000000
Binary files a/src/images/authors/robertnyman@2x.jpg and /dev/null differ
diff --git a/src/images/authors/robhazan.jpg b/src/images/authors/robhazan.jpg
deleted file mode 100644
index 8518c8a8766..00000000000
Binary files a/src/images/authors/robhazan.jpg and /dev/null differ
diff --git a/src/images/authors/robhazan@2x.jpg b/src/images/authors/robhazan@2x.jpg
deleted file mode 100644
index d8edcd3c2e3..00000000000
Binary files a/src/images/authors/robhazan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/rowan_m.jpg b/src/images/authors/rowan_m.jpg
deleted file mode 100644
index 6dd90c09e8c..00000000000
Binary files a/src/images/authors/rowan_m.jpg and /dev/null differ
diff --git a/src/images/authors/rowan_m@2x.jpg b/src/images/authors/rowan_m@2x.jpg
deleted file mode 100644
index 7b226e2b8f0..00000000000
Binary files a/src/images/authors/rowan_m@2x.jpg and /dev/null differ
diff --git a/src/images/authors/rsolomakhin.jpg b/src/images/authors/rsolomakhin.jpg
deleted file mode 100644
index d5fe6ce736b..00000000000
Binary files a/src/images/authors/rsolomakhin.jpg and /dev/null differ
diff --git a/src/images/authors/rsolomakhin@2x.jpg b/src/images/authors/rsolomakhin@2x.jpg
deleted file mode 100644
index 2d58e781b95..00000000000
Binary files a/src/images/authors/rsolomakhin@2x.jpg and /dev/null differ
diff --git a/src/images/authors/rviscomi.jpg b/src/images/authors/rviscomi.jpg
deleted file mode 100644
index 8a423c6c822..00000000000
Binary files a/src/images/authors/rviscomi.jpg and /dev/null differ
diff --git a/src/images/authors/rviscomi@2x.jpg b/src/images/authors/rviscomi@2x.jpg
deleted file mode 100644
index 8c9c352e8da..00000000000
Binary files a/src/images/authors/rviscomi@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sahel.jpg b/src/images/authors/sahel.jpg
deleted file mode 100644
index e72ff99ffbe..00000000000
Binary files a/src/images/authors/sahel.jpg and /dev/null differ
diff --git a/src/images/authors/sahel@2x.jpg b/src/images/authors/sahel@2x.jpg
deleted file mode 100644
index 57925d8dbe9..00000000000
Binary files a/src/images/authors/sahel@2x.jpg and /dev/null differ
diff --git a/src/images/authors/samchen.jpg b/src/images/authors/samchen.jpg
deleted file mode 100644
index b8bf455260b..00000000000
Binary files a/src/images/authors/samchen.jpg and /dev/null differ
diff --git a/src/images/authors/samchen@2x.jpg b/src/images/authors/samchen@2x.jpg
deleted file mode 100644
index b5322dfa6d3..00000000000
Binary files a/src/images/authors/samchen@2x.jpg and /dev/null differ
diff --git a/src/images/authors/samdutton.jpg b/src/images/authors/samdutton.jpg
deleted file mode 100644
index 9f1642c861f..00000000000
Binary files a/src/images/authors/samdutton.jpg and /dev/null differ
diff --git a/src/images/authors/samdutton@2x.jpg b/src/images/authors/samdutton@2x.jpg
deleted file mode 100644
index a03e7749a5a..00000000000
Binary files a/src/images/authors/samdutton@2x.jpg and /dev/null differ
diff --git a/src/images/authors/samrichard.jpg b/src/images/authors/samrichard.jpg
deleted file mode 100644
index 98dcb7e2186..00000000000
Binary files a/src/images/authors/samrichard.jpg and /dev/null differ
diff --git a/src/images/authors/samrichard@2x.jpg b/src/images/authors/samrichard@2x.jpg
deleted file mode 100644
index 0587230ea0f..00000000000
Binary files a/src/images/authors/samrichard@2x.jpg and /dev/null differ
diff --git a/src/images/authors/samthor.jpg b/src/images/authors/samthor.jpg
deleted file mode 100644
index e02a2da137e..00000000000
Binary files a/src/images/authors/samthor.jpg and /dev/null differ
diff --git a/src/images/authors/samthor@2x.jpg b/src/images/authors/samthor@2x.jpg
deleted file mode 100644
index 8048fa08013..00000000000
Binary files a/src/images/authors/samthor@2x.jpg and /dev/null differ
diff --git a/src/images/authors/satoshi_arai.jpg b/src/images/authors/satoshi_arai.jpg
deleted file mode 100644
index 2df4621983b..00000000000
Binary files a/src/images/authors/satoshi_arai.jpg and /dev/null differ
diff --git a/src/images/authors/satoshi_arai@2x.jpg b/src/images/authors/satoshi_arai@2x.jpg
deleted file mode 100644
index 1b9781edfc3..00000000000
Binary files a/src/images/authors/satoshi_arai@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sebabenz.jpg b/src/images/authors/sebabenz.jpg
deleted file mode 100644
index 4a476e89dfb..00000000000
Binary files a/src/images/authors/sebabenz.jpg and /dev/null differ
diff --git a/src/images/authors/sebabenz@2x.jpg b/src/images/authors/sebabenz@2x.jpg
deleted file mode 100644
index 60364b0bcb6..00000000000
Binary files a/src/images/authors/sebabenz@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sethladd.jpg b/src/images/authors/sethladd.jpg
deleted file mode 100644
index 9ffeadc9270..00000000000
Binary files a/src/images/authors/sethladd.jpg and /dev/null differ
diff --git a/src/images/authors/sethladd@2x.jpg b/src/images/authors/sethladd@2x.jpg
deleted file mode 100644
index 0cf06a51540..00000000000
Binary files a/src/images/authors/sethladd@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sfluin.jpg b/src/images/authors/sfluin.jpg
deleted file mode 100644
index 3b40b0af50b..00000000000
Binary files a/src/images/authors/sfluin.jpg and /dev/null differ
diff --git a/src/images/authors/sfluin@2x.jpg b/src/images/authors/sfluin@2x.jpg
deleted file mode 100644
index 16177d18a6d..00000000000
Binary files a/src/images/authors/sfluin@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sfourault.jpg b/src/images/authors/sfourault.jpg
deleted file mode 100644
index 398304ba321..00000000000
Binary files a/src/images/authors/sfourault.jpg and /dev/null differ
diff --git a/src/images/authors/sfourault@2x.jpg b/src/images/authors/sfourault@2x.jpg
deleted file mode 100644
index 70ae6cad51b..00000000000
Binary files a/src/images/authors/sfourault@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sgomes.jpg b/src/images/authors/sgomes.jpg
deleted file mode 100644
index f9210d97b02..00000000000
Binary files a/src/images/authors/sgomes.jpg and /dev/null differ
diff --git a/src/images/authors/sgomes@2x.jpg b/src/images/authors/sgomes@2x.jpg
deleted file mode 100644
index 2f127d31803..00000000000
Binary files a/src/images/authors/sgomes@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sherwinski.jpg b/src/images/authors/sherwinski.jpg
deleted file mode 100644
index 6ea3b1de3d4..00000000000
Binary files a/src/images/authors/sherwinski.jpg and /dev/null differ
diff --git a/src/images/authors/sherwinski@2x.jpg b/src/images/authors/sherwinski@2x.jpg
deleted file mode 100644
index 13ec1824288..00000000000
Binary files a/src/images/authors/sherwinski@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sieke.jpg b/src/images/authors/sieke.jpg
deleted file mode 100644
index 259956371d3..00000000000
Binary files a/src/images/authors/sieke.jpg and /dev/null differ
diff --git a/src/images/authors/sieke@2x.jpg b/src/images/authors/sieke@2x.jpg
deleted file mode 100644
index fd4f3f7ab32..00000000000
Binary files a/src/images/authors/sieke@2x.jpg and /dev/null differ
diff --git a/src/images/authors/sunyunjia.jpg b/src/images/authors/sunyunjia.jpg
deleted file mode 100644
index 00b00a12d2b..00000000000
Binary files a/src/images/authors/sunyunjia.jpg and /dev/null differ
diff --git a/src/images/authors/sunyunjia@2x.jpg b/src/images/authors/sunyunjia@2x.jpg
deleted file mode 100644
index 51b6772816f..00000000000
Binary files a/src/images/authors/sunyunjia@2x.jpg and /dev/null differ
diff --git a/src/images/authors/surma.jpg b/src/images/authors/surma.jpg
deleted file mode 100644
index 4b8fe54b5ed..00000000000
Binary files a/src/images/authors/surma.jpg and /dev/null differ
diff --git a/src/images/authors/surma@2x.jpg b/src/images/authors/surma@2x.jpg
deleted file mode 100644
index 28a04951797..00000000000
Binary files a/src/images/authors/surma@2x.jpg and /dev/null differ
diff --git a/src/images/authors/swengineer.jpg b/src/images/authors/swengineer.jpg
deleted file mode 100644
index b11444a3f4f..00000000000
Binary files a/src/images/authors/swengineer.jpg and /dev/null differ
diff --git a/src/images/authors/swengineer@2x.jpg b/src/images/authors/swengineer@2x.jpg
deleted file mode 100644
index 0586cfeaeff..00000000000
Binary files a/src/images/authors/swengineer@2x.jpg and /dev/null differ
diff --git a/src/images/authors/syg.jpg b/src/images/authors/syg.jpg
deleted file mode 100644
index deb769e7bcc..00000000000
Binary files a/src/images/authors/syg.jpg and /dev/null differ
diff --git a/src/images/authors/syg@2x.jpg b/src/images/authors/syg@2x.jpg
deleted file mode 100644
index abe2c27ba2b..00000000000
Binary files a/src/images/authors/syg@2x.jpg and /dev/null differ
diff --git a/src/images/authors/taylorsavage.jpg b/src/images/authors/taylorsavage.jpg
deleted file mode 100644
index ae6f318d257..00000000000
Binary files a/src/images/authors/taylorsavage.jpg and /dev/null differ
diff --git a/src/images/authors/taylorsavage@2x.jpg b/src/images/authors/taylorsavage@2x.jpg
deleted file mode 100644
index 27c43e61c8d..00000000000
Binary files a/src/images/authors/taylorsavage@2x.jpg and /dev/null differ
diff --git a/src/images/authors/tcmg.jpg b/src/images/authors/tcmg.jpg
deleted file mode 100644
index 26f95e27d45..00000000000
Binary files a/src/images/authors/tcmg.jpg and /dev/null differ
diff --git a/src/images/authors/tcmg@2x.jpg b/src/images/authors/tcmg@2x.jpg
deleted file mode 100644
index e19baa0790b..00000000000
Binary files a/src/images/authors/tcmg@2x.jpg and /dev/null differ
diff --git a/src/images/authors/tdresser.jpg b/src/images/authors/tdresser.jpg
deleted file mode 100644
index 5e1f2e58980..00000000000
Binary files a/src/images/authors/tdresser.jpg and /dev/null differ
diff --git a/src/images/authors/tdresser@2x.jpg b/src/images/authors/tdresser@2x.jpg
deleted file mode 100644
index 0b9d4f9cb46..00000000000
Binary files a/src/images/authors/tdresser@2x.jpg and /dev/null differ
diff --git a/src/images/authors/thebengeu.jpg b/src/images/authors/thebengeu.jpg
deleted file mode 100644
index e40f10debbd..00000000000
Binary files a/src/images/authors/thebengeu.jpg and /dev/null differ
diff --git a/src/images/authors/thebengeu@2x.jpg b/src/images/authors/thebengeu@2x.jpg
deleted file mode 100644
index c1c5e2f31eb..00000000000
Binary files a/src/images/authors/thebengeu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/thomassteiner.jpg b/src/images/authors/thomassteiner.jpg
deleted file mode 100644
index 6094dab9b3e..00000000000
Binary files a/src/images/authors/thomassteiner.jpg and /dev/null differ
diff --git a/src/images/authors/thomassteiner@2x.jpg b/src/images/authors/thomassteiner@2x.jpg
deleted file mode 100644
index 8a5736ca675..00000000000
Binary files a/src/images/authors/thomassteiner@2x.jpg and /dev/null differ
diff --git a/src/images/authors/tigeroakes.jpg b/src/images/authors/tigeroakes.jpg
deleted file mode 100644
index 6dbc4be75ff..00000000000
Binary files a/src/images/authors/tigeroakes.jpg and /dev/null differ
diff --git a/src/images/authors/tigeroakes@2x.jpg b/src/images/authors/tigeroakes@2x.jpg
deleted file mode 100644
index 96508d3704f..00000000000
Binary files a/src/images/authors/tigeroakes@2x.jpg and /dev/null differ
diff --git a/src/images/authors/tomgreenaway.jpg b/src/images/authors/tomgreenaway.jpg
deleted file mode 100644
index a943f8be45b..00000000000
Binary files a/src/images/authors/tomgreenaway.jpg and /dev/null differ
diff --git a/src/images/authors/tomgreenaway@2x.jpg b/src/images/authors/tomgreenaway@2x.jpg
deleted file mode 100644
index 7233bedf77f..00000000000
Binary files a/src/images/authors/tomgreenaway@2x.jpg and /dev/null differ
diff --git a/src/images/authors/tomwiltzius.jpg b/src/images/authors/tomwiltzius.jpg
deleted file mode 100644
index dabc3a4882a..00000000000
Binary files a/src/images/authors/tomwiltzius.jpg and /dev/null differ
diff --git a/src/images/authors/tomwiltzius@2x.jpg b/src/images/authors/tomwiltzius@2x.jpg
deleted file mode 100644
index 2251a380a70..00000000000
Binary files a/src/images/authors/tomwiltzius@2x.jpg and /dev/null differ
diff --git a/src/images/authors/ulan.jpg b/src/images/authors/ulan.jpg
deleted file mode 100644
index 29fb4342ed7..00000000000
Binary files a/src/images/authors/ulan.jpg and /dev/null differ
diff --git a/src/images/authors/ulan@2x.jpg b/src/images/authors/ulan@2x.jpg
deleted file mode 100644
index e519889aca0..00000000000
Binary files a/src/images/authors/ulan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/umarhansa.jpg b/src/images/authors/umarhansa.jpg
deleted file mode 100644
index 3eba9ac01f4..00000000000
Binary files a/src/images/authors/umarhansa.jpg and /dev/null differ
diff --git a/src/images/authors/umarhansa@2x.jpg b/src/images/authors/umarhansa@2x.jpg
deleted file mode 100644
index 37545fb6dc4..00000000000
Binary files a/src/images/authors/umarhansa@2x.jpg and /dev/null differ
diff --git a/src/images/authors/una.jpg b/src/images/authors/una.jpg
deleted file mode 100644
index c2c1e602e37..00000000000
Binary files a/src/images/authors/una.jpg and /dev/null differ
diff --git a/src/images/authors/una@2x.jpg b/src/images/authors/una@2x.jpg
deleted file mode 100644
index 2ca3b6a5288..00000000000
Binary files a/src/images/authors/una@2x.jpg and /dev/null differ
diff --git a/src/images/authors/uskay.jpg b/src/images/authors/uskay.jpg
deleted file mode 100644
index 0ace6c5218f..00000000000
Binary files a/src/images/authors/uskay.jpg and /dev/null differ
diff --git a/src/images/authors/uskay@2x.jpg b/src/images/authors/uskay@2x.jpg
deleted file mode 100644
index c047575dbbb..00000000000
Binary files a/src/images/authors/uskay@2x.jpg and /dev/null differ
diff --git a/src/images/authors/victorcostan.jpg b/src/images/authors/victorcostan.jpg
deleted file mode 100644
index 64afdc5ade8..00000000000
Binary files a/src/images/authors/victorcostan.jpg and /dev/null differ
diff --git a/src/images/authors/victorcostan@2x.jpg b/src/images/authors/victorcostan@2x.jpg
deleted file mode 100644
index 5321213a43c..00000000000
Binary files a/src/images/authors/victorcostan@2x.jpg and /dev/null differ
diff --git a/src/images/authors/vinamratasingal.jpg b/src/images/authors/vinamratasingal.jpg
deleted file mode 100644
index efbd28b9a1d..00000000000
Binary files a/src/images/authors/vinamratasingal.jpg and /dev/null differ
diff --git a/src/images/authors/vinamratasingal@2x.jpg b/src/images/authors/vinamratasingal@2x.jpg
deleted file mode 100644
index 8f168fb584f..00000000000
Binary files a/src/images/authors/vinamratasingal@2x.jpg and /dev/null differ
diff --git a/src/images/authors/vladimirlevin.jpg b/src/images/authors/vladimirlevin.jpg
deleted file mode 100644
index 610d7afec8d..00000000000
Binary files a/src/images/authors/vladimirlevin.jpg and /dev/null differ
diff --git a/src/images/authors/vladimirlevin@2x.jpg b/src/images/authors/vladimirlevin@2x.jpg
deleted file mode 100644
index abb29a2bad1..00000000000
Binary files a/src/images/authors/vladimirlevin@2x.jpg and /dev/null differ
diff --git a/src/images/authors/wangyu.jpg b/src/images/authors/wangyu.jpg
deleted file mode 100644
index f93150046a4..00000000000
Binary files a/src/images/authors/wangyu.jpg and /dev/null differ
diff --git a/src/images/authors/wangyu@2x.jpg b/src/images/authors/wangyu@2x.jpg
deleted file mode 100644
index 4a7b1a95850..00000000000
Binary files a/src/images/authors/wangyu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/wayouliu.jpg b/src/images/authors/wayouliu.jpg
deleted file mode 100644
index dc9eb72df4f..00000000000
Binary files a/src/images/authors/wayouliu.jpg and /dev/null differ
diff --git a/src/images/authors/wayouliu@2x.jpg b/src/images/authors/wayouliu@2x.jpg
deleted file mode 100644
index 03f8c081004..00000000000
Binary files a/src/images/authors/wayouliu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/wdenniss.jpg b/src/images/authors/wdenniss.jpg
deleted file mode 100644
index 73ff8a31fcb..00000000000
Binary files a/src/images/authors/wdenniss.jpg and /dev/null differ
diff --git a/src/images/authors/wdenniss@2x.jpg b/src/images/authors/wdenniss@2x.jpg
deleted file mode 100644
index 989a089c39d..00000000000
Binary files a/src/images/authors/wdenniss@2x.jpg and /dev/null differ
diff --git a/src/images/authors/yaraki.jpg b/src/images/authors/yaraki.jpg
deleted file mode 100644
index 29944b31912..00000000000
Binary files a/src/images/authors/yaraki.jpg and /dev/null differ
diff --git a/src/images/authors/yaraki@2x.jpg b/src/images/authors/yaraki@2x.jpg
deleted file mode 100644
index 0248a0c5fd0..00000000000
Binary files a/src/images/authors/yaraki@2x.jpg and /dev/null differ
diff --git a/src/images/authors/yigu.jpg b/src/images/authors/yigu.jpg
deleted file mode 100644
index 232d86c5cec..00000000000
Binary files a/src/images/authors/yigu.jpg and /dev/null differ
diff --git a/src/images/authors/yigu@2x.jpg b/src/images/authors/yigu@2x.jpg
deleted file mode 100644
index 5df2dabbad5..00000000000
Binary files a/src/images/authors/yigu@2x.jpg and /dev/null differ
diff --git a/src/images/authors/yoavweiss.jpg b/src/images/authors/yoavweiss.jpg
deleted file mode 100644
index 1b970110a9f..00000000000
Binary files a/src/images/authors/yoavweiss.jpg and /dev/null differ
diff --git a/src/images/authors/yoavweiss@2x.jpg b/src/images/authors/yoavweiss@2x.jpg
deleted file mode 100644
index 50768acb199..00000000000
Binary files a/src/images/authors/yoavweiss@2x.jpg and /dev/null differ
diff --git a/src/images/authors/yoichiro.jpg b/src/images/authors/yoichiro.jpg
deleted file mode 100644
index c50b2e7ae13..00000000000
Binary files a/src/images/authors/yoichiro.jpg and /dev/null differ
diff --git a/src/images/authors/yoichiro@2x.jpg b/src/images/authors/yoichiro@2x.jpg
deleted file mode 100644
index eb9bcd05f7e..00000000000
Binary files a/src/images/authors/yoichiro@2x.jpg and /dev/null differ
diff --git a/src/images/authors/yosuke_furukawa.jpg b/src/images/authors/yosuke_furukawa.jpg
deleted file mode 100644
index 20217831683..00000000000
Binary files a/src/images/authors/yosuke_furukawa.jpg and /dev/null differ
diff --git a/src/images/authors/yosuke_furukawa@2x.jpg b/src/images/authors/yosuke_furukawa@2x.jpg
deleted file mode 100644
index 772c159e231..00000000000
Binary files a/src/images/authors/yosuke_furukawa@2x.jpg and /dev/null differ
diff --git a/src/images/authors/yvoschaap.jpg b/src/images/authors/yvoschaap.jpg
deleted file mode 100644
index edc292d4e70..00000000000
Binary files a/src/images/authors/yvoschaap.jpg and /dev/null differ
diff --git a/src/images/authors/yvoschaap@2x.jpg b/src/images/authors/yvoschaap@2x.jpg
deleted file mode 100644
index 4487835b3fd..00000000000
Binary files a/src/images/authors/yvoschaap@2x.jpg and /dev/null differ
diff --git a/src/images/authors/zkoch.jpg b/src/images/authors/zkoch.jpg
deleted file mode 100644
index b0a6a2b90fb..00000000000
Binary files a/src/images/authors/zkoch.jpg and /dev/null differ
diff --git a/src/images/authors/zkoch@2x.jpg b/src/images/authors/zkoch@2x.jpg
deleted file mode 100644
index a31cd9c4f12..00000000000
Binary files a/src/images/authors/zkoch@2x.jpg and /dev/null differ
diff --git a/src/images/collections/animations.svg b/src/images/collections/animations.svg
new file mode 100644
index 00000000000..e2249f226a3
--- /dev/null
+++ b/src/images/collections/animations.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/collections/devices.svg b/src/images/collections/devices.svg
new file mode 100644
index 00000000000..841c33cc5e3
--- /dev/null
+++ b/src/images/collections/devices.svg
@@ -0,0 +1,44 @@
+
+
diff --git a/src/images/collections/identity.svg b/src/images/collections/identity.svg
new file mode 100644
index 00000000000..ec7a31daf55
--- /dev/null
+++ b/src/images/collections/identity.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/collections/lighthouse-accessibility.svg b/src/images/collections/lighthouse-accessibility.svg
deleted file mode 100644
index a5700f1aa35..00000000000
--- a/src/images/collections/lighthouse-accessibility.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/images/collections/lighthouse-best-practices.svg b/src/images/collections/lighthouse-best-practices.svg
deleted file mode 100644
index 6616c23784b..00000000000
--- a/src/images/collections/lighthouse-best-practices.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/images/collections/lighthouse-performance.svg b/src/images/collections/lighthouse-performance.svg
deleted file mode 100644
index 519e9e310bc..00000000000
--- a/src/images/collections/lighthouse-performance.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/images/collections/lighthouse-pwa.svg b/src/images/collections/lighthouse-pwa.svg
deleted file mode 100644
index 7172ff462d6..00000000000
--- a/src/images/collections/lighthouse-pwa.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/images/collections/lighthouse-seo.svg b/src/images/collections/lighthouse-seo.svg
deleted file mode 100644
index 745e0db6659..00000000000
--- a/src/images/collections/lighthouse-seo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/images/collections/media.svg b/src/images/collections/media.svg
new file mode 100644
index 00000000000..0dc237b9cfe
--- /dev/null
+++ b/src/images/collections/media.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/collections/mini-apps.svg b/src/images/collections/mini-apps.svg
new file mode 100644
index 00000000000..5c970032696
--- /dev/null
+++ b/src/images/collections/mini-apps.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/site/content/en/vitals/web-vitals.svg b/src/images/collections/web-vitals.svg
similarity index 100%
rename from src/site/content/en/vitals/web-vitals.svg
rename to src/images/collections/web-vitals.svg
diff --git a/src/images/courses/accessibility/background.svg b/src/images/courses/accessibility/background.svg
new file mode 100644
index 00000000000..a3597190ee4
--- /dev/null
+++ b/src/images/courses/accessibility/background.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/images/courses/accessibility/card.svg b/src/images/courses/accessibility/card.svg
new file mode 100644
index 00000000000..2131ffc0d59
--- /dev/null
+++ b/src/images/courses/accessibility/card.svg
@@ -0,0 +1,36 @@
+
diff --git a/src/images/courses/accessibility/logo.svg b/src/images/courses/accessibility/logo.svg
new file mode 100644
index 00000000000..2287313bb1a
--- /dev/null
+++ b/src/images/courses/accessibility/logo.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/images/courses/css/background.svg b/src/images/courses/css/background.svg
new file mode 100644
index 00000000000..696c66bd3ae
--- /dev/null
+++ b/src/images/courses/css/background.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/courses/css/card-decor.svg b/src/images/courses/css/card-decor.svg
new file mode 100644
index 00000000000..4fc55fbda7d
--- /dev/null
+++ b/src/images/courses/css/card-decor.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/images/courses/css/card.svg b/src/images/courses/css/card.svg
new file mode 100644
index 00000000000..cb970a679de
--- /dev/null
+++ b/src/images/courses/css/card.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/courses/css/logo.svg b/src/images/courses/css/logo.svg
new file mode 100644
index 00000000000..d01bd34d97e
--- /dev/null
+++ b/src/images/courses/css/logo.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/courses/design/background.svg b/src/images/courses/design/background.svg
new file mode 100644
index 00000000000..c4e040b101e
--- /dev/null
+++ b/src/images/courses/design/background.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/images/courses/design/card-decor.svg b/src/images/courses/design/card-decor.svg
new file mode 100644
index 00000000000..d164c817f24
--- /dev/null
+++ b/src/images/courses/design/card-decor.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/courses/design/card.svg b/src/images/courses/design/card.svg
new file mode 100644
index 00000000000..1df3c74d02e
--- /dev/null
+++ b/src/images/courses/design/card.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/courses/design/logo.svg b/src/images/courses/design/logo.svg
new file mode 100644
index 00000000000..7ced69bc4cd
--- /dev/null
+++ b/src/images/courses/design/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/courses/example/background.svg b/src/images/courses/example/background.svg
new file mode 100644
index 00000000000..a3597190ee4
--- /dev/null
+++ b/src/images/courses/example/background.svg
@@ -0,0 +1,20 @@
+
diff --git a/src/images/courses/example/card.svg b/src/images/courses/example/card.svg
new file mode 100644
index 00000000000..2131ffc0d59
--- /dev/null
+++ b/src/images/courses/example/card.svg
@@ -0,0 +1,36 @@
+
diff --git a/src/images/courses/example/logo.svg b/src/images/courses/example/logo.svg
new file mode 100644
index 00000000000..2287313bb1a
--- /dev/null
+++ b/src/images/courses/example/logo.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/images/courses/forms/background.svg b/src/images/courses/forms/background.svg
new file mode 100644
index 00000000000..d62b91cdc34
--- /dev/null
+++ b/src/images/courses/forms/background.svg
@@ -0,0 +1,44 @@
+
diff --git a/src/images/courses/forms/card-decor.svg b/src/images/courses/forms/card-decor.svg
new file mode 100644
index 00000000000..da026f545b2
--- /dev/null
+++ b/src/images/courses/forms/card-decor.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/courses/forms/card.svg b/src/images/courses/forms/card.svg
new file mode 100644
index 00000000000..a86592397b7
--- /dev/null
+++ b/src/images/courses/forms/card.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/courses/forms/logo.svg b/src/images/courses/forms/logo.svg
new file mode 100644
index 00000000000..56a7cc5cb43
--- /dev/null
+++ b/src/images/courses/forms/logo.svg
@@ -0,0 +1,51 @@
+
diff --git a/src/images/courses/html/background.svg b/src/images/courses/html/background.svg
new file mode 100755
index 00000000000..f0e6fe13be9
--- /dev/null
+++ b/src/images/courses/html/background.svg
@@ -0,0 +1,23 @@
+
diff --git a/src/images/courses/html/card-decor.svg b/src/images/courses/html/card-decor.svg
new file mode 100644
index 00000000000..d164c817f24
--- /dev/null
+++ b/src/images/courses/html/card-decor.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/courses/html/card.svg b/src/images/courses/html/card.svg
new file mode 100755
index 00000000000..ab6fb5077ed
--- /dev/null
+++ b/src/images/courses/html/card.svg
@@ -0,0 +1,44 @@
+
diff --git a/src/images/courses/html/logo.svg b/src/images/courses/html/logo.svg
new file mode 100755
index 00000000000..f064db6f0cc
--- /dev/null
+++ b/src/images/courses/html/logo.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/images/courses/images/background.svg b/src/images/courses/images/background.svg
new file mode 100755
index 00000000000..95f93c80881
--- /dev/null
+++ b/src/images/courses/images/background.svg
@@ -0,0 +1,52 @@
+
diff --git a/src/images/courses/images/card-decor.png b/src/images/courses/images/card-decor.png
new file mode 100755
index 00000000000..5c78ba3e9f2
Binary files /dev/null and b/src/images/courses/images/card-decor.png differ
diff --git a/src/images/courses/images/card.svg b/src/images/courses/images/card.svg
new file mode 100755
index 00000000000..42b262f0911
--- /dev/null
+++ b/src/images/courses/images/card.svg
@@ -0,0 +1,84 @@
+
diff --git a/src/images/courses/images/logo.svg b/src/images/courses/images/logo.svg
new file mode 100755
index 00000000000..cacadbab96a
--- /dev/null
+++ b/src/images/courses/images/logo.svg
@@ -0,0 +1,18 @@
+
diff --git a/src/images/courses/privacy/background.svg b/src/images/courses/privacy/background.svg
new file mode 100644
index 00000000000..4446612f667
--- /dev/null
+++ b/src/images/courses/privacy/background.svg
@@ -0,0 +1,22 @@
+
diff --git a/src/images/courses/privacy/card.svg b/src/images/courses/privacy/card.svg
new file mode 100644
index 00000000000..9e78237703c
--- /dev/null
+++ b/src/images/courses/privacy/card.svg
@@ -0,0 +1,83 @@
+
diff --git a/src/images/courses/privacy/logo.svg b/src/images/courses/privacy/logo.svg
new file mode 100644
index 00000000000..8f2a4c6626c
--- /dev/null
+++ b/src/images/courses/privacy/logo.svg
@@ -0,0 +1,65 @@
+
diff --git a/src/images/courses/pwa/background.svg b/src/images/courses/pwa/background.svg
new file mode 100644
index 00000000000..345d698beac
--- /dev/null
+++ b/src/images/courses/pwa/background.svg
@@ -0,0 +1,39 @@
+
diff --git a/src/images/courses/pwa/card-decor.svg b/src/images/courses/pwa/card-decor.svg
new file mode 100644
index 00000000000..4fc55fbda7d
--- /dev/null
+++ b/src/images/courses/pwa/card-decor.svg
@@ -0,0 +1,13 @@
+
diff --git a/src/images/courses/pwa/card.svg b/src/images/courses/pwa/card.svg
new file mode 100644
index 00000000000..2d00c7bfecd
--- /dev/null
+++ b/src/images/courses/pwa/card.svg
@@ -0,0 +1,66 @@
+
\ No newline at end of file
diff --git a/src/images/courses/pwa/logo.svg b/src/images/courses/pwa/logo.svg
new file mode 100644
index 00000000000..ed2b2d86e5a
--- /dev/null
+++ b/src/images/courses/pwa/logo.svg
@@ -0,0 +1,37 @@
+
diff --git a/src/images/favicon-16x16.png b/src/images/favicon-16x16.png
index d6b8b00ee7a..040818085b5 100644
Binary files a/src/images/favicon-16x16.png and b/src/images/favicon-16x16.png differ
diff --git a/src/images/favicon-32x32.png b/src/images/favicon-32x32.png
index bbe4d54f14d..022415f24b7 100644
Binary files a/src/images/favicon-32x32.png and b/src/images/favicon-32x32.png differ
diff --git a/src/images/favicon.ico b/src/images/favicon.ico
index a92064bf9ce..14e9e4396df 100644
Binary files a/src/images/favicon.ico and b/src/images/favicon.ico differ
diff --git a/src/images/feature-cards/design-in-the-browser.jpg b/src/images/feature-cards/design-in-the-browser.jpg
new file mode 100644
index 00000000000..a134c678129
Binary files /dev/null and b/src/images/feature-cards/design-in-the-browser.jpg differ
diff --git a/src/images/feature-cards/web-vitals-feature.png b/src/images/feature-cards/web-vitals-feature.png
new file mode 100644
index 00000000000..48b4b8cea4d
Binary files /dev/null and b/src/images/feature-cards/web-vitals-feature.png differ
diff --git a/src/images/icons/a11y.svg b/src/images/icons/a11y.svg
index 3997dd252cb..514a8d49fdd 100644
--- a/src/images/icons/a11y.svg
+++ b/src/images/icons/a11y.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/calendar.svg b/src/images/icons/calendar.svg
index 310ad10d5b4..3000b4b8975 100644
--- a/src/images/icons/calendar.svg
+++ b/src/images/icons/calendar.svg
@@ -1,4 +1 @@
-
+
diff --git a/src/images/icons/chrome.svg b/src/images/icons/chrome.svg
new file mode 100644
index 00000000000..2b90ad3de63
--- /dev/null
+++ b/src/images/icons/chrome.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/icons/done.svg b/src/images/icons/done.svg
new file mode 100644
index 00000000000..7d22cf956c4
--- /dev/null
+++ b/src/images/icons/done.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/icons/edge.svg b/src/images/icons/edge.svg
new file mode 100644
index 00000000000..f986f0899f4
--- /dev/null
+++ b/src/images/icons/edge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/icons/firefox.svg b/src/images/icons/firefox.svg
new file mode 100644
index 00000000000..065152acf64
--- /dev/null
+++ b/src/images/icons/firefox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/icons/github.svg b/src/images/icons/github.svg
index 42533edaba8..58c56ecb894 100644
--- a/src/images/icons/github.svg
+++ b/src/images/icons/github.svg
@@ -1,3 +1 @@
-
+
\ No newline at end of file
diff --git a/src/images/icons/glitch.svg b/src/images/icons/glitch.svg
index 4643289f162..cb65956d118 100644
--- a/src/images/icons/glitch.svg
+++ b/src/images/icons/glitch.svg
@@ -1,88 +1 @@
-
+
\ No newline at end of file
diff --git a/src/images/icons/info.svg b/src/images/icons/info.svg
new file mode 100644
index 00000000000..38c9c3f9764
--- /dev/null
+++ b/src/images/icons/info.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/src/images/icons/language.svg b/src/images/icons/language.svg
index c23e6dd1f65..e179edfd5a3 100644
--- a/src/images/icons/language.svg
+++ b/src/images/icons/language.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/performance.svg b/src/images/icons/performance.svg
index 4ad7003fbd3..41797cf89e2 100644
--- a/src/images/icons/performance.svg
+++ b/src/images/icons/performance.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/pwa.svg b/src/images/icons/pwa.svg
index 9b403e91f9e..32537d101f3 100644
--- a/src/images/icons/pwa.svg
+++ b/src/images/icons/pwa.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/reload.svg b/src/images/icons/reload.svg
index acf60692bef..61e3b68ec61 100644
--- a/src/images/icons/reload.svg
+++ b/src/images/icons/reload.svg
@@ -1,4 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/rss.svg b/src/images/icons/rss.svg
index 762c6f045b6..5b382b934ac 100644
--- a/src/images/icons/rss.svg
+++ b/src/images/icons/rss.svg
@@ -1,7 +1 @@
-
+
\ No newline at end of file
diff --git a/src/images/icons/safari.svg b/src/images/icons/safari.svg
new file mode 100644
index 00000000000..e7ce3fc2dfe
--- /dev/null
+++ b/src/images/icons/safari.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/icons/safari_24x24.png b/src/images/icons/safari_24x24.png
new file mode 100644
index 00000000000..15780dc20b2
Binary files /dev/null and b/src/images/icons/safari_24x24.png differ
diff --git a/src/images/icons/seo.svg b/src/images/icons/seo.svg
index 53412b9439d..bb5edf93286 100644
--- a/src/images/icons/seo.svg
+++ b/src/images/icons/seo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/images/icons/share_white.svg b/src/images/icons/share_white.svg
index a1b60cc7bd4..83705276134 100644
--- a/src/images/icons/share_white.svg
+++ b/src/images/icons/share_white.svg
@@ -1 +1,4 @@
-
\ No newline at end of file
+
diff --git a/src/images/icons/subscribe.svg b/src/images/icons/subscribe.svg
index 5821cb0632c..15f4ec6695f 100644
--- a/src/images/icons/subscribe.svg
+++ b/src/images/icons/subscribe.svg
@@ -1,9 +1,3 @@
-
-
\ No newline at end of file
+
diff --git a/src/images/lockup-chrome-dev.svg b/src/images/lockup-chrome-dev.svg
new file mode 100644
index 00000000000..3b1afede3db
--- /dev/null
+++ b/src/images/lockup-chrome-dev.svg
@@ -0,0 +1 @@
+
diff --git a/src/images/lockup-chrome.svg b/src/images/lockup-chrome.svg
new file mode 100644
index 00000000000..df2d1c6121e
--- /dev/null
+++ b/src/images/lockup-chrome.svg
@@ -0,0 +1,53 @@
+
diff --git a/src/images/lockup.svg b/src/images/lockup.svg
index 51b73b5d8b9..ef9ed03f46f 100644
--- a/src/images/lockup.svg
+++ b/src/images/lockup.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/src/images/logo.svg b/src/images/logo.svg
new file mode 100644
index 00000000000..ec0856cc3ea
--- /dev/null
+++ b/src/images/logo.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/images/modules/cds20-wide_960.jpg b/src/images/modules/cds20-wide_960.jpg
new file mode 100644
index 00000000000..c33dc9a1a24
Binary files /dev/null and b/src/images/modules/cds20-wide_960.jpg differ
diff --git a/src/images/podcasts/css-podcast.jpg b/src/images/podcasts/css-podcast.jpg
index 670c57146a3..94cd711fe36 100644
Binary files a/src/images/podcasts/css-podcast.jpg and b/src/images/podcasts/css-podcast.jpg differ
diff --git a/src/images/podcasts/designer-vs-developer.jpg b/src/images/podcasts/designer-vs-developer.jpg
index e65bbaabe1a..8e920020cfb 100644
Binary files a/src/images/podcasts/designer-vs-developer.jpg and b/src/images/podcasts/designer-vs-developer.jpg differ
diff --git a/src/images/podcasts/search-off-the-record.jpg b/src/images/podcasts/search-off-the-record.jpg
new file mode 100644
index 00000000000..b75fb3d300a
Binary files /dev/null and b/src/images/podcasts/search-off-the-record.jpg differ
diff --git a/src/images/podcasts/state-of-the-web.jpg b/src/images/podcasts/state-of-the-web.jpg
index d8cae751843..ad7c4e44430 100644
Binary files a/src/images/podcasts/state-of-the-web.jpg and b/src/images/podcasts/state-of-the-web.jpg differ
diff --git a/src/images/screenshot1.png b/src/images/screenshot1.png
new file mode 100644
index 00000000000..393622ebe1c
Binary files /dev/null and b/src/images/screenshot1.png differ
diff --git a/src/images/screenshot2.png b/src/images/screenshot2.png
new file mode 100644
index 00000000000..3732159ad45
Binary files /dev/null and b/src/images/screenshot2.png differ
diff --git a/src/images/screenshot3.png b/src/images/screenshot3.png
new file mode 100644
index 00000000000..5ff02304643
Binary files /dev/null and b/src/images/screenshot3.png differ
diff --git a/src/images/rss-banner.png b/src/images/shared/rss-banner.png
similarity index 100%
rename from src/images/rss-banner.png
rename to src/images/shared/rss-banner.png
diff --git a/src/images/social.png b/src/images/social.png
index 3fd045bc166..03d49ebc8cd 100644
Binary files a/src/images/social.png and b/src/images/social.png differ
diff --git a/src/images/tags/scale-on-web.svg b/src/images/tags/scale-on-web.svg
new file mode 100644
index 00000000000..d72c54ae5bf
--- /dev/null
+++ b/src/images/tags/scale-on-web.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/lib/actions.js b/src/lib/actions.js
index 4f3aacdf52f..8f193e425b4 100644
--- a/src/lib/actions.js
+++ b/src/lib/actions.js
@@ -1,10 +1,11 @@
import {store} from './store';
-import {saveUserUrl} from './fb';
-import {runLighthouse, fetchReports} from './lighthouse-service';
+import {fetchReports} from './lighthouse-service';
+import {runPsi} from './psi-service';
import lang from './utils/language';
import {localStorage} from './utils/storage';
-import {getCanonicalPath} from './urls';
import cookies from 'js-cookie';
+import {ids} from 'webdev_analytics';
+import {isProd} from 'webdev_config';
export const clearSignedInState = store.action(() => {
const {isSignedIn} = store.getState();
@@ -21,12 +22,8 @@ export const clearSignedInState = store.action(() => {
}
});
-export const requestRunLighthouse = store.action((state, url) => {
+export const requestRunPSI = store.action((state, url) => {
const p = (async () => {
- if (state.activeLighthouseUrl) {
- return null; // there's an active run, nothing will happen
- }
-
// Only write the user's URL preference to `activeLighthouseUrl` here before running
// Lighthouse. The `userUrl` field inside state is not "safe" in that it can be replaced by
// Firestore at any point. This ensures that results are never approportioned to the wrong URL.
@@ -34,51 +31,39 @@ export const requestRunLighthouse = store.action((state, url) => {
activeLighthouseUrl: url,
lighthouseError: null,
});
-
- const run = await runLighthouse(url, state.isSignedIn);
- const auditedOn = new Date(run.auditedOn);
+ const run = await runPsi(url);
state = store.getState(); // might change during runLighthouse
-
- // Don't just replace last run for signed in users to avoid double rendering / outdated
- // sparkline data. Instead, call fetchReports() to repopulate the graphs with the latest data.
- // Yes, this means that signed-in users have two network requests.
-
- const firstSeenUrl = await saveUserUrl(url, auditedOn); // write to Firestore and get first seen
-
- // nb. use firstSeenUrl as state.userUrlSeen is updated from a Firebase snapshot which
- // usually has not arrived by now (since it's updated right above)
- const runs = await fetchReports(url, firstSeenUrl);
-
return {
userUrl: url,
activeLighthouseUrl: null,
lighthouseResult: {
url,
- runs,
+ run,
},
};
})();
return p.catch((err) => {
- console.warn('failed to run Lighthouse', url, err);
-
- const update = {
- lighthouseError: err.toString(),
- activeLighthouseUrl: null,
- };
-
- // If the previous result was for a different URL, clear it so there's not confusion about
- // what the error is being shown for.
- const {lighthouseResult} = store.getState();
- if (lighthouseResult && lighthouseResult.url !== url) {
- update.lighthouseResult = null;
- }
-
- return update;
+ const errMsg = err.name === 'FetchError' ? err.name : err.toString();
+ console.warn('failed to run PSI', url, errMsg);
+ return setLighthouseError(errMsg);
});
});
-export const requestFetchReports = store.action((state, url, startDate) => {
+export const setLighthouseError = store.action((_, errMsg) => {
+ const update = {
+ lighthouseError: errMsg,
+ activeLighthouseUrl: null,
+ };
+ const {activeLighthouseUrl, lighthouseResult} = store.getState();
+ if (lighthouseResult && lighthouseResult.url !== activeLighthouseUrl) {
+ update.lighthouseResult = null;
+ }
+ store.setState(update);
+ return update;
+});
+
+export const requestFetchReports = store.action((_, url, startDate) => {
const p = (async () => {
const runs = await fetchReports(url, startDate);
@@ -124,60 +109,88 @@ export const requestFetchReports = store.action((state, url, startDate) => {
});
});
-export const expandSideNav = store.action(() => {
- openModal();
- return {isSideNavExpanded: true};
+/**
+ * Inert the page so scrolling and pointer events are disabled.
+ * This is used when we open the navigation drawer or show a modal dialog.
+ */
+const disablePage = () => {
+ // Setting the majority of the page as inert can have a significant perf hit when
+ // trying to animate e.g. the navigation drawer, so do it in the frame after this
+ // to avoid blocking on interaction and incurring an INP delay.
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ const main = document.querySelector('main');
+ const footer = document.querySelector('footer');
+
+ if (main) main.inert = true;
+ if (footer) footer.inert = true;
+ });
+ });
+};
+
+/**
+ * Uninert the page so scrolling and pointer events work again.
+ */
+const enablePage = () => {
+ // Similar to disablePage(), go inert in the next frame to avoid the perf hit.
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ const main = document.querySelector('main');
+ const footer = document.querySelector('footer');
+
+ if (main) main.inert = false;
+ if (footer) footer.inert = false;
+ });
+ });
+};
+
+export const openNavigationDrawer = store.action(() => {
+ disablePage();
+ return {isNavigationDrawerOpen: true};
});
-export const collapseSideNav = store.action(() => {
- closeModal();
- return {isSideNavExpanded: false};
+export const closeNavigationDrawer = store.action(() => {
+ enablePage();
+ return {isNavigationDrawerOpen: false};
});
export const openModal = store.action(() => {
- const main = document.querySelector('main');
- const header = document.querySelector('web-header');
- const footer = document.querySelector('.w-footer');
-
- document.documentElement.classList.add('web-modal__overflow-hidden');
- main.inert = true;
- header.inert = true;
- footer.inert = true;
+ disablePage();
return {isModalOpen: true};
});
export const closeModal = store.action(() => {
- const main = document.querySelector('main');
- const header = document.querySelector('web-header');
- const footer = document.querySelector('.w-footer');
-
- document.documentElement.classList.remove('web-modal__overflow-hidden');
- main.inert = false;
- header.inert = false;
- footer.inert = false;
+ enablePage();
return {isModalOpen: false};
});
-export const checkIfUserAcceptsCookies = store.action(
- ({userAcceptsCookies}) => {
- if (userAcceptsCookies) {
- return;
- }
+export const checkIfUserAcceptsCookies = store.action(({cookiePreference}) => {
+ if (cookiePreference) {
+ return;
+ }
- if (localStorage['web-accepts-cookies']) {
- return {
- userAcceptsCookies: true,
- };
- }
+ // If set, this will be either the string '1' or '0' based on whether
+ // the user has accepted or rejected the use of cookies.
+ // If not set it means the user has not made a choice (or cleared storage).
+ const storedWebAcceptsCookiesValue = localStorage['web-accepts-cookies'];
- return {showingSnackbar: true, snackbarType: 'cookies'};
- },
-);
+ if (typeof storedWebAcceptsCookiesValue === 'string') {
+ cookiePreference =
+ storedWebAcceptsCookiesValue === '1' ? 'accepts' : 'rejects';
+ } else {
+ cookiePreference = null;
+ }
+
+ // Only show the cookie snack-bar if the user hasn't set a preference.
+ const showingSnackbar = cookiePreference === null;
+
+ return {cookiePreference, showingSnackbar, snackbarType: 'cookies'};
+});
export const setUserAcceptsCookies = store.action(() => {
- localStorage['web-accepts-cookies'] = 1;
+ localStorage['web-accepts-cookies'] = '1';
return {
- userAcceptsCookies: true,
+ cookiePreference: 'accepts',
showingSnackbar: false,
// Note we don't set the snackbarType to null because that would cause the
// snackbar to re-render and break the animation.
@@ -186,34 +199,41 @@ export const setUserAcceptsCookies = store.action(() => {
};
});
-export const checkUserPreferredLanguage = store.action(
- ({userPreferredLanguage}) => {
- userPreferredLanguage =
- // Use currently set language.
- userPreferredLanguage ||
- // Or check in the url.
- lang.getLanguageFromPath(location.pathname) ||
- // Or check in a cookie.
- cookies.get('preferred_lang') ||
- // Or check in the browser setting.
- navigator.language.split('-')[0];
- if (!lang.isValidLanguage(userPreferredLanguage)) {
- userPreferredLanguage = '';
- }
- return {userPreferredLanguage};
- },
-);
+export const setUserRejectsCookies = store.action(() => {
+ localStorage['web-accepts-cookies'] = '0';
+ return {
+ cookiePreference: 'rejects',
+ showingSnackbar: false,
+ // Note we don't set the snackbarType to null because that would cause the
+ // snackbar to re-render and break the animation.
+ // Instead, snackbarType is allowed to stick around and future updates can
+ // overwrite it.
+ };
+});
-export const setLanguage = store.action((state, preferredLanguage) => {
+export const setLanguage = store.action((state, language) => {
+ if (!lang.isValidLanguage(language)) {
+ return state;
+ }
const options = {
expires: 10 * 365, // 10 years
samesite: 'strict',
};
- cookies.set('preferred_lang', preferredLanguage, options);
- if (preferredLanguage !== state.userPreferredLanguage) {
- location.pathname = getCanonicalPath(location.pathname);
+ cookies.set('firebase-language-override', language, options);
+ if (language !== state.currentLanguage) {
+ location.reload();
}
return {
- userPreferredLanguage: preferredLanguage,
+ currentLanguage: language,
};
});
+
+export const loadAnalyticsScript = store.action(() => {
+ const {gtmScriptLoaded} = store.getState();
+ if (!gtmScriptLoaded && isProd) {
+ loadScript(`https://www.googletagmanager.com/gtm.js?id=${ids.GTM}`, null);
+ return {
+ gtmScriptLoaded: true,
+ };
+ }
+});
diff --git a/src/lib/analytics.js b/src/lib/analytics.js
index d76aa82a268..d04bb1734df 100644
--- a/src/lib/analytics.js
+++ b/src/lib/analytics.js
@@ -1,112 +1,421 @@
-import {getCLS, getFID, getLCP} from 'web-vitals';
-import {dimensions} from 'webdev_analytics';
+import {
+ onCLS,
+ onFCP,
+ onFID,
+ onINP,
+ onLCP,
+ onTTFB,
+} from 'web-vitals/attribution';
import {store} from './store';
+import {checkIfUserAcceptsCookies} from './actions.js';
+import {version} from 'webdev_analytics';
-// Events missing from DevSite include:
-// * "devsite-analytics-observation", generated by the Metric class for page load timing
-// * "devsite-analytics-error", wired up to the onerror handler
-// * "devsite-analytics-set-dimension", for user response to custom questions
-// * "devsite-analytics-scope", which constructs complex click events (was used for header)
-//
-// Note that many parts of our code are annotated with an "gc-analytics-event" attribute, but this
-// is actually ignored in DevSite v2. Instead, any links that have `data-category` automatically
-// have clicks logged (see below).
-
-function getAnalyticsDataFromElement(elem, defaultAction = 'click') {
- const category = elem.dataset['category'] || undefined;
- const action = elem.dataset['action'] || defaultAction;
- const label = elem.dataset['label'] || undefined;
- const value = Number(elem.dataset['value']) || undefined; // must be number, or is ignored
- return {
- category,
- action,
- label,
- value,
- };
-}
+// A function that should be called once all all analytics code has been
+// initialized. Calling this will resolve the `whenAnalyticsInitialize`
+// promise.
+let markAnalyticsInitialized;
+
+// A promise that settles once all analytics has been initialized.
+// Internally this assigned the `resolve()` function to the module-level
+// `markAnalyticsInitialized` variable.
+const whenAnalyticsInitialized = new Promise((resolve) => {
+ markAnalyticsInitialized = resolve;
+});
/**
- * @param {{ category: string, action: string, label: string, value: number }} param
+ * @param {string} name
+ * @param {Object} params
*/
-export function trackEvent({category, action, label, value}) {
- ga('send', 'event', {
- eventCategory: category,
- eventAction: action,
- eventLabel: label,
- eventValue: value,
- });
+export async function logEvent(name, params) {
+ await whenAnalyticsInitialized;
+ gtag('event', name, params);
}
/**
- * Track an error via Analytics with optional context message and fatal notice.
+ * Logs an error via Analytics with optional context message and fatal notice.
*
- * @param {!Error} error to log
+ * @param {Error} error to log
* @param {string=} message context to provide around error message
* @param {boolean=} fatal whether this is fatal (as per Analytics' logging)
*/
-export function trackError(error, message = '', fatal = false) {
- const exDescription = message
- ? `${message} (${error.message})`
- : error.message;
- ga('send', 'exception', {
- exDescription,
- exFatal: fatal,
- });
+export function logError(error, message = '', fatal = false) {
+ const description = message ? `${message} (${error.message})` : error.message;
+ logEvent('exception', {description, fatal});
}
/**
* See: https://github.com/GoogleChrome/web-vitals#using-analyticsjs
* @param {Object} metric
*/
-function sendToGoogleAnalytics({name, delta, id}) {
- // Assumes the global `ga()` function exists, see:
- // https://developers.google.com/analytics/devguides/collection/analyticsjs
- ga('send', 'event', {
- eventCategory: 'Web Vitals',
- eventAction: name,
- // Google Analytics metrics must be integers, so the value is rounded.
- // For CLS the value is first multiplied by 1000 for greater precision
- // (note: increase the multiplier for greater precision if needed).
- eventValue: Math.round(name === 'CLS' ? delta * 1000 : delta),
+function sendToGoogleAnalytics({
+ name,
+ value,
+ delta,
+ id,
+ attribution,
+ navigationType,
+}) {
+ const params = {
+ event_category: 'Web Vitals',
// The `id` value will be unique to the current page load. When sending
// multiple values from the same page (e.g. for CLS), Google Analytics can
// compute a total by grouping on this ID (note: requires `eventLabel` to
// be a dimension in your report).
- eventLabel: id,
+ event_label: id,
+ // Google Analytics metrics must be integers, so the value is rounded.
+ // For CLS the value is first multiplied by 1000 for greater precision
+ // (note: increase the multiplier for greater precision if needed).
+ value: Math.round(name === 'CLS' ? delta * 1000 : delta),
+ // Send the raw metric value in addition to the value computed for GA
+ // so it's available in BigQuery and the API.
+ metric_value: value,
+ // This should already by set globally, but to ensure it's consistent
+ // with the web-vitals library, set it again.
+ // Override for 'navigational-prefetch' for the prefetch origin trial
+ // experiment (https://github.com/GoogleChrome/web.dev/pull/9532)
+ navigation_type:
+ navigationType === 'navigate' &&
+ performance.getEntriesByType &&
+ performance.getEntriesByType('navigation')[0] &&
+ performance.getEntriesByType('navigation')[0].deliveryType ===
+ 'navigational-prefetch'
+ ? 'navigational-prefetch'
+ : navigationType,
// Use a non-interaction event to avoid affecting bounce rate.
- nonInteraction: true,
- });
+ // This only applies to Universal Analytics and can be deleted once
+ // we're only using GA4.
+ non_interaction: true,
+ };
+
+ let overrides;
+ let debug_input_delay;
+ let debug_processing_time;
+ let debug_presentation_delay;
+
+ switch (name) {
+ case 'CLS':
+ overrides = {
+ debug_time: attribution.largestShiftTime,
+ debug_load_state: attribution.loadState,
+ debug_target: attribution.largestShiftTarget || '(not set)',
+ };
+ break;
+ case 'FCP':
+ overrides = {
+ debug_ttfb: attribution.timeToFirstByte,
+ debug_fb2fcp: attribution.firstByteToFCP,
+ debug_load_state: attribution.loadState,
+ debug_target: attribution.loadState || '(not set)',
+ };
+ break;
+ case 'FID':
+ overrides = {
+ debug_event: attribution.eventType,
+ debug_time: attribution.eventTime,
+ debug_load_state: attribution.loadState,
+ debug_target: attribution.eventTarget || '(not set)',
+ };
+ break;
+ case 'INP':
+ if (attribution.eventEntry) {
+ debug_input_delay = Math.round(
+ attribution.eventEntry.processingStart -
+ attribution.eventEntry.startTime,
+ );
+ debug_processing_time = Math.round(
+ attribution.eventEntry.processingEnd -
+ attribution.eventEntry.processingStart,
+ );
+ debug_presentation_delay = Math.round(
+ // RenderTime is an estimate, because duration is rounded, and may get rounded down.
+ // In rare cases it can be less than processingEnd and that breaks performance.measure().
+ // Lets make sure its at least 4ms in those cases so you can just barely see it.
+ Math.max(
+ attribution.eventEntry.processingEnd + 4,
+ attribution.eventEntry.startTime + attribution.eventEntry.duration,
+ ) - attribution.eventEntry.processingEnd,
+ );
+ }
+ overrides = {
+ debug_event: attribution.eventType,
+ debug_time: attribution.eventTime,
+ debug_load_state: attribution.loadState,
+ debug_target: attribution.eventTarget || '(not set)',
+ debug_input_delay: debug_input_delay,
+ debug_processing_time: debug_processing_time,
+ debug_presentation_delay: debug_presentation_delay,
+ };
+ break;
+ case 'LCP':
+ overrides = {
+ debug_url: attribution.url,
+ debug_ttfb: attribution.timeToFirstByte,
+ debug_rld: attribution.resourceLoadDelay,
+ debug_rlt: attribution.resourceLoadTime,
+ debug_erd: attribution.elementRenderDelay,
+ debug_target: attribution.element || '(not set)',
+ };
+ break;
+ case 'TTFB':
+ overrides = {
+ debug_waiting_time: attribution.waitingTime,
+ debug_dns_time: attribution.dnsTime,
+ debug_connection_time: attribution.connectionTime,
+ debug_request_time: attribution.requestTime,
+ };
+ break;
+ }
+
+ logEvent(name, Object.assign(params, overrides));
}
/**
- * Configure tracking events for any clicks on a link (``)
- * or another trackable element (class="gc-analytics-event"), searching
+ * Configures logging events for any clicks on a link (``)
+ * or another relevant elements (class="gc-analytics-event"), searching
* for (requiring at least `data-category`, but also allowing
* `data-action`, `data-label` and `data-value`.
*/
-document.addEventListener('click', (e) => {
- const clickableEl = e.target.closest('a[href], .gc-analytics-event');
- if (!clickableEl) {
+function addClickEventListener() {
+ document.addEventListener(
+ 'click',
+ /**
+ * @param {WMouseEvent} e
+ */
+ (e) => {
+ const clickableEl = e.target.closest('a[href], .gc-analytics-event');
+ if (!clickableEl) {
+ return;
+ }
+ const event = clickableEl.dataset['action'] || 'click';
+ const category = clickableEl.dataset['category'] || undefined;
+ const label = clickableEl.dataset['label'] || undefined;
+ // must be number, or is ignored
+ const value = Number(clickableEl.dataset['value']) || undefined;
+
+ if (event && category) {
+ logEvent(event, {
+ event_category: category,
+ event_label: label,
+ value: value,
+ });
+ }
+ },
+ );
+}
+
+/**
+ * Adds a listener to detect back/forward cache restores and log them
+ * as pageviews with the "back-forward-cache" navigation type set (in
+ * case we need to distinguish them from regular pageviews).
+ * https://web.dev/bfcache/#how-bfcache-affects-analytics-and-performance-measurement
+ */
+function addPageShowEventListener() {
+ window.addEventListener(
+ 'pageshow',
+ /**
+ * @param {PageTransitionEvent} e
+ */
+ (e) => {
+ if (e.persisted) {
+ window.dataLayer.push({navigation_type: 'back-forward-cache'});
+ logEvent('page_view');
+ }
+ },
+ );
+}
+
+// Set up a promise for when the page is activated,
+// which is needed for prerendered pages.
+const whenPageActivated = new Promise((resolve) => {
+ if (document.prerendering) {
+ document.addEventListener('prerenderingchange', () => resolve());
+ } else {
+ resolve();
+ }
+});
+
+/**
+ * Gets the type of navigation for this page. In most cases this is the
+ * value returned by the Navigation Timing API (normalized to use kebab case),
+ * but in addition to this it also captures pages that were prerendered
+ * as well as page that were restored after a discard.
+ * @returns {string}
+ */
+function getNavigationType() {
+ if (document.wasDiscarded) {
+ return 'restore';
+ }
+
+ const navEntry =
+ self.performance &&
+ performance.getEntriesByType &&
+ performance.getEntriesByType('navigation')[0];
+
+ if (navEntry) {
+ // Prerendered pages have an activationStart time after activation
+ if (navEntry.activationStart > 0) {
+ return 'prerender';
+ } else if (
+ // For the document speculation rules origin trial
+ // overrwrite the navigation type
+ navEntry.type === 'navigate' &&
+ navEntry.deliveryType === 'navigational-prefetch'
+ ) {
+ return 'navigational-prefetch';
+ } else {
+ return navEntry.type.replace(/_/, '-');
+ }
+ }
+ return '(not set)';
+}
+
+/**
+ * Gets the type of navigation for this page. In most cases this is the
+ * value returned by the Navigation Timing API (normalized to use kebab case),
+ * but in addition to this it also captures pages that were prerendered
+ * as well as page that were restored after a discard.
+ * @returns {string|undefined}
+ */
+function getBackForwardNotRestoreReasons() {
+ const navEntry =
+ self.performance &&
+ performance.getEntriesByType &&
+ performance.getEntriesByType('navigation')[0];
+
+ if (navEntry) {
+ if (navEntry.notRestoredReasons) {
+ return navEntry.notRestoredReasons.reasons.toString();
+ }
+ }
+ return;
+}
+
+/**
+ * Returns a list of any `prerender` speculation rules defined by any
+ * `script[type=speculationrules]` elements on the page.
+ * @returns {Object}
+ */
+function getPrerenderRules() {
+ return [...document.querySelectorAll('script[type=speculationrules]')]
+ .map((s) => {
+ try {
+ return JSON.parse(s.textContent).prerender;
+ } catch {
+ // Ignore parse errors.
+ }
+ })
+ .flat() // Remove scripts with errors or no prerender rules.
+ .filter((rule) => rule && rule.source === 'list');
+}
+
+/**
+ * Logs analytics events for `prerender` speculation rules, if that browser
+ * support speculation rules and is not in Data Saver mode.
+ * @returns {void}
+ */
+function logPrerenders() {
+ // Only log prerender attempts if supported
+ // and not in datasaver mode
+ if (
+ !(
+ HTMLScriptElement.supports &&
+ HTMLScriptElement.supports('speculationrules')
+ ) ||
+ navigator.connection?.saveData
+ ) {
return;
}
- const data = getAnalyticsDataFromElement(clickableEl);
- if (!data.category) {
- return; // category is required
+ const prerenderURLs = new Set(
+ getPrerenderRules()
+ .map((r) => r.urls)
+ .flat(),
+ );
+
+ prerenderURLs.forEach((prerenderURL) => {
+ logEvent('prerender_attempt', {
+ value: 1,
+ event_category: 'Site-Wide Custom Events',
+ event_label: prerenderURL,
+ // Use a non-interaction event to avoid affecting bounce rate.
+ non_interaction: true,
+ });
+ });
+}
+
+/**
+ * @param {string} name
+ * @returns {string|undefined}
+ */
+function getMeta(name) {
+ const meta = document.querySelector(`meta[name="${name}"]`);
+ return meta && meta.content;
+}
+
+/**
+ * Sets the config for a given analytics measurement ID,
+ * configured for the web.dev accounts.
+ */
+function setConfig() {
+ window.dataLayer = window.dataLayer || [];
+ window.dataLayer.push({measurement_version: version});
+ const navigationType = getNavigationType();
+ window.dataLayer.push({navigation_type: navigationType});
+ if (navigationType === 'back-forward') {
+ const reasons = getBackForwardNotRestoreReasons();
+ window.dataLayer.push({back_forward_not_restore_reasons: reasons});
}
+ window.dataLayer.push({page_path: location.pathname});
+ window.dataLayer.push({page_authors: getMeta('authors')});
+ window.dataLayer.push({page_tags: getMeta('tags')});
+ window.dataLayer.push({page_learn_paths: getMeta('paths')});
+ window.dataLayer.push({
+ color_scheme_preference: self.matchMedia('(prefers-color-scheme: dark)')
+ .matches
+ ? 'dark'
+ : 'light',
+ });
+ if (navigator.deviceMemory) {
+ window.dataLayer.push({device_memory: navigator.deviceMemory});
+ }
+ if (navigator.connection && navigator.connection.effectiveType) {
+ window.dataLayer.push({
+ effective_connection_type: navigator.connection.effectiveType,
+ });
+ }
+ if (location.hostname === 'localhost') {
+ window.dataLayer.push({debug_mode: true});
+ }
+ checkIfUserAcceptsCookies();
+ const {cookiePreference} = store.getState();
+ window.dataLayer.push({cookiePreference: cookiePreference});
- trackEvent(data);
-});
+ logEvent('webdev_analytics_configed');
+}
-// Update Analytics dimension if signed-in state changes. This doesn't cause a
-// new pageview implicitly but annotates all further events.
-// We log pageviews only in bootstrap.js (on entry, for all browsers) and in
-// loader.js (for dynamic SPA page loads, part of our core bundle).
-store.subscribe(({isSignedIn}) => {
- // nb. Analytics requires dimension values to be strings.
- ga('set', dimensions.SIGNED_IN, isSignedIn ? '1' : '0');
-});
+async function initAnalytics() {
+ // If prerendering then only init once the page is activated
+ await whenPageActivated;
+
+ setConfig();
+
+ addClickEventListener();
+ addPageShowEventListener();
+
+ onCLS(sendToGoogleAnalytics);
+ onFCP(sendToGoogleAnalytics);
+ onFID(sendToGoogleAnalytics);
+ onINP(sendToGoogleAnalytics);
+ onLCP(sendToGoogleAnalytics);
+ onTTFB(sendToGoogleAnalytics);
-getCLS(sendToGoogleAnalytics);
-getFID(sendToGoogleAnalytics);
-getLCP(sendToGoogleAnalytics);
+ logPrerenders();
+
+ markAnalyticsInitialized();
+}
+
+// Some pages on web.dev include the full site JS but don't load
+// the gtag.js library. We can't initialize analytics in those cases.
+if (window.gtag) {
+ initAnalytics();
+}
diff --git a/src/lib/app.js b/src/lib/app.js
index 7dee21ebfdb..326bc91c1a5 100644
--- a/src/lib/app.js
+++ b/src/lib/app.js
@@ -1,119 +1,33 @@
/**
- * @fileoverview Site entrypoint. This runs only in supported browsers and is
- * dynamically inserted by "bootstrap.js" if the user's browser is supported.
+ * @fileoverview Site entrypoint.
*
- * This is web.dev's core JS bundle; it includes unistore, routing, Service
- * Worker initialization, component loading for routes, et al.
+ * This is web.dev's core JS bundle; it includes unistore, and some basic
+ * sw cleanup code.
*/
-/* global WebComponents */
-import './webcomponents-config'; // must go before -loader below
-import '@webcomponents/webcomponentsjs/webcomponents-loader.js';
-import './analytics'; // side effects
-import {swapContent, getPartial} from './loader';
-import * as router from './utils/router';
-import {checkUserPreferredLanguage} from './actions';
import {store} from './store';
-import {localStorage} from './utils/storage';
+import {loadAnalyticsScript} from './actions';
import removeServiceWorkers from './utils/sw-remove';
-WebComponents.waitFor(async () => {
- // TODO(samthor): This isn't quite the right class name because not all Web Components are ready
- // at this point due to code-splitting.
- document.body.classList.remove('unresolved');
-
- // Run as long-lived router w/ history & "" bindings
- // Also immediately calls `swapContent()` handler for current location,
- // loading its required JS entrypoint
- router.listen(swapContent);
-
- // If the site becomes online again, and the special offline page was shown,
- // then trigger a reload
- window.addEventListener('online', () => {
- const {isOffline} = store.getState();
- if (isOffline) {
- router.reload();
- }
+// This hides a legacy browser warning that can appear on the /measure page
+// See .unsupported-notice in _page-header.scss
+document.body.classList.remove('unresolved');
+
+// Although discouraged (especially for longer videos), some video clips may have
+// autoplay enabled. Disable it when prefers-reduced-motion is set, and ensure
+// controls are enabled.
+if (matchMedia('(prefers-reduced-motion)').matches) {
+ document.querySelectorAll('video[autoplay]').forEach((b) => {
+ b.removeAttribute('autoplay');
+ b.setAttribute('controls', '');
});
-});
-
-// Read preferred language from the url, a cookie or browser settings.
-checkUserPreferredLanguage();
-
-// Configures global page state (loading, signed in).
-function onGlobalStateChanged({isSignedIn, isPageLoading}) {
- document.body.classList.toggle('lh-signedin', isSignedIn);
-
- const progress = document.querySelector('.w-loading-progress');
- progress.hidden = !isPageLoading;
+}
- const main = document.querySelector('main');
- if (isPageLoading) {
- main.setAttribute('aria-busy', 'true');
- } else {
- main.removeAttribute('aria-busy');
- }
- // Cache whether the user was signed in, to help prevent FOUC in future and
- // for Analytics, as this can be read synchronosly and Firebase's auth takes
- // ~ms to arrive.
- localStorage['webdev_isSignedIn'] = isSignedIn ? 'probably' : '';
+function onGlobalStateChanged({cookiePreference}) {
+ window.dataLayer.push({cookiePreference: cookiePreference});
}
+loadAnalyticsScript();
store.subscribe(onGlobalStateChanged);
onGlobalStateChanged(store.getState());
-// Ensure/update the Service Worker, or remove it if unsupported (this should
-// never happen here unless the valid domains change, but left in for safety).
-if (serviceWorkerIsSupported(window.location.hostname)) {
- ensureServiceWorker();
-} else {
- removeServiceWorkers();
-}
-
-function serviceWorkerIsSupported(hostname) {
- // Allow local/prod as well as .netlify staging deploy target.
- const allowedHostnames = [
- 'web.dev',
- 'web-dev-staging.appspot.com',
- 'localhost',
- ];
- return (
- 'serviceWorker' in navigator &&
- (allowedHostnames.includes(hostname) || hostname.endsWith('.netlify.com'))
- );
-}
-
-function ensureServiceWorker() {
- const ensurePartialCache = (isFirstInstall = false) => {
- const {pathname} = window.location;
- if (isFirstInstall) {
- // We don't fetch the partial for the initial, real, HTML fetch from out HTTP server. This
- // ensures that if the user goes offline and reloads for some reason, the page still loads.
- getPartial(pathname);
- }
- if (pathname !== '/') {
- // Aggressively refetch the landing page every time the site is loaded.
- // TODO(samthor): Check Workbox's cache time and fetch if needed. Additionally, cache a
- // number of recent articles.
- getPartial('/');
- }
- };
-
- const isFirstInstall = !navigator.serviceWorker.controller;
- if (isFirstInstall) {
- // Watch for the brand new Service Worker to be activated. We claim this foreground page
- // inside the Service Worker, so this event will fire when it is activated.
- navigator.serviceWorker.addEventListener('controllerchange', () => {
- ensurePartialCache(true);
- });
- } else {
- // This isn't the first install, but ensure some partials are up-to-date.
- ensurePartialCache();
-
- // We claim active clients if the Service Worker's architecture rev changes. We can't
- // reliably force a reload via the Client interface as it's unsupported in Safari.
- navigator.serviceWorker.addEventListener('controllerchange', () => {
- window.location.reload();
- });
- }
- navigator.serviceWorker.register('/sw.js');
-}
+removeServiceWorkers();
diff --git a/src/lib/bootstrap.js b/src/lib/bootstrap.js
deleted file mode 100644
index 20c39f1f868..00000000000
--- a/src/lib/bootstrap.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @fileoverview Bootstrap code run by all browsers inside `script defer`.
- *
- * Used to trigger basic Analytics, including with our known previous signed-in
- * state that was cached in `localStorage`.
- *
- * * This file is built with Rollup, but separately to our core bundle: don't
- * import any core site code as it'll be duplicated.
- *
- * * It's run in all browsers as a regular script (not "module"), and this
- * includes all ancient browsers, e.g., IE11 or older.
- *
- * * It runs _before_ our core bundle (for supported browsers), as it inserts
- * the "entrypoint" script tag as part of its work.
- */
-
-import {dimensions, id, version} from 'webdev_analytics';
-import entrypoint from 'webdev_entrypoint';
-import {localStorage} from './utils/storage';
-import removeServiceWorkers from './utils/sw-remove';
-
-window.ga =
- window.ga ||
- function () {
- (ga.q = ga.q || []).push(arguments);
- };
-ga.l = +new Date();
-ga('create', id);
-ga('set', 'transport', 'beacon');
-ga('set', 'page', window.location.pathname);
-// nb. Analytics requires dimension values to be strings.
-ga('set', dimensions.SIGNED_IN, localStorage['webdev_isSignedIn'] ? '1' : '0');
-ga('set', dimensions.TRACKING_VERSION, version.toString());
-ga('send', 'pageview');
-
-// In future, we can feature-detect other things here and prevent loading core
-// site code. This includes Shadow DOM.
-const browserSupport = 'noModule' in HTMLScriptElement.prototype;
-if (browserSupport) {
- const s = document.createElement('script');
- s.type = 'module';
- s.src = '/' + entrypoint;
- document.head.append(s);
-} else {
- // If we've transitioned into becoming an unsupported browser, then any
- // previous Service Worker won't be updated. Aggressively remove on load.
- removeServiceWorkers();
-}
diff --git a/src/lib/components/Assessment/_styles.scss b/src/lib/components/Assessment/_styles.scss
deleted file mode 100644
index ceb5fb13257..00000000000
--- a/src/lib/components/Assessment/_styles.scss
+++ /dev/null
@@ -1,118 +0,0 @@
-@import '../../../styles/settings/colors';
-@import '../../../styles/tools/breakpoints';
-
-.web-assessment__launcher {
- display: flex;
- flex-direction: column;
- margin: 3em 0;
-}
-
-// Allows buttons to resize with root font-size, maximizing space for questions
-.web-assessment__button {
- height: 3rem;
-}
-
-web-assessment {
- display: none;
- flex-direction: column;
-
- &[animatable] {
- animation: .25s ease reverse modal-slideup;
- }
-
- &[animatable][open] {
- animation: .25s ease modal-slideup;
- }
-
- // Prevent FOUC by hiding children until after firstUpdated().
- // This isn't ":not(:defined)" because firstUpdated occurs after a frame.
- &.unresolved * {
- display: none !important;
- }
-
- @include bp(sm) {
- display: flex;
- margin: 5em 0 !important; // Override .w-callout
- padding: 0 !important; // Override .w-callout
- }
-}
-
-@keyframes modal-slideup {
- 0% {
- transform: translateY(40%);
- opacity: 0;
- }
-
- 100% {
- transform: none;
- opacity: 1;
- }
-}
-
-// Overrides .w-button--primary so button matches self-assessment color
-// (All states needed because they're specified for .w-button--primary.)
-.web-assessment__open,
-.web-assessment__open:hover,
-.web-assessment__open:active,
-.web-assessment__open:focus {
- background: $SELF_ASSESSMENT_PRIMARY_COLOR;
-}
-
-.web-assessment__close {
- position: absolute;
- right: .5rem;
- top: .75rem;
-}
-
-.web-assessment__lockup {
- color: $SELF_ASSESSMENT_PRIMARY_COLOR;
-}
-
-.web-assessment__lockup::before {
- content: 'school';
-}
-
-.web-assessment--singleton .web-assessment__header {
- border-bottom: 1px solid $BORDER_COLOR;
-}
-
-.web-assessment__content {
- display: flex;
- flex: 1;
-}
-
-web-assessment[open],
-web-assessment[animatable] {
- background: $WHITE;
- bottom: 0;
- display: flex;
- left: 0;
- margin: 0;
- position: fixed;
- right: 0;
- top: 0;
- z-index: 250; // Between Header and SideNav
-
- .web-assessment__header {
- padding: 1.5rem 3.5rem 1rem 1.5rem;
- }
-
- // Adjust visisbility of set leader when in modal view on mobile.
- .web-assessment__set-leader {
- display: none;
- }
-}
-
-@include bp(sm) {
- .web-assessment__launcher {
- display: none;
- }
-
- .web-assessment__close {
- display: none;
- }
-
- .web-assessment__header {
- padding: 1.5rem 1.5rem 1rem;
- }
-}
diff --git a/src/lib/components/Assessment/index.js b/src/lib/components/Assessment/index.js
index a97b76b8e95..a756f5b34d9 100644
--- a/src/lib/components/Assessment/index.js
+++ b/src/lib/components/Assessment/index.js
@@ -14,20 +14,22 @@
* limitations under the License.
*/
-import {html} from 'lit-element';
-import {render} from 'lit-html';
+import {html} from 'lit';
import {BaseModalElement} from '../BaseModalElement';
-import './_styles.scss';
/**
* Element that renders a self-assessment callout.
* @extends {BaseModalElement}
* @final
*/
-class Assessment extends BaseModalElement {
+export class Assessment extends BaseModalElement {
static get properties() {
return {
modal: {attribute: 'aria-modal', reflect: true},
+ open: {type: Boolean, reflect: true},
+ animatable: {type: Boolean, reflect: true},
+ overflow: {type: Boolean, reflect: true},
+ parentModal: {type: String, reflect: true, attribute: 'parent-modal'},
};
}
@@ -60,20 +62,9 @@ class Assessment extends BaseModalElement {
}
return html`
- |