@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
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 */
566
+ /* Main element - no focus outline (programmatic focus for keyboard nav) */
551
567
 
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
- }
574
-
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 */
@@ -1059,12 +1069,13 @@ em {
1059
1069
  }
1060
1070
 
1061
1071
  .dndev-surface[data-variant='glass'] {
1062
- background: color-mix(in oklab, var(--card) 40%, transparent);
1063
- backdrop-filter: blur(12px);
1064
- -webkit-backdrop-filter: blur(12px);
1072
+ background: color-mix(in oklab, var(--card) 55%, transparent);
1073
+ backdrop-filter: blur(20px) saturate(180%);
1074
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
1065
1075
  border: var(--border-hairline) solid
1066
- color-mix(in oklab, var(--card-foreground) 15%, transparent);
1067
- box-shadow: var(--shadow-lg);
1076
+ color-mix(in oklab, var(--card-foreground) 25%, transparent);
1077
+ box-shadow: var(--shadow-lg),
1078
+ inset 0 1px 0 0 color-mix(in oklab, var(--card-foreground) 10%, transparent);
1068
1079
  }
1069
1080
 
1070
1081
  /* Separator style */
@@ -2134,6 +2145,7 @@ em {
2134
2145
  background: transparent;
2135
2146
  color: inherit;
2136
2147
  font-size: var(--font-size-base);
2148
+ font-weight: var(--font-weight-medium);
2137
2149
  }
2138
2150
 
