@mattermost/compass-ui 0.1.0-alpha.3 → 0.1.0-alpha.5

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 (290) hide show
  1. package/dist/compass-ui-standalone.css +10 -0
  2. package/dist/compass-ui.css +2 -0
  3. package/dist/components/action-button/ActionButton.cjs +1 -1
  4. package/dist/components/action-button/ActionButton.cjs.map +1 -1
  5. package/dist/components/action-button/ActionButton.d.ts +2 -1
  6. package/dist/components/action-button/ActionButton.d.ts.map +1 -1
  7. package/dist/components/action-button/ActionButton.js +22 -12
  8. package/dist/components/action-button/ActionButton.js.map +1 -1
  9. package/dist/components/action-button/ActionButton.module.css +1 -1
  10. package/dist/components/action-button/ActionButton.module.scss.cjs +1 -1
  11. package/dist/components/action-button/ActionButton.module.scss.js +5 -5
  12. package/dist/components/admin-panel/AdminPanel.d.ts +1 -1
  13. package/dist/components/attachment-card/AttachmentCard.cjs +1 -1
  14. package/dist/components/attachment-card/AttachmentCard.cjs.map +1 -1
  15. package/dist/components/attachment-card/AttachmentCard.d.ts +3 -1
  16. package/dist/components/attachment-card/AttachmentCard.d.ts.map +1 -1
  17. package/dist/components/attachment-card/AttachmentCard.js +92 -82
  18. package/dist/components/attachment-card/AttachmentCard.js.map +1 -1
  19. package/dist/components/attachment-card/AttachmentCard.module.css +1 -1
  20. package/dist/components/attachment-card/AttachmentCard.module.scss.cjs +1 -1
  21. package/dist/components/attachment-card/AttachmentCard.module.scss.js +19 -18
  22. package/dist/components/attachment-card/AttachmentCard.module.scss.js.map +1 -1
  23. package/dist/components/button/Button.module.css +1 -1
  24. package/dist/components/button/Button.module.scss.cjs +1 -1
  25. package/dist/components/button/Button.module.scss.js +15 -15
  26. package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs +1 -1
  27. package/dist/components/channel-sidebar-item/ChannelSidebarItem.cjs.map +1 -1
  28. package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts +4 -1
  29. package/dist/components/channel-sidebar-item/ChannelSidebarItem.d.ts.map +1 -1
  30. package/dist/components/channel-sidebar-item/ChannelSidebarItem.js +112 -92
  31. package/dist/components/channel-sidebar-item/ChannelSidebarItem.js.map +1 -1
  32. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.css +1 -1
  33. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.cjs +1 -1
  34. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.js +22 -20
  35. package/dist/components/channel-sidebar-item/ChannelSidebarItem.module.scss.js.map +1 -1
  36. package/dist/components/channels-sidebar/channelsSidebarModel.d.ts +1 -1
  37. package/dist/components/checkbox/Checkbox.cjs +1 -1
  38. package/dist/components/checkbox/Checkbox.cjs.map +1 -1
  39. package/dist/components/checkbox/Checkbox.d.ts +3 -3
  40. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  41. package/dist/components/checkbox/Checkbox.js +21 -20
  42. package/dist/components/checkbox/Checkbox.js.map +1 -1
  43. package/dist/components/checkbox/Checkbox.module.css +1 -1
  44. package/dist/components/checkbox/Checkbox.module.scss.cjs +1 -1
  45. package/dist/components/checkbox/Checkbox.module.scss.js +7 -7
  46. package/dist/components/chip/Chip.cjs +1 -1
  47. package/dist/components/chip/Chip.cjs.map +1 -1
  48. package/dist/components/chip/Chip.d.ts +3 -5
  49. package/dist/components/chip/Chip.d.ts.map +1 -1
  50. package/dist/components/chip/Chip.js +90 -48
  51. package/dist/components/chip/Chip.js.map +1 -1
  52. package/dist/components/chip/Chip.module.css +1 -1
  53. package/dist/components/chip/Chip.module.scss.cjs +1 -1
  54. package/dist/components/chip/Chip.module.scss.js +9 -9
  55. package/dist/components/chip/ChipGroup.cjs +2 -0
  56. package/dist/components/chip/ChipGroup.cjs.map +1 -0
  57. package/dist/components/chip/ChipGroup.d.ts +16 -0
  58. package/dist/components/chip/ChipGroup.d.ts.map +1 -0
  59. package/dist/components/chip/ChipGroup.js +112 -0
  60. package/dist/components/chip/ChipGroup.js.map +1 -0
  61. package/dist/components/chip/ChipGroup.module.css +1 -0
  62. package/dist/components/chip/ChipGroup.module.scss.cjs +2 -0
  63. package/dist/components/chip/ChipGroup.module.scss.cjs.map +1 -0
  64. package/dist/components/chip/ChipGroup.module.scss.js +7 -0
  65. package/dist/components/chip/ChipGroup.module.scss.js.map +1 -0
  66. package/dist/components/chip/index.cjs +1 -1
  67. package/dist/components/chip/index.d.ts +2 -0
  68. package/dist/components/chip/index.d.ts.map +1 -1
  69. package/dist/components/chip/index.js +4 -2
  70. package/dist/components/chip/index.js.map +1 -1
  71. package/dist/components/combobox/Combobox.cjs +1 -1
  72. package/dist/components/combobox/Combobox.cjs.map +1 -1
  73. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  74. package/dist/components/combobox/Combobox.js +115 -109
  75. package/dist/components/combobox/Combobox.js.map +1 -1
  76. package/dist/components/combobox/Combobox.module.css +1 -1
  77. package/dist/components/combobox/Combobox.module.scss.cjs +1 -1
  78. package/dist/components/combobox/Combobox.module.scss.js +27 -29
  79. package/dist/components/date-range-picker/DateRangePicker.cjs +1 -1
  80. package/dist/components/date-range-picker/DateRangePicker.cjs.map +1 -1
  81. package/dist/components/date-range-picker/DateRangePicker.js +154 -154
  82. package/dist/components/date-range-picker/DateRangePicker.js.map +1 -1
  83. package/dist/components/date-range-picker/DateRangePicker.module.css +1 -1
  84. package/dist/components/date-range-picker/DateRangePicker.module.scss.cjs +1 -1
  85. package/dist/components/date-range-picker/DateRangePicker.module.scss.js +28 -45
  86. package/dist/components/dropdown/Dropdown.cjs +1 -1
  87. package/dist/components/dropdown/Dropdown.cjs.map +1 -1
  88. package/dist/components/dropdown/Dropdown.js +1 -1
  89. package/dist/components/dropdown/Dropdown.js.map +1 -1
  90. package/dist/components/dropdown/Dropdown.module.css +1 -1
  91. package/dist/components/dropdown/Dropdown.module.scss.cjs +1 -1
  92. package/dist/components/dropdown/Dropdown.module.scss.js +15 -16
  93. package/dist/components/empty-state/EmptyState.d.ts +2 -2
  94. package/dist/components/feature-discovery-panel/FeatureDiscoveryPanel.d.ts +2 -2
  95. package/dist/components/global-banner/GlobalBanner.module.css +1 -1
  96. package/dist/components/global-banner/GlobalBanner.module.scss.cjs +1 -1
  97. package/dist/components/global-banner/GlobalBanner.module.scss.js +10 -10
  98. package/dist/components/icon-button/IconButton.cjs +1 -1
  99. package/dist/components/icon-button/IconButton.cjs.map +1 -1
  100. package/dist/components/icon-button/IconButton.d.ts +1 -1
  101. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  102. package/dist/components/icon-button/IconButton.js +14 -14
  103. package/dist/components/icon-button/IconButton.js.map +1 -1
  104. package/dist/components/icon-button/IconButton.module.css +1 -1
  105. package/dist/components/icon-button/IconButton.module.scss.cjs +1 -1
  106. package/dist/components/icon-button/IconButton.module.scss.js +15 -15
  107. package/dist/components/image-preview/ImagePreview.cjs +1 -1
  108. package/dist/components/image-preview/ImagePreview.cjs.map +1 -1
  109. package/dist/components/image-preview/ImagePreview.d.ts +2 -1
  110. package/dist/components/image-preview/ImagePreview.d.ts.map +1 -1
  111. package/dist/components/image-preview/ImagePreview.js +70 -52
  112. package/dist/components/image-preview/ImagePreview.js.map +1 -1
  113. package/dist/components/image-preview/ImagePreview.module.css +1 -1
  114. package/dist/components/image-preview/ImagePreview.module.scss.cjs +1 -1
  115. package/dist/components/image-preview/ImagePreview.module.scss.js +15 -15
  116. package/dist/components/menu-item/MenuItem.cjs +1 -1
  117. package/dist/components/menu-item/MenuItem.cjs.map +1 -1
  118. package/dist/components/menu-item/MenuItem.js +11 -11
  119. package/dist/components/menu-item/MenuItem.js.map +1 -1
  120. package/dist/components/menu-item/MenuItem.module.css +1 -1
  121. package/dist/components/menu-item/MenuItem.module.scss.cjs +1 -1
  122. package/dist/components/menu-item/MenuItem.module.scss.js +16 -16
  123. package/dist/components/message/Message.d.ts +1 -1
  124. package/dist/components/message/Message.module.css +1 -1
  125. package/dist/components/message/Message.module.scss.cjs +1 -1
  126. package/dist/components/message/Message.module.scss.js +20 -20
  127. package/dist/components/message-reactions/MessageReactions.module.css +1 -1
  128. package/dist/components/message-reactions/MessageReactions.module.scss.cjs +1 -1
  129. package/dist/components/message-reactions/MessageReactions.module.scss.js +12 -12
  130. package/dist/components/modal/Modal.cjs +1 -1
  131. package/dist/components/modal/Modal.cjs.map +1 -1
  132. package/dist/components/modal/Modal.d.ts +9 -1
  133. package/dist/components/modal/Modal.d.ts.map +1 -1
  134. package/dist/components/modal/Modal.js +30 -20
  135. package/dist/components/modal/Modal.js.map +1 -1
  136. package/dist/components/modal/Modal.module.css +1 -1
  137. package/dist/components/modal/Modal.module.scss.cjs +1 -1
  138. package/dist/components/modal/Modal.module.scss.js +18 -17
  139. package/dist/components/modal/Modal.module.scss.js.map +1 -1
  140. package/dist/components/modal/index.d.ts +1 -1
  141. package/dist/components/modal/index.d.ts.map +1 -1
  142. package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.css +1 -1
  143. package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.scss.cjs +1 -1
  144. package/dist/components/more-unreads-banner/MoreUnreadsBanner.module.scss.js +5 -5
  145. package/dist/components/pagination-dots/PaginationDots.module.css +1 -1
  146. package/dist/components/pagination-dots/PaginationDots.module.scss.cjs +1 -1
  147. package/dist/components/pagination-dots/PaginationDots.module.scss.js +8 -8
  148. package/dist/components/radio/Radio.cjs +1 -1
  149. package/dist/components/radio/Radio.cjs.map +1 -1
  150. package/dist/components/radio/Radio.d.ts +3 -3
  151. package/dist/components/radio/Radio.d.ts.map +1 -1
  152. package/dist/components/radio/Radio.js +11 -11
  153. package/dist/components/radio/Radio.js.map +1 -1
  154. package/dist/components/radio/Radio.module.css +1 -1
  155. package/dist/components/radio/Radio.module.scss.cjs +1 -1
  156. package/dist/components/radio/Radio.module.scss.js +11 -11
  157. package/dist/components/right-sidebar/RightSidebarHeader/RightSidebarHeader.d.ts +1 -1
  158. package/dist/components/search-input/SearchInput.cjs +1 -1
  159. package/dist/components/search-input/SearchInput.cjs.map +1 -1
  160. package/dist/components/search-input/SearchInput.d.ts +2 -0
  161. package/dist/components/search-input/SearchInput.d.ts.map +1 -1
  162. package/dist/components/search-input/SearchInput.js +78 -64
  163. package/dist/components/search-input/SearchInput.js.map +1 -1
  164. package/dist/components/search-input/SearchInput.module.css +1 -1
  165. package/dist/components/search-input/SearchInput.module.scss.cjs +1 -1
  166. package/dist/components/search-input/SearchInput.module.scss.js +16 -23
  167. package/dist/components/search-input/SearchInput.module.scss.js.map +1 -1
  168. package/dist/components/select/Select.cjs +1 -1
  169. package/dist/components/select/Select.cjs.map +1 -1
  170. package/dist/components/select/Select.d.ts.map +1 -1
  171. package/dist/components/select/Select.js +64 -64
  172. package/dist/components/select/Select.js.map +1 -1
  173. package/dist/components/select/Select.module.css +1 -1
  174. package/dist/components/select/Select.module.scss.cjs +1 -1
  175. package/dist/components/select/Select.module.scss.js +24 -26
  176. package/dist/components/switch/Switch.cjs +1 -1
  177. package/dist/components/switch/Switch.cjs.map +1 -1
  178. package/dist/components/switch/Switch.d.ts.map +1 -1
  179. package/dist/components/switch/Switch.js +2 -2
  180. package/dist/components/switch/Switch.js.map +1 -1
  181. package/dist/components/switch/Switch.module.css +1 -1
  182. package/dist/components/switch/Switch.module.scss.cjs +1 -1
  183. package/dist/components/switch/Switch.module.scss.js +15 -15
  184. package/dist/components/tabs/Tabs.cjs +1 -1
  185. package/dist/components/tabs/Tabs.cjs.map +1 -1
  186. package/dist/components/tabs/Tabs.d.ts +4 -0
  187. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  188. package/dist/components/tabs/Tabs.js +47 -31
  189. package/dist/components/tabs/Tabs.js.map +1 -1
  190. package/dist/components/tabs/Tabs.module.css +1 -1
  191. package/dist/components/tabs/Tabs.module.scss.cjs +1 -1
  192. package/dist/components/tabs/Tabs.module.scss.js +8 -7
  193. package/dist/components/tabs/Tabs.module.scss.js.map +1 -1
  194. package/dist/components/tag/Tag.module.css +1 -1
  195. package/dist/components/tag/Tag.module.scss.cjs +1 -1
  196. package/dist/components/tag/Tag.module.scss.js +15 -15
  197. package/dist/components/text-area/TextArea.cjs +1 -1
  198. package/dist/components/text-area/TextArea.cjs.map +1 -1
  199. package/dist/components/text-area/TextArea.d.ts.map +1 -1
  200. package/dist/components/text-area/TextArea.js +57 -56
  201. package/dist/components/text-area/TextArea.js.map +1 -1
  202. package/dist/components/text-area/TextArea.module.css +1 -1
  203. package/dist/components/text-area/TextArea.module.scss.cjs +1 -1
  204. package/dist/components/text-area/TextArea.module.scss.js +12 -17
  205. package/dist/components/text-input/TextInput.cjs +1 -1
  206. package/dist/components/text-input/TextInput.cjs.map +1 -1
  207. package/dist/components/text-input/TextInput.d.ts.map +1 -1
  208. package/dist/components/text-input/TextInput.js +59 -58
  209. package/dist/components/text-input/TextInput.js.map +1 -1
  210. package/dist/components/text-input/TextInput.module.css +1 -1
  211. package/dist/components/text-input/TextInput.module.scss.cjs +1 -1
  212. package/dist/components/text-input/TextInput.module.scss.js +16 -24
  213. package/dist/components/thread-footer/ThreadFooter.cjs +1 -1
  214. package/dist/components/thread-footer/ThreadFooter.cjs.map +1 -1
  215. package/dist/components/thread-footer/ThreadFooter.d.ts +7 -8
  216. package/dist/components/thread-footer/ThreadFooter.d.ts.map +1 -1
  217. package/dist/components/thread-footer/ThreadFooter.js +59 -62
  218. package/dist/components/thread-footer/ThreadFooter.js.map +1 -1
  219. package/dist/components/thread-footer/ThreadFooter.module.css +1 -1
  220. package/dist/components/thread-footer/ThreadFooter.module.scss.cjs +1 -1
  221. package/dist/components/thread-footer/ThreadFooter.module.scss.js +17 -17
  222. package/dist/components/thread-footer/index.d.ts +7 -1
  223. package/dist/components/thread-footer/index.d.ts.map +1 -1
  224. package/dist/components/thread-list-item/ThreadListItem.cjs +1 -1
  225. package/dist/components/thread-list-item/ThreadListItem.cjs.map +1 -1
  226. package/dist/components/thread-list-item/ThreadListItem.d.ts +2 -2
  227. package/dist/components/thread-list-item/ThreadListItem.d.ts.map +1 -1
  228. package/dist/components/thread-list-item/ThreadListItem.js +102 -87
  229. package/dist/components/thread-list-item/ThreadListItem.js.map +1 -1
  230. package/dist/components/thread-list-item/ThreadListItem.module.css +1 -1
  231. package/dist/components/thread-list-item/ThreadListItem.module.scss.cjs +1 -1
  232. package/dist/components/thread-list-item/ThreadListItem.module.scss.js +26 -23
  233. package/dist/components/thread-list-item/ThreadListItem.module.scss.js.map +1 -1
  234. package/dist/components/thread-list-item/index.d.ts +1 -1
  235. package/dist/components/toast/Toast.module.css +1 -1
  236. package/dist/components/toast/Toast.module.scss.cjs +1 -1
  237. package/dist/components/toast/Toast.module.scss.js +6 -6
  238. package/dist/components/tour-point/TourPoint.module.css +1 -1
  239. package/dist/components/tour-point/TourPoint.module.scss.cjs +1 -1
  240. package/dist/components/tour-point/TourPoint.module.scss.js +28 -28
  241. package/dist/hooks/use-anchored-popup-portal.cjs +1 -1
  242. package/dist/hooks/use-anchored-popup-portal.cjs.map +1 -0
  243. package/dist/hooks/use-anchored-popup-portal.d.ts +1 -1
  244. package/dist/hooks/use-anchored-popup-portal.d.ts.map +1 -0
  245. package/dist/hooks/use-anchored-popup-portal.js +1 -1
  246. package/dist/hooks/use-anchored-popup-portal.js.map +1 -0
  247. package/dist/hooks/use-controllable.cjs +1 -1
  248. package/dist/hooks/use-controllable.cjs.map +1 -0
  249. package/dist/hooks/use-controllable.d.ts +1 -1
  250. package/dist/hooks/use-controllable.d.ts.map +1 -0
  251. package/dist/hooks/use-controllable.js +1 -1
  252. package/dist/hooks/{useControllable.cjs.map → use-controllable.js.map} +1 -1
  253. package/dist/hooks/use-exit-animation.cjs +1 -1
  254. package/dist/hooks/use-exit-animation.cjs.map +1 -0
  255. package/dist/hooks/use-exit-animation.d.ts +1 -1
  256. package/dist/hooks/use-exit-animation.d.ts.map +1 -0
  257. package/dist/hooks/use-exit-animation.js +1 -1
  258. package/dist/hooks/use-exit-animation.js.map +1 -0
  259. package/dist/hooks/use-outside-close.cjs +1 -1
  260. package/dist/hooks/use-outside-close.cjs.map +1 -0
  261. package/dist/hooks/use-outside-close.d.ts +1 -1
  262. package/dist/hooks/use-outside-close.d.ts.map +1 -0
  263. package/dist/hooks/use-outside-close.js +1 -1
  264. package/dist/hooks/use-outside-close.js.map +1 -0
  265. package/dist/hooks/use-popover-transition.cjs +1 -1
  266. package/dist/hooks/use-popover-transition.cjs.map +1 -0
  267. package/dist/hooks/use-popover-transition.d.ts +1 -1
  268. package/dist/hooks/use-popover-transition.d.ts.map +1 -0
  269. package/dist/hooks/use-popover-transition.js +1 -1
  270. package/dist/hooks/use-popover-transition.js.map +1 -0
  271. package/dist/index.cjs +1 -1
  272. package/dist/index.css +32 -30
  273. package/dist/index.d.ts +96 -96
  274. package/dist/index.js +156 -154
  275. package/dist/index.js.map +1 -1
  276. package/package.json +12 -12
  277. package/dist/hooks/useAnchoredPopupPortal.cjs.map +0 -1
  278. package/dist/hooks/useAnchoredPopupPortal.d.ts.map +0 -1
  279. package/dist/hooks/useAnchoredPopupPortal.js.map +0 -1
  280. package/dist/hooks/useControllable.d.ts.map +0 -1
  281. package/dist/hooks/useControllable.js.map +0 -1
  282. package/dist/hooks/useExitAnimation.cjs.map +0 -1
  283. package/dist/hooks/useExitAnimation.d.ts.map +0 -1
  284. package/dist/hooks/useExitAnimation.js.map +0 -1
  285. package/dist/hooks/useOutsideClose.cjs.map +0 -1
  286. package/dist/hooks/useOutsideClose.d.ts.map +0 -1
  287. package/dist/hooks/useOutsideClose.js.map +0 -1
  288. package/dist/hooks/usePopoverTransition.cjs.map +0 -1
  289. package/dist/hooks/usePopoverTransition.d.ts.map +0 -1
  290. package/dist/hooks/usePopoverTransition.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAnchoredPopupPortal.cjs","sources":["../../src/hooks/use-anchored-popup-portal.ts"],"sourcesContent":["import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n ANCHORED_POPUP_GAP,\n ANCHORED_POPUP_Z_INDEX,\n computeAnchoredPopupFixedStyle,\n computeAnchoredPopupPlacement,\n getAnchoredPopupContainerFrame,\n type PopupPlacement,\n} from '@/utils/anchoredPopupPlacement';\n\nexport interface UseAnchoredPopupPortalOptions {\n /** Height used for the flip decision when content isn’t measured yet. */\n preferredHeight: number;\n /** Cap for scrollable menus (Select/Combobox). Omit for intrinsic panels. */\n maxHeightCap?: number;\n /** Ref to the portaled panel for measuring intrinsic height (DateRangePicker). */\n contentRef?: RefObject<HTMLElement | null>;\n /**\n * Portal mount node; defaults to `document.body` with viewport-fixed coords.\n * Custom containers must establish a positioning context (`position` other\n * than `static`); coords are converted to that container’s space.\n */\n portalContainer?: HTMLElement | null;\n zIndex?: number;\n /**\n * When true (default), fixed width matches the trigger.\n * DateRangePicker sets false and keeps its CSS width.\n */\n matchWidth?: boolean;\n gap?: number;\n}\n\nexport interface UseAnchoredPopupPortalResult {\n placement: PopupPlacement;\n maxHeight: number;\n style: CSSProperties;\n /** Ref for the portaled surface — pass to `useOutsideClose` as a second root. */\n portalRef: RefObject<HTMLDivElement | null>;\n /** Wraps children in a portal to `portalContainer` or `document.body`. */\n renderPortal: (children: ReactNode) => ReactNode;\n}\n\nconst DEFAULT_PLACEMENT: PopupPlacement = 'below';\n\nfunction resolvePortalMount(\n portalContainer: HTMLElement | null | undefined,\n): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n return portalContainer ?? document.body;\n}\n\nfunction usesViewportFixedCoords(mount: HTMLElement): boolean {\n return mount === document.body;\n}\n\n/**\n * Positions a form-widget popup in a portal with viewport-aware above/below flip.\n * Internal to compass-ui form widgets — not a general overlay positioning API.\n */\nexport function useAnchoredPopupPortal(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n options: UseAnchoredPopupPortalOptions,\n): UseAnchoredPopupPortalResult {\n const {\n preferredHeight,\n maxHeightCap,\n contentRef,\n portalContainer = null,\n zIndex = ANCHORED_POPUP_Z_INDEX,\n matchWidth = true,\n gap = ANCHORED_POPUP_GAP,\n } = options;\n\n const portalRef = useRef<HTMLDivElement | null>(null);\n const [placement, setPlacement] = useState<PopupPlacement>(DEFAULT_PLACEMENT);\n const [maxHeight, setMaxHeight] = useState(\n maxHeightCap ?? preferredHeight,\n );\n const [style, setStyle] = useState<CSSProperties>({\n position: 'fixed',\n top: 0,\n left: 0,\n width: matchWidth ? 0 : undefined,\n zIndex,\n });\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const mount = resolvePortalMount(portalContainer);\n if (!mount) return;\n\n const rect = anchor.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportFixed = usesViewportFixedCoords(mount);\n const containerFrame = viewportFixed\n ? undefined\n : getAnchoredPopupContainerFrame(mount);\n\n const measured =\n contentRef?.current?.offsetHeight ??\n portalRef.current?.offsetHeight ??\n 0;\n const heightForFlip = measured > 0 ? measured : preferredHeight;\n\n const { placement: nextPlacement, maxHeight: nextMaxHeight } =\n computeAnchoredPopupPlacement(rect, viewportHeight, {\n gap,\n preferredHeight: heightForFlip,\n maxHeightCap,\n bounds: containerFrame?.bounds,\n });\n\n const fixed = computeAnchoredPopupFixedStyle(rect, nextPlacement, {\n gap,\n zIndex,\n width: matchWidth ? rect.width : undefined,\n viewportHeight,\n containerFrame,\n });\n\n setPlacement(nextPlacement);\n setMaxHeight(nextMaxHeight);\n setStyle({\n position: fixed.position,\n left: fixed.left,\n zIndex: fixed.zIndex,\n ...(matchWidth ? { width: fixed.width } : null),\n ...(nextPlacement === 'below'\n ? { top: fixed.top, bottom: 'auto' }\n : { bottom: fixed.bottom, top: 'auto' }),\n });\n }, [\n anchorRef,\n contentRef,\n gap,\n matchWidth,\n maxHeightCap,\n portalContainer,\n preferredHeight,\n zIndex,\n ]);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n update();\n\n function handle() {\n update();\n }\n\n window.addEventListener('resize', handle);\n // Capture phase so nested scroll containers (modals, RHS) are covered.\n document.addEventListener('scroll', handle, true);\n return () => {\n window.removeEventListener('resize', handle);\n document.removeEventListener('scroll', handle, true);\n };\n }, [isOpen, update]);\n\n // Re-measure after content mounts / changes size (calendar, long lists).\n useLayoutEffect(() => {\n if (!isOpen) return;\n const el = contentRef?.current ?? portalRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n\n const ro = new ResizeObserver(() => update());\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen, contentRef, update]);\n\n const renderPortal = useCallback(\n (children: ReactNode) => {\n const mount = resolvePortalMount(portalContainer);\n if (!mount) return null;\n return createPortal(children, mount);\n },\n [portalContainer],\n );\n\n return {\n placement,\n maxHeight,\n style,\n portalRef,\n renderPortal,\n };\n}\n"],"names":["DEFAULT_PLACEMENT","resolvePortalMount","portalContainer","usesViewportFixedCoords","mount","useAnchoredPopupPortal","anchorRef","isOpen","options","preferredHeight","maxHeightCap","contentRef","zIndex","ANCHORED_POPUP_Z_INDEX","matchWidth","gap","ANCHORED_POPUP_GAP","portalRef","useRef","placement","setPlacement","useState","maxHeight","setMaxHeight","style","setStyle","update","useCallback","anchor","rect","viewportHeight","containerFrame","getAnchoredPopupContainerFrame","measured","_a","_b","heightForFlip","nextPlacement","nextMaxHeight","computeAnchoredPopupPlacement","fixed","computeAnchoredPopupFixedStyle","useLayoutEffect","handle","el","ro","renderPortal","children","createPortal"],"mappings":"iLAmDMA,EAAoC,QAE1C,SAASC,EACPC,EACoB,CACpB,OAAI,OAAO,SAAa,IAAoB,KACrCA,GAAmB,SAAS,IACrC,CAEA,SAASC,EAAwBC,EAA6B,CAC5D,OAAOA,IAAU,SAAS,IAC5B,CAMO,SAASC,EACdC,EACAC,EACAC,EAC8B,CAC9B,KAAM,CACJ,gBAAAC,EACA,aAAAC,EACA,WAAAC,EACA,gBAAAT,EAAkB,KAClB,OAAAU,EAASC,EAAAA,uBACT,WAAAC,EAAa,GACb,IAAAC,EAAMC,EAAAA,kBAAA,EACJR,EAEES,EAAYC,EAAAA,OAA8B,IAAI,EAC9C,CAACC,EAAWC,CAAY,EAAIC,EAAAA,SAAyBrB,CAAiB,EACtE,CAACsB,EAAWC,CAAY,EAAIF,EAAAA,SAChCX,GAAgBD,CAAA,EAEZ,CAACe,EAAOC,CAAQ,EAAIJ,WAAwB,CAChD,SAAU,QACV,IAAK,EACL,KAAM,EACN,MAAOP,EAAa,EAAI,OACxB,OAAAF,CAAA,CACD,EAEKc,EAASC,EAAAA,YAAY,IAAM,SAC/B,MAAMC,EAAStB,EAAU,QACzB,GAAI,CAACsB,EAAQ,OAEb,MAAMxB,EAAQH,EAAmBC,CAAe,EAChD,GAAI,CAACE,EAAO,OAEZ,MAAMyB,EAAOD,EAAO,sBAAA,EACdE,EAAiB,OAAO,YAExBC,EADgB5B,EAAwBC,CAAK,EAE/C,OACA4B,EAAAA,+BAA+B5B,CAAK,EAElC6B,IACJC,EAAAvB,GAAA,YAAAA,EAAY,UAAZ,YAAAuB,EAAqB,iBACrBC,EAAAlB,EAAU,UAAV,YAAAkB,EAAmB,eACnB,EACIC,EAAgBH,EAAW,EAAIA,EAAWxB,EAE1C,CAAE,UAAW4B,EAAe,UAAWC,GAC3CC,EAAAA,8BAA8BV,EAAMC,EAAgB,CAClD,IAAAf,EACA,gBAAiBqB,EACjB,aAAA1B,EACA,OAAQqB,GAAA,YAAAA,EAAgB,MAAA,CACzB,EAEGS,EAAQC,EAAAA,+BAA+BZ,EAAMQ,EAAe,CAChE,IAAAtB,EACA,OAAAH,EACA,MAAOE,EAAae,EAAK,MAAQ,OACjC,eAAAC,EACA,eAAAC,CAAA,CACD,EAEDX,EAAaiB,CAAa,EAC1Bd,EAAae,CAAa,EAC1Bb,EAAS,CACP,SAAUe,EAAM,SAChB,KAAMA,EAAM,KACZ,OAAQA,EAAM,OACd,GAAI1B,EAAa,CAAE,MAAO0B,EAAM,OAAU,KAC1C,GAAIH,IAAkB,QAClB,CAAE,IAAKG,EAAM,IAAK,OAAQ,MAAA,EAC1B,CAAE,OAAQA,EAAM,OAAQ,IAAK,MAAA,CAAO,CACzC,CACH,EAAG,CACDlC,EACAK,EACAI,EACAD,EACAJ,EACAR,EACAO,EACAG,CAAA,CACD,EAED8B,EAAAA,gBAAgB,IAAM,CACpB,GAAI,CAACnC,EAAQ,OAEbmB,EAAA,EAEA,SAASiB,GAAS,CAChBjB,EAAA,CACF,CAEA,cAAO,iBAAiB,SAAUiB,CAAM,EAExC,SAAS,iBAAiB,SAAUA,EAAQ,EAAI,EACzC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAM,EAC3C,SAAS,oBAAoB,SAAUA,EAAQ,EAAI,CACrD,CACF,EAAG,CAACpC,EAAQmB,CAAM,CAAC,EAGnBgB,EAAAA,gBAAgB,IAAM,CACpB,GAAI,CAACnC,EAAQ,OACb,MAAMqC,GAAKjC,GAAA,YAAAA,EAAY,UAAWM,EAAU,QAC5C,GAAI,CAAC2B,GAAM,OAAO,eAAmB,IAAa,OAElD,MAAMC,EAAK,IAAI,eAAe,IAAMnB,GAAQ,EAC5C,OAAAmB,EAAG,QAAQD,CAAE,EACN,IAAMC,EAAG,WAAA,CAClB,EAAG,CAACtC,EAAQI,EAAYe,CAAM,CAAC,EAE/B,MAAMoB,EAAenB,EAAAA,YAClBoB,GAAwB,CACvB,MAAM3C,EAAQH,EAAmBC,CAAe,EAChD,OAAKE,EACE4C,EAAAA,aAAaD,EAAU3C,CAAK,EADhB,IAErB,EACA,CAACF,CAAe,CAAA,EAGlB,MAAO,CACL,UAAAiB,EACA,UAAAG,EACA,MAAAE,EACA,UAAAP,EACA,aAAA6B,CAAA,CAEJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAnchoredPopupPortal.d.ts","sourceRoot":"","sources":["../../src/hooks/use-anchored-popup-portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,UAAU,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC3C;;;;OAIG;IACH,eAAe,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,iFAAiF;IACjF,SAAS,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5C,0EAA0E;IAC1E,YAAY,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,SAAS,CAAC;CAClD;AAeD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,6BAA6B,GACrC,4BAA4B,CA+H9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAnchoredPopupPortal.js","sources":["../../src/hooks/use-anchored-popup-portal.ts"],"sourcesContent":["import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n ANCHORED_POPUP_GAP,\n ANCHORED_POPUP_Z_INDEX,\n computeAnchoredPopupFixedStyle,\n computeAnchoredPopupPlacement,\n getAnchoredPopupContainerFrame,\n type PopupPlacement,\n} from '@/utils/anchoredPopupPlacement';\n\nexport interface UseAnchoredPopupPortalOptions {\n /** Height used for the flip decision when content isn’t measured yet. */\n preferredHeight: number;\n /** Cap for scrollable menus (Select/Combobox). Omit for intrinsic panels. */\n maxHeightCap?: number;\n /** Ref to the portaled panel for measuring intrinsic height (DateRangePicker). */\n contentRef?: RefObject<HTMLElement | null>;\n /**\n * Portal mount node; defaults to `document.body` with viewport-fixed coords.\n * Custom containers must establish a positioning context (`position` other\n * than `static`); coords are converted to that container’s space.\n */\n portalContainer?: HTMLElement | null;\n zIndex?: number;\n /**\n * When true (default), fixed width matches the trigger.\n * DateRangePicker sets false and keeps its CSS width.\n */\n matchWidth?: boolean;\n gap?: number;\n}\n\nexport interface UseAnchoredPopupPortalResult {\n placement: PopupPlacement;\n maxHeight: number;\n style: CSSProperties;\n /** Ref for the portaled surface — pass to `useOutsideClose` as a second root. */\n portalRef: RefObject<HTMLDivElement | null>;\n /** Wraps children in a portal to `portalContainer` or `document.body`. */\n renderPortal: (children: ReactNode) => ReactNode;\n}\n\nconst DEFAULT_PLACEMENT: PopupPlacement = 'below';\n\nfunction resolvePortalMount(\n portalContainer: HTMLElement | null | undefined,\n): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n return portalContainer ?? document.body;\n}\n\nfunction usesViewportFixedCoords(mount: HTMLElement): boolean {\n return mount === document.body;\n}\n\n/**\n * Positions a form-widget popup in a portal with viewport-aware above/below flip.\n * Internal to compass-ui form widgets — not a general overlay positioning API.\n */\nexport function useAnchoredPopupPortal(\n anchorRef: RefObject<HTMLElement | null>,\n isOpen: boolean,\n options: UseAnchoredPopupPortalOptions,\n): UseAnchoredPopupPortalResult {\n const {\n preferredHeight,\n maxHeightCap,\n contentRef,\n portalContainer = null,\n zIndex = ANCHORED_POPUP_Z_INDEX,\n matchWidth = true,\n gap = ANCHORED_POPUP_GAP,\n } = options;\n\n const portalRef = useRef<HTMLDivElement | null>(null);\n const [placement, setPlacement] = useState<PopupPlacement>(DEFAULT_PLACEMENT);\n const [maxHeight, setMaxHeight] = useState(\n maxHeightCap ?? preferredHeight,\n );\n const [style, setStyle] = useState<CSSProperties>({\n position: 'fixed',\n top: 0,\n left: 0,\n width: matchWidth ? 0 : undefined,\n zIndex,\n });\n\n const update = useCallback(() => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n\n const mount = resolvePortalMount(portalContainer);\n if (!mount) return;\n\n const rect = anchor.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportFixed = usesViewportFixedCoords(mount);\n const containerFrame = viewportFixed\n ? undefined\n : getAnchoredPopupContainerFrame(mount);\n\n const measured =\n contentRef?.current?.offsetHeight ??\n portalRef.current?.offsetHeight ??\n 0;\n const heightForFlip = measured > 0 ? measured : preferredHeight;\n\n const { placement: nextPlacement, maxHeight: nextMaxHeight } =\n computeAnchoredPopupPlacement(rect, viewportHeight, {\n gap,\n preferredHeight: heightForFlip,\n maxHeightCap,\n bounds: containerFrame?.bounds,\n });\n\n const fixed = computeAnchoredPopupFixedStyle(rect, nextPlacement, {\n gap,\n zIndex,\n width: matchWidth ? rect.width : undefined,\n viewportHeight,\n containerFrame,\n });\n\n setPlacement(nextPlacement);\n setMaxHeight(nextMaxHeight);\n setStyle({\n position: fixed.position,\n left: fixed.left,\n zIndex: fixed.zIndex,\n ...(matchWidth ? { width: fixed.width } : null),\n ...(nextPlacement === 'below'\n ? { top: fixed.top, bottom: 'auto' }\n : { bottom: fixed.bottom, top: 'auto' }),\n });\n }, [\n anchorRef,\n contentRef,\n gap,\n matchWidth,\n maxHeightCap,\n portalContainer,\n preferredHeight,\n zIndex,\n ]);\n\n useLayoutEffect(() => {\n if (!isOpen) return;\n\n update();\n\n function handle() {\n update();\n }\n\n window.addEventListener('resize', handle);\n // Capture phase so nested scroll containers (modals, RHS) are covered.\n document.addEventListener('scroll', handle, true);\n return () => {\n window.removeEventListener('resize', handle);\n document.removeEventListener('scroll', handle, true);\n };\n }, [isOpen, update]);\n\n // Re-measure after content mounts / changes size (calendar, long lists).\n useLayoutEffect(() => {\n if (!isOpen) return;\n const el = contentRef?.current ?? portalRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n\n const ro = new ResizeObserver(() => update());\n ro.observe(el);\n return () => ro.disconnect();\n }, [isOpen, contentRef, update]);\n\n const renderPortal = useCallback(\n (children: ReactNode) => {\n const mount = resolvePortalMount(portalContainer);\n if (!mount) return null;\n return createPortal(children, mount);\n },\n [portalContainer],\n );\n\n return {\n placement,\n maxHeight,\n style,\n portalRef,\n renderPortal,\n };\n}\n"],"names":["DEFAULT_PLACEMENT","resolvePortalMount","portalContainer","usesViewportFixedCoords","mount","useAnchoredPopupPortal","anchorRef","isOpen","options","preferredHeight","maxHeightCap","contentRef","zIndex","ANCHORED_POPUP_Z_INDEX","matchWidth","gap","ANCHORED_POPUP_GAP","portalRef","useRef","placement","setPlacement","useState","maxHeight","setMaxHeight","style","setStyle","update","useCallback","anchor","rect","viewportHeight","containerFrame","getAnchoredPopupContainerFrame","measured","_a","_b","heightForFlip","nextPlacement","nextMaxHeight","computeAnchoredPopupPlacement","fixed","computeAnchoredPopupFixedStyle","useLayoutEffect","handle","el","ro","renderPortal","children","createPortal"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useControllable.d.ts","sourceRoot":"","sources":["../../src/hooks/use-controllable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGzC;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,OAAO,GAAG,SAAS,EAC/B,YAAY,EAAE,OAAO,GAAG,SAAS,EACjC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,GACpD,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,CAYvD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useControllable.js","sources":["../../src/hooks/use-controllable.ts"],"sourcesContent":["import type { ChangeEvent } from 'react';\nimport { useState } from 'react';\n\n/**\n * Handles the controlled/uncontrolled pattern for boolean inputs (checkbox, radio, switch).\n *\n * - If `controlled` is provided (not undefined), the component is controlled and the\n * caller owns the value. Changes are forwarded to `onChange` only.\n * - If `controlled` is undefined, the component manages its own state, initialised\n * from `defaultValue`.\n *\n * Returns `[value, handleChange]`.\n */\nexport function useControllable(\n controlled: boolean | undefined,\n defaultValue: boolean | undefined,\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void,\n): [boolean, (e: ChangeEvent<HTMLInputElement>) => void] {\n const isControlled = controlled !== undefined;\n const [uncontrolled, setUncontrolled] = useState(defaultValue ?? false);\n\n const value = isControlled ? controlled! : uncontrolled;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) setUncontrolled(e.target.checked);\n onChange?.(e);\n };\n\n return [value, handleChange];\n}\n"],"names":["useControllable","controlled","defaultValue","onChange","isControlled","uncontrolled","setUncontrolled","useState","e"],"mappings":";AAaO,SAASA,EACdC,GACAC,GACAC,GACuD;AACvD,QAAMC,IAAeH,MAAe,QAC9B,CAACI,GAAcC,CAAe,IAAIC,EAASL,KAAgB,EAAK;AAStE,SAAO,CAPOE,IAAeH,IAAcI,GAEtB,CAACG,MAAqC;AACzD,IAAKJ,KAAcE,EAAgBE,EAAE,OAAO,OAAO,GACnDL,KAAA,QAAAA,EAAWK;AAAA,EACb,CAE2B;AAC7B;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useExitAnimation.cjs","sources":["../../src/hooks/use-exit-animation.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Keeps a panel mounted through its exit animation. While `open` is true the\n * panel renders normally. When `open` flips false, the panel keeps rendering\n * for `durationMs` with `exiting: true` so an exit animation can play before\n * the DOM node is removed.\n */\nexport function useExitAnimation(open: boolean, durationMs: number) {\n const [rendered, setRendered] = useState(open);\n const [exiting, setExiting] = useState(false);\n\n useEffect(() => {\n if (open) {\n setRendered(true);\n setExiting(false);\n return;\n }\n if (!rendered) return;\n setExiting(true);\n const t = window.setTimeout(() => {\n setRendered(false);\n setExiting(false);\n }, durationMs);\n return () => window.clearTimeout(t);\n }, [open, rendered, durationMs]);\n\n return { rendered, exiting };\n}\n"],"names":["useExitAnimation","open","durationMs","rendered","setRendered","useState","exiting","setExiting","useEffect","t"],"mappings":"yGAQO,SAASA,EAAiBC,EAAeC,EAAoB,CAClE,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAASJ,CAAI,EACvC,CAACK,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EAE5CG,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIP,EAAM,CACRG,EAAY,EAAI,EAChBG,EAAW,EAAK,EAChB,MACF,CACA,GAAI,CAACJ,EAAU,OACfI,EAAW,EAAI,EACf,MAAME,EAAI,OAAO,WAAW,IAAM,CAChCL,EAAY,EAAK,EACjBG,EAAW,EAAK,CAClB,EAAGL,CAAU,EACb,MAAO,IAAM,OAAO,aAAaO,CAAC,CACpC,EAAG,CAACR,EAAME,EAAUD,CAAU,CAAC,EAExB,CAAE,SAAAC,EAAU,QAAAG,CAAA,CACrB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useExitAnimation.d.ts","sourceRoot":"","sources":["../../src/hooks/use-exit-animation.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;;;EAoBjE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useExitAnimation.js","sources":["../../src/hooks/use-exit-animation.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * Keeps a panel mounted through its exit animation. While `open` is true the\n * panel renders normally. When `open` flips false, the panel keeps rendering\n * for `durationMs` with `exiting: true` so an exit animation can play before\n * the DOM node is removed.\n */\nexport function useExitAnimation(open: boolean, durationMs: number) {\n const [rendered, setRendered] = useState(open);\n const [exiting, setExiting] = useState(false);\n\n useEffect(() => {\n if (open) {\n setRendered(true);\n setExiting(false);\n return;\n }\n if (!rendered) return;\n setExiting(true);\n const t = window.setTimeout(() => {\n setRendered(false);\n setExiting(false);\n }, durationMs);\n return () => window.clearTimeout(t);\n }, [open, rendered, durationMs]);\n\n return { rendered, exiting };\n}\n"],"names":["useExitAnimation","open","durationMs","rendered","setRendered","useState","exiting","setExiting","useEffect","t"],"mappings":";AAQO,SAASA,EAAiBC,GAAeC,GAAoB;AAClE,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAASJ,CAAI,GACvC,CAACK,GAASC,CAAU,IAAIF,EAAS,EAAK;AAE5C,SAAAG,EAAU,MAAM;AACd,QAAIP,GAAM;AACR,MAAAG,EAAY,EAAI,GAChBG,EAAW,EAAK;AAChB;AAAA,IACF;AACA,QAAI,CAACJ,EAAU;AACf,IAAAI,EAAW,EAAI;AACf,UAAME,IAAI,OAAO,WAAW,MAAM;AAChC,MAAAL,EAAY,EAAK,GACjBG,EAAW,EAAK;AAAA,IAClB,GAAGL,CAAU;AACb,WAAO,MAAM,OAAO,aAAaO,CAAC;AAAA,EACpC,GAAG,CAACR,GAAME,GAAUD,CAAU,CAAC,GAExB,EAAE,UAAAC,GAAU,SAAAG,EAAA;AACrB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useOutsideClose.cjs","sources":["../../src/hooks/use-outside-close.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\ntype MaybeRef = RefObject<HTMLElement | null>;\n\n/**\n * Closes a dropdown or popover when the user mousedowns outside the container(s).\n * Listeners attach only while `open` is true.\n *\n * Pass `portalRef` when the popup is portaled outside `ref` so menu clicks\n * still count as inside.\n *\n * @param ref - Primary container (e.g. field root).\n * @param open - When true, the listener is active.\n * @param onClose - Called when a mousedown lands outside all containers.\n * @param portalRef - Optional portaled surface to treat as inside.\n */\nexport function useOutsideClose(\n ref: MaybeRef,\n open: boolean,\n onClose: () => void,\n portalRef?: MaybeRef,\n): void {\n useEffect(() => {\n if (!open) return;\n function handle(e: MouseEvent) {\n const target = e.target as Node;\n if (ref.current?.contains(target)) return;\n if (portalRef?.current?.contains(target)) return;\n onClose();\n }\n document.addEventListener('mousedown', handle);\n return () => document.removeEventListener('mousedown', handle);\n }, [ref, portalRef, open, onClose]);\n}\n"],"names":["useOutsideClose","ref","open","onClose","portalRef","useEffect","handle","e","target","_a","_b"],"mappings":"yGAiBO,SAASA,EACdC,EACAC,EACAC,EACAC,EACM,CACNC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACH,EAAM,OACX,SAASI,EAAOC,EAAe,SAC7B,MAAMC,EAASD,EAAE,QACbE,EAAAR,EAAI,UAAJ,MAAAQ,EAAa,SAASD,KACtBE,EAAAN,GAAA,YAAAA,EAAW,UAAX,MAAAM,EAAoB,SAASF,IACjCL,EAAA,CACF,CACA,gBAAS,iBAAiB,YAAaG,CAAM,EACtC,IAAM,SAAS,oBAAoB,YAAaA,CAAM,CAC/D,EAAG,CAACL,EAAKG,EAAWF,EAAMC,CAAO,CAAC,CACpC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useOutsideClose.d.ts","sourceRoot":"","sources":["../../src/hooks/use-outside-close.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,KAAK,QAAQ,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,IAAI,EACnB,SAAS,CAAC,EAAE,QAAQ,GACnB,IAAI,CAYN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useOutsideClose.js","sources":["../../src/hooks/use-outside-close.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\ntype MaybeRef = RefObject<HTMLElement | null>;\n\n/**\n * Closes a dropdown or popover when the user mousedowns outside the container(s).\n * Listeners attach only while `open` is true.\n *\n * Pass `portalRef` when the popup is portaled outside `ref` so menu clicks\n * still count as inside.\n *\n * @param ref - Primary container (e.g. field root).\n * @param open - When true, the listener is active.\n * @param onClose - Called when a mousedown lands outside all containers.\n * @param portalRef - Optional portaled surface to treat as inside.\n */\nexport function useOutsideClose(\n ref: MaybeRef,\n open: boolean,\n onClose: () => void,\n portalRef?: MaybeRef,\n): void {\n useEffect(() => {\n if (!open) return;\n function handle(e: MouseEvent) {\n const target = e.target as Node;\n if (ref.current?.contains(target)) return;\n if (portalRef?.current?.contains(target)) return;\n onClose();\n }\n document.addEventListener('mousedown', handle);\n return () => document.removeEventListener('mousedown', handle);\n }, [ref, portalRef, open, onClose]);\n}\n"],"names":["useOutsideClose","ref","open","onClose","portalRef","useEffect","handle","e","target","_a","_b"],"mappings":";AAiBO,SAASA,EACdC,GACAC,GACAC,GACAC,GACM;AACN,EAAAC,EAAU,MAAM;AACd,QAAI,CAACH,EAAM;AACX,aAASI,EAAOC,GAAe;;AAC7B,YAAMC,IAASD,EAAE;AACjB,OAAIE,IAAAR,EAAI,YAAJ,QAAAQ,EAAa,SAASD,OACtBE,IAAAN,KAAA,gBAAAA,EAAW,YAAX,QAAAM,EAAoB,SAASF,MACjCL,EAAA;AAAA,IACF;AACA,oBAAS,iBAAiB,aAAaG,CAAM,GACtC,MAAM,SAAS,oBAAoB,aAAaA,CAAM;AAAA,EAC/D,GAAG,CAACL,GAAKG,GAAWF,GAAMC,CAAO,CAAC;AACpC;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"usePopoverTransition.cjs","sources":["../../src/hooks/use-popover-transition.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n// --duration-quick is 150ms; keep in sync if that token changes.\nexport const POPOVER_TRANSITION_MS = 150;\n\n/**\n * Keeps a popover mounted for the duration of its exit animation so the close\n * transition can play before React unmounts the node. See CLAUDE.md:\n * \"Animation: popover panel open/close\".\n */\nexport function usePopoverTransition(open: boolean) {\n const [mounted, setMounted] = useState(open);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setVisible(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), POPOVER_TRANSITION_MS);\n return () => window.clearTimeout(t);\n }, [open]);\n\n return { mounted, visible };\n}\n"],"names":["POPOVER_TRANSITION_MS","usePopoverTransition","open","mounted","setMounted","useState","visible","setVisible","useEffect","raf2","raf1","t"],"mappings":"yGAGaA,EAAwB,IAO9B,SAASC,EAAqBC,EAAe,CAClD,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAASH,CAAI,EACrC,CAACI,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EAE5CG,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAIN,EAAM,CACRE,EAAW,EAAI,EACf,IAAIK,EAAO,EACX,MAAMC,EAAO,sBAAsB,IAAM,CACvCD,EAAO,sBAAsB,IAAMF,EAAW,EAAI,CAAC,CACrD,CAAC,EACD,MAAO,IAAM,CACX,qBAAqBG,CAAI,EACrBD,wBAA2BA,CAAI,CACrC,CACF,CACAF,EAAW,EAAK,EAChB,MAAMI,EAAI,OAAO,WAAW,IAAMP,EAAW,EAAK,EAAGJ,CAAqB,EAC1E,MAAO,IAAM,OAAO,aAAaW,CAAC,CACpC,EAAG,CAACT,CAAI,CAAC,EAEF,CAAE,QAAAC,EAAS,QAAAG,CAAA,CACpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"usePopoverTransition.d.ts","sourceRoot":"","sources":["../../src/hooks/use-popover-transition.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO;;;EAsBjD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"usePopoverTransition.js","sources":["../../src/hooks/use-popover-transition.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\n// --duration-quick is 150ms; keep in sync if that token changes.\nexport const POPOVER_TRANSITION_MS = 150;\n\n/**\n * Keeps a popover mounted for the duration of its exit animation so the close\n * transition can play before React unmounts the node. See CLAUDE.md:\n * \"Animation: popover panel open/close\".\n */\nexport function usePopoverTransition(open: boolean) {\n const [mounted, setMounted] = useState(open);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setVisible(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }\n setVisible(false);\n const t = window.setTimeout(() => setMounted(false), POPOVER_TRANSITION_MS);\n return () => window.clearTimeout(t);\n }, [open]);\n\n return { mounted, visible };\n}\n"],"names":["POPOVER_TRANSITION_MS","usePopoverTransition","open","mounted","setMounted","useState","visible","setVisible","useEffect","raf2","raf1","t"],"mappings":";AAGO,MAAMA,IAAwB;AAO9B,SAASC,EAAqBC,GAAe;AAClD,QAAM,CAACC,GAASC,CAAU,IAAIC,EAASH,CAAI,GACrC,CAACI,GAASC,CAAU,IAAIF,EAAS,EAAK;AAE5C,SAAAG,EAAU,MAAM;AACd,QAAIN,GAAM;AACR,MAAAE,EAAW,EAAI;AACf,UAAIK,IAAO;AACX,YAAMC,IAAO,sBAAsB,MAAM;AACvC,QAAAD,IAAO,sBAAsB,MAAMF,EAAW,EAAI,CAAC;AAAA,MACrD,CAAC;AACD,aAAO,MAAM;AACX,6BAAqBG,CAAI,GACrBD,0BAA2BA,CAAI;AAAA,MACrC;AAAA,IACF;AACA,IAAAF,EAAW,EAAK;AAChB,UAAMI,IAAI,OAAO,WAAW,MAAMP,EAAW,EAAK,GAAGJ,CAAqB;AAC1E,WAAO,MAAM,OAAO,aAAaW,CAAC;AAAA,EACpC,GAAG,CAACT,CAAI,CAAC,GAEF,EAAE,SAAAC,GAAS,SAAAG,EAAA;AACpB;"}