@donotdev/ui 0.0.13 → 0.0.15

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 (163) hide show
  1. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  2. package/dist/components/auth/AuthMenu.js +19 -20
  3. package/dist/components/common/FeatureCard.d.ts +3 -1
  4. package/dist/components/common/FeatureCard.d.ts.map +1 -1
  5. package/dist/components/common/FeatureCard.js +2 -2
  6. package/dist/components/common/ProgressBar.js +2 -2
  7. package/dist/components/common/TechBento.d.ts +14 -2
  8. package/dist/components/common/TechBento.d.ts.map +1 -1
  9. package/dist/components/common/TechBento.js +8 -9
  10. package/dist/components/cookie-consent/CookieConsent.d.ts.map +1 -1
  11. package/dist/components/cookie-consent/CookieConsent.js +3 -4
  12. package/dist/components/layout/components/DropdownNavigation.d.ts.map +1 -1
  13. package/dist/components/layout/components/DropdownNavigation.js +3 -12
  14. package/dist/components/layout/components/FloatingLanguageSwitcher.js +1 -1
  15. package/dist/components/layout/components/Notifications.d.ts +1 -3
  16. package/dist/components/layout/components/Notifications.d.ts.map +1 -1
  17. package/dist/components/layout/components/Notifications.js +4 -2
  18. package/dist/components/layout/components/header/AppBranding.d.ts.map +1 -1
  19. package/dist/components/layout/components/header/AppBranding.js +2 -1
  20. package/dist/components/layout/components/header/AppIcon.d.ts.map +1 -1
  21. package/dist/components/layout/components/header/AppIcon.js +5 -2
  22. package/dist/components/layout/components/header/CacheSettings.d.ts.map +1 -1
  23. package/dist/components/layout/components/header/CacheSettings.js +3 -1
  24. package/dist/components/layout/components/header/HeaderNavigation.d.ts +6 -0
  25. package/dist/components/layout/components/header/HeaderNavigation.d.ts.map +1 -1
  26. package/dist/components/layout/components/header/HeaderNavigation.js +12 -2
  27. package/dist/components/layout/components/index.d.ts +3 -0
  28. package/dist/components/layout/components/index.d.ts.map +1 -1
  29. package/dist/components/layout/components/index.js +3 -0
  30. package/dist/components/license/LicenseWatermark.d.ts.map +1 -1
  31. package/dist/components/license/LicenseWatermark.js +3 -1
  32. package/dist/crud/components/CrudCardLink.d.ts +17 -0
  33. package/dist/crud/components/CrudCardLink.d.ts.map +1 -0
  34. package/dist/crud/components/CrudCardLink.js +17 -0
  35. package/dist/crud/components/EntityCardList.d.ts +1 -1
  36. package/dist/crud/components/EntityCardList.d.ts.map +1 -1
  37. package/dist/crud/components/EntityCardList.js +38 -90
  38. package/dist/crud/components/EntityDisplayRenderer.d.ts +1 -1
  39. package/dist/crud/components/EntityDisplayRenderer.d.ts.map +1 -1
  40. package/dist/crud/components/EntityDisplayRenderer.js +11 -3
  41. package/dist/crud/components/EntityFormRenderer.d.ts +1 -1
  42. package/dist/crud/components/EntityFormRenderer.d.ts.map +1 -1
  43. package/dist/crud/components/EntityFormRenderer.js +34 -40
  44. package/dist/crud/components/EntityList.d.ts +1 -1
  45. package/dist/crud/components/EntityList.d.ts.map +1 -1
  46. package/dist/crud/components/EntityList.js +1 -1
  47. package/dist/crud/components/EntityRecommendations.d.ts +29 -0
  48. package/dist/crud/components/EntityRecommendations.d.ts.map +1 -0
  49. package/dist/crud/components/EntityRecommendations.js +32 -0
  50. package/dist/crud/components/index.d.ts +2 -1
  51. package/dist/crud/components/index.d.ts.map +1 -1
  52. package/dist/crud/components/index.js +1 -0
  53. package/dist/dndev.css +1021 -196
  54. package/dist/index.js +4 -4
  55. package/dist/internal/common/RouteErrorFallback.d.ts.map +1 -1
  56. package/dist/internal/devtools/components/AuthDebugButton.js +1 -1
  57. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  58. package/dist/internal/devtools/components/DesignTab.js +3 -2
  59. package/dist/internal/devtools/components/LayoutReset.d.ts.map +1 -1
  60. package/dist/internal/devtools/components/LayoutReset.js +2 -0
  61. package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
  62. package/dist/internal/devtools/components/StoresTab.js +3 -0
  63. package/dist/internal/devtools/utils/envVarDiscovery.d.ts +1 -0
  64. package/dist/internal/devtools/utils/envVarDiscovery.d.ts.map +1 -1
  65. package/dist/internal/devtools/utils/envVarDiscovery.js +5 -0
  66. package/dist/internal/devtools/utils/virtualModuleInspector.d.ts.map +1 -1
  67. package/dist/internal/devtools/utils/virtualModuleInspector.js +27 -21
  68. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  69. package/dist/internal/initializers/BaseStoresInitializer.js +30 -6
  70. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  71. package/dist/internal/layout/components/AutoMetaTags.js +10 -8
  72. package/dist/internal/layout/components/FontPreloadLinks.d.ts +16 -0
  73. package/dist/internal/layout/components/FontPreloadLinks.d.ts.map +1 -0
  74. package/dist/internal/layout/components/FontPreloadLinks.js +32 -0
  75. package/dist/internal/layout/components/PerformanceHints.d.ts +7 -12
  76. package/dist/internal/layout/components/PerformanceHints.d.ts.map +1 -1
  77. package/dist/internal/layout/components/PerformanceHints.js +8 -12
  78. package/dist/internal/layout/components/footer/useLegalLinks.d.ts +6 -5
  79. package/dist/internal/layout/components/footer/useLegalLinks.d.ts.map +1 -1
  80. package/dist/internal/layout/components/footer/useLegalLinks.js +6 -2
  81. package/dist/internal/layout/zones/DnDevFooter.d.ts +6 -0
  82. package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
  83. package/dist/internal/layout/zones/DnDevFooter.js +10 -4
  84. package/dist/internal/layout/zones/DnDevHeader.d.ts +7 -0
  85. package/dist/internal/layout/zones/DnDevHeader.d.ts.map +1 -1
  86. package/dist/internal/layout/zones/DnDevHeader.js +7 -0
  87. package/dist/internal/layout/zones/DnDevMergedBar.d.ts +7 -0
  88. package/dist/internal/layout/zones/DnDevMergedBar.d.ts.map +1 -1
  89. package/dist/internal/layout/zones/DnDevMergedBar.js +9 -0
  90. package/dist/internal/layout/zones/DnDevSidebar.d.ts +4 -0
  91. package/dist/internal/layout/zones/DnDevSidebar.d.ts.map +1 -1
  92. package/dist/internal/layout/zones/DnDevSidebar.js +13 -1
  93. package/dist/internal/providers/NavigationProvider.d.ts.map +1 -1
  94. package/dist/internal/providers/NavigationProvider.js +3 -5
  95. package/dist/next.d.ts +1 -0
  96. package/dist/next.d.ts.map +1 -1
  97. package/dist/next.js +1 -0
  98. package/dist/providers/ViteAppProviders.d.ts.map +1 -1
  99. package/dist/providers/ViteAppProviders.js +3 -5
  100. package/dist/routing/AuthGuard.d.ts +1 -1
  101. package/dist/routing/AuthGuard.d.ts.map +1 -1
  102. package/dist/routing/AuthGuard.js +3 -1
  103. package/dist/routing/GoTo.d.ts.map +1 -1
  104. package/dist/routing/GoTo.js +3 -1
  105. package/dist/routing/GoToDialog.d.ts.map +1 -1
  106. package/dist/routing/GoToDialog.js +2 -7
  107. package/dist/routing/GoToInput.d.ts +0 -3
  108. package/dist/routing/GoToInput.d.ts.map +1 -1
  109. package/dist/routing/GoToInput.js +8 -7
  110. package/dist/routing/Link.js +1 -1
  111. package/dist/routing/NavigationItem.d.ts +29 -7
  112. package/dist/routing/NavigationItem.d.ts.map +1 -1
  113. package/dist/routing/NavigationItem.js +22 -6
  114. package/dist/routing/hooks/hooks.next.js +1 -1
  115. package/dist/routing/hooks/hooks.vite.js +1 -1
  116. package/dist/routing/hooks/useNavigate.next.d.ts +1 -1
  117. package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
  118. package/dist/routing/hooks/useNavigate.next.js +1 -7
  119. package/dist/routing/hooks/useNavigate.vite.d.ts +1 -1
  120. package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
  121. package/dist/routing/hooks/useNavigate.vite.js +1 -7
  122. package/dist/routing/hooks/useRedirectGuard.next.d.ts.map +1 -1
  123. package/dist/routing/hooks/useRedirectGuard.next.js +9 -8
  124. package/dist/routing/hooks/useRedirectGuard.vite.d.ts.map +1 -1
  125. package/dist/routing/hooks/useRedirectGuard.vite.js +9 -8
  126. package/dist/routing/hooks/useSearchParams.next.d.ts +18 -1
  127. package/dist/routing/hooks/useSearchParams.next.d.ts.map +1 -1
  128. package/dist/routing/hooks/useSearchParams.next.js +16 -0
  129. package/dist/routing/hooks/useSearchParams.vite.d.ts +16 -0
  130. package/dist/routing/hooks/useSearchParams.vite.d.ts.map +1 -1
  131. package/dist/routing/hooks/useSearchParams.vite.js +17 -1
  132. package/dist/routing/index.d.ts.map +1 -1
  133. package/dist/routing/index.js +2 -0
  134. package/dist/routing/useNavigation.d.ts +30 -0
  135. package/dist/routing/useNavigation.d.ts.map +1 -1
  136. package/dist/routing/useNavigation.js +40 -3
  137. package/dist/routing/useRouteDiscovery.d.ts +6 -17
  138. package/dist/routing/useRouteDiscovery.d.ts.map +1 -1
  139. package/dist/routing/useRouteDiscovery.js +16 -9
  140. package/dist/styles/index.css +284 -88
  141. package/dist/utils/index.d.ts +1 -0
  142. package/dist/utils/index.d.ts.map +1 -1
  143. package/dist/utils/index.js +1 -0
  144. package/dist/utils/sanitizeSvg.d.ts +13 -0
  145. package/dist/utils/sanitizeSvg.d.ts.map +1 -0
  146. package/dist/utils/sanitizeSvg.js +47 -0
  147. package/dist/utils/useBillingVisibility.d.ts.map +1 -1
  148. package/dist/utils/useBillingVisibility.js +0 -7
  149. package/dist/utils/useCrudSafe.d.ts +0 -2
  150. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  151. package/dist/utils/useFormStoreSafe.d.ts +5 -16
  152. package/dist/utils/useFormStoreSafe.d.ts.map +1 -1
  153. package/dist/utils/useFormStoreSafe.js +6 -37
  154. package/dist/vite-routing/AppRoutes.d.ts +19 -8
  155. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  156. package/dist/vite-routing/AppRoutes.js +0 -3
  157. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  158. package/dist/vite-routing/RootLayout.js +10 -15
  159. package/package.json +16 -12
  160. package/assets/fonts/fonts.css +0 -206
  161. package/dist/routing/Navigate.d.ts +0 -10
  162. package/dist/routing/Navigate.d.ts.map +0 -1
  163. package/dist/routing/Navigate.js +0 -10
