@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
package/dist/dndev.css CHANGED
@@ -22,9 +22,9 @@
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; /* < 768 = mobile */
26
- --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
27
- --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
25
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
26
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
27
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
28
28
  --breakpoint-desktop: 1920px; /* 1440+ = desktop */
29
29
 
30
30
  /* ===========================
@@ -157,7 +157,7 @@
157
157
  --font-headline: var(--font-sans);
158
158
 
159
159
  --font-mono:
160
- ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Consolas, Monaco,
160
+ ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, Monaco,
161
161
  'Liberation Mono', monospace;
162
162
 
163
163
  /* Typography Scale - Musical Scale System (STANDARD density defaults - Major Third 1.25×) */
@@ -291,23 +291,39 @@
291
291
 
292
292
  [data-density='compact'] {
293
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 */
294
+ --font-size-base: clamp(
295
+ 0.875rem,
296
+ 0.8125rem + 0.25vw,
297
+ 0.9375rem
298
+ ); /* 14-15px fluid */
299
+ --font-size-lg: clamp(
300
+ 1.05rem,
301
+ 0.9375rem + 0.5vw,
302
+ 1.125rem
303
+ ); /* 17-18px fluid */
304
+ --font-size-xl: clamp(
305
+ 1.26rem,
306
+ 1.125rem + 0.75vw,
307
+ 1.375rem
308
+ ); /* 20-22px fluid */
297
309
  /* Display sizes: Musical scale + fluid responsiveness */
298
310
  --font-size-2xl: clamp(
299
311
  1.512rem,
300
312
  1.375rem + 0.75vw,
301
313
  1.625rem
302
314
  ); /* 24-26px fluid */
303
- --font-size-3xl: clamp(
304
- 1.814rem,
305
- 1.625rem + 1vw,
306
- 2rem
307
- ); /* 29-32px fluid */
315
+ --font-size-3xl: clamp(1.814rem, 1.625rem + 1vw, 2rem); /* 29-32px fluid */
308
316
  --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 */
317
+ --gap-md: clamp(
318
+ 0.75rem,
319
+ 0.625rem + 0.5vw,
320
+ 0.875rem
321
+ ); /* 12-14px fluid, zoom-safe */
322
+ --gap-lg: clamp(
323
+ 1.5rem,
324
+ 1.25rem + 1vw,
325
+ 1.75rem
326
+ ); /* 24-28px fluid, zoom-safe */
311
327
  --line-height: 1.2; /* Minor Third - All text */
312
328
  }
313
329
 
@@ -315,22 +331,34 @@
315
331
 
316
332
  [data-density='standard'] {
317
333
  /* 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 */
334
+ --font-size-base: clamp(
335
+ 1rem,
336
+ 0.9375rem + 0.25vw,
337
+ 1.0625rem
338
+ ); /* 16-17px fluid */
339
+ --font-size-lg: clamp(
340
+ 1.25rem,
341
+ 1.125rem + 0.5vw,
342
+ 1.375rem
343
+ ); /* 20-22px fluid */
344
+ --font-size-xl: clamp(
345
+ 1.563rem,
346
+ 1.375rem + 0.75vw,
347
+ 1.75rem
348
+ ); /* 25-28px fluid */
321
349
  /* 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 */
350
+ --font-size-2xl: clamp(1.953rem, 1.75rem + 1vw, 2.25rem); /* 31-36px fluid */
327
351
  --font-size-3xl: clamp(
328
352
  2.441rem,
329
353
  2rem + 1.5vw,
330
354
  3rem
331
355
  ); /* 39-48px fluid - hero text */
332
356
  --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 */
357
+ --gap-md: clamp(
358
+ 1rem,
359
+ 0.875rem + 0.5vw,
360
+ 1.25rem
361
+ ); /* 16-20px fluid, zoom-safe */
334
362
  --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
335
363
  --line-height: 1.25; /* Major Third - All text */
336
364
  }
@@ -585,6 +613,7 @@ h6 {
585
613
  line-height: var(--line-height);
586
614
  color: var(--foreground);
587
615
  background: transparent;
616
+ text-wrap: balance; /* Equalize line lengths, prevent orphans */
588
617
  }
589
618
 
