@tekki-forge/runtime-admin 0.2.0 → 0.3.2

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 (136) hide show
  1. package/dist/admin-dashboard.d.ts +16 -0
  2. package/dist/admin-dashboard.js +60 -0
  3. package/dist/admin-dashboard.js.map +1 -0
  4. package/dist/admin-orgs.d.ts +14 -0
  5. package/dist/admin-orgs.js +75 -0
  6. package/dist/admin-orgs.js.map +1 -0
  7. package/dist/admin-shell.d.ts +55 -0
  8. package/dist/admin-shell.js +141 -0
  9. package/dist/admin-shell.js.map +1 -0
  10. package/dist/admin.js +35 -4
  11. package/dist/admin.js.map +1 -1
  12. package/dist/app-pages.d.ts +19 -0
  13. package/dist/app-pages.js +109 -0
  14. package/dist/app-pages.js.map +1 -0
  15. package/dist/auth-pages.js +7 -2
  16. package/dist/auth-pages.js.map +1 -1
  17. package/dist/charts.d.ts +98 -2
  18. package/dist/charts.js +264 -24
  19. package/dist/charts.js.map +1 -1
  20. package/dist/context.js +32 -1
  21. package/dist/context.js.map +1 -1
  22. package/dist/dashboard.d.ts +63 -8
  23. package/dist/dashboard.js +180 -36
  24. package/dist/dashboard.js.map +1 -1
  25. package/dist/i18n/messages/de.js +751 -0
  26. package/dist/i18n/messages/de.js.map +1 -1
  27. package/dist/i18n/messages/en.js +751 -0
  28. package/dist/i18n/messages/en.js.map +1 -1
  29. package/dist/i18n/messages/es.js +751 -0
  30. package/dist/i18n/messages/es.js.map +1 -1
  31. package/dist/i18n/messages/fr.js +751 -0
  32. package/dist/i18n/messages/fr.js.map +1 -1
  33. package/dist/i18n/messages/pt.js +751 -0
  34. package/dist/i18n/messages/pt.js.map +1 -1
  35. package/dist/index.d.ts +9 -0
  36. package/dist/index.js +9 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/shell.js +37 -34
  39. package/dist/shell.js.map +1 -1
  40. package/dist/site/editor/api.d.ts +74 -0
  41. package/dist/site/editor/api.js +93 -0
  42. package/dist/site/editor/api.js.map +1 -0
  43. package/dist/site/editor/content-page.d.ts +4 -0
  44. package/dist/site/editor/content-page.js +65 -0
  45. package/dist/site/editor/content-page.js.map +1 -0
  46. package/dist/site/editor/inbox-tab.d.ts +4 -0
  47. package/dist/site/editor/inbox-tab.js +88 -0
  48. package/dist/site/editor/inbox-tab.js.map +1 -0
  49. package/dist/site/editor/index.d.ts +1 -0
  50. package/dist/site/editor/index.js +3 -0
  51. package/dist/site/editor/index.js.map +1 -0
  52. package/dist/site/editor/model.d.ts +145 -0
  53. package/dist/site/editor/model.js +408 -0
  54. package/dist/site/editor/model.js.map +1 -0
  55. package/dist/site/editor/page-editor.d.ts +10 -0
  56. package/dist/site/editor/page-editor.js +257 -0
  57. package/dist/site/editor/page-editor.js.map +1 -0
  58. package/dist/site/editor/page-settings.d.ts +9 -0
  59. package/dist/site/editor/page-settings.js +105 -0
  60. package/dist/site/editor/page-settings.js.map +1 -0
  61. package/dist/site/editor/pages-tab.d.ts +5 -0
  62. package/dist/site/editor/pages-tab.js +108 -0
  63. package/dist/site/editor/pages-tab.js.map +1 -0
  64. package/dist/site/editor/posts-tab.d.ts +6 -0
  65. package/dist/site/editor/posts-tab.js +139 -0
  66. package/dist/site/editor/posts-tab.js.map +1 -0
  67. package/dist/site/editor/preview.d.ts +32 -0
  68. package/dist/site/editor/preview.js +104 -0
  69. package/dist/site/editor/preview.js.map +1 -0
  70. package/dist/site/editor/prop-fields.d.ts +53 -0
  71. package/dist/site/editor/prop-fields.js +233 -0
  72. package/dist/site/editor/prop-fields.js.map +1 -0
  73. package/dist/site/editor/section-list.d.ts +14 -0
  74. package/dist/site/editor/section-list.js +110 -0
  75. package/dist/site/editor/section-list.js.map +1 -0
  76. package/dist/site/editor/section-picker.d.ts +12 -0
  77. package/dist/site/editor/section-picker.js +44 -0
  78. package/dist/site/editor/section-picker.js.map +1 -0
  79. package/dist/site/editor/widgets.d.ts +84 -0
  80. package/dist/site/editor/widgets.js +130 -0
  81. package/dist/site/editor/widgets.js.map +1 -0
  82. package/dist/site/format.d.ts +31 -0
  83. package/dist/site/format.js +106 -0
  84. package/dist/site/format.js.map +1 -0
  85. package/dist/site/forms.d.ts +43 -0
  86. package/dist/site/forms.js +155 -0
  87. package/dist/site/forms.js.map +1 -0
  88. package/dist/site/header.d.ts +32 -0
  89. package/dist/site/header.js +76 -0
  90. package/dist/site/header.js.map +1 -0
  91. package/dist/site/icons.d.ts +10 -0
  92. package/dist/site/icons.js +28 -0
  93. package/dist/site/icons.js.map +1 -0
  94. package/dist/site/index.d.ts +11 -0
  95. package/dist/site/index.js +13 -0
  96. package/dist/site/index.js.map +1 -0
  97. package/dist/site/markdown.d.ts +14 -0
  98. package/dist/site/markdown.js +457 -0
  99. package/dist/site/markdown.js.map +1 -0
  100. package/dist/site/page.d.ts +16 -0
  101. package/dist/site/page.js +65 -0
  102. package/dist/site/page.js.map +1 -0
  103. package/dist/site/proxy.d.ts +13 -0
  104. package/dist/site/proxy.js +43 -0
  105. package/dist/site/proxy.js.map +1 -0
  106. package/dist/site/sections.d.ts +43 -0
  107. package/dist/site/sections.js +560 -0
  108. package/dist/site/sections.js.map +1 -0
  109. package/dist/site/server.d.ts +73 -0
  110. package/dist/site/server.js +235 -0
  111. package/dist/site/server.js.map +1 -0
  112. package/dist/site/types.d.ts +137 -0
  113. package/dist/site/types.js +2 -0
  114. package/dist/site/types.js.map +1 -0
  115. package/dist/support.d.ts +29 -0
  116. package/dist/support.js +165 -0
  117. package/dist/support.js.map +1 -0
  118. package/dist/system-config.d.ts +24 -0
  119. package/dist/system-config.js +37 -0
  120. package/dist/system-config.js.map +1 -0
  121. package/dist/system-settings.d.ts +9 -0
  122. package/dist/system-settings.js +60 -0
  123. package/dist/system-settings.js.map +1 -0
  124. package/dist/theme-catalog.d.ts +72 -2
  125. package/dist/theme-catalog.js +47 -0
  126. package/dist/theme-catalog.js.map +1 -1
  127. package/dist/theme-switcher.d.ts +8 -0
  128. package/dist/theme-switcher.js +39 -4
  129. package/dist/theme-switcher.js.map +1 -1
  130. package/dist/theme.js +8 -0
  131. package/dist/theme.js.map +1 -1
  132. package/dist/transactions.d.ts +4 -0
  133. package/dist/transactions.js +60 -0
  134. package/dist/transactions.js.map +1 -0
  135. package/package.json +9 -5
  136. package/styles.css +1089 -0
package/styles.css CHANGED
@@ -776,3 +776,1092 @@
776
776
  [data-forge-style="brutalist"] .forge-landing-hero { border: 3px solid var(--brut-ink); box-shadow: 8px 8px 0 var(--brut-ink); }
777
777
  [data-forge-style="terminal"] .forge-landing-hero { border: 1px solid var(--forge-line-strong); }
778
778
  }
