@donotdev/ui 0.0.8 → 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 (177) hide show
  1. package/dist/components/auth/AuthHeader.d.ts +1 -1
  2. package/dist/components/auth/AuthHeader.d.ts.map +1 -1
  3. package/dist/components/auth/AuthMenu.d.ts +2 -1
  4. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  5. package/dist/components/auth/AuthMenu.js +1 -1
  6. package/dist/components/common/AppLoading.d.ts +1 -1
  7. package/dist/components/common/AppLoading.d.ts.map +1 -1
  8. package/dist/components/common/AppLoading.js +0 -1
  9. package/dist/components/common/Loader.d.ts +4 -4
  10. package/dist/components/common/Loader.d.ts.map +1 -1
  11. package/dist/components/common/Loader.js +11 -12
  12. package/dist/components/common/LoadingMessage.d.ts +1 -9
  13. package/dist/components/common/LoadingMessage.d.ts.map +1 -1
  14. package/dist/components/common/LoadingMessage.js +0 -1
  15. package/dist/components/common/LoadingScreen.d.ts +1 -9
  16. package/dist/components/common/LoadingScreen.d.ts.map +1 -1
  17. package/dist/components/common/LoadingScreen.js +0 -1
  18. package/dist/components/common/RedirectOverlay.js +1 -1
  19. package/dist/components/common/TechBento.d.ts.map +1 -1
  20. package/dist/components/common/TechBento.js +1 -0
  21. package/dist/components/layout/components/FloatingLanguageSwitcher.d.ts +1 -9
  22. package/dist/components/layout/components/FloatingLanguageSwitcher.d.ts.map +1 -1
  23. package/dist/components/layout/components/FloatingLanguageSwitcher.js +0 -1
  24. package/dist/components/layout/components/header/CacheSettings.d.ts.map +1 -1
  25. package/dist/components/layout/components/header/HeaderMenu.d.ts.map +1 -1
  26. package/dist/components/layout/components/header/SettingsMenu.d.ts.map +1 -1
  27. package/dist/components/layout/components/header/SettingsMenu.js +0 -1
  28. package/dist/components/layout/components/header/ThemeToggle.d.ts +1 -1
  29. package/dist/components/layout/components/header/ThemeToggle.d.ts.map +1 -1
  30. package/dist/components/layout/components/header/ThemeToggle.js +5 -4
  31. package/dist/crud/components/DisplayFieldRenderer.d.ts +3 -11
  32. package/dist/crud/components/DisplayFieldRenderer.d.ts.map +1 -1
  33. package/dist/crud/components/DisplayFieldRenderer.js +3 -2
  34. package/dist/crud/components/EntityDisplayRenderer.d.ts +2 -2
  35. package/dist/crud/components/fields/display/AvatarFieldDisplay.d.ts +2 -2
  36. package/dist/crud/components/fields/display/BadgeFieldDisplay.d.ts +2 -2
  37. package/dist/crud/components/fields/display/ButtonFieldDisplay.d.ts +2 -2
  38. package/dist/crud/components/fields/display/CheckboxFieldDisplay.d.ts +2 -2
  39. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts +3 -11
  40. package/dist/crud/components/fields/display/DateFieldDisplay.d.ts.map +1 -1
  41. package/dist/crud/components/fields/display/DateFieldDisplay.js +0 -1
  42. package/dist/crud/components/fields/display/DropdownDisplay.d.ts +2 -2
  43. package/dist/crud/components/fields/display/FileFieldDisplay.d.ts +2 -2
  44. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts +3 -11
  45. package/dist/crud/components/fields/display/GeoPointFieldDisplay.d.ts.map +1 -1
  46. package/dist/crud/components/fields/display/GeoPointFieldDisplay.js +0 -1
  47. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts +3 -3
  48. package/dist/crud/components/fields/display/HiddenFieldDisplay.d.ts.map +1 -1
  49. package/dist/crud/components/fields/display/HiddenFieldDisplay.js +0 -9
  50. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts +3 -11
  51. package/dist/crud/components/fields/display/ImageFieldDisplay.d.ts.map +1 -1
  52. package/dist/crud/components/fields/display/ImageFieldDisplay.js +0 -1
  53. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts +3 -11
  54. package/dist/crud/components/fields/display/LinkFieldDisplay.d.ts.map +1 -1
  55. package/dist/crud/components/fields/display/LinkFieldDisplay.js +0 -1
  56. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts +3 -11
  57. package/dist/crud/components/fields/display/MapFieldDisplay.d.ts.map +1 -1
  58. package/dist/crud/components/fields/display/MapFieldDisplay.js +0 -1
  59. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts +3 -11
  60. package/dist/crud/components/fields/display/MultiDropdownDisplay.d.ts.map +1 -1
  61. package/dist/crud/components/fields/display/MultiDropdownDisplay.js +0 -1
  62. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts +3 -11
  63. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.d.ts.map +1 -1
  64. package/dist/crud/components/fields/display/MultiInputTextFieldDisplay.js +0 -1
  65. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts +3 -11
  66. package/dist/crud/components/fields/display/NumberFieldDisplay.d.ts.map +1 -1
  67. package/dist/crud/components/fields/display/NumberFieldDisplay.js +0 -1
  68. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts +3 -3
  69. package/dist/crud/components/fields/display/PasswordFieldDisplay.d.ts.map +1 -1
  70. package/dist/crud/components/fields/display/PasswordFieldDisplay.js +0 -1
  71. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts +3 -11
  72. package/dist/crud/components/fields/display/PhoneNumberDisplay.d.ts.map +1 -1
  73. package/dist/crud/components/fields/display/PhoneNumberDisplay.js +0 -1
  74. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts +3 -11
  75. package/dist/crud/components/fields/display/RadioFieldDisplay.d.ts.map +1 -1
  76. package/dist/crud/components/fields/display/RadioFieldDisplay.js +0 -1
  77. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts +3 -11
  78. package/dist/crud/components/fields/display/RangeFieldDisplay.d.ts.map +1 -1
  79. package/dist/crud/components/fields/display/RangeFieldDisplay.js +0 -1
  80. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts +3 -11
  81. package/dist/crud/components/fields/display/ReferenceFieldDisplay.d.ts.map +1 -1
  82. package/dist/crud/components/fields/display/ReferenceFieldDisplay.js +0 -1
  83. package/dist/crud/components/fields/display/RichTextDisplay.d.ts +25 -0
  84. package/dist/crud/components/fields/display/RichTextDisplay.d.ts.map +1 -0
  85. package/dist/crud/components/fields/display/RichTextDisplay.js +104 -0
  86. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts +3 -11
  87. package/dist/crud/components/fields/display/TextAreaDisplay.d.ts.map +1 -1
  88. package/dist/crud/components/fields/display/TextAreaDisplay.js +0 -1
  89. package/dist/crud/components/fields/display/TextFieldDisplay.d.ts +2 -2
  90. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts +3 -11
  91. package/dist/crud/components/fields/display/TimestampFieldDisplay.d.ts.map +1 -1
  92. package/dist/crud/components/fields/display/TimestampFieldDisplay.js +0 -1
  93. package/dist/crud/components/fields/display/index.d.ts +1 -0
  94. package/dist/crud/components/fields/display/index.d.ts.map +1 -1
  95. package/dist/crud/components/fields/display/index.js +1 -0
  96. package/dist/dndev.css +401 -84
  97. package/dist/index.js +64 -4
  98. package/dist/internal/common/ErrorFallback.d.ts +1 -10
  99. package/dist/internal/common/ErrorFallback.d.ts.map +1 -1
  100. package/dist/internal/common/GlobalErrorFallback.d.ts +1 -9
  101. package/dist/internal/common/GlobalErrorFallback.d.ts.map +1 -1
  102. package/dist/internal/common/RouteErrorFallback.js +1 -1
  103. package/dist/internal/devtools/components/DebugDialog.d.ts.map +1 -1
  104. package/dist/internal/devtools/components/DebugDialog.js +3 -1
  105. package/dist/internal/devtools/components/MaskedValue.d.ts.map +1 -1
  106. package/dist/internal/devtools/components/MaskedValue.js +1 -1
  107. package/dist/internal/devtools/components/StoresTab.js +1 -1
  108. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  109. package/dist/internal/initializers/BaseStoresInitializer.js +1 -2
  110. package/dist/internal/initializers/NextJsStoresInitializer.d.ts.map +1 -1
  111. package/dist/internal/layout/DnDevLayout.d.ts.map +1 -1
  112. package/dist/internal/layout/DnDevLayout.js +4 -5
  113. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  114. package/dist/internal/layout/components/footer/FooterLegalLinks.js +2 -2
  115. package/dist/internal/layout/config/defaults.d.ts +0 -10
  116. package/dist/internal/layout/config/defaults.d.ts.map +1 -1
  117. package/dist/internal/layout/config/defaults.js +12 -1
  118. package/dist/internal/layout/config/presets/admin.d.ts.map +1 -1
  119. package/dist/internal/layout/config/presets/admin.js +7 -2
  120. package/dist/internal/layout/config/presets/blog.d.ts.map +1 -1
  121. package/dist/internal/layout/config/presets/blog.js +7 -1
  122. package/dist/internal/layout/config/presets/docs.d.ts.map +1 -1
  123. package/dist/internal/layout/config/presets/docs.js +7 -5
  124. package/dist/internal/layout/config/presets/game.d.ts.map +1 -1
  125. package/dist/internal/layout/config/presets/game.js +7 -2
  126. package/dist/internal/layout/config/presets/moolti.d.ts.map +1 -1
  127. package/dist/internal/layout/config/presets/moolti.js +10 -3
  128. package/dist/internal/layout/zones/DnDevFooter.d.ts +1 -13
  129. package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
  130. package/dist/internal/layout/zones/DnDevHeader.d.ts +1 -14
  131. package/dist/internal/layout/zones/DnDevHeader.d.ts.map +1 -1
  132. package/dist/internal/layout/zones/DnDevMergedBar.d.ts +2 -14
  133. package/dist/internal/layout/zones/DnDevMergedBar.d.ts.map +1 -1
  134. package/dist/internal/layout/zones/DnDevMergedBar.js +11 -3
  135. package/dist/internal/layout/zones/DnDevSidebar.d.ts +1 -14
  136. package/dist/internal/layout/zones/DnDevSidebar.d.ts.map +1 -1
  137. package/dist/routing/AuthGuard.d.ts.map +1 -1
  138. package/dist/routing/GoTo.d.ts +3 -1
  139. package/dist/routing/GoTo.d.ts.map +1 -1
  140. package/dist/routing/GoTo.js +6 -2
  141. package/dist/routing/GoToDialog.d.ts +1 -1
  142. package/dist/routing/GoToDialog.d.ts.map +1 -1
  143. package/dist/routing/GoToDialog.js +3 -5
  144. package/dist/routing/NavigationItem.d.ts +1 -1
  145. package/dist/routing/NavigationItem.d.ts.map +1 -1
  146. package/dist/routing/NavigationItem.js +0 -1
  147. package/dist/routing/hooks/hooks.next.js +1 -1
  148. package/dist/routing/hooks/hooks.vite.js +1 -1
  149. package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
  150. package/dist/routing/hooks/useNavigate.next.js +1 -1
  151. package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
  152. package/dist/routing/useGoTo.d.ts.map +1 -1
  153. package/dist/styles/index.css +401 -84
  154. package/dist/utils/assetResolver.d.ts +1 -1
  155. package/dist/utils/assetResolver.d.ts.map +1 -1
  156. package/dist/utils/assetResolver.js +1 -2
  157. package/dist/utils/index.d.ts +0 -1
  158. package/dist/utils/index.d.ts.map +1 -1
  159. package/dist/utils/index.js +0 -1
  160. package/dist/utils/tList.d.ts +1 -1
  161. package/dist/utils/tList.d.ts.map +1 -1
  162. package/dist/utils/useAuthSafe.d.ts +0 -33
  163. package/dist/utils/useAuthSafe.d.ts.map +1 -1
  164. package/dist/utils/useAuthSafe.js +34 -1
  165. package/dist/utils/useCrudSafe.d.ts +12 -6
  166. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  167. package/dist/utils/useCrudSafe.js +9 -6
  168. package/dist/utils/useOAuthSafe.d.ts.map +1 -1
  169. package/dist/utils/useStripeBillingSafe.d.ts +1 -34
  170. package/dist/utils/useStripeBillingSafe.d.ts.map +1 -1
  171. package/dist/utils/useStripeBillingSafe.js +34 -1
  172. package/dist/vite-routing/AppRoutes.d.ts +1 -1
  173. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  174. package/dist/vite-routing/AppRoutes.js +0 -1
  175. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  176. package/dist/vite-routing/RootLayout.js +3 -6
  177. package/package.json +1 -1
