@donotdev/ui 0.0.3 → 0.0.5

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 (34) 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 +600 -163
  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/DnDevLayout.d.ts.map +1 -1
  20. package/dist/internal/layout/DnDevLayout.js +1 -5
  21. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  22. package/dist/internal/layout/components/AutoMetaTags.js +6 -1
  23. package/dist/internal/layout/zones/DnDevFooter.js +2 -2
  24. package/dist/styles/index.css +600 -163
  25. package/dist/utils/assetResolver.d.ts.map +1 -1
  26. package/dist/utils/assetResolver.js +22 -11
  27. package/dist/utils/index.d.ts +1 -0
  28. package/dist/utils/index.d.ts.map +1 -1
  29. package/dist/utils/index.js +1 -0
  30. package/dist/utils/tList.d.ts +30 -0
  31. package/dist/utils/tList.d.ts.map +1 -0
  32. package/dist/utils/tList.js +51 -0
  33. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  34. package/package.json +9 -9
@@ -18,9 +18,10 @@
18
18
  Used by: CSS @media queries, JavaScript hooks, responsive components
19
19
  Note: CSS variables don't work in @media, so we use hardcoded px values
20
20
  =========================== */
21
- --breakpoint-mobile: 768px;
22
- --breakpoint-tablet: 1024px; /* Key breakpoint, layout presets are based on mobile + tablet vs desktop+wide breakpoints */
23
- --breakpoint-desktop: 1440px;
21
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
22
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
23
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
24
+ --breakpoint-desktop: 1920px; /* 1440+ = desktop */
24
25
 
25
26
  /* ===========================
26
27
  INTERACTIVE ELEMENTS
@@ -285,28 +286,48 @@
285
286
  /* Compact (Admin/Data) - Dense, information-dense layouts - Minor Third (1.2×) */
286
287
 
287
288
  [data-density='compact'] {
288
- --font-size-base: 0.875rem; /* 14px */
289
- --font-size-lg: 1.05rem; /* base × 1.2¹ */
290
- --font-size-xl: 1.26rem; /* base × 1. */
291
- --font-size-2xl: 1.512rem; /* base × 1. */
292
- --font-size-3xl: 1.814rem; /* base × 1.2⁴ */
293
- --gap-sm: 0.375rem; /* 6px - tighter than standard */
294
- --gap-md: 0.75rem; /* 12px */
295
- --gap-lg: 1.5rem; /* 24px */
289
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
290
+ --font-size-base: clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem); /* 14-15px fluid */
291
+ --font-size-lg: clamp(1.05rem, 0.9375rem + 0.5vw, 1.125rem); /* 17-18px fluid */
292
+ --font-size-xl: clamp(1.26rem, 1.125rem + 0.75vw, 1.375rem); /* 20-22px fluid */
293
+ /* Display sizes: Musical scale + fluid responsiveness */
294
+ --font-size-2xl: clamp(
295
+ 1.512rem,
296
+ 1.375rem + 0.75vw,
297
+ 1.625rem
298
+ ); /* 24-26px fluid */
299
+ --font-size-3xl: clamp(
300
+ 1.814rem,
301
+ 1.625rem + 1vw,
302
+ 2rem
303
+ ); /* 29-32px fluid */
304
+ --gap-sm: clamp(0.375rem, 0.3125rem + 0.25vw, 0.5rem); /* 6-8px fluid */
305
+ --gap-md: clamp(0.75rem, 0.625rem + 0.5vw, 0.875rem); /* 12-14px fluid, zoom-safe */
306
+ --gap-lg: clamp(1.5rem, 1.25rem + 1vw, 1.75rem); /* 24-28px fluid, zoom-safe */
296
307
  --line-height: 1.2; /* Minor Third - All text */
297
308
  }
298
309
 
299
310
  /* Standard (Docs/SaaS) - DEFAULT, balanced for readability */
300
311
 
301
312
  [data-density='standard'] {
302
- --font-size-base: 1rem; /* 16px */
303
- --font-size-lg: 1.25rem; /* 20px - base × 1.25¹ */
304
- --font-size-xl: 1.563rem; /* 25px - base × 1.25² */
305
- --font-size-2xl: 1.953rem; /* 31px - base × 1.25³ */
306
- --font-size-3xl: 2.441rem; /* 39px - base × 1.25⁴ - hero text */
307
- --gap-sm: 0.5rem; /* 8px - explicit default */
308
- --gap-md: 1rem; /* 16px */
309
- --gap-lg: 2rem; /* 32px */
313
+ /* Base sizes: Fluid responsiveness for all text, zoom-safe */
314
+ --font-size-base: clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem); /* 16-17px fluid */
315
+ --font-size-lg: clamp(1.25rem, 1.125rem + 0.5vw, 1.375rem); /* 20-22px fluid */
316
+ --font-size-xl: clamp(1.563rem, 1.375rem + 0.75vw, 1.75rem); /* 25-28px fluid */
317
+ /* Display sizes: Musical scale + fluid responsiveness */
318
+ --font-size-2xl: clamp(
319
+ 1.953rem,
320
+ 1.75rem + 1vw,
321
+ 2.25rem
322
+ ); /* 31-36px fluid */
323
+ --font-size-3xl: clamp(
324
+ 2.441rem,
325
+ 2rem + 1.5vw,
326
+ 3rem
327
+ ); /* 39-48px fluid - hero text */
328
+ --gap-sm: clamp(0.5rem, 0.4375rem + 0.25vw, 0.625rem); /* 8-10px fluid */
329
+ --gap-md: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* 16-20px fluid, zoom-safe */
330
+ --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
310
331
  --line-height: 1.25; /* Major Third - All text */
