@donotdev/components 0.0.17 → 0.0.18

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 (76) hide show
  1. package/dist/advanced/Code/CodeContent.d.ts.map +1 -1
  2. package/dist/advanced/Code/CodeContent.js +22 -5
  3. package/dist/advanced/Code/CodeSkeleton.js +4 -4
  4. package/dist/advanced/ImageGallery/ImageGallery.d.ts.map +1 -1
  5. package/dist/advanced/ImageGallery/ImageGallery.js +11 -5
  6. package/dist/advanced/JsonViewer/JsonViewer.d.ts +1 -1
  7. package/dist/advanced/JsonViewer/JsonViewer.d.ts.map +1 -1
  8. package/dist/advanced/JsonViewer/JsonViewer.js +9 -3
  9. package/dist/atomic/ActionButton/index.js +2 -2
  10. package/dist/atomic/ActionButton/useAction.d.ts.map +1 -1
  11. package/dist/atomic/ActionButton/useAction.js +18 -5
  12. package/dist/atomic/Alert/index.d.ts.map +1 -1
  13. package/dist/atomic/Button/index.d.ts +1 -1
  14. package/dist/atomic/Button/index.d.ts.map +1 -1
  15. package/dist/atomic/CallToAction/index.d.ts +2 -1
  16. package/dist/atomic/CallToAction/index.d.ts.map +1 -1
  17. package/dist/atomic/CallToAction/index.js +2 -1
  18. package/dist/atomic/Combobox/index.d.ts.map +1 -1
  19. package/dist/atomic/Combobox/index.js +3 -3
  20. package/dist/atomic/CopyToClipboard/index.d.ts.map +1 -1
  21. package/dist/atomic/CopyToClipboard/index.js +20 -4
  22. package/dist/atomic/Dialog/index.js +1 -1
  23. package/dist/atomic/DropdownMenu/index.js +1 -1
  24. package/dist/atomic/Grid/GridArea.d.ts +2 -2
  25. package/dist/atomic/Grid/GridArea.js +2 -2
  26. package/dist/atomic/Grid/index.d.ts +37 -20
  27. package/dist/atomic/Grid/index.d.ts.map +1 -1
  28. package/dist/atomic/Grid/index.js +54 -25
  29. package/dist/atomic/HeroSection/index.d.ts +3 -0
  30. package/dist/atomic/HeroSection/index.d.ts.map +1 -1
  31. package/dist/atomic/HeroSection/index.js +4 -1
  32. package/dist/atomic/HoverCard/HoverCardPrimitive.d.ts.map +1 -1
  33. package/dist/atomic/HoverCard/HoverCardPrimitive.js +1 -1
  34. package/dist/atomic/HoverCard/index.d.ts +19 -4
  35. package/dist/atomic/HoverCard/index.d.ts.map +1 -1
  36. package/dist/atomic/HoverCard/index.js +24 -5
  37. package/dist/atomic/Icons/Icon.d.ts.map +1 -1
  38. package/dist/atomic/Icons/Icon.js +11 -10
  39. package/dist/atomic/InfiniteScroll/index.d.ts +4 -2
  40. package/dist/atomic/InfiniteScroll/index.d.ts.map +1 -1
  41. package/dist/atomic/InfiniteScroll/index.js +2 -2
  42. package/dist/atomic/Pagination/index.js +1 -1
  43. package/dist/atomic/Popover/PopoverPrimitive.d.ts +1 -1
  44. package/dist/atomic/Popover/PopoverPrimitive.d.ts.map +1 -1
  45. package/dist/atomic/Popover/PopoverPrimitive.js +2 -2
  46. package/dist/atomic/Popover/index.d.ts +2 -2
  47. package/dist/atomic/Popover/index.d.ts.map +1 -1
  48. package/dist/atomic/Section/index.d.ts +9 -6
  49. package/dist/atomic/Section/index.d.ts.map +1 -1
  50. package/dist/atomic/Section/index.js +2 -1
  51. package/dist/atomic/Select/index.d.ts.map +1 -1
  52. package/dist/atomic/Select/index.js +2 -3
  53. package/dist/atomic/Stepper/index.d.ts +4 -0
  54. package/dist/atomic/Stepper/index.d.ts.map +1 -1
  55. package/dist/atomic/Stepper/index.js +8 -5
  56. package/dist/atomic/Table/index.d.ts +4 -4
  57. package/dist/atomic/Table/index.d.ts.map +1 -1
  58. package/dist/atomic/Toaster/ToastPrimitive.d.ts.map +1 -1
  59. package/dist/atomic/Toaster/ToastPrimitive.js +1 -13
  60. package/dist/atomic/index.d.ts +1 -1
  61. package/dist/atomic/index.d.ts.map +1 -1
  62. package/dist/hooks/useToast.d.ts.map +1 -1
  63. package/dist/hooks/useToast.js +18 -3
  64. package/dist/hooks/useViewportVisibility.d.ts.map +1 -1
  65. package/dist/hooks/useViewportVisibility.js +10 -12
  66. package/dist/index.d.ts +0 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +6 -6
  69. package/dist/styles/index.css +234 -75
  70. package/dist/types.d.ts +1 -1
  71. package/dist/utils/constants.d.ts +13 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +12 -0
  74. package/dist/utils/intersectionObserver.d.ts.map +1 -1
  75. package/dist/utils/intersectionObserver.js +1 -11
  76. package/package.json +3 -3
