@utopia-studio-design/design-system-cli 0.3.0 → 0.3.1

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.
@@ -1,255 +1,215 @@
1
1
  {
2
-
3
2
  "$schema": "https://utopia-studio.co/design-system/theme.schema.json",
4
-
5
3
  "id": "dextrum",
6
-
7
4
  "name": "Dextrum",
8
-
9
5
  "type": "theme-policy",
10
-
11
6
  "locked": false,
12
-
13
- "summary": "Dextrum brand theme mapped to the Ceramic semantic contract. Ocean blue accents on dark blue surfaces with Manrope driving product UI, docs, and default headings. Clash Grotesk is reserved for explicit marketing surfaces.",
14
-
7
+ "summary": "Dextrum keeps its immutable brand anchors while using supporting charcoal and gray neutrals for a calm governance workspace. Dark is the default; Light is a plain cool-neutral canvas.",
15
8
  "sourceFiles": [
16
-
17
9
  "packages/design-system/src/themes/dextrum.css",
18
-
19
10
  "packages/design-system/src/manifests/theme-dextrum.json"
20
-
21
11
  ],
22
-
12
+ "motionProfile": "swift",
23
13
  "brandPrimitives": {
24
-
25
14
  "colors": {
26
-
27
- "darkBlue": "#192B39",
28
-
29
- "oceanBlue": "#3E8ECC",
30
-
31
- "charcoalBlue": "#2F3F4C",
32
-
33
- "matteBlack": "#141414",
34
-
35
- "timidWhite": "#EAEAEA",
36
-
37
- "logoTeal": "#063946"
38
-
15
+ "darkBlue": { "value": "#192B39", "token": "--dx-brand-dark-blue", "immutable": true, "use": "Light text and structural brand surfaces" },
16
+ "oceanBlue": { "value": "#3E8ECC", "token": "--dx-brand-ocean-blue", "immutable": true, "use": "Dark primary actions, links, focus, and current navigation" },
17
+ "oceanHover": { "value": "#4A9AD4", "token": "--dx-brand-ocean-hover", "immutable": true, "use": "Dark primary hover" },
18
+ "oceanDeep": { "value": "#26689A", "token": "--dx-brand-ocean-deep", "immutable": true, "use": "Light primary and Dark primary active" },
19
+ "logoTeal": { "value": "#063946", "token": "--dx-brand-logo-teal", "immutable": true, "use": "Logo and explicit brand expression only" },
20
+ "timidWhite": { "value": "#EAEAEA", "token": "--dx-brand-timid-white", "immutable": true, "use": "Dark foreground" },
21
+ "charcoal950": "#0E1215",
22
+ "charcoal925": "#11161A",
23
+ "charcoal900": "#171C20",
24
+ "charcoal850": "#1B2126",
25
+ "charcoal800": "#20272C",
26
+ "neutral50": "#EAEAEA",
27
+ "successDark": "#79B98E",
28
+ "successLight": "#3F7953",
29
+ "warningDark": "#D2A363",
30
+ "warningLight": "#916026",
31
+ "criticalDark": "#C86E64",
32
+ "criticalLight": "#A94F47"
39
33
  },
40
-
41
34
  "typography": {
42
-
43
35
  "marketingSales": {
44
-
45
36
  "display": "Clash Grotesk",
46
-
47
37
  "body": "Satoshi",
48
-
49
- "use": "Pitch decks, campaigns, sales collateral, and website headers"
50
-
38
+ "use": "Explicit marketing and sales surfaces only"
51
39
  },
52
-
53
40
  "appWebsite": {
54
-
55
41
  "ui": "Manrope",
56
-
57
42
  "support": "Satoshi",
58
-
59
- "use": "Product UI, dashboards, documentation, and long-form web reading"
60
-
43
+ "mono": "JetBrains Mono",
44
+ "use": "Product UI, dashboards, documentation, evidence identifiers, and long-form web reading"
61
45
  },
62
-
63
46
  "arabicFamily": "IBM Plex Sans Arabic",
64
-
65
47
  "weights": {
66
-
67
48
  "clashGrotesk": [300, 400, 500, 600, 700],
68
-
69
49
  "satoshi": [400, 500, 700],
70
-
71
- "manrope": [300, 400, 500, 600, 700, 800]
72
-
50
+ "manrope": [300, 400, 500, 600, 700, 800],
51
+ "jetBrainsMono": [400, 500, 600]
73
52
  },
74
-
75
53
  "arabicWeights": [400, 500, 700],
76
-
77
54
  "headlineCasing": "sentence",
78
-
79
55
  "headlineTracking": "-0.03em to -0.05em",
80
-
81
56
  "arabicDisplayFamily": "IBM Plex Sans Arabic",
82
-
83
57
  "arabicDisplayCasing": "none",
84
-
85
58
  "arabicDisplayRule": "Use Arabic display scale and IBM Plex Sans Arabic. Do not apply Latin negative tracking rules to Arabic.",
86
-
87
- "rationale": "Marketing type sets brand vibe; app type optimizes readability on small screens and in dark mode. Marketing display may still appear in website headers."
88
-
59
+ "rationale": "Manrope optimizes dense product UI; Satoshi supports labels; JetBrains Mono identifies evidence and records; Clash Grotesk remains marketing-only."
89
60
  },
90
-
91
61
  "geometry": {
92
-
93
62
  "surfaceRadius": "8px",
94
-
95
63
  "controlRadius": "6px",
96
-
97
- "elevation": "calm surfaces with subtle borders; restrained shadow on floating layers only"
98
-
64
+ "elevation": "Thin semantic borders establish hierarchy; shadows are reserved for floating layers."
99
65
  }
100
-
101
66
  },
102
-
103
67
  "semanticMappings": {
104
-
105
- "--background": "Dark Blue",
106
-
107
- "--foreground": "Timid White",
108
-
109
- "--primary": "Ocean Blue",
110
-
111
- "--secondary": "Charcoal Blue",
112
-
68
+ "defaultMode": "dark",
69
+ "dark": {
70
+ "--background": "#0E1215",
71
+ "--foreground": "#EAEAEA",
72
+ "--foreground-muted": "#ADB4B8",
73
+ "--foreground-subtle": "#7F898F",
74
+ "--card": "#171C20",
75
+ "--card-foreground": "#EAEAEA",
76
+ "--popover": "#1B2126",
77
+ "--popover-foreground": "#EAEAEA",
78
+ "--primary": "#3E8ECC",
79
+ "--primary-foreground": "#101619",
80
+ "--primary-hover": "#4A9AD4",
81
+ "--primary-active": "#26689A",
82
+ "--secondary": "#1B2126",
83
+ "--secondary-foreground": "#EAEAEA",
84
+ "--muted": "#171C20",
85
+ "--muted-foreground": "#909BA2",
86
+ "--accent": "#20272C",
87
+ "--accent-foreground": "#EAEAEA",
88
+ "--border": "rgb(238 240 241 / 10%)",
89
+ "--input": "rgb(238 240 241 / 15%)",
90
+ "--ring": "#3E8ECC",
91
+ "--surface": "rgb(255 255 255 / 2.8%)",
92
+ "--surface-strong": "rgb(255 255 255 / 5%)",
93
+ "--surface-elevated": "#1B2126",
94
+ "--surface-hover": "rgb(255 255 255 / 7%)",
95
+ "--overlay": "rgb(5 8 10 / 78%)",
96
+ "--modal-surface": "#1B2126",
97
+ "--popover-surface": "#1B2126",
98
+ "--sidebar": "#11161A",
99
+ "--sidebar-foreground": "#EAEAEA",
100
+ "--sidebar-primary": "#3E8ECC",
101
+ "--sidebar-primary-foreground": "#101619",
102
+ "--sidebar-accent": "rgb(62 142 204 / 12%)",
103
+ "--sidebar-accent-foreground": "#EAEAEA",
104
+ "--sidebar-border": "rgb(238 240 241 / 8%)",
105
+ "--sidebar-ring": "#3E8ECC"
106
+ },
107
+ "light": {
108
+ "--background": "#F7F7F5",
109
+ "--foreground": "#192B39",
110
+ "--foreground-muted": "#59636A",
111
+ "--foreground-subtle": "#7A8389",
112
+ "--card": "#FFFFFF",
113
+ "--card-foreground": "#192B39",
114
+ "--popover": "#FFFFFF",
115
+ "--popover-foreground": "#192B39",
116
+ "--primary": "#26689A",
117
+ "--primary-foreground": "#FFFFFF",
118
+ "--primary-hover": "#1F557E",
119
+ "--primary-active": "#194664",
120
+ "--secondary": "#F0F1EF",
121
+ "--secondary-foreground": "#192B39",
122
+ "--muted": "#EFF0EE",
123
+ "--muted-foreground": "#667078",
124
+ "--accent": "#ECEEEC",
125
+ "--accent-foreground": "#192B39",
126
+ "--border": "rgb(29 32 35 / 11%)",
127
+ "--input": "rgb(29 32 35 / 16%)",
128
+ "--ring": "#26689A",
129
+ "--surface": "#FFFFFF",
130
+ "--surface-strong": "#F0F1EF",
131
+ "--surface-elevated": "#FFFFFF",
132
+ "--surface-hover": "rgb(29 32 35 / 5%)",
133
+ "--overlay": "rgb(29 32 35 / 28%)",
134
+ "--modal-surface": "#FFFFFF",
135
+ "--popover-surface": "#FFFFFF",
136
+ "--sidebar": "#F1F2F0",
137
+ "--sidebar-foreground": "#192B39",
138
+ "--sidebar-primary": "#26689A",
139
+ "--sidebar-primary-foreground": "#FFFFFF",
140
+ "--sidebar-accent": "rgb(38 104 154 / 9%)",
141
+ "--sidebar-accent-foreground": "#192B39",
142
+ "--sidebar-border": "rgb(29 32 35 / 9%)",
143
+ "--sidebar-ring": "#26689A"
144
+ },
113
145
  "--radius-control": "6px rounded controls",
114
-
115
146
  "--radius-surface": "8px rounded surfaces",
116
-
117
- "--font-display": "Manrope (product UI headings and display scale)",
118
-
147
+ "--font-display": "Manrope",
119
148
  "--font-sans": "Manrope",
120
-
121
149
  "--font-ui-support": "Satoshi",
122
-
150
+ "--font-mono": "JetBrains Mono",
123
151
  "--font-marketing-display": "Clash Grotesk (marketing surfaces only)",
124
-
125
152
  "--font-arabic": "IBM Plex Sans Arabic",
126
-
127
- "--overlay": "Dark Blue modal dim",
128
-
129
- "--modal-surface": "Charcoal Blue",
130
-
131
- "--popover-surface": "Charcoal Blue"
132
-
153
+ "--sidebar-width-collapsed": "Owned by core; remains 4rem"
154
+ },
155
+ "governanceStatus": {
156
+ "success": { "dark": "#79B98E", "light": "#3F7953" },
157
+ "warning": { "dark": "#D2A363", "light": "#916026" },
158
+ "critical": { "dark": "#C86E64", "light": "#A94F47" },
159
+ "surfaceAlpha": { "dark": "12%", "light": "9%" },
160
+ "rule": "Status colors communicate governance state only; never use them as decorative accents."
133
161
  },
134
-
135
162
  "visualPolicy": {
136
-
137
- "tone": [
138
-
139
- "precise",
140
-
141
- "technical",
142
-
143
- "calm",
144
-
145
- "confident"
146
-
147
- ],
148
-
163
+ "tone": ["precise", "technical", "calm", "confident"],
149
164
  "allow": [
150
-
151
- "dark blue structural surfaces",
152
-
153
- "ocean blue accents for action and links",
154
-
155
- "rounded controls and cards",
156
-
157
- "muted neutral hierarchy",
158
-
159
- "Clash Grotesk for marketing display and website headers",
160
-
165
+ "neutral charcoal dark workspaces",
166
+ "plain cool-neutral light canvases with white cards",
167
+ "Ocean Blue for Dark primary actions, links, current location, and focus",
168
+ "Ocean Deep for accessible Light primary actions and focus",
169
+ "Logo Teal only for the logo and explicit brand expression",
170
+ "thin semantic borders",
161
171
  "Manrope for product UI and long reading"
162
-
163
172
  ],
164
-
165
173
  "avoid": [
166
-
167
- "Utopia brick red palette",
168
-
169
- "square Utopia geometry defaults",
170
-
171
- "decorative gradients",
172
-
174
+ "navy or blue-washed structural surfaces",
175
+ "blue as a full-page wash",
176
+ "status colors used decoratively",
177
+ "raw colors inside component rules",
173
178
  "heavy glass effects",
174
-
175
179
  "startup-cute styling",
176
-
177
- "fancy marketing display fonts in dense app menus or long paragraphs"
178
-
180
+ "marketing display fonts in dense application UI"
179
181
  ]
180
-
181
182
  },
182
-
183
183
  "iconPolicy": {
184
-
185
184
  "system": "lucide",
186
-
187
- "description": "Dextrum uses standard lucide icons inside product UI while keeping the Dextrum mark for brand surfaces.",
188
-
189
- "allow": [
190
-
191
- "lucide icons in components",
192
-
193
- "monochrome currentColor icons",
194
-
195
- "directional mirroring in RTL"
196
-
197
- ],
198
-
199
- "avoid": [
200
-
201
- "Utopia dot-bar icon policy",
202
-
203
- "emoji",
204
-
205
- "mixed icon families in one surface"
206
-
207
- ],
208
-
185
+ "description": "Dextrum uses standard Lucide icons in product UI and keeps the Dextrum mark for brand surfaces.",
186
+ "allow": ["lucide icons in components", "monochrome currentColor icons", "directional mirroring in RTL"],
187
+ "avoid": ["Utopia dot-bar icon policy", "emoji", "mixed icon families in one surface"],
209
188
  "coreNote": "Icon policy is theme-owned. Core components remain icon-system neutral."
210
-
211
189
  },
212
-
213
190
  "translations": {
214
-
215
191
  "ar": {
216
-
217
- "summary": "ثيم Dextrum مربوط بعقد Ceramic الدلالي. يستخدم لمسات Ocean Blue فوق أسطح Dark Blue، ويقود Manrope واجهة المنتج والتوثيق والعناوين الافتراضية، بينما يقتصر Clash Grotesk على أسطح التسويق الصريحة.",
218
-
192
+ "summary": "ثيم Dextrum هو مساحة حوكمة محايدة بالفحمي، مع الوضع الداكن افتراضيا ووضع فاتح بسيط. يقتصر الأزرق المعدني على الإجراءات والروابط والتركيز.",
219
193
  "iconPolicy": {
220
-
221
194
  "system": "Lucide",
222
-
223
195
  "description": "يستخدم Dextrum أيقونات Lucide القياسية داخل واجهة المنتج، مع إبقاء علامة Dextrum لأسطح العلامة.",
224
-
225
196
  "allow": ["أيقونات Lucide في المكونات", "أيقونات أحادية بلون currentColor", "عكس الاتجاه في RTL"]
226
-
227
197
  }
228
-
229
198
  }
230
-
231
199
  },
232
-
233
200
  "aiRules": [
234
-
235
201
  "Read this theme policy after the core semantic contract.",
236
-
237
- "Map Dextrum palette through semantic tokens only.",
238
-
239
- "Use Ocean Blue for primary actions and links, not as a full-page wash.",
240
-
241
- "Prefer dark blue and charcoal surfaces with timid white type.",
242
-
243
- "Use Manrope for Latin app UI and body copy in this theme.",
244
-
245
- "Use Clash Grotesk for marketing display and website headers only.",
246
-
247
- "Use Satoshi for marketing body copy and supporting UI labels where needed.",
248
-
202
+ "Default Dextrum to Dark; support explicit Light and system preference.",
203
+ "Map Dextrum primitives through semantic tokens only.",
204
+ "Keep Dark Blue, Ocean Blue, Ocean Deep, Logo Teal, and Timid White immutable.",
205
+ "Use Ocean Blue for Dark primary actions, links, current location, and focus, never as a page wash.",
206
+ "Use Ocean Deep for accessible Light primary actions and focus.",
207
+ "Use Logo Teal only for the logo and explicit brand expression.",
208
+ "Use governance colors only for success, warning, and critical state.",
209
+ "Do not override core layout tokens such as --sidebar-width-collapsed in products.",
210
+ "Use Manrope for Latin app UI, Satoshi for supporting labels, and JetBrains Mono for evidence identifiers.",
211
+ "Use Clash Grotesk for explicit marketing display only.",
249
212
  "Keep Arabic on IBM Plex Sans Arabic tokens.",
250
-
251
213
  "Do not import Utopia brand primitives into Dextrum-themed surfaces."
252
-
253
214
  ]
254
-
255
215
  }