@@ -121,6 +121,15 @@
121
121
  --popover: var(--card);
122
122
  --popover-foreground: var(--card-foreground);
123
123
 
124
+ /*
125
+ * Root card snapshot — computed once on :root from --card/--card-foreground,
126
+ * then inherited unchanged. Variant blocks (e.g. primary) override --card but
127
+ * never touch these, so data-variant='default' can reset --card back to the
128
+ * root value even when nested inside another variant.
129
+ */
130
+ --card-base: var(--card);
131
+ --card-foreground-base: var(--card-foreground);
132
+
124
133
  /* ===========================
125
134
  BORDER RADIUS - 3 VALUES ONLY
126
135
  =========================== */
@@ -216,6 +225,16 @@
216
225
  -6px 12px 24px -6px var(--shadow-color),
217
226
  -3px 6px 12px -3px var(--shadow-color-light);
218
227
 
228
+ /* Root shadow snapshots — same principle as --card-base (see above) */
229
+ --shadow-md-base: var(--shadow-md);
230
+ --shadow-xl-base: var(--shadow-xl);
231
+
232
+ /* Per-variant shadows — essences override these with different colors/shapes */
233
+ --shadow-primary: var(--shadow-md);
234
+ --shadow-primary-xl: var(--shadow-xl);
235
+ --shadow-secondary: var(--shadow-md);
236
+ --shadow-secondary-xl: var(--shadow-xl);
237
+
219
238
  /* Interactive shadows */
220
239
  --shadow-interactive: 0 0 0 3px
221
240
  color-mix(in oklab, var(--ring) 20%, transparent);
