@donotdev/ui 0.0.6 → 0.0.8

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 (55) hide show
  1. package/assets/fonts/fonts.css +4 -4
  2. package/dist/components/auth/AuthHeader.d.ts +5 -0
  3. package/dist/components/auth/AuthHeader.d.ts.map +1 -1
  4. package/dist/components/auth/AuthHeader.js +22 -8
  5. package/dist/components/auth/AuthMenu.d.ts +6 -2
  6. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  7. package/dist/components/auth/AuthMenu.js +2 -2
  8. package/dist/components/common/RedirectOverlay.d.ts +37 -0
  9. package/dist/components/common/RedirectOverlay.d.ts.map +1 -0
  10. package/dist/components/common/RedirectOverlay.js +243 -0
  11. package/dist/components/common/index.d.ts +1 -0
  12. package/dist/components/common/index.d.ts.map +1 -1
  13. package/dist/components/common/index.js +1 -0
  14. package/dist/components/layout/components/header/SettingsMenu.d.ts.map +1 -1
  15. package/dist/components/layout/components/header/SettingsMenu.js +1 -1
  16. package/dist/crud/components/DisplayFieldRenderer.js +1 -1
  17. package/dist/dndev.css +517 -90
  18. package/dist/index.js +4 -4
  19. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  20. package/dist/internal/devtools/components/DesignTab.js +25 -3
  21. package/dist/internal/layout/components/PerformanceHints.d.ts +64 -0
  22. package/dist/internal/layout/components/PerformanceHints.d.ts.map +1 -0
  23. package/dist/internal/layout/components/PerformanceHints.js +88 -0
  24. package/dist/internal/layout/components/footer/FooterBranding.js +1 -1
  25. package/dist/internal/layout/config/presets/admin.d.ts +2 -2
  26. package/dist/internal/layout/config/presets/admin.d.ts.map +1 -1
  27. package/dist/internal/layout/config/presets/admin.js +8 -4
  28. package/dist/providers/NextJsAppProviders.d.ts.map +1 -1
  29. package/dist/providers/NextJsAppProviders.js +5 -1
  30. package/dist/providers/ViteAppProviders.d.ts.map +1 -1
  31. package/dist/providers/ViteAppProviders.js +4 -1
  32. package/dist/routing/hooks/hooks.next.d.ts +1 -0
  33. package/dist/routing/hooks/hooks.next.d.ts.map +1 -1
  34. package/dist/routing/hooks/hooks.next.js +1 -1
  35. package/dist/routing/hooks/hooks.vite.d.ts +1 -0
  36. package/dist/routing/hooks/hooks.vite.d.ts.map +1 -1
  37. package/dist/routing/hooks/hooks.vite.js +1 -1
  38. package/dist/routing/hooks/useRouteParam.next.d.ts +18 -0
  39. package/dist/routing/hooks/useRouteParam.next.d.ts.map +1 -0
  40. package/dist/routing/hooks/useRouteParam.next.js +38 -0
  41. package/dist/routing/hooks/useRouteParam.vite.d.ts +18 -0
  42. package/dist/routing/hooks/useRouteParam.vite.d.ts.map +1 -0
  43. package/dist/routing/hooks/useRouteParam.vite.js +38 -0
  44. package/dist/routing/index.d.ts +1 -1
  45. package/dist/routing/index.d.ts.map +1 -1
  46. package/dist/routing/index.js +1 -1
  47. package/dist/routing/useGoTo.d.ts +3 -4
  48. package/dist/routing/useGoTo.d.ts.map +1 -1
  49. package/dist/routing/useGoTo.js +16 -23
  50. package/dist/styles/index.css +513 -86
  51. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  52. package/dist/utils/useCrudSafe.js +2 -1
  53. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  54. package/dist/vite-routing/RootLayout.js +4 -1
  55. package/package.json +10 -11
@@ -18,9 +18,9 @@
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; /* < 768 = mobile */
22
- --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
23
- --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
21
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
22
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
23
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
24
24
  --breakpoint-desktop: 1920px; /* 1440+ = desktop */
25
25
 
26
26
  /* ===========================
@@ -153,7 +153,7 @@
153
153
  --font-headline: var(--font-sans);
154
154
 
155
155
  --font-mono:
156
- ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Consolas, Monaco,
156
+ ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, Monaco,
157
157
  'Liberation Mono', monospace;
158
158
 
159
159
  /* Typography Scale - Musical Scale System (STANDARD density defaults - Major Third 1.25×) */
@@ -287,23 +287,39 @@
287
287
 
