aeon-ui-engine 1.0.0 → 1.0.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.
Files changed (79) hide show
  1. package/COMPONENTS.md +7 -2
  2. package/INTEGRATION.md +14 -0
  3. package/README.md +8 -4
  4. package/apps/demo/og.config.mjs +8 -3
  5. package/apps/demo/public/og-aeon-ui-engine.png +0 -0
  6. package/apps/demo/public/og.svg +2 -2
  7. package/apps/demo/scripts/generate-og-png.mjs +4 -2
  8. package/apps/demo/src/App.tsx +2 -2
  9. package/apps/demo/src/aeonDiagrams.ts +17 -75
  10. package/apps/demo/src/components/DiagramsSection.tsx +8 -9
  11. package/apps/demo/src/components/HeroInstall.tsx +7 -4
  12. package/apps/demo/src/components/LandingFaq.tsx +1 -1
  13. package/apps/demo/src/components/LandingFooter.tsx +8 -0
  14. package/apps/demo/src/components/LandingHeader.tsx +4 -2
  15. package/apps/demo/src/components/LayersSection.tsx +6 -10
  16. package/apps/demo/src/components/MermaidDiagram.tsx +5 -3
  17. package/apps/demo/src/components/PhilosophySection.tsx +0 -2
  18. package/apps/demo/src/components/PlaygroundBlock.tsx +3 -8
  19. package/apps/demo/src/components/PlaygroundControlsDemo.tsx +63 -0
  20. package/apps/demo/src/components/PlaygroundSection.tsx +7 -91
  21. package/apps/demo/src/components/ThemeSwitcher.tsx +12 -9
  22. package/apps/demo/src/demo-layout.css +29 -0
  23. package/apps/demo/src/landing.css +136 -79
  24. package/apps/demo/src/nav.ts +3 -3
  25. package/apps/demo/src/site.ts +99 -228
  26. package/docs/MACHINES.md +6 -1
  27. package/package.json +1 -1
  28. package/packages/core/src/anatomy.ts +23 -0
  29. package/packages/panda/panda.config.ts +19 -1
  30. package/packages/panda/src/recipes/index.ts +5 -0
  31. package/packages/panda/src/recipes/pin-input.ts +29 -0
  32. package/packages/panda/src/recipes/progress.ts +44 -0
  33. package/packages/panda/src/recipes/radio-group.ts +51 -0
  34. package/packages/panda/src/recipes/select.ts +2 -0
  35. package/packages/panda/src/recipes/separator.ts +35 -0
  36. package/packages/panda/src/recipes/slider.ts +57 -0
  37. package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +28 -0
  38. package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +36 -0
  39. package/packages/panda/styled-system/recipes/aeon-progress.d.ts +28 -0
  40. package/packages/panda/styled-system/recipes/aeon-progress.mjs +44 -0
  41. package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +28 -0
  42. package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +48 -0
  43. package/packages/panda/styled-system/recipes/aeon-separator.d.ts +31 -0
  44. package/packages/panda/styled-system/recipes/aeon-separator.mjs +41 -0
  45. package/packages/panda/styled-system/recipes/aeon-slider.d.ts +28 -0
  46. package/packages/panda/styled-system/recipes/aeon-slider.mjs +48 -0
  47. package/packages/panda/styled-system/recipes/index.d.ts +5 -0
  48. package/packages/panda/styled-system/recipes/index.mjs +5 -0
  49. package/packages/panda/styled-system/styles.css +223 -46
  50. package/packages/panda/styled-system/types/conditions.d.ts +1 -1
  51. package/packages/primitives/src/index.ts +1 -0
  52. package/packages/primitives/src/machines/slider.ts +93 -0
  53. package/packages/react/src/checkbox/index.tsx +14 -0
  54. package/packages/react/src/floating/FloatingPositioner.tsx +59 -0
  55. package/packages/react/src/hooks/use-anchor-position.ts +33 -5
  56. package/packages/react/src/hooks/use-prefers-hover.ts +16 -0
  57. package/packages/react/src/index.ts +5 -0
  58. package/packages/react/src/menu/index.tsx +38 -11
  59. package/packages/react/src/pin-input/index.tsx +223 -0
  60. package/packages/react/src/popover/index.tsx +38 -11
  61. package/packages/react/src/progress/index.tsx +110 -0
  62. package/packages/react/src/radio-group/index.tsx +199 -0
  63. package/packages/react/src/select/index.tsx +51 -28
  64. package/packages/react/src/select/select.test.tsx +21 -0
  65. package/packages/react/src/separator/index.tsx +23 -0
  66. package/packages/react/src/slider/index.tsx +264 -0
  67. package/packages/react/src/toast/primitives.tsx +8 -1
  68. package/packages/react/src/toast/toast.test.tsx +40 -0
  69. package/packages/react/src/tooltip/index.tsx +124 -20
  70. package/packages/react/src/tooltip/tooltip.test.tsx +114 -0
  71. package/packages/site/README.md +1 -1
  72. package/packages/ui/src/index.ts +5 -0
  73. package/packages/ui/src/pin-input.tsx +16 -0
  74. package/packages/ui/src/progress.tsx +21 -0
  75. package/packages/ui/src/radio-group.tsx +24 -0
  76. package/packages/ui/src/separator.tsx +15 -0
  77. package/packages/ui/src/slider.tsx +24 -0
  78. package/apps/demo/public/og.png +0 -0
  79. package/apps/demo/src/components/SceneSection.tsx +0 -157