2139
2151
  .dndev-interactive[data-role='accordion-trigger']:hover {
@@ -2158,6 +2170,7 @@ em {
2158
2170
  transition: all var(--dur-fast) var(--ease-in-out);
2159
2171
  width: 100%;
2160
2172
  min-width: 0;
2173
+ text-align: start;
2161
2174
  }
2162
2175
 
2163
2176
  .dndev-accordion-content[data-state='closed'] {
@@ -2369,14 +2382,15 @@ em {
2369
2382
  margin-top: var(--gap-md);
2370
2383
  }
2371
2384
 
2372
- /* Tech card */
2385
+ /* Tech card - override Card's grid layout for centered content */
2373
2386
 
2374
2387
  .dndev-tech-card {
2375
2388
  height: 100%;
2376
2389
  min-height: 120px;
2377
- display: flex;
2390
+ display: flex !important; /* Override Card's grid layout */
2378
2391
  align-items: center;
2379
2392
  justify-content: center;
2393
+ align-content: center; /* Override Card's align-content: start */
2380
2394
  transition:
2381
2395
  border-color 0.2s ease,
2382
2396
  box-shadow 0.2s ease;
@@ -2486,7 +2500,8 @@ em {
2486
2500
  border-inline-end: none;
2487
2501
  border-block-start: none;
2488
2502
  border-block-end: none;
2489
- border-radius: var(--radius-interactive) var(--radius-surface) var(--radius-surface) var(--radius-interactive);
2503
+ border-radius: var(--radius-interactive) var(--radius-surface)
2504
+ var(--radius-surface) var(--radius-interactive);
2490
2505
  overflow: hidden;
2491
2506
  }
2492
2507
 
@@ -2888,13 +2903,41 @@ em {
2888
2903
  /* packages/components/src/atomic/CallToAction/CallToAction.css */
2889
2904
 
2890
2905
  .dndev-cta {
2891
- /* Full width gradient */
2892
- background: linear-gradient(to right, var(--secondary), var(--background));
2893
2906
  color: var(--foreground);
2894
2907
  /* Padding for background - vertical only, horizontal handled by content */
2895
2908
  padding-block: var(--gap-lg);
2896
2909
  }
2897
2910
 
2911
+ /* Tone variants - leverage existing data-tone system */
2912
+
2913
+ /* Ghost (default) - no background */
2914
+
2915
+ .dndev-cta[data-tone='ghost'],
2916
+ .dndev-cta:not([data-tone]) {
2917
+ background: transparent;
2918
+ }
2919
+
2920
+ .dndev-cta[data-tone='base'] {
2921
+ background: var(--background);
2922
+ }
2923
+
2924
+ .dndev-cta[data-tone='muted'] {
2925
+ background: var(--muted);
2926
+ }
2927
+
2928
+ .dndev-cta[data-tone='elevated'] {
2929
+ background: var(--background);
2930
+ }
2931
+
2932
+ .dndev-cta[data-tone='contrast'] {
2933
+ background: var(--foreground);
2934
+ color: var(--background);
2935
+ }
2936
+
2937
+ .dndev-cta[data-tone='accent'] {
2938
+ background: color-mix(in oklab, var(--accent) 5%, transparent);
2939
+ }
2940
+
2898
2941
  .dndev-cta-content {
2899
2942
  display: flex;
2900
2943
  flex-direction: column;
@@ -2975,19 +3018,36 @@ em {
2975
3018
  .dndev-card {
2976
3019
  display: grid;
2977
3020
  gap: var(--gap-md);
3021
+ text-align: start;
3022
+ align-content: start;
3023
+ }
3024
+
3025
+ .dndev-card-header {
3026
+ display: flex;
3027
+ flex-direction: column;
3028
+ }
3029
+
3030
+ .dndev-card-header > .dndev-stack {
3031
+ min-width: 0;
3032
+ }
3033
+
3034
+ .dndev-card-header > .dndev-stack > .dndev-card-title {
3035
+ flex: 1;
3036
+ min-width: 0;
2978
3037
  }
2979
3038
 
2980
3039
  .dndev-card-title {
2981
- font-size: var(--font-size-xl);
2982
- font-weight: 600;
2983
- color: inherit; /* Inherit from surface variant */
2984
3040
  margin: 0;
3041
+ min-width: 0;
3042
+ word-wrap: break-word;
2985
3043
  }
2986
3044
 
2987
- .dndev-card-subtitle {
2988
- font-size: var(--font-size-base);
2989
- font-weight: 600;
2990
- color: inherit; /* Inherit from surface variant */
3045
+ .dndev-surface .dndev-card-subtitle {
3046
+ margin-top: 0;
3047
+ margin-bottom: 0;
3048
+ min-width: 0;
3049
+ word-wrap: break-word;
3050
+ color: color-mix(in oklab, var(--card-foreground) 70%, transparent);
2991
3051
  }
2992
3052
 
2993
3053
  /* packages/components/src/atomic/Checkbox/Checkbox.css */
@@ -3078,6 +3138,203 @@ em {
3078
3138
  }
3079
3139
  }
3080
3140
 
3141
+ /* packages/components/src/atomic/Collapsible/Collapsible.css */
3142
+
3143
+ .dndev-collapsible {
3144
+ width: 100%;
3145
+ display: flex;
3146
+ flex-direction: column;
3147
+ }
3148
+
3149
+ .dndev-collapsible-content {
3150
+ overflow: hidden;
3151
+ width: 100%;
3152
+ }
3153
+
3154
+ .dndev-collapsible-content[data-state='open'] {
3155
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
3156
+ }
3157
+
3158
+ .dndev-collapsible-content[data-state='closed'] {
3159
+ animation: slideUp var(--dur-normal) var(--ease-in-out);
3160
+ }
3161
+
3162
+ @keyframes slideDown {
3163
+ from {
3164
+ height: 0;
3165
+ }
3166
+ to {
3167
+ height: var(--radix-collapsible-content-height);
3168
+ }
3169
+ }
3170
+
3171
+ @keyframes slideUp {
3172
+ from {
3173
+ height: var(--radix-collapsible-content-height);
3174
+ }
3175
+ to {
3176
+ height: 0;
3177
+ }
3178
+ }
3179
+
3180
+ /* packages/components/src/atomic/Combobox/Combobox.css */
3181
+
3182
+ .dndev-combobox-trigger {
3183
+ display: flex;
3184
+ justify-content: space-between;
3185
+ align-items: center;
3186
+ width: 100%;
3187
+ text-align: left;
3188
+ }
3189
+
3190
+ .dndev-combobox-trigger button {
3191
+ display: flex;
3192
+ justify-content: space-between;
3193
+ align-items: center;
3194
+ width: 100%;
3195
+ }
3196
+
3197
+ .dndev-combobox-placeholder {
3198
+ opacity: var(--opacity-muted);
3199
+ }
3200
+
3201
+ .dndev-combobox-trigger-icons {
3202
+ display: flex;
3203
+ align-items: center;
3204
+ gap: var(--gap-tight);
3205
+ margin-inline-start: auto;
3206
+ }
3207
+
3208
+ .dndev-combobox-clear {
3209
+ display: flex;
3210
+ align-items: center;
3211
+ justify-content: center;
3212
+ cursor: pointer;
3213
+ opacity: var(--opacity-muted);
3214
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3215
+ -webkit-user-select: none;
3216
+ -moz-user-select: none;
3217
+ user-select: none;
3218
+ }
3219
+
3220
+ .dndev-combobox-clear:hover,
3221
+ .dndev-combobox-clear:focus {
3222
+ opacity: 1;
3223
+ outline: none;
3224
+ }
3225
+
3226
+ .dndev-combobox-clear svg {
3227
+ width: var(--icon-sm);
3228
+ height: var(--icon-sm);
3229
+ }
3230
+
3231
+ .dndev-combobox-chevron {
3232
+ width: var(--icon-md);
3233
+ height: var(--icon-md);
3234
+ opacity: var(--opacity-muted);
3235
+ transition: transform var(--dur-fast) var(--ease-in-out);
3236
+ }
3237
+
3238
+ [data-state='open'] .dndev-combobox-chevron {
3239
+ transform: rotate(180deg);
3240
+ }
3241
+
3242
+ .dndev-combobox-loading-container {
3243
+ display: flex;
3244
+ align-items: center;
3245
+ gap: var(--gap-sm);
3246
+ }
3247
+
3248
+ .dndev-combobox-loading-spinner {
3249
+ width: var(--icon-md);
3250
+ height: var(--icon-md);
3251
+ border-radius: var(--radius-full);
3252
+ border: 2px solid currentColor;
3253
+ border-top-color: transparent;
3254
+ }
3255
+
3256
+ .dndev-combobox-content {
3257
+ width: var(--radix-popover-trigger-width);
3258
+ min-width: var(--radix-popover-trigger-width);
3259
+ max-height: 300px;
3260
+ display: flex;
3261
+ flex-direction: column;
3262
+ padding: 0;
3263
+ }
3264
+
3265
+ .dndev-combobox-search-container {
3266
+ padding: var(--gap-sm);
3267
+ border-bottom: var(--border-width) solid var(--line-2);
3268
+ }
3269
+
3270
+ .dndev-combobox-search-input {
3271
+ width: 100%;
3272
+ }
3273
+
3274
+ .dndev-combobox-list {
3275
+ overflow-y: auto;
3276
+ padding: var(--gap-tight);
3277
+ display: flex;
3278
+ flex-direction: column;
3279
+ gap: var(--gap-none);
3280
+ }
3281
+
3282
+ .dndev-combobox-option {
3283
+ all: unset;
3284
+ display: flex;
3285
+ align-items: center;
3286
+ justify-content: space-between;
3287
+ padding: var(--gap-sm) var(--gap-md);
3288
+ cursor: pointer;
3289
+ border-radius: var(--radius-interactive);
3290
+ transition: background-color var(--dur-fast) var(--ease-in-out);
3291
+ }
3292
+
3293
+ .dndev-combobox-option:disabled {
3294
+ opacity: var(--opacity-muted);
3295
+ cursor: not-allowed;
3296
+ }
3297
+
3298
+ .dndev-combobox-option-highlighted:not(:disabled) {
3299
+ background-color: var(--accent);
3300
+ opacity: var(--opacity-strong);
3301
+ }
3302
+
3303
+ .dndev-combobox-option-selected {
3304
+ font-weight: var(--font-weight-medium);
3305
+ }
3306
+
3307
+ .dndev-combobox-option-content {
3308
+ display: flex;
3309
+ flex-direction: column;
3310
+ gap: var(--gap-tight);
3311
+ flex: 1;
3312
+ }
3313
+
3314
+ .dndev-combobox-option-label {
3315
+ font-size: var(--font-size-sm);
3316
+ color: var(--foreground);
3317
+ }
3318
+
3319
+ .dndev-combobox-option-description {
3320
+ font-size: var(--font-size-xs);
3321
+ color: var(--muted-foreground);
3322
+ }
3323
+
3324
+ .dndev-combobox-option-check {
3325
+ width: var(--icon-md);
3326
+ height: var(--icon-md);
3327
+ color: currentColor;
3328
+ flex-shrink: 0;
3329
+ }
3330
+
3331
+ .dndev-combobox-empty {
3332
+ padding: var(--gap-lg) var(--gap-md);
3333
+ text-align: center;
3334
+ font-size: var(--font-size-sm);
3335
+ color: var(--muted-foreground);
3336
+ }
3337
+
3081
3338
  /* packages/components/src/atomic/DualCard/DualCard.css */
3082
3339
 
3083
3340
  .dndev-dual-card {
@@ -3700,9 +3957,35 @@ em {
3700
3957
  display: grid;
3701
3958
  min-width: 0;
3702
3959
  width: 100%;
3960
+ /* Default: use mobile columns */
3961
+ grid-template-columns: repeat(var(--grid-cols-mobile, 1), 1fr);
3962
+ }
3963
+
3964
+ /* Responsive columns via media queries */
3965
+
3966
+ /* Tablet: 768px+ */
3967
+
3968
+ @media (min-width: 768px) {
3969
+ .dndev-grid-component {
3970
+ grid-template-columns: repeat(var(--grid-cols-tablet, 1), 1fr);
3971
+ }
3703
3972
  }
3704
3973
 
3705
- /* Grid template columns are set via inline styles for maximum flexibility */
3974
+ /* Laptop: 1024px+ (key layout split) */
3975
+
3976
+ @media (min-width: 1024px) {
3977
+ .dndev-grid-component {
3978
+ grid-template-columns: repeat(var(--grid-cols-laptop, 1), 1fr);
3979
+ }
3980
+ }
3981
+
3982
+ /* Desktop: 1440px+ */
3983
+
3984
+ @media (min-width: 1440px) {
3985
+ .dndev-grid-component {
3986
+ grid-template-columns: repeat(var(--grid-cols-desktop, 1), 1fr);
3987
+ }
3988
+ }
3706
3989
 
3707
3990
  /* Spacing from CSS variables */
3708
3991
 
@@ -3847,21 +4130,7 @@ em {
3847
4130
  }
3848
4131
 
3849
4132
  .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
- }
4133
+ font-size: var(--font-size-lg); /* 20px - muted via component */
3865
4134
  }
3866
4135
 
3867
4136
  /* packages/components/src/atomic/HoverCard/HoverCard.css */
@@ -4174,10 +4443,11 @@ em {
4174
4443
  .dndev-list {
4175
4444
  display: flex;
4176
4445
  flex-direction: column;
4177
- gap: var(--gap-none);
4446
+ gap: var(--gap-sm);
4178
4447
  padding-inline-start: 0; /* Controllable via parent/style prop */
4448
+ margin: 0;
4179
4449
  list-style-position: outside;
4180
- /* text-align: inherit from parent (removed hardcoded start) */
4450
+ text-align: start; /* Always start-aligned, even when parent is centered */
4181
4451
  }
4182
4452
 
4183
4453
  .dndev-list[data-gap='none'] {
@@ -4232,29 +4502,18 @@ em {
4232
4502
  font-size: var(--font-size-base);
4233
4503
  }
4234
4504
 
4235
- /* Default: native list items (no flex) - preserves markers */
4505
+ /* Always use flex layout for consistent alignment */
4236
4506
 
4237
4507
  .dndev-list .dndev-list-item {
4238
4508
  font-size: var(--font-size-sm);
4239
- /* No display: flex by default - allows native markers */
4240
-
4241
- /* Modern ::marker styling (2026 best practice) */
4509
+ display: flex;
4510
+ align-items: flex-start;
4511
+ gap: var(--gap-sm);
4512
+ list-style: none; /* Remove native marker */
4513
+ margin-block: 0;
4514
+ padding-inline-start: 0;
4242
4515
  }
4243
4516
 
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
4517
  :is(.dndev-list .dndev-list-item) .dndev-list-item-icon {
4259
4518
  display: flex;
4260
4519
  align-items: center;
@@ -4609,23 +4868,43 @@ em {
4609
4868
  margin-inline: auto; /* Self-center in parent */
4610
4869
  }
4611
4870
 
4612
- .dndev-radio-group[data-cols='2'] { grid-template-columns: repeat(2, auto); }
4871
+ .dndev-radio-group[data-cols='2'] {
4872
+ grid-template-columns: repeat(2, auto);
4873
+ }
4613
4874
 
4614
- .dndev-radio-group[data-cols='3'] { grid-template-columns: repeat(3, auto); }
4875
+ .dndev-radio-group[data-cols='3'] {
4876
+ grid-template-columns: repeat(3, auto);
4877
+ }
4615
4878
 
4616
- .dndev-radio-group[data-cols='4'] { grid-template-columns: repeat(4, auto); }
4879
+ .dndev-radio-group[data-cols='4'] {
4880
+ grid-template-columns: repeat(4, auto);
4881
+ }
4617
4882
 
4618
- .dndev-radio-group[data-cols='5'] { grid-template-columns: repeat(5, auto); }
4883
+ .dndev-radio-group[data-cols='5'] {
4884
+ grid-template-columns: repeat(5, auto);
4885
+ }
4619
4886
 
4620
- .dndev-radio-group[data-cols='6'] { grid-template-columns: repeat(6, auto); }
4887
+ .dndev-radio-group[data-cols='6'] {
4888
+ grid-template-columns: repeat(6, auto);
4889
+ }
4621
4890
 
4622
- .dndev-radio-group[data-cols='10'] { grid-template-columns: repeat(10, auto); }
4891
+ .dndev-radio-group[data-cols='10'] {
4892
+ grid-template-columns: repeat(10, auto);
4893
+ }
4623
4894
 
4624
- .dndev-radio-group[data-cols='12'] { grid-template-columns: repeat(12, auto); }
4895
+ .dndev-radio-group[data-cols='12'] {
4896
+ grid-template-columns: repeat(12, auto);
4897
+ }
4625
4898
 
4626
- .dndev-radio-group[data-cols='auto-fit'] { grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr)); width: 100%; }
4899
+ .dndev-radio-group[data-cols='auto-fit'] {
4900
+ grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
4901
+ width: 100%;
4902
+ }
4627
4903
 
4628
- .dndev-radio-group[data-cols='auto-fill'] { grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); width: 100%; }
4904
+ .dndev-radio-group[data-cols='auto-fill'] {
4905
+ grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
4906
+ width: 100%;
4907
+ }
4629
4908
 
4630
4909
  /* Variant colors for checked labels - override base pattern */
4631
4910
 
@@ -4895,36 +5174,26 @@ em {
4895
5174
  }
4896
5175
  }
4897
5176
 
4898
- /* Section title: LG, uppercase, accent pop color, tracking */
5177
+ /* Section title: uppercase, accent color, letter spacing */
4899
5178
 
4900
5179
  .dndev-section-title {
4901
- display: block;
4902
- font-size: var(--font-size-lg);
4903
- font-weight: var(--font-weight-semibold);
4904
5180
  text-transform: uppercase;
4905
5181
  letter-spacing: 0.2em;
4906
- color: var(--accent);
4907
- margin-bottom: var(--gap-lg);
5182
+ color: var(--accent) !important;
5183
+ margin-block-end: var(--gap-md);
4908
5184
  }
4909
5185
 
4910
- /* Grid container with default gap */
4911
-
4912
- .dndev-section-grid {
4913
- display: grid;
4914
- gap: var(--gap-md);
5186
+ .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
5187
+ text-align: start;
4915
5188
  }
4916
5189
 
4917
- .dndev-section-full-width[data-text-align='start'] .dndev-section-content {
4918
- text-align: start;
4919
- }
4920
-
4921
- .dndev-section-full-width[data-text-align='center'] .dndev-section-content {
4922
- text-align: center;
4923
- }
5190
+ .dndev-section-full-width[data-text-align='center'] .dndev-section-title {
5191
+ text-align: center;
5192
+ }
4924
5193
 
4925
- .dndev-section-full-width[data-text-align='end'] .dndev-section-content {
4926
- text-align: end;
4927
- }
5194
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title {
5195
+ text-align: end;
5196
+ }
4928
5197
 
4929
5198
  /* packages/components/src/atomic/Separator/Separator.css */
4930
5199
 
@@ -6077,6 +6346,123 @@ em {
6077
6346
  display: none;
6078
6347
  }
6079
6348
 
6349
+ /* packages/components/src/atomic/Tag/Tag.css */
6350
+
6351
+ .dndev-tag {
6352
+ display: inline-flex;
6353
+ align-items: center;
6354
+ gap: var(--gap-xs);
6355
+ border-radius: var(--radius-full);
6356
+ border: 1px solid transparent;
6357
+ font-size: var(--font-size-sm);
6358
+ font-weight: 500;
6359
+ line-height: 1;
6360
+ white-space: nowrap;
6361
+ transition: all var(--dur-fast) var(--ease-in-out);
6362
+
6363
+ /* Default variant */
6364
+ background-color: var(--secondary);
6365
+ color: var(--secondary-foreground);
6366
+ }
6367
+
6368
+ .dndev-tag .dndev-tag-remove {
6369
+ display: inline-flex;
6370
+ align-items: center;
6371
+ justify-content: center;
6372
+ padding: 0;
6373
+ margin-left: 2px;
6374
+ background: transparent;
6375
+ border: none;
6376
+ cursor: pointer;
6377
+ color: inherit;
6378
+ opacity: 0.7;
6379
+ border-radius: 50%;
6380
+ width: 14px;
6381
+ height: 14px;
6382
+ transition: opacity var(--dur-fast);
6383
+ }
6384
+
6385
+ :is(.dndev-tag .dndev-tag-remove):hover {
6386
+ opacity: 1;
6387
+ background-color: rgba(0, 0, 0, 0.1);
6388
+ }
6389
+
6390
+ :is(.dndev-tag .dndev-tag-remove):focus-visible {
6391
+ outline: 2px solid var(--ring);
6392
+ }
6393
+
6394
+ .dndev-tag .dndev-tag-remove-icon {
6395
+ width: 10px;
6396
+ height: 10px;
6397
+ }
6398
+
6399
+ /* Sizes */
6400
+
6401
+ .dndev-tag-sm {
6402
+ padding: 0.125rem 0.5rem;
6403
+ font-size: var(--font-size-xs);
6404
+ height: 20px;
6405
+ }
6406
+
6407
+ .dndev-tag-md {
6408
+ padding: 0.25rem 0.75rem;
6409
+ font-size: var(--font-size-sm);
6410
+ height: 24px;
6411
+ }
6412
+
6413
+ .dndev-tag-lg {
6414
+ padding: 0.375rem 0.875rem;
6415
+ font-size: var(--font-size-base);
6416
+ height: 32px;
6417
+ }
6418
+
6419
+ /* Variants */
6420
+
6421
+ .dndev-tag-outline {
6422
+ background-color: transparent;
6423
+ border-color: var(--border);
6424
+ color: var(--foreground);
6425
+ }
6426
+
6427
+ .dndev-tag-accent {
6428
+ background-color: var(--accent);
6429
+ color: var(--accent-foreground);
6430
+ border-color: transparent;
6431
+ }
6432
+
6433
+ /* Interactive States */
6434
+
6435
+ .dndev-tag-interactive {
6436
+ cursor: pointer;
6437
+ -webkit-user-select: none;
6438
+ -moz-user-select: none;
6439
+ user-select: none;
6440
+ }
6441
+
6442
+ .dndev-tag-interactive:hover {
6443
+ opacity: 0.8;
6444
+ }
6445
+
6446
+ .dndev-tag-interactive:focus-visible {
6447
+ outline: 2px solid var(--ring);
6448
+ outline-offset: 2px;
6449
+ }
6450
+
6451
+ .dndev-tag-disabled {
6452
+ pointer-events: none;
6453
+ opacity: 0.5;
6454
+ }
6455
+
6456
+ .dndev-tag-sm .dndev-tag-remove-icon {
6457
+ width: 8px;
6458
+ height: 8px;
6459
+ }
6460
+
6461
+ .dndev-tag-lg .dndev-tag-remove-icon {
6462
+ width: 12px;
6463
+ height: 12px;
6464
+ }
6465
+
6080
6466
  /* packages/components/src/atomic/Text/Text.css */
6081
6467
 
6082
6468
  .dndev-text-base[data-text-align='start'] {
@@ -6092,13 +6478,13 @@ em {
6092
6478
  }
6093
6479
 
6094
6480
  .dndev-text-base {
6095
- font-weight: 500;
6481
+ font-weight: var(--font-weight-medium);
6096
6482
  line-height: var(--line-height);
6097
6483
  background-color: transparent; /* Text never has background, only color changes */
6098
6484
  }
6099
6485
 
6100
6486
  .dndev-text-base[data-variant='default'] {
6101
- color: var(--foreground);
6487
+ color: inherit;
6102
6488
  }
6103
6489
 
6104
6490
  .dndev-text-base[data-variant='muted'] {
@@ -6129,28 +6515,35 @@ em {
6129
6515
  color: var(--destructive);
6130
6516
  }
6131
6517
 
6518
+ .dndev-text-base[data-variant='code'] {
6519
+ font-family: var(--font-mono);
6520
+ font-size: 0.9em;
6521
+ background: var(--muted);
6522
+ padding: 0.1em 0.4em;
6523
+ border-radius: var(--radius-interactive);
6524
+ }
6525
+
6132
6526
  /* Level overrides */
6133
6527
 
6134
6528
  .dndev-text-base[data-level='h1'] {
6135
6529
  font-size: var(--font-size-3xl);
6136
- font-weight: 700;
6530
+ font-weight: var(--font-weight-bold);
6137
6531
  letter-spacing: -0.02em;
6138
6532
  }
6139
6533
 
6140
6534
  .dndev-text-base[data-level='h2'] {
6141
- font-size: var(--font-size-2xl);
6142
- font-weight: 700;
6143
- letter-spacing: -0.01em;
6535
+ font-size: var(--font-size-lg);
6536
+ font-weight: var(--font-weight-semibold);
6144
6537
  }
6145
6538
 
6146
6539
  .dndev-text-base[data-level='h3'] {
6147
- font-size: var(--font-size-xl);
6148
- font-weight: 600;
6540
+ font-size: var(--font-size-lg);
6541
+ font-weight: var(--font-weight-semibold);
6149
6542
  }
6150
6543
 
6151
6544
  .dndev-text-base[data-level='h4'] {
6152
- font-size: var(--font-size-lg);
6153
- font-weight: 600;
6545
+ font-size: var(--font-size-base);
6546
+ font-weight: var(--font-weight-medium);
6154
6547
  }
6155
6548
 
6156
6549
  .dndev-text-base[data-level='body'] {
@@ -6514,6 +6907,14 @@ em {
6514
6907
  display: block;
6515
6908
  }
6516
6909
 
6910
+ /* SVG placeholder - zero bytes, instant render */
6911
+
6912
+ .dndev-video-placeholder {
6913
+ width: 100%;
6914
+ height: 100%;
6915
+ display: block;
6916
+ }
6917
+
6517
6918
  /* Play button overlay */
6518
6919
 
6519
6920
  .dndev-video-play-overlay {
@@ -7434,6 +7835,40 @@ h4[data-variant='code'] {
7434
7835
  border: 0;
7435
7836
  }
7436
7837
 
7838
+ /* ===========================
7839
+ PROSE - SEMANTIC TYPOGRAPHY FOR CONTENT PAGES
7840
+ Wrap docs/markdown/article content in .prose for semantic margins
7841
+ Components are unaffected - they own their own spacing
7842
+ =========================== */
7843
+
7844
+ .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7845
+ margin-block: var(--gap-md);
7846
+ }
7847
+
7848
+ .prose p {
7849
+ margin-block: var(--gap-md);
7850
+ }
7851
+
7852
+ .prose ul,.prose ol {
7853
+ padding-inline-start: var(--gap-lg);
7854
+ margin-block: var(--gap-md);
7855
+ }
7856
+
7857
+ .prose li {
7858
+ margin-block: var(--gap-sm);
7859
+ padding-inline-start: var(--gap-sm);
7860
+ }
7861
+
7862
+ /* First/last child: remove top/bottom margin for clean container edges */
7863
+
7864
+ .prose > :first-child {
7865
+ margin-block-start: 0;
7866
+ }
7867
+
7868
+ .prose > :last-child {
7869
+ margin-block-end: 0;
7870
+ }
7871
+
7437
7872
  /* ===========================
7438
7873
  SHADOW CONTROL (Universal)
7439
7874
  Works with any element
@@ -7871,18 +8306,20 @@ main[role='main'][data-routing-animation='none'] {
7871
8306
  display: grid;
7872
8307
  /* ONE DRY grid structure: 3 rows, 2 columns */
7873
8308
  /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
8309
+ /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
8310
+ implement ResizeObserver to update --footer-height dynamically. */
7874
8311
  grid-template-areas:
7875
8312
  'header header'
7876
8313
  'sidebar main'
7877
8314
  'footer footer';
7878
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
8315
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7879
8316
  grid-template-columns: var(--sidebar-width) 1fr;
7880
8317
 
7881
8318
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
7882
8319
  }
7883
8320
 
7884
8321
  [data-layout='game']:root .dndev-layout {
7885
- grid-template-rows: var(--header-height) 1fr var(--footer-height);
8322
+ grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
7886
8323
  }
7887
8324
 
7888
8325
  /* ===========================
@@ -8234,7 +8671,7 @@ footer[role='contentinfo'] {
8234
8671
  grid-area: footer;
8235
8672
  box-sizing: border-box;
8236
8673
  grid-column: 1 / -1;
8237
- height: var(--footer-height);
8674
+ min-height: var(--footer-height);
8238
8675
  z-index: var(--z-footer);
8239
8676
 
8240
8677
  /* Theme-aware styling - 100% controlled by theme system */