288
288
  [data-density='compact'] {
289
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 */
290
+ --font-size-base: clamp(
291
+ 0.875rem,
292
+ 0.8125rem + 0.25vw,
293
+ 0.9375rem
294
+ ); /* 14-15px fluid */
295
+ --font-size-lg: clamp(
296
+ 1.05rem,
297
+ 0.9375rem + 0.5vw,
298
+ 1.125rem
299
+ ); /* 17-18px fluid */
300
+ --font-size-xl: clamp(
301
+ 1.26rem,
302
+ 1.125rem + 0.75vw,
303
+ 1.375rem
304
+ ); /* 20-22px fluid */
293
305
  /* Display sizes: Musical scale + fluid responsiveness */
294
306
  --font-size-2xl: clamp(
295
307
  1.512rem,
296
308
  1.375rem + 0.75vw,
297
309
  1.625rem
298
310
  ); /* 24-26px fluid */
299
- --font-size-3xl: clamp(
300
- 1.814rem,
301
- 1.625rem + 1vw,
302
- 2rem
303
- ); /* 29-32px fluid */
311
+ --font-size-3xl: clamp(1.814rem, 1.625rem + 1vw, 2rem); /* 29-32px fluid */
304
312
  --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 */
313
+ --gap-md: clamp(
314
+ 0.75rem,
315
+ 0.625rem + 0.5vw,
316
+ 0.875rem
317
+ ); /* 12-14px fluid, zoom-safe */
318
+ --gap-lg: clamp(
319
+ 1.5rem,
320
+ 1.25rem + 1vw,
321
+ 1.75rem
322
+ ); /* 24-28px fluid, zoom-safe */
307
323
  --line-height: 1.2; /* Minor Third - All text */
308
324
  }
309
325
 
@@ -311,22 +327,34 @@
311
327
 
312
328
  [data-density='standard'] {
313
329
  /* 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 */
330
+ --font-size-base: clamp(
331
+ 1rem,
332
+ 0.9375rem + 0.25vw,
333
+ 1.0625rem
334
+ ); /* 16-17px fluid */
335
+ --font-size-lg: clamp(
336
+ 1.25rem,
337
+ 1.125rem + 0.5vw,
338
+ 1.375rem
339
+ ); /* 20-22px fluid */
340
+ --font-size-xl: clamp(
341
+ 1.563rem,
342
+ 1.375rem + 0.75vw,
343
+ 1.75rem
344
+ ); /* 25-28px fluid */
317
345
  /* 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 */
346
+ --font-size-2xl: clamp(1.953rem, 1.75rem + 1vw, 2.25rem); /* 31-36px fluid */
323
347
  --font-size-3xl: clamp(
324
348
  2.441rem,
325
349
  2rem + 1.5vw,
326
350
  3rem
327
351
  ); /* 39-48px fluid - hero text */
328
352
  --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 */
353
+ --gap-md: clamp(
354
+ 1rem,
355
+ 0.875rem + 0.5vw,
356
+ 1.25rem
357
+ ); /* 16-20px fluid, zoom-safe */
330
358
  --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
331
359
  --line-height: 1.25; /* Major Third - All text */
332
360
  }
@@ -581,6 +609,7 @@ h6 {
581
609
  line-height: var(--line-height);
582
610
  color: var(--foreground);
583
611
  background: transparent;
612
+ text-wrap: balance; /* Equalize line lengths, prevent orphans */
584
613
  }
585
614
 