@@ -113,6 +113,15 @@
113
113
  --popover: var(--card);
114
114
  --popover-foreground: var(--card-foreground);
115
115
 
116
+ /*
117
+ * Root card snapshot — computed once on :root from --card/--card-foreground,
118
+ * then inherited unchanged. Variant blocks (e.g. primary) override --card but
119
+ * never touch these, so data-variant='default' can reset --card back to the
120
+ * root value even when nested inside another variant.
121
+ */
122
+ --card-base: var(--card);
123
+ --card-foreground-base: var(--card-foreground);
124
+
116
125
  /* ===========================
117
126
  BORDER RADIUS - 3 VALUES ONLY
118
127
  =========================== */
@@ -208,6 +217,16 @@
208
217
  -6px 12px 24px -6px var(--shadow-color),
209
218
  -3px 6px 12px -3px var(--shadow-color-light);
210
219
 
220
+ /* Root shadow snapshots — same principle as --card-base (see above) */
221
+ --shadow-md-base: var(--shadow-md);
222
+ --shadow-xl-base: var(--shadow-xl);
223
+
224
+ /* Per-variant shadows — essences override these with different colors/shapes */
225
+ --shadow-primary: var(--shadow-md);
226
+ --shadow-primary-xl: var(--shadow-xl);
227
+ --shadow-secondary: var(--shadow-md);
228
+ --shadow-secondary-xl: var(--shadow-xl);
229
+
211
230
  /* Interactive shadows */
212
231
  --shadow-interactive: 0 0 0 3px
213
232
  color-mix(in oklab, var(--ring) 20%, transparent);