@@ -519,7 +538,6 @@ body {
519
538
  /* Reset and base styles */
520
539
 
521
540
  :root {
522
- font-family: var(--font-sans);
523
541
  -webkit-font-smoothing: antialiased;
524
542
  -moz-osx-font-smoothing: grayscale;
525
543
  text-rendering: optimizeLegibility;
@@ -533,9 +551,10 @@ body {
533
551
  box-sizing: border-box;
534
552
  }
535
553
 
536
- /* Set core body defaults */
554
+ /* Set core body defaults — font-family here so theme tokens on :root cascade cleanly */
537
555
 
538
556
  body {
557
+ font-family: var(--font-family, var(--font-sans));
539
558
  min-height: 100dvh;
540
559
  line-height: var(--line-height);
541
560
  text-rendering: optimizeSpeed;
@@ -610,17 +629,21 @@ h6 {
610
629
  color: var(--foreground);
611
630
  background: transparent;
612
631
  text-wrap: balance; /* Equalize line lengths, prevent orphans */
632
+ text-transform: var(--text-transform-heading, none);
633
+ letter-spacing: var(--letter-spacing-heading, normal);
613
634
  }
614
635
 
615
- h1 {
636
+ :is(h1, h2, h3, h4, h5, h6) {
616
637
  font-family: var(--font-headline);
638
+ }
639
+
640
+ h1 {
617
641
  font-size: var(--font-size-3xl);
618
642
  font-weight: var(--font-weight-bold);
619
643
  letter-spacing: -0.02em;
620
644
  }
621
645
 
622
646
  h2 {
623
- font-family: var(--font-headline);
624
647
  font-size: var(--font-size-2xl);
625
648
  font-weight: var(--font-weight-bold);
626
649
  letter-spacing: -0.01em;
@@ -1051,10 +1074,20 @@ em {
1051
1074
  * - accent: Highlighted/active state (--accent colors, sets context for children)
1052
1075
  * - destructive: Error/danger state (--destructive colors)
1053
1076
  *
1054
- * Variants only override --card and --card-foreground.
1077
+ * Variants override --card and --card-foreground.
1078
+ * Primary/secondary also override --shadow-md/--shadow-xl for per-variant shadows.
1079
+ * Default resets --card from --card-base (root snapshot) so nested default cards
1080
+ * inside other variants get the root card color, not the parent's.
1055
1081
  * Surface glow gradient is computed from --theme-is-dark flag and not affected by variants.
1056
1082
  */
1057
1083
 
1084
+ .dndev-surface[data-variant='default'] {
1085
+ --card: var(--card-base);
1086
+ --card-foreground: var(--card-foreground-base);
1087
+ --shadow-md: var(--shadow-md-base);
1088
+ --shadow-xl: var(--shadow-xl-base);
1089
+ }
1090
+
1058
1091
  .dndev-surface[data-variant='muted'] {
1059
1092
  --card: var(--muted);
1060
1093
  --card-foreground: var(--muted-foreground);
@@ -1064,12 +1097,16 @@ em {
1064
1097
  .dndev-surface[data-variant='primary'] {
1065
1098
  --card: var(--primary);
1066
1099
  --card-foreground: var(--primary-foreground);
1100
+ --shadow-md: var(--shadow-primary);
1101
+ --shadow-xl: var(--shadow-primary-xl);
1067
1102
  border-color: var(--primary);
1068
1103
  }
1069
1104
 
1070
1105
  .dndev-surface[data-variant='secondary'] {
1071
1106
  --card: var(--secondary);
1072
1107
  --card-foreground: var(--secondary-foreground);
1108
+ --shadow-md: var(--shadow-secondary);
1109
+ --shadow-xl: var(--shadow-secondary-xl);
1073
1110
  border-color: var(--secondary);
1074
1111
  }
1075
1112
 
@@ -1351,6 +1388,7 @@ em {
1351
1388
  border-radius: var(--radius-interactive);
1352
1389
  font-size: var(--font-size-base);
1353
1390
  font-weight: var(--font-weight-medium);
1391
+ text-transform: var(--text-transform-button, none);
1354
1392
  transition: var(--transition-fast);
1355
1393
  cursor: pointer;
1356
1394
  border: var(--border-hairline) solid transparent;
@@ -1641,6 +1679,7 @@ em {
1641
1679
  overflow: hidden;
1642
1680
  text-overflow: ellipsis;
1643
1681
  white-space: nowrap;
1682
+ text-transform: var(--text-transform-label, none);
1644
1683
  }
1645
1684
 
1646
1685
  /* Compact mode - always hide label */
@@ -1706,7 +1745,8 @@ em {
1706
1745
 
1707
1746
  .dndev-control[data-state='checked'],.dndev-control[data-state='on'],.dndev-control[data-pressed='true'] {
1708
1747
  background-color: var(--control-border);
1709
- color: var(--background);
1748
+ /* --card not --background: inverted text must be opaque (--background can be transparent in some themes) */
1749
+ color: var(--card);
1710
1750
  }
1711
1751
 
1712
1752
  /* CONTROL GROUP - Shared pattern for grouped controls (RadioGroup, Checkbox groups) */
@@ -2012,7 +2052,7 @@ em {
2012
2052
  height: var(--icon-md);
2013
2053
  border: 2px solid currentColor;
2014
2054
  border-radius: var(--radius-full);
2015
- border-right-color: transparent;
2055
+ border-inline-end-color: transparent;
2016
2056
  animation: spin 1s linear infinite;
2017
2057
  }
2018
2058
 
@@ -2352,7 +2392,6 @@ em {
2352
2392
  flex-shrink: 0;
2353
2393
  overflow: hidden;
2354
2394
  border-radius: var(--radius-full);
2355
- border: 1px solid var(--border);
2356
2395
  }
2357
2396
 
2358
2397
  .dndev-avatar-image {
@@ -2809,8 +2848,7 @@ em {
2809
2848
  .dndev-calendar-nav {
2810
2849
  position: absolute;
2811
2850
  top: 0;
2812
- left: 0;
2813
- right: 0;
2851
+ inset-inline: 0;
2814
2852
  height: var(--touch-target);
2815
2853
  pointer-events: none;
2816
2854
  z-index: 1;
@@ -2840,13 +2878,13 @@ em {
2840
2878
  }
2841
2879
 
2842
2880
  .dndev-calendar-nav-previous {
2843
- left: 0;
2881
+ inset-inline-start: 0;
2844
2882
  border-start-start-radius: 0;
2845
2883
  border-end-start-radius: 0;
2846
2884
  }
2847
2885
 
2848
2886
  .dndev-calendar-nav-next {
2849
- right: 0;
2887
+ inset-inline-end: 0;
2850
2888
  border-start-end-radius: 0;
2851
2889
  border-end-end-radius: 0;
2852
2890
  }
@@ -3092,13 +3130,10 @@ em {
3092
3130
  background: var(--muted);
3093
3131
  }
3094
3132
 
3095
- .dndev-cta[data-tone='elevated'] {
3096
- background: var(--background);
3097
- }
3098
-
3099
3133
  .dndev-cta[data-tone='contrast'] {
3100
3134
  background: var(--foreground);
3101
- color: var(--background);
3135
+ /* --card not --background: inverted text must be opaque (--background can be transparent in some themes) */
3136
+ color: var(--card);
3102
3137
  }
3103
3138
 
3104
3139
  .dndev-cta[data-tone='accent'] {
@@ -3153,7 +3188,8 @@ em {
3153
3188
 
3154
3189
  .dndev-cta-actions .dndev-interactive[data-variant='primary'] {
3155
3190
  background: var(--foreground);
3156
- color: var(--background);
3191
+ /* --card not --background: inverted text must be opaque */
3192
+ color: var(--card);
3157
3193
  border-color: var(--foreground);
3158
3194
  }
3159
3195
 
@@ -3171,7 +3207,8 @@ em {
3171
3207
 
3172
3208
  :is(.dndev-cta-actions .dndev-interactive[data-variant='outline']):hover {
3173
3209
  background: var(--foreground);
3174
- color: var(--background);
3210
+ /* --card not --background: inverted text must be opaque */
3211
+ color: var(--card);
3175
3212
  border-color: var(--foreground);
3176
3213
  }
3177
3214
 
@@ -3386,7 +3423,7 @@ em {
3386
3423
  justify-content: space-between;
3387
3424
  align-items: center;
3388
3425
  width: 100%;
3389
- text-align: left;
3426
+ text-align: start;
3390
3427
  }
3391
3428
 
3392
3429
  .dndev-combobox-trigger button {
@@ -3543,6 +3580,10 @@ em {
3543
3580
  flex-shrink: 0;
3544
3581
  }
3545
3582
 
3583
+ .dndev-combobox-create-btn:hover {
3584
+ opacity: 0.8;
3585
+ }
3586
+
3546
3587
  .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
3547
3588
  .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
3548
3589
  transform: rotate(180deg);
@@ -3728,8 +3769,9 @@ em {
3728
3769
  }
3729
3770
 
3730
3771
  .dndev-code-line-number {
3731
- line-height: inherit;
3732
- /* Inherit from parent */
3772
+ line-height: 1.5;
3773
+ min-height: 1.5em;
3774
+ font-size: inherit;
3733
3775
  }
3734
3776
 
3735
3777
  .dndev-code-code {
@@ -3749,7 +3791,21 @@ em {
3749
3791
  .dndev-code-code code {
3750
3792
  line-height: inherit;
3751
3793
  font-size: inherit;
3752
- /* Match parent font-size */
3794
+ }
3795
+
3796
+ /* Shiki wraps each line in <span class="line"> — force consistent sizing */
3797
+
3798
+ .dndev-code-code .line {
3799
+ display: block;
3800
+ line-height: 1.5;
3801
+ font-size: inherit;
3802
+ min-height: 1.5em;
3803
+ }
3804
+
3805
+ /* Empty Shiki lines still need height to stay in sync with line numbers */
3806
+
3807
+ .dndev-code-code .line:empty::after {
3808
+ content: '\00a0';
3753
3809
  }
3754
3810
 
3755
3811
  /* packages/components/src/atomic/Command/Command.css */
@@ -3913,7 +3969,7 @@ em {
3913
3969
  order: 3;
3914
3970
  font-size: var(--font-size-xs);
3915
3971
  color: var(--muted-foreground);
3916
- padding-left: calc(var(--icon-md) + var(--gap-sm));
3972
+ padding-inline-start: calc(var(--icon-md) + var(--gap-sm));
3917
3973
  }
3918
3974
 
3919
3975
  .dndev-command-favorite-button {
@@ -4199,6 +4255,54 @@ em {
4199
4255
  }
4200
4256
  }
4201
4257
 
4258
+ /* Responsive templateColumns via custom properties */
4259
+
4260
+ .dndev-grid-component[data-responsive-tpl='true'] {
4261
+ grid-template-columns: var(--grid-tpl-mobile);
4262
+ }
4263
+
4264
+ @media (min-width: 768px) {
4265
+ .dndev-grid-component[data-responsive-tpl='true'] {
4266
+ grid-template-columns: var(--grid-tpl-tablet);
4267
+ }
4268
+ }
4269
+
4270
+ @media (min-width: 1024px) {
4271
+ .dndev-grid-component[data-responsive-tpl='true'] {
4272
+ grid-template-columns: var(--grid-tpl-laptop);
4273
+ }
4274
+ }
4275
+
4276
+ @media (min-width: 1440px) {
4277
+ .dndev-grid-component[data-responsive-tpl='true'] {
4278
+ grid-template-columns: var(--grid-tpl-desktop);
4279
+ }
4280
+ }
4281
+
4282
+ /* Responsive grid areas via custom properties */
4283
+
4284
+ .dndev-grid-component[data-responsive-areas='true'] {
4285
+ grid-template-areas: var(--grid-areas-mobile);
4286
+ }
4287
+
4288
+ @media (min-width: 768px) {
4289
+ .dndev-grid-component[data-responsive-areas='true'] {
4290
+ grid-template-areas: var(--grid-areas-tablet);
4291
+ }
4292
+ }
4293
+
4294
+ @media (min-width: 1024px) {
4295
+ .dndev-grid-component[data-responsive-areas='true'] {
4296
+ grid-template-areas: var(--grid-areas-laptop);
4297
+ }
4298
+ }
4299
+
4300
+ @media (min-width: 1440px) {
4301
+ .dndev-grid-component[data-responsive-areas='true'] {
4302
+ grid-template-areas: var(--grid-areas-desktop);
4303
+ }
4304
+ }
4305
+
4202
4306
  /* Spacing from CSS variables */
4203
4307
 
4204
4308
  .dndev-grid-component[data-gap='none'] {
@@ -4512,7 +4616,8 @@ em {
4512
4616
  height: 44px;
4513
4617
  border: none;
4514
4618
  border-radius: var(--radius-full);
4515
- background-color: var(--background);
4619
+ /* --card not --background: surface must be opaque */
4620
+ background-color: var(--card);
4516
4621
  color: var(--foreground);
4517
4622
  cursor: pointer;
4518
4623
  opacity: 0;
@@ -5079,7 +5184,7 @@ input[type='number'] {
5079
5184
  }
5080
5185
 
5081
5186
  .dndev-nav-menu-content {
5082
- left: 0;
5187
+ inset-inline-start: 0;
5083
5188
  top: 0;
5084
5189
  width: 100%;
5085
5190
  }
@@ -5094,7 +5199,7 @@ input[type='number'] {
5094
5199
 
5095
5200
  .dndev-nav-menu-viewport-wrapper {
5096
5201
  position: absolute;
5097
- left: 0;
5202
+ inset-inline-start: 0;
5098
5203
  top: 100%;
5099
5204
  display: flex;
5100
5205
  justify-content: center;
@@ -5134,7 +5239,7 @@ input[type='number'] {
5134
5239
  height: var(--gap-sm);
5135
5240
  width: var(--gap-sm);
5136
5241
  transform: rotate(45deg);
5137
- border-top-left-radius: 2px;
5242
+ border-start-start-radius: 2px;
5138
5243
  background-color: var(--border);
5139
5244
  box-shadow: var(--shadow-md);
5140
5245
  }
@@ -5305,19 +5410,34 @@ input[type='number'] {
5305
5410
  }
5306
5411
 
5307
5412
  .dndev-pagination-size-label {
5308
- margin-right: var(--gap-sm);
5413
+ margin-inline-end: var(--gap-sm);
5309
5414
  }
5310
5415
 
5311
5416
  .dndev-pagination-nav {
5312
5417
  justify-content: flex-end;
5313
5418
  width: auto;
5314
- margin-left: auto;
5315
- /* Push to right */
5419
+ margin-inline-start: auto;
5420
+ /* Push to end */
5316
5421
  }
5317
5422
  }
5318
5423
 
5319
5424
  /* packages/components/src/atomic/Popover/Popover.css */
5320
5425
 
5426
+ /* Popover content width constraints and wrapping */
5427
+
5428
+ /* Targets Radix UI PopoverContent element */
5429
+
5430
+ [data-radix-popover-content],
5431
+ .dndev-floating[data-radix-popover-content] {
5432
+ max-width: min(90vw, 400px);
5433
+ width: -moz-max-content;
5434
+ width: max-content;
5435
+ min-width: 0;
5436
+ word-wrap: break-word;
5437
+ overflow-wrap: break-word;
5438
+ white-space: normal;
5439
+ }
5440
+
5321
5441
  /* packages/components/src/atomic/Progress/Progress.css */
5322
5442
 
5323
5443
  .dndev-progress {
@@ -5662,9 +5782,10 @@ input[type='number'] {
5662
5782
  /* Content wrapper: constrained + centered + padded */
5663
5783
 
5664
5784
  .dndev-section-content {
5665
- /* Respects PageContainer's --content-width */
5785
+ /* Respects PageContainer's --content-width (passed through breakthrough root) */
5666
5786
  max-width: var(--content-width);
5667
5787
  margin-inline: auto;
5788
+ min-width: 0; /* Allow shrinking so max-width wins when content would force wider */
5668
5789
  /* Padding with section background - responsive to match PageContainer */
5669
5790
  padding-inline: var(--gap-md);
5670
5791
  padding-top: var(--gap-lg);
@@ -5912,6 +6033,9 @@ input[type='number'] {
5912
6033
 
5913
6034
  /* Sheet positioning by side - SPATIAL METAPHOR */
5914
6035
 
6036
+ /* Physical properties intentional: Sheet anchors to viewport edges regardless of text direction.
6037
+ Logical inset-inline would incorrectly swap sides in RTL for left/right sheet variants. */
6038
+
5915
6039
  /* RIGHT / LEFT (Desktop Panels) */
5916
6040
 
5917
6041
  .dndev-sheet-content[data-side='right'],.dndev-sheet-content[data-side='left'] {
@@ -5952,8 +6076,7 @@ input[type='number'] {
5952
6076
  max-height: 92dvh;
5953
6077
  /* Never touch top edge */
5954
6078
  width: 100%;
5955
- margin-left: auto;
5956
- margin-right: auto;
6079
+ margin-inline: auto;
5957
6080
 
5958
6081
  /* On larger screens, constrain width */
5959
6082
  }
@@ -5972,16 +6095,16 @@ input[type='number'] {
5972
6095
  top: 0;
5973
6096
  border-bottom: var(--border-hairline) solid var(--line-1);
5974
6097
  /* Rounded bottom corners only */
5975
- border-bottom-left-radius: var(--radius-lg);
5976
- border-bottom-right-radius: var(--radius-lg);
6098
+ border-end-start-radius: var(--radius-lg);
6099
+ border-end-end-radius: var(--radius-lg);
5977
6100
  }
5978
6101
 
5979
6102
  .dndev-sheet-content[data-side='bottom'] {
5980
6103
  bottom: 0;
5981
6104
  border-top: var(--border-hairline) solid var(--line-1);
5982
6105
  /* Rounded top corners only */
5983
- border-top-left-radius: var(--radius-lg);
5984
- border-top-right-radius: var(--radius-lg);
6106
+ border-start-start-radius: var(--radius-lg);
6107
+ border-start-end-radius: var(--radius-lg);
5985
6108
  }
5986
6109
 
5987
6110
  /* DRAG HANDLE PILL - Visual affordance for draggable sheets */
@@ -6300,7 +6423,8 @@ input[type='number'] {
6300
6423
  min-width: 1.25rem;
6301
6424
  min-height: 1.25rem;
6302
6425
  border-radius: var(--radius-full);
6303
- background-color: var(--background);
6426
+ /* --card not --background: surface must be opaque (--background can be transparent in some themes) */
6427
+ background-color: var(--card);
6304
6428
  border: 2px solid var(--primary);
6305
6429
  box-shadow: var(--shadow-md);
6306
6430
  transition: all var(--dur-fast) var(--ease-in-out);
@@ -6371,7 +6495,8 @@ input[type='number'] {
6371
6495
  font-size: var(--font-size-xs);
6372
6496
  font-weight: var(--font-weight-medium);
6373
6497
  color: var(--foreground);
6374
- background-color: var(--background);
6498
+ /* --card not --background: surface must be opaque */
6499
+ background-color: var(--card);
6375
6500
  padding: 0.125rem 0.375rem;
6376
6501
  border-radius: var(--radius-interactive);
6377
6502
  box-shadow: var(--shadow-sm);
@@ -6395,7 +6520,7 @@ input[type='number'] {
6395
6520
  height: 1em;
6396
6521
  border: 2px solid transparent;
6397
6522
  border-top-color: var(--primary);
6398
- border-right-color: var(--primary);
6523
+ border-inline-end-color: var(--primary);
6399
6524
  border-radius: 50%;
6400
6525
  animation: spin 0.6s linear infinite;
6401
6526
  display: inline-block;
@@ -6405,42 +6530,42 @@ input[type='number'] {
6405
6530
 
6406
6531
  .dndev-spinner[data-variant='default'] {
6407
6532
  border-top-color: var(--foreground);
6408
- border-right-color: var(--foreground);
6533
+ border-inline-end-color: var(--foreground);
6409
6534
  }
6410
6535
 
6411
6536
  .dndev-spinner[data-variant='muted'] {
6412
6537
  border-top-color: var(--muted-foreground);
6413
- border-right-color: var(--muted-foreground);
6538
+ border-inline-end-color: var(--muted-foreground);
6414
6539
  }
6415
6540
 
6416
6541
  .dndev-spinner[data-variant='primary'] {
6417
6542
  border-top-color: var(--primary);
6418
- border-right-color: var(--primary);
6543
+ border-inline-end-color: var(--primary);
6419
6544
  }
6420
6545
 
6421
6546
  .dndev-spinner[data-variant='secondary'] {
6422
6547
  border-top-color: var(--secondary);
6423
- border-right-color: var(--secondary);
6548
+ border-inline-end-color: var(--secondary);
6424
6549
  }
6425
6550
 
6426
6551
  .dndev-spinner[data-variant='accent'] {
6427
6552
  border-top-color: var(--accent);
6428
- border-right-color: var(--accent);
6553
+ border-inline-end-color: var(--accent);
6429
6554
  }
6430
6555
 
6431
6556
  .dndev-spinner[data-variant='success'] {
6432
6557
  border-top-color: var(--success);
6433
- border-right-color: var(--success);
6558
+ border-inline-end-color: var(--success);
6434
6559
  }
6435
6560
 
6436
6561
  .dndev-spinner[data-variant='warning'] {
6437
6562
  border-top-color: var(--warning);
6438
- border-right-color: var(--warning);
6563
+ border-inline-end-color: var(--warning);
6439
6564
  }
6440
6565
 
6441
6566
  .dndev-spinner[data-variant='destructive'] {
6442
6567
  border-top-color: var(--destructive);
6443
- border-right-color: var(--destructive);
6568
+ border-inline-end-color: var(--destructive);
6444
6569
  }
6445
6570
 
6446
6571
  /* Overlay variant - full-page loading */
@@ -6724,6 +6849,8 @@ input[type='number'] {
6724
6849
  display: flex;
6725
6850
  align-items: center;
6726
6851
  justify-content: space-between;
6852
+ gap: var(--gap-md);
6853
+ margin-top: var(--gap-md);
6727
6854
  }
6728
6855
 
6729
6856
  .dndev-stepper-info {
@@ -7163,19 +7290,20 @@ input[type='number'] {
7163
7290
  word-break: break-word;
7164
7291
  border: var(--border-hairline) solid var(--line-2); /* Show clickable area */
7165
7292
 
7166
- /* Fallback (no variant): inactive = primary, active = foreground/background */
7293
+ /* Fallback (no variant): inactive = primary, active = foreground/card */
7167
7294
  background-color: var(--primary);
7168
7295
  color: var(--primary-foreground);
7169
7296
  }
7170
7297
 
7171
7298
  .dndev-interactive[data-role='tab-trigger'][data-state='active'] {
7172
- background-color: var(--background);
7299
+ /* --card not --background: active tab surface must be opaque (--background can be transparent in some themes) */
7300
+ background-color: var(--card);
7173
7301
  color: var(--foreground);
7174
7302
  box-shadow: var(--shadow-sm);
7175
7303
  border-color: var(--primary);
7176
7304
  }
7177
7305
 
7178
- /* Default/Primary variant: inactive = primary, active = foreground/background */
7306
+ /* Default/Primary variant: inactive = primary, active = foreground/card */
7179
7307
 
7180
7308
  .dndev-interactive[data-role='tab-trigger'][data-variant='default'],.dndev-interactive[data-role='tab-trigger'][data-variant='primary'] {
7181
7309
  background-color: var(--primary);
@@ -7183,13 +7311,14 @@ input[type='number'] {
7183
7311
  }
7184
7312
 
7185
7313
  [data-state='active']:is(.dndev-interactive[data-role='tab-trigger'][data-variant='default'],.dndev-interactive[data-role='tab-trigger'][data-variant='primary']) {
7186
- background-color: var(--background);
7314
+ /* --card not --background: active tab surface must be opaque */
7315
+ background-color: var(--card);
7187
7316
  color: var(--foreground);
7188
7317
  box-shadow: var(--shadow-sm);
7189
7318
  border-color: var(--primary);
7190
7319
  }
7191
7320
 
7192
- /* Secondary variant: inactive = secondary, active = foreground/background */
7321
+ /* Secondary variant: inactive = secondary, active = foreground/card */
7193
7322
 
7194
7323
  .dndev-interactive[data-role='tab-trigger'][data-variant='secondary'] {
7195
7324
  background-color: var(--secondary);
@@ -7197,13 +7326,14 @@ input[type='number'] {
7197
7326
  }
7198
7327
 
7199
7328
  .dndev-interactive[data-role='tab-trigger'][data-variant='secondary'][data-state='active'] {
7200
- background-color: var(--background);
7329
+ /* --card not --background: active tab surface must be opaque */
7330
+ background-color: var(--card);
7201
7331
  color: var(--foreground);
7202
7332
  box-shadow: var(--shadow-sm);
7203
7333
  border-color: var(--secondary);
7204
7334
  }
7205
7335
 
7206
- /* Accent variant: inactive = accent, active = foreground/background */
7336
+ /* Accent variant: inactive = accent, active = foreground/card */
7207
7337
 
7208
7338
  .dndev-interactive[data-role='tab-trigger'][data-variant='accent'] {
7209
7339
  background-color: var(--accent);
@@ -7211,7 +7341,8 @@ input[type='number'] {
7211
7341
  }
7212
7342
 
7213
7343
  .dndev-interactive[data-role='tab-trigger'][data-variant='accent'][data-state='active'] {
7214
- background-color: var(--background);
7344
+ /* --card not --background: active tab surface must be opaque */
7345
+ background-color: var(--card);
7215
7346
  color: var(--foreground);
7216
7347
  box-shadow: var(--shadow-sm);
7217
7348
  border-color: var(--accent);
@@ -7231,7 +7362,7 @@ input[type='number'] {
7231
7362
  border-color: var(--primary);
7232
7363
  }
7233
7364
 
7234
- /* Warning variant: inactive = warning, active = foreground/background */
7365
+ /* Warning variant: inactive = warning, active = foreground/card */
7235
7366
 
7236
7367
  .dndev-interactive[data-role='tab-trigger'][data-variant='warning'] {
7237
7368
  background-color: var(--warning);
@@ -7239,13 +7370,14 @@ input[type='number'] {
7239
7370
  }
7240
7371
 
7241
7372
  .dndev-interactive[data-role='tab-trigger'][data-variant='warning'][data-state='active'] {
7242
- background-color: var(--background);
7373
+ /* --card not --background: active tab surface must be opaque */
7374
+ background-color: var(--card);
7243
7375
  color: var(--foreground);
7244
7376
  box-shadow: var(--shadow-sm);
7245
7377
  border-color: var(--warning);
7246
7378
  }
7247
7379
 
7248
- /* Success variant: inactive = success, active = foreground/background */
7380
+ /* Success variant: inactive = success, active = foreground/card */
7249
7381
 
7250
7382
  .dndev-interactive[data-role='tab-trigger'][data-variant='success'] {
7251
7383
  background-color: var(--success);
@@ -7253,13 +7385,14 @@ input[type='number'] {
7253
7385
  }
7254
7386
 
7255
7387
  .dndev-interactive[data-role='tab-trigger'][data-variant='success'][data-state='active'] {
7256
- background-color: var(--background);
7388
+ /* --card not --background: active tab surface must be opaque */
7389
+ background-color: var(--card);
7257
7390
  color: var(--foreground);
7258
7391
  box-shadow: var(--shadow-sm);
7259
7392
  border-color: var(--success);
7260
7393
  }
7261
7394
 
7262
- /* Destructive variant: inactive = destructive, active = foreground/background */
7395
+ /* Destructive variant: inactive = destructive, active = foreground/card */
7263
7396
 
7264
7397
  .dndev-interactive[data-role='tab-trigger'][data-variant='destructive'] {
7265
7398
  background-color: var(--destructive);
@@ -7267,7 +7400,8 @@ input[type='number'] {
7267
7400
  }
7268
7401
 
7269
7402
  .dndev-interactive[data-role='tab-trigger'][data-variant='destructive'][data-state='active'] {
7270
- background-color: var(--background);
7403
+ /* --card not --background: active tab surface must be opaque */
7404
+ background-color: var(--card);
7271
7405
  color: var(--foreground);
7272
7406
  box-shadow: var(--shadow-sm);
7273
7407
  border-color: var(--destructive);
@@ -7314,7 +7448,7 @@ input[type='number'] {
7314
7448
  align-items: center;
7315
7449
  justify-content: center;
7316
7450
  padding: 0;
7317
- margin-left: 2px;
7451
+ margin-inline-start: 2px;
7318
7452
  background: transparent;
7319
7453
  border: none;
7320
7454
  cursor: pointer;
@@ -7477,7 +7611,11 @@ input[type='number'] {
7477
7611
  border-radius: var(--radius-interactive);
7478
7612
  }
7479
7613
 
7480
- /* Level overrides */
7614
+ /* Level overrides — headline font for all heading levels */
7615
+
7616
+ .dndev-text-base[data-level^='h'] {
7617
+ font-family: var(--font-headline);
7618
+ }
7481
7619
 
7482
7620
  .dndev-text-base[data-level='h1'] {
7483
7621
  font-size: var(--font-size-3xl);
@@ -7827,7 +7965,8 @@ input[type='number'] {
7827
7965
  z-index: var(--z-tooltip);
7828
7966
  /* Inverted colors for high contrast - industry standard (Vercel, GitHub, Stripe) */
7829
7967
  background: var(--foreground);
7830
- color: var(--background);
7968
+ /* --card not --background: inverted text must be opaque (--background can be transparent in some themes) */
7969
+ color: var(--card);
7831
7970
  box-shadow: var(--shadow-lg); /* Stronger shadow for visibility */
7832
7971
  padding: 0.375rem 0.5rem; /* 6px 8px - industry standard */
7833
7972
  font-size: var(--font-size-xs); /* 12px */
@@ -8467,6 +8606,12 @@ input[type='number'] {
8467
8606
 
8468
8607
  /* Tone backgrounds - apply directly to section element (like CallToAction) */
8469
8608
 
8609
+ /* Ghost (default) - transparent, allows background images to show through */
8610
+
8611
+ .dndev-section-full-width[data-tone='ghost'],.dndev-section-full-width:not([data-tone]) {
8612
+ background: transparent;
8613
+ }
8614
+
8470
8615
  .dndev-section-full-width[data-tone='base'] {
8471
8616
  background: var(--background);
8472
8617
  }
@@ -8475,16 +8620,37 @@ input[type='number'] {
8475
8620
  background: var(--muted);
8476
8621
  }
8477
8622
 
8478
- .dndev-section-full-width[data-tone='elevated'] {
8623
+ .dndev-section-full-width[data-tone='contrast'] {
8479
8624
  background: var(--background);
8625
+ color: var(--foreground);
8480
8626
  }
8481
8627
 
8482
- .dndev-section-full-width[data-tone='contrast'] {
8628
+ .dndev-section-full-width[data-tone='accent'] {
8629
+ background: color-mix(in oklab, var(--accent) 5%, transparent);
8630
+ }
8631
+
8632
+ /* HeroSection tone backgrounds - same system as Section/CallToAction */
8633
+
8634
+ /* Ghost (default) - transparent, allows background images to show through */
8635
+
8636
+ .dndev-hero-section[data-tone='ghost'],.dndev-hero-section:not([data-tone]) {
8637
+ background: transparent;
8638
+ }
8639
+
8640
+ .dndev-hero-section[data-tone='base'] {
8641
+ background: var(--background);
8642
+ }
8643
+
8644
+ .dndev-hero-section[data-tone='muted'] {
8645
+ background: var(--muted);
8646
+ }
8647
+
8648
+ .dndev-hero-section[data-tone='contrast'] {
8483
8649
  background: var(--background);
8484
8650
  color: var(--foreground);
8485
8651
  }
8486
8652
 
8487
- .dndev-section-full-width[data-tone='accent'] {
8653
+ .dndev-hero-section[data-tone='accent'] {
8488
8654
  background: color-mix(in oklab, var(--accent) 5%, transparent);
8489
8655
  }
8490
8656
 
@@ -8697,10 +8863,7 @@ h4[data-variant='code'] {
8697
8863
  }
8698
8864
 
8699
8865
  .dndev-inset-0 {
8700
- top: 0;
8701
- right: 0;
8702
- bottom: 0;
8703
- left: 0;
8866
+ inset: 0;
8704
8867
  }
8705
8868
 
8706
8869
  .dndev-inset-y-0 {
@@ -8708,8 +8871,8 @@ h4[data-variant='code'] {
8708
8871
  bottom: 0;
8709
8872
  }
8710
8873
 
8711
- .dndev-left-0 {
8712
- left: 0;
8874
+ .dndev-inset-inline-start-0 {
8875
+ inset-inline-start: 0;
8713
8876
  }
8714
8877
 
8715
8878
  .dndev-min-h-0 {
@@ -9326,9 +9489,12 @@ main[role='main'][data-routing-animation='none'] {
9326
9489
  /* Desktop: opt-in via data-footer-mode="scroll" */
9327
9490
 
9328
9491
  .dndev-layout[data-footer-mode='scroll'] {
9329
- overflow-y: auto;
9492
+ height: auto;
9493
+ min-height: 100dvh;
9494
+ max-height: none;
9495
+ overflow-y: visible;
9330
9496
  overflow-x: hidden;
9331
- grid-template-rows: var(--header-height) 1fr auto;
9497
+ grid-template-rows: var(--header-height) minmax(calc(100dvh - var(--header-height)), auto) auto;
9332
9498
  }
9333
9499
 
9334
9500
  .dndev-layout[data-footer-mode='scroll'] header[role='banner'] {
@@ -9346,11 +9512,13 @@ main[role='main'][data-routing-animation='none'] {
9346
9512
  .dndev-layout[data-footer-mode='scroll'] main[role='main'] {
9347
9513
  overflow-y: visible;
9348
9514
  overflow-x: hidden;
9515
+ contain: style;
9349
9516
  }
9350
9517
 
9351
9518
  .dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo'] {
9352
9519
  grid-column: 2 / -1;
9353
9520
  height: auto;
9521
+ margin-top: var(--gap-lg);
9354
9522
  }
9355
9523
 
9356
9524
  :is(.dndev-layout[data-footer-mode='scroll'] footer[role='contentinfo']) > * {
@@ -9362,9 +9530,12 @@ main[role='main'][data-routing-animation='none'] {
9362
9530
 
9363
9531
  @media (width <=1023px) {
9364
9532
  .dndev-layout {
9365
- overflow-y: auto;
9533
+ height: auto;
9534
+ min-height: 100dvh;
9535
+ max-height: none;
9536
+ overflow-y: visible;
9366
9537
  overflow-x: hidden;
9367
- grid-template-rows: var(--header-height) 1fr auto;
9538
+ grid-template-rows: var(--header-height) minmax(calc(100dvh - var(--header-height)), auto) auto;
9368
9539
  }
9369
9540
 
9370
9541
  .dndev-layout header[role='banner'] {
@@ -9375,10 +9546,12 @@ main[role='main'][data-routing-animation='none'] {
9375
9546
  .dndev-layout main[role='main'] {
9376
9547
  overflow-y: visible;
9377
9548
  overflow-x: hidden;
9549
+ contain: style;
9378
9550
  }
9379
9551
 
9380
9552
  .dndev-layout footer[role='contentinfo'] {
9381
9553
  height: auto;
9554
+ margin-top: var(--gap-lg);
9382
9555
  }
9383
9556
 
9384
9557
  :is(.dndev-layout footer[role='contentinfo']) > * {
@@ -9412,6 +9585,7 @@ header[role='banner'] {
9412
9585
  position: relative;
9413
9586
  z-index: var(--z-header);
9414
9587
  contain: layout style;
9588
+ overflow: visible; /* Allow absolutely positioned children's shadows to extend beyond bounds */
9415
9589
 
9416
9590
  /* Container queries support for responsive components */
9417
9591
  container-type: inline-size;
@@ -9425,7 +9599,6 @@ header[role='banner'] {
9425
9599
  padding-inline-start: var(--content-padding);
9426
9600
  padding-inline-end: var(--content-padding);
9427
9601
 
9428
- /* Theme-aware styling - 100% controlled by theme system */
9429
9602
  background: var(--background);
9430
9603
  border-bottom: var(--border-hairline) solid var(--border);
9431
9604
 
@@ -9447,7 +9620,11 @@ header[role='banner'] {
9447
9620
  height: 100%;
9448
9621
  max-height: 100%;
9449
9622
  gap: var(--gap-sm);
9450
- overflow: hidden;
9623
+ overflow: visible; /* Allow shadows to show */
9624
+ /* Theme-controlled padding for shadows that extend beyond bounds (e.g., brutalist hard-offset shadows) */
9625
+ /* Shadows extend rightward, so only end padding needed */
9626
+ /* Defaults to 0 for themes with diffused shadows that don't extend beyond bounds */
9627
+ padding-inline-end: var(--header-shadow-padding, 0);
9451
9628
  }
9452
9629
 
9453
9630
  .header-end {
@@ -9459,7 +9636,11 @@ header[role='banner'] {
9459
9636
  max-height: 100%;
9460
9637
  margin-inline-start: auto;
9461
9638
  gap: var(--gap-sm);
9462
- overflow: hidden;
9639
+ overflow: visible; /* Allow shadows to show */
9640
+ /* Theme-controlled padding for shadows that extend beyond bounds (e.g., brutalist hard-offset shadows) */
9641
+ /* Shadows extend rightward, so only end padding needed */
9642
+ /* Defaults to 0 for themes with diffused shadows that don't extend beyond bounds */
9643
+ padding-inline-end: var(--header-shadow-padding, 0);
9463
9644
  }
9464
9645
 
9465
9646
  /* Viewport-centered center content - absolutely positioned overlay */
@@ -9472,6 +9653,10 @@ header[role='banner'] .header-center {
9472
9653
  width: -moz-fit-content;
9473
9654
  width: fit-content;
9474
9655
  z-index: 1;
9656
+ /* Theme-controlled padding for shadows that extend beyond bounds (e.g., brutalist hard-offset shadows) */
9657
+ /* Shadows extend rightward, so only end padding needed */
9658
+ /* Defaults to 0 for themes with diffused shadows that don't extend beyond bounds */
9659
+ padding-inline-end: var(--header-shadow-padding, 0);
9475
9660
  }
9476
9661
 
9477
9662
  /* ===========================
@@ -9762,7 +9947,6 @@ footer[role='contentinfo'] {
9762
9947
  min-height: var(--footer-height);
9763
9948
  z-index: var(--z-footer);
9764
9949
 
9765
- /* Theme-aware styling - 100% controlled by theme system */
9766
9950
  background: var(--background);
9767
9951
  border-top: var(--border-hairline) solid var(--border);
9768
9952
 
@@ -9825,8 +10009,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9825
10009
 
9826
10010
  .merged-bar {
9827
10011
  position: fixed;
9828
- left: 0;
9829
- right: 0;
10012
+ inset-inline: 0;
9830
10013
  display: none;
9831
10014
  /* Hidden by default - CSS shows on mobile */
9832
10015
  align-items: center;
@@ -9835,8 +10018,8 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9835
10018
  contain: layout style;
9836
10019
 
9837
10020
  /* Safe area padding for notched devices */
9838
- padding-left: max(var(--content-padding), env(safe-area-inset-left));
9839
- padding-right: max(var(--content-padding), env(safe-area-inset-right));
10021
+ padding-inline-start: max(var(--content-padding), env(safe-area-inset-left));
10022
+ padding-inline-end: max(var(--content-padding), env(safe-area-inset-right));
9840
10023
  }
9841
10024
 
9842
10025
  .merged-bar[data-position='top'] {
@@ -10181,6 +10364,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10181
10364
  .dndev-container {
10182
10365
  width: 100%;
10183
10366
  max-width: var(--content-width);
10367
+ min-width: 0; /* Allow shrinking in flex so max-width wins */
10184
10368
  flex: 1 1 auto;
10185
10369
 
10186
10370
  /* First child spacing when enabled */
@@ -10296,7 +10480,6 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10296
10480
 
10297
10481
  .dndev-container > .dndev-section-full-width,
10298
10482
  .dndev-container > .dndev-cta,
10299
- .dndev-container > .dndev-hero-section,
10300
10483
  .dndev-container > .dndev-tech-bento {
10301
10484
  /* Break out of PageContainer padding and max-width constraint */
10302
10485
  /* Account for sidebar: --sidebar-width is 0px for presets without sidebar */
@@ -10306,6 +10489,19 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
10306
10489
  /* Eat gap BEFORE section only */
10307
10490
  margin-top: calc(-1 * var(--gap-lg));
10308
10491
  margin-bottom: 0;
10492
+ /* Pass through so inner content (e.g. .dndev-section-content) can use it */
10493
+ --content-width: var(--max-content-width, 100%);
10494
+ }
10495
+
10496
+ /* HeroSection: only breakthrough when it has fullHeight (needs full viewport background) */
10497
+
10498
+ .dndev-container > .dndev-hero-section[style*='height'] {
10499
+ width: calc(100dvw - var(--sidebar-width));
10500
+ max-width: calc(100dvw - var(--sidebar-width));
10501
+ margin-inline: calc((-50dvw + var(--sidebar-width) / 2) + 50%);
10502
+ margin-top: calc(-1 * var(--gap-lg));
10503
+ margin-bottom: 0;
10504
+ --content-width: var(--max-content-width, 100%);
10309
10505
  }
10310
10506
 
10311
10507
  .footer-mobile-button:hover {