@donotdev/ui 0.0.3 → 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 (32) hide show
  1. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  2. package/dist/components/auth/AuthMenu.js +4 -4
  3. package/dist/components/common/FeatureCard.d.ts +7 -19
  4. package/dist/components/common/FeatureCard.d.ts.map +1 -1
  5. package/dist/components/common/FeatureCard.js +4 -28
  6. package/dist/components/common/TechBento.d.ts +15 -3
  7. package/dist/components/common/TechBento.d.ts.map +1 -1
  8. package/dist/components/common/TechBento.js +20 -2
  9. package/dist/dndev.css +258 -151
  10. package/dist/index.js +4 -4
  11. package/dist/internal/devtools/DebugTools.js +1 -1
  12. package/dist/internal/devtools/components/ConfigTab.d.ts.map +1 -1
  13. package/dist/internal/devtools/components/ConfigTab.js +8 -6
  14. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  15. package/dist/internal/devtools/components/DesignTab.js +256 -45
  16. package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
  17. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  18. package/dist/internal/initializers/BaseStoresInitializer.js +11 -1
  19. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  20. package/dist/internal/layout/components/AutoMetaTags.js +6 -1
  21. package/dist/internal/layout/zones/DnDevFooter.js +2 -2
  22. package/dist/styles/index.css +258 -151
  23. package/dist/utils/assetResolver.d.ts.map +1 -1
  24. package/dist/utils/assetResolver.js +22 -11
  25. package/dist/utils/index.d.ts +1 -0
  26. package/dist/utils/index.d.ts.map +1 -1
  27. package/dist/utils/index.js +1 -0
  28. package/dist/utils/tList.d.ts +30 -0
  29. package/dist/utils/tList.d.ts.map +1 -0
  30. package/dist/utils/tList.js +51 -0
  31. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  32. package/package.json +9 -9
package/dist/dndev.css CHANGED
@@ -22,9 +22,10 @@
22
22
  Used by: CSS @media queries, JavaScript hooks, responsive components
23
23
  Note: CSS variables don't work in @media, so we use hardcoded px values
24
24
  =========================== */
25
- --breakpoint-mobile: 768px;
26
- --breakpoint-tablet: 1024px; /* Key breakpoint, layout presets are based on mobile + tablet vs desktop+wide breakpoints */
27
- --breakpoint-desktop: 1440px;
25
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
26
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
27
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
28
+ --breakpoint-desktop: 1920px; /* 1440+ = desktop */
28
29
 
29
30
  /* ===========================
30
31
  INTERACTIVE ELEMENTS
@@ -289,28 +290,48 @@
289
290
  /* Compact (Admin/Data) - Dense, information-dense layouts - Minor Third (1.2×) */
290
291
 
291
292
  [data-density='compact'] {
292
- --font-size-base: 0.875rem; /* 14px */
293
- --font-size-lg: 1.05rem; /* base × 1.2¹ */
294
- --font-size-xl: 1.26rem; /* base × 1. */
295
- --font-size-2xl: 1.512rem; /* base × 1. */
296
- --font-size-3xl: 1.814rem; /* base × 1.2⁴ */
297
- --gap-sm: 0.375rem; /* 6px - tighter than standard */
298
- --gap-md: 0.75rem; /* 12px */
299
- --gap-lg: 1.5rem; /* 24px */
293
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
294
+ --font-size-base: clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem); /* 14-15px fluid */
295
+ --font-size-lg: clamp(1.05rem, 0.9375rem + 0.5vw, 1.125rem); /* 17-18px fluid */
296
+ --font-size-xl: clamp(1.26rem, 1.125rem + 0.75vw, 1.375rem); /* 20-22px fluid */
297
+ /* Display sizes: Musical scale + fluid responsiveness */
298
+ --font-size-2xl: clamp(
299
+ 1.512rem,
300
+ 1.375rem + 0.75vw,
301
+ 1.625rem
302
+ ); /* 24-26px fluid */
303
+ --font-size-3xl: clamp(
304
+ 1.814rem,
305
+ 1.625rem + 1vw,
306
+ 2rem
307
+ ); /* 29-32px fluid */
308
+ --gap-sm: clamp(0.375rem, 0.3125rem + 0.25vw, 0.5rem); /* 6-8px fluid */
309
+ --gap-md: clamp(0.75rem, 0.625rem + 0.5vw, 0.875rem); /* 12-14px fluid, zoom-safe */
310
+ --gap-lg: clamp(1.5rem, 1.25rem + 1vw, 1.75rem); /* 24-28px fluid, zoom-safe */
300
311
  --line-height: 1.2; /* Minor Third - All text */
