@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
package/dist/dndev.css CHANGED
@@ -22,9 +22,10 @@
22
22
  Used by: CSS @media queries, JavaScript hooks, responsive components
23
23
  Note: CSS variables don't work in @media, so we use hardcoded px values
24
24
  =========================== */
25
- --breakpoint-mobile: 768px;
26
- --breakpoint-tablet: 1024px; /* Key breakpoint, layout presets are based on mobile + tablet vs desktop+wide breakpoints */
27
- --breakpoint-desktop: 1440px;
25
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
26
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
27
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
28
+ --breakpoint-desktop: 1920px; /* 1440+ = desktop */
28
29
 
29
30
  /* ===========================
30
31
  INTERACTIVE ELEMENTS
@@ -289,28 +290,48 @@
289
290
  /* Compact (Admin/Data) - Dense, information-dense layouts - Minor Third (1.2×) */
290
291
 
291
292
  [data-density='compact'] {
292
- --font-size-base: 0.875rem; /* 14px */
293
- --font-size-lg: 1.05rem; /* base × 1.2¹ */
294
- --font-size-xl: 1.26rem; /* base × 1. */
295
- --font-size-2xl: 1.512rem; /* base × 1. */
296
- --font-size-3xl: 1.814rem; /* base × 1.2⁴ */
297
- --gap-sm: 0.375rem; /* 6px - tighter than standard */
298
- --gap-md: 0.75rem; /* 12px */
299
- --gap-lg: 1.5rem; /* 24px */
293
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
294
+ --font-size-base: clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem); /* 14-15px fluid */
295
+ --font-size-lg: clamp(1.05rem, 0.9375rem + 0.5vw, 1.125rem); /* 17-18px fluid */
296
+ --font-size-xl: clamp(1.26rem, 1.125rem + 0.75vw, 1.375rem); /* 20-22px fluid */
297
+ /* Display sizes: Musical scale + fluid responsiveness */
298
+ --font-size-2xl: clamp(
299
+ 1.512rem,
300
+ 1.375rem + 0.75vw,
301
+ 1.625rem
302
+ ); /* 24-26px fluid */
303
+ --font-size-3xl: clamp(
304
+ 1.814rem,
305
+ 1.625rem + 1vw,
306
+ 2rem
307
+ ); /* 29-32px fluid */
308
+ --gap-sm: clamp(0.375rem, 0.3125rem + 0.25vw, 0.5rem); /* 6-8px fluid */
309
+ --gap-md: clamp(0.75rem, 0.625rem + 0.5vw, 0.875rem); /* 12-14px fluid, zoom-safe */
310
+ --gap-lg: clamp(1.5rem, 1.25rem + 1vw, 1.75rem); /* 24-28px fluid, zoom-safe */
300
311
  --line-height: 1.2; /* Minor Third - All text */
301
312
  }
302
313
 
303
314
  /* Standard (Docs/SaaS) - DEFAULT, balanced for readability */
304
315
 
305
316
  [data-density='standard'] {
306
- --font-size-base: 1rem; /* 16px */
307
- --font-size-lg: 1.25rem; /* 20px - base × 1.25¹ */
308
- --font-size-xl: 1.563rem; /* 25px - base × 1.25² */
309
- --font-size-2xl: 1.953rem; /* 31px - base × 1.25³ */
310
- --font-size-3xl: 2.441rem; /* 39px - base × 1.25⁴ - hero text */
311
- --gap-sm: 0.5rem; /* 8px - explicit default */
312
- --gap-md: 1rem; /* 16px */
313
- --gap-lg: 2rem; /* 32px */
317
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
318
+ --font-size-base: clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem); /* 16-17px fluid */
319
+ --font-size-lg: clamp(1.25rem, 1.125rem + 0.5vw, 1.375rem); /* 20-22px fluid */
320
+ --font-size-xl: clamp(1.563rem, 1.375rem + 0.75vw, 1.75rem); /* 25-28px fluid */
321
+ /* Display sizes: Musical scale + fluid responsiveness */
322
+ --font-size-2xl: clamp(
323
+ 1.953rem,
324
+ 1.75rem + 1vw,
325
+ 2.25rem
326
+ ); /* 31-36px fluid */
327
+ --font-size-3xl: clamp(
328
+ 2.441rem,
329
+ 2rem + 1.5vw,
330
+ 3rem
331
+ ); /* 39-48px fluid - hero text */
332
+ --gap-sm: clamp(0.5rem, 0.4375rem + 0.25vw, 0.625rem); /* 8-10px fluid */
333
+ --gap-md: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* 16-20px fluid, zoom-safe */
334
+ --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
314
335
  --line-height: 1.25; /* Major Third - All text */
315
336
  }
316
337
 
