@salt-ds/core 1.60.0 → 1.62.0

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 (268) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/css/salt-core.css +492 -1
  3. package/dist-cjs/index.js +32 -0
  4. package/dist-cjs/index.js.map +1 -1
  5. package/dist-cjs/navigation-item/NavigationItem.js +2 -0
  6. package/dist-cjs/navigation-item/NavigationItem.js.map +1 -1
  7. package/dist-cjs/rating/Rating.css.js +6 -0
  8. package/dist-cjs/rating/Rating.css.js.map +1 -0
  9. package/dist-cjs/rating/Rating.js +140 -0
  10. package/dist-cjs/rating/Rating.js.map +1 -0
  11. package/dist-cjs/rating/RatingItem.css.js +6 -0
  12. package/dist-cjs/rating/RatingItem.css.js.map +1 -0
  13. package/dist-cjs/rating/RatingItem.js +75 -0
  14. package/dist-cjs/rating/RatingItem.js.map +1 -0
  15. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js +22 -20
  16. package/dist-cjs/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  17. package/dist-cjs/side-panel/SidePanel.css.js +6 -0
  18. package/dist-cjs/side-panel/SidePanel.css.js.map +1 -0
  19. package/dist-cjs/side-panel/SidePanel.js +205 -0
  20. package/dist-cjs/side-panel/SidePanel.js.map +1 -0
  21. package/dist-cjs/side-panel/SidePanelCloseButton.js +44 -0
  22. package/dist-cjs/side-panel/SidePanelCloseButton.js.map +1 -0
  23. package/dist-cjs/side-panel/SidePanelContent.css.js +6 -0
  24. package/dist-cjs/side-panel/SidePanelContent.css.js.map +1 -0
  25. package/dist-cjs/side-panel/SidePanelContent.js +70 -0
  26. package/dist-cjs/side-panel/SidePanelContent.js.map +1 -0
  27. package/dist-cjs/side-panel/SidePanelHeader.css.js +6 -0
  28. package/dist-cjs/side-panel/SidePanelHeader.css.js.map +1 -0
  29. package/dist-cjs/side-panel/SidePanelHeader.js +30 -0
  30. package/dist-cjs/side-panel/SidePanelHeader.js.map +1 -0
  31. package/dist-cjs/side-panel/SidePanelProvider.js +83 -0
  32. package/dist-cjs/side-panel/SidePanelProvider.js.map +1 -0
  33. package/dist-cjs/side-panel/SidePanelTitle.css.js +6 -0
  34. package/dist-cjs/side-panel/SidePanelTitle.css.js.map +1 -0
  35. package/dist-cjs/side-panel/SidePanelTitle.js +60 -0
  36. package/dist-cjs/side-panel/SidePanelTitle.js.map +1 -0
  37. package/dist-cjs/side-panel/SidePanelTrigger.js +43 -0
  38. package/dist-cjs/side-panel/SidePanelTrigger.js.map +1 -0
  39. package/dist-cjs/side-panel/internal/SidePanelContext.js +38 -0
  40. package/dist-cjs/side-panel/internal/SidePanelContext.js.map +1 -0
  41. package/dist-cjs/side-panel/internal/useIsScrollable.js +50 -0
  42. package/dist-cjs/side-panel/internal/useIsScrollable.js.map +1 -0
  43. package/dist-cjs/side-panel/internal/useSidePanelTabOrder.js +214 -0
  44. package/dist-cjs/side-panel/internal/useSidePanelTabOrder.js.map +1 -0
  45. package/dist-cjs/side-panel/useSidePanel.js +49 -0
  46. package/dist-cjs/side-panel/useSidePanel.js.map +1 -0
  47. package/dist-cjs/tabs/Tab.css.js +6 -0
  48. package/dist-cjs/tabs/Tab.css.js.map +1 -0
  49. package/dist-cjs/tabs/Tab.js +211 -0
  50. package/dist-cjs/tabs/Tab.js.map +1 -0
  51. package/dist-cjs/tabs/TabAction.js +63 -0
  52. package/dist-cjs/tabs/TabAction.js.map +1 -0
  53. package/dist-cjs/tabs/TabBar.css.js +6 -0
  54. package/dist-cjs/tabs/TabBar.css.js.map +1 -0
  55. package/dist-cjs/tabs/TabBar.js +45 -0
  56. package/dist-cjs/tabs/TabBar.js.map +1 -0
  57. package/dist-cjs/tabs/TabList.css.js +6 -0
  58. package/dist-cjs/tabs/TabList.css.js.map +1 -0
  59. package/dist-cjs/tabs/TabList.js +281 -0
  60. package/dist-cjs/tabs/TabList.js.map +1 -0
  61. package/dist-cjs/tabs/TabPanel.css.js +6 -0
  62. package/dist-cjs/tabs/TabPanel.css.js.map +1 -0
  63. package/dist-cjs/tabs/TabPanel.js +98 -0
  64. package/dist-cjs/tabs/TabPanel.js.map +1 -0
  65. package/dist-cjs/tabs/TabTrigger.css.js +6 -0
  66. package/dist-cjs/tabs/TabTrigger.css.js.map +1 -0
  67. package/dist-cjs/tabs/TabTrigger.js +188 -0
  68. package/dist-cjs/tabs/TabTrigger.js.map +1 -0
  69. package/dist-cjs/tabs/Tabs.css.js +6 -0
  70. package/dist-cjs/tabs/Tabs.css.js.map +1 -0
  71. package/dist-cjs/tabs/Tabs.js +200 -0
  72. package/dist-cjs/tabs/Tabs.js.map +1 -0
  73. package/dist-cjs/tabs/internal/contexts/TabContext.js +26 -0
  74. package/dist-cjs/tabs/internal/contexts/TabContext.js.map +1 -0
  75. package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js +19 -0
  76. package/dist-cjs/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
  77. package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js +22 -0
  78. package/dist-cjs/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
  79. package/dist-cjs/tabs/internal/contexts/TabsContext.js +50 -0
  80. package/dist-cjs/tabs/internal/contexts/TabsContext.js.map +1 -0
  81. package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js +64 -0
  82. package/dist-cjs/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
  83. package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js +76 -0
  84. package/dist-cjs/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
  85. package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js +165 -0
  86. package/dist-cjs/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
  87. package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js +87 -0
  88. package/dist-cjs/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
  89. package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js +6 -0
  90. package/dist-cjs/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
  91. package/dist-cjs/tabs/internal/overflow/TabOverflowList.js +245 -0
  92. package/dist-cjs/tabs/internal/overflow/TabOverflowList.js.map +1 -0
  93. package/dist-cjs/tabs/internal/overflow/TabSlot.js +30 -0
  94. package/dist-cjs/tabs/internal/overflow/TabSlot.js.map +1 -0
  95. package/dist-cjs/tabs/internal/overflow/overflowMath.js +86 -0
  96. package/dist-cjs/tabs/internal/overflow/overflowMath.js.map +1 -0
  97. package/dist-cjs/tabs/internal/overflow/useOverflow.js +273 -0
  98. package/dist-cjs/tabs/internal/overflow/useOverflow.js.map +1 -0
  99. package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js +99 -0
  100. package/dist-cjs/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
  101. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +68 -0
  102. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
  103. package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js +92 -0
  104. package/dist-cjs/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
  105. package/dist-cjs/tabs/internal/overflow/widthMeasurement.js +42 -0
  106. package/dist-cjs/tabs/internal/overflow/widthMeasurement.js.map +1 -0
  107. package/dist-cjs/tabs/internal/registry/useCollection.js +197 -0
  108. package/dist-cjs/tabs/internal/registry/useCollection.js.map +1 -0
  109. package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js +206 -0
  110. package/dist-cjs/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
  111. package/dist-cjs/tabs/internal/utils/domUtils.js +13 -0
  112. package/dist-cjs/tabs/internal/utils/domUtils.js.map +1 -0
  113. package/dist-es/index.js +16 -0
  114. package/dist-es/index.js.map +1 -1
  115. package/dist-es/navigation-item/NavigationItem.js +2 -0
  116. package/dist-es/navigation-item/NavigationItem.js.map +1 -1
  117. package/dist-es/rating/Rating.css.js +4 -0
  118. package/dist-es/rating/Rating.css.js.map +1 -0
  119. package/dist-es/rating/Rating.js +138 -0
  120. package/dist-es/rating/Rating.js.map +1 -0
  121. package/dist-es/rating/RatingItem.css.js +4 -0
  122. package/dist-es/rating/RatingItem.css.js.map +1 -0
  123. package/dist-es/rating/RatingItem.js +73 -0
  124. package/dist-es/rating/RatingItem.js.map +1 -0
  125. package/dist-es/semantic-icon-provider/SemanticIconProvider.js +23 -21
  126. package/dist-es/semantic-icon-provider/SemanticIconProvider.js.map +1 -1
  127. package/dist-es/side-panel/SidePanel.css.js +4 -0
  128. package/dist-es/side-panel/SidePanel.css.js.map +1 -0
  129. package/dist-es/side-panel/SidePanel.js +203 -0
  130. package/dist-es/side-panel/SidePanel.js.map +1 -0
  131. package/dist-es/side-panel/SidePanelCloseButton.js +42 -0
  132. package/dist-es/side-panel/SidePanelCloseButton.js.map +1 -0
  133. package/dist-es/side-panel/SidePanelContent.css.js +4 -0
  134. package/dist-es/side-panel/SidePanelContent.css.js.map +1 -0
  135. package/dist-es/side-panel/SidePanelContent.js +68 -0
  136. package/dist-es/side-panel/SidePanelContent.js.map +1 -0
  137. package/dist-es/side-panel/SidePanelHeader.css.js +4 -0
  138. package/dist-es/side-panel/SidePanelHeader.css.js.map +1 -0
  139. package/dist-es/side-panel/SidePanelHeader.js +28 -0
  140. package/dist-es/side-panel/SidePanelHeader.js.map +1 -0
  141. package/dist-es/side-panel/SidePanelProvider.js +81 -0
  142. package/dist-es/side-panel/SidePanelProvider.js.map +1 -0
  143. package/dist-es/side-panel/SidePanelTitle.css.js +4 -0
  144. package/dist-es/side-panel/SidePanelTitle.css.js.map +1 -0
  145. package/dist-es/side-panel/SidePanelTitle.js +58 -0
  146. package/dist-es/side-panel/SidePanelTitle.js.map +1 -0
  147. package/dist-es/side-panel/SidePanelTrigger.js +41 -0
  148. package/dist-es/side-panel/SidePanelTrigger.js.map +1 -0
  149. package/dist-es/side-panel/internal/SidePanelContext.js +35 -0
  150. package/dist-es/side-panel/internal/SidePanelContext.js.map +1 -0
  151. package/dist-es/side-panel/internal/useIsScrollable.js +48 -0
  152. package/dist-es/side-panel/internal/useIsScrollable.js.map +1 -0
  153. package/dist-es/side-panel/internal/useSidePanelTabOrder.js +212 -0
  154. package/dist-es/side-panel/internal/useSidePanelTabOrder.js.map +1 -0
  155. package/dist-es/side-panel/useSidePanel.js +47 -0
  156. package/dist-es/side-panel/useSidePanel.js.map +1 -0
  157. package/dist-es/tabs/Tab.css.js +4 -0
  158. package/dist-es/tabs/Tab.css.js.map +1 -0
  159. package/dist-es/tabs/Tab.js +209 -0
  160. package/dist-es/tabs/Tab.js.map +1 -0
  161. package/dist-es/tabs/TabAction.js +61 -0
  162. package/dist-es/tabs/TabAction.js.map +1 -0
  163. package/dist-es/tabs/TabBar.css.js +4 -0
  164. package/dist-es/tabs/TabBar.css.js.map +1 -0
  165. package/dist-es/tabs/TabBar.js +43 -0
  166. package/dist-es/tabs/TabBar.js.map +1 -0
  167. package/dist-es/tabs/TabList.css.js +4 -0
  168. package/dist-es/tabs/TabList.css.js.map +1 -0
  169. package/dist-es/tabs/TabList.js +279 -0
  170. package/dist-es/tabs/TabList.js.map +1 -0
  171. package/dist-es/tabs/TabPanel.css.js +4 -0
  172. package/dist-es/tabs/TabPanel.css.js.map +1 -0
  173. package/dist-es/tabs/TabPanel.js +96 -0
  174. package/dist-es/tabs/TabPanel.js.map +1 -0
  175. package/dist-es/tabs/TabTrigger.css.js +4 -0
  176. package/dist-es/tabs/TabTrigger.css.js.map +1 -0
  177. package/dist-es/tabs/TabTrigger.js +186 -0
  178. package/dist-es/tabs/TabTrigger.js.map +1 -0
  179. package/dist-es/tabs/Tabs.css.js +4 -0
  180. package/dist-es/tabs/Tabs.css.js.map +1 -0
  181. package/dist-es/tabs/Tabs.js +198 -0
  182. package/dist-es/tabs/Tabs.js.map +1 -0
  183. package/dist-es/tabs/internal/contexts/TabContext.js +23 -0
  184. package/dist-es/tabs/internal/contexts/TabContext.js.map +1 -0
  185. package/dist-es/tabs/internal/contexts/TabListLayoutContext.js +16 -0
  186. package/dist-es/tabs/internal/contexts/TabListLayoutContext.js.map +1 -0
  187. package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js +19 -0
  188. package/dist-es/tabs/internal/contexts/TabSlotRegistryContext.js.map +1 -0
  189. package/dist-es/tabs/internal/contexts/TabsContext.js +47 -0
  190. package/dist-es/tabs/internal/contexts/TabsContext.js.map +1 -0
  191. package/dist-es/tabs/internal/hooks/useFocusWithRetry.js +62 -0
  192. package/dist-es/tabs/internal/hooks/useFocusWithRetry.js.map +1 -0
  193. package/dist-es/tabs/internal/hooks/useTabListRecovery.js +74 -0
  194. package/dist-es/tabs/internal/hooks/useTabListRecovery.js.map +1 -0
  195. package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js +163 -0
  196. package/dist-es/tabs/internal/hooks/useTabRemovalHandler.js.map +1 -0
  197. package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js +85 -0
  198. package/dist-es/tabs/internal/hooks/useTabSelectionFocus.js.map +1 -0
  199. package/dist-es/tabs/internal/overflow/TabOverflowList.css.js +4 -0
  200. package/dist-es/tabs/internal/overflow/TabOverflowList.css.js.map +1 -0
  201. package/dist-es/tabs/internal/overflow/TabOverflowList.js +243 -0
  202. package/dist-es/tabs/internal/overflow/TabOverflowList.js.map +1 -0
  203. package/dist-es/tabs/internal/overflow/TabSlot.js +28 -0
  204. package/dist-es/tabs/internal/overflow/TabSlot.js.map +1 -0
  205. package/dist-es/tabs/internal/overflow/overflowMath.js +82 -0
  206. package/dist-es/tabs/internal/overflow/overflowMath.js.map +1 -0
  207. package/dist-es/tabs/internal/overflow/useOverflow.js +271 -0
  208. package/dist-es/tabs/internal/overflow/useOverflow.js.map +1 -0
  209. package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js +97 -0
  210. package/dist-es/tabs/internal/overflow/useOverflowLayoutState.js.map +1 -0
  211. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +66 -0
  212. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -0
  213. package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js +90 -0
  214. package/dist-es/tabs/internal/overflow/useRenderedTabWidth.js.map +1 -0
  215. package/dist-es/tabs/internal/overflow/widthMeasurement.js +36 -0
  216. package/dist-es/tabs/internal/overflow/widthMeasurement.js.map +1 -0
  217. package/dist-es/tabs/internal/registry/useCollection.js +195 -0
  218. package/dist-es/tabs/internal/registry/useCollection.js.map +1 -0
  219. package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js +204 -0
  220. package/dist-es/tabs/internal/registry/useRenderedTabsRegistry.js.map +1 -0
  221. package/dist-es/tabs/internal/utils/domUtils.js +11 -0
  222. package/dist-es/tabs/internal/utils/domUtils.js.map +1 -0
  223. package/dist-types/index.d.ts +3 -0
  224. package/dist-types/rating/Rating.d.ts +48 -0
  225. package/dist-types/rating/RatingItem.d.ts +47 -0
  226. package/dist-types/rating/index.d.ts +1 -0
  227. package/dist-types/semantic-icon-provider/SemanticIconProvider.d.ts +21 -19
  228. package/dist-types/side-panel/SidePanel.d.ts +26 -0
  229. package/dist-types/side-panel/SidePanelCloseButton.d.ts +2 -0
  230. package/dist-types/side-panel/SidePanelContent.d.ts +5 -0
  231. package/dist-types/side-panel/SidePanelHeader.d.ts +5 -0
  232. package/dist-types/side-panel/SidePanelProvider.d.ts +20 -0
  233. package/dist-types/side-panel/SidePanelTitle.d.ts +3 -0
  234. package/dist-types/side-panel/SidePanelTrigger.d.ts +3 -0
  235. package/dist-types/side-panel/index.d.ts +8 -0
  236. package/dist-types/side-panel/internal/SidePanelContext.d.ts +52 -0
  237. package/dist-types/side-panel/internal/index.d.ts +3 -0
  238. package/dist-types/side-panel/internal/useIsScrollable.d.ts +2 -0
  239. package/dist-types/side-panel/internal/useSidePanelTabOrder.d.ts +7 -0
  240. package/dist-types/side-panel/useSidePanel.d.ts +58 -0
  241. package/dist-types/tabs/Tab.d.ts +12 -0
  242. package/dist-types/tabs/TabAction.d.ts +4 -0
  243. package/dist-types/tabs/TabBar.d.ts +12 -0
  244. package/dist-types/tabs/TabList.d.ts +12 -0
  245. package/dist-types/tabs/TabPanel.d.ts +9 -0
  246. package/dist-types/tabs/TabTrigger.d.ts +4 -0
  247. package/dist-types/tabs/Tabs.d.ts +20 -0
  248. package/dist-types/tabs/index.d.ts +7 -0
  249. package/dist-types/tabs/internal/contexts/TabContext.d.ts +12 -0
  250. package/dist-types/tabs/internal/contexts/TabListLayoutContext.d.ts +9 -0
  251. package/dist-types/tabs/internal/contexts/TabSlotRegistryContext.d.ts +5 -0
  252. package/dist-types/tabs/internal/contexts/TabsContext.d.ts +43 -0
  253. package/dist-types/tabs/internal/hooks/useFocusWithRetry.d.ts +9 -0
  254. package/dist-types/tabs/internal/hooks/useTabListRecovery.d.ts +12 -0
  255. package/dist-types/tabs/internal/hooks/useTabRemovalHandler.d.ts +32 -0
  256. package/dist-types/tabs/internal/hooks/useTabSelectionFocus.d.ts +15 -0
  257. package/dist-types/tabs/internal/overflow/TabOverflowList.d.ts +10 -0
  258. package/dist-types/tabs/internal/overflow/TabSlot.d.ts +6 -0
  259. package/dist-types/tabs/internal/overflow/overflowMath.d.ts +18 -0
  260. package/dist-types/tabs/internal/overflow/useOverflow.d.ts +11 -0
  261. package/dist-types/tabs/internal/overflow/useOverflowLayoutState.d.ts +13 -0
  262. package/dist-types/tabs/internal/overflow/useOverflowSelectionState.d.ts +13 -0
  263. package/dist-types/tabs/internal/overflow/useRenderedTabWidth.d.ts +12 -0
  264. package/dist-types/tabs/internal/overflow/widthMeasurement.d.ts +5 -0
  265. package/dist-types/tabs/internal/registry/useCollection.d.ts +30 -0
  266. package/dist-types/tabs/internal/registry/useRenderedTabsRegistry.d.ts +12 -0
  267. package/dist-types/tabs/internal/utils/domUtils.d.ts +1 -0
  268. package/package.json +3 -1
