@bestagentkits/render 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +119 -0
- package/README.md +189 -34
- package/assets/fonts/bricolage-grotesque/OFL.txt +93 -0
- package/assets/fonts/fraunces/OFL.txt +93 -0
- package/assets/fonts/geist/OFL.txt +93 -0
- package/assets/fonts/inter-tight/OFL.txt +93 -0
- package/assets/fonts/jetbrains-mono/OFL.txt +93 -0
- package/assets/fonts/plus-jakarta-sans/OFL.txt +93 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +51 -10
- package/dist/cli.js.map +1 -1
- package/dist/mcp-server.d.ts +37 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +274 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/registry/roster.d.ts +1 -1
- package/dist/registry/roster.d.ts.map +1 -1
- package/dist/registry/roster.js +222 -6
- package/dist/registry/roster.js.map +1 -1
- package/dist/render/block-helpers.d.ts +52 -0
- package/dist/render/block-helpers.d.ts.map +1 -0
- package/dist/render/block-helpers.js +113 -0
- package/dist/render/block-helpers.js.map +1 -0
- package/dist/render/blocks.d.ts +3 -4
- package/dist/render/blocks.d.ts.map +1 -1
- package/dist/render/blocks.js +126 -121
- package/dist/render/blocks.js.map +1 -1
- package/dist/render/charts.d.ts +5 -0
- package/dist/render/charts.d.ts.map +1 -1
- package/dist/render/charts.js +205 -90
- package/dist/render/charts.js.map +1 -1
- package/dist/render/derived-variables.d.ts +17 -0
- package/dist/render/derived-variables.d.ts.map +1 -0
- package/dist/render/derived-variables.js +17 -0
- package/dist/render/derived-variables.js.map +1 -0
- package/dist/render/diagram-fallback.d.ts +25 -0
- package/dist/render/diagram-fallback.d.ts.map +1 -0
- package/dist/render/diagram-fallback.js +86 -0
- package/dist/render/diagram-fallback.js.map +1 -0
- package/dist/render/document.d.ts +4 -0
- package/dist/render/document.d.ts.map +1 -1
- package/dist/render/document.js +34 -6
- package/dist/render/document.js.map +1 -1
- package/dist/render/effects-styles.d.ts +14 -0
- package/dist/render/effects-styles.d.ts.map +1 -0
- package/dist/render/effects-styles.js +39 -0
- package/dist/render/effects-styles.js.map +1 -0
- package/dist/render/embedded-fonts.generated.d.ts +22 -0
- package/dist/render/embedded-fonts.generated.d.ts.map +1 -0
- package/dist/render/embedded-fonts.generated.js +59 -0
- package/dist/render/embedded-fonts.generated.js.map +1 -0
- package/dist/render/feature-styles.d.ts +14 -0
- package/dist/render/feature-styles.d.ts.map +1 -0
- package/dist/render/feature-styles.js +161 -0
- package/dist/render/feature-styles.js.map +1 -0
- package/dist/render/font-faces.d.ts +22 -0
- package/dist/render/font-faces.d.ts.map +1 -0
- package/dist/render/font-faces.js +60 -0
- package/dist/render/font-faces.js.map +1 -0
- package/dist/render/outline.d.ts +21 -0
- package/dist/render/outline.d.ts.map +1 -0
- package/dist/render/outline.js +44 -0
- package/dist/render/outline.js.map +1 -0
- package/dist/render/render.d.ts.map +1 -1
- package/dist/render/render.js +53 -10
- package/dist/render/render.js.map +1 -1
- package/dist/render/runtime.d.ts.map +1 -1
- package/dist/render/runtime.js +184 -10
- package/dist/render/runtime.js.map +1 -1
- package/dist/render/showcase-blocks.d.ts +47 -0
- package/dist/render/showcase-blocks.d.ts.map +1 -0
- package/dist/render/showcase-blocks.js +349 -0
- package/dist/render/showcase-blocks.js.map +1 -0
- package/dist/render/showcase-styles.d.ts +15 -0
- package/dist/render/showcase-styles.d.ts.map +1 -0
- package/dist/render/showcase-styles.js +217 -0
- package/dist/render/showcase-styles.js.map +1 -0
- package/dist/render/signature-styles.d.ts +18 -0
- package/dist/render/signature-styles.d.ts.map +1 -0
- package/dist/render/signature-styles.js +41 -0
- package/dist/render/signature-styles.js.map +1 -0
- package/dist/render/styles.d.ts +18 -9
- package/dist/render/styles.d.ts.map +1 -1
- package/dist/render/styles.js +224 -128
- package/dist/render/styles.js.map +1 -1
- package/dist/render/surface-styles.d.ts +24 -0
- package/dist/render/surface-styles.d.ts.map +1 -0
- package/dist/render/surface-styles.js +41 -0
- package/dist/render/surface-styles.js.map +1 -0
- package/dist/render/verify.d.ts.map +1 -1
- package/dist/render/verify.js +30 -0
- package/dist/render/verify.js.map +1 -1
- package/dist/spec/normalize.d.ts.map +1 -1
- package/dist/spec/normalize.js +32 -0
- package/dist/spec/normalize.js.map +1 -1
- package/dist/theme/load-theme.d.ts +2 -2
- package/dist/theme/load-theme.d.ts.map +1 -1
- package/dist/theme/load-theme.js +46 -10
- package/dist/theme/load-theme.js.map +1 -1
- package/dist/theme/presets.d.ts +4 -3
- package/dist/theme/presets.d.ts.map +1 -1
- package/dist/theme/presets.js +35 -18
- package/dist/theme/presets.js.map +1 -1
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +4 -4
- package/dist/theme/tokens.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/llms.txt +25 -0
- package/package.json +9 -3
package/dist/render/styles.js
CHANGED
|
@@ -1,38 +1,75 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Emitted stylesheets.
|
|
3
3
|
*
|
|
4
|
-
* One base sheet plus per-feature sheets. The compiler
|
|
5
|
-
* sheets a page actually uses, which is both a size win
|
|
6
|
-
* property: a page without a carousel cannot ship carousel CSS
|
|
7
|
-
* change could accidentally apply.
|
|
4
|
+
* One base sheet plus per-feature sheets (`feature-styles.ts`). The compiler
|
|
5
|
+
* emits only the feature sheets a page actually uses, which is both a size win
|
|
6
|
+
* and a correctness property: a page without a carousel cannot ship carousel CSS
|
|
7
|
+
* that a later change could accidentally apply.
|
|
8
8
|
*
|
|
9
|
-
* The sheets are static strings
|
|
10
|
-
* comes from theme tokens, so a
|
|
9
|
+
* The sheets are static strings: the only interpolation is the shared
|
|
10
|
+
* transition constant below. Everything variable comes from theme tokens, so a
|
|
11
|
+
* spec cannot influence a declaration.
|
|
12
|
+
*
|
|
13
|
+
* Design rules the sheets follow (see DESIGN.md):
|
|
14
|
+
* - the type scale is derived from the `font-scale` token, with a fixed fallback
|
|
15
|
+
* for engines without CSS `pow()`;
|
|
16
|
+
* - vertical rhythm comes from one density-driven gap, enlarged at section breaks;
|
|
17
|
+
* - top-level sections open on a hairline carrying a short accent tab, the same
|
|
18
|
+
* motif as the hero eyebrow rule;
|
|
19
|
+
* - every transition uses the `motion-*` tokens, which reduced motion zeroes;
|
|
20
|
+
* - tints are `color-mix()` of theme tokens, so no preset needs extra colours.
|
|
21
|
+
*/
|
|
22
|
+
export { FEATURE_CSS } from './feature-styles.js';
|
|
23
|
+
import { DARK_FILL, RING, TINT } from './derived-variables.js';
|
|
24
|
+
import { EFFECTS_CSS } from './effects-styles.js';
|
|
25
|
+
import { SIGNATURE_CSS } from './signature-styles.js';
|
|
26
|
+
/**
|
|
27
|
+
* Shared transition, referenced as one custom property so the list is emitted
|
|
28
|
+
* once. It is declared on `:root`, the same element that carries the motion
|
|
29
|
+
* tokens and the reduced-motion override, so a zeroed duration still applies.
|
|
11
30
|
*/
|
|
31
|
+
const TRANSITION = 'transition:var(--ak-transition)';
|
|
12
32
|
export const BASE_CSS = `*,*::before,*::after{box-sizing:border-box}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
33
|
+
:root{--ak-gap:calc(var(--ak-space-unit) * 3);--ak-transition:color var(--ak-motion-duration) var(--ak-motion-easing),background-color var(--ak-motion-duration) var(--ak-motion-easing),border-color var(--ak-motion-duration) var(--ak-motion-easing),box-shadow var(--ak-motion-duration) var(--ak-motion-easing),transform var(--ak-motion-duration) var(--ak-motion-easing),opacity var(--ak-motion-duration) var(--ak-motion-easing),text-decoration-color var(--ak-motion-duration) var(--ak-motion-easing);${TINT};${RING};--ak-fill:var(--ak-color-surface);accent-color:var(--ak-color-accent)}
|
|
34
|
+
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){${DARK_FILL}}}
|
|
35
|
+
:root[data-theme="dark"]{${DARK_FILL}}
|
|
36
|
+
[data-density="compact"]{--ak-gap:calc(var(--ak-space-unit) * 2)}
|
|
37
|
+
[data-density="spacious"]{--ak-gap:calc(var(--ak-space-unit) * 4)}
|
|
38
|
+
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-padding-top:calc(var(--ak-space-unit) * 2)}
|
|
39
|
+
body{margin:0;background:linear-gradient(180deg,color-mix(in srgb,var(--ak-color-accent) 5%,var(--ak-color-background)),var(--ak-color-background) 520px) no-repeat,var(--ak-color-background);color:var(--ak-color-text);font-family:var(--ak-font-body);font-size:var(--ak-font-size-base);line-height:var(--ak-line-height);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-kerning:normal}
|
|
40
|
+
::selection{background:color-mix(in srgb,var(--ak-color-accent) 24%,transparent)}
|
|
41
|
+
.ak-skip{position:fixed;left:var(--ak-space-unit);top:var(--ak-space-unit);transform:translateY(-200%);background:var(--ak-color-text);color:var(--ak-color-background);padding:.6em 1em;border-radius:var(--ak-radius-small);z-index:10;font-weight:600;${TRANSITION}}
|
|
42
|
+
.ak-skip:focus{transform:none}
|
|
43
|
+
.ak-shell{max-width:1120px;margin:0 auto;padding:calc(var(--ak-space-unit) * 3) calc(var(--ak-space-unit) * 4) calc(var(--ak-space-unit) * 12)}
|
|
44
|
+
.ak-page-bar{display:flex;justify-content:flex-end;margin-bottom:calc(var(--ak-space-unit) * 2)}
|
|
18
45
|
.ak-main{display:block}
|
|
19
|
-
:where(a){color:var(--ak-color-accent)}
|
|
20
|
-
:where(
|
|
21
|
-
h1{font-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
46
|
+
:where(a){color:var(--ak-color-accent);text-decoration-line:underline;text-decoration-thickness:1px;text-underline-offset:.22em;text-decoration-color:color-mix(in srgb,currentColor 35%,transparent);${TRANSITION}}
|
|
47
|
+
:where(a):hover{text-decoration-color:currentColor}
|
|
48
|
+
:where(h1,h2,h3,h4,h5,h6){font-family:var(--ak-font-heading);line-height:1.2;margin:0;font-weight:700;text-wrap:balance;letter-spacing:-.012em}
|
|
49
|
+
h1{font-size:calc(var(--ak-font-size-base) * 2.44);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),4));line-height:1.06;letter-spacing:-.028em}
|
|
50
|
+
h2{font-size:calc(var(--ak-font-size-base) * 1.56);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),2));line-height:1.15;letter-spacing:-.02em}
|
|
51
|
+
h3{font-size:calc(var(--ak-font-size-base) * 1.25);font-size:calc(var(--ak-font-size-base) * var(--ak-font-scale));letter-spacing:-.012em}
|
|
52
|
+
h4,h5,h6{font-size:calc(var(--ak-font-size-base) * 1.05)}
|
|
53
|
+
p{margin:0;text-wrap:pretty}
|
|
54
|
+
p + p{margin-top:.6em}
|
|
26
55
|
ul,ol{margin:0;padding-left:1.4em}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
56
|
+
li::marker{color:var(--ak-color-text-muted)}
|
|
57
|
+
figure{margin:0}
|
|
58
|
+
code,kbd,pre{font-family:var(--ak-font-mono)}
|
|
59
|
+
:not(pre) > code{font-size:.86em;padding:.12em .4em;border-radius:var(--ak-radius-small);background:color-mix(in srgb,var(--ak-color-text) 6%,transparent);border:var(--ak-border-width) solid color-mix(in srgb,var(--ak-color-text) 8%,transparent)}
|
|
60
|
+
strong{font-weight:650}
|
|
61
|
+
hr{border:0;border-top:var(--ak-border-width) solid var(--ak-color-border)}
|
|
62
|
+
:focus-visible{outline:2px solid var(--ak-color-accent);outline-offset:2px;border-radius:var(--ak-radius-small)}
|
|
63
|
+
.ak-block + .ak-block{margin-top:var(--ak-gap)}
|
|
64
|
+
.ak-main > .ak-block + .ak-block:is(.ak-section,:has(> .ak-section-head)){margin-top:calc(var(--ak-gap) * 2.5)}
|
|
65
|
+
.ak-section > .ak-block + .ak-block:has(> .ak-section-head){margin-top:calc(var(--ak-gap) * 1.75)}
|
|
66
|
+
:is(.ak-stack,.ak-grid,.ak-split) > .ak-block{margin-top:0}
|
|
67
|
+
.ak-stack{display:flex;flex-direction:column;align-items:flex-start;gap:calc(var(--ak-space-unit) * 2)}
|
|
68
|
+
.ak-stack > :not(.ak-badge,.ak-kbd,.ak-btn){align-self:stretch}
|
|
33
69
|
.ak-stack[data-gap="tight"]{gap:var(--ak-space-unit)}
|
|
34
70
|
.ak-stack[data-gap="loose"]{gap:calc(var(--ak-space-unit) * 3)}
|
|
35
71
|
.ak-grid{display:grid;gap:calc(var(--ak-space-unit) * 2);grid-template-columns:repeat(3,minmax(0,1fr))}
|
|
72
|
+
ul.ak-grid{list-style:none;padding:0;margin:0}
|
|
36
73
|
.ak-grid[data-ak-columns="1"],.ak-gallery[data-ak-columns="1"]{grid-template-columns:minmax(0,1fr)}
|
|
37
74
|
.ak-grid[data-ak-columns="2"],.ak-gallery[data-ak-columns="2"]{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
38
75
|
.ak-grid[data-ak-columns="3"],.ak-gallery[data-ak-columns="3"]{grid-template-columns:repeat(3,minmax(0,1fr))}
|
|
@@ -42,122 +79,181 @@ code,kbd{font-family:var(--ak-font-mono)}
|
|
|
42
79
|
.ak-split{display:grid;gap:calc(var(--ak-space-unit) * 2);grid-template-columns:1fr 1fr}
|
|
43
80
|
.ak-split[data-ratio="wide-left"]{grid-template-columns:2fr 1fr}
|
|
44
81
|
.ak-split[data-ratio="wide-right"]{grid-template-columns:1fr 2fr}
|
|
82
|
+
.ak-split > *,.ak-grid > *,.ak-compare > *{min-width:0}
|
|
45
83
|
.ak-muted{color:var(--ak-color-text-muted)}
|
|
46
|
-
.ak-eyebrow,.ak-label{font-family:var(--ak-font-mono);font-size:.
|
|
47
|
-
.ak-hero{gap:var(--ak-space-unit);
|
|
48
|
-
.ak-hero
|
|
49
|
-
.ak-hero
|
|
50
|
-
.ak-
|
|
51
|
-
.ak-
|
|
84
|
+
.ak-eyebrow,.ak-label{font-family:var(--ak-font-mono);font-size:.72rem;font-weight:500;line-height:1.5;letter-spacing:.1em;text-transform:uppercase;color:var(--ak-color-text-muted)}
|
|
85
|
+
.ak-hero{display:flex;flex-direction:column;gap:calc(var(--ak-space-unit) * 2);padding:calc(var(--ak-space-unit) * 5) 0 calc(var(--ak-space-unit) * 3)}
|
|
86
|
+
.ak-hero .ak-eyebrow{display:flex;align-items:center;gap:.85em;color:var(--ak-color-accent)}
|
|
87
|
+
.ak-hero .ak-eyebrow::before{content:"";width:2.5rem;height:2px;background:currentColor;flex:none}
|
|
88
|
+
.ak-hero h1{max-width:20ch;font-size:calc(var(--ak-font-size-base) * 3);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),5));line-height:1.02;letter-spacing:-.034em}
|
|
89
|
+
.ak-hero p:not(.ak-eyebrow){max-width:58ch;margin:0;font-size:calc(var(--ak-font-size-base) * 1.2);line-height:1.55;color:var(--ak-color-text-muted)}
|
|
90
|
+
.ak-page-title{margin-bottom:calc(var(--ak-space-unit) * 3)}
|
|
91
|
+
.ak-lead{font-size:calc(var(--ak-font-size-base) * 1.18);line-height:1.55;max-width:var(--ak-measure)}
|
|
92
|
+
.ak-caption{font-size:.84rem;color:var(--ak-color-text-muted)}
|
|
52
93
|
.ak-prose{max-width:var(--ak-measure)}
|
|
53
|
-
.ak-
|
|
54
|
-
.ak-
|
|
94
|
+
.ak-section-head{display:flex;flex-direction:column;gap:.4em;margin-bottom:calc(var(--ak-space-unit) * 2)}
|
|
95
|
+
.ak-main > .ak-section > .ak-section-head{position:relative;padding-top:calc(var(--ak-space-unit) * 2.5);margin-bottom:calc(var(--ak-space-unit) * 3.5);border-top:var(--ak-border-width) solid var(--ak-color-border)}
|
|
96
|
+
.ak-main > .ak-section > .ak-section-head::before{content:"";position:absolute;left:0;top:calc(var(--ak-border-width) * -1);width:2.5rem;height:2px;background:var(--ak-color-accent)}
|
|
97
|
+
.ak-section .ak-block > .ak-section-head h2,.ak-section > h2.ak-block,.ak-stack > h2.ak-block{font-size:calc(var(--ak-font-size-base) * 1.25);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),1.2));letter-spacing:-.014em}
|
|
98
|
+
.ak-card,.ak-surface{background:var(--ak-fill);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 3)}
|
|
99
|
+
.ak-card{display:flex;flex-direction:column;gap:calc(var(--ak-space-unit) * 1)}
|
|
100
|
+
.ak-card p + p{margin-top:0}
|
|
101
|
+
.ak-card > p:not(.ak-label){color:var(--ak-color-text-muted)}
|
|
102
|
+
.ak-card > p:first-child:has(strong),.ak-card > .ak-label + p:has(strong){color:var(--ak-color-text);font-family:var(--ak-font-heading);font-size:calc(var(--ak-font-size-base) * 1.08);letter-spacing:-.01em}
|
|
103
|
+
.ak-card > .ak-label:first-child{align-self:flex-start;padding:.1em .6em;border-radius:999px;background:color-mix(in srgb,var(--ak-color-text) 6%,transparent);margin-bottom:.35em}
|
|
55
104
|
.ak-card--elevated,.ak-surface{box-shadow:var(--ak-elevation-card)}
|
|
56
|
-
.ak-
|
|
57
|
-
.ak-divider{border:0;border-top:var(--ak-border-width) solid var(--ak-color-border);margin:calc(var(--ak-space-unit) * 2) 0
|
|
105
|
+
.ak-card-title h3{font-size:calc(var(--ak-font-size-base) * 1.12);letter-spacing:-.01em}
|
|
106
|
+
.ak-divider{border:0;border-top:var(--ak-border-width) solid var(--ak-color-border);margin:calc(var(--ak-space-unit) * 2) 0}
|
|
107
|
+
.ak-block:has(> .ak-divider + .ak-label){display:flex;align-items:center;gap:calc(var(--ak-space-unit) * 2)}
|
|
108
|
+
.ak-block:has(> .ak-divider + .ak-label) > .ak-divider{flex:1;margin:0}
|
|
109
|
+
.ak-block:has(> .ak-divider + .ak-label) > .ak-label{order:-1}
|
|
58
110
|
.ak-spacer{display:block}
|
|
59
111
|
.ak-spacer[data-size="small"]{height:var(--ak-space-unit)}
|
|
60
112
|
.ak-spacer[data-size="medium"]{height:calc(var(--ak-space-unit) * 2)}
|
|
61
113
|
.ak-spacer[data-size="large"]{height:calc(var(--ak-space-unit) * 4)}
|
|
62
|
-
.ak-quote{
|
|
63
|
-
.ak-quote
|
|
64
|
-
.ak-
|
|
65
|
-
.ak-
|
|
66
|
-
.ak-
|
|
67
|
-
.ak-badge
|
|
68
|
-
.ak-badge[data-tone="
|
|
69
|
-
.ak-
|
|
70
|
-
.ak-
|
|
71
|
-
.ak-
|
|
72
|
-
.ak-
|
|
114
|
+
.ak-quote{position:relative;margin:0;padding:calc(var(--ak-space-unit) * 1) 0 0 calc(var(--ak-space-unit) * 6);max-width:var(--ak-measure)}
|
|
115
|
+
.ak-quote::before{content:"\\201C";position:absolute;left:0;top:0;font-family:var(--ak-font-heading);font-size:calc(var(--ak-font-size-base) * 4.5);line-height:.9;font-weight:400;font-style:normal;color:var(--ak-color-accent)}
|
|
116
|
+
.ak-quote p{font-family:var(--ak-font-heading);font-size:calc(var(--ak-font-size-base) * 1.3);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),1.25));line-height:1.4;letter-spacing:-.012em;text-wrap:balance}
|
|
117
|
+
.ak-quote cite{display:flex;align-items:center;gap:.75em;margin-top:1em;color:var(--ak-color-text-muted);font-family:var(--ak-font-mono);font-size:.74rem;font-style:normal;letter-spacing:.08em;text-transform:uppercase}
|
|
118
|
+
.ak-quote cite::before{content:"";width:1.5rem;height:1px;background:currentColor}
|
|
119
|
+
.ak-badge{--ak-tone:var(--ak-color-text-muted);display:inline-flex;align-items:center;gap:.45em;padding:.2em .7em;border-radius:999px;border:var(--ak-border-width) solid color-mix(in srgb,var(--ak-tone) 28%,var(--ak-color-border));background:color-mix(in srgb,var(--ak-tone) 9%,var(--ak-color-surface));color:var(--ak-tone);font-size:.72rem;font-family:var(--ak-font-mono);font-weight:500;letter-spacing:.02em;line-height:1.5;white-space:nowrap;font-variant-numeric:tabular-nums}
|
|
120
|
+
.ak-badge:is([data-tone="info"],[data-tone="success"],[data-tone="warning"],[data-tone="danger"])::before{content:"";width:.45em;height:.45em;border-radius:50%;background:currentColor;box-shadow:0 0 0 2px color-mix(in srgb,currentColor 22%,transparent)}
|
|
121
|
+
.ak-badge[data-tone="info"]{--ak-tone:var(--ak-color-info)}
|
|
122
|
+
.ak-badge[data-tone="success"]{--ak-tone:var(--ak-color-success)}
|
|
123
|
+
.ak-badge[data-tone="warning"]{--ak-tone:var(--ak-color-warning)}
|
|
124
|
+
.ak-badge[data-tone="danger"]{--ak-tone:var(--ak-color-danger)}
|
|
125
|
+
.ak-kbd{display:inline-flex;align-items:center;gap:.3em}
|
|
126
|
+
.ak-kbd kbd{display:inline-flex;align-items:center;justify-content:center;min-width:1.9em;border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-small);padding:.12em .5em;background:var(--ak-color-surface);box-shadow:inset 0 -2px 0 color-mix(in srgb,var(--ak-color-text) 10%,var(--ak-color-border)),0 1px 1px color-mix(in srgb,var(--ak-color-text) 6%,transparent);font-size:.78em;font-weight:500;line-height:1.5;color:var(--ak-color-text)}
|
|
127
|
+
.ak-kv{display:grid;grid-template-columns:minmax(120px,max-content) minmax(0,1fr);margin:0;border-top:var(--ak-border-width) solid var(--ak-color-border)}
|
|
128
|
+
.ak-kv dt,.ak-kv dd{padding:.75em 0;border-bottom:var(--ak-border-width) solid var(--ak-color-border)}
|
|
129
|
+
.ak-kv dt{font-family:var(--ak-font-mono);font-size:.74rem;letter-spacing:.08em;text-transform:uppercase;line-height:var(--ak-line-height);color:var(--ak-color-text-muted);padding-right:calc(var(--ak-space-unit) * 4);padding-top:calc(.75em + .2rem)}
|
|
73
130
|
.ak-kv dd{margin:0}
|
|
74
|
-
.ak-stats{display:grid;gap:
|
|
75
|
-
.ak-stat{
|
|
76
|
-
.ak-stat dt{
|
|
77
|
-
.ak-stat
|
|
78
|
-
.ak-
|
|
79
|
-
.ak-steps
|
|
80
|
-
.ak-steps li
|
|
81
|
-
.ak-
|
|
82
|
-
.ak-
|
|
83
|
-
.ak-
|
|
84
|
-
.ak-
|
|
85
|
-
.ak-
|
|
86
|
-
|
|
131
|
+
.ak-stats{display:grid;gap:0;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));margin:0;padding:0;list-style:none;overflow:hidden;background:var(--ak-fill);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);box-shadow:var(--ak-elevation-card)}
|
|
132
|
+
.ak-stat{padding:calc(var(--ak-space-unit) * 2.5) calc(var(--ak-space-unit) * 3) calc(var(--ak-space-unit) * 3);box-shadow:calc(var(--ak-border-width) * -1) calc(var(--ak-border-width) * -1) 0 0 var(--ak-color-border)}
|
|
133
|
+
.ak-stat dt{display:flex;align-items:center;gap:.6em;font-family:var(--ak-font-mono);font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ak-color-text-muted)}
|
|
134
|
+
.ak-stat dt::before{content:"";width:.4rem;height:.4rem;border-radius:50%;background:var(--ak-color-accent)}
|
|
135
|
+
.ak-stat dd{margin:.5em 0 0;font-family:var(--ak-font-heading);font-size:calc(var(--ak-font-size-base) * 2.4);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),3.6));font-weight:700;line-height:1;letter-spacing:-.035em;font-variant-numeric:tabular-nums}
|
|
136
|
+
.ak-steps{counter-reset:ak-step;list-style:none;padding:0;margin:0;display:flex;flex-direction:column}
|
|
137
|
+
.ak-steps li{counter-increment:ak-step;position:relative;padding:0 0 calc(var(--ak-space-unit) * 3) calc(var(--ak-space-unit) * 6);min-height:40px}
|
|
138
|
+
.ak-steps li:last-child{padding-bottom:0}
|
|
139
|
+
.ak-steps li::before{content:counter(ak-step,decimal-leading-zero);position:absolute;left:0;top:-.1em;width:32px;height:32px;border-radius:50%;background:var(--ak-color-surface);border:var(--ak-border-width) solid color-mix(in srgb,var(--ak-color-accent) 45%,var(--ak-color-border));box-shadow:0 0 0 4px var(--ak-color-background);color:var(--ak-color-accent);display:flex;align-items:center;justify-content:center;font-family:var(--ak-font-mono);font-size:.72rem;font-weight:600;font-variant-numeric:tabular-nums;z-index:1}
|
|
140
|
+
.ak-steps li:not(:last-child)::after{content:"";position:absolute;left:15.5px;top:calc(32px - .1em);bottom:0;width:1px;background:linear-gradient(var(--ak-color-border),color-mix(in srgb,var(--ak-color-accent) 30%,var(--ak-color-border)))}
|
|
141
|
+
.ak-steps li > p:first-child{font-family:var(--ak-font-heading);font-size:calc(var(--ak-font-size-base) * 1.06)}
|
|
142
|
+
.ak-steps li > p:not(:first-child){color:var(--ak-color-text-muted);margin-top:.2em;max-width:var(--ak-measure)}
|
|
143
|
+
.ak-timeline{list-style:none;padding:0;margin:0;display:flex;flex-direction:column}
|
|
144
|
+
.ak-timeline li{position:relative;padding:0 0 calc(var(--ak-space-unit) * 3) calc(var(--ak-space-unit) * 4)}
|
|
145
|
+
.ak-timeline li:last-child{padding-bottom:0}
|
|
146
|
+
.ak-timeline li::before{content:"";position:absolute;left:5px;top:.42em;width:9px;height:9px;border-radius:50%;background:var(--ak-color-accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--ak-color-accent) 16%,var(--ak-color-background));z-index:1}
|
|
147
|
+
.ak-timeline li:not(:last-child)::after{content:"";position:absolute;left:9px;top:calc(.42em + 9px);bottom:-.42em;width:1px;background:var(--ak-color-border)}
|
|
148
|
+
.ak-timeline time{display:block;font-family:var(--ak-font-mono);font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ak-color-accent);margin-bottom:.3em}
|
|
149
|
+
.ak-timeline li > p:first-of-type{font-family:var(--ak-font-heading)}
|
|
150
|
+
.ak-timeline li > p:not(:first-of-type){color:var(--ak-color-text-muted);margin-top:.15em;max-width:var(--ak-measure)}
|
|
151
|
+
.ak-table-wrap{overflow-x:auto;border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);background:var(--ak-fill);box-shadow:var(--ak-elevation-card)}
|
|
152
|
+
table{border-collapse:collapse;width:100%;font-variant-numeric:tabular-nums}
|
|
87
153
|
caption{text-align:left;padding-bottom:.5em;color:var(--ak-color-text-muted)}
|
|
88
|
-
|
|
89
|
-
|
|
154
|
+
.ak-table-wrap caption:not(.ak-sr){padding:calc(var(--ak-space-unit) * 1.75) calc(var(--ak-space-unit) * 2);font-family:var(--ak-font-heading);font-weight:600;color:var(--ak-color-text);border-bottom:var(--ak-border-width) solid var(--ak-color-border)}
|
|
155
|
+
th,td{text-align:left;padding:.8em calc(var(--ak-space-unit) * 2);border-bottom:var(--ak-border-width) solid var(--ak-color-border);vertical-align:top}
|
|
156
|
+
tbody th{font-weight:600}
|
|
157
|
+
.ak-table-wrap tbody tr:last-child > *{border-bottom:0}
|
|
158
|
+
.ak-table-wrap tbody tr{${TRANSITION}}
|
|
159
|
+
.ak-table-wrap tbody tr:hover{background:var(--ak-tint)}
|
|
160
|
+
thead th{background:color-mix(in srgb,var(--ak-color-text) 3.5%,var(--ak-color-surface));font-family:var(--ak-font-mono);font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--ak-color-text-muted);white-space:nowrap;padding-top:.9em;padding-bottom:.9em}
|
|
90
161
|
.ak-compare{display:grid;gap:calc(var(--ak-space-unit) * 2);grid-template-columns:1fr 1fr}
|
|
91
|
-
.ak-compare
|
|
92
|
-
.ak-compare
|
|
93
|
-
.ak-
|
|
94
|
-
.ak-
|
|
95
|
-
.ak-
|
|
96
|
-
.ak-
|
|
97
|
-
.ak-
|
|
98
|
-
.ak-
|
|
99
|
-
.ak-
|
|
100
|
-
.ak-
|
|
101
|
-
.ak-
|
|
102
|
-
.ak-
|
|
103
|
-
.ak-
|
|
104
|
-
.ak-
|
|
105
|
-
.ak-
|
|
106
|
-
.ak-
|
|
162
|
+
.ak-compare .ak-surface{display:flex;flex-direction:column;gap:calc(var(--ak-space-unit) * 1.5)}
|
|
163
|
+
.ak-compare h3{display:flex;align-items:center;gap:.6em;font-size:calc(var(--ak-font-size-base) * 1.1)}
|
|
164
|
+
.ak-compare h3::before{content:"";width:.55em;height:.55em;border-radius:50%;border:2px solid var(--ak-color-text-muted)}
|
|
165
|
+
.ak-compare ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column}
|
|
166
|
+
.ak-compare li{position:relative;padding:.55em 0 .55em 1.5em;border-top:var(--ak-border-width) solid var(--ak-color-border)}
|
|
167
|
+
.ak-compare li::before{content:"";position:absolute;left:.2em;top:1.15em;width:.4em;height:.4em;border-radius:50%;background:var(--ak-color-text-muted)}
|
|
168
|
+
.ak-compare .ak-surface:first-child{background:linear-gradient(180deg,var(--ak-tint),transparent 70%),var(--ak-fill);border-color:color-mix(in srgb,var(--ak-color-accent) 35%,var(--ak-color-border))}
|
|
169
|
+
.ak-compare .ak-surface:first-child h3::before{background:var(--ak-color-accent);border-color:var(--ak-color-accent)}
|
|
170
|
+
.ak-compare .ak-surface:first-child li::before{background:var(--ak-color-accent)}
|
|
171
|
+
.ak-callout,.ak-alert{--ak-tone:var(--ak-color-info);--ak-glyph:"i";position:relative;border:var(--ak-border-width) solid color-mix(in srgb,var(--ak-tone) 26%,var(--ak-color-border));background:color-mix(in srgb,var(--ak-tone) 6%,var(--ak-color-surface));border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 2.25) calc(var(--ak-space-unit) * 3) calc(var(--ak-space-unit) * 2.25) calc(var(--ak-space-unit) * 7);display:flex;flex-direction:column;gap:.35em}
|
|
172
|
+
.ak-callout::before,.ak-alert::before{content:var(--ak-glyph);position:absolute;left:calc(var(--ak-space-unit) * 2.5);top:calc(var(--ak-space-unit) * 2.25);width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--ak-tone);color:var(--ak-color-surface);font-family:var(--ak-font-mono);font-size:.8rem;font-weight:700;line-height:1;box-shadow:0 0 0 4px color-mix(in srgb,var(--ak-tone) 16%,transparent)}
|
|
173
|
+
.ak-callout p,.ak-alert p{max-width:var(--ak-measure)}
|
|
174
|
+
.ak-callout p + p,.ak-alert p + p{margin-top:0}
|
|
175
|
+
.ak-callout p:not(.ak-label):not(:has(strong)),.ak-alert p:not(:has(strong)){color:color-mix(in srgb,var(--ak-color-text) 82%,var(--ak-tone))}
|
|
176
|
+
.ak-callout .ak-label,.ak-alert .ak-label{color:var(--ak-tone);font-weight:600}
|
|
177
|
+
.ak-callout[data-tone="success"],.ak-alert[data-tone="success"]{--ak-tone:var(--ak-color-success);--ak-glyph:"\\2713"}
|
|
178
|
+
.ak-callout[data-tone="warning"],.ak-alert[data-tone="warning"]{--ak-tone:var(--ak-color-warning);--ak-glyph:"!"}
|
|
179
|
+
.ak-callout[data-tone="danger"],.ak-alert[data-tone="danger"]{--ak-tone:var(--ak-color-danger);--ak-glyph:"\\00D7"}
|
|
180
|
+
.ak-alert{border-color:color-mix(in srgb,var(--ak-tone) 45%,var(--ak-color-border));background:color-mix(in srgb,var(--ak-tone) 10%,var(--ak-color-surface))}
|
|
181
|
+
.ak-code{margin:0;background:color-mix(in srgb,var(--ak-color-text) 4%,var(--ak-color-surface));border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);overflow:hidden}
|
|
182
|
+
.ak-code pre{margin:0;padding:calc(var(--ak-space-unit) * 2.5) calc(var(--ak-space-unit) * 3);overflow-x:auto;font-size:.85rem;line-height:1.7;tab-size:2}
|
|
183
|
+
.ak-code-head{display:flex;justify-content:space-between;gap:var(--ak-space-unit);align-items:center;padding:.65em calc(var(--ak-space-unit) * 3);border-bottom:var(--ak-border-width) solid var(--ak-color-border);background:var(--ak-color-surface)}
|
|
184
|
+
.ak-code-head .ak-label{display:flex;align-items:center;gap:.6em}
|
|
185
|
+
.ak-code-head .ak-label::before{content:"";width:.45rem;height:.45rem;border-radius:2px;background:var(--ak-color-accent)}
|
|
186
|
+
.ak-btn{font:inherit;font-size:.92em;font-weight:550;line-height:1.2;display:inline-flex;align-items:center;justify-content:center;gap:.5em;color:var(--ak-color-text);background:var(--ak-color-surface);border:var(--ak-border-width) solid color-mix(in srgb,var(--ak-color-text) 14%,var(--ak-color-border));border-radius:var(--ak-radius-medium);padding:.6em 1.1em;cursor:pointer;min-height:40px;box-shadow:0 1px 2px color-mix(in srgb,var(--ak-color-text) 7%,transparent);text-decoration:none;${TRANSITION}}
|
|
187
|
+
.ak-btn:hover{border-color:color-mix(in srgb,var(--ak-color-accent) 55%,var(--ak-color-border));background:var(--ak-tint);color:var(--ak-color-text)}
|
|
188
|
+
.ak-btn:active{transform:translateY(1px);box-shadow:none}
|
|
189
|
+
.ak-btn:disabled,.ak-btn[aria-disabled="true"]{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none}
|
|
190
|
+
.ak-btn:disabled:hover,.ak-btn[aria-disabled="true"]:hover{background:var(--ak-color-surface);border-color:color-mix(in srgb,var(--ak-color-text) 14%,var(--ak-color-border))}
|
|
191
|
+
.ak-btn[data-variant="primary"]{background:var(--ak-color-accent);color:var(--ak-color-accent-contrast);border-color:var(--ak-color-accent);box-shadow:0 1px 2px color-mix(in srgb,var(--ak-color-accent) 30%,transparent),0 4px 14px color-mix(in srgb,var(--ak-color-accent) 22%,transparent)}
|
|
192
|
+
.ak-btn[data-variant="primary"]:hover{background:color-mix(in srgb,var(--ak-color-accent) 86%,var(--ak-color-text));color:var(--ak-color-accent-contrast)}
|
|
193
|
+
.ak-btn[data-variant="ghost"]{background:transparent;border-color:transparent;box-shadow:none;color:var(--ak-color-accent)}
|
|
194
|
+
.ak-btn[data-variant="ghost"]:hover{background:var(--ak-tint);border-color:transparent}
|
|
195
|
+
.ak-toolbar{display:flex;flex-wrap:wrap;gap:var(--ak-space-unit);align-items:center;padding:calc(var(--ak-space-unit) * 1);background:var(--ak-fill);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);box-shadow:var(--ak-elevation-card)}
|
|
196
|
+
.ak-toolbar > .ak-section-head{margin:0 calc(var(--ak-space-unit) * 1) 0 calc(var(--ak-space-unit) * 1)}
|
|
197
|
+
.ak-toolbar > .ak-section-head h2{font-size:calc(var(--ak-font-size-base) * 1);letter-spacing:-.005em}
|
|
198
|
+
.ak-toolbar > a{display:inline-flex;align-items:center;min-height:40px;padding:0 .75em;margin-left:auto;font-weight:550}
|
|
199
|
+
.ak-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column}
|
|
200
|
+
.ak-list li{display:flex;gap:calc(var(--ak-space-unit) * 2);align-items:center;justify-content:space-between;border-bottom:var(--ak-border-width) solid var(--ak-color-border);padding:.8em 0}
|
|
201
|
+
.ak-list li:first-child{border-top:var(--ak-border-width) solid var(--ak-color-border)}
|
|
107
202
|
.ak-list li[hidden]{display:none}
|
|
108
203
|
li.ak-hidden{display:none}
|
|
109
|
-
.ak-progress{display:
|
|
110
|
-
.ak-progress
|
|
111
|
-
.ak-progress progress
|
|
112
|
-
.ak-
|
|
113
|
-
.ak-
|
|
114
|
-
.ak-
|
|
204
|
+
.ak-progress{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline;gap:.6em var(--ak-space-unit)}
|
|
205
|
+
.ak-progress .ak-caption{grid-row:1;grid-column:2;font-family:var(--ak-font-mono);font-size:.78rem;font-variant-numeric:tabular-nums;color:var(--ak-color-text)}
|
|
206
|
+
.ak-progress progress{grid-column:1 / -1;-webkit-appearance:none;appearance:none;width:100%;height:10px;border:0;border-radius:999px;background:color-mix(in srgb,var(--ak-color-text) 8%,var(--ak-color-surface));overflow:hidden;color:var(--ak-color-accent)}
|
|
207
|
+
.ak-progress progress::-webkit-progress-bar{background:color-mix(in srgb,var(--ak-color-text) 8%,var(--ak-color-surface));border-radius:999px}
|
|
208
|
+
.ak-progress progress::-webkit-progress-value{background:linear-gradient(90deg,color-mix(in srgb,var(--ak-color-accent) 65%,var(--ak-color-surface)),var(--ak-color-accent));border-radius:999px}
|
|
209
|
+
.ak-progress progress::-moz-progress-bar{background:linear-gradient(90deg,color-mix(in srgb,var(--ak-color-accent) 65%,var(--ak-color-surface)),var(--ak-color-accent));border-radius:999px}
|
|
210
|
+
.ak-media{margin:0;display:flex;flex-direction:column;gap:.75em}
|
|
211
|
+
.ak-media figcaption,.ak-gallery figcaption{font-size:.84rem;color:var(--ak-color-text-muted)}
|
|
212
|
+
.ak-media img,.ak-gallery img{display:block;max-width:100%;height:auto;border-radius:var(--ak-radius-medium);border:var(--ak-border-width) solid var(--ak-color-border);background:var(--ak-color-surface-raised);box-shadow:var(--ak-elevation-card)}
|
|
213
|
+
.ak-media video{display:block;max-width:100%;border-radius:var(--ak-radius-medium)}
|
|
115
214
|
.ak-gallery{display:grid;gap:calc(var(--ak-space-unit) * 2);grid-template-columns:repeat(3,minmax(0,1fr));list-style:none;padding:0;margin:0}
|
|
215
|
+
.ak-gallery figure{display:flex;flex-direction:column;gap:.6em}
|
|
216
|
+
.ak-gallery img{width:100%;aspect-ratio:16 / 9;object-fit:cover}
|
|
116
217
|
.ak-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
|
|
117
|
-
|
|
118
|
-
@media (
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
.ak-
|
|
123
|
-
.ak-
|
|
124
|
-
.ak-
|
|
125
|
-
.ak-
|
|
126
|
-
|
|
127
|
-
.ak-
|
|
128
|
-
.ak-
|
|
129
|
-
.ak-
|
|
130
|
-
|
|
131
|
-
.ak-
|
|
132
|
-
.ak-
|
|
133
|
-
.ak-
|
|
134
|
-
.ak-
|
|
135
|
-
.ak-
|
|
136
|
-
|
|
137
|
-
.ak-
|
|
138
|
-
.ak-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
.ak-
|
|
142
|
-
|
|
143
|
-
.ak-
|
|
144
|
-
.ak-
|
|
145
|
-
.ak-
|
|
146
|
-
.ak-
|
|
147
|
-
.ak-
|
|
148
|
-
.ak-
|
|
149
|
-
.ak-
|
|
150
|
-
.ak-
|
|
151
|
-
.ak-
|
|
152
|
-
.ak-
|
|
153
|
-
.ak-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
.ak-media-fallback img{max-width:100%;border-radius:var(--ak-radius-small)}`,
|
|
159
|
-
diagram: `.ak-diagram{overflow-x:auto}
|
|
160
|
-
.ak-diagram svg{max-width:100%;height:auto}
|
|
161
|
-
.ak-diagram-fallback{background:var(--ak-color-surface-raised);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 1.5)}`,
|
|
162
|
-
};
|
|
218
|
+
.ak-section{scroll-margin-top:calc(var(--ak-space-unit) * 3)}
|
|
219
|
+
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
|
|
220
|
+
th.ak-num,td.ak-num{text-align:right;font-variant-numeric:tabular-nums}
|
|
221
|
+
td:is(.ak-add,.ak-del,.ak-zero){font-family:var(--ak-font-mono);font-size:.85em;font-weight:600}
|
|
222
|
+
td.ak-zero{color:var(--ak-color-text-muted);font-weight:400}
|
|
223
|
+
tr:has(.ak-badge) > *{vertical-align:middle}
|
|
224
|
+
td.ak-add{color:color-mix(in srgb,var(--ak-color-success) 82%,var(--ak-color-text))}
|
|
225
|
+
td.ak-del{color:color-mix(in srgb,var(--ak-color-danger) 82%,var(--ak-color-text))}
|
|
226
|
+
td > .ak-badge{vertical-align:middle}
|
|
227
|
+
.ak-card[data-tone="info"]{--ak-tone:var(--ak-color-info)}
|
|
228
|
+
.ak-card[data-tone="success"]{--ak-tone:var(--ak-color-success)}
|
|
229
|
+
.ak-card[data-tone="warning"]{--ak-tone:var(--ak-color-warning)}
|
|
230
|
+
.ak-card[data-tone="danger"]{--ak-tone:var(--ak-color-danger)}
|
|
231
|
+
.ak-card:not([data-tone="neutral"])[data-tone] > .ak-label:first-child{display:inline-flex;align-items:center;gap:.55em;align-self:flex-start;color:color-mix(in srgb,var(--ak-tone) 78%,var(--ak-color-text))}
|
|
232
|
+
.ak-card:not([data-tone="neutral"])[data-tone] > .ak-label:first-child::before{content:"";width:.5em;height:.5em;border-radius:50%;background:var(--ak-tone);box-shadow:0 0 0 3px color-mix(in srgb,var(--ak-tone) 20%,transparent)}
|
|
233
|
+
.ak-card:not([data-tone="neutral"])[data-tone]:hover{border-color:color-mix(in srgb,var(--ak-tone) 45%,var(--ak-color-border))}
|
|
234
|
+
.ak-code-head{justify-content:flex-start}
|
|
235
|
+
.ak-code-lang{margin-left:auto;padding:.15em .65em;border:var(--ak-border-width) solid var(--ak-color-border);border-radius:999px;font-family:var(--ak-font-mono);font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ak-color-text-muted)}
|
|
236
|
+
.ak-code-copy{margin-left:auto;display:inline-flex;align-items:center;gap:.7em;min-height:30px;padding:.3em .75em;font:inherit;font-family:var(--ak-font-mono);font-size:.68rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--ak-color-text-muted);background:transparent;border:var(--ak-border-width) solid transparent;border-radius:var(--ak-radius-small);cursor:pointer;${TRANSITION}}
|
|
237
|
+
.ak-code-lang + .ak-code-copy{margin-left:0}
|
|
238
|
+
.ak-code-copy::before{content:"";width:.7em;height:.8em;border:1.5px solid currentColor;border-radius:2px;box-shadow:2.5px -2.5px 0 -1px var(--ak-color-surface),2.5px -2.5px 0 .5px currentColor}
|
|
239
|
+
.ak-code-copy:hover{color:var(--ak-color-accent);background:var(--ak-tint);border-color:color-mix(in srgb,var(--ak-color-accent) 30%,transparent)}
|
|
240
|
+
.ak-code-copy[data-ak-copied]{color:color-mix(in srgb,var(--ak-color-success) 82%,var(--ak-color-text));border-color:color-mix(in srgb,var(--ak-color-success) 40%,transparent)}
|
|
241
|
+
.ak-code-copy[data-ak-copied]::before{content:"\\2713";width:auto;height:auto;border:0;box-shadow:none;font-size:1.2em;line-height:1}
|
|
242
|
+
.ak-code pre:has(.ak-line ~ .ak-line){counter-reset:ak-line;padding-left:calc(var(--ak-space-unit) * 1.5)}
|
|
243
|
+
.ak-code .ak-line{counter-increment:ak-line}
|
|
244
|
+
.ak-code pre:has(.ak-line ~ .ak-line) .ak-line::before{content:counter(ak-line);display:inline-block;width:2.2em;margin-right:1.4em;text-align:right;color:color-mix(in srgb,var(--ak-color-text-muted) 60%,transparent);-webkit-user-select:none;user-select:none}
|
|
245
|
+
.ak-main :is(p,li,td,dd,figcaption) > a[href^="http"]:not(.ak-btn)::after{content:"\\2197";display:inline-block;margin-left:.15em;font-size:.78em;text-decoration:none;opacity:.7}
|
|
246
|
+
.ak-progress-rail{display:none}
|
|
247
|
+
@supports (animation-timeline:scroll()){.ak-progress-rail{display:block;position:fixed;top:0;left:0;right:0;height:3px;z-index:30;pointer-events:none;background:linear-gradient(90deg,color-mix(in srgb,var(--ak-color-accent) 55%,var(--ak-color-surface)),var(--ak-color-accent));transform-origin:0 50%;transform:scaleX(0);animation:ak-reading linear both;animation-timeline:scroll(root)}@keyframes ak-reading{to{transform:scaleX(1)}}}
|
|
248
|
+
.ak-colophon{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--ak-space-unit) calc(var(--ak-space-unit) * 3);margin-top:calc(var(--ak-gap) * 3);padding-top:calc(var(--ak-space-unit) * 2);border-top:var(--ak-border-width) solid var(--ak-color-border);font-family:var(--ak-font-mono);font-size:.72rem;letter-spacing:.04em;color:var(--ak-color-text-muted)}
|
|
249
|
+
.ak-colophon p{margin:0;display:flex;flex-wrap:wrap;gap:.3em 1.4em}
|
|
250
|
+
.ak-colophon-title{color:var(--ak-color-text);font-weight:600}
|
|
251
|
+
.ak-colophon a{display:inline-flex;align-items:center;gap:.45em;min-height:44px;color:var(--ak-color-text-muted);text-decoration:none;${TRANSITION}}
|
|
252
|
+
.ak-colophon a::before{content:"\\2191"}
|
|
253
|
+
.ak-colophon a:hover{color:var(--ak-color-accent)}
|
|
254
|
+
@media (max-width:768px){body{--ak-font-size-base:16px}.ak-grid:not([data-ak-columns="1"]),.ak-gallery:not([data-ak-columns="1"]){grid-template-columns:repeat(2,minmax(0,1fr))}.ak-compare,.ak-split{grid-template-columns:1fr!important}.ak-shell{padding:calc(var(--ak-space-unit) * 2) calc(var(--ak-space-unit) * 2) calc(var(--ak-space-unit) * 8)}h1{font-size:calc(var(--ak-font-size-base) * 2);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),3))}.ak-hero h1{font-size:calc(var(--ak-font-size-base) * 2.2);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),3.5))}h2{font-size:calc(var(--ak-font-size-base) * 1.4);font-size:calc(var(--ak-font-size-base) * pow(var(--ak-font-scale),1.5))}.ak-btn{min-height:44px}.ak-toolbar > a{min-height:44px}.ak-code-copy{min-height:44px}.ak-table-wrap table{min-width:560px}.ak-hero{padding-top:calc(var(--ak-space-unit) * 3)}.ak-main > .ak-block + .ak-block:is(.ak-section,:has(> .ak-section-head)){margin-top:calc(var(--ak-gap) * 2)}}
|
|
255
|
+
@media (max-width:480px){.ak-grid,.ak-gallery{grid-template-columns:1fr!important}.ak-toolbar{flex-direction:column;align-items:stretch}.ak-toolbar > a{margin-left:0}.ak-stats{grid-template-columns:1fr 1fr}.ak-stat{padding:calc(var(--ak-space-unit) * 2)}.ak-stat dd{font-size:calc(var(--ak-font-size-base) * 1.85)}.ak-kv{grid-template-columns:1fr}.ak-kv dt{border-bottom:0;padding-bottom:0}.ak-callout,.ak-alert{padding-left:calc(var(--ak-space-unit) * 6)}.ak-callout::before,.ak-alert::before{left:calc(var(--ak-space-unit) * 2)}.ak-quote{padding-left:calc(var(--ak-space-unit) * 4.5)}.ak-quote::before{font-size:calc(var(--ak-font-size-base) * 3.5)}.ak-card,.ak-surface{padding:calc(var(--ak-space-unit) * 2.5)}th,td{padding-left:calc(var(--ak-space-unit) * 1.5);padding-right:calc(var(--ak-space-unit) * 1.5)}}
|
|
256
|
+
@media print{body{background:none}.ak-skip,.ak-page-bar,.ak-progress-rail,.ak-code-copy,.ak-colophon a{display:none}.ak-shell{max-width:none;padding:0}.ak-card,.ak-surface,.ak-stat,.ak-stats,.ak-table-wrap,.ak-toolbar{box-shadow:none}}
|
|
257
|
+
${SIGNATURE_CSS}
|
|
258
|
+
${EFFECTS_CSS}`;
|
|
163
259
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/render/styles.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/render/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAErD,MAAM,CAAC,MAAM,QAAQ,GAAG;qfAC6d,IAAI,IAAI,IAAI;qEAC5b,SAAS;2BACnD,SAAS;;;;;;2PAMuN,UAAU;;;;;wMAK7D,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAgHxL,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;4eA4Bwc,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4YAkD1G,UAAU;;;;;;;;;;;;;;;wIAe9Q,UAAU;;;;;;EAMhJ,aAAa;EACb,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The night band: an inverse surface for sections and the closing CTA.
|
|
3
|
+
*
|
|
4
|
+
* Inside `[data-surface="inverse"]` the colour tokens are redeclared with the
|
|
5
|
+
* theme's own dark values, so every block nested in the band (cards, code,
|
|
6
|
+
* charts) recolours from tokens exactly as it does in dark mode. The values are
|
|
7
|
+
* the validated theme colours themselves, written as literals: aliasing the
|
|
8
|
+
* root variables would be cyclic, because the band redeclares those variables.
|
|
9
|
+
*
|
|
10
|
+
* The derived variables that `:root` computes once (`--ak-tint`, `--ak-ring`,
|
|
11
|
+
* `--ak-fill`) are recomputed here too, since an inherited custom property
|
|
12
|
+
* carries the root's light result, not its formula.
|
|
13
|
+
*
|
|
14
|
+
* This sheet is emitted only on pages that use the band, and it names no
|
|
15
|
+
* feature marker (see `verify.ts`).
|
|
16
|
+
*/
|
|
17
|
+
import type { ResolvedTheme } from '../theme/load-theme.js';
|
|
18
|
+
/** True when any node on the page sits on the night band. */
|
|
19
|
+
export declare function usesInverseSurface(nodes: readonly {
|
|
20
|
+
type: string;
|
|
21
|
+
props: Record<string, unknown>;
|
|
22
|
+
}[]): boolean;
|
|
23
|
+
export declare function inverseSurfaceCss(theme: ResolvedTheme): string;
|
|
24
|
+
//# sourceMappingURL=surface-styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-styles.d.ts","sourceRoot":"","sources":["../../src/render/surface-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAkB5D,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,GACjE,OAAO,CAET;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAM9D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The night band: an inverse surface for sections and the closing CTA.
|
|
3
|
+
*
|
|
4
|
+
* Inside `[data-surface="inverse"]` the colour tokens are redeclared with the
|
|
5
|
+
* theme's own dark values, so every block nested in the band (cards, code,
|
|
6
|
+
* charts) recolours from tokens exactly as it does in dark mode. The values are
|
|
7
|
+
* the validated theme colours themselves, written as literals: aliasing the
|
|
8
|
+
* root variables would be cyclic, because the band redeclares those variables.
|
|
9
|
+
*
|
|
10
|
+
* The derived variables that `:root` computes once (`--ak-tint`, `--ak-ring`,
|
|
11
|
+
* `--ak-fill`) are recomputed here too, since an inherited custom property
|
|
12
|
+
* carries the root's light result, not its formula.
|
|
13
|
+
*
|
|
14
|
+
* This sheet is emitted only on pages that use the band, and it names no
|
|
15
|
+
* feature marker (see `verify.ts`).
|
|
16
|
+
*/
|
|
17
|
+
import { TOKEN_SPECS, tokenVariable } from '../theme/tokens.js';
|
|
18
|
+
import { DARK_FILL, RING, TINT } from './derived-variables.js';
|
|
19
|
+
const UNIT = (factor) => `calc(var(--ak-space-unit) * ${factor})`;
|
|
20
|
+
/** Colour tokens of the theme's dark scheme as declarations, in a stable order. */
|
|
21
|
+
function darkColorDeclarations(theme) {
|
|
22
|
+
return Object.keys(theme.dark)
|
|
23
|
+
.filter((token) => TOKEN_SPECS[token]?.kind === 'color')
|
|
24
|
+
.sort()
|
|
25
|
+
.map((token) => `${tokenVariable(token)}:${theme.dark[token]}`)
|
|
26
|
+
.join(';');
|
|
27
|
+
}
|
|
28
|
+
// The same formulas dark mode uses, so the band matches it exactly.
|
|
29
|
+
const DERIVED = [TINT, RING, DARK_FILL, 'color-scheme:dark'].join(';');
|
|
30
|
+
/** True when any node on the page sits on the night band. */
|
|
31
|
+
export function usesInverseSurface(nodes) {
|
|
32
|
+
return nodes.some((node) => node.type === 'cta' || node.props.surface === 'inverse');
|
|
33
|
+
}
|
|
34
|
+
export function inverseSurfaceCss(theme) {
|
|
35
|
+
return `[data-surface="inverse"]{${darkColorDeclarations(theme)};${DERIVED};position:relative;isolation:isolate;overflow:hidden;padding:${UNIT(7)} ${UNIT(5)};border-radius:calc(var(--ak-radius-large) * 1.6);border:var(--ak-border-width) solid color-mix(in srgb,var(--ak-color-text) 10%,transparent);background:radial-gradient(70% 90% at 100% 0%,color-mix(in srgb,var(--ak-color-accent) 26%,transparent),transparent 70%),radial-gradient(60% 80% at 0% 100%,color-mix(in srgb,var(--ak-color-info) 14%,transparent),transparent 70%),linear-gradient(180deg,color-mix(in srgb,var(--ak-color-surface) 70%,var(--ak-color-background)),var(--ak-color-background));color:var(--ak-color-text);box-shadow:0 1px 0 color-mix(in srgb,#fff 8%,transparent) inset,0 40px 80px -40px color-mix(in srgb,var(--ak-color-background) 80%,transparent)}
|
|
36
|
+
[data-surface="inverse"]::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background-image:linear-gradient(color-mix(in srgb,var(--ak-color-text) 5%,transparent) 1px,transparent 1px),linear-gradient(90deg,color-mix(in srgb,var(--ak-color-text) 5%,transparent) 1px,transparent 1px);background-size:48px 48px;-webkit-mask-image:radial-gradient(90% 70% at 50% 0%,#000,transparent);mask-image:radial-gradient(90% 70% at 50% 0%,#000,transparent)}
|
|
37
|
+
[data-surface="inverse"] ::selection{background:color-mix(in srgb,var(--ak-color-accent) 40%,transparent)}
|
|
38
|
+
@media (max-width:768px){[data-surface="inverse"]{padding:${UNIT(5)} ${UNIT(3)};margin-inline:${UNIT(-1.5)}}}
|
|
39
|
+
@media print{[data-surface="inverse"]{box-shadow:none;-webkit-print-color-adjust:exact;print-color-adjust:exact}[data-surface="inverse"]::before{display:none}}`;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=surface-styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-styles.js","sourceRoot":"","sources":["../../src/render/surface-styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,IAAI,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,+BAA+B,MAAM,GAAG,CAAC;AAElF,mFAAmF;AACnF,SAAS,qBAAqB,CAAC,KAAoB;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAC3B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC;SACvD,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;SAC9D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,oEAAoE;AACpE,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEvE,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAChC,KAAkE;IAElE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,OAAO,4BAA4B,qBAAqB,CAAC,KAAK,CAAC,IAAI,OAAO,gEAAgE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;;;4DAGlG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,GAAG,CAAC;gKACsD,CAAC;AACjK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/render/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/render/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAmED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,EAAE,CA0G/D;AAED,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,UAAU,EAAE,CAyB5F"}
|
package/dist/render/verify.js
CHANGED
|
@@ -23,6 +23,17 @@ const FEATURE_MARKERS = {
|
|
|
23
23
|
chart: '.ak-chart',
|
|
24
24
|
diagram: '.ak-diagram',
|
|
25
25
|
media: '.ak-media-fallback',
|
|
26
|
+
outline: '.ak-toc',
|
|
27
|
+
bento: '.ak-bento',
|
|
28
|
+
marquee: '.ak-marquee',
|
|
29
|
+
terminal: '.ak-terminal',
|
|
30
|
+
tree: '.ak-tree',
|
|
31
|
+
'before-after': '.ak-ba-stage',
|
|
32
|
+
kpi: '.ak-kpi',
|
|
33
|
+
showcase: '.ak-showcase',
|
|
34
|
+
cta: '.ak-cta',
|
|
35
|
+
frame: '.ak-frame-view',
|
|
36
|
+
checklist: '.ak-checklist',
|
|
26
37
|
};
|
|
27
38
|
/** Features whose behavior requires emitted JavaScript. */
|
|
28
39
|
const SCRIPTED_FEATURES = [
|
|
@@ -32,6 +43,8 @@ const SCRIPTED_FEATURES = [
|
|
|
32
43
|
'filter',
|
|
33
44
|
'theme',
|
|
34
45
|
'dialog',
|
|
46
|
+
'outline',
|
|
47
|
+
'before-after',
|
|
35
48
|
];
|
|
36
49
|
function countMatches(text, pattern) {
|
|
37
50
|
return text.match(pattern)?.length ?? 0;
|
|
@@ -92,6 +105,23 @@ export function verifyDocument(input) {
|
|
|
92
105
|
report('emitted a remote stylesheet link', 'POLICY_VIOLATION');
|
|
93
106
|
if (CSS_IMPORT.test(markup))
|
|
94
107
|
report('emitted an @import rule', 'POLICY_VIOLATION');
|
|
108
|
+
// Faces are only ever inlined: any other source would be a request on open.
|
|
109
|
+
// Every source of every face is checked, not just the first: a fallback list
|
|
110
|
+
// could otherwise hide a remote `url()` or a `local()` lookup behind an
|
|
111
|
+
// embedded one.
|
|
112
|
+
const fontSources = [...input.css.matchAll(/@font-face\{([^}]*)\}/gu)];
|
|
113
|
+
const embeddedOnly = (body) => {
|
|
114
|
+
const urls = [...body.matchAll(/url\(\s*['"]?([^)'"]{0,40})/gu)];
|
|
115
|
+
return (urls.length > 0 &&
|
|
116
|
+
!/local\(/iu.test(body) &&
|
|
117
|
+
urls.every((url) => (url[1] ?? '').startsWith('data:font/woff2;base64,')));
|
|
118
|
+
};
|
|
119
|
+
if (fontSources.some((match) => !embeddedOnly(match[1] ?? ''))) {
|
|
120
|
+
report('an @font-face rule loads a non-embedded source', 'POLICY_VIOLATION');
|
|
121
|
+
}
|
|
122
|
+
if (fontSources.length > 0 !== input.csp.includes('font-src data:')) {
|
|
123
|
+
report('CSP font-src does not match the embedded faces');
|
|
124
|
+
}
|
|
95
125
|
if (/<script[^>]+src=/iu.test(markup))
|
|
96
126
|
report('emitted an external script', 'POLICY_VIOLATION');
|
|
97
127
|
if (/<iframe/iu.test(markup))
|