@@ -1,29 +1,17 @@
1
1
  import {
2
- Accordion,
3
2
  Button,
4
- Checkbox,
5
3
  Dialog,
6
4
  Menu,
7
5
  Popover,
8
- Switch,
9
- Tabs,
10
6
  Tooltip,
11
7
  useToast,
12
8
  } from '@aeon-ui/ui'
13
- import { ComboboxDemo } from './ComboboxDemo.js'
14
- import { useState } from 'react'
15
- import {
16
- accordionExamples,
17
- playgroundBlocks,
18
- site,
19
- tabsExamples,
20
- } from '../site.js'
9
+ import { playgroundBlocks, site } from '../site.js'
21
10
  import { AsyncMachineDemo } from './AsyncMachineDemo.js'
22
11
  import { ButtonLifecycleDemo } from './ButtonLifecycleDemo.js'
23
- import { CodeExample } from './CodeExample.js'
24
12
  import { FieldStateDemo } from './FieldStateDemo.js'
25
- import { ScrollRegionDemo } from './ScrollRegionDemo.js'
26
13
  import { PlaygroundBlock } from './PlaygroundBlock.js'
14
+ import { PlaygroundControlsDemo } from './PlaygroundControlsDemo.js'
27
15
 
28
16
  function ToastDemo() {
29
17
  const { publish } = useToast()
@@ -45,7 +33,6 @@ function ToastDemo() {
45
33
  }
46
34
 
47
35
  export function PlaygroundSection() {
48
- const [notifications, setNotifications] = useState(true)
49
36
  const b = playgroundBlocks
50
37
 
51
38
  return (
@@ -70,37 +57,8 @@ export function PlaygroundSection() {
70
57
  <FieldStateDemo />
71
58
  </PlaygroundBlock>
72
59
 
73
- <PlaygroundBlock {...b.scroll}>
74
- <ScrollRegionDemo />
75
- </PlaygroundBlock>
76
-
77
- <PlaygroundBlock {...b.buttons}>
78
- <Button.Group className="playground-button-row">
79
- <Button.Root>Primary</Button.Root>
80
- <Button.Root variant="outline">Outline</Button.Root>
81
- <Button.Root variant="ghost">Ghost</Button.Root>
82
- </Button.Group>
83
- </PlaygroundBlock>
84
-
85
- <PlaygroundBlock {...b.toggle}>
86
- <div className="demo-stack">
87
- <Switch.Root checked={notifications} onCheckedChange={setNotifications}>
88
- <Switch.Control>
89
- <Switch.Thumb />
90
- </Switch.Control>
91
- <Switch.Label>Enable notifications</Switch.Label>
92
- </Switch.Root>
93
- <Checkbox.Root checked={notifications} onCheckedChange={setNotifications}>
94
- <Checkbox.Control>
95
- <Checkbox.Indicator />
96
- </Checkbox.Control>
97
- <Checkbox.Label>Email digest</Checkbox.Label>
98
- </Checkbox.Root>
99
- </div>
100
- </PlaygroundBlock>
101
-
102
- <PlaygroundBlock {...b.combobox}>
103
- <ComboboxDemo />
60
+ <PlaygroundBlock {...b.controls}>
61
+ <PlaygroundControlsDemo />
104
62
  </PlaygroundBlock>
105
63
 
106
64
  <PlaygroundBlock {...b.dialog}>
@@ -111,7 +69,7 @@ export function PlaygroundSection() {
111
69
  <Dialog.Content>
112
70
  <Dialog.Title>Example modal</Dialog.Title>
113
71
  <Dialog.Description>
114
- Press Escape or click outside — both close via the dialog machine.
72
+ Escape and backdrop clicks close via defined transitions.
115
73
  </Dialog.Description>
116
74
  <Dialog.CloseTrigger>Close</Dialog.CloseTrigger>
117
75
  </Dialog.Content>
@@ -119,7 +77,7 @@ export function PlaygroundSection() {
119
77
  </Dialog.Root>
120
78
  </PlaygroundBlock>
121
79
 
122
- <PlaygroundBlock {...b.overlay}>
80
+ <PlaygroundBlock {...b.overlay} last>
123
81
  <div className="demo-stack demo-overlay-row">
124
82
  <Menu.Root>
125
83
  <Menu.Trigger>Menu</Menu.Trigger>
@@ -137,7 +95,7 @@ export function PlaygroundSection() {
137
95
  <Popover.Trigger>Popover</Popover.Trigger>
138
96
  <Popover.Positioner>
139
97
  <Popover.Content>
140
- <p style={{ margin: 0 }}>Anchored panel — open/closed is explicit on the machine.</p>
98
+ <p style={{ margin: 0 }}>Anchored panel with explicit open/closed states.</p>
141
99
  <Popover.CloseTrigger>Close</Popover.CloseTrigger>
142
100
  </Popover.Content>
143
101
  </Popover.Positioner>
@@ -155,48 +113,6 @@ export function PlaygroundSection() {
155
113
  <ToastDemo />
156
114
  </div>
157
115
  </PlaygroundBlock>
158
-
159
- <PlaygroundBlock {...b.tabsAccordion} last>
160
- <Tabs.Root defaultValue="philosophy" className="demo-spaced-bottom">
161
- <Tabs.List>
162
- <Tabs.Trigger value="philosophy">{tabsExamples.philosophy.label}</Tabs.Trigger>
163
- <Tabs.Trigger value="machines">{tabsExamples.machines.label}</Tabs.Trigger>
164
- <Tabs.Trigger value="anatomy">{tabsExamples.anatomy.label}</Tabs.Trigger>
165
- </Tabs.List>
166
- <Tabs.Content value="philosophy">
167
- <p>{tabsExamples.philosophy.content}</p>
168
- <CodeExample code={tabsExamples.philosophy.example} />
169
- </Tabs.Content>
170
- <Tabs.Content value="machines">
171
- <p>{tabsExamples.machines.content}</p>
172
- <CodeExample code={tabsExamples.machines.example} />
173
- </Tabs.Content>
174
- <Tabs.Content value="anatomy">
175
- <p>{tabsExamples.anatomy.content}</p>
176
- <CodeExample code={tabsExamples.anatomy.example} />
177
- </Tabs.Content>
178
- </Tabs.Root>
179
- <Accordion.Root defaultValue={['what']}>
180
- <Accordion.Item value="what">
181
- <Accordion.ItemTrigger value="what">
182
- {accordionExamples.what.trigger}
183
- </Accordion.ItemTrigger>
184
- <Accordion.ItemContent value="what">
185
- <p>{accordionExamples.what.content}</p>
186
- <CodeExample code={accordionExamples.what.example} />
187
- </Accordion.ItemContent>
188
- </Accordion.Item>
189
- <Accordion.Item value="why">
190
- <Accordion.ItemTrigger value="why">
191
- {accordionExamples.why.trigger}
192
- </Accordion.ItemTrigger>
193
- <Accordion.ItemContent value="why">
194
- <p>{accordionExamples.why.content}</p>
195
- <CodeExample code={accordionExamples.why.example} />
196
- </Accordion.ItemContent>
197
- </Accordion.Item>
198
- </Accordion.Root>
199
- </PlaygroundBlock>
200
116
  </div>
201
117
  </div>
202
118
  </section>
@@ -60,16 +60,19 @@ export function ThemeSwitcher() {
60
60
  if (isAeonThemeId(v)) setTheme(v)
61
61
  }}
62
62
  >
63
- <Select.Trigger aria-label="Theme preset">
64
- {AEON_THEME_MAP[themeId].label}
63
+ <Select.Trigger aria-label={`Theme preset: ${AEON_THEME_MAP[themeId].label}`}>
64
+ <span className="theme-switcher__trigger-prefix">Theme</span>
65
+ <span className="theme-switcher__trigger-value">{AEON_THEME_MAP[themeId].label}</span>
65
66
  </Select.Trigger>
66
- <Select.Content>
67
- {AEON_THEMES.map((t) => (
68
- <Select.Item key={t.id} value={t.id}>
69
- {t.label}
70
- </Select.Item>
71
- ))}
72
- </Select.Content>
67
+ <Select.Positioner>
68
+ <Select.Content>
69
+ {AEON_THEMES.map((t) => (
70
+ <Select.Item key={t.id} value={t.id}>
71
+ {t.label}
72
+ </Select.Item>
73
+ ))}
74
+ </Select.Content>
75
+ </Select.Positioner>
73
76
  </Select.Root>
74
77
  </div>
75
78
  )
@@ -157,6 +157,35 @@
157
157
  max-width: 24rem;
158
158
  }
159
159
 
160
+ .playground-controls {
161
+ display: flex;
162
+ flex-direction: column;
163
+ align-items: flex-start;
164
+ gap: var(--aeon-gap-lg);
165
+ }
166
+
167
+ .playground-controls__toggles {
168
+ display: flex;
169
+ flex-direction: column;
170
+ align-items: flex-start;
171
+ gap: var(--aeon-gap);
172
+ width: 100%;
173
+ max-width: 20rem;
174
+ }
175
+
176
+ .playground-controls__radio {
177
+ display: flex;
178
+ flex-direction: column;
179
+ gap: var(--aeon-gap-sm);
180
+ width: 100%;
181
+ max-width: 20rem;
182
+ }
183
+
184
+ .playground-controls__slider {
185
+ width: 100%;
186
+ max-width: 20rem;
187
+ }
188
+
160
189
  /* State track — equal columns; scales type to container (no clipped labels) */
161
190
  .state-track {
162
191
  --aeon-state-track-count: 5;
@@ -58,11 +58,11 @@
58
58
  }
59
59
 
60
60
  .section-lead {
61
- font-size: 1.05rem;
61
+ font-size: 1rem;
62
62
  color: var(--text-muted);
63
- max-width: 40rem;
63
+ max-width: 42ch;
64
64
  margin: 0;
65
- line-height: 1.65;
65
+ line-height: 1.6;
66
66
  }
67
67
 
68
68
  .text-accent {
@@ -213,10 +213,19 @@
213
213
  display: inline-flex;
214
214
  align-items: center;
215
215
  flex-shrink: 0;
216
- align-self: center;
217
216
  text-decoration: none;
218
217
  }
219
218
 
219
+ .landing-header__cta [data-aeon-scope='button'][data-aeon-part='root'] {
220
+ min-height: var(--header-control-h);
221
+ letter-spacing: 0.04em;
222
+ white-space: nowrap;
223
+ }
224
+
225
+ .landing-header__cta-label--short {
226
+ display: none;
227
+ }
228
+
220
229
  /* Theme switcher — segmented light/dark + preset select */
221
230
  .theme-switcher {
222
231
  display: flex;
@@ -254,17 +263,56 @@
254
263
  height: var(--header-control-h);
255
264
  }
256
265
 
266
+ .theme-switcher__trigger-prefix {
267
+ display: none;
268
+ flex-shrink: 0;
269
+ font-weight: 600;
270
+ }
271
+
272
+ .theme-switcher__trigger-value {
273
+ min-width: 0;
274
+ overflow: hidden;
275
+ text-overflow: ellipsis;
276
+ white-space: nowrap;
277
+ }
278
+
257
279
  .theme-switcher__theme-select [data-aeon-part='trigger'] {
258
280
  min-height: var(--header-control-h);
259
281
  height: 100%;
260
282
  max-width: 100%;
261
283
  overflow: hidden;
262
- text-overflow: ellipsis;
263
- white-space: nowrap;
264
284
  padding-inline: 0.5rem 1.75rem;
265
285
  font-size: 0.7rem;
266
286
  }
267
287
 
288
+ @media (max-width: 719px) {
289
+ .theme-switcher__trigger-prefix {
290
+ display: inline;
291
+ }
292
+ }
293
+
294
+ @media (max-width: 640px) {
295
+ .landing-header__cta [data-aeon-scope='button'][data-aeon-part='root'] {
296
+ min-height: var(--header-control-h);
297
+ padding-inline: 0.55rem !important;
298
+ font-size: 0.6875rem;
299
+ }
300
+
301
+ .landing-header__cta-label--long {
302
+ display: none;
303
+ }
304
+
305
+ .landing-header__cta-label--short {
306
+ display: inline;
307
+ }
308
+ }
309
+
310
+ @media (max-width: 420px) {
311
+ .theme-switcher__trigger-value {
312
+ display: none;
313
+ }
314
+ }
315
+
268
316
  @media (max-width: 420px) {
269
317
  :root {
270
318
  --header-control-h: 2rem;
@@ -294,28 +342,14 @@
294
342
  }
295
343
 
296
344
  .theme-switcher__theme-select {
297
- width: 4.75rem;
298
- max-width: 20vw;
345
+ width: auto;
346
+ min-width: 4.35rem;
347
+ max-width: none;
299
348
  }
300
349
 
301
350
  .theme-switcher__theme-select [data-aeon-part='trigger'] {
302
- padding-inline: 0.4rem 1.5rem;
303
- font-size: 0.625rem;
304
- }
305
-
306
- .landing-header__cta [data-aeon-scope='button'][data-aeon-part='root'] {
307
- min-height: var(--header-control-h);
308
- padding-inline: 0.45rem !important;
351
+ padding-inline: 0.45rem 1.5rem;
309
352
  font-size: 0.625rem;
310
- letter-spacing: 0.04em;
311
- }
312
-
313
- .landing-header__cta-label--long {
314
- display: none;
315
- }
316
-
317
- .landing-header__cta-label--short {
318
- display: inline;
319
353
  }
320
354
  }
321
355
 
@@ -331,26 +365,14 @@
331
365
  border: 0;
332
366
  }
333
367
 
334
- /* Header CTA — same vertical rhythm as mode toggles + select */
335
- .landing-header__cta [data-aeon-scope='button'][data-aeon-part='root'] {
336
- min-height: var(--header-control-h);
337
- letter-spacing: 0.06em;
338
- text-transform: uppercase;
339
- font-size: 0.75rem;
340
- }
341
-
342
- .landing-header__cta-label--short {
343
- display: none;
344
- }
345
-
346
368
  /* Hero */
347
369
  .hero {
348
370
  padding-top: clamp(2.5rem, 6vw, 4rem);
349
371
  padding-bottom: clamp(1.25rem, 3vw, 2rem);
350
372
  }
351
373
 
352
- /* One-line install — above hero CTAs */
353
- .hero__copy .hero-install__line {
374
+ /* Install line — above hero CTAs */
375
+ .hero__copy .hero-install {
354
376
  margin: 0 0 1rem;
355
377
  }
356
378
 
@@ -369,6 +391,14 @@
369
391
  scrollbar-width: thin;
370
392
  }
371
393
 
394
+ .hero-install__hint {
395
+ margin: 0.4rem 0 0;
396
+ font-size: 0.75rem;
397
+ line-height: 1.45;
398
+ color: var(--text-muted);
399
+ max-width: 36ch;
400
+ }
401
+
372
402
  .hero-install__label {
373
403
  flex-shrink: 0;
374
404
  font-size: 0.65rem;
@@ -378,18 +408,19 @@
378
408
  color: var(--aeon-accent);
379
409
  }
380
410
 
381
- .hero-install__access {
411
+ .hero-install__command {
382
412
  flex: 1 1 auto;
383
413
  min-width: 0;
384
414
  margin: 0;
385
415
  padding: 0;
386
- font-family: var(--font-display);
387
- font-size: clamp(0.85rem, 3.2vw, 1.05rem);
388
- font-weight: 700;
389
- letter-spacing: 0.12em;
416
+ font-family: var(--font-mono, 'IBM Plex Mono', ui-monospace, monospace);
417
+ font-size: clamp(0.78rem, 2.8vw, 0.92rem);
418
+ font-weight: 500;
419
+ letter-spacing: 0.02em;
390
420
  line-height: 1.3;
391
421
  white-space: nowrap;
392
422
  color: var(--aeon-text);
423
+ background: transparent;
393
424
  }
394
425
 
395
426
  .hero__eyebrow {
@@ -412,7 +443,7 @@
412
443
  }
413
444
 
414
445
  .hero__lead {
415
- margin: 0 0 0.35rem;
446
+ margin: 0 0 0.75rem;
416
447
  font-size: 1.0625rem;
417
448
  font-weight: 500;
418
449
  color: var(--text-muted);
@@ -421,14 +452,16 @@
421
452
  }
422
453
 
423
454
  .hero__sub {
424
- margin: 0 0 1.5rem;
425
- font-size: 0.98rem;
426
- color: color-mix(in srgb, var(--text-muted) 82%, transparent);
427
- max-width: 42ch;
455
+ margin: 0 0 1.25rem;
456
+ font-size: 0.9375rem;
457
+ line-height: 1.55;
458
+ color: var(--text-muted);
459
+ max-width: 46ch;
460
+ opacity: 0.92;
428
461
  }
429
462
 
430
463
  .hero__actions {
431
- margin-bottom: 2rem;
464
+ margin-bottom: 1.5rem;
432
465
  }
433
466
 
434
467
  .hero__actions a {
@@ -493,6 +526,39 @@
493
526
  }
494
527
  }
495
528
 
529
+ .hero__pillars {
530
+ list-style: none;
531
+ margin: 0;
532
+ padding: 0;
533
+ display: flex;
534
+ flex-direction: column;
535
+ }
536
+
537
+ .hero__pillar {
538
+ display: flex;
539
+ flex-direction: column;
540
+ gap: 0.2rem;
541
+ padding: 0.85rem 1rem;
542
+ border-bottom: 1px solid var(--border);
543
+ }
544
+
545
+ .hero__pillar:last-child {
546
+ border-bottom: none;
547
+ }
548
+
549
+ .hero__pillar strong {
550
+ font-family: var(--font-display);
551
+ font-size: 0.8125rem;
552
+ font-weight: 600;
553
+ color: var(--aeon-text);
554
+ }
555
+
556
+ .hero__pillar span {
557
+ font-size: 0.8125rem;
558
+ line-height: 1.45;
559
+ color: var(--text-muted);
560
+ }
561
+
496
562
  .hero__visual {
497
563
  margin-top: 2.5rem;
498
564
  }
@@ -665,11 +731,15 @@
665
731
  }
666
732
 
667
733
  .playground__block-sub {
668
- margin: 0 0 0.75rem;
734
+ margin: 0 0 0.85rem;
669
735
  font-size: 0.875rem;
670
736
  line-height: 1.55;
671
737
  color: var(--text-muted);
672
- max-width: 52ch;
738
+ max-width: 48ch;
739
+ }
740
+
741
+ .playground__block-demo {
742
+ margin: 0;
673
743
  }
674
744
 
675
745
  .code-example {
@@ -1013,55 +1083,42 @@
1013
1083
  .diagrams__grid {
1014
1084
  display: grid;
1015
1085
  gap: clamp(1.25rem, 3vw, 1.75rem);
1016
- }
1017
-
1018
- @media (min-width: 52rem) {
1019
- .diagrams__grid {
1020
- grid-template-columns: repeat(2, minmax(0, 1fr));
1021
- }
1022
-
1023
- .diagram-card:first-child {
1024
- grid-column: 1 / -1;
1025
- }
1086
+ max-width: 40rem;
1026
1087
  }
1027
1088
 
1028
1089
  .diagram-card__head {
1029
- padding: 1.25rem 1.25rem 0;
1090
+ padding: 1.15rem 1.15rem 0;
1030
1091
  }
1031
1092
 
1032
1093
  .diagram-card__head h3 {
1033
- margin: 0 0 0.5rem;
1094
+ margin: 0 0 0.35rem;
1034
1095
  font-family: var(--font-display);
1035
- font-size: 1.15rem;
1096
+ font-size: 1.05rem;
1036
1097
  font-weight: 600;
1037
1098
  }
1038
1099
 
1039
1100
  .diagram-card__head p {
1040
- margin: 0 0 0.65rem;
1041
- font-size: 0.9rem;
1101
+ margin: 0;
1102
+ font-size: 0.875rem;
1042
1103
  color: var(--text-muted);
1043
- line-height: 1.55;
1044
- }
1045
-
1046
- .diagram-card__ref {
1047
- display: inline-block;
1048
- font-size: 0.72rem;
1049
- padding: 0.2rem 0.5rem;
1050
- border-radius: 4px;
1051
- background: var(--bg-elevated);
1052
- border: 1px solid var(--border);
1053
- color: var(--aeon-accent);
1104
+ line-height: 1.5;
1105
+ max-width: 40ch;
1054
1106
  }
1055
1107
 
1056
1108
  .diagram-card__figure {
1057
1109
  margin: 0;
1058
- padding: 0.75rem 1rem 1.25rem;
1110
+ padding: 1rem 1.15rem 1.15rem;
1059
1111
  overflow-x: auto;
1060
1112
  }
1061
1113
 
1114
+ .diagram-card__mermaid {
1115
+ min-height: 5rem;
1116
+ }
1117
+
1062
1118
  .diagram-card__mermaid svg {
1063
1119
  display: block;
1064
- max-width: 100%;
1120
+ width: 100%;
1121
+ max-width: 36rem;
1065
1122
  height: auto;
1066
1123
  margin-inline: auto;
1067
1124
  }
@@ -1,8 +1,8 @@
1
1
  export const navLinks = [
2
- { href: '#layers', label: 'Architecture', sectionId: 'layers' },
3
- { href: '#diagrams', label: 'Diagrams', sectionId: 'diagrams' },
4
- { href: '#playground', label: 'Components', sectionId: 'playground' },
5
2
  { href: '#philosophy', label: 'Foundation', sectionId: 'philosophy' },
3
+ { href: '#playground', label: 'Components', sectionId: 'playground' },
4
+ { href: '#layers', label: 'Shape', sectionId: 'layers' },
5
+ { href: '#diagrams', label: 'Statecharts', sectionId: 'diagrams' },
6
6
  { href: '#faq', label: 'FAQ', sectionId: 'faq' },
7
7
  ] as const
8
8