@donotdev/components 0.0.10 → 0.0.12

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 (57) hide show
  1. package/dist/atomic/Accordion/index.d.ts +2 -16
  2. package/dist/atomic/Accordion/index.d.ts.map +1 -1
  3. package/dist/atomic/Accordion/index.js +4 -25
  4. package/dist/atomic/Alert/index.d.ts.map +1 -1
  5. package/dist/atomic/Alert/index.js +1 -1
  6. package/dist/atomic/Button/index.js +6 -3
  7. package/dist/atomic/Calendar/index.js +1 -1
  8. package/dist/atomic/CallToAction/index.d.ts.map +1 -1
  9. package/dist/atomic/CallToAction/index.js +1 -1
  10. package/dist/atomic/Collapsible/index.d.ts +12 -16
  11. package/dist/atomic/Collapsible/index.d.ts.map +1 -1
  12. package/dist/atomic/Collapsible/index.js +24 -24
  13. package/dist/atomic/Combobox/index.d.ts +9 -47
  14. package/dist/atomic/Combobox/index.d.ts.map +1 -1
  15. package/dist/atomic/Combobox/index.js +135 -87
  16. package/dist/atomic/Dialog/index.d.ts.map +1 -1
  17. package/dist/atomic/Dialog/index.js +1 -1
  18. package/dist/atomic/DropdownMenu/index.js +1 -1
  19. package/dist/atomic/Input/index.d.ts +1 -1
  20. package/dist/atomic/Input/index.d.ts.map +1 -1
  21. package/dist/atomic/Input/index.js +6 -22
  22. package/dist/atomic/Label/FloatingLabel.d.ts +31 -0
  23. package/dist/atomic/Label/FloatingLabel.d.ts.map +1 -0
  24. package/dist/atomic/Label/FloatingLabel.js +34 -0
  25. package/dist/atomic/Label/index.d.ts +5 -1
  26. package/dist/atomic/Label/index.d.ts.map +1 -1
  27. package/dist/atomic/Label/index.js +8 -2
  28. package/dist/atomic/PasswordInput/index.d.ts +9 -10
  29. package/dist/atomic/PasswordInput/index.d.ts.map +1 -1
  30. package/dist/atomic/PasswordInput/index.js +10 -30
  31. package/dist/atomic/Section/index.d.ts +25 -1
  32. package/dist/atomic/Section/index.d.ts.map +1 -1
  33. package/dist/atomic/Section/index.js +22 -4
  34. package/dist/atomic/Select/index.d.ts +3 -1
  35. package/dist/atomic/Select/index.d.ts.map +1 -1
  36. package/dist/atomic/Select/index.js +13 -24
  37. package/dist/atomic/Skeleton/index.d.ts.map +1 -1
  38. package/dist/atomic/Skeleton/index.js +6 -3
  39. package/dist/atomic/Switch/index.d.ts +18 -4
  40. package/dist/atomic/Switch/index.d.ts.map +1 -1
  41. package/dist/atomic/Switch/index.js +25 -6
  42. package/dist/atomic/Table/index.d.ts +17 -7
  43. package/dist/atomic/Table/index.d.ts.map +1 -1
  44. package/dist/atomic/Table/index.js +13 -3
  45. package/dist/atomic/Tooltip/index.d.ts.map +1 -1
  46. package/dist/atomic/Tooltip/index.js +6 -2
  47. package/dist/atomic/VideoPlayer/index.d.ts.map +1 -1
  48. package/dist/atomic/index.d.ts +2 -3
  49. package/dist/atomic/index.d.ts.map +1 -1
  50. package/dist/atomic/index.js +1 -2
  51. package/dist/hooks/useIntersectionObserver.js +3 -1
  52. package/dist/index.js +4 -4
  53. package/dist/styles/index.css +495 -81
  54. package/package.json +1 -1
  55. package/dist/atomic/Combobox/ComboboxPrimitive.d.ts +0 -18
  56. package/dist/atomic/Combobox/ComboboxPrimitive.d.ts.map +0 -1
  57. package/dist/atomic/Combobox/ComboboxPrimitive.js +0 -14
@@ -10,9 +10,9 @@
10
10
  Used by: CSS @media queries, JavaScript hooks, responsive components
11
11
  Note: CSS variables don't work in @media, so we use hardcoded px values
12
12
  =========================== */
13
- --breakpoint-mobile: 768px; /* < 768 = mobile */
14
- --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
15
- --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
13
+ --breakpoint-mobile: 768px; /* < 768 = mobile */
14
+ --breakpoint-tablet: 1024px; /* 768-1023 = tablet */
15
+ --breakpoint-laptop: 1440px; /* 1024-1439 = laptop (key layout split) */
16
16
  --breakpoint-desktop: 1920px; /* 1440+ = desktop */
17
17
 
18
18
  /* ===========================
@@ -145,7 +145,7 @@
145
145
  --font-headline: var(--font-sans);
146
146
 
147
147
  --font-mono:
148
- ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Consolas, Monaco,
148
+ ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, Monaco,
149
149
  'Liberation Mono', monospace;
150
150
 
151
151
  /* Typography Scale - Musical Scale System (STANDARD density defaults - Major Third 1.25×) */
@@ -279,23 +279,39 @@
279
279
 
