@donotdev/ui 0.0.7 → 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 (48) 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 +447 -63
  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.map +1 -1
  22. package/dist/internal/layout/components/PerformanceHints.js +3 -2
  23. package/dist/internal/layout/config/presets/admin.d.ts +2 -2
  24. package/dist/internal/layout/config/presets/admin.d.ts.map +1 -1
  25. package/dist/internal/layout/config/presets/admin.js +8 -4
  26. package/dist/providers/NextJsAppProviders.d.ts.map +1 -1
  27. package/dist/providers/NextJsAppProviders.js +4 -1
  28. package/dist/routing/hooks/hooks.next.d.ts +1 -0
  29. package/dist/routing/hooks/hooks.next.d.ts.map +1 -1
  30. package/dist/routing/hooks/hooks.next.js +1 -1
  31. package/dist/routing/hooks/hooks.vite.d.ts +1 -0
  32. package/dist/routing/hooks/hooks.vite.d.ts.map +1 -1
  33. package/dist/routing/hooks/hooks.vite.js +1 -1
  34. package/dist/routing/hooks/useRouteParam.next.d.ts +18 -0
  35. package/dist/routing/hooks/useRouteParam.next.d.ts.map +1 -0
  36. package/dist/routing/hooks/useRouteParam.next.js +38 -0
  37. package/dist/routing/hooks/useRouteParam.vite.d.ts +18 -0
  38. package/dist/routing/hooks/useRouteParam.vite.d.ts.map +1 -0
  39. package/dist/routing/hooks/useRouteParam.vite.js +38 -0
  40. package/dist/routing/index.d.ts +1 -1
  41. package/dist/routing/index.d.ts.map +1 -1
  42. package/dist/routing/index.js +1 -1
  43. package/dist/styles/index.css +443 -59
  44. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  45. package/dist/utils/useCrudSafe.js +2 -1
  46. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  47. package/dist/vite-routing/RootLayout.js +4 -1
  48. package/package.json +9 -9