@@ -2724,6 +2724,34 @@ em {
2724
2724
 
2725
2725
  /* Label styling moved to patterns.css (.dndev-interactive-label) */
2726
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
+
2727
2755
  /* packages/components/src/atomic/Calendar/Calendar.css */
2728
2756
 
2729
2757
  /**
@@ -4612,49 +4640,81 @@ em {
4612
4640
  margin-inline-start: var(--gap-sm);
4613
4641
  }
4614
4642
 
4615
- /* Floating Label - positioned absolutely at top of input fields */
4643
+ /* Floating Fieldset - native border-cutting via legend */
4616
4644
 
4617
- .dndev-floating-label {
4618
- position: absolute;
4619
- inset-inline-start: var(--gap-md);
4620
- top: calc(-1 * var(--font-size-xs) / 2 - 1px);
4621
- font-size: var(--font-size-xs);
4622
- font-weight: 500;
4623
- pointer-events: none;
4624
- z-index: 1;
4625
- background-color: var(--background);
4626
- padding: 0 var(--gap-sm);
4627
- line-height: 1;
4628
- color: var(--foreground);
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;
4629
4654
  }
4630
4655
 
4631
- /* Inherit background when inside floating containers (dropdowns, menus, popovers) */
4656
+ .dndev-floating-fieldset:hover {
4657
+ border-color: var(--ring);
4658
+ }
4632
4659
 
4633
- .dndev-floating .dndev-floating-label,
4634
- .dndev-menu-content .dndev-floating-label,
4635
- [class*='dndev-dropdown'] .dndev-floating-label,
4636
- [class*='dndev-navigation'] .dndev-floating-label {
4637
- background-color: var(--popover);
4638
- color: var(--popover-foreground);
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;
4639
4668
  }
4640
4669
 
4641
- /* When floating container has blank glow, use solid popover background */
4670
+ /* Legend sits on border - browser natively cuts border */
4642
4671
 
4643
- .dndev-floating[data-glow='blank'] .dndev-floating-label {
4644
- background-color: var(--popover);
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);
4645
4686
  }