586
615
  h1 {
@@ -618,6 +647,7 @@ p {
618
647
  line-height: var(--line-height);
619
648
  color: var(--foreground);
620
649
  background: transparent;
650
+ text-wrap: pretty; /* Optimize last line, avoid orphans */
621
651
  }
622
652
 
623
653
  ul,
@@ -627,6 +657,7 @@ ol {
627
657
  color: var(--foreground);
628
658
  background: transparent;
629
659
  list-style-position: outside;
660
+ text-wrap: pretty;
630
661
  }
631
662
 
632
663
  ul {
@@ -679,6 +710,16 @@ em {
679
710
 
680
711
  /* packages/components/src/styles/patterns.css */
681
712
 
713
+ /* Menu scroll area pattern - shared by DropdownMenu, Select, Combobox */
714
+
715
+ .dndev-menu-scroll-area {
716
+ max-height: 50dvh;
717
+ }
718
+
719
+ .dndev-menu-scroll-area .dndev-scroll-area-viewport {
720
+ max-height: 50dvh;
721
+ }
722
+
682
723
  /* ===========================
683
724
  FORM COMPONENTS (BASE)
684
725
  =========================== */
@@ -873,6 +914,9 @@ em {
873
914
  border-radius: var(--radius-surface);
874
915
  box-shadow: var(--shadow-md);
875
916
  padding: var(--gap-md); /* 1rem / 16px default */
917
+ padding-block-start: calc(
918
+ var(--gap-md) + var(--gap-sm)
919
+ ); /* Extra top padding for FloatingLabels */
876
920
  position: relative;
877
921
  overflow: hidden;
878
922
  contain: layout style;
@@ -1070,8 +1114,10 @@ em {
1070
1114
  -webkit-backdrop-filter: blur(20px) saturate(180%);
1071
1115
  border: var(--border-hairline) solid
1072
1116
  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);
1117
+ box-shadow:
1118
+ var(--shadow-lg),
1119
+ inset 0 1px 0 0
1120
+ color-mix(in oklab, var(--card-foreground) 10%, transparent);
1075
1121
  }
1076
1122
 
1077
1123
  /* Separator style */
@@ -1121,6 +1167,9 @@ em {
1121
1167
  border-radius: var(--radius-floating);
1122
1168
  box-shadow: var(--shadow-md);
1123
1169
  padding: var(--gap-md); /* 1rem / 16px default */
1170
+ padding-block-start: calc(
1171
+ var(--gap-md) + var(--gap-sm)
1172
+ ); /* Extra top padding for FloatingLabels */
1124
1173
  position: relative;
1125
1174
  overflow: hidden;
1126
1175
  contain: layout style;
@@ -2051,8 +2100,9 @@ em {
2051
2100
  display: flex;
2052
2101
  flex-direction: column;
2053
2102
  overflow-y: auto;
2054
- overflow-x: hidden;
2103
+ overflow-x: visible;
2055
2104
  min-height: 0;
2105
+ padding-block-start: var(--gap-sm);
2056
2106
  }
2057
2107
 
2058
2108
  .dndev-modal-title {
@@ -2111,6 +2161,60 @@ em {
2111
2161
  flex-direction: column;
2112
2162
  }
2113
2163
 
2164
+ /* ===========================
2165
+ AUTH FORM PATTERNS
2166
+ =========================== */
2167
+
2168
+ /* Auth form step indicator */
2169
+
2170
+ .dndev-auth-step {
2171
+ display: inline-flex;
2172
+ align-items: center;
2173
+ justify-content: center;
2174
+ min-width: 1.5em;
2175
+ padding: var(--gap-sm);
2176
+ border-radius: var(--radius-sm);
2177
+ font-weight: var(--font-weight-semibold);
2178
+ transition: all var(--dur-fast) var(--ease-in-out);
2179
+ }
2180
+
2181
+ .dndev-auth-step[data-state='active'] {
2182
+ background-color: var(--primary);
2183
+ color: var(--primary-foreground);
2184
+ }
2185
+
2186
+ .dndev-auth-step[data-state='pending'] {
2187
+ background-color: var(--muted);
2188
+ color: var(--muted-foreground);
2189
+ }
2190
+
2191
+ .dndev-auth-step[data-state='completed'] {
2192
+ background-color: var(--success);
2193
+ color: var(--success-foreground);
2194
+ }
2195
+
2196
+ /* Opacity data attribute */
2197
+
2198
+ [data-opacity='50'] {
2199
+ opacity: 0.5;
2200
+ }
2201
+
2202
+ [data-opacity='70'] {
2203
+ opacity: 0.7;
2204
+ }
2205
+
2206
+ /* Inset data attribute - indent content */
2207
+
2208
+ [data-inset='true'] {
2209
+ padding-inline-start: var(--gap-md);
2210
+ }
2211
+
2212
+ /* Password strength bar height override */
2213
+
2214
+ .dndev-password-strength-bar {
2215
+ height: 4px;
2216
+ }
2217
+
2114
2218
  /* 5. Individual Component Styles */
2115
2219
 
2116
2220
  /* packages/components/src/atomic/Accordion/Accordion.css */
@@ -2157,21 +2261,46 @@ em {
2157
2261
  flex-shrink: 0;
2158
2262
  width: var(--icon-md);
2159
2263
  height: var(--icon-md);
2160
- transition: transform var(--dur-fast) var(--ease-in-out);
2264
+ transition: transform var(--dur-normal) var(--ease-in-out);
2161
2265
  }
2162
2266
 
2163
2267
  .dndev-accordion-content {
2164
2268
  overflow: hidden;
2165
2269
  font-size: var(--font-size-base);
2166
- transition: all var(--dur-fast) var(--ease-in-out);
2167
2270
  width: 100%;
2168
2271
  min-width: 0;
2169
2272
  text-align: start;
2170
2273
  }
2171
2274
 
2275
+ .dndev-accordion-content[data-state='open'] {
2276
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
2277
+ }
2278
+
2172
2279
  .dndev-accordion-content[data-state='closed'] {
2173
- display: none;
2280
+ animation: slideUp var(--dur-normal) var(--ease-in-out);
2281
+ }
2282
+
2283
+ @keyframes slideDown {
2284
+ from {
2285
+ height: 0;
2286
+ opacity: 0;
2287
+ }
2288
+ to {
2289
+ height: var(--radix-collapsible-content-height);
2290
+ opacity: 1;
2291
+ }
2292
+ }
2293
+
2294
+ @keyframes slideUp {
2295
+ from {
2296
+ height: var(--radix-collapsible-content-height);
2297
+ opacity: 1;
2298
+ }
2299
+ to {
2300
+ height: 0;
2301
+ opacity: 0;
2174
2302
  }
2303
+ }
2175
2304
 
2176
2305
  .dndev-accordion-content-inner {
2177
2306
  padding-bottom: var(--gap-md);
@@ -3162,21 +3291,58 @@ em {
3162
3291
  @keyframes slideDown {
3163
3292
  from {
3164
3293
  height: 0;
3294
+ opacity: 0;
3165
3295
  }
3166
3296
  to {
3167
3297
  height: var(--radix-collapsible-content-height);
3298
+ opacity: 1;
3168
3299
  }
3169
3300
  }
3170
3301
 
3171
3302
  @keyframes slideUp {
3172
3303
  from {
3173
3304
  height: var(--radix-collapsible-content-height);
3305
+ opacity: 1;
3174
3306
  }
3175
3307
  to {
3176
3308
  height: 0;
3309
+ opacity: 0;
3177
3310
  }
3178
3311
  }
3179
3312
 
3313
+ .dndev-collapsible-trigger {
3314
+ width: 100%;
3315
+ cursor: pointer;
3316
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3317
+ }
3318
+
3319
+ .dndev-collapsible-trigger:hover {
3320
+ opacity: var(--opacity-strong);
3321
+ }
3322
+
3323
+ .dndev-collapsible-trigger:focus-visible {
3324
+ outline: 2px solid var(--ring);
3325
+ outline-offset: 2px;
3326
+ border-radius: var(--radius-interactive);
3327
+ }
3328
+
3329
+ .dndev-collapsible-icon {
3330
+ width: var(--size-md);
3331
+ height: var(--size-md);
3332
+ flex-shrink: 0;
3333
+ color: var(--accent);
3334
+ transition: transform var(--dur-normal) var(--ease-in-out);
3335
+ }
3336
+
3337
+ .dndev-collapsible-chevron {
3338
+ transform: rotate(0deg);
3339
+ transition: transform var(--dur-normal) var(--ease-in-out);
3340
+ }
3341
+
3342
+ .dndev-collapsible[data-state='open'] .dndev-collapsible-chevron {
3343
+ transform: rotate(180deg);
3344
+ }
3345
+
3180
3346
  /* packages/components/src/atomic/Combobox/Combobox.css */
3181
3347
 
3182
3348
  .dndev-combobox-trigger {
@@ -3256,7 +3422,7 @@ em {
3256
3422
  .dndev-combobox-content {
3257
3423
  width: var(--radix-popover-trigger-width);
3258
3424
  min-width: var(--radix-popover-trigger-width);
3259
- max-height: 300px;
3425
+ max-width: var(--radix-popover-trigger-width);
3260
3426
  display: flex;
3261
3427
  flex-direction: column;
3262
3428
  padding: 0;
@@ -3271,14 +3437,6 @@ em {
3271
3437
  width: 100%;
3272
3438
  }
3273
3439
 
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
3440
  .dndev-combobox-option {
3283
3441
  all: unset;
3284
3442
  display: flex;
@@ -3335,6 +3493,30 @@ em {
3335
3493
  color: var(--muted-foreground);
3336
3494
  }
3337
3495
 
3496
+ /* Creatable option styling */
3497
+
3498
+ .dndev-combobox-option-create {
3499
+ color: var(--primary);
3500
+ font-style: italic;
3501
+ }
3502
+
3503
+ .dndev-combobox-option-create-icon {
3504
+ width: var(--icon-md);
3505
+ height: var(--icon-md);
3506
+ margin-inline-end: var(--gap-sm);
3507
+ flex-shrink: 0;
3508
+ }
3509
+
3510
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
3511
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
3512
+ transform: rotate(180deg);
3513
+ }
3514
+
3515
+ .dndev-input-with-trailing-icon .dndev-input-icon svg,
3516
+ .dndev-input-with-trailing-icon .dndev-input-icon > * {
3517
+ transition: transform var(--dur-fast) var(--ease-in-out);
3518
+ }
3519
+
3338
3520
  /* packages/components/src/atomic/DualCard/DualCard.css */
3339
3521
 
3340
3522
  .dndev-dual-card {
@@ -3521,13 +3703,15 @@ em {
3521
3703
  text-align: start;
3522
3704
  display: block;
3523
3705
  line-height: 1.5; /* Match line numbers */
3706
+ font-size: var(--font-size-sm); /* Explicit match with line numbers */
3524
3707
  }
3525
3708
 
3526
- /* Ensure shiki-generated code respects line-height */
3709
+ /* Ensure shiki-generated code respects line-height AND font-size */
3527
3710
 
3528
3711
  .dndev-code-code pre,
3529
3712
  .dndev-code-code code {
3530
3713
  line-height: inherit;
3714
+ font-size: inherit; /* Match parent font-size */
3531
3715
  }
3532
3716
 
3533
3717
  /* packages/components/src/atomic/Command/Command.css */
@@ -3905,16 +4089,6 @@ em {
3905
4089
  padding: var(--gap-sm);
3906
4090
  }
3907
4091
 
3908
- /* Dropdown scroll area - constrain height to 50dvh */
3909
-
3910
- .dndev-dropdown-scroll-area {
3911
- max-height: 50dvh;
3912
- }
3913
-
3914
- .dndev-dropdown-scroll-area .dndev-scroll-area-viewport {
3915
- max-height: 50dvh;
3916
- }
3917
-
3918
4092
  /* Checked state styling */
3919
4093
 
3920
4094
  .dndev-interactive[data-role='menu-item'][data-state='checked'] {
@@ -4438,6 +4612,49 @@ em {
4438
4612
  margin-inline-start: var(--gap-sm);
4439
4613
  }
4440
4614
 
4615
+ /* Floating Label - positioned absolutely at top of input fields */
4616
+
4617
+ .dndev-floating-label {
4618
+ position: absolute;
4619
+ inset-inline-start: var(--gap-md);
4620
+ top: calc(-1 * var(--font-size-xs) / 2 - 1px);
4621
+ font-size: var(--font-size-xs);
4622
+ font-weight: 500;
4623
+ pointer-events: none;
4624
+ z-index: 1;
4625
+ background-color: var(--background);
4626
+ padding: 0 var(--gap-sm);
4627
+ line-height: 1;
4628
+ color: var(--foreground);
4629
+ }
4630
+
4631
+ /* Inherit background when inside floating containers (dropdowns, menus, popovers) */
4632
+
4633
+ .dndev-floating .dndev-floating-label,
4634
+ .dndev-menu-content .dndev-floating-label,
4635
+ [class*='dndev-dropdown'] .dndev-floating-label,
4636
+ [class*='dndev-navigation'] .dndev-floating-label {
4637
+ background-color: var(--popover);
4638
+ color: var(--popover-foreground);
4639
+ }
4640
+
4641
+ /* When floating container has blank glow, use solid popover background */
4642
+
4643
+ .dndev-floating[data-glow='blank'] .dndev-floating-label {
4644
+ background-color: var(--popover);
4645
+ }
4646
+
4647
+ .dndev-floating-label[data-disabled='true'] {
4648
+ color: var(--muted-foreground);
4649
+ }
4650
+
4651
+ .dndev-floating-label[data-truncate='true'] {
4652
+ max-width: calc(100% - var(--gap-md) * 2);
4653
+ overflow: hidden;
4654
+ text-overflow: ellipsis;
4655
+ white-space: nowrap;
4656
+ }
4657
+
4441
4658
  /* packages/components/src/atomic/List/List.css */
4442
4659
 
4443
4660
  .dndev-list {
@@ -4746,20 +4963,41 @@ em {
4746
4963
  /* packages/components/src/atomic/PasswordInput/PasswordInput.css */
4747
4964
 
4748
4965
  .dndev-password-input-with-toggle {
4749
- padding-inline-end: var(--gap-lg);
4966
+ padding-inline-end: calc(var(--gap-xl) + var(--gap-md)) !important;
4750
4967
  }
4751
4968
 
4969
+ /* Eye icon toggle - ALWAYS at end, cannot be overridden */
4970
+
4752
4971
  .dndev-password-toggle-button {
4753
- position: absolute;
4754
- inset-inline-end: 0;
4755
- top: 0;
4756
- height: 100%;
4757
- padding-inline-start: var(--gap-md);
4758
- padding-inline-end: var(--gap-md);
4972
+ position: absolute !important;
4973
+ top: 50% !important;
4974
+ transform: translateY(-50%) !important;
4975
+ inset-inline-end: var(--gap-sm) !important;
4976
+ inset-inline-start: unset !important;
4977
+ background: none !important;
4978
+ border: none !important;
4979
+ cursor: pointer !important;
4980
+ padding: var(--gap-tight) !important;
4981
+ display: flex !important;
4982
+ align-items: center !important;
4983
+ opacity: var(--opacity-muted) !important;
4984
+ transition: opacity var(--dur-fast) var(--ease-in-out) !important;
4985
+ -webkit-user-select: none !important;
4986
+ -moz-user-select: none !important;
4987
+ user-select: none !important;
4988
+ z-index: 1 !important;
4989
+ }
4990
+
4991
+ .dndev-password-toggle-button:hover,
4992
+ .dndev-password-toggle-button:focus {
4993
+ opacity: 1 !important;
4994
+ outline: none !important;
4759
4995
  }
4760
4996
 
4761
4997
  .dndev-password-toggle-icon {
4762
4998
  color: var(--muted-foreground);
4999
+ width: var(--icon-sm);
5000
+ height: var(--icon-sm);
4763
5001
  }
4764
5002
 
4765
5003
  /* packages/components/src/atomic/Pagination/Pagination.css */
@@ -4851,9 +5089,32 @@ em {
4851
5089
  height: 100%;
4852
5090
  width: 100%;
4853
5091
  flex: 1;
5092
+ background-color: var(--primary);
4854
5093
  transition: transform var(--dur-normal) var(--ease-in-out);
5094
+
5095
+ /* Variant colors */
4855
5096
  }
4856
5097
 
5098
+ [data-variant='default']:is(.dndev-progress [data-radix-progress-indicator]) {
5099
+ background-color: var(--primary);
5100
+ }
5101
+
5102
+ [data-variant='accent']:is(.dndev-progress [data-radix-progress-indicator]) {
5103
+ background-color: var(--accent);
5104
+ }
5105
+
5106
+ [data-variant='success']:is(.dndev-progress [data-radix-progress-indicator]) {
5107
+ background-color: var(--success);
5108
+ }
5109
+
5110
+ [data-variant='warning']:is(.dndev-progress [data-radix-progress-indicator]) {
5111
+ background-color: var(--warning);
5112
+ }
5113
+
5114
+ [data-variant='destructive']:is(.dndev-progress [data-radix-progress-indicator]) {
5115
+ background-color: var(--destructive);
5116
+ }
5117
+
4857
5118
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4858
5119
 
4859
5120
  /* Uses shared .dndev-control-group pattern from patterns.css */
@@ -5059,7 +5320,6 @@ em {
5059
5320
  display: flex;
5060
5321
  flex-direction: column;
5061
5322
  padding: 0;
5062
- overflow-y: auto;
5063
5323
  }
5064
5324
 
5065
5325
  .dndev-interactive[data-radix-select-item] {
@@ -5181,6 +5441,7 @@ em {
5181
5441
  letter-spacing: 0.2em;
5182
5442
  color: var(--accent) !important;
5183
5443
  margin-block-end: var(--gap-md);
5444
+ text-align: center; /* DEFAULT - works without attribute selector */
5184
5445
  }
5185
5446
 
5186
5447
  .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
@@ -5195,6 +5456,51 @@ em {
5195
5456
  text-align: end;
5196
5457
  }
5197
5458
 
5459
+ /* Collapsible title trigger */
5460
+
5461
+ .dndev-section-title-trigger {
5462
+ width: 100%;
5463
+ cursor: pointer;
5464
+ transition: opacity var(--dur-fast) var(--ease-in-out);
5465
+ margin-block-end: var(--gap-md);
5466
+ }
5467
+
5468
+ .dndev-section-title-trigger .dndev-section-title {
5469
+ margin-block-end: 0;
5470
+ }
5471
+
5472
+ .dndev-section-title-trigger:hover {
5473
+ opacity: var(--opacity-strong);
5474
+ }
5475
+
5476
+ .dndev-section-title-trigger:focus-visible {
5477
+ outline: 2px solid var(--ring);
5478
+ outline-offset: 2px;
5479
+ border-radius: var(--radius-interactive);
5480
+ }
5481
+
5482
+ .dndev-section-icon {
5483
+ width: var(--size-md);
5484
+ height: var(--size-md);
5485
+ flex-shrink: 0;
5486
+ color: var(--accent);
5487
+ transition: transform var(--dur-normal) var(--ease-in-out);
5488
+ }
5489
+
5490
+ .dndev-section-full-width[data-text-align='start']
5491
+ .dndev-section-title-trigger {
5492
+ justify-content: flex-start;
5493
+ }
5494
+
5495
+ .dndev-section-full-width[data-text-align='center']
5496
+ .dndev-section-title-trigger {
5497
+ justify-content: center;
5498
+ }
5499
+
5500
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title-trigger {
5501
+ justify-content: flex-end;
5502
+ }
5503
+
5198
5504
  /* packages/components/src/atomic/Separator/Separator.css */
5199
5505
 
5200
5506
  .dndev-separator {
@@ -6057,6 +6363,64 @@ em {
6057
6363
  transform: translateX(calc(2.75rem - 1.25rem - 0.125rem));
6058
6364
  }
6059
6365
 
6366
+ /* Switch with labels container */
6367
+
6368
+ .dndev-switch-with-labels {
6369
+ display: inline-flex;
6370
+ align-items: center;
6371
+ gap: var(--gap-sm);
6372
+ flex-wrap: wrap;
6373
+ }
6374
+
6375
+ /* Labels - keep switch and its labels on one line when possible */
6376
+
6377
+ .dndev-switch-with-labels > .dndev-switch {
6378
+ flex-shrink: 0;
6379
+ }
6380
+
6381
+ .dndev-switch-label {
6382
+ font-size: var(--font-size-sm);
6383
+ transition: color var(--dur-normal) var(--ease-in-out),
6384
+ font-weight var(--dur-normal) var(--ease-in-out);
6385
+ white-space: nowrap;
6386
+ }
6387
+
6388
+ /* Unchecked label - active when switch is unchecked */
6389
+
6390
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6391
+ .dndev-switch-label-unchecked,
6392
+ .dndev-switch-with-labels[data-checked='false']
6393
+ .dndev-switch-label-unchecked {
6394
+ color: var(--foreground);
6395
+ font-weight: var(--font-weight-medium);
6396
+ }
6397
+
6398
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6399
+ .dndev-switch-label-unchecked,
6400
+ .dndev-switch-with-labels[data-checked='true']
6401
+ .dndev-switch-label-unchecked {
6402
+ color: var(--muted-foreground);
6403
+ font-weight: var(--font-weight-normal);
6404
+ }
6405
+
6406
+ /* Checked label - active when switch is checked */
6407
+
6408
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6409
+ .dndev-switch-label-checked,
6410
+ .dndev-switch-with-labels[data-checked='true']
6411
+ .dndev-switch-label-checked {
6412
+ color: var(--foreground);
6413
+ font-weight: var(--font-weight-medium);
6414
+ }
6415
+
6416
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6417
+ .dndev-switch-label-checked,
6418
+ .dndev-switch-with-labels[data-checked='false']
6419
+ .dndev-switch-label-checked {
6420
+ color: var(--muted-foreground);
6421
+ font-weight: var(--font-weight-normal);
6422
+ }
6423
+
6060
6424
  /* packages/components/src/atomic/Table/Table.css */
6061
6425
 
6062
6426
  .dndev-table-wrapper {
@@ -6122,7 +6486,7 @@ em {
6122
6486
  /* Table head (th) styles */
6123
6487
 
6124
6488
  .dndev-table-head {
6125
- text-align: left;
6489
+ text-align: start;
6126
6490
  vertical-align: middle;
6127
6491
  font-weight: 500;
6128
6492
  color: var(--muted-foreground);
@@ -6139,12 +6503,12 @@ em {
6139
6503
  text-align: center;
6140
6504
  }
6141
6505
 
6142
- .dndev-table-head[data-align='right'] {
6143
- text-align: right;
6506
+ .dndev-table-head[data-align='end'] {
6507
+ text-align: end;
6144
6508
  }
6145
6509
 
6146
- .dndev-table-head[data-align='left'] {
6147
- text-align: left;
6510
+ .dndev-table-head[data-align='start'] {
6511
+ text-align: start;
6148
6512
  }
6149
6513
 
6150
6514
  /* Table cell (td) styles */
@@ -6160,14 +6524,48 @@ em {
6160
6524
  text-align: center;
6161
6525
  }
6162
6526
 
6163
- .dndev-table-cell[data-align='right'] {
6164
- text-align: right;
6527
+ .dndev-table-cell[data-align='end'] {
6528
+ text-align: end;
6165
6529
  }
6166
6530
 
6167
- .dndev-table-cell[data-align='left'] {
6168
- text-align: left;
6531
+ .dndev-table-cell[data-align='start'] {
6532
+ text-align: start;
6169
6533
  }
6170
6534
 
6535
+ /* Excel-like grid lines variant */
6536
+
6537
+ .dndev-table-grid .dndev-table-head,
6538
+ .dndev-table-grid .dndev-table-cell {
6539
+ border: 1px solid var(--border);
6540
+ padding: 0;
6541
+ }
6542
+
6543
+ .dndev-table-grid .dndev-table-row {
6544
+ border-bottom: 1px solid var(--border);
6545
+ }
6546
+
6547
+ .dndev-table-grid .dndev-table-row:last-child {
6548
+ border-bottom: 1px solid var(--border);
6549
+ }
6550
+
6551
+ /* Input components inside grid cells should be borderless and fit snugly */
6552
+
6553
+ .dndev-table-grid .dndev-table-cell .dndev-input,
6554
+ .dndev-table-grid .dndev-table-cell input[type="text"],
6555
+ .dndev-table-grid .dndev-table-cell input[type="number"] {
6556
+ border: none;
6557
+ background: transparent;
6558
+ width: 100%;
6559
+ height: 100%;
6560
+ box-shadow: none;
6561
+ }
6562
+
6563
+ .dndev-table-grid .dndev-table-cell .dndev-input:focus,
6564
+ .dndev-table-grid .dndev-table-cell input:focus {
6565
+ outline: 2px solid var(--primary);
6566
+ outline-offset: -2px;
6567
+ }
6568
+
6171
6569
  /* Table caption styles */
6172
6570
 
6173
6571
  .dndev-table-caption {
@@ -6184,7 +6582,7 @@ em {
6184
6582
 
6185
6583
  .dndev-table-search-icon {
6186
6584
  position: absolute;
6187
- left: var(--gap-md);
6585
+ inset-inline-start: var(--gap-md);
6188
6586
  top: 50%;
6189
6587
  transform: translateY(-50%);
6190
6588
  width: var(--icon-md);
@@ -6351,7 +6749,7 @@ em {
6351
6749
  .dndev-tag {
6352
6750
  display: inline-flex;
6353
6751
  align-items: center;
6354
- gap: var(--gap-xs);
6752
+ gap: var(--gap-sm);
6355
6753
  border-radius: var(--radius-full);
6356
6754
  border: 1px solid transparent;
6357
6755
  font-size: var(--font-size-sm);
@@ -6481,8 +6879,18 @@ em {
6481
6879
  font-weight: var(--font-weight-medium);
6482
6880
  line-height: var(--line-height);
6483
6881
  background-color: transparent; /* Text never has background, only color changes */
6882
+
6883
+ /* Respect semantic HTML elements */
6484
6884
  }
6485
6885
 
6886
+ .dndev-text-base:is(strong) {
6887
+ font-weight: var(--font-weight-semibold);
6888
+ }
6889
+
6890
+ .dndev-text-base:is(em) {
6891
+ font-style: italic;
6892
+ }
6893
+
6486
6894
  .dndev-text-base[data-variant='default'] {
6487
6895
  color: inherit;
6488
6896
  }
@@ -7430,7 +7838,7 @@ em {
7430
7838
  align-items: stretch;
7431
7839
  }
7432
7840
 
7433
- @media (width <= 699px) {
7841
+ @media (width <=699px) {
7434
7842
 
7435
7843
  [data-cols='2'] {
7436
7844
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7442,14 +7850,14 @@ em {
7442
7850
  align-items: stretch;
7443
7851
  }
7444
7852
 
7445
- @media (width <= 1049px) {
7853
+ @media (width <=1049px) {
7446
7854
 
7447
7855
  [data-cols='3'] {
7448
7856
  grid-template-columns: repeat(2, minmax(350px, 1fr));
7449
7857
  }
7450
7858
  }
7451
7859
 
7452
- @media (width <= 699px) {
7860
+ @media (width <=699px) {
7453
7861
 
7454
7862
  [data-cols='3'] {
7455
7863
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7463,21 +7871,21 @@ em {
7463
7871
  /* Responsive: reduce columns when container is narrow */
7464
7872
  }
7465
7873
 
7466
- @media (width <= 1399px) {
7874
+ @media (width <=1399px) {
7467
7875
 
7468
7876
  [data-cols='4'] {
7469
7877
  grid-template-columns: repeat(3, minmax(0, 1fr));
7470
7878
  }
7471
7879
  }
7472
7880
 
7473
- @media (width <= 1049px) {
7881
+ @media (width <=1049px) {
7474
7882
 
7475
7883
  [data-cols='4'] {
7476
7884
  grid-template-columns: repeat(2, minmax(0, 1fr));
7477
7885
  }
7478
7886
  }
7479
7887
 
7480
- @media (width <= 699px) {
7888
+ @media (width <=699px) {
7481
7889
 
7482
7890
  [data-cols='4'] {
7483
7891
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -7544,18 +7952,22 @@ em {
7544
7952
 
7545
7953
  code {
7546
7954
  font-family: var(--font-mono);
7547
- font-size: inherit; /* Inherit parent size */
7548
- font-weight: inherit; /* Inherit parent weight */
7955
+ font-size: inherit;
7956
+ /* Inherit parent size */
7957
+ font-weight: inherit;
7958
+ /* Inherit parent weight */
7549
7959
  line-height: inherit;
7550
7960
  color: inherit;
7551
- background: transparent; /* No background by default */
7961
+ background: transparent;
7962
+ /* No background by default */
7552
7963
  }
7553
7964
 
7554
7965
  /* Code variant - visual styling (background, padding, can apply to any element) */
7555
7966
 
7556
7967
  [data-variant='code'] {
7557
7968
  font-family: var(--font-mono);
7558
- font-size: var(--font-size-sm); /* Default small size */
7969
+ font-size: var(--font-size-sm);
7970
+ /* Default small size */
7559
7971
  background: var(--muted);
7560
7972
  color: var(--muted-foreground);
7561
7973
  padding: var(--gap-sm) var(--gap-md);
@@ -7650,7 +8062,8 @@ h4[data-variant='code'] {
7650
8062
 
7651
8063
  .dndev-relative {
7652
8064
  position: relative;
7653
- min-width: 0; /* Allow flex items to shrink below content size */
8065
+ min-width: 0;
8066
+ /* Allow flex items to shrink below content size */
7654
8067
  }
7655
8068
 
7656
8069
  .dndev-absolute {
@@ -7755,7 +8168,7 @@ h4[data-variant='code'] {
7755
8168
  RESPONSIVE DISPLAY
7756
8169
  =========================== */
7757
8170
 
7758
- @media (width >= 768px) {
8171
+ @media (width >=768px) {
7759
8172
  .dndev-md\:block {
7760
8173
  display: block;
7761
8174
  }
@@ -7781,7 +8194,7 @@ h4[data-variant='code'] {
7781
8194
  }
7782
8195
  }
7783
8196
 
7784
- @media (width >= 1024px) {
8197
+ @media (width >=1024px) {
7785
8198
  .dndev-lg\:block {
7786
8199
  display: block;
7787
8200
  }
@@ -7841,6 +8254,10 @@ h4[data-variant='code'] {
7841
8254
  Components are unaffected - they own their own spacing
7842
8255
  =========================== */
7843
8256
 
8257
+ .prose {
8258
+ text-align: start;
8259
+ }
8260
+
7844
8261
  .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7845
8262
  margin-block: var(--gap-md);
7846
8263
  }
@@ -8312,14 +8729,20 @@ main[role='main'][data-routing-animation='none'] {
8312
8729
  'header header'
8313
8730
  'sidebar main'
8314
8731
  'footer footer';
8315
- grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
8732
+ grid-template-rows: var(--header-height) 1fr minmax(
8733
+ var(--footer-height),
8734
+ auto
8735
+ );
8316
8736
  grid-template-columns: var(--sidebar-width) 1fr;
8317
8737
 
8318
8738
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
8319
8739
  }
8320
8740
 
8321
8741
  [data-layout='game']:root .dndev-layout {
8322
- grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
8742
+ grid-template-rows: var(--header-height) 1fr minmax(
8743
+ var(--footer-height),
8744
+ auto
8745
+ );
8323
8746
  }
8324
8747
 
8325
8748
  /* ===========================
@@ -8575,10 +8998,14 @@ aside[role='navigation'].sidebar[data-collapsed='true'] .dndev-interactive kbd {
8575
8998
 
8576
8999
  /* Force sidebar children to shrink - no blocking resize */
8577
9000
 
8578
- aside.sidebar[role='navigation'] .sidebar-content,aside.sidebar[role='navigation'] .sidebar-top,aside.sidebar[role='navigation'] .sidebar-bottom {
9001
+ aside.sidebar[role='navigation'] .sidebar-top,aside.sidebar[role='navigation'] .sidebar-bottom {
8579
9002
  overflow: hidden;
8580
9003
  }
8581
9004
 
9005
+ aside.sidebar[role='navigation'] .sidebar-content {
9006
+ overflow-x: hidden; /* Prevent horizontal scroll, allow vertical */
9007
+ }
9008
+
8582
9009
  aside.sidebar[role='navigation'] .dndev-interactive {
8583
9010
  overflow: hidden;
8584
9011
  }
@@ -9034,7 +9461,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9034
9461
  .breadcrumb-item {
9035
9462
  display: inline-flex;
9036
9463
  align-items: center;
9037
- gap: var(--gap-xs);
9464
+ gap: var(--gap-sm);
9038
9465
  }
9039
9466
 
9040
9467
  .breadcrumbs .separator,
@@ -9111,7 +9538,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9111
9538
  min-height: 0;
9112
9539
  display: flex;
9113
9540
  flex-direction: column;
9114
- justify-content: space-between;
9541
+ justify-content: flex-start;
9115
9542
  gap: var(--gap-lg);
9116
9543
  /* Controlled by density system */
9117
9544
  /* Default: centered */