@donotdev/ui 0.0.7 → 0.0.9

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 (204) 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 -1
  6. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  7. package/dist/components/auth/AuthMenu.js +3 -3
  8. package/dist/components/common/AppLoading.d.ts +1 -1
  9. package/dist/components/common/AppLoading.d.ts.map +1 -1
  10. package/dist/components/common/AppLoading.js +0 -1
  11. package/dist/components/common/Loader.d.ts +4 -4
  12. package/dist/components/common/Loader.d.ts.map +1 -1
  13. package/dist/components/common/Loader.js +11 -12
  14. package/dist/components/common/LoadingMessage.d.ts +1 -9
  15. package/dist/components/common/LoadingMessage.d.ts.map +1 -1
  16. package/dist/components/common/LoadingMessage.js +0 -1
  17. package/dist/components/common/LoadingScreen.d.ts +1 -9
  18. package/dist/components/common/LoadingScreen.d.ts.map +1 -1
  19. package/dist/components/common/LoadingScreen.js +0 -1
  20. package/dist/components/common/RedirectOverlay.d.ts +37 -0
  21. package/dist/components/common/RedirectOverlay.d.ts.map +1 -0
  22. package/dist/components/common/RedirectOverlay.js +243 -0
  23. package/dist/components/common/TechBento.d.ts.map +1 -1
  24. package/dist/components/common/TechBento.js +1 -0
  25. package/dist/components/common/index.d.ts +1 -0
  26. package/dist/components/common/index.d.ts.map +1 -1
  27. package/dist/components/common/index.js +1 -0
  28. package/dist/components/layout/components/FloatingLanguageSwitcher.d.ts +1 -9
  29. package/dist/components/layout/components/FloatingLanguageSwitcher.d.ts.map +1 -1
  30. package/dist/components/layout/components/FloatingLanguageSwitcher.js +0 -1
  31. package/dist/components/layout/components/header/CacheSettings.d.ts.map +1 -1
  32. package/dist/components/layout/components/header/HeaderMenu.d.ts.map +1 -1
  33. package/dist/components/layout/components/header/SettingsMenu.d.ts.map +1 -1
  34. package/dist/components/layout/components/header/SettingsMenu.js +1 -2
  35. package/dist/components/layout/components/header/ThemeToggle.d.ts +1 -1
  36. package/dist/components/layout/components/header/ThemeToggle.d.ts.map +1 -1
  37. package/dist/components/layout/components/header/ThemeToggle.js +5 -4
  38. package/dist/crud/components/DisplayFieldRenderer.d.ts +3 -11
  39. package/dist/crud/components/DisplayFieldRenderer.d.ts.map +1 -1
  40. package/dist/crud/components/DisplayFieldRenderer.js +4 -3
  41. package/dist/crud/components/EntityDisplayRenderer.d.ts +2 -2
  42. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts +2 -2
  43. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts +2 -2
  44. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts +2 -2
  45. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts +2 -2
  46. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts +3 -11
  47. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
  48. package/dist/crud/components/fields/display/DateFieldDisplay.js +0 -1
  49. package/dist/crud/components/fields/display/DropdownDisplay.d.ts +2 -2
  50. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts +2 -2
  51. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts +3 -11
  52. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -1
  53. package/dist/crud/components/fields/display/GeoPointFieldDisplay.js +0 -1
  54. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts +3 -3
  55. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -1
  56. package/dist/crud/components/fields/display/HiddenFieldDisplay.js +0 -9
  57. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts +3 -11
  58. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts.map +1 -1
  59. package/dist/crud/components/fields/display/ImageFieldDisplay.js +0 -1
  60. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts +3 -11
  61. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts.map +1 -1
  62. package/dist/crud/components/fields/display/LinkFieldDisplay.js +0 -1
  63. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts +3 -11
  64. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts.map +1 -1
  65. package/dist/crud/components/fields/display/MapFieldDisplay.js +0 -1
  66. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts +3 -11
  67. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -1
  68. package/dist/crud/components/fields/display/MultiDropdownDisplay.js +0 -1
  69. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts +3 -11
  70. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -1
  71. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.js +0 -1
  72. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts +3 -11
  73. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
  74. package/dist/crud/components/fields/display/NumberFieldDisplay.js +0 -1
  75. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts +3 -3
  76. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -1
  77. package/dist/crud/components/fields/display/PasswordFieldDisplay.js +0 -1
  78. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts +3 -11
  79. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -1
  80. package/dist/crud/components/fields/display/PhoneNumberDisplay.js +0 -1
  81. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts +3 -11
  82. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts.map +1 -1
  83. package/dist/crud/components/fields/display/RadioFieldDisplay.js +0 -1
  84. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts +3 -11
  85. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts.map +1 -1
  86. package/dist/crud/components/fields/display/RangeFieldDisplay.js +0 -1
  87. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts +3 -11
  88. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -1
  89. package/dist/crud/components/fields/display/ReferenceFieldDisplay.js +0 -1
  90. package/dist/crud/components/fields/display/RichTextDisplay.d.ts +25 -0
  91. package/dist/crud/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  92. package/dist/crud/components/fields/display/RichTextDisplay.js +104 -0
  93. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts +3 -11
  94. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts.map +1 -1
  95. package/dist/crud/components/fields/display/TextAreaDisplay.js +0 -1
  96. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts +2 -2
  97. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts +3 -11
  98. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
  99. package/dist/crud/components/fields/display/TimestampFieldDisplay.js +0 -1
  100. package/dist/crud/components/fields/display/index.d.ts +1 -0
  101. package/dist/crud/components/fields/display/index.d.ts.map +1 -1
  102. package/dist/crud/components/fields/display/index.js +1 -0
  103. package/dist/dndev.css +827 -126
  104. package/dist/index.js +64 -4
  105. package/dist/internal/common/ErrorFallback.d.ts +1 -10
  106. package/dist/internal/common/ErrorFallback.d.ts.map +1 -1
  107. package/dist/internal/common/GlobalErrorFallback.d.ts +1 -9
  108. package/dist/internal/common/GlobalErrorFallback.d.ts.map +1 -1
  109. package/dist/internal/common/RouteErrorFallback.js +1 -1
  110. package/dist/internal/devtools/components/DebugDialog.d.ts.map +1 -1
  111. package/dist/internal/devtools/components/DebugDialog.js +3 -1
  112. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  113. package/dist/internal/devtools/components/DesignTab.js +25 -3
  114. package/dist/internal/devtools/components/MaskedValue.d.ts.map +1 -1
  115. package/dist/internal/devtools/components/MaskedValue.js +1 -1
  116. package/dist/internal/devtools/components/StoresTab.js +1 -1
  117. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  118. package/dist/internal/initializers/BaseStoresInitializer.js +1 -2
  119. package/dist/internal/initializers/NextJsStoresInitializer.d.ts.map +1 -1
  120. package/dist/internal/layout/DnDevLayout.d.ts.map +1 -1
  121. package/dist/internal/layout/DnDevLayout.js +4 -5
  122. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  123. package/dist/internal/layout/components/PerformanceHints.d.ts.map +1 -1
  124. package/dist/internal/layout/components/PerformanceHints.js +3 -2
  125. package/dist/internal/layout/components/footer/FooterLegalLinks.js +2 -2
  126. package/dist/internal/layout/config/defaults.d.ts +0 -10
  127. package/dist/internal/layout/config/defaults.d.ts.map +1 -1
  128. package/dist/internal/layout/config/defaults.js +12 -1
  129. package/dist/internal/layout/config/presets/admin.d.ts +2 -2
  130. package/dist/internal/layout/config/presets/admin.d.ts.map +1 -1
  131. package/dist/internal/layout/config/presets/admin.js +15 -6
  132. package/dist/internal/layout/config/presets/blog.d.ts.map +1 -1
  133. package/dist/internal/layout/config/presets/blog.js +7 -1
  134. package/dist/internal/layout/config/presets/docs.d.ts.map +1 -1
  135. package/dist/internal/layout/config/presets/docs.js +7 -5
  136. package/dist/internal/layout/config/presets/game.d.ts.map +1 -1
  137. package/dist/internal/layout/config/presets/game.js +7 -2
  138. package/dist/internal/layout/config/presets/moolti.d.ts.map +1 -1
  139. package/dist/internal/layout/config/presets/moolti.js +10 -3
  140. package/dist/internal/layout/zones/DnDevFooter.d.ts +1 -13
  141. package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
  142. package/dist/internal/layout/zones/DnDevHeader.d.ts +1 -14
  143. package/dist/internal/layout/zones/DnDevHeader.d.ts.map +1 -1
  144. package/dist/internal/layout/zones/DnDevMergedBar.d.ts +2 -14
  145. package/dist/internal/layout/zones/DnDevMergedBar.d.ts.map +1 -1
  146. package/dist/internal/layout/zones/DnDevMergedBar.js +11 -3
  147. package/dist/internal/layout/zones/DnDevSidebar.d.ts +1 -14
  148. package/dist/internal/layout/zones/DnDevSidebar.d.ts.map +1 -1
  149. package/dist/providers/NextJsAppProviders.d.ts.map +1 -1
  150. package/dist/providers/NextJsAppProviders.js +4 -1
  151. package/dist/routing/AuthGuard.d.ts.map +1 -1
  152. package/dist/routing/GoTo.d.ts +3 -1
  153. package/dist/routing/GoTo.d.ts.map +1 -1
  154. package/dist/routing/GoTo.js +6 -2
  155. package/dist/routing/GoToDialog.d.ts +1 -1
  156. package/dist/routing/GoToDialog.d.ts.map +1 -1
  157. package/dist/routing/GoToDialog.js +3 -5
  158. package/dist/routing/NavigationItem.d.ts +1 -1
  159. package/dist/routing/NavigationItem.d.ts.map +1 -1
  160. package/dist/routing/NavigationItem.js +0 -1
  161. package/dist/routing/hooks/hooks.next.d.ts +1 -0
  162. package/dist/routing/hooks/hooks.next.d.ts.map +1 -1
  163. package/dist/routing/hooks/hooks.next.js +1 -1
  164. package/dist/routing/hooks/hooks.vite.d.ts +1 -0
  165. package/dist/routing/hooks/hooks.vite.d.ts.map +1 -1
  166. package/dist/routing/hooks/hooks.vite.js +1 -1
  167. package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
  168. package/dist/routing/hooks/useNavigate.next.js +1 -1
  169. package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
  170. package/dist/routing/hooks/useRouteParam.next.d.ts +18 -0
  171. package/dist/routing/hooks/useRouteParam.next.d.ts.map +1 -0
  172. package/dist/routing/hooks/useRouteParam.next.js +38 -0
  173. package/dist/routing/hooks/useRouteParam.vite.d.ts +18 -0
  174. package/dist/routing/hooks/useRouteParam.vite.d.ts.map +1 -0
  175. package/dist/routing/hooks/useRouteParam.vite.js +38 -0
  176. package/dist/routing/index.d.ts +1 -1
  177. package/dist/routing/index.d.ts.map +1 -1
  178. package/dist/routing/index.js +1 -1
  179. package/dist/routing/useGoTo.d.ts.map +1 -1
  180. package/dist/styles/index.css +823 -122
  181. package/dist/utils/assetResolver.d.ts +1 -1
  182. package/dist/utils/assetResolver.d.ts.map +1 -1
  183. package/dist/utils/assetResolver.js +1 -2
  184. package/dist/utils/index.d.ts +0 -1
  185. package/dist/utils/index.d.ts.map +1 -1
  186. package/dist/utils/index.js +0 -1
  187. package/dist/utils/tList.d.ts +1 -1
  188. package/dist/utils/tList.d.ts.map +1 -1
  189. package/dist/utils/useAuthSafe.d.ts +0 -33
  190. package/dist/utils/useAuthSafe.d.ts.map +1 -1
  191. package/dist/utils/useAuthSafe.js +34 -1
  192. package/dist/utils/useCrudSafe.d.ts +12 -6
  193. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  194. package/dist/utils/useCrudSafe.js +11 -7
  195. package/dist/utils/useOAuthSafe.d.ts.map +1 -1
  196. package/dist/utils/useStripeBillingSafe.d.ts +1 -34
  197. package/dist/utils/useStripeBillingSafe.d.ts.map +1 -1
  198. package/dist/utils/useStripeBillingSafe.js +34 -1
  199. package/dist/vite-routing/AppRoutes.d.ts +1 -1
  200. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  201. package/dist/vite-routing/AppRoutes.js +0 -1
  202. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  203. package/dist/vite-routing/RootLayout.js +6 -6
  204. package/package.json +9 -9