280
280
  [data-density='compact'] {
281
281
  /* Base sizes: Fluid responsiveness for all text, zoom-safe */
282
- --font-size-base: clamp(0.875rem, 0.8125rem + 0.25vw, 0.9375rem); /* 14-15px fluid */
283
- --font-size-lg: clamp(1.05rem, 0.9375rem + 0.5vw, 1.125rem); /* 17-18px fluid */
284
- --font-size-xl: clamp(1.26rem, 1.125rem + 0.75vw, 1.375rem); /* 20-22px fluid */
282
+ --font-size-base: clamp(
283
+ 0.875rem,
284
+ 0.8125rem + 0.25vw,
285
+ 0.9375rem
286
+ ); /* 14-15px fluid */
287
+ --font-size-lg: clamp(
288
+ 1.05rem,
289
+ 0.9375rem + 0.5vw,
290
+ 1.125rem
291
+ ); /* 17-18px fluid */
292
+ --font-size-xl: clamp(
293
+ 1.26rem,
294
+ 1.125rem + 0.75vw,
295
+ 1.375rem
296
+ ); /* 20-22px fluid */
285
297
  /* Display sizes: Musical scale + fluid responsiveness */
286
298
  --font-size-2xl: clamp(
287
299
  1.512rem,
288
300
  1.375rem + 0.75vw,
289
301
  1.625rem
290
302
  ); /* 24-26px fluid */
291
- --font-size-3xl: clamp(
292
- 1.814rem,
293
- 1.625rem + 1vw,
294
- 2rem
295
- ); /* 29-32px fluid */
303
+ --font-size-3xl: clamp(1.814rem, 1.625rem + 1vw, 2rem); /* 29-32px fluid */
296
304
  --gap-sm: clamp(0.375rem, 0.3125rem + 0.25vw, 0.5rem); /* 6-8px fluid */
297
- --gap-md: clamp(0.75rem, 0.625rem + 0.5vw, 0.875rem); /* 12-14px fluid, zoom-safe */
298
- --gap-lg: clamp(1.5rem, 1.25rem + 1vw, 1.75rem); /* 24-28px fluid, zoom-safe */
305
+ --gap-md: clamp(
306
+ 0.75rem,
307
+ 0.625rem + 0.5vw,
308
+ 0.875rem
309
+ ); /* 12-14px fluid, zoom-safe */
310
+ --gap-lg: clamp(
311
+ 1.5rem,
312
+ 1.25rem + 1vw,
313
+ 1.75rem
314
+ ); /* 24-28px fluid, zoom-safe */
299
315
  --line-height: 1.2; /* Minor Third - All text */
300
316
  }
301
317
 
@@ -303,22 +319,34 @@
303
319
 
304
320
  [data-density='standard'] {
305
321
  /* Base sizes: Fluid responsiveness for all text, zoom-safe */
306
- --font-size-base: clamp(1rem, 0.9375rem + 0.25vw, 1.0625rem); /* 16-17px fluid */
307
- --font-size-lg: clamp(1.25rem, 1.125rem + 0.5vw, 1.375rem); /* 20-22px fluid */
308
- --font-size-xl: clamp(1.563rem, 1.375rem + 0.75vw, 1.75rem); /* 25-28px fluid */
322
+ --font-size-base: clamp(
323
+ 1rem,
324
+ 0.9375rem + 0.25vw,
325
+ 1.0625rem
326
+ ); /* 16-17px fluid */
327
+ --font-size-lg: clamp(
328
+ 1.25rem,
329
+ 1.125rem + 0.5vw,
330
+ 1.375rem
331
+ ); /* 20-22px fluid */
332
+ --font-size-xl: clamp(
333
+ 1.563rem,
334
+ 1.375rem + 0.75vw,
335
+ 1.75rem
336
+ ); /* 25-28px fluid */
309
337
  /* Display sizes: Musical scale + fluid responsiveness */
310
- --font-size-2xl: clamp(
311
- 1.953rem,
312
- 1.75rem + 1vw,
313
- 2.25rem
314
- ); /* 31-36px fluid */
338
+ --font-size-2xl: clamp(1.953rem, 1.75rem + 1vw, 2.25rem); /* 31-36px fluid */
315
339
  --font-size-3xl: clamp(
316
340
  2.441rem,
317
341
  2rem + 1.5vw,
318
342
  3rem
319
343
  ); /* 39-48px fluid - hero text */
320
344
  --gap-sm: clamp(0.5rem, 0.4375rem + 0.25vw, 0.625rem); /* 8-10px fluid */
321
- --gap-md: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* 16-20px fluid, zoom-safe */
345
+ --gap-md: clamp(
346
+ 1rem,
347
+ 0.875rem + 0.5vw,
348
+ 1.25rem
349
+ ); /* 16-20px fluid, zoom-safe */
322
350
  --gap-lg: clamp(2rem, 1.75rem + 1vw, 2.5rem); /* 32-40px fluid, zoom-safe */
323
351
  --line-height: 1.25; /* Major Third - All text */
324
352
  }