301
312
  }
302
313
 
303
314
  /* Standard (Docs/SaaS) - DEFAULT, balanced for readability */
304
315
 
305
316
  [data-density='standard'] {
306
- --font-size-base: 1rem; /* 16px */
307
- --font-size-lg: 1.25rem; /* 20px - base × 1.25¹ */
308
- --font-size-xl: 1.563rem; /* 25px - base × 1.25² */
309
- --font-size-2xl: 1.953rem; /* 31px - base × 1.25³ */
310
- --font-size-3xl: 2.441rem; /* 39px - base × 1.25⁴ - hero text */
311
- --gap-sm: 0.5rem; /* 8px - explicit default */
312
- --gap-md: 1rem; /* 16px */
313
- --gap-lg: 2rem; /* 32px */
317
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
318
+ --font-size-base: clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem); /* 16-17px fluid */
319
+ --font-size-lg: clamp(1.25rem, 1.125rem + 0.5vw, 1.375rem); /* 20-22px fluid */
320
+ --font-size-xl: clamp(1.563rem, 1.375rem + 0.75vw, 1.75rem); /* 25-28px fluid */
321
+ /* Display sizes: Musical scale + fluid responsiveness */
322
+ --font-size-2xl: clamp(
323
+ 1.953rem,
324
+ 1.75rem + 1vw,
325
+ 2.25rem
326
+ ); /* 31-36px fluid */
327
+ --font-size-3xl: clamp(
328
+ 2.441rem,
329
+ 2rem + 1.5vw,
330
+ 3rem
331
+ ); /* 39-48px fluid - hero text */
332
+ --gap-sm: clamp(0.5rem, 0.4375rem + 0.25vw, 0.625rem); /* 8-10px fluid */
333
+ --gap-md: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* 16-20px fluid, zoom-safe */
334
+ --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
314
335
  --line-height: 1.25; /* Major Third - All text */
315
336
  }
316
337
 
@@ -542,49 +563,16 @@ a:focus-visible {
542
563
  border-radius: var(--radius-interactive);
543
564
  }
544
565
 
545
- /* ===========================
546
- BASE LIST STYLING
547
- Use text-base styles for lists
548
- =========================== */
549
-
550
- /* Content lists only - not navigation menus */
551
-
552
- main ul,
553
- main ol,
554
- article ul,
555
- article ol {
556
- font-weight: 500;
557
- line-height: var(--line-height);
558
- color: var(--foreground);
559
- background: transparent !important;
560
- list-style-position: outside;
561
- padding-inline-start: var(--gap-lg);
562
- margin-block: var(--gap-md);
563
- }
564
-
565
- main ul,
566
- article ul {
567
- list-style-type: disc;
568
- }
569
-
570
- main ol,
571
- article ol {
572
- list-style-type: decimal;
573
- }
566
+ /* Main element - no focus outline (programmatic focus for keyboard nav) */
574
567
 