311
332
  }
312
333
 
@@ -538,49 +559,16 @@ a:focus-visible {
538
559
  border-radius: var(--radius-interactive);
539
560
  }
540
561
 
541
- /* ===========================
542
- BASE LIST STYLING
543
- Use text-base styles for lists
544
- =========================== */
545
-
546
- /* Content lists only - not navigation menus */
562
+ /* Main element - no focus outline (programmatic focus for keyboard nav) */
547
563
 
548
- main ul,
549
- main ol,
550
- article ul,
551
- article ol {
552
- font-weight: 500;
553
- line-height: var(--line-height);
554
- color: var(--foreground);
555
- background: transparent !important;
556
- list-style-position: outside;
557
- padding-inline-start: var(--gap-lg);
558
- margin-block: var(--gap-md);
559
- }
560
-
561
- main ul,
562
- article ul {
563
- list-style-type: disc;
564
- }
565
-
566
- main ol,
567
- article ol {
568
- list-style-type: decimal;
569
- }
570
-
571
- main li,
572
- article li {
573
- font-weight: 500;
574
- line-height: var(--line-height);
575
- color: var(--foreground);
576
- background: transparent !important;
577
- margin-block: var(--gap-sm);
578
- padding-inline-start: var(--gap-sm);
564
+ main:focus-visible {
565
+ outline: none;
579
566
  }
580
567
 
581
568
  /* ===========================
582
- BASE TYPOGRAPHY STYLING
583
- Use text-base styles for headings and paragraphs
569
+ BASE TYPOGRAPHY - RESET ONLY
570
+ Zero margins, components own their spacing
571
+ Use .prose wrapper for content pages (docs, markdown)
584
572
  =========================== */
585
573
 
586
574
  h1,
@@ -589,49 +577,71 @@ h3,
589
577
  h4,
590
578
  h5,
591
579
  h6 {
592
- font-weight: 500;
580
+ font-weight: var(--font-weight-medium);
593
581
  line-height: var(--line-height);
594
582
  color: var(--foreground);
595
583
  background: transparent;
596
- margin-block: var(--gap-md);
597
584
  }
598
585
 
599
586
  h1 {
600
587
  font-family: var(--font-headline);
601
588
  font-size: var(--font-size-3xl);
602
- font-weight: 700;
589
+ font-weight: var(--font-weight-bold);
603
590
  letter-spacing: -0.02em;
604
591
  }
605
592
 
606
593
  h2 {
607
594
  font-family: var(--font-headline);
608
595
  font-size: var(--font-size-2xl);
609
- font-weight: 700;
596
+ font-weight: var(--font-weight-bold);
610
597
  letter-spacing: -0.01em;
611
598
  }
612
599
 
613
600
  h3 {
614
601
  font-size: var(--font-size-xl);
615
- font-weight: 600;
602
+ font-weight: var(--font-weight-semibold);
616
603
  }
617
604
 
618
605
  h4 {
619
606
  font-size: var(--font-size-lg);
620
- font-weight: 600;
607
+ font-weight: var(--font-weight-semibold);
621
608
  }
622
609
 
623
610
  h5,
624
611
  h6 {
625
612
  font-size: var(--font-size-base);
626
- font-weight: 600;
613
+ font-weight: var(--font-weight-semibold);
627
614
  }
628
615
 
629
616
  p {
630
- font-weight: 500;
617
+ font-weight: var(--font-weight-medium);
618
+ line-height: var(--line-height);
619
+ color: var(--foreground);
620
+ background: transparent;
621
+ }
622
+
623
+ ul,
624
+ ol {
625
+ font-weight: var(--font-weight-medium);
626
+ line-height: var(--line-height);
627
+ color: var(--foreground);
628
+ background: transparent;
629
+ list-style-position: outside;
630
+ }
631
+
632
+ ul {
633
+ list-style-type: disc;
634
+ }
635
+
636
+ ol {
637
+ list-style-type: decimal;
638
+ }
639
+
640
+ li {
641
+ font-weight: var(--font-weight-medium);
631
642
  line-height: var(--line-height);
632
643
  color: var(--foreground);
633
644
  background: transparent;
634
- margin-block: var(--gap-md);
635
645
  }
636
646
 
637
647
  /* Semantic HTML - strong and em */
@@ -1055,12 +1065,13 @@ em {
1055
1065
  }
1056
1066
 
1057
1067
  .dndev-surface[data-variant='glass'] {
1058
- background: color-mix(in oklab, var(--card) 40%, transparent);
1059
- backdrop-filter: blur(12px);
1060
- -webkit-backdrop-filter: blur(12px);
1068
+ background: color-mix(in oklab, var(--card) 55%, transparent);
1069
+ backdrop-filter: blur(20px) saturate(180%);
1070
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
1061
1071
  border: var(--border-hairline) solid
1062
- color-mix(in oklab, var(--card-foreground) 15%, transparent);
1063
- box-shadow: var(--shadow-lg);
1072
+ color-mix(in oklab, var(--card-foreground) 25%, transparent);
1073
+ box-shadow: var(--shadow-lg),
1074
+ inset 0 1px 0 0 color-mix(in oklab, var(--card-foreground) 10%, transparent);
1064
1075
  }
1065
1076
 
1066
1077
  /* Separator style */
@@ -2130,6 +2141,7 @@ em {
2130
2141
  background: transparent;
2131
2142
  color: inherit;
2132
2143
  font-size: var(--font-size-base);
2144
+ font-weight: var(--font-weight-medium);
2133
2145
  }
2134
2146
 
2135
2147
  .dndev-interactive[data-role='accordion-trigger']:hover {
@@ -2154,6 +2166,7 @@ em {
2154
2166
  transition: all var(--dur-fast) var(--ease-in-out);
2155
2167
  width: 100%;
2156
2168
  min-width: 0;
2169
+ text-align: start;
2157
2170
  }
2158
2171
 
2159
2172
  .dndev-accordion-content[data-state='closed'] {
@@ -2365,14 +2378,15 @@ em {
2365
2378
  margin-top: var(--gap-md);
2366
2379
  }
2367
2380
 
2368
- /* Tech card */
2381
+ /* Tech card - override Card's grid layout for centered content */
2369
2382
 
2370
2383
  .dndev-tech-card {
2371
2384
  height: 100%;
2372
2385
  min-height: 120px;
2373
- display: flex;
2386
+ display: flex !important; /* Override Card's grid layout */
2374
2387
  align-items: center;
2375
2388
  justify-content: center;
2389
+ align-content: center; /* Override Card's align-content: start */
2376
2390
  transition:
2377
2391
  border-color 0.2s ease,
2378
2392
  box-shadow 0.2s ease;
@@ -2482,7 +2496,8 @@ em {
2482
2496
  border-inline-end: none;
2483
2497
  border-block-start: none;
2484
2498
  border-block-end: none;
2485
- border-radius: var(--radius-interactive) var(--radius-surface) var(--radius-surface) var(--radius-interactive);
2499
+ border-radius: var(--radius-interactive) var(--radius-surface)
2500
+ var(--radius-surface) var(--radius-interactive);
2486
2501
  overflow: hidden;
2487
2502
  }
2488
2503
 
@@ -2884,13 +2899,41 @@ em {
2884
2899
  /* packages/components/src/atomic/CallToAction/CallToAction.css */
2885
2900
 
2886
2901
  .dndev-cta {
2887
- /* Full width gradient */
2888
- background: linear-gradient(to right, var(--secondary), var(--background));
2889
2902
  color: var(--foreground);
2890
2903
  /* Padding for background - vertical only, horizontal handled by content */
2891
2904
  padding-block: var(--gap-lg);
2892
2905
  }
2893
2906
 
2907
+ /* Tone variants - leverage existing data-tone system */
2908
+
2909
+ /* Ghost (default) - no background */
2910
+
2911
+ .dndev-cta[data-tone='ghost'],
2912
+ .dndev-cta:not([data-tone]) {
2913
+ background: transparent;
2914
+ }
2915
+
2916
+ .dndev-cta[data-tone='base'] {
2917
+ background: var(--background);
2918
+ }
2919
+
2920
+ .dndev-cta[data-tone='muted'] {
2921
+ background: var(--muted);
2922
+ }
2923
+
2924
+ .dndev-cta[data-tone='elevated'] {
2925
+ background: var(--background);
2926
+ }
2927
+
2928
+ .dndev-cta[data-tone='contrast'] {
2929
+ background: var(--foreground);
2930
+ color: var(--background);
2931
+ }
2932
+
2933
+ .dndev-cta[data-tone='accent'] {
2934
+ background: color-mix(in oklab, var(--accent) 5%, transparent);
2935
+ }
2936
+
2894
2937
  .dndev-cta-content {
2895
2938
  display: flex;
2896
2939
  flex-direction: column;
@@ -2971,19 +3014,36 @@ em {
2971
3014
  .dndev-card {
2972
3015
  display: grid;
2973
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;
2974
3033
  }
2975
3034
 
2976
3035
  .dndev-card-title {
2977
- font-size: var(--font-size-xl);
2978
- font-weight: 600;
2979
- color: inherit; /* Inherit from surface variant */
2980
3036
  margin: 0;
3037
+ min-width: 0;
3038
+ word-wrap: break-word;
2981
3039
  }
2982
3040
 
2983
- .dndev-card-subtitle {
2984
- font-size: var(--font-size-base);
2985
- font-weight: 600;
2986
- color: inherit; /* Inherit from surface variant */
3041
+ .dndev-surface .dndev-card-subtitle {
3042
+ margin-top: 0;
3043
+ margin-bottom: 0;
3044
+ min-width: 0;
3045
+ word-wrap: break-word;
3046
+ color: color-mix(in oklab, var(--card-foreground) 70%, transparent);
2987
3047
  }
2988
3048
 
2989
3049
  /* packages/components/src/atomic/Checkbox/Checkbox.css */
@@ -3074,6 +3134,203 @@ em {
3074
3134
  }
3075
3135
  }
3076
3136
 
3137
+ /* packages/components/src/atomic/Collapsible/Collapsible.css */
3138
+
3139
+ .dndev-collapsible {
3140
+ width: 100%;
3141
+ display: flex;
3142
+ flex-direction: column;
3143
+ }
3144
+
3145
+ .dndev-collapsible-content {
3146
+ overflow: hidden;
3147
+ width: 100%;
3148
+ }
3149
+
3150
+ .dndev-collapsible-content[data-state='open'] {
3151
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
3152
+ }
3153
+
3154
+ .dndev-collapsible-content[data-state='closed'] {
3155
+ animation: slideUp var(--dur-normal) var(--ease-in-out);
3156
+ }
3157
+
3158
+ @keyframes slideDown {
3159
+ from {
3160
+ height: 0;
3161
+ }
3162
+ to {
3163
+ height: var(--radix-collapsible-content-height);
3164
+ }
3165
+ }
3166
+
3167
+ @keyframes slideUp {
3168
+ from {
3169
+ height: var(--radix-collapsible-content-height);
3170
+ }
3171
+ to {
3172
+ height: 0;
3173
+ }
3174
+ }
3175
+
3176
+ /* packages/components/src/atomic/Combobox/Combobox.css */
3177
+
3178
+ .dndev-combobox-trigger {
3179
+ display: flex;
3180
+ justify-content: space-between;
3181
+ align-items: center;
3182
+ width: 100%;
3183
+ text-align: left;
3184
+ }
3185
+
3186
+ .dndev-combobox-trigger button {
3187
+ display: flex;
3188
+ justify-content: space-between;
3189
+ align-items: center;
3190
+ width: 100%;
3191
+ }
3192
+
3193
+ .dndev-combobox-placeholder {
3194
+ opacity: var(--opacity-muted);
3195
+ }
3196
+
3197
+ .dndev-combobox-trigger-icons {
3198
+ display: flex;
3199
+ align-items: center;
3200
+ gap: var(--gap-tight);
3201
+ margin-inline-start: auto;
3202
+ }
3203
+
3204
+ .dndev-combobox-clear {
3205
+ display: flex;
3206
+ align-items: center;
3207
+ justify-content: center;
3208
+ cursor: pointer;
3209
+ opacity: var(--opacity-muted);
3210
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3211
+ -webkit-user-select: none;
3212
+ -moz-user-select: none;
3213
+ user-select: none;
3214
+ }
3215
+
3216
+ .dndev-combobox-clear:hover,
3217
+ .dndev-combobox-clear:focus {
3218
+ opacity: 1;
3219
+ outline: none;
3220
+ }
3221
+
3222
+ .dndev-combobox-clear svg {
3223
+ width: var(--icon-sm);
3224
+ height: var(--icon-sm);
3225
+ }
3226
+
3227
+ .dndev-combobox-chevron {
3228
+ width: var(--icon-md);
3229
+ height: var(--icon-md);
3230
+ opacity: var(--opacity-muted);
3231
+ transition: transform var(--dur-fast) var(--ease-in-out);
3232
+ }
3233
+
3234
+ [data-state='open'] .dndev-combobox-chevron {
3235
+ transform: rotate(180deg);
3236
+ }
3237
+
3238
+ .dndev-combobox-loading-container {
3239
+ display: flex;
3240
+ align-items: center;
3241
+ gap: var(--gap-sm);
3242
+ }
3243
+
3244
+ .dndev-combobox-loading-spinner {
3245
+ width: var(--icon-md);
3246
+ height: var(--icon-md);
3247
+ border-radius: var(--radius-full);
3248
+ border: 2px solid currentColor;
3249
+ border-top-color: transparent;
3250
+ }
3251
+
3252
+ .dndev-combobox-content {
3253
+ width: var(--radix-popover-trigger-width);
3254
+ min-width: var(--radix-popover-trigger-width);
3255
+ max-height: 300px;
3256
+ display: flex;
3257
+ flex-direction: column;
3258
+ padding: 0;
3259
+ }
3260
+
3261
+ .dndev-combobox-search-container {
3262
+ padding: var(--gap-sm);
3263
+ border-bottom: var(--border-width) solid var(--line-2);
3264
+ }
3265
+
3266
+ .dndev-combobox-search-input {
3267
+ width: 100%;
3268
+ }
3269
+
3270
+ .dndev-combobox-list {
3271
+ overflow-y: auto;
3272
+ padding: var(--gap-tight);
3273
+ display: flex;
3274
+ flex-direction: column;
3275
+ gap: var(--gap-none);
3276
+ }
3277
+
3278
+ .dndev-combobox-option {
3279
+ all: unset;
3280
+ display: flex;
3281
+ align-items: center;
3282
+ justify-content: space-between;
3283
+ padding: var(--gap-sm) var(--gap-md);
3284
+ cursor: pointer;
3285
+ border-radius: var(--radius-interactive);
3286
+ transition: background-color var(--dur-fast) var(--ease-in-out);
3287
+ }
3288
+
3289
+ .dndev-combobox-option:disabled {
3290
+ opacity: var(--opacity-muted);
3291
+ cursor: not-allowed;
3292
+ }
3293
+
3294
+ .dndev-combobox-option-highlighted:not(:disabled) {
3295
+ background-color: var(--accent);
3296
+ opacity: var(--opacity-strong);
3297
+ }
3298
+
3299
+ .dndev-combobox-option-selected {
3300
+ font-weight: var(--font-weight-medium);
3301
+ }
3302
+
3303
+ .dndev-combobox-option-content {
3304
+ display: flex;
3305
+ flex-direction: column;
3306
+ gap: var(--gap-tight);
3307
+ flex: 1;
3308
+ }
3309
+
3310
+ .dndev-combobox-option-label {
3311
+ font-size: var(--font-size-sm);
3312
+ color: var(--foreground);
3313
+ }
3314
+
3315
+ .dndev-combobox-option-description {
3316
+ font-size: var(--font-size-xs);
3317
+ color: var(--muted-foreground);
3318
+ }
3319
+
3320
+ .dndev-combobox-option-check {
3321
+ width: var(--icon-md);
3322
+ height: var(--icon-md);
3323
+ color: currentColor;
3324
+ flex-shrink: 0;
3325
+ }
3326
+
3327
+ .dndev-combobox-empty {
3328
+ padding: var(--gap-lg) var(--gap-md);
3329
+ text-align: center;
3330
+ font-size: var(--font-size-sm);
3331
+ color: var(--muted-foreground);
3332
+ }
3333
+
3077
3334
  /* packages/components/src/atomic/DualCard/DualCard.css */
3078
3335
 
3079
3336
  .dndev-dual-card {
@@ -3696,9 +3953,35 @@ em {
3696
3953
  display: grid;
3697
3954
  min-width: 0;
3698
3955
  width: 100%;
3956
+ /* Default: use mobile columns */
3957
+ grid-template-columns: repeat(var(--grid-cols-mobile, 1), 1fr);
3958
+ }
3959
+
3960
+ /* Responsive columns via media queries */
3961
+
3962
+ /* Tablet: 768px+ */
3963
+
3964
+ @media (min-width: 768px) {
3965
+ .dndev-grid-component {
3966
+ grid-template-columns: repeat(var(--grid-cols-tablet, 1), 1fr);
3967
+ }
3699
3968
  }
3700
3969
 
3701
- /* Grid template columns are set via inline styles for maximum flexibility */
3970
+ /* Laptop: 1024px+ (key layout split) */
3971
+
3972
+ @media (min-width: 1024px) {
3973
+ .dndev-grid-component {
3974
+ grid-template-columns: repeat(var(--grid-cols-laptop, 1), 1fr);
3975
+ }
3976
+ }
3977
+
3978
+ /* Desktop: 1440px+ */
3979
+
3980
+ @media (min-width: 1440px) {
3981
+ .dndev-grid-component {
3982
+ grid-template-columns: repeat(var(--grid-cols-desktop, 1), 1fr);
3983
+ }
3984
+ }
3702
3985
 
3703
3986
  /* Spacing from CSS variables */
3704
3987
 
@@ -3843,21 +4126,7 @@ em {
3843
4126
  }
3844
4127
 
3845
4128
  .dndev-hero-subtitle {
3846
- font-size: var(--font-size-xl);
3847
- }
3848
-
3849
- /* Responsive Content Visibility */
3850
-
3851
- @media (width < 1024px) {
3852
- .dndev-hero-section .dndev-desktop-only {
3853
- display: none !important;
3854
- }
3855
- }
3856
-
3857
- @media (width >= 1024px) {
3858
- .dndev-hero-section .dndev-mobile-only {
3859
- display: none !important;
3860
- }
4129
+ font-size: var(--font-size-lg); /* 20px - muted via component */
3861
4130
  }
3862
4131
 
3863
4132
  /* packages/components/src/atomic/HoverCard/HoverCard.css */
@@ -4170,10 +4439,11 @@ em {
4170
4439
  .dndev-list {
4171
4440
  display: flex;
4172
4441
  flex-direction: column;
4173
- gap: var(--gap-none);
4442
+ gap: var(--gap-sm);
4174
4443
  padding-inline-start: 0; /* Controllable via parent/style prop */
4444
+ margin: 0;
4175
4445
  list-style-position: outside;
4176
- /* text-align: inherit from parent (removed hardcoded start) */
4446
+ text-align: start; /* Always start-aligned, even when parent is centered */
4177
4447
  }
4178
4448
 
4179
4449
  .dndev-list[data-gap='none'] {
@@ -4228,29 +4498,18 @@ em {
4228
4498
  font-size: var(--font-size-base);
4229
4499
  }
4230
4500
 
4231
- /* Default: native list items (no flex) - preserves markers */
4501
+ /* Always use flex layout for consistent alignment */
4232
4502
 
4233
4503
  .dndev-list .dndev-list-item {
4234
4504
  font-size: var(--font-size-sm);
4235
- /* No display: flex by default - allows native markers */
4236
-
4237
- /* Modern ::marker styling (2026 best practice) */
4505
+ display: flex;
4506
+ align-items: flex-start;
4507
+ gap: var(--gap-sm);
4508
+ list-style: none; /* Remove native marker */
4509
+ margin-block: 0;
4510
+ padding-inline-start: 0;
4238
4511
  }
4239
4512
 
4240
- :is(.dndev-list .dndev-list-item)::marker {
4241
- color: currentColor;
4242
- }
4243
-
4244
- /* Only use flex when icon is present */
4245
-
4246
- :is(.dndev-list .dndev-list-item):has(.dndev-list-item-icon) {
4247
- display: flex;
4248
- align-items: center; /* Center vertically */
4249
- gap: var(--gap-sm);
4250
- list-style: none; /* Remove native marker when using icon */
4251
- padding-inline-start: 0; /* Reset padding when flex */
4252
- }
4253
-
4254
4513
  :is(.dndev-list .dndev-list-item) .dndev-list-item-icon {
4255
4514
  display: flex;
4256
4515
  align-items: center;
@@ -4605,23 +4864,43 @@ em {
4605
4864
  margin-inline: auto; /* Self-center in parent */
4606
4865
  }
4607
4866
 
4608
- .dndev-radio-group[data-cols='2'] { grid-template-columns: repeat(2, auto); }
4867
+ .dndev-radio-group[data-cols='2'] {
4868
+ grid-template-columns: repeat(2, auto);
4869
+ }
4609
4870
 
4610
- .dndev-radio-group[data-cols='3'] { grid-template-columns: repeat(3, auto); }
4871
+ .dndev-radio-group[data-cols='3'] {
4872
+ grid-template-columns: repeat(3, auto);
4873
+ }
4611
4874
 
4612
- .dndev-radio-group[data-cols='4'] { grid-template-columns: repeat(4, auto); }
4875
+ .dndev-radio-group[data-cols='4'] {
4876
+ grid-template-columns: repeat(4, auto);
4877
+ }
4613
4878
 
4614
- .dndev-radio-group[data-cols='5'] { grid-template-columns: repeat(5, auto); }
4879
+ .dndev-radio-group[data-cols='5'] {
4880
+ grid-template-columns: repeat(5, auto);
4881
+ }
4615
4882
 
4616
- .dndev-radio-group[data-cols='6'] { grid-template-columns: repeat(6, auto); }
4883
+ .dndev-radio-group[data-cols='6'] {
4884
+ grid-template-columns: repeat(6, auto);
4885
+ }
4617
4886
 
4618
- .dndev-radio-group[data-cols='10'] { grid-template-columns: repeat(10, auto); }
4887
+ .dndev-radio-group[data-cols='10'] {
4888
+ grid-template-columns: repeat(10, auto);
4889
+ }
4619
4890
 
4620
- .dndev-radio-group[data-cols='12'] { grid-template-columns: repeat(12, auto); }
4891
+ .dndev-radio-group[data-cols='12'] {
4892
+ grid-template-columns: repeat(12, auto);
4893
+ }
4621
4894
 
4622
- .dndev-radio-group[data-cols='auto-fit'] { grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); width: 100%; }
4895
+ .dndev-radio-group[data-cols='auto-fit'] {
4896
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
4897
+ width: 100%;
4898
+ }
4623
4899
 
4624
- .dndev-radio-group[data-cols='auto-fill'] { grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); width: 100%; }
4900
+ .dndev-radio-group[data-cols='auto-fill'] {
4901
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
4902
+ width: 100%;
4903
+ }
4625
4904
 
4626
4905
  /* Variant colors for checked labels - override base pattern */
4627
4906
 
@@ -4891,36 +5170,26 @@ em {
4891
5170
  }
4892
5171
  }
4893
5172
 
4894
- /* Section title: LG, uppercase, accent pop color, tracking */
5173
+ /* Section title: uppercase, accent color, letter spacing */
4895
5174
 
4896
5175
  .dndev-section-title {
4897
- display: block;
4898
- font-size: var(--font-size-lg);
4899
- font-weight: var(--font-weight-semibold);
4900
5176
  text-transform: uppercase;
4901
5177
  letter-spacing: 0.2em;
4902
- color: var(--accent);
4903
- margin-bottom: var(--gap-lg);
5178
+ color: var(--accent) !important;
5179
+ margin-block-end: var(--gap-md);
4904
5180
  }
4905
5181
 
4906
- /* Grid container with default gap */
4907
-
4908
- .dndev-section-grid {
4909
- display: grid;
4910
- gap: var(--gap-md);
5182
+ .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
5183
+ text-align: start;
4911
5184
  }
4912
5185
 
4913
- .dndev-section-full-width[data-text-align='start'] .dndev-section-content {
4914
- text-align: start;
4915
- }
4916
-
4917
- .dndev-section-full-width[data-text-align='center'] .dndev-section-content {
4918
- text-align: center;
4919
- }
5186
+ .dndev-section-full-width[data-text-align='center'] .dndev-section-title {
5187
+ text-align: center;
5188
+ }
4920
5189
 
4921
- .dndev-section-full-width[data-text-align='end'] .dndev-section-content {
4922
- text-align: end;
4923
- }
5190
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title {
5191
+ text-align: end;
5192
+ }
4924
5193
 
4925
5194
  /* packages/components/src/atomic/Separator/Separator.css */
4926
5195
 
@@ -6073,6 +6342,123 @@ em {
6073
6342
  display: none;
6074
6343
  }
6075
6344
 
6345
+ /* packages/components/src/atomic/Tag/Tag.css */
6346
+
6347
+ .dndev-tag {
6348
+ display: inline-flex;
6349
+ align-items: center;
6350
+ gap: var(--gap-xs);
6351
+ border-radius: var(--radius-full);
6352
+ border: 1px solid transparent;
6353
+ font-size: var(--font-size-sm);
6354
+ font-weight: 500;
6355
+ line-height: 1;
6356
+ white-space: nowrap;
6357
+ transition: all var(--dur-fast) var(--ease-in-out);
6358
+
6359
+ /* Default variant */
6360
+ background-color: var(--secondary);
6361
+ color: var(--secondary-foreground);
6362
+ }
6363
+
6364
+ .dndev-tag .dndev-tag-remove {
6365
+ display: inline-flex;
6366
+ align-items: center;
6367
+ justify-content: center;
6368
+ padding: 0;
6369
+ margin-left: 2px;
6370
+ background: transparent;
6371
+ border: none;
6372
+ cursor: pointer;
6373
+ color: inherit;
6374
+ opacity: 0.7;
6375
+ border-radius: 50%;
6376
+ width: 14px;
6377
+ height: 14px;
6378
+ transition: opacity var(--dur-fast);
6379
+ }
6380
+
6381
+ :is(.dndev-tag .dndev-tag-remove):hover {
6382
+ opacity: 1;
6383
+ background-color: rgba(0, 0, 0, 0.1);
6384
+ }
6385
+
6386
+ :is(.dndev-tag .dndev-tag-remove):focus-visible {
6387
+ outline: 2px solid var(--ring);
6388
+ }
6389
+
6390
+ .dndev-tag .dndev-tag-remove-icon {
6391
+ width: 10px;
6392
+ height: 10px;
6393
+ }
6394
+
6395
+ /* Sizes */
6396
+
6397
+ .dndev-tag-sm {
6398
+ padding: 0.125rem 0.5rem;
6399
+ font-size: var(--font-size-xs);
6400
+ height: 20px;
6401
+ }
6402
+
6403
+ .dndev-tag-md {
6404
+ padding: 0.25rem 0.75rem;
6405
+ font-size: var(--font-size-sm);
6406
+ height: 24px;
6407
+ }
6408
+
6409
+ .dndev-tag-lg {
6410
+ padding: 0.375rem 0.875rem;
6411
+ font-size: var(--font-size-base);
6412
+ height: 32px;
6413
+ }
6414
+
6415
+ /* Variants */
6416
+
6417
+ .dndev-tag-outline {
6418
+ background-color: transparent;
6419
+ border-color: var(--border);
6420
+ color: var(--foreground);
6421
+ }
6422
+
6423
+ .dndev-tag-accent {
6424
+ background-color: var(--accent);
6425
+ color: var(--accent-foreground);
6426
+ border-color: transparent;
6427
+ }
6428
+
6429
+ /* Interactive States */
6430
+
6431
+ .dndev-tag-interactive {
6432
+ cursor: pointer;
6433
+ -webkit-user-select: none;
6434
+ -moz-user-select: none;
6435
+ user-select: none;
6436
+ }
6437
+
6438
+ .dndev-tag-interactive:hover {
6439
+ opacity: 0.8;
6440
+ }
6441
+
6442
+ .dndev-tag-interactive:focus-visible {
6443
+ outline: 2px solid var(--ring);
6444
+ outline-offset: 2px;
6445
+ }
6446
+
6447
+ .dndev-tag-disabled {
6448
+ pointer-events: none;
6449
+ opacity: 0.5;
6450
+ }
6451
+
6452
+ .dndev-tag-sm .dndev-tag-remove-icon {
6453
+ width: 8px;
6454
+ height: 8px;
6455
+ }
6456
+
6457
+ .dndev-tag-lg .dndev-tag-remove-icon {
6458
+ width: 12px;
6459
+ height: 12px;
6460
+ }
6461
+
6076
6462
  /* packages/components/src/atomic/Text/Text.css */
6077
6463
 
6078
6464
  .dndev-text-base[data-text-align='start'] {
@@ -6088,13 +6474,13 @@ em {
6088
6474
  }
6089
6475
 
6090
6476
  .dndev-text-base {
6091
- font-weight: 500;
6477
+ font-weight: var(--font-weight-medium);
6092
6478
  line-height: var(--line-height);
6093
6479
  background-color: transparent; /* Text never has background, only color changes */
6094
6480
  }
6095
6481
 
6096
6482
  .dndev-text-base[data-variant='default'] {
6097
- color: var(--foreground);
6483
+ color: inherit;
6098
6484
  }
6099
6485
 
6100
6486
  .dndev-text-base[data-variant='muted'] {
@@ -6125,28 +6511,35 @@ em {
6125
6511
  color: var(--destructive);
6126
6512
  }
6127
6513
 
6514
+ .dndev-text-base[data-variant='code'] {
6515
+ font-family: var(--font-mono);
6516
+ font-size: 0.9em;
6517
+ background: var(--muted);
6518
+ padding: 0.1em 0.4em;
6519
+ border-radius: var(--radius-interactive);
6520
+ }
6521
+
6128
6522
  /* Level overrides */
6129
6523
 
6130
6524
  .dndev-text-base[data-level='h1'] {
6131
6525
  font-size: var(--font-size-3xl);
6132
- font-weight: 700;
6526
+ font-weight: var(--font-weight-bold);
6133
6527
  letter-spacing: -0.02em;
6134
6528
  }
6135
6529
 
6136
6530
  .dndev-text-base[data-level='h2'] {
6137
- font-size: var(--font-size-2xl);
6138
- font-weight: 700;
6139
- letter-spacing: -0.01em;
6531
+ font-size: var(--font-size-lg);
6532
+ font-weight: var(--font-weight-semibold);
6140
6533
  }
6141
6534
 
6142
6535
  .dndev-text-base[data-level='h3'] {
6143
- font-size: var(--font-size-xl);
6144
- font-weight: 600;
6536
+ font-size: var(--font-size-lg);
6537
+ font-weight: var(--font-weight-semibold);
6145
6538
  }
6146
6539
 
6147
6540
  .dndev-text-base[data-level='h4'] {
6148
- font-size: var(--font-size-lg);
6149
- font-weight: 600;
6541
+ font-size: var(--font-size-base);
6542
+ font-weight: var(--font-weight-medium);
6150
6543
  }
6151
6544
 
6152
6545
  .dndev-text-base[data-level='body'] {
@@ -6510,6 +6903,14 @@ em {
6510
6903
  display: block;
6511
6904
  }
6512
6905
 
6906
+ /* SVG placeholder - zero bytes, instant render */
6907
+
6908
+ .dndev-video-placeholder {
6909
+ width: 100%;
6910
+ height: 100%;
6911
+ display: block;
6912
+ }
6913
+
6513
6914
  /* Play button overlay */
6514
6915
 
6515
6916
  .dndev-video-play-overlay {
@@ -7430,6 +7831,40 @@ h4[data-variant='code'] {
7430
7831
  border: 0;
7431
7832
  }
7432
7833
 
7834
+ /* ===========================
7835
+ PROSE - SEMANTIC TYPOGRAPHY FOR CONTENT PAGES
7836
+ Wrap docs/markdown/article content in .prose for semantic margins
7837
+ Components are unaffected - they own their own spacing
7838
+ =========================== */
7839
+
7840
+ .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7841
+ margin-block: var(--gap-md);
7842
+ }
7843
+
7844
+ .prose p {
7845
+ margin-block: var(--gap-md);
7846
+ }
7847
+
7848
+ .prose ul,.prose ol {
7849
+ padding-inline-start: var(--gap-lg);
7850
+ margin-block: var(--gap-md);
7851
+ }
7852
+
7853
+ .prose li {
7854
+ margin-block: var(--gap-sm);
7855
+ padding-inline-start: var(--gap-sm);
7856
+ }
7857
+
7858
+ /* First/last child: remove top/bottom margin for clean container edges */
7859
+
7860
+ .prose > :first-child {
7861
+ margin-block-start: 0;
7862
+ }
7863
+
7864
+ .prose > :last-child {
7865
+ margin-block-end: 0;
7866
+ }
7867
+
7433
7868
  /* ===========================
7434
7869
  SHADOW CONTROL (Universal)
7435
7870
  Works with any element
@@ -7867,18 +8302,20 @@ main[role='main'][data-routing-animation='none'] {
7867
8302
  display: grid;
7868
8303
  /* ONE DRY grid structure: 3 rows, 2 columns */
7869
8304
  /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
8305
+ /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
8306
+ implement ResizeObserver to update --footer-height dynamically. */
7870
8307
  grid-template-areas:
7871
8308
  'header header'
7872
8309
  'sidebar main'
7873
8310
  'footer footer';
7874
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
8311
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7875
8312
  grid-template-columns: var(--sidebar-width) 1fr;
7876
8313
 
7877
8314
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
7878
8315
  }
7879
8316
 
7880
8317
  [data-layout='game']:root .dndev-layout {
7881
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
8318
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7882
8319
  }
7883
8320
 
7884
8321
  /* ===========================
@@ -8230,7 +8667,7 @@ footer[role='contentinfo'] {
8230
8667
  grid-area: footer;
8231
8668
  box-sizing: border-box;
8232
8669
  grid-column: 1 / -1;
8233
- height: var(--footer-height);
8670
+ min-height: var(--footer-height);
8234
8671
  z-index: var(--z-footer);
8235
8672
 
8236
8673
  /* Theme-aware styling - 100% controlled by theme system */