@donotdev/components 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 (53) hide show
  1. package/dist/atomic/Button/index.d.ts.map +1 -1
  2. package/dist/atomic/Button/index.js +3 -2
  3. package/dist/atomic/CallToAction/index.d.ts +7 -1
  4. package/dist/atomic/CallToAction/index.d.ts.map +1 -1
  5. package/dist/atomic/CallToAction/index.js +5 -3
  6. package/dist/atomic/Card/index.d.ts +62 -6
  7. package/dist/atomic/Card/index.d.ts.map +1 -1
  8. package/dist/atomic/Card/index.js +69 -21
  9. package/dist/atomic/Command/index.d.ts.map +1 -1
  10. package/dist/atomic/Command/index.js +3 -1
  11. package/dist/atomic/CommandDialog/index.d.ts.map +1 -1
  12. package/dist/atomic/CopyToClipboard/index.d.ts.map +1 -1
  13. package/dist/atomic/DropdownMenu/index.d.ts.map +1 -1
  14. package/dist/atomic/DualCard/index.d.ts +22 -24
  15. package/dist/atomic/DualCard/index.d.ts.map +1 -1
  16. package/dist/atomic/DualCard/index.js +7 -45
  17. package/dist/atomic/Grid/index.d.ts +25 -20
  18. package/dist/atomic/Grid/index.d.ts.map +1 -1
  19. package/dist/atomic/Grid/index.js +26 -16
  20. package/dist/atomic/HeroSection/index.d.ts +10 -46
  21. package/dist/atomic/HeroSection/index.d.ts.map +1 -1
  22. package/dist/atomic/HeroSection/index.js +7 -22
  23. package/dist/atomic/Input/index.d.ts.map +1 -1
  24. package/dist/atomic/Input/index.js +4 -0
  25. package/dist/atomic/List/index.d.ts +6 -1
  26. package/dist/atomic/List/index.d.ts.map +1 -1
  27. package/dist/atomic/List/index.js +8 -4
  28. package/dist/atomic/NavigationMenu/index.d.ts +1 -1
  29. package/dist/atomic/NavigationMenu/index.d.ts.map +1 -1
  30. package/dist/atomic/Popover/index.d.ts +24 -2
  31. package/dist/atomic/Popover/index.d.ts.map +1 -1
  32. package/dist/atomic/Popover/index.js +9 -0
  33. package/dist/atomic/RadioGroup/index.d.ts +4 -2
  34. package/dist/atomic/RadioGroup/index.d.ts.map +1 -1
  35. package/dist/atomic/RadioGroup/index.js +4 -5
  36. package/dist/atomic/Section/index.d.ts +33 -14
  37. package/dist/atomic/Section/index.d.ts.map +1 -1
  38. package/dist/atomic/Section/index.js +25 -12
  39. package/dist/atomic/Table/index.d.ts +2 -2
  40. package/dist/atomic/Tooltip/index.d.ts +6 -1
  41. package/dist/atomic/Tooltip/index.d.ts.map +1 -1
  42. package/dist/atomic/Tooltip/index.js +19 -2
  43. package/dist/atomic/VideoPlayer/index.d.ts.map +1 -1
  44. package/dist/atomic/VideoPlayer/index.js +15 -5
  45. package/dist/atomic/index.d.ts +3 -3
  46. package/dist/atomic/index.d.ts.map +1 -1
  47. package/dist/atomic/index.js +1 -1
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.js +4 -4
  50. package/dist/styles/index.css +358 -232
  51. package/dist/types.d.ts +2 -2
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +1 -1
@@ -10,9 +10,10 @@
10
10
  Used by: CSS @media queries, JavaScript hooks, responsive components
11
11
  Note: CSS variables don't work in @media, so we use hardcoded px values
12
12
  =========================== */
13
- --breakpoint-mobile: 768px;
14
- --breakpoint-tablet: 1024px; /* Key breakpoint, layout presets are based on mobile + tablet vs desktop+wide breakpoints */
15
- --breakpoint-desktop: 1440px;
13
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
14
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
15
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
16
+ --breakpoint-desktop: 1920px; /* 1440+ = desktop */
16
17
 
17
18
  /* ===========================
18
19
  INTERACTIVE ELEMENTS
@@ -277,28 +278,48 @@
277
278
  /* Compact (Admin/Data) - Dense, information-dense layouts - Minor Third (1.2×) */
278
279
 
279
280
  [data-density='compact'] {
280
- --font-size-base: 0.875rem; /* 14px */
281
- --font-size-lg: 1.05rem; /* base × 1.2¹ */
282
- --font-size-xl: 1.26rem; /* base × 1. */
283
- --font-size-2xl: 1.512rem; /* base × 1. */
284
- --font-size-3xl: 1.814rem; /* base × 1.2⁴ */
285
- --gap-sm: 0.375rem; /* 6px - tighter than standard */
286
- --gap-md: 0.75rem; /* 12px */
287
- --gap-lg: 1.5rem; /* 24px */
281
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
282
+ --font-size-base: clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem); /* 14-15px fluid */
283
+ --font-size-lg: clamp(1.05rem, 0.9375rem + 0.5vw, 1.125rem); /* 17-18px fluid */
284
+ --font-size-xl: clamp(1.26rem, 1.125rem + 0.75vw, 1.375rem); /* 20-22px fluid */
285
+ /* Display sizes: Musical scale + fluid responsiveness */
286
+ --font-size-2xl: clamp(
287
+ 1.512rem,
288
+ 1.375rem + 0.75vw,
289
+ 1.625rem
290
+ ); /* 24-26px fluid */
291
+ --font-size-3xl: clamp(
292
+ 1.814rem,
293
+ 1.625rem + 1vw,
294
+ 2rem
295
+ ); /* 29-32px fluid */
296
+ --gap-sm: clamp(0.375rem, 0.3125rem + 0.25vw, 0.5rem); /* 6-8px fluid */
297
+ --gap-md: clamp(0.75rem, 0.625rem + 0.5vw, 0.875rem); /* 12-14px fluid, zoom-safe */
298
+ --gap-lg: clamp(1.5rem, 1.25rem + 1vw, 1.75rem); /* 24-28px fluid, zoom-safe */
288
299
  --line-height: 1.2; /* Minor Third - All text */