4646
4687
 
4647
- .dndev-floating-label[data-disabled='true'] {
4688
+ .dndev-floating-fieldset[data-disabled='true'] .dndev-floating-legend {
4648
4689
  color: var(--muted-foreground);
4649
4690
  }
4650
4691
 
4651
- .dndev-floating-label[data-truncate='true'] {
4692
+ .dndev-floating-legend[data-truncate='true'] {
4652
4693
  max-width: calc(100% - var(--gap-md) * 2);
4653
4694
  overflow: hidden;
4654
4695
  text-overflow: ellipsis;
4655
4696
  white-space: nowrap;
4656
4697
  }
4657
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
+
4658
4718
  /* packages/components/src/atomic/List/List.css */
4659
4719
 
4660
4720
  .dndev-list {
@@ -5642,50 +5702,210 @@ em {
5642
5702
  display: flex;
5643
5703
  flex-direction: column;
5644
5704
  z-index: var(--z-modal);
5645
- 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;
5646
5715
 
5647
- /* Sheet positioning by side */
5716
+ /* Open state animation - "Heavy" ease for premium feel */
5648
5717
  }
5649
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
+
5650
5733
  .dndev-sheet-content[data-side='right'],.dndev-sheet-content[data-side='left'] {
5651
5734
  top: 0;
5652
5735
  bottom: 0;
5653
5736
  width: 80%;
5654
5737
  max-width: 56rem;
5738
+ /* Standard panel width */
5739
+ height: 100%;
5740
+ /* Full height */
5741
+ border-radius: 0;
5742
+ /* Square edges for panel metaphor */
5655
5743
  }
5656
5744
 
5657
5745
  .dndev-sheet-content[data-side='right'] {
5746
+ /* Physical positioning: right edge */
5658
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);
5659
5751
  }
5660
5752
 
5661
5753
  .dndev-sheet-content[data-side='left'] {
5754
+ /* Physical positioning: left edge */
5662
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);
5663
5759
  }
5664
5760
 
5761
+ /* TOP / BOTTOM (Mobile Cards) */
5762
+
5665
5763
  .dndev-sheet-content[data-side='top'],.dndev-sheet-content[data-side='bottom'] {
5666
5764
  left: 0;
5667
5765
  right: 0;
5668
- height: 80%;
5669
- max-height: 56rem;
5670
- 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 */
5671
5775
  }
5672
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
+
5673
5787
  .dndev-sheet-content[data-side='top'] {
5674
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);
5675
5793
  }