package/dist/dndev.css CHANGED
@@ -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×) */
@@ -714,6 +714,16 @@ em {
714
714
 
715
715
  /* packages/components/src/styles/patterns.css */
716
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
+
717
727
  /* ===========================
718
728
  FORM COMPONENTS (BASE)
719
729
  =========================== */
@@ -908,6 +918,9 @@ em {
908
918
  border-radius: var(--radius-surface);
909
919
  box-shadow: var(--shadow-md);
910
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 */
911
924
  position: relative;
912
925
  overflow: hidden;
913
926
  contain: layout style;
@@ -1158,6 +1171,9 @@ em {
1158
1171
  border-radius: var(--radius-floating);
1159
1172
  box-shadow: var(--shadow-md);
1160
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 */
1161
1177
  position: relative;
1162
1178
  overflow: hidden;
1163
1179
  contain: layout style;
@@ -2088,8 +2104,9 @@ em {
2088
2104
  display: flex;
2089
2105
  flex-direction: column;
2090
2106
  overflow-y: auto;
2091
- overflow-x: hidden;
2107
+ overflow-x: visible;
2092
2108
  min-height: 0;
2109
+ padding-block-start: var(--gap-sm);
2093
2110
  }
2094
2111
 
2095
2112
  .dndev-modal-title {
@@ -2148,6 +2165,60 @@ em {
2148
2165
  flex-direction: column;
2149
2166
  }
2150
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
+
2151
2222
  /* 5. Individual Component Styles */
2152
2223
 
2153
2224
  /* packages/components/src/atomic/Accordion/Accordion.css */
@@ -2194,21 +2265,46 @@ em {
2194
2265
  flex-shrink: 0;
2195
2266
  width: var(--icon-md);
2196
2267
  height: var(--icon-md);
2197
- transition: transform var(--dur-fast) var(--ease-in-out);
2268
+ transition: transform var(--dur-normal) var(--ease-in-out);
2198
2269
  }
2199
2270
 
2200
2271
  .dndev-accordion-content {
2201
2272
  overflow: hidden;
2202
2273
  font-size: var(--font-size-base);
2203
- transition: all var(--dur-fast) var(--ease-in-out);
2204
2274
  width: 100%;
2205
2275
  min-width: 0;
2206
2276
  text-align: start;
2207
2277
  }
2208
2278
 
2279
+ .dndev-accordion-content[data-state='open'] {
2280
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
2281
+ }
2282
+
2209
2283
  .dndev-accordion-content[data-state='closed'] {
2210
- 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;
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;
2211
2302
  }
2303
+ to {
2304
+ height: 0;
2305
+ opacity: 0;
2306
+ }
2307
+ }
2212
2308
 
2213
2309
  .dndev-accordion-content-inner {
2214
2310
  padding-bottom: var(--gap-md);
@@ -3199,21 +3295,58 @@ em {
3199
3295
  @keyframes slideDown {
3200
3296
  from {
3201
3297
  height: 0;
3298
+ opacity: 0;
3202
3299
  }
3203
3300
  to {
3204
3301
  height: var(--radix-collapsible-content-height);
3302
+ opacity: 1;
3205
3303
  }
3206
3304
  }
3207
3305
 
3208
3306
  @keyframes slideUp {
3209
3307
  from {
3210
3308
  height: var(--radix-collapsible-content-height);
3309
+ opacity: 1;
3211
3310
  }
3212
3311
  to {
3213
3312
  height: 0;
3313
+ opacity: 0;
3214
3314
  }
3215
3315
  }
3216
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
+
3217
3350
  /* packages/components/src/atomic/Combobox/Combobox.css */
3218
3351
 
3219
3352
  .dndev-combobox-trigger {
@@ -3293,7 +3426,7 @@ em {
3293
3426
  .dndev-combobox-content {
3294
3427
  width: var(--radix-popover-trigger-width);
3295
3428
  min-width: var(--radix-popover-trigger-width);
3296
- max-height: 300px;
3429
+ max-width: var(--radix-popover-trigger-width);
3297
3430
  display: flex;
3298
3431
  flex-direction: column;
3299
3432
  padding: 0;
@@ -3308,14 +3441,6 @@ em {
3308
3441
  width: 100%;
3309
3442
  }
3310
3443
 
3311
- .dndev-combobox-list {
3312
- overflow-y: auto;
3313
- padding: var(--gap-tight);
3314
- display: flex;
3315
- flex-direction: column;
3316
- gap: var(--gap-none);
3317
- }
3318
-
3319
3444
  .dndev-combobox-option {
3320
3445
  all: unset;
3321
3446
  display: flex;
@@ -3372,6 +3497,30 @@ em {
3372
3497
  color: var(--muted-foreground);
3373
3498
  }
3374
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
+
3375
3524
  /* packages/components/src/atomic/DualCard/DualCard.css */
3376
3525
 
3377
3526
  .dndev-dual-card {
@@ -3558,13 +3707,15 @@ em {
3558
3707
  text-align: start;
3559
3708
  display: block;
3560
3709
  line-height: 1.5; /* Match line numbers */
3710
+ font-size: var(--font-size-sm); /* Explicit match with line numbers */
3561
3711
  }
3562
3712
 
3563
- /* Ensure shiki-generated code respects line-height */
3713
+ /* Ensure shiki-generated code respects line-height AND font-size */
3564
3714
 
3565
3715
  .dndev-code-code pre,
3566
3716
  .dndev-code-code code {
3567
3717
  line-height: inherit;
3718
+ font-size: inherit; /* Match parent font-size */
3568
3719
  }
3569
3720
 
3570
3721
  /* packages/components/src/atomic/Command/Command.css */
@@ -3942,16 +4093,6 @@ em {
3942
4093
  padding: var(--gap-sm);
3943
4094
  }
3944
4095
 
3945
- /* Dropdown scroll area - constrain height to 50dvh */
3946
-
3947
- .dndev-dropdown-scroll-area {
3948
- max-height: 50dvh;
3949
- }
3950
-
3951
- .dndev-dropdown-scroll-area .dndev-scroll-area-viewport {
3952
- max-height: 50dvh;
3953
- }
3954
-
3955
4096
  /* Checked state styling */
3956
4097
 
3957
4098
  .dndev-interactive[data-role='menu-item'][data-state='checked'] {
@@ -4475,6 +4616,49 @@ em {
4475
4616
  margin-inline-start: var(--gap-sm);
4476
4617
  }
4477
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
+
4478
4662
  /* packages/components/src/atomic/List/List.css */
4479
4663
 
4480
4664
  .dndev-list {
@@ -4783,20 +4967,41 @@ em {
4783
4967
  /* packages/components/src/atomic/PasswordInput/PasswordInput.css */
4784
4968
 
4785
4969
  .dndev-password-input-with-toggle {
4786
- padding-inline-end: var(--gap-lg);
4970
+ padding-inline-end: calc(var(--gap-xl) + var(--gap-md)) !important;
4787
4971
  }
4788
4972
 
4973
+ /* Eye icon toggle - ALWAYS at end, cannot be overridden */
4974
+
4789
4975
  .dndev-password-toggle-button {
4790
- position: absolute;
4791
- inset-inline-end: 0;
4792
- top: 0;
4793
- height: 100%;
4794
- padding-inline-start: var(--gap-md);
4795
- 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;
4796
4999
  }
4797
5000
 
4798
5001
  .dndev-password-toggle-icon {
4799
5002
  color: var(--muted-foreground);
5003
+ width: var(--icon-sm);
5004
+ height: var(--icon-sm);
4800
5005
  }
4801
5006
 
4802
5007
  /* packages/components/src/atomic/Pagination/Pagination.css */
@@ -4888,9 +5093,32 @@ em {
4888
5093
  height: 100%;
4889
5094
  width: 100%;
4890
5095
  flex: 1;
5096
+ background-color: var(--primary);
4891
5097
  transition: transform var(--dur-normal) var(--ease-in-out);
5098
+
5099
+ /* Variant colors */
4892
5100
  }
4893
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
+
4894
5122
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4895
5123
 
4896
5124
  /* Uses shared .dndev-control-group pattern from patterns.css */
@@ -5096,7 +5324,6 @@ em {
5096
5324
  display: flex;
5097
5325
  flex-direction: column;
5098
5326
  padding: 0;
5099
- overflow-y: auto;
5100
5327
  }
5101
5328
 
5102
5329
  .dndev-interactive[data-radix-select-item] {
@@ -5218,6 +5445,7 @@ em {
5218
5445
  letter-spacing: 0.2em;
5219
5446
  color: var(--accent) !important;
5220
5447
  margin-block-end: var(--gap-md);
5448
+ text-align: center; /* DEFAULT - works without attribute selector */
5221
5449
  }
5222
5450
 
5223
5451
  .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
@@ -5232,6 +5460,51 @@ em {
5232
5460
  text-align: end;
5233
5461
  }
5234
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
+
5235
5508
  /* packages/components/src/atomic/Separator/Separator.css */
5236
5509
 
5237
5510
  .dndev-separator {
@@ -6094,6 +6367,64 @@ em {
6094
6367
  transform: translateX(calc(2.75rem - 1.25rem - 0.125rem));
6095
6368
  }
6096
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
+
6097
6428
  /* packages/components/src/atomic/Table/Table.css */
6098
6429
 
6099
6430
  .dndev-table-wrapper {
@@ -6159,7 +6490,7 @@ em {
6159
6490
  /* Table head (th) styles */
6160
6491
 
6161
6492
  .dndev-table-head {
6162
- text-align: left;
6493
+ text-align: start;
6163
6494
  vertical-align: middle;
6164
6495
  font-weight: 500;
6165
6496
  color: var(--muted-foreground);
@@ -6176,12 +6507,12 @@ em {
6176
6507
  text-align: center;
6177
6508
  }
6178
6509
 
6179
- .dndev-table-head[data-align='right'] {
6180
- text-align: right;
6510
+ .dndev-table-head[data-align='end'] {
6511
+ text-align: end;
6181
6512
  }
6182
6513
 
6183
- .dndev-table-head[data-align='left'] {
6184
- text-align: left;
6514
+ .dndev-table-head[data-align='start'] {
6515
+ text-align: start;
6185
6516
  }
6186
6517
 
6187
6518
  /* Table cell (td) styles */
@@ -6197,14 +6528,48 @@ em {
6197
6528
  text-align: center;
6198
6529
  }
6199
6530
 
6200
- .dndev-table-cell[data-align='right'] {
6201
- text-align: right;
6531
+ .dndev-table-cell[data-align='end'] {
6532
+ text-align: end;
6202
6533
  }
6203
6534
 
6204
- .dndev-table-cell[data-align='left'] {
6205
- text-align: left;
6535
+ .dndev-table-cell[data-align='start'] {
6536
+ text-align: start;
6206
6537
  }
6207
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
+
6208
6573
  /* Table caption styles */
6209
6574
 
6210
6575
  .dndev-table-caption {
@@ -6221,7 +6586,7 @@ em {
6221
6586
 
6222
6587
  .dndev-table-search-icon {
6223
6588
  position: absolute;
6224
- left: var(--gap-md);
6589
+ inset-inline-start: var(--gap-md);
6225
6590
  top: 50%;
6226
6591
  transform: translateY(-50%);
6227
6592
  width: var(--icon-md);
@@ -6388,7 +6753,7 @@ em {
6388
6753
  .dndev-tag {
6389
6754
  display: inline-flex;
6390
6755
  align-items: center;
6391
- gap: var(--gap-xs);
6756
+ gap: var(--gap-sm);
6392
6757
  border-radius: var(--radius-full);
6393
6758
  border: 1px solid transparent;
6394
6759
  font-size: var(--font-size-sm);
@@ -6518,8 +6883,18 @@ em {
6518
6883
  font-weight: var(--font-weight-medium);
6519
6884
  line-height: var(--line-height);
6520
6885
  background-color: transparent; /* Text never has background, only color changes */
6886
+
6887
+ /* Respect semantic HTML elements */
6521
6888
  }
6522
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
+
6523
6898
  .dndev-text-base[data-variant='default'] {
6524
6899
  color: inherit;
6525
6900
  }
@@ -7467,7 +7842,7 @@ em {
7467
7842
  align-items: stretch;
7468
7843
  }
7469
7844
 
7470
- @media (width <= 699px) {
7845
+ @media (width <=699px) {
7471
7846
 
7472
7847
  [data-cols='2'] {
7473
7848
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7479,14 +7854,14 @@ em {
7479
7854
  align-items: stretch;
7480
7855
  }
7481
7856
 
7482
- @media (width <= 1049px) {
7857
+ @media (width <=1049px) {
7483
7858
 
7484
7859
  [data-cols='3'] {
7485
7860
  grid-template-columns: repeat(2, minmax(350px, 1fr));
7486
7861
  }
7487
7862
  }
7488
7863
 
7489
- @media (width <= 699px) {
7864
+ @media (width <=699px) {
7490
7865
 
7491
7866
  [data-cols='3'] {
7492
7867
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7500,21 +7875,21 @@ em {
7500
7875
  /* Responsive: reduce columns when container is narrow */
7501
7876
  }
7502
7877
 
7503
- @media (width <= 1399px) {
7878
+ @media (width <=1399px) {
7504
7879
 
7505
7880
  [data-cols='4'] {
7506
7881
  grid-template-columns: repeat(3, minmax(0, 1fr));
7507
7882
  }
7508
7883
  }
7509
7884
 
7510
- @media (width <= 1049px) {
7885
+ @media (width <=1049px) {
7511
7886
 
7512
7887
  [data-cols='4'] {
7513
7888
  grid-template-columns: repeat(2, minmax(0, 1fr));
7514
7889
  }
7515
7890
  }
7516
7891
 
7517
- @media (width <= 699px) {
7892
+ @media (width <=699px) {
7518
7893
 
7519
7894
  [data-cols='4'] {
7520
7895
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -7581,18 +7956,22 @@ em {
7581
7956
 
7582
7957
  code {
7583
7958
  font-family: var(--font-mono);
7584
- font-size: inherit; /* Inherit parent size */
7585
- font-weight: inherit; /* Inherit parent weight */
7959
+ font-size: inherit;
7960
+ /* Inherit parent size */
7961
+ font-weight: inherit;
7962
+ /* Inherit parent weight */
7586
7963
  line-height: inherit;
7587
7964
  color: inherit;
7588
- background: transparent; /* No background by default */
7965
+ background: transparent;
7966
+ /* No background by default */
7589
7967
  }
7590
7968
 
7591
7969
  /* Code variant - visual styling (background, padding, can apply to any element) */
7592
7970
 
7593
7971
  [data-variant='code'] {
7594
7972
  font-family: var(--font-mono);
7595
- font-size: var(--font-size-sm); /* Default small size */
7973
+ font-size: var(--font-size-sm);
7974
+ /* Default small size */
7596
7975
  background: var(--muted);
7597
7976
  color: var(--muted-foreground);
7598
7977
  padding: var(--gap-sm) var(--gap-md);
@@ -7687,7 +8066,8 @@ h4[data-variant='code'] {
7687
8066
 
7688
8067
  .dndev-relative {
7689
8068
  position: relative;
7690
- min-width: 0; /* Allow flex items to shrink below content size */
8069
+ min-width: 0;
8070
+ /* Allow flex items to shrink below content size */
7691
8071
  }
7692
8072
 
7693
8073
  .dndev-absolute {
@@ -7792,7 +8172,7 @@ h4[data-variant='code'] {
7792
8172
  RESPONSIVE DISPLAY
7793
8173
  =========================== */
7794
8174
 
7795
- @media (width >= 768px) {
8175
+ @media (width >=768px) {
7796
8176
  .dndev-md\:block {
7797
8177
  display: block;
7798
8178
  }
@@ -7818,7 +8198,7 @@ h4[data-variant='code'] {
7818
8198
  }
7819
8199
  }
7820
8200
 
7821
- @media (width >= 1024px) {
8201
+ @media (width >=1024px) {
7822
8202
  .dndev-lg\:block {
7823
8203
  display: block;
7824
8204
  }
@@ -7878,6 +8258,10 @@ h4[data-variant='code'] {
7878
8258
  Components are unaffected - they own their own spacing
7879
8259
  =========================== */
7880
8260
 
8261
+ .prose {
8262
+ text-align: start;
8263
+ }
8264
+
7881
8265
  .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7882
8266
  margin-block: var(--gap-md);
7883
8267
  }
@@ -9081,7 +9465,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9081
9465
  .breadcrumb-item {
9082
9466
  display: inline-flex;
9083
9467
  align-items: center;
9084
- gap: var(--gap-xs);
9468
+ gap: var(--gap-sm);
9085
9469
  }
9086
9470
 
9087
9471
  .breadcrumbs .separator,
@@ -9158,7 +9542,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9158
9542
  min-height: 0;
9159
9543
  display: flex;
9160
9544
  flex-direction: column;
9161
- justify-content: space-between;
9545
+ justify-content: flex-start;
9162
9546
  gap: var(--gap-lg);
9163
9547
  /* Controlled by density system */
9164
9548
  /* Default: centered */
@@ -9445,7 +9829,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9445
9829
  font-family: Roboto;
9446
9830
  font-style: normal;
9447
9831
  font-weight: 400;
9448
- font-display: optional;
9832
+ font-display: swap;
9449
9833
  src: url('/fonts/Roboto-400-latin.woff2') format('woff2');
9450
9834
  unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
9451
9835
  }
@@ -9454,7 +9838,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9454
9838
  font-family: Roboto;
9455
9839
  font-style: normal;
9456
9840
  font-weight: 700;
9457
- font-display: optional;
9841
+ font-display: swap;
9458
9842
  src: url('/fonts/Roboto-700-latin.woff2') format('woff2');
9459
9843
  unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
9460
9844
  }
@@ -9602,7 +9986,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9602
9986
  font-family: Inter;
9603
9987
  font-style: normal;
9604
9988
  font-weight: 400 700;
9605
- font-display: optional;
9989
+ font-display: swap; /* Changed from optional to swap - we preload this font */
9606
9990
  src: url('/fonts/Inter-latin.woff2') format('woff2');
9607
9991
  unicode-range:
9608
9992
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
@@ -9635,7 +10019,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9635
10019
  font-family: 'Playfair Display';
9636
10020
  font-style: normal;
9637
10021
  font-weight: 400 700;
9638
- font-display: optional;
10022
+ font-display: swap;
9639
10023
  src: url('/fonts/PlayfairDisplay-latin.woff2') format('woff2');
9640
10024
  unicode-range:
9641
10025
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,