@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
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;
2302
+ }
2303
+ to {
2304
+ height: 0;
2305
+ opacity: 0;
2211
2306
  }
2307
+ }
2212
2308
 
2213
2309
  .dndev-accordion-content-inner {
2214
2310
  padding-bottom: var(--gap-md);
@@ -2632,6 +2728,34 @@ em {
2632
2728
 
2633
2729
  /* Label styling moved to patterns.css (.dndev-interactive-label) */
2634
2730
 
2731
+ /* Loading state */
2732
+
2733
+ [data-loading] {
2734
+ cursor: wait;
2735
+ pointer-events: none;
2736
+ }
2737
+
2738
+ /* Button spinner - inherits size from button font-size */
2739
+
2740
+ .dndev-button-spinner {
2741
+ flex-shrink: 0;
2742
+ }
2743
+
2744
+ /* Progress ring for upload percentage */
2745
+
2746
+ .dndev-button-progress {
2747
+ display: inline-flex;
2748
+ align-items: center;
2749
+ justify-content: center;
2750
+ flex-shrink: 0;
2751
+ }
2752
+
2753
+ .dndev-progress-ring {
2754
+ width: 1em;
2755
+ height: 1em;
2756
+ transform: rotate(-90deg);
2757
+ }
2758
+
2635
2759
  /* packages/components/src/atomic/Calendar/Calendar.css */
2636
2760
 
2637
2761
  /**
@@ -3199,21 +3323,58 @@ em {
3199
3323
  @keyframes slideDown {
3200
3324
  from {
3201
3325
  height: 0;
3326
+ opacity: 0;
3202
3327
  }
3203
3328
  to {
3204
3329
  height: var(--radix-collapsible-content-height);
3330
+ opacity: 1;
3205
3331
  }
3206
3332
  }
3207
3333
 
3208
3334
  @keyframes slideUp {
3209
3335
  from {
3210
3336
  height: var(--radix-collapsible-content-height);
3337
+ opacity: 1;
3211
3338
  }
3212
3339
  to {
3213
3340
  height: 0;
3341
+ opacity: 0;
3214
3342
  }
3215
3343
  }
3216
3344
 
3345
+ .dndev-collapsible-trigger {
3346
+ width: 100%;
3347
+ cursor: pointer;
3348
+ transition: opacity var(--dur-fast) var(--ease-in-out);
3349
+ }
3350
+
3351
+ .dndev-collapsible-trigger:hover {
3352
+ opacity: var(--opacity-strong);
3353
+ }
3354
+
3355
+ .dndev-collapsible-trigger:focus-visible {
3356
+ outline: 2px solid var(--ring);
3357
+ outline-offset: 2px;
3358
+ border-radius: var(--radius-interactive);
3359
+ }
3360
+
3361
+ .dndev-collapsible-icon {
3362
+ width: var(--size-md);
3363
+ height: var(--size-md);
3364
+ flex-shrink: 0;
3365
+ color: var(--accent);
3366
+ transition: transform var(--dur-normal) var(--ease-in-out);
3367
+ }
3368
+
3369
+ .dndev-collapsible-chevron {
3370
+ transform: rotate(0deg);
3371
+ transition: transform var(--dur-normal) var(--ease-in-out);
3372
+ }
3373
+
3374
+ .dndev-collapsible[data-state='open'] .dndev-collapsible-chevron {
3375
+ transform: rotate(180deg);
3376
+ }
3377
+
3217
3378
  /* packages/components/src/atomic/Combobox/Combobox.css */
3218
3379
 
3219
3380
  .dndev-combobox-trigger {
@@ -3293,7 +3454,7 @@ em {
3293
3454
  .dndev-combobox-content {
3294
3455
  width: var(--radix-popover-trigger-width);
3295
3456
  min-width: var(--radix-popover-trigger-width);
3296
- max-height: 300px;
3457
+ max-width: var(--radix-popover-trigger-width);
3297
3458
  display: flex;
3298
3459
  flex-direction: column;
3299
3460
  padding: 0;
@@ -3308,14 +3469,6 @@ em {
3308
3469
  width: 100%;
3309
3470
  }
3310
3471
 
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
3472
  .dndev-combobox-option {
3320
3473
  all: unset;
3321
3474
  display: flex;
@@ -3372,6 +3525,30 @@ em {
3372
3525
  color: var(--muted-foreground);
3373
3526
  }
3374
3527
 
3528
+ /* Creatable option styling */
3529
+
3530
+ .dndev-combobox-option-create {
3531
+ color: var(--primary);
3532
+ font-style: italic;
3533
+ }
3534
+
3535
+ .dndev-combobox-option-create-icon {
3536
+ width: var(--icon-md);
3537
+ height: var(--icon-md);
3538
+ margin-inline-end: var(--gap-sm);
3539
+ flex-shrink: 0;
3540
+ }
3541
+
3542
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon svg,
3543
+ .dndev-combobox-open .dndev-input-with-trailing-icon .dndev-input-icon > * {
3544
+ transform: rotate(180deg);
3545
+ }
3546
+
3547
+ .dndev-input-with-trailing-icon .dndev-input-icon svg,
3548
+ .dndev-input-with-trailing-icon .dndev-input-icon > * {
3549
+ transition: transform var(--dur-fast) var(--ease-in-out);
3550
+ }
3551
+
3375
3552
  /* packages/components/src/atomic/DualCard/DualCard.css */
3376
3553
 
3377
3554
  .dndev-dual-card {
@@ -3558,13 +3735,15 @@ em {
3558
3735
  text-align: start;
3559
3736
  display: block;
3560
3737
  line-height: 1.5; /* Match line numbers */
3738
+ font-size: var(--font-size-sm); /* Explicit match with line numbers */
3561
3739
  }
3562
3740
 
3563
- /* Ensure shiki-generated code respects line-height */
3741
+ /* Ensure shiki-generated code respects line-height AND font-size */
3564
3742
 
3565
3743
  .dndev-code-code pre,
3566
3744
  .dndev-code-code code {
3567
3745
  line-height: inherit;
3746
+ font-size: inherit; /* Match parent font-size */
3568
3747
  }
3569
3748
 
3570
3749
  /* packages/components/src/atomic/Command/Command.css */
@@ -3942,16 +4121,6 @@ em {
3942
4121
  padding: var(--gap-sm);
3943
4122
  }
3944
4123
 
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
4124
  /* Checked state styling */
3956
4125
 
3957
4126
  .dndev-interactive[data-role='menu-item'][data-state='checked'] {
@@ -4475,6 +4644,81 @@ em {
4475
4644
  margin-inline-start: var(--gap-sm);
4476
4645
  }
4477
4646
 
4647
+ /* Floating Fieldset - native border-cutting via legend */
4648
+
4649
+ .dndev-floating-fieldset {
4650
+ position: relative;
4651
+ border: var(--border-hairline) solid var(--line-2);
4652
+ border-radius: var(--radius-interactive);
4653
+ margin: 0;
4654
+ padding: 0;
4655
+ background-color: transparent;
4656
+ transition: all var(--dur-normal) var(--ease-in-out);
4657
+ text-align: start;
4658
+ }
4659
+
4660
+ .dndev-floating-fieldset:hover {
4661
+ border-color: var(--ring);
4662
+ }
4663
+
4664
+ .dndev-floating-fieldset:focus-within {
4665
+ border-color: var(--ring);
4666
+ box-shadow: 0 0 0 2px var(--ring);
4667
+ }
4668
+
4669
+ .dndev-floating-fieldset[data-disabled='true'] {
4670
+ opacity: var(--opacity-muted);
4671
+ cursor: not-allowed;
4672
+ }
4673
+
4674
+ /* Legend sits on border - browser natively cuts border */
4675
+
4676
+ .dndev-floating-legend {
4677
+ margin-inline-start: var(--gap-sm);
4678
+ padding: 0 var(--gap-sm);
4679
+ font-size: var(--font-size-xs);
4680
+ font-weight: 500;
4681
+ line-height: 1;
4682
+ color: var(--foreground);
4683
+ }
4684
+
4685
+ .dndev-floating-legend label {
4686
+ cursor: default;
4687
+ display: inline-flex;
4688
+ align-items: center;
4689
+ gap: var(--gap-tight);
4690
+ }
4691
+
4692
+ .dndev-floating-fieldset[data-disabled='true'] .dndev-floating-legend {
4693
+ color: var(--muted-foreground);
4694
+ }
4695
+
4696
+ .dndev-floating-legend[data-truncate='true'] {
4697
+ max-width: calc(100% - var(--gap-md) * 2);
4698
+ overflow: hidden;
4699
+ text-overflow: ellipsis;
4700
+ white-space: nowrap;
4701
+ }
4702
+
4703
+ /* Remove border from inner input since fieldset has it */
4704
+
4705
+ .dndev-floating-fieldset .dndev-input {
4706
+ border: none;
4707
+ border-radius: var(--radius-interactive);
4708
+ box-shadow: none;
4709
+ }
4710
+
4711
+ .dndev-floating-fieldset .dndev-input:hover {
4712
+ border-color: transparent;
4713
+ }
4714
+
4715
+ .dndev-floating-fieldset .dndev-input:focus,
4716
+ .dndev-floating-fieldset .dndev-input:focus-visible {
4717
+ border-color: transparent;
4718
+ box-shadow: none;
4719
+ outline: none;
4720
+ }
4721
+
4478
4722
  /* packages/components/src/atomic/List/List.css */
4479
4723
 
4480
4724
  .dndev-list {
@@ -4783,20 +5027,41 @@ em {
4783
5027
  /* packages/components/src/atomic/PasswordInput/PasswordInput.css */
4784
5028
 
4785
5029
  .dndev-password-input-with-toggle {
4786
- padding-inline-end: var(--gap-lg);
5030
+ padding-inline-end: calc(var(--gap-xl) + var(--gap-md)) !important;
4787
5031
  }
4788
5032
 
5033
+ /* Eye icon toggle - ALWAYS at end, cannot be overridden */
5034
+
4789
5035
  .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);
5036
+ position: absolute !important;
5037
+ top: 50% !important;
5038
+ transform: translateY(-50%) !important;
5039
+ inset-inline-end: var(--gap-sm) !important;
5040
+ inset-inline-start: unset !important;
5041
+ background: none !important;
5042
+ border: none !important;
5043
+ cursor: pointer !important;
5044
+ padding: var(--gap-tight) !important;
5045
+ display: flex !important;
5046
+ align-items: center !important;
5047
+ opacity: var(--opacity-muted) !important;
5048
+ transition: opacity var(--dur-fast) var(--ease-in-out) !important;
5049
+ -webkit-user-select: none !important;
5050
+ -moz-user-select: none !important;
5051
+ user-select: none !important;
5052
+ z-index: 1 !important;
5053
+ }
5054
+
5055
+ .dndev-password-toggle-button:hover,
5056
+ .dndev-password-toggle-button:focus {
5057
+ opacity: 1 !important;
5058
+ outline: none !important;
4796
5059
  }
4797
5060
 
4798
5061
  .dndev-password-toggle-icon {
4799
5062
  color: var(--muted-foreground);
5063
+ width: var(--icon-sm);
5064
+ height: var(--icon-sm);
4800
5065
  }
4801
5066
 
4802
5067
  /* packages/components/src/atomic/Pagination/Pagination.css */
@@ -4888,9 +5153,32 @@ em {
4888
5153
  height: 100%;
4889
5154
  width: 100%;
4890
5155
  flex: 1;
5156
+ background-color: var(--primary);
4891
5157
  transition: transform var(--dur-normal) var(--ease-in-out);
5158
+
5159
+ /* Variant colors */
4892
5160
  }
4893
5161
 
5162
+ [data-variant='default']:is(.dndev-progress [data-radix-progress-indicator]) {
5163
+ background-color: var(--primary);
5164
+ }
5165
+
5166
+ [data-variant='accent']:is(.dndev-progress [data-radix-progress-indicator]) {
5167
+ background-color: var(--accent);
5168
+ }
5169
+
5170
+ [data-variant='success']:is(.dndev-progress [data-radix-progress-indicator]) {
5171
+ background-color: var(--success);
5172
+ }
5173
+
5174
+ [data-variant='warning']:is(.dndev-progress [data-radix-progress-indicator]) {
5175
+ background-color: var(--warning);
5176
+ }
5177
+
5178
+ [data-variant='destructive']:is(.dndev-progress [data-radix-progress-indicator]) {
5179
+ background-color: var(--destructive);
5180
+ }
5181
+
4894
5182
  /* packages/components/src/atomic/RadioGroup/RadioGroup.css */
4895
5183
 
4896
5184
  /* Uses shared .dndev-control-group pattern from patterns.css */
@@ -5096,7 +5384,6 @@ em {
5096
5384
  display: flex;
5097
5385
  flex-direction: column;
5098
5386
  padding: 0;
5099
- overflow-y: auto;
5100
5387
  }
5101
5388
 
5102
5389
  .dndev-interactive[data-radix-select-item] {
@@ -5218,6 +5505,7 @@ em {
5218
5505
  letter-spacing: 0.2em;
5219
5506
  color: var(--accent) !important;
5220
5507
  margin-block-end: var(--gap-md);
5508
+ text-align: center; /* DEFAULT - works without attribute selector */
5221
5509
  }
5222
5510
 
5223
5511
  .dndev-section-full-width[data-text-align='start'] .dndev-section-title {
@@ -5232,26 +5520,71 @@ em {
5232
5520
  text-align: end;
5233
5521
  }
5234
5522
 
5235
- /* packages/components/src/atomic/Separator/Separator.css */
5523
+ /* Collapsible title trigger */
5236
5524
 
5237
- .dndev-separator {
5238
- flex-shrink: 0;
5239
- background-color: var(--line-2);
5240
- margin-inline: auto;
5525
+ .dndev-section-title-trigger {
5526
+ width: 100%;
5527
+ cursor: pointer;
5528
+ transition: opacity var(--dur-fast) var(--ease-in-out);
5529
+ margin-block-end: var(--gap-md);
5241
5530
  }
5242
5531
 
5243
- .dndev-separator[data-orientation='horizontal'] {
5244
- height: 2px;
5245
- width: 80%;
5246
-
5247
- /* Inside Section: cap to content width */
5248
- }
5532
+ .dndev-section-title-trigger .dndev-section-title {
5533
+ margin-block-end: 0;
5534
+ }
5249
5535
 
5250
- .dndev-section .dndev-separator[data-orientation='horizontal'] {
5251
- max-width: calc(var(--content-width) * 0.8);
5252
- }
5536
+ .dndev-section-title-trigger:hover {
5537
+ opacity: var(--opacity-strong);
5538
+ }
5253
5539
 
5254
- .dndev-separator[data-orientation='vertical'] {
5540
+ .dndev-section-title-trigger:focus-visible {
5541
+ outline: 2px solid var(--ring);
5542
+ outline-offset: 2px;
5543
+ border-radius: var(--radius-interactive);
5544
+ }
5545
+
5546
+ .dndev-section-icon {
5547
+ width: var(--size-md);
5548
+ height: var(--size-md);
5549
+ flex-shrink: 0;
5550
+ color: var(--accent);
5551
+ transition: transform var(--dur-normal) var(--ease-in-out);
5552
+ }
5553
+
5554
+ .dndev-section-full-width[data-text-align='start']
5555
+ .dndev-section-title-trigger {
5556
+ justify-content: flex-start;
5557
+ }
5558
+
5559
+ .dndev-section-full-width[data-text-align='center']
5560
+ .dndev-section-title-trigger {
5561
+ justify-content: center;
5562
+ }
5563
+
5564
+ .dndev-section-full-width[data-text-align='end'] .dndev-section-title-trigger {
5565
+ justify-content: flex-end;
5566
+ }
5567
+
5568
+ /* packages/components/src/atomic/Separator/Separator.css */
5569
+
5570
+ .dndev-separator {
5571
+ flex-shrink: 0;
5572
+ background-color: var(--line-2);
5573
+ margin-inline: auto;
5574
+ }
5575
+
5576
+ .dndev-separator[data-orientation='horizontal'] {
5577
+ height: 2px;
5578
+ width: 80%;
5579
+
5580
+ /* Inside Section: cap to content width */
5581
+ }
5582
+
5583
+ .dndev-section .dndev-separator[data-orientation='horizontal'] {
5584
+ max-width: calc(var(--content-width) * 0.8);
5585
+ }
5586
+
5587
+ .dndev-separator[data-orientation='vertical'] {
5255
5588
  width: 1px;
5256
5589
  height: 100%;
5257
5590
  }
@@ -5373,50 +5706,210 @@ em {
5373
5706
  display: flex;
5374
5707
  flex-direction: column;
5375
5708
  z-index: var(--z-modal);
5376
- border-radius: var(--radius-floating); /* Square like floating panels */
5709
+ background: var(--card);
5710
+ /* Ensure background is opaque */
5711
+ color: var(--card-foreground);
5712
+ box-shadow: var(--shadow-xl);
5713
+ /* Focus Tunnel: Deep elevation */
5714
+ overflow: hidden;
5715
+ /* Scroll Trap: Container clips overflow */
5716
+
5717
+ /* Motion Physics: Base state */
5718
+ will-change: transform, opacity;
5377
5719
 
5378
- /* Sheet positioning by side */
5720
+ /* Open state animation - "Heavy" ease for premium feel */
5379
5721
  }
5380
5722
 
5723
+ .dndev-sheet-content[data-state='open'] {
5724
+ animation: sheet-slide-in var(--dur-heavy) var(--ease-heavy);
5725
+ }
5726
+
5727
+ /* Closed state animation */
5728
+
5729
+ .dndev-sheet-content[data-state='closed'] {
5730
+ animation: sheet-slide-out var(--dur-normal) var(--ease-in-out);
5731
+ }
5732
+
5733
+ /* Sheet positioning by side - SPATIAL METAPHOR */
5734
+
5735
+ /* RIGHT / LEFT (Desktop Panels) */
5736
+
5381
5737
  .dndev-sheet-content[data-side='right'],.dndev-sheet-content[data-side='left'] {
5382
5738
  top: 0;
5383
5739
  bottom: 0;
5384
5740
  width: 80%;
5385
5741
  max-width: 56rem;
5742
+ /* Standard panel width */
5743
+ height: 100%;
5744
+ /* Full height */
5745
+ border-radius: 0;
5746
+ /* Square edges for panel metaphor */
5386
5747
  }
5387
5748
 
5388
5749
  .dndev-sheet-content[data-side='right'] {
5750
+ /* Physical positioning: right edge */
5389
5751
  right: 0;
5752
+ left: auto;
5753
+ /* Border on logical start (left in LTR, right in RTL) */
5754
+ border-inline-start: var(--border-hairline) solid var(--line-1);
5390
5755
  }
5391
5756
 
5392
5757
  .dndev-sheet-content[data-side='left'] {
5758
+ /* Physical positioning: left edge */
5393
5759
  left: 0;
5760
+ right: auto;
5761
+ /* Border on logical end (right in LTR, left in RTL) */
5762
+ border-inline-end: var(--border-hairline) solid var(--line-1);
5394
5763
  }
5395
5764
 
5765
+ /* TOP / BOTTOM (Mobile Cards) */
5766
+
5396
5767
  .dndev-sheet-content[data-side='top'],.dndev-sheet-content[data-side='bottom'] {
5397
5768
  left: 0;
5398
5769
  right: 0;
5399
- height: 80%;
5400
- max-height: 56rem;
5401
- overflow: hidden;
5770
+ /* Card metaphor: Detached from opposite edge */
5771
+ height: auto;
5772
+ max-height: 92dvh;
5773
+ /* Never touch top edge */
5774
+ width: 100%;
5775
+ margin-left: auto;
5776
+ margin-right: auto;
5777
+
5778
+ /* On larger screens, constrain width */
5402
5779
  }
5403
5780
 
5781
+ @media (width >=768px) {
5782
+
5783
+ .dndev-sheet-content[data-side='top'],.dndev-sheet-content[data-side='bottom'] {
5784
+ max-width: 56rem;
5785
+ width: 90%;
5786
+ border-radius: var(--radius-lg);
5787
+ /* Fully rounded card on desktop */
5788
+ }
5789
+ }
5790
+
5404
5791
  .dndev-sheet-content[data-side='top'] {
5405
5792
  top: 0;
5793
+ border-bottom: var(--border-hairline) solid var(--line-1);
5794
+ /* Rounded bottom corners only */
5795
+ border-bottom-left-radius: var(--radius-lg);
5796
+ border-bottom-right-radius: var(--radius-lg);
5406
5797
  }
5407
5798
 
5408
5799
  .dndev-sheet-content[data-side='bottom'] {
5409
5800
  bottom: 0;
5801
+ border-top: var(--border-hairline) solid var(--line-1);
5802
+ /* Rounded top corners only */
5803
+ border-top-left-radius: var(--radius-lg);
5804
+ border-top-right-radius: var(--radius-lg);
5410
5805
  }
5411
5806
 
5807
+ /* DRAG HANDLE PILL - Visual affordance for draggable sheets */
5808
+
5809
+ .dndev-sheet-drag-handle {
5810
+ width: 2.5rem;
5811
+ height: 0.25rem;
5812
+ background: var(--line-2);
5813
+ border-radius: var(--radius-full);
5814
+ margin: var(--gap-sm) auto 0;
5815
+ flex-shrink: 0;
5816
+ cursor: grab;
5817
+ transition: background-color var(--dur-fast) var(--ease-in-out);
5818
+ }
5819
+
5820
+ .dndev-sheet-drag-handle:active {
5821
+ cursor: grabbing;
5822
+ }
5823
+
5824
+ /* Positioning for bottom sheets */
5825
+
5826
+ .dndev-sheet-content[data-side='bottom'] > .dndev-sheet-drag-handle {
5827
+ margin-top: var(--gap-sm);
5828
+ margin-bottom: 0;
5829
+ }
5830
+
5831
+ /* Positioning for top sheets */
5832
+
5833
+ .dndev-sheet-content[data-side='top'] > .dndev-sheet-drag-handle {
5834
+ margin-top: max(var(--gap-sm), env(safe-area-inset-top));
5835
+ margin-bottom: 0;
5836
+ }
5837
+
5838
+ /* HEADER - Pinned, No Padding (Tight Layout) */
5839
+
5840
+ /* Industry standard: Title always on start, X always on end (consistent across all sides) */
5841
+
5412
5842
  .dndev-sheet-header {
5413
5843
  display: flex;
5414
5844
  align-items: center;
5415
5845
  justify-content: space-between;
5416
5846
  gap: var(--gap-md);
5417
5847
  flex-shrink: 0;
5848
+ /* Never shrink */
5418
5849
  min-height: var(--touch-target);
5419
- margin-bottom: var(--gap-md);
5850
+ /* No padding - tight layout: [ Title X ] */
5851
+ padding-block: 0;
5852
+ /* RTL-aware: padding on logical start only */
5853
+ padding-inline-start: var(--gap-md);
5854
+ padding-inline-end: 0; /* X button has its own spacing */
5855
+ border-bottom: var(--border-hairline) solid var(--line-1);
5856
+ /* Separator */
5857
+
5858
+ /* Thumb Ergonomics: Top Safe Area (only for top sheets) */
5859
+ }
5860
+
5861
+ .dndev-sheet-content[data-side='top'] .dndev-sheet-header {
5862
+ padding-top: max(0, env(safe-area-inset-top));
5863
+ }
5864
+
5865
+ /* Adjust header padding when drag handle is present (sibling selector) */
5866
+
5867
+ .dndev-sheet-content[data-side='bottom'] .dndev-sheet-drag-handle ~ .dndev-sheet-header,
5868
+ .dndev-sheet-content[data-side='top'] .dndev-sheet-drag-handle ~ .dndev-sheet-header {
5869
+ padding-top: 0;
5870
+ }
5871
+
5872
+ /* BODY - Scrollable */
5873
+
5874
+ .dndev-sheet-body {
5875
+ flex: 1;
5876
+ /* Consumes available space */
5877
+ overflow-y: auto;
5878
+ /* Independent scroll */
5879
+ overflow-x: hidden;
5880
+ padding: var(--gap-md);
5881
+ overscroll-behavior: contain;
5882
+ /* Prevent body scroll chaining */
5883
+ }
5884
+
5885
+ /* FOOTER - Pinned */
5886
+
5887
+ .dndev-sheet-footer {
5888
+ flex-shrink: 0;
5889
+ /* Never shrink */
5890
+ padding: var(--gap-md);
5891
+ border-top: var(--border-hairline) solid var(--line-1);
5892
+ /* Separator */
5893
+ display: flex;
5894
+ flex-direction: column-reverse;
5895
+ /* Mobile-first stacking */
5896
+ gap: var(--gap-sm);
5897
+
5898
+ /* Desktop: Row layout */
5899
+ }
5900
+
5901
+ @media (width >=640px) {
5902
+
5903
+ .dndev-sheet-footer {
5904
+ flex-direction: row;
5905
+ justify-content: flex-end;
5906
+ }
5907
+ }
5908
+
5909
+ .dndev-sheet-footer {
5910
+
5911
+ /* Thumb Ergonomics: Bottom Safe Area (Home Indicator) */
5912
+ padding-bottom: max(var(--gap-md), env(safe-area-inset-bottom));
5420
5913
  }
5421
5914
 
5422
5915
  .dndev-sheet-title {
@@ -5426,19 +5919,72 @@ em {
5426
5919
  }
5427
5920
 
5428
5921
  .dndev-sheet-close {
5429
- position: absolute;
5430
- top: var(--gap-md);
5431
- inset-inline-end: var(--gap-md);
5922
+ /* Position relative - flex handles alignment */
5923
+ position: relative;
5924
+ margin-inline-start: auto;
5925
+ /* Push to end (RTL-aware: end = right in LTR, left in RTL) */
5432
5926
  opacity: var(--opacity-muted);
5927
+ /* No padding - tight spacing */
5928
+ padding: 0;
5929
+ /* RTL-aware: padding on logical end only */
5930
+ padding-inline-end: var(--gap-md);
5931
+ padding-inline-start: 0;
5433
5932
  }
5434
5933
 
5435
5934
  .dndev-sheet-close:hover {
5436
5935
  opacity: 1;
5437
5936
  }
5438
5937
 
5439
- .dndev-sheet-footer {
5440
- flex-shrink: 0;
5441
- margin-top: var(--gap-md);
5938
+ /* ===========================
5939
+ ANIMATIONS (Motion Physics)
5940
+ =========================== */
5941
+
5942
+ /* Slide In/Out Keyframes - Context Aware */
5943
+
5944
+ @keyframes sheet-slide-in {
5945
+ from {
5946
+ opacity: 0;
5947
+ transform: var(--slide-enter-transform);
5948
+ }
5949
+
5950
+ to {
5951
+ opacity: 1;
5952
+ transform: translate(0, 0);
5953
+ }
5954
+ }
5955
+
5956
+ @keyframes sheet-slide-out {
5957
+ from {
5958
+ opacity: 1;
5959
+ transform: translate(0, 0);
5960
+ }
5961
+
5962
+ to {
5963
+ opacity: 0;
5964
+ transform: var(--slide-exit-transform);
5965
+ }
5966
+ }
5967
+
5968
+ /* Define Transforms based on Side */
5969
+
5970
+ .dndev-sheet-content[data-side='right'] {
5971
+ --slide-enter-transform: translateX(100%);
5972
+ --slide-exit-transform: translateX(100%);
5973
+ }
5974
+
5975
+ .dndev-sheet-content[data-side='left'] {
5976
+ --slide-enter-transform: translateX(-100%);
5977
+ --slide-exit-transform: translateX(-100%);
5978
+ }
5979
+
5980
+ .dndev-sheet-content[data-side='bottom'] {
5981
+ --slide-enter-transform: translateY(100%);
5982
+ --slide-exit-transform: translateY(100%);
5983
+ }
5984
+
5985
+ .dndev-sheet-content[data-side='top'] {
5986
+ --slide-enter-transform: translateY(-100%);
5987
+ --slide-exit-transform: translateY(-100%);
5442
5988
  }
5443
5989
 
5444
5990
  /* packages/components/src/atomic/Skeleton/Skeleton.css */
@@ -6094,6 +6640,61 @@ em {
6094
6640
  transform: translateX(calc(2.75rem - 1.25rem - 0.125rem));
6095
6641
  }
6096
6642
 
6643
+ /* Switch with labels container */
6644
+
6645
+ .dndev-switch-with-labels {
6646
+ display: inline-flex;
6647
+ align-items: center;
6648
+ gap: var(--gap-sm);
6649
+ flex-wrap: wrap;
6650
+ }
6651
+
6652
+ /* Labels - keep switch and its labels on one line when possible */
6653
+
6654
+ .dndev-switch-with-labels > .dndev-switch {
6655
+ flex-shrink: 0;
6656
+ }
6657
+
6658
+ .dndev-switch-label {
6659
+ font-size: var(--font-size-sm);
6660
+ transition:
6661
+ color var(--dur-normal) var(--ease-in-out),
6662
+ font-weight var(--dur-normal) var(--ease-in-out);
6663
+ white-space: nowrap;
6664
+ }
6665
+
6666
+ /* Unchecked label - active when switch is unchecked */
6667
+
6668
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6669
+ .dndev-switch-label-unchecked,
6670
+ .dndev-switch-with-labels[data-checked='false'] .dndev-switch-label-unchecked {
6671
+ color: var(--foreground);
6672
+ font-weight: var(--font-weight-medium);
6673
+ }
6674
+
6675
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6676
+ .dndev-switch-label-unchecked,
6677
+ .dndev-switch-with-labels[data-checked='true'] .dndev-switch-label-unchecked {
6678
+ color: var(--muted-foreground);
6679
+ font-weight: var(--font-weight-normal);
6680
+ }
6681
+
6682
+ /* Checked label - active when switch is checked */
6683
+
6684
+ .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6685
+ .dndev-switch-label-checked,
6686
+ .dndev-switch-with-labels[data-checked='true'] .dndev-switch-label-checked {
6687
+ color: var(--foreground);
6688
+ font-weight: var(--font-weight-medium);
6689
+ }
6690
+
6691
+ .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6692
+ .dndev-switch-label-checked,
6693
+ .dndev-switch-with-labels[data-checked='false'] .dndev-switch-label-checked {
6694
+ color: var(--muted-foreground);
6695
+ font-weight: var(--font-weight-normal);
6696
+ }
6697
+
6097
6698
  /* packages/components/src/atomic/Table/Table.css */
6098
6699
 
6099
6700
  .dndev-table-wrapper {
@@ -6130,6 +6731,12 @@ em {
6130
6731
  background-color: color-mix(in oklab, var(--accent) 15%, transparent);
6131
6732
  }
6132
6733
 
6734
+ /* Cursor pointer for clickable rows */
6735
+
6736
+ .dndev-table-row.dndev-cursor-pointer {
6737
+ cursor: pointer;
6738
+ }
6739
+
6133
6740
  /* Zebra striping for data tables */
6134
6741
 
6135
6742
  .dndev-table-body .dndev-table-row:nth-child(even) {
@@ -6159,7 +6766,7 @@ em {
6159
6766
  /* Table head (th) styles */
6160
6767
 
6161
6768
  .dndev-table-head {
6162
- text-align: left;
6769
+ text-align: start;
6163
6770
  vertical-align: middle;
6164
6771
  font-weight: 500;
6165
6772
  color: var(--muted-foreground);
@@ -6176,12 +6783,12 @@ em {
6176
6783
  text-align: center;
6177
6784
  }
6178
6785
 
6179
- .dndev-table-head[data-align='right'] {
6180
- text-align: right;
6786
+ .dndev-table-head[data-align='end'] {
6787
+ text-align: end;
6181
6788
  }
6182
6789
 
6183
- .dndev-table-head[data-align='left'] {
6184
- text-align: left;
6790
+ .dndev-table-head[data-align='start'] {
6791
+ text-align: start;
6185
6792
  }
6186
6793
 
6187
6794
  /* Table cell (td) styles */
@@ -6197,14 +6804,48 @@ em {
6197
6804
  text-align: center;
6198
6805
  }
6199
6806
 
6200
- .dndev-table-cell[data-align='right'] {
6201
- text-align: right;
6807
+ .dndev-table-cell[data-align='end'] {
6808
+ text-align: end;
6202
6809
  }
6203
6810
 
6204
- .dndev-table-cell[data-align='left'] {
6205
- text-align: left;
6811
+ .dndev-table-cell[data-align='start'] {
6812
+ text-align: start;
6206
6813
  }
6207
6814
 
6815
+ /* Excel-like grid lines variant */
6816
+
6817
+ .dndev-table-grid .dndev-table-head,
6818
+ .dndev-table-grid .dndev-table-cell {
6819
+ border: 1px solid var(--border);
6820
+ padding: 0;
6821
+ }
6822
+
6823
+ .dndev-table-grid .dndev-table-row {
6824
+ border-bottom: 1px solid var(--border);
6825
+ }
6826
+
6827
+ .dndev-table-grid .dndev-table-row:last-child {
6828
+ border-bottom: 1px solid var(--border);
6829
+ }
6830
+
6831
+ /* Input components inside grid cells should be borderless and fit snugly */
6832
+
6833
+ .dndev-table-grid .dndev-table-cell .dndev-input,
6834
+ .dndev-table-grid .dndev-table-cell input[type='text'],
6835
+ .dndev-table-grid .dndev-table-cell input[type='number'] {
6836
+ border: none;
6837
+ background: transparent;
6838
+ width: 100%;
6839
+ height: 100%;
6840
+ box-shadow: none;
6841
+ }
6842
+
6843
+ .dndev-table-grid .dndev-table-cell .dndev-input:focus,
6844
+ .dndev-table-grid .dndev-table-cell input:focus {
6845
+ outline: 2px solid var(--primary);
6846
+ outline-offset: -2px;
6847
+ }
6848
+
6208
6849
  /* Table caption styles */
6209
6850
 
6210
6851
  .dndev-table-caption {
@@ -6221,7 +6862,7 @@ em {
6221
6862
 
6222
6863
  .dndev-table-search-icon {
6223
6864
  position: absolute;
6224
- left: var(--gap-md);
6865
+ inset-inline-start: var(--gap-md);
6225
6866
  top: 50%;
6226
6867
  transform: translateY(-50%);
6227
6868
  width: var(--icon-md);
@@ -6388,7 +7029,7 @@ em {
6388
7029
  .dndev-tag {
6389
7030
  display: inline-flex;
6390
7031
  align-items: center;
6391
- gap: var(--gap-xs);
7032
+ gap: var(--gap-sm);
6392
7033
  border-radius: var(--radius-full);
6393
7034
  border: 1px solid transparent;
6394
7035
  font-size: var(--font-size-sm);
@@ -6518,8 +7159,18 @@ em {
6518
7159
  font-weight: var(--font-weight-medium);
6519
7160
  line-height: var(--line-height);
6520
7161
  background-color: transparent; /* Text never has background, only color changes */
7162
+
7163
+ /* Respect semantic HTML elements */
6521
7164
  }
6522
7165
 
7166
+ .dndev-text-base:is(strong) {
7167
+ font-weight: var(--font-weight-semibold);
7168
+ }
7169
+
7170
+ .dndev-text-base:is(em) {
7171
+ font-style: italic;
7172
+ }
7173
+
6523
7174
  .dndev-text-base[data-variant='default'] {
6524
7175
  color: inherit;
6525
7176
  }
@@ -7467,7 +8118,7 @@ em {
7467
8118
  align-items: stretch;
7468
8119
  }
7469
8120
 
7470
- @media (width <= 699px) {
8121
+ @media (width <=699px) {
7471
8122
 
7472
8123
  [data-cols='2'] {
7473
8124
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7479,14 +8130,14 @@ em {
7479
8130
  align-items: stretch;
7480
8131
  }
7481
8132
 
7482
- @media (width <= 1049px) {
8133
+ @media (width <=1049px) {
7483
8134
 
7484
8135
  [data-cols='3'] {
7485
8136
  grid-template-columns: repeat(2, minmax(350px, 1fr));
7486
8137
  }
7487
8138
  }
7488
8139
 
7489
- @media (width <= 699px) {
8140
+ @media (width <=699px) {
7490
8141
 
7491
8142
  [data-cols='3'] {
7492
8143
  grid-template-columns: repeat(1, minmax(350px, 1fr));
@@ -7500,21 +8151,21 @@ em {
7500
8151
  /* Responsive: reduce columns when container is narrow */
7501
8152
  }
7502
8153
 
7503
- @media (width <= 1399px) {
8154
+ @media (width <=1399px) {
7504
8155
 
7505
8156
  [data-cols='4'] {
7506
8157
  grid-template-columns: repeat(3, minmax(0, 1fr));
7507
8158
  }
7508
8159
  }
7509
8160
 
7510
- @media (width <= 1049px) {
8161
+ @media (width <=1049px) {
7511
8162
 
7512
8163
  [data-cols='4'] {
7513
8164
  grid-template-columns: repeat(2, minmax(0, 1fr));
7514
8165
  }
7515
8166
  }
7516
8167
 
7517
- @media (width <= 699px) {
8168
+ @media (width <=699px) {
7518
8169
 
7519
8170
  [data-cols='4'] {
7520
8171
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -7581,18 +8232,22 @@ em {
7581
8232
 
7582
8233
  code {
7583
8234
  font-family: var(--font-mono);
7584
- font-size: inherit; /* Inherit parent size */
7585
- font-weight: inherit; /* Inherit parent weight */
8235
+ font-size: inherit;
8236
+ /* Inherit parent size */
8237
+ font-weight: inherit;
8238
+ /* Inherit parent weight */
7586
8239
  line-height: inherit;
7587
8240
  color: inherit;
7588
- background: transparent; /* No background by default */
8241
+ background: transparent;
8242
+ /* No background by default */
7589
8243
  }
7590
8244
 
7591
8245
  /* Code variant - visual styling (background, padding, can apply to any element) */
7592
8246
 
7593
8247
  [data-variant='code'] {
7594
8248
  font-family: var(--font-mono);
7595
- font-size: var(--font-size-sm); /* Default small size */
8249
+ font-size: var(--font-size-sm);
8250
+ /* Default small size */
7596
8251
  background: var(--muted);
7597
8252
  color: var(--muted-foreground);
7598
8253
  padding: var(--gap-sm) var(--gap-md);
@@ -7687,7 +8342,8 @@ h4[data-variant='code'] {
7687
8342
 
7688
8343
  .dndev-relative {
7689
8344
  position: relative;
7690
- min-width: 0; /* Allow flex items to shrink below content size */
8345
+ min-width: 0;
8346
+ /* Allow flex items to shrink below content size */
7691
8347
  }
7692
8348
 
7693
8349
  .dndev-absolute {
@@ -7779,6 +8435,10 @@ h4[data-variant='code'] {
7779
8435
  pointer-events: auto;
7780
8436
  }
7781
8437
 
8438
+ .dndev-cursor-pointer {
8439
+ cursor: pointer;
8440
+ }
8441
+
7782
8442
  .dndev-aspect-video {
7783
8443
  aspect-ratio: 16 / 9;
7784
8444
  }
@@ -7792,7 +8452,7 @@ h4[data-variant='code'] {
7792
8452
  RESPONSIVE DISPLAY
7793
8453
  =========================== */
7794
8454
 
7795
- @media (width >= 768px) {
8455
+ @media (width >=768px) {
7796
8456
  .dndev-md\:block {
7797
8457
  display: block;
7798
8458
  }
@@ -7818,7 +8478,7 @@ h4[data-variant='code'] {
7818
8478
  }
7819
8479
  }
7820
8480
 
7821
- @media (width >= 1024px) {
8481
+ @media (width >=1024px) {
7822
8482
  .dndev-lg\:block {
7823
8483
  display: block;
7824
8484
  }
@@ -7878,6 +8538,10 @@ h4[data-variant='code'] {
7878
8538
  Components are unaffected - they own their own spacing
7879
8539
  =========================== */
7880
8540
 
8541
+ .prose {
8542
+ text-align: start;
8543
+ }
8544
+
7881
8545
  .prose h1,.prose h2,.prose h3,.prose h4,.prose h5,.prose h6 {
7882
8546
  margin-block: var(--gap-md);
7883
8547
  }
@@ -8341,10 +9005,7 @@ main[role='main'][data-routing-animation='none'] {
8341
9005
  max-height: 100dvh;
8342
9006
  overflow: hidden;
8343
9007
  display: grid;
8344
- /* ONE DRY grid structure: 3 rows, 2 columns */
8345
- /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
8346
- /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
8347
- implement ResizeObserver to update --footer-height dynamically. */
9008
+ /* Grid structure: 3 rows, 2 columns */
8348
9009
  grid-template-areas:
8349
9010
  'header header'
8350
9011
  'sidebar main'
@@ -8355,16 +9016,62 @@ main[role='main'][data-routing-animation='none'] {
8355
9016
  );
8356
9017
  grid-template-columns: var(--sidebar-width) 1fr;
8357
9018
 
8358
- /* Game layout: Grid rows adjust based on breakpoint (footer hidden on tablet/mobile) */
9019
+ /* Mobile: No footer grid row - footer is inside main */
9020
+ /* When mergedBar is shown, header is hidden but grid still needs space for mergedBar */
8359
9021
  }
8360
9022
 
8361
- [data-layout='game']:root .dndev-layout {
8362
- grid-template-rows: var(--header-height) 1fr minmax(
8363
- var(--footer-height),
8364
- auto
8365
- );
9023
+ @media (width <= 1023px) {
9024
+
9025
+ .dndev-layout {
9026
+ grid-template-areas:
9027
+ 'header header'
9028
+ 'sidebar main';
9029
+ grid-template-rows: var(--header-height) 1fr;
9030
+
9031
+ /* Presets with mergedBar: header is hidden, but grid still allocates space for mergedBar */
9032
+ /* No extra padding needed - grid spacing is sufficient */
9033
+ }
9034
+ .dndev-layout[data-layout='admin'],.dndev-layout[data-layout='moolti'],.dndev-layout[data-layout='game'],.dndev-layout[data-layout='docs'] {
9035
+ /* Grid already accounts for header-height, mergedBar is fixed and doesn't need extra padding */
9036
+ }
9037
+ }
9038
+
9039
+ /* Footer containers: show/hide based on breakpoint */
9040
+
9041
+ .footer-mobile {
9042
+ display: none;
9043
+ /* No margin-top: auto - footer scrolls with content on mobile */
9044
+ /* No flex-shrink: 0 - footer is in normal flow, not stuck at bottom */
9045
+ }
9046
+
9047
+ .footer-desktop {
9048
+ display: contents; /* Children (footer element) participate in grid */
9049
+ }
9050
+
9051
+ @media (width <= 1023px) {
9052
+ .footer-mobile {
9053
+ display: block;
9054
+ }
9055
+
9056
+ .footer-desktop {
9057
+ display: none;
8366
9058
  }
8367
9059
 
9060
+ /* Game: No mobile footer - navigation in MergedBar */
9061
+ [data-layout='game'] .footer-mobile {
9062
+ display: none;
9063
+ }
9064
+ }
9065
+
9066
+ /* Presets with no footer at all */
9067
+
9068
+ [data-layout='moolti'] .footer-mobile,
9069
+ [data-layout='moolti'] .footer-desktop,
9070
+ [data-layout='plain'] .footer-mobile,
9071
+ [data-layout='plain'] .footer-desktop {
9072
+ display: none;
9073
+ }
9074
+
8368
9075
  /* ===========================
8369
9076
  LAYOUT ZONE POSITIONING RULES
8370
9077
  Follows logical flow: Header → Sidebar → Main → Footer
@@ -8378,6 +9085,8 @@ header[role='banner'] {
8378
9085
  grid-area: header;
8379
9086
  box-sizing: border-box;
8380
9087
  height: var(--header-height);
9088
+ min-height: var(--header-height);
9089
+ max-height: var(--header-height);
8381
9090
  position: relative;
8382
9091
  z-index: var(--z-header);
8383
9092
  contain: layout style;
@@ -8404,7 +9113,9 @@ header[role='banner'] {
8404
9113
  align-items: center;
8405
9114
  flex-shrink: 0;
8406
9115
  height: 100%;
9116
+ max-height: 100%;
8407
9117
  gap: var(--gap-sm);
9118
+ overflow: hidden;
8408
9119
  }
8409
9120
 
8410
9121
  .header-end {
@@ -8412,8 +9123,11 @@ header[role='banner'] {
8412
9123
  align-items: center;
8413
9124
  justify-content: flex-end;
8414
9125
  flex-shrink: 0;
9126
+ height: 100%;
9127
+ max-height: 100%;
8415
9128
  margin-inline-start: auto;
8416
9129
  gap: var(--gap-sm);
9130
+ overflow: hidden;
8417
9131
  }
8418
9132
 
8419
9133
  /* Viewport-centered center content - absolutely positioned overlay */
@@ -8705,11 +9419,17 @@ main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'
8705
9419
  /* Page content grows */
8706
9420
  }
8707
9421
 
8708
- main[role='main'] > *:last-child {
8709
- flex-shrink: 0;
8710
- /* Footer stays at bottom */
9422
+ /* Desktop: Footer stays at bottom of viewport */
9423
+
9424
+ @media (width > 1023px) {
9425
+ main[role='main'] > *:last-child {
9426
+ flex-shrink: 0;
9427
+ /* Footer stays at bottom */
9428
+ }
8711
9429
  }
8712
9430
 
9431
+ /* Mobile: Footer scrolls with content (no flex-shrink needed) */
9432
+
8713
9433
  /* Footer: Full width by default, app presets start after sidebar */
8714
9434
 
8715
9435
  /* box-sizing: border-box ensures borders are included in height */
@@ -8742,26 +9462,6 @@ footer[role='contentinfo'] > * {
8742
9462
  padding-inline-end: var(--content-padding);
8743
9463
  }
8744
9464
 
8745
- /* Game: Hide footer on tablet/mobile - merged into GameMergedBar */
8746
-
8747
- @media (width <= 1023px) {
8748
- [data-layout='game']:root footer[role='contentinfo'] {
8749
- display: none;
8750
- }
8751
- }
8752
-
8753
- /* Moolti: No footer (built into sidebar) */
8754
-
8755
- [data-layout='moolti']:root footer[role='contentinfo'] {
8756
- display: none;
8757
- }
8758
-
8759
- /* Plain: No footer (full-screen apps) */
8760
-
8761
- [data-layout='plain']:root footer[role='contentinfo'] {
8762
- display: none;
8763
- }
8764
-
8765
9465
  /* Footer text styles */
8766
9466
 
8767
9467
  footer[role='contentinfo'] .footer-copyright {
@@ -8806,7 +9506,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8806
9506
 
8807
9507
  .merged-bar[data-position='top'] {
8808
9508
  top: 0;
8809
- height: 64px;
9509
+ height: var(--header-height);
8810
9510
  border-bottom: 2px solid var(--border);
8811
9511
  padding-top: env(safe-area-inset-top);
8812
9512
  }
@@ -8834,7 +9534,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8834
9534
  min-height: 0;
8835
9535
  }
8836
9536
 
8837
- /* Mobile (<1024px): Show merged-bar, hide zones, add padding */
9537
+ /* Mobile (<1024px): Show merged-bar, hide zones */
8838
9538
 
8839
9539
  @media (width <= 1023px) {
8840
9540
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
@@ -8849,7 +9549,8 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
8849
9549
  [data-layout='moolti'] .dndev-layout,
8850
9550
  [data-layout='game'] .dndev-layout,
8851
9551
  [data-layout='docs'] .dndev-layout {
8852
- padding-top: calc(64px + env(safe-area-inset-top));
9552
+ /* Remove padding-top - grid already accounts for header-height, mergedBar is fixed and doesn't affect grid flow */
9553
+ /* Content won't go under mergedBar because grid positions main after header row */
8853
9554
  }
8854
9555
 
8855
9556
  [data-layout='admin'] header[role='banner'],
@@ -9081,7 +9782,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9081
9782
  .breadcrumb-item {
9082
9783
  display: inline-flex;
9083
9784
  align-items: center;
9084
- gap: var(--gap-xs);
9785
+ gap: var(--gap-sm);
9085
9786
  }
9086
9787
 
9087
9788
  .breadcrumbs .separator,
@@ -9158,7 +9859,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9158
9859
  min-height: 0;
9159
9860
  display: flex;
9160
9861
  flex-direction: column;
9161
- justify-content: space-between;
9862
+ justify-content: flex-start;
9162
9863
  gap: var(--gap-lg);
9163
9864
  /* Controlled by density system */
9164
9865
  /* Default: centered */
@@ -9445,7 +10146,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9445
10146
  font-family: Roboto;
9446
10147
  font-style: normal;
9447
10148
  font-weight: 400;
9448
- font-display: optional;
10149
+ font-display: swap;
9449
10150
  src: url('/fonts/Roboto-400-latin.woff2') format('woff2');
9450
10151
  unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
9451
10152
  }
@@ -9454,7 +10155,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9454
10155
  font-family: Roboto;
9455
10156
  font-style: normal;
9456
10157
  font-weight: 700;
9457
- font-display: optional;
10158
+ font-display: swap;
9458
10159
  src: url('/fonts/Roboto-700-latin.woff2') format('woff2');
9459
10160
  unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
9460
10161
  }
@@ -9602,7 +10303,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9602
10303
  font-family: Inter;
9603
10304
  font-style: normal;
9604
10305
  font-weight: 400 700;
9605
- font-display: optional;
10306
+ font-display: swap; /* Changed from optional to swap - we preload this font */
9606
10307
  src: url('/fonts/Inter-latin.woff2') format('woff2');
9607
10308
  unicode-range:
9608
10309
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
@@ -9635,7 +10336,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9635
10336
  font-family: 'Playfair Display';
9636
10337
  font-style: normal;
9637
10338
  font-weight: 400 700;
9638
- font-display: optional;
10339
+ font-display: swap;
9639
10340
  src: url('/fonts/PlayfairDisplay-latin.woff2') format('woff2');
9640
10341
  unicode-range:
9641
10342
  U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,