5676
5794
 
5677
5795
  .dndev-sheet-content[data-side='bottom'] {
5678
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);
5679
5801
  }
5680
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;
5818
+ }
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
+
5681
5838
  .dndev-sheet-header {
5682
5839
  display: flex;
5683
5840
  align-items: center;
5684
5841
  justify-content: space-between;
5685
5842
  gap: var(--gap-md);
5686
5843
  flex-shrink: 0;
5844
+ /* Never shrink */
5687
5845
  min-height: var(--touch-target);
5688
- 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));
5689
5909
  }
5690
5910
 
5691
5911
  .dndev-sheet-title {
@@ -5695,19 +5915,72 @@ em {
5695
5915
  }
5696
5916
 
5697
5917
  .dndev-sheet-close {
5698
- position: absolute;
5699
- top: var(--gap-md);
5700
- 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) */
5701
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;
5702
5928
  }
5703
5929
 
5704
5930
  .dndev-sheet-close:hover {
5705
5931
  opacity: 1;
5706
5932
  }
5707
5933
 
5708
- .dndev-sheet-footer {
5709
- flex-shrink: 0;
5710
- 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%);
5711
5984
  }
5712
5985
 
5713
5986
  /* packages/components/src/atomic/Skeleton/Skeleton.css */
@@ -6380,7 +6653,8 @@ em {
6380
6653
 
6381
6654
  .dndev-switch-label {
6382
6655
  font-size: var(--font-size-sm);
6383
- transition: color var(--dur-normal) var(--ease-in-out),
6656
+ transition:
6657
+ color var(--dur-normal) var(--ease-in-out),
6384
6658
  font-weight var(--dur-normal) var(--ease-in-out);
6385
6659
  white-space: nowrap;
6386
6660
  }
@@ -6389,16 +6663,14 @@ em {
6389
6663
 
6390
6664
  .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6391
6665
  .dndev-switch-label-unchecked,
6392
- .dndev-switch-with-labels[data-checked='false']
6393
- .dndev-switch-label-unchecked {
6666
+ .dndev-switch-with-labels[data-checked='false'] .dndev-switch-label-unchecked {
6394
6667
  color: var(--foreground);
6395
6668
  font-weight: var(--font-weight-medium);
6396
6669
  }
6397
6670
 
6398
6671
  .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6399
6672
  .dndev-switch-label-unchecked,
6400
- .dndev-switch-with-labels[data-checked='true']
6401
- .dndev-switch-label-unchecked {
6673
+ .dndev-switch-with-labels[data-checked='true'] .dndev-switch-label-unchecked {
6402
6674
  color: var(--muted-foreground);
6403
6675
  font-weight: var(--font-weight-normal);
6404
6676
  }
@@ -6407,16 +6679,14 @@ em {
6407
6679
 
6408
6680
  .dndev-switch-with-labels:has(.dndev-switch[data-state='checked'])
6409
6681
  .dndev-switch-label-checked,
6410
- .dndev-switch-with-labels[data-checked='true']
6411
- .dndev-switch-label-checked {
6682
+ .dndev-switch-with-labels[data-checked='true'] .dndev-switch-label-checked {
6412
6683
  color: var(--foreground);
6413
6684
  font-weight: var(--font-weight-medium);
6414
6685
  }
6415
6686
 
6416
6687
  .dndev-switch-with-labels:not(:has(.dndev-switch[data-state='checked']))
6417
6688
  .dndev-switch-label-checked,
6418
- .dndev-switch-with-labels[data-checked='false']
6419
- .dndev-switch-label-checked {
6689
+ .dndev-switch-with-labels[data-checked='false'] .dndev-switch-label-checked {
6420
6690
  color: var(--muted-foreground);
6421
6691
  font-weight: var(--font-weight-normal);
6422
6692
  }
@@ -6457,6 +6727,12 @@ em {
6457
6727
  background-color: color-mix(in oklab, var(--accent) 15%, transparent);
6458
6728
  }
6459
6729
 
6730
+ /* Cursor pointer for clickable rows */
6731
+
6732
+ .dndev-table-row.dndev-cursor-pointer {
6733
+ cursor: pointer;
6734
+ }
6735
+
6460
6736
  /* Zebra striping for data tables */
6461
6737
 
6462
6738
  .dndev-table-body .dndev-table-row:nth-child(even) {
@@ -6551,8 +6827,8 @@ em {
6551
6827
  /* Input components inside grid cells should be borderless and fit snugly */
6552
6828
 
6553
6829
  .dndev-table-grid .dndev-table-cell .dndev-input,
6554
- .dndev-table-grid .dndev-table-cell input[type="text"],
6555
- .dndev-table-grid .dndev-table-cell input[type="number"] {
6830
+ .dndev-table-grid .dndev-table-cell input[type='text'],
6831
+ .dndev-table-grid .dndev-table-cell input[type='number'] {
6556
6832
  border: none;
6557
6833
  background: transparent;
6558
6834
  width: 100%;
@@ -8155,6 +8431,10 @@ h4[data-variant='code'] {
8155
8431
  pointer-events: auto;
8156
8432
  }
8157
8433
 
8434
+ .dndev-cursor-pointer {
8435
+ cursor: pointer;
8436
+ }
8437
+
8158
8438
  .dndev-aspect-video {
8159
8439
  aspect-ratio: 16 / 9;
8160
8440
  }
@@ -8721,10 +9001,7 @@ main[role='main'][data-routing-animation='none'] {
8721
9001
  max-height: 100dvh;
8722
9002
  overflow: hidden;
8723
9003
  display: grid;
8724
- /* ONE DRY grid structure: 3 rows, 2 columns */
8725
- /* Footer starts at sidebar edge (column 2) - when sidebar-width is 0px, footer starts at left edge */
8726
- /* Footer grows with content wrapping. For pixel-perfect calc() accuracy when footer wraps,
8727
- implement ResizeObserver to update --footer-height dynamically. */
9004
+ /* Grid structure: 3 rows, 2 columns */
8728
9005
  grid-template-areas:
8729
9006
  'header header'
8730
9007
  'sidebar main'
@@ -8735,15 +9012,61 @@ main[role='main'][data-routing-animation='none'] {
8735
9012
  );
8736
9013
  grid-template-columns: var(--sidebar-width) 1fr;
8737
9014
 
8738
- /* 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 */
8739
9017
  }
8740
9018
 
8741
- [data-layout='game']:root .dndev-layout {
8742
- grid-template-rows: var(--header-height) 1fr minmax(
8743
- var(--footer-height),
8744
- auto
8745
- );
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 */
9041
+ }
9042
+
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;
8746
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
+ }
8747
9070
 
8748
9071
  /* ===========================
8749
9072
  LAYOUT ZONE POSITIONING RULES
@@ -8758,6 +9081,8 @@ header[role='banner'] {
8758
9081
  grid-area: header;
8759
9082
  box-sizing: border-box;
8760
9083
  height: var(--header-height);
9084
+ min-height: var(--header-height);
9085
+ max-height: var(--header-height);
8761
9086
  position: relative;
8762
9087
  z-index: var(--z-header);
8763
9088
  contain: layout style;
@@ -8784,7 +9109,9 @@ header[role='banner'] {
8784
9109
  align-items: center;
8785
9110
  flex-shrink: 0;
8786
9111
  height: 100%;
9112
+ max-height: 100%;
8787
9113
  gap: var(--gap-sm);
9114
+ overflow: hidden;
8788
9115
  }
8789
9116
 
8790
9117
  .header-end {
@@ -8792,8 +9119,11 @@ header[role='banner'] {
8792
9119
  align-items: center;
8793
9120
  justify-content: flex-end;
8794
9121
  flex-shrink: 0;
9122
+ height: 100%;
9123
+ max-height: 100%;
8795
9124
  margin-inline-start: auto;
8796
9125
  gap: var(--gap-sm);
9126
+ overflow: hidden;
8797
9127
  }
8798
9128
 
8799
9129
  /* Viewport-centered center content - absolutely positioned overlay */
@@ -9085,11 +9415,17 @@ main[role='main'] > *:not(.breadcrumbs-container):first-of-type,main[role='main'
9085
9415
  /* Page content grows */
9086
9416
  }
9087
9417
 
9088
- main[role='main'] > *:last-child {
9089
- flex-shrink: 0;
9090
- /* 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
+ }
9091
9425
  }
9092
9426
 
9427
+ /* Mobile: Footer scrolls with content (no flex-shrink needed) */
9428
+
9093
9429
  /* Footer: Full width by default, app presets start after sidebar */
9094
9430
 
9095
9431
  /* box-sizing: border-box ensures borders are included in height */
@@ -9122,26 +9458,6 @@ footer[role='contentinfo'] > * {
9122
9458
  padding-inline-end: var(--content-padding);
9123
9459
  }
9124
9460
 
9125
- /* Game: Hide footer on tablet/mobile - merged into GameMergedBar */
9126
-
9127
- @media (width <= 1023px) {
9128
- [data-layout='game']:root footer[role='contentinfo'] {
9129
- display: none;
9130
- }
9131
- }
9132
-
9133
- /* Moolti: No footer (built into sidebar) */
9134
-
9135
- [data-layout='moolti']:root footer[role='contentinfo'] {
9136
- display: none;
9137
- }
9138
-
9139
- /* Plain: No footer (full-screen apps) */
9140
-
9141
- [data-layout='plain']:root footer[role='contentinfo'] {
9142
- display: none;
9143
- }
9144
-
9145
9461
  /* Footer text styles */
9146
9462
 
9147
9463
  footer[role='contentinfo'] .footer-copyright {
@@ -9186,7 +9502,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9186
9502
 
9187
9503
  .merged-bar[data-position='top'] {
9188
9504
  top: 0;
9189
- height: 64px;
9505
+ height: var(--header-height);
9190
9506
  border-bottom: 2px solid var(--border);
9191
9507
  padding-top: env(safe-area-inset-top);
9192
9508
  }
@@ -9214,7 +9530,7 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9214
9530
  min-height: 0;
9215
9531
  }
9216
9532
 
9217
- /* Mobile (<1024px): Show merged-bar, hide zones, add padding */
9533
+ /* Mobile (<1024px): Show merged-bar, hide zones */
9218
9534
 
9219
9535
  @media (width <= 1023px) {
9220
9536
  /* Presets with mergedBar: top (admin, moolti, game, docs) */
@@ -9229,7 +9545,8 @@ footer[role='contentinfo'] a:not(.dndev-interactive):hover {
9229
9545
  [data-layout='moolti'] .dndev-layout,
9230
9546
  [data-layout='game'] .dndev-layout,
9231
9547
  [data-layout='docs'] .dndev-layout {
9232
- 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 */
9233
9550
  }
9234
9551
 
9235
9552
  [data-layout='admin'] header[role='banner'],
@@ -139,5 +139,5 @@ export declare function resolveLogo(customPath?: string): string;
139
139
  * @author AMBROISE PARK Consulting
140
140
  */
141
141
  export declare function resolveFaviconSet(): FaviconSet;
142
- export default AssetResolver;
142
+ export {};
143
143
  //# sourceMappingURL=assetResolver.d.ts.map