@@ -17,6 +17,7 @@
17
17
  "packages/design-system/src/themes/utopia-default.css",
18
18
  "packages/design-system/src/manifests/theme-utopia-default.json"
19
19
  ],
20
+ "motionProfile": "ceremonial",
20
21
  "brandPrimitives": {
21
22
  "colors": {
22
23
  "brickRed": "#CC5536",
@@ -60,9 +61,9 @@
60
61
  "--radius-chat-composer": "Square chat input geometry",
61
62
  "--radius-chat-token": "Square chat token geometry",
62
63
  "--motion-duration-press": "160ms physical press feedback",
63
- "--motion-duration-page": "200ms quiet view transition",
64
- "--motion-duration-expand": "320ms disclosure transition",
65
- "--motion-duration-reveal": "520ms soft surface reveal",
64
+ "--motion-duration-page": "420ms ceremonial view transition",
65
+ "--motion-duration-expand": "360ms composed disclosure transition",
66
+ "--motion-duration-reveal": "440ms blur-capable surface reveal",
66
67
  "--motion-duration-icon": "640ms action-specific icon motion",
67
68
  "--motion-ease-standard": "Direct interaction easing",
68
69
  "--motion-ease-emphasized": "Soft reveal and icon easing",
@@ -108,7 +109,10 @@
108
109
  "large uppercase headlines",
109
110
  "Brick Red as a 5-15% accent",
110
111
  "hairline borders",
111
- "solid Special Black, Light Grey, Brick Red, and White surfaces"
112
+ "solid Special Black, Light Grey, Brick Red, and White surfaces",
113
+ "editorial whitespace that isolates one dominant message",
114
+ "three-bar signatures as structural punctuation",
115
+ "full-bleed brand panels that alternate dark, accent, and light colourways"
112
116
  ],
113
117
  "avoid": [
114
118
  "startup-cute styling",
@@ -117,7 +121,38 @@
117
121
  "glassmorphism",
118
122
  "textures",
119
123
  "rounded marketing cards",
120
- "pure black"
124
+ "pure black",
125
+ "uniform card grids with equal visual weight",
126
+ "low-contrast grey-on-grey hierarchy",
127
+ "using Brick Red for small body copy when contrast is insufficient"
128
+ ]
129
+ },
130
+ "visualGrammar": {
131
+ "thesis": "The interface should feel authored by a brand studio before it feels like a generic software dashboard.",
132
+ "composition": [
133
+ "Give every page one dominant typographic entry point.",
134
+ "Use asymmetric whitespace and offset alignment instead of centering every block.",
135
+ "Alternate Special Black, Brick Red, and Light Grey as large editorial fields; do not reduce them to small UI accents.",
136
+ "Use boxes only when containment communicates function. Prefer rules, fields, and spacing for editorial grouping."
137
+ ],
138
+ "typography": [
139
+ "Latin display headlines use TWK Lausanne 700, uppercase, tight line-height, and compact tracking.",
140
+ "Korean and Arabic retain native casing while matching the same visual mass, weight, and tight rhythm.",
141
+ "Small labels are concise, medium-weight, and widely tracked; body copy remains calm and readable."
142
+ ],
143
+ "signature": [
144
+ "Use the three-bar mark as punctuation at major page entries, never as repeated decoration.",
145
+ "Use a Brick Red full stop or short rule to terminate key Latin headlines."
146
+ ],
147
+ "interaction": [
148
+ "Active navigation is expressed with a Brick Red rule and stronger text, not a soft grey pill.",
149
+ "Hover states shift fields or rules directly; avoid floating card shadows and playful bounce.",
150
+ "Motion is deliberate, planar, and ceremonial with short directional travel."
151
+ ],
152
+ "accessibility": [
153
+ "Brick Red on Special Black is a graphic accent only, not normal-size body text.",
154
+ "White on Brick Red is reserved for large or strong text; smaller copy uses the deep brand ink token with verified contrast.",
155
+ "Functional focus rings use the accessible ring token even when the graphic brand accent differs."
121
156
  ]
122
157
  },