@@ -153,7 +153,7 @@
153
153
  --font-headline: var(--font-sans);
154
154
 
155
155
  --font-mono:
156
- ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Consolas, Monaco,
156
+ ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, Monaco,
157
157
  'Liberation Mono', monospace;
158
158
 
159
159
  /* Typography Scale - Musical Scale System (STANDARD density defaults - Major Third 1.25×) */
@@ -710,6 +710,16 @@ em {
710
710
 
711
711
  /* packages/components/src/styles/patterns.css */
712
712
 
713
+ /* Menu scroll area pattern - shared by DropdownMenu, Select, Combobox */
714
+
715
+ .dndev-menu-scroll-area {
716
+ max-height: 50dvh;
717
+ }
718
+
719
+ .dndev-menu-scroll-area .dndev-scroll-area-viewport {
720
+ max-height: 50dvh;
721
+ }
722
+
713
723
  /* ===========================
714
724
  FORM COMPONENTS (BASE)
715
725
  =========================== */
@@ -904,6 +914,9 @@ em {
904
914
  border-radius: var(--radius-surface);
905
915
  box-shadow: var(--shadow-md);
906
916
  padding: var(--gap-md); /* 1rem / 16px default */
917
+ padding-block-start: calc(
918
+ var(--gap-md) + var(--gap-sm)
919
+ ); /* Extra top padding for FloatingLabels */
907
920
  position: relative;
908
921
  overflow: hidden;
909
922
  contain: layout style;
@@ -1154,6 +1167,9 @@ em {
1154
1167
  border-radius: var(--radius-floating);
1155
1168
  box-shadow: var(--shadow-md);
1156
1169
  padding: var(--gap-md); /* 1rem / 16px default */
1170
+ padding-block-start: calc(
1171
+ var(--gap-md) + var(--gap-sm)
1172
+ ); /* Extra top padding for FloatingLabels */
1157
1173
  position: relative;
1158
1174
  overflow: hidden;
1159
1175
  contain: layout style;
@@ -2084,8 +2100,9 @@ em {
2084
2100
  display: flex;
2085
2101
  flex-direction: column;
2086
2102
  overflow-y: auto;
2087
- overflow-x: hidden;
2103
+ overflow-x: visible;
2088
2104
  min-height: 0;
2105
+ padding-block-start: var(--gap-sm);
2089
2106
  }
2090
2107
 
2091
2108
  .dndev-modal-title {
@@ -2144,6 +2161,60 @@ em {
2144
2161
  flex-direction: column;
2145
2162
  }
2146
2163
 
2164
+ /* ===========================
2165
+ AUTH FORM PATTERNS
2166
+ =========================== */
2167
+
2168
+ /* Auth form step indicator */
2169
+
2170
+ .dndev-auth-step {
2171
+ display: inline-flex;
2172
+ align-items: center;
2173
+ justify-content: center;
2174
+ min-width: 1.5em;
2175
+ padding: var(--gap-sm);
2176
+ border-radius: var(--radius-sm);
2177
+ font-weight: var(--font-weight-semibold);
2178
+ transition: all var(--dur-fast) var(--ease-in-out);
2179
+ }
2180
+
2181
+ .dndev-auth-step[data-state='active'] {
2182
+ background-color: var(--primary);
2183
+ color: var(--primary-foreground);
2184
+ }
2185
+
2186
+ .dndev-auth-step[data-state='pending'] {
2187
+ background-color: var(--muted);
2188
+ color: var(--muted-foreground);
2189
+ }
2190
+
2191
+ .dndev-auth-step[data-state='completed'] {
2192
+ background-color: var(--success);
2193
+ color: var(--success-foreground);
2194
+ }
2195
+
2196
+ /* Opacity data attribute */
2197
+
2198
+ [data-opacity='50'] {
2199
+ opacity: 0.5;
2200
+ }
2201
+
2202
+ [data-opacity='70'] {
2203
+ opacity: 0.7;
2204
+ }
2205
+
2206
+ /* Inset data attribute - indent content */
2207
+
2208
+ [data-inset='true'] {
2209
+ padding-inline-start: var(--gap-md);
2210
+ }
2211
+
2212
+ /* Password strength bar height override */
2213
+
2214
+ .dndev-password-strength-bar {
2215
+ height: 4px;
2216
+ }
2217
+
2147
2218
  /* 5. Individual Component Styles */
2148
2219
 
2149
2220
  /* packages/components/src/atomic/Accordion/Accordion.css */
@@ -2190,21 +2261,46 @@ em {
2190
2261
  flex-shrink: 0;
2191
2262
  width: var(--icon-md);
2192
2263
  height: var(--icon-md);
2193
- transition: transform var(--dur-fast) var(--ease-in-out);
2264
+ transition: transform var(--dur-normal) var(--ease-in-out);
2194
2265
  }
2195
2266
 
2196
2267
  .dndev-accordion-content {
2197
2268
  overflow: hidden;
2198
2269
  font-size: var(--font-size-base);
2199
- transition: all var(--dur-fast) var(--ease-in-out);
2200
2270
  width: 100%;
2201
2271
  min-width: 0;
2202
2272
  text-align: start;
2203
2273
  }
2204
2274
 
2275
+ .dndev-accordion-content[data-state='open'] {
2276
+ animation: slideDown var(--dur-normal) var(--ease-in-out);
2277
+ }
2278
+
2205
2279
  .dndev-accordion-content[data-state='closed'] {
2206
- display: none;
2280
+ animation: slideUp var(--dur-normal) var(--ease-in-out);
2281
+ }
2282
+
2283
+ @keyframes slideDown {
2284
+ from {
2285
+ height: 0;
2286
+ opacity: 0;
2287
+ }
2288
+ to {
2289
+ height: var(--radix-collapsible-content-height);
2290
+ opacity: 1;
2291
+ }
2292
+ }
2293
+
2294
+ @keyframes slideUp {
2295
+ from {
2296
+ height: var(--radix-collapsible-content-height);
2297
+ opacity: 1;
2298
+ }
2299
+ to {
2300
+ height: 0;
2301
+ opacity: 0;
2207
2302
  }
2303
+ }
2208
2304
 
2209
2305
  .dndev-accordion-content-inner {
2210
2306
  padding-bottom: var(--gap-md);
@@ -2628,6 +2724,34 @@ em {
2628
2724
 
2629
2725
  /* Label styling moved to patterns.css (.dndev-interactive-label) */
2630
2726
 
2727
+ /* Loading state */
2728
+
2729
+ [data-loading] {
2730
+ cursor: wait;
2731
+ pointer-events: none;
2732
+ }
2733
+
2734
+ /* Button spinner - inherits size from button font-size */
2735
+
2736
+ .dndev-button-spinner {
2737
+ flex-shrink: 0;
2738
+ }
2739
+
2740
+ /* Progress ring for upload percentage */
2741
+
2742
+ .dndev-button-progress {
2743
+ display: inline-flex;
2744
+ align-items: center;
2745
+ justify-content: center;
2746
+ flex-shrink: 0;
2747
+ }
2748
+
2749
+ .dndev-progress-ring {
2750
+ width: 1em;
2751
+ height: 1em;
2752
+ transform: rotate(-90deg);
2753
+ }
2754
+
2631
2755
  /* packages/components/src/atomic/Calendar/Calendar.css */
2632
2756
 
2633
2757
  /**
@@ -3195,21 +3319,58 @@ em {
3195
3319
  @keyframes slideDown {
3196
3320
  from {
3197
3321
  height: 0;
3322
+ opacity: 0;
3198
3323
  }
3199
3324
  to {
3200
3325
  height: var(--radix-collapsible-content-height);
3326
+ opacity: 1;
3201
3327
  }
3202
3328
  }
3203
3329
 
3204
3330
  @keyframes slideUp {
3205
3331
  from {
3206
3332
  height: var(--radix-collapsible-content-height);
3333
+ opacity: 1;
3207
3334
  }
3208
3335
  to {
3209
3336
  height: 0;
3337
+ opacity: 0;
3210
3338
  }
3211
3339
  }
3212
3340
 
3341
+ .dndev-collapsible-trigger {
3342
+ width: 100%;
3343
+ cursor: pointer;
3344
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3345
+ }
3346
+
3347
+ .dndev-collapsible-trigger:hover {
3348
+ opacity: var(--opacity-strong);
3349
+ }
3350
+
3351
+ .dndev-collapsible-trigger:focus-visible {
3352
+ outline: 2px solid var(--ring);
3353
+ outline-offset: 2px;
3354
+ border-radius: var(--radius-interactive);
3355
+ }
3356
+
3357
+ .dndev-collapsible-icon {
3358
+ width: var(--size-md);
3359
+ height: var(--size-md);
3360
+ flex-shrink: 0;
3361
+ color: var(--accent);
3362
+ transition: transform var(--dur-normal) var(--ease-in-out);
3363
+ }
3364
+
3365
+ .dndev-collapsible-chevron {
3366
+ transform: rotate(0deg);
3367
+ transition: transform var(--dur-normal) var(--ease-in-out);
3368
+ }
3369
+
3370
+ .dndev-collapsible[data-state='open'] .dndev-collapsible-chevron {
3371
+ transform: rotate(180deg);
3372
+ }
3373
+
3213
3374
  /* packages/components/src/atomic/Combobox/Combobox.css */
3214
3375
 
3215
3376
  .dndev-combobox-trigger {
@@ -3289,7 +3450,7 @@ em {
3289
3450
  .dndev-combobox-content {
3290
3451
  width: var(--radix-popover-trigger-width);
3291
3452
  min-width: var(--radix-popover-trigger-width);
3292
- max-height: 300px;
3453
+ max-width: var(--radix-popover-trigger-width);
3293
3454
  display: flex;
3294
3455
  flex-direction: column;
3295
3456
  padding: 0;
@@ -3304,14 +3465,6 @@ em {
3304
3465
  width: 100%;
3305
3466
  }
3306
3467
 
3307
- .dndev-combobox-list {
3308
- overflow-y: auto;
3309
- padding: var(--gap-tight);
3310
- display: flex;
3311
- flex-direction: column;
3312
- gap: var(--gap-none);
3313
- }
3314
-
3315
3468
  .dndev-combobox-option {
3316
3469
  all: unset;
3317
3470
  display: flex;
@@ -3368,6 +3521,30 @@ em {
3368
3521
  color: var(--muted-foreground);
3369
3522
  }
3370
3523
 
3524
+ /* Creatable option styling */
3525
+
3526
+ .dndev-combobox-option-create {
3527
+ color: var(--primary);
3528
+ font-style: italic;
3529
+ }
3530
+
3531
+ .dndev-combobox-option-create-icon {
3532
+ width: var(--icon-md);
3533
+ height: var(--icon-md);
3534
+ margin-inline-end: var(--gap-sm);
3535
+ flex-shrink: 0;
3536
+ }
3537
+
3538
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
3539
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
3540
+ transform: rotate(180deg);
3541
+ }
3542
+
3543
+ .dndev-input-with-trailing-icon .dndev-input-icon svg,
3544
+ .dndev-input-with-trailing-icon .dndev-input-icon > * {
3545
+ transition: transform var(--dur-fast) var(--ease-in-out);
3546
+ }
3547
+
3371
3548
  /* packages/components/src/atomic/DualCard/DualCard.css */
3372
3549
 
3373
3550
  .dndev-dual-card {
@@ -3554,13 +3731,15 @@ em {
3554
3731
  text-align: start;
3555
3732
  display: block;
3556
3733
  line-height: 1.5; /* Match line numbers */
3734
+ font-size: var(--font-size-sm); /* Explicit match with line numbers */
3557
3735
  }
3558
3736
 
3559
- /* Ensure shiki-generated code respects line-height */
3737
+ /* Ensure shiki-generated code respects line-height AND font-size */
3560
3738
 
3561
3739
  .dndev-code-code pre,
3562
3740
  .dndev-code-code code {
3563
3741
  line-height: inherit;
3742
+ font-size: inherit; /* Match parent font-size */
3564
3743
  }
3565
3744
 
3566
3745
  /* packages/components/src/atomic/Command/Command.css */
@@ -3938,16 +4117,6 @@ em {
3938
4117
  padding: var(--gap-sm);
3939
4118
  }
3940
4119
 
3941
- /* Dropdown scroll area - constrain height to 50dvh */
3942
-
3943
- .dndev-dropdown-scroll-area {
3944
- max-height: 50dvh;
3945
- }
3946
-
3947
- .dndev-dropdown-scroll-area .dndev-scroll-area-viewport {
3948
- max-height: 50dvh;
3949
- }
3950
-
3951
4120
  /* Checked state styling */
3952
4121
 
3953
4122
  .dndev-interactive[data-role='menu-item'][data-state='checked'] {
@@ -4471,6 +4640,81 @@ em {
4471
4640
  margin-inline-start: var(--gap-sm);
4472
4641
  }
4473
4642
 
4643
+ /* Floating Fieldset - native border-cutting via legend */
4644
+
4645
+ .dndev-floating-fieldset {
4646
+ position: relative;
4647
+ border: var(--border-hairline) solid var(--line-2);
4648
+ border-radius: var(--radius-interactive);
4649
+ margin: 0;
4650
+ padding: 0;
4651
+ background-color: transparent;
4652
+ transition: all var(--dur-normal) var(--ease-in-out);
4653
+ text-align: start;
4654
+ }
4655
+
4656
+ .dndev-floating-fieldset:hover {
4657
+ border-color: var(--ring);
4658
+ }
4659
+
4660
+ .dndev-floating-fieldset:focus-within {
4661
+ border-color: var(--ring);
4662
+ box-shadow: 0 0 0 2px var(--ring);
4663
+ }
4664
+
4665
+ .dndev-floating-fieldset[data-disabled='true'] {
4666
+ opacity: var(--opacity-muted);
4667
+ cursor: not-allowed;
4668
+ }
4669
+
4670
+ /* Legend sits on border - browser natively cuts border */
4671
+
4672
+ .dndev-floating-legend {
4673
+ margin-inline-start: var(--gap-sm);
4674
+ padding: 0 var(--gap-sm);
4675
+ font-size: var(--font-size-xs);
4676
+ font-weight: 500;
4677
+ line-height: 1;
4678
+ color: var(--foreground);
4679
+ }
4680
+
4681
+ .dndev-floating-legend label {
4682
+ cursor: default;
4683
+ display: inline-flex;
4684
+ align-items: center;
4685
+ gap: var(--gap-tight);
4686
+ }
4687
+
4688
+ .dndev-floating-fieldset[data-disabled='true'] .dndev-floating-legend {
4689
+ color: var(--muted-foreground);
4690
+ }
4691
+
4692
+ .dndev-floating-legend[data-truncate='true'] {
4693
+ max-width: calc(100% - var(--gap-md) * 2);
4694
+ overflow: hidden;
4695
+ text-overflow: ellipsis;
4696
+ white-space: nowrap;
4697
+ }
4698
+
4699
+ /* Remove border from inner input since fieldset has it */
4700
+
4701
+ .dndev-floating-fieldset .dndev-input {
4702
+ border: none;
4703
+ border-radius: var(--radius-interactive);
4704
+ box-shadow: none;
4705
+ }
4706
+
4707
+ .dndev-floating-fieldset .dndev-input:hover {
4708
+ border-color: transparent;
4709
+ }
4710
+
4711
+ .dndev-floating-fieldset .dndev-input:focus,
4712
+ .dndev-floating-fieldset .dndev-input:focus-visible {
4713
+ border-color: transparent;
4714
+ box-shadow: none;
4715
+ outline: none;
4716
+ }
4717
+
4474
4718
  /* packages/components/src/atomic/List/List.css */
4475
4719
 
4476
4720
  .dndev-list {
@@ -4779,20 +5023,41 @@ em {
4779
5023
  /* packages/components/src/atomic/PasswordInput/PasswordInput.css */
4780
5024
 
4781
5025
  .dndev-password-input-with-toggle {
4782
- padding-inline-end: var(--gap-lg);
5026
+ padding-inline-end: calc(var(--gap-xl) + var(--gap-md)) !important;
4783
5027
  }
4784
5028
 
5029
+ /* Eye icon toggle - ALWAYS at end, cannot be overridden */
5030
+
4785
5031
  .dndev-password-toggle-button {
4786
- position: absolute;
4787
- inset-inline-end: 0;
4788
- top: 0;
4789
- height: 100%;
4790
- padding-inline-start: var(--gap-md);
4791
- padding-inline-end: var(--gap-md);
5032
+ position: absolute !important;
5033
+ top: 50% !important;
5034
+ transform: translateY(-50%) !important;
5035
+ inset-inline-end: var(--gap-sm) !important;
5036
+ inset-inline-start: unset !important;
5037
+ background: none !important;
5038
+ border: none !important;
5039
+ cursor: pointer !important;
5040
+ padding: var(--gap-tight) !important;
5041
+ display: flex !important;
5042
+ align-items: center !important;
5043
+ opacity: var(--opacity-muted) !important;
5044
+ transition: opacity var(--dur-fast) var(--ease-in-out) !important;
5045
+ -webkit-user-select: none !important;
5046
+ -moz-user-select: none !important;
5047
+ user-select: none !important;
5048
+ z-index: 1 !important;
5049
+ }
5050
+
5051
+ .dndev-password-toggle-button:hover,
5052
+ .dndev-password-toggle-button:focus {
5053
+ opacity: 1 !important;
5054
+ outline: none !important;
4792
5055
  }
4793
5056
 
4794
5057
  .dndev-password-toggle-icon {
4795
5058
  color: var(--muted-foreground);
5059
+ width: var(--icon-sm);
5060
+ height: var(--icon-sm);
4796
5061
  }
4797
5062
 
4798
5063
  /* packages/components/src/atomic/Pagination/Pagination.css */
@@ -4884,9 +5149,32 @@ em {
4884
5149
  height: 100%;
4885
5150
  width: 100%;
4886
5151
  flex: 1;
5152
+ background-color: var(--primary);
4887
5153
  transition: transform var(--dur-normal) var(--ease-in-out);
5154
+
5155
+ /* Variant colors */
4888
5156
  }
4889
5157
 
5158
+ [data-variant='default']:is(.dndev-progress [data-radix-progress-indicator]) {
5159
+ background-color: var(--primary);
5160
+ }
5161
+
5162
+ [data-variant='accent']:is(.dndev-progress [data-radix-progress-indicator]) {
5163
+ background-color: var(--accent);
5164
+ }
5165
+
5166
+ [data-variant='success']:is(.dndev-progress [data-radix-progress-indicator]) {
5167
+ background-color: var(--success);
5168
+ }
5169
+
5170
+ [data-variant='warning']:is(.dndev-progress [data-radix-progress-indicator]) {
5171
+ background-color: var(--warning);
5172
+ }
5173
+
5174
+ [data-variant='destructive']:is(.dndev-progress [data-radix-progress-indicator]) {
5175
+ background-color: var(--destructive);
5176
+ }
5177
+
4890
5178
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4891
5179
 
4892
5180
  /* Uses shared .dndev-control-group pattern from patterns.css */
@@ -5092,7 +5380,6 @@ em {
5092
5380
  display: flex;
5093
5381
  flex-direction: column;
5094
5382
  padding: 0;
5095
- overflow-y: auto;
5096
5383
  }
5097
5384
 
5098
5385
  .dndev-interactive[data-radix-select-item] {
@@ -5214,6 +5501,7 @@ em {
5214
5501
  letter-spacing: 0.2em;
5215
5502
  color: var(--accent) !important;
5216
5503
  margin-block-end: var(--gap-md);
5504
+ text-align: center; /* DEFAULT - works without attribute selector */
5217
5505
  }
5218
5506
 
5219
5507
  .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
@@ -5228,26 +5516,71 @@ em {
5228
5516
  text-align: end;
5229
5517
  }
5230
5518
 
5231
- /* packages/components/src/atomic/Separator/Separator.css */
5519
+ /* Collapsible title trigger */
5232
5520
 
5233
- .dndev-separator {
5234
- flex-shrink: 0;
5235
- background-color: var(--line-2);
5236
- margin-inline: auto;
5521
+ .dndev-section-title-trigger {
5522
+ width: 100%;
5523
+ cursor: pointer;
5524
+ transition: opacity var(--dur-fast) var(--ease-in-out);
5525
+ margin-block-end: var(--gap-md);
5237
5526
  }
5238
5527
 
5239
- .dndev-separator[data-orientation='horizontal'] {
5240
- height: 2px;
5241
- width: 80%;
5242
-
5243
- /* Inside Section: cap to content width */
5244
- }
5528
+ .dndev-section-title-trigger .dndev-section-title {
5529
+ margin-block-end: 0;
5530
+ }
5245
5531
 
5246
- .dndev-section .dndev-separator[data-orientation='horizontal'] {
5247
- max-width: calc(var(--content-width) * 0.8);
5248
- }
5532
+ .dndev-section-title-trigger:hover {
5533
+ opacity: var(--opacity-strong);
5534
+ }
5249
5535
 
5250
- .dndev-separator[data-orientation='vertical'] {
5536
+ .dndev-section-title-trigger:focus-visible {
5537
+ outline: 2px solid var(--ring);
5538
+ outline-offset: 2px;
5539
+ border-radius: var(--radius-interactive);
5540
+ }
5541
+
5542
+ .dndev-section-icon {
5543
+ width: var(--size-md);
5544
+ height: var(--size-md);
5545
+ flex-shrink: 0;
5546
+ color: var(--accent);
5547
+ transition: transform var(--dur-normal) var(--ease-in-out);
5548
+ }
5549
+
5550
+ .dndev-section-full-width[data-text-align='start']
5551
+ .dndev-section-title-trigger {
5552
+ justify-content: flex-start;
5553
+ }
5554
+
5555
+ .dndev-section-full-width[data-text-align='center']
5556
+ .dndev-section-title-trigger {
5557
+ justify-content: center;
5558
+ }
5559
+
5560
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title-trigger {
5561
+ justify-content: flex-end;
5562
+ }
5563
+
5564
+ /* packages/components/src/atomic/Separator/Separator.css */
5565
+
5566
+ .dndev-separator {
5567
+ flex-shrink: 0;
5568
+ background-color: var(--line-2);
5569
+ margin-inline: auto;
5570
+ }
5571
+
5572
+ .dndev-separator[data-orientation='horizontal'] {
5573
+ height: 2px;
5574
+ width: 80%;
5575
+
5576
+ /* Inside Section: cap to content width */
5577
+ }
5578
+
5579
+ .dndev-section .dndev-separator[data-orientation='horizontal'] {
5580
+ max-width: calc(var(--content-width) * 0.8);
5581
+ }
5582
+
5583
+ .dndev-separator[data-orientation='vertical'] {
5251
5584
  width: 1px;
5252
5585
  height: 100%;
5253
5586
  }
@@ -5369,50 +5702,210 @@ em {
5369
5702
  display: flex;
5370
5703
  flex-direction: column;
5371
5704
  z-index: var(--z-modal);
5372
- border-radius: var(--radius-floating); /* Square like floating panels */
5705
+ background: var(--card);
5706
+ /* Ensure background is opaque */
5707
+ color: var(--card-foreground);
5708
+ box-shadow: var(--shadow-xl);
5709
+ /* Focus Tunnel: Deep elevation */
5710
+ overflow: hidden;
5711
+ /* Scroll Trap: Container clips overflow */
5712
+
5713
+ /* Motion Physics: Base state */
5714
+ will-change: transform, opacity;
5373
5715
 
5374
- /* Sheet positioning by side */
5716
+ /* Open state animation - "Heavy" ease for premium feel */
5375
5717
  }
5376
5718
 
5719
+ .dndev-sheet-content[data-state='open'] {
5720
+ animation: sheet-slide-in var(--dur-heavy) var(--ease-heavy);
5721
+ }
5722
+
5723
+ /* Closed state animation */
5724
+
5725
+ .dndev-sheet-content[data-state='closed'] {
5726
+ animation: sheet-slide-out var(--dur-normal) var(--ease-in-out);
5727
+ }
5728
+
5729
+ /* Sheet positioning by side - SPATIAL METAPHOR */
5730
+
5731
+ /* RIGHT / LEFT (Desktop Panels) */
5732
+
5377
5733
  .dndev-sheet-content[data-side='right'],.dndev-sheet-content[data-side='left'] {
5378
5734
  top: 0;
5379
5735
  bottom: 0;
5380
5736
  width: 80%;
5381
5737
  max-width: 56rem;
5738
+ /* Standard panel width */
5739
+ height: 100%;
5740
+ /* Full height */
5741
+ border-radius: 0;
5742
+ /* Square edges for panel metaphor */
5382
5743
  }
5383
5744
 
5384
5745
  .dndev-sheet-content[data-side='right'] {
5746
+ /* Physical positioning: right edge */
5385
5747
  right: 0;
5748
+ left: auto;
5749
+ /* Border on logical start (left in LTR, right in RTL) */
5750
+ border-inline-start: var(--border-hairline) solid var(--line-1);
5386
5751
  }
5387
5752
 
5388
5753
  .dndev-sheet-content[data-side='left'] {
5754
+ /* Physical positioning: left edge */
5389
5755
  left: 0;
5756
+ right: auto;
5757
+ /* Border on logical end (right in LTR, left in RTL) */
5758
+ border-inline-end: var(--border-hairline) solid var(--line-1);
5390
5759
  }
5391
5760
 
5761
+ /* TOP / BOTTOM (Mobile Cards) */
5762
+
5392
5763
  .dndev-sheet-content[data-side='top'],.dndev-sheet-content[data-side='bottom'] {
5393
5764
  left: 0;
5394
5765
  right: 0;
5395
- height: 80%;
5396
- max-height: 56rem;
5397
- overflow: hidden;
5766
+ /* Card metaphor: Detached from opposite edge */
5767
+ height: auto;
5768
+ max-height: 92dvh;
5769
+ /* Never touch top edge */
5770
+ width: 100%;
5771
+ margin-left: auto;
5772
+ margin-right: auto;
5773
+
5774
+ /* On larger screens, constrain width */
5398
5775
  }
5399
5776
 
5777
+ @media (width >=768px) {
5778
+
5779
+ .dndev-sheet-content[data-side='top'],.dndev-sheet-content[data-side='bottom'] {
5780
+ max-width: 56rem;
5781
+ width: 90%;
5782
+ border-radius: var(--radius-lg);
5783
+ /* Fully rounded card on desktop */
5784
+ }
5785
+ }
5786
+
5400
5787
  .dndev-sheet-content[data-side='top'] {
5401
5788
  top: 0;
5789
+ border-bottom: var(--border-hairline) solid var(--line-1);
5790
+ /* Rounded bottom corners only */
5791
+ border-bottom-left-radius: var(--radius-lg);
5792
+ border-bottom-right-radius: var(--radius-lg);
5402
5793
  }
5403
5794
 
5404
5795
  .dndev-sheet-content[data-side='bottom'] {
5405
5796
  bottom: 0;
5797
+ border-top: var(--border-hairline) solid var(--line-1);
5798
+ /* Rounded top corners only */
5799
+ border-top-left-radius: var(--radius-lg);
5800
+ border-top-right-radius: var(--radius-lg);
5801
+ }
5802
+
5803
+ /* DRAG HANDLE PILL - Visual affordance for draggable sheets */
5804
+
5805
+ .dndev-sheet-drag-handle {
5806
+ width: 2.5rem;
5807
+ height: 0.25rem;
5808
+ background: var(--line-2);
5809
+ border-radius: var(--radius-full);
5810
+ margin: var(--gap-sm) auto 0;
5811
+ flex-shrink: 0;
5812
+ cursor: grab;
5813
+ transition: background-color var(--dur-fast) var(--ease-in-out);
5814
+ }
5815
+
5816
+ .dndev-sheet-drag-handle:active {
5817
+ cursor: grabbing;
5406
5818
  }
5407
5819
 
5820
+ /* Positioning for bottom sheets */
5821
+
5822
+ .dndev-sheet-content[data-side='bottom'] > .dndev-sheet-drag-handle {
5823
+ margin-top: var(--gap-sm);
5824
+ margin-bottom: 0;
5825
+ }
5826
+
5827
+ /* Positioning for top sheets */
5828
+
5829
+ .dndev-sheet-content[data-side='top'] > .dndev-sheet-drag-handle {
5830
+ margin-top: max(var(--gap-sm), env(safe-area-inset-top));
5831
+ margin-bottom: 0;
5832
+ }
5833
+
5834
+ /* HEADER - Pinned, No Padding (Tight Layout) */
5835
+
5836
+ /* Industry standard: Title always on start, X always on end (consistent across all sides) */
5837
+
5408
5838
  .dndev-sheet-header {
5409
5839
  display: flex;
5410
5840
  align-items: center;
5411
5841
  justify-content: space-between;
5412
5842
  gap: var(--gap-md);
5413
5843
  flex-shrink: 0;
5844
+ /* Never shrink */
5414
5845
  min-height: var(--touch-target);
5415
- margin-bottom: var(--gap-md);
5846
+ /* No padding - tight layout: [ Title X ] */
5847
+ padding-block: 0;
5848
+ /* RTL-aware: padding on logical start only */
5849
+ padding-inline-start: var(--gap-md);
5850
+ padding-inline-end: 0; /* X button has its own spacing */
5851
+ border-bottom: var(--border-hairline) solid var(--line-1);
5852
+ /* Separator */
5853
+
5854
+ /* Thumb Ergonomics: Top Safe Area (only for top sheets) */
5855
+ }
5856
+
5857
+ .dndev-sheet-content[data-side='top'] .dndev-sheet-header {
5858
+ padding-top: max(0, env(safe-area-inset-top));
5859
+ }
5860
+
5861
+ /* Adjust header padding when drag handle is present (sibling selector) */
5862
+
5863
+ .dndev-sheet-content[data-side='bottom'] .dndev-sheet-drag-handle ~ .dndev-sheet-header,
5864
+ .dndev-sheet-content[data-side='top'] .dndev-sheet-drag-handle ~ .dndev-sheet-header {
5865
+ padding-top: 0;
5866
+ }
5867
+
5868
+ /* BODY - Scrollable */
5869
+
5870
+ .dndev-sheet-body {
5871
+ flex: 1;
5872
+ /* Consumes available space */
5873
+ overflow-y: auto;
5874
+ /* Independent scroll */
5875
+ overflow-x: hidden;
5876
+ padding: var(--gap-md);
5877
+ overscroll-behavior: contain;
5878
+ /* Prevent body scroll chaining */
5879
+ }
5880
+
5881
+ /* FOOTER - Pinned */
5882
+
5883
+ .dndev-sheet-footer {
5884
+ flex-shrink: 0;
5885
+ /* Never shrink */
5886
+ padding: var(--gap-md);
5887
+ border-top: var(--border-hairline) solid var(--line-1);
5888
+ /* Separator */
5889
+ display: flex;
5890
+ flex-direction: column-reverse;
5891
+ /* Mobile-first stacking */
5892
+ gap: var(--gap-sm);
5893
+
5894
+ /* Desktop: Row layout */
5895
+ }
5896
+
5897
+ @media (width >=640px) {
5898
+
5899
+ .dndev-sheet-footer {
5900
+ flex-direction: row;
5901
+ justify-content: flex-end;
5902
+ }
5903
+ }
5904
+
5905
+ .dndev-sheet-footer {
5906
+
5907
+ /* Thumb Ergonomics: Bottom Safe Area (Home Indicator) */
5908
+ padding-bottom: max(var(--gap-md), env(safe-area-inset-bottom));
5416
5909
  }
5417
5910
 
5418
5911
  .dndev-sheet-title {
@@ -5422,19 +5915,72 @@ em {
5422
5915
  }
5423
5916
 
5424
5917
  .dndev-sheet-close {
5425
- position: absolute;
5426
- top: var(--gap-md);
5427
- inset-inline-end: var(--gap-md);
5918
+ /* Position relative - flex handles alignment */
5919
+ position: relative;
5920
+ margin-inline-start: auto;
5921
+ /* Push to end (RTL-aware: end = right in LTR, left in RTL) */
5428
5922
  opacity: var(--opacity-muted);
5923
+ /* No padding - tight spacing */
5924
+ padding: 0;
5925
+ /* RTL-aware: padding on logical end only */
5926
+ padding-inline-end: var(--gap-md);
5927
+ padding-inline-start: 0;
5429
5928
  }
5430
5929
 
5431
5930
  .dndev-sheet-close:hover {
5432
5931
  opacity: 1;
5433
5932
  }
5434
5933
 
5435
- .dndev-sheet-footer {
5436
- flex-shrink: 0;
5437
- margin-top: var(--gap-md);
5934
+ /* ===========================
5935
+ ANIMATIONS (Motion Physics)
5936
+ =========================== */
5937
+
5938
+ /* Slide In/Out Keyframes - Context Aware */
5939
+
5940
+ @keyframes sheet-slide-in {
5941
+ from {
5942
+ opacity: 0;
5943
+ transform: var(--slide-enter-transform);
5944
+ }
5945
+
5946
+ to {
5947
+ opacity: 1;
5948
+ transform: translate(0, 0);
5949
+ }
5950
+ }
5951
+
5952
+ @keyframes sheet-slide-out {
5953
+ from {
5954
+ opacity: 1;
5955
+ transform: translate(0, 0);
5956
+ }
5957
+
5958
+ to {
5959
+ opacity: 0;
5960
+ transform: var(--slide-exit-transform);
5961
+ }
5962
+ }
5963
+
5964
+ /* Define Transforms based on Side */
5965
+
5966
+ .dndev-sheet-content[data-side='right'] {
5967
+ --slide-enter-transform: translateX(100%);
5968
+ --slide-exit-transform: translateX(100%);
5969
+ }
5970
+
5971
+ .dndev-sheet-content[data-side='left'] {
5972
+ --slide-enter-transform: translateX(-100%);
5973
+ --slide-exit-transform: translateX(-100%);
5974
+ }
5975
+
5976
+ .dndev-sheet-content[data-side='bottom'] {
5977
+ --slide-enter-transform: translateY(100%);
5978
+ --slide-exit-transform: translateY(100%);
5979
+ }
5980
+
5981
+ .dndev-sheet-content[data-side='top'] {
5982
+ --slide-enter-transform: translateY(-100%);
5983
+ --slide-exit-transform: translateY(-100%);
5438
5984
  }
5439
5985
 
5440
5986
  /* packages/components/src/atomic/Skeleton/Skeleton.css */
@@ -6090,6 +6636,61 @@ em {
6090
6636
  transform: translateX(calc(2.75rem - 1.25rem - 0.125rem));
6091
6637
  }
6092
6638
 
6639
+ /* Switch with labels container */
6640
+
6641
+ .dndev-switch-with-labels {
6642
+ display: inline-flex;
6643
+ align-items: center;
6644
+ gap: var(--gap-sm);
6645
+ flex-wrap: wrap;
6646
+ }
6647
+
6648
+ /* Labels - keep switch and its labels on one line when possible */
6649
+
6650
+ .dndev-switch-with-labels > .dndev-switch {
6651
+ flex-shrink: 0;
6652
+ }
6653
+
6654
+ .dndev-switch-label {
6655
+ font-size: var(--font-size-sm);
6656
+ transition:
6657
+ color var(--dur-normal) var(--ease-in-out),
6658
+ font-weight var(--dur-normal) var(--ease-in-out);
6659
+ white-space: nowrap;
6660
+ }
6661
+
6662
+ /* Unchecked label - active when switch is unchecked */
6663
+
6664
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6665
+ .dndev-switch-label-unchecked,
6666
+ .dndev-switch-with-labels[data-checked='false'] .dndev-switch-label-unchecked {
6667
+ color: var(--foreground);
6668
+ font-weight: var(--font-weight-medium);
6669
+ }
6670
+
6671
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6672
+ .dndev-switch-label-unchecked,
6673
+ .dndev-switch-with-labels[data-checked='true'] .dndev-switch-label-unchecked {
6674
+ color: var(--muted-foreground);
6675
+ font-weight: var(--font-weight-normal);
6676
+ }
6677
+
6678
+ /* Checked label - active when switch is checked */
6679
+
6680
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6681
+ .dndev-switch-label-checked,
6682
+ .dndev-switch-with-labels[data-checked='true'] .dndev-switch-label-checked {
6683
+ color: var(--foreground);
6684
+ font-weight: var(--font-weight-medium);
6685
+ }
6686
+
6687
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6688
+ .dndev-switch-label-checked,
6689
+ .dndev-switch-with-labels[data-checked='false'] .dndev-switch-label-checked {
6690
+ color: var(--muted-foreground);
6691
+ font-weight: var(--font-weight-normal);
6692
+ }
6693
+
6093
6694
  /* packages/components/src/atomic/Table/Table.css */
6094
6695
 
6095
6696
  .dndev-table-wrapper {
@@ -6126,6 +6727,12 @@ em {
6126
6727
  background-color: color-mix(in oklab, var(--accent) 15%, transparent);
6127
6728
  }
6128
6729
 
6730
+ /* Cursor pointer for clickable rows */
6731
+
6732
+ .dndev-table-row.dndev-cursor-pointer {
6733
+ cursor: pointer;
6734
+ }
6735
+
6129
6736
  /* Zebra striping for data tables */
6130
6737
 
6131
6738
  .dndev-table-body .dndev-table-row:nth-child(even) {
@@ -6155,7 +6762,7 @@ em {
6155
6762
  /* Table head (th) styles */
6156
6763
 
6157
6764
  .dndev-table-head {
6158
- text-align: left;
6765
+ text-align: start;
6159
6766
  vertical-align: middle;
6160
6767
  font-weight: 500;
6161
6768
  color: var(--muted-foreground);
@@ -6172,12 +6779,12 @@ em {
6172
6779
  text-align: center;
6173
6780
  }
6174
6781
 
6175
- .dndev-table-head[data-align='right'] {
6176
- text-align: right;
6782
+ .dndev-table-head[data-align='end'] {
6783
+ text-align: end;
6177
6784
  }
6178
6785
 
6179
- .dndev-table-head[data-align='left'] {
6180
- text-align: left;
6786
+ .dndev-table-head[data-align='start'] {
6787
+ text-align: start;
6181
6788
  }
6182
6789
 
6183
6790
  /* Table cell (td) styles */
@@ -6193,14 +6800,48 @@ em {
6193
6800
  text-align: center;
6194
6801
  }
6195
6802
 
6196
- .dndev-table-cell[data-align='right'] {
6197
- text-align: right;
6803
+ .dndev-table-cell[data-align='end'] {
6804
+ text-align: end;
6198
6805
  }
6199
6806
 
6200
- .dndev-table-cell[data-align='left'] {
6201
- text-align: left;
6807
+ .dndev-table-cell[data-align='start'] {
6808
+ text-align: start;
6202
6809
  }
6203
6810
 
6811
+ /* Excel-like grid lines variant */
6812
+
6813
+ .dndev-table-grid .dndev-table-head,
6814
+ .dndev-table-grid .dndev-table-cell {
6815
+ border: 1px solid var(--border);
6816
+ padding: 0;
6817
+ }
6818
+
6819
+ .dndev-table-grid .dndev-table-row {
6820
+ border-bottom: 1px solid var(--border);
6821
+ }
6822
+
6823
+ .dndev-table-grid .dndev-table-row:last-child {
6824
+ border-bottom: 1px solid var(--border);
6825
+ }
6826
+
6827
+ /* Input components inside grid cells should be borderless and fit snugly */
6828
+
6829
+ .dndev-table-grid .dndev-table-cell .dndev-input,
6830
+ .dndev-table-grid .dndev-table-cell input[type='text'],
6831
+ .dndev-table-grid .dndev-table-cell input[type='number'] {
6832
+ border: none;
6833
+ background: transparent;
6834
+ width: 100%;
6835
+ height: 100%;
6836
+ box-shadow: none;
6837
+ }
6838
+
6839
+ .dndev-table-grid .dndev-table-cell .dndev-input:focus,
6840
+ .dndev-table-grid .dndev-table-cell input:focus {
6841
+ outline: 2px solid var(--primary);
6842
+ outline-offset: -2px;
6843
+ }
6844
+
6204
6845
  /* Table caption styles */
6205
6846
 
6206
6847
  .dndev-table-caption {
@@ -6217,7 +6858,7 @@ em {
6217
6858
 
6218
6859
  .dndev-table-search-icon {
6219
6860
  position: absolute;
6220
- left: var(--gap-md);
6861
+ inset-inline-start: var(--gap-md);
6221
6862
  top: 50%;
6222
6863
  transform: translateY(-50%);
6223
6864
  width: var(--icon-md);
@@ -6384,7 +7025,7 @@ em {
6384
7025
  .dndev-tag {
6385
7026
  display: inline-flex;
6386
7027
  align-items: center;
6387
- gap: var(--gap-xs);
7028
+ gap: var(--gap-sm);
6388
7029
  border-radius: var(--radius-full);
6389
7030
  border: 1px solid transparent;
6390
7031
  font-size: var(--font-size-sm);
@@ -6514,8 +7155,18 @@ em {
6514
7155
  font-weight: var(--font-weight-medium);
6515
7156
  line-height: var(--line-height);
6516
7157
  background-color: transparent; /* Text never has background, only color changes */
7158
+
7159
+ /* Respect semantic HTML elements */
6517
7160
  }
6518
7161
 
7162
+ .dndev-text-base:is(strong) {
7163
+ font-weight: var(--font-weight-semibold);
7164
+ }
7165
+
7166
+ .dndev-text-base:is(em) {
7167
+ font-style: italic;
7168
+ }
7169
+
6519
7170
  .dndev-text-base[data-variant='default'] {
6520
7171
  color: inherit;
6521
7172
  }
@@ -7463,7 +8114,7 @@ em {
7463
8114
  align-items: stretch;
7464
8115
  }
7465
8116
 
7466
- @media (width <= 699px) {
8117
+ @media (width <=699px) {
7467
8118
 
7468
8119
  [data-cols='2'] {
7469
8120
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7475,14 +8126,14 @@ em {
7475
8126
  align-items: stretch;
7476
8127
  }
7477
8128
 
7478
- @media (width <= 1049px) {
8129
+ @media (width <=1049px) {
7479
8130
 
7480
8131
  [data-cols='3'] {
7481
8132
  grid-template-columns: repeat(2, minmax(350px, 1fr));
7482
8133
  }
7483
8134
  }
7484
8135
 
7485
- @media (width <= 699px) {
8136
+ @media (width <=699px) {
7486
8137
 
7487
8138
  [data-cols='3'] {
7488
8139
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7496,21 +8147,21 @@ em {
7496
8147
  /* Responsive: reduce columns when container is narrow */
7497
8148
  }
7498
8149
 
7499
- @media (width <= 1399px) {
8150
+ @media (width <=1399px) {
7500
8151
 
7501
8152
  [data-cols='4'] {
7502
8153
  grid-template-columns: repeat(3, minmax(0, 1fr));
7503
8154
  }
7504
8155
  }
7505
8156
 
7506
- @media (width <= 1049px) {
8157
+ @media (width <=1049px) {
7507
8158
 
7508
8159
  [data-cols='4'] {
7509
8160
  grid-template-columns: repeat(2, minmax(0, 1fr));
7510
8161
  }
7511
8162
  }
7512
8163
 
7513
- @media (width <= 699px) {
8164
+ @media (width <=699px) {
7514
8165
 
7515
8166
  [data-cols='4'] {
7516
8167
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -7577,18 +8228,22 @@ em {
7577
8228
 
7578
8229
  code {
7579
8230
  font-family: var(--font-mono);
7580
- font-size: inherit; /* Inherit parent size */
7581
- font-weight: inherit; /* Inherit parent weight */
8231
+ font-size: inherit;
8232
+ /* Inherit parent size */
8233
+ font-weight: inherit;
8234
+ /* Inherit parent weight */
7582
8235
  line-height: inherit;
7583
8236
  color: inherit;
7584
- background: transparent; /* No background by default */
8237
+ background: transparent;
8238
+ /* No background by default */
7585
8239
  }
7586
8240
 
7587
8241
  /* Code variant - visual styling (background, padding, can apply to any element) */
7588
8242
 
7589
8243
  [data-variant='code'] {
7590
8244
  font-family: var(--font-mono);
7591
- font-size: var(--font-size-sm); /* Default small size */
8245
+ font-size: var(--font-size-sm);
8246
+ /* Default small size */
7592
8247
  background: var(--muted);
7593
8248
  color: var(--muted-foreground);
7594
8249
  padding: var(--gap-sm) var(--gap-md);
@@ -7683,7 +8338,8 @@ h4[data-variant='code'] {
7683
8338
 
7684
8339
  .dndev-relative {
7685
8340
  position: relative;
7686
- min-width: 0; /* Allow flex items to shrink below content size */
8341
+ min-width: 0;
8342
+ /* Allow flex items to shrink below content size */
7687
8343
  }
7688
8344
 
7689
8345
  .dndev-absolute {
@@ -7775,6 +8431,10 @@ h4[data-variant='code'] {
7775
8431
  pointer-events: auto;
7776
8432
  }
7777
8433
 
8434
+ .dndev-cursor-pointer {
8435
+ cursor: pointer;
8436
+ }
8437
+
7778
8438
  .dndev-aspect-video {
7779
8439
  aspect-ratio: 16 / 9;
7780
8440
  }
@@ -7788,7 +8448,7 @@ h4[data-variant='code'] {
7788
8448
  RESPONSIVE DISPLAY
7789
8449
  =========================== */
7790
8450
 
7791
- @media (width >= 768px) {
8451
+ @media (width >=768px) {
7792
8452
  .dndev-md\:block {
7793
8453
  display: block;
7794
8454
  }
@@ -7814,7 +8474,7 @@ h4[data-variant='code'] {
7814
8474
  }
7815
8475
  }
7816
8476
 
7817
- @media (width >= 1024px) {
8477
+ @media (width >=1024px) {
7818
8478
  .dndev-lg\:block {
7819
8479
  display: block;
7820
8480
  }
@@ -7874,6 +8534,10 @@ h4[data-variant='code'] {
7874
8534
  Components are unaffected - they own their own spacing
7875
8535
  =========================== */
7876
8536
 
8537
+ .prose {
8538
+ text-align: start;
8539
+ }
8540
+
7877
8541
  .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7878
8542
  margin-block: var(--gap-md);
7879
8543
  }
@@ -8337,10 +9001,7 @@ main[role='main'][data-routing-animation='none'] {
8337
9001
  max-height: 100dvh;
8338
9002
  overflow: hidden;
8339
9003
  display: grid;
8340
- /* ONE DRY grid structure: 3 rows, 2 columns */
8341
- /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
8342
- /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
8343
- implement ResizeObserver to update --footer-height dynamically. */
9004
+ /* Grid structure: 3 rows, 2 columns */
8344
9005
  grid-template-areas:
8345
9006
  'header header'
8346
9007
  'sidebar main'
@@ -8351,15 +9012,61 @@ main[role='main'][data-routing-animation='none'] {
8351
9012
  );
8352
9013
  grid-template-columns: var(--sidebar-width) 1fr;
8353
9014
 
8354
- /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
9015
+ /* Mobile: No footer grid row - footer is inside main */
9016
+ /* When mergedBar is shown, header is hidden but grid still needs space for mergedBar */
9017
+ }
9018
+
9019
+ @media (width <= 1023px) {
9020
+
9021
+ .dndev-layout {
9022
+ grid-template-areas:
9023
+ 'header header'
9024
+ 'sidebar main';
9025
+ grid-template-rows: var(--header-height) 1fr;
9026
+
9027
+ /* Presets with mergedBar: header is hidden, but grid still allocates space for mergedBar */
9028
+ /* No extra padding needed - grid spacing is sufficient */
9029
+ }
9030
+ .dndev-layout[data-layout='admin'],.dndev-layout[data-layout='moolti'],.dndev-layout[data-layout='game'],.dndev-layout[data-layout='docs'] {
9031
+ /* Grid already accounts for header-height, mergedBar is fixed and doesn't need extra padding */
9032
+ }
9033
+ }
9034
+
9035
+ /* Footer containers: show/hide based on breakpoint */
9036
+
9037
+ .footer-mobile {
9038
+ display: none;
9039
+ /* No margin-top: auto - footer scrolls with content on mobile */
9040
+ /* No flex-shrink: 0 - footer is in normal flow, not stuck at bottom */
8355
9041
  }
8356
9042
 
8357
- [data-layout='game']:root .dndev-layout {
8358
- grid-template-rows: var(--header-height) 1fr minmax(
8359
- var(--footer-height),
8360
- auto
8361
- );
9043
+ .footer-desktop {
9044
+ display: contents; /* Children (footer element) participate in grid */
9045
+ }
9046
+
9047
+ @media (width <= 1023px) {
9048
+ .footer-mobile {
9049
+ display: block;
9050
+ }
9051
+
9052
+ .footer-desktop {
9053
+ display: none;
9054
+ }
9055
+
9056
+ /* Game: No mobile footer - navigation in MergedBar */
9057
+ [data-layout='game'] .footer-mobile {
9058
+ display: none;
8362
9059
  }
9060
+ }
9061
+
9062
+ /* Presets with no footer at all */
9063
+
9064
+ [data-layout='moolti'] .footer-mobile,
9065
+ [data-layout='moolti'] .footer-desktop,
9066
+ [data-layout='plain'] .footer-mobile,
9067
+ [data-layout='plain'] .footer-desktop {
9068
+ display: none;
9069
+ }
8363
9070
 
8364
9071
  /* ===========================
8365
9072
  LAYOUT ZONE POSITIONING RULES
@@ -8374,6 +9081,8 @@ header[role='banner'] {
8374
9081
  grid-area: header;
8375
9082
  box-sizing: border-box;
8376
9083
  height: var(--header-height);
9084
+ min-height: var(--header-height);
9085
+ max-height: var(--header-height);
8377
9086
  position: relative;
8378
9087
  z-index: var(--z-header);
8379
9088
  contain: layout style;
@@ -8400,7 +9109,9 @@ header[role='banner'] {
8400
9109
  align-items: center;
8401
9110
  flex-shrink: 0;
8402
9111
  height: 100%;
9112
+ max-height: 100%;
8403
9113
  gap: var(--gap-sm);
9114
+ overflow: hidden;
8404
9115
  }
8405
9116
 
8406
9117
  .header-end {
@@ -8408,8 +9119,11 @@ header[role='banner'] {
8408
9119
  align-items: center;
8409
9120
  justify-content: flex-end;
8410
9121
  flex-shrink: 0;
9122
+ height: 100%;
9123
+ max-height: 100%;
8411
9124
  margin-inline-start: auto;
8412
9125
  gap: var(--gap-sm);
9126
+ overflow: hidden;
8413
9127
  }
8414
9128
 
8415
9129
  /* Viewport-centered center content - absolutely positioned overlay */
@@ -8701,11 +9415,17 @@ main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'
8701
9415
  /* Page content grows */
8702
9416
  }
8703
9417
 
8704
- main[role='main'] > *:last-child {
8705
- flex-shrink: 0;
8706
- /* Footer stays at bottom */
9418
+ /* Desktop: Footer stays at bottom of viewport */
9419
+
9420
+ @media (width > 1023px) {
9421
+ main[role='main'] > *:last-child {
9422
+ flex-shrink: 0;
9423
+ /* Footer stays at bottom */
9424
+ }
8707
9425
  }
8708
9426
 
9427
+ /* Mobile: Footer scrolls with content (no flex-shrink needed) */
9428
+
8709
9429
  /* Footer: Full width by default, app presets start after sidebar */
8710
9430
 
8711
9431
  /* box-sizing: border-box ensures borders are included in height */
@@ -8738,26 +9458,6 @@ footer[role='contentinfo'] > * {
8738
9458
  padding-inline-end: var(--content-padding);
8739
9459
  }
8740
9460
 
8741
- /* Game: Hide footer on tablet/mobile - merged into GameMergedBar */
8742
-
8743
- @media (width <= 1023px) {
8744
- [data-layout='game']:root footer[role='contentinfo'] {
8745
- display: none;
8746
- }
8747
- }
8748
-
8749
- /* Moolti: No footer (built into sidebar) */
8750
-
8751
- [data-layout='moolti']:root footer[role='contentinfo'] {
8752
- display: none;
8753
- }
8754
-
8755
- /* Plain: No footer (full-screen apps) */
8756
-
8757
- [data-layout='plain']:root footer[role='contentinfo'] {
8758
- display: none;
8759
- }
8760
-
8761
9461
  /* Footer text styles */
8762
9462
 
8763
9463
  footer[role='contentinfo'] .footer-copyright {
@@ -8802,7 +9502,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8802
9502
 
8803
9503
  .merged-bar[data-position='top'] {
8804
9504
  top: 0;
8805
- height: 64px;
9505
+ height: var(--header-height);
8806
9506
  border-bottom: 2px solid var(--border);
8807
9507
  padding-top: env(safe-area-inset-top);
8808
9508
  }
@@ -8830,7 +9530,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8830
9530
  min-height: 0;
8831
9531
  }
8832
9532
 
8833
- /* Mobile (<1024px): Show merged-bar, hide zones, add padding */
9533
+ /* Mobile (<1024px): Show merged-bar, hide zones */
8834
9534
 
8835
9535
  @media (width <= 1023px) {
8836
9536
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
@@ -8845,7 +9545,8 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8845
9545
  [data-layout='moolti'] .dndev-layout,
8846
9546
  [data-layout='game'] .dndev-layout,
8847
9547
  [data-layout='docs'] .dndev-layout {
8848
- padding-top: calc(64px + env(safe-area-inset-top));
9548
+ /* Remove padding-top - grid already accounts for header-height, mergedBar is fixed and doesn't affect grid flow */
9549
+ /* Content won't go under mergedBar because grid positions main after header row */
8849
9550
  }
8850
9551
 
8851
9552
  [data-layout='admin'] header[role='banner'],
@@ -9077,7 +9778,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9077
9778
  .breadcrumb-item {
9078
9779
  display: inline-flex;
9079
9780
  align-items: center;
9080
- gap: var(--gap-xs);
9781
+ gap: var(--gap-sm);
9081
9782
  }
9082
9783
 
9083
9784
  .breadcrumbs .separator,
@@ -9154,7 +9855,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9154
9855
  min-height: 0;
9155
9856
  display: flex;
9156
9857
  flex-direction: column;
9157
- justify-content: space-between;
9858
+ justify-content: flex-start;
9158
9859
  gap: var(--gap-lg);
9159
9860
  /* Controlled by density system */
9160
9861
  /* Default: centered */