diff --git a/.gitignore b/.gitignore index 7727a451..5685dfae 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ .jekyll-metadata /docs node_modules +.file-registry.json +.env \ No newline at end of file diff --git a/_includes_v2/feature-table.html b/_includes_v2/feature-table.html new file mode 100644 index 00000000..9f14d19e --- /dev/null +++ b/_includes_v2/feature-table.html @@ -0,0 +1,199 @@ + + + + + +The table below aims to track implemented features in popular engines and tools. +You can click on a cell for more information. + + + +

+ Loading table, please wait… + (report issues) +

+ +
+
+
+ Currently showing categories: +
+ +
+
+
+ Report issues + • + Contribute data +
+
+ +
+ + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + diff --git a/_includes_v2/footer.html b/_includes_v2/footer.html new file mode 100644 index 00000000..211369b4 --- /dev/null +++ b/_includes_v2/footer.html @@ -0,0 +1,112 @@ + diff --git a/_includes_v2/head.html b/_includes_v2/head.html new file mode 100644 index 00000000..532ff400 --- /dev/null +++ b/_includes_v2/head.html @@ -0,0 +1,13 @@ + + +{% if page.title %}{{ page.title }} - WebAssembly{% else %}WebAssembly{% endif %} + + + + + + + +{% if page.url == "/features/" %}{% endif %} diff --git a/_includes_v2/lang-grid.html b/_includes_v2/lang-grid.html new file mode 100644 index 00000000..387fcc40 --- /dev/null +++ b/_includes_v2/lang-grid.html @@ -0,0 +1,27 @@ +
+
Ada
+
AssemblyScript
+
C / C++
+
C#
+
COBCobol
+
D
+
Dart
+
F#
+
Go
+
GGrain
+
Haskell
+
Java
+
Kotlin
+
Lua
+
moonMoonbit
+
Pascal
+
PHP
+
Python
+
R
+
Ruby
+
Rust
+
Scala
+
Scheme
+
Swift
+
Zig
+
diff --git a/_includes_v2/nav.html b/_includes_v2/nav.html new file mode 100644 index 00000000..788f84d4 --- /dev/null +++ b/_includes_v2/nav.html @@ -0,0 +1,100 @@ + + diff --git a/_includes_v2/runtime-grid.html b/_includes_v2/runtime-grid.html new file mode 100644 index 00000000..c625ab4a --- /dev/null +++ b/_includes_v2/runtime-grid.html @@ -0,0 +1,13 @@ +
+
Chrome
+
Firefox
+
Safari
+
Node.js
+
Deno
+
Cloudflare
+
wasmWasmtime
+
WRWasmer
+
WEWasmEdge
+
Fastly
+
Bun
+
diff --git a/_includes_v2/scripts.html b/_includes_v2/scripts.html new file mode 100644 index 00000000..494ce650 --- /dev/null +++ b/_includes_v2/scripts.html @@ -0,0 +1,147 @@ + diff --git a/_layouts_v2/base.html b/_layouts_v2/base.html new file mode 100644 index 00000000..2c3c9e5a --- /dev/null +++ b/_layouts_v2/base.html @@ -0,0 +1,12 @@ + + + + {% include head.html %} + + + {% include nav.html %} +
{{ content }}
+ {% include footer.html %} + {% include scripts.html %} + + diff --git a/_layouts_v2/community.html b/_layouts_v2/community.html new file mode 100644 index 00000000..8b2a1442 --- /dev/null +++ b/_layouts_v2/community.html @@ -0,0 +1,18 @@ +--- +layout: base +--- +
+
+ {{ content }} +
+ +
diff --git a/_layouts_v2/doc.html b/_layouts_v2/doc.html new file mode 100644 index 00000000..7bfe5f11 --- /dev/null +++ b/_layouts_v2/doc.html @@ -0,0 +1,16 @@ +--- +layout: base +--- +
+
+ {{ content }} +
+ +
diff --git a/_layouts_v2/getting-started.html b/_layouts_v2/getting-started.html new file mode 100644 index 00000000..f936c6e0 --- /dev/null +++ b/_layouts_v2/getting-started.html @@ -0,0 +1,17 @@ +--- +layout: base +--- +
+
+ {{ content }} +
+ +
diff --git a/_layouts_v2/home.html b/_layouts_v2/home.html new file mode 100644 index 00000000..09f80b2a --- /dev/null +++ b/_layouts_v2/home.html @@ -0,0 +1,189 @@ +--- +layout: base +--- + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+

+ Run code in any language - fast, secure and portable. +

+
{{ lead }}
+ +
+
+ +
+ + +
+
+

An open web standard.

+

+ Developer reference documentation for Wasm can be found on + MDN's WebAssembly pages. The open standards for WebAssembly are developed in a + W3C Community Group + (that includes representatives from all major browsers) as well as a + W3C Working Group. +

+
+
{{ content }}
+
+ +
+ + +
+
+
+

Code in your language.

+

+ Choose your language, pick a toolchain, and ship production-grade Wasm + in minutes. +

+
+
+ 30+ languages +
+
+ +
+
{% include lang-grid.html %}
+
+
+ +
+ + +
+
+
+

Compile to WebAssembly.

+

+ WebAssembly is a low-level, portable, size- and load-time-efficient + binary format suitable for compilation to the web. It runs your code at + near-native speed in a sandboxed environment and isolates code, data, + and host resources. +

+
+
+
;; A simple add function
+(module
+  (func $add (param $a i32) (param $b i32) (result i32)
+local.get $a
+local.get $b
+i32.add)
+  (export "add" (func $add)))
+
+
+
+ +
+ + +
+
+
+

Run anywhere.

+

+ Execute Wasm modules in browsers, on the server, at the edge, or + embedded in any application. +