123
158
  "iconPolicy": {
@@ -121,6 +121,7 @@
121
121
  "policyManifest": "packages/design-system/src/manifests/theme-utopia-default.json",
122
122
  "css": "packages/design-system/src/themes/utopia-default.css",
123
123
  "iconSystem": "utopia-dot-bar",
124
+ "motionProfile": "ceremonial",
124
125
  "values": {
125
126
  "--background": "#3C3235",
126
127
  "--foreground": "#FFFFFF",
@@ -143,9 +144,9 @@
143
144
  "--radius-chat-token": "0px",
144
145
  "--shadow-control": "none",
145
146
  "--motion-duration-press": "160ms",
146
- "--motion-duration-page": "200ms",
147
- "--motion-duration-expand": "320ms",
148
- "--motion-duration-reveal": "520ms",
147
+ "--motion-duration-page": "420ms",
148
+ "--motion-duration-expand": "360ms",
149
+ "--motion-duration-reveal": "440ms",
149
150
  "--motion-duration-icon": "640ms",
150
151
  "--motion-ease-standard": "cubic-bezier(0.2, 0, 0, 1)",
151
152
  "--motion-ease-emphasized": "cubic-bezier(0.16, 1, 0.3, 1)",
@@ -208,6 +209,7 @@
208
209
  "policyManifest": "packages/design-system/src/manifests/theme-dextrum.json",
209
210
  "css": "packages/design-system/src/themes/dextrum.css",
210
211
  "iconSystem": "lucide",
212
+ "motionProfile": "swift",
211
213
  "values": {
212
214
  "--background": "#192B39",
213
215
  "--foreground": "#EAEAEA",
@@ -229,11 +231,11 @@
229
231
  "--radius-chat-composer": "24px",
230
232
  "--radius-chat-token": "14px",
231
233
  "--shadow-control": "none",
232
- "--motion-duration-press": "160ms",
233
- "--motion-duration-page": "200ms",
234
- "--motion-duration-expand": "320ms",
235
- "--motion-duration-reveal": "520ms",
236
- "--motion-duration-icon": "640ms",
234
+ "--motion-duration-press": "80ms",
235
+ "--motion-duration-page": "140ms",
236
+ "--motion-duration-expand": "160ms",
237
+ "--motion-duration-reveal": "140ms",
238
+ "--motion-duration-icon": "240ms",
237
239
  "--motion-ease-standard": "cubic-bezier(0.2, 0, 0, 1)",
238
240
  "--motion-ease-emphasized": "cubic-bezier(0.16, 1, 0.3, 1)",
239
241
  "--motion-ease-icon": "cubic-bezier(0.16, 1, 0.3, 1)",
@@ -275,9 +277,9 @@
275
277
  "name": "Barrier Intelligence",
276
278
  "locked": false,
277
279
  "role": "brand theme",
278
- "description": "Near-black surfaces with warm gold accents, ink hierarchy, and Hanken Grotesk for product UI. Marketing typography remains theme-scoped only.",
280
+ "description": "Near-black surfaces with warm gold accents, restrained detector lime, domain assurance states, and Hanken Grotesk for product UI. Brand and color mode are selected independently.",
279
281
  "bestFor": ["Barrier Intelligence product UI", "risk and intelligence workflows", "high-contrast analytical products"],
280
- "principles": ["near-black hierarchy", "warm gold emphasis", "dense analytical surfaces", "Lucide icon system"],
282
+ "principles": ["near-black hierarchy", "warm gold emphasis", "dense analytical surfaces", "Lucide icon system", "independent brand and color mode", "restrained detector and assurance signals"],
281
283
  "translations": {
282
284
  "ar": {
283
285
  "name": "Barrier Intelligence",
@@ -291,6 +293,7 @@
291
293
  "policyManifest": "packages/design-system/src/manifests/theme-barrier-intelligence.json",
292
294
  "css": "packages/design-system/src/themes/barrier-intelligence.css",
293
295
  "iconSystem": "lucide",
296
+ "motionProfile": "precise",
294
297
  "values": {
295
298
  "--background": "#000000",
296
299
  "--foreground": "#F5F5F2",
@@ -312,27 +315,41 @@
312
315
  "--radius-chat-composer": "24px",
313
316
  "--radius-chat-token": "14px",
314
317
  "--shadow-control": "none",
315
- "--motion-duration-press": "160ms",
318
+ "--motion-duration-press": "100ms",
316
319
  "--motion-duration-page": "200ms",
317
- "--motion-duration-expand": "320ms",
318
- "--motion-duration-reveal": "520ms",
319
- "--motion-duration-icon": "640ms",
320
+ "--motion-duration-expand": "220ms",
321
+ "--motion-duration-reveal": "240ms",
322
+ "--motion-duration-icon": "320ms",
320
323
  "--motion-ease-standard": "cubic-bezier(0.2, 0, 0, 1)",
321
324
  "--motion-ease-emphasized": "cubic-bezier(0.16, 1, 0.3, 1)",
322
325
  "--motion-ease-icon": "cubic-bezier(0.16, 1, 0.3, 1)",
323
326
  "--motion-press-scale": "0.97",
324
- "--motion-distance-page": "8px",
325
- "--motion-distance-reveal": "8px",
327
+ "--motion-distance-page": "6px",
328
+ "--motion-distance-reveal": "10px",
326
329
  "--font-sans": "Hanken Grotesk",
327
330
  "--font-display": "Hanken Grotesk",
328
331
  "--font-ui-support": "Hanken Grotesk",
329
332
  "--font-marketing-display": "Hanken Grotesk",
333
+ "--font-mono": "JetBrains Mono",
330
334
  "--font-arabic": "IBM Plex Sans Arabic",
331
335
  "--font-arabic-body": "IBM Plex Sans Arabic",
332
336
  "--font-arabic-display": "IBM Plex Sans Arabic",
333
337
  "--font-weight-arabic-body": "400",
334
338
  "--font-weight-arabic-display": "700",
335
339
  "--font-size-display": "clamp(2.875rem, 7.6vw, 5.75rem)",
340
+ "--font-size-marketing-h1": "clamp(3rem, 6vw, 5.75rem)",
341
+ "--font-size-marketing-h2": "clamp(2.25rem, 4vw, 3.75rem)",
342
+ "--font-size-marketing-h3": "clamp(1.5rem, 2.5vw, 2.25rem)",
343
+ "--container-standard": "72rem",
344
+ "--container-wide": "90rem",
345
+ "--page-gutter": "clamp(1rem, 3vw, 2.5rem)",
346
+ "--content-measure": "72ch",
347
+ "--detector-active": "#A6B86A",
348
+ "--assurance-credited": "#D2AC6C",
349
+ "--assurance-at-risk": "#C47C48",
350
+ "--assurance-lost": "#C76B62",
351
+ "--assurance-warning": "#D2A65A",
352
+ "--assurance-verified": "#A6B86A",
336
353
  "--font-size-arabic-body": "16px",
337
354
  "--font-size-arabic-body-lg": "18px",
338
355
  "--font-size-arabic-display": "clamp(2.75rem, 7.2vw, 5.5rem)",
@@ -35,7 +35,11 @@ import {
35
35
  CardHeader,
36
36
  CardTitle,
37
37
  MotionProvider,
38
- Selector,
38
+ Select,
39
+ SelectContent,
40
+ SelectItem,
41
+ SelectTrigger,
42
+ SelectValue,
39
43
  Textarea,
40
44
  TextInput,
41
45
  TopNav,
@@ -434,7 +438,7 @@ function ChangelogPage({ locale }: { locale: Locale }) {
434
438
  function ContactSalesPage({ demo, locale }: { demo: DemoData; locale: Locale }) {
435
439
  const [submitted, setSubmitted] = useState(false)
436
440
  if (submitted) return <section className="contact-success" id="top"><CircleCheck aria-hidden="true" /><p className="eyebrow">{locale === 'ar' ? 'تم استلام الطلب' : 'Request received'}</p><h1>{locale === 'ar' ? 'سنتواصل معك قريباً.' : 'We will be in touch shortly.'}</h1><p>{locale === 'ar' ? `شكراً لاهتمامك بـ ${demo.product}.` : `Thank you for your interest in ${demo.product}.`}</p></section>
437
- return <section className="contact-layout" id="top"><div><p className="eyebrow">{locale === 'ar' ? 'تواصل مع المبيعات' : 'Contact sales'}</p><h1>{locale === 'ar' ? 'صمّم مسار اعتماد يناسب فريقك.' : 'Design an adoption path for your team.'}</h1><p>{locale === 'ar' ? 'اطلب عرضاً، اختر الخطة المناسبة، واحصل على مساعدة في الإعداد.' : 'Request a demo, choose the right plan, and get help with setup.'}</p><ul>{(locale === 'ar' ? ['عرض مخصص لسير عملك', 'توصية بالخطة والحوكمة', 'دعم للإعداد والتكامل'] : ['A demo tailored to your workflow', 'Plan and governance recommendation', 'Setup and integration support']).map((item) => <li key={item}><Check aria-hidden="true" />{item}</li>)}</ul></div><form onSubmit={(event) => { event.preventDefault(); setSubmitted(true) }}><label>{locale === 'ar' ? 'الاسم' : 'Name'}<TextInput name="name" required /></label><label>{locale === 'ar' ? 'البريد للعمل' : 'Work email'}<TextInput name="email" required type="email" /></label><label>{locale === 'ar' ? 'الشركة' : 'Company'}<TextInput name="company" required /></label><label>{locale === 'ar' ? 'حجم الفريق' : 'Team size'}<Selector defaultValue=""><option disabled value="">{locale === 'ar' ? 'اختر' : 'Select'}</option><option>1–20</option><option>21–100</option><option>101–500</option><option>500+</option></Selector></label><label>{locale === 'ar' ? 'ما سير العمل الذي تريد تحسينه؟' : 'Which workflow do you want to improve?'}<Textarea name="workflow" rows={5} /></label><Button endContent={<ArrowIcon />} size="lg" type="submit">{locale === 'ar' ? 'إرسال الطلب' : 'Submit request'}</Button><small>{locale === 'ar' ? 'بيانات تجريبية فقط — لا يتم إرسالها إلى خدمة خارجية.' : 'Demo only — data is not sent to an external service.'}</small></form></section>
441
+ return <section className="contact-layout" id="top"><div><p className="eyebrow">{locale === 'ar' ? 'تواصل مع المبيعات' : 'Contact sales'}</p><h1>{locale === 'ar' ? 'صمّم مسار اعتماد يناسب فريقك.' : 'Design an adoption path for your team.'}</h1><p>{locale === 'ar' ? 'اطلب عرضاً، اختر الخطة المناسبة، واحصل على مساعدة في الإعداد.' : 'Request a demo, choose the right plan, and get help with setup.'}</p><ul>{(locale === 'ar' ? ['عرض مخصص لسير عملك', 'توصية بالخطة والحوكمة', 'دعم للإعداد والتكامل'] : ['A demo tailored to your workflow', 'Plan and governance recommendation', 'Setup and integration support']).map((item) => <li key={item}><Check aria-hidden="true" />{item}</li>)}</ul></div><form onSubmit={(event) => { event.preventDefault(); setSubmitted(true) }}><label>{locale === 'ar' ? 'الاسم' : 'Name'}<TextInput name="name" required /></label><label>{locale === 'ar' ? 'البريد للعمل' : 'Work email'}<TextInput name="email" required type="email" /></label><label>{locale === 'ar' ? 'الشركة' : 'Company'}<TextInput name="company" required /></label><label>{locale === 'ar' ? 'حجم الفريق' : 'Team size'}<Select name="team-size"><SelectTrigger aria-label={locale === 'ar' ? 'حجم الفريق' : 'Team size'}><SelectValue placeholder={locale === 'ar' ? 'اختر' : 'Select'} /></SelectTrigger><SelectContent><SelectItem value="1-20">1–20</SelectItem><SelectItem value="21-100">21–100</SelectItem><SelectItem value="101-500">101–500</SelectItem><SelectItem value="500-plus">500+</SelectItem></SelectContent></Select></label><label>{locale === 'ar' ? 'ما سير العمل الذي تريد تحسينه؟' : 'Which workflow do you want to improve?'}<Textarea name="workflow" rows={5} /></label><Button endContent={<ArrowIcon />} size="lg" type="submit">{locale === 'ar' ? 'إرسال الطلب' : 'Submit request'}</Button><small>{locale === 'ar' ? 'بيانات تجريبية فقط — لا يتم إرسالها إلى خدمة خارجية.' : 'Demo only — data is not sent to an external service.'}</small></form></section>
438
442
  }
439
443
 
440
444
  function SecondaryPage({ demo, locale, page, previewMode, seed, setPreviewMode }: { demo: DemoData; locale: Locale; page: PageKey; previewMode: PreviewMode; seed: number; setPreviewMode: (mode: PreviewMode) => void }) {