@@ -674,6 +702,16 @@ em {
674
702
 
675
703
  /* packages/components/src/styles/patterns.css */
676
704
 
705
+ /* Menu scroll area pattern - shared by DropdownMenu, Select, Combobox */
706
+
707
+ .dndev-menu-scroll-area {
708
+ max-height: 50dvh;
709
+ }
710
+
711
+ .dndev-menu-scroll-area .dndev-scroll-area-viewport {
712
+ max-height: 50dvh;
713
+ }
714
+
677
715
  /* ===========================
678
716
  FORM COMPONENTS (BASE)
679
717
  =========================== */
@@ -868,6 +906,9 @@ em {
868
906
  border-radius: var(--radius-surface);
869
907
  box-shadow: var(--shadow-md);
870
908
  padding: var(--gap-md); /* 1rem / 16px default */
909
+ padding-block-start: calc(
910
+ var(--gap-md) + var(--gap-sm)
911
+ ); /* Extra top padding for FloatingLabels */
871
912
  position: relative;
872
913
  overflow: hidden;
873
914
  contain: layout style;
@@ -1065,8 +1106,10 @@ em {
1065
1106
  -webkit-backdrop-filter: blur(20px) saturate(180%);
1066
1107
  border: var(--border-hairline) solid
1067
1108
  color-mix(in oklab, var(--card-foreground) 25%, transparent);
1068
- box-shadow: var(--shadow-lg),
1069
- inset 0 1px 0 0 color-mix(in oklab, var(--card-foreground) 10%, transparent);
1109
+ box-shadow:
1110
+ var(--shadow-lg),
1111
+ inset 0 1px 0 0
1112
+ color-mix(in oklab, var(--card-foreground) 10%, transparent);
1070
1113
  }
1071
1114
 
1072
1115
  /* Separator style */
@@ -1116,6 +1159,9 @@ em {
1116
1159
  border-radius: var(--radius-floating);
1117
1160
  box-shadow: var(--shadow-md);
1118
1161
  padding: var(--gap-md); /* 1rem / 16px default */
1162
+ padding-block-start: calc(
1163
+ var(--gap-md) + var(--gap-sm)
1164
+ ); /* Extra top padding for FloatingLabels */
1119
1165
  position: relative;
1120
1166
  overflow: hidden;
1121
1167
  contain: layout style;
@@ -2046,8 +2092,9 @@ em {
2046
2092
  display: flex;
2047
2093
  flex-direction: column;
2048
2094
  overflow-y: auto;
2049
- overflow-x: hidden;
2095
+ overflow-x: visible;
2050
2096
  min-height: 0;
2097
+ padding-block-start: var(--gap-sm);
2051
2098
  }
2052
2099
 
2053
2100
  .dndev-modal-title {
@@ -2106,6 +2153,60 @@ em {
2106
2153
  flex-direction: column;
2107
2154
  }
2108
2155
 
2156
+ /* ===========================
2157
+ AUTH FORM PATTERNS
2158
+ =========================== */
2159
+
2160
+ /* Auth form step indicator */
2161
+
2162
+ .dndev-auth-step {
2163
+ display: inline-flex;
2164
+ align-items: center;
2165
+ justify-content: center;
2166
+ min-width: 1.5em;
2167
+ padding: var(--gap-sm);
2168
+ border-radius: var(--radius-sm);
2169
+ font-weight: var(--font-weight-semibold);
2170
+ transition: all var(--dur-fast) var(--ease-in-out);
2171
+ }
2172
+
2173
+ .dndev-auth-step[data-state='active'] {
2174
+ background-color: var(--primary);
2175
+ color: var(--primary-foreground);
2176
+ }
2177
+
2178
+ .dndev-auth-step[data-state='pending'] {
2179
+ background-color: var(--muted);
2180
+ color: var(--muted-foreground);
2181
+ }
2182
+
2183
+ .dndev-auth-step[data-state='completed'] {
2184
+ background-color: var(--success);
2185
+ color: var(--success-foreground);
2186
+ }
2187
+
2188
+ /* Opacity data attribute */
2189
+
2190
+ [data-opacity='50'] {
2191
+ opacity: 0.5;
2192
+ }
2193
+
2194
+ [data-opacity='70'] {
2195
+ opacity: 0.7;
2196
+ }
2197
+
2198
+ /* Inset data attribute - indent content */
2199
+
2200
+ [data-inset='true'] {
2201
+ padding-inline-start: var(--gap-md);
2202
+ }
2203
+
2204
+ /* Password strength bar height override */
2205
+
2206
+ .dndev-password-strength-bar {
2207
+ height: 4px;
2208
+ }
2209
+
2109
2210
  /* 5. Individual Component Styles */
2110
2211
 
2111
2212
  /* packages/components/src/atomic/Accordion/Accordion.css */
@@ -2152,21 +2253,46 @@ em {
2152
2253
  flex-shrink: 0;
2153
2254
  width: var(--icon-md);
2154
2255
  height: var(--icon-md);
2155
- transition: transform var(--dur-fast) var(--ease-in-out);
2256
+ transition: transform var(--dur-normal) var(--ease-in-out);
2156
2257
  }
2157
2258
 
2158
2259
  .dndev-accordion-content {
2159
2260
  overflow: hidden;
2160
2261
  font-size: var(--font-size-base);
2161
- transition: all var(--dur-fast) var(--ease-in-out);
2162
2262
  width: 100%;
2163
2263
  min-width: 0;
2164
2264
  text-align: start;
2165
2265
  }
2166
2266
 
2267
+ .dndev-accordion-content[data-state='open'] {
2268
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
2269
+ }
2270
+
2167
2271
  .dndev-accordion-content[data-state='closed'] {
2168
- display: none;
2272
+ animation: slideUp var(--dur-normal) var(--ease-in-out);
2273
+ }
2274
+
2275
+ @keyframes slideDown {
2276
+ from {
2277
+ height: 0;
2278
+ opacity: 0;
2279
+ }
2280
+ to {
2281
+ height: var(--radix-collapsible-content-height);
2282
+ opacity: 1;
2169
2283
  }
2284
+ }
2285
+
2286
+ @keyframes slideUp {
2287
+ from {
2288
+ height: var(--radix-collapsible-content-height);
2289
+ opacity: 1;
2290
+ }
2291
+ to {
2292
+ height: 0;
2293
+ opacity: 0;
2294
+ }
2295
+ }
2170
2296
 
2171
2297
  .dndev-accordion-content-inner {
2172
2298
  padding-bottom: var(--gap-md);
@@ -3157,21 +3283,58 @@ em {
3157
3283
  @keyframes slideDown {
3158
3284
  from {
3159
3285
  height: 0;
3286
+ opacity: 0;
3160
3287
  }
3161
3288
  to {
3162
3289
  height: var(--radix-collapsible-content-height);
3290
+ opacity: 1;
3163
3291
  }
3164
3292
  }
3165
3293
 
3166
3294
  @keyframes slideUp {
3167
3295
  from {
3168
3296
  height: var(--radix-collapsible-content-height);
3297
+ opacity: 1;
3169
3298
  }
3170
3299
  to {
3171
3300
  height: 0;
3301
+ opacity: 0;
3172
3302
  }
3173
3303
  }
3174
3304
 
3305
+ .dndev-collapsible-trigger {
3306
+ width: 100%;
3307
+ cursor: pointer;
3308
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3309
+ }
3310
+
3311
+ .dndev-collapsible-trigger:hover {
3312
+ opacity: var(--opacity-strong);
3313
+ }
3314
+
3315
+ .dndev-collapsible-trigger:focus-visible {
3316
+ outline: 2px solid var(--ring);
3317
+ outline-offset: 2px;
3318
+ border-radius: var(--radius-interactive);
3319
+ }
3320
+
3321
+ .dndev-collapsible-icon {
3322
+ width: var(--size-md);
3323
+ height: var(--size-md);
3324
+ flex-shrink: 0;
3325
+ color: var(--accent);
3326
+ transition: transform var(--dur-normal) var(--ease-in-out);
3327
+ }
3328
+
3329
+ .dndev-collapsible-chevron {
3330
+ transform: rotate(0deg);
3331
+ transition: transform var(--dur-normal) var(--ease-in-out);
3332
+ }
3333
+
3334
+ .dndev-collapsible[data-state='open'] .dndev-collapsible-chevron {
3335
+ transform: rotate(180deg);
3336
+ }
3337
+
3175
3338
  /* packages/components/src/atomic/Combobox/Combobox.css */
3176
3339
 
3177
3340
  .dndev-combobox-trigger {
@@ -3251,7 +3414,7 @@ em {
3251
3414
  .dndev-combobox-content {
3252
3415
  width: var(--radix-popover-trigger-width);
3253
3416
  min-width: var(--radix-popover-trigger-width);
3254
- max-height: 300px;
3417
+ max-width: var(--radix-popover-trigger-width);
3255
3418
  display: flex;
3256
3419
  flex-direction: column;
3257
3420
  padding: 0;
@@ -3266,14 +3429,6 @@ em {
3266
3429
  width: 100%;
3267
3430
  }
3268
3431
 
3269
- .dndev-combobox-list {
3270
- overflow-y: auto;
3271
- padding: var(--gap-tight);
3272
- display: flex;
3273
- flex-direction: column;
3274
- gap: var(--gap-none);
3275
- }
3276
-
3277
3432
  .dndev-combobox-option {
3278
3433
  all: unset;
3279
3434
  display: flex;
@@ -3330,6 +3485,30 @@ em {
3330
3485
  color: var(--muted-foreground);
3331
3486
  }
3332
3487
 
3488
+ /* Creatable option styling */
3489
+
3490
+ .dndev-combobox-option-create {
3491
+ color: var(--primary);
3492
+ font-style: italic;
3493
+ }
3494
+
3495
+ .dndev-combobox-option-create-icon {
3496
+ width: var(--icon-md);
3497
+ height: var(--icon-md);
3498
+ margin-inline-end: var(--gap-sm);
3499
+ flex-shrink: 0;
3500
+ }
3501
+
3502
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
3503
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
3504
+ transform: rotate(180deg);
3505
+ }
3506
+
3507
+ .dndev-input-with-trailing-icon .dndev-input-icon svg,
3508
+ .dndev-input-with-trailing-icon .dndev-input-icon > * {
3509
+ transition: transform var(--dur-fast) var(--ease-in-out);
3510
+ }
3511
+
3333
3512
  /* packages/components/src/atomic/DualCard/DualCard.css */
3334
3513
 
3335
3514
  .dndev-dual-card {
@@ -3516,13 +3695,15 @@ em {
3516
3695
  text-align: start;
3517
3696
  display: block;
3518
3697
  line-height: 1.5; /* Match line numbers */
3698
+ font-size: var(--font-size-sm); /* Explicit match with line numbers */
3519
3699
  }
3520
3700
 
3521
- /* Ensure shiki-generated code respects line-height */
3701
+ /* Ensure shiki-generated code respects line-height AND font-size */
3522
3702
 
3523
3703
  .dndev-code-code pre,
3524
3704
  .dndev-code-code code {
3525
3705
  line-height: inherit;
3706
+ font-size: inherit; /* Match parent font-size */
3526
3707
  }
3527
3708
 
3528
3709
  /* packages/components/src/atomic/Command/Command.css */
@@ -3900,16 +4081,6 @@ em {
3900
4081
  padding: var(--gap-sm);
3901
4082
  }
3902
4083
 
3903
- /* Dropdown scroll area - constrain height to 50dvh */
3904
-
3905
- .dndev-dropdown-scroll-area {
3906
- max-height: 50dvh;
3907
- }
3908
-
3909
- .dndev-dropdown-scroll-area .dndev-scroll-area-viewport {
3910
- max-height: 50dvh;
3911
- }
3912
-
3913
4084
  /* Checked state styling */
3914
4085
 
3915
4086
  .dndev-interactive[data-role='menu-item'][data-state='checked'] {
@@ -4433,6 +4604,49 @@ em {
4433
4604
  margin-inline-start: var(--gap-sm);
4434
4605
  }
4435
4606
 
4607
+ /* Floating Label - positioned absolutely at top of input fields */
4608
+
4609
+ .dndev-floating-label {
4610
+ position: absolute;
4611
+ inset-inline-start: var(--gap-md);
4612
+ top: calc(-1 * var(--font-size-xs) / 2 - 1px);
4613
+ font-size: var(--font-size-xs);
4614
+ font-weight: 500;
4615
+ pointer-events: none;
4616
+ z-index: 1;
4617
+ background-color: var(--background);
4618
+ padding: 0 var(--gap-sm);
4619
+ line-height: 1;
4620
+ color: var(--foreground);
4621
+ }
4622
+
4623
+ /* Inherit background when inside floating containers (dropdowns, menus, popovers) */
4624
+
4625
+ .dndev-floating .dndev-floating-label,
4626
+ .dndev-menu-content .dndev-floating-label,
4627
+ [class*='dndev-dropdown'] .dndev-floating-label,
4628
+ [class*='dndev-navigation'] .dndev-floating-label {
4629
+ background-color: var(--popover);
4630
+ color: var(--popover-foreground);
4631
+ }
4632
+
4633
+ /* When floating container has blank glow, use solid popover background */
4634
+
4635
+ .dndev-floating[data-glow='blank'] .dndev-floating-label {
4636
+ background-color: var(--popover);
4637
+ }
4638
+
4639
+ .dndev-floating-label[data-disabled='true'] {
4640
+ color: var(--muted-foreground);
4641
+ }
4642
+
4643
+ .dndev-floating-label[data-truncate='true'] {
4644
+ max-width: calc(100% - var(--gap-md) * 2);
4645
+ overflow: hidden;
4646
+ text-overflow: ellipsis;
4647
+ white-space: nowrap;
4648
+ }
4649
+
4436
4650
  /* packages/components/src/atomic/List/List.css */
4437
4651
 
4438
4652
  .dndev-list {
@@ -4741,20 +4955,41 @@ em {
4741
4955
  /* packages/components/src/atomic/PasswordInput/PasswordInput.css */
4742
4956
 
4743
4957
  .dndev-password-input-with-toggle {
4744
- padding-inline-end: var(--gap-lg);
4958
+ padding-inline-end: calc(var(--gap-xl) + var(--gap-md)) !important;
4745
4959
  }
4746
4960
 
4961
+ /* Eye icon toggle - ALWAYS at end, cannot be overridden */
4962
+
4747
4963
  .dndev-password-toggle-button {
4748
- position: absolute;
4749
- inset-inline-end: 0;
4750
- top: 0;
4751
- height: 100%;
4752
- padding-inline-start: var(--gap-md);
4753
- padding-inline-end: var(--gap-md);
4964
+ position: absolute !important;
4965
+ top: 50% !important;
4966
+ transform: translateY(-50%) !important;
4967
+ inset-inline-end: var(--gap-sm) !important;
4968
+ inset-inline-start: unset !important;
4969
+ background: none !important;
4970
+ border: none !important;
4971
+ cursor: pointer !important;
4972
+ padding: var(--gap-tight) !important;
4973
+ display: flex !important;
4974
+ align-items: center !important;
4975
+ opacity: var(--opacity-muted) !important;
4976
+ transition: opacity var(--dur-fast) var(--ease-in-out) !important;
4977
+ -webkit-user-select: none !important;
4978
+ -moz-user-select: none !important;
4979
+ user-select: none !important;
4980
+ z-index: 1 !important;
4981
+ }
4982
+
4983
+ .dndev-password-toggle-button:hover,
4984
+ .dndev-password-toggle-button:focus {
4985
+ opacity: 1 !important;
4986
+ outline: none !important;
4754
4987
  }
4755
4988
 
4756
4989
  .dndev-password-toggle-icon {
4757
4990
  color: var(--muted-foreground);
4991
+ width: var(--icon-sm);
4992
+ height: var(--icon-sm);
4758
4993
  }
4759
4994
 
4760
4995
  /* packages/components/src/atomic/Pagination/Pagination.css */
@@ -4846,9 +5081,32 @@ em {
4846
5081
  height: 100%;
4847
5082
  width: 100%;
4848
5083
  flex: 1;
5084
+ background-color: var(--primary);
4849
5085
  transition: transform var(--dur-normal) var(--ease-in-out);
5086
+
5087
+ /* Variant colors */
4850
5088
  }
4851
5089
 
5090
+ [data-variant='default']:is(.dndev-progress [data-radix-progress-indicator]) {
5091
+ background-color: var(--primary);
5092
+ }
5093
+
5094
+ [data-variant='accent']:is(.dndev-progress [data-radix-progress-indicator]) {
5095
+ background-color: var(--accent);
5096
+ }
5097
+
5098
+ [data-variant='success']:is(.dndev-progress [data-radix-progress-indicator]) {
5099
+ background-color: var(--success);
5100
+ }
5101
+
5102
+ [data-variant='warning']:is(.dndev-progress [data-radix-progress-indicator]) {
5103
+ background-color: var(--warning);
5104
+ }
5105
+
5106
+ [data-variant='destructive']:is(.dndev-progress [data-radix-progress-indicator]) {
5107
+ background-color: var(--destructive);
5108
+ }
5109
+
4852
5110
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4853
5111
 
4854
5112
  /* Uses shared .dndev-control-group pattern from patterns.css */
@@ -5054,7 +5312,6 @@ em {
5054
5312
  display: flex;
5055
5313
  flex-direction: column;
5056
5314
  padding: 0;
5057
- overflow-y: auto;
5058
5315
  }
5059
5316
 
5060
5317
  .dndev-interactive[data-radix-select-item] {
@@ -5176,6 +5433,7 @@ em {
5176
5433
  letter-spacing: 0.2em;
5177
5434
  color: var(--accent) !important;
5178
5435
  margin-block-end: var(--gap-md);
5436
+ text-align: center; /* DEFAULT - works without attribute selector */
5179
5437
  }
5180
5438
 
5181
5439
  .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
@@ -5190,6 +5448,51 @@ em {
5190
5448
  text-align: end;
5191
5449
  }
5192
5450
 
5451
+ /* Collapsible title trigger */
5452
+
5453
+ .dndev-section-title-trigger {
5454
+ width: 100%;
5455
+ cursor: pointer;
5456
+ transition: opacity var(--dur-fast) var(--ease-in-out);
5457
+ margin-block-end: var(--gap-md);
5458
+ }
5459
+
5460
+ .dndev-section-title-trigger .dndev-section-title {
5461
+ margin-block-end: 0;
5462
+ }
5463
+
5464
+ .dndev-section-title-trigger:hover {
5465
+ opacity: var(--opacity-strong);
5466
+ }
5467
+
5468
+ .dndev-section-title-trigger:focus-visible {
5469
+ outline: 2px solid var(--ring);
5470
+ outline-offset: 2px;
5471
+ border-radius: var(--radius-interactive);
5472
+ }
5473
+
5474
+ .dndev-section-icon {
5475
+ width: var(--size-md);
5476
+ height: var(--size-md);
5477
+ flex-shrink: 0;
5478
+ color: var(--accent);
5479
+ transition: transform var(--dur-normal) var(--ease-in-out);
5480
+ }
5481
+
5482
+ .dndev-section-full-width[data-text-align='start']
5483
+ .dndev-section-title-trigger {
5484
+ justify-content: flex-start;
5485
+ }
5486
+
5487
+ .dndev-section-full-width[data-text-align='center']
5488
+ .dndev-section-title-trigger {
5489
+ justify-content: center;
5490
+ }
5491
+
5492
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title-trigger {
5493
+ justify-content: flex-end;
5494
+ }
5495
+
5193
5496
  /* packages/components/src/atomic/Separator/Separator.css */
5194
5497
 
5195
5498
  .dndev-separator {
@@ -6052,6 +6355,64 @@ em {
6052
6355
  transform: translateX(calc(2.75rem - 1.25rem - 0.125rem));
6053
6356
  }
6054
6357
 
6358
+ /* Switch with labels container */
6359
+
6360
+ .dndev-switch-with-labels {
6361
+ display: inline-flex;
6362
+ align-items: center;
6363
+ gap: var(--gap-sm);
6364
+ flex-wrap: wrap;
6365
+ }
6366
+
6367
+ /* Labels - keep switch and its labels on one line when possible */
6368
+
6369
+ .dndev-switch-with-labels > .dndev-switch {
6370
+ flex-shrink: 0;
6371
+ }
6372
+
6373
+ .dndev-switch-label {
6374
+ font-size: var(--font-size-sm);
6375
+ transition: color var(--dur-normal) var(--ease-in-out),
6376
+ font-weight var(--dur-normal) var(--ease-in-out);
6377
+ white-space: nowrap;
6378
+ }
6379
+
6380
+ /* Unchecked label - active when switch is unchecked */
6381
+
6382
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6383
+ .dndev-switch-label-unchecked,
6384
+ .dndev-switch-with-labels[data-checked='false']
6385
+ .dndev-switch-label-unchecked {
6386
+ color: var(--foreground);
6387
+ font-weight: var(--font-weight-medium);
6388
+ }
6389
+
6390
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6391
+ .dndev-switch-label-unchecked,
6392
+ .dndev-switch-with-labels[data-checked='true']
6393
+ .dndev-switch-label-unchecked {
6394
+ color: var(--muted-foreground);
6395
+ font-weight: var(--font-weight-normal);
6396
+ }
6397
+
6398
+ /* Checked label - active when switch is checked */
6399
+
6400
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6401
+ .dndev-switch-label-checked,
6402
+ .dndev-switch-with-labels[data-checked='true']
6403
+ .dndev-switch-label-checked {
6404
+ color: var(--foreground);
6405
+ font-weight: var(--font-weight-medium);
6406
+ }
6407
+
6408
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6409
+ .dndev-switch-label-checked,
6410
+ .dndev-switch-with-labels[data-checked='false']
6411
+ .dndev-switch-label-checked {
6412
+ color: var(--muted-foreground);
6413
+ font-weight: var(--font-weight-normal);
6414
+ }
6415
+
6055
6416
  /* packages/components/src/atomic/Table/Table.css */
6056
6417
 
6057
6418
  .dndev-table-wrapper {
@@ -6117,7 +6478,7 @@ em {
6117
6478
  /* Table head (th) styles */
6118
6479
 
6119
6480
  .dndev-table-head {
6120
- text-align: left;
6481
+ text-align: start;
6121
6482
  vertical-align: middle;
6122
6483
  font-weight: 500;
6123
6484
  color: var(--muted-foreground);
@@ -6134,12 +6495,12 @@ em {
6134
6495
  text-align: center;
6135
6496
  }
6136
6497
 
6137
- .dndev-table-head[data-align='right'] {
6138
- text-align: right;
6498
+ .dndev-table-head[data-align='end'] {
6499
+ text-align: end;
6139
6500
  }
6140
6501
 
6141
- .dndev-table-head[data-align='left'] {
6142
- text-align: left;
6502
+ .dndev-table-head[data-align='start'] {
6503
+ text-align: start;
6143
6504
  }
6144
6505
 
6145
6506
  /* Table cell (td) styles */
@@ -6155,14 +6516,48 @@ em {
6155
6516
  text-align: center;
6156
6517
  }
6157
6518
 
6158
- .dndev-table-cell[data-align='right'] {
6159
- text-align: right;
6519
+ .dndev-table-cell[data-align='end'] {
6520
+ text-align: end;
6160
6521
  }
6161
6522
 
6162
- .dndev-table-cell[data-align='left'] {
6163
- text-align: left;
6523
+ .dndev-table-cell[data-align='start'] {
6524
+ text-align: start;
6164
6525
  }
6165
6526
 
6527
+ /* Excel-like grid lines variant */
6528
+
6529
+ .dndev-table-grid .dndev-table-head,
6530
+ .dndev-table-grid .dndev-table-cell {
6531
+ border: 1px solid var(--border);
6532
+ padding: 0;
6533
+ }
6534
+
6535
+ .dndev-table-grid .dndev-table-row {
6536
+ border-bottom: 1px solid var(--border);
6537
+ }
6538
+
6539
+ .dndev-table-grid .dndev-table-row:last-child {
6540
+ border-bottom: 1px solid var(--border);
6541
+ }
6542
+
6543
+ /* Input components inside grid cells should be borderless and fit snugly */
6544
+
6545
+ .dndev-table-grid .dndev-table-cell .dndev-input,
6546
+ .dndev-table-grid .dndev-table-cell input[type="text"],
6547
+ .dndev-table-grid .dndev-table-cell input[type="number"] {
6548
+ border: none;
6549
+ background: transparent;
6550
+ width: 100%;
6551
+ height: 100%;
6552
+ box-shadow: none;
6553
+ }
6554
+
6555
+ .dndev-table-grid .dndev-table-cell .dndev-input:focus,
6556
+ .dndev-table-grid .dndev-table-cell input:focus {
6557
+ outline: 2px solid var(--primary);
6558
+ outline-offset: -2px;
6559
+ }
6560
+
6166
6561
  /* Table caption styles */
6167
6562
 
6168
6563
  .dndev-table-caption {
@@ -6179,7 +6574,7 @@ em {
6179
6574
 
6180
6575
  .dndev-table-search-icon {
6181
6576
  position: absolute;
6182
- left: var(--gap-md);
6577
+ inset-inline-start: var(--gap-md);
6183
6578
  top: 50%;
6184
6579
  transform: translateY(-50%);
6185
6580
  width: var(--icon-md);
@@ -6346,7 +6741,7 @@ em {
6346
6741
  .dndev-tag {
6347
6742
  display: inline-flex;
6348
6743
  align-items: center;
6349
- gap: var(--gap-xs);
6744
+ gap: var(--gap-sm);
6350
6745
  border-radius: var(--radius-full);
6351
6746
  border: 1px solid transparent;
6352
6747
  font-size: var(--font-size-sm);
@@ -6476,8 +6871,18 @@ em {
6476
6871
  font-weight: var(--font-weight-medium);
6477
6872
  line-height: var(--line-height);
6478
6873
  background-color: transparent; /* Text never has background, only color changes */
6874
+
6875
+ /* Respect semantic HTML elements */
6479
6876
  }
6480
6877
 
6878
+ .dndev-text-base:is(strong) {
6879
+ font-weight: var(--font-weight-semibold);
6880
+ }
6881
+
6882
+ .dndev-text-base:is(em) {
6883
+ font-style: italic;
6884
+ }
6885
+
6481
6886
  .dndev-text-base[data-variant='default'] {
6482
6887
  color: inherit;
6483
6888
  }
@@ -7425,7 +7830,7 @@ em {
7425
7830
  align-items: stretch;
7426
7831
  }
7427
7832
 
7428
- @media (width <= 699px) {
7833
+ @media (width <=699px) {
7429
7834
 
7430
7835
  [data-cols='2'] {
7431
7836
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7437,14 +7842,14 @@ em {
7437
7842
  align-items: stretch;
7438
7843
  }
7439
7844
 
7440
- @media (width <= 1049px) {
7845
+ @media (width <=1049px) {
7441
7846
 
7442
7847
  [data-cols='3'] {
7443
7848
  grid-template-columns: repeat(2, minmax(350px, 1fr));
7444
7849
  }
7445
7850
  }
7446
7851
 
7447
- @media (width <= 699px) {
7852
+ @media (width <=699px) {
7448
7853
 
7449
7854
  [data-cols='3'] {
7450
7855
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7458,21 +7863,21 @@ em {
7458
7863
  /* Responsive: reduce columns when container is narrow */
7459
7864
  }
7460
7865
 
7461
- @media (width <= 1399px) {
7866
+ @media (width <=1399px) {
7462
7867
 
7463
7868
  [data-cols='4'] {
7464
7869
  grid-template-columns: repeat(3, minmax(0, 1fr));
7465
7870
  }
7466
7871
  }
7467
7872
 
7468
- @media (width <= 1049px) {
7873
+ @media (width <=1049px) {
7469
7874
 
7470
7875
  [data-cols='4'] {
7471
7876
  grid-template-columns: repeat(2, minmax(0, 1fr));
7472
7877
  }
7473
7878
  }
7474
7879
 
7475
- @media (width <= 699px) {
7880
+ @media (width <=699px) {
7476
7881
 
7477
7882
  [data-cols='4'] {
7478
7883
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -7539,18 +7944,22 @@ em {
7539
7944
 
7540
7945
  code {
7541
7946
  font-family: var(--font-mono);
7542
- font-size: inherit; /* Inherit parent size */
7543
- font-weight: inherit; /* Inherit parent weight */
7947
+ font-size: inherit;
7948
+ /* Inherit parent size */
7949
+ font-weight: inherit;
7950
+ /* Inherit parent weight */
7544
7951
  line-height: inherit;
7545
7952
  color: inherit;
7546
- background: transparent; /* No background by default */
7953
+ background: transparent;
7954
+ /* No background by default */
7547
7955
  }
7548
7956
 
7549
7957
  /* Code variant - visual styling (background, padding, can apply to any element) */
7550
7958
 
7551
7959
  [data-variant='code'] {
7552
7960
  font-family: var(--font-mono);
7553
- font-size: var(--font-size-sm); /* Default small size */
7961
+ font-size: var(--font-size-sm);
7962
+ /* Default small size */
7554
7963
  background: var(--muted);
7555
7964
  color: var(--muted-foreground);
7556
7965
  padding: var(--gap-sm) var(--gap-md);
@@ -7645,7 +8054,8 @@ h4[data-variant='code'] {
7645
8054
 
7646
8055
  .dndev-relative {
7647
8056
  position: relative;
7648
- min-width: 0; /* Allow flex items to shrink below content size */
8057
+ min-width: 0;
8058
+ /* Allow flex items to shrink below content size */
7649
8059
  }
7650
8060
 
7651
8061
  .dndev-absolute {
@@ -7750,7 +8160,7 @@ h4[data-variant='code'] {
7750
8160
  RESPONSIVE DISPLAY
7751
8161
  =========================== */
7752
8162
 
7753
- @media (width >= 768px) {
8163
+ @media (width >=768px) {
7754
8164
  .dndev-md\:block {
7755
8165
  display: block;
7756
8166
  }
@@ -7776,7 +8186,7 @@ h4[data-variant='code'] {
7776
8186
  }
7777
8187
  }
7778
8188
 
7779
- @media (width >= 1024px) {
8189
+ @media (width >=1024px) {
7780
8190
  .dndev-lg\:block {
7781
8191
  display: block;
7782
8192
  }
@@ -7836,6 +8246,10 @@ h4[data-variant='code'] {
7836
8246
  Components are unaffected - they own their own spacing
7837
8247
  =========================== */
7838
8248
 
8249
+ .prose {
8250
+ text-align: start;
8251
+ }
8252
+
7839
8253
  .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7840
8254
  margin-block: var(--gap-md);
7841
8255
  }