@tekki-forge/runtime-admin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +5 -0
  2. package/dist/account.d.ts +1 -0
  3. package/dist/account.js +105 -0
  4. package/dist/account.js.map +1 -0
  5. package/dist/activity.d.ts +65 -0
  6. package/dist/activity.js +299 -0
  7. package/dist/activity.js.map +1 -0
  8. package/dist/admin-access.d.ts +4 -0
  9. package/dist/admin-access.js +177 -0
  10. package/dist/admin-access.js.map +1 -0
  11. package/dist/admin.d.ts +5 -0
  12. package/dist/admin.js +129 -0
  13. package/dist/admin.js.map +1 -0
  14. package/dist/auth-pages.d.ts +13 -0
  15. package/dist/auth-pages.js +207 -0
  16. package/dist/auth-pages.js.map +1 -0
  17. package/dist/brand-art.d.ts +24 -0
  18. package/dist/brand-art.js +33 -0
  19. package/dist/brand-art.js.map +1 -0
  20. package/dist/brand.d.ts +11 -0
  21. package/dist/brand.js +16 -0
  22. package/dist/brand.js.map +1 -0
  23. package/dist/charts.d.ts +23 -0
  24. package/dist/charts.js +259 -0
  25. package/dist/charts.js.map +1 -0
  26. package/dist/command-palette.d.ts +9 -0
  27. package/dist/command-palette.js +115 -0
  28. package/dist/command-palette.js.map +1 -0
  29. package/dist/context.d.ts +242 -0
  30. package/dist/context.js +107 -0
  31. package/dist/context.js.map +1 -0
  32. package/dist/dashboard.d.ts +66 -0
  33. package/dist/dashboard.js +144 -0
  34. package/dist/dashboard.js.map +1 -0
  35. package/dist/fields.d.ts +71 -0
  36. package/dist/fields.js +326 -0
  37. package/dist/fields.js.map +1 -0
  38. package/dist/i18n/catalog.d.ts +7 -0
  39. package/dist/i18n/catalog.js +23 -0
  40. package/dist/i18n/catalog.js.map +1 -0
  41. package/dist/i18n/locale.d.ts +15 -0
  42. package/dist/i18n/locale.js +69 -0
  43. package/dist/i18n/locale.js.map +1 -0
  44. package/dist/i18n/messages/de.d.ts +3 -0
  45. package/dist/i18n/messages/de.js +627 -0
  46. package/dist/i18n/messages/de.js.map +1 -0
  47. package/dist/i18n/messages/en.d.ts +3 -0
  48. package/dist/i18n/messages/en.js +627 -0
  49. package/dist/i18n/messages/en.js.map +1 -0
  50. package/dist/i18n/messages/es.d.ts +3 -0
  51. package/dist/i18n/messages/es.js +627 -0
  52. package/dist/i18n/messages/es.js.map +1 -0
  53. package/dist/i18n/messages/fr.d.ts +3 -0
  54. package/dist/i18n/messages/fr.js +627 -0
  55. package/dist/i18n/messages/fr.js.map +1 -0
  56. package/dist/i18n/messages/pt.d.ts +3 -0
  57. package/dist/i18n/messages/pt.js +627 -0
  58. package/dist/i18n/messages/pt.js.map +1 -0
  59. package/dist/i18n/validation.d.ts +3 -0
  60. package/dist/i18n/validation.js +36 -0
  61. package/dist/i18n/validation.js.map +1 -0
  62. package/dist/illustrations.d.ts +6 -0
  63. package/dist/illustrations.js +16 -0
  64. package/dist/illustrations.js.map +1 -0
  65. package/dist/import-dialog.d.ts +11 -0
  66. package/dist/import-dialog.js +152 -0
  67. package/dist/import-dialog.js.map +1 -0
  68. package/dist/index.d.ts +38 -0
  69. package/dist/index.js +39 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/inline-edit.d.ts +18 -0
  72. package/dist/inline-edit.js +115 -0
  73. package/dist/inline-edit.js.map +1 -0
  74. package/dist/landing.d.ts +79 -0
  75. package/dist/landing.js +122 -0
  76. package/dist/landing.js.map +1 -0
  77. package/dist/locale-switcher.d.ts +4 -0
  78. package/dist/locale-switcher.js +15 -0
  79. package/dist/locale-switcher.js.map +1 -0
  80. package/dist/map.d.ts +26 -0
  81. package/dist/map.js +232 -0
  82. package/dist/map.js.map +1 -0
  83. package/dist/notifications.d.ts +12 -0
  84. package/dist/notifications.js +75 -0
  85. package/dist/notifications.js.map +1 -0
  86. package/dist/record-mutation.d.ts +19 -0
  87. package/dist/record-mutation.js +39 -0
  88. package/dist/record-mutation.js.map +1 -0
  89. package/dist/resource-detail.d.ts +4 -0
  90. package/dist/resource-detail.js +96 -0
  91. package/dist/resource-detail.js.map +1 -0
  92. package/dist/resource-form.d.ts +11 -0
  93. package/dist/resource-form.js +92 -0
  94. package/dist/resource-form.js.map +1 -0
  95. package/dist/resource-list.d.ts +10 -0
  96. package/dist/resource-list.js +154 -0
  97. package/dist/resource-list.js.map +1 -0
  98. package/dist/saved-views.d.ts +16 -0
  99. package/dist/saved-views.js +64 -0
  100. package/dist/saved-views.js.map +1 -0
  101. package/dist/schema-editor-diagram.d.ts +14 -0
  102. package/dist/schema-editor-diagram.js +54 -0
  103. package/dist/schema-editor-diagram.js.map +1 -0
  104. package/dist/schema-editor.d.ts +98 -0
  105. package/dist/schema-editor.js +571 -0
  106. package/dist/schema-editor.js.map +1 -0
  107. package/dist/shell.d.ts +10 -0
  108. package/dist/shell.js +228 -0
  109. package/dist/shell.js.map +1 -0
  110. package/dist/skeleton.d.ts +25 -0
  111. package/dist/skeleton.js +34 -0
  112. package/dist/skeleton.js.map +1 -0
  113. package/dist/theme-catalog.d.ts +71 -0
  114. package/dist/theme-catalog.js +55 -0
  115. package/dist/theme-catalog.js.map +1 -0
  116. package/dist/theme-head.d.ts +8 -0
  117. package/dist/theme-head.js +11 -0
  118. package/dist/theme-head.js.map +1 -0
  119. package/dist/theme-preview.d.ts +2 -0
  120. package/dist/theme-preview.js +23 -0
  121. package/dist/theme-preview.js.map +1 -0
  122. package/dist/theme-switcher.d.ts +20 -0
  123. package/dist/theme-switcher.js +159 -0
  124. package/dist/theme-switcher.js.map +1 -0
  125. package/dist/theme.d.ts +24 -0
  126. package/dist/theme.js +30 -0
  127. package/dist/theme.js.map +1 -0
  128. package/dist/toast.d.ts +21 -0
  129. package/dist/toast.js +51 -0
  130. package/dist/toast.js.map +1 -0
  131. package/dist/ui.d.ts +86 -0
  132. package/dist/ui.js +106 -0
  133. package/dist/ui.js.map +1 -0
  134. package/dist/views.d.ts +23 -0
  135. package/dist/views.js +238 -0
  136. package/dist/views.js.map +1 -0
  137. package/package.json +58 -0
  138. package/styles.css +778 -0
