@donotdev/ui 0.0.2 → 0.0.4

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 (119) hide show
  1. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  2. package/dist/components/auth/AuthMenu.js +19 -32
  3. package/dist/components/common/FeatureCard.d.ts +7 -19
  4. package/dist/components/common/FeatureCard.d.ts.map +1 -1
  5. package/dist/components/common/FeatureCard.js +5 -29
  6. package/dist/components/common/TechBento.d.ts +15 -3
  7. package/dist/components/common/TechBento.d.ts.map +1 -1
  8. package/dist/components/common/TechBento.js +20 -2
  9. package/dist/components/cookie-consent/CookieConsent.d.ts.map +1 -1
  10. package/dist/components/cookie-consent/CookieConsent.js +2 -41
  11. package/dist/components/cookie-consent/index.d.ts +0 -1
  12. package/dist/components/cookie-consent/index.d.ts.map +1 -1
  13. package/dist/components/cookie-consent/index.js +1 -1
  14. package/dist/components/layout/components/DropdownNavigation.d.ts.map +1 -1
  15. package/dist/components/layout/components/header/ThemeToggle.d.ts +1 -1
  16. package/dist/components/layout/components/header/ThemeToggle.d.ts.map +1 -1
  17. package/dist/components/layout/components/header/ThemeToggle.js +5 -4
  18. package/dist/dndev.css +373 -249
  19. package/dist/index.js +4 -4
  20. package/dist/internal/devtools/DebugTools.d.ts.map +1 -1
  21. package/dist/internal/devtools/DebugTools.js +8 -4
  22. package/dist/internal/devtools/components/ConfigTab.d.ts.map +1 -1
  23. package/dist/internal/devtools/components/ConfigTab.js +33 -133
  24. package/dist/internal/devtools/components/DebugDialog.d.ts.map +1 -1
  25. package/dist/internal/devtools/components/DebugDialog.js +11 -520
  26. package/dist/internal/devtools/components/DesignTab.d.ts +2 -0
  27. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -0
  28. package/dist/internal/devtools/components/DesignTab.js +431 -0
  29. package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
  30. package/dist/internal/devtools/components/StoresTab.js +54 -102
  31. package/dist/internal/devtools/components/index.d.ts +1 -6
  32. package/dist/internal/devtools/components/index.d.ts.map +1 -1
  33. package/dist/internal/devtools/components/index.js +1 -6
  34. package/dist/internal/devtools/utils/index.d.ts +0 -1
  35. package/dist/internal/devtools/utils/index.d.ts.map +1 -1
  36. package/dist/internal/devtools/utils/index.js +0 -1
  37. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  38. package/dist/internal/initializers/BaseStoresInitializer.js +36 -59
  39. package/dist/internal/layout/DnDevLayout.js +3 -3
  40. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  41. package/dist/internal/layout/components/AutoMetaTags.js +6 -1
  42. package/dist/internal/layout/components/footer/FooterBranding.d.ts.map +1 -1
  43. package/dist/internal/layout/components/footer/FooterBranding.js +3 -1
  44. package/dist/internal/layout/zones/DnDevFooter.js +2 -2
  45. package/dist/routing/AuthGuard.d.ts +14 -10
  46. package/dist/routing/AuthGuard.d.ts.map +1 -1
  47. package/dist/routing/AuthGuard.js +25 -22
  48. package/dist/routing/Link.d.ts +2 -2
  49. package/dist/routing/Link.js +2 -2
  50. package/dist/routing/hooks/hooks.next.js +1 -1
  51. package/dist/routing/hooks/hooks.vite.js +1 -1
  52. package/dist/routing/hooks/useRedirectGuard.next.d.ts +2 -36
  53. package/dist/routing/hooks/useRedirectGuard.next.d.ts.map +1 -1
  54. package/dist/routing/hooks/useRedirectGuard.next.js +14 -55
  55. package/dist/routing/hooks/useRedirectGuard.vite.d.ts +2 -36
  56. package/dist/routing/hooks/useRedirectGuard.vite.d.ts.map +1 -1
  57. package/dist/routing/hooks/useRedirectGuard.vite.js +14 -55
  58. package/dist/routing/index.d.ts +0 -1
  59. package/dist/routing/index.d.ts.map +1 -1
  60. package/dist/routing/index.js +1 -1
  61. package/dist/styles/index.css +373 -249
  62. package/dist/utils/assetResolver.d.ts +5 -5
  63. package/dist/utils/assetResolver.d.ts.map +1 -1
  64. package/dist/utils/assetResolver.js +26 -15
  65. package/dist/utils/index.d.ts +1 -0
  66. package/dist/utils/index.d.ts.map +1 -1
  67. package/dist/utils/index.js +1 -0
  68. package/dist/utils/tList.d.ts +30 -0
  69. package/dist/utils/tList.d.ts.map +1 -0
  70. package/dist/utils/tList.js +51 -0
  71. package/dist/utils/useAuthSafe.d.ts +25 -12
  72. package/dist/utils/useAuthSafe.d.ts.map +1 -1
  73. package/dist/utils/useAuthSafe.js +3 -1
  74. package/dist/utils/useAuthVisibility.d.ts +3 -3
  75. package/dist/utils/useAuthVisibility.d.ts.map +1 -1
  76. package/dist/utils/useAuthVisibility.js +25 -21
  77. package/dist/utils/useBillingVisibility.d.ts +2 -2
  78. package/dist/utils/useBillingVisibility.d.ts.map +1 -1
  79. package/dist/utils/useBillingVisibility.js +12 -13
  80. package/dist/utils/useCrudSafe.d.ts +1 -1
  81. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  82. package/dist/utils/useCrudSafe.js +26 -13
  83. package/dist/utils/useOAuthSafe.d.ts +25 -12
  84. package/dist/utils/useOAuthSafe.d.ts.map +1 -1
  85. package/dist/utils/useStripeBillingSafe.d.ts +30 -18
  86. package/dist/utils/useStripeBillingSafe.d.ts.map +1 -1
  87. package/dist/utils/useStripeBillingSafe.js +5 -6
  88. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  89. package/dist/vite-routing/AppRoutes.js +5 -5
  90. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  91. package/dist/vite-routing/RootLayout.js +34 -7
  92. package/package.json +9 -9
  93. package/dist/internal/devtools/components/AuthTab.d.ts +0 -2
  94. package/dist/internal/devtools/components/AuthTab.d.ts.map +0 -1
  95. package/dist/internal/devtools/components/AuthTab.js +0 -98
  96. package/dist/internal/devtools/components/ColorRatioTab.d.ts +0 -2
  97. package/dist/internal/devtools/components/ColorRatioTab.d.ts.map +0 -1
  98. package/dist/internal/devtools/components/ColorRatioTab.js +0 -322
  99. package/dist/internal/devtools/components/DebugToggle.d.ts +0 -2
  100. package/dist/internal/devtools/components/DebugToggle.d.ts.map +0 -1
  101. package/dist/internal/devtools/components/DebugToggle.js +0 -57
  102. package/dist/internal/devtools/components/EnvironmentTab.d.ts +0 -2
  103. package/dist/internal/devtools/components/EnvironmentTab.d.ts.map +0 -1
  104. package/dist/internal/devtools/components/EnvironmentTab.js +0 -26
  105. package/dist/internal/devtools/components/I18nTab.d.ts +0 -2
  106. package/dist/internal/devtools/components/I18nTab.d.ts.map +0 -1
  107. package/dist/internal/devtools/components/I18nTab.js +0 -76
  108. package/dist/internal/devtools/components/OAuthGuideButton.d.ts +0 -10
  109. package/dist/internal/devtools/components/OAuthGuideButton.d.ts.map +0 -1
  110. package/dist/internal/devtools/components/OAuthGuideButton.js +0 -71
  111. package/dist/internal/devtools/components/StripeDebugTab.d.ts +0 -2
  112. package/dist/internal/devtools/components/StripeDebugTab.d.ts.map +0 -1
  113. package/dist/internal/devtools/components/StripeDebugTab.js +0 -175
  114. package/dist/internal/devtools/components/ThemesTab.d.ts +0 -2
  115. package/dist/internal/devtools/components/ThemesTab.d.ts.map +0 -1
  116. package/dist/internal/devtools/components/ThemesTab.js +0 -77
  117. package/dist/internal/devtools/utils/spacingAnalyzer.d.ts +0 -15
  118. package/dist/internal/devtools/utils/spacingAnalyzer.d.ts.map +0 -1
  119. package/dist/internal/devtools/utils/spacingAnalyzer.js +0 -88