289
300
  }
290
301
 
291
302
  /* Standard (Docs/SaaS) - DEFAULT, balanced for readability */
292
303
 
293
304
  [data-density='standard'] {
294
- --font-size-base: 1rem; /* 16px */
295
- --font-size-lg: 1.25rem; /* 20px - base × 1.25¹ */
296
- --font-size-xl: 1.563rem; /* 25px - base × 1.25² */
297
- --font-size-2xl: 1.953rem; /* 31px - base × 1.25³ */
298
- --font-size-3xl: 2.441rem; /* 39px - base × 1.25⁴ - hero text */
299
- --gap-sm: 0.5rem; /* 8px - explicit default */
300
- --gap-md: 1rem; /* 16px */
301
- --gap-lg: 2rem; /* 32px */
305
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
306
+ --font-size-base: clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem); /* 16-17px fluid */
307
+ --font-size-lg: clamp(1.25rem, 1.125rem + 0.5vw, 1.375rem); /* 20-22px fluid */
308
+ --font-size-xl: clamp(1.563rem, 1.375rem + 0.75vw, 1.75rem); /* 25-28px fluid */
309
+ /* Display sizes: Musical scale + fluid responsiveness */
310
+ --font-size-2xl: clamp(
311
+ 1.953rem,
312
+ 1.75rem + 1vw,
313
+ 2.25rem
314
+ ); /* 31-36px fluid */
315
+ --font-size-3xl: clamp(
316
+ 2.441rem,
317
+ 2rem + 1.5vw,
318
+ 3rem
319
+ ); /* 39-48px fluid - hero text */
320
+ --gap-sm: clamp(0.5rem, 0.4375rem + 0.25vw, 0.625rem); /* 8-10px fluid */
321
+ --gap-md: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* 16-20px fluid, zoom-safe */
322
+ --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
302
323
  --line-height: 1.25; /* Major Third - All text */
303
324
  }
304
325
 
