@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.
Files changed (111) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +189 -34
  3. package/assets/fonts/bricolage-grotesque/OFL.txt +93 -0
  4. package/assets/fonts/fraunces/OFL.txt +93 -0
  5. package/assets/fonts/geist/OFL.txt +93 -0
  6. package/assets/fonts/inter-tight/OFL.txt +93 -0
  7. package/assets/fonts/jetbrains-mono/OFL.txt +93 -0
  8. package/assets/fonts/plus-jakarta-sans/OFL.txt +93 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +51 -10
  12. package/dist/cli.js.map +1 -1
  13. package/dist/mcp-server.d.ts +37 -0
  14. package/dist/mcp-server.d.ts.map +1 -0
  15. package/dist/mcp-server.js +274 -0
  16. package/dist/mcp-server.js.map +1 -0
  17. package/dist/registry/roster.d.ts +1 -1
  18. package/dist/registry/roster.d.ts.map +1 -1
  19. package/dist/registry/roster.js +222 -6
  20. package/dist/registry/roster.js.map +1 -1
  21. package/dist/render/block-helpers.d.ts +52 -0
  22. package/dist/render/block-helpers.d.ts.map +1 -0
  23. package/dist/render/block-helpers.js +113 -0
  24. package/dist/render/block-helpers.js.map +1 -0
  25. package/dist/render/blocks.d.ts +3 -4
  26. package/dist/render/blocks.d.ts.map +1 -1
  27. package/dist/render/blocks.js +126 -121
  28. package/dist/render/blocks.js.map +1 -1
  29. package/dist/render/charts.d.ts +5 -0
  30. package/dist/render/charts.d.ts.map +1 -1
  31. package/dist/render/charts.js +205 -90
  32. package/dist/render/charts.js.map +1 -1
  33. package/dist/render/derived-variables.d.ts +17 -0
  34. package/dist/render/derived-variables.d.ts.map +1 -0
  35. package/dist/render/derived-variables.js +17 -0
  36. package/dist/render/derived-variables.js.map +1 -0
  37. package/dist/render/diagram-fallback.d.ts +25 -0
  38. package/dist/render/diagram-fallback.d.ts.map +1 -0
  39. package/dist/render/diagram-fallback.js +86 -0
  40. package/dist/render/diagram-fallback.js.map +1 -0
  41. package/dist/render/document.d.ts +4 -0
  42. package/dist/render/document.d.ts.map +1 -1
  43. package/dist/render/document.js +34 -6
  44. package/dist/render/document.js.map +1 -1
  45. package/dist/render/effects-styles.d.ts +14 -0
  46. package/dist/render/effects-styles.d.ts.map +1 -0
  47. package/dist/render/effects-styles.js +39 -0
  48. package/dist/render/effects-styles.js.map +1 -0
  49. package/dist/render/embedded-fonts.generated.d.ts +22 -0
  50. package/dist/render/embedded-fonts.generated.d.ts.map +1 -0
  51. package/dist/render/embedded-fonts.generated.js +59 -0
  52. package/dist/render/embedded-fonts.generated.js.map +1 -0
  53. package/dist/render/feature-styles.d.ts +14 -0
  54. package/dist/render/feature-styles.d.ts.map +1 -0
  55. package/dist/render/feature-styles.js +161 -0
  56. package/dist/render/feature-styles.js.map +1 -0
  57. package/dist/render/font-faces.d.ts +22 -0
  58. package/dist/render/font-faces.d.ts.map +1 -0
  59. package/dist/render/font-faces.js +60 -0
  60. package/dist/render/font-faces.js.map +1 -0
  61. package/dist/render/outline.d.ts +21 -0
  62. package/dist/render/outline.d.ts.map +1 -0
  63. package/dist/render/outline.js +44 -0
  64. package/dist/render/outline.js.map +1 -0
  65. package/dist/render/render.d.ts.map +1 -1
  66. package/dist/render/render.js +53 -10
  67. package/dist/render/render.js.map +1 -1
  68. package/dist/render/runtime.d.ts.map +1 -1
  69. package/dist/render/runtime.js +184 -10
  70. package/dist/render/runtime.js.map +1 -1
  71. package/dist/render/showcase-blocks.d.ts +47 -0
  72. package/dist/render/showcase-blocks.d.ts.map +1 -0
  73. package/dist/render/showcase-blocks.js +349 -0
  74. package/dist/render/showcase-blocks.js.map +1 -0
  75. package/dist/render/showcase-styles.d.ts +15 -0
  76. package/dist/render/showcase-styles.d.ts.map +1 -0
  77. package/dist/render/showcase-styles.js +217 -0
  78. package/dist/render/showcase-styles.js.map +1 -0
  79. package/dist/render/signature-styles.d.ts +18 -0
  80. package/dist/render/signature-styles.d.ts.map +1 -0
  81. package/dist/render/signature-styles.js +41 -0
  82. package/dist/render/signature-styles.js.map +1 -0
  83. package/dist/render/styles.d.ts +18 -9
  84. package/dist/render/styles.d.ts.map +1 -1
  85. package/dist/render/styles.js +224 -128
  86. package/dist/render/styles.js.map +1 -1
  87. package/dist/render/surface-styles.d.ts +24 -0
  88. package/dist/render/surface-styles.d.ts.map +1 -0
  89. package/dist/render/surface-styles.js +41 -0
  90. package/dist/render/surface-styles.js.map +1 -0
  91. package/dist/render/verify.d.ts.map +1 -1
  92. package/dist/render/verify.js +30 -0
  93. package/dist/render/verify.js.map +1 -1
  94. package/dist/spec/normalize.d.ts.map +1 -1
  95. package/dist/spec/normalize.js +32 -0
  96. package/dist/spec/normalize.js.map +1 -1
  97. package/dist/theme/load-theme.d.ts +2 -2
  98. package/dist/theme/load-theme.d.ts.map +1 -1
  99. package/dist/theme/load-theme.js +46 -10
  100. package/dist/theme/load-theme.js.map +1 -1
  101. package/dist/theme/presets.d.ts +4 -3
  102. package/dist/theme/presets.d.ts.map +1 -1
  103. package/dist/theme/presets.js +35 -18
  104. package/dist/theme/presets.js.map +1 -1
  105. package/dist/theme/tokens.d.ts.map +1 -1
  106. package/dist/theme/tokens.js +4 -4
  107. package/dist/theme/tokens.js.map +1 -1
  108. package/dist/version.d.ts +1 -1
  109. package/dist/version.js +1 -1
  110. package/llms.txt +25 -0
  111. package/package.json +9 -3