575
- main li,
576
- article li {
577
- font-weight: 500;
578
- line-height: var(--line-height);
579
- color: var(--foreground);
580
- background: transparent !important;
581
- margin-block: var(--gap-sm);
582
- padding-inline-start: var(--gap-sm);
568
+ main:focus-visible {
569
+ outline: none;
583
570
  }
584
571
 
585
572
  /* ===========================
586
- BASE TYPOGRAPHY STYLING
587
- Use text-base styles for headings and paragraphs
573
+ BASE TYPOGRAPHY - RESET ONLY
574
+ Zero margins, components own their spacing
575
+ Use .prose wrapper for content pages (docs, markdown)
588
576
  =========================== */
589
577
 
590
578
  h1,
@@ -593,49 +581,71 @@ h3,
593
581
  h4,
594
582
  h5,
595
583
  h6 {
596
- font-weight: 500;
584
+ font-weight: var(--font-weight-medium);
597
585
  line-height: var(--line-height);
598
586
  color: var(--foreground);
599
587
  background: transparent;
600
- margin-block: var(--gap-md);
601
588
  }
602
589
 
603
590
  h1 {
604
591
  font-family: var(--font-headline);
605
592
  font-size: var(--font-size-3xl);
606
- font-weight: 700;
593
+ font-weight: var(--font-weight-bold);
607
594
  letter-spacing: -0.02em;
608
595
  }
609
596
 
610
597
  h2 {
611
598
  font-family: var(--font-headline);
612
599
  font-size: var(--font-size-2xl);
613
- font-weight: 700;
600
+ font-weight: var(--font-weight-bold);
614
601
  letter-spacing: -0.01em;
615
602
  }
616
603
 
617
604
  h3 {
618
605
  font-size: var(--font-size-xl);
619
- font-weight: 600;
606
+ font-weight: var(--font-weight-semibold);
620
607
  }
621
608
 
622
609
  h4 {
623
610
  font-size: var(--font-size-lg);
624
- font-weight: 600;
611
+ font-weight: var(--font-weight-semibold);
625
612
  }
626
613
 
627
614
  h5,
628
615
  h6 {
629
616
  font-size: var(--font-size-base);
630
- font-weight: 600;
617
+ font-weight: var(--font-weight-semibold);
631
618
  }
632
619
 
633
620
  p {
634
- font-weight: 500;
621
+ font-weight: var(--font-weight-medium);
622
+ line-height: var(--line-height);
623
+ color: var(--foreground);
624
+ background: transparent;
625
+ }
626
+
627
+ ul,
628
+ ol {
629
+ font-weight: var(--font-weight-medium);
630
+ line-height: var(--line-height);
631
+ color: var(--foreground);
632
+ background: transparent;
633
+ list-style-position: outside;
634
+ }
635
+
636
+ ul {
637
+ list-style-type: disc;
638
+ }
639
+
640
+ ol {
641
+ list-style-type: decimal;
642
+ }
643
+
644
+ li {
645
+ font-weight: var(--font-weight-medium);
635
646
  line-height: var(--line-height);
636
647
  color: var(--foreground);
637
648
  background: transparent;
638
- margin-block: var(--gap-md);
639
649
  }
640
650
 
641
651
  /* Semantic HTML - strong and em */
@@ -2369,14 +2379,15 @@ em {
2369
2379
  margin-top: var(--gap-md);
2370
2380
  }
2371
2381
 
2372
- /* Tech card */
2382
+ /* Tech card - override Card's grid layout for centered content */
2373
2383
 
2374
2384
  .dndev-tech-card {
2375
2385
  height: 100%;
2376
2386
  min-height: 120px;
2377
- display: flex;
2387
+ display: flex !important; /* Override Card's grid layout */
2378
2388
  align-items: center;
2379
2389
  justify-content: center;
2390
+ align-content: center; /* Override Card's align-content: start */
2380
2391
  transition:
2381
2392
  border-color 0.2s ease,
2382
2393
  box-shadow 0.2s ease;
@@ -2486,7 +2497,8 @@ em {
2486
2497
  border-inline-end: none;
2487
2498
  border-block-start: none;
2488
2499
  border-block-end: none;
2489
- border-radius: var(--radius-interactive) var(--radius-surface) var(--radius-surface) var(--radius-interactive);
2500
+ border-radius: var(--radius-interactive) var(--radius-surface)
2501
+ var(--radius-surface) var(--radius-interactive);
2490
2502
  overflow: hidden;
2491
2503
  }
2492
2504
 
@@ -2888,13 +2900,40 @@ em {
2888
2900
  /* packages/components/src/atomic/CallToAction/CallToAction.css */
2889
2901
 
2890
2902
  .dndev-cta {
2891
- /* Full width gradient */
2903
+ /* Default gradient */
2892
2904
  background: linear-gradient(to right, var(--secondary), var(--background));
2893
2905
  color: var(--foreground);
2894
2906
  /* Padding for background - vertical only, horizontal handled by content */
2895
2907
  padding-block: var(--gap-lg);
2896
2908
  }
2897
2909
 
2910
+ /* Tone variants - leverage existing data-tone system */
2911
+
2912
+ .dndev-cta[data-tone='base'] {
2913
+ background: linear-gradient(to right, var(--secondary), var(--background));
2914
+ }
2915
+
2916
+ .dndev-cta[data-tone='muted'] {
2917
+ background: linear-gradient(to right, var(--muted), var(--background));
2918
+ }
2919
+
2920
+ .dndev-cta[data-tone='accent'] {
2921
+ background: linear-gradient(
2922
+ to right,
2923
+ color-mix(in oklab, var(--accent) 10%, transparent),
2924
+ var(--background)
2925
+ );
2926
+ }
2927
+
2928
+ .dndev-cta[data-tone='contrast'] {
2929
+ background: linear-gradient(to right, var(--foreground), var(--background));
2930
+ color: var(--background);
2931
+ }
2932
+
2933
+ .dndev-cta[data-tone='elevated'] {
2934
+ background: linear-gradient(to right, var(--secondary), var(--background));
2935
+ }
2936
+
2898
2937
  .dndev-cta-content {
2899
2938
  display: flex;
2900
2939
  flex-direction: column;
@@ -2975,19 +3014,35 @@ em {
2975
3014
  .dndev-card {
2976
3015
  display: grid;
2977
3016
  gap: var(--gap-md);
3017
+ text-align: start;
3018
+ align-content: start;
3019
+ }
3020
+
3021
+ .dndev-card-header {
3022
+ display: flex;
3023
+ flex-direction: column;
3024
+ }
3025
+
3026
+ .dndev-card-header > .dndev-stack {
3027
+ min-width: 0;
3028
+ }
3029
+
3030
+ .dndev-card-header > .dndev-stack > .dndev-card-title {
3031
+ flex: 1;
3032
+ min-width: 0;
2978
3033
  }
2979
3034
 
2980
3035
  .dndev-card-title {
2981
- font-size: var(--font-size-xl);
2982
- font-weight: 600;
2983
- color: inherit; /* Inherit from surface variant */
2984
3036
  margin: 0;
3037
+ min-width: 0;
3038
+ word-wrap: break-word;
2985
3039
  }
2986
3040
 
2987
3041
  .dndev-card-subtitle {
2988
- font-size: var(--font-size-base);
2989
- font-weight: 600;
2990
- color: inherit; /* Inherit from surface variant */
3042
+ margin-top: 0;
3043
+ margin-bottom: 0;
3044
+ min-width: 0;
3045
+ word-wrap: break-word;
2991
3046
  }
2992
3047
 
2993
3048
  /* packages/components/src/atomic/Checkbox/Checkbox.css */
@@ -3700,9 +3755,35 @@ em {
3700
3755
  display: grid;
3701
3756
  min-width: 0;
3702
3757
  width: 100%;
3758
+ /* Default: use mobile columns */
3759
+ grid-template-columns: repeat(var(--grid-cols-mobile, 1), 1fr);
3760
+ }
3761
+
3762
+ /* Responsive columns via media queries */
3763
+
3764
+ /* Tablet: 768px+ */
3765
+
3766
+ @media (min-width: 768px) {
3767
+ .dndev-grid-component {
3768
+ grid-template-columns: repeat(var(--grid-cols-tablet, 1), 1fr);
3769
+ }
3770
+ }
3771
+
3772
+ /* Laptop: 1024px+ (key layout split) */
3773
+
3774
+ @media (min-width: 1024px) {
3775
+ .dndev-grid-component {
3776
+ grid-template-columns: repeat(var(--grid-cols-laptop, 1), 1fr);
3777
+ }
3703
3778
  }
3704
3779
 
3705
- /* Grid template columns are set via inline styles for maximum flexibility */
3780
+ /* Desktop: 1440px+ */
3781
+
3782
+ @media (min-width: 1440px) {
3783
+ .dndev-grid-component {
3784
+ grid-template-columns: repeat(var(--grid-cols-desktop, 1), 1fr);
3785
+ }
3786
+ }
3706
3787
 
3707
3788
  /* Spacing from CSS variables */
3708
3789
 
@@ -3847,21 +3928,7 @@ em {
3847
3928
  }
3848
3929
 
3849
3930
  .dndev-hero-subtitle {
3850
- font-size: var(--font-size-xl);
3851
- }
3852
-
3853
- /* Responsive Content Visibility */
3854
-
3855
- @media (width < 1024px) {
3856
- .dndev-hero-section .dndev-desktop-only {
3857
- display: none !important;
3858
- }
3859
- }
3860
-
3861
- @media (width >= 1024px) {
3862
- .dndev-hero-section .dndev-mobile-only {
3863
- display: none !important;
3864
- }
3931
+ font-size: var(--font-size-lg); /* 20px - muted via component */
3865
3932
  }
3866
3933
 
3867
3934
  /* packages/components/src/atomic/HoverCard/HoverCard.css */
@@ -4174,16 +4241,13 @@ em {
4174
4241
  .dndev-list {
4175
4242
  display: flex;
4176
4243
  flex-direction: column;
4177
- gap: var(--gap-none);
4244
+ gap: var(--gap-sm);
4178
4245
  padding-inline-start: 0; /* Controllable via parent/style prop */
4246
+ margin: 0;
4179
4247
  list-style-position: outside;
4180
- /* text-align: inherit from parent (removed hardcoded start) */
4248
+ text-align: start; /* Always start-aligned, even when parent is centered */
4181
4249
  }
4182
4250
 
4183
- .dndev-list[data-gap='none'] {
4184
- gap: var(--gap-none);
4185
- }
4186
-
4187
4251
  .dndev-list[data-gap='tight'] {
4188
4252
  gap: var(--gap-sm);
4189
4253
  }
@@ -4232,29 +4296,18 @@ em {
4232
4296
  font-size: var(--font-size-base);
4233
4297
  }
4234
4298
 
4235
- /* Default: native list items (no flex) - preserves markers */
4299
+ /* Always use flex layout for consistent alignment */
4236
4300
 
4237
4301
  .dndev-list .dndev-list-item {
4238
4302
  font-size: var(--font-size-sm);
4239
- /* No display: flex by default - allows native markers */
4240
-
4241
- /* Modern ::marker styling (2026 best practice) */
4303
+ display: flex;
4304
+ align-items: flex-start;
4305
+ gap: var(--gap-sm);
4306
+ list-style: none; /* Remove native marker */
4307
+ margin-block: 0;
4308
+ padding-inline-start: 0;
4242
4309
  }
4243
4310
 
4244
- :is(.dndev-list .dndev-list-item)::marker {
4245
- color: currentColor;
4246
- }
4247
-
4248
- /* Only use flex when icon is present */
4249
-
4250
- :is(.dndev-list .dndev-list-item):has(.dndev-list-item-icon) {
4251
- display: flex;
4252
- align-items: center; /* Center vertically */
4253
- gap: var(--gap-sm);
4254
- list-style: none; /* Remove native marker when using icon */
4255
- padding-inline-start: 0; /* Reset padding when flex */
4256
- }
4257
-
4258
4311
  :is(.dndev-list .dndev-list-item) .dndev-list-item-icon {
4259
4312
  display: flex;
4260
4313
  align-items: center;
@@ -4609,23 +4662,43 @@ em {
4609
4662
  margin-inline: auto; /* Self-center in parent */
4610
4663
  }
4611
4664
 
4612
- .dndev-radio-group[data-cols='2'] { grid-template-columns: repeat(2, auto); }
4665
+ .dndev-radio-group[data-cols='2'] {
4666
+ grid-template-columns: repeat(2, auto);
4667
+ }
4613
4668
 
4614
- .dndev-radio-group[data-cols='3'] { grid-template-columns: repeat(3, auto); }
4669
+ .dndev-radio-group[data-cols='3'] {
4670
+ grid-template-columns: repeat(3, auto);
4671
+ }
4615
4672
 
4616
- .dndev-radio-group[data-cols='4'] { grid-template-columns: repeat(4, auto); }
4673
+ .dndev-radio-group[data-cols='4'] {
4674
+ grid-template-columns: repeat(4, auto);
4675
+ }
4617
4676
 
4618
- .dndev-radio-group[data-cols='5'] { grid-template-columns: repeat(5, auto); }
4677
+ .dndev-radio-group[data-cols='5'] {
4678
+ grid-template-columns: repeat(5, auto);
4679
+ }
4619
4680
 
4620
- .dndev-radio-group[data-cols='6'] { grid-template-columns: repeat(6, auto); }
4681
+ .dndev-radio-group[data-cols='6'] {
4682
+ grid-template-columns: repeat(6, auto);
4683
+ }
4621
4684
 
4622
- .dndev-radio-group[data-cols='10'] { grid-template-columns: repeat(10, auto); }
4685
+ .dndev-radio-group[data-cols='10'] {
4686
+ grid-template-columns: repeat(10, auto);
4687
+ }
4623
4688
 
4624
- .dndev-radio-group[data-cols='12'] { grid-template-columns: repeat(12, auto); }
4689
+ .dndev-radio-group[data-cols='12'] {
4690
+ grid-template-columns: repeat(12, auto);
4691
+ }
4625
4692
 
4626
- .dndev-radio-group[data-cols='auto-fit'] { grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); width: 100%; }
4693
+ .dndev-radio-group[data-cols='auto-fit'] {
4694
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
4695
+ width: 100%;
4696
+ }
4627
4697
 
4628
- .dndev-radio-group[data-cols='auto-fill'] { grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); width: 100%; }
4698
+ .dndev-radio-group[data-cols='auto-fill'] {
4699
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
4700
+ width: 100%;
4701
+ }
4629
4702
 
4630
4703
  /* Variant colors for checked labels - override base pattern */
4631
4704
 
@@ -4895,23 +4968,13 @@ em {
4895
4968
  }
4896
4969
  }
4897
4970
 
4898
- /* Section title: LG, uppercase, accent pop color, tracking */
4971
+ /* Section title: uppercase, accent color, letter spacing */
4899
4972
 
4900
4973
  .dndev-section-title {
4901
- display: block;
4902
- font-size: var(--font-size-lg);
4903
- font-weight: var(--font-weight-semibold);
4904
4974
  text-transform: uppercase;
4905
4975
  letter-spacing: 0.2em;
4906
- color: var(--accent);
4907
- margin-bottom: var(--gap-lg);
4908
- }
4909
-
4910
- /* Grid container with default gap */
4911
-
4912
- .dndev-section-grid {
4913
- display: grid;
4914
- gap: var(--gap-md);
4976
+ color: var(--accent) !important;
4977
+ margin-block-end: var(--gap-md);
4915
4978
  }
4916
4979
 
4917
4980
  .dndev-section-full-width[data-text-align='start'] .dndev-section-content {
@@ -6092,7 +6155,7 @@ em {
6092
6155
  }
6093
6156
 
6094
6157
  .dndev-text-base {
6095
- font-weight: 500;
6158
+ font-weight: var(--font-weight-medium);
6096
6159
  line-height: var(--line-height);
6097
6160
  background-color: transparent; /* Text never has background, only color changes */
6098
6161
  }
@@ -6129,28 +6192,36 @@ em {
6129
6192
  color: var(--destructive);
6130
6193
  }
6131
6194
 
6195
+ .dndev-text-base[data-variant='code'] {
6196
+ font-family: var(--font-mono);
6197
+ font-size: 0.9em;
6198
+ background: var(--muted);
6199
+ padding: 0.1em 0.4em;
6200
+ border-radius: var(--radius-interactive);
6201
+ }
6202
+
6132
6203
  /* Level overrides */
6133
6204
 
6134
6205
  .dndev-text-base[data-level='h1'] {
6135
6206
  font-size: var(--font-size-3xl);
6136
- font-weight: 700;
6207
+ font-weight: var(--font-weight-bold);
6137
6208
  letter-spacing: -0.02em;
6138
6209
  }
6139
6210
 
6140
6211
  .dndev-text-base[data-level='h2'] {
6141
- font-size: var(--font-size-2xl);
6142
- font-weight: 700;
6143
- letter-spacing: -0.01em;
6212
+ font-size: var(--font-size-lg);
6213
+ font-weight: var(--font-weight-semibold);
6144
6214
  }
6145
6215
 
6146
6216
  .dndev-text-base[data-level='h3'] {
6147
- font-size: var(--font-size-xl);
6148
- font-weight: 600;
6217
+ font-size: var(--font-size-lg);
6218
+ font-weight: var(--font-weight-semibold);
6149
6219
  }
6150
6220
 
6151
6221
  .dndev-text-base[data-level='h4'] {
6152
- font-size: var(--font-size-lg);
6153
- font-weight: 600;
6222
+ font-size: var(--font-size-base);
6223
+ font-weight: var(--font-weight-medium);
6224
+ color: var(--muted-foreground);
6154
6225
  }
6155
6226
 
6156
6227
  .dndev-text-base[data-level='body'] {
@@ -7434,6 +7505,40 @@ h4[data-variant='code'] {
7434
7505
  border: 0;
7435
7506
  }
7436
7507
 
7508
+ /* ===========================
7509
+ PROSE - SEMANTIC TYPOGRAPHY FOR CONTENT PAGES
7510
+ Wrap docs/markdown/article content in .prose for semantic margins
7511
+ Components are unaffected - they own their own spacing
7512
+ =========================== */
7513
+
7514
+ .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7515
+ margin-block: var(--gap-md);
7516
+ }
7517
+
7518
+ .prose p {
7519
+ margin-block: var(--gap-md);
7520
+ }
7521
+
7522
+ .prose ul,.prose ol {
7523
+ padding-inline-start: var(--gap-lg);
7524
+ margin-block: var(--gap-md);
7525
+ }
7526
+
7527
+ .prose li {
7528
+ margin-block: var(--gap-sm);
7529
+ padding-inline-start: var(--gap-sm);
7530
+ }
7531
+
7532
+ /* First/last child: remove top/bottom margin for clean container edges */
7533
+
7534
+ .prose > :first-child {
7535
+ margin-block-start: 0;
7536
+ }
7537
+
7538
+ .prose > :last-child {
7539
+ margin-block-end: 0;
7540
+ }
7541
+
7437
7542
  /* ===========================
7438
7543
  SHADOW CONTROL (Universal)
7439
7544
  Works with any element
@@ -7871,18 +7976,20 @@ main[role='main'][data-routing-animation='none'] {
7871
7976
  display: grid;
7872
7977
  /* ONE DRY grid structure: 3 rows, 2 columns */
7873
7978
  /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
7979
+ /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
7980
+ implement ResizeObserver to update --footer-height dynamically. */
7874
7981
  grid-template-areas:
7875
7982
  'header header'
7876
7983
  'sidebar main'
7877
7984
  'footer footer';
7878
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
7985
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7879
7986
  grid-template-columns: var(--sidebar-width) 1fr;
7880
7987
 
7881
7988
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
7882
7989
  }
7883
7990
 
7884
7991
  [data-layout='game']:root .dndev-layout {
7885
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
7992
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7886
7993
  }
7887
7994
 
7888
7995
  /* ===========================
@@ -8234,7 +8341,7 @@ footer[role='contentinfo'] {
8234
8341
  grid-area: footer;
8235
8342
  box-sizing: border-box;
8236
8343
  grid-column: 1 / -1;
8237
- height: var(--footer-height);
8344
+ min-height: var(--footer-height);
8238
8345
  z-index: var(--z-footer);
8239
8346
 
8240
8347
  /* Theme-aware styling - 100% controlled by theme system */