@@ -527,52 +548,19 @@ a:not(.dndev-interactive):active {
527
548
  a:focus-visible {
528
549
  outline: 2px solid var(--ring);
529
550
  outline-offset: 2px;
530
- border-radius: var(--radius-md);
551
+ border-radius: var(--radius-interactive);
531
552
  }
532
553
 
533
- /* ===========================
534
- BASE LIST STYLING
535
- Use text-base styles for lists
536
- =========================== */
537
-
538
- /* Content lists only - not navigation menus */
539
-
540
- main ul,
541
- main ol,
542
- article ul,
543
- article ol {
544
- font-weight: 500;
545
- line-height: var(--line-height);
546
- color: var(--foreground);
547
- background: transparent !important;
548
- list-style-position: outside;
549
- padding-inline-start: var(--gap-lg);
550
- margin-block: var(--gap-md);
551
- }
552
-
553
- main ul,
554
- article ul {
555
- list-style-type: disc;
556
- }
554
+ /* Main element - no focus outline (programmatic focus for keyboard nav) */
557
555
 
558
- main ol,
559
- article ol {
560
- list-style-type: decimal;
561
- }
562
-
563
- main li,
564
- article li {
565
- font-weight: 500;
566
- line-height: var(--line-height);
567
- color: var(--foreground);
568
- background: transparent !important;
569
- margin-block: var(--gap-sm);
570
- padding-inline-start: var(--gap-sm);
556
+ main:focus-visible {
557
+ outline: none;
571
558
  }
572
559
 
573
560
  /* ===========================
574
- BASE TYPOGRAPHY STYLING
575
- Use text-base styles for headings and paragraphs
561
+ BASE TYPOGRAPHY - RESET ONLY
562
+ Zero margins, components own their spacing
563
+ Use .prose wrapper for content pages (docs, markdown)
576
564
  =========================== */
577
565
 
578
566
  h1,
@@ -581,49 +569,71 @@ h3,
581
569
  h4,
582
570
  h5,
583
571
  h6 {
584
- font-weight: 500;
572
+ font-weight: var(--font-weight-medium);
585
573
  line-height: var(--line-height);
586
574
  color: var(--foreground);
587
575
  background: transparent;
588
- margin-block: var(--gap-md);
589
576
  }
590
577
 
591
578
  h1 {
592
579
  font-family: var(--font-headline);
593
580
  font-size: var(--font-size-3xl);
594
- font-weight: 700;
581
+ font-weight: var(--font-weight-bold);
595
582
  letter-spacing: -0.02em;
596
583
  }
597
584
 
598
585
  h2 {
599
586
  font-family: var(--font-headline);
600
587
  font-size: var(--font-size-2xl);
601
- font-weight: 700;
588
+ font-weight: var(--font-weight-bold);
602
589
  letter-spacing: -0.01em;
603
590
  }
604
591
 
605
592
  h3 {
606
593
  font-size: var(--font-size-xl);
607
- font-weight: 600;
594
+ font-weight: var(--font-weight-semibold);
608
595
  }
609
596
 
610
597
  h4 {
611
598
  font-size: var(--font-size-lg);
612
- font-weight: 600;
599
+ font-weight: var(--font-weight-semibold);
613
600
  }
614
601
 
615
602
  h5,
616
603
  h6 {
617
604
  font-size: var(--font-size-base);
618
- font-weight: 600;
605
+ font-weight: var(--font-weight-semibold);
619
606
  }
620
607
 
621
608
  p {
622
- font-weight: 500;
609
+ font-weight: var(--font-weight-medium);
610
+ line-height: var(--line-height);
611
+ color: var(--foreground);
612
+ background: transparent;
613
+ }
614
+
615
+ ul,
616
+ ol {
617
+ font-weight: var(--font-weight-medium);
618
+ line-height: var(--line-height);
619
+ color: var(--foreground);
620
+ background: transparent;
621
+ list-style-position: outside;
622
+ }
623
+
624
+ ul {
625
+ list-style-type: disc;
626
+ }
627
+
628
+ ol {
629
+ list-style-type: decimal;
630
+ }
631
+
632
+ li {
633
+ font-weight: var(--font-weight-medium);
623
634
  line-height: var(--line-height);
624
635
  color: var(--foreground);
625
636
  background: transparent;
626
- margin-block: var(--gap-md);
627
637
  }
628
638
 
629
639
  /* Semantic HTML - strong and em */
@@ -670,7 +680,7 @@ em {
670
680
  .dndev-input {
671
681
  display: flex;
672
682
  width: 100%;
673
- border-radius: 0;
683
+ border-radius: var(--radius-interactive);
674
684
  border: var(--border-hairline) solid var(--line-2);
675
685
  background-color: transparent;
676
686
  color: var(--foreground);
@@ -932,15 +942,21 @@ em {
932
942
 
933
943
  .dndev-surface[data-role='card'] {
934
944
  padding: var(--gap-md);
935
- border-radius: var(--radius-md);
945
+ border-radius: var(--radius-surface);
936
946
  }
937
947
 
938
948
  /* Elevated cards - stronger shadow */
939
949
 
940
- .dndev-surface[data-elevated='true'] {
950
+ /* Apply if elevated=true OR (clickable=true AND elevated!=false) */
951
+
952
+ .dndev-surface[data-elevated='true'],.dndev-surface[data-clickable='true']:not([data-elevated='false']) {
941
953
  box-shadow: var(--shadow-xl);
942
954
  }
943
955
 
956
+ :is(.dndev-surface[data-elevated='true'],.dndev-surface[data-clickable='true']:not([data-elevated='false'])):dir(rtl) {
957
+ box-shadow: var(--shadow-xl-rtl);
958
+ }
959
+
944
960
  /* Clickable cards - hover effects */
945
961
 
946
962
  .dndev-surface[data-clickable='true'] {
@@ -1173,7 +1189,7 @@ em {
1173
1189
 
1174
1190
  .dndev-floating[data-role='card'] {
1175
1191
  padding: var(--gap-md);
1176
- border-radius: var(--radius-md);
1192
+ border-radius: var(--radius-surface);
1177
1193
  }
1178
1194
 
1179
1195
  .dndev-floating[data-role='floating'] {
@@ -1635,6 +1651,38 @@ em {
1635
1651
  color: var(--background);
1636
1652
  }
1637
1653
 
1654
+ /* CONTROL GROUP - Shared pattern for grouped controls (RadioGroup, Checkbox groups) */
1655
+
1656
+ .dndev-control-group {
1657
+ display: grid;
1658
+ gap: var(--gap-md); /* 16px - standard spacing between grouped items */
1659
+
1660
+ /* Control + label pattern - used by RadioGroup, CheckboxFieldComponent, etc. */
1661
+ }
1662
+
1663
+ .dndev-control-group label {
1664
+ display: flex;
1665
+ align-items: center;
1666
+ gap: var(--gap-sm); /* 8px - spacing between control and label */
1667
+ font-size: var(--font-size-base);
1668
+ color: var(--foreground);
1669
+ cursor: pointer;
1670
+ transition: color var(--transition-fast);
1671
+
1672
+ /* Subtle hover on label text */
1673
+ }
1674
+
1675
+ :is(.dndev-control-group label):hover {
1676
+ color: var(--primary);
1677
+ }
1678
+
1679
+ /* Selected state - label color changes */
1680
+
1681
+ :is(.dndev-control-group label):has([data-state='checked']),:is(.dndev-control-group label):has([data-state='on']) {
1682
+ color: var(--primary);
1683
+ font-weight: var(--font-weight-medium);
1684
+ }
1685
+
1638
1686
  /**
1639
1687
  * Variant system - 8 control variants
1640
1688
  * Variants override --control-border to use semantic colors
@@ -1642,37 +1690,37 @@ em {
1642
1690
  * On state: fills with variant color
1643
1691
  */
1644
1692
 
1645
- .dndev-control[data-variant='primary'] {
1693
+ .dndev-control-group[data-variant='primary'] {
1646
1694
  --control-border: var(--primary);
1647
1695
  }
1648
1696
 
1649
- .dndev-control[data-variant='secondary'] {
1697
+ .dndev-control-group[data-variant='secondary'] {
1650
1698
  --control-border: var(--secondary);
1651
1699
  }
1652
1700
 
1653
- .dndev-control[data-variant='muted'] {
1701
+ .dndev-control-group[data-variant='muted'] {
1654
1702
  --control-border: var(--muted-foreground);
1655
1703
  }
1656
1704
 
1657
- .dndev-control[data-variant='accent'] {
1705
+ .dndev-control-group[data-variant='accent'] {
1658
1706
  --control-border: var(--accent);
1659
1707
  }
1660
1708
 
1661
- .dndev-control[data-variant='success'] {
1709
+ .dndev-control-group[data-variant='success'] {
1662
1710
  --control-border: var(--success);
1663
1711
  }
1664
1712
 
1665
- .dndev-control[data-variant='warning'] {
1713
+ .dndev-control-group[data-variant='warning'] {
1666
1714
  --control-border: var(--warning);
1667
1715
  }
1668
1716
 
1669
- .dndev-control[data-variant='destructive'] {
1717
+ .dndev-control-group[data-variant='destructive'] {
1670
1718
  --control-border: var(--destructive);
1671
1719
  }
1672
1720
 
1673
1721
  /* Default variant explicitly (same as base) */
1674
1722
 
1675
- .dndev-control[data-variant='default'] {
1723
+ .dndev-control-group[data-variant='default'] {
1676
1724
  --control-border: color-mix(
1677
1725
  in oklab,
1678
1726
  var(--foreground) 70%,
@@ -1760,7 +1808,7 @@ em {
1760
1808
  display: grid;
1761
1809
  gap: var(--gap-sm);
1762
1810
  padding: var(--gap-md);
1763
- border-radius: var(--radius-none);
1811
+ border-radius: var(--radius-floating);
1764
1812
  border: var(--border-hairline) solid var(--border);
1765
1813
  /* Inverted floating colors: popover-foreground as background, popover as foreground */
1766
1814
  background: color-mix(in oklab, var(--popover-foreground) 95%, transparent);
@@ -1905,7 +1953,7 @@ em {
1905
1953
  width: var(--icon-md);
1906
1954
  height: var(--icon-md);
1907
1955
  border: 2px solid currentColor;
1908
- border-radius: 50%;
1956
+ border-radius: var(--radius-full);
1909
1957
  border-right-color: transparent;
1910
1958
  animation: spin 1s linear infinite;
1911
1959
  }
@@ -2042,7 +2090,7 @@ em {
2042
2090
  display: flex;
2043
2091
  flex-direction: column;
2044
2092
  padding: 0;
2045
- border-radius: 0;
2093
+ border-radius: var(--radius-floating);
2046
2094
  min-width: 15ch; /* Character-based: scales with font size, ensures readable width */
2047
2095
  width: -moz-fit-content;
2048
2096
  width: fit-content; /* Stretch to fit children */
@@ -2319,14 +2367,15 @@ em {
2319
2367
  margin-top: var(--gap-md);
2320
2368
  }
2321
2369
 
2322
- /* Tech card */
2370
+ /* Tech card - override Card's grid layout for centered content */
2323
2371
 
2324
2372
  .dndev-tech-card {
2325
2373
  height: 100%;
2326
2374
  min-height: 120px;
2327
- display: flex;
2375
+ display: flex !important; /* Override Card's grid layout */
2328
2376
  align-items: center;
2329
2377
  justify-content: center;
2378
+ align-content: center; /* Override Card's align-content: start */
2330
2379
  transition:
2331
2380
  border-color 0.2s ease,
2332
2381
  box-shadow 0.2s ease;
@@ -2396,7 +2445,7 @@ em {
2396
2445
  }
2397
2446
 
2398
2447
  .dndev-blockquote-content {
2399
- font-size: 1.125em; /* 1.125x body (18px on 16px base) */
2448
+ font-size: var(--font-size-lg); /* 20px - emphasized text */
2400
2449
  line-height: 1.7; /* Industry standard for readability */
2401
2450
  font-weight: 400;
2402
2451
  color: inherit;
@@ -2430,10 +2479,15 @@ em {
2430
2479
  */
2431
2480
 
2432
2481
  .dndev-blockquote[data-variant='default'] blockquote {
2433
- padding: var(--gap-md) var(--gap-md) var(--gap-md) var(--gap-lg);
2482
+ padding: var(--gap-md) calc(var(--gap-md) + 4px) var(--gap-md) var(--gap-lg);
2434
2483
  background: var(--muted);
2435
2484
  border-inline-start: 4px solid var(--primary);
2436
- border-radius: 0 var(--radius-md) var(--radius-md) 0;
2485
+ border-inline-end: none;
2486
+ border-block-start: none;
2487
+ border-block-end: none;
2488
+ border-radius: var(--radius-interactive) var(--radius-surface)
2489
+ var(--radius-surface) var(--radius-interactive);
2490
+ overflow: hidden;
2437
2491
  }
2438
2492
 
2439
2493
  .dndev-blockquote[data-variant='default'] .dndev-blockquote-content {
@@ -2454,7 +2508,7 @@ em {
2454
2508
  .dndev-blockquote[data-variant='editorial'] .dndev-blockquote-content {
2455
2509
  font-family: Georgia, 'Times New Roman', serif;
2456
2510
  font-style: italic;
2457
- font-size: 1.25em; /* Larger for editorial impact */
2511
+ font-size: var(--font-size-xl); /* 25px - larger for editorial impact */
2458
2512
  color: inherit;
2459
2513
  opacity: 0.95;
2460
2514
  }
@@ -2472,7 +2526,7 @@ em {
2472
2526
  .dndev-blockquote[data-variant='testimonial'] {
2473
2527
  background: var(--card);
2474
2528
  border: 1px solid var(--border);
2475
- border-radius: var(--radius-lg);
2529
+ border-radius: var(--radius-surface);
2476
2530
  padding: calc(var(--gap-lg) + var(--gap-md)); /* 2.5rem */
2477
2531
  box-shadow:
2478
2532
  0 1px 3px 0 hsl(var(--foreground-hsl) / 0.1),
@@ -2514,11 +2568,11 @@ em {
2514
2568
  }
2515
2569
 
2516
2570
  .dndev-blockquote-content {
2517
- font-size: 1.0625em; /* Slightly smaller on mobile (17px) */
2571
+ font-size: var(--font-size-base); /* Slightly smaller on mobile */
2518
2572
  }
2519
2573
 
2520
2574
  .dndev-blockquote[data-variant='editorial'] .dndev-blockquote-content {
2521
- font-size: 1.125em;
2575
+ font-size: var(--font-size-lg);
2522
2576
  }
2523
2577
 
2524
2578
  .dndev-blockquote[data-variant='testimonial'] {
@@ -2548,7 +2602,7 @@ em {
2548
2602
  color: var(--popover-foreground);
2549
2603
  background: var(--popover);
2550
2604
  border: var(--border-hairline) solid var(--border);
2551
- border-radius: var(--radius-interactive);
2605
+ border-radius: var(--radius-floating);
2552
2606
  box-shadow: var(--shadow-md);
2553
2607
  }
2554
2608
 
@@ -2834,13 +2888,40 @@ em {
2834
2888
  /* packages/components/src/atomic/CallToAction/CallToAction.css */
2835
2889
 
2836
2890
  .dndev-cta {
2837
- /* Full width gradient */
2891
+ /* Default gradient */
2838
2892
  background: linear-gradient(to right, var(--secondary), var(--background));
2839
2893
  color: var(--foreground);
2840
2894
  /* Padding for background - vertical only, horizontal handled by content */
2841
2895
  padding-block: var(--gap-lg);
2842
2896
  }
2843
2897
 
2898
+ /* Tone variants - leverage existing data-tone system */
2899
+
2900
+ .dndev-cta[data-tone='base'] {
2901
+ background: linear-gradient(to right, var(--secondary), var(--background));
2902
+ }
2903
+
2904
+ .dndev-cta[data-tone='muted'] {
2905
+ background: linear-gradient(to right, var(--muted), var(--background));
2906
+ }
2907
+
2908
+ .dndev-cta[data-tone='accent'] {
2909
+ background: linear-gradient(
2910
+ to right,
2911
+ color-mix(in oklab, var(--accent) 10%, transparent),
2912
+ var(--background)
2913
+ );
2914
+ }
2915
+
2916
+ .dndev-cta[data-tone='contrast'] {
2917
+ background: linear-gradient(to right, var(--foreground), var(--background));
2918
+ color: var(--background);
2919
+ }
2920
+
2921
+ .dndev-cta[data-tone='elevated'] {
2922
+ background: linear-gradient(to right, var(--secondary), var(--background));
2923
+ }
2924
+
2844
2925
  .dndev-cta-content {
2845
2926
  display: flex;
2846
2927
  flex-direction: column;
@@ -2921,19 +3002,35 @@ em {
2921
3002
  .dndev-card {
2922
3003
  display: grid;
2923
3004
  gap: var(--gap-md);
3005
+ text-align: start;
3006
+ align-content: start;
3007
+ }
3008
+
3009
+ .dndev-card-header {
3010
+ display: flex;
3011
+ flex-direction: column;
3012
+ }
3013
+
3014
+ .dndev-card-header > .dndev-stack {
3015
+ min-width: 0;
3016
+ }
3017
+
3018
+ .dndev-card-header > .dndev-stack > .dndev-card-title {
3019
+ flex: 1;
3020
+ min-width: 0;
2924
3021
  }
2925
3022
 
2926
3023
  .dndev-card-title {
2927
- font-size: var(--font-size-xl);
2928
- font-weight: 600;
2929
- color: inherit; /* Inherit from surface variant */
2930
3024
  margin: 0;
3025
+ min-width: 0;
3026
+ word-wrap: break-word;
2931
3027
  }
2932
3028
 
2933
3029
  .dndev-card-subtitle {
2934
- font-size: var(--font-size-base);
2935
- font-weight: 600;
2936
- color: inherit; /* Inherit from surface variant */
3030
+ margin-top: 0;
3031
+ margin-bottom: 0;
3032
+ min-width: 0;
3033
+ word-wrap: break-word;
2937
3034
  }
2938
3035
 
2939
3036
  /* packages/components/src/atomic/Checkbox/Checkbox.css */
@@ -3326,7 +3423,7 @@ em {
3326
3423
 
3327
3424
  .dndev-command-footer-key {
3328
3425
  padding: 0.125rem 0.375rem;
3329
- border-radius: calc(var(--radius-md) * 0.5);
3426
+ border-radius: 2px;
3330
3427
  background: var(--muted);
3331
3428
  border: 1px solid var(--border);
3332
3429
  font-family: var(--font-mono);
@@ -3646,56 +3743,34 @@ em {
3646
3743
  display: grid;
3647
3744
  min-width: 0;
3648
3745
  width: 100%;
3746
+ /* Default: use mobile columns */
3747
+ grid-template-columns: repeat(var(--grid-cols-mobile, 1), 1fr);
3649
3748
  }
3650
3749
 
3651
- /* Columns */
3652
-
3653
- .dndev-grid-component[data-cols='1'] {
3654
- grid-template-columns: repeat(1, minmax(0, 1fr));
3655
- }
3656
-
3657
- .dndev-grid-component[data-cols='2'] {
3658
- grid-template-columns: repeat(2, minmax(0, 1fr));
3659
- }
3660
-
3661
- .dndev-grid-component[data-cols='3'] {
3662
- grid-template-columns: repeat(3, minmax(0, 1fr));
3663
- }
3750
+ /* Responsive columns via media queries */
3664
3751
 
3665
- .dndev-grid-component[data-cols='4'] {
3666
- grid-template-columns: repeat(4, minmax(0, 1fr));
3667
- }
3668
-
3669
- .dndev-grid-component[data-cols='5'] {
3670
- grid-template-columns: repeat(5, minmax(0, 1fr));
3671
- }
3752
+ /* Tablet: 768px+ */
3672
3753
 
3673
- .dndev-grid-component[data-cols='6'] {
3674
- grid-template-columns: repeat(6, minmax(0, 1fr));
3754
+ @media (min-width: 768px) {
3755
+ .dndev-grid-component {
3756
+ grid-template-columns: repeat(var(--grid-cols-tablet, 1), 1fr);
3757
+ }
3675
3758
  }
3676
3759
 
3677
- .dndev-grid-component[data-cols='10'] {
3678
- grid-template-columns: repeat(10, minmax(0, 1fr));
3679
- }
3760
+ /* Laptop: 1024px+ (key layout split) */
3680
3761
 
3681
- .dndev-grid-component[data-cols='12'] {
3682
- grid-template-columns: repeat(12, minmax(0, 1fr));
3762
+ @media (min-width: 1024px) {
3763
+ .dndev-grid-component {
3764
+ grid-template-columns: repeat(var(--grid-cols-laptop, 1), 1fr);
3765
+ }
3683
3766
  }
3684
3767
 
3685
- /* Auto-fit/fill columns */
3686
-
3687
- .dndev-grid-component[data-cols='auto-fit'] {
3688
- grid-template-columns: repeat(
3689
- auto-fit,
3690
- minmax(min(100%, var(--min-col-width, 250px)), 1fr)
3691
- );
3692
- }
3768
+ /* Desktop: 1440px+ */
3693
3769
 
3694
- .dndev-grid-component[data-cols='auto-fill'] {
3695
- grid-template-columns: repeat(
3696
- auto-fill,
3697
- minmax(min(100%, var(--min-col-width, 250px)), 1fr)
3698
- );
3770
+ @media (min-width: 1440px) {
3771
+ .dndev-grid-component {
3772
+ grid-template-columns: repeat(var(--grid-cols-desktop, 1), 1fr);
3773
+ }
3699
3774
  }
3700
3775
 
3701
3776
  /* Spacing from CSS variables */
@@ -3841,21 +3916,7 @@ em {
3841
3916
  }
3842
3917
 
3843
3918
  .dndev-hero-subtitle {
3844
- font-size: var(--font-size-xl);
3845
- }
3846
-
3847
- /* Responsive Content Visibility */
3848
-
3849
- @media (width < 1024px) {
3850
- .dndev-hero-section .dndev-desktop-only {
3851
- display: none !important;
3852
- }
3853
- }
3854
-
3855
- @media (width >= 1024px) {
3856
- .dndev-hero-section .dndev-mobile-only {
3857
- display: none !important;
3858
- }
3919
+ font-size: var(--font-size-lg); /* 20px - muted via component */
3859
3920
  }
3860
3921
 
3861
3922
  /* packages/components/src/atomic/HoverCard/HoverCard.css */
@@ -3874,7 +3935,7 @@ em {
3874
3935
  height: var(--touch-target);
3875
3936
  padding: 0;
3876
3937
  border: 1px solid var(--card-foreground);
3877
- border-radius: var(--radius-md);
3938
+ border-radius: var(--radius-surface);
3878
3939
  background: transparent;
3879
3940
  display: inline-flex;
3880
3941
  align-items: center;
@@ -4014,7 +4075,7 @@ em {
4014
4075
 
4015
4076
  .dndev-json-viewer-container {
4016
4077
  background-color: var(--muted);
4017
- border-radius: var(--radius);
4078
+ border-radius: var(--radius-surface);
4018
4079
  padding: 1rem;
4019
4080
  overflow: auto;
4020
4081
  max-height: 600px;
@@ -4071,7 +4132,7 @@ em {
4071
4132
  align-items: flex-start;
4072
4133
  gap: 0.25rem;
4073
4134
  cursor: pointer;
4074
- border-radius: var(--radius-sm);
4135
+ border-radius: var(--radius-interactive);
4075
4136
  padding-inline-start: 0.25rem;
4076
4137
  padding-inline-end: 0.25rem;
4077
4138
  margin-inline-start: -0.25rem;
@@ -4168,16 +4229,13 @@ em {
4168
4229
  .dndev-list {
4169
4230
  display: flex;
4170
4231
  flex-direction: column;
4171
- gap: var(--gap-none);
4232
+ gap: var(--gap-sm);
4172
4233
  padding-inline-start: 0; /* Controllable via parent/style prop */
4234
+ margin: 0;
4173
4235
  list-style-position: outside;
4174
- /* text-align: inherit from parent (removed hardcoded start) */
4236
+ text-align: start; /* Always start-aligned, even when parent is centered */
4175
4237
  }
4176
4238
 
4177
- .dndev-list[data-gap='none'] {
4178
- gap: var(--gap-none);
4179
- }
4180
-
4181
4239
  .dndev-list[data-gap='tight'] {
4182
4240
  gap: var(--gap-sm);
4183
4241
  }
@@ -4226,29 +4284,18 @@ em {
4226
4284
  font-size: var(--font-size-base);
4227
4285
  }
4228
4286
 
4229
- /* Default: native list items (no flex) - preserves markers */
4287
+ /* Always use flex layout for consistent alignment */
4230
4288
 
4231
4289
  .dndev-list .dndev-list-item {
4232
4290
  font-size: var(--font-size-sm);
4233
- /* No display: flex by default - allows native markers */
4234
-
4235
- /* Modern ::marker styling (2026 best practice) */
4291
+ display: flex;
4292
+ align-items: flex-start;
4293
+ gap: var(--gap-sm);
4294
+ list-style: none; /* Remove native marker */
4295
+ margin-block: 0;
4296
+ padding-inline-start: 0;
4236
4297
  }
4237
4298
 
4238
- :is(.dndev-list .dndev-list-item)::marker {
4239
- color: currentColor;
4240
- }
4241
-
4242
- /* Only use flex when icon is present */
4243
-
4244
- :is(.dndev-list .dndev-list-item):has(.dndev-list-item-icon) {
4245
- display: flex;
4246
- align-items: center; /* Center vertically */
4247
- gap: var(--gap-sm);
4248
- list-style: none; /* Remove native marker when using icon */
4249
- padding-inline-start: 0; /* Reset padding when flex */
4250
- }
4251
-
4252
4299
  :is(.dndev-list .dndev-list-item) .dndev-list-item-icon {
4253
4300
  display: flex;
4254
4301
  align-items: center;
@@ -4432,7 +4479,7 @@ em {
4432
4479
  grid-row: span 3;
4433
4480
  height: 100%;
4434
4481
  padding: var(--gap-md);
4435
- border-radius: var(--radius);
4482
+ border-radius: var(--radius-floating);
4436
4483
  background: linear-gradient(
4437
4484
  to bottom,
4438
4485
  color-mix(in oklab, var(--muted) 50%, transparent),
@@ -4456,7 +4503,7 @@ em {
4456
4503
 
4457
4504
  .dndev-nav-menu-item-container {
4458
4505
  padding: var(--gap-md);
4459
- border-radius: var(--radius);
4506
+ border-radius: var(--radius-floating);
4460
4507
  text-decoration: none;
4461
4508
  outline: none;
4462
4509
  }
@@ -4591,27 +4638,57 @@ em {
4591
4638
 
4592
4639
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4593
4640
 
4594
- .dndev-radio-group {
4595
- display: grid;
4596
- gap: var(--gap-sm);
4641
+ /* Uses shared .dndev-control-group pattern from patterns.css */
4597
4642
 
4598
- /* RadioGroup label styling - Stack as="label" now has dndev-text-base */
4599
- }
4643
+ /* Root is display: grid - items are direct children */
4600
4644
 
4601
- .dndev-radio-group label {
4602
- font-size: var(--font-size-base);
4603
- color: var(--foreground);
4604
- transition: color var(--dur-fast) var(--ease-in-out);
4645
+ /* Grid columns via data-cols attribute */
4605
4646
 
4606
- /* Label text when radio is checked */
4647
+ .dndev-radio-group[data-cols] {
4648
+ width: -moz-fit-content;
4649
+ width: fit-content;
4650
+ margin-inline: auto; /* Self-center in parent */
4607
4651
  }
4608
4652
 
4609
- :is(.dndev-radio-group label):has([data-state='checked']) {
4610
- color: var(--primary);
4611
- font-weight: var(--font-weight-medium);
4612
- }
4653
+ .dndev-radio-group[data-cols='2'] {
4654
+ grid-template-columns: repeat(2, auto);
4655
+ }
4656
+
4657
+ .dndev-radio-group[data-cols='3'] {
4658
+ grid-template-columns: repeat(3, auto);
4659
+ }
4660
+
4661
+ .dndev-radio-group[data-cols='4'] {
4662
+ grid-template-columns: repeat(4, auto);
4663
+ }
4664
+
4665
+ .dndev-radio-group[data-cols='5'] {
4666
+ grid-template-columns: repeat(5, auto);
4667
+ }
4668
+
4669
+ .dndev-radio-group[data-cols='6'] {
4670
+ grid-template-columns: repeat(6, auto);
4671
+ }
4672
+
4673
+ .dndev-radio-group[data-cols='10'] {
4674
+ grid-template-columns: repeat(10, auto);
4675
+ }
4676
+
4677
+ .dndev-radio-group[data-cols='12'] {
4678
+ grid-template-columns: repeat(12, auto);
4679
+ }
4680
+
4681
+ .dndev-radio-group[data-cols='auto-fit'] {
4682
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
4683
+ width: 100%;
4684
+ }
4685
+
4686
+ .dndev-radio-group[data-cols='auto-fill'] {
4687
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
4688
+ width: 100%;
4689
+ }
4613
4690
 
4614
- /* Variant colors for checked labels */
4691
+ /* Variant colors for checked labels - override base pattern */
4615
4692
 
4616
4693
  .dndev-radio-group[data-variant='primary'] label:has([data-state='checked']) {
4617
4694
  color: var(--primary);
@@ -4854,6 +4931,12 @@ em {
4854
4931
 
4855
4932
  /* packages/components/src/atomic/Section/Section.css */
4856
4933
 
4934
+ /* Full-width section wrapper for tone backgrounds */
4935
+
4936
+ .dndev-section-full-width {
4937
+ width: 100%;
4938
+ }
4939
+
4857
4940
  /* Content wrapper: constrained + centered + padded */
4858
4941
 
4859
4942
  .dndev-section-content {
@@ -4873,23 +4956,13 @@ em {
4873
4956
  }
4874
4957
  }
4875
4958
 
4876
- /* Section title: XL, uppercase, accent, tracking */
4959
+ /* Section title: uppercase, accent color, letter spacing */
4877
4960
 
4878
4961
  .dndev-section-title {
4879
- display: block;
4880
- font-size: var(--font-size-xl);
4881
- font-weight: var(--font-weight-semibold);
4882
4962
  text-transform: uppercase;
4883
4963
  letter-spacing: 0.2em;
4884
- color: var(--accent);
4885
- margin-bottom: var(--gap-lg);
4886
- }
4887
-
4888
- /* Grid container with default gap */
4889
-
4890
- .dndev-section-grid {
4891
- display: grid;
4892
- gap: var(--gap-md);
4964
+ color: var(--accent) !important;
4965
+ margin-block-end: var(--gap-md);
4893
4966
  }
4894
4967
 
4895
4968
  .dndev-section-full-width[data-text-align='start'] .dndev-section-content {
@@ -5318,7 +5391,7 @@ em {
5318
5391
  color: var(--foreground);
5319
5392
  background-color: var(--background);
5320
5393
  padding: 0.125rem 0.375rem;
5321
- border-radius: var(--radius);
5394
+ border-radius: var(--radius-interactive);
5322
5395
  box-shadow: var(--shadow-sm);
5323
5396
  white-space: nowrap;
5324
5397
  pointer-events: none;
@@ -5772,7 +5845,7 @@ em {
5772
5845
  position: relative;
5773
5846
  width: 100%;
5774
5847
  overflow-y: auto;
5775
- border-radius: var(--radius-lg);
5848
+ border-radius: 0;
5776
5849
  border: 1px solid var(--border);
5777
5850
  }
5778
5851
 
@@ -6070,7 +6143,7 @@ em {
6070
6143
  }
6071
6144
 
6072
6145
  .dndev-text-base {
6073
- font-weight: 500;
6146
+ font-weight: var(--font-weight-medium);
6074
6147
  line-height: var(--line-height);
6075
6148
  background-color: transparent; /* Text never has background, only color changes */
6076
6149
  }
@@ -6107,28 +6180,36 @@ em {
6107
6180
  color: var(--destructive);
6108
6181
  }
6109
6182
 
6183
+ .dndev-text-base[data-variant='code'] {
6184
+ font-family: var(--font-mono);
6185
+ font-size: 0.9em;
6186
+ background: var(--muted);
6187
+ padding: 0.1em 0.4em;
6188
+ border-radius: var(--radius-interactive);
6189
+ }
6190
+
6110
6191
  /* Level overrides */
6111
6192
 
6112
6193
  .dndev-text-base[data-level='h1'] {
6113
6194
  font-size: var(--font-size-3xl);
6114
- font-weight: 700;
6195
+ font-weight: var(--font-weight-bold);
6115
6196
  letter-spacing: -0.02em;
6116
6197
  }
6117
6198
 
6118
6199
  .dndev-text-base[data-level='h2'] {
6119
- font-size: var(--font-size-2xl);
6120
- font-weight: 700;
6121
- letter-spacing: -0.01em;
6200
+ font-size: var(--font-size-lg);
6201
+ font-weight: var(--font-weight-semibold);
6122
6202
  }
6123
6203
 
6124
6204
  .dndev-text-base[data-level='h3'] {
6125
- font-size: var(--font-size-xl);
6126
- font-weight: 600;
6205
+ font-size: var(--font-size-lg);
6206
+ font-weight: var(--font-weight-semibold);
6127
6207
  }
6128
6208
 
6129
6209
  .dndev-text-base[data-level='h4'] {
6130
- font-size: var(--font-size-lg);
6131
- font-weight: 600;
6210
+ font-size: var(--font-size-base);
6211
+ font-weight: var(--font-weight-medium);
6212
+ color: var(--muted-foreground);
6132
6213
  }
6133
6214
 
6134
6215
  .dndev-text-base[data-level='body'] {
@@ -6188,7 +6269,7 @@ em {
6188
6269
  flex-shrink: 0;
6189
6270
  padding-inline-start: var(--gap-md);
6190
6271
  padding-inline-end: var(--gap-md);
6191
- border-radius: var(--radius-md);
6272
+ border-radius: var(--radius-interactive);
6192
6273
  border: 1px solid var(--border);
6193
6274
  font-size: var(--font-size-sm);
6194
6275
  }
@@ -6345,7 +6426,7 @@ em {
6345
6426
  align-items: center;
6346
6427
  gap: 0;
6347
6428
  padding: 0.125rem;
6348
- border-radius: var(--radius);
6429
+ border-radius: var(--radius-interactive);
6349
6430
  background-color: var(--muted);
6350
6431
  border: var(--border-width) solid var(--border);
6351
6432
  }
@@ -6439,7 +6520,7 @@ em {
6439
6520
  box-shadow: var(--shadow-lg); /* Stronger shadow for visibility */
6440
6521
  padding: 0.375rem 0.5rem; /* 6px 8px - industry standard */
6441
6522
  font-size: var(--font-size-xs); /* 12px */
6442
- border-radius: 0; /* Square, modern look */
6523
+ border-radius: var(--radius-floating);
6443
6524
  max-width: 12.5rem; /* 200px */
6444
6525
  }
6445
6526
 
@@ -6517,6 +6598,16 @@ em {
6517
6598
  filter: drop-shadow(0 2px 8px rgb(from var(--background) r g b / 0.5));
6518
6599
  }
6519
6600
 
6601
+ /* Loading overlay - shown while iframe loads */
6602
+
6603
+ .dndev-video-loading-overlay {
6604
+ z-index: 1;
6605
+ }
6606
+
6607
+ .dndev-video-loading-overlay .dndev-video-play-overlay {
6608
+ background: rgb(from var(--background) r g b / 0.6);
6609
+ }
6610
+
6520
6611
  /* Modal dialog wrapper */
6521
6612
 
6522
6613
  .dndev-video-dialog {
@@ -7058,7 +7149,7 @@ em {
7058
7149
  }
7059
7150
 
7060
7151
  .dndev-section-full-width[data-tone='muted'] {
7061
- background: color-mix(in oklab, var(--muted) 50%, transparent);
7152
+ background: var(--muted);
7062
7153
  }
7063
7154
 
7064
7155
  .dndev-section-full-width[data-tone='elevated'] {
@@ -7081,7 +7172,7 @@ em {
7081
7172
  }
7082
7173
 
7083
7174
  [data-tone='muted']:not(.dndev-section-full-width) {
7084
- background: color-mix(in oklab, var(--muted) 50%, transparent);
7175
+ background: var(--muted);
7085
7176
  }
7086
7177
 
7087
7178
  [data-tone='elevated']:not(.dndev-section-full-width) {
@@ -7130,7 +7221,7 @@ code {
7130
7221
  line-height: 1.5;
7131
7222
  white-space: pre-wrap;
7132
7223
  word-break: break-all;
7133
- border-radius: var(--radius-sm);
7224
+ border-radius: var(--radius-interactive);
7134
7225
  }
7135
7226
 
7136
7227
  /* Code element + variant = semantic + visual (monospace + background) */
@@ -7145,7 +7236,7 @@ code[data-variant='code'] {
7145
7236
  line-height: 1.5;
7146
7237
  white-space: pre-wrap;
7147
7238
  word-break: break-all;
7148
- border-radius: var(--radius-sm);
7239
+ border-radius: var(--radius-interactive);
7149
7240
  }
7150
7241
 
7151
7242
  /* Heading + code variant = heading size/weight + code background */
@@ -7163,7 +7254,7 @@ h4[data-variant='code'] {
7163
7254
  line-height: 1.5;
7164
7255
  white-space: pre-wrap;
7165
7256
  word-break: break-all;
7166
- border-radius: var(--radius-sm);
7257
+ border-radius: var(--radius-interactive);
7167
7258
  }
7168
7259
 
7169
7260
  /* ===========================
@@ -7217,6 +7308,7 @@ h4[data-variant='code'] {
7217
7308
 
7218
7309
  .dndev-relative {
7219
7310
  position: relative;
7311
+ min-width: 0; /* Allow flex items to shrink below content size */
7220
7312
  }
7221
7313
 
7222
7314
  .dndev-absolute {
@@ -7401,6 +7493,40 @@ h4[data-variant='code'] {
7401
7493
  border: 0;
7402
7494
  }
7403
7495
 
7496
+ /* ===========================
7497
+ PROSE - SEMANTIC TYPOGRAPHY FOR CONTENT PAGES
7498
+ Wrap docs/markdown/article content in .prose for semantic margins
7499
+ Components are unaffected - they own their own spacing
7500
+ =========================== */
7501
+
7502
+ .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7503
+ margin-block: var(--gap-md);
7504
+ }
7505
+
7506
+ .prose p {
7507
+ margin-block: var(--gap-md);
7508
+ }
7509
+
7510
+ .prose ul,.prose ol {
7511
+ padding-inline-start: var(--gap-lg);
7512
+ margin-block: var(--gap-md);
7513
+ }
7514
+
7515
+ .prose li {
7516
+ margin-block: var(--gap-sm);
7517
+ padding-inline-start: var(--gap-sm);
7518
+ }
7519
+
7520
+ /* First/last child: remove top/bottom margin for clean container edges */
7521
+
7522
+ .prose > :first-child {
7523
+ margin-block-start: 0;
7524
+ }
7525
+
7526
+ .prose > :last-child {
7527
+ margin-block-end: 0;
7528
+ }
7529
+
7404
7530
  /* ===========================
7405
7531
  SHADOW CONTROL (Universal)
7406
7532
  Works with any element