package/styles.css ADDED
@@ -0,0 +1,778 @@
1
+ /*
2
+ * Forge UI styles. Import after Tailwind in the app's globals.css:
3
+ * @import "tailwindcss";
4
+ * @import "@tekki-forge/runtime-admin/styles.css";
5
+ * @import "@app/generated/theme.css"; (brand colours from forge.config.ts)
6
+ *
7
+ * <html data-forge-style data-forge-mode data-forge-radius data-forge-layout data-forge-density data-forge-font> selects the look.
8
+ * Components carry `forge-*` hooks for everything visual (surface, border, shadow, radius);
9
+ * Tailwind utilities only handle layout and typography, so a style can restyle anything.
10
+ */
11
+
12
+ /* ── Tokens exposed to Tailwind: bg-surface, text-ink, border-line, text-primary, … ───────────── */
13
+ @theme inline {
14
+ --color-primary: var(--forge-primary);
15
+ --color-primary-foreground: var(--forge-primary-fg);
16
+ --color-accent: var(--forge-accent);
17
+ --color-accent-foreground: var(--forge-accent-fg);
18
+ --color-danger: var(--forge-danger);
19
+ --color-canvas: var(--forge-canvas);
20
+ --color-surface: var(--forge-surface);
21
+ --color-surface-muted: var(--forge-surface-muted);
22
+ --color-line: var(--forge-line);
23
+ --color-ink: var(--forge-ink);
24
+ --color-ink-muted: var(--forge-ink-muted);
25
+ --color-ink-subtle: var(--forge-ink-subtle);
26
+ --color-hover: var(--forge-hover);
27
+ --color-selected: var(--forge-selected);
28
+ --color-link: var(--forge-link);
29
+ }
30
+
31
+ /* ── Base palette (brand defaults are overridden by the generated theme.css) ──────────────────── */
32
+ /* In @layer base so each style (in @layer components) can override tokens; the generated theme.css is unlayered and wins for brand colours. */
33
+ @layer base {
34
+ :root {
35
+ --forge-primary: #4f46e5;
36
+ --forge-primary-fg: #ffffff;
37
+ --forge-accent: #f59e0b;
38
+ --forge-accent-fg: #111827;
39
+ --forge-danger: #dc2626;
40
+ --forge-danger-fg: #ffffff;
41
+ --forge-success: light-dark(#059669, #34d399);
42
+ --forge-info: light-dark(#0284c7, #38bdf8);
43
+
44
+ color-scheme: light;
45
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-primary) 2%, #f7f7f9), color-mix(in oklab, var(--forge-primary) 4%, #0c0c10));
46
+ --forge-surface: light-dark(#ffffff, #16161c);
47
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-primary) 2%, #f3f3f6), color-mix(in oklab, var(--forge-primary) 3%, #111116));
48
+ --forge-line: light-dark(#e5e5ea, rgb(255 255 255 / 0.09));
49
+ --forge-line-strong: light-dark(#d4d4dc, rgb(255 255 255 / 0.16));
50
+ --forge-ink: light-dark(#18181b, #f4f4f5);
51
+ --forge-ink-muted: light-dark(#52525b, #a1a1aa);
52
+ --forge-ink-subtle: light-dark(#a1a1aa, #71717a);
53
+ --forge-hover: light-dark(rgb(24 24 27 / 0.05), rgb(255 255 255 / 0.06));
54
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 13%, transparent);
55
+ --forge-link: light-dark(var(--forge-primary), color-mix(in oklab, var(--forge-primary) 60%, white));
56
+ --forge-overlay: rgb(9 9 11 / 0.45);
57
+ --forge-focus: color-mix(in oklab, var(--forge-primary) 35%, transparent);
58
+
59
+ --forge-card-shadow: 0 1px 2px rgb(0 0 0 / 0.04);
60
+ --forge-card-shadow-hover: 0 2px 4px rgb(0 0 0 / 0.04), 0 12px 28px -12px rgb(0 0 0 / 0.22);
61
+ --forge-radius: 10px;
62
+ --forge-radius-control: 7px;
63
+ /* Focus ring: each style may restyle it. */
64
+ --forge-ring: 2px solid var(--forge-primary);
65
+ --forge-ring-offset: 2px;
66
+
67
+ /* Typography: the generated theme.css sets both when theme.font isn't "system". */
68
+ --forge-font-body: var(--font-sans, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif);
69
+ --forge-font-display: var(--forge-font-body);
70
+
71
+ /* Density (comfortable). */
72
+ --forge-control-h: 2.25rem;
73
+ --forge-control-y: 0.5rem;
74
+ --forge-cell-y: 0.625rem;
75
+ --forge-cell-x: 1rem;
76
+ --forge-pad-card: 1.25rem;
77
+ --forge-pad-card-lg: 1.5rem;
78
+ --forge-gap-form: 1.25rem;
79
+ --forge-main-y: 2rem;
80
+
81
+ --forge-ease: cubic-bezier(0.2, 0.7, 0.2, 1);
82
+ }
83
+ :root[data-forge-density="compact"] {
84
+ --forge-control-h: 2rem;
85
+ --forge-control-y: 0.3125rem;
86
+ --forge-cell-y: 0.375rem;
87
+ --forge-cell-x: 0.75rem;
88
+ --forge-pad-card: 0.875rem;
89
+ --forge-pad-card-lg: 1rem;
90
+ --forge-gap-form: 0.875rem;
91
+ --forge-main-y: 1.25rem;
92
+ }
93
+ body { font-family: var(--forge-font-body); }
94
+ :root[data-forge-style="terminal"] { color-scheme: dark; }
95
+ :root[data-forge-style="terminal"][data-forge-mode="light"] { color-scheme: light; }
96
+ :root[data-forge-style="terminal"][data-forge-mode="system"] { color-scheme: light dark; }
97
+ :root[data-forge-mode="dark"] { color-scheme: dark; }
98
+ :root[data-forge-mode="system"] { color-scheme: light dark; }
99
+
100
+ :root[data-forge-radius="none"] { --forge-radius: 0px; --forge-radius-control: 0px; }
101
+ :root[data-forge-radius="small"] { --forge-radius: 6px; --forge-radius-control: 4px; }
102
+ :root[data-forge-radius="medium"] { --forge-radius: 10px; --forge-radius-control: 7px; }
103
+ :root[data-forge-radius="large"] { --forge-radius: 18px; --forge-radius-control: 12px; }
104
+ :root[data-forge-radius="full"] { --forge-radius: 24px; --forge-radius-control: 999px; }
105
+ }
106
+
107
+ /* ── Structural component styles (the "simple" look) ──────────────────────────────────────────── */
108
+ @layer components {
109
+ .forge-app-bg { background: var(--forge-canvas); color: var(--forge-ink); min-height: 100dvh; }
110
+ .forge-sidebar { background: var(--forge-surface-muted); border-right: 1px solid var(--forge-line); color: var(--forge-ink); }
111
+ .forge-topbar { background: var(--forge-surface); border-bottom: 1px solid var(--forge-line); }
112
+ .forge-card { background: var(--forge-surface); border: 1px solid var(--forge-line); border-radius: var(--forge-radius); box-shadow: var(--forge-card-shadow); }
113
+ .forge-card-flat { background: var(--forge-surface-muted); border-radius: calc(var(--forge-radius) - 2px); }
114
+ .forge-popover { background: var(--forge-surface); border: 1px solid var(--forge-line); border-radius: var(--forge-radius-control); box-shadow: 0 12px 32px -8px rgb(0 0 0 / 0.18); }
115
+ .forge-dialog { background: var(--forge-surface); border: 1px solid var(--forge-line); border-radius: calc(var(--forge-radius) + 2px); box-shadow: 0 24px 64px -12px rgb(0 0 0 / 0.3); }
116
+ .forge-overlay { background: var(--forge-overlay); }
117
+ .forge-logo { background: var(--forge-primary); color: var(--forge-primary-fg); border-radius: calc(var(--forge-radius-control) + 1px); }
118
+
119
+ .forge-btn {
120
+ border-radius: var(--forge-radius-control);
121
+ border: 1px solid transparent;
122
+ transition: background-color 120ms, box-shadow 120ms, color 120ms, transform 80ms;
123
+ }
124
+ .forge-btn:focus-visible, .forge-input:focus-visible, .forge-switch:focus-visible,
125
+ .forge-nav-item:focus-visible, .forge-focusable:focus-visible { outline: var(--forge-ring); outline-offset: var(--forge-ring-offset); }
126
+ .forge-btn:disabled { opacity: 0.55; cursor: not-allowed; }
127
+ .forge-btn-primary { background: var(--forge-primary); color: var(--forge-primary-fg); }
128
+ .forge-btn-primary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-primary) 88%, black); }
129
+ .forge-btn-secondary { background: var(--forge-surface); color: var(--forge-ink); border-color: var(--forge-line-strong); }
130
+ .forge-btn-secondary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-surface) 92%, var(--forge-ink)); }
131
+ .forge-btn-ghost { background: transparent; color: var(--forge-ink-muted); }
132
+ .forge-btn-ghost:hover:not(:disabled) { background: var(--forge-hover); color: var(--forge-ink); }
133
+ .forge-btn-ghost[aria-current="page"] { background: var(--forge-surface); color: var(--forge-ink); border-color: var(--forge-line-strong); }
134
+ .forge-btn-danger { background: var(--forge-danger); color: var(--forge-danger-fg); }
135
+ .forge-btn-danger:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-danger) 88%, black); }
136
+ .forge-btn-danger-ghost { background: transparent; color: var(--forge-danger); }
137
+ .forge-btn-danger-ghost:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-danger) 10%, transparent); }
138
+
139
+ .forge-input {
140
+ background: var(--forge-surface);
141
+ color: var(--forge-ink);
142
+ border: 1px solid var(--forge-line-strong);
143
+ border-radius: var(--forge-radius-control);
144
+ transition: border-color 120ms, box-shadow 120ms;
145
+ }
146
+ .forge-input::placeholder { color: var(--forge-ink-subtle); }
147
+ .forge-input:focus { outline: none; border-color: var(--forge-primary); box-shadow: 0 0 0 3px var(--forge-focus); }
148
+ .forge-input[aria-invalid="true"] { border-color: var(--forge-danger); }
149
+ .forge-input:disabled { opacity: 0.6; }
150
+ select.forge-input option { background: var(--forge-surface); color: var(--forge-ink); }
151
+ .forge-check { accent-color: var(--forge-primary); }
152
+
153
+ .forge-switch { background: var(--forge-line-strong); border-radius: 999px; transition: background-color 150ms; }
154
+ .forge-switch[aria-checked="true"] { background: var(--forge-primary); }
155
+ .forge-switch-thumb { background: #fff; border-radius: 999px; box-shadow: 0 1px 2px rgb(0 0 0 / 0.25); }
156
+
157
+ .forge-nav-item { color: var(--forge-ink-muted); border-radius: var(--forge-radius-control); transition: background-color 120ms, color 120ms; }
158
+ .forge-nav-item:hover { background: var(--forge-hover); color: var(--forge-ink); }
159
+ .forge-nav-item[aria-current="page"] { background: var(--forge-selected); color: var(--forge-ink); font-weight: 500; }
160
+ .forge-nav-item[aria-current="page"] svg { color: var(--forge-primary); }
161
+
162
+ .forge-table thead tr { color: var(--forge-ink-muted); border-bottom: 1px solid var(--forge-line); }
163
+ .forge-table tbody tr { border-top: 1px solid var(--forge-line); }
164
+ .forge-table tbody tr:first-child { border-top: 0; }
165
+ .forge-table tbody tr:hover { background: var(--forge-hover); }
166
+
167
+ .forge-badge {
168
+ --tone: var(--forge-ink-muted);
169
+ background: color-mix(in oklab, var(--tone) 13%, transparent);
170
+ color: color-mix(in oklab, var(--tone) 72%, var(--forge-ink));
171
+ box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tone) 28%, transparent);
172
+ border-radius: min(var(--forge-radius-control), 999px);
173
+ }
174
+ .forge-alert {
175
+ --tone: var(--forge-info);
176
+ background: color-mix(in oklab, var(--tone) 10%, var(--forge-surface));
177
+ color: color-mix(in oklab, var(--tone) 65%, var(--forge-ink));
178
+ border: 1px solid color-mix(in oklab, var(--tone) 30%, transparent);
179
+ border-radius: var(--forge-radius-control);
180
+ }
181
+ .forge-alert[data-forge-alert="error"] { --tone: var(--forge-danger); }
182
+ .forge-alert[data-forge-alert="success"] { --tone: var(--forge-success); }
183
+
184
+ .forge-banner { background: color-mix(in oklab, var(--forge-accent) 22%, var(--forge-surface)); color: var(--forge-ink); }
185
+
186
+ /* Views: board, calendar, map; inline editing; command palette */
187
+ .forge-board-column { border-radius: var(--forge-radius); }
188
+ .forge-calendar-item { background: color-mix(in oklab, var(--forge-primary) 14%, var(--forge-surface)); color: color-mix(in oklab, var(--forge-primary) 70%, var(--forge-ink)); }
189
+ .forge-calendar-item:hover { background: color-mix(in oklab, var(--forge-primary) 24%, var(--forge-surface)); }
190
+ .forge-map { background: light-dark(#e8eef2, #1b1f24); border-radius: 0 0 var(--forge-radius) var(--forge-radius); }
191
+ :root[data-forge-mode="dark"] .forge-map-tiles { filter: brightness(0.72) contrast(1.1) saturate(0.8); }
192
+ @media (prefers-color-scheme: dark) { :root[data-forge-mode="system"] .forge-map-tiles { filter: brightness(0.72) contrast(1.1) saturate(0.8); } }
193
+ .forge-map-pin { color: var(--forge-primary); filter: drop-shadow(0 1px 1px rgb(0 0 0 / 0.35)); }
194
+ .forge-map-cluster { background: var(--forge-primary); color: var(--forge-primary-fg); box-shadow: 0 0 0 4px color-mix(in oklab, var(--forge-primary) 30%, transparent); }
195
+ .forge-map-control { background: var(--forge-surface); color: var(--forge-ink); border: 1px solid var(--forge-line); }
196
+ .forge-map-control:hover { background: var(--forge-hover); }
197
+ .forge-cell-editable { border-radius: var(--forge-radius-control); cursor: text; }
198
+ .forge-cell-editable:hover { box-shadow: inset 0 0 0 1px var(--forge-line-strong); }
199
+ .forge-cell-editable:focus-visible { outline: 2px solid var(--forge-primary); outline-offset: -2px; }
200
+ .forge-cell-error { box-shadow: inset 0 0 0 1px var(--forge-danger); }
201
+ .forge-palette-item[aria-selected="true"] { background: var(--forge-selected); color: var(--forge-ink); }
202
+ }
203
+
204
+ /* ── shadow: borderless cards on soft layered shadows ─────────────────────────────────────────── */
205
+ @layer components {
206
+ [data-forge-style="shadow"] {
207
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-primary) 3%, #f2f3f6), #0a0a0d);
208
+ --forge-card-shadow: 0 1px 2px light-dark(rgb(16 24 40 / 0.04), rgb(0 0 0 / 0.4)), 0 12px 32px -12px light-dark(rgb(16 24 40 / 0.16), rgb(0 0 0 / 0.7));
209
+ }
210
+ [data-forge-style="shadow"] .forge-card { border-color: transparent; }
211
+ [data-forge-style="shadow"] .forge-sidebar { background: var(--forge-surface); border-right-color: transparent; box-shadow: 1px 0 0 var(--forge-line), 8px 0 32px -16px rgb(0 0 0 / 0.12); }
212
+ [data-forge-style="shadow"] .forge-input { border-color: transparent; background: var(--forge-surface-muted); box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.06); }
213
+ [data-forge-style="shadow"] .forge-input:focus { background: var(--forge-surface); box-shadow: 0 0 0 3px var(--forge-focus), 0 4px 12px -4px rgb(0 0 0 / 0.15); }
214
+ [data-forge-style="shadow"] .forge-btn-primary { box-shadow: 0 8px 20px -8px color-mix(in oklab, var(--forge-primary) 70%, transparent); }
215
+ [data-forge-style="shadow"] .forge-btn-primary:hover:not(:disabled) { transform: translateY(-1px); }
216
+ [data-forge-style="shadow"] .forge-btn-secondary { border-color: transparent; box-shadow: 0 1px 2px rgb(0 0 0 / 0.06), 0 4px 12px -6px rgb(0 0 0 / 0.2); }
217
+ [data-forge-style="shadow"] .forge-nav-item[aria-current="page"] { background: var(--forge-surface); box-shadow: 0 4px 14px -6px rgb(0 0 0 / 0.2); }
218
+ [data-forge-style="shadow"] .forge-table thead tr { border-bottom-color: transparent; }
219
+ }
220
+
221
+ /* ── neumorphism: soft extruded surfaces the same colour as the page ──────────────────────────── */
222
+ @layer components {
223
+ [data-forge-style="neumorphism"] {
224
+ --neu-base: light-dark(color-mix(in oklab, var(--forge-primary) 4%, #e6e9ef), color-mix(in oklab, var(--forge-primary) 5%, #262a31));
225
+ --neu-light: light-dark(rgb(255 255 255 / 0.9), rgb(255 255 255 / 0.05));
226
+ --neu-dark: light-dark(rgb(150 162 184 / 0.55), rgb(0 0 0 / 0.5));
227
+ --forge-canvas: var(--neu-base);
228
+ --forge-surface: var(--neu-base);
229
+ --forge-surface-muted: var(--neu-base);
230
+ --forge-line: light-dark(rgb(150 162 184 / 0.25), rgb(255 255 255 / 0.05));
231
+ --forge-ink-muted: light-dark(#4a5361, #aab1bd);
232
+ --forge-hover: light-dark(rgb(150 162 184 / 0.15), rgb(255 255 255 / 0.04));
233
+ --forge-card-shadow: 9px 9px 18px var(--neu-dark), -9px -9px 18px var(--neu-light);
234
+ }
235
+ [data-forge-style="neumorphism"] .forge-card { border-color: transparent; }
236
+ [data-forge-style="neumorphism"] .forge-sidebar { border-right-color: transparent; box-shadow: 6px 0 16px -6px var(--neu-dark); }
237
+ [data-forge-style="neumorphism"] .forge-topbar { background: var(--neu-base); border-bottom-color: transparent; box-shadow: 0 6px 16px -8px var(--neu-dark); }
238
+ [data-forge-style="neumorphism"] .forge-input,
239
+ [data-forge-style="neumorphism"] .forge-switch {
240
+ background: var(--neu-base);
241
+ border-color: transparent;
242
+ box-shadow: inset 4px 4px 8px var(--neu-dark), inset -4px -4px 8px var(--neu-light);
243
+ }
244
+ [data-forge-style="neumorphism"] .forge-input:focus { box-shadow: inset 4px 4px 8px var(--neu-dark), inset -4px -4px 8px var(--neu-light), 0 0 0 2px var(--forge-focus); }
245
+ [data-forge-style="neumorphism"] .forge-switch[aria-checked="true"] { background: var(--forge-primary); }
246
+ [data-forge-style="neumorphism"] .forge-btn-secondary,
247
+ [data-forge-style="neumorphism"] .forge-btn-ghost[aria-current="page"],
248
+ [data-forge-style="neumorphism"] .forge-nav-item[aria-current="page"] {
249
+ background: var(--neu-base);
250
+ border-color: transparent;
251
+ box-shadow: 5px 5px 10px var(--neu-dark), -5px -5px 10px var(--neu-light);
252
+ }
253
+ [data-forge-style="neumorphism"] .forge-btn-primary,
254
+ [data-forge-style="neumorphism"] .forge-btn-danger,
255
+ [data-forge-style="neumorphism"] .forge-logo { box-shadow: 5px 5px 10px var(--neu-dark), -5px -5px 10px var(--neu-light); }
256
+ [data-forge-style="neumorphism"] .forge-btn:active:not(:disabled) { box-shadow: inset 4px 4px 8px var(--neu-dark), inset -4px -4px 8px var(--neu-light); }
257
+ [data-forge-style="neumorphism"] .forge-nav-item[aria-current="page"] { color: var(--forge-primary); }
258
+ [data-forge-style="neumorphism"] .forge-popover,
259
+ [data-forge-style="neumorphism"] .forge-dialog { background: var(--neu-base); border-color: transparent; box-shadow: 12px 12px 28px var(--neu-dark), -12px -12px 28px var(--neu-light); }
260
+ [data-forge-style="neumorphism"] .forge-badge { box-shadow: 2px 2px 4px var(--neu-dark), -2px -2px 4px var(--neu-light); }
261
+ }
262
+
263
+ /* ── glassmorphism: frosted panels over a colourful backdrop ──────────────────────────────────── */
264
+ @layer components {
265
+ [data-forge-style="glassmorphism"] {
266
+ --glass: light-dark(rgb(255 255 255 / 0.52), rgb(22 22 32 / 0.55));
267
+ --glass-strong: light-dark(rgb(255 255 255 / 0.72), rgb(22 22 32 / 0.78));
268
+ --glass-edge: light-dark(rgb(255 255 255 / 0.7), rgb(255 255 255 / 0.12));
269
+ --forge-surface: var(--glass);
270
+ --forge-surface-muted: var(--glass);
271
+ --forge-line: light-dark(rgb(255 255 255 / 0.55), rgb(255 255 255 / 0.1));
272
+ --forge-line-strong: light-dark(rgb(255 255 255 / 0.8), rgb(255 255 255 / 0.18));
273
+ --forge-hover: light-dark(rgb(255 255 255 / 0.4), rgb(255 255 255 / 0.07));
274
+ --forge-selected: light-dark(rgb(255 255 255 / 0.6), rgb(255 255 255 / 0.12));
275
+ --forge-ink-muted: light-dark(#3f3f46, #c4c4cc);
276
+ --forge-card-shadow: 0 8px 32px -8px light-dark(rgb(31 38 135 / 0.18), rgb(0 0 0 / 0.6));
277
+ }
278
+ [data-forge-style="glassmorphism"] .forge-app-bg,
279
+ :root[data-forge-style="glassmorphism"] body {
280
+ background:
281
+ radial-gradient(40rem 30rem at 12% 8%, color-mix(in oklab, var(--forge-primary) 55%, transparent), transparent 70%),
282
+ radial-gradient(36rem 28rem at 88% 18%, color-mix(in oklab, var(--forge-accent) 50%, transparent), transparent 70%),
283
+ radial-gradient(44rem 34rem at 55% 100%, color-mix(in oklab, var(--forge-primary) 35%, var(--forge-accent) 25%), transparent 70%),
284
+ light-dark(#eef0f8, #0b0b14);
285
+ background-attachment: fixed;
286
+ }
287
+ [data-forge-style="glassmorphism"] .forge-card,
288
+ [data-forge-style="glassmorphism"] .forge-sidebar,
289
+ [data-forge-style="glassmorphism"] .forge-topbar,
290
+ [data-forge-style="glassmorphism"] .forge-popover,
291
+ [data-forge-style="glassmorphism"] .forge-dialog {
292
+ background: var(--glass);
293
+ -webkit-backdrop-filter: blur(20px) saturate(170%);
294
+ backdrop-filter: blur(20px) saturate(170%);
295
+ border-color: var(--glass-edge);
296
+ }
297
+ [data-forge-style="glassmorphism"] .forge-sidebar { border-right: 1px solid var(--glass-edge); }
298
+ [data-forge-style="glassmorphism"] .forge-popover,
299
+ [data-forge-style="glassmorphism"] .forge-dialog { background: var(--glass-strong); }
300
+ [data-forge-style="glassmorphism"] .forge-input { background: light-dark(rgb(255 255 255 / 0.6), rgb(255 255 255 / 0.06)); border-color: var(--glass-edge); }
301
+ [data-forge-style="glassmorphism"] .forge-btn-secondary { background: light-dark(rgb(255 255 255 / 0.55), rgb(255 255 255 / 0.08)); border-color: var(--glass-edge); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); }
302
+ [data-forge-style="glassmorphism"] .forge-btn-primary { box-shadow: 0 8px 24px -8px color-mix(in oklab, var(--forge-primary) 80%, transparent), inset 0 1px 0 rgb(255 255 255 / 0.3); }
303
+ [data-forge-style="glassmorphism"] .forge-overlay { background: rgb(9 9 11 / 0.25); -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }
304
+ }
305
+
306
+ /* ── skeuomorphism: tactile gradients, bevels, paper and leather ──────────────────────────────── */
307
+ @layer components {
308
+ [data-forge-style="skeuomorphism"] {
309
+ --skeu-paper-top: light-dark(#fffdf8, #2d2a26);
310
+ --skeu-paper-bottom: light-dark(#f6f2ea, #25221f);
311
+ --skeu-edge: light-dark(#d5cdbd, #45403a);
312
+ --skeu-highlight: light-dark(rgb(255 255 255 / 0.9), rgb(255 255 255 / 0.07));
313
+ --forge-canvas: light-dark(#ebe6dc, #1b1916);
314
+ --forge-surface: var(--skeu-paper-top);
315
+ --forge-line: light-dark(#e2dbcd, #3a3631);
316
+ --forge-line-strong: var(--skeu-edge);
317
+ --forge-ink: light-dark(#2b2620, #efe9df);
318
+ --forge-ink-muted: light-dark(#5e554a, #bfb6a8);
319
+ --forge-card-shadow: inset 0 1px 0 var(--skeu-highlight), 0 1px 1px rgb(0 0 0 / 0.12), 0 4px 10px -2px rgb(60 40 20 / 0.18);
320
+ }
321
+ [data-forge-style="skeuomorphism"] .forge-app-bg,
322
+ :root[data-forge-style="skeuomorphism"] body {
323
+ background-color: var(--forge-canvas);
324
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
325
+ }
326
+ [data-forge-style="skeuomorphism"] .forge-card,
327
+ [data-forge-style="skeuomorphism"] .forge-dialog,
328
+ [data-forge-style="skeuomorphism"] .forge-popover { background: linear-gradient(var(--skeu-paper-top), var(--skeu-paper-bottom)); border-color: var(--skeu-edge); }
329
+ /* Leather sidebar with stitching. */
330
+ [data-forge-style="skeuomorphism"] .forge-sidebar {
331
+ --forge-ink: #f3ede3;
332
+ --forge-ink-muted: #cfc4b3;
333
+ --forge-ink-subtle: #a2968a;
334
+ --forge-hover: rgb(255 255 255 / 0.08);
335
+ --forge-selected: rgb(255 255 255 / 0.14);
336
+ --forge-line: rgb(255 255 255 / 0.12);
337
+ background: linear-gradient(90deg, #4a3526, #3b2a1f);
338
+ border-right: 1px solid #22170f;
339
+ box-shadow: inset -1px 0 0 rgb(255 255 255 / 0.08), inset 0 0 0 5px transparent, inset -8px 0 0 -7px rgb(255 235 205 / 0.35);
340
+ }
341
+ [data-forge-style="skeuomorphism"] .forge-sidebar .forge-input { background: linear-gradient(#5a4231, #4a3526); color: #f3ede3; border-color: #22170f; box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.4); }
342
+ [data-forge-style="skeuomorphism"] .forge-sidebar .forge-nav-item[aria-current="page"] { box-shadow: inset 0 1px 3px rgb(0 0 0 / 0.45); background: rgb(0 0 0 / 0.22); }
343
+ [data-forge-style="skeuomorphism"] .forge-sidebar .forge-nav-item[aria-current="page"] svg { color: color-mix(in oklab, var(--forge-accent) 80%, white); }
344
+ [data-forge-style="skeuomorphism"] .forge-btn { text-shadow: 0 1px 0 rgb(255 255 255 / 0.4); }
345
+ [data-forge-style="skeuomorphism"] .forge-btn-primary,
346
+ [data-forge-style="skeuomorphism"] .forge-btn-danger,
347
+ [data-forge-style="skeuomorphism"] .forge-logo {
348
+ --b: var(--forge-primary);
349
+ background: linear-gradient(color-mix(in oklab, var(--b) 72%, white), var(--b) 55%, color-mix(in oklab, var(--b) 82%, black));
350
+ border-color: color-mix(in oklab, var(--b) 65%, black);
351
+ box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.35), 0 1px 2px rgb(0 0 0 / 0.3);
352
+ text-shadow: 0 -1px 0 rgb(0 0 0 / 0.3);
353
+ }
354
+ [data-forge-style="skeuomorphism"] .forge-btn-danger { --b: var(--forge-danger); }
355
+ [data-forge-style="skeuomorphism"] .forge-btn-secondary { background: linear-gradient(light-dark(#ffffff, #3a3631), light-dark(#e9e3d8, #2c2925)); border-color: var(--skeu-edge); box-shadow: inset 0 1px 0 var(--skeu-highlight), 0 1px 2px rgb(0 0 0 / 0.15); }
356
+ [data-forge-style="skeuomorphism"] .forge-btn:active:not(:disabled) { box-shadow: inset 0 2px 4px rgb(0 0 0 / 0.3); transform: translateY(1px); }
357
+ [data-forge-style="skeuomorphism"] .forge-input { background: light-dark(#fffefb, #221f1c); border-color: var(--skeu-edge); box-shadow: inset 0 2px 3px rgb(0 0 0 / 0.1), 0 1px 0 var(--skeu-highlight); }
358
+ [data-forge-style="skeuomorphism"] .forge-switch { box-shadow: inset 0 2px 4px rgb(0 0 0 / 0.3); }
359
+ [data-forge-style="skeuomorphism"] .forge-switch-thumb { background: linear-gradient(#fff, #ddd6ca); box-shadow: 0 1px 3px rgb(0 0 0 / 0.4); }
360
+ [data-forge-style="skeuomorphism"] .forge-table thead tr { background: linear-gradient(light-dark(#f7f3ec, #2f2b27), light-dark(#ece6db, #292622)); }
361
+ }
362
+
363
+ /* ── material: Material Design 3 — tonal surfaces, elevation, pill buttons ────────────────────── */
364
+ @layer components {
365
+ [data-forge-style="material"] {
366
+ --md-container: light-dark(color-mix(in oklab, var(--forge-primary) 16%, #ffffff), color-mix(in oklab, var(--forge-primary) 32%, #1c1b20));
367
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-primary) 5%, #fdfbff), color-mix(in oklab, var(--forge-primary) 8%, #121116));
368
+ --forge-surface: light-dark(color-mix(in oklab, var(--forge-primary) 3%, #fffbfe), color-mix(in oklab, var(--forge-primary) 10%, #1c1b20));
369
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-primary) 8%, #f7f2fa), color-mix(in oklab, var(--forge-primary) 12%, #1d1b22));
370
+ --forge-selected: var(--md-container);
371
+ --forge-card-shadow: 0 1px 2px light-dark(rgb(0 0 0 / 0.12), rgb(0 0 0 / 0.5)), 0 2px 6px 2px light-dark(rgb(0 0 0 / 0.06), rgb(0 0 0 / 0.3));
372
+ }
373
+ [data-forge-style="material"] .forge-card { border-color: transparent; border-radius: max(var(--forge-radius), 12px); }
374
+ [data-forge-style="material"] .forge-sidebar { border-right-color: transparent; }
375
+ [data-forge-style="material"] .forge-topbar { background: var(--forge-surface-muted); border-bottom-color: transparent; }
376
+ [data-forge-style="material"] .forge-btn { border-radius: 999px; font-weight: 500; letter-spacing: 0.01em; }
377
+ [data-forge-style="material"] .forge-btn-primary:hover:not(:disabled) { background: var(--forge-primary); box-shadow: 0 1px 2px rgb(0 0 0 / 0.3), 0 1px 3px 1px rgb(0 0 0 / 0.15); }
378
+ [data-forge-style="material"] .forge-btn-secondary { background: transparent; color: var(--forge-link); border-color: color-mix(in oklab, var(--forge-ink) 35%, transparent); }
379
+ [data-forge-style="material"] .forge-btn-secondary:hover:not(:disabled) { background: color-mix(in oklab, var(--forge-primary) 8%, transparent); }
380
+ [data-forge-style="material"] .forge-btn-ghost { color: var(--forge-link); }
381
+ [data-forge-style="material"] .forge-nav-item { border-radius: 999px; }
382
+ [data-forge-style="material"] .forge-nav-item[aria-current="page"] { background: var(--md-container); font-weight: 600; }
383
+ /* Filled text fields. */
384
+ [data-forge-style="material"] .forge-input {
385
+ background: light-dark(color-mix(in oklab, var(--forge-primary) 6%, #ece6f0), color-mix(in oklab, var(--forge-primary) 10%, #2a2830));
386
+ border: 0;
387
+ border-bottom: 1px solid var(--forge-ink-muted);
388
+ border-radius: 6px 6px 0 0;
389
+ }
390
+ [data-forge-style="material"] .forge-input:focus { box-shadow: inset 0 -2px 0 var(--forge-primary); border-bottom-color: var(--forge-primary); }
391
+ [data-forge-style="material"] .forge-dialog { border-radius: 28px; border-color: transparent; background: var(--forge-surface-muted); }
392
+ [data-forge-style="material"] .forge-popover { border-color: transparent; border-radius: 4px; box-shadow: 0 2px 6px 2px rgb(0 0 0 / 0.15), 0 1px 2px rgb(0 0 0 / 0.3); }
393
+ [data-forge-style="material"] .forge-badge { border-radius: 8px; box-shadow: none; }
394
+ [data-forge-style="material"] .forge-switch { height: 1.75rem; }
395
+ }
396
+
397
+ /* ── Shared polish: headings, forms, cards, chips, skeletons, toasts, brand panel ─────────────── */
398
+ @layer components {
399
+ .forge-heading { font-family: var(--forge-font-display); }
400
+ .forge-form { background: var(--forge-surface); padding: var(--forge-pad-card-lg); display: flex; flex-direction: column; gap: var(--forge-gap-form); }
401
+ .forge-card-interactive { transition: transform 180ms var(--forge-ease), box-shadow 180ms var(--forge-ease); }
402
+ .forge-card-interactive:hover, .forge-focusable:focus-visible .forge-card-interactive { transform: translateY(-2px); box-shadow: var(--forge-card-shadow-hover); }
403
+ .forge-chip {
404
+ color: var(--forge-link);
405
+ background: color-mix(in oklab, var(--forge-primary) 13%, transparent);
406
+ box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--forge-primary) 22%, transparent);
407
+ border-radius: calc(var(--forge-radius-control) + 2px);
408
+ }
409
+ .forge-metric { position: relative; overflow: hidden; }
410
+ .forge-metric::after {
411
+ content: "";
412
+ position: absolute;
413
+ inset: auto -30% -60% auto;
414
+ width: 60%;
415
+ aspect-ratio: 1;
416
+ border-radius: 999px;
417
+ background: radial-gradient(closest-side, color-mix(in oklab, var(--forge-accent) 16%, transparent), transparent);
418
+ pointer-events: none;
419
+ }
420
+ .forge-avatar { background: color-mix(in oklab, var(--forge-primary) 16%, var(--forge-surface)); color: var(--forge-ink); border-radius: 999px; }
421
+ .forge-logo-image { border-radius: calc(var(--forge-radius-control) + 1px); }
422
+ .forge-illustration { width: 7.5rem; height: auto; }
423
+
424
+ .forge-skeleton {
425
+ background: color-mix(in oklab, var(--forge-ink) 9%, transparent);
426
+ border-radius: calc(var(--forge-radius-control) - 2px);
427
+ animation: forge-pulse 1.6s ease-in-out infinite;
428
+ }
429
+ .forge-toast {
430
+ background: var(--forge-surface);
431
+ color: var(--forge-ink);
432
+ border: 1px solid var(--forge-line);
433
+ border-radius: var(--forge-radius-control);
434
+ box-shadow: 0 16px 40px -12px rgb(0 0 0 / 0.3);
435
+ animation: forge-toast-in 220ms var(--forge-ease);
436
+ }
437
+ .forge-toast[data-forge-toast="success"] .forge-toast-icon { color: var(--forge-success); }
438
+ .forge-toast[data-forge-toast="error"] { border-color: color-mix(in oklab, var(--forge-danger) 45%, var(--forge-line)); }
439
+ .forge-toast[data-forge-toast="error"] .forge-toast-icon { color: var(--forge-danger); }
440
+ .forge-toast[data-forge-toast="info"] .forge-toast-icon { color: var(--forge-info); }
441
+
442
+ .forge-enter { animation: forge-enter 320ms var(--forge-ease) both; }
443
+ .forge-pop { animation: forge-enter 160ms var(--forge-ease) both; }
444
+ .forge-stagger > * { animation: forge-enter 360ms var(--forge-ease) both; }
445
+ .forge-stagger > :nth-child(2) { animation-delay: 40ms; }
446
+ .forge-stagger > :nth-child(3) { animation-delay: 80ms; }
447
+ .forge-stagger > :nth-child(4) { animation-delay: 120ms; }
448
+ .forge-stagger > :nth-child(n + 5) { animation-delay: 160ms; }
449
+ .forge-drawer { animation: forge-drawer-in 200ms var(--forge-ease); }
450
+
451
+ .forge-skip-link {
452
+ position: fixed; top: 0.5rem; left: 0.5rem; z-index: 70;
453
+ padding: 0.5rem 0.875rem; border-radius: var(--forge-radius-control);
454
+ background: var(--forge-primary); color: var(--forge-primary-fg); font-size: 0.875rem; font-weight: 500;
455
+ transform: translateY(-200%);
456
+ }
457
+ .forge-skip-link:focus { transform: none; outline: var(--forge-ring); outline-offset: 2px; }
458
+
459
+ .forge-topnav-links { scrollbar-width: none; }
460
+ .forge-topnav-links::-webkit-scrollbar { display: none; }
461
+
462
+ /* Compact icon rail: icons with tooltips while collapsed; its toggle expands it into a full sidebar. */
463
+ .forge-rail { transition: width 180ms var(--forge-ease); }
464
+ .forge-rail-offset { transition: padding-left 180ms var(--forge-ease); }
465
+ .forge-rail .forge-nav-label, .forge-rail .forge-rail-extra { transition: opacity 140ms; }
466
+ /* Labels stay in the accessibility tree (they name the links); only their pixels are hidden. */
467
+ .forge-rail:not([data-expanded="true"]) .forge-nav-label { opacity: 0; }
468
+ .forge-rail:not([data-expanded="true"]) .forge-rail-extra { opacity: 0; visibility: hidden; }
469
+
470
+ /* Tooltip beside the rail. The anchor's left padding bridges the gap so the pointer can move onto it. */
471
+ .forge-tooltip-anchor { position: fixed; z-index: 60; transform: translateY(-50%); padding-left: 0.5rem; display: flex; }
472
+ .forge-tooltip {
473
+ background: var(--forge-ink);
474
+ color: var(--forge-surface);
475
+ border-radius: var(--forge-radius-control);
476
+ box-shadow: 0 8px 24px -8px rgb(0 0 0 / 0.3);
477
+ font-size: 0.75rem;
478
+ line-height: 1rem;
479
+ font-weight: 500;
480
+ padding: 0.375rem 0.625rem;
481
+ max-width: 16rem;
482
+ white-space: nowrap;
483
+ overflow: hidden;
484
+ text-overflow: ellipsis;
485
+ animation: forge-tooltip-in 120ms var(--forge-ease);
486
+ }
487
+
488
+ /* Auth brand panel: gradient mesh from the brand colours, kept dark enough for white text (AA). */
489
+ .forge-auth-brand {
490
+ color: #ffffff;
491
+ background:
492
+ linear-gradient(to top, rgb(0 0 0 / 0.5), transparent 55%),
493
+ radial-gradient(38rem 30rem at var(--mesh-a-x, 15%) var(--mesh-a-y, 10%), color-mix(in oklab, var(--forge-primary) 70%, transparent), transparent 70%),
494
+ radial-gradient(30rem 26rem at var(--mesh-b-x, 85%) var(--mesh-b-y, 30%), color-mix(in oklab, var(--forge-accent) 45%, transparent), transparent 70%),
495
+ radial-gradient(40rem 30rem at var(--mesh-c-x, 40%) 110%, color-mix(in oklab, var(--forge-primary) 55%, var(--forge-accent) 20%), transparent 70%),
496
+ color-mix(in oklab, var(--forge-primary) 38%, #0b0b12);
497
+ }
498
+ .forge-auth-copy { text-shadow: 0 1px 12px rgb(0 0 0 / 0.35); }
499
+ .forge-auth-mark.forge-logo { background: rgb(255 255 255 / 0.16); color: #fff; box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.3); }
500
+ .forge-auth-brand .forge-heading { font-family: var(--forge-font-display); }
501
+ }
502
+
503
+ @keyframes forge-pulse { 50% { opacity: 0.5; } }
504
+ @keyframes forge-tooltip-in { from { opacity: 0; transform: translateX(-4px); } }
505
+ @keyframes forge-enter { from { opacity: 0; transform: translateY(6px); } }
506
+ @keyframes forge-toast-in { from { opacity: 0; transform: translateY(-8px) scale(0.98); } }
507
+ @keyframes forge-drawer-in { from { transform: translateX(-100%); } }
508
+ @keyframes forge-aurora {
509
+ 0% { transform: translate3d(0, 0, 0) rotate(0deg) scale(1); }
510
+ 50% { transform: translate3d(-4%, 3%, 0) rotate(8deg) scale(1.08); }
511
+ 100% { transform: translate3d(3%, -2%, 0) rotate(-6deg) scale(1.02); }
512
+ }
513
+
514
+ /* ── brutalist: thick borders, hard offset shadows, bold type ─────────────────────────────────── */
515
+ @layer components {
516
+ [data-forge-style="brutalist"] {
517
+ --brut-ink: light-dark(#0a0a0a, #f5f5f4);
518
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-accent) 10%, #fffbeb), #121212);
519
+ --forge-surface: light-dark(#ffffff, #1c1c1c);
520
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-accent) 16%, #fffdf5), #171717);
521
+ --forge-line: var(--brut-ink);
522
+ --forge-line-strong: var(--brut-ink);
523
+ --forge-ink: light-dark(#0a0a0a, #fafaf9);
524
+ --forge-ink-muted: light-dark(#262626, #d6d3d1);
525
+ --forge-ink-subtle: light-dark(#525252, #a8a29e);
526
+ --forge-hover: color-mix(in oklab, var(--forge-accent) 30%, transparent);
527
+ --forge-selected: var(--forge-accent);
528
+ --forge-card-shadow: 5px 5px 0 var(--brut-ink);
529
+ --forge-card-shadow-hover: 8px 8px 0 var(--brut-ink);
530
+ --forge-ring: 3px solid var(--brut-ink);
531
+ --forge-ring-offset: 3px;
532
+ }
533
+ [data-forge-style="brutalist"] .forge-card,
534
+ [data-forge-style="brutalist"] .forge-dialog,
535
+ [data-forge-style="brutalist"] .forge-popover,
536
+ [data-forge-style="brutalist"] .forge-toast { border: 2px solid var(--brut-ink); box-shadow: var(--forge-card-shadow); }
537
+ [data-forge-style="brutalist"] .forge-card-interactive:hover { transform: translate(-3px, -3px); }
538
+ [data-forge-style="brutalist"] .forge-sidebar { background: var(--forge-surface); border-right: 2px solid var(--brut-ink); }
539
+ [data-forge-style="brutalist"] .forge-topbar { border-bottom: 2px solid var(--brut-ink); }
540
+ [data-forge-style="brutalist"] .forge-heading { font-weight: 800; letter-spacing: -0.03em; }
541
+ [data-forge-style="brutalist"] .forge-btn { border: 2px solid var(--brut-ink); font-weight: 700; box-shadow: 3px 3px 0 var(--brut-ink); transition: transform 80ms, box-shadow 80ms, background-color 120ms; }
542
+ [data-forge-style="brutalist"] .forge-btn-ghost { border-color: transparent; box-shadow: none; }
543
+ [data-forge-style="brutalist"] .forge-btn:hover:not(:disabled) { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--brut-ink); }
544
+ [data-forge-style="brutalist"] .forge-btn-ghost:hover:not(:disabled) { box-shadow: none; transform: none; }
545
+ [data-forge-style="brutalist"] .forge-btn:active:not(:disabled) { transform: translate(3px, 3px); box-shadow: none; }
546
+ [data-forge-style="brutalist"] .forge-btn-primary:hover:not(:disabled) { background: var(--forge-primary); }
547
+ [data-forge-style="brutalist"] .forge-input { border: 2px solid var(--brut-ink); }
548
+ [data-forge-style="brutalist"] .forge-input:focus { box-shadow: 3px 3px 0 var(--forge-primary); border-color: var(--brut-ink); }
549
+ [data-forge-style="brutalist"] .forge-nav-item { font-weight: 600; border: 2px solid transparent; }
550
+ [data-forge-style="brutalist"] .forge-nav-item[aria-current="page"] { background: var(--forge-accent); color: var(--forge-accent-fg); border-color: var(--brut-ink); box-shadow: 3px 3px 0 var(--brut-ink); }
551
+ [data-forge-style="brutalist"] .forge-nav-item[aria-current="page"] svg { color: currentColor; }
552
+ [data-forge-style="brutalist"] .forge-table thead tr { background: var(--forge-accent); color: var(--forge-accent-fg); border-bottom: 2px solid var(--brut-ink); }
553
+ [data-forge-style="brutalist"] .forge-table tbody tr { border-top-width: 2px; }
554
+ [data-forge-style="brutalist"] .forge-badge { box-shadow: none; border: 1.5px solid var(--brut-ink); color: var(--forge-ink); background: color-mix(in oklab, var(--tone) 22%, var(--forge-surface)); }
555
+ [data-forge-style="brutalist"] .forge-chip { background: var(--forge-accent); color: var(--forge-accent-fg); box-shadow: 2px 2px 0 var(--brut-ink); border: 2px solid var(--brut-ink); }
556
+ [data-forge-style="brutalist"] .forge-logo { border: 2px solid var(--brut-ink); box-shadow: 2px 2px 0 var(--brut-ink); }
557
+ [data-forge-style="brutalist"] .forge-skeleton { background: color-mix(in oklab, var(--brut-ink) 14%, transparent); }
558
+ [data-forge-style="brutalist"] .forge-metric::after { display: none; }
559
+ }
560
+
561
+ /* ── editorial: paper tones, serif display, hairlines, generous whitespace ────────────────────── */
562
+ @layer components {
563
+ [data-forge-style="editorial"] {
564
+ --forge-canvas: light-dark(#f7f4ee, #151412);
565
+ --forge-surface: light-dark(#fffdf9, #1c1a17);
566
+ --forge-surface-muted: light-dark(#f1ede4, #191714);
567
+ --forge-line: light-dark(#e4ddd0, rgb(255 255 255 / 0.1));
568
+ --forge-line-strong: light-dark(#cfc6b6, rgb(255 255 255 / 0.2));
569
+ --forge-ink: light-dark(#1f1b16, #ede7dd);
570
+ --forge-ink-muted: light-dark(#5b5347, #b3aa9c);
571
+ --forge-ink-subtle: light-dark(#736b5e, #9a9184);
572
+ --forge-hover: light-dark(rgb(31 27 22 / 0.045), rgb(255 255 255 / 0.05));
573
+ --forge-selected: transparent;
574
+ --forge-card-shadow: none;
575
+ --forge-card-shadow-hover: 0 1px 0 var(--forge-ink);
576
+ --forge-pad-card: 1.5rem;
577
+ --forge-pad-card-lg: 2rem;
578
+ --forge-main-y: 3rem;
579
+ --forge-ring: 1.5px solid var(--forge-ink);
580
+ --forge-ring-offset: 3px;
581
+ }
582
+ :root[data-forge-style="editorial"][data-forge-density="compact"] { --forge-pad-card: 1rem; --forge-pad-card-lg: 1.25rem; --forge-main-y: 1.75rem; }
583
+ [data-forge-style="editorial"] .forge-card { border-radius: min(var(--forge-radius), 6px); }
584
+ [data-forge-style="editorial"] .forge-sidebar { background: var(--forge-canvas); }
585
+ [data-forge-style="editorial"] .forge-topbar { background: var(--forge-canvas); border-bottom-color: var(--forge-ink); }
586
+ [data-forge-style="editorial"] .forge-heading { font-weight: 600; letter-spacing: -0.015em; }
587
+ [data-forge-style="editorial"] .forge-nav-item[aria-current="page"] { background: transparent; color: var(--forge-ink); font-weight: 600; box-shadow: inset 2px 0 0 var(--forge-primary); border-radius: 0; }
588
+ [data-forge-style="editorial"] .forge-topnav .forge-nav-item[aria-current="page"] { box-shadow: inset 0 -2px 0 var(--forge-primary); }
589
+ [data-forge-style="editorial"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-ink); }
590
+ [data-forge-style="editorial"] .forge-btn { letter-spacing: 0.01em; }
591
+ [data-forge-style="editorial"] .forge-btn-secondary { background: transparent; border-color: var(--forge-ink); }
592
+ [data-forge-style="editorial"] .forge-input { background: transparent; }
593
+ [data-forge-style="editorial"] .forge-table thead tr { border-bottom: 1px solid var(--forge-ink); letter-spacing: 0.08em; }
594
+ [data-forge-style="editorial"] .forge-chip { background: transparent; box-shadow: inset 0 0 0 1px var(--forge-line-strong); color: var(--forge-ink); border-radius: 999px; }
595
+ [data-forge-style="editorial"] .forge-metric::after { display: none; }
596
+ [data-forge-style="editorial"] .forge-metric-value { font-weight: 500; }
597
+ [data-forge-style="editorial"] .forge-badge { box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tone) 40%, transparent); background: transparent; }
598
+ }
599
+
600
+ /* ── aurora: slowly drifting gradient mesh from the brand colours, glassy cards ───────────────── */
601
+ @layer components {
602
+ [data-forge-style="aurora"] {
603
+ --aurora-glass: light-dark(rgb(255 255 255 / 0.66), rgb(18 18 30 / 0.62));
604
+ --aurora-edge: light-dark(rgb(255 255 255 / 0.75), rgb(255 255 255 / 0.1));
605
+ --forge-canvas: light-dark(#f3f3fb, #07070d);
606
+ --forge-surface: var(--aurora-glass);
607
+ --forge-surface-muted: light-dark(rgb(255 255 255 / 0.45), rgb(255 255 255 / 0.04));
608
+ --forge-line: light-dark(rgb(24 24 27 / 0.08), rgb(255 255 255 / 0.09));
609
+ --forge-line-strong: light-dark(rgb(24 24 27 / 0.16), rgb(255 255 255 / 0.18));
610
+ --forge-ink-muted: light-dark(#3f3f46, #c4c4d0);
611
+ --forge-ink-subtle: light-dark(#5b5b66, #9a9aac);
612
+ --forge-hover: light-dark(rgb(255 255 255 / 0.5), rgb(255 255 255 / 0.06));
613
+ --forge-selected: light-dark(rgb(255 255 255 / 0.75), rgb(255 255 255 / 0.1));
614
+ --forge-card-shadow: 0 10px 40px -16px light-dark(color-mix(in oklab, var(--forge-primary) 45%, transparent), rgb(0 0 0 / 0.7));
615
+ --forge-card-shadow-hover: 0 18px 50px -16px light-dark(color-mix(in oklab, var(--forge-primary) 55%, transparent), rgb(0 0 0 / 0.8));
616
+ }
617
+ [data-forge-style="aurora"] .forge-app-bg { position: relative; isolation: isolate; background: var(--forge-canvas); }
618
+ [data-forge-style="aurora"] .forge-app-bg::before {
619
+ content: "";
620
+ position: fixed;
621
+ inset: -20%;
622
+ z-index: -1;
623
+ pointer-events: none;
624
+ background:
625
+ radial-gradient(34% 40% at 20% 20%, color-mix(in oklab, var(--forge-primary) 55%, transparent), transparent 70%),
626
+ radial-gradient(30% 36% at 80% 25%, color-mix(in oklab, var(--forge-accent) 45%, transparent), transparent 70%),
627
+ radial-gradient(40% 40% at 60% 85%, color-mix(in oklab, var(--forge-primary) 35%, var(--forge-accent) 30%), transparent 70%);
628
+ filter: blur(40px) saturate(120%);
629
+ opacity: 0.6;
630
+ animation: forge-aurora 28s ease-in-out infinite alternate;
631
+ will-change: transform;
632
+ }
633
+ [data-forge-style="aurora"] .forge-card,
634
+ [data-forge-style="aurora"] .forge-sidebar,
635
+ [data-forge-style="aurora"] .forge-topbar,
636
+ [data-forge-style="aurora"] .forge-popover,
637
+ [data-forge-style="aurora"] .forge-dialog,
638
+ [data-forge-style="aurora"] .forge-toast {
639
+ background: var(--aurora-glass);
640
+ -webkit-backdrop-filter: blur(18px) saturate(160%);
641
+ backdrop-filter: blur(18px) saturate(160%);
642
+ border-color: var(--aurora-edge);
643
+ }
644
+ [data-forge-style="aurora"] .forge-popover,
645
+ [data-forge-style="aurora"] .forge-dialog { background: light-dark(rgb(255 255 255 / 0.86), rgb(18 18 30 / 0.88)); }
646
+ [data-forge-style="aurora"] .forge-sidebar { border-right-color: var(--aurora-edge); }
647
+ [data-forge-style="aurora"] .forge-btn-primary {
648
+ background: linear-gradient(135deg, var(--forge-primary), color-mix(in oklab, var(--forge-primary) 70%, var(--forge-accent)));
649
+ box-shadow: 0 8px 24px -10px var(--forge-primary), inset 0 1px 0 rgb(255 255 255 / 0.25);
650
+ }
651
+ [data-forge-style="aurora"] .forge-input { background: light-dark(rgb(255 255 255 / 0.7), rgb(255 255 255 / 0.05)); }
652
+ [data-forge-style="aurora"] .forge-chip { background: linear-gradient(135deg, color-mix(in oklab, var(--forge-primary) 22%, transparent), color-mix(in oklab, var(--forge-accent) 22%, transparent)); }
653
+ }
654
+
655
+ /* ── terminal: dark-first, monospace, phosphor accents (no scanlines, no flicker) ─────────────── */
656
+ @layer components {
657
+ [data-forge-style="terminal"] {
658
+ --forge-canvas: light-dark(#f4f7f2, #070b08);
659
+ --forge-surface: light-dark(#ffffff, #0d140e);
660
+ --forge-surface-muted: light-dark(#eef3ec, #0a100b);
661
+ --forge-line: light-dark(#cfdccb, #1d3522);
662
+ --forge-line-strong: light-dark(#a9bfa4, #2c5233);
663
+ --forge-ink: light-dark(#0f2413, #d7f5dc);
664
+ --forge-ink-muted: light-dark(#35573b, #8fcf9a);
665
+ --forge-ink-subtle: light-dark(#4f7355, #6fae7a);
666
+ --forge-hover: light-dark(rgb(22 101 52 / 0.07), rgb(134 239 172 / 0.06));
667
+ --forge-selected: color-mix(in oklab, var(--forge-primary) 18%, transparent);
668
+ --forge-link: light-dark(color-mix(in oklab, var(--forge-primary) 80%, black), color-mix(in oklab, var(--forge-primary) 55%, white));
669
+ --forge-card-shadow: none;
670
+ --forge-card-shadow-hover: 0 0 0 1px var(--forge-primary), 0 0 24px -8px var(--forge-primary);
671
+ --forge-ring: 2px dashed var(--forge-link);
672
+ font-variant-ligatures: none;
673
+ }
674
+ [data-forge-style="terminal"] .forge-card { border-radius: 4px; }
675
+ [data-forge-style="terminal"] .forge-heading { letter-spacing: -0.02em; }
676
+ [data-forge-style="terminal"] h1.forge-heading::before { content: "> " / ""; color: var(--forge-link); }
677
+ [data-forge-style="terminal"] .forge-btn { text-transform: uppercase; letter-spacing: 0.06em; font-size: 0.75rem; }
678
+ [data-forge-style="terminal"] .forge-btn-primary { box-shadow: 0 0 0 1px var(--forge-primary), 0 0 16px -6px var(--forge-primary); }
679
+ [data-forge-style="terminal"] .forge-btn-secondary { background: transparent; border-color: var(--forge-line-strong); }
680
+ [data-forge-style="terminal"] .forge-nav-item[aria-current="page"] { color: var(--forge-link); background: var(--forge-selected); box-shadow: inset 2px 0 0 var(--forge-link); }
681
+ [data-forge-style="terminal"] .forge-nav-item[aria-current="page"] svg { color: var(--forge-link); }
682
+ [data-forge-style="terminal"] .forge-input { background: var(--forge-surface-muted); caret-color: var(--forge-link); }
683
+ [data-forge-style="terminal"] .forge-table thead tr { color: var(--forge-link); }
684
+ [data-forge-style="terminal"] .forge-chip { background: transparent; box-shadow: inset 0 0 0 1px var(--forge-line-strong); border-radius: 3px; }
685
+ [data-forge-style="terminal"] .forge-metric::after { display: none; }
686
+ [data-forge-style="terminal"] .forge-metric-value { color: var(--forge-link); }
687
+ [data-forge-style="terminal"] .forge-logo { border-radius: 3px; }
688
+ [data-forge-style="terminal"] .forge-badge { border-radius: 3px; }
689
+ }
690
+
691
+ /* ── clay: claymorphism — puffy rounded surfaces, inner highlights ─────────────────────────────── */
692
+ @layer components {
693
+ [data-forge-style="clay"] {
694
+ --clay-hi: light-dark(rgb(255 255 255 / 0.95), rgb(255 255 255 / 0.07));
695
+ --clay-lo: light-dark(color-mix(in oklab, var(--forge-primary) 12%, rgb(0 0 0 / 0.06)), rgb(0 0 0 / 0.45));
696
+ --forge-canvas: light-dark(color-mix(in oklab, var(--forge-primary) 6%, #f6f3fb), color-mix(in oklab, var(--forge-primary) 8%, #17151f));
697
+ --forge-surface: light-dark(#ffffff, color-mix(in oklab, var(--forge-primary) 6%, #24212e));
698
+ --forge-surface-muted: light-dark(color-mix(in oklab, var(--forge-primary) 5%, #f3eff9), color-mix(in oklab, var(--forge-primary) 7%, #1d1a26));
699
+ --forge-line: light-dark(color-mix(in oklab, var(--forge-primary) 10%, #ece7f3), rgb(255 255 255 / 0.07));
700
+ --forge-ink-muted: light-dark(#4b4658, #bbb5c9);
701
+ --forge-card-shadow: 0 18px 36px -14px light-dark(color-mix(in oklab, var(--forge-primary) 32%, transparent), rgb(0 0 0 / 0.65)), inset 0 -6px 12px var(--clay-lo), inset 0 4px 8px var(--clay-hi);
702
+ --forge-card-shadow-hover: 0 26px 44px -16px light-dark(color-mix(in oklab, var(--forge-primary) 40%, transparent), rgb(0 0 0 / 0.75)), inset 0 -6px 12px var(--clay-lo), inset 0 4px 8px var(--clay-hi);
703
+ }
704
+ [data-forge-style="clay"] .forge-card { border-color: transparent; border-radius: max(var(--forge-radius), 22px); }
705
+ [data-forge-style="clay"] .forge-dialog,
706
+ [data-forge-style="clay"] .forge-popover,
707
+ [data-forge-style="clay"] .forge-toast { border-color: transparent; border-radius: max(var(--forge-radius), 20px); box-shadow: var(--forge-card-shadow); }
708
+ [data-forge-style="clay"] .forge-sidebar { border-right-color: transparent; background: var(--forge-surface-muted); }
709
+ [data-forge-style="clay"] .forge-topbar { border-bottom-color: transparent; box-shadow: 0 10px 24px -18px var(--clay-lo); }
710
+ [data-forge-style="clay"] .forge-btn { border-radius: max(var(--forge-radius-control), 14px); font-weight: 600; }
711
+ [data-forge-style="clay"] .forge-btn-primary,
712
+ [data-forge-style="clay"] .forge-btn-danger { box-shadow: 0 10px 18px -8px color-mix(in oklab, var(--forge-primary) 70%, transparent), inset 0 -3px 6px rgb(0 0 0 / 0.18), inset 0 3px 6px rgb(255 255 255 / 0.35); }
713
+ [data-forge-style="clay"] .forge-btn-secondary { border-color: transparent; box-shadow: 0 6px 14px -8px var(--clay-lo), inset 0 -3px 6px var(--clay-lo), inset 0 3px 6px var(--clay-hi); }
714
+ [data-forge-style="clay"] .forge-btn:active:not(:disabled) { transform: scale(0.97); }
715
+ [data-forge-style="clay"] .forge-input { border-color: transparent; background: var(--forge-surface-muted); border-radius: max(var(--forge-radius-control), 12px); box-shadow: inset 0 3px 6px var(--clay-lo), inset 0 -2px 4px var(--clay-hi); }
716
+ [data-forge-style="clay"] .forge-input:focus { box-shadow: inset 0 3px 6px var(--clay-lo), 0 0 0 3px var(--forge-focus); }
717
+ [data-forge-style="clay"] .forge-nav-item { border-radius: max(var(--forge-radius-control), 12px); }
718
+ [data-forge-style="clay"] .forge-nav-item[aria-current="page"] { background: var(--forge-surface); box-shadow: 0 8px 16px -10px var(--clay-lo), inset 0 -3px 6px var(--clay-lo), inset 0 3px 6px var(--clay-hi); }
719
+ [data-forge-style="clay"] .forge-chip { border-radius: 14px; box-shadow: inset 0 -3px 6px color-mix(in oklab, var(--forge-primary) 20%, transparent), inset 0 3px 6px var(--clay-hi); }
720
+ [data-forge-style="clay"] .forge-logo { border-radius: 12px; box-shadow: inset 0 -3px 6px rgb(0 0 0 / 0.2), inset 0 3px 6px rgb(255 255 255 / 0.35); }
721
+ [data-forge-style="clay"] .forge-badge { border-radius: 999px; }
722
+ }
723
+
724
+ /* ── Overrides that must beat Tailwind utilities (same layer, higher specificity) ─────────────── */
725
+ @layer utilities {
726
+ .forge-table :is(th, td).px-4 { padding-block: var(--forge-cell-y); }
727
+ :root[data-forge-density="compact"] .forge-table :is(th, td).px-4 { padding-inline: var(--forge-cell-x); }
728
+ :root[data-forge-density="compact"] .forge-nav-item { padding-block: 0.25rem; }
729
+ .forge-rail .forge-nav-item { padding-inline: 0.75rem; }
730
+ .forge-rail .forge-brand-row { padding-inline: 1.125rem; }
731
+ [data-forge-style="editorial"] h1.forge-heading { font-size: 1.875rem; line-height: 2.25rem; font-weight: 600; }
732
+ [data-forge-style="brutalist"] h1.forge-heading { font-size: 1.625rem; line-height: 2rem; }
733
+ [data-forge-style="terminal"] h1.forge-heading { font-size: 1.125rem; }
734
+ }
735
+
736
+ /* ── Motion: everything decorative stops for people who ask for less motion ───────────────────── */
737
+ @media (prefers-reduced-motion: reduce) {
738
+ .forge-skeleton, .forge-toast, .forge-enter, .forge-pop, .forge-stagger > *, .forge-drawer, .forge-tooltip,
739
+ [data-forge-style="aurora"] .forge-app-bg::before { animation: none !important; }
740
+ .forge-card-interactive, .forge-rail, .forge-rail-offset, .forge-rail .forge-nav-label, .forge-rail .forge-rail-extra, .forge-btn, .forge-nav-item { transition: none !important; }
741
+ .forge-card-interactive:hover, .forge-focusable:focus-visible .forge-card-interactive,
742
+ [data-forge-style="brutalist"] .forge-btn:hover:not(:disabled), [data-forge-style="brutalist"] .forge-card-interactive:hover { transform: none; }
743
+ }
744
+
745
+ /* Top navigation: items keep their full label and the row scrolls when it overflows. */
746
+ @layer components {
747
+ .forge-topnav-links { scrollbar-width: none; mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent); }
748
+ .forge-topnav-links::-webkit-scrollbar { display: none; }
749
+ .forge-topnav-links > * { flex-shrink: 0; white-space: nowrap; }
750
+ .forge-topnav-links > * * { overflow: visible; text-overflow: clip; }
751
+ }
752
+
753
+ /* Dashboard trends: good/bad tones mixed towards the ink colour so they stay readable (AA) on every style's surface. */
754
+ @layer components {
755
+ .forge-trend { color: var(--forge-ink-muted); background: color-mix(in oklab, currentColor 10%, transparent); }
756
+ .forge-trend[data-forge-trend="good"] { color: color-mix(in oklab, light-dark(#059669, #34d399) 72%, var(--forge-ink)); }
757
+ .forge-trend[data-forge-trend="bad"] { color: color-mix(in oklab, light-dark(#dc2626, #f87171) 78%, var(--forge-ink)); }
758
+ [data-forge-style="terminal"] .forge-trend, [data-forge-style="brutalist"] .forge-trend { border-radius: 0; }
759
+ }
760
+
761
+ /* Landing page: the hero reuses the sign-in brand panel's mesh (.forge-auth-brand: white text on a dark mix, AA). */
762
+ @layer components {
763
+ .forge-landing-hero { border-radius: calc(var(--forge-radius) * 1.5); isolation: isolate; }
764
+ .forge-landing-hero :focus-visible { outline: 2px solid #ffffff; outline-offset: 3px; }
765
+ .forge-landing-cta { background: #ffffff; color: color-mix(in oklab, var(--forge-primary) 35%, #0b0b12); box-shadow: 0 10px 30px -10px rgb(0 0 0 / 0.45); }
766
+ .forge-landing-cta:hover { background: rgb(255 255 255 / 0.9); }
767
+ .forge-landing-cta-secondary { background: rgb(255 255 255 / 0.08); color: #ffffff; border-color: rgb(255 255 255 / 0.45); }
768
+ .forge-landing-cta-secondary:hover { background: rgb(255 255 255 / 0.16); }
769
+ .forge-landing-window {
770
+ border-radius: var(--forge-radius);
771
+ background: rgb(255 255 255 / 0.1);
772
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.22), 0 30px 60px -20px rgb(0 0 0 / 0.5);
773
+ backdrop-filter: blur(12px);
774
+ }
775
+ .forge-landing-window-row { border-radius: var(--forge-radius-control); background: rgb(255 255 255 / 0.08); }
776
+ [data-forge-style="brutalist"] .forge-landing-hero { border: 3px solid var(--brut-ink); box-shadow: 8px 8px 0 var(--brut-ink); }
777
+ [data-forge-style="terminal"] .forge-landing-hero { border: 1px solid var(--forge-line-strong); }
778
+ }