@@ -539,52 +560,19 @@ a:not(.dndev-interactive):active {
539
560
  a:focus-visible {
540
561
  outline: 2px solid var(--ring);
541
562
  outline-offset: 2px;
542
- border-radius: var(--radius-md);
563
+ border-radius: var(--radius-interactive);
543
564
  }
544
565
 
545
- /* ===========================
546
- BASE LIST STYLING
547
- Use text-base styles for lists
548
- =========================== */
549
-
550
- /* Content lists only - not navigation menus */
551
-
552
- main ul,
553
- main ol,
554
- article ul,
555
- article ol {
556
- font-weight: 500;
557
- line-height: var(--line-height);
558
- color: var(--foreground);
559
- background: transparent !important;
560
- list-style-position: outside;
561
- padding-inline-start: var(--gap-lg);
562
- margin-block: var(--gap-md);
563
- }
566
+ /* Main element - no focus outline (programmatic focus for keyboard nav) */
564
567
 
565
- main ul,
566
- article ul {
567
- list-style-type: disc;
568
- }
569
-
570
- main ol,
571
- article ol {
572
- list-style-type: decimal;
573
- }
574
-
575
- main li,
576
- article li {
577
- font-weight: 500;
578
- line-height: var(--line-height);
579
- color: var(--foreground);
580
- background: transparent !important;
581
- margin-block: var(--gap-sm);
582
- padding-inline-start: var(--gap-sm);
568
+ main:focus-visible {
569
+ outline: none;
583
570
  }
584
571
 
585
572
  /* ===========================
586
- BASE TYPOGRAPHY STYLING
587
- Use text-base styles for headings and paragraphs
573
+ BASE TYPOGRAPHY - RESET ONLY
574
+ Zero margins, components own their spacing
575
+ Use .prose wrapper for content pages (docs, markdown)
588
576
  =========================== */
589
577
 
590
578
  h1,
@@ -593,49 +581,71 @@ h3,
593
581
  h4,
594
582
  h5,
595
583
  h6 {
596
- font-weight: 500;
584
+ font-weight: var(--font-weight-medium);
597
585
  line-height: var(--line-height);
598
586
  color: var(--foreground);
599
587
  background: transparent;
600
- margin-block: var(--gap-md);
601
588
  }
602
589
 
603
590
  h1 {
604
591
  font-family: var(--font-headline);
605
592
  font-size: var(--font-size-3xl);
606
- font-weight: 700;
593
+ font-weight: var(--font-weight-bold);
607
594
  letter-spacing: -0.02em;
608
595
  }
609
596
 
610
597
  h2 {
611
598
  font-family: var(--font-headline);
612
599
  font-size: var(--font-size-2xl);
613
- font-weight: 700;
600
+ font-weight: var(--font-weight-bold);
614
601
  letter-spacing: -0.01em;
615
602
  }
616
603
 
617
604
  h3 {
618
605
  font-size: var(--font-size-xl);
619
- font-weight: 600;
606
+ font-weight: var(--font-weight-semibold);
620
607
  }
621
608
 
622
609
  h4 {
623
610
  font-size: var(--font-size-lg);
624
- font-weight: 600;
611
+ font-weight: var(--font-weight-semibold);
625
612
  }
626
613
 
627
614
  h5,
628
615
  h6 {
629
616
  font-size: var(--font-size-base);
630
- font-weight: 600;
617
+ font-weight: var(--font-weight-semibold);
631
618
  }
632
619
 
633
620
  p {
634
- font-weight: 500;
621
+ font-weight: var(--font-weight-medium);
622
+ line-height: var(--line-height);
623
+ color: var(--foreground);
624
+ background: transparent;
625
+ }
626
+
627
+ ul,
628
+ ol {
629
+ font-weight: var(--font-weight-medium);
630
+ line-height: var(--line-height);
631
+ color: var(--foreground);
632
+ background: transparent;
633
+ list-style-position: outside;
634
+ }
635
+
636
+ ul {
637
+ list-style-type: disc;
638
+ }
639
+
640
+ ol {
641
+ list-style-type: decimal;
642
+ }
643
+
644
+ li {
645
+ font-weight: var(--font-weight-medium);
635
646
  line-height: var(--line-height);
636
647
  color: var(--foreground);
637
648
  background: transparent;
638
- margin-block: var(--gap-md);
639
649
  }
640
650
 
641
651
  /* Semantic HTML - strong and em */
@@ -682,7 +692,7 @@ em {
682
692
  .dndev-input {
683
693
  display: flex;
684
694
  width: 100%;
685
- border-radius: 0;
695
+ border-radius: var(--radius-interactive);
686
696
  border: var(--border-hairline) solid var(--line-2);
687
697
  background-color: transparent;
688
698
  color: var(--foreground);
@@ -944,15 +954,21 @@ em {
944
954
 
945
955
  .dndev-surface[data-role='card'] {
946
956
  padding: var(--gap-md);
947
- border-radius: var(--radius-md);
957
+ border-radius: var(--radius-surface);
948
958
  }
949
959
 
950
960
  /* Elevated cards - stronger shadow */
951
961
 
952
- .dndev-surface[data-elevated='true'] {
962
+ /* Apply if elevated=true OR (clickable=true AND elevated!=false) */
963
+
964
+ .dndev-surface[data-elevated='true'],.dndev-surface[data-clickable='true']:not([data-elevated='false']) {
953
965
  box-shadow: var(--shadow-xl);
954
966
  }
955
967
 
968
+ :is(.dndev-surface[data-elevated='true'],.dndev-surface[data-clickable='true']:not([data-elevated='false'])):dir(rtl) {
969
+ box-shadow: var(--shadow-xl-rtl);
970
+ }
971
+
956
972
  /* Clickable cards - hover effects */
957
973
 
958
974
  .dndev-surface[data-clickable='true'] {
@@ -1185,7 +1201,7 @@ em {
1185
1201
 
1186
1202
  .dndev-floating[data-role='card'] {
1187
1203
  padding: var(--gap-md);
1188
- border-radius: var(--radius-md);
1204
+ border-radius: var(--radius-surface);
1189
1205
  }
1190
1206
 
1191
1207
  .dndev-floating[data-role='floating'] {
@@ -1647,6 +1663,38 @@ em {
1647
1663
  color: var(--background);
1648
1664
  }
1649
1665
 
1666
+ /* CONTROL GROUP - Shared pattern for grouped controls (RadioGroup, Checkbox groups) */
1667
+
1668
+ .dndev-control-group {
1669
+ display: grid;
1670
+ gap: var(--gap-md); /* 16px - standard spacing between grouped items */
1671
+
1672
+ /* Control + label pattern - used by RadioGroup, CheckboxFieldComponent, etc. */
1673
+ }
1674
+
1675
+ .dndev-control-group label {
1676
+ display: flex;
1677
+ align-items: center;
1678
+ gap: var(--gap-sm); /* 8px - spacing between control and label */
1679
+ font-size: var(--font-size-base);
1680
+ color: var(--foreground);
1681
+ cursor: pointer;
1682
+ transition: color var(--transition-fast);
1683
+
1684
+ /* Subtle hover on label text */
1685
+ }
1686
+
1687
+ :is(.dndev-control-group label):hover {
1688
+ color: var(--primary);
1689
+ }
1690
+
1691
+ /* Selected state - label color changes */
1692
+
1693
+ :is(.dndev-control-group label):has([data-state='checked']),:is(.dndev-control-group label):has([data-state='on']) {
1694
+ color: var(--primary);
1695
+ font-weight: var(--font-weight-medium);
1696
+ }
1697
+
1650
1698
  /**
1651
1699
  * Variant system - 8 control variants
1652
1700
  * Variants override --control-border to use semantic colors
@@ -1654,37 +1702,37 @@ em {
1654
1702
  * On state: fills with variant color
1655
1703
  */
1656
1704
 
1657
- .dndev-control[data-variant='primary'] {
1705
+ .dndev-control-group[data-variant='primary'] {
1658
1706
  --control-border: var(--primary);
1659
1707
  }
1660
1708
 
1661
- .dndev-control[data-variant='secondary'] {
1709
+ .dndev-control-group[data-variant='secondary'] {
1662
1710
  --control-border: var(--secondary);
1663
1711
  }
1664
1712
 
1665
- .dndev-control[data-variant='muted'] {
1713
+ .dndev-control-group[data-variant='muted'] {
1666
1714
  --control-border: var(--muted-foreground);
1667
1715
  }
1668
1716
 
1669
- .dndev-control[data-variant='accent'] {
1717
+ .dndev-control-group[data-variant='accent'] {
1670
1718
  --control-border: var(--accent);
1671
1719
  }
1672
1720
 
1673
- .dndev-control[data-variant='success'] {
1721
+ .dndev-control-group[data-variant='success'] {
1674
1722
  --control-border: var(--success);
1675
1723
  }
1676
1724
 
1677
- .dndev-control[data-variant='warning'] {
1725
+ .dndev-control-group[data-variant='warning'] {
1678
1726
  --control-border: var(--warning);
1679
1727
  }
1680
1728
 
1681
- .dndev-control[data-variant='destructive'] {
1729
+ .dndev-control-group[data-variant='destructive'] {
1682
1730
  --control-border: var(--destructive);
1683
1731
  }
1684
1732
 
1685
1733
  /* Default variant explicitly (same as base) */
1686
1734
 
1687
- .dndev-control[data-variant='default'] {
1735
+ .dndev-control-group[data-variant='default'] {
1688
1736
  --control-border: color-mix(
1689
1737
  in oklab,
1690
1738
  var(--foreground) 70%,
@@ -1772,7 +1820,7 @@ em {
1772
1820
  display: grid;
1773
1821
  gap: var(--gap-sm);
1774
1822
  padding: var(--gap-md);
1775
- border-radius: var(--radius-none);
1823
+ border-radius: var(--radius-floating);
1776
1824
  border: var(--border-hairline) solid var(--border);
1777
1825
  /* Inverted floating colors: popover-foreground as background, popover as foreground */
1778
1826
  background: color-mix(in oklab, var(--popover-foreground) 95%, transparent);
@@ -1917,7 +1965,7 @@ em {
1917
1965
  width: var(--icon-md);
1918
1966
  height: var(--icon-md);
1919
1967
  border: 2px solid currentColor;
1920
- border-radius: 50%;
1968
+ border-radius: var(--radius-full);
1921
1969
  border-right-color: transparent;
1922
1970
  animation: spin 1s linear infinite;
1923
1971
  }
@@ -2054,7 +2102,7 @@ em {
2054
2102
  display: flex;
2055
2103
  flex-direction: column;
2056
2104
  padding: 0;
2057
- border-radius: 0;
2105
+ border-radius: var(--radius-floating);
2058
2106
  min-width: 15ch; /* Character-based: scales with font size, ensures readable width */
2059
2107
  width: -moz-fit-content;
2060
2108
  width: fit-content; /* Stretch to fit children */
@@ -2331,14 +2379,15 @@ em {
2331
2379
  margin-top: var(--gap-md);
2332
2380
  }
2333
2381
 
2334
- /* Tech card */
2382
+ /* Tech card - override Card's grid layout for centered content */
2335
2383
 
2336
2384
  .dndev-tech-card {
2337
2385
  height: 100%;
2338
2386
  min-height: 120px;
2339
- display: flex;
2387
+ display: flex !important; /* Override Card's grid layout */
2340
2388
  align-items: center;
2341
2389
  justify-content: center;
2390
+ align-content: center; /* Override Card's align-content: start */
2342
2391
  transition:
2343
2392
  border-color 0.2s ease,
2344
2393
  box-shadow 0.2s ease;
@@ -2408,7 +2457,7 @@ em {
2408
2457
  }
2409
2458
 
2410
2459
  .dndev-blockquote-content {
2411
- font-size: 1.125em; /* 1.125x body (18px on 16px base) */
2460
+ font-size: var(--font-size-lg); /* 20px - emphasized text */
2412
2461
  line-height: 1.7; /* Industry standard for readability */
2413
2462
  font-weight: 400;
2414
2463
  color: inherit;
@@ -2442,10 +2491,15 @@ em {
2442
2491
  */
2443
2492
 
2444
2493
  .dndev-blockquote[data-variant='default'] blockquote {
2445
- padding: var(--gap-md) var(--gap-md) var(--gap-md) var(--gap-lg);
2494
+ padding: var(--gap-md) calc(var(--gap-md) + 4px) var(--gap-md) var(--gap-lg);
2446
2495
  background: var(--muted);
2447
2496
  border-inline-start: 4px solid var(--primary);
2448
- border-radius: 0 var(--radius-md) var(--radius-md) 0;
2497
+ border-inline-end: none;
2498
+ border-block-start: none;
2499
+ border-block-end: none;
2500
+ border-radius: var(--radius-interactive) var(--radius-surface)
2501
+ var(--radius-surface) var(--radius-interactive);
2502
+ overflow: hidden;
2449
2503
  }
2450
2504
 
2451
2505
  .dndev-blockquote[data-variant='default'] .dndev-blockquote-content {
@@ -2466,7 +2520,7 @@ em {
2466
2520
  .dndev-blockquote[data-variant='editorial'] .dndev-blockquote-content {
2467
2521
  font-family: Georgia, 'Times New Roman', serif;
2468
2522
  font-style: italic;
2469
- font-size: 1.25em; /* Larger for editorial impact */
2523
+ font-size: var(--font-size-xl); /* 25px - larger for editorial impact */
2470
2524
  color: inherit;
2471
2525
  opacity: 0.95;
2472
2526
  }
@@ -2484,7 +2538,7 @@ em {
2484
2538
  .dndev-blockquote[data-variant='testimonial'] {
2485
2539
  background: var(--card);
2486
2540
  border: 1px solid var(--border);
2487
- border-radius: var(--radius-lg);
2541
+ border-radius: var(--radius-surface);
2488
2542
  padding: calc(var(--gap-lg) + var(--gap-md)); /* 2.5rem */
2489
2543
  box-shadow:
2490
2544
  0 1px 3px 0 hsl(var(--foreground-hsl) / 0.1),
@@ -2526,11 +2580,11 @@ em {
2526
2580
  }
2527
2581
 
2528
2582
  .dndev-blockquote-content {
2529
- font-size: 1.0625em; /* Slightly smaller on mobile (17px) */
2583
+ font-size: var(--font-size-base); /* Slightly smaller on mobile */
2530
2584
  }
2531
2585
 
2532
2586
  .dndev-blockquote[data-variant='editorial'] .dndev-blockquote-content {
2533
- font-size: 1.125em;
2587
+ font-size: var(--font-size-lg);
2534
2588
  }
2535
2589
 
2536
2590
  .dndev-blockquote[data-variant='testimonial'] {
@@ -2560,7 +2614,7 @@ em {
2560
2614
  color: var(--popover-foreground);
2561
2615
  background: var(--popover);
2562
2616
  border: var(--border-hairline) solid var(--border);
2563
- border-radius: var(--radius-interactive);
2617
+ border-radius: var(--radius-floating);
2564
2618
  box-shadow: var(--shadow-md);
2565
2619
  }
2566
2620
 
@@ -2846,13 +2900,40 @@ em {
2846
2900
  /* packages/components/src/atomic/CallToAction/CallToAction.css */
2847
2901
 
2848
2902
  .dndev-cta {
2849
- /* Full width gradient */
2903
+ /* Default gradient */
2850
2904
  background: linear-gradient(to right, var(--secondary), var(--background));
2851
2905
  color: var(--foreground);
2852
2906
  /* Padding for background - vertical only, horizontal handled by content */
2853
2907
  padding-block: var(--gap-lg);
2854
2908
  }
2855
2909
 
2910
+ /* Tone variants - leverage existing data-tone system */
2911
+
2912
+ .dndev-cta[data-tone='base'] {
2913
+ background: linear-gradient(to right, var(--secondary), var(--background));
2914
+ }
2915
+
2916
+ .dndev-cta[data-tone='muted'] {
2917
+ background: linear-gradient(to right, var(--muted), var(--background));
2918
+ }
2919
+
2920
+ .dndev-cta[data-tone='accent'] {
2921
+ background: linear-gradient(
2922
+ to right,
2923
+ color-mix(in oklab, var(--accent) 10%, transparent),
2924
+ var(--background)
2925
+ );
2926
+ }
2927
+
2928
+ .dndev-cta[data-tone='contrast'] {
2929
+ background: linear-gradient(to right, var(--foreground), var(--background));
2930
+ color: var(--background);
2931
+ }
2932
+
2933
+ .dndev-cta[data-tone='elevated'] {
2934
+ background: linear-gradient(to right, var(--secondary), var(--background));
2935
+ }
2936
+
2856
2937
  .dndev-cta-content {
2857
2938
  display: flex;
2858
2939
  flex-direction: column;
@@ -2933,19 +3014,35 @@ em {
2933
3014
  .dndev-card {
2934
3015
  display: grid;
2935
3016
  gap: var(--gap-md);
3017
+ text-align: start;
3018
+ align-content: start;
3019
+ }
3020
+
3021
+ .dndev-card-header {
3022
+ display: flex;
3023
+ flex-direction: column;
3024
+ }
3025
+
3026
+ .dndev-card-header > .dndev-stack {
3027
+ min-width: 0;
3028
+ }
3029
+
3030
+ .dndev-card-header > .dndev-stack > .dndev-card-title {
3031
+ flex: 1;
3032
+ min-width: 0;
2936
3033
  }
2937
3034
 
2938
3035
  .dndev-card-title {
2939
- font-size: var(--font-size-xl);
2940
- font-weight: 600;
2941
- color: inherit; /* Inherit from surface variant */
2942
3036
  margin: 0;
3037
+ min-width: 0;
3038
+ word-wrap: break-word;
2943
3039
  }
2944
3040
 
2945
3041
  .dndev-card-subtitle {
2946
- font-size: var(--font-size-base);
2947
- font-weight: 600;
2948
- color: inherit; /* Inherit from surface variant */
3042
+ margin-top: 0;
3043
+ margin-bottom: 0;
3044
+ min-width: 0;
3045
+ word-wrap: break-word;
2949
3046
  }
2950
3047
 
2951
3048
  /* packages/components/src/atomic/Checkbox/Checkbox.css */
@@ -3338,7 +3435,7 @@ em {
3338
3435
 
3339
3436
  .dndev-command-footer-key {
3340
3437
  padding: 0.125rem 0.375rem;
3341
- border-radius: calc(var(--radius-md) * 0.5);
3438
+ border-radius: 2px;
3342
3439
  background: var(--muted);
3343
3440
  border: 1px solid var(--border);
3344
3441
  font-family: var(--font-mono);
@@ -3658,56 +3755,34 @@ em {
3658
3755
  display: grid;
3659
3756
  min-width: 0;
3660
3757
  width: 100%;
3758
+ /* Default: use mobile columns */
3759
+ grid-template-columns: repeat(var(--grid-cols-mobile, 1), 1fr);
3661
3760
  }
3662
3761
 
3663
- /* Columns */
3762
+ /* Responsive columns via media queries */
3664
3763
 
3665
- .dndev-grid-component[data-cols='1'] {
3666
- grid-template-columns: repeat(1, minmax(0, 1fr));
3667
- }
3668
-
3669
- .dndev-grid-component[data-cols='2'] {
3670
- grid-template-columns: repeat(2, minmax(0, 1fr));
3671
- }
3672
-
3673
- .dndev-grid-component[data-cols='3'] {
3674
- grid-template-columns: repeat(3, minmax(0, 1fr));
3675
- }
3764
+ /* Tablet: 768px+ */
3676
3765
 
3677
- .dndev-grid-component[data-cols='4'] {
3678
- grid-template-columns: repeat(4, minmax(0, 1fr));
3679
- }
3680
-
3681
- .dndev-grid-component[data-cols='5'] {
3682
- grid-template-columns: repeat(5, minmax(0, 1fr));
3683
- }
3684
-
3685
- .dndev-grid-component[data-cols='6'] {
3686
- grid-template-columns: repeat(6, minmax(0, 1fr));
3766
+ @media (min-width: 768px) {
3767
+ .dndev-grid-component {
3768
+ grid-template-columns: repeat(var(--grid-cols-tablet, 1), 1fr);
3769
+ }
3687
3770
  }
3688
3771
 
3689
- .dndev-grid-component[data-cols='10'] {
3690
- grid-template-columns: repeat(10, minmax(0, 1fr));
3691
- }
3772
+ /* Laptop: 1024px+ (key layout split) */
3692
3773
 
3693
- .dndev-grid-component[data-cols='12'] {
3694
- grid-template-columns: repeat(12, minmax(0, 1fr));
3774
+ @media (min-width: 1024px) {
3775
+ .dndev-grid-component {
3776
+ grid-template-columns: repeat(var(--grid-cols-laptop, 1), 1fr);
3777
+ }
3695
3778
  }
3696
3779
 
3697
- /* Auto-fit/fill columns */
3780
+ /* Desktop: 1440px+ */
3698
3781
 
3699
- .dndev-grid-component[data-cols='auto-fit'] {
3700
- grid-template-columns: repeat(
3701
- auto-fit,
3702
- minmax(min(100%, var(--min-col-width, 250px)), 1fr)
3703
- );
3704
- }
3705
-
3706
- .dndev-grid-component[data-cols='auto-fill'] {
3707
- grid-template-columns: repeat(
3708
- auto-fill,
3709
- minmax(min(100%, var(--min-col-width, 250px)), 1fr)
3710
- );
3782
+ @media (min-width: 1440px) {
3783
+ .dndev-grid-component {
3784
+ grid-template-columns: repeat(var(--grid-cols-desktop, 1), 1fr);
3785
+ }
3711
3786
  }
3712
3787
 
3713
3788
  /* Spacing from CSS variables */
@@ -3853,21 +3928,7 @@ em {
3853
3928
  }
3854
3929
 
3855
3930
  .dndev-hero-subtitle {
3856
- font-size: var(--font-size-xl);
3857
- }
3858
-
3859
- /* Responsive Content Visibility */
3860
-
3861
- @media (width < 1024px) {
3862
- .dndev-hero-section .dndev-desktop-only {
3863
- display: none !important;
3864
- }
3865
- }
3866
-
3867
- @media (width >= 1024px) {
3868
- .dndev-hero-section .dndev-mobile-only {
3869
- display: none !important;
3870
- }
3931
+ font-size: var(--font-size-lg); /* 20px - muted via component */
3871
3932
  }
3872
3933
 
3873
3934
  /* packages/components/src/atomic/HoverCard/HoverCard.css */
@@ -3886,7 +3947,7 @@ em {
3886
3947
  height: var(--touch-target);
3887
3948
  padding: 0;
3888
3949
  border: 1px solid var(--card-foreground);
3889
- border-radius: var(--radius-md);
3950
+ border-radius: var(--radius-surface);
3890
3951
  background: transparent;
3891
3952
  display: inline-flex;
3892
3953
  align-items: center;
@@ -4026,7 +4087,7 @@ em {
4026
4087
 
4027
4088
  .dndev-json-viewer-container {
4028
4089
  background-color: var(--muted);
4029
- border-radius: var(--radius);
4090
+ border-radius: var(--radius-surface);
4030
4091
  padding: 1rem;
4031
4092
  overflow: auto;
4032
4093
  max-height: 600px;
@@ -4083,7 +4144,7 @@ em {
4083
4144
  align-items: flex-start;
4084
4145
  gap: 0.25rem;
4085
4146
  cursor: pointer;
4086
- border-radius: var(--radius-sm);
4147
+ border-radius: var(--radius-interactive);
4087
4148
  padding-inline-start: 0.25rem;
4088
4149
  padding-inline-end: 0.25rem;
4089
4150
  margin-inline-start: -0.25rem;
@@ -4180,16 +4241,13 @@ em {
4180
4241
  .dndev-list {
4181
4242
  display: flex;
4182
4243
  flex-direction: column;
4183
- gap: var(--gap-none);
4244
+ gap: var(--gap-sm);
4184
4245
  padding-inline-start: 0; /* Controllable via parent/style prop */
4246
+ margin: 0;
4185
4247
  list-style-position: outside;
4186
- /* text-align: inherit from parent (removed hardcoded start) */
4248
+ text-align: start; /* Always start-aligned, even when parent is centered */
4187
4249
  }
4188
4250
 
4189
- .dndev-list[data-gap='none'] {
4190
- gap: var(--gap-none);
4191
- }
4192
-
4193
4251
  .dndev-list[data-gap='tight'] {
4194
4252
  gap: var(--gap-sm);
4195
4253
  }
@@ -4238,29 +4296,18 @@ em {
4238
4296
  font-size: var(--font-size-base);
4239
4297
  }
4240
4298
 
4241
- /* Default: native list items (no flex) - preserves markers */
4299
+ /* Always use flex layout for consistent alignment */
4242
4300
 
4243
4301
  .dndev-list .dndev-list-item {
4244
4302
  font-size: var(--font-size-sm);
4245
- /* No display: flex by default - allows native markers */
4246
-
4247
- /* Modern ::marker styling (2026 best practice) */
4303
+ display: flex;
4304
+ align-items: flex-start;
4305
+ gap: var(--gap-sm);
4306
+ list-style: none; /* Remove native marker */
4307
+ margin-block: 0;
4308
+ padding-inline-start: 0;
4248
4309
  }
4249
4310
 
4250
- :is(.dndev-list .dndev-list-item)::marker {
4251
- color: currentColor;
4252
- }
4253
-
4254
- /* Only use flex when icon is present */
4255
-
4256
- :is(.dndev-list .dndev-list-item):has(.dndev-list-item-icon) {
4257
- display: flex;
4258
- align-items: center; /* Center vertically */
4259
- gap: var(--gap-sm);
4260
- list-style: none; /* Remove native marker when using icon */
4261
- padding-inline-start: 0; /* Reset padding when flex */
4262
- }
4263
-
4264
4311
  :is(.dndev-list .dndev-list-item) .dndev-list-item-icon {
4265
4312
  display: flex;
4266
4313
  align-items: center;
@@ -4444,7 +4491,7 @@ em {
4444
4491
  grid-row: span 3;
4445
4492
  height: 100%;
4446
4493
  padding: var(--gap-md);
4447
- border-radius: var(--radius);
4494
+ border-radius: var(--radius-floating);
4448
4495
  background: linear-gradient(
4449
4496
  to bottom,
4450
4497
  color-mix(in oklab, var(--muted) 50%, transparent),
@@ -4468,7 +4515,7 @@ em {
4468
4515
 
4469
4516
  .dndev-nav-menu-item-container {
4470
4517
  padding: var(--gap-md);
4471
- border-radius: var(--radius);
4518
+ border-radius: var(--radius-floating);
4472
4519
  text-decoration: none;
4473
4520
  outline: none;
4474
4521
  }
@@ -4603,27 +4650,57 @@ em {
4603
4650
 
4604
4651
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4605
4652
 
4606
- .dndev-radio-group {
4607
- display: grid;
4608
- gap: var(--gap-sm);
4653
+ /* Uses shared .dndev-control-group pattern from patterns.css */
4609
4654
 
4610
- /* RadioGroup label styling - Stack as="label" now has dndev-text-base */
4611
- }
4655
+ /* Root is display: grid - items are direct children */
4612
4656
 
4613
- .dndev-radio-group label {
4614
- font-size: var(--font-size-base);
4615
- color: var(--foreground);
4616
- transition: color var(--dur-fast) var(--ease-in-out);
4657
+ /* Grid columns via data-cols attribute */
4617
4658
 
4618
- /* Label text when radio is checked */
4659
+ .dndev-radio-group[data-cols] {
4660
+ width: -moz-fit-content;
4661
+ width: fit-content;
4662
+ margin-inline: auto; /* Self-center in parent */
4619
4663
  }
4620
4664
 
4621
- :is(.dndev-radio-group label):has([data-state='checked']) {
4622
- color: var(--primary);
4623
- font-weight: var(--font-weight-medium);
4624
- }
4665
+ .dndev-radio-group[data-cols='2'] {
4666
+ grid-template-columns: repeat(2, auto);
4667
+ }
4668
+
4669
+ .dndev-radio-group[data-cols='3'] {
4670
+ grid-template-columns: repeat(3, auto);
4671
+ }
4672
+
4673
+ .dndev-radio-group[data-cols='4'] {
4674
+ grid-template-columns: repeat(4, auto);
4675
+ }
4676
+
4677
+ .dndev-radio-group[data-cols='5'] {
4678
+ grid-template-columns: repeat(5, auto);
4679
+ }
4680
+
4681
+ .dndev-radio-group[data-cols='6'] {
4682
+ grid-template-columns: repeat(6, auto);
4683
+ }
4684
+
4685
+ .dndev-radio-group[data-cols='10'] {
4686
+ grid-template-columns: repeat(10, auto);
4687
+ }
4688
+
4689
+ .dndev-radio-group[data-cols='12'] {
4690
+ grid-template-columns: repeat(12, auto);
4691
+ }
4692
+
4693
+ .dndev-radio-group[data-cols='auto-fit'] {
4694
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
4695
+ width: 100%;
4696
+ }
4697
+
4698
+ .dndev-radio-group[data-cols='auto-fill'] {
4699
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
4700
+ width: 100%;
4701
+ }
4625
4702
 
4626
- /* Variant colors for checked labels */
4703
+ /* Variant colors for checked labels - override base pattern */
4627
4704
 
4628
4705
  .dndev-radio-group[data-variant='primary'] label:has([data-state='checked']) {
4629
4706
  color: var(--primary);
@@ -4866,6 +4943,12 @@ em {
4866
4943
 
4867
4944
  /* packages/components/src/atomic/Section/Section.css */
4868
4945
 
4946
+ /* Full-width section wrapper for tone backgrounds */
4947
+
4948
+ .dndev-section-full-width {
4949
+ width: 100%;
4950
+ }
4951
+
4869
4952
  /* Content wrapper: constrained + centered + padded */
4870
4953
 
4871
4954
  .dndev-section-content {
@@ -4885,23 +4968,13 @@ em {
4885
4968
  }
4886
4969
  }
4887
4970
 
4888
- /* Section title: XL, uppercase, accent, tracking */
4971
+ /* Section title: uppercase, accent color, letter spacing */
4889
4972
 
4890
4973
  .dndev-section-title {
4891
- display: block;
4892
- font-size: var(--font-size-xl);
4893
- font-weight: var(--font-weight-semibold);
4894
4974
  text-transform: uppercase;
4895
4975
  letter-spacing: 0.2em;
4896
- color: var(--accent);
4897
- margin-bottom: var(--gap-lg);
4898
- }
4899
-
4900
- /* Grid container with default gap */
4901
-
4902
- .dndev-section-grid {
4903
- display: grid;
4904
- gap: var(--gap-md);
4976
+ color: var(--accent) !important;
4977
+ margin-block-end: var(--gap-md);
4905
4978
  }
4906
4979
 
4907
4980
  .dndev-section-full-width[data-text-align='start'] .dndev-section-content {
@@ -5330,7 +5403,7 @@ em {
5330
5403
  color: var(--foreground);
5331
5404
  background-color: var(--background);
5332
5405
  padding: 0.125rem 0.375rem;
5333
- border-radius: var(--radius);
5406
+ border-radius: var(--radius-interactive);
5334
5407
  box-shadow: var(--shadow-sm);
5335
5408
  white-space: nowrap;
5336
5409
  pointer-events: none;
@@ -5784,7 +5857,7 @@ em {
5784
5857
  position: relative;
5785
5858
  width: 100%;
5786
5859
  overflow-y: auto;
5787
- border-radius: var(--radius-lg);
5860
+ border-radius: 0;
5788
5861
  border: 1px solid var(--border);
5789
5862
  }
5790
5863
 
@@ -6082,7 +6155,7 @@ em {
6082
6155
  }
6083
6156
 
6084
6157
  .dndev-text-base {
6085
- font-weight: 500;
6158
+ font-weight: var(--font-weight-medium);
6086
6159
  line-height: var(--line-height);
6087
6160
  background-color: transparent; /* Text never has background, only color changes */
6088
6161
  }
@@ -6119,28 +6192,36 @@ em {
6119
6192
  color: var(--destructive);
6120
6193
  }
6121
6194
 
6195
+ .dndev-text-base[data-variant='code'] {
6196
+ font-family: var(--font-mono);
6197
+ font-size: 0.9em;
6198
+ background: var(--muted);
6199
+ padding: 0.1em 0.4em;
6200
+ border-radius: var(--radius-interactive);
6201
+ }
6202
+
6122
6203
  /* Level overrides */
6123
6204
 
6124
6205
  .dndev-text-base[data-level='h1'] {
6125
6206
  font-size: var(--font-size-3xl);
6126
- font-weight: 700;
6207
+ font-weight: var(--font-weight-bold);
6127
6208
  letter-spacing: -0.02em;
6128
6209
  }
6129
6210
 
6130
6211
  .dndev-text-base[data-level='h2'] {
6131
- font-size: var(--font-size-2xl);
6132
- font-weight: 700;
6133
- letter-spacing: -0.01em;
6212
+ font-size: var(--font-size-lg);
6213
+ font-weight: var(--font-weight-semibold);
6134
6214
  }
6135
6215
 
6136
6216
  .dndev-text-base[data-level='h3'] {
6137
- font-size: var(--font-size-xl);
6138
- font-weight: 600;
6217
+ font-size: var(--font-size-lg);
6218
+ font-weight: var(--font-weight-semibold);
6139
6219
  }
6140
6220
 
6141
6221
  .dndev-text-base[data-level='h4'] {
6142
- font-size: var(--font-size-lg);
6143
- font-weight: 600;
6222
+ font-size: var(--font-size-base);
6223
+ font-weight: var(--font-weight-medium);
6224
+ color: var(--muted-foreground);
6144
6225
  }
6145
6226
 
6146
6227
  .dndev-text-base[data-level='body'] {
@@ -6200,7 +6281,7 @@ em {
6200
6281
  flex-shrink: 0;
6201
6282
  padding-inline-start: var(--gap-md);
6202
6283
  padding-inline-end: var(--gap-md);
6203
- border-radius: var(--radius-md);
6284
+ border-radius: var(--radius-interactive);
6204
6285
  border: 1px solid var(--border);
6205
6286
  font-size: var(--font-size-sm);
6206
6287
  }
@@ -6357,7 +6438,7 @@ em {
6357
6438
  align-items: center;
6358
6439
  gap: 0;
6359
6440
  padding: 0.125rem;
6360
- border-radius: var(--radius);
6441
+ border-radius: var(--radius-interactive);
6361
6442
  background-color: var(--muted);
6362
6443
  border: var(--border-width) solid var(--border);
6363
6444
  }
@@ -6451,7 +6532,7 @@ em {
6451
6532
  box-shadow: var(--shadow-lg); /* Stronger shadow for visibility */
6452
6533
  padding: 0.375rem 0.5rem; /* 6px 8px - industry standard */
6453
6534
  font-size: var(--font-size-xs); /* 12px */
6454
- border-radius: 0; /* Square, modern look */
6535
+ border-radius: var(--radius-floating);
6455
6536
  max-width: 12.5rem; /* 200px */
6456
6537
  }
6457
6538
 
@@ -6529,6 +6610,16 @@ em {
6529
6610
  filter: drop-shadow(0 2px 8px rgb(from var(--background) r g b / 0.5));
6530
6611
  }
6531
6612
 
6613
+ /* Loading overlay - shown while iframe loads */
6614
+
6615
+ .dndev-video-loading-overlay {
6616
+ z-index: 1;
6617
+ }
6618
+
6619
+ .dndev-video-loading-overlay .dndev-video-play-overlay {
6620
+ background: rgb(from var(--background) r g b / 0.6);
6621
+ }
6622
+
6532
6623
  /* Modal dialog wrapper */
6533
6624
 
6534
6625
  .dndev-video-dialog {
@@ -7070,7 +7161,7 @@ em {
7070
7161
  }
7071
7162
 
7072
7163
  .dndev-section-full-width[data-tone='muted'] {
7073
- background: color-mix(in oklab, var(--muted) 50%, transparent);
7164
+ background: var(--muted);
7074
7165
  }
7075
7166
 
7076
7167
  .dndev-section-full-width[data-tone='elevated'] {
@@ -7093,7 +7184,7 @@ em {
7093
7184
  }
7094
7185
 
7095
7186
  [data-tone='muted']:not(.dndev-section-full-width) {
7096
- background: color-mix(in oklab, var(--muted) 50%, transparent);
7187
+ background: var(--muted);
7097
7188
  }
7098
7189
 
7099
7190
  [data-tone='elevated']:not(.dndev-section-full-width) {
@@ -7142,7 +7233,7 @@ code {
7142
7233
  line-height: 1.5;
7143
7234
  white-space: pre-wrap;
7144
7235
  word-break: break-all;
7145
- border-radius: var(--radius-sm);
7236
+ border-radius: var(--radius-interactive);
7146
7237
  }
7147
7238
 
7148
7239
  /* Code element + variant = semantic + visual (monospace + background) */
@@ -7157,7 +7248,7 @@ code[data-variant='code'] {
7157
7248
  line-height: 1.5;
7158
7249
  white-space: pre-wrap;
7159
7250
  word-break: break-all;
7160
- border-radius: var(--radius-sm);
7251
+ border-radius: var(--radius-interactive);
7161
7252
  }
7162
7253
 
7163
7254
  /* Heading + code variant = heading size/weight + code background */
@@ -7175,7 +7266,7 @@ h4[data-variant='code'] {
7175
7266
  line-height: 1.5;
7176
7267
  white-space: pre-wrap;
7177
7268
  word-break: break-all;
7178
- border-radius: var(--radius-sm);
7269
+ border-radius: var(--radius-interactive);
7179
7270
  }
7180
7271
 
7181
7272
  /* ===========================
@@ -7229,6 +7320,7 @@ h4[data-variant='code'] {
7229
7320
 
7230
7321
  .dndev-relative {
7231
7322
  position: relative;
7323
+ min-width: 0; /* Allow flex items to shrink below content size */
7232
7324
  }
7233
7325
 
7234
7326
  .dndev-absolute {
@@ -7413,6 +7505,40 @@ h4[data-variant='code'] {
7413
7505
  border: 0;
7414
7506
  }
7415
7507
 
7508
+ /* ===========================
7509
+ PROSE - SEMANTIC TYPOGRAPHY FOR CONTENT PAGES
7510
+ Wrap docs/markdown/article content in .prose for semantic margins
7511
+ Components are unaffected - they own their own spacing
7512
+ =========================== */
7513
+
7514
+ .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7515
+ margin-block: var(--gap-md);
7516
+ }
7517
+
7518
+ .prose p {
7519
+ margin-block: var(--gap-md);
7520
+ }
7521
+
7522
+ .prose ul,.prose ol {
7523
+ padding-inline-start: var(--gap-lg);
7524
+ margin-block: var(--gap-md);
7525
+ }
7526
+
7527
+ .prose li {
7528
+ margin-block: var(--gap-sm);
7529
+ padding-inline-start: var(--gap-sm);
7530
+ }
7531
+
7532
+ /* First/last child: remove top/bottom margin for clean container edges */
7533
+
7534
+ .prose > :first-child {
7535
+ margin-block-start: 0;
7536
+ }
7537
+
7538
+ .prose > :last-child {
7539
+ margin-block-end: 0;
7540
+ }
7541
+
7416
7542
  /* ===========================
7417
7543
  SHADOW CONTROL (Universal)
7418
7544
  Works with any element
@@ -7640,7 +7766,7 @@ h4[data-variant='code'] {
7640
7766
  =========================== */
7641
7767
 
7642
7768
  /* Single animation type (fade, slide, or none to disable) - app-wide */
7643
- --routing-animation: fade;
7769
+ --routing-animation: none;
7644
7770
  --routing-default-duration: var(--dur-normal);
7645
7771
 
7646
7772
  /* Breakpoint-specific durations */
@@ -7720,24 +7846,26 @@ h4[data-variant='code'] {
7720
7846
 
7721
7847
  /* Routing animations - applied to main content area */
7722
7848
 
7849
+ /* Default: visible (progressive enhancement - content shows even if JS fails) */
7850
+
7723
7851
  main[role='main'] {
7724
- opacity: 0;
7852
+ opacity: 1;
7725
7853
  }
7726
7854
 
7727
- /* Fade animation */
7855
+ /* Fade animation - keyframes handle opacity 0→1 */
7728
7856
 
7729
7857
  main[role='main'][data-routing-animation='fade'] {
7730
7858
  animation: routeFadeIn var(--routing-default-duration, 300ms) ease-in forwards;
7731
7859
  }
7732
7860
 
7733
- /* Slide animation */
7861
+ /* Slide animation - keyframes handle opacity 0→1 */
7734
7862
 
7735
7863
  main[role='main'][data-routing-animation='slide'] {
7736
7864
  animation: routeSlideIn var(--routing-default-duration, 300ms) ease-in
7737
7865
  forwards;
7738
7866
  }
7739
7867
 
7740
- /* No animation */
7868
+ /* No animation - already visible by default, explicit for clarity */
7741
7869
 
7742
7870
  main[role='main'][data-routing-animation='none'] {
7743
7871
  animation: none;
@@ -7848,18 +7976,20 @@ main[role='main'][data-routing-animation='none'] {
7848
7976
  display: grid;
7849
7977
  /* ONE DRY grid structure: 3 rows, 2 columns */
7850
7978
  /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
7979
+ /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
7980
+ implement ResizeObserver to update --footer-height dynamically. */
7851
7981
  grid-template-areas:
7852
7982
  'header header'
7853
7983
  'sidebar main'
7854
7984
  'footer footer';
7855
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
7985
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7856
7986
  grid-template-columns: var(--sidebar-width) 1fr;
7857
7987
 
7858
7988
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
7859
7989
  }
7860
7990
 
7861
7991
  [data-layout='game']:root .dndev-layout {
7862
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
7992
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7863
7993
  }
7864
7994
 
7865
7995
  /* ===========================
@@ -8146,13 +8276,6 @@ aside.sidebar[role='navigation'] .dndev-interactive-label {
8146
8276
  justify-content: center;
8147
8277
  }
8148
8278
 
8149
- /* Sidebar navigation menu - 48px buttons/icons default */
8150
-
8151
- .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'] {
8152
- width: var(--touch-target);
8153
- height: var(--touch-target);
8154
- }
8155
-
8156
8279
  /* Collapsed sidebar: hide labels, center icons */
8157
8280
 
8158
8281
  /* Hide all auto-display labels */
@@ -8218,7 +8341,7 @@ footer[role='contentinfo'] {
8218
8341
  grid-area: footer;
8219
8342
  box-sizing: border-box;
8220
8343
  grid-column: 1 / -1;
8221
- height: var(--footer-height);
8344
+ min-height: var(--footer-height);
8222
8345
  z-index: var(--z-footer);
8223
8346
 
8224
8347
  /* Theme-aware styling - 100% controlled by theme system */
@@ -8266,7 +8389,7 @@ footer[role='contentinfo'] > * {
8266
8389
 
8267
8390
  footer[role='contentinfo'] .footer-copyright {
8268
8391
  color: var(--muted-foreground);
8269
- font-size: var(--font-size-xs);
8392
+ font-size: var(--font-size-sm);
8270
8393
  }
8271
8394
 
8272
8395
  footer[role='contentinfo'] a:not(.dndev-interactive) {
@@ -8274,7 +8397,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive) {
8274
8397
  text-decoration: underline;
8275
8398
  text-underline-offset: 2px;
8276
8399
  color: var(--muted-foreground);
8277
- font-size: var(--font-size-xs);
8400
+ font-size: var(--font-size-sm);
8278
8401
  background: transparent;
8279
8402
  }
8280
8403
 
@@ -8673,6 +8796,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8673
8796
  .dndev-container[data-centered='false'] {
8674
8797
  margin-inline-start: 0;
8675
8798
  margin-inline-end: 0;
8799
+ justify-content: flex-start;
8676
8800
  }
8677
8801
 
8678
8802
  /* Full width - no constraints */