@@ -18,9 +18,10 @@
18
18
  Used by: CSS @media queries, JavaScript hooks, responsive components
19
19
  Note: CSS variables don't work in @media, so we use hardcoded px values
20
20
  =========================== */
21
- --breakpoint-mobile: 768px;
22
- --breakpoint-tablet: 1024px; /* Key breakpoint, layout presets are based on mobile + tablet vs desktop+wide breakpoints */
23
- --breakpoint-desktop: 1440px;
21
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
22
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
23
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
24
+ --breakpoint-desktop: 1920px; /* 1440+ = desktop */
24
25
 
25
26
  /* ===========================
26
27
  INTERACTIVE ELEMENTS
@@ -285,28 +286,48 @@
285
286
  /* Compact (Admin/Data) - Dense, information-dense layouts - Minor Third (1.2×) */
286
287
 
287
288
  [data-density='compact'] {
288
- --font-size-base: 0.875rem; /* 14px */
289
- --font-size-lg: 1.05rem; /* base × 1.2¹ */
290
- --font-size-xl: 1.26rem; /* base × 1. */
291
- --font-size-2xl: 1.512rem; /* base × 1. */
292
- --font-size-3xl: 1.814rem; /* base × 1.2⁴ */
293
- --gap-sm: 0.375rem; /* 6px - tighter than standard */
294
- --gap-md: 0.75rem; /* 12px */
295
- --gap-lg: 1.5rem; /* 24px */
289
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
290
+ --font-size-base: clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem); /* 14-15px fluid */
291
+ --font-size-lg: clamp(1.05rem, 0.9375rem + 0.5vw, 1.125rem); /* 17-18px fluid */
292
+ --font-size-xl: clamp(1.26rem, 1.125rem + 0.75vw, 1.375rem); /* 20-22px fluid */
293
+ /* Display sizes: Musical scale + fluid responsiveness */
294
+ --font-size-2xl: clamp(
295
+ 1.512rem,
296
+ 1.375rem + 0.75vw,
297
+ 1.625rem
298
+ ); /* 24-26px fluid */
299
+ --font-size-3xl: clamp(
300
+ 1.814rem,
301
+ 1.625rem + 1vw,
302
+ 2rem
303
+ ); /* 29-32px fluid */
304
+ --gap-sm: clamp(0.375rem, 0.3125rem + 0.25vw, 0.5rem); /* 6-8px fluid */
305
+ --gap-md: clamp(0.75rem, 0.625rem + 0.5vw, 0.875rem); /* 12-14px fluid, zoom-safe */
306
+ --gap-lg: clamp(1.5rem, 1.25rem + 1vw, 1.75rem); /* 24-28px fluid, zoom-safe */
296
307
  --line-height: 1.2; /* Minor Third - All text */
297
308
  }
298
309
 
299
310
  /* Standard (Docs/SaaS) - DEFAULT, balanced for readability */
300
311
 
301
312
  [data-density='standard'] {
302
- --font-size-base: 1rem; /* 16px */
303
- --font-size-lg: 1.25rem; /* 20px - base × 1.25¹ */
304
- --font-size-xl: 1.563rem; /* 25px - base × 1.25² */
305
- --font-size-2xl: 1.953rem; /* 31px - base × 1.25³ */
306
- --font-size-3xl: 2.441rem; /* 39px - base × 1.25⁴ - hero text */
307
- --gap-sm: 0.5rem; /* 8px - explicit default */
308
- --gap-md: 1rem; /* 16px */
309
- --gap-lg: 2rem; /* 32px */
313
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
314
+ --font-size-base: clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem); /* 16-17px fluid */
315
+ --font-size-lg: clamp(1.25rem, 1.125rem + 0.5vw, 1.375rem); /* 20-22px fluid */
316
+ --font-size-xl: clamp(1.563rem, 1.375rem + 0.75vw, 1.75rem); /* 25-28px fluid */
317
+ /* Display sizes: Musical scale + fluid responsiveness */
318
+ --font-size-2xl: clamp(
319
+ 1.953rem,
320
+ 1.75rem + 1vw,
321
+ 2.25rem
322
+ ); /* 31-36px fluid */
323
+ --font-size-3xl: clamp(
324
+ 2.441rem,
325
+ 2rem + 1.5vw,
326
+ 3rem
327
+ ); /* 39-48px fluid - hero text */
328
+ --gap-sm: clamp(0.5rem, 0.4375rem + 0.25vw, 0.625rem); /* 8-10px fluid */
329
+ --gap-md: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* 16-20px fluid, zoom-safe */
330
+ --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
310
331
  --line-height: 1.25; /* Major Third - All text */
311
332
  }
312
333
 