+
+
+ 20+ runtimes +
+
+ 3 browser engines +
+
+
+
{% include runtime-grid.html %}
+
+
+ +
diff --git a/_layouts_v2/page.html b/_layouts_v2/page.html new file mode 100644 index 00000000..052b04ab --- /dev/null +++ b/_layouts_v2/page.html @@ -0,0 +1,8 @@ +--- +layout: base +--- +
+
+ {{ content }} +
+
diff --git a/_layouts_v2/upstream.html b/_layouts_v2/upstream.html new file mode 100644 index 00000000..e0a7ecc6 --- /dev/null +++ b/_layouts_v2/upstream.html @@ -0,0 +1,6 @@ +--- +layout: base +--- +
+ {{ content }} +
diff --git a/css/style.css b/css/style.css new file mode 100644 index 00000000..557ac936 --- /dev/null +++ b/css/style.css @@ -0,0 +1,1552 @@ +/* Inter – variable font, weights 100-900 */ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/fonts/inter-latin.woff2') format('woff2'); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, + U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url('/fonts/inter-latin-ext.woff2') format('woff2'); + unicode-range: + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, + U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +/* JetBrains Mono – variable font, weights 100-800 */ +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url('/fonts/jetbrains-mono-latin.woff2') format('woff2'); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, + U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, + U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 100 800; + font-display: swap; + src: url('/fonts/jetbrains-mono-latin-ext.woff2') format('woff2'); + unicode-range: + U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, + U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, + U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +*, +*::before, +*::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +:root { + --black: #060a14; + --white: #ffffff; + --gray-100: #f5f5f5; + --gray-200: #e5e5e5; + --gray-400: rgba(255, 255, 255, 0.64); + --gray-500: rgba(255, 255, 255, 0.45); + --gray-600: rgba(255, 255, 255, 0.32); + --gray-800: #262626; + --gray-900: #0c1220; + --border: rgba(255, 255, 255, 0.12); + --border-strong: rgba(255, 255, 255, 0.2); + --surface-hover: rgba(255, 255, 255, 0.06); + --surface-code: rgba(255, 255, 255, 0.08); + --nav-bg: rgba(6, 10, 20, 0.4); + --hero-glow: rgba(255, 255, 255, 0.12); + --font: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; + --mono: 'JetBrains Mono', monospace; + + /* Bridge upstream CSS variables for feature-table */ + --color-bg: var(--black); + --color-bg-highlight: var(--surface-hover); + --color-bg-secondary: var(--gray-900); + --color-link: #7cb1e2; + --color-link-visited: #ab8fee; + --color-border: var(--border); + --color-border-primary: #2a4872; +} + +[data-theme='light'] { + --black: #ffffff; + --white: #111111; + --gray-100: #1a1a1a; + --gray-200: #333333; + --gray-400: #555555; + --gray-500: #777777; + --gray-600: #999999; + --gray-800: #e8e8e8; + --gray-900: #f3f4f6; + --border: rgba(0, 0, 0, 0.1); + --border-strong: rgba(0, 0, 0, 0.2); + --surface-hover: rgba(0, 0, 0, 0.03); + --surface-code: rgba(0, 0, 0, 0.06); + --nav-bg: rgba(255, 255, 255, 0.8); + --hero-glow: rgba(100, 100, 100, 0.08); + + /* Bridge upstream CSS variables for feature-table */ + --color-bg: var(--black); + --color-bg-highlight: var(--surface-hover); + --color-bg-secondary: var(--gray-900); + --color-link: #1751a7; + --color-link-visited: #5817a7; + --color-border: var(--border); + --color-border-primary: #7facec; +} + +html { + font-family: var(--font); + background: var(--black); + color: var(--white); + scroll-behavior: smooth; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + overflow-x: hidden; +} + +a { + color: inherit; +} + +/* ── Nav ── */ +.site-nav { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 100; + padding: 0 60px; + height: 64px; + display: flex; + align-items: center; + justify-content: space-between; + background: rgba(6, 10, 20, 0.2); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-bottom: none; + box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.1); + transition: + background 0.3s, + box-shadow 0.3s, + backdrop-filter 0.3s, + -webkit-backdrop-filter 0.3s; +} + +.site-nav.scrolled { + background: var(--nav-bg); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + box-shadow: inset 0 -1px 0 var(--border); +} + +[data-theme='light'] .site-nav { + background: var(--nav-bg); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + box-shadow: inset 0 -1px 0 var(--border); +} + +.nav-logo { + display: flex; + align-items: center; + text-decoration: none; +} + +.nav-logo .wasm-banner { + height: 36px; + width: auto; +} + +.nav-links { + display: flex; + gap: 4px; + list-style: none; +} + +.nav-links a { + text-decoration: none; + font-size: 14px; + font-weight: 500; + color: var(--gray-400); + padding: 6px 14px; + border-radius: 6px; + transition: color 0.15s; +} + +.nav-links a:hover { + color: var(--white); +} + +/* Burger button (hidden on desktop) */ +.burger { + display: none; + background: none; + border: none; + cursor: pointer; + padding: 4px; + flex-direction: column; + gap: 5px; +} + +.burger span { + display: block; + width: 22px; + height: 2px; + background: var(--white); + border-radius: 1px; + transition: + transform 0.25s, + opacity 0.25s; +} + +.burger[aria-expanded='true'] span:nth-child(1) { + transform: translateY(7px) rotate(45deg); +} + +.burger[aria-expanded='true'] span:nth-child(2) { + opacity: 0; +} + +.burger[aria-expanded='true'] span:nth-child(3) { + transform: translateY(-7px) rotate(-45deg); +} + +.nav-right { + display: flex; + align-items: center; + gap: 12px; +} + +.btn-outline { + display: inline-flex; + align-items: center; + gap: 6px; + font-family: var(--font); + font-size: 13px; + font-weight: 600; + color: var(--white); + text-decoration: none; + white-space: nowrap; + padding: 8px 16px; + border: 1px solid var(--border); + border-radius: 6px; + background: transparent; + cursor: pointer; + transition: + border-color 0.15s, + background 0.15s; +} + +.btn-outline:hover { + border-color: var(--border-strong); + background: var(--surface-hover); +} + +.btn-solid { + display: inline-flex; + align-items: center; + gap: 6px; + font-family: var(--font); + font-size: 13px; + font-weight: 600; + color: var(--black); + text-decoration: none; + white-space: nowrap; + padding: 8px 18px; + border: 1px solid var(--white); + border-radius: 6px; + background: var(--white); + cursor: pointer; + transition: opacity 0.15s; +} + +.btn-solid:hover { + opacity: 0.88; +} + +/* ── Theme toggle ── */ +.theme-toggle { + display: flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + background: none; + border: 1px solid var(--border); + border-radius: 6px; + cursor: pointer; + color: var(--gray-400); + transition: + color 0.15s, + border-color 0.15s; +} + +.theme-toggle:hover { + color: var(--white); + border-color: var(--border-strong); +} + +.theme-toggle .icon-sun, +.theme-toggle .icon-moon { + display: none; +} +[data-theme='dark'] .theme-toggle .icon-sun, +:root:not([data-theme]) .theme-toggle .icon-sun { + display: block; +} +[data-theme='light'] .theme-toggle .icon-moon { + display: block; +} + +/* Light mode: invert SVG logo fill */ +[data-theme='light'] .wasm-banner { + fill: #111111; +} + +/* Dark mode: invert logos that are dark-on-transparent (upstream feature table) */ +:root:not([data-theme='light']) .invert-in-dark-theme { + filter: invert(0.8); +} + +/* ── Hero ── */ +.hero-wrapper { + position: relative; + min-height: 100svh; + display: flex; + align-items: center; + overflow-x: clip; + overflow-y: visible; +} + +.hero-wrapper::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 200svh; + background: + linear-gradient( + hsla(247, 76%, 61%, 0.3) 0%, + hsla(247, 76%, 61%, 0.2) 22%, + hsla(247, 76%, 61%, 0.1) 40%, + transparent 75% + ), + radial-gradient( + circle at 30% 20%, + hsla(247, 76%, 61%, 0.4) 0%, + hsla(247, 76%, 61%, 0.2) 22%, + hsla(247, 76%, 61%, 0) 60%, + transparent 75% + ); + pointer-events: none; + z-index: 0; +} + +[data-theme='light'] .hero-wrapper::before { + background: radial-gradient( + ellipse at center, + var(--hero-glow) 0%, + transparent 65% + ); +} + +.hero { + position: relative; + padding: 120px 60px 80px; + padding-top: max(120px, 64px); + max-width: 1400px; + margin: 0 auto; + width: 100%; +} + +.hero h1 { + font-size: clamp(45px, 5.3vw, 70px); + font-weight: 700; + line-height: 0.97; + letter-spacing: -0.05em; + margin-bottom: 48px; + max-width: 880px; +} + +.hero-lead { + font-size: 0; +} + +.hero-sub { + font-size: 18px; + line-height: 1.7; + color: var(--gray-400); + max-width: 640px; + font-weight: 400; + margin-bottom: 48px; +} + +.hero-sub .highlight { + color: var(--white); + font-weight: 500; +} + +.hero-actions { + display: flex; + gap: 16px; + flex-wrap: wrap; +} + +.hero-actions .btn-solid { + padding: 14px 32px; + font-size: 15px; + border-radius: 8px; +} + +.hero-actions .btn-outline { + padding: 14px 28px; + font-size: 15px; + border-radius: 8px; +} + +/* ── Section ── */ +section { + padding: 0 60px; + max-width: 1400px; + margin: 0 auto; +} + +.section-pad { + padding-top: 120px; + padding-bottom: 120px; +} + +.divider { + border: none; + border-top: 1px solid var(--border); + margin: 0; +} + +/* ── Features ── */ +.features-intro { + padding-bottom: 48px; +} + +.features-intro h2 { + font-size: clamp(36px, 5vw, 72px); + font-weight: 700; + line-height: 0.95; + letter-spacing: -0.045em; + margin-bottom: 32px; + max-width: 800px; +} + +.features-intro p { + font-size: 18px; + line-height: 1.7; + color: rgba(255, 255, 255, 0.55); + max-width: 700px; +} + +[data-theme='light'] .features-intro p { + color: var(--gray-400); +} + +.features-intro a { + color: var(--white); + text-decoration: underline; + text-underline-offset: 2px; + text-decoration-color: var(--border-strong); +} + +.features-intro a:hover { + text-decoration-color: var(--white); +} + +.features-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + border: 1px solid var(--border); +} + +.feature-card { + padding: 48px 36px; + border-right: 1px solid var(--border); + transition: background 0.2s; +} + +.feature-card:last-child { + border-right: none; +} + +.feature-card:hover { + background: var(--surface-hover); +} + +.feature-icon { + margin-bottom: 32px; + color: var(--white); +} + +.feature-card h3 { + font-family: var(--mono); + font-size: 14px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.06em; + margin-bottom: 20px; +} + +.feature-card p { + font-size: 15px; + line-height: 1.7; + color: var(--gray-400); + font-weight: 400; +} + +/* ── Stats ── */ +.stats-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + border: 1px solid var(--border); +} + +.stat-item { + padding: 60px 36px; + border-right: 1px solid var(--border); +} + +.stat-item:last-child { + border-right: none; +} + +.stat-number { + font-size: 72px; + font-weight: 700; + letter-spacing: -0.05em; + line-height: 1; + margin-bottom: 8px; +} + +.stat-label { + font-size: 14px; + color: var(--gray-500); + font-weight: 400; +} + +/* ── Languages ── */ +.languages-section { + display: grid; + grid-template-columns: 2fr 3fr; + gap: 80px; + align-items: start; +} + +.languages-section > * { + min-width: 0; +} + +.languages-intro { + padding-bottom: 0; +} + +.languages-intro h2 { + font-size: clamp(36px, 5vw, 72px); + font-weight: 700; + line-height: 0.95; + letter-spacing: -0.045em; + margin-bottom: 32px; + max-width: 700px; +} + +.languages-intro p { + font-size: 18px; + line-height: 1.7; + color: var(--gray-400); + max-width: 480px; +} + +.languages-actions { + display: flex; + gap: 12px; + margin-top: 32px; +} + +.languages-actions .btn-solid { + padding: 14px 32px; + font-size: 15px; + border-radius: 8px; +} + +.languages-actions .btn-outline { + padding: 14px 28px; + font-size: 15px; + border-radius: 8px; +} + +.lang-grid { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.lang-chip { + display: inline-flex; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 12px 16px; + border: none; + font-size: 12px; + font-weight: 500; + color: var(--gray-500); + cursor: default; +} + +.lang-chip:hover { + opacity: 0.7; +} + +.lang-icon { + width: 72px; + height: 72px; + flex-shrink: 0; + object-fit: contain; +} + +[data-theme='light'] .lang-icon { + filter: invert(1); +} + +/* Compact lang-grid inside prose (getting-started, etc.) */ +.prose .lang-grid { + gap: 4px; + margin-bottom: 40px; +} +.prose .lang-chip { + padding: 10px 14px; + gap: 10px; + font-size: 11px; +} +.prose .lang-icon { + width: 40px; + height: 40px; +} + +/* Inline language icons in lists */ +.lang-icon-inline { + width: 20px; + height: 20px; + vertical-align: middle; + margin-right: 4px; +} +[data-theme='light'] .lang-icon-inline { + filter: invert(1); +} + +/* ── WA Logo ── */ +.wasm-logo { + flex-shrink: 0; +} + +.hero-brand { + margin-bottom: 48px; +} + +.hero-brand .wasm-banner { + height: clamp(64px, 8vw, 128px); + width: auto; +} + +/* ── Code sample ── */ +.code-section { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 80px; + align-items: center; +} + +.code-section > * { + min-width: 0; +} + +.code-text h2 { + font-size: clamp(36px, 5vw, 72px); + font-weight: 700; + line-height: 0.95; + letter-spacing: -0.04em; + margin-bottom: 24px; +} + +.code-text p { + font-size: 16px; + line-height: 1.7; + color: var(--gray-400); + max-width: 440px; +} + +.stats-inline { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px 24px; + margin-top: 32px; +} + +.stat-inline { + font-size: 16px; + color: var(--gray-400); +} + +.stat-inline .stat-number { + font-weight: 700; + color: var(--white); + font-size: 28px; + margin-right: 4px; +} + +.code-block { + background: var(--gray-900); + border: 1px solid var(--border); + padding: 36px 40px; + font-family: var(--mono); + font-size: 14px; + line-height: 1.8; + color: var(--gray-400); + overflow-x: auto; + min-width: 0; + max-width: 100%; +} + +.code-block .kw { + color: var(--white); + font-weight: 500; +} +.code-block .fn { + color: var(--gray-200); +} +.code-block .str { + color: var(--gray-400); +} +.code-block .cm { + color: var(--gray-600); +} + +/* ── FAQ ── */ +.faq-intro { + padding-bottom: 64px; +} + +.faq-intro h2 { + font-size: clamp(36px, 5vw, 72px); + font-weight: 700; + line-height: 0.95; + letter-spacing: -0.045em; +} + +.faq-list { + max-width: 860px; + border-top: 1px solid var(--border); +} + +.faq-item { + border-bottom: 1px solid var(--border); +} + +.faq-q { + width: 100%; + background: none; + border: none; + font-family: var(--font); + font-size: 18px; + font-weight: 500; + color: var(--white); + text-align: left; + padding: 28px 48px 28px 0; + cursor: pointer; + position: relative; + letter-spacing: -0.02em; + transition: color 0.15s; +} + +.faq-q:hover { + color: var(--gray-200); +} + +.faq-q::after { + content: '+'; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + font-size: 24px; + font-weight: 300; + color: var(--gray-500); + transition: transform 0.2s; +} + +.faq-item.open .faq-q::after { + content: '\2212'; + color: var(--white); +} + +.faq-a { + max-height: 0; + overflow: hidden; + transition: max-height 0.35s ease; +} + +.faq-a-inner { + padding-bottom: 28px; + font-size: 16px; + line-height: 1.75; + color: var(--gray-400); + max-width: 680px; +} + +/* ── Pillars Content (rendered from index.md) ── */ +.pillars-content { + display: grid; + grid-template-columns: repeat(4, 1fr); + border: 1px solid var(--border); +} + +.pillars-content .row { + display: contents; +} + +.pillars-content .bubble { + padding: 48px 36px; + border-right: 1px solid var(--border); + transition: background 0.2s; +} + +.pillars-content .bubble:last-child { + border-right: none; +} + +.pillars-content .bubble:hover { + background: rgba(255, 255, 255, 0.06); +} + +.pillars-content .bubble h3 { + font-family: var(--mono); + font-size: 14px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.06em; + margin-bottom: 20px; + color: var(--white); +} + +.pillars-content .bubble p { + margin: 0; + font-size: 15px; + line-height: 1.7; + color: var(--gray-400); +} + +.pillars-content a { + color: var(--white); + text-decoration: underline; + text-underline-offset: 2px; + text-decoration-color: var(--border-strong); +} + +.pillars-content a:hover { + text-decoration-color: var(--white); +} + +/* Icons via CSS for pillar bubbles */ +.pillars-content .bubble::before { + content: ''; + display: block; + width: 28px; + height: 28px; + margin-bottom: 32px; + background: no-repeat center / contain; +} + +:root[data-theme='light'] .pillars-content .bubble::before { + filter: invert(1); +} + +/* Lightning bolt — Efficient and fast */ +.pillars-content .row .bubble:nth-child(1)::before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolygon points='13 2 3 14 12 14 11 22 21 10 12 10 13 2'/%3E%3C/svg%3E"); +} + +/* Lock — Safe */ +.pillars-content .row .bubble:nth-child(2)::before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2' ry='2'/%3E%3Cpath d='M7 11V7a5 5 0 0110 0v4'/%3E%3C/svg%3E"); +} + +/* Code brackets — Open and debuggable */ +.pillars-content .row .bubble:nth-child(3)::before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='16 18 22 12 16 6'/%3E%3Cpolyline points='8 6 2 12 8 18'/%3E%3C/svg%3E"); +} + +/* Globe — Part of the open web platform */ +.pillars-content .row .bubble:nth-child(4)::before { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='2' y1='12' x2='22' y2='12'/%3E%3Cpath d='M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z'/%3E%3C/svg%3E"); +} + +/* ── CTA ── */ +.cta { + text-align: left; +} + +.cta h2 { + font-size: clamp(36px, 5vw, 72px); + font-weight: 700; + line-height: 0.95; + letter-spacing: -0.045em; + margin-bottom: 28px; + max-width: 600px; +} + +.cta p { + font-size: 18px; + line-height: 1.7; + color: var(--gray-400); + max-width: 480px; + margin-bottom: 40px; +} + +.cta-actions { + display: flex; + gap: 16px; +} + +.cta-actions .btn-solid { + padding: 14px 32px; + font-size: 15px; + border-radius: 8px; +} + +.cta-actions .btn-outline { + padding: 14px 28px; + font-size: 15px; + border-radius: 8px; +} + +/* ── Footer ── */ +footer { + padding: 64px 60px; + max-width: 1400px; + margin: 0 auto; +} + +.footer-top { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 48px; + padding-bottom: 48px; +} + +.footer-brand p { + margin-top: 12px; + font-size: 14px; + color: var(--gray-500); +} + +.footer-cols { + display: flex; + gap: 72px; +} + +.footer-col h4 { + font-family: var(--mono); + font-size: 11px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--gray-500); + margin-bottom: 20px; +} + +.footer-col ul { + list-style: none; + display: flex; + flex-direction: column; + gap: 12px; +} + +.footer-col a { + font-size: 14px; + color: var(--gray-500); + text-decoration: none; + transition: color 0.15s; +} + +.footer-col a:hover { + color: var(--white); +} + +.footer-bottom { + padding-top: 32px; + border-top: 1px solid var(--border); + display: flex; + justify-content: space-between; + align-items: center; +} + +.footer-bottom p { + font-size: 13px; + color: var(--gray-600); +} + +.footer-bottom-links { + display: flex; + gap: 24px; +} + +.footer-bottom-links a { + font-size: 13px; + color: var(--gray-600); + text-decoration: none; + transition: color 0.15s; +} + +.footer-bottom-links a:hover { + color: var(--white); +} + +/* ── Scroll reveal ── */ +.reveal { + opacity: 0; + transform: translateY(28px); + transition: + opacity 0.6s ease, + transform 0.6s ease; +} + +.reveal.visible { + opacity: 1; + transform: translateY(0); +} + +.rd1 { + transition-delay: 0.08s; +} +.rd2 { + transition-delay: 0.16s; +} +.rd3 { + transition-delay: 0.24s; +} +.rd4 { + transition-delay: 0.32s; +} + +/* ── Nav compact (burger) mode — toggled by JS based on measured width ── */ +.site-nav.nav-compact .burger { + display: flex; +} + +.site-nav.nav-compact { + padding: 0 28px; + flex-wrap: wrap; +} + +.site-nav.nav-compact.menu-open { + height: auto; + min-height: 64px; + align-items: flex-start; + padding-top: 18px; +} + +.site-nav.nav-compact .nav-links { + display: none; + flex-direction: column; + align-items: center; + width: 100%; + padding: 12px 0 16px; + gap: 0; + order: 10; + border-top: 1px solid rgba(255, 255, 255, 0.15); + border-bottom: 1px solid rgba(255, 255, 255, 0.15); +} + +.site-nav.nav-compact .nav-links.open { + display: flex; +} + +.site-nav.nav-compact .nav-links li { + width: 100%; +} + +.site-nav.nav-compact .nav-links li + li::before { + content: ''; + display: block; + width: 90%; + margin: 0 auto; + border-top: 1px solid rgba(255, 255, 255, 0.1); +} + +.site-nav.nav-compact .nav-links li a { + display: block; + padding: 12px 0; + font-size: 18px; + color: rgba(255, 255, 255, 0.85); + text-align: left; + padding-left: 5%; +} + +[data-theme='light'] .site-nav.nav-compact .nav-links { + border-top-color: rgba(0, 0, 0, 0.1); + border-bottom-color: rgba(0, 0, 0, 0.1); +} + +[data-theme='light'] .site-nav.nav-compact .nav-links li + li::before { + border-top-color: rgba(0, 0, 0, 0.08); +} + +[data-theme='light'] .site-nav.nav-compact .nav-links li a { + color: rgba(0, 0, 0, 0.75); +} + +.site-nav.nav-compact .nav-right { + display: none; +} + +.site-nav.nav-compact .nav-right.open { + display: flex; + width: 100%; + order: 11; + padding-bottom: 16px; +} + +/* ── Responsive layout ── */ +@media (max-width: 1000px) { + .hero { + padding: 140px 28px 100px; + } + + .hero-wrapper::before { + background: radial-gradient( + circle at 30% 20%, + hsla(247, 76%, 61%, 0.5) 0%, + hsla(247, 76%, 61%, 0.3) 20%, + hsla(247, 76%, 61%, 0.1) 40%, + transparent 60% + ); + } + section { + padding-left: 28px; + padding-right: 28px; + } + footer { + padding-left: 28px; + padding-right: 28px; + } + .features-grid { + grid-template-columns: repeat(2, 1fr); + } + .features-grid .feature-card:nth-child(2) { + border-right: none; + } + .features-grid .feature-card:nth-child(3), + .features-grid .feature-card:nth-child(4) { + border-top: 1px solid var(--border); + } + .pillars-content { + grid-template-columns: repeat(2, 1fr); + } + .pillars-content .bubble:last-child { + border-right: none; + } + .pillars-content .row .bubble:nth-child(n + 3) { + border-top: 1px solid var(--border); + } + .stats-grid { + grid-template-columns: repeat(2, 1fr); + } + .stats-grid .stat-item:nth-child(2) { + border-right: none; + } + .stats-grid .stat-item:nth-child(3), + .stats-grid .stat-item:nth-child(4) { + border-top: 1px solid var(--border); + } + .languages-section { + grid-template-columns: 1fr; + gap: 48px; + } + .code-section { + grid-template-columns: 1fr; + gap: 48px; + } + .footer-top { + flex-direction: column; + } +} + +@media (max-width: 600px) { + .section-pad { + padding-top: 60px; + padding-bottom: 60px; + } + .features-grid { + grid-template-columns: 1fr; + } + .feature-card { + border-right: none !important; + border-bottom: 1px solid var(--border); + } + .feature-card:last-child { + border-bottom: none; + } + .pillars-content { + grid-template-columns: 1fr; + } + .pillars-content .bubble { + border-right: none !important; + border-bottom: 1px solid var(--border); + } + .pillars-content .bubble:last-child { + border-bottom: none; + } + .stats-grid { + grid-template-columns: 1fr; + } + .stat-item { + border-right: none !important; + border-bottom: 1px solid var(--border); + } + .stat-item:last-child { + border-bottom: none; + } + .footer-cols { + flex-direction: column; + gap: 36px; + } + .cta-actions { + flex-direction: column; + } + .footer-bottom { + flex-direction: column; + gap: 16px; + } + .lang-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + justify-items: center; + } + .lang-chip { + padding: 8px 10px; + gap: 6px; + font-size: 11px; + } + .lang-icon { + width: 40px; + height: 40px; + } +} + +/* ── Prose (markdown content) ── */ +.prose { + max-width: 800px; + line-height: 1.8; + color: var(--gray-200); +} + +.prose h1, +.prose h2, +.prose h3, +.prose h4, +.prose h5, +.prose h6 { + color: var(--white); + margin-top: 2em; + margin-bottom: 0.5em; +} + +.prose h1 { + font-size: 2rem; + font-weight: 800; +} +.prose h2 { + font-size: 1.5rem; + font-weight: 700; +} +.prose h3 { + font-size: 1.25rem; + font-weight: 600; +} + +.prose p { + margin-bottom: 1em; +} + +.prose a { + color: var(--white); + text-decoration: underline; + text-decoration-color: var(--border-strong); + text-underline-offset: 2px; + transition: text-decoration-color 0.15s; +} + +.prose a:hover { + text-decoration-color: var(--white); +} + +.prose ul, +.prose ol { + margin-bottom: 1em; + padding-left: 1.5em; +} + +.prose li { + margin-bottom: 0.25em; +} + +.prose code { + font-family: var(--mono); + font-size: 0.9em; + background: var(--surface-code); + padding: 2px 6px; + border-radius: 4px; +} + +.prose pre { + font-family: var(--mono); + font-size: 0.85em; + background: var(--gray-900); + border: 1px solid var(--border); + border-radius: 8px; + padding: 20px 24px; + overflow-x: auto; + margin-bottom: 1.5em; +} + +.prose pre code { + background: none; + padding: 0; +} + +.prose img { + max-width: 100%; + border-radius: 8px; +} + +.prose blockquote { + border-left: 3px solid var(--border-strong); + padding-left: 1em; + margin-bottom: 1em; + color: var(--gray-400); +} + +.prose table { + width: 100%; + border-collapse: collapse; + margin-bottom: 1.5em; +} + +.prose th, +.prose td { + padding: 8px 12px; + border: 1px solid var(--border); + text-align: left; +} + +.prose th { + background: var(--surface-hover); + font-weight: 600; +} + +/* Upstream content pages (features, etc.) — no .prose wrapper */ +.upstream-content { + max-width: 1080px; + margin: 0 auto; + padding: 80px 15px 40px; + line-height: 1.5; +} + +.upstream-content p { + margin-bottom: 1em; +} + +.upstream-content h1 { + font-size: 2rem; + font-weight: 600; + margin-bottom: 1rem; + line-height: 1.25; +} + +.upstream-content a { + color: var(--white); + text-decoration: underline; + text-decoration-color: var(--border-strong); + text-underline-offset: 2px; + transition: text-decoration-color 0.15s; +} + +.upstream-content a:hover { + text-decoration-color: var(--white); +} + +@media (max-width: 768px) { + .upstream-content { + padding: 70px 15px 40px; + } +} + +/* ── Content layout (subpages with sidebar) ── */ +.content-layout { + display: grid; + grid-template-columns: 1fr 240px; + gap: 60px; + max-width: 1100px; + margin: 0 auto; + padding: 120px 40px 80px; +} + +@media (max-width: 768px) { + .content-layout { + grid-template-columns: 1fr; + gap: 40px; + padding: 100px 20px 60px; + } +} + +/* ── Sidebar ── */ +.content-layout aside { + position: sticky; + top: 88px; + align-self: start; +} + +.sidebar-title { + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.1em; + color: var(--gray-500); + margin-bottom: 12px; +} + +.sidebar-nav { + display: flex; + flex-direction: column; + gap: 2px; +} + +.sidebar-nav a { + display: block; + font-size: 14px; + color: var(--gray-400); + text-decoration: none; + padding: 6px 12px; + border-radius: 6px; + transition: + color 0.15s, + background 0.15s; +} + +.sidebar-nav a:hover { + color: var(--white); + background: var(--surface-hover); +} + +/* Match upstream's font stack so table column widths stay consistent */ +#feature-table { + font-family: + system-ui, + -apple-system, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Open Sans', + 'Helvetica Neue', + sans-serif; +} + +/* ── Feature table sticky header ── */ +#feature-scroll { + max-height: 80vh; + overflow: auto; +} +#feature-table thead .platform-header-row th { + position: sticky; + top: 0; + z-index: 10; + background: var(--color-bg); +} +#feature-table thead .platform-header-row .top-corner { + z-index: 12; +} + +/* ── Feature table dark-mode overrides ── */ +/* Upstream feature-table.css has hardcoded light-theme status colors */ +:root #feature-table .text-secondary { + color: rgba(255, 255, 255, 0.6); +} +:root #feature-table .status-yes { + color: #6fcf7f; + fill: #6fcf7f; +} +:root #feature-table .status-no { + color: #e57b9a; + fill: #e57b9a; +} +:root #feature-table .status-experimental { + color: #7cacf0; + fill: #7cacf0; +} +:root #feature-table .status-not-applicable, +:root #feature-table .status-unknown, +:root #feature-table .details-note svg { + color: #8a9baa; + fill: #8a9baa; +} + +[data-theme='light'] #feature-table .text-secondary { + color: rgba(0, 0, 0, 0.6); +} +[data-theme='light'] #feature-table .status-yes { + color: #0c3d10; + fill: #5c6b5d; +} +[data-theme='light'] #feature-table .status-no { + color: #83264a; + fill: #86556f; +} +[data-theme='light'] #feature-table .status-experimental { + color: #143a93; + fill: #3f63b7; +} +[data-theme='light'] #feature-table .status-not-applicable, +[data-theme='light'] #feature-table .status-unknown, +[data-theme='light'] #feature-table .details-note svg { + color: #52656f; + fill: #78909c; +} diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 00000000..010b0797 --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,258 @@ +import { readFileSync } from "node:fs"; +import markdownIt from "markdown-it"; +import { full as markdownItEmoji } from "markdown-it-emoji"; + +// ── Port of auto_titles.rb ── +// Hardcoded doc ordering (from Jekyll plugin) +const DOC_ORDER = [ + "WebAssembly High-Level Goals", + "JavaScript API", + "Binary Encoding", + "Text Format", + "Semantics", + "Modules", + "FAQ", + "Design Rationale", + "Minimum Viable Product", + "Features to add after the MVP", + "Portability", + "Security", + "Nondeterminism in WebAssembly", + "Use Cases", + "Guide for C/C++ developers", + "Web Embedding", + "Non-Web Embeddings", + "Feature Test", + "Tooling support", + "GC / DOM / Web API Integration :unicorn:", + "JIT and Optimization Library", + "Dynamic linking", +]; + +function guessTitle(content) { + const match = content.match(/^#{1,6}\s+(.+)$/m); + return match ? match[1].trim() : ""; +} + +function assignWeight(title) { + const idx = DOC_ORDER.indexOf(title); + return idx >= 0 ? idx : 999; +} + +// ── Port of underscore_paths.rb ── +// Convert CamelCase to kebab-case +function toKebab(str) { + return str + .replace(/::/g, "/") + .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2") + .replace(/([a-z\d])([A-Z])/g, "$1-$2") + .toLowerCase(); +} + +// ── Port of link_converter.rb ── +// Rewrite .md links to relative pretty URLs with kebab-case +function rewriteMdLinks(content) { + // Inline links: [text](File.md) or [text](File.md#anchor) + content = content.replace( + /\[([^\]]*)\]\(([^:)]*?)\.md(#[^)\s]*)?\)/g, + (_, text, file, anchor) => { + const slug = toKebab(file); + return `[${text}](../${slug}/${anchor || ""})`; + }, + ); + // Reference links: [text]: File.md or [text]: File.md#anchor + content = content.replace( + /\[([^\]]*)\]: ([^:)]*?)\.md(#[^\s]*)?/g, + (_, text, file, anchor) => { + const slug = toKebab(file); + return `[${text}]: ../${slug}/${anchor || ""}`; + }, + ); + // Angle-bracket reference links: [text]: + content = content.replace( + /\[([^\]]*)\]: <([^:)]*?)\.md(#[^\s]*)?>?/g, + (_, text, file, anchor) => { + const slug = toKebab(file); + return `[${text}]: <../${slug}/${anchor || ""}>`; + }, + ); + return content; +} + +export default function (eleventyConfig) { + // Markdown with emoji + const md = markdownIt({ html: true, linkify: true }); + md.use(markdownItEmoji); + eleventyConfig.setLibrary("md", md); + + // LiquidJS: use Jekyll-compatible unquoted include paths + eleventyConfig.setLiquidOptions({ dynamicPartials: false }); + + // Layout aliases: map upstream layout names to our _layouts_v2/ files + eleventyConfig.addLayoutAlias("default", "page.html"); + eleventyConfig.addLayoutAlias("news", "page.html"); + + // Passthrough copy + eleventyConfig.addPassthroughCopy("fonts"); + eleventyConfig.addPassthroughCopy("css"); + eleventyConfig.addPassthroughCopy("images"); + eleventyConfig.addPassthroughCopy("favicon.ico"); + eleventyConfig.addPassthroughCopy("CNAME"); + eleventyConfig.addPassthroughCopy("js/**/*.js"); + eleventyConfig.addPassthroughCopy("js/**/*.mjs"); + eleventyConfig.addPassthroughCopy("js/**/*.html"); + eleventyConfig.addPassthroughCopy("assets"); + eleventyConfig.addPassthroughCopy("features.js"); + eleventyConfig.addPassthroughCopy("features.json"); + eleventyConfig.addPassthroughCopy("features.schema.json"); + eleventyConfig.addPassthroughCopy("google66d80fe1bc71482a.html"); + + // Ignore files (matching Jekyll excludes) + eleventyConfig.ignores.add("README.md"); + eleventyConfig.ignores.add("LICENSE"); + eleventyConfig.ignores.add("Gemfile"); + eleventyConfig.ignores.add("Gemfile.lock"); + eleventyConfig.ignores.add("design/LICENSE"); + eleventyConfig.ignores.add("design/Contributing.md"); + eleventyConfig.ignores.add("design/README.md"); + eleventyConfig.ignores.add("design/tools/**"); + eleventyConfig.ignores.add("docs/**"); + eleventyConfig.ignores.add("node_modules/**"); + + // Ignore upstream Jekyll files (avoid conflicts) + eleventyConfig.ignores.add("_includes/**"); + eleventyConfig.ignores.add("_layouts/**"); + eleventyConfig.ignores.add("_plugins/**"); + + // Ignore upstream-only files not processed by Eleventy + eleventyConfig.ignores.add("feed.xml"); + eleventyConfig.ignores.add("scripts/**"); + eleventyConfig.ignores.add("js/README.md"); + eleventyConfig.ignores.add("js/wasm-compat-test.html"); + + // Computed data: auto-generate title, weight, layout, type, and permalink + eleventyConfig.addGlobalData("eleventyComputed", { + title: (data) => { + if (data.title) return data.title; + if (data.page?.rawInput) return guessTitle(data.page.rawInput); + return ""; + }, + weight: (data) => { + const title = + data.title || (data.page?.rawInput ? guessTitle(data.page.rawInput) : ""); + return assignWeight(title); + }, + layout: (data) => { + const input = data.page?.inputPath || ""; + // Homepage uses our home layout instead of upstream's "default" + if (input === "./index.md") return "home.html"; + // Features page: use upstream layout (no .prose wrapper) + if (input === "./features.md") return "upstream.html"; + // Posts use page layout + if (input.startsWith("./_posts/")) return "page.html"; + if (data.layout) return data.layout; + // design/CodeOfConduct.md and design/Events.md → community layout + if (input.endsWith("design/CodeOfConduct.md") || input.endsWith("design/Events.md")) { + return "community.html"; + } + // All other design/ files → doc layout + if (input.startsWith("./design/")) { + return "doc.html"; + } + return data.layout; + }, + type: (data) => { + if (data.type) return data.type; + const input = data.page?.inputPath || ""; + if (input.endsWith("design/CodeOfConduct.md") || input.endsWith("design/Events.md")) { + return "community"; + } + if (input.startsWith("./design/")) { + return "doc"; + } + return data.type; + }, + permalink: (data) => { + if (data.permalink) return data.permalink; + const input = data.page?.inputPath || ""; + // Posts: /news/YYYY/MM/DD/slug/ (Jekyll-style) + if (input.startsWith("./_posts/")) { + const m = input.match(/_posts\/(\d{4})-(\d{2})-(\d{2})-(.+)\.md$/); + if (m) return `/news/${m[1]}/${m[2]}/${m[3]}/${m[4]}/`; + } + // Special permalinks for community pages from design/ + if (input.endsWith("design/CodeOfConduct.md")) return "/community/code-of-conduct/"; + if (input.endsWith("design/Events.md")) return "/community/events/"; + // Convert design/ CamelCase paths to /docs/kebab-case/ + if (input.startsWith("./design/")) { + const filename = input.replace("./design/", "").replace(".md", ""); + return `/docs/${toKebab(filename)}/`; + } + return data.permalink; + }, + }); + + // Transform: rewrite .md links in design/ pages + eleventyConfig.addTransform("rewriteMdLinks", function (content) { + if ( + this.page.inputPath?.startsWith("./design/") && + this.page.outputPath?.endsWith(".html") + ) { + return content; + } + return content; + }); + + // Pre-render transform: rewrite markdown links before rendering + eleventyConfig.on("eleventy.before", () => {}); + eleventyConfig.addPreprocessor("rewriteMdLinks", "md", (data, content) => { + if (data.page?.inputPath?.startsWith("./design/")) { + return rewriteMdLinks(content); + } + return content; + }); + + // Collection: posts from _posts/ (newest first) + eleventyConfig.addCollection("posts", (collectionApi) => { + return collectionApi + .getAll() + .filter((item) => item.inputPath?.startsWith("./_posts/")) + .sort((a, b) => b.date - a.date); + }); + + // Collection: sorted docs for sidebar + eleventyConfig.addCollection("docs", (collectionApi) => { + return collectionApi + .getAll() + .filter((item) => item.data.type === "doc") + .sort((a, b) => (a.data.weight || 999) - (b.data.weight || 999)); + }); + + // Liquid filter to inline a file's contents + eleventyConfig.addFilter("inlineFile", (path) => readFileSync(path, "utf-8")); + + // Liquid filter for sorting pages by weight + eleventyConfig.addFilter("sortByWeight", (pages) => { + return [...pages].sort( + (a, b) => (a.data?.weight || 999) - (b.data?.weight || 999), + ); + }); + + // Liquid filter to filter by type + eleventyConfig.addFilter("whereType", (pages, type) => { + return pages.filter((p) => p.data?.type === type); + }); + + return { + dir: { + input: ".", + output: "docs", + includes: "_includes_v2", + layouts: "_layouts_v2", + data: "_data", + }, + templateFormats: ["md", "html", "liquid", "njk"], + markdownTemplateEngine: "liquid", + htmlTemplateEngine: "liquid", + }; +} diff --git a/fonts/inter-latin-ext.woff2 b/fonts/inter-latin-ext.woff2 new file mode 100644 index 00000000..57da6f8d Binary files /dev/null and b/fonts/inter-latin-ext.woff2 differ diff --git a/fonts/inter-latin.woff2 b/fonts/inter-latin.woff2 new file mode 100644 index 00000000..91dc3e85 Binary files /dev/null and b/fonts/inter-latin.woff2 differ diff --git a/fonts/jetbrains-mono-latin-ext.woff2 b/fonts/jetbrains-mono-latin-ext.woff2 new file mode 100644 index 00000000..310faddf Binary files /dev/null and b/fonts/jetbrains-mono-latin-ext.woff2 differ diff --git a/fonts/jetbrains-mono-latin.woff2 b/fonts/jetbrains-mono-latin.woff2 new file mode 100644 index 00000000..2ca6ac60 Binary files /dev/null and b/fonts/jetbrains-mono-latin.woff2 differ diff --git a/getting-started/developers-guide.md b/getting-started/developers-guide.md index cfc7af3b..565bf6a4 100644 --- a/getting-started/developers-guide.md +++ b/getting-started/developers-guide.md @@ -8,44 +8,44 @@ layout: getting-started (This list is in alphabetical order.) -- [Ada](https://github.com/godunko/adawebpack) -- [AssemblyScript (a TypeScript-like syntax)](https://assemblyscript.org/introduction.html) -- C/C++ +- [Ada](https://github.com/godunko/adawebpack) +- [AssemblyScript (a TypeScript-like syntax)](https://assemblyscript.org/introduction.html) +- C/C++ - [starting from scratch](https://developer.mozilla.org/en-US/docs/WebAssembly/C_to_wasm) - [library that I want to port to the Web](https://developer.mozilla.org/en-US/docs/WebAssembly/existing_C_to_wasm) -- [C#](https://learn.microsoft.com/en-us/aspnet/core/blazor/tutorials) +- [C#](https://learn.microsoft.com/en-us/aspnet/core/blazor/tutorials) - [Cobol](https://github.com/cloudflare/cobweb) -- [D](https://wiki.dlang.org/Generating_WebAssembly_with_LDC) -- Dart +- [D](https://wiki.dlang.org/Generating_WebAssembly_with_LDC) +- Dart - [via Flutter](https://flutter.dev/wasm) -- [F#](https://fsbolero.io/docs/) -- Go +- [F#](https://fsbolero.io/docs/) +- Go - [with full language support](https://pkg.go.dev/cmd/compile#hdr-WebAssembly_Directives) - [targeting minimal size](https://tinygo.org/docs/guides/webassembly/) - [Grain](https://grain-lang.org/docs/) -- Haskell +- Haskell - [GHC WebAssembly backend](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/wasm.html) - [Asterius](https://asterius.netlify.app/) -- Java +- Java - [TeaVM](https://teavm.org) - [j2wasm](https://github.com/google/j2cl/blob/master/docs/getting-started-j2wasm.md) -- [Kotlin](https://kotl.in/wasm) -- [Lua](https://github.com/ysugimoto/webassembly-lua) +- [Kotlin](https://kotl.in/wasm) +- [Lua](https://github.com/ysugimoto/webassembly-lua) - [Moonbit](https://www.moonbitlang.com/) -- [Pascal](https://wiki.freepascal.org/WebAssembly/Compiler) -- [PHP](https://github.com/seanmorris/php-wasm) -- Python +- [Pascal](https://wiki.freepascal.org/WebAssembly/Compiler) +- [PHP](https://github.com/seanmorris/php-wasm) +- Python - [Pyodide](https://pyodide.org/en/stable/) - [Nuitka (py2wasm)](https://github.com/wasmerio/py2wasm) - [Pygbag](https://pygame-web.github.io/) (This is based on [python-wasm](https://github.com/python/cpython/blob/main/Tools/wasm/README.md), but mentioned separately because it gives pygame support) -- [R](https://docs.r-wasm.org/webr/latest/) +- [R](https://docs.r-wasm.org/webr/latest/) - [RemObjects Elements](https://docs.elementscompiler.com/Platforms/WebAssembly/) -- [Ruby](http://github.com/ruby/ruby.wasm) -- [Rust](https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_wasm) -- [Scala.js](https://www.scala-js.org/doc/project/webassembly.html) -- [Scheme](https://github.com/cisco/ChezScheme) -- [Swift](https://swiftwasm.org/) -- [Zig](https://ziglang.org/documentation/master/#WebAssembly) +- [Ruby](http://github.com/ruby/ruby.wasm) +- [Rust](https://developer.mozilla.org/en-US/docs/WebAssembly/Rust_to_wasm) +- [Scala.js](https://www.scala-js.org/doc/project/webassembly.html) +- [Scheme](https://github.com/cisco/ChezScheme) +- [Swift](https://swiftwasm.org/) +- [Zig](https://ziglang.org/documentation/master/#WebAssembly) ## Use the compiled WebAssembly… diff --git a/index.md b/index.md index 571a242a..4ffedad3 100644 --- a/index.md +++ b/index.md @@ -1,16 +1,18 @@ --- layout: default -lead: - WebAssembly (abbreviated Wasm) is a binary instruction format for a +lead: WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications. + +