@@ -0,0 +1,42 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { clsx } from 'clsx';
3
+ import { forwardRef } from 'react';
4
+ import { Button } from '../button/Button.js';
5
+ import { useIcon } from '../semantic-icon-provider/SemanticIconProvider.js';
6
+ import { makePrefixer } from '../utils/makePrefixer.js';
7
+ import '../utils/useFloatingUI/useFloatingUI.js';
8
+ import { useId } from '../utils/useId.js';
9
+ import '../salt-provider/SaltProvider.js';
10
+ import '../viewport/ViewportProvider.js';
11
+ import { useSidePanelContext } from './internal/SidePanelContext.js';
12
+ import 'tabbable';
13
+
14
+ const withBaseName = makePrefixer("saltSidePanelCloseButton");
15
+ const SidePanelCloseButton = forwardRef(
16
+ function SidePanelCloseButton2({ className, onClick, id: idProp, ...rest }, ref) {
17
+ const { CollapseLeftIcon, CollapseRightIcon } = useIcon();
18
+ const { setOpen, titleId, position } = useSidePanelContext();
19
+ const closeButtonId = useId(idProp);
20
+ const handleClick = (event) => {
21
+ onClick == null ? void 0 : onClick(event);
22
+ setOpen(false);
23
+ };
24
+ return /* @__PURE__ */ jsx(
25
+ Button,
26
+ {
27
+ ref,
28
+ id: closeButtonId,
29
+ "aria-label": "Close",
30
+ "aria-labelledby": titleId ? clsx(closeButtonId, titleId) : void 0,
31
+ appearance: "transparent",
32
+ className: clsx(withBaseName(), className),
33
+ onClick: handleClick,
34
+ ...rest,
35
+ children: position === "left" ? /* @__PURE__ */ jsx(CollapseLeftIcon, { "aria-hidden": true }) : /* @__PURE__ */ jsx(CollapseRightIcon, { "aria-hidden": true })
36
+ }
37
+ );
38
+ }
39
+ );
40
+
41
+ export { SidePanelCloseButton };
42
+ //# sourceMappingURL=SidePanelCloseButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelCloseButton.js","sources":["../src/side-panel/SidePanelCloseButton.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { forwardRef, type MouseEvent } from \"react\";\nimport { Button, type ButtonProps } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer, useId } from \"../utils\";\nimport { useSidePanelContext } from \"./internal\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelCloseButton\");\n\nexport const SidePanelCloseButton = forwardRef<HTMLButtonElement, ButtonProps>(\n function SidePanelCloseButton(\n { className, onClick, id: idProp, ...rest },\n ref,\n ) {\n const { CollapseLeftIcon, CollapseRightIcon } = useIcon();\n const { setOpen, titleId, position } = useSidePanelContext();\n const closeButtonId = useId(idProp);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n setOpen(false);\n };\n\n return (\n <Button\n ref={ref}\n id={closeButtonId}\n aria-label=\"Close\"\n aria-labelledby={titleId ? clsx(closeButtonId, titleId) : undefined}\n appearance=\"transparent\"\n className={clsx(withBaseName(), className)}\n onClick={handleClick}\n {...rest}\n >\n {position === \"left\" ? (\n <CollapseLeftIcon aria-hidden />\n ) : (\n <CollapseRightIcon aria-hidden />\n )}\n </Button>\n );\n },\n);\n"],"names":["SidePanelCloseButton"],"mappings":";;;;;;;;;;;;;AAOA,MAAM,YAAA,GAAe,aAAa,0BAA0B,CAAA;AAErD,MAAM,oBAAA,GAAuB,UAAA;AAAA,EAClC,SAASA,qBAAAA,CACP,EAAE,SAAA,EAAW,OAAA,EAAS,IAAI,MAAA,EAAQ,GAAG,IAAA,EAAK,EAC1C,GAAA,EACA;AACA,IAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAI,OAAA,EAAQ;AACxD,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,KAAa,mBAAA,EAAoB;AAC3D,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAM,CAAA;AAElC,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA,EAAI,aAAA;AAAA,QACJ,YAAA,EAAW,OAAA;AAAA,QACX,iBAAA,EAAiB,OAAA,GAAU,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA,GAAI,MAAA;AAAA,QAC1D,UAAA,EAAW,aAAA;AAAA,QACX,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,OAAA,EAAS,WAAA;AAAA,QACR,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,QAAA,KAAa,MAAA,mBACZ,GAAA,CAAC,gBAAA,EAAA,EAAiB,aAAA,EAAW,MAAC,CAAA,mBAE9B,GAAA,CAAC,iBAAA,EAAA,EAAkB,aAAA,EAAW,IAAA,EAAC;AAAA;AAAA,KAEnC;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltSidePanelContent {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n}\n\n.saltSidePanelContent-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=SidePanelContent.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelContent.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,68 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { clsx } from 'clsx';
5
+ import { forwardRef, useRef } from 'react';
6
+ import { makePrefixer } from '../utils/makePrefixer.js';
7
+ import '../utils/useFloatingUI/useFloatingUI.js';
8
+ import { useId } from '../utils/useId.js';
9
+ import '../salt-provider/SaltProvider.js';
10
+ import '../viewport/ViewportProvider.js';
11
+ import { useSidePanelContext } from './internal/SidePanelContext.js';
12
+ import { useIsScrollable } from './internal/useIsScrollable.js';
13
+ import 'tabbable';
14
+ import css_248z from './SidePanelContent.css.js';
15
+
16
+ const withBaseName = makePrefixer("saltSidePanelContent");
17
+ const SidePanelContent = forwardRef(function SidePanelContent2(props, ref) {
18
+ const {
19
+ children,
20
+ className,
21
+ "aria-labelledby": ariaLabelledBy,
22
+ "aria-label": ariaLabel,
23
+ ...rest
24
+ } = props;
25
+ const { titleId } = useSidePanelContext();
26
+ const targetWindow = useWindow();
27
+ const contentSuffixId = useId();
28
+ const bodyRef = useRef(null);
29
+ const isScrollable = useIsScrollable(bodyRef);
30
+ useComponentCssInjection({
31
+ testId: "salt-side-panel-content",
32
+ css: css_248z,
33
+ window: targetWindow
34
+ });
35
+ const explicitLabelledBy = ariaLabelledBy;
36
+ const explicitLabel = ariaLabel;
37
+ let bodyAriaLabelledBy;
38
+ let bodyAriaLabel;
39
+ if (isScrollable) {
40
+ if (explicitLabelledBy) {
41
+ bodyAriaLabelledBy = explicitLabelledBy;
42
+ } else if (titleId) {
43
+ bodyAriaLabelledBy = clsx(titleId, contentSuffixId) || void 0;
44
+ } else {
45
+ bodyAriaLabel = explicitLabel ?? "Content";
46
+ }
47
+ }
48
+ return /* @__PURE__ */ jsxs("div", { ref, className: clsx(withBaseName(), className), ...rest, children: [
49
+ isScrollable ? /* @__PURE__ */ jsx("span", { id: contentSuffixId, hidden: true, children: "content" }) : null,
50
+ /* @__PURE__ */ jsx(
51
+ "div",
52
+ {
53
+ ref: bodyRef,
54
+ className: withBaseName("body"),
55
+ ...isScrollable && {
56
+ role: "region",
57
+ tabIndex: 0,
58
+ "aria-labelledby": bodyAriaLabelledBy,
59
+ "aria-label": bodyAriaLabel
60
+ },
61
+ children
62
+ }
63
+ )
64
+ ] });
65
+ });
66
+
67
+ export { SidePanelContent };
68
+ //# sourceMappingURL=SidePanelContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelContent.js","sources":["../src/side-panel/SidePanelContent.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef, useRef } from \"react\";\nimport { makePrefixer, useId } from \"../utils\";\nimport { useIsScrollable, useSidePanelContext } from \"./internal\";\nimport sidePanelContentCss from \"./SidePanelContent.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelContent\");\n\nexport type SidePanelContentProps = ComponentPropsWithRef<\"div\">;\n\nexport const SidePanelContent = forwardRef<\n HTMLDivElement,\n SidePanelContentProps\n>(function SidePanelContent(props, ref) {\n const {\n children,\n className,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n\n const { titleId } = useSidePanelContext();\n const targetWindow = useWindow();\n const contentSuffixId = useId();\n const bodyRef = useRef<HTMLDivElement>(null);\n const isScrollable = useIsScrollable(bodyRef);\n\n useComponentCssInjection({\n testId: \"salt-side-panel-content\",\n css: sidePanelContentCss,\n window: targetWindow,\n });\n\n const explicitLabelledBy = ariaLabelledBy;\n const explicitLabel = ariaLabel;\n\n let bodyAriaLabelledBy: string | undefined;\n let bodyAriaLabel: string | undefined;\n\n if (isScrollable) {\n if (explicitLabelledBy) {\n bodyAriaLabelledBy = explicitLabelledBy;\n } else if (titleId) {\n bodyAriaLabelledBy = clsx(titleId, contentSuffixId) || undefined;\n } else {\n bodyAriaLabel = explicitLabel ?? \"Content\";\n }\n }\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {isScrollable ? (\n <span id={contentSuffixId} hidden>\n content\n </span>\n ) : null}\n <div\n ref={bodyRef}\n className={withBaseName(\"body\")}\n {...(isScrollable && {\n role: \"region\",\n tabIndex: 0,\n \"aria-labelledby\": bodyAriaLabelledBy,\n \"aria-label\": bodyAriaLabel,\n })}\n >\n {children}\n </div>\n </div>\n );\n});\n"],"names":["SidePanelContent","sidePanelContentCss"],"mappings":";;;;;;;;;;;;;;;AAQA,MAAM,YAAA,GAAe,aAAa,sBAAsB,CAAA;AAIjD,MAAM,gBAAA,GAAmB,UAAA,CAG9B,SAASA,iBAAAA,CAAiB,OAAO,GAAA,EAAK;AACtC,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA,EAAmB,cAAA;AAAA,IACnB,YAAA,EAAc,SAAA;AAAA,IACd,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,mBAAA,EAAoB;AACxC,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,MAAM,kBAAkB,KAAA,EAAM;AAC9B,EAAA,MAAM,OAAA,GAAU,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,gBAAgB,OAAO,CAAA;AAE5C,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,yBAAA;AAAA,IACR,GAAA,EAAKC,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqB,cAAA;AAC3B,EAAA,MAAM,aAAA,GAAgB,SAAA;AAEtB,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,kBAAA,GAAqB,kBAAA;AAAA,IACvB,WAAW,OAAA,EAAS;AAClB,MAAA,kBAAA,GAAqB,IAAA,CAAK,OAAA,EAAS,eAAe,CAAA,IAAK,MAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,aAAA,IAAiB,SAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,IAAA,CAAK,cAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,EAAA;AAAA,IAAA,YAAA,uBACE,MAAA,EAAA,EAAK,EAAA,EAAI,iBAAiB,MAAA,EAAM,IAAA,EAAC,qBAElC,CAAA,GACE,IAAA;AAAA,oBACJ,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,QAC7B,GAAI,YAAA,IAAgB;AAAA,UACnB,IAAA,EAAM,QAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,iBAAA,EAAmB,kBAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SAChB;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltSidePanelHeader {\n display: flex;\n align-items: flex-start;\n flex-shrink: 0;\n gap: var(--salt-spacing-100);\n padding: 0 0 var(--salt-spacing-300);\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=SidePanelHeader.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelHeader.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,28 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { clsx } from 'clsx';
5
+ import { forwardRef } from 'react';
6
+ import { makePrefixer } from '../utils/makePrefixer.js';
7
+ import '../utils/useFloatingUI/useFloatingUI.js';
8
+ import '../utils/useId.js';
9
+ import '../salt-provider/SaltProvider.js';
10
+ import '../viewport/ViewportProvider.js';
11
+ import css_248z from './SidePanelHeader.css.js';
12
+
13
+ const withBaseName = makePrefixer("saltSidePanelHeader");
14
+ const SidePanelHeader = forwardRef(
15
+ function SidePanelHeader2(props, ref) {
16
+ const { children, className, ...rest } = props;
17
+ const targetWindow = useWindow();
18
+ useComponentCssInjection({
19
+ testId: "salt-side-panel-header",
20
+ css: css_248z,
21
+ window: targetWindow
22
+ });
23
+ return /* @__PURE__ */ jsx("div", { ref, className: clsx(withBaseName(), className), ...rest, children });
24
+ }
25
+ );
26
+
27
+ export { SidePanelHeader };
28
+ //# sourceMappingURL=SidePanelHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelHeader.js","sources":["../src/side-panel/SidePanelHeader.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport sidePanelHeaderCss from \"./SidePanelHeader.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelHeader\");\n\nexport type SidePanelHeaderProps = ComponentPropsWithRef<\"div\">;\n\nexport const SidePanelHeader = forwardRef<HTMLDivElement, SidePanelHeaderProps>(\n function SidePanelHeader(props, ref) {\n const { children, className, ...rest } = props;\n\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel-header\",\n css: sidePanelHeaderCss,\n window: targetWindow,\n });\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {children}\n </div>\n );\n },\n);\n"],"names":["SidePanelHeader","sidePanelHeaderCss"],"mappings":";;;;;;;;;;;;AAOA,MAAM,YAAA,GAAe,aAAa,qBAAqB,CAAA;AAIhD,MAAM,eAAA,GAAkB,UAAA;AAAA,EAC7B,SAASA,gBAAAA,CAAgB,KAAA,EAAO,GAAA,EAAK;AACnC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAEzC,IAAA,MAAM,eAAe,SAAA,EAAU;AAE/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,wBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,81 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useFloatingRootContext } from '@floating-ui/react';
3
+ import { useCallback, useState, useMemo, useEffect } from 'react';
4
+ import 'clsx';
5
+ import { useControlled } from '../utils/useControlled.js';
6
+ import '../utils/useFloatingUI/useFloatingUI.js';
7
+ import '../utils/useId.js';
8
+ import '../salt-provider/SaltProvider.js';
9
+ import '../viewport/ViewportProvider.js';
10
+ import { SidePanelContext } from './internal/SidePanelContext.js';
11
+ import { useSidePanelTabOrder } from './internal/useSidePanelTabOrder.js';
12
+
13
+ function SidePanelProvider(props) {
14
+ const { children, open: openProp, defaultOpen, onOpenChange } = props;
15
+ const [openState, setOpenState] = useControlled({
16
+ default: Boolean(defaultOpen),
17
+ controlled: openProp,
18
+ name: "SidePanelProvider",
19
+ state: "open"
20
+ });
21
+ const handleOpenChange = useCallback(
22
+ (newOpen) => {
23
+ setOpenState(newOpen);
24
+ onOpenChange == null ? void 0 : onOpenChange(newOpen);
25
+ },
26
+ [onOpenChange]
27
+ );
28
+ const [reference, setReference] = useState(null);
29
+ const [floating, setFloating] = useState(null);
30
+ const [panelId, setPanelId] = useState(void 0);
31
+ const [titleId, setTitleId] = useState(void 0);
32
+ const elements = useMemo(
33
+ () => ({ reference, floating }),
34
+ [reference, floating]
35
+ );
36
+ const floatingRootContext = useFloatingRootContext({
37
+ open: openState,
38
+ onOpenChange: handleOpenChange,
39
+ elements
40
+ });
41
+ useEffect(() => {
42
+ if (!openState || !floating) {
43
+ return;
44
+ }
45
+ const onKeyDown = (event) => {
46
+ if (event.key !== "Escape") {
47
+ return;
48
+ }
49
+ event.preventDefault();
50
+ event.stopPropagation();
51
+ handleOpenChange(false);
52
+ };
53
+ floating.addEventListener("keydown", onKeyDown);
54
+ return () => {
55
+ floating.removeEventListener("keydown", onKeyDown);
56
+ };
57
+ }, [floating, openState, handleOpenChange]);
58
+ useSidePanelTabOrder({
59
+ floating,
60
+ open: openState,
61
+ reference
62
+ });
63
+ const context = useMemo(
64
+ () => ({
65
+ openState,
66
+ floatingRootContext,
67
+ setFloating,
68
+ setReference,
69
+ setOpen: handleOpenChange,
70
+ panelId,
71
+ setPanelId,
72
+ titleId,
73
+ setTitleId
74
+ }),
75
+ [openState, floatingRootContext, handleOpenChange, panelId, titleId]
76
+ );
77
+ return /* @__PURE__ */ jsx(SidePanelContext.Provider, { value: context, children });
78
+ }
79
+
80
+ export { SidePanelProvider };
81
+ //# sourceMappingURL=SidePanelProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelProvider.js","sources":["../src/side-panel/SidePanelProvider.tsx"],"sourcesContent":["import { useFloatingRootContext } from \"@floating-ui/react\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useControlled } from \"../utils\";\nimport { SidePanelContext, useSidePanelTabOrder } from \"./internal\";\n\nexport interface SidePanelProviderProps {\n /**\n * Whether the panel is open.\n */\n open?: boolean;\n /**\n * Default open state when initially rendered.\n */\n defaultOpen?: boolean;\n /**\n * Callback when open state changes.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * SidePanelProvider children, should include SidePanel and SidePanelTrigger.\n */\n children: ReactNode;\n}\n\nexport function SidePanelProvider(props: SidePanelProviderProps) {\n const { children, open: openProp, defaultOpen, onOpenChange } = props;\n\n const [openState, setOpenState] = useControlled({\n default: Boolean(defaultOpen),\n controlled: openProp,\n name: \"SidePanelProvider\",\n state: \"open\",\n });\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setOpenState(newOpen);\n onOpenChange?.(newOpen);\n },\n [onOpenChange],\n );\n\n const [reference, setReference] = useState<HTMLElement | null>(null);\n const [floating, setFloating] = useState<HTMLDivElement | null>(null);\n const [panelId, setPanelId] = useState<string | undefined>(undefined);\n const [titleId, setTitleId] = useState<string | undefined>(undefined);\n\n // Memoise so floating-ui's root context isn't recreated every render.\n const elements = useMemo(\n () => ({ reference, floating }),\n [reference, floating],\n );\n\n const floatingRootContext = useFloatingRootContext({\n open: openState,\n onOpenChange: handleOpenChange,\n elements,\n });\n\n useEffect(() => {\n if (!openState || !floating) {\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n handleOpenChange(false);\n };\n\n floating.addEventListener(\"keydown\", onKeyDown);\n return () => {\n floating.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [floating, openState, handleOpenChange]);\n\n useSidePanelTabOrder({\n floating,\n open: openState,\n reference,\n });\n\n const context = useMemo(\n () => ({\n openState,\n floatingRootContext,\n setFloating,\n setReference,\n setOpen: handleOpenChange,\n panelId,\n setPanelId,\n titleId,\n setTitleId,\n }),\n [openState, floatingRootContext, handleOpenChange, panelId, titleId],\n );\n\n return (\n <SidePanelContext.Provider value={context}>\n {children}\n </SidePanelContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AA8BO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,cAAa,GAAI,KAAA;AAEhE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,aAAA,CAAc;AAAA,IAC9C,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,IAC5B,UAAA,EAAY,QAAA;AAAA,IACZ,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,OAAA,KAAqB;AACpB,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,OAAA,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6B,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAgC,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA6B,MAAS,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA6B,MAAS,CAAA;AAGpE,EAAA,MAAM,QAAA,GAAW,OAAA;AAAA,IACf,OAAO,EAAE,SAAA,EAAW,QAAA,EAAS,CAAA;AAAA,IAC7B,CAAC,WAAW,QAAQ;AAAA,GACtB;AAEA,EAAA,MAAM,sBAAsB,sBAAA,CAAuB;AAAA,IACjD,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,gBAAA;AAAA,IACd;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAE1C,EAAA,oBAAA,CAAqB;AAAA,IACnB,QAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACd,OAAO;AAAA,MACL,SAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,mBAAA,EAAqB,gBAAA,EAAkB,SAAS,OAAO;AAAA,GACrE;AAEA,EAAA,2BACG,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAC/B,QAAA,EACH,CAAA;AAEJ;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltSidePanelTitle {\n flex: 1;\n min-width: 0;\n min-height: var(--salt-size-base);\n display: flex;\n align-items: center;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=SidePanelTitle.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelTitle.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,58 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { clsx } from 'clsx';
5
+ import { forwardRef } from 'react';
6
+ import '../text/Code.js';
7
+ import '../text/Display.js';
8
+ import '../text/Headings.js';
9
+ import '../text/Label.js';
10
+ import { Text } from '../text/Text.js';
11
+ import '../text/TextAction.js';
12
+ import '../text/TextNotation.js';
13
+ import { makePrefixer } from '../utils/makePrefixer.js';
14
+ import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
15
+ import '../utils/useFloatingUI/useFloatingUI.js';
16
+ import { useId } from '../utils/useId.js';
17
+ import '../salt-provider/SaltProvider.js';
18
+ import '../viewport/ViewportProvider.js';
19
+ import { useSidePanelContext } from './internal/SidePanelContext.js';
20
+ import 'tabbable';
21
+ import css_248z from './SidePanelTitle.css.js';
22
+
23
+ const withBaseName = makePrefixer("saltSidePanelTitle");
24
+ const SidePanelTitle = forwardRef(
25
+ function SidePanelTitle2(props, ref) {
26
+ const { children, className, id, styleAs = "h2", ...rest } = props;
27
+ const { setTitleId } = useSidePanelContext();
28
+ const targetWindow = useWindow();
29
+ useComponentCssInjection({
30
+ testId: "salt-side-panel-title",
31
+ css: css_248z,
32
+ window: targetWindow
33
+ });
34
+ const titleId = useId(id);
35
+ useIsomorphicLayoutEffect(() => {
36
+ if (titleId) {
37
+ setTitleId(titleId);
38
+ }
39
+ return () => {
40
+ setTitleId(void 0);
41
+ };
42
+ }, [titleId, setTitleId]);
43
+ return /* @__PURE__ */ jsx(
44
+ Text,
45
+ {
46
+ ref,
47
+ id: titleId,
48
+ styleAs,
49
+ className: clsx(withBaseName(), className),
50
+ ...rest,
51
+ children
52
+ }
53
+ );
54
+ }
55
+ );
56
+
57
+ export { SidePanelTitle };
58
+ //# sourceMappingURL=SidePanelTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelTitle.js","sources":["../src/side-panel/SidePanelTitle.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { Text, type TextProps } from \"../text\";\nimport { makePrefixer, useId, useIsomorphicLayoutEffect } from \"../utils\";\nimport { useSidePanelContext } from \"./internal\";\nimport sidePanelTitleCss from \"./SidePanelTitle.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelTitle\");\n\nexport type SidePanelTitleProps = TextProps<\"div\">;\n\nexport const SidePanelTitle = forwardRef<HTMLDivElement, SidePanelTitleProps>(\n function SidePanelTitle(props, ref) {\n const { children, className, id, styleAs = \"h2\", ...rest } = props;\n\n const { setTitleId } = useSidePanelContext();\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel-title\",\n css: sidePanelTitleCss,\n window: targetWindow,\n });\n\n const titleId = useId(id);\n\n useIsomorphicLayoutEffect(() => {\n if (titleId) {\n setTitleId(titleId);\n }\n\n return () => {\n setTitleId(undefined);\n };\n }, [titleId, setTitleId]);\n\n return (\n <Text\n ref={ref}\n id={titleId}\n styleAs={styleAs}\n className={clsx(withBaseName(), className)}\n {...rest}\n >\n {children}\n </Text>\n );\n },\n);\n"],"names":["SidePanelTitle","sidePanelTitleCss"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,YAAA,GAAe,aAAa,oBAAoB,CAAA;AAI/C,MAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,SAASA,eAAAA,CAAe,KAAA,EAAO,GAAA,EAAK;AAClC,IAAA,MAAM,EAAE,UAAU,SAAA,EAAW,EAAA,EAAI,UAAU,IAAA,EAAM,GAAG,MAAK,GAAI,KAAA;AAE7D,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,mBAAA,EAAoB;AAC3C,IAAA,MAAM,eAAe,SAAA,EAAU;AAE/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAM,EAAE,CAAA;AAExB,IAAA,yBAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,OAAO,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,MAAM;AACX,QAAA,UAAA,CAAW,MAAS,CAAA;AAAA,MACtB,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA,EAAI,OAAA;AAAA,QACJ,OAAA;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACxC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1,41 @@
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { forwardRef, isValidElement, cloneElement } from 'react';
3
+ import { getRefFromChildren } from '../utils/getRefFromChildren.js';
4
+ import { mergeProps } from '../utils/mergeProps.js';
5
+ import '../utils/useFloatingUI/useFloatingUI.js';
6
+ import { useForkRef } from '../utils/useForkRef.js';
7
+ import '../utils/useId.js';
8
+ import '../salt-provider/SaltProvider.js';
9
+ import '../viewport/ViewportProvider.js';
10
+ import { useSidePanelContext } from './internal/SidePanelContext.js';
11
+ import 'tabbable';
12
+
13
+ const SidePanelTrigger = forwardRef(function SidePanelTrigger2(props, ref) {
14
+ const { children, onClick, ...rest } = props;
15
+ const { setReference, openState, setOpen, panelId } = useSidePanelContext();
16
+ const combinedRef = useForkRef(setReference, ref);
17
+ const handleRef = useForkRef(combinedRef, getRefFromChildren(children));
18
+ const handleClick = (event) => {
19
+ onClick == null ? void 0 : onClick(event);
20
+ setOpen(!openState);
21
+ };
22
+ if (!children || !isValidElement(children)) {
23
+ return /* @__PURE__ */ jsx(Fragment, { children });
24
+ }
25
+ const mergedProps = mergeProps(
26
+ {
27
+ "aria-expanded": openState,
28
+ "aria-controls": openState ? panelId : void 0,
29
+ onClick: handleClick,
30
+ ...rest
31
+ },
32
+ children.props
33
+ );
34
+ return cloneElement(children, {
35
+ ...mergedProps,
36
+ ref: handleRef
37
+ });
38
+ });
39
+
40
+ export { SidePanelTrigger };
41
+ //# sourceMappingURL=SidePanelTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelTrigger.js","sources":["../src/side-panel/SidePanelTrigger.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n cloneElement,\n forwardRef,\n isValidElement,\n type MouseEvent,\n} from \"react\";\nimport { getRefFromChildren, mergeProps, useForkRef } from \"../utils\";\nimport { useSidePanelContext } from \"./internal\";\n\nexport type SidePanelTriggerProps = ComponentPropsWithoutRef<\"button\">;\n\nexport const SidePanelTrigger = forwardRef<\n HTMLButtonElement,\n SidePanelTriggerProps\n>(function SidePanelTrigger(props, ref) {\n const { children, onClick, ...rest } = props;\n const { setReference, openState, setOpen, panelId } = useSidePanelContext();\n\n const combinedRef = useForkRef(setReference, ref);\n const handleRef = useForkRef(combinedRef, getRefFromChildren(children));\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n setOpen(!openState);\n };\n\n if (!children || !isValidElement(children)) {\n return <>{children}</>;\n }\n\n const mergedProps = mergeProps(\n {\n \"aria-expanded\": openState,\n \"aria-controls\": openState ? panelId : undefined,\n onClick: handleClick,\n ...rest,\n },\n children.props,\n );\n\n return cloneElement(children, {\n ...mergedProps,\n ref: handleRef,\n });\n});\n"],"names":["SidePanelTrigger"],"mappings":";;;;;;;;;;;;AAYO,MAAM,gBAAA,GAAmB,UAAA,CAG9B,SAASA,iBAAAA,CAAiB,OAAO,GAAA,EAAK;AACtC,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,GAAG,MAAK,GAAI,KAAA;AACvC,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAW,OAAA,EAAS,OAAA,KAAY,mBAAA,EAAoB;AAE1E,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,YAAA,EAAc,GAAG,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,WAAA,EAAa,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAEtE,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,IAAA,OAAA,CAAQ,CAAC,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC1C,IAAA,uCAAU,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,WAAA,GAAc,UAAA;AAAA,IAClB;AAAA,MACE,eAAA,EAAiB,SAAA;AAAA,MACjB,eAAA,EAAiB,YAAY,OAAA,GAAU,MAAA;AAAA,MACvC,OAAA,EAAS,WAAA;AAAA,MACT,GAAG;AAAA,KACL;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AAEA,EAAA,OAAO,aAAa,QAAA,EAAU;AAAA,IAC5B,GAAG,WAAA;AAAA,IACH,GAAA,EAAK;AAAA,GACN,CAAA;AACH,CAAC;;;;"}
@@ -0,0 +1,35 @@
1
+ import { useContext } from 'react';
2
+ import { createContext } from '../../utils/createContext.js';
3
+ import 'clsx';
4
+ import 'react/jsx-runtime';
5
+ import '../../utils/useFloatingUI/useFloatingUI.js';
6
+ import '../../utils/useId.js';
7
+ import '../../salt-provider/SaltProvider.js';
8
+ import '../../viewport/ViewportProvider.js';
9
+
10
+ const SidePanelContext = createContext(
11
+ "SidePanelContext",
12
+ {
13
+ openState: false,
14
+ floatingRootContext: {},
15
+ setFloating: () => {
16
+ },
17
+ setReference: () => {
18
+ },
19
+ setOpen: () => {
20
+ },
21
+ panelId: void 0,
22
+ setPanelId: () => {
23
+ },
24
+ titleId: void 0,
25
+ setTitleId: () => {
26
+ },
27
+ position: void 0
28
+ }
29
+ );
30
+ function useSidePanelContext() {
31
+ return useContext(SidePanelContext);
32
+ }
33
+
34
+ export { SidePanelContext, useSidePanelContext };
35
+ //# sourceMappingURL=SidePanelContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidePanelContext.js","sources":["../src/side-panel/internal/SidePanelContext.ts"],"sourcesContent":["import type { FloatingRootContext } from \"@floating-ui/react\";\nimport { type Dispatch, type SetStateAction, useContext } from \"react\";\nimport { createContext } from \"../../utils\";\n\nexport interface SidePanelContextValue {\n /**\n * Whether the side panel is currently open.\n */\n openState: boolean;\n /**\n * The floating-ui root context shared between the trigger and the panel.\n * Coordinates interactions (click, dismiss, role) across both elements.\n */\n floatingRootContext: FloatingRootContext;\n /**\n * Ref setter for the panel element.\n * Registers the panel DOM node with floating-ui.\n */\n setFloating: Dispatch<SetStateAction<HTMLDivElement | null>>;\n /**\n * Ref setter for the reference (trigger) element.\n * Registers the trigger DOM node with floating-ui for focus return.\n */\n setReference: Dispatch<SetStateAction<HTMLElement | null>>;\n /**\n * Sets the open state of the panel.\n * Called by the close button in SidePanelHeader, or any consumer that needs to close the panel.\n */\n setOpen: (open: boolean) => void;\n /**\n * Side panel id used for aria-controls on the trigger.\n */\n panelId?: string;\n /**\n * Registers or clears the side panel id used for aria-controls/id linkage.\n */\n setPanelId: Dispatch<SetStateAction<string | undefined>>;\n /**\n * The auto-generated id placed on SidePanelTitle.\n * Used for aria-labelledby on the panel region and the scrollable body.\n */\n titleId?: string;\n /**\n * Registers the title id from SidePanelTitle back to the context\n * so that SidePanel and SidePanelContent can use it for aria-labelledby.\n */\n setTitleId: Dispatch<SetStateAction<string | undefined>>;\n /**\n * Edge the panel is anchored to. Set by SidePanel for its own subtree.\n */\n position?: \"right\" | \"left\";\n}\n\nexport const SidePanelContext = createContext<SidePanelContextValue>(\n \"SidePanelContext\",\n {\n openState: false,\n floatingRootContext: {} as FloatingRootContext,\n setFloating: () => {},\n setReference: () => {},\n setOpen: () => {},\n panelId: undefined,\n setPanelId: () => {},\n titleId: undefined,\n setTitleId: () => {},\n position: undefined,\n },\n);\n\nexport function useSidePanelContext() {\n return useContext(SidePanelContext);\n}\n"],"names":[],"mappings":";;;;;;;;;AAqDO,MAAM,gBAAA,GAAmB,aAAA;AAAA,EAC9B,kBAAA;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,qBAAqB,EAAC;AAAA,IACtB,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,OAAA,EAAS,MAAA;AAAA,IACT,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA;AAEd;AAEO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAO,WAAW,gBAAgB,CAAA;AACpC;;;;"}
@@ -0,0 +1,48 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ const observedAttributes = ["class", "hidden", "style"];
4
+ function useIsScrollable(ref) {
5
+ const [isScrollable, setIsScrollable] = useState(false);
6
+ useEffect(() => {
7
+ const element = ref.current;
8
+ const win = element == null ? void 0 : element.ownerDocument.defaultView;
9
+ if (!element || !win) {
10
+ return;
11
+ }
12
+ let animationFrame;
13
+ const checkScrollable = () => {
14
+ animationFrame = void 0;
15
+ const nextIsScrollable = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
16
+ setIsScrollable(
17
+ (currentIsScrollable) => currentIsScrollable === nextIsScrollable ? currentIsScrollable : nextIsScrollable
18
+ );
19
+ };
20
+ const scheduleCheck = () => {
21
+ if (animationFrame === void 0) {
22
+ animationFrame = win.requestAnimationFrame(checkScrollable);
23
+ }
24
+ };
25
+ scheduleCheck();
26
+ const resizeObserver = win.ResizeObserver ? new win.ResizeObserver(scheduleCheck) : void 0;
27
+ resizeObserver == null ? void 0 : resizeObserver.observe(element);
28
+ const mutationObserver = win.MutationObserver ? new win.MutationObserver(scheduleCheck) : void 0;
29
+ mutationObserver == null ? void 0 : mutationObserver.observe(element, {
30
+ attributeFilter: observedAttributes,
31
+ attributes: true,
32
+ characterData: true,
33
+ childList: true,
34
+ subtree: true
35
+ });
36
+ return () => {
37
+ if (animationFrame !== void 0) {
38
+ win.cancelAnimationFrame(animationFrame);
39
+ }
40
+ resizeObserver == null ? void 0 : resizeObserver.disconnect();
41
+ mutationObserver == null ? void 0 : mutationObserver.disconnect();
42
+ };
43
+ }, [ref]);
44
+ return isScrollable;
45
+ }
46
+
47
+ export { useIsScrollable };
48
+ //# sourceMappingURL=useIsScrollable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsScrollable.js","sources":["../src/side-panel/internal/useIsScrollable.ts"],"sourcesContent":["import { type RefObject, useEffect, useState } from \"react\";\n\nconst observedAttributes = [\"class\", \"hidden\", \"style\"];\n\nexport function useIsScrollable(ref: RefObject<HTMLElement>) {\n const [isScrollable, setIsScrollable] = useState(false);\n\n useEffect(() => {\n const element = ref.current;\n const win = element?.ownerDocument.defaultView;\n if (!element || !win) {\n return;\n }\n\n let animationFrame: number | undefined;\n\n const checkScrollable = () => {\n animationFrame = undefined;\n const nextIsScrollable =\n element.scrollHeight > element.clientHeight ||\n element.scrollWidth > element.clientWidth;\n\n setIsScrollable((currentIsScrollable) =>\n currentIsScrollable === nextIsScrollable\n ? currentIsScrollable\n : nextIsScrollable,\n );\n };\n\n const scheduleCheck = () => {\n if (animationFrame === undefined) {\n animationFrame = win.requestAnimationFrame(checkScrollable);\n }\n };\n\n scheduleCheck();\n\n const resizeObserver = win.ResizeObserver\n ? new win.ResizeObserver(scheduleCheck)\n : undefined;\n resizeObserver?.observe(element);\n\n const mutationObserver = win.MutationObserver\n ? new win.MutationObserver(scheduleCheck)\n : undefined;\n mutationObserver?.observe(element, {\n attributeFilter: observedAttributes,\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n\n return () => {\n if (animationFrame !== undefined) {\n win.cancelAnimationFrame(animationFrame);\n }\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n };\n }, [ref]);\n\n return isScrollable;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAE/C,SAAS,gBAAgB,GAAA,EAA6B;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AAEtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,MAAM,GAAA,GAAM,mCAAS,aAAA,CAAc,WAAA;AACnC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,GAAA,EAAK;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA;AAEJ,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA,MAAM,mBACJ,OAAA,CAAQ,YAAA,GAAe,QAAQ,YAAA,IAC/B,OAAA,CAAQ,cAAc,OAAA,CAAQ,WAAA;AAEhC,MAAA,eAAA;AAAA,QAAgB,CAAC,mBAAA,KACf,mBAAA,KAAwB,gBAAA,GACpB,mBAAA,GACA;AAAA,OACN;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA,cAAA,GAAiB,GAAA,CAAI,sBAAsB,eAAe,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA;AAEA,IAAA,aAAA,EAAc;AAEd,IAAA,MAAM,iBAAiB,GAAA,CAAI,cAAA,GACvB,IAAI,GAAA,CAAI,cAAA,CAAe,aAAa,CAAA,GACpC,MAAA;AACJ,IAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,OAAA,CAAQ,OAAA,CAAA;AAExB,IAAA,MAAM,mBAAmB,GAAA,CAAI,gBAAA,GACzB,IAAI,GAAA,CAAI,gBAAA,CAAiB,aAAa,CAAA,GACtC,MAAA;AACJ,IAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,QAAQ,OAAA,EAAS;AAAA,MACjC,eAAA,EAAiB,kBAAA;AAAA,MACjB,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA,GAAA,CAAI,qBAAqB,cAAc,CAAA;AAAA,MACzC;AACA,MAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,UAAA,EAAA;AAChB,MAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,UAAA,EAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO,YAAA;AACT;;;;"}