@@ -1,38 +1,75 @@
1
1
  /**
2
2
  * Emitted stylesheets.
3
3
  *
4
- * One base sheet plus per-feature sheets. The compiler emits only the feature
5
- * sheets a page actually uses, which is both a size win and a correctness
6
- * property: a page without a carousel cannot ship carousel CSS that a later
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 with no interpolation. Everything variable
10
- * comes from theme tokens, so a spec cannot influence a declaration.
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
- html{-webkit-text-size-adjust:100%}
14
- body{margin:0;background: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)}
15
- .ak-skip{position:absolute;left:-9999px;top:0;background:var(--ak-color-surface);color:var(--ak-color-text);padding:calc(var(--ak-space-unit) * 1.5);z-index:10}
16
- .ak-skip:focus{left:0}
17
- .ak-shell{max-width:1100px;margin:0 auto;padding:calc(var(--ak-space-unit) * 3) calc(var(--ak-space-unit) * 2) calc(var(--ak-space-unit) * 8)}
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(h1,h2,h3,h4,h5,h6){font-family:var(--ak-font-heading);line-height:1.2;margin:0}
21
- h1{font-size:calc(var(--ak-font-size-base) * 2.1)}
22
- h2{font-size:calc(var(--ak-font-size-base) * 1.6)}
23
- h3{font-size:calc(var(--ak-font-size-base) * 1.3)}
24
- h4,h5,h6{font-size:calc(var(--ak-font-size-base) * 1.1)}
25
- p{margin:0}
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
- code,kbd{font-family:var(--ak-font-mono)}
28
- :focus-visible{outline:2px solid var(--ak-color-accent);outline-offset:2px}
29
- .ak-block + .ak-block{margin-top:calc(var(--ak-space-unit) * 3)}
30
- [data-density="compact"] .ak-block + .ak-block{margin-top:calc(var(--ak-space-unit) * 2)}
31
- [data-density="spacious"] .ak-block + .ak-block{margin-top:calc(var(--ak-space-unit) * 4)}
32
- .ak-stack{display:flex;flex-direction:column;gap:calc(var(--ak-space-unit) * 2)}
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:.78rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ak-color-text-muted)}
47
- .ak-hero{gap:var(--ak-space-unit);display:flex;flex-direction:column}
48
- .ak-hero h1{max-width:var(--ak-measure)}
49
- .ak-hero p{max-width:var(--ak-measure);font-size:calc(var(--ak-font-size-base) * 1.1);color:var(--ak-color-text-muted)}
50
- .ak-lead{font-size:calc(var(--ak-font-size-base) * 1.15)}
51
- .ak-caption{font-size:.85rem;color:var(--ak-color-text-muted)}
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-card,.ak-surface{background:var(--ak-color-surface);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 2)}
54
- .ak-card{display:flex;flex-direction:column;gap:var(--ak-space-unit)}
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-section-head{display:flex;flex-direction:column;gap:.35em;margin-bottom:calc(var(--ak-space-unit) * 1.5)}
57
- .ak-divider{border:0;border-top:var(--ak-border-width) solid var(--ak-color-border);margin:calc(var(--ak-space-unit) * 2) 0;display:flex;align-items:center;gap:var(--ak-space-unit)}
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{border-left:3px solid var(--ak-color-accent);padding-left:calc(var(--ak-space-unit) * 2);font-size:calc(var(--ak-font-size-base) * 1.1)}
63
- .ak-quote cite{display:block;margin-top:.5em;color:var(--ak-color-text-muted);font-size:.9rem;font-style:normal}
64
- .ak-badge{display:inline-block;padding:.15em .6em;border-radius:999px;border:var(--ak-border-width) solid var(--ak-color-border);background:var(--ak-color-surface-raised);font-size:.78rem;font-family:var(--ak-font-mono)}
65
- .ak-badge[data-tone="info"]{border-color:var(--ak-color-info);color:var(--ak-color-info)}
66
- .ak-badge[data-tone="success"]{border-color:var(--ak-color-success);color:var(--ak-color-success)}
67
- .ak-badge[data-tone="warning"]{border-color:var(--ak-color-warning);color:var(--ak-color-warning)}
68
- .ak-badge[data-tone="danger"]{border-color:var(--ak-color-danger);color:var(--ak-color-danger)}
69
- .ak-kbd{display:inline-flex;gap:.2em}
70
- .ak-kbd kbd{border:var(--ak-border-width) solid var(--ak-color-border);border-bottom-width:2px;border-radius:var(--ak-radius-small);padding:.1em .4em;background:var(--ak-color-surface-raised);font-size:.85em}
71
- .ak-kv{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:.4em calc(var(--ak-space-unit) * 2);margin:0}
72
- .ak-kv dt{color:var(--ak-color-text-muted)}
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:calc(var(--ak-space-unit) * 2);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin:0;padding:0;list-style:none}
75
- .ak-stat{background:var(--ak-color-surface);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 1.5)}
76
- .ak-stat dt{font-size:.8rem;color:var(--ak-color-text-muted);font-family:var(--ak-font-mono)}
77
- .ak-stat dd{margin:.2em 0 0;font-size:calc(var(--ak-font-size-base) * 1.5);font-family:var(--ak-font-heading)}
78
- .ak-steps{counter-reset:ak-step;list-style:none;padding:0;display:flex;flex-direction:column;gap:calc(var(--ak-space-unit) * 1.5)}
79
- .ak-steps li{counter-increment:ak-step;position:relative;padding-left:calc(var(--ak-space-unit) * 4)}
80
- .ak-steps li::before{content:counter(ak-step);position:absolute;left:0;top:0;width:24px;height:24px;border-radius:50%;background:var(--ak-color-accent);color:var(--ak-color-accent-contrast);display:flex;align-items:center;justify-content:center;font-family:var(--ak-font-mono);font-size:.8rem}
81
- .ak-timeline{list-style:none;padding:0;margin:0;border-left:var(--ak-border-width) solid var(--ak-color-border);display:flex;flex-direction:column;gap:calc(var(--ak-space-unit) * 2)}
82
- .ak-timeline li{position:relative;padding-left:calc(var(--ak-space-unit) * 2)}
83
- .ak-timeline li::before{content:"";position:absolute;left:calc(var(--ak-space-unit) * -1 - 3px);top:.45em;width:7px;height:7px;border-radius:50%;background:var(--ak-color-accent)}
84
- .ak-timeline time{display:block;font-family:var(--ak-font-mono);font-size:.78rem;color:var(--ak-color-text-muted)}
85
- .ak-table-wrap{overflow-x:auto}
86
- table{border-collapse:collapse;width:100%;background:var(--ak-color-surface)}
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
- th,td{text-align:left;padding:.55em .75em;border-bottom:var(--ak-border-width) solid var(--ak-color-border);vertical-align:top}
89
- thead th{background:var(--ak-color-surface-raised);font-family:var(--ak-font-mono);font-size:.8rem;text-transform:uppercase;letter-spacing:.04em}
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 h3{font-size:calc(var(--ak-font-size-base) * 1.05);margin-bottom:.5em}
92
- .ak-compare ul{margin:0}
93
- .ak-callout,.ak-alert{border-left:4px solid var(--ak-color-info);background:var(--ak-color-surface);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 1.5);display:flex;flex-direction:column;gap:.4em}
94
- .ak-callout[data-tone="success"],.ak-alert[data-tone="success"]{border-left-color:var(--ak-color-success)}
95
- .ak-callout[data-tone="warning"],.ak-alert[data-tone="warning"]{border-left-color:var(--ak-color-warning)}
96
- .ak-callout[data-tone="danger"],.ak-alert[data-tone="danger"]{border-left-color:var(--ak-color-danger)}
97
- .ak-code{margin:0;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);overflow-x:auto}
98
- .ak-code pre{margin:0;font-family:var(--ak-font-mono);font-size:.88rem;line-height:1.55}
99
- .ak-code-head{display:flex;justify-content:space-between;gap:var(--ak-space-unit);align-items:center;margin-bottom:.5em}
100
- .ak-btn{font:inherit;color:var(--ak-color-text);background:var(--ak-color-surface-raised);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-small);padding:.4em .8em;cursor:pointer;min-height:36px}
101
- .ak-btn:hover{border-color:var(--ak-color-accent)}
102
- .ak-btn[data-variant="primary"]{background:var(--ak-color-accent);color:var(--ak-color-accent-contrast);border-color:var(--ak-color-accent)}
103
- .ak-btn[data-variant="ghost"]{background:transparent;border-color:transparent}
104
- .ak-toolbar{display:flex;flex-wrap:wrap;gap:var(--ak-space-unit);align-items:center;padding:var(--ak-space-unit);background:var(--ak-color-surface);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium)}
105
- .ak-list{list-style:none;padding:0;display:flex;flex-direction:column;gap:.5em}
106
- .ak-list li{display:flex;gap:.5em;align-items:baseline;justify-content:space-between;border-bottom:var(--ak-border-width) solid var(--ak-color-border);padding-bottom:.4em}
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:flex;flex-direction:column;gap:.35em}
110
- .ak-progress progress{width:100%;height:10px}
111
- .ak-progress progress::-webkit-progress-bar{background:var(--ak-color-surface-raised)}
112
- .ak-media{margin:0;display:flex;flex-direction:column;gap:.5em}
113
- .ak-media img,.ak-gallery img{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)}
114
- .ak-media video{max-width:100%;border-radius:var(--ak-radius-medium)}
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
- @media (max-width:768px){body{--ak-font-size-base:16px}.ak-grid,.ak-compare,.ak-split,.ak-gallery{grid-template-columns:1fr!important}.ak-shell{padding:calc(var(--ak-space-unit) * 2) var(--ak-space-unit) calc(var(--ak-space-unit) * 6)}h1{font-size:calc(var(--ak-font-size-base) * 1.7)}}
118
- @media (max-width:480px){.ak-toolbar{flex-direction:column;align-items:stretch}.ak-stats{grid-template-columns:1fr 1fr}}
119
- @media print{.ak-skip,.ak-theme-toggle{display:none}}`;
120
- export const FEATURE_CSS = {
121
- tabs: `.ak-tabs [role="tablist"]{display:flex;flex-wrap:wrap;gap:.25em;border-bottom:var(--ak-border-width) solid var(--ak-color-border);margin-bottom:calc(var(--ak-space-unit) * 1.5)}
122
- .ak-tabs [role="tab"]{font:inherit;background:transparent;border:0;border-bottom:2px solid transparent;padding:.5em .8em;cursor:pointer;color:var(--ak-color-text-muted)}
123
- .ak-tabs [role="tab"][aria-selected="true"]{color:var(--ak-color-text);border-bottom-color:var(--ak-color-accent)}
124
- .ak-tabs [role="tabpanel"]{padding:0}
125
- .ak-tabs [role="tabpanel"][hidden]{display:none}`,
126
- accordion: `.ak-accordion{display:flex;flex-direction:column;gap:.4em}
127
- .ak-accordion details{background:var(--ak-color-surface);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * .75) var(--ak-space-unit)}
128
- .ak-accordion summary{cursor:pointer;font-family:var(--ak-font-heading);font-size:calc(var(--ak-font-size-base) * 1.02)}
129
- .ak-accordion details[open] summary{margin-bottom:.5em}`,
130
- carousel: `.ak-carousel{display:flex;flex-direction:column;gap:var(--ak-space-unit)}
131
- .ak-carousel-slides{position:relative;min-height:120px}
132
- .ak-carousel-slide{background:var(--ak-color-surface);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 2)}
133
- .ak-carousel-slide[hidden]{display:none}
134
- .ak-carousel-controls{display:flex;gap:var(--ak-space-unit);align-items:center}
135
- .ak-carousel-status{font-family:var(--ak-font-mono);font-size:.8rem;color:var(--ak-color-text-muted)}`,
136
- slider: `.ak-slider{display:flex;flex-direction:column;gap:.35em;max-width:420px}
137
- .ak-slider input[type="range"]{width:100%}
138
- .ak-slider output{font-family:var(--ak-font-mono);font-size:.85rem;color:var(--ak-color-text-muted)}`,
139
- dialog: `dialog.ak-dialog{max-width:min(560px,92vw);border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-large);background:var(--ak-color-surface);color:var(--ak-color-text);padding:calc(var(--ak-space-unit) * 2);box-shadow:var(--ak-elevation-popover)}
140
- dialog.ak-dialog::backdrop{background:rgba(0,0,0,.5)}
141
- .ak-dialog-actions{display:flex;gap:var(--ak-space-unit);justify-content:flex-end;margin-top:calc(var(--ak-space-unit) * 1.5)}`,
142
- chart: `.ak-chart{display:flex;flex-direction:column;gap:var(--ak-space-unit)}
143
- .ak-chart svg{width:100%;height:auto;overflow:visible}
144
- .ak-chart figcaption{font-size:.85rem;color:var(--ak-color-text-muted)}
145
- .ak-chart .ak-chart-bar{fill:var(--ak-color-accent)}
146
- .ak-chart .ak-chart-bar--alt{fill:var(--ak-color-info)}
147
- .ak-chart .ak-chart-line{fill:none;stroke:var(--ak-color-accent);stroke-width:2}
148
- .ak-chart .ak-chart-area{fill:var(--ak-color-accent);opacity:.18}
149
- .ak-chart .ak-chart-axis{stroke:var(--ak-color-border);stroke-width:1}
150
- .ak-chart .ak-chart-label{fill:var(--ak-color-text-muted);font-family:var(--ak-font-mono);font-size:10px}
151
- .ak-chart :focus-visible{outline:2px solid var(--ak-color-accent)}
152
- .ak-details{margin-top:var(--ak-space-unit)}
153
- .ak-details summary{cursor:pointer;color:var(--ak-color-text-muted);font-size:.85rem}`,
154
- filter: `.ak-search{display:flex;flex-direction:column;gap:.35em;max-width:380px}
155
- .ak-search input{font:inherit;padding:.45em .6em;border:var(--ak-border-width) solid var(--ak-color-border);border-radius:var(--ak-radius-small);background:var(--ak-color-surface);color:var(--ak-color-text)}`,
156
- theme: `.ak-theme-toggle{margin-left:auto}`,
157
- media: `.ak-media-fallback{display:flex;flex-direction:column;gap:.35em;background:var(--ak-color-surface);border:var(--ak-border-width) dashed var(--ak-color-border);border-radius:var(--ak-radius-medium);padding:calc(var(--ak-space-unit) * 1.5)}
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;;;;;;;;;;GAUG;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDA2G8B,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAsD;IAC5E,IAAI,EAAE;;;;iDAIyC;IAE/C,SAAS,EAAE;;;wDAG2C;IAEtD,QAAQ,EAAE;;;;;sGAK0F;IAEpG,MAAM,EAAE;;qGAE2F;IAEnG,MAAM,EAAE;;+HAEqH;IAE7H,KAAK,EAAE;;;;;;;;;;;sFAW6E;IAEpF,MAAM,EAAE;gNACsM;IAE9M,KAAK,EAAE,oCAAoC;IAE3C,KAAK,EAAE;4EACmE;IAE1E,OAAO,EAAE;;0MAE+L;CACzM,CAAC"}
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;AAsDD,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,EAAE,CAuF/D;AAED,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,UAAU,EAAE,CAyB5F"}
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"}
@@ -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))