WebAssembly (abbreviated Wasm) is a + binary instruction format for a stack-based virtual machine. A portable compilation target for programming languages + that enables near-native performance on the + web, server, and embedded systems.

--- -
- Developer reference documentation for Wasm can be found on MDN's WebAssembly pages. - The open standards for WebAssembly are developed in a W3C Community Group (that includes representatives from all major browsers) as well as a W3C Working Group. -

Efficient and fast

@@ -20,8 +22,6 @@ lead:

Safe

WebAssembly describes a memory-safe, sandboxed execution environment that may even be implemented inside existing JavaScript virtual machines. When embedded in the web, WebAssembly will enforce the same-origin and permissions security policies of the browser.

-
-

Open and debuggable

WebAssembly is designed to be pretty-printed in a textual format for debugging, testing, experimenting, optimizing, learning, teaching, and writing programs by hand. The textual format will be used when viewing the source of Wasm modules on the web.

diff --git a/news.html b/news.html index cc1af61c..1c5c1830 100644 --- a/news.html +++ b/news.html @@ -14,9 +14,9 @@

News

alt="Subscribe to the news feed" />
    - {% for post in site.posts %} + {% for post in collections.posts %}
  • - {{ post.title }} + {{ post.data.title }} — {{ post.date | date: "%B %d, %Y" }}
  • {% endfor %} diff --git a/package-lock.json b/package-lock.json index 086c0e2e..c2c796dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,9 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "dark-mode-toggle": "^0.18.0" + "@11ty/eleventy": "^3.1.2", + "dark-mode-toggle": "^0.18.0", + "markdown-it-emoji": "^3.0.0" }, "devDependencies": { "prettier": "^3.7.4", @@ -17,6 +19,218 @@ "svgo": "^4.0.0" } }, + "node_modules/@11ty/dependency-tree": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.2.tgz", + "integrity": "sha512-RTF6VTZHatYf7fSZBUN3RKwiUeJh5dhWV61gDPrHhQF2/gzruAkYz8yXuvGLx3w3ZBKreGrR+MfYpSVkdbdbLA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.4.tgz", + "integrity": "sha512-MYKC0Ac77ILr1HnRJalzKDlb9Z8To3kXQCltx299pUXXUFtJ1RIONtULlknknqW8cLe19DLVgmxVCtjEFm7h0A==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "acorn": "^8.15.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + } + }, + "node_modules/@11ty/eleventy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.2.tgz", + "integrity": "sha512-IcsDlbXnBf8cHzbM1YBv3JcTyLB35EK88QexmVyFdVJVgUU6bh9g687rpxryJirHzo06PuwnYaEEdVZQfIgRGg==", + "license": "MIT", + "dependencies": { + "@11ty/dependency-tree": "^4.0.0", + "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/eleventy-dev-server": "^2.0.8", + "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.1", + "@11ty/recursive-copy": "^4.0.2", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "filesize": "^10.1.6", + "gray-matter": "^4.0.3", + "iso-639-1": "^3.1.5", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "liquidjs": "^10.21.1", + "luxon": "^3.6.1", + "markdown-it": "^14.1.0", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.2", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.6", + "posthtml-match-helper": "^2.0.3", + "semver": "^7.7.2", + "slugify": "^1.6.6", + "tinyglobby": "^0.2.14" + }, + "bin": { + "eleventy": "cmd.cjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.8.tgz", + "integrity": "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1", + "chokidar": "^3.6.0", + "debug": "^4.4.0", + "finalhandler": "^1.3.1", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.4", + "please-upgrade-node": "^3.2.0", + "send": "^1.1.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.1" + }, + "bin": { + "eleventy-dev-server": "cmd.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-bundle": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", + "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==", + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.2", + "debug": "^4.4.0", + "posthtml-match-helper": "^2.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@11ty/eleventy/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@11ty/eleventy/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@11ty/lodash-custom": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", + "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.2.tgz", + "integrity": "sha512-0vaV3Wt0surZ+oS1VdKKe0axeeupuM+l7W/Z866WFQwF+dGg2Tc/nmhk/5l74/Y55P8KyImnLN9CdygNw2huHg==", + "license": "MIT", + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "parse-srcset": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@11ty/recursive-copy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.3.tgz", + "integrity": "sha512-SX48BTLEGX8T/OsKWORsHAAeiDsbFl79Oa/0Wg/mv/d27b7trCVZs7fMHvpSgDvZz/fZqx5rDk8+nx5oyT7xBw==", + "license": "ISC", + "dependencies": { + "errno": "^1.0.0", + "junk": "^3.1.0", + "maximatch": "^0.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -55,6 +269,188 @@ "node": ">= 8" } }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", + "license": "MIT", + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -62,11 +458,20 @@ "dev": true, "license": "ISC" }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -75,6 +480,31 @@ "node": ">=8" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -85,6 +515,12 @@ "node": ">=16" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", @@ -188,6 +624,41 @@ "integrity": "sha512-XwUEZfX2rvM87ARPNkEN1kNWChKUq5BSuGqu/Hj+iwEclaWSAceF/ldgwjKHDUJeuRkTGn/8WV6/RzFPO7Fn3A==", "license": "Apache-2.0" }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -207,7 +678,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, "funding": [ { "type": "github", @@ -247,6 +717,21 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -261,7 +746,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -270,29 +754,111 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/execa": { + "node_modules/errno": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", "license": "MIT", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "prr": "~1.0.1" }, - "engines": { - "node": ">=6" + "bin": { + "errno": "cli.js" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm-import-transformer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", + "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evaluate-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", + "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -316,11 +882,19 @@ "reusify": "^1.0.4" } }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -329,6 +903,62 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -356,7 +986,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -365,6 +994,43 @@ "node": ">= 6" } }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -378,6 +1044,124 @@ "node": ">= 0.4" } }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-equiv-refresh": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", + "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -388,6 +1172,42 @@ "node": ">= 0.10" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -404,56 +1224,217 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "license": "ISC" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iso-639-1": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.5.tgz", + "integrity": "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/liquidjs": { + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.24.0.tgz", + "integrity": "sha512-TAUNAdgwaAXjjcUFuYVJm9kOVH7zc0mTKxsG9t9Lu4qdWjB2BEblyVIYpjWcmJLMGgiYqnGNJjpNMHx0gp/46A==", + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/liquidjs/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/list-to-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", + "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } + "node_modules/markdown-it-emoji": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", + "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==", + "license": "MIT" }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, + "node_modules/maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", "license": "MIT", + "dependencies": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, "node_modules/mdn-data": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", @@ -461,6 +1442,12 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -485,16 +1472,91 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moo": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", + "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", + "license": "BSD-3-Clause" + }, + "node_modules/morphdom": { + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.8.tgz", + "integrity": "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -502,6 +1564,26 @@ "dev": true, "license": "MIT" }, + "node_modules/node-retrieve-globals": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", + "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "acorn-walk": "^8.3.4", + "esm-import-transformer": "^3.0.3" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -528,6 +1610,52 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -548,6 +1676,21 @@ "node": ">=4" } }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -576,7 +1719,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -585,6 +1727,65 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/posthtml": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz", + "integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==", + "license": "MIT", + "peer": true, + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-match-helper": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", + "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "posthtml": "^0.16.6" + } + }, + "node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "license": "MIT", + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "license": "MIT", + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/prettier": { "version": "3.7.4", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", @@ -601,6 +1802,12 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "license": "MIT" + }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", @@ -612,6 +1819,15 @@ "once": "^1.3.1" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -633,6 +1849,27 @@ ], "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -708,6 +1945,19 @@ "dev": true, "license": "ISC" }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -718,6 +1968,44 @@ "semver": "bin/semver" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -784,6 +2072,24 @@ "dev": true, "license": "ISC" }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -794,6 +2100,42 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", + "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -843,11 +2185,56 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -856,6 +2243,36 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "license": "MIT" + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -875,6 +2292,27 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 2669b755..218001f3 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "doc": "docs" }, "scripts": { + "build": "eleventy", + "serve": "eleventy --serve --port 4000", "start": "bundle exec jekyll serve", "prettier": "npx prettier . --write", "optimize-svgs": "node scripts/optimize-svgs.js", @@ -25,6 +27,8 @@ }, "type": "module", "dependencies": { - "dark-mode-toggle": "^0.18.0" + "@11ty/eleventy": "^3.1.2", + "dark-mode-toggle": "^0.18.0", + "markdown-it-emoji": "^3.0.0" } } diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 00000000..dc5371b9 Binary files /dev/null and b/screenshot.png differ