@@ -535,52 +556,19 @@ a:not(.dndev-interactive):active {
535
556
  a:focus-visible {
536
557
  outline: 2px solid var(--ring);
537
558
  outline-offset: 2px;
538
- border-radius: var(--radius-md);
559
+ border-radius: var(--radius-interactive);
539
560
  }
540
561
 
541
- /* ===========================
542
- BASE LIST STYLING
543
- Use text-base styles for lists
544
- =========================== */
545
-
546
- /* Content lists only - not navigation menus */
547
-
548
- main ul,
549
- main ol,
550
- article ul,
551
- article ol {
552
- font-weight: 500;
553
- line-height: var(--line-height);
554
- color: var(--foreground);
555
- background: transparent !important;
556
- list-style-position: outside;
557
- padding-inline-start: var(--gap-lg);
558
- margin-block: var(--gap-md);
559
- }
562
+ /* Main element - no focus outline (programmatic focus for keyboard nav) */
560
563
 
561
- main ul,
562
- article ul {
563
- list-style-type: disc;
564
- }
565
-
566
- main ol,
567
- article ol {
568
- list-style-type: decimal;
569
- }
570
-
571
- main li,
572
- article li {
573
- font-weight: 500;
574
- line-height: var(--line-height);
575
- color: var(--foreground);
576
- background: transparent !important;
577
- margin-block: var(--gap-sm);
578
- padding-inline-start: var(--gap-sm);
564
+ main:focus-visible {
565
+ outline: none;
579
566
  }
580
567
 
581
568
  /* ===========================
582
- BASE TYPOGRAPHY STYLING
583
- Use text-base styles for headings and paragraphs
569
+ BASE TYPOGRAPHY - RESET ONLY
570
+ Zero margins, components own their spacing
571
+ Use .prose wrapper for content pages (docs, markdown)
584
572
  =========================== */
585
573
 
586
574
  h1,
@@ -589,49 +577,71 @@ h3,
589
577
  h4,
590
578
  h5,
591
579
  h6 {
592
- font-weight: 500;
580
+ font-weight: var(--font-weight-medium);
593
581
  line-height: var(--line-height);
594
582
  color: var(--foreground);
595
583
  background: transparent;
596
- margin-block: var(--gap-md);
597
584
  }
598
585
 
599
586
  h1 {
600
587
  font-family: var(--font-headline);
601
588
  font-size: var(--font-size-3xl);
602
- font-weight: 700;
589
+ font-weight: var(--font-weight-bold);
603
590
  letter-spacing: -0.02em;
604
591
  }
605
592
 
606
593
  h2 {
607
594
  font-family: var(--font-headline);
608
595
  font-size: var(--font-size-2xl);
609
- font-weight: 700;
596
+ font-weight: var(--font-weight-bold);
610
597
  letter-spacing: -0.01em;
611
598
  }
612
599
 
613
600
  h3 {
614
601
  font-size: var(--font-size-xl);
615
- font-weight: 600;
602
+ font-weight: var(--font-weight-semibold);
616
603
  }
617
604
 
618
605
  h4 {
619
606
  font-size: var(--font-size-lg);
620
- font-weight: 600;
607
+ font-weight: var(--font-weight-semibold);
621
608
  }
622
609
 
623
610
  h5,
624
611
  h6 {
625
612
  font-size: var(--font-size-base);
626
- font-weight: 600;
613
+ font-weight: var(--font-weight-semibold);
627
614
  }
628
615
 
629
616
  p {
630
- font-weight: 500;
617
+ font-weight: var(--font-weight-medium);
618
+ line-height: var(--line-height);
619
+ color: var(--foreground);
620
+ background: transparent;
621
+ }
622
+
623
+ ul,
624
+ ol {
625
+ font-weight: var(--font-weight-medium);
626
+ line-height: var(--line-height);
627
+ color: var(--foreground);
628
+ background: transparent;
629
+ list-style-position: outside;
630
+ }
631
+
632
+ ul {
633
+ list-style-type: disc;
634
+ }
635
+
636
+ ol {
637
+ list-style-type: decimal;
638
+ }
639
+
640
+ li {
641
+ font-weight: var(--font-weight-medium);
631
642
  line-height: var(--line-height);
632
643
  color: var(--foreground);
633
644
  background: transparent;
634
- margin-block: var(--gap-md);
635
645
  }
636
646
 
637
647
  /* Semantic HTML - strong and em */
@@ -678,7 +688,7 @@ em {
678
688
  .dndev-input {
679
689
  display: flex;
680
690
  width: 100%;
681
- border-radius: 0;
691
+ border-radius: var(--radius-interactive);
682
692
  border: var(--border-hairline) solid var(--line-2);
683
693
  background-color: transparent;
684
694
  color: var(--foreground);
@@ -940,15 +950,21 @@ em {
940
950
 
941
951
  .dndev-surface[data-role='card'] {
942
952
  padding: var(--gap-md);
943
- border-radius: var(--radius-md);
953
+ border-radius: var(--radius-surface);
944
954
  }
945
955
 
946
956
  /* Elevated cards - stronger shadow */
947
957
 
948
- .dndev-surface[data-elevated='true'] {
958
+ /* Apply if elevated=true OR (clickable=true AND elevated!=false) */
959
+
960
+ .dndev-surface[data-elevated='true'],.dndev-surface[data-clickable='true']:not([data-elevated='false']) {
949
961
  box-shadow: var(--shadow-xl);
950
962
  }
951
963
 
964
+ :is(.dndev-surface[data-elevated='true'],.dndev-surface[data-clickable='true']:not([data-elevated='false'])):dir(rtl) {
965
+ box-shadow: var(--shadow-xl-rtl);
966
+ }
967
+
952
968
  /* Clickable cards - hover effects */
953
969
 
954
970
  .dndev-surface[data-clickable='true'] {
@@ -1181,7 +1197,7 @@ em {
1181
1197
 
1182
1198
  .dndev-floating[data-role='card'] {
1183
1199
  padding: var(--gap-md);
1184
- border-radius: var(--radius-md);
1200
+ border-radius: var(--radius-surface);
1185
1201
  }
1186
1202
 
1187
1203
  .dndev-floating[data-role='floating'] {
@@ -1643,6 +1659,38 @@ em {
1643
1659
  color: var(--background);
1644
1660
  }
1645
1661
 
1662
+ /* CONTROL GROUP - Shared pattern for grouped controls (RadioGroup, Checkbox groups) */
1663
+
1664
+ .dndev-control-group {
1665
+ display: grid;
1666
+ gap: var(--gap-md); /* 16px - standard spacing between grouped items */
1667
+
1668
+ /* Control + label pattern - used by RadioGroup, CheckboxFieldComponent, etc. */
1669
+ }
1670
+
1671
+ .dndev-control-group label {
1672
+ display: flex;
1673
+ align-items: center;
1674
+ gap: var(--gap-sm); /* 8px - spacing between control and label */
1675
+ font-size: var(--font-size-base);
1676
+ color: var(--foreground);
1677
+ cursor: pointer;
1678
+ transition: color var(--transition-fast);
1679
+
1680
+ /* Subtle hover on label text */
1681
+ }
1682
+
1683
+ :is(.dndev-control-group label):hover {
1684
+ color: var(--primary);
1685
+ }
1686
+
1687
+ /* Selected state - label color changes */
1688
+
1689
+ :is(.dndev-control-group label):has([data-state='checked']),:is(.dndev-control-group label):has([data-state='on']) {
1690
+ color: var(--primary);
1691
+ font-weight: var(--font-weight-medium);
1692
+ }
1693
+
1646
1694
  /**
1647
1695
  * Variant system - 8 control variants
1648
1696
  * Variants override --control-border to use semantic colors
@@ -1650,37 +1698,37 @@ em {
1650
1698
  * On state: fills with variant color
1651
1699
  */
1652
1700
 
1653
- .dndev-control[data-variant='primary'] {
1701
+ .dndev-control-group[data-variant='primary'] {
1654
1702
  --control-border: var(--primary);
1655
1703
  }
1656
1704
 
1657
- .dndev-control[data-variant='secondary'] {
1705
+ .dndev-control-group[data-variant='secondary'] {
1658
1706
  --control-border: var(--secondary);
1659
1707
  }
1660
1708
 
1661
- .dndev-control[data-variant='muted'] {
1709
+ .dndev-control-group[data-variant='muted'] {
1662
1710
  --control-border: var(--muted-foreground);
1663
1711
  }
1664
1712
 
1665
- .dndev-control[data-variant='accent'] {
1713
+ .dndev-control-group[data-variant='accent'] {
1666
1714
  --control-border: var(--accent);
1667
1715
  }
1668
1716
 
1669
- .dndev-control[data-variant='success'] {
1717
+ .dndev-control-group[data-variant='success'] {
1670
1718
  --control-border: var(--success);
1671
1719
  }
1672
1720
 
1673
- .dndev-control[data-variant='warning'] {
1721
+ .dndev-control-group[data-variant='warning'] {
1674
1722
  --control-border: var(--warning);
1675
1723
  }
1676
1724
 
1677
- .dndev-control[data-variant='destructive'] {
1725
+ .dndev-control-group[data-variant='destructive'] {
1678
1726
  --control-border: var(--destructive);
1679
1727
  }
1680
1728
 
1681
1729
  /* Default variant explicitly (same as base) */
1682
1730
 
1683
- .dndev-control[data-variant='default'] {
1731
+ .dndev-control-group[data-variant='default'] {
1684
1732
  --control-border: color-mix(
1685
1733
  in oklab,
1686
1734
  var(--foreground) 70%,
@@ -1768,7 +1816,7 @@ em {
1768
1816
  display: grid;
1769
1817
  gap: var(--gap-sm);
1770
1818
  padding: var(--gap-md);
1771
- border-radius: var(--radius-none);
1819
+ border-radius: var(--radius-floating);
1772
1820
  border: var(--border-hairline) solid var(--border);
1773
1821
  /* Inverted floating colors: popover-foreground as background, popover as foreground */
1774
1822
  background: color-mix(in oklab, var(--popover-foreground) 95%, transparent);
@@ -1913,7 +1961,7 @@ em {
1913
1961
  width: var(--icon-md);
1914
1962
  height: var(--icon-md);
1915
1963
  border: 2px solid currentColor;
1916
- border-radius: 50%;
1964
+ border-radius: var(--radius-full);
1917
1965
  border-right-color: transparent;
1918
1966
  animation: spin 1s linear infinite;
1919
1967
  }
@@ -2050,7 +2098,7 @@ em {
2050
2098
  display: flex;
2051
2099
  flex-direction: column;
2052
2100
  padding: 0;
2053
- border-radius: 0;
2101
+ border-radius: var(--radius-floating);
2054
2102
  min-width: 15ch; /* Character-based: scales with font size, ensures readable width */
2055
2103
  width: -moz-fit-content;
2056
2104
  width: fit-content; /* Stretch to fit children */
@@ -2327,14 +2375,15 @@ em {
2327
2375
  margin-top: var(--gap-md);
2328
2376
  }
2329
2377
 
2330
- /* Tech card */
2378
+ /* Tech card - override Card's grid layout for centered content */
2331
2379
 
2332
2380
  .dndev-tech-card {
2333
2381
  height: 100%;
2334
2382
  min-height: 120px;
2335
- display: flex;
2383
+ display: flex !important; /* Override Card's grid layout */
2336
2384
  align-items: center;
2337
2385
  justify-content: center;
2386
+ align-content: center; /* Override Card's align-content: start */
2338
2387
  transition:
2339
2388
  border-color 0.2s ease,
2340
2389
  box-shadow 0.2s ease;
@@ -2404,7 +2453,7 @@ em {
2404
2453
  }
2405
2454
 
2406
2455
  .dndev-blockquote-content {
2407
- font-size: 1.125em; /* 1.125x body (18px on 16px base) */
2456
+ font-size: var(--font-size-lg); /* 20px - emphasized text */
2408
2457
  line-height: 1.7; /* Industry standard for readability */
2409
2458
  font-weight: 400;
2410
2459
  color: inherit;
@@ -2438,10 +2487,15 @@ em {
2438
2487
  */
2439
2488
 
2440
2489
  .dndev-blockquote[data-variant='default'] blockquote {
2441
- padding: var(--gap-md) var(--gap-md) var(--gap-md) var(--gap-lg);
2490
+ padding: var(--gap-md) calc(var(--gap-md) + 4px) var(--gap-md) var(--gap-lg);
2442
2491
  background: var(--muted);
2443
2492
  border-inline-start: 4px solid var(--primary);
2444
- border-radius: 0 var(--radius-md) var(--radius-md) 0;
2493
+ border-inline-end: none;
2494
+ border-block-start: none;
2495
+ border-block-end: none;
2496
+ border-radius: var(--radius-interactive) var(--radius-surface)
2497
+ var(--radius-surface) var(--radius-interactive);
2498
+ overflow: hidden;
2445
2499
  }
2446
2500
 
2447
2501
  .dndev-blockquote[data-variant='default'] .dndev-blockquote-content {
@@ -2462,7 +2516,7 @@ em {
2462
2516
  .dndev-blockquote[data-variant='editorial'] .dndev-blockquote-content {
2463
2517
  font-family: Georgia, 'Times New Roman', serif;
2464
2518
  font-style: italic;
2465
- font-size: 1.25em; /* Larger for editorial impact */
2519
+ font-size: var(--font-size-xl); /* 25px - larger for editorial impact */
2466
2520
  color: inherit;
2467
2521
  opacity: 0.95;
2468
2522
  }
@@ -2480,7 +2534,7 @@ em {
2480
2534
  .dndev-blockquote[data-variant='testimonial'] {
2481
2535
  background: var(--card);
2482
2536
  border: 1px solid var(--border);
2483
- border-radius: var(--radius-lg);
2537
+ border-radius: var(--radius-surface);
2484
2538
  padding: calc(var(--gap-lg) + var(--gap-md)); /* 2.5rem */
2485
2539
  box-shadow:
2486
2540
  0 1px 3px 0 hsl(var(--foreground-hsl) / 0.1),
@@ -2522,11 +2576,11 @@ em {
2522
2576
  }
2523
2577
 
2524
2578
  .dndev-blockquote-content {
2525
- font-size: 1.0625em; /* Slightly smaller on mobile (17px) */
2579
+ font-size: var(--font-size-base); /* Slightly smaller on mobile */
2526
2580
  }
2527
2581
 
2528
2582
  .dndev-blockquote[data-variant='editorial'] .dndev-blockquote-content {
2529
- font-size: 1.125em;
2583
+ font-size: var(--font-size-lg);
2530
2584
  }
2531
2585
 
2532
2586
  .dndev-blockquote[data-variant='testimonial'] {
@@ -2556,7 +2610,7 @@ em {
2556
2610
  color: var(--popover-foreground);
2557
2611
  background: var(--popover);
2558
2612
  border: var(--border-hairline) solid var(--border);
2559
- border-radius: var(--radius-interactive);
2613
+ border-radius: var(--radius-floating);
2560
2614
  box-shadow: var(--shadow-md);
2561
2615
  }
2562
2616
 
@@ -2842,13 +2896,40 @@ em {
2842
2896
  /* packages/components/src/atomic/CallToAction/CallToAction.css */
2843
2897
 
2844
2898
  .dndev-cta {
2845
- /* Full width gradient */
2899
+ /* Default gradient */
2846
2900
  background: linear-gradient(to right, var(--secondary), var(--background));
2847
2901
  color: var(--foreground);
2848
2902
  /* Padding for background - vertical only, horizontal handled by content */
2849
2903
  padding-block: var(--gap-lg);
2850
2904
  }
2851
2905
 
2906
+ /* Tone variants - leverage existing data-tone system */
2907
+
2908
+ .dndev-cta[data-tone='base'] {
2909
+ background: linear-gradient(to right, var(--secondary), var(--background));
2910
+ }
2911
+
2912
+ .dndev-cta[data-tone='muted'] {
2913
+ background: linear-gradient(to right, var(--muted), var(--background));
2914
+ }
2915
+
2916
+ .dndev-cta[data-tone='accent'] {
2917
+ background: linear-gradient(
2918
+ to right,
2919
+ color-mix(in oklab, var(--accent) 10%, transparent),
2920
+ var(--background)
2921
+ );
2922
+ }
2923
+
2924
+ .dndev-cta[data-tone='contrast'] {
2925
+ background: linear-gradient(to right, var(--foreground), var(--background));
2926
+ color: var(--background);
2927
+ }
2928
+
2929
+ .dndev-cta[data-tone='elevated'] {
2930
+ background: linear-gradient(to right, var(--secondary), var(--background));
2931
+ }
2932
+
2852
2933
  .dndev-cta-content {
2853
2934
  display: flex;
2854
2935
  flex-direction: column;
@@ -2929,19 +3010,35 @@ em {
2929
3010
  .dndev-card {
2930
3011
  display: grid;
2931
3012
  gap: var(--gap-md);
3013
+ text-align: start;
3014
+ align-content: start;
3015
+ }
3016
+
3017
+ .dndev-card-header {
3018
+ display: flex;
3019
+ flex-direction: column;
3020
+ }
3021
+
3022
+ .dndev-card-header > .dndev-stack {
3023
+ min-width: 0;
3024
+ }
3025
+
3026
+ .dndev-card-header > .dndev-stack > .dndev-card-title {
3027
+ flex: 1;
3028
+ min-width: 0;
2932
3029
  }
2933
3030
 
2934
3031
  .dndev-card-title {
2935
- font-size: var(--font-size-xl);
2936
- font-weight: 600;
2937
- color: inherit; /* Inherit from surface variant */
2938
3032
  margin: 0;
3033
+ min-width: 0;
3034
+ word-wrap: break-word;
2939
3035
  }
2940
3036
 
2941
3037
  .dndev-card-subtitle {
2942
- font-size: var(--font-size-base);
2943
- font-weight: 600;
2944
- color: inherit; /* Inherit from surface variant */
3038
+ margin-top: 0;
3039
+ margin-bottom: 0;
3040
+ min-width: 0;
3041
+ word-wrap: break-word;
2945
3042
  }
2946
3043
 
2947
3044
  /* packages/components/src/atomic/Checkbox/Checkbox.css */
@@ -3334,7 +3431,7 @@ em {
3334
3431
 
3335
3432
  .dndev-command-footer-key {
3336
3433
  padding: 0.125rem 0.375rem;
3337
- border-radius: calc(var(--radius-md) * 0.5);
3434
+ border-radius: 2px;
3338
3435
  background: var(--muted);
3339
3436
  border: 1px solid var(--border);
3340
3437
  font-family: var(--font-mono);
@@ -3654,56 +3751,34 @@ em {
3654
3751
  display: grid;
3655
3752
  min-width: 0;
3656
3753
  width: 100%;
3754
+ /* Default: use mobile columns */
3755
+ grid-template-columns: repeat(var(--grid-cols-mobile, 1), 1fr);
3657
3756
  }
3658
3757
 
3659
- /* Columns */
3758
+ /* Responsive columns via media queries */
3660
3759
 
3661
- .dndev-grid-component[data-cols='1'] {
3662
- grid-template-columns: repeat(1, minmax(0, 1fr));
3663
- }
3664
-
3665
- .dndev-grid-component[data-cols='2'] {
3666
- grid-template-columns: repeat(2, minmax(0, 1fr));
3667
- }
3668
-
3669
- .dndev-grid-component[data-cols='3'] {
3670
- grid-template-columns: repeat(3, minmax(0, 1fr));
3671
- }
3760
+ /* Tablet: 768px+ */
3672
3761
 
3673
- .dndev-grid-component[data-cols='4'] {
3674
- grid-template-columns: repeat(4, minmax(0, 1fr));
3675
- }
3676
-
3677
- .dndev-grid-component[data-cols='5'] {
3678
- grid-template-columns: repeat(5, minmax(0, 1fr));
3679
- }
3680
-
3681
- .dndev-grid-component[data-cols='6'] {
3682
- grid-template-columns: repeat(6, minmax(0, 1fr));
3762
+ @media (min-width: 768px) {
3763
+ .dndev-grid-component {
3764
+ grid-template-columns: repeat(var(--grid-cols-tablet, 1), 1fr);
3765
+ }
3683
3766
  }
3684
3767
 
3685
- .dndev-grid-component[data-cols='10'] {
3686
- grid-template-columns: repeat(10, minmax(0, 1fr));
3687
- }
3768
+ /* Laptop: 1024px+ (key layout split) */
3688
3769
 
3689
- .dndev-grid-component[data-cols='12'] {
3690
- grid-template-columns: repeat(12, minmax(0, 1fr));
3770
+ @media (min-width: 1024px) {
3771
+ .dndev-grid-component {
3772
+ grid-template-columns: repeat(var(--grid-cols-laptop, 1), 1fr);
3773
+ }
3691
3774
  }
3692
3775
 
3693
- /* Auto-fit/fill columns */
3776
+ /* Desktop: 1440px+ */
3694
3777
 
3695
- .dndev-grid-component[data-cols='auto-fit'] {
3696
- grid-template-columns: repeat(
3697
- auto-fit,
3698
- minmax(min(100%, var(--min-col-width, 250px)), 1fr)
3699
- );
3700
- }
3701
-
3702
- .dndev-grid-component[data-cols='auto-fill'] {
3703
- grid-template-columns: repeat(
3704
- auto-fill,
3705
- minmax(min(100%, var(--min-col-width, 250px)), 1fr)
3706
- );
3778
+ @media (min-width: 1440px) {
3779
+ .dndev-grid-component {
3780
+ grid-template-columns: repeat(var(--grid-cols-desktop, 1), 1fr);
3781
+ }
3707
3782
  }
3708
3783
 
3709
3784
  /* Spacing from CSS variables */
@@ -3849,21 +3924,7 @@ em {
3849
3924
  }
3850
3925
 
3851
3926
  .dndev-hero-subtitle {
3852
- font-size: var(--font-size-xl);
3853
- }
3854
-
3855
- /* Responsive Content Visibility */
3856
-
3857
- @media (width < 1024px) {
3858
- .dndev-hero-section .dndev-desktop-only {
3859
- display: none !important;
3860
- }
3861
- }
3862
-
3863
- @media (width >= 1024px) {
3864
- .dndev-hero-section .dndev-mobile-only {
3865
- display: none !important;
3866
- }
3927
+ font-size: var(--font-size-lg); /* 20px - muted via component */
3867
3928
  }
3868
3929
 
3869
3930
  /* packages/components/src/atomic/HoverCard/HoverCard.css */
@@ -3882,7 +3943,7 @@ em {
3882
3943
  height: var(--touch-target);
3883
3944
  padding: 0;
3884
3945
  border: 1px solid var(--card-foreground);
3885
- border-radius: var(--radius-md);
3946
+ border-radius: var(--radius-surface);
3886
3947
  background: transparent;
3887
3948
  display: inline-flex;
3888
3949
  align-items: center;
@@ -4022,7 +4083,7 @@ em {
4022
4083
 
4023
4084
  .dndev-json-viewer-container {
4024
4085
  background-color: var(--muted);
4025
- border-radius: var(--radius);
4086
+ border-radius: var(--radius-surface);
4026
4087
  padding: 1rem;
4027
4088
  overflow: auto;
4028
4089
  max-height: 600px;
@@ -4079,7 +4140,7 @@ em {
4079
4140
  align-items: flex-start;
4080
4141
  gap: 0.25rem;
4081
4142
  cursor: pointer;
4082
- border-radius: var(--radius-sm);
4143
+ border-radius: var(--radius-interactive);
4083
4144
  padding-inline-start: 0.25rem;
4084
4145
  padding-inline-end: 0.25rem;
4085
4146
  margin-inline-start: -0.25rem;
@@ -4176,16 +4237,13 @@ em {
4176
4237
  .dndev-list {
4177
4238
  display: flex;
4178
4239
  flex-direction: column;
4179
- gap: var(--gap-none);
4240
+ gap: var(--gap-sm);
4180
4241
  padding-inline-start: 0; /* Controllable via parent/style prop */
4242
+ margin: 0;
4181
4243
  list-style-position: outside;
4182
- /* text-align: inherit from parent (removed hardcoded start) */
4244
+ text-align: start; /* Always start-aligned, even when parent is centered */
4183
4245
  }
4184
4246
 
4185
- .dndev-list[data-gap='none'] {
4186
- gap: var(--gap-none);
4187
- }
4188
-
4189
4247
  .dndev-list[data-gap='tight'] {
4190
4248
  gap: var(--gap-sm);
4191
4249
  }
@@ -4234,29 +4292,18 @@ em {
4234
4292
  font-size: var(--font-size-base);
4235
4293
  }
4236
4294
 
4237
- /* Default: native list items (no flex) - preserves markers */
4295
+ /* Always use flex layout for consistent alignment */
4238
4296
 
4239
4297
  .dndev-list .dndev-list-item {
4240
4298
  font-size: var(--font-size-sm);
4241
- /* No display: flex by default - allows native markers */
4242
-
4243
- /* Modern ::marker styling (2026 best practice) */
4299
+ display: flex;
4300
+ align-items: flex-start;
4301
+ gap: var(--gap-sm);
4302
+ list-style: none; /* Remove native marker */
4303
+ margin-block: 0;
4304
+ padding-inline-start: 0;
4244
4305
  }
4245
4306
 
4246
- :is(.dndev-list .dndev-list-item)::marker {
4247
- color: currentColor;
4248
- }
4249
-
4250
- /* Only use flex when icon is present */
4251
-
4252
- :is(.dndev-list .dndev-list-item):has(.dndev-list-item-icon) {
4253
- display: flex;
4254
- align-items: center; /* Center vertically */
4255
- gap: var(--gap-sm);
4256
- list-style: none; /* Remove native marker when using icon */
4257
- padding-inline-start: 0; /* Reset padding when flex */
4258
- }
4259
-
4260
4307
  :is(.dndev-list .dndev-list-item) .dndev-list-item-icon {
4261
4308
  display: flex;
4262
4309
  align-items: center;
@@ -4440,7 +4487,7 @@ em {
4440
4487
  grid-row: span 3;
4441
4488
  height: 100%;
4442
4489
  padding: var(--gap-md);
4443
- border-radius: var(--radius);
4490
+ border-radius: var(--radius-floating);
4444
4491
  background: linear-gradient(
4445
4492
  to bottom,
4446
4493
  color-mix(in oklab, var(--muted) 50%, transparent),
@@ -4464,7 +4511,7 @@ em {
4464
4511
 
4465
4512
  .dndev-nav-menu-item-container {
4466
4513
  padding: var(--gap-md);
4467
- border-radius: var(--radius);
4514
+ border-radius: var(--radius-floating);
4468
4515
  text-decoration: none;
4469
4516
  outline: none;
4470
4517
  }
@@ -4599,27 +4646,57 @@ em {
4599
4646
 
4600
4647
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4601
4648
 
4602
- .dndev-radio-group {
4603
- display: grid;
4604
- gap: var(--gap-sm);
4649
+ /* Uses shared .dndev-control-group pattern from patterns.css */
4605
4650
 
4606
- /* RadioGroup label styling - Stack as="label" now has dndev-text-base */
4607
- }
4651
+ /* Root is display: grid - items are direct children */
4608
4652
 
4609
- .dndev-radio-group label {
4610
- font-size: var(--font-size-base);
4611
- color: var(--foreground);
4612
- transition: color var(--dur-fast) var(--ease-in-out);
4653
+ /* Grid columns via data-cols attribute */
4613
4654
 
4614
- /* Label text when radio is checked */
4655
+ .dndev-radio-group[data-cols] {
4656
+ width: -moz-fit-content;
4657
+ width: fit-content;
4658
+ margin-inline: auto; /* Self-center in parent */
4615
4659
  }
4616
4660
 
4617
- :is(.dndev-radio-group label):has([data-state='checked']) {
4618
- color: var(--primary);
4619
- font-weight: var(--font-weight-medium);
4620
- }
4661
+ .dndev-radio-group[data-cols='2'] {
4662
+ grid-template-columns: repeat(2, auto);
4663
+ }
4664
+
4665
+ .dndev-radio-group[data-cols='3'] {
4666
+ grid-template-columns: repeat(3, auto);
4667
+ }
4668
+
4669
+ .dndev-radio-group[data-cols='4'] {
4670
+ grid-template-columns: repeat(4, auto);
4671
+ }
4672
+
4673
+ .dndev-radio-group[data-cols='5'] {
4674
+ grid-template-columns: repeat(5, auto);
4675
+ }
4676
+
4677
+ .dndev-radio-group[data-cols='6'] {
4678
+ grid-template-columns: repeat(6, auto);
4679
+ }
4680
+
4681
+ .dndev-radio-group[data-cols='10'] {
4682
+ grid-template-columns: repeat(10, auto);
4683
+ }
4684
+
4685
+ .dndev-radio-group[data-cols='12'] {
4686
+ grid-template-columns: repeat(12, auto);
4687
+ }
4688
+
4689
+ .dndev-radio-group[data-cols='auto-fit'] {
4690
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
4691
+ width: 100%;
4692
+ }
4693
+
4694
+ .dndev-radio-group[data-cols='auto-fill'] {
4695
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
4696
+ width: 100%;
4697
+ }
4621
4698
 
4622
- /* Variant colors for checked labels */
4699
+ /* Variant colors for checked labels - override base pattern */
4623
4700
 
4624
4701
  .dndev-radio-group[data-variant='primary'] label:has([data-state='checked']) {
4625
4702
  color: var(--primary);
@@ -4862,6 +4939,12 @@ em {
4862
4939
 
4863
4940
  /* packages/components/src/atomic/Section/Section.css */
4864
4941
 
4942
+ /* Full-width section wrapper for tone backgrounds */
4943
+
4944
+ .dndev-section-full-width {
4945
+ width: 100%;
4946
+ }
4947
+
4865
4948
  /* Content wrapper: constrained + centered + padded */
4866
4949
 
4867
4950
  .dndev-section-content {
@@ -4881,23 +4964,13 @@ em {
4881
4964
  }
4882
4965
  }
4883
4966
 
4884
- /* Section title: XL, uppercase, accent, tracking */
4967
+ /* Section title: uppercase, accent color, letter spacing */
4885
4968
 
4886
4969
  .dndev-section-title {
4887
- display: block;
4888
- font-size: var(--font-size-xl);
4889
- font-weight: var(--font-weight-semibold);
4890
4970
  text-transform: uppercase;
4891
4971
  letter-spacing: 0.2em;
4892
- color: var(--accent);
4893
- margin-bottom: var(--gap-lg);
4894
- }
4895
-
4896
- /* Grid container with default gap */
4897
-
4898
- .dndev-section-grid {
4899
- display: grid;
4900
- gap: var(--gap-md);
4972
+ color: var(--accent) !important;
4973
+ margin-block-end: var(--gap-md);
4901
4974
  }
4902
4975
 
4903
4976
  .dndev-section-full-width[data-text-align='start'] .dndev-section-content {
@@ -5326,7 +5399,7 @@ em {
5326
5399
  color: var(--foreground);
5327
5400
  background-color: var(--background);
5328
5401
  padding: 0.125rem 0.375rem;
5329
- border-radius: var(--radius);
5402
+ border-radius: var(--radius-interactive);
5330
5403
  box-shadow: var(--shadow-sm);
5331
5404
  white-space: nowrap;
5332
5405
  pointer-events: none;
@@ -5780,7 +5853,7 @@ em {
5780
5853
  position: relative;
5781
5854
  width: 100%;
5782
5855
  overflow-y: auto;
5783
- border-radius: var(--radius-lg);
5856
+ border-radius: 0;
5784
5857
  border: 1px solid var(--border);
5785
5858
  }
5786
5859
 
@@ -6078,7 +6151,7 @@ em {
6078
6151
  }
6079
6152
 
6080
6153
  .dndev-text-base {
6081
- font-weight: 500;
6154
+ font-weight: var(--font-weight-medium);
6082
6155
  line-height: var(--line-height);
6083
6156
  background-color: transparent; /* Text never has background, only color changes */
6084
6157
  }
@@ -6115,28 +6188,36 @@ em {
6115
6188
  color: var(--destructive);
6116
6189
  }
6117
6190
 
6191
+ .dndev-text-base[data-variant='code'] {
6192
+ font-family: var(--font-mono);
6193
+ font-size: 0.9em;
6194
+ background: var(--muted);
6195
+ padding: 0.1em 0.4em;
6196
+ border-radius: var(--radius-interactive);
6197
+ }
6198
+
6118
6199
  /* Level overrides */
6119
6200
 
6120
6201
  .dndev-text-base[data-level='h1'] {
6121
6202
  font-size: var(--font-size-3xl);
6122
- font-weight: 700;
6203
+ font-weight: var(--font-weight-bold);
6123
6204
  letter-spacing: -0.02em;
6124
6205
  }
6125
6206
 
6126
6207
  .dndev-text-base[data-level='h2'] {
6127
- font-size: var(--font-size-2xl);
6128
- font-weight: 700;
6129
- letter-spacing: -0.01em;
6208
+ font-size: var(--font-size-lg);
6209
+ font-weight: var(--font-weight-semibold);
6130
6210
  }
6131
6211
 
6132
6212
  .dndev-text-base[data-level='h3'] {
6133
- font-size: var(--font-size-xl);
6134
- font-weight: 600;
6213
+ font-size: var(--font-size-lg);
6214
+ font-weight: var(--font-weight-semibold);
6135
6215
  }
6136
6216
 
6137
6217
  .dndev-text-base[data-level='h4'] {
6138
- font-size: var(--font-size-lg);
6139
- font-weight: 600;
6218
+ font-size: var(--font-size-base);
6219
+ font-weight: var(--font-weight-medium);
6220
+ color: var(--muted-foreground);
6140
6221
  }
6141
6222
 
6142
6223
  .dndev-text-base[data-level='body'] {
@@ -6196,7 +6277,7 @@ em {
6196
6277
  flex-shrink: 0;
6197
6278
  padding-inline-start: var(--gap-md);
6198
6279
  padding-inline-end: var(--gap-md);
6199
- border-radius: var(--radius-md);
6280
+ border-radius: var(--radius-interactive);
6200
6281
  border: 1px solid var(--border);
6201
6282
  font-size: var(--font-size-sm);
6202
6283
  }
@@ -6353,7 +6434,7 @@ em {
6353
6434
  align-items: center;
6354
6435
  gap: 0;
6355
6436
  padding: 0.125rem;
6356
- border-radius: var(--radius);
6437
+ border-radius: var(--radius-interactive);
6357
6438
  background-color: var(--muted);
6358
6439
  border: var(--border-width) solid var(--border);
6359
6440
  }
@@ -6447,7 +6528,7 @@ em {
6447
6528
  box-shadow: var(--shadow-lg); /* Stronger shadow for visibility */
6448
6529
  padding: 0.375rem 0.5rem; /* 6px 8px - industry standard */
6449
6530
  font-size: var(--font-size-xs); /* 12px */
6450
- border-radius: 0; /* Square, modern look */
6531
+ border-radius: var(--radius-floating);
6451
6532
  max-width: 12.5rem; /* 200px */
6452
6533
  }
6453
6534
 
@@ -6525,6 +6606,16 @@ em {
6525
6606
  filter: drop-shadow(0 2px 8px rgb(from var(--background) r g b / 0.5));
6526
6607
  }
6527
6608
 
6609
+ /* Loading overlay - shown while iframe loads */
6610
+
6611
+ .dndev-video-loading-overlay {
6612
+ z-index: 1;
6613
+ }
6614
+
6615
+ .dndev-video-loading-overlay .dndev-video-play-overlay {
6616
+ background: rgb(from var(--background) r g b / 0.6);
6617
+ }
6618
+
6528
6619
  /* Modal dialog wrapper */
6529
6620
 
6530
6621
  .dndev-video-dialog {
@@ -7066,7 +7157,7 @@ em {
7066
7157
  }
7067
7158
 
7068
7159
  .dndev-section-full-width[data-tone='muted'] {
7069
- background: color-mix(in oklab, var(--muted) 50%, transparent);
7160
+ background: var(--muted);
7070
7161
  }
7071
7162
 
7072
7163
  .dndev-section-full-width[data-tone='elevated'] {
@@ -7089,7 +7180,7 @@ em {
7089
7180
  }
7090
7181
 
7091
7182
  [data-tone='muted']:not(.dndev-section-full-width) {
7092
- background: color-mix(in oklab, var(--muted) 50%, transparent);
7183
+ background: var(--muted);
7093
7184
  }
7094
7185
 
7095
7186
  [data-tone='elevated']:not(.dndev-section-full-width) {
@@ -7138,7 +7229,7 @@ code {
7138
7229
  line-height: 1.5;
7139
7230
  white-space: pre-wrap;
7140
7231
  word-break: break-all;
7141
- border-radius: var(--radius-sm);
7232
+ border-radius: var(--radius-interactive);
7142
7233
  }
7143
7234
 
7144
7235
  /* Code element + variant = semantic + visual (monospace + background) */
@@ -7153,7 +7244,7 @@ code[data-variant='code'] {
7153
7244
  line-height: 1.5;
7154
7245
  white-space: pre-wrap;
7155
7246
  word-break: break-all;
7156
- border-radius: var(--radius-sm);
7247
+ border-radius: var(--radius-interactive);
7157
7248
  }
7158
7249
 
7159
7250
  /* Heading + code variant = heading size/weight + code background */
@@ -7171,7 +7262,7 @@ h4[data-variant='code'] {
7171
7262
  line-height: 1.5;
7172
7263
  white-space: pre-wrap;
7173
7264
  word-break: break-all;
7174
- border-radius: var(--radius-sm);
7265
+ border-radius: var(--radius-interactive);
7175
7266
  }
7176
7267
 
7177
7268
  /* ===========================
@@ -7225,6 +7316,7 @@ h4[data-variant='code'] {
7225
7316
 
7226
7317
  .dndev-relative {
7227
7318
  position: relative;
7319
+ min-width: 0; /* Allow flex items to shrink below content size */
7228
7320
  }
7229
7321
 
7230
7322
  .dndev-absolute {
@@ -7409,6 +7501,40 @@ h4[data-variant='code'] {
7409
7501
  border: 0;
7410
7502
  }
7411
7503
 
7504
+ /* ===========================
7505
+ PROSE - SEMANTIC TYPOGRAPHY FOR CONTENT PAGES
7506
+ Wrap docs/markdown/article content in .prose for semantic margins
7507
+ Components are unaffected - they own their own spacing
7508
+ =========================== */
7509
+
7510
+ .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7511
+ margin-block: var(--gap-md);
7512
+ }
7513
+
7514
+ .prose p {
7515
+ margin-block: var(--gap-md);
7516
+ }
7517
+
7518
+ .prose ul,.prose ol {
7519
+ padding-inline-start: var(--gap-lg);
7520
+ margin-block: var(--gap-md);
7521
+ }
7522
+
7523
+ .prose li {
7524
+ margin-block: var(--gap-sm);
7525
+ padding-inline-start: var(--gap-sm);
7526
+ }
7527
+
7528
+ /* First/last child: remove top/bottom margin for clean container edges */
7529
+
7530
+ .prose > :first-child {
7531
+ margin-block-start: 0;
7532
+ }
7533
+
7534
+ .prose > :last-child {
7535
+ margin-block-end: 0;
7536
+ }
7537
+
7412
7538
  /* ===========================
7413
7539
  SHADOW CONTROL (Universal)
7414
7540
  Works with any element
@@ -7636,7 +7762,7 @@ h4[data-variant='code'] {
7636
7762
  =========================== */
7637
7763
 
7638
7764
  /* Single animation type (fade, slide, or none to disable) - app-wide */
7639
- --routing-animation: fade;
7765
+ --routing-animation: none;
7640
7766
  --routing-default-duration: var(--dur-normal);
7641
7767
 
7642
7768
  /* Breakpoint-specific durations */
@@ -7716,24 +7842,26 @@ h4[data-variant='code'] {
7716
7842
 
7717
7843
  /* Routing animations - applied to main content area */
7718
7844
 
7845
+ /* Default: visible (progressive enhancement - content shows even if JS fails) */
7846
+
7719
7847
  main[role='main'] {
7720
- opacity: 0;
7848
+ opacity: 1;
7721
7849
  }
7722
7850
 
7723
- /* Fade animation */
7851
+ /* Fade animation - keyframes handle opacity 0→1 */
7724
7852
 
7725
7853
  main[role='main'][data-routing-animation='fade'] {
7726
7854
  animation: routeFadeIn var(--routing-default-duration, 300ms) ease-in forwards;
7727
7855
  }
7728
7856
 
7729
- /* Slide animation */
7857
+ /* Slide animation - keyframes handle opacity 0→1 */
7730
7858
 
7731
7859
  main[role='main'][data-routing-animation='slide'] {
7732
7860
  animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in
7733
7861
  forwards;
7734
7862
  }
7735
7863
 
7736
- /* No animation */
7864
+ /* No animation - already visible by default, explicit for clarity */
7737
7865
 
7738
7866
  main[role='main'][data-routing-animation='none'] {
7739
7867
  animation: none;
@@ -7844,18 +7972,20 @@ main[role='main'][data-routing-animation='none'] {
7844
7972
  display: grid;
7845
7973
  /* ONE DRY grid structure: 3 rows, 2 columns */
7846
7974
  /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
7975
+ /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
7976
+ implement ResizeObserver to update --footer-height dynamically. */
7847
7977
  grid-template-areas:
7848
7978
  'header header'
7849
7979
  'sidebar main'
7850
7980
  'footer footer';
7851
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
7981
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7852
7982
  grid-template-columns: var(--sidebar-width) 1fr;
7853
7983
 
7854
7984
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
7855
7985
  }
7856
7986
 
7857
7987
  [data-layout='game']:root .dndev-layout {
7858
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
7988
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7859
7989
  }
7860
7990
 
7861
7991
  /* ===========================
@@ -8142,13 +8272,6 @@ aside.sidebar[role='navigation'] .dndev-interactive-label {
8142
8272
  justify-content: center;
8143
8273
  }
8144
8274
 
8145
- /* Sidebar navigation menu - 48px buttons/icons default */
8146
-
8147
- .dndev-sidebar-nav-menu[data-vertical='true'] .dndev-interactive[data-role='menu-item'],.dndev-sidebar-nav-menu[data-vertical='true'] .dndev-interactive[data-role='nav-trigger'] {
8148
- width: var(--touch-target);
8149
- height: var(--touch-target);
8150
- }
8151
-
8152
8275
  /* Collapsed sidebar: hide labels, center icons */
8153
8276
 
8154
8277
  /* Hide all auto-display labels */
@@ -8214,7 +8337,7 @@ footer[role='contentinfo'] {
8214
8337
  grid-area: footer;
8215
8338
  box-sizing: border-box;
8216
8339
  grid-column: 1 / -1;
8217
- height: var(--footer-height);
8340
+ min-height: var(--footer-height);
8218
8341
  z-index: var(--z-footer);
8219
8342
 
8220
8343
  /* Theme-aware styling - 100% controlled by theme system */
@@ -8262,7 +8385,7 @@ footer[role='contentinfo'] > * {
8262
8385
 
8263
8386
  footer[role='contentinfo'] .footer-copyright {
8264
8387
  color: var(--muted-foreground);
8265
- font-size: var(--font-size-xs);
8388
+ font-size: var(--font-size-sm);
8266
8389
  }
8267
8390
 
8268
8391
  footer[role='contentinfo'] a:not(.dndev-interactive) {
@@ -8270,7 +8393,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive) {
8270
8393
  text-decoration: underline;
8271
8394
  text-underline-offset: 2px;
8272
8395
  color: var(--muted-foreground);
8273
- font-size: var(--font-size-xs);
8396
+ font-size: var(--font-size-sm);
8274
8397
  background: transparent;
8275
8398
  }
8276
8399
 
@@ -8669,6 +8792,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8669
8792
  .dndev-container[data-centered='false'] {
8670
8793
  margin-inline-start: 0;
8671
8794
  margin-inline-end: 0;
8795
+ justify-content: flex-start;
8672
8796
  }
8673
8797
 
8674
8798
  /* Full width - no constraints */