779
+
780
+ /* ── Dashboard charts (forge-chart-*): palette, legend, tables, goals and tabs ─────────────────── */
781
+ /* The chart palette starts with the brand colours, lightened in dark mode so marks keep ≥3:1 contrast with surfaces;
782
+ the others are mid-tones (darker in light mode, lighter in dark mode) spread around the primary's hue. A style or the generated theme.css may override any of them. */
783
+ @layer base {
784
+ :root {
785
+ --forge-chart-1: light-dark(var(--forge-primary), color-mix(in oklab, var(--forge-primary) 62%, white));
786
+ --forge-chart-2: light-dark(color-mix(in oklab, var(--forge-accent) 82%, black), color-mix(in oklab, var(--forge-accent) 80%, white));
787
+ --forge-chart-3: light-dark(#0d9488, #2dd4bf);
788
+ --forge-chart-4: light-dark(#c2410c, #fb923c);
789
+ --forge-chart-5: light-dark(#be185d, #f472b6);
790
+ --forge-chart-6: light-dark(#7c3aed, #a78bfa);
791
+ --forge-chart-7: light-dark(#0369a1, #38bdf8);
792
+ --forge-chart-8: light-dark(#4d7c0f, #a3e635);
793
+ }
794
+ /* Where relative colours work: the other hues are placed at ±90°, ±135° and ±45° from the primary hue: apart from it and from the usual accents (analogous at about ±60°, or complementary). */
795
+ @supports (color: oklch(from red l c h)) {
796
+ :root {
797
+ --forge-chart-3: light-dark(oklch(from var(--forge-primary) 0.56 0.15 calc(h + 90)), oklch(from var(--forge-primary) 0.78 0.13 calc(h + 90)));
798
+ --forge-chart-4: light-dark(oklch(from var(--forge-primary) 0.56 0.15 calc(h + 270)), oklch(from var(--forge-primary) 0.78 0.13 calc(h + 270)));
799
+ --forge-chart-5: light-dark(oklch(from var(--forge-primary) 0.56 0.15 calc(h + 135)), oklch(from var(--forge-primary) 0.78 0.13 calc(h + 135)));
800
+ --forge-chart-6: light-dark(oklch(from var(--forge-primary) 0.56 0.15 calc(h + 225)), oklch(from var(--forge-primary) 0.78 0.13 calc(h + 225)));
801
+ --forge-chart-7: light-dark(oklch(from var(--forge-primary) 0.56 0.15 calc(h + 45)), oklch(from var(--forge-primary) 0.78 0.13 calc(h + 45)));
802
+ --forge-chart-8: light-dark(oklch(from var(--forge-primary) 0.56 0.15 calc(h + 315)), oklch(from var(--forge-primary) 0.78 0.13 calc(h + 315)));
803
+ }
804
+ }
805
+ }
806
+ @layer components {
807
+ .forge-chart-legend .forge-chart-swatch { box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--forge-ink) 12%, transparent); }
808
+ .forge-chart-table th, .forge-chart-table td { padding: 0.4rem 0.5rem; border-bottom: 1px solid var(--forge-line); }
809
+ .forge-chart-table thead th { position: sticky; top: 0; background: var(--forge-surface); color: var(--forge-ink-muted); font-size: 0.75rem; font-weight: 500; }
810
+ .forge-chart-table tbody tr:hover { background: var(--forge-hover); }
811
+ .forge-chart-toggle[aria-pressed="true"] { color: var(--forge-ink); background: var(--forge-selected); }
812
+ .forge-goal-track { stroke: var(--forge-line); }
813
+ .forge-goal-value { stroke: var(--forge-chart-1); transition: stroke-dasharray 0.6s ease-out; }
814
+ .forge-goal-text { fill: var(--forge-ink); }
815
+ .forge-goal-ring[data-forge-goal="good"] .forge-goal-value { stroke: light-dark(#059669, #34d399); }
816
+ .forge-goal { color: var(--forge-ink-muted); font-weight: 500; }
817
+ .forge-goal[data-forge-goal="good"] { color: color-mix(in oklab, light-dark(#059669, #34d399) 72%, var(--forge-ink)); }
818
+ .forge-dashboard-tab { color: var(--forge-ink-muted); border-color: transparent; border-radius: var(--forge-radius-control) var(--forge-radius-control) 0 0; }
819
+ .forge-dashboard-tab:hover { color: var(--forge-ink); background: var(--forge-hover); }
820
+ .forge-dashboard-tab[data-active] { color: var(--forge-ink); border-color: var(--forge-chart-1); }
821
+ [data-forge-style="terminal"] .forge-dashboard-tab, [data-forge-style="brutalist"] .forge-dashboard-tab { border-radius: 0; }
822
+ @media (prefers-reduced-motion: reduce) { .forge-goal-value { transition: none; } }
823
+ }
824
+ /* ── Administration area (/admin) and the app's Admin entry ───────────────────────────────────────
825
+ Hooks: forge-admin-*. Built only from theme tokens, so every style and preset (light and dark) applies.
826
+ The admin sidebar keeps each style's own surface and adds a neutral ink tint on top (a pseudo-element,
827
+ so styles that set the sidebar's background or shadow are not overridden). */
828
+ @layer components {
829
+ .forge-admin-sidebar { isolation: isolate; }
830
+ .forge-admin-sidebar::before {
831
+ content: "";
832
+ position: absolute;
833
+ inset: 0;
834
+ z-index: 0;
835
+ pointer-events: none;
836
+ background: color-mix(in oklab, var(--forge-ink) 6%, transparent);
837
+ }
838
+ .forge-admin-badge {
839
+ background: var(--forge-ink);
840
+ color: var(--forge-surface);
841
+ border-radius: min(var(--forge-radius-control), 6px);
842
+ }
843
+ .forge-admin-back { color: var(--forge-ink); box-shadow: inset 0 0 0 1px var(--forge-line-strong); background: color-mix(in oklab, var(--forge-surface) 70%, transparent); }
844
+ .forge-admin-topbar { backdrop-filter: saturate(1.2) blur(8px); }
845
+ .forge-admin-scope {
846
+ color: var(--forge-ink-muted);
847
+ border-radius: 999px;
848
+ box-shadow: inset 0 0 0 1px var(--forge-line-strong);
849
+ }
850
+ .forge-admin-segmented { background: var(--forge-surface-muted); border-radius: var(--forge-radius-control); box-shadow: inset 0 0 0 1px var(--forge-line); }
851
+ .forge-admin-savebar {
852
+ background: color-mix(in oklab, var(--forge-surface) 92%, transparent);
853
+ border: 1px solid var(--forge-line);
854
+ border-radius: var(--forge-radius);
855
+ box-shadow: 0 12px 32px -12px rgb(0 0 0 / 0.25);
856
+ backdrop-filter: blur(8px);
857
+ }
858
+ /* The Admin entry in the app navigation: always visible, set apart from the app's own items. */
859
+ .forge-admin-entry.forge-nav-item { color: var(--forge-ink); box-shadow: inset 0 0 0 1px var(--forge-line-strong); }
860
+ .forge-admin-entry.forge-nav-item svg { color: var(--forge-primary); }
861
+ .forge-admin-forbidden h1 { text-wrap: balance; }
862
+ .forge-page-tab:focus-visible { outline: var(--forge-ring); outline-offset: -2px; }
863
+ .forge-usage-track { background: var(--forge-line); }
864
+ .forge-support-message { background: var(--forge-surface-muted); border-radius: var(--forge-radius); box-shadow: inset 0 0 0 1px var(--forge-line); }
865
+ .forge-support-message-own { background: color-mix(in oklab, var(--forge-primary) 10%, var(--forge-surface)); box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--forge-primary) 25%, transparent); }
866
+ .forge-support-row[aria-current="true"] { background: var(--forge-selected); }
867
+ [data-forge-style="brutalist"] .forge-admin-badge, [data-forge-style="terminal"] .forge-admin-badge,
868
+ [data-forge-style="brutalist"] .forge-admin-scope, [data-forge-style="terminal"] .forge-admin-scope { border-radius: 0; }
869
+ /* ════════════════════════════════════════════════════════════════════════════════════════════════
870
+ * Styles: corporate, soft, luxury, retro, neon, swiss, nature, cyber, minimal, playful.
871
+ * Each block sets tokens first (so any component built on --forge-* tokens inherits the look, including
872
+ * hooks added later such as forge-site-*, forge-admin-* and forge-chart-*), then restyles the shared hooks.
873
+ * Text tokens are plain hex pairs checked for WCAG AA by tests/theme-contrast.test.ts.
874
+ * ════════════════════════════════════════════════════════════════════════════════════════════════ */
875
+
876
+ }
877
+ /* ── corporate: sober, dense, enterprise blue-grey, crisp tables ──────────────────────────────── */
878
+ @layer components {
879
+ [data-forge-style="corporate"] {
880
+ --forge-canvas: light-dark(#f2f4f7, #0e131a);
881
+ --forge-surface: light-dark(#ffffff, #151b24);
882
+ --forge-surface-muted: light-dark(#f6f8fa, #121821);
883
+ --forge-line: light-dark(#dfe3ea, #263040);
884
+ --forge-line-strong: light-dark(#c3cad5, #364357);
885
+ --forge-ink: light-dark(#1a2230, #e5eaf1);
886
+ --forge-ink-muted: light-dark(#4a5568, #a7b2c3);
887
+ --forge-ink-subtle: light-dark(#5d697b, #8d99ab);
888
+ --forge-hover: light-dark(rgb(26 34 48 / 0.045), rgb(255 255 255 / 0.05));
889
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 10%, transparent);
890
+ --forge-card-shadow: 0 1px 2px light-dark(rgb(16 24 40 / 0.06), rgb(0 0 0 / 0.4));
891
+ --forge-card-shadow-hover: 0 1px 2px light-dark(rgb(16 24 40 / 0.06), rgb(0 0 0 / 0.4)), 0 8px 20px -10px light-dark(rgb(16 24 40 / 0.25), rgb(0 0 0 / 0.7));
892
+ --forge-ring: 2px solid var(--forge-link);
893
+ --forge-ring-offset: 1px;
894
+ }
895
+ [data-forge-style="corporate"] .forge-card { border-radius: min(var(--forge-radius), 6px); }
896
+ [data-forge-style="corporate"] .forge-sidebar { background: var(--forge-surface); }
897
+ [data-forge-style="corporate"] .forge-topbar { box-shadow: 0 1px 2px light-dark(rgb(16 24 40 / 0.05), rgb(0 0 0 / 0.3)); }
898
+ [data-forge-style="corporate"] .forge-heading { font-weight: 600; letter-spacing: -0.01em; }
899
+ [data-forge-style="corporate"] .forge-btn { font-weight: 500; border-radius: min(var(--forge-radius-control), 5px); }
900
+ [data-forge-style="corporate"] .forge-btn-primary { box-shadow: inset 0 -1px 0 rgb(0 0 0 / 0.15), 0 1px 1px rgb(16 24 40 / 0.1); }
901
+ [data-forge-style="corporate"] .forge-btn-secondary { box-shadow: 0 1px 1px light-dark(rgb(16 24 40 / 0.06), rgb(0 0 0 / 0.3)); }
902
+ [data-forge-style="corporate"] .forge-input { border-radius: min(var(--forge-radius-control), 5px); }
903
+ [data-forge-style="corporate"] .forge-nav-item { border-radius: min(var(--forge-radius-control), 5px); }
904
+ [data-forge-style="corporate"] .forge-nav-item[aria-current="page"] { color: var(--forge-ink); font-weight: 600; box-shadow: inset 3px 0 0 var(--forge-primary); border-radius: 0 min(var(--forge-radius-control), 5px) min(var(--forge-radius-control), 5px) 0; }
905
+ [data-forge-style="corporate"] .forge-topnav .forge-nav-item[aria-current="page"] { box-shadow: inset 0 -2px 0 var(--forge-primary); border-radius: 0; }
906
+ [data-forge-style="corporate"] .forge-table thead tr { background: var(--forge-surface-muted); border-bottom-color: var(--forge-line-strong); letter-spacing: 0.04em; }
907
+ [data-forge-style="corporate"] .forge-table tbody tr:nth-child(even) { background: light-dark(rgb(26 34 48 / 0.022), rgb(255 255 255 / 0.022)); }
908
+ [data-forge-style="corporate"] .forge-table tbody tr:hover { background: var(--forge-selected); }
909
+ [data-forge-style="corporate"] .forge-badge { border-radius: 4px; }
910
+ [data-forge-style="corporate"] .forge-chip { border-radius: 6px; }
911
+ [data-forge-style="corporate"] .forge-metric::after { display: none; }
912
+ [data-forge-style="corporate"] .forge-metric { box-shadow: var(--forge-card-shadow), inset 0 3px 0 var(--forge-primary); }
913
+ [data-forge-style="corporate"] .forge-dialog { border-radius: min(var(--forge-radius), 8px); }
914
+ [data-forge-style="corporate"] .forge-toast { border-left: 3px solid var(--forge-info); }
915
+ [data-forge-style="corporate"] .forge-toast[data-forge-toast="success"] { border-left-color: var(--forge-success); }
916
+ [data-forge-style="corporate"] .forge-toast[data-forge-toast="error"] { border-left-color: var(--forge-danger); }
917
+ }
918
+
919
+ /* ── soft: pastel, rounded, airy, gentle shadows ──────────────────────────────────────────────── */
920
+ @layer components {
921
+ [data-forge-style="soft"] {
922
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-primary) 5%, #faf8fd), color-mix(in oklab, var(--forge-primary) 7%, #15131c));
923
+ --forge-surface: light-dark(#ffffff, #1f1c28);
924
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-primary) 5%, #f7f5fb), color-mix(in oklab, var(--forge-primary) 6%, #1a1722));
925
+ --forge-line: light-dark(color-mix(in oklab, var(--forge-primary) 9%, #eceaf2), rgb(255 255 255 / 0.07));
926
+ --forge-line-strong: light-dark(color-mix(in oklab, var(--forge-primary) 15%, #dcd8e6), rgb(255 255 255 / 0.14));
927
+ --forge-ink: light-dark(#2b2838, #eeebf6);
928
+ --forge-ink-muted: light-dark(#585370, #bdb7cf);
929
+ --forge-ink-subtle: light-dark(#696482, #a39db8);
930
+ --forge-hover: color-mix(in oklab, var(--forge-primary) 7%, transparent);
931
+ --forge-selected: light-dark(color-mix(in oklab, var(--forge-accent) 24%, transparent), color-mix(in oklab, var(--forge-primary) 26%, transparent));
932
+ --forge-focus: color-mix(in oklab, var(--forge-primary) 22%, transparent);
933
+ --forge-card-shadow: 0 1px 2px light-dark(rgb(60 40 120 / 0.04), rgb(0 0 0 / 0.3)), 0 12px 32px -14px light-dark(color-mix(in oklab, var(--forge-primary) 24%, transparent), rgb(0 0 0 / 0.55));
934
+ --forge-card-shadow-hover: 0 1px 2px light-dark(rgb(60 40 120 / 0.05), rgb(0 0 0 / 0.3)), 0 20px 40px -16px light-dark(color-mix(in oklab, var(--forge-primary) 32%, transparent), rgb(0 0 0 / 0.65));
935
+ --forge-ring: 2px solid color-mix(in oklab, var(--forge-primary) 70%, transparent);
936
+ --forge-ring-offset: 3px;
937
+ --forge-pad-card: 1.5rem;
938
+ --forge-pad-card-lg: 1.75rem;
939
+ --forge-main-y: 2.5rem;
940
+ }
941
+ :root[data-forge-style="soft"][data-forge-density="compact"] { --forge-pad-card: 1rem; --forge-pad-card-lg: 1.25rem; --forge-main-y: 1.5rem; }
942
+ [data-forge-style="soft"] .forge-card { border-color: color-mix(in oklab, var(--forge-line) 70%, transparent); border-radius: max(var(--forge-radius), 20px); }
943
+ [data-forge-style="soft"] .forge-card-flat { border-radius: max(var(--forge-radius), 16px); }
944
+ [data-forge-style="soft"] :is(.forge-dialog, .forge-popover, .forge-toast) { border-color: transparent; border-radius: max(var(--forge-radius), 20px); box-shadow: var(--forge-card-shadow-hover); }
945
+ [data-forge-style="soft"] .forge-popover { border-radius: max(var(--forge-radius-control), 14px); }
946
+ [data-forge-style="soft"] .forge-sidebar { background: color-mix(in oklab, var(--forge-surface) 55%, transparent); border-right-color: transparent; }
947
+ [data-forge-style="soft"] .forge-topbar { background: color-mix(in oklab, var(--forge-surface) 75%, transparent); border-bottom-color: transparent; -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); }
948
+ [data-forge-style="soft"] .forge-heading { font-weight: 700; letter-spacing: -0.015em; }
949
+ [data-forge-style="soft"] .forge-btn { border-radius: max(var(--forge-radius-control), 12px); font-weight: 600; }
950
+ [data-forge-style="soft"] .forge-btn-primary { box-shadow: 0 8px 18px -10px color-mix(in oklab, var(--forge-primary) 80%, transparent); }
951
+ [data-forge-style="soft"] .forge-btn-secondary { border-color: transparent; background: var(--forge-surface-muted); }
952
+ [data-forge-style="soft"] .forge-btn-secondary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-primary) 10%, var(--forge-surface)); }
953
+ [data-forge-style="soft"] .forge-input { background: var(--forge-surface-muted); border-color: transparent; border-radius: max(var(--forge-radius-control), 12px); }
954
+ [data-forge-style="soft"] .forge-input:focus { background: var(--forge-surface); border-color: color-mix(in oklab, var(--forge-primary) 45%, transparent); }
955
+ [data-forge-style="soft"] .forge-nav-item { border-radius: max(var(--forge-radius-control), 12px); }
956
+ [data-forge-style="soft"] .forge-nav-item[aria-current="page"] { font-weight: 600; }
957
+ [data-forge-style="soft"] .forge-table thead tr { border-bottom-color: transparent; background: var(--forge-surface-muted); }
958
+ [data-forge-style="soft"] .forge-table tbody tr { border-top-color: color-mix(in oklab, var(--forge-line) 70%, transparent); }
959
+ [data-forge-style="soft"] .forge-badge { border-radius: 999px; box-shadow: none; }
960
+ [data-forge-style="soft"] .forge-chip { border-radius: 14px; box-shadow: none; background: light-dark(color-mix(in oklab, var(--forge-accent) 26%, #ffffff), color-mix(in oklab, var(--forge-primary) 24%, transparent)); color: var(--forge-link); }
961
+ [data-forge-style="soft"] .forge-avatar { background: color-mix(in oklab, var(--forge-accent) 30%, var(--forge-surface)); }
962
+ [data-forge-style="soft"] .forge-switch-thumb { box-shadow: 0 2px 6px rgb(0 0 0 / 0.2); }
963
+ [data-forge-style="soft"] .forge-alert { border-color: transparent; border-radius: max(var(--forge-radius-control), 12px); }
964
+ }
965
+
966
+ /* ── luxury: deep tones, gold accents (the primary), serif display, thin rules ────────────────── */
967
+ @layer components {
968
+ [data-forge-style="luxury"] {
969
+ --forge-canvas: light-dark(#f7f3ea, #0c0b0a);
970
+ --forge-surface: light-dark(#fffdf7, #15130f);
971
+ --forge-surface-muted: light-dark(#f1ebdd, #100f0c);
972
+ --forge-line: light-dark(color-mix(in oklab, var(--forge-primary) 22%, #e6dfcf), color-mix(in oklab, var(--forge-primary) 20%, #27231d));
973
+ --forge-line-strong: light-dark(color-mix(in oklab, var(--forge-primary) 42%, #d6cdb8), color-mix(in oklab, var(--forge-primary) 42%, #2f2a23));
974
+ --forge-ink: light-dark(#1c1914, #f3ede0);
975
+ --forge-ink-muted: light-dark(#59513f, #bfb5a2);
976
+ --forge-ink-subtle: light-dark(#6e6553, #a09682);
977
+ --forge-hover: light-dark(rgb(28 25 20 / 0.04), rgb(255 248 230 / 0.045));
978
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 13%, transparent);
979
+ --forge-card-shadow: none;
980
+ --forge-card-shadow-hover: 0 0 0 1px var(--forge-line-strong), 0 18px 40px -24px light-dark(rgb(60 45 10 / 0.4), rgb(0 0 0 / 0.9));
981
+ --forge-ring: 1px solid var(--forge-link);
982
+ --forge-ring-offset: 3px;
983
+ --forge-pad-card: 1.5rem;
984
+ --forge-pad-card-lg: 2rem;
985
+ --forge-main-y: 2.75rem;
986
+ }
987
+ :root[data-forge-style="luxury"][data-forge-density="compact"] { --forge-pad-card: 1rem; --forge-pad-card-lg: 1.25rem; --forge-main-y: 1.5rem; }
988
+ [data-forge-style="luxury"] .forge-card { border-radius: min(var(--forge-radius), 4px); }
989
+ [data-forge-style="luxury"] :is(.forge-dialog, .forge-popover, .forge-toast) { border-color: var(--forge-line-strong); border-radius: min(var(--forge-radius), 4px); }
990
+ [data-forge-style="luxury"] .forge-sidebar { background: var(--forge-canvas); }
991
+ [data-forge-style="luxury"] .forge-topbar { background: var(--forge-canvas); border-bottom-color: var(--forge-line-strong); box-shadow: 0 3px 0 -2px var(--forge-line); }
992
+ [data-forge-style="luxury"] .forge-heading { font-weight: 600; letter-spacing: 0.005em; }
993
+ [data-forge-style="luxury"] .forge-logo { background: transparent; color: var(--forge-link); box-shadow: inset 0 0 0 1px var(--forge-line-strong); border-radius: 999px; }
994
+ [data-forge-style="luxury"] .forge-btn { text-transform: uppercase; letter-spacing: 0.12em; font-size: 0.6875rem; font-weight: 600; border-radius: min(var(--forge-radius-control), 3px); }
995
+ [data-forge-style="luxury"] .forge-btn-primary { box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--forge-primary) 70%, white), 0 10px 24px -14px var(--forge-primary); }
996
+ [data-forge-style="luxury"] .forge-btn-secondary { background: transparent; border-color: var(--forge-line-strong); }
997
+ [data-forge-style="luxury"] .forge-btn-secondary:hover:not(:disabled) { border-color: var(--forge-link); background: var(--forge-hover); }
998
+ [data-forge-style="luxury"] .forge-input { background: transparent; border-color: var(--forge-line-strong); border-radius: min(var(--forge-radius-control), 3px); }
999
+ [data-forge-style="luxury"] .forge-input:focus { border-color: var(--forge-link); box-shadow: 0 0 0 1px var(--forge-link); }
1000
+ [data-forge-style="luxury"] .forge-nav-item { letter-spacing: 0.02em; border-radius: 0; }
1001
+ [data-forge-style="luxury"] .forge-nav-item[aria-current="page"] { background: transparent; color: var(--forge-link); box-shadow: inset 1px 0 0 var(--forge-link); }
1002
+ [data-forge-style="luxury"] .forge-topnav .forge-nav-item[aria-current="page"] { box-shadow: inset 0 -1px 0 var(--forge-link); }
1003
+ [data-forge-style="luxury"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-link); }
1004
+ [data-forge-style="luxury"] .forge-table thead tr { letter-spacing: 0.14em; border-bottom-color: var(--forge-line-strong); }
1005
+ [data-forge-style="luxury"] .forge-table tbody tr:hover { background: var(--forge-selected); }
1006
+ [data-forge-style="luxury"] .forge-badge { background: transparent; border-radius: 2px; letter-spacing: 0.04em; box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tone) 55%, transparent); }
1007
+ [data-forge-style="luxury"] .forge-chip { background: transparent; color: var(--forge-link); box-shadow: inset 0 0 0 1px var(--forge-line-strong); border-radius: 999px; }
1008
+ [data-forge-style="luxury"] .forge-metric::after { display: none; }
1009
+ [data-forge-style="luxury"] .forge-metric-value { font-weight: 500; letter-spacing: 0; }
1010
+ [data-forge-style="luxury"] .forge-avatar { background: transparent; box-shadow: inset 0 0 0 1px var(--forge-line-strong); color: var(--forge-link); }
1011
+ [data-forge-style="luxury"] .forge-switch[aria-checked="true"] { background: var(--forge-primary); }
1012
+ [data-forge-style="luxury"] .forge-alert { background: transparent; border-radius: 2px; }
1013
+ }
1014
+
1015
+ /* ── retro: 90s desktop windows — bevels, title bars, pixel headings, readable body ───────────── */
1016
+ @layer components {
1017
+ [data-forge-style="retro"] {
1018
+ --retro-face: light-dark(#d4d0c8, #2c3034);
1019
+ --retro-field: light-dark(#ffffff, #16191c);
1020
+ --retro-hi: light-dark(#ffffff, #5d656c);
1021
+ --retro-mid: light-dark(#e9e6e0, #41484e);
1022
+ --retro-lo: light-dark(#808080, #15181a);
1023
+ --retro-dk: light-dark(#0a0a0a, #000000);
1024
+ --retro-raised: inset -1px -1px 0 var(--retro-dk), inset 1px 1px 0 var(--retro-hi), inset -2px -2px 0 var(--retro-lo), inset 2px 2px 0 var(--retro-mid);
1025
+ --retro-sunken: inset 1px 1px 0 var(--retro-lo), inset -1px -1px 0 var(--retro-hi), inset 2px 2px 0 var(--retro-dk), inset -2px -2px 0 var(--retro-mid);
1026
+ --retro-title: linear-gradient(90deg, var(--forge-primary), color-mix(in oklab, var(--forge-primary) 45%, var(--forge-accent)));
1027
+ --forge-canvas: light-dark(#c3c7cb, #1d2023);
1028
+ --forge-surface: var(--retro-face);
1029
+ --forge-surface-muted: light-dark(#cbc7bf, #272a2e);
1030
+ --forge-line: light-dark(#8a8a8a, #4a5157);
1031
+ --forge-line-strong: light-dark(#404040, #7d858c);
1032
+ --forge-ink: light-dark(#000000, #f0f0f0);
1033
+ --forge-ink-muted: light-dark(#2e2e2e, #c8cdd2);
1034
+ --forge-ink-subtle: light-dark(#3e3e3e, #acb3b9);
1035
+ --forge-hover: color-mix(in oklab, var(--forge-primary) 12%, transparent);
1036
+ --forge-selected: var(--forge-primary);
1037
+ --forge-card-shadow: var(--retro-raised);
1038
+ --forge-card-shadow-hover: var(--retro-raised), 3px 3px 0 rgb(0 0 0 / 0.25);
1039
+ --forge-ring: 1px dotted var(--forge-ink);
1040
+ --forge-ring-offset: -4px;
1041
+ --forge-radius: 0px;
1042
+ --forge-radius-control: 0px;
1043
+ }
1044
+ [data-forge-style="retro"] .forge-card,
1045
+ [data-forge-style="retro"] .forge-dialog,
1046
+ [data-forge-style="retro"] .forge-popover,
1047
+ [data-forge-style="retro"] .forge-toast {
1048
+ background: var(--retro-title) top / 100% 6px no-repeat, var(--retro-face);
1049
+ border: 0;
1050
+ border-radius: 0;
1051
+ padding-top: 4px;
1052
+ box-shadow: var(--retro-raised);
1053
+ }
1054
+ [data-forge-style="retro"] .forge-dialog { background-size: 100% 1.25rem, auto; padding-top: 1.25rem; box-shadow: var(--retro-raised), 4px 4px 0 rgb(0 0 0 / 0.35); }
1055
+ [data-forge-style="retro"] .forge-popover { background: var(--retro-face); padding-top: 0; box-shadow: var(--retro-raised), 2px 2px 0 rgb(0 0 0 / 0.3); }
1056
+ [data-forge-style="retro"] .forge-card-flat { background: var(--retro-field); box-shadow: var(--retro-sunken); border-radius: 0; }
1057
+ [data-forge-style="retro"] .forge-sidebar { background: var(--retro-face); border-right: 0; box-shadow: var(--retro-raised); }
1058
+ [data-forge-style="retro"] .forge-topbar { background: var(--retro-face); border-bottom: 0; box-shadow: var(--retro-raised); }
1059
+ [data-forge-style="retro"] .forge-heading { letter-spacing: 0; font-weight: 400; }
1060
+ [data-forge-style="retro"] .forge-logo { background: var(--retro-title); color: #ffffff; box-shadow: var(--retro-raised); border-radius: 0; }
1061
+ [data-forge-style="retro"] .forge-btn { border: 0; border-radius: 0; box-shadow: var(--retro-raised); transition: none; }
1062
+ [data-forge-style="retro"] .forge-btn:active:not(:disabled) { box-shadow: var(--retro-sunken); transform: translate(1px, 1px); }
1063
+ [data-forge-style="retro"] .forge-btn-secondary { background: var(--retro-face); color: var(--forge-ink); }
1064
+ [data-forge-style="retro"] .forge-btn-secondary:hover:not(:disabled) { background: var(--retro-face); }
1065
+ [data-forge-style="retro"] .forge-btn-primary { --retro-hi: rgb(255 255 255 / 0.55); --retro-mid: rgb(255 255 255 / 0.25); }
1066
+ [data-forge-style="retro"] .forge-btn-primary:hover:not(:disabled) { background: var(--forge-primary); }
1067
+ [data-forge-style="retro"] .forge-btn-ghost { box-shadow: none; }
1068
+ [data-forge-style="retro"] .forge-btn-ghost:hover:not(:disabled) { background: transparent; box-shadow: var(--retro-raised); }
1069
+ [data-forge-style="retro"] .forge-btn-ghost[aria-current="page"] { box-shadow: var(--retro-sunken); background: var(--retro-face); border-color: transparent; }
1070
+ [data-forge-style="retro"] .forge-btn:disabled { opacity: 1; color: var(--retro-lo); text-shadow: 1px 1px 0 var(--retro-hi); }
1071
+ [data-forge-style="retro"] .forge-input { background: var(--retro-field); border: 0; border-radius: 0; box-shadow: var(--retro-sunken); }
1072
+ [data-forge-style="retro"] .forge-input:focus { box-shadow: var(--retro-sunken); outline: 1px dotted var(--forge-ink); outline-offset: -4px; }
1073
+ [data-forge-style="retro"] .forge-input:disabled { background: var(--retro-face); opacity: 1; color: var(--forge-ink-subtle); }
1074
+ [data-forge-style="retro"] .forge-switch { border-radius: 0; box-shadow: var(--retro-sunken); background: var(--retro-field); }
1075
+ [data-forge-style="retro"] .forge-switch[aria-checked="true"] { background: var(--forge-primary); }
1076
+ [data-forge-style="retro"] .forge-switch-thumb { border-radius: 0; background: var(--retro-face); box-shadow: var(--retro-raised); }
1077
+ [data-forge-style="retro"] .forge-nav-item { border-radius: 0; color: var(--forge-ink); }
1078
+ [data-forge-style="retro"] .forge-nav-item:hover { background: var(--forge-hover); }
1079
+ [data-forge-style="retro"] .forge-nav-item[aria-current="page"],
1080
+ [data-forge-style="retro"] .forge-palette-item[aria-selected="true"] { background: var(--forge-primary); color: var(--forge-primary-fg); font-weight: 600; }
1081
+ [data-forge-style="retro"] .forge-nav-item[aria-current="page"] svg { color: currentColor; }
1082
+ [data-forge-style="retro"] .forge-table thead tr { background: var(--retro-face); border-bottom: 0; color: var(--forge-ink); }
1083
+ [data-forge-style="retro"] .forge-table th { box-shadow: var(--retro-raised); }
1084
+ [data-forge-style="retro"] .forge-table tbody { background: var(--retro-field); }
1085
+ [data-forge-style="retro"] .forge-table tbody tr { border-top-color: light-dark(#e3e1dc, #262a2e); }
1086
+ [data-forge-style="retro"] .forge-table tbody tr:hover { background: color-mix(in oklab, var(--forge-primary) 14%, var(--retro-field)); }
1087
+ [data-forge-style="retro"] .forge-badge { border-radius: 0; box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tone) 60%, var(--forge-ink)); }
1088
+ [data-forge-style="retro"] .forge-chip { border-radius: 0; background: var(--retro-face); box-shadow: var(--retro-raised); color: var(--forge-link); }
1089
+ [data-forge-style="retro"] .forge-avatar { border-radius: 0; box-shadow: var(--retro-sunken); background: var(--retro-field); }
1090
+ [data-forge-style="retro"] .forge-metric::after { display: none; }
1091
+ [data-forge-style="retro"] .forge-alert { border-radius: 0; border: 0; box-shadow: var(--retro-sunken); }
1092
+ [data-forge-style="retro"] .forge-skeleton { border-radius: 0; }
1093
+ [data-forge-style="retro"] .forge-tooltip { background: light-dark(#ffffe1, #3a3a2a); color: var(--forge-ink); border-radius: 0; box-shadow: 0 0 0 1px var(--forge-ink); }
1094
+ :root[data-forge-style="retro"][data-forge-mode="light"] .forge-sidebar .forge-nav-item[aria-current="page"] svg { color: currentColor; }
1095
+ }
1096
+
1097
+ /* ── neon: dark, glowing accents, crisp borders (glow off for reduced motion and forced colours) ─ */
1098
+ @layer components {
1099
+ [data-forge-style="neon"] {
1100
+ --neon-glow: 0 0 0 1px color-mix(in oklab, var(--forge-primary) 70%, transparent), 0 0 18px -2px color-mix(in oklab, var(--forge-primary) 60%, transparent);
1101
+ --neon-glow-soft: 0 0 22px -10px light-dark(transparent, color-mix(in oklab, var(--forge-primary) 55%, transparent));
1102
+ --neon-text-glow: 0 0 14px light-dark(transparent, color-mix(in oklab, var(--forge-primary) 55%, transparent));
1103
+ --forge-canvas: light-dark(#f5f5fa, #07070c);
1104
+ --forge-surface: light-dark(#ffffff, #0e0e16);
1105
+ --forge-surface-muted: light-dark(#f0f0f6, #0b0b12);
1106
+ --forge-line: light-dark(#dcdce8, color-mix(in oklab, var(--forge-primary) 24%, #1c1c28));
1107
+ --forge-line-strong: light-dark(#c4c4d4, color-mix(in oklab, var(--forge-primary) 45%, #26263a));
1108
+ --forge-ink: light-dark(#14141f, #f1f1fa);
1109
+ --forge-ink-muted: light-dark(#4b4b60, #b4b4cc);
1110
+ --forge-ink-subtle: light-dark(#5e5e75, #9292ad);
1111
+ --forge-hover: color-mix(in oklab, var(--forge-primary) 9%, transparent);
1112
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 16%, transparent);
1113
+ --forge-card-shadow: var(--neon-glow-soft);
1114
+ --forge-card-shadow-hover: 0 0 0 1px var(--forge-primary), 0 0 28px -6px color-mix(in oklab, var(--forge-primary) 60%, transparent);
1115
+ --forge-ring: 2px solid var(--forge-link);
1116
+ }
1117
+ [data-forge-style="neon"] .forge-sidebar { background: var(--forge-canvas); border-right-color: var(--forge-line); }
1118
+ [data-forge-style="neon"] .forge-topbar { background: color-mix(in oklab, var(--forge-canvas) 85%, transparent); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); }
1119
+ [data-forge-style="neon"] h1.forge-heading { text-shadow: var(--neon-text-glow); }
1120
+ [data-forge-style="neon"] .forge-logo { box-shadow: var(--neon-glow); }
1121
+ [data-forge-style="neon"] .forge-btn { font-weight: 600; }
1122
+ [data-forge-style="neon"] .forge-btn-primary { box-shadow: var(--neon-glow); }
1123
+ [data-forge-style="neon"] .forge-btn-primary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-primary) 88%, white); }
1124
+ [data-forge-style="neon"] .forge-btn-secondary { background: transparent; border-color: var(--forge-line-strong); }
1125
+ [data-forge-style="neon"] .forge-btn-secondary:hover:not(:disabled) { background: var(--forge-hover); border-color: var(--forge-primary); }
1126
+ [data-forge-style="neon"] .forge-input { background: var(--forge-surface-muted); }
1127
+ [data-forge-style="neon"] .forge-input:focus { box-shadow: var(--neon-glow); }
1128
+ [data-forge-style="neon"] .forge-nav-item[aria-current="page"] { color: var(--forge-ink); box-shadow: inset 2px 0 0 var(--forge-primary); }
1129
+ [data-forge-style="neon"] .forge-topnav .forge-nav-item[aria-current="page"] { box-shadow: inset 0 -2px 0 var(--forge-primary); }
1130
+ [data-forge-style="neon"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-link); filter: drop-shadow(0 0 4px light-dark(transparent, var(--forge-primary))); }
1131
+ [data-forge-style="neon"] .forge-table thead tr { color: var(--forge-link); letter-spacing: 0.08em; border-bottom-color: var(--forge-line-strong); }
1132
+ [data-forge-style="neon"] .forge-table tbody tr:hover { background: var(--forge-selected); box-shadow: inset 2px 0 0 var(--forge-primary); }
1133
+ [data-forge-style="neon"] .forge-badge { background: transparent; box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tone) 70%, transparent), 0 0 10px -4px light-dark(transparent, var(--tone)); }
1134
+ [data-forge-style="neon"] .forge-chip { background: transparent; box-shadow: inset 0 0 0 1px var(--forge-primary), 0 0 12px -4px light-dark(transparent, var(--forge-primary)); }
1135
+ [data-forge-style="neon"] .forge-metric::after { background: radial-gradient(closest-side, color-mix(in oklab, var(--forge-primary) 22%, transparent), transparent); }
1136
+ [data-forge-style="neon"] .forge-metric-value { color: var(--forge-link); text-shadow: var(--neon-text-glow); }
1137
+ [data-forge-style="neon"] .forge-switch[aria-checked="true"] { box-shadow: var(--neon-glow); }
1138
+ [data-forge-style="neon"] :is(.forge-dialog, .forge-popover, .forge-toast) { border-color: var(--forge-line-strong); box-shadow: 0 0 0 1px color-mix(in oklab, var(--forge-primary) 30%, transparent), 0 24px 60px -20px rgb(0 0 0 / 0.6); }
1139
+ }
1140
+
1141
+ /* ── swiss: strict grid, big type, red accent (the primary), no shadows ───────────────────────── */
1142
+ @layer components {
1143
+ [data-forge-style="swiss"] {
1144
+ --forge-canvas: light-dark(#ffffff, #0a0a0a);
1145
+ --forge-surface: light-dark(#ffffff, #0a0a0a);
1146
+ --forge-surface-muted: light-dark(#f3f3f3, #151515);
1147
+ --forge-line: light-dark(#e0e0e0, #2b2b2b);
1148
+ --forge-line-strong: light-dark(#111111, #f0f0f0);
1149
+ --forge-ink: light-dark(#0a0a0a, #f5f5f5);
1150
+ --forge-ink-muted: light-dark(#4a4a4a, #b5b5b5);
1151
+ --forge-ink-subtle: light-dark(#5e5e5e, #9b9b9b);
1152
+ --forge-hover: light-dark(#f3f3f3, #171717);
1153
+ --forge-selected: transparent;
1154
+ --forge-card-shadow: none;
1155
+ --forge-card-shadow-hover: none;
1156
+ --forge-ring: 2px solid var(--forge-ink);
1157
+ --forge-ring-offset: 2px;
1158
+ --forge-main-y: 3rem;
1159
+ --forge-radius: 0px;
1160
+ --forge-radius-control: 0px;
1161
+ }
1162
+ :root[data-forge-style="swiss"][data-forge-density="compact"] { --forge-main-y: 1.75rem; }
1163
+ [data-forge-style="swiss"] .forge-card { border: 0; border-top: 3px solid var(--forge-ink); border-radius: 0; }
1164
+ [data-forge-style="swiss"] .forge-card-interactive:hover { transform: none; border-top-color: var(--forge-primary); }
1165
+ [data-forge-style="swiss"] :is(.forge-dialog, .forge-popover, .forge-toast) { border: 2px solid var(--forge-ink); border-radius: 0; box-shadow: none; }
1166
+ [data-forge-style="swiss"] .forge-card-flat { border-radius: 0; }
1167
+ [data-forge-style="swiss"] .forge-sidebar { background: var(--forge-surface); border-right: 1px solid var(--forge-ink); }
1168
+ [data-forge-style="swiss"] .forge-topbar { border-bottom: 2px solid var(--forge-ink); }
1169
+ [data-forge-style="swiss"] .forge-heading { font-weight: 700; letter-spacing: -0.03em; }
1170
+ [data-forge-style="swiss"] h1.forge-heading::before { content: ""; display: block; width: 2.5rem; height: 0.375rem; margin-bottom: 0.75rem; background: var(--forge-primary); }
1171
+ [data-forge-style="swiss"] .forge-logo { border-radius: 0; }
1172
+ [data-forge-style="swiss"] .forge-btn { border-radius: 0; font-weight: 600; }
1173
+ [data-forge-style="swiss"] .forge-btn-secondary { background: transparent; border-color: var(--forge-ink); }
1174
+ [data-forge-style="swiss"] .forge-btn-secondary:hover:not(:disabled) { background: var(--forge-ink); color: var(--forge-surface); }
1175
+ [data-forge-style="swiss"] .forge-input { border-radius: 0; border-color: var(--forge-line); border-bottom: 2px solid var(--forge-ink); }
1176
+ [data-forge-style="swiss"] .forge-input:focus { box-shadow: none; border-bottom-color: var(--forge-primary); }
1177
+ [data-forge-style="swiss"] .forge-nav-item { border-radius: 0; font-weight: 500; }
1178
+ [data-forge-style="swiss"] .forge-nav-item[aria-current="page"] { background: transparent; color: var(--forge-ink); font-weight: 700; box-shadow: inset 4px 0 0 var(--forge-primary); }
1179
+ [data-forge-style="swiss"] .forge-topnav .forge-nav-item[aria-current="page"] { box-shadow: inset 0 -4px 0 var(--forge-primary); }
1180
+ [data-forge-style="swiss"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-primary); }
1181
+ [data-forge-style="swiss"] .forge-table thead tr { color: var(--forge-ink); border-bottom: 2px solid var(--forge-ink); }
1182
+ [data-forge-style="swiss"] .forge-table tbody tr:hover { background: var(--forge-hover); }
1183
+ [data-forge-style="swiss"] .forge-badge { border-radius: 0; background: transparent; box-shadow: inset 0 0 0 1px currentColor; }
1184
+ [data-forge-style="swiss"] .forge-chip { border-radius: 0; background: var(--forge-primary); color: var(--forge-primary-fg); box-shadow: none; }
1185
+ [data-forge-style="swiss"] .forge-avatar { border-radius: 0; background: var(--forge-surface-muted); }
1186
+ [data-forge-style="swiss"] .forge-metric::after { display: none; }
1187
+ [data-forge-style="swiss"] .forge-metric-value { font-weight: 700; letter-spacing: -0.045em; }
1188
+ [data-forge-style="swiss"] .forge-switch, [data-forge-style="swiss"] .forge-switch-thumb { border-radius: 0; box-shadow: none; }
1189
+ [data-forge-style="swiss"] .forge-alert { border-radius: 0; border-width: 0 0 0 4px; background: var(--forge-surface-muted); color: var(--forge-ink); border-left-color: var(--tone); }
1190
+ [data-forge-style="swiss"] .forge-tooltip { border-radius: 0; }
1191
+ }
1192
+
1193
+ /* ── nature: earthy tones, organic shapes, paper texture (CSS only) ───────────────────────────── */
1194
+ @layer components {
1195
+ [data-forge-style="nature"] {
1196
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-primary) 6%, #f3efe4), color-mix(in oklab, var(--forge-primary) 8%, #15140f));
1197
+ --forge-surface: light-dark(#fbf8f0, #1e1d17);
1198
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-primary) 5%, #f1ece0), #1a1914);
1199
+ --forge-line: light-dark(color-mix(in oklab, var(--forge-primary) 12%, #e3dccb), rgb(240 230 200 / 0.1));
1200
+ --forge-line-strong: light-dark(color-mix(in oklab, var(--forge-primary) 22%, #cfc5ae), rgb(240 230 200 / 0.2));
1201
+ --forge-ink: light-dark(#26241b, #efeadb);
1202
+ --forge-ink-muted: light-dark(#565140, #beb6a1);
1203
+ --forge-ink-subtle: light-dark(#696350, #a49c86);
1204
+ --forge-hover: color-mix(in oklab, var(--forge-primary) 7%, transparent);
1205
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 15%, transparent);
1206
+ --forge-card-shadow: inset 0 1px 0 light-dark(rgb(255 255 255 / 0.7), rgb(255 255 255 / 0.03)), 0 10px 24px -16px light-dark(rgb(70 55 20 / 0.4), rgb(0 0 0 / 0.75));
1207
+ --forge-card-shadow-hover: inset 0 1px 0 light-dark(rgb(255 255 255 / 0.7), rgb(255 255 255 / 0.03)), 0 18px 34px -18px light-dark(rgb(70 55 20 / 0.5), rgb(0 0 0 / 0.85));
1208
+ --nature-shape: var(--forge-radius) calc(var(--forge-radius) * 1.7) var(--forge-radius) calc(var(--forge-radius) * 1.3);
1209
+ --nature-leaf: calc(var(--forge-radius-control) * 1.6) calc(var(--forge-radius-control) * 0.5);
1210
+ }
1211
+ [data-forge-style="nature"] .forge-card { border-radius: var(--nature-shape); }
1212
+ [data-forge-style="nature"] :is(.forge-dialog, .forge-toast) { border-radius: var(--nature-shape); }
1213
+ [data-forge-style="nature"] .forge-sidebar { background: color-mix(in oklab, var(--forge-surface-muted) 80%, transparent); }
1214
+ [data-forge-style="nature"] .forge-topbar { background: color-mix(in oklab, var(--forge-surface) 85%, transparent); }
1215
+ [data-forge-style="nature"] .forge-heading { font-weight: 600; letter-spacing: -0.01em; }
1216
+ [data-forge-style="nature"] .forge-logo { border-radius: 60% 40% 55% 45% / 50% 60% 40% 50%; }
1217
+ [data-forge-style="nature"] .forge-btn { border-radius: var(--nature-leaf); font-weight: 500; }
1218
+ [data-forge-style="nature"] .forge-btn-primary { box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.22), 0 6px 14px -8px color-mix(in oklab, var(--forge-primary) 80%, transparent); }
1219
+ [data-forge-style="nature"] .forge-btn-secondary { background: var(--forge-surface-muted); border-color: var(--forge-line-strong); }
1220
+ [data-forge-style="nature"] .forge-input { background: color-mix(in oklab, var(--forge-surface) 70%, transparent); border-radius: calc(var(--forge-radius-control) * 1.2); }
1221
+ [data-forge-style="nature"] .forge-nav-item { border-radius: var(--nature-leaf); }
1222
+ [data-forge-style="nature"] .forge-nav-item[aria-current="page"] { color: var(--forge-ink); font-weight: 600; }
1223
+ [data-forge-style="nature"] .forge-table thead tr { border-bottom: 1px dashed var(--forge-line-strong); }
1224
+ [data-forge-style="nature"] .forge-table tbody tr { border-top-style: dashed; }
1225
+ [data-forge-style="nature"] .forge-table tbody tr:hover { background: var(--forge-hover); }
1226
+ [data-forge-style="nature"] .forge-badge { border-radius: 999px; }
1227
+ [data-forge-style="nature"] .forge-chip { border-radius: 50% 50% 50% 12% / 50% 50% 50% 12%; }
1228
+ [data-forge-style="nature"] .forge-avatar { border-radius: 55% 45% 50% 50% / 50% 55% 45% 50%; }
1229
+ [data-forge-style="nature"] .forge-metric::after { background: radial-gradient(closest-side, color-mix(in oklab, var(--forge-primary) 14%, transparent), transparent); border-radius: 60% 40% 55% 45%; }
1230
+ [data-forge-style="nature"] .forge-alert { border-radius: calc(var(--forge-radius-control) * 1.4) calc(var(--forge-radius-control) * 0.6); }
1231
+ }
1232
+
1233
+ /* ── cyber: angled corners (clip-path), HUD accents, dark-first ───────────────────────────────── */
1234
+ @layer components {
1235
+ [data-forge-style="cyber"] {
1236
+ --cy-cut: 12px;
1237
+ --cy-cut-sm: 7px;
1238
+ --cy-shape: polygon(0 0, calc(100% - var(--cy-cut)) 0, 100% var(--cy-cut), 100% 100%, var(--cy-cut) 100%, 0 calc(100% - var(--cy-cut)));
1239
+ --cy-shape-sm: polygon(0 0, calc(100% - var(--cy-cut-sm)) 0, 100% var(--cy-cut-sm), 100% 100%, var(--cy-cut-sm) 100%, 0 calc(100% - var(--cy-cut-sm)));
1240
+ /* Diagonal border segments for the cut corners (clip-path removes the box border there). */
1241
+ --cy-edges:
1242
+ linear-gradient(to bottom left, transparent calc(50% - 1px), var(--forge-line-strong) calc(50% - 1px) calc(50% + 0.5px), transparent calc(50% + 0.5px)) top right / var(--cy-cut) var(--cy-cut) no-repeat,
1243
+ linear-gradient(to top right, transparent calc(50% - 1px), var(--forge-line-strong) calc(50% - 1px) calc(50% + 0.5px), transparent calc(50% + 0.5px)) bottom left / var(--cy-cut) var(--cy-cut) no-repeat;
1244
+ --forge-canvas: light-dark(#eef2f5, #05080b);
1245
+ --forge-surface: light-dark(#ffffff, #0a1016);
1246
+ --forge-surface-muted: light-dark(#e6ecf1, #070c11);
1247
+ --forge-line: light-dark(#c9d3dc, color-mix(in oklab, var(--forge-accent) 20%, #121c25));
1248
+ --forge-line-strong: light-dark(#93a3b1, color-mix(in oklab, var(--forge-accent) 45%, #18242f));
1249
+ --forge-ink: light-dark(#0b1620, #e2f1f8);
1250
+ --forge-ink-muted: light-dark(#3a4d5e, #9ab4c4);
1251
+ --forge-ink-subtle: light-dark(#4f6273, #809bac);
1252
+ --forge-hover: color-mix(in oklab, var(--forge-accent) 9%, transparent);
1253
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 14%, transparent);
1254
+ --forge-card-shadow: none;
1255
+ --forge-card-shadow-hover: none;
1256
+ --forge-ring: 2px solid var(--forge-link);
1257
+ --forge-radius: 0px;
1258
+ --forge-radius-control: 0px;
1259
+ }
1260
+ [data-forge-style="cyber"] .forge-card,
1261
+ [data-forge-style="cyber"] .forge-dialog,
1262
+ [data-forge-style="cyber"] .forge-toast {
1263
+ border-radius: 0;
1264
+ border-color: var(--forge-line-strong);
1265
+ background: var(--cy-edges), var(--forge-surface);
1266
+ clip-path: var(--cy-shape);
1267
+ }
1268
+ [data-forge-style="cyber"] .forge-card-interactive:hover { border-color: var(--forge-link); transform: translateY(-1px); }
1269
+ [data-forge-style="cyber"] .forge-sidebar { background: var(--forge-surface-muted); border-right-color: var(--forge-line-strong); }
1270
+ [data-forge-style="cyber"] .forge-topbar { background: var(--forge-surface-muted); border-bottom-color: var(--forge-line-strong); }
1271
+ [data-forge-style="cyber"] .forge-heading { text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; }
1272
+ [data-forge-style="cyber"] h1.forge-heading::before { content: "// " / ""; color: var(--forge-link); }
1273
+ [data-forge-style="cyber"] .forge-logo { clip-path: var(--cy-shape-sm); border-radius: 0; }
1274
+ [data-forge-style="cyber"] .forge-btn { border-radius: 0; text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.75rem; font-weight: 600; clip-path: var(--cy-shape-sm); }
1275
+ [data-forge-style="cyber"] .forge-btn-ghost { clip-path: none; }
1276
+ /* clip-path would hide an outline: draw the focus ring inside. */
1277
+ [data-forge-style="cyber"] .forge-btn:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--forge-ink), inset 0 0 0 4px var(--forge-surface); }
1278
+ [data-forge-style="cyber"] .forge-btn-ghost:focus-visible { outline: var(--forge-ring); outline-offset: 2px; box-shadow: none; }
1279
+ [data-forge-style="cyber"] .forge-btn-secondary { background: var(--cy-edges), transparent; border-color: var(--forge-line-strong); --cy-cut: var(--cy-cut-sm); }
1280
+ [data-forge-style="cyber"] .forge-btn-secondary:hover:not(:disabled) { background: var(--cy-edges), var(--forge-hover); }
1281
+ [data-forge-style="cyber"] .forge-input { border-radius: 0; background: var(--forge-surface-muted); border-color: var(--forge-line-strong); caret-color: var(--forge-link); }
1282
+ [data-forge-style="cyber"] .forge-input:focus { border-color: var(--forge-link); box-shadow: inset 3px 0 0 var(--forge-link); }
1283
+ [data-forge-style="cyber"] .forge-nav-item { border-radius: 0; text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.8125rem; }
1284
+ [data-forge-style="cyber"] .forge-nav-item[aria-current="page"] { color: var(--forge-ink); box-shadow: inset 3px 0 0 var(--forge-primary); background: linear-gradient(90deg, var(--forge-selected), transparent); }
1285
+ [data-forge-style="cyber"] .forge-topnav .forge-nav-item[aria-current="page"] { box-shadow: inset 0 -3px 0 var(--forge-primary); background: var(--forge-selected); }
1286
+ [data-forge-style="cyber"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-link); }
1287
+ [data-forge-style="cyber"] .forge-table thead tr { color: var(--forge-link); letter-spacing: 0.1em; border-bottom-color: var(--forge-line-strong); background: var(--forge-hover); }
1288
+ [data-forge-style="cyber"] .forge-table tbody tr:nth-child(even) { background: color-mix(in oklab, var(--forge-ink) 2.5%, transparent); }
1289
+ [data-forge-style="cyber"] .forge-table tbody tr:hover { background: var(--forge-selected); }
1290
+ [data-forge-style="cyber"] .forge-badge { border-radius: 0; clip-path: polygon(0 0, calc(100% - 5px) 0, 100% 5px, 100% 100%, 5px 100%, 0 calc(100% - 5px)); text-transform: uppercase; letter-spacing: 0.05em; }
1291
+ [data-forge-style="cyber"] .forge-chip { border-radius: 0; clip-path: var(--cy-shape-sm); background: color-mix(in oklab, var(--forge-primary) 18%, transparent); }
1292
+ [data-forge-style="cyber"] .forge-avatar { border-radius: 0; clip-path: polygon(25% 0, 100% 0, 100% 75%, 75% 100%, 0 100%, 0 25%); }
1293
+ /* HUD corner brackets on metric cards. */
1294
+ [data-forge-style="cyber"] .forge-metric::after {
1295
+ inset: 6px; width: auto; aspect-ratio: auto; border-radius: 0;
1296
+ background:
1297
+ linear-gradient(var(--forge-link) 0 0) left top / 10px 2px no-repeat, linear-gradient(var(--forge-link) 0 0) left top / 2px 10px no-repeat,
1298
+ linear-gradient(var(--forge-link) 0 0) right bottom / 10px 2px no-repeat, linear-gradient(var(--forge-link) 0 0) right bottom / 2px 10px no-repeat;
1299
+ opacity: 0.8;
1300
+ }
1301
+ [data-forge-style="cyber"] .forge-metric-value { color: var(--forge-link); font-variant-numeric: tabular-nums slashed-zero; }
1302
+ [data-forge-style="cyber"] .forge-switch, [data-forge-style="cyber"] .forge-switch-thumb { border-radius: 0; }
1303
+ [data-forge-style="cyber"] .forge-popover { border-radius: 0; border-color: var(--forge-line-strong); }
1304
+ [data-forge-style="cyber"] .forge-alert { border-radius: 0; border-left-width: 3px; }
1305
+ [data-forge-style="cyber"] .forge-tooltip { border-radius: 0; }
1306
+ }
1307
+
1308
+ /* ── minimal: almost no chrome, lots of whitespace, hairlines ─────────────────────────────────── */
1309
+ @layer components {
1310
+ [data-forge-style="minimal"] {
1311
+ --forge-canvas: light-dark(#ffffff, #0b0b0c);
1312
+ --forge-surface: light-dark(#ffffff, #0b0b0c);
1313
+ --forge-surface-muted: light-dark(#fafafa, #111113);
1314
+ --forge-line: light-dark(#ededf0, #1f1f23);
1315
+ --forge-line-strong: light-dark(#dadade, #2f2f35);
1316
+ --forge-ink: light-dark(#111113, #ededef);
1317
+ --forge-ink-muted: light-dark(#5c5c66, #a0a0aa);
1318
+ --forge-ink-subtle: light-dark(#6c6c76, #8b8b95);
1319
+ --forge-hover: light-dark(#f6f6f7, #141416);
1320
+ --forge-selected: light-dark(#f2f2f4, #19191c);
1321
+ --forge-card-shadow: none;
1322
+ --forge-card-shadow-hover: 0 0 0 1px var(--forge-line-strong);
1323
+ --forge-ring: 1.5px solid var(--forge-ink);
1324
+ --forge-ring-offset: 2px;
1325
+ --forge-pad-card: 1.5rem;
1326
+ --forge-pad-card-lg: 2rem;
1327
+ --forge-main-y: 3rem;
1328
+ }
1329
+ :root[data-forge-style="minimal"][data-forge-density="compact"] { --forge-pad-card: 1rem; --forge-pad-card-lg: 1.25rem; --forge-main-y: 1.75rem; }
1330
+ [data-forge-style="minimal"] .forge-sidebar { background: var(--forge-surface); }
1331
+ [data-forge-style="minimal"] .forge-topbar { background: color-mix(in oklab, var(--forge-surface) 90%, transparent); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
1332
+ [data-forge-style="minimal"] .forge-heading { font-weight: 500; letter-spacing: -0.02em; }
1333
+ [data-forge-style="minimal"] .forge-logo { background: var(--forge-ink); color: var(--forge-surface); }
1334
+ [data-forge-style="minimal"] .forge-btn { font-weight: 500; }
1335
+ [data-forge-style="minimal"] .forge-btn-secondary { background: transparent; border-color: var(--forge-line-strong); }
1336
+ [data-forge-style="minimal"] .forge-btn-secondary:hover:not(:disabled) { background: var(--forge-hover); }
1337
+ [data-forge-style="minimal"] .forge-input { border-color: var(--forge-line-strong); }
1338
+ [data-forge-style="minimal"] .forge-input:focus { border-color: var(--forge-ink); box-shadow: none; }
1339
+ [data-forge-style="minimal"] .forge-nav-item[aria-current="page"] { background: transparent; color: var(--forge-ink); font-weight: 500; }
1340
+ [data-forge-style="minimal"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-ink); }
1341
+ [data-forge-style="minimal"] .forge-nav-item:hover { background: transparent; color: var(--forge-ink); }
1342
+ [data-forge-style="minimal"] .forge-table thead tr { text-transform: none; letter-spacing: 0; font-weight: 400; }
1343
+ [data-forge-style="minimal"] .forge-table tbody tr:hover { background: var(--forge-surface-muted); }
1344
+ [data-forge-style="minimal"] .forge-badge { background: transparent; box-shadow: inset 0 0 0 1px var(--forge-line-strong); color: var(--forge-ink-muted); }
1345
+ [data-forge-style="minimal"] .forge-badge::before { content: ""; display: inline-block; width: 0.375rem; height: 0.375rem; margin-right: 0.375rem; border-radius: 999px; background: var(--tone); }
1346
+ [data-forge-style="minimal"] .forge-chip { background: transparent; box-shadow: none; color: var(--forge-ink-muted); }
1347
+ [data-forge-style="minimal"] .forge-avatar { background: var(--forge-surface-muted); box-shadow: inset 0 0 0 1px var(--forge-line); }
1348
+ [data-forge-style="minimal"] .forge-metric::after { display: none; }
1349
+ [data-forge-style="minimal"] .forge-metric-value { font-weight: 500; }
1350
+ [data-forge-style="minimal"] :is(.forge-dialog, .forge-popover, .forge-toast) { box-shadow: 0 16px 48px -16px rgb(0 0 0 / 0.18); }
1351
+ [data-forge-style="minimal"] .forge-alert { background: transparent; }
1352
+ }
1353
+
1354
+ /* ── playful: bold colours, hand-drawn edges (CSS only), bouncy hover ─────────────────────────── */
1355
+ @layer components {
1356
+ [data-forge-style="playful"] {
1357
+ --play-ink: light-dark(#1f1a33, #efeaff);
1358
+ --play-sketch: 26px 10px 22px 12px / 12px 22px 10px 26px;
1359
+ --play-sketch-sm: 14px 5px 12px 6px / 6px 12px 5px 14px;
1360
+ --play-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
1361
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-accent) 10%, #fffaf0), color-mix(in oklab, var(--forge-primary) 10%, #141120));
1362
+ --forge-surface: light-dark(#ffffff, #1d1930);
1363
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-primary) 6%, #fdf8ff), #191529);
1364
+ --forge-line: light-dark(#ddd8ea, rgb(255 255 255 / 0.14));
1365
+ --forge-line-strong: var(--play-ink);
1366
+ --forge-ink: light-dark(#1f1a33, #f4f1ff);
1367
+ --forge-ink-muted: light-dark(#4c4566, #c6bfe0);
1368
+ --forge-ink-subtle: light-dark(#5e577a, #aaa3c6);
1369
+ --forge-hover: color-mix(in oklab, var(--forge-accent) 22%, transparent);
1370
+ --forge-selected: var(--forge-accent);
1371
+ --forge-card-shadow: 4px 5px 0 var(--forge-primary);
1372
+ --forge-card-shadow-hover: 6px 8px 0 var(--forge-primary);
1373
+ --forge-ring: 3px solid var(--forge-primary);
1374
+ --forge-ring-offset: 3px;
1375
+ }
1376
+ [data-forge-style="playful"] .forge-card,
1377
+ [data-forge-style="playful"] .forge-dialog,
1378
+ [data-forge-style="playful"] .forge-toast { border: 2px solid var(--play-ink); border-radius: var(--play-sketch); }
1379
+ [data-forge-style="playful"] .forge-popover { border: 2px solid var(--play-ink); border-radius: var(--play-sketch-sm); box-shadow: 3px 4px 0 var(--play-ink); }
1380
+ [data-forge-style="playful"] .forge-dialog, [data-forge-style="playful"] .forge-toast { box-shadow: 5px 6px 0 var(--play-ink); }
1381
+ [data-forge-style="playful"] .forge-card-interactive:hover { transform: translateY(-3px) rotate(-0.6deg); }
1382
+ [data-forge-style="playful"] .forge-card-interactive { transition: transform 260ms var(--play-bounce), box-shadow 200ms; }
1383
+ [data-forge-style="playful"] .forge-sidebar { border-right: 2px solid var(--play-ink); }
1384
+ [data-forge-style="playful"] .forge-topbar { border-bottom: 2px solid var(--play-ink); }
1385
+ [data-forge-style="playful"] .forge-heading { font-weight: 600; letter-spacing: -0.01em; }
1386
+ [data-forge-style="playful"] h1.forge-heading { text-decoration: underline wavy var(--forge-accent) 3px; text-underline-offset: 7px; text-decoration-skip-ink: none; padding-bottom: 6px; }
1387
+ [data-forge-style="playful"] .forge-logo { border: 2px solid var(--play-ink); border-radius: var(--play-sketch-sm); transform: rotate(-4deg); }
1388
+ [data-forge-style="playful"] .forge-btn { border: 2px solid var(--play-ink); border-radius: var(--play-sketch-sm); font-weight: 700; box-shadow: 2px 3px 0 var(--play-ink); transition: transform 220ms var(--play-bounce), box-shadow 160ms, background-color 120ms; }
1389
+ [data-forge-style="playful"] .forge-btn:hover:not(:disabled) { transform: translateY(-2px) rotate(-1.5deg) scale(1.03); box-shadow: 3px 5px 0 var(--play-ink); }
1390
+ [data-forge-style="playful"] .forge-btn:active:not(:disabled) { transform: translateY(1px) scale(0.98); box-shadow: 0 0 0 var(--play-ink); }
1391
+ [data-forge-style="playful"] .forge-btn-ghost { border-color: transparent; box-shadow: none; }
1392
+ [data-forge-style="playful"] .forge-btn-ghost:hover:not(:disabled) { box-shadow: none; transform: rotate(-2deg); }
1393
+ [data-forge-style="playful"] .forge-btn-primary:hover:not(:disabled) { background: var(--forge-primary); }
1394
+ [data-forge-style="playful"] .forge-btn-secondary { border-color: var(--play-ink); }
1395
+ [data-forge-style="playful"] .forge-input { border: 2px solid var(--play-ink); border-radius: var(--play-sketch-sm); }
1396
+ [data-forge-style="playful"] .forge-input:focus { border-color: var(--forge-primary); box-shadow: 2px 3px 0 var(--forge-primary); }
1397
+ [data-forge-style="playful"] .forge-nav-item { font-weight: 600; border: 2px solid transparent; border-radius: var(--play-sketch-sm); transition: transform 220ms var(--play-bounce), background-color 120ms; }
1398
+ [data-forge-style="playful"] .forge-nav-item:hover { transform: translateX(2px) rotate(-1deg); }
1399
+ [data-forge-style="playful"] .forge-nav-item[aria-current="page"] { background: var(--forge-accent); color: var(--forge-accent-fg); border-color: var(--play-ink); box-shadow: 2px 3px 0 var(--play-ink); }
1400
+ [data-forge-style="playful"] .forge-nav-item[aria-current="page"] svg { color: currentColor; }
1401
+ [data-forge-style="playful"] .forge-table thead tr { background: color-mix(in oklab, var(--forge-primary) 10%, var(--forge-surface)); border-bottom: 2px solid var(--play-ink); }
1402
+ [data-forge-style="playful"] .forge-table tbody tr { border-top: 2px dashed var(--forge-line); }
1403
+ [data-forge-style="playful"] .forge-table tbody tr:hover { background: var(--forge-hover); }
1404
+ [data-forge-style="playful"] .forge-badge { border-radius: var(--play-sketch-sm); box-shadow: none; border: 1.5px solid var(--play-ink); color: var(--forge-ink); background: color-mix(in oklab, var(--tone) 24%, var(--forge-surface)); }
1405
+ [data-forge-style="playful"] .forge-chip { background: var(--forge-accent); color: var(--forge-accent-fg); border: 2px solid var(--play-ink); border-radius: var(--play-sketch-sm); box-shadow: 2px 2px 0 var(--play-ink); transform: rotate(-5deg); }
1406
+ [data-forge-style="playful"] .forge-avatar { border: 2px solid var(--play-ink); background: var(--forge-accent); color: var(--forge-accent-fg); }
1407
+ [data-forge-style="playful"] .forge-metric::after { background: radial-gradient(closest-side, color-mix(in oklab, var(--forge-accent) 45%, transparent), transparent); }
1408
+ [data-forge-style="playful"] .forge-switch { border: 2px solid var(--play-ink); }
1409
+ [data-forge-style="playful"] .forge-alert { border-width: 2px; border-radius: var(--play-sketch-sm); }
1410
+ [data-forge-style="playful"] .forge-tooltip { border-radius: var(--play-sketch-sm); }
1411
+ }
1412
+
1413
+ /* ════════════════════════════════════════════════════════════════════════════════════════════════
1414
+ * Look and feel (theme.background, cards, buttons, motion, sidebar, iconStyle, chartPalette), selected by
1415
+ * data-forge-background / -cards / -buttons / -motion / -sidebar / -icons / -chart on <html>.
1416
+ * They come after the styles (and use :root for one more level of specificity) so they win over a style.
1417
+ * ════════════════════════════════════════════════════════════════════════════════════════════════ */
1418
+
1419
+ /* Chart palettes: --forge-chart-1 … --forge-chart-8 opt-in palettes; the default "theme" palette is defined with the dashboard charts above. */
1420
+ @layer base {
1421
+ @supports (color: oklch(from red l c h)) {
1422
+ :root {
1423
+ /* Links: the primary, darkened (light mode) or lightened (dark mode) just enough to read as text. */
1424
+ --forge-link: light-dark(oklch(from var(--forge-primary) min(l, 0.46) c h), oklch(from var(--forge-primary) max(l, 0.8) c h));
1425
+ }
1426
+ }
1427
+ :root[data-forge-chart="vivid"] {
1428
+ --forge-chart-1: light-dark(#2563eb, #60a5fa);
1429
+ --forge-chart-2: light-dark(#ea580c, #fb923c);
1430
+ --forge-chart-3: light-dark(#059669, #34d399);
1431
+ --forge-chart-4: light-dark(#e11d48, #fb7185);
1432
+ --forge-chart-5: light-dark(#7c3aed, #a78bfa);
1433
+ --forge-chart-6: light-dark(#ca8a04, #facc15);
1434
+ --forge-chart-7: light-dark(#0891b2, #22d3ee);
1435
+ --forge-chart-8: light-dark(#c026d3, #e879f9);
1436
+ }
1437
+ :root[data-forge-chart="pastel"] {
1438
+ --forge-chart-1: light-dark(#7aa7f0, #a5c4fb);
1439
+ --forge-chart-2: light-dark(#f2a46c, #fcc39b);
1440
+ --forge-chart-3: light-dark(#6cc79c, #9fe3c2);
1441
+ --forge-chart-4: light-dark(#ef8fa3, #f9b6c4);
1442
+ --forge-chart-5: light-dark(#a99be8, #c9bff7);
1443
+ --forge-chart-6: light-dark(#e3c35c, #f3dd8f);
1444
+ --forge-chart-7: light-dark(#5fc0d2, #97dce8);
1445
+ --forge-chart-8: light-dark(#d79ad8, #ebc0eb);
1446
+ }
1447
+ :root[data-forge-chart="mono"] {
1448
+ --forge-chart-1: var(--forge-primary);
1449
+ --forge-chart-2: color-mix(in oklab, var(--forge-primary) 70%, var(--forge-surface));
1450
+ --forge-chart-3: color-mix(in oklab, var(--forge-primary) 72%, var(--forge-ink));
1451
+ --forge-chart-4: color-mix(in oklab, var(--forge-primary) 45%, var(--forge-surface));
1452
+ --forge-chart-5: color-mix(in oklab, var(--forge-primary) 48%, var(--forge-ink));
1453
+ --forge-chart-6: color-mix(in oklab, var(--forge-primary) 25%, var(--forge-surface));
1454
+ --forge-chart-7: color-mix(in oklab, var(--forge-primary) 28%, var(--forge-ink));
1455
+ --forge-chart-8: var(--forge-ink-subtle);
1456
+ }
1457
+ }
1458
+
1459
+ /* Backgrounds: subtle, static, made from the theme colours (no images). */
1460
+ @layer components {
1461
+ :root[data-forge-background="gradient"] .forge-app-bg {
1462
+ background:
1463
+ linear-gradient(165deg, color-mix(in oklab, var(--forge-primary) 11%, transparent), transparent 42%, transparent 60%, color-mix(in oklab, var(--forge-accent) 12%, transparent)),
1464
+ var(--forge-canvas);
1465
+ background-attachment: fixed;
1466
+ }
1467
+ :root[data-forge-background="mesh"] .forge-app-bg {
1468
+ background:
1469
+ radial-gradient(42rem 32rem at 8% 0%, color-mix(in oklab, var(--forge-primary) 20%, transparent), transparent 70%),
1470
+ radial-gradient(36rem 30rem at 95% 12%, color-mix(in oklab, var(--forge-accent) 18%, transparent), transparent 70%),
1471
+ radial-gradient(48rem 36rem at 60% 105%, color-mix(in oklab, var(--forge-primary) 14%, var(--forge-accent) 8%), transparent 70%),
1472
+ var(--forge-canvas);
1473
+ background-attachment: fixed;
1474
+ }
1475
+ :root[data-forge-background="dots"] .forge-app-bg {
1476
+ background:
1477
+ radial-gradient(circle at 1px 1px, color-mix(in oklab, var(--forge-ink) 16%, transparent) 1px, transparent 1.5px) 0 0 / 20px 20px,
1478
+ var(--forge-canvas);
1479
+ background-attachment: fixed;
1480
+ }
1481
+ :root[data-forge-background="grid"] .forge-app-bg {
1482
+ background:
1483
+ linear-gradient(color-mix(in oklab, var(--forge-primary) 9%, transparent) 1px, transparent 1px) 0 0 / 32px 32px,
1484
+ linear-gradient(90deg, color-mix(in oklab, var(--forge-primary) 9%, transparent) 1px, transparent 1px) 0 0 / 32px 32px,
1485
+ radial-gradient(60rem 40rem at 50% -10%, color-mix(in oklab, var(--forge-primary) 10%, transparent), transparent 70%),
1486
+ var(--forge-canvas);
1487
+ background-attachment: fixed;
1488
+ }
1489
+ /* Grain from aliasing tiny conic steps (a CSS-only noise), over a faint warm wash. */
1490
+ :root[data-forge-background="noise"] .forge-app-bg {
1491
+ background:
1492
+ repeating-conic-gradient(color-mix(in oklab, var(--forge-ink) 3.5%, transparent) 0 0.00045%, transparent 0 0.0009%),
1493
+ radial-gradient(60rem 40rem at 0% 0%, color-mix(in oklab, var(--forge-primary) 8%, transparent), transparent 70%),
1494
+ var(--forge-canvas);
1495
+ background-attachment: fixed;
1496
+ }
1497
+ /* The aurora drift and glass backdrop are a style's own background; an explicit one replaces them. */
1498
+ :root[data-forge-background]:not([data-forge-background="plain"]) .forge-app-bg::before { content: none; }
1499
+ }
1500
+
1501
+ /* Cards. */
1502
+ @layer components {
1503
+ :root[data-forge-cards="flat"] .forge-card { background: var(--forge-surface-muted); border-color: transparent; box-shadow: none; }
1504
+ :root[data-forge-cards="flat"] .forge-card-interactive:hover { box-shadow: 0 0 0 1px var(--forge-line-strong); }
1505
+ :root[data-forge-cards="bordered"] .forge-card { border: 1px solid var(--forge-line-strong); box-shadow: none; }
1506
+ :root[data-forge-cards="elevated"] .forge-card {
1507
+ border-color: transparent;
1508
+ box-shadow: 0 1px 2px light-dark(rgb(16 24 40 / 0.06), rgb(0 0 0 / 0.45)), 0 14px 34px -14px light-dark(rgb(16 24 40 / 0.24), rgb(0 0 0 / 0.75));
1509
+ }
1510
+ :root[data-forge-cards="elevated"] .forge-card-interactive:hover { box-shadow: 0 2px 4px light-dark(rgb(16 24 40 / 0.06), rgb(0 0 0 / 0.45)), 0 22px 44px -16px light-dark(rgb(16 24 40 / 0.3), rgb(0 0 0 / 0.8)); }
1511
+ :root[data-forge-cards="glass"] .forge-card {
1512
+ background: color-mix(in oklab, var(--forge-surface) 68%, transparent);
1513
+ border-color: light-dark(rgb(255 255 255 / 0.65), rgb(255 255 255 / 0.1));
1514
+ box-shadow: 0 10px 30px -14px light-dark(rgb(31 38 100 / 0.25), rgb(0 0 0 / 0.7)), inset 0 1px 0 light-dark(rgb(255 255 255 / 0.6), rgb(255 255 255 / 0.06));
1515
+ -webkit-backdrop-filter: blur(16px) saturate(150%);
1516
+ backdrop-filter: blur(16px) saturate(150%);
1517
+ }
1518
+ }
1519
+
1520
+ /* Buttons. */
1521
+ @layer components {
1522
+ /* Soft buttons: the link colour pulled towards the ink, so it stays AA on the primary tint of any style. */
1523
+ :root[data-forge-buttons] { --forge-btn-soft-ink: color-mix(in oklab, var(--forge-link) 70%, var(--forge-ink)); }
1524
+ :root[data-forge-buttons] .forge-btn-primary { background-image: none; text-shadow: none; }
1525
+ :root[data-forge-buttons="solid"] .forge-btn-primary { background: var(--forge-primary); color: var(--forge-primary-fg); }
1526
+ :root[data-forge-buttons="soft"] .forge-btn-primary,
1527
+ :root[data-forge-buttons="soft"] .forge-btn-primary:hover:not(:disabled) { color: var(--forge-btn-soft-ink); border-color: transparent; box-shadow: none; }
1528
+ :root[data-forge-buttons="soft"] .forge-btn-primary { background: color-mix(in oklab, var(--forge-primary) 14%, var(--forge-surface)); }
1529
+ :root[data-forge-buttons="soft"] .forge-btn-primary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-primary) 20%, var(--forge-surface)); }
1530
+ :root[data-forge-buttons="soft"] .forge-btn-secondary { background: var(--forge-surface-muted); border-color: transparent; box-shadow: none; }
1531
+ :root[data-forge-buttons="soft"] .forge-btn-danger { background: color-mix(in oklab, var(--forge-danger) 14%, var(--forge-surface)); color: color-mix(in oklab, var(--forge-danger) 75%, var(--forge-ink)); }
1532
+ :root[data-forge-buttons="outline"] .forge-btn-primary,
1533
+ :root[data-forge-buttons="outline"] .forge-btn-primary:hover:not(:disabled) { color: var(--forge-link); border: 1.5px solid var(--forge-link); box-shadow: none; }
1534
+ :root[data-forge-buttons="outline"] .forge-btn-primary { background: transparent; }
1535
+ :root[data-forge-buttons="outline"] .forge-btn-primary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-primary) 10%, transparent); }
1536
+ :root[data-forge-buttons="outline"] .forge-btn-secondary { background: transparent; border: 1.5px solid var(--forge-line-strong); box-shadow: none; }
1537
+ :root[data-forge-buttons="pill"] .forge-btn,
1538
+ :root[data-forge-buttons="pill"] .forge-btn:hover:not(:disabled) { border-radius: 999px; clip-path: none; }
1539
+ :root[data-forge-buttons="pill"] .forge-btn-primary,
1540
+ :root[data-forge-buttons="pill"] .forge-btn-danger { padding-inline: max(1rem, 1em); }
1541
+ }
1542
+
1543
+ /* Sidebar surface. Tokens are re-scoped on the sidebar, so everything inside (search, switchers, badges) follows. */
1544
+ @layer components {
1545
+ /* "light": the page's regular surface and tokens, undoing a style's own sidebar (leather, navy…). */
1546
+ :root[data-forge-sidebar] .forge-sidebar {
1547
+ --forge-ink: inherit;
1548
+ --forge-ink-muted: inherit;
1549
+ --forge-ink-subtle: inherit;
1550
+ --forge-line: inherit;
1551
+ --forge-hover: inherit;
1552
+ --forge-selected: inherit;
1553
+ --forge-link: inherit;
1554
+ background: var(--forge-surface);
1555
+ color: var(--forge-ink);
1556
+ border-right: 1px solid var(--forge-line);
1557
+ box-shadow: none;
1558
+ }
1559
+ :root[data-forge-sidebar="dark"] .forge-sidebar,
1560
+ :root[data-forge-sidebar="brand"] .forge-sidebar { -webkit-backdrop-filter: none; backdrop-filter: none; }
1561
+ :root[data-forge-sidebar="dark"] .forge-sidebar {
1562
+ color-scheme: dark;
1563
+ --forge-surface: color-mix(in oklab, var(--forge-primary) 12%, #0f1117);
1564
+ --forge-surface-muted: color-mix(in oklab, var(--forge-primary) 10%, #0c0e13);
1565
+ --forge-ink: #f3f4f6;
1566
+ --forge-ink-muted: #bcc1cc;
1567
+ --forge-ink-subtle: #9ba1ae;
1568
+ --forge-line: rgb(255 255 255 / 0.1);
1569
+ --forge-line-strong: rgb(255 255 255 / 0.2);
1570
+ --forge-hover: rgb(255 255 255 / 0.07);
1571
+ --forge-selected: rgb(255 255 255 / 0.12);
1572
+ --forge-link: color-mix(in oklab, var(--forge-primary) 45%, white);
1573
+ border-right-color: rgb(0 0 0 / 0.4);
1574
+ }
1575
+ :root[data-forge-sidebar="brand"] .forge-sidebar {
1576
+ --forge-surface: var(--forge-primary);
1577
+ --forge-surface-muted: var(--forge-primary);
1578
+ --forge-ink: var(--forge-primary-fg);
1579
+ --forge-ink-muted: var(--forge-primary-fg);
1580
+ --forge-ink-subtle: var(--forge-primary-fg);
1581
+ --forge-line: color-mix(in oklab, var(--forge-primary-fg) 18%, transparent);
1582
+ --forge-line-strong: color-mix(in oklab, var(--forge-primary-fg) 30%, transparent);
1583
+ --forge-hover: color-mix(in oklab, var(--forge-primary-fg) 10%, transparent);
1584
+ /* The current item is marked by a bar and weight: any tint would cost contrast on mid-tone brand colours. */
1585
+ --forge-selected: transparent;
1586
+ --forge-link: var(--forge-primary-fg);
1587
+ border-right-color: transparent;
1588
+ }
1589
+ :root[data-forge-sidebar="brand"] .forge-sidebar .forge-logo { background: var(--forge-primary-fg); color: var(--forge-primary); }
1590
+ :root[data-forge-sidebar="brand"] .forge-sidebar .forge-input,
1591
+ :root[data-forge-sidebar="dark"] .forge-sidebar .forge-input { background: var(--forge-surface-muted); border-color: var(--forge-line-strong); box-shadow: none; }
1592
+ :root[data-forge-sidebar] .forge-sidebar .forge-nav-item { color: var(--forge-ink-muted); }
1593
+ :root[data-forge-sidebar] .forge-sidebar .forge-nav-item:hover { background: var(--forge-hover); color: var(--forge-ink); }
1594
+ :root[data-forge-sidebar] .forge-sidebar .forge-nav-item[aria-current="page"] { background: var(--forge-selected); color: var(--forge-ink); border-color: transparent; }
1595
+ :root[data-forge-sidebar] .forge-sidebar .forge-nav-item[aria-current="page"] svg { color: var(--forge-link); }
1596
+ :root[data-forge-sidebar="brand"] .forge-sidebar :focus-visible { outline-color: var(--forge-primary-fg); }
1597
+ :root[data-forge-sidebar="brand"] .forge-sidebar .forge-nav-item[aria-current="page"] { font-weight: 600; box-shadow: inset 3px 0 0 var(--forge-primary-fg); }
1598
+ }
1599
+
1600
+ /* Navigation icons: duotone fills the shapes with a tint of their stroke colour. */
1601
+ @layer components {
1602
+ :root[data-forge-icons="duotone"] :is(.forge-nav-item, .forge-chip) svg { fill: color-mix(in oklab, currentColor 20%, transparent); }
1603
+ :root[data-forge-icons="duotone"] .forge-nav-item[aria-current="page"] svg { fill: color-mix(in oklab, currentColor 32%, transparent); }
1604
+ }
1605
+
1606
+ /* Motion levels (prefers-reduced-motion always wins, see the end of the file). */
1607
+ @layer components {
1608
+ :root[data-forge-motion="none"] :is(.forge-enter, .forge-pop, .forge-stagger > *, .forge-toast, .forge-drawer, .forge-tooltip, .forge-skeleton),
1609
+ :root[data-forge-motion="none"] .forge-app-bg::before { animation: none; }
1610
+ :root[data-forge-motion="none"] :is(.forge-card-interactive, .forge-btn, .forge-nav-item, .forge-rail, .forge-rail-offset, .forge-input, .forge-switch) { transition: none; }
1611
+ :root[data-forge-motion="none"] .forge-card-interactive:hover,
1612
+ :root[data-forge-motion="none"] .forge-btn:hover:not(:disabled),
1613
+ :root[data-forge-motion="none"] .forge-nav-item:hover { transform: none; }
1614
+
1615
+ :root[data-forge-motion="lively"] .forge-enter { animation: forge-enter-lively 520ms var(--forge-ease) both; }
1616
+ :root[data-forge-motion="lively"] .forge-stagger > * { animation: forge-enter-lively 560ms var(--forge-ease) both; }
1617
+ :root[data-forge-motion="lively"] .forge-stagger > :nth-child(2) { animation-delay: 70ms; }
1618
+ :root[data-forge-motion="lively"] .forge-stagger > :nth-child(3) { animation-delay: 140ms; }
1619
+ :root[data-forge-motion="lively"] .forge-stagger > :nth-child(4) { animation-delay: 210ms; }
1620
+ :root[data-forge-motion="lively"] .forge-stagger > :nth-child(n + 5) { animation-delay: 280ms; }
1621
+ :root[data-forge-motion="lively"] .forge-card { transition: transform 260ms var(--forge-ease-spring), box-shadow 260ms var(--forge-ease); }
1622
+ :root[data-forge-motion="lively"] .forge-widget:hover,
1623
+ :root[data-forge-motion="lively"] .forge-card-interactive:hover { transform: translateY(-4px); box-shadow: var(--forge-card-shadow-hover); }
1624
+ :root[data-forge-motion="lively"] .forge-btn:active:not(:disabled) { transform: scale(0.96); }
1625
+ :root[data-forge-motion="lively"] .forge-nav-item { transition: background-color 140ms, color 140ms, transform 220ms var(--forge-ease-spring); }
1626
+ :root[data-forge-motion="lively"] .forge-sidebar .forge-nav-item:hover { transform: translateX(3px); }
1627
+ :root[data-forge-motion="lively"] .forge-toast { animation: forge-toast-lively 420ms var(--forge-ease-spring); }
1628
+ :root { --forge-ease-spring: cubic-bezier(0.34, 1.4, 0.64, 1); }
1629
+ }
1630
+ @keyframes forge-enter-lively { from { opacity: 0; transform: translateY(16px) scale(0.985); } }
1631
+ @keyframes forge-toast-lively { from { opacity: 0; transform: translateY(-16px) scale(0.92); } }
1632
+
1633
+ /* ════════════════════════════════════════════════════════════════════════════════════════════════
1634
+ * Polish shared by every style: focus, disabled, empty states, tables, dark-mode badges.
1635
+ * ════════════════════════════════════════════════════════════════════════════════════════════════ */
1636
+ @layer components {
1637
+ .forge-check:focus-visible, .forge-palette-item:focus-visible, .forge-cell-editable:focus-visible { outline: var(--forge-ring); outline-offset: var(--forge-ring-offset); }
1638
+ .forge-input:disabled, .forge-input[aria-disabled="true"] { cursor: not-allowed; background: var(--forge-surface-muted); }
1639
+ .forge-switch:disabled, .forge-switch[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
1640
+ .forge-check:disabled { opacity: 0.5; cursor: not-allowed; }
1641
+ .forge-btn[aria-busy="true"] { cursor: progress; }
1642
+ .forge-table thead th { font-weight: 500; }
1643
+ .forge-table tbody tr[aria-selected="true"], .forge-table tbody tr[data-selected="true"] { background: var(--forge-selected); }
1644
+ .forge-empty .forge-illustration { color: color-mix(in oklab, var(--forge-ink-subtle) 70%, var(--forge-primary)); }
1645
+ .forge-dialog { color: var(--forge-ink); }
1646
+ .forge-toast { border-left-width: 1px; }
1647
+ /* Dark mode: badges and alerts mix their tone towards the light ink, so they stay readable on dark surfaces. */
1648
+ :root[data-forge-mode="dark"] .forge-badge { color: color-mix(in oklab, var(--tone) 55%, var(--forge-ink)); background: color-mix(in oklab, var(--tone) 18%, transparent); }
1649
+ @media (prefers-color-scheme: dark) {
1650
+ :root[data-forge-mode="system"] .forge-badge { color: color-mix(in oklab, var(--tone) 55%, var(--forge-ink)); background: color-mix(in oklab, var(--tone) 18%, transparent); }
1651
+ }
1652
+ }
1653
+
1654
+ /* Links readable on every style's surfaces whatever the primary (darker on retro's grey face, terminal's own mix replaced). */
1655
+ @layer components {
1656
+ @supports (color: oklch(from red l c h)) {
1657
+ [data-forge-style="terminal"] { --forge-link: light-dark(oklch(from var(--forge-primary) min(l, 0.44) c h), oklch(from var(--forge-primary) max(l, 0.8) c h)); }
1658
+ [data-forge-style="retro"] { --forge-link: light-dark(oklch(from var(--forge-primary) min(l, 0.38) c h), oklch(from var(--forge-primary) max(l, 0.82) c h)); }
1659
+ }
1660
+ }
1661
+
1662
+ /* Headline sizes that must beat Tailwind's text-* utilities. */
1663
+ @layer utilities {
1664
+ [data-forge-style="swiss"] h1.forge-heading { font-size: 2.25rem; line-height: 2.5rem; font-weight: 700; }
1665
+ [data-forge-style="swiss"] .forge-metric-value { font-size: 3rem; line-height: 1; }
1666
+ [data-forge-style="luxury"] h1.forge-heading { font-size: 2rem; line-height: 2.375rem; font-weight: 600; }
1667
+ [data-forge-style="luxury"] .forge-metric-value { font-size: 2.5rem; }
1668
+ [data-forge-style="luxury"] .forge-table thead tr { font-size: 0.6875rem; }
1669
+ [data-forge-style="retro"] h1.forge-heading { font-size: 1.25rem; line-height: 1.75rem; }
1670
+ [data-forge-style="retro"] .forge-metric-value { font-size: 2.5rem; line-height: 2.75rem; }
1671
+ [data-forge-style="cyber"] h1.forge-heading { font-size: 1.375rem; }
1672
+ [data-forge-style="minimal"] h1.forge-heading { font-size: 1.5rem; line-height: 2rem; }
1673
+ [data-forge-style="minimal"] .forge-table thead tr { font-size: 0.8125rem; }
1674
+ [data-forge-style="playful"] h1.forge-heading { font-size: 1.625rem; line-height: 2.25rem; }
1675
+ [data-forge-style="corporate"] .forge-table thead tr { font-size: 0.6875rem; }
1676
+ [data-forge-style="corporate"] h1.forge-heading { font-size: 1.25rem; }
1677
+ }
1678
+
1679
+ /* Reduced motion and forced colours: no glow, no bounce, no animated backgrounds, whatever the style or motion level. */
1680
+ @media (prefers-reduced-motion: reduce) {
1681
+ :root[data-forge-motion] :is(.forge-enter, .forge-pop, .forge-stagger > *, .forge-toast, .forge-drawer, .forge-tooltip, .forge-skeleton),
1682
+ :root[data-forge-motion] .forge-app-bg::before { animation: none !important; }
1683
+ :root[data-forge-motion] :is(.forge-card, .forge-card-interactive, .forge-btn, .forge-nav-item, .forge-input, .forge-switch) { transition: none !important; }
1684
+ :root[data-forge-motion] :is(.forge-card, .forge-card-interactive, .forge-widget, .forge-btn, .forge-nav-item, .forge-chip, .forge-logo):is(:hover, :active) { transform: none !important; }
1685
+ [data-forge-style="neon"] { --neon-glow: 0 0 0 1px var(--forge-primary); --neon-glow-soft: 0 0 #0000; --neon-text-glow: none; }
1686
+ [data-forge-style="neon"] .forge-nav-item[aria-current="page"] svg { filter: none; }
1687
+ [data-forge-style="playful"] .forge-card-interactive:hover, [data-forge-style="playful"] .forge-btn:hover:not(:disabled) { transform: none; }
1688
+ }
1689
+ @media (forced-colors: active) {
1690
+ [data-forge-style="neon"] { --neon-glow: none; --neon-glow-soft: none; --neon-text-glow: none; }
1691
+ [data-forge-style="neon"] *, [data-forge-style="playful"] .forge-chip { text-shadow: none; filter: none; }
1692
+ [data-forge-style="cyber"] :is(.forge-card, .forge-dialog, .forge-toast, .forge-btn, .forge-badge, .forge-chip, .forge-avatar, .forge-logo) { clip-path: none; }
1693
+ [data-forge-style="retro"] :is(.forge-card, .forge-btn, .forge-input, .forge-sidebar) { border: 1px solid CanvasText; }
1694
+ .forge-nav-item[aria-current="page"] { outline: 2px solid Highlight; outline-offset: -2px; }
1695
+ .forge-btn { border: 1px solid ButtonText; }
1696
+
1697
+ }
1698
+ /* ── Website (`site` in forge.config.ts): public pages built from sections ────────────────────────
1699
+ * Every hook below builds on the theme tokens, so presets, styles, modes and corner radii restyle the website
1700
+ * like the app. Layout lives in Tailwind container-query utilities in the components (@container on the page). */
1701
+ @layer components {
1702
+ /* Header: translucent canvas over the page, menu links, dropdowns and the small-screen panel. */
1703
+ .forge-site-header { background: color-mix(in oklab, var(--forge-canvas) 84%, transparent); backdrop-filter: saturate(1.5) blur(14px); -webkit-backdrop-filter: saturate(1.5) blur(14px); border-bottom: 1px solid var(--forge-line); }
1704
+ .forge-site-navlink { padding: 0.5rem 0.75rem; border-radius: var(--forge-radius-control); font-size: 0.9375rem; font-weight: 500; color: var(--forge-ink-muted); transition: color 120ms, background-color 120ms; }
1705
+ .forge-site-navlink:hover, .forge-site-navlink[aria-expanded="true"] { color: var(--forge-ink); background: var(--forge-hover); }
1706
+ .forge-site-navlink[aria-current="page"], .forge-site-navlink[data-active] { color: var(--forge-ink); box-shadow: inset 0 -2px 0 var(--forge-primary); }
1707
+ .forge-site-chevron { transition: transform 160ms var(--forge-ease); }
1708
+ .forge-site-navlink[aria-expanded="true"] .forge-site-chevron { transform: rotate(180deg); }
1709
+ .forge-site-dropdown { animation: forge-enter 160ms var(--forge-ease) both; }
1710
+ .forge-site-dropdown-link { border-radius: var(--forge-radius-control); transition: background-color 120ms; }
1711
+ .forge-site-dropdown-link:hover, .forge-site-dropdown-link[aria-current="page"] { background: var(--forge-hover); }
1712
+ .forge-site-mobile { background: var(--forge-surface); border-bottom: 1px solid var(--forge-line); box-shadow: 0 28px 48px -28px rgb(0 0 0 / 0.4); animation: forge-enter 180ms var(--forge-ease) both; }
1713
+
1714
+ /* Type and accents */
1715
+ .forge-site-display { letter-spacing: -0.025em; }
1716
+ .forge-site-eyebrow { color: var(--forge-link); letter-spacing: 0.02em; }
1717
+ .forge-site-pill { border-radius: 999px; }
1718
+ .forge-site-brand-pill { border-radius: 999px; background: rgb(255 255 255 / 0.12); box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.3); }
1719
+ .forge-site-role { color: var(--forge-link); }
1720
+ .forge-site-quote-mark { color: color-mix(in oklab, var(--forge-primary) 70%, var(--forge-ink)); }
1721
+ .forge-site-check { color: color-mix(in oklab, var(--forge-primary) 72%, var(--forge-ink)); }
1722
+ .forge-site-stat { color: color-mix(in oklab, var(--forge-primary) 55%, var(--forge-ink)); }
1723
+ .forge-site-dot { background: var(--forge-ink-subtle); }
1724
+ .forge-site-arrow { transition: transform 160ms var(--forge-ease); }
1725
+ a:hover .forge-site-arrow, .forge-site-row:hover .forge-site-arrow { transform: translateX(3px); }
1726
+
1727
+ /* Hero glow: a soft halo of the brand colours behind the opening section. */
1728
+ .forge-site-hero-glow::before {
1729
+ content: ""; position: absolute; inset: -30% -10% auto; height: 130%; z-index: -1; pointer-events: none;
1730
+ background:
1731
+ radial-gradient(45% 45% at 50% 10%, color-mix(in oklab, var(--forge-primary) 15%, transparent), transparent 70%),
1732
+ radial-gradient(28% 32% at 82% 25%, color-mix(in oklab, var(--forge-accent) 11%, transparent), transparent 70%);
1733
+ }
1734
+
1735
+ /* Media: fixed-ratio boxes (no layout shift) on a muted backdrop while they load. */
1736
+ .forge-site-media { border-radius: var(--forge-radius); background: var(--forge-surface-muted); }
1737
+ .forge-site-frame { border: 1px solid var(--forge-line); box-shadow: var(--forge-card-shadow-hover); }
1738
+ .forge-site-card-media, .forge-site-bento-media { border-radius: 0; }
1739
+ .forge-site-media-inner { border-radius: calc(var(--forge-radius) - 4px); }
1740
+ .forge-site-avatar { border-radius: 999px; background: var(--forge-surface-muted); }
1741
+ .forge-site-iconpanel, .forge-site-cover-fallback {
1742
+ background:
1743
+ radial-gradient(circle at 25% 20%, color-mix(in oklab, var(--forge-primary) 16%, transparent), transparent 55%),
1744
+ radial-gradient(circle at 85% 90%, color-mix(in oklab, var(--forge-accent) 14%, transparent), transparent 50%),
1745
+ var(--forge-surface-muted);
1746
+ color: var(--forge-ink);
1747
+ }
1748
+ .forge-site-iconpanel { border-radius: var(--forge-radius); border: 1px solid var(--forge-line); }
1749
+
1750
+ /* Cards and panels */
1751
+ .forge-site-bento-feature { background: linear-gradient(155deg, color-mix(in oklab, var(--forge-primary) 9%, var(--forge-surface)), var(--forge-surface) 60%); }
1752
+ .forge-site-panel { border-radius: var(--forge-radius); background: var(--forge-surface-muted); border: 1px solid var(--forge-line); }
1753
+ .forge-site-cta-split { background: linear-gradient(115deg, color-mix(in oklab, var(--forge-primary) 9%, var(--forge-surface)), var(--forge-surface) 55%); }
1754
+ .forge-site-row { transition: background-color 120ms; }
1755
+ .forge-site-row:hover { background: var(--forge-hover); }
1756
+ .forge-site-stretched::after { content: ""; position: absolute; inset: 0; z-index: 1; }
1757
+ .forge-site-post:focus-within { box-shadow: var(--forge-card-shadow-hover); }
1758
+
1759
+ /* Logos: muted marks that come to full colour on hover; the grid variant draws hairlines between cells. */
1760
+ .forge-site-logo { color: var(--forge-ink-muted); opacity: 0.8; transition: opacity 160ms; }
1761
+ .forge-site-logo-img { filter: grayscale(1); transition: filter 160ms; }
1762
+ .forge-site-logo:hover { opacity: 1; }
1763
+ .forge-site-logo:hover .forge-site-logo-img { filter: none; }
1764
+ .forge-site-logo-grid { gap: 1px; background: var(--forge-line); border: 1px solid var(--forge-line); border-radius: var(--forge-radius); overflow: hidden; }
1765
+ .forge-site-logo-grid > li { background: var(--forge-surface); }
1766
+ .forge-site-logo-tile { border-radius: calc(var(--forge-radius-control) + 2px); background: var(--forge-surface-muted); border: 1px solid var(--forge-line); color: var(--forge-ink); }
1767
+
1768
+ /* Steps, stats, pricing */
1769
+ .forge-site-step-number { border-radius: 999px; background: var(--forge-primary); color: var(--forge-primary-fg); box-shadow: 0 0 0 4px color-mix(in oklab, var(--forge-primary) 16%, transparent); }
1770
+ .forge-site-timeline-item:not(:last-child)::before { content: ""; position: absolute; left: 1.25rem; top: 2.75rem; bottom: 0.25rem; width: 2px; transform: translateX(-50%); background: var(--forge-line-strong); }
1771
+ .forge-site-plan-highlight { border-color: var(--forge-primary); box-shadow: 0 0 0 1px var(--forge-primary), var(--forge-card-shadow-hover); }
1772
+ .forge-site-plan-badge { border-radius: 999px; background: var(--forge-primary); color: var(--forge-primary-fg); }
1773
+ .forge-site-plan-row-highlight { background: color-mix(in oklab, var(--forge-primary) 6%, transparent); }
1774
+
1775
+ /* FAQ disclosure */
1776
+ .forge-site-faq-item summary::-webkit-details-marker { display: none; }
1777
+ .forge-site-faq-icon { background: var(--forge-hover); color: var(--forge-ink); transition: transform 200ms var(--forge-ease), background-color 150ms; }
1778
+ .forge-site-faq-item summary:hover .forge-site-faq-icon, .forge-site-faq-item[open] .forge-site-faq-icon { background: var(--forge-selected); }
1779
+ .forge-site-faq-item[open] .forge-site-faq-icon { transform: rotate(45deg); }
1780
+
1781
+ /* Tables: comparison (first column = you, tinted) and markdown tables; they scroll sideways when narrow. */
1782
+ .forge-site-table-scroll { overflow-x: auto; }
1783
+ .forge-site-table-scroll:focus-visible { outline: var(--forge-ring); outline-offset: -2px; }
1784
+ .forge-site-compare tr { border-top: 1px solid var(--forge-line); }
1785
+ .forge-site-compare thead tr { border-top: 0; background: var(--forge-surface-muted); }
1786
+ .forge-site-compare [data-highlight] { background: color-mix(in oklab, var(--forge-primary) 7%, transparent); }
1787
+
1788
+ /* Forms */
1789
+ .forge-site-field-error { color: color-mix(in oklab, var(--forge-danger) 80%, var(--forge-ink)); }
1790
+ .forge-site-success { border-radius: var(--forge-radius-control); background: color-mix(in oklab, var(--forge-success) 10%, var(--forge-surface)); color: color-mix(in oklab, var(--forge-success) 50%, var(--forge-ink)); border: 1px solid color-mix(in oklab, var(--forge-success) 30%, transparent); }
1791
+ .forge-site-success-icon { color: color-mix(in oklab, var(--forge-success) 80%, var(--forge-ink)); }
1792
+ .forge-site-honeypot { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
1793
+ .forge-site-spin { animation: forge-site-spin 0.9s linear infinite; }
1794
+
1795
+ /* Hidden sections (editor preview only) */
1796
+ .forge-site-hidden { outline: 2px dashed color-mix(in oklab, var(--forge-ink) 28%, transparent); outline-offset: -6px; }
1797
+ .forge-site-hidden > :not(.forge-site-hidden-badge) { opacity: 0.6; }
1798
+ .forge-site-hidden-badge { border-radius: 999px; background: var(--forge-ink); color: var(--forge-surface); }
1799
+
1800
+ /* Footer */
1801
+ .forge-site-footer { border-top: 1px solid var(--forge-line); background: var(--forge-surface-muted); }
1802
+ .forge-site-footer-link { color: var(--forge-ink-muted); transition: color 120ms; }
1803
+ .forge-site-footer-link:hover { color: var(--forge-ink); }
1804
+
1805
+ /* Markdown (text sections, FAQ answers, posts): typography from the tokens. */
1806
+ .forge-site-prose { line-height: 1.75; overflow-wrap: break-word; }
1807
+ .forge-site-prose > * + * { margin-top: 1.1em; }
1808
+ .forge-site-prose > :first-child { margin-top: 0; }
1809
+ .forge-site-prose :is(h2, h3, h4, h5, h6) { font-family: var(--forge-font-display); color: var(--forge-ink); font-weight: 600; letter-spacing: -0.015em; line-height: 1.3; text-wrap: balance; }
1810
+ .forge-site-prose > :is(h2, h3, h4, h5, h6) { margin-top: 1.9em; }
1811
+ .forge-site-prose > :is(h2, h3, h4, h5, h6) + * { margin-top: 0.6em; }
1812
+ .forge-site-prose h2 { font-size: 1.625em; }
1813
+ .forge-site-prose h3 { font-size: 1.3em; }
1814
+ .forge-site-prose h4 { font-size: 1.1em; }
1815
+ .forge-site-prose :is(p, li) { text-wrap: pretty; }
1816
+ .forge-site-prose a { color: var(--forge-link); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; }
1817
+ .forge-site-prose a:hover { text-decoration-thickness: 2px; }
1818
+ .forge-site-prose a:focus-visible { outline: var(--forge-ring); outline-offset: 2px; border-radius: 2px; }
1819
+ .forge-site-prose strong { color: var(--forge-ink); font-weight: 600; }
1820
+ .forge-site-prose :not(pre) > code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.875em; background: var(--forge-surface-muted); border: 1px solid var(--forge-line); border-radius: 5px; padding: 0.1em 0.35em; color: var(--forge-ink); }
1821
+ .forge-site-prose pre { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.875rem; line-height: 1.65; background: var(--forge-surface-muted); color: var(--forge-ink); border: 1px solid var(--forge-line); border-radius: var(--forge-radius-control); padding: 1rem 1.25rem; overflow-x: auto; }
1822
+ .forge-site-prose pre:focus-visible { outline: var(--forge-ring); outline-offset: 2px; }
1823
+ .forge-site-prose ul { list-style: disc; padding-left: 1.4em; }
1824
+ .forge-site-prose ol { list-style: decimal; padding-left: 1.5em; }
1825
+ .forge-site-prose li + li, .forge-site-prose li > :is(ul, ol) { margin-top: 0.4em; }
1826
+ .forge-site-prose li::marker { color: var(--forge-ink-subtle); }
1827
+ .forge-site-prose blockquote { border-left: 3px solid var(--forge-primary); padding-left: 1.1em; color: var(--forge-ink-muted); font-style: italic; }
1828
+ .forge-site-prose hr { border: 0; border-top: 1px solid var(--forge-line); margin-block: 2.5em; }
1829
+ .forge-site-prose img { max-width: 100%; height: auto; border-radius: var(--forge-radius); border: 1px solid var(--forge-line); }
1830
+ .forge-site-prose table { width: 100%; border-collapse: collapse; font-size: 0.9375em; }
1831
+ .forge-site-prose :is(th, td) { border-bottom: 1px solid var(--forge-line); padding: 0.6em 0.8em; text-align: left; }
1832
+ .forge-site-prose th { color: var(--forge-ink); font-weight: 600; }
1833
+ .forge-site-prose-lg { font-size: 1.125rem; }
1834
+
1835
+ /* Style tweaks: each style's signature carried into the website. */
1836
+ [data-forge-style="brutalist"] .forge-site-header { border-bottom: 3px solid var(--brut-ink); }
1837
+ [data-forge-style="brutalist"] .forge-site-frame { border: 3px solid var(--brut-ink); box-shadow: 6px 6px 0 var(--brut-ink); }
1838
+ [data-forge-style="brutalist"] :is(.forge-site-pill, .forge-site-plan-badge, .forge-site-hidden-badge, .forge-site-faq-icon) { border-radius: 0; }
1839
+ [data-forge-style="brutalist"] .forge-site-plan-highlight { border: 3px solid var(--brut-ink); box-shadow: 8px 8px 0 var(--forge-primary); }
1840
+ :is([data-forge-style="brutalist"], [data-forge-style="terminal"], [data-forge-style="editorial"]) .forge-site-hero-glow::before { display: none; }
1841
+ [data-forge-style="editorial"] .forge-site-eyebrow { text-transform: uppercase; letter-spacing: 0.14em; font-size: 0.75rem; color: var(--forge-ink-muted); }
1842
+ [data-forge-style="editorial"] .forge-site-frame { box-shadow: none; }
1843
+ [data-forge-style="editorial"] .forge-site-display { letter-spacing: -0.01em; font-weight: 500; }
1844
+ [data-forge-style="terminal"] :is(.forge-site-pill, .forge-site-plan-badge, .forge-site-step-number, .forge-site-hidden-badge, .forge-site-faq-icon, .forge-site-brand-pill) { border-radius: 2px; }
1845
+ [data-forge-style="terminal"] .forge-site-frame { box-shadow: none; border-color: var(--forge-line-strong); }
1846
+ [data-forge-style="terminal"] .forge-site-display { letter-spacing: 0; }
1847
+ [data-forge-style="neumorphism"] .forge-site-header { background: var(--forge-canvas); }
1848
+ [data-forge-style="neumorphism"] .forge-site-frame { border: 0; box-shadow: var(--forge-card-shadow); }
1849
+ [data-forge-style="neumorphism"] .forge-site-logo-grid > li { background: var(--forge-canvas); }
1850
+ [data-forge-style="clay"] :is(.forge-site-media, .forge-site-iconpanel, .forge-site-panel) { border-radius: calc(var(--forge-radius) + 6px); }
1851
+ [data-forge-style="material"] .forge-site-frame { border: 0; }
1852
+ [data-forge-style="skeuomorphism"] .forge-site-panel { box-shadow: inset 0 1px 3px rgb(0 0 0 / 0.08); }
1853
+ }
1854
+
1855
+ /* Website stats row: hairlines between the numbers once they sit on one line. */
1856
+ @container (min-width: 48rem) {
1857
+ .forge-site-stats-row > * + * { border-left: 1px solid var(--forge-line); }
1858
+ }
1859
+
1860
+ @keyframes forge-site-spin { to { transform: rotate(360deg); } }
1861
+
1862
+ @media (prefers-reduced-motion: reduce) {
1863
+ .forge-site-dropdown, .forge-site-mobile { animation: none !important; }
1864
+ .forge-site-spin { animation-duration: 2.4s; }
1865
+ .forge-site-arrow, .forge-site-chevron, .forge-site-faq-icon, .forge-site-logo, .forge-site-logo-img, .forge-site-row, .forge-site-navlink { transition: none !important; }
1866
+ a:hover .forge-site-arrow, .forge-site-row:hover .forge-site-arrow { transform: none !important; }
1867
+ }