590
619
  h1 {
@@ -622,6 +651,7 @@ p {
622
651
  line-height: var(--line-height);
623
652
  color: var(--foreground);
624
653
  background: transparent;
654
+ text-wrap: pretty; /* Optimize last line, avoid orphans */
625
655
  }
626
656
 
627
657
  ul,
@@ -631,6 +661,7 @@ ol {
631
661
  color: var(--foreground);
632
662
  background: transparent;
633
663
  list-style-position: outside;
664
+ text-wrap: pretty;
634
665
  }
635
666
 
636
667
  ul {
@@ -683,6 +714,16 @@ em {
683
714
 
684
715
  /* packages/components/src/styles/patterns.css */
685
716
 
717
+ /* Menu scroll area pattern - shared by DropdownMenu, Select, Combobox */
718
+
719
+ .dndev-menu-scroll-area {
720
+ max-height: 50dvh;
721
+ }
722
+
723
+ .dndev-menu-scroll-area .dndev-scroll-area-viewport {
724
+ max-height: 50dvh;
725
+ }
726
+
686
727
  /* ===========================
687
728
  FORM COMPONENTS (BASE)
688
729
  =========================== */
@@ -877,6 +918,9 @@ em {
877
918
  border-radius: var(--radius-surface);
878
919
  box-shadow: var(--shadow-md);
879
920
  padding: var(--gap-md); /* 1rem / 16px default */
921
+ padding-block-start: calc(
922
+ var(--gap-md) + var(--gap-sm)
923
+ ); /* Extra top padding for FloatingLabels */
880
924
  position: relative;
881
925
  overflow: hidden;
882
926
  contain: layout style;
@@ -1074,8 +1118,10 @@ em {
1074
1118
  -webkit-backdrop-filter: blur(20px) saturate(180%);
1075
1119
  border: var(--border-hairline) solid
1076
1120
  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);
1121
+ box-shadow:
1122
+ var(--shadow-lg),
1123
+ inset 0 1px 0 0
1124
+ color-mix(in oklab, var(--card-foreground) 10%, transparent);
1079
1125
  }
1080
1126
 
1081
1127
  /* Separator style */
@@ -1125,6 +1171,9 @@ em {
1125
1171
  border-radius: var(--radius-floating);
1126
1172
  box-shadow: var(--shadow-md);
1127
1173
  padding: var(--gap-md); /* 1rem / 16px default */
1174
+ padding-block-start: calc(
1175
+ var(--gap-md) + var(--gap-sm)
1176
+ ); /* Extra top padding for FloatingLabels */
1128
1177
  position: relative;
1129
1178
  overflow: hidden;
1130
1179
  contain: layout style;
@@ -2055,8 +2104,9 @@ em {
2055
2104
  display: flex;
2056
2105
  flex-direction: column;
2057
2106
  overflow-y: auto;
2058
- overflow-x: hidden;
2107
+ overflow-x: visible;
2059
2108
  min-height: 0;
2109
+ padding-block-start: var(--gap-sm);
2060
2110
  }
2061
2111
 
2062
2112
  .dndev-modal-title {
@@ -2115,6 +2165,60 @@ em {
2115
2165
  flex-direction: column;
2116
2166
  }
2117
2167
 
2168
+ /* ===========================
2169
+ AUTH FORM PATTERNS
2170
+ =========================== */
2171
+
2172
+ /* Auth form step indicator */
2173
+
2174
+ .dndev-auth-step {
2175
+ display: inline-flex;
2176
+ align-items: center;
2177
+ justify-content: center;
2178
+ min-width: 1.5em;
2179
+ padding: var(--gap-sm);
2180
+ border-radius: var(--radius-sm);
2181
+ font-weight: var(--font-weight-semibold);
2182
+ transition: all var(--dur-fast) var(--ease-in-out);
2183
+ }
2184
+
2185
+ .dndev-auth-step[data-state='active'] {
2186
+ background-color: var(--primary);
2187
+ color: var(--primary-foreground);
2188
+ }
2189
+
2190
+ .dndev-auth-step[data-state='pending'] {
2191
+ background-color: var(--muted);
2192
+ color: var(--muted-foreground);
2193
+ }
2194
+
2195
+ .dndev-auth-step[data-state='completed'] {
2196
+ background-color: var(--success);
2197
+ color: var(--success-foreground);
2198
+ }
2199
+
2200
+ /* Opacity data attribute */
2201
+
2202
+ [data-opacity='50'] {
2203
+ opacity: 0.5;
2204
+ }
2205
+
2206
+ [data-opacity='70'] {
2207
+ opacity: 0.7;
2208
+ }
2209
+
2210
+ /* Inset data attribute - indent content */
2211
+
2212
+ [data-inset='true'] {
2213
+ padding-inline-start: var(--gap-md);
2214
+ }
2215
+
2216
+ /* Password strength bar height override */
2217
+
2218
+ .dndev-password-strength-bar {
2219
+ height: 4px;
2220
+ }
2221
+
2118
2222
  /* 5. Individual Component Styles */
2119
2223
 
2120
2224
  /* packages/components/src/atomic/Accordion/Accordion.css */
@@ -2161,21 +2265,46 @@ em {
2161
2265
  flex-shrink: 0;
2162
2266
  width: var(--icon-md);
2163
2267
  height: var(--icon-md);
2164
- transition: transform var(--dur-fast) var(--ease-in-out);
2268
+ transition: transform var(--dur-normal) var(--ease-in-out);
2165
2269
  }
2166
2270
 
2167
2271
  .dndev-accordion-content {
2168
2272
  overflow: hidden;
2169
2273
  font-size: var(--font-size-base);
2170
- transition: all var(--dur-fast) var(--ease-in-out);
2171
2274
  width: 100%;
2172
2275
  min-width: 0;
2173
2276
  text-align: start;
2174
2277
  }
2175
2278
 
2279
+ .dndev-accordion-content[data-state='open'] {
2280
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
2281
+ }
2282
+
2176
2283
  .dndev-accordion-content[data-state='closed'] {
2177
- display: none;
2284
+ animation: slideUp var(--dur-normal) var(--ease-in-out);
2285
+ }
2286
+
2287
+ @keyframes slideDown {
2288
+ from {
2289
+ height: 0;
2290
+ opacity: 0;
2178
2291
  }
2292
+ to {
2293
+ height: var(--radix-collapsible-content-height);
2294
+ opacity: 1;
2295
+ }
2296
+ }
2297
+
2298
+ @keyframes slideUp {
2299
+ from {
2300
+ height: var(--radix-collapsible-content-height);
2301
+ opacity: 1;
2302
+ }
2303
+ to {
2304
+ height: 0;
2305
+ opacity: 0;
2306
+ }
2307
+ }
2179
2308
 
2180
2309
  .dndev-accordion-content-inner {
2181
2310
  padding-bottom: var(--gap-md);
@@ -3166,21 +3295,58 @@ em {
3166
3295
  @keyframes slideDown {
3167
3296
  from {
3168
3297
  height: 0;
3298
+ opacity: 0;
3169
3299
  }
3170
3300
  to {
3171
3301
  height: var(--radix-collapsible-content-height);
3302
+ opacity: 1;
3172
3303
  }
3173
3304
  }
3174
3305
 
3175
3306
  @keyframes slideUp {
3176
3307
  from {
3177
3308
  height: var(--radix-collapsible-content-height);
3309
+ opacity: 1;
3178
3310
  }
3179
3311
  to {
3180
3312
  height: 0;
3313
+ opacity: 0;
3181
3314
  }
3182
3315
  }
3183
3316
 
3317
+ .dndev-collapsible-trigger {
3318
+ width: 100%;
3319
+ cursor: pointer;
3320
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3321
+ }
3322
+
3323
+ .dndev-collapsible-trigger:hover {
3324
+ opacity: var(--opacity-strong);
3325
+ }
3326
+
3327
+ .dndev-collapsible-trigger:focus-visible {
3328
+ outline: 2px solid var(--ring);
3329
+ outline-offset: 2px;
3330
+ border-radius: var(--radius-interactive);
3331
+ }
3332
+
3333
+ .dndev-collapsible-icon {
3334
+ width: var(--size-md);
3335
+ height: var(--size-md);
3336
+ flex-shrink: 0;
3337
+ color: var(--accent);
3338
+ transition: transform var(--dur-normal) var(--ease-in-out);
3339
+ }
3340
+
3341
+ .dndev-collapsible-chevron {
3342
+ transform: rotate(0deg);
3343
+ transition: transform var(--dur-normal) var(--ease-in-out);
3344
+ }
3345
+
3346
+ .dndev-collapsible[data-state='open'] .dndev-collapsible-chevron {
3347
+ transform: rotate(180deg);
3348
+ }
3349
+
3184
3350
  /* packages/components/src/atomic/Combobox/Combobox.css */
3185
3351
 
3186
3352
  .dndev-combobox-trigger {
@@ -3260,7 +3426,7 @@ em {
3260
3426
  .dndev-combobox-content {
3261
3427
  width: var(--radix-popover-trigger-width);
3262
3428
  min-width: var(--radix-popover-trigger-width);
3263
- max-height: 300px;
3429
+ max-width: var(--radix-popover-trigger-width);
3264
3430
  display: flex;
3265
3431
  flex-direction: column;
3266
3432
  padding: 0;
@@ -3275,14 +3441,6 @@ em {
3275
3441
  width: 100%;
3276
3442
  }
3277
3443
 
3278
- .dndev-combobox-list {
3279
- overflow-y: auto;
3280
- padding: var(--gap-tight);
3281
- display: flex;
3282
- flex-direction: column;
3283
- gap: var(--gap-none);
3284
- }
3285
-
3286
3444
  .dndev-combobox-option {
3287
3445
  all: unset;
3288
3446
  display: flex;
@@ -3339,6 +3497,30 @@ em {
3339
3497
  color: var(--muted-foreground);
3340
3498
  }
3341
3499
 
3500
+ /* Creatable option styling */
3501
+
3502
+ .dndev-combobox-option-create {
3503
+ color: var(--primary);
3504
+ font-style: italic;
3505
+ }
3506
+
3507
+ .dndev-combobox-option-create-icon {
3508
+ width: var(--icon-md);
3509
+ height: var(--icon-md);
3510
+ margin-inline-end: var(--gap-sm);
3511
+ flex-shrink: 0;
3512
+ }
3513
+
3514
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
3515
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
3516
+ transform: rotate(180deg);
3517
+ }
3518
+
3519
+ .dndev-input-with-trailing-icon .dndev-input-icon svg,
3520
+ .dndev-input-with-trailing-icon .dndev-input-icon > * {
3521
+ transition: transform var(--dur-fast) var(--ease-in-out);
3522
+ }
3523
+
3342
3524
  /* packages/components/src/atomic/DualCard/DualCard.css */
3343
3525
 
3344
3526
  .dndev-dual-card {
@@ -3525,13 +3707,15 @@ em {
3525
3707
  text-align: start;
3526
3708
  display: block;
3527
3709
  line-height: 1.5; /* Match line numbers */
3710
+ font-size: var(--font-size-sm); /* Explicit match with line numbers */
3528
3711
  }
3529
3712
 
3530
- /* Ensure shiki-generated code respects line-height */
3713
+ /* Ensure shiki-generated code respects line-height AND font-size */
3531
3714
 
3532
3715
  .dndev-code-code pre,
3533
3716
  .dndev-code-code code {
3534
3717
  line-height: inherit;
3718
+ font-size: inherit; /* Match parent font-size */
3535
3719
  }
3536
3720
 
3537
3721
  /* packages/components/src/atomic/Command/Command.css */
@@ -3909,16 +4093,6 @@ em {
3909
4093
  padding: var(--gap-sm);
3910
4094
  }
3911
4095
 
3912
- /* Dropdown scroll area - constrain height to 50dvh */
3913
-
3914
- .dndev-dropdown-scroll-area {
3915
- max-height: 50dvh;
3916
- }
3917
-
3918
- .dndev-dropdown-scroll-area .dndev-scroll-area-viewport {
3919
- max-height: 50dvh;
3920
- }
3921
-
3922
4096
  /* Checked state styling */
3923
4097
 
3924
4098
  .dndev-interactive[data-role='menu-item'][data-state='checked'] {
@@ -4442,6 +4616,49 @@ em {
4442
4616
  margin-inline-start: var(--gap-sm);
4443
4617
  }
4444
4618
 
4619
+ /* Floating Label - positioned absolutely at top of input fields */
4620
+
4621
+ .dndev-floating-label {
4622
+ position: absolute;
4623
+ inset-inline-start: var(--gap-md);
4624
+ top: calc(-1 * var(--font-size-xs) / 2 - 1px);
4625
+ font-size: var(--font-size-xs);
4626
+ font-weight: 500;
4627
+ pointer-events: none;
4628
+ z-index: 1;
4629
+ background-color: var(--background);
4630
+ padding: 0 var(--gap-sm);
4631
+ line-height: 1;
4632
+ color: var(--foreground);
4633
+ }
4634
+
4635
+ /* Inherit background when inside floating containers (dropdowns, menus, popovers) */
4636
+
4637
+ .dndev-floating .dndev-floating-label,
4638
+ .dndev-menu-content .dndev-floating-label,
4639
+ [class*='dndev-dropdown'] .dndev-floating-label,
4640
+ [class*='dndev-navigation'] .dndev-floating-label {
4641
+ background-color: var(--popover);
4642
+ color: var(--popover-foreground);
4643
+ }
4644
+
4645
+ /* When floating container has blank glow, use solid popover background */
4646
+
4647
+ .dndev-floating[data-glow='blank'] .dndev-floating-label {
4648
+ background-color: var(--popover);
4649
+ }
4650
+
4651
+ .dndev-floating-label[data-disabled='true'] {
4652
+ color: var(--muted-foreground);
4653
+ }
4654
+
4655
+ .dndev-floating-label[data-truncate='true'] {
4656
+ max-width: calc(100% - var(--gap-md) * 2);
4657
+ overflow: hidden;
4658
+ text-overflow: ellipsis;
4659
+ white-space: nowrap;
4660
+ }
4661
+
4445
4662
  /* packages/components/src/atomic/List/List.css */
4446
4663
 
4447
4664
  .dndev-list {
@@ -4750,20 +4967,41 @@ em {
4750
4967
  /* packages/components/src/atomic/PasswordInput/PasswordInput.css */
4751
4968
 
4752
4969
  .dndev-password-input-with-toggle {
4753
- padding-inline-end: var(--gap-lg);
4970
+ padding-inline-end: calc(var(--gap-xl) + var(--gap-md)) !important;
4754
4971
  }
4755
4972
 
4973
+ /* Eye icon toggle - ALWAYS at end, cannot be overridden */
4974
+
4756
4975
  .dndev-password-toggle-button {
4757
- position: absolute;
4758
- inset-inline-end: 0;
4759
- top: 0;
4760
- height: 100%;
4761
- padding-inline-start: var(--gap-md);
4762
- padding-inline-end: var(--gap-md);
4976
+ position: absolute !important;
4977
+ top: 50% !important;
4978
+ transform: translateY(-50%) !important;
4979
+ inset-inline-end: var(--gap-sm) !important;
4980
+ inset-inline-start: unset !important;
4981
+ background: none !important;
4982
+ border: none !important;
4983
+ cursor: pointer !important;
4984
+ padding: var(--gap-tight) !important;
4985
+ display: flex !important;
4986
+ align-items: center !important;
4987
+ opacity: var(--opacity-muted) !important;
4988
+ transition: opacity var(--dur-fast) var(--ease-in-out) !important;
4989
+ -webkit-user-select: none !important;
4990
+ -moz-user-select: none !important;
4991
+ user-select: none !important;
4992
+ z-index: 1 !important;
4993
+ }
4994
+
4995
+ .dndev-password-toggle-button:hover,
4996
+ .dndev-password-toggle-button:focus {
4997
+ opacity: 1 !important;
4998
+ outline: none !important;
4763
4999
  }
4764
5000
 
4765
5001
  .dndev-password-toggle-icon {
4766
5002
  color: var(--muted-foreground);
5003
+ width: var(--icon-sm);
5004
+ height: var(--icon-sm);
4767
5005
  }
4768
5006
 
4769
5007
  /* packages/components/src/atomic/Pagination/Pagination.css */
@@ -4855,9 +5093,32 @@ em {
4855
5093
  height: 100%;
4856
5094
  width: 100%;
4857
5095
  flex: 1;
5096
+ background-color: var(--primary);
4858
5097
  transition: transform var(--dur-normal) var(--ease-in-out);
5098
+
5099
+ /* Variant colors */
4859
5100
  }
4860
5101
 
5102
+ [data-variant='default']:is(.dndev-progress [data-radix-progress-indicator]) {
5103
+ background-color: var(--primary);
5104
+ }
5105
+
5106
+ [data-variant='accent']:is(.dndev-progress [data-radix-progress-indicator]) {
5107
+ background-color: var(--accent);
5108
+ }
5109
+
5110
+ [data-variant='success']:is(.dndev-progress [data-radix-progress-indicator]) {
5111
+ background-color: var(--success);
5112
+ }
5113
+
5114
+ [data-variant='warning']:is(.dndev-progress [data-radix-progress-indicator]) {
5115
+ background-color: var(--warning);
5116
+ }
5117
+
5118
+ [data-variant='destructive']:is(.dndev-progress [data-radix-progress-indicator]) {
5119
+ background-color: var(--destructive);
5120
+ }
5121
+
4861
5122
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4862
5123
 
4863
5124
  /* Uses shared .dndev-control-group pattern from patterns.css */
@@ -5063,7 +5324,6 @@ em {
5063
5324
  display: flex;
5064
5325
  flex-direction: column;
5065
5326
  padding: 0;
5066
- overflow-y: auto;
5067
5327
  }
5068
5328
 
5069
5329
  .dndev-interactive[data-radix-select-item] {
@@ -5185,6 +5445,7 @@ em {
5185
5445
  letter-spacing: 0.2em;
5186
5446
  color: var(--accent) !important;
5187
5447
  margin-block-end: var(--gap-md);
5448
+ text-align: center; /* DEFAULT - works without attribute selector */
5188
5449
  }
5189
5450
 
5190
5451
  .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
@@ -5199,6 +5460,51 @@ em {
5199
5460
  text-align: end;
5200
5461
  }
5201
5462
 
5463
+ /* Collapsible title trigger */
5464
+
5465
+ .dndev-section-title-trigger {
5466
+ width: 100%;
5467
+ cursor: pointer;
5468
+ transition: opacity var(--dur-fast) var(--ease-in-out);
5469
+ margin-block-end: var(--gap-md);
5470
+ }
5471
+
5472
+ .dndev-section-title-trigger .dndev-section-title {
5473
+ margin-block-end: 0;
5474
+ }
5475
+
5476
+ .dndev-section-title-trigger:hover {
5477
+ opacity: var(--opacity-strong);
5478
+ }
5479
+
5480
+ .dndev-section-title-trigger:focus-visible {
5481
+ outline: 2px solid var(--ring);
5482
+ outline-offset: 2px;
5483
+ border-radius: var(--radius-interactive);
5484
+ }
5485
+
5486
+ .dndev-section-icon {
5487
+ width: var(--size-md);
5488
+ height: var(--size-md);
5489
+ flex-shrink: 0;
5490
+ color: var(--accent);
5491
+ transition: transform var(--dur-normal) var(--ease-in-out);
5492
+ }
5493
+
5494
+ .dndev-section-full-width[data-text-align='start']
5495
+ .dndev-section-title-trigger {
5496
+ justify-content: flex-start;
5497
+ }
5498
+
5499
+ .dndev-section-full-width[data-text-align='center']
5500
+ .dndev-section-title-trigger {
5501
+ justify-content: center;
5502
+ }
5503
+
5504
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title-trigger {
5505
+ justify-content: flex-end;
5506
+ }
5507
+
5202
5508
  /* packages/components/src/atomic/Separator/Separator.css */
5203
5509
 
5204
5510
  .dndev-separator {
@@ -6061,6 +6367,64 @@ em {
6061
6367
  transform: translateX(calc(2.75rem - 1.25rem - 0.125rem));
6062
6368
  }
6063
6369
 
6370
+ /* Switch with labels container */
6371
+
6372
+ .dndev-switch-with-labels {
6373
+ display: inline-flex;
6374
+ align-items: center;
6375
+ gap: var(--gap-sm);
6376
+ flex-wrap: wrap;
6377
+ }
6378
+
6379
+ /* Labels - keep switch and its labels on one line when possible */
6380
+
6381
+ .dndev-switch-with-labels > .dndev-switch {
6382
+ flex-shrink: 0;
6383
+ }
6384
+
6385
+ .dndev-switch-label {
6386
+ font-size: var(--font-size-sm);
6387
+ transition: color var(--dur-normal) var(--ease-in-out),
6388
+ font-weight var(--dur-normal) var(--ease-in-out);
6389
+ white-space: nowrap;
6390
+ }
6391
+
6392
+ /* Unchecked label - active when switch is unchecked */
6393
+
6394
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6395
+ .dndev-switch-label-unchecked,
6396
+ .dndev-switch-with-labels[data-checked='false']
6397
+ .dndev-switch-label-unchecked {
6398
+ color: var(--foreground);
6399
+ font-weight: var(--font-weight-medium);
6400
+ }
6401
+
6402
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6403
+ .dndev-switch-label-unchecked,
6404
+ .dndev-switch-with-labels[data-checked='true']
6405
+ .dndev-switch-label-unchecked {
6406
+ color: var(--muted-foreground);
6407
+ font-weight: var(--font-weight-normal);
6408
+ }
6409
+
6410
+ /* Checked label - active when switch is checked */
6411
+
6412
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6413
+ .dndev-switch-label-checked,
6414
+ .dndev-switch-with-labels[data-checked='true']
6415
+ .dndev-switch-label-checked {
6416
+ color: var(--foreground);
6417
+ font-weight: var(--font-weight-medium);
6418
+ }
6419
+
6420
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6421
+ .dndev-switch-label-checked,
6422
+ .dndev-switch-with-labels[data-checked='false']
6423
+ .dndev-switch-label-checked {
6424
+ color: var(--muted-foreground);
6425
+ font-weight: var(--font-weight-normal);
6426
+ }
6427
+
6064
6428
  /* packages/components/src/atomic/Table/Table.css */
6065
6429
 
6066
6430
  .dndev-table-wrapper {
@@ -6126,7 +6490,7 @@ em {
6126
6490
  /* Table head (th) styles */
6127
6491
 
6128
6492
  .dndev-table-head {
6129
- text-align: left;
6493
+ text-align: start;
6130
6494
  vertical-align: middle;
6131
6495
  font-weight: 500;
6132
6496
  color: var(--muted-foreground);
@@ -6143,12 +6507,12 @@ em {
6143
6507
  text-align: center;
6144
6508
  }
6145
6509
 
6146
- .dndev-table-head[data-align='right'] {
6147
- text-align: right;
6510
+ .dndev-table-head[data-align='end'] {
6511
+ text-align: end;
6148
6512
  }
6149
6513
 
6150
- .dndev-table-head[data-align='left'] {
6151
- text-align: left;
6514
+ .dndev-table-head[data-align='start'] {
6515
+ text-align: start;
6152
6516
  }
6153
6517
 
6154
6518
  /* Table cell (td) styles */
@@ -6164,14 +6528,48 @@ em {
6164
6528
  text-align: center;
6165
6529
  }
6166
6530
 
6167
- .dndev-table-cell[data-align='right'] {
6168
- text-align: right;
6531
+ .dndev-table-cell[data-align='end'] {
6532
+ text-align: end;
6169
6533
  }
6170
6534
 
6171
- .dndev-table-cell[data-align='left'] {
6172
- text-align: left;
6535
+ .dndev-table-cell[data-align='start'] {
6536
+ text-align: start;
6173
6537
  }
6174
6538
 
6539
+ /* Excel-like grid lines variant */
6540
+
6541
+ .dndev-table-grid .dndev-table-head,
6542
+ .dndev-table-grid .dndev-table-cell {
6543
+ border: 1px solid var(--border);
6544
+ padding: 0;
6545
+ }
6546
+
6547
+ .dndev-table-grid .dndev-table-row {
6548
+ border-bottom: 1px solid var(--border);
6549
+ }
6550
+
6551
+ .dndev-table-grid .dndev-table-row:last-child {
6552
+ border-bottom: 1px solid var(--border);
6553
+ }
6554
+
6555
+ /* Input components inside grid cells should be borderless and fit snugly */
6556
+
6557
+ .dndev-table-grid .dndev-table-cell .dndev-input,
6558
+ .dndev-table-grid .dndev-table-cell input[type="text"],
6559
+ .dndev-table-grid .dndev-table-cell input[type="number"] {
6560
+ border: none;
6561
+ background: transparent;
6562
+ width: 100%;
6563
+ height: 100%;
6564
+ box-shadow: none;
6565
+ }
6566
+
6567
+ .dndev-table-grid .dndev-table-cell .dndev-input:focus,
6568
+ .dndev-table-grid .dndev-table-cell input:focus {
6569
+ outline: 2px solid var(--primary);
6570
+ outline-offset: -2px;
6571
+ }
6572
+
6175
6573
  /* Table caption styles */
6176
6574
 
6177
6575
  .dndev-table-caption {
@@ -6188,7 +6586,7 @@ em {
6188
6586
 
6189
6587
  .dndev-table-search-icon {
6190
6588
  position: absolute;
6191
- left: var(--gap-md);
6589
+ inset-inline-start: var(--gap-md);
6192
6590
  top: 50%;
6193
6591
  transform: translateY(-50%);
6194
6592
  width: var(--icon-md);
@@ -6355,7 +6753,7 @@ em {
6355
6753
  .dndev-tag {
6356
6754
  display: inline-flex;
6357
6755
  align-items: center;
6358
- gap: var(--gap-xs);
6756
+ gap: var(--gap-sm);
6359
6757
  border-radius: var(--radius-full);
6360
6758
  border: 1px solid transparent;
6361
6759
  font-size: var(--font-size-sm);
@@ -6485,8 +6883,18 @@ em {
6485
6883
  font-weight: var(--font-weight-medium);
6486
6884
  line-height: var(--line-height);
6487
6885
  background-color: transparent; /* Text never has background, only color changes */
6886
+
6887
+ /* Respect semantic HTML elements */
6488
6888
  }
6489
6889
 
6890
+ .dndev-text-base:is(strong) {
6891
+ font-weight: var(--font-weight-semibold);
6892
+ }
6893
+
6894
+ .dndev-text-base:is(em) {
6895
+ font-style: italic;
6896
+ }
6897
+
6490
6898
  .dndev-text-base[data-variant='default'] {
6491
6899
  color: inherit;
6492
6900
  }
@@ -7434,7 +7842,7 @@ em {
7434
7842
  align-items: stretch;
7435
7843
  }
7436
7844
 
7437
- @media (width <= 699px) {
7845
+ @media (width <=699px) {
7438
7846
 
7439
7847
  [data-cols='2'] {
7440
7848
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7446,14 +7854,14 @@ em {
7446
7854
  align-items: stretch;
7447
7855
  }
7448
7856
 
7449
- @media (width <= 1049px) {
7857
+ @media (width <=1049px) {
7450
7858
 
7451
7859
  [data-cols='3'] {
7452
7860
  grid-template-columns: repeat(2, minmax(350px, 1fr));
7453
7861
  }
7454
7862
  }
7455
7863
 
7456
- @media (width <= 699px) {
7864
+ @media (width <=699px) {
7457
7865
 
7458
7866
  [data-cols='3'] {
7459
7867
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7467,21 +7875,21 @@ em {
7467
7875
  /* Responsive: reduce columns when container is narrow */
7468
7876
  }
7469
7877
 
7470
- @media (width <= 1399px) {
7878
+ @media (width <=1399px) {
7471
7879
 
7472
7880
  [data-cols='4'] {
7473
7881
  grid-template-columns: repeat(3, minmax(0, 1fr));
7474
7882
  }
7475
7883
  }
7476
7884
 
7477
- @media (width <= 1049px) {
7885
+ @media (width <=1049px) {
7478
7886
 
7479
7887
  [data-cols='4'] {
7480
7888
  grid-template-columns: repeat(2, minmax(0, 1fr));
7481
7889
  }
7482
7890
  }
7483
7891
 
7484
- @media (width <= 699px) {
7892
+ @media (width <=699px) {
7485
7893
 
7486
7894
  [data-cols='4'] {
7487
7895
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -7548,18 +7956,22 @@ em {
7548
7956
 
7549
7957
  code {
7550
7958
  font-family: var(--font-mono);
7551
- font-size: inherit; /* Inherit parent size */
7552
- font-weight: inherit; /* Inherit parent weight */
7959
+ font-size: inherit;
7960
+ /* Inherit parent size */
7961
+ font-weight: inherit;
7962
+ /* Inherit parent weight */
7553
7963
  line-height: inherit;
7554
7964
  color: inherit;
7555
- background: transparent; /* No background by default */
7965
+ background: transparent;
7966
+ /* No background by default */
7556
7967
  }
7557
7968
 
7558
7969
  /* Code variant - visual styling (background, padding, can apply to any element) */
7559
7970
 
7560
7971
  [data-variant='code'] {
7561
7972
  font-family: var(--font-mono);
7562
- font-size: var(--font-size-sm); /* Default small size */
7973
+ font-size: var(--font-size-sm);
7974
+ /* Default small size */
7563
7975
  background: var(--muted);
7564
7976
  color: var(--muted-foreground);
7565
7977
  padding: var(--gap-sm) var(--gap-md);
@@ -7654,7 +8066,8 @@ h4[data-variant='code'] {
7654
8066
 
7655
8067
  .dndev-relative {
7656
8068
  position: relative;
7657
- min-width: 0; /* Allow flex items to shrink below content size */
8069
+ min-width: 0;
8070
+ /* Allow flex items to shrink below content size */
7658
8071
  }
7659
8072
 
7660
8073
  .dndev-absolute {
@@ -7759,7 +8172,7 @@ h4[data-variant='code'] {
7759
8172
  RESPONSIVE DISPLAY
7760
8173
  =========================== */
7761
8174
 
7762
- @media (width >= 768px) {
8175
+ @media (width >=768px) {
7763
8176
  .dndev-md\:block {
7764
8177
  display: block;
7765
8178
  }
@@ -7785,7 +8198,7 @@ h4[data-variant='code'] {
7785
8198
  }
7786
8199
  }
7787
8200
 
7788
- @media (width >= 1024px) {
8201
+ @media (width >=1024px) {
7789
8202
  .dndev-lg\:block {
7790
8203
  display: block;
7791
8204
  }
@@ -7845,6 +8258,10 @@ h4[data-variant='code'] {
7845
8258
  Components are unaffected - they own their own spacing
7846
8259
  =========================== */
7847
8260
 
8261
+ .prose {
8262
+ text-align: start;
8263
+ }
8264
+
7848
8265
  .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7849
8266
  margin-block: var(--gap-md);
7850
8267
  }
@@ -8316,14 +8733,20 @@ main[role='main'][data-routing-animation='none'] {
8316
8733
  'header header'
8317
8734
  'sidebar main'
8318
8735
  'footer footer';
8319
- grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
8736
+ grid-template-rows: var(--header-height) 1fr minmax(
8737
+ var(--footer-height),
8738
+ auto
8739
+ );
8320
8740
  grid-template-columns: var(--sidebar-width) 1fr;
8321
8741
 
8322
8742
  /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
8323
8743
  }
8324
8744
 
8325
8745
  [data-layout='game']:root .dndev-layout {
8326
- grid-template-rows: var(--header-height) 1fr minmax(var(--footer-height), auto);
8746
+ grid-template-rows: var(--header-height) 1fr minmax(
8747
+ var(--footer-height),
8748
+ auto
8749
+ );
8327
8750
  }
8328
8751
 
8329
8752
  /* ===========================
@@ -8579,10 +9002,14 @@ aside[role='navigation'].sidebar[data-collapsed='true'] .dndev-interactive kbd {
8579
9002
 
8580
9003
  /* Force sidebar children to shrink - no blocking resize */
8581
9004
 
8582
- aside.sidebar[role='navigation'] .sidebar-content,aside.sidebar[role='navigation'] .sidebar-top,aside.sidebar[role='navigation'] .sidebar-bottom {
9005
+ aside.sidebar[role='navigation'] .sidebar-top,aside.sidebar[role='navigation'] .sidebar-bottom {
8583
9006
  overflow: hidden;
8584
9007
  }
8585
9008
 
9009
+ aside.sidebar[role='navigation'] .sidebar-content {
9010
+ overflow-x: hidden; /* Prevent horizontal scroll, allow vertical */
9011
+ }
9012
+
8586
9013
  aside.sidebar[role='navigation'] .dndev-interactive {
8587
9014
  overflow: hidden;
8588
9015
  }
@@ -9038,7 +9465,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9038
9465
  .breadcrumb-item {
9039
9466
  display: inline-flex;
9040
9467
  align-items: center;
9041
- gap: var(--gap-xs);
9468
+ gap: var(--gap-sm);
9042
9469
  }
9043
9470
 
9044
9471
  .breadcrumbs .separator,
@@ -9115,7 +9542,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9115
9542
  min-height: 0;
9116
9543
  display: flex;
9117
9544
  flex-direction: column;
9118
- justify-content: space-between;
9545
+ justify-content: flex-start;
9119
9546
  gap: var(--gap-lg);
9120
9547
  /* Controlled by density system */
9121
9548
  /* Default: centered */
@@ -9402,7 +9829,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9402
9829
  font-family: Roboto;
9403
9830
  font-style: normal;
9404
9831
  font-weight: 400;
9405
- font-display: optional;
9832
+ font-display: swap;
9406
9833
  src: url('/fonts/Roboto-400-latin.woff2') format('woff2');
9407
9834
  unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
9408
9835
  }
@@ -9411,7 +9838,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9411
9838
  font-family: Roboto;
9412
9839
  font-style: normal;
9413
9840
  font-weight: 700;
9414
- font-display: optional;
9841
+ font-display: swap;
9415
9842
  src: url('/fonts/Roboto-700-latin.woff2') format('woff2');
9416
9843
  unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
9417
9844
  }
@@ -9559,7 +9986,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9559
9986
  font-family: Inter;
9560
9987
  font-style: normal;
9561
9988
  font-weight: 400 700;
9562
- font-display: optional;
9989
+ font-display: swap; /* Changed from optional to swap - we preload this font */
9563
9990
  src: url('/fonts/Inter-latin.woff2') format('woff2');
9564
9991
  unicode-range:
9565
9992
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
@@ -9592,7 +10019,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9592
10019
  font-family: 'Playfair Display';
9593
10020
  font-style: normal;
9594
10021
  font-weight: 400 700;
9595
- font-display: optional;
10022
+ font-display: swap;
9596
10023
  src: url('/fonts/PlayfairDisplay-latin.woff2') format('woff2');
9597
10024
  unicode-range:
9598
10025
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,