@@ -511,7 +530,6 @@ body {
511
530
  /* Reset and base styles */
512
531
 
513
532
  :root {
514
- font-family: var(--font-sans);
515
533
  -webkit-font-smoothing: antialiased;
516
534
  -moz-osx-font-smoothing: grayscale;
517
535
  text-rendering: optimizeLegibility;
@@ -525,9 +543,10 @@ body {
525
543
  box-sizing: border-box;
526
544
  }
527
545
 
528
- /* Set core body defaults */
546
+ /* Set core body defaults — font-family here so theme tokens on :root cascade cleanly */
529
547
 
530
548
  body {
549
+ font-family: var(--font-family, var(--font-sans));
531
550
  min-height: 100dvh;
532
551
  line-height: var(--line-height);
533
552
  text-rendering: optimizeSpeed;
@@ -602,17 +621,21 @@ h6 {
602
621
  color: var(--foreground);
603
622
  background: transparent;
604
623
  text-wrap: balance; /* Equalize line lengths, prevent orphans */
624
+ text-transform: var(--text-transform-heading, none);
625
+ letter-spacing: var(--letter-spacing-heading, normal);
605
626
  }
606
627
 
607
- h1 {
628
+ :is(h1, h2, h3, h4, h5, h6) {
608
629
  font-family: var(--font-headline);
630
+ }
631
+
632
+ h1 {
609
633
  font-size: var(--font-size-3xl);
610
634
  font-weight: var(--font-weight-bold);
611
635
  letter-spacing: -0.02em;
612
636
  }
613
637
 
614
638
  h2 {
615
- font-family: var(--font-headline);
616
639
  font-size: var(--font-size-2xl);
617
640
  font-weight: var(--font-weight-bold);
618
641
  letter-spacing: -0.01em;
@@ -1043,10 +1066,20 @@ em {
1043
1066
  * - accent: Highlighted/active state (--accent colors, sets context for children)
1044
1067
  * - destructive: Error/danger state (--destructive colors)
1045
1068
  *
1046
- * Variants only override --card and --card-foreground.
1069
+ * Variants override --card and --card-foreground.
1070
+ * Primary/secondary also override --shadow-md/--shadow-xl for per-variant shadows.
1071
+ * Default resets --card from --card-base (root snapshot) so nested default cards
1072
+ * inside other variants get the root card color, not the parent's.
1047
1073
  * Surface glow gradient is computed from --theme-is-dark flag and not affected by variants.
1048
1074
  */
1049
1075
 
1076
+ .dndev-surface[data-variant='default'] {
1077
+ --card: var(--card-base);
1078
+ --card-foreground: var(--card-foreground-base);
1079
+ --shadow-md: var(--shadow-md-base);
1080
+ --shadow-xl: var(--shadow-xl-base);
1081
+ }
1082
+
1050
1083
  .dndev-surface[data-variant='muted'] {
1051
1084
  --card: var(--muted);
1052
1085
  --card-foreground: var(--muted-foreground);
@@ -1056,12 +1089,16 @@ em {
1056
1089
  .dndev-surface[data-variant='primary'] {
1057
1090
  --card: var(--primary);
1058
1091
  --card-foreground: var(--primary-foreground);
1092
+ --shadow-md: var(--shadow-primary);
1093
+ --shadow-xl: var(--shadow-primary-xl);
1059
1094
  border-color: var(--primary);
1060
1095
  }
1061
1096
 
1062
1097
  .dndev-surface[data-variant='secondary'] {
1063
1098
  --card: var(--secondary);
1064
1099
  --card-foreground: var(--secondary-foreground);
1100
+ --shadow-md: var(--shadow-secondary);
1101
+ --shadow-xl: var(--shadow-secondary-xl);
1065
1102
  border-color: var(--secondary);
1066
1103
  }
1067
1104
 
@@ -1343,6 +1380,7 @@ em {
1343
1380
  border-radius: var(--radius-interactive);
1344
1381
  font-size: var(--font-size-base);
1345
1382
  font-weight: var(--font-weight-medium);
1383
+ text-transform: var(--text-transform-button, none);
1346
1384
  transition: var(--transition-fast);
1347
1385
  cursor: pointer;
1348
1386
  border: var(--border-hairline) solid transparent;
@@ -1633,6 +1671,7 @@ em {
1633
1671
  overflow: hidden;
1634
1672
  text-overflow: ellipsis;
1635
1673
  white-space: nowrap;
1674
+ text-transform: var(--text-transform-label, none);
1636
1675
  }
1637
1676
 
1638
1677
  /* Compact mode - always hide label */
@@ -1698,7 +1737,8 @@ em {
1698
1737
 
1699
1738
  .dndev-control[data-state='checked'],.dndev-control[data-state='on'],.dndev-control[data-pressed='true'] {
1700
1739
  background-color: var(--control-border);
1701
- color: var(--background);
1740
+ /* --card not --background: inverted text must be opaque (--background can be transparent in some themes) */
1741
+ color: var(--card);
1702
1742
  }
1703
1743
 
1704
1744
  /* CONTROL GROUP - Shared pattern for grouped controls (RadioGroup, Checkbox groups) */
@@ -2004,7 +2044,7 @@ em {
2004
2044
  height: var(--icon-md);
2005
2045
  border: 2px solid currentColor;
2006
2046
  border-radius: var(--radius-full);
2007
- border-right-color: transparent;
2047
+ border-inline-end-color: transparent;
2008
2048
  animation: spin 1s linear infinite;
2009
2049
  }
2010
2050
 
@@ -2344,7 +2384,6 @@ em {
2344
2384
  flex-shrink: 0;
2345
2385
  overflow: hidden;
2346
2386
  border-radius: var(--radius-full);
2347
- border: 1px solid var(--border);
2348
2387
  }
2349
2388
 
2350
2389
  .dndev-avatar-image {
@@ -2801,8 +2840,7 @@ em {
2801
2840
  .dndev-calendar-nav {
2802
2841
  position: absolute;
2803
2842
  top: 0;
2804
- left: 0;
2805
- right: 0;
2843
+ inset-inline: 0;
2806
2844
  height: var(--touch-target);
2807
2845
  pointer-events: none;
2808
2846
  z-index: 1;
@@ -2832,13 +2870,13 @@ em {
2832
2870
  }
2833
2871
 
2834
2872
  .dndev-calendar-nav-previous {
2835
- left: 0;
2873
+ inset-inline-start: 0;
2836
2874
  border-start-start-radius: 0;
2837
2875
  border-end-start-radius: 0;
2838
2876
  }
2839
2877
 
2840
2878
  .dndev-calendar-nav-next {
2841
- right: 0;
2879
+ inset-inline-end: 0;
2842
2880
  border-start-end-radius: 0;
2843
2881
  border-end-end-radius: 0;
2844
2882
  }
@@ -3084,13 +3122,10 @@ em {
3084
3122
  background: var(--muted);
3085
3123
  }
3086
3124
 
3087
- .dndev-cta[data-tone='elevated'] {
3088
- background: var(--background);
3089
- }
3090
-
3091
3125
  .dndev-cta[data-tone='contrast'] {
3092
3126
  background: var(--foreground);
3093
- color: var(--background);
3127
+ /* --card not --background: inverted text must be opaque (--background can be transparent in some themes) */
3128
+ color: var(--card);
3094
3129
  }
3095
3130
 
3096
3131
  .dndev-cta[data-tone='accent'] {
@@ -3145,7 +3180,8 @@ em {
3145
3180
 
3146
3181
  .dndev-cta-actions .dndev-interactive[data-variant='primary'] {
3147
3182
  background: var(--foreground);
3148
- color: var(--background);
3183
+ /* --card not --background: inverted text must be opaque */
3184
+ color: var(--card);
3149
3185
  border-color: var(--foreground);
3150
3186
  }
3151
3187
 
@@ -3163,7 +3199,8 @@ em {
3163
3199
 
3164
3200
  :is(.dndev-cta-actions .dndev-interactive[data-variant='outline']):hover {
3165
3201
  background: var(--foreground);
3166
- color: var(--background);
3202
+ /* --card not --background: inverted text must be opaque */
3203
+ color: var(--card);
3167
3204
  border-color: var(--foreground);
3168
3205
  }
3169
3206
 
@@ -3378,7 +3415,7 @@ em {
3378
3415
  justify-content: space-between;
3379
3416
  align-items: center;
3380
3417
  width: 100%;
3381
- text-align: left;
3418
+ text-align: start;
3382
3419
  }
3383
3420
 
3384
3421
  .dndev-combobox-trigger button {
@@ -3720,8 +3757,9 @@ em {
3720
3757
  }
3721
3758
 
3722
3759
  .dndev-code-line-number {
3723
- line-height: inherit;
3724
- /* Inherit from parent */
3760
+ line-height: 1.5;
3761
+ min-height: 1.5em;
3762
+ font-size: inherit;
3725
3763
  }
3726
3764
 
3727
3765
  .dndev-code-code {
@@ -3741,7 +3779,21 @@ em {
3741
3779
  .dndev-code-code code {
3742
3780
  line-height: inherit;
3743
3781
  font-size: inherit;
3744
- /* Match parent font-size */
3782
+ }
3783
+
3784
+ /* Shiki wraps each line in <span class="line"> — force consistent sizing */
3785
+
3786
+ .dndev-code-code .line {
3787
+ display: block;
3788
+ line-height: 1.5;
3789
+ font-size: inherit;
3790
+ min-height: 1.5em;
3791
+ }
3792
+
3793
+ /* Empty Shiki lines still need height to stay in sync with line numbers */
3794
+
3795
+ .dndev-code-code .line:empty::after {
3796
+ content: '\00a0';
3745
3797
  }
3746
3798
 
3747
3799
  /* packages/components/src/atomic/Command/Command.css */
@@ -3905,7 +3957,7 @@ em {
3905
3957
  order: 3;
3906
3958
  font-size: var(--font-size-xs);
3907
3959
  color: var(--muted-foreground);
3908
- padding-left: calc(var(--icon-md) + var(--gap-sm));
3960
+ padding-inline-start: calc(var(--icon-md) + var(--gap-sm));
3909
3961
  }
3910
3962
 
3911
3963
  .dndev-command-favorite-button {
@@ -4191,6 +4243,54 @@ em {
4191
4243
  }
4192
4244
  }
4193
4245
 
4246
+ /* Responsive templateColumns via custom properties */
4247
+
4248
+ .dndev-grid-component[data-responsive-tpl='true'] {
4249
+ grid-template-columns: var(--grid-tpl-mobile);
4250
+ }
4251
+
4252
+ @media (min-width: 768px) {
4253
+ .dndev-grid-component[data-responsive-tpl='true'] {
4254
+ grid-template-columns: var(--grid-tpl-tablet);
4255
+ }
4256
+ }
4257
+
4258
+ @media (min-width: 1024px) {
4259
+ .dndev-grid-component[data-responsive-tpl='true'] {
4260
+ grid-template-columns: var(--grid-tpl-laptop);
4261
+ }
4262
+ }
4263
+
4264
+ @media (min-width: 1440px) {
4265
+ .dndev-grid-component[data-responsive-tpl='true'] {
4266
+ grid-template-columns: var(--grid-tpl-desktop);
4267
+ }
4268
+ }
4269
+
4270
+ /* Responsive grid areas via custom properties */
4271
+
4272
+ .dndev-grid-component[data-responsive-areas='true'] {
4273
+ grid-template-areas: var(--grid-areas-mobile);
4274
+ }
4275
+
4276
+ @media (min-width: 768px) {
4277
+ .dndev-grid-component[data-responsive-areas='true'] {
4278
+ grid-template-areas: var(--grid-areas-tablet);
4279
+ }
4280
+ }
4281
+
4282
+ @media (min-width: 1024px) {
4283
+ .dndev-grid-component[data-responsive-areas='true'] {
4284
+ grid-template-areas: var(--grid-areas-laptop);
4285
+ }
4286
+ }
4287
+
4288
+ @media (min-width: 1440px) {
4289
+ .dndev-grid-component[data-responsive-areas='true'] {
4290
+ grid-template-areas: var(--grid-areas-desktop);
4291
+ }
4292
+ }
4293
+
4194
4294
  /* Spacing from CSS variables */
4195
4295
 
4196
4296
  .dndev-grid-component[data-gap='none'] {
@@ -4504,7 +4604,8 @@ em {
4504
4604
  height: 44px;
4505
4605
  border: none;
4506
4606
  border-radius: var(--radius-full);
4507
- background-color: var(--background);
4607
+ /* --card not --background: surface must be opaque */
4608
+ background-color: var(--card);
4508
4609
  color: var(--foreground);
4509
4610
  cursor: pointer;
4510
4611
  opacity: 0;
@@ -5071,7 +5172,7 @@ input[type='number'] {
5071
5172
  }
5072
5173
 
5073
5174
  .dndev-nav-menu-content {
5074
- left: 0;
5175
+ inset-inline-start: 0;
5075
5176
  top: 0;
5076
5177
  width: 100%;
5077
5178
  }
@@ -5086,7 +5187,7 @@ input[type='number'] {
5086
5187
 
5087
5188
  .dndev-nav-menu-viewport-wrapper {
5088
5189
  position: absolute;
5089
- left: 0;
5190
+ inset-inline-start: 0;
5090
5191
  top: 100%;
5091
5192
  display: flex;
5092
5193
  justify-content: center;
@@ -5126,7 +5227,7 @@ input[type='number'] {
5126
5227
  height: var(--gap-sm);
5127
5228
  width: var(--gap-sm);
5128
5229
  transform: rotate(45deg);
5129
- border-top-left-radius: 2px;
5230
+ border-start-start-radius: 2px;
5130
5231
  background-color: var(--border);
5131
5232
  box-shadow: var(--shadow-md);
5132
5233
  }
@@ -5297,19 +5398,34 @@ input[type='number'] {
5297
5398
  }
5298
5399
 
5299
5400
  .dndev-pagination-size-label {
5300
- margin-right: var(--gap-sm);
5401
+ margin-inline-end: var(--gap-sm);
5301
5402
  }
5302
5403
 
5303
5404
  .dndev-pagination-nav {
5304
5405
  justify-content: flex-end;
5305
5406
  width: auto;
5306
- margin-left: auto;
5307
- /* Push to right */
5407
+ margin-inline-start: auto;
5408
+ /* Push to end */
5308
5409
  }
5309
5410
  }
5310
5411
 
5311
5412
  /* packages/components/src/atomic/Popover/Popover.css */
5312
5413
 
5414
+ /* Popover content width constraints and wrapping */
5415
+
5416
+ /* Targets Radix UI PopoverContent element */
5417
+
5418
+ [data-radix-popover-content],
5419
+ .dndev-floating[data-radix-popover-content] {
5420
+ max-width: min(90vw, 400px);
5421
+ width: -moz-max-content;
5422
+ width: max-content;
5423
+ min-width: 0;
5424
+ word-wrap: break-word;
5425
+ overflow-wrap: break-word;
5426
+ white-space: normal;
5427
+ }
5428
+
5313
5429
  /* packages/components/src/atomic/Progress/Progress.css */
5314
5430
 
5315
5431
  .dndev-progress {
@@ -5654,9 +5770,10 @@ input[type='number'] {
5654
5770
  /* Content wrapper: constrained + centered + padded */
5655
5771
 
5656
5772
  .dndev-section-content {
5657
- /* Respects PageContainer's --content-width */
5773
+ /* Respects PageContainer's --content-width (passed through breakthrough root) */
5658
5774
  max-width: var(--content-width);
5659
5775
  margin-inline: auto;
5776
+ min-width: 0; /* Allow shrinking so max-width wins when content would force wider */
5660
5777
  /* Padding with section background - responsive to match PageContainer */
5661
5778
  padding-inline: var(--gap-md);
5662
5779
  padding-top: var(--gap-lg);
@@ -5904,6 +6021,9 @@ input[type='number'] {
5904
6021
 
5905
6022
  /* Sheet positioning by side - SPATIAL METAPHOR */
5906
6023
 
6024
+ /* Physical properties intentional: Sheet anchors to viewport edges regardless of text direction.
6025
+ Logical inset-inline would incorrectly swap sides in RTL for left/right sheet variants. */
6026
+
5907
6027
  /* RIGHT / LEFT (Desktop Panels) */
5908
6028
 
5909
6029
  .dndev-sheet-content[data-side='right'],.dndev-sheet-content[data-side='left'] {
@@ -5944,8 +6064,7 @@ input[type='number'] {
5944
6064
  max-height: 92dvh;
5945
6065
  /* Never touch top edge */
5946
6066
  width: 100%;
5947
- margin-left: auto;
5948
- margin-right: auto;
6067
+ margin-inline: auto;
5949
6068
 
5950
6069
  /* On larger screens, constrain width */
5951
6070
  }
@@ -5964,16 +6083,16 @@ input[type='number'] {
5964
6083
  top: 0;
5965
6084
  border-bottom: var(--border-hairline) solid var(--line-1);
5966
6085
  /* Rounded bottom corners only */
5967
- border-bottom-left-radius: var(--radius-lg);
5968
- border-bottom-right-radius: var(--radius-lg);
6086
+ border-end-start-radius: var(--radius-lg);
6087
+ border-end-end-radius: var(--radius-lg);
5969
6088
  }
5970
6089
 
5971
6090
  .dndev-sheet-content[data-side='bottom'] {
5972
6091
  bottom: 0;
5973
6092
  border-top: var(--border-hairline) solid var(--line-1);
5974
6093
  /* Rounded top corners only */
5975
- border-top-left-radius: var(--radius-lg);
5976
- border-top-right-radius: var(--radius-lg);
6094
+ border-start-start-radius: var(--radius-lg);
6095
+ border-start-end-radius: var(--radius-lg);
5977
6096
  }
5978
6097
 
5979
6098
  /* DRAG HANDLE PILL - Visual affordance for draggable sheets */
@@ -6292,7 +6411,8 @@ input[type='number'] {
6292
6411
  min-width: 1.25rem;
6293
6412
  min-height: 1.25rem;
6294
6413
  border-radius: var(--radius-full);
6295
- background-color: var(--background);
6414
+ /* --card not --background: surface must be opaque (--background can be transparent in some themes) */
6415
+ background-color: var(--card);
6296
6416
  border: 2px solid var(--primary);
6297
6417
  box-shadow: var(--shadow-md);
6298
6418
  transition: all var(--dur-fast) var(--ease-in-out);
@@ -6363,7 +6483,8 @@ input[type='number'] {
6363
6483
  font-size: var(--font-size-xs);
6364
6484
  font-weight: var(--font-weight-medium);
6365
6485
  color: var(--foreground);
6366
- background-color: var(--background);
6486
+ /* --card not --background: surface must be opaque */
6487
+ background-color: var(--card);
6367
6488
  padding: 0.125rem 0.375rem;
6368
6489
  border-radius: var(--radius-interactive);
6369
6490
  box-shadow: var(--shadow-sm);
@@ -6387,7 +6508,7 @@ input[type='number'] {
6387
6508
  height: 1em;
6388
6509
  border: 2px solid transparent;
6389
6510
  border-top-color: var(--primary);
6390
- border-right-color: var(--primary);
6511
+ border-inline-end-color: var(--primary);
6391
6512
  border-radius: 50%;
6392
6513
  animation: spin 0.6s linear infinite;
6393
6514
  display: inline-block;
@@ -6397,42 +6518,42 @@ input[type='number'] {
6397
6518
 
6398
6519
  .dndev-spinner[data-variant='default'] {
6399
6520
  border-top-color: var(--foreground);
6400
- border-right-color: var(--foreground);
6521
+ border-inline-end-color: var(--foreground);
6401
6522
  }
6402
6523
 
6403
6524
  .dndev-spinner[data-variant='muted'] {
6404
6525
  border-top-color: var(--muted-foreground);
6405
- border-right-color: var(--muted-foreground);
6526
+ border-inline-end-color: var(--muted-foreground);
6406
6527
  }
6407
6528
 
6408
6529
  .dndev-spinner[data-variant='primary'] {
6409
6530
  border-top-color: var(--primary);
6410
- border-right-color: var(--primary);
6531
+ border-inline-end-color: var(--primary);
6411
6532
  }
6412
6533
 
6413
6534
  .dndev-spinner[data-variant='secondary'] {
6414
6535
  border-top-color: var(--secondary);
6415
- border-right-color: var(--secondary);
6536
+ border-inline-end-color: var(--secondary);
6416
6537
  }
6417
6538
 
6418
6539
  .dndev-spinner[data-variant='accent'] {
6419
6540
  border-top-color: var(--accent);
6420
- border-right-color: var(--accent);
6541
+ border-inline-end-color: var(--accent);
6421
6542
  }
6422
6543
 
6423
6544
  .dndev-spinner[data-variant='success'] {
6424
6545
  border-top-color: var(--success);
6425
- border-right-color: var(--success);
6546
+ border-inline-end-color: var(--success);
6426
6547
  }
6427
6548
 
6428
6549
  .dndev-spinner[data-variant='warning'] {
6429
6550
  border-top-color: var(--warning);
6430
- border-right-color: var(--warning);
6551
+ border-inline-end-color: var(--warning);
6431
6552
  }
6432
6553
 
6433
6554
  .dndev-spinner[data-variant='destructive'] {
6434
6555
  border-top-color: var(--destructive);
6435
- border-right-color: var(--destructive);
6556
+ border-inline-end-color: var(--destructive);
6436
6557
  }
6437
6558
 
6438
6559
  /* Overlay variant - full-page loading */
@@ -6716,6 +6837,8 @@ input[type='number'] {
6716
6837
  display: flex;
6717
6838
  align-items: center;
6718
6839
  justify-content: space-between;
6840
+ gap: var(--gap-md);
6841
+ margin-top: var(--gap-md);
6719
6842
  }
6720
6843
 
6721
6844
  .dndev-stepper-info {
@@ -7155,19 +7278,20 @@ input[type='number'] {
7155
7278
  word-break: break-word;
7156
7279
  border: var(--border-hairline) solid var(--line-2); /* Show clickable area */
7157
7280
 
7158
- /* Fallback (no variant): inactive = primary, active = foreground/background */
7281
+ /* Fallback (no variant): inactive = primary, active = foreground/card */
7159
7282
  background-color: var(--primary);
7160
7283
  color: var(--primary-foreground);
7161
7284
  }
7162
7285
 
7163
7286
  .dndev-interactive[data-role='tab-trigger'][data-state='active'] {
7164
- background-color: var(--background);
7287
+ /* --card not --background: active tab surface must be opaque (--background can be transparent in some themes) */
7288
+ background-color: var(--card);
7165
7289
  color: var(--foreground);
7166
7290
  box-shadow: var(--shadow-sm);
7167
7291
  border-color: var(--primary);
7168
7292
  }
7169
7293
 
7170
- /* Default/Primary variant: inactive = primary, active = foreground/background */
7294
+ /* Default/Primary variant: inactive = primary, active = foreground/card */
7171
7295
 
7172
7296
  .dndev-interactive[data-role='tab-trigger'][data-variant='default'],.dndev-interactive[data-role='tab-trigger'][data-variant='primary'] {
7173
7297
  background-color: var(--primary);
@@ -7175,13 +7299,14 @@ input[type='number'] {
7175
7299
  }
7176
7300
 
7177
7301
  [data-state='active']:is(.dndev-interactive[data-role='tab-trigger'][data-variant='default'],.dndev-interactive[data-role='tab-trigger'][data-variant='primary']) {
7178
- background-color: var(--background);
7302
+ /* --card not --background: active tab surface must be opaque */
7303
+ background-color: var(--card);
7179
7304
  color: var(--foreground);
7180
7305
  box-shadow: var(--shadow-sm);
7181
7306
  border-color: var(--primary);
7182
7307
  }
7183
7308
 
7184
- /* Secondary variant: inactive = secondary, active = foreground/background */
7309
+ /* Secondary variant: inactive = secondary, active = foreground/card */
7185
7310
 
7186
7311
  .dndev-interactive[data-role='tab-trigger'][data-variant='secondary'] {
7187
7312
  background-color: var(--secondary);
@@ -7189,13 +7314,14 @@ input[type='number'] {
7189
7314
  }
7190
7315
 
7191
7316
  .dndev-interactive[data-role='tab-trigger'][data-variant='secondary'][data-state='active'] {
7192
- background-color: var(--background);
7317
+ /* --card not --background: active tab surface must be opaque */
7318
+ background-color: var(--card);
7193
7319
  color: var(--foreground);
7194
7320
  box-shadow: var(--shadow-sm);
7195
7321
  border-color: var(--secondary);
7196
7322
  }
7197
7323
 
7198
- /* Accent variant: inactive = accent, active = foreground/background */
7324
+ /* Accent variant: inactive = accent, active = foreground/card */
7199
7325
 
7200
7326
  .dndev-interactive[data-role='tab-trigger'][data-variant='accent'] {
7201
7327
  background-color: var(--accent);
@@ -7203,7 +7329,8 @@ input[type='number'] {
7203
7329
  }
7204
7330
 
7205
7331
  .dndev-interactive[data-role='tab-trigger'][data-variant='accent'][data-state='active'] {
7206
- background-color: var(--background);
7332
+ /* --card not --background: active tab surface must be opaque */
7333
+ background-color: var(--card);
7207
7334
  color: var(--foreground);
7208
7335
  box-shadow: var(--shadow-sm);
7209
7336
  border-color: var(--accent);
@@ -7223,7 +7350,7 @@ input[type='number'] {
7223
7350
  border-color: var(--primary);
7224
7351
  }
7225
7352
 
7226
- /* Warning variant: inactive = warning, active = foreground/background */
7353
+ /* Warning variant: inactive = warning, active = foreground/card */
7227
7354
 
7228
7355
  .dndev-interactive[data-role='tab-trigger'][data-variant='warning'] {
7229
7356
  background-color: var(--warning);
@@ -7231,13 +7358,14 @@ input[type='number'] {
7231
7358
  }
7232
7359
 
7233
7360
  .dndev-interactive[data-role='tab-trigger'][data-variant='warning'][data-state='active'] {
7234
- background-color: var(--background);
7361
+ /* --card not --background: active tab surface must be opaque */
7362
+ background-color: var(--card);
7235
7363
  color: var(--foreground);
7236
7364
  box-shadow: var(--shadow-sm);
7237
7365
  border-color: var(--warning);
7238
7366
  }
7239
7367
 
7240
- /* Success variant: inactive = success, active = foreground/background */
7368
+ /* Success variant: inactive = success, active = foreground/card */
7241
7369
 
7242
7370
  .dndev-interactive[data-role='tab-trigger'][data-variant='success'] {
7243
7371
  background-color: var(--success);
@@ -7245,13 +7373,14 @@ input[type='number'] {
7245
7373
  }
7246
7374
 
7247
7375
  .dndev-interactive[data-role='tab-trigger'][data-variant='success'][data-state='active'] {
7248
- background-color: var(--background);
7376
+ /* --card not --background: active tab surface must be opaque */
7377
+ background-color: var(--card);
7249
7378
  color: var(--foreground);
7250
7379
  box-shadow: var(--shadow-sm);
7251
7380
  border-color: var(--success);
7252
7381
  }
7253
7382
 
7254
- /* Destructive variant: inactive = destructive, active = foreground/background */
7383
+ /* Destructive variant: inactive = destructive, active = foreground/card */
7255
7384
 
7256
7385
  .dndev-interactive[data-role='tab-trigger'][data-variant='destructive'] {
7257
7386
  background-color: var(--destructive);
@@ -7259,7 +7388,8 @@ input[type='number'] {
7259
7388
  }
7260
7389
 
7261
7390
  .dndev-interactive[data-role='tab-trigger'][data-variant='destructive'][data-state='active'] {
7262
- background-color: var(--background);
7391
+ /* --card not --background: active tab surface must be opaque */
7392
+ background-color: var(--card);
7263
7393
  color: var(--foreground);
7264
7394
  box-shadow: var(--shadow-sm);
7265
7395
  border-color: var(--destructive);
@@ -7306,7 +7436,7 @@ input[type='number'] {
7306
7436
  align-items: center;
7307
7437
  justify-content: center;
7308
7438
  padding: 0;
7309
- margin-left: 2px;
7439
+ margin-inline-start: 2px;
7310
7440
  background: transparent;
7311
7441
  border: none;
7312
7442
  cursor: pointer;
@@ -7469,7 +7599,11 @@ input[type='number'] {
7469
7599
  border-radius: var(--radius-interactive);
7470
7600
  }
7471
7601
 
7472
- /* Level overrides */
7602
+ /* Level overrides — headline font for all heading levels */
7603
+
7604
+ .dndev-text-base[data-level^='h'] {
7605
+ font-family: var(--font-headline);
7606
+ }
7473
7607
 
7474
7608
  .dndev-text-base[data-level='h1'] {
7475
7609
  font-size: var(--font-size-3xl);
@@ -7819,7 +7953,8 @@ input[type='number'] {
7819
7953
  z-index: var(--z-tooltip);
7820
7954
  /* Inverted colors for high contrast - industry standard (Vercel, GitHub, Stripe) */
7821
7955
  background: var(--foreground);
7822
- color: var(--background);
7956
+ /* --card not --background: inverted text must be opaque (--background can be transparent in some themes) */
7957
+ color: var(--card);
7823
7958
  box-shadow: var(--shadow-lg); /* Stronger shadow for visibility */
7824
7959
  padding: 0.375rem 0.5rem; /* 6px 8px - industry standard */
7825
7960
  font-size: var(--font-size-xs); /* 12px */
@@ -8459,6 +8594,12 @@ input[type='number'] {
8459
8594
 
8460
8595
  /* Tone backgrounds - apply directly to section element (like CallToAction) */
8461
8596
 
8597
+ /* Ghost (default) - transparent, allows background images to show through */
8598
+
8599
+ .dndev-section-full-width[data-tone='ghost'],.dndev-section-full-width:not([data-tone]) {
8600
+ background: transparent;
8601
+ }
8602
+
8462
8603
  .dndev-section-full-width[data-tone='base'] {
8463
8604
  background: var(--background);
8464
8605
  }
@@ -8467,16 +8608,37 @@ input[type='number'] {
8467
8608
  background: var(--muted);
8468
8609
  }
8469
8610
 
8470
- .dndev-section-full-width[data-tone='elevated'] {
8611
+ .dndev-section-full-width[data-tone='contrast'] {
8471
8612
  background: var(--background);
8613
+ color: var(--foreground);
8472
8614
  }
8473
8615
 
8474
- .dndev-section-full-width[data-tone='contrast'] {
8616
+ .dndev-section-full-width[data-tone='accent'] {
8617
+ background: color-mix(in oklab, var(--accent) 5%, transparent);
8618
+ }
8619
+
8620
+ /* HeroSection tone backgrounds - same system as Section/CallToAction */
8621
+
8622
+ /* Ghost (default) - transparent, allows background images to show through */
8623
+
8624
+ .dndev-hero-section[data-tone='ghost'],.dndev-hero-section:not([data-tone]) {
8625
+ background: transparent;
8626
+ }
8627
+
8628
+ .dndev-hero-section[data-tone='base'] {
8629
+ background: var(--background);
8630
+ }
8631
+
8632
+ .dndev-hero-section[data-tone='muted'] {
8633
+ background: var(--muted);
8634
+ }
8635
+
8636
+ .dndev-hero-section[data-tone='contrast'] {
8475
8637
  background: var(--background);
8476
8638
  color: var(--foreground);
8477
8639
  }
8478
8640
 
8479
- .dndev-section-full-width[data-tone='accent'] {
8641
+ .dndev-hero-section[data-tone='accent'] {
8480
8642
  background: color-mix(in oklab, var(--accent) 5%, transparent);
8481
8643
  }
8482
8644
 
@@ -8689,10 +8851,7 @@ h4[data-variant='code'] {
8689
8851
  }
8690
8852
 
8691
8853
  .dndev-inset-0 {
8692
- top: 0;
8693
- right: 0;
8694
- bottom: 0;
8695
- left: 0;
8854
+ inset: 0;
8696
8855
  }
8697
8856
 
8698
8857
  .dndev-inset-y-0 {
@@ -8700,8 +8859,8 @@ h4[data-variant='code'] {
8700
8859
  bottom: 0;
8701
8860
  }
8702
8861
 
8703
- .dndev-left-0 {
8704
- left: 0;
8862
+ .dndev-inset-inline-start-0 {
8863
+ inset-inline-start: 0;
8705
8864
  }
8706
8865
 
8707
8866
  .dndev-min-h-0 {