@persona/design-system 0.3.0 → 0.4.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 (507) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +3 -3
  3. package/dist/{Action-CnNf5T-l.d.mts → Action-CcAyQpYN.d.mts} +3 -3
  4. package/dist/Action.d.mts +1 -1
  5. package/dist/AdvancedFilterRuleRow.d.mts +5 -5
  6. package/dist/AdvancedFilterRulesPopover.d.mts +4 -4
  7. package/dist/ArrayValueControl.d.mts +1 -1
  8. package/dist/Attribute.d.mts +5 -5
  9. package/dist/AttributeGrid.d.mts +1 -1
  10. package/dist/{Badge-BqS6Nk4J.mjs → Badge-BL0J5oMa.mjs} +3 -3
  11. package/dist/{Badge-BqS6Nk4J.mjs.map → Badge-BL0J5oMa.mjs.map} +1 -1
  12. package/dist/Banner.d.mts +1 -1
  13. package/dist/BooleanValueControl.d.mts +1 -1
  14. package/dist/BottomPanel.d.mts +32 -0
  15. package/dist/{Breadcrumb-DEwZFJHF.d.mts → Breadcrumb-Df06cTnA.d.mts} +1 -1
  16. package/dist/Breadcrumb.d.mts +1 -1
  17. package/dist/{Breadcrumbs-0e_3v9FF.d.mts → Breadcrumbs-D_Gzd4_J.d.mts} +2 -2
  18. package/dist/{Breadcrumbs-CqKtnZqu.mjs → Breadcrumbs-Zi5p0HDR.mjs} +12 -12
  19. package/dist/{Breadcrumbs-CqKtnZqu.mjs.map → Breadcrumbs-Zi5p0HDR.mjs.map} +1 -1
  20. package/dist/Breadcrumbs.d.mts +1 -1
  21. package/dist/{Button-C0F0F2IL.d.mts → Button-BrI1s2-r.d.mts} +4 -4
  22. package/dist/Button.d.mts +1 -1
  23. package/dist/ButtonGroup.d.mts +1 -1
  24. package/dist/{Calendar-BvLNcHQM.d.mts → Calendar-DjnoZVcT.d.mts} +2 -2
  25. package/dist/Calendar.d.mts +1 -1
  26. package/dist/CalendarBase.d.mts +1 -1
  27. package/dist/{Card-BMCB9eFC.mjs → Card-CKrJtn1f.mjs} +4 -4
  28. package/dist/{Card-BMCB9eFC.mjs.map → Card-CKrJtn1f.mjs.map} +1 -1
  29. package/dist/{Card-BxNoIQWw.d.mts → Card-mZDNFaJy.d.mts} +4 -4
  30. package/dist/Card.d.mts +1 -1
  31. package/dist/Card2.d.mts +3 -3
  32. package/dist/{CardV2-B0ZweQYk.mjs → CardV2-CXxzl1EZ.mjs} +20 -20
  33. package/dist/{CardV2-B0ZweQYk.mjs.map → CardV2-CXxzl1EZ.mjs.map} +1 -1
  34. package/dist/{Checkbox-Bm8exUfH.d.mts → Checkbox-CwPXPLCi.d.mts} +1 -1
  35. package/dist/{Checkbox-DAvbgZgO.mjs → Checkbox-DxNHp59y.mjs} +8 -8
  36. package/dist/{Checkbox-DAvbgZgO.mjs.map → Checkbox-DxNHp59y.mjs.map} +1 -1
  37. package/dist/Checkbox.d.mts +1 -1
  38. package/dist/CheckboxGroupField.d.mts +2 -2
  39. package/dist/ChoicesValueControl.d.mts +1 -1
  40. package/dist/{Combobox-xBrxiUAu.mjs → Combobox-BUtqtzKl.mjs} +22 -22
  41. package/dist/Combobox-BUtqtzKl.mjs.map +1 -0
  42. package/dist/{Combobox-C8ue0cBP.d.mts → Combobox-C9QBItsc.d.mts} +3 -3
  43. package/dist/Combobox.d.mts +2 -2
  44. package/dist/{ComboboxBase-DJGTMf1_.d.mts → ComboboxBase-BkSpdmsT.d.mts} +8 -8
  45. package/dist/ComboboxBase.d.mts +1 -1
  46. package/dist/{ComboboxMultiSelect-D7A2bbWU.d.mts → ComboboxMultiSelect-DkVfwSKH.d.mts} +2 -2
  47. package/dist/ComboboxMultiSelect.d.mts +1 -1
  48. package/dist/{ComboboxSingleSelect-D1uzEyKj.d.mts → ComboboxSingleSelect-CpumBcDn.d.mts} +4 -4
  49. package/dist/ComboboxSingleSelect.d.mts +1 -1
  50. package/dist/{CompactBar-DMuvqaV5.d.mts → CompactBar-COxu_FDd.d.mts} +3 -3
  51. package/dist/CompactBar.d.mts +1 -1
  52. package/dist/{ConfigFormGroup-D2_sajXe.mjs → ConfigFormGroup-aSdn2r6Z.mjs} +4 -4
  53. package/dist/{ConfigFormGroup-D2_sajXe.mjs.map → ConfigFormGroup-aSdn2r6Z.mjs.map} +1 -1
  54. package/dist/{ControlBar-Dg8JeU8f.d.mts → ControlBar-DwAhPcb5.d.mts} +12 -2
  55. package/dist/ControlBar.d.mts +1 -1
  56. package/dist/DataTable.d.mts +5 -4
  57. package/dist/{DateField-Com9f2-j.d.mts → DateField-tOyrGcx1.d.mts} +2 -2
  58. package/dist/DateField.d.mts +1 -1
  59. package/dist/{DatePicker-BGO6doLx.d.mts → DatePicker-Bs9JODNg.d.mts} +2 -2
  60. package/dist/{DatePicker-BlnE2MBD.mjs → DatePicker-CLP-ajza.mjs} +95 -23
  61. package/dist/DatePicker-CLP-ajza.mjs.map +1 -0
  62. package/dist/DatePicker.d.mts +1 -1
  63. package/dist/{DateRangePicker-DfRBm9z4.d.mts → DateRangePicker-BT6-j8V7.d.mts} +24 -4
  64. package/dist/DateRangePicker.d.mts +2 -2
  65. package/dist/DateRangeValueControl.d.mts +8 -4
  66. package/dist/DateValueControl.d.mts +1 -1
  67. package/dist/{DropdownButton-CpWNRUma.mjs → DropdownButton-CCAfNZ9h.mjs} +3 -3
  68. package/dist/{DropdownButton-CpWNRUma.mjs.map → DropdownButton-CCAfNZ9h.mjs.map} +1 -1
  69. package/dist/DropdownButton.d.mts +2 -2
  70. package/dist/{DropdownMenu-CnaK78rP.d.mts → DropdownMenu-BoatixlO.d.mts} +3 -3
  71. package/dist/{DropdownMenu-BCyV8nC0.mjs → DropdownMenu-CUnf420M.mjs} +4 -4
  72. package/dist/{DropdownMenu-BCyV8nC0.mjs.map → DropdownMenu-CUnf420M.mjs.map} +1 -1
  73. package/dist/DropdownMenu.d.mts +1 -1
  74. package/dist/{ErrorProps-CN2XjaOX.d.mts → ErrorProps-C9T857Wk.d.mts} +1 -1
  75. package/dist/ErrorProps.d.mts +1 -1
  76. package/dist/{FieldRegistry-DdA63Vnh.d.mts → FieldRegistry-D6niLExM.d.mts} +2 -2
  77. package/dist/FieldRegistry.d.mts +1 -1
  78. package/dist/{FilterBar-CxNsBVrn.d.mts → FilterBar-DfBV7yKM.d.mts} +10 -4
  79. package/dist/FilterBar.d.mts +1 -1
  80. package/dist/FilterPickerMenu.d.mts +3 -3
  81. package/dist/FilterPill.d.mts +1 -1
  82. package/dist/FilterPopover.d.mts +2 -2
  83. package/dist/FloatValueControl.d.mts +1 -1
  84. package/dist/FloatingPanel.d.mts +1 -1
  85. package/dist/FloatingPanelContext.d.mts +1 -1
  86. package/dist/{FormControl-Doj2gvF0.d.mts → FormControl-0H0Jeind.d.mts} +4 -4
  87. package/dist/{FormControl-HVzZEqJH.mjs → FormControl-1BmoYFCu.mjs} +6 -6
  88. package/dist/{FormControl-HVzZEqJH.mjs.map → FormControl-1BmoYFCu.mjs.map} +1 -1
  89. package/dist/FormControl.d.mts +1 -1
  90. package/dist/FormControlLabel.d.mts +2 -2
  91. package/dist/{FormField-D8dHbqZZ.d.mts → FormField-BcaFdmo5.d.mts} +2 -2
  92. package/dist/{FormField-B9P3BWvS.mjs → FormField-oBKH25qf.mjs} +22 -22
  93. package/dist/FormField-oBKH25qf.mjs.map +1 -0
  94. package/dist/FormField.d.mts +1 -1
  95. package/dist/Grid.d.mts +38 -0
  96. package/dist/GridItem.d.mts +17 -0
  97. package/dist/{Header-CBlB65NY.d.mts → Header-BjSoTEX_.d.mts} +2 -2
  98. package/dist/Header.d.mts +1 -1
  99. package/dist/{HelperTooltip-C28h1zFl.d.mts → HelperTooltip-S20wVFCS.d.mts} +3 -3
  100. package/dist/HelperTooltip.d.mts +1 -1
  101. package/dist/{HoverCopyableField-0Bzygbp9.mjs → HoverCopyableField-GMXeF-3J.mjs} +31 -20
  102. package/dist/HoverCopyableField-GMXeF-3J.mjs.map +1 -0
  103. package/dist/HoverCopyableField.d.mts +15 -4
  104. package/dist/{IconButton-BfDlic2K.mjs → IconButton-BgL3QUVO.mjs} +9 -9
  105. package/dist/{IconButton-BfDlic2K.mjs.map → IconButton-BgL3QUVO.mjs.map} +1 -1
  106. package/dist/{IconButton-CBcW7ZU8.d.mts → IconButton-BpyOr8Ev.d.mts} +2 -2
  107. package/dist/IconButton.d.mts +1 -1
  108. package/dist/ImageTile.d.mts +2 -2
  109. package/dist/InlineCombobox.d.mts +2 -2
  110. package/dist/InlineInput.d.mts +1 -1
  111. package/dist/{Input-Bimw8KFj.mjs → Input-BWlvBYB3.mjs} +6 -6
  112. package/dist/{Input-Bimw8KFj.mjs.map → Input-BWlvBYB3.mjs.map} +1 -1
  113. package/dist/{Input-CVdjkX88.d.mts → Input-qlQVD5h0.d.mts} +5 -5
  114. package/dist/Input.d.mts +1 -1
  115. package/dist/{InputProps-BwKkmImn.d.mts → InputProps-D_7MnQfE.d.mts} +2 -2
  116. package/dist/InputProps.d.mts +1 -1
  117. package/dist/IntegerValueControl.d.mts +1 -1
  118. package/dist/LayoutLoadingSpinner.d.mts +11 -0
  119. package/dist/Link.d.mts +3 -3
  120. package/dist/{ListBox-DKZpGYjo.mjs → ListBox-9jHHEaqW.mjs} +15 -15
  121. package/dist/{ListBox-DKZpGYjo.mjs.map → ListBox-9jHHEaqW.mjs.map} +1 -1
  122. package/dist/{ListBox-CDl5oZPX.d.mts → ListBox-ZE3MYMt6.d.mts} +5 -5
  123. package/dist/ListBox.d.mts +1 -1
  124. package/dist/ListBoxField.d.mts +3 -3
  125. package/dist/{LoadingShimmer-DC2vqicd.mjs → LoadingShimmer-a2Hv0kAq.mjs} +2 -2
  126. package/dist/{LoadingShimmer-DC2vqicd.mjs.map → LoadingShimmer-a2Hv0kAq.mjs.map} +1 -1
  127. package/dist/LoadingShimmer.d.mts +2 -2
  128. package/dist/{LogicRow-CkbyvrUw.d.mts → LogicRow-CbMmaWXU.d.mts} +4 -4
  129. package/dist/LogicRow.d.mts +1 -1
  130. package/dist/MaskedInput.d.mts +2 -2
  131. package/dist/MatchHighlight.d.mts +1 -1
  132. package/dist/{Menu-Dir03WA9.mjs → Menu-38UCGcte.mjs} +6 -6
  133. package/dist/{Menu-Dir03WA9.mjs.map → Menu-38UCGcte.mjs.map} +1 -1
  134. package/dist/{Menu-CYRdEnfo.d.mts → Menu-ZShdhNd7.d.mts} +4 -4
  135. package/dist/Menu.d.mts +1 -1
  136. package/dist/{MiddleTruncatedText-GXI-CPvs.mjs → MiddleTruncatedText-DnF7F_1D.mjs} +4 -4
  137. package/dist/{MiddleTruncatedText-GXI-CPvs.mjs.map → MiddleTruncatedText-DnF7F_1D.mjs.map} +1 -1
  138. package/dist/Modal.d.mts +4 -5
  139. package/dist/{PageHeader-C2IUKhCg.mjs → PageHeader-B2-Slzhl.mjs} +4 -4
  140. package/dist/{PageHeader-C2IUKhCg.mjs.map → PageHeader-B2-Slzhl.mjs.map} +1 -1
  141. package/dist/PageHeader.d.mts +2 -2
  142. package/dist/PageLayout.d.mts +1 -1
  143. package/dist/{PageSelector-vay4jpMp.d.mts → PageSelector-BcZx4nqe.d.mts} +3 -3
  144. package/dist/PageSelector.d.mts +1 -1
  145. package/dist/{Pagination-0VhVdXv0.mjs → Pagination-CtUz0gdA.mjs} +8 -8
  146. package/dist/{Pagination-0VhVdXv0.mjs.map → Pagination-CtUz0gdA.mjs.map} +1 -1
  147. package/dist/{Pagination-ygLutOst.d.mts → Pagination-j4hF7GOk.d.mts} +2 -2
  148. package/dist/Pagination.d.mts +1 -1
  149. package/dist/{Pii-C7pA72Bh.mjs → Pii-RwKn-K84.mjs} +2 -2
  150. package/dist/{Pii-C7pA72Bh.mjs.map → Pii-RwKn-K84.mjs.map} +1 -1
  151. package/dist/Pii.d.mts +1 -1
  152. package/dist/PillShell.d.mts +1 -1
  153. package/dist/{Popover-BkDpDdaO.mjs → Popover-DlXyKYL5.mjs} +6 -6
  154. package/dist/{Popover-BkDpDdaO.mjs.map → Popover-DlXyKYL5.mjs.map} +1 -1
  155. package/dist/Popover.d.mts +1 -1
  156. package/dist/ProgressBar.d.mts +1 -1
  157. package/dist/ProgressIndicator.d.mts +6 -4
  158. package/dist/{PseudoClassProps-CcSlKNev.d.mts → PseudoClassProps-BPdn-ofQ.d.mts} +1 -1
  159. package/dist/PseudoClassProps.d.mts +1 -1
  160. package/dist/{Radio-BaFutxgV.mjs → Radio-cLL9oatf.mjs} +5 -5
  161. package/dist/{Radio-BaFutxgV.mjs.map → Radio-cLL9oatf.mjs.map} +1 -1
  162. package/dist/{RadioGroup-ClMzOZl0.mjs → RadioGroup-BGo_kXKh.mjs} +4 -4
  163. package/dist/{RadioGroup-ClMzOZl0.mjs.map → RadioGroup-BGo_kXKh.mjs.map} +1 -1
  164. package/dist/{RadioGroup-BuJaitgG.d.mts → RadioGroup-BqULCH-D.d.mts} +1 -1
  165. package/dist/RadioGroup.d.mts +1 -1
  166. package/dist/RangeCalendar.d.mts +6 -1
  167. package/dist/RangeCalendarPresets.d.mts +13 -3
  168. package/dist/ResizableVerticalPanel.d.mts +22 -0
  169. package/dist/ResizeHandle.d.mts +19 -0
  170. package/dist/RightPanel.d.mts +41 -0
  171. package/dist/RightPanelLoadingContent.d.mts +7 -0
  172. package/dist/RightPanelResizeHandle.d.mts +14 -0
  173. package/dist/RuleEditorFields.d.mts +5 -5
  174. package/dist/RulesPill.d.mts +1 -1
  175. package/dist/{SearchInput-Ca3_np5e.d.mts → SearchInput-Dc90GLTF.d.mts} +3 -3
  176. package/dist/SearchInput.d.mts +1 -1
  177. package/dist/SectionHeading.d.mts +1 -1
  178. package/dist/{SegmentedControl-DgyJL4uN.mjs → SegmentedControl-CvWJGhwy.mjs} +5 -5
  179. package/dist/{SegmentedControl-DgyJL4uN.mjs.map → SegmentedControl-CvWJGhwy.mjs.map} +1 -1
  180. package/dist/{SegmentedControl-_I4sWeD7.d.mts → SegmentedControl-Db78Pzo_.d.mts} +2 -2
  181. package/dist/SegmentedControl.d.mts +1 -1
  182. package/dist/{Select-D6MqSYVa.mjs → Select-U_vQhK1A.mjs} +12 -13
  183. package/dist/Select-U_vQhK1A.mjs.map +1 -0
  184. package/dist/{Select-vwXGlHuW.d.mts → Select-bafAe2wd.d.mts} +4 -4
  185. package/dist/Select.d.mts +1 -1
  186. package/dist/Slider.d.mts +1 -1
  187. package/dist/SliderRHF.d.mts +1 -1
  188. package/dist/SliderThumb.d.mts +1 -1
  189. package/dist/{Spacer-CJp0lwkL.mjs → Spacer-BsK8tTwA.mjs} +2 -2
  190. package/dist/{Spacer-CJp0lwkL.mjs.map → Spacer-BsK8tTwA.mjs.map} +1 -1
  191. package/dist/{Spinner-BgBCCHGo.mjs → Spinner-BTyc6glU.mjs} +3 -3
  192. package/dist/{Spinner-BgBCCHGo.mjs.map → Spinner-BTyc6glU.mjs.map} +1 -1
  193. package/dist/{Stack-Bl54WmhY.mjs → Stack-Bre2oiov.mjs} +2 -2
  194. package/dist/{Stack-Bl54WmhY.mjs.map → Stack-Bre2oiov.mjs.map} +1 -1
  195. package/dist/{Stack-CkV7k7TE.d.mts → Stack-_JcvIE31.d.mts} +2 -2
  196. package/dist/Stack.d.mts +1 -1
  197. package/dist/StatusIndicator.d.mts +1 -1
  198. package/dist/{Sticker-xtDMuOoN.mjs → Sticker-CQ6sOKUj.mjs} +6 -6
  199. package/dist/{Sticker-xtDMuOoN.mjs.map → Sticker-CQ6sOKUj.mjs.map} +1 -1
  200. package/dist/{Sticker-Dhx2wqTL.d.mts → Sticker-OKVOQt_C.d.mts} +6 -6
  201. package/dist/Sticker.d.mts +1 -1
  202. package/dist/StringValueControl.d.mts +1 -1
  203. package/dist/SwatchPicker.d.mts +1 -1
  204. package/dist/Tab.d.mts +3 -3
  205. package/dist/{TabBar-D6UocZXi.mjs → TabBar-B5NtgtgC.mjs} +7 -7
  206. package/dist/{TabBar-D6UocZXi.mjs.map → TabBar-B5NtgtgC.mjs.map} +1 -1
  207. package/dist/TabBarIconButton.d.mts +2 -2
  208. package/dist/{Table-cO7ZwGPM.d.mts → Table-BcAgCIWq.d.mts} +1 -1
  209. package/dist/{Table-D1WyUQuv.mjs → Table-DfUD3I2s.mjs} +8 -8
  210. package/dist/{Table-D1WyUQuv.mjs.map → Table-DfUD3I2s.mjs.map} +1 -1
  211. package/dist/Table.d.mts +1 -1
  212. package/dist/{TableBody-CirMgfAV.d.mts → TableBody-D-RDBun9.d.mts} +1 -1
  213. package/dist/TableBody.d.mts +1 -1
  214. package/dist/{TableBox-C5qWhr82.mjs → TableBox-0GvWjRln.mjs} +27 -21
  215. package/dist/{TableBox-C5qWhr82.mjs.map → TableBox-0GvWjRln.mjs.map} +1 -1
  216. package/dist/TableBox.d.mts +2 -2
  217. package/dist/{TableBoxCell-DmVX_tgn.d.mts → TableBoxCell-WXc57DwN.d.mts} +12 -9
  218. package/dist/TableBoxCell.d.mts +1 -1
  219. package/dist/TableBoxField.d.mts +4 -4
  220. package/dist/{TableBoxRow-nwq41Bpi.d.mts → TableBoxRow-BQz0a9vr.d.mts} +4 -4
  221. package/dist/TableBoxRow.d.mts +1 -1
  222. package/dist/{TableBoxRowActions-B4_ojiQo.d.mts → TableBoxRowActions-DfewtLrn.d.mts} +2 -2
  223. package/dist/TableBoxRowActions.d.mts +1 -1
  224. package/dist/TableCell.d.mts +1 -1
  225. package/dist/{TableControls-RwIPBxyU.d.mts → TableControls-C26vGkWZ.d.mts} +6 -9
  226. package/dist/{TableControls-CZ9iu3ma.mjs → TableControls-WUNbzSNq.mjs} +331 -113
  227. package/dist/TableControls-WUNbzSNq.mjs.map +1 -0
  228. package/dist/TableControls.d.mts +1 -1
  229. package/dist/{TableControlsContext-D_SBFZN1.d.mts → TableControlsContext-ChFsFEjR.d.mts} +2 -2
  230. package/dist/TableControlsContext.d.mts +1 -1
  231. package/dist/{TableHead-DMq_q_W0.d.mts → TableHead-PPaqXC0K.d.mts} +1 -1
  232. package/dist/TableHead.d.mts +1 -1
  233. package/dist/{TableHeaderCell-C2pqXBYO.d.mts → TableHeaderCell-K_avn-rR.d.mts} +1 -1
  234. package/dist/TableHeaderCell.d.mts +1 -1
  235. package/dist/{TableLayout-DQKu6Rcj.d.mts → TableLayout-_Hd-Tvto.d.mts} +1 -1
  236. package/dist/TableLayout.d.mts +1 -1
  237. package/dist/{TableRow-CPqZ8DK3.d.mts → TableRow-BTWf9xVC.d.mts} +2 -2
  238. package/dist/TableRow.d.mts +1 -1
  239. package/dist/TableTH.d.mts +1 -1
  240. package/dist/{TableViewConfigurationDropdown-BYPh4dIP.d.mts → TableViewConfigurationDropdown-BqB7pOh8.d.mts} +5 -3
  241. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  242. package/dist/{TechnicalSticker-DTjg6d2F.mjs → TechnicalSticker-ClRR_6Ly.mjs} +6 -6
  243. package/dist/{TechnicalSticker-DTjg6d2F.mjs.map → TechnicalSticker-ClRR_6Ly.mjs.map} +1 -1
  244. package/dist/TechnicalSticker.d.mts +1 -1
  245. package/dist/{Text-RcEfNFLx.mjs → Text-B0orb-cZ.mjs} +2 -2
  246. package/dist/{Text-RcEfNFLx.mjs.map → Text-B0orb-cZ.mjs.map} +1 -1
  247. package/dist/{Text-CfIFUyHt.d.mts → Text-CAKHcXSd.d.mts} +4 -4
  248. package/dist/Text.d.mts +1 -1
  249. package/dist/{TextArea-DhPBI_1-.d.mts → TextArea-NjdArapc.d.mts} +2 -2
  250. package/dist/{TextArea-ZMgbE_Lh.mjs → TextArea-n4IKHJKo.mjs} +4 -4
  251. package/dist/{TextArea-ZMgbE_Lh.mjs.map → TextArea-n4IKHJKo.mjs.map} +1 -1
  252. package/dist/TextArea.d.mts +1 -1
  253. package/dist/{TextUnderlineTooltip-BzmmiJlC.d.mts → TextUnderlineTooltip-Duzxfc_r.d.mts} +3 -3
  254. package/dist/TextUnderlineTooltip.d.mts +1 -1
  255. package/dist/Tile.d.mts +2 -2
  256. package/dist/Toast.d.mts +1 -1
  257. package/dist/{Toggle-BPgfSjuu.mjs → Toggle-e8DCYa6i.mjs} +7 -7
  258. package/dist/{Toggle-BPgfSjuu.mjs.map → Toggle-e8DCYa6i.mjs.map} +1 -1
  259. package/dist/{Toggle-BGGQ4Ukl.d.mts → Toggle-fh80PA8P.d.mts} +1 -1
  260. package/dist/Toggle.d.mts +1 -1
  261. package/dist/{Tooltip-D_a-RwAN.d.mts → Tooltip-DabloV0o.d.mts} +3 -3
  262. package/dist/{Tooltip-BvDbmXak.mjs → Tooltip-iJcfJqxn.mjs} +5 -5
  263. package/dist/{Tooltip-BvDbmXak.mjs.map → Tooltip-iJcfJqxn.mjs.map} +1 -1
  264. package/dist/Tooltip.d.mts +1 -1
  265. package/dist/{TruncatedText-BJnowVTx.d.mts → TruncatedText-B1W4BivL.d.mts} +2 -2
  266. package/dist/codec-B0dZTwlG.d.mts +29 -0
  267. package/dist/codec.d.mts +2 -0
  268. package/dist/components/Attribute/index.mjs +7 -7
  269. package/dist/components/Attribute/index.mjs.map +1 -1
  270. package/dist/components/Badge/index.mjs +1 -1
  271. package/dist/components/Banner/index.mjs +3 -3
  272. package/dist/components/BottomPanel/index.d.mts +2 -0
  273. package/dist/components/BottomPanel/index.mjs +293 -0
  274. package/dist/components/BottomPanel/index.mjs.map +1 -0
  275. package/dist/components/Breadcrumbs/index.d.mts +1 -1
  276. package/dist/components/Breadcrumbs/index.mjs +1 -1
  277. package/dist/components/Button/index.d.mts +2 -2
  278. package/dist/components/Button/index.mjs +1 -1
  279. package/dist/components/ButtonGroup/index.mjs +4 -4
  280. package/dist/components/Card/index.d.mts +2 -2
  281. package/dist/components/Card/index.mjs +1 -1
  282. package/dist/components/CardV2/index.d.mts +1 -1
  283. package/dist/components/CardV2/index.mjs +1 -1
  284. package/dist/components/Checkbox/index.d.mts +1 -1
  285. package/dist/components/Checkbox/index.mjs +1 -1
  286. package/dist/components/Combobox/index.d.mts +2 -2
  287. package/dist/components/Combobox/index.mjs +1 -1
  288. package/dist/components/ConfigFormGroup/index.mjs +2 -2
  289. package/dist/components/DataTable/TableControls/index.d.mts +19 -16
  290. package/dist/components/DataTable/TableControls/index.mjs +2 -2
  291. package/dist/components/DataTable/index.mjs +25 -25
  292. package/dist/components/DataTable/index.mjs.map +1 -1
  293. package/dist/components/DataTable/types.d.mts +2 -2
  294. package/dist/components/DatePicker/index.d.mts +5 -5
  295. package/dist/components/DatePicker/index.mjs +1 -1
  296. package/dist/components/DropdownButton/index.mjs +1 -1
  297. package/dist/components/DropdownMenu/index.d.mts +1 -1
  298. package/dist/components/DropdownMenu/index.mjs +1 -1
  299. package/dist/components/FloatingPanel/index.mjs +8 -8
  300. package/dist/components/FloatingPanel/index.mjs.map +1 -1
  301. package/dist/components/FormControl/index.d.mts +2 -2
  302. package/dist/components/FormControl/index.mjs +2 -2
  303. package/dist/components/FormField/index.d.mts +1 -1
  304. package/dist/components/FormField/index.mjs +1 -1
  305. package/dist/components/Grid/index.d.mts +3 -0
  306. package/dist/components/Grid/index.mjs +85 -0
  307. package/dist/components/Grid/index.mjs.map +1 -0
  308. package/dist/components/HoverCopyableField/index.d.mts +2 -2
  309. package/dist/components/HoverCopyableField/index.mjs +2 -2
  310. package/dist/components/ImageTile/index.mjs +10 -10
  311. package/dist/components/Input/index.d.mts +1 -1
  312. package/dist/components/Input/index.mjs +1 -1
  313. package/dist/components/Link/index.mjs +4 -4
  314. package/dist/components/Link/index.mjs.map +1 -1
  315. package/dist/components/ListBox/index.d.mts +3 -3
  316. package/dist/components/ListBox/index.mjs +1 -1
  317. package/dist/components/LoadingShimmer/index.mjs +1 -1
  318. package/dist/components/MaskedInput/index.mjs +2 -2
  319. package/dist/components/MatchHighlight/index.mjs +1 -1
  320. package/dist/components/Menu/index.d.mts +1 -1
  321. package/dist/components/Menu/index.mjs +1 -1
  322. package/dist/components/Modal/index.mjs +42 -12
  323. package/dist/components/Modal/index.mjs.map +1 -1
  324. package/dist/components/PageHeader/index.mjs +1 -1
  325. package/dist/components/Pagination/index.d.mts +3 -3
  326. package/dist/components/Pagination/index.mjs +1 -1
  327. package/dist/components/Pii/index.mjs +1 -1
  328. package/dist/components/Popover/index.mjs +1 -1
  329. package/dist/components/ProgressBar/index.mjs +2 -2
  330. package/dist/components/ProgressIndicator/index.mjs +14 -10
  331. package/dist/components/ProgressIndicator/index.mjs.map +1 -1
  332. package/dist/components/Radio/index.mjs +1 -1
  333. package/dist/components/RadioGroup/index.d.mts +1 -1
  334. package/dist/components/RadioGroup/index.mjs +1 -1
  335. package/dist/components/RightPanel/index.d.mts +2 -0
  336. package/dist/components/RightPanel/index.mjs +294 -0
  337. package/dist/components/RightPanel/index.mjs.map +1 -0
  338. package/dist/components/SegmentedControl/index.d.mts +1 -1
  339. package/dist/components/SegmentedControl/index.mjs +1 -1
  340. package/dist/components/Select/index.d.mts +1 -1
  341. package/dist/components/Select/index.mjs +1 -1
  342. package/dist/components/Slider/index.mjs +4 -4
  343. package/dist/components/Spacer/index.mjs +1 -1
  344. package/dist/components/Spinner/index.mjs +1 -1
  345. package/dist/components/Stack/index.d.mts +1 -1
  346. package/dist/components/Stack/index.mjs +1 -1
  347. package/dist/components/StatusIndicator/index.mjs +2 -2
  348. package/dist/components/Sticker/index.d.mts +1 -1
  349. package/dist/components/Sticker/index.mjs +1 -1
  350. package/dist/components/SwatchPicker/index.mjs +1 -1
  351. package/dist/components/TabBar/index.mjs +1 -1
  352. package/dist/components/Table/index.d.mts +7 -7
  353. package/dist/components/Table/index.mjs +1 -1
  354. package/dist/components/TableBox/index.d.mts +2 -2
  355. package/dist/components/TableBox/index.mjs +1 -1
  356. package/dist/components/TechnicalSticker/index.mjs +1 -1
  357. package/dist/components/Text/index.d.mts +1 -1
  358. package/dist/components/Text/index.mjs +1 -1
  359. package/dist/components/TextArea/index.d.mts +1 -1
  360. package/dist/components/TextArea/index.mjs +1 -1
  361. package/dist/components/Tile/index.mjs +5 -5
  362. package/dist/components/Toast/index.mjs +5 -5
  363. package/dist/components/Toggle/index.d.mts +1 -1
  364. package/dist/components/Toggle/index.mjs +1 -1
  365. package/dist/components/Tooltip/index.d.mts +3 -3
  366. package/dist/components/Tooltip/index.mjs +1 -1
  367. package/dist/compound-expression.d.mts +1 -1
  368. package/dist/{constants-BASogfT_.d.mts → constants-DcJ3tnwY.d.mts} +1 -1
  369. package/dist/constants.d.mts +1 -1
  370. package/dist/date-filter-BbWgAXy3.mjs +176 -0
  371. package/dist/date-filter-BbWgAXy3.mjs.map +1 -0
  372. package/dist/date-range-rule-value-DBEEWTQp.d.mts +17 -0
  373. package/dist/date-range-rule-value.d.mts +2 -0
  374. package/dist/date-rule-intent-BArNGT2E.d.mts +20 -0
  375. package/dist/date-rule-intent.d.mts +2 -0
  376. package/dist/display.d.mts +2 -2
  377. package/dist/fieldPickerOptions.d.mts +2 -2
  378. package/dist/{filter-size-context-Bw5F7082.d.mts → filter-size-context-D1UhTwOG.d.mts} +2 -2
  379. package/dist/filter-size-context.d.mts +1 -1
  380. package/dist/helpers.d.mts +1 -1
  381. package/dist/{index--5Mfhlkj.d.mts → index-DASkW991.d.mts} +2 -2
  382. package/dist/{index-C1bz13uw.d.mts → index-Dc_BgmPv.d.mts} +5 -5
  383. package/dist/{index-DiCnyORA.d.mts → index-Dpo-RP6S.d.mts} +5 -5
  384. package/dist/index-dhjtMp5F.d.mts +1 -0
  385. package/dist/index-uY8Qbwfx.d.mts +1 -0
  386. package/dist/index.d.mts +1 -1
  387. package/dist/index2.d.mts +1 -1
  388. package/dist/index3.d.mts +3 -3
  389. package/dist/index4.d.mts +14 -11
  390. package/dist/{input-CzO-6_1V.d.mts → input-M7BEIewR.d.mts} +3 -3
  391. package/dist/inputFields.d.mts +11 -11
  392. package/dist/{intersperse-yd3oMrQl.mjs → intersperse-DQAyfeEw.mjs} +1 -1
  393. package/dist/{intersperse-yd3oMrQl.mjs.map → intersperse-DQAyfeEw.mjs.map} +1 -1
  394. package/dist/lib/GlobalStyles.mjs +1 -1
  395. package/dist/lib/HeadlessAriaButton.mjs +1 -1
  396. package/dist/lib/MiddleTruncatedText.mjs +1 -1
  397. package/dist/lib/PDSProvider.d.mts +1 -1
  398. package/dist/lib/PDSProvider.mjs +1 -1
  399. package/dist/lib/TruncatedText.d.mts +1 -1
  400. package/dist/lib/TruncatedText.mjs +2 -2
  401. package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
  402. package/dist/lib/TruncatedTextWithTooltip.mjs +2 -2
  403. package/dist/lib/date-filter/index.d.mts +3 -0
  404. package/dist/lib/date-filter/index.mjs +2 -0
  405. package/dist/lib/embeddedSurfaceProtocol.d.mts +13 -1
  406. package/dist/lib/embeddedSurfaceProtocol.mjs +32 -5
  407. package/dist/lib/embeddedSurfaceProtocol.mjs.map +1 -1
  408. package/dist/lib/message.d.mts +1 -1
  409. package/dist/lib/pseudoClass.d.mts +8 -8
  410. package/dist/lib/useEmbeddedSurface.d.mts +31 -3
  411. package/dist/lib/useEmbeddedSurface.mjs +118 -13
  412. package/dist/lib/useEmbeddedSurface.mjs.map +1 -1
  413. package/dist/lib/useResizablePanel.d.mts +49 -0
  414. package/dist/lib/useResizablePanel.mjs +75 -0
  415. package/dist/lib/useResizablePanel.mjs.map +1 -0
  416. package/dist/{message-Cu84fcqB.d.mts → message-DaiDXonE.d.mts} +1 -1
  417. package/dist/mixins/focus.d.mts +1 -1
  418. package/dist/mixins/focus.mjs +1 -1
  419. package/dist/mixins/hoverable.d.mts +2 -2
  420. package/dist/mixins/hoverable.mjs +2 -2
  421. package/dist/mixins/input.d.mts +1 -1
  422. package/dist/mixins/input.mjs +2 -2
  423. package/dist/mixins/menuItem.d.mts +2 -2
  424. package/dist/mixins/menuItem.mjs +1 -1
  425. package/dist/mixins/print/index.mjs +1 -1
  426. package/dist/mixins/text.d.mts +1 -1
  427. package/dist/mixins/text.mjs +1 -1
  428. package/dist/{operators-CmSqHnTH.d.mts → operators-BsSl7gPE.d.mts} +10 -3
  429. package/dist/operators.d.mts +2 -2
  430. package/dist/patterns/LayoutLoadingShimmer/index.mjs +6 -6
  431. package/dist/patterns/LayoutLoadingSpinner/index.d.mts +2 -0
  432. package/dist/patterns/LayoutLoadingSpinner/index.mjs +56 -0
  433. package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -0
  434. package/dist/patterns/PageLayout/index.mjs +1 -1
  435. package/dist/relative-date-label.d.mts +15 -0
  436. package/dist/styledComponentsInterop-8zScIQyC.mjs +33 -0
  437. package/dist/styledComponentsInterop-8zScIQyC.mjs.map +1 -0
  438. package/dist/{text-BaQdW8qa.d.mts → text-DjTGRUM1.d.mts} +1 -1
  439. package/dist/{theme-D9Y6NOzb.d.mts → theme-Biwx2eJZ.d.mts} +1 -1
  440. package/dist/theme.d.mts +1 -1
  441. package/dist/{types-NJtAxsU1.d.mts → types-B5VmRRMR.d.mts} +5 -3
  442. package/dist/types-Bsf1VsW6.d.mts +24 -0
  443. package/dist/{types-TV9nVfSe.d.mts → types-Cg3aXHUh2.d.mts} +1 -1
  444. package/dist/{types-DEh_pXgS.d.mts → types-Df0D37uh.d.mts} +3 -1
  445. package/dist/{types-C-TkDdkG.d.mts → types-V8UJX-rk.d.mts} +14 -2
  446. package/dist/types.d.mts +1 -1
  447. package/dist/types2.d.mts +2 -2
  448. package/dist/types3.d.mts +2 -2
  449. package/dist/types4.d.mts +2 -2
  450. package/dist/types5.d.mts +2 -0
  451. package/dist/url-state-ektb0HnB.d.mts +42 -0
  452. package/dist/url-state.d.mts +2 -0
  453. package/dist/useComboboxFooterAction.d.mts +1 -1
  454. package/dist/{useFilterStateV2-C4itmN4S.d.mts → useFilterStateV2-BB14vCC-.d.mts} +3 -3
  455. package/dist/useFilterStateV2.d.mts +1 -1
  456. package/dist/{useFormField-eftOPiXj.mjs → useFormField-Bz2iMPBO.mjs} +2 -2
  457. package/dist/{useFormField-eftOPiXj.mjs.map → useFormField-Bz2iMPBO.mjs.map} +1 -1
  458. package/dist/{useFormField-B2U4GOH4.d.mts → useFormField-CQo08dR4.d.mts} +2 -2
  459. package/dist/useFormField.d.mts +1 -1
  460. package/dist/{useFormGroup-BMukAMAd.mjs → useFormGroup-CaTiD_Yt.mjs} +1 -1
  461. package/dist/{useFormGroup-BMukAMAd.mjs.map → useFormGroup-CaTiD_Yt.mjs.map} +1 -1
  462. package/dist/{useTableBoxDragAndDrop-CpemHLhL.d.mts → useTableBoxDragAndDrop-B-Dev5D6.d.mts} +1 -1
  463. package/dist/useTableBoxDragAndDrop.d.mts +1 -1
  464. package/dist/useTruncation.d.mts +1 -1
  465. package/dist/{utilities-DnSIlR1i.d.mts → utilities-BHMNnJ8h.d.mts} +1 -1
  466. package/dist/utilities.d.mts +1 -1
  467. package/dist/utils/storybook.mjs +1 -1
  468. package/dist/utils/testing.d.mts +1 -1
  469. package/dist/utils/testing.mjs +1 -1
  470. package/dist/utils.d.mts +1 -1
  471. package/dist/utils2.d.mts +12 -1
  472. package/dist/{validation-B5IXsdkE.d.mts → validation-B22QjCrV.d.mts} +3 -3
  473. package/dist/validation.d.mts +1 -1
  474. package/dist/{value-control-resolver-BPlTeIX7.d.mts → value-control-resolver-qKTH1ErF.d.mts} +5 -3
  475. package/dist/value-control-resolver.d.mts +1 -1
  476. package/dist/variables/keyframes.mjs +1 -1
  477. package/llms.txt +6 -6
  478. package/package.json +14 -2
  479. package/skills/ui-authoring/COMPONENTS.md +71 -305
  480. package/skills/ui-authoring/PATTERNS.md +364 -0
  481. package/skills/ui-authoring/SKILL.md +15 -147
  482. package/skills/ui-authoring/TOKENS.md +400 -0
  483. package/dist/Combobox-xBrxiUAu.mjs.map +0 -1
  484. package/dist/DatePicker-BlnE2MBD.mjs.map +0 -1
  485. package/dist/FormField-B9P3BWvS.mjs.map +0 -1
  486. package/dist/HoverCopyableField-0Bzygbp9.mjs.map +0 -1
  487. package/dist/Select-D6MqSYVa.mjs.map +0 -1
  488. package/dist/TableControls-CZ9iu3ma.mjs.map +0 -1
  489. package/skills/ui-authoring/EXAMPLES.md +0 -370
  490. package/skills/ui-authoring/REFERENCE.md +0 -293
  491. /package/dist/{index-BMBcfD_R.d.mts → index-8SLBz2NH.d.mts} +0 -0
  492. /package/dist/{index-BOn0AAue.d.mts → index-BINnViIh.d.mts} +0 -0
  493. /package/dist/{index-BYd3Btr1.d.mts → index-B_BBnMou.d.mts} +0 -0
  494. /package/dist/{index-CKKoxA9V.d.mts → index-BcsXXrHq.d.mts} +0 -0
  495. /package/dist/{index-CNxS4Tlu.d.mts → index-Bt4QNofW.d.mts} +0 -0
  496. /package/dist/{index-CWB6exYm.d.mts → index-BwFl_eS0.d.mts} +0 -0
  497. /package/dist/{index-CsuikFeJ.d.mts → index-CDGG7lCB.d.mts} +0 -0
  498. /package/dist/{index-CtJuGxUp.d.mts → index-CMuRFTR3.d.mts} +0 -0
  499. /package/dist/{index-CzItj62a.d.mts → index-CX869wwk.d.mts} +0 -0
  500. /package/dist/{index-D5tSVhTd.d.mts → index-CliqZ9rj.d.mts} +0 -0
  501. /package/dist/{index-DGsJdI5l.d.mts → index-CuheJfs-.d.mts} +0 -0
  502. /package/dist/{index-DkrC-i1D.d.mts → index-DBGd4WeR.d.mts} +0 -0
  503. /package/dist/{index-Es5nKSSL.d.mts → index-DDdPqD_H.d.mts} +0 -0
  504. /package/dist/{index-FtE8MXJ_.d.mts → index-DMRtRo7y.d.mts} +0 -0
  505. /package/dist/{index-IE5cwTAE2.d.mts → index-Dflz2i1X.d.mts} +0 -0
  506. /package/dist/{index-Oio5ygqN.d.mts → index-DvmLVvRD.d.mts} +0 -0
  507. /package/dist/{index-ehD5GjMH.d.mts → index-Wc1llEvP.d.mts} +0 -0
@@ -9,7 +9,7 @@ const coerceIdentifier = (value) => {
9
9
  return value;
10
10
  };
11
11
  const isRecord = (value) => typeof value === "object" && value != null && !Array.isArray(value);
12
- const isKnownKind = (value) => value === "hello" || value === "surfaceSnapshot" || value === "welcome";
12
+ const isKnownKind = (value) => value === "hello" || value === "surfaceSnapshot" || value === "surfaceAck" || value === "welcome";
13
13
  const getEnvelopeMetadata = (value) => {
14
14
  if (value.channel !== "persona-embedded-surface" || value.version !== 1) return;
15
15
  const connectionId = coerceIdentifier(value.connectionId);
@@ -46,26 +46,53 @@ const coerceHostboundEnvelope = (value) => {
46
46
  kind: value.kind,
47
47
  payload: {
48
48
  epoch,
49
- surfaces
49
+ surfaces,
50
+ awaitsAck: payload.awaitsAck === true
50
51
  }
51
52
  };
52
53
  }
54
+ case "surfaceAck":
53
55
  case "welcome": return;
54
56
  }
55
57
  };
56
58
  const coerceChildboundEnvelope = (value) => {
57
- if (!isRecord(value) || value.kind !== "welcome") return;
59
+ if (!isRecord(value) || value.kind !== "welcome" && value.kind !== "surfaceAck") return;
58
60
  const metadata = getEnvelopeMetadata(value);
59
61
  const payload = isRecord(value.payload) ? value.payload : void 0;
60
62
  if (metadata == null || payload == null) return;
63
+ if (value.kind === "welcome") {
64
+ const epoch = coerceIdentifier(payload.epoch);
65
+ if (epoch == null) return;
66
+ return {
67
+ channel: EMBEDDED_SURFACE_CHANNEL,
68
+ version: 1,
69
+ ...metadata,
70
+ kind: value.kind,
71
+ payload: { epoch }
72
+ };
73
+ }
74
+ if (!Array.isArray(payload.surfaces) || payload.surfaces.length > MAX_SURFACE_IDS) return;
61
75
  const epoch = coerceIdentifier(payload.epoch);
62
76
  if (epoch == null) return;
77
+ const startAt = payload.startAt;
78
+ if (typeof startAt !== "number" || !Number.isFinite(startAt)) return;
79
+ const surfaces = [];
80
+ for (const surface of payload.surfaces) {
81
+ if (!isRecord(surface)) return;
82
+ const surfaceId = coerceIdentifier(surface.surfaceId);
83
+ if (surfaceId == null) return;
84
+ surfaces.push({ surfaceId });
85
+ }
63
86
  return {
64
87
  channel: EMBEDDED_SURFACE_CHANNEL,
65
88
  version: 1,
66
89
  ...metadata,
67
- kind: value.kind,
68
- payload: { epoch }
90
+ kind: "surfaceAck",
91
+ payload: {
92
+ epoch,
93
+ startAt,
94
+ surfaces
95
+ }
69
96
  };
70
97
  };
71
98
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"embeddedSurfaceProtocol.mjs","names":[],"sources":["../../lib/embeddedSurfaceProtocol.ts"],"sourcesContent":["export const EMBEDDED_SURFACE_CHANNEL = 'persona-embedded-surface';\nexport const EMBEDDED_SURFACE_PROTOCOL_VERSION = 1;\n\nexport type EmbeddedSurfaceKind = 'hello' | 'surfaceSnapshot' | 'welcome';\n\nexport type EmbeddedSurfacePayloads = {\n hello: Record<string, never>;\n surfaceSnapshot: {\n epoch: string;\n surfaces: Array<{ surfaceId: string }>;\n };\n welcome: {\n epoch: string;\n };\n};\n\nexport interface EmbeddedSurfaceEnvelope<K extends EmbeddedSurfaceKind = EmbeddedSurfaceKind> {\n channel: typeof EMBEDDED_SURFACE_CHANNEL;\n version: typeof EMBEDDED_SURFACE_PROTOCOL_VERSION;\n connectionId: string;\n kind: K;\n payload: EmbeddedSurfacePayloads[K];\n}\n\nexport type EmbeddedSurfaceEnvelopeUnion = {\n [K in EmbeddedSurfaceKind]: EmbeddedSurfaceEnvelope<K>;\n}[EmbeddedSurfaceKind];\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9_:-]+$/;\nconst MAX_IDENTIFIER_LENGTH = 64;\nconst MAX_SURFACE_IDS = 16;\n\nconst coerceIdentifier = (value: unknown): string | undefined => {\n if (\n typeof value !== 'string' ||\n value.length < 1 ||\n value.length > MAX_IDENTIFIER_LENGTH ||\n !IDENTIFIER_PATTERN.test(value)\n ) {\n return undefined;\n }\n return value;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value != null && !Array.isArray(value);\n\nconst isKnownKind = (value: unknown): value is EmbeddedSurfaceKind =>\n value === 'hello' || value === 'surfaceSnapshot' || value === 'welcome';\n\nconst getEnvelopeMetadata = (\n value: Record<string, unknown>,\n): { connectionId: string } | undefined => {\n if (\n value.channel !== EMBEDDED_SURFACE_CHANNEL ||\n value.version !== EMBEDDED_SURFACE_PROTOCOL_VERSION\n ) {\n return undefined;\n }\n const connectionId = coerceIdentifier(value.connectionId);\n return connectionId != null ? { connectionId } : undefined;\n};\n\nexport const coerceHostboundEnvelope = (\n value: unknown,\n): EmbeddedSurfaceEnvelopeUnion | undefined => {\n if (!isRecord(value) || !isKnownKind(value.kind)) {\n return undefined;\n }\n const metadata = getEnvelopeMetadata(value);\n if (metadata == null) {\n return undefined;\n }\n const payload = isRecord(value.payload) ? value.payload : undefined;\n if (payload == null) {\n return undefined;\n }\n\n switch (value.kind) {\n case 'hello':\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: value.kind,\n payload: {},\n };\n case 'surfaceSnapshot': {\n const epoch = coerceIdentifier(payload.epoch);\n if (\n epoch == null ||\n !Array.isArray(payload.surfaces) ||\n payload.surfaces.length > MAX_SURFACE_IDS\n ) {\n return undefined;\n }\n const surfaces = [];\n for (const surface of payload.surfaces) {\n if (!isRecord(surface)) {\n return undefined;\n }\n const surfaceId = coerceIdentifier(surface.surfaceId);\n if (surfaceId == null) {\n return undefined;\n }\n surfaces.push({ surfaceId });\n }\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: value.kind,\n payload: { epoch, surfaces },\n };\n }\n case 'welcome':\n return undefined;\n }\n};\n\nexport const coerceChildboundEnvelope = (\n value: unknown,\n): EmbeddedSurfaceEnvelopeUnion | undefined => {\n if (!isRecord(value) || value.kind !== 'welcome') {\n return undefined;\n }\n const metadata = getEnvelopeMetadata(value);\n const payload = isRecord(value.payload) ? value.payload : undefined;\n if (metadata == null || payload == null) {\n return undefined;\n }\n\n const epoch = coerceIdentifier(payload.epoch);\n if (epoch == null) {\n return undefined;\n }\n\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: value.kind,\n payload: { epoch },\n };\n};\n"],"mappings":";AAAA,MAAa,2BAA2B;AACxC,MAAa,oCAAoC;AA2BjD,MAAM,qBAAqB;AAC3B,MAAM,wBAAwB;AAC9B,MAAM,kBAAkB;AAExB,MAAM,oBAAoB,UAAuC;AAC/D,KACE,OAAO,UAAU,YACjB,MAAM,SAAS,KACf,MAAM,SAAS,yBACf,CAAC,mBAAmB,KAAK,MAAM,CAE/B;AAEF,QAAO;;AAGT,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,SAAS,QAAQ,CAAC,MAAM,QAAQ,MAAM;AAErE,MAAM,eAAe,UACnB,UAAU,WAAW,UAAU,qBAAqB,UAAU;AAEhE,MAAM,uBACJ,UACyC;AACzC,KACE,MAAM,YAAA,8BACN,MAAM,YAAA,EAEN;CAEF,MAAM,eAAe,iBAAiB,MAAM,aAAa;AACzD,QAAO,gBAAgB,OAAO,EAAE,cAAc,GAAG,KAAA;;AAGnD,MAAa,2BACX,UAC6C;AAC7C,KAAI,CAAC,SAAS,MAAM,IAAI,CAAC,YAAY,MAAM,KAAK,CAC9C;CAEF,MAAM,WAAW,oBAAoB,MAAM;AAC3C,KAAI,YAAY,KACd;CAEF,MAAM,UAAU,SAAS,MAAM,QAAQ,GAAG,MAAM,UAAU,KAAA;AAC1D,KAAI,WAAW,KACb;AAGF,SAAQ,MAAM,MAAd;EACE,KAAK,QACH,QAAO;GACL,SAAS;GACT,SAAA;GACA,GAAG;GACH,MAAM,MAAM;GACZ,SAAS,EAAE;GACZ;EACH,KAAK,mBAAmB;GACtB,MAAM,QAAQ,iBAAiB,QAAQ,MAAM;AAC7C,OACE,SAAS,QACT,CAAC,MAAM,QAAQ,QAAQ,SAAS,IAChC,QAAQ,SAAS,SAAS,gBAE1B;GAEF,MAAM,WAAW,EAAE;AACnB,QAAK,MAAM,WAAW,QAAQ,UAAU;AACtC,QAAI,CAAC,SAAS,QAAQ,CACpB;IAEF,MAAM,YAAY,iBAAiB,QAAQ,UAAU;AACrD,QAAI,aAAa,KACf;AAEF,aAAS,KAAK,EAAE,WAAW,CAAC;;AAE9B,UAAO;IACL,SAAS;IACT,SAAA;IACA,GAAG;IACH,MAAM,MAAM;IACZ,SAAS;KAAE;KAAO;KAAU;IAC7B;;EAEH,KAAK,UACH;;;AAIN,MAAa,4BACX,UAC6C;AAC7C,KAAI,CAAC,SAAS,MAAM,IAAI,MAAM,SAAS,UACrC;CAEF,MAAM,WAAW,oBAAoB,MAAM;CAC3C,MAAM,UAAU,SAAS,MAAM,QAAQ,GAAG,MAAM,UAAU,KAAA;AAC1D,KAAI,YAAY,QAAQ,WAAW,KACjC;CAGF,MAAM,QAAQ,iBAAiB,QAAQ,MAAM;AAC7C,KAAI,SAAS,KACX;AAGF,QAAO;EACL,SAAS;EACT,SAAA;EACA,GAAG;EACH,MAAM,MAAM;EACZ,SAAS,EAAE,OAAO;EACnB"}
1
+ {"version":3,"file":"embeddedSurfaceProtocol.mjs","names":[],"sources":["../../lib/embeddedSurfaceProtocol.ts"],"sourcesContent":["export const EMBEDDED_SURFACE_CHANNEL = 'persona-embedded-surface';\nexport const EMBEDDED_SURFACE_PROTOCOL_VERSION = 1;\n\nexport type EmbeddedSurfaceKind = 'hello' | 'surfaceSnapshot' | 'surfaceAck' | 'welcome';\n\nexport type EmbeddedSurfacePayloads = {\n hello: Record<string, never>;\n surfaceSnapshot: {\n epoch: string;\n surfaces: Array<{ surfaceId: string }>;\n /**\n * Set by children that hold their overlay animation until `surfaceAck`. The host only animates\n * its backdrop for those, so host and child releases can ship in either order.\n */\n awaitsAck: boolean;\n };\n surfaceAck: {\n epoch: string;\n startAt: number;\n surfaces: Array<{ surfaceId: string }>;\n };\n welcome: {\n epoch: string;\n };\n};\n\nexport interface EmbeddedSurfaceEnvelope<K extends EmbeddedSurfaceKind = EmbeddedSurfaceKind> {\n channel: typeof EMBEDDED_SURFACE_CHANNEL;\n version: typeof EMBEDDED_SURFACE_PROTOCOL_VERSION;\n connectionId: string;\n kind: K;\n payload: EmbeddedSurfacePayloads[K];\n}\n\nexport type EmbeddedSurfaceEnvelopeUnion = {\n [K in EmbeddedSurfaceKind]: EmbeddedSurfaceEnvelope<K>;\n}[EmbeddedSurfaceKind];\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9_:-]+$/;\nconst MAX_IDENTIFIER_LENGTH = 64;\nconst MAX_SURFACE_IDS = 16;\n\nconst coerceIdentifier = (value: unknown): string | undefined => {\n if (\n typeof value !== 'string' ||\n value.length < 1 ||\n value.length > MAX_IDENTIFIER_LENGTH ||\n !IDENTIFIER_PATTERN.test(value)\n ) {\n return undefined;\n }\n return value;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value != null && !Array.isArray(value);\n\nconst isKnownKind = (value: unknown): value is EmbeddedSurfaceKind =>\n value === 'hello' || value === 'surfaceSnapshot' || value === 'surfaceAck' || value === 'welcome';\n\nconst getEnvelopeMetadata = (\n value: Record<string, unknown>,\n): { connectionId: string } | undefined => {\n if (\n value.channel !== EMBEDDED_SURFACE_CHANNEL ||\n value.version !== EMBEDDED_SURFACE_PROTOCOL_VERSION\n ) {\n return undefined;\n }\n const connectionId = coerceIdentifier(value.connectionId);\n return connectionId != null ? { connectionId } : undefined;\n};\n\nexport const coerceHostboundEnvelope = (\n value: unknown,\n): EmbeddedSurfaceEnvelopeUnion | undefined => {\n if (!isRecord(value) || !isKnownKind(value.kind)) {\n return undefined;\n }\n const metadata = getEnvelopeMetadata(value);\n if (metadata == null) {\n return undefined;\n }\n const payload = isRecord(value.payload) ? value.payload : undefined;\n if (payload == null) {\n return undefined;\n }\n\n switch (value.kind) {\n case 'hello':\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: value.kind,\n payload: {},\n };\n case 'surfaceSnapshot': {\n const epoch = coerceIdentifier(payload.epoch);\n if (\n epoch == null ||\n !Array.isArray(payload.surfaces) ||\n payload.surfaces.length > MAX_SURFACE_IDS\n ) {\n return undefined;\n }\n const surfaces = [];\n for (const surface of payload.surfaces) {\n if (!isRecord(surface)) {\n return undefined;\n }\n const surfaceId = coerceIdentifier(surface.surfaceId);\n if (surfaceId == null) {\n return undefined;\n }\n surfaces.push({ surfaceId });\n }\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: value.kind,\n payload: { epoch, surfaces, awaitsAck: payload.awaitsAck === true },\n };\n }\n case 'surfaceAck':\n case 'welcome':\n return undefined;\n }\n};\n\nexport const coerceChildboundEnvelope = (\n value: unknown,\n): EmbeddedSurfaceEnvelopeUnion | undefined => {\n if (!isRecord(value) || (value.kind !== 'welcome' && value.kind !== 'surfaceAck')) {\n return undefined;\n }\n const metadata = getEnvelopeMetadata(value);\n const payload = isRecord(value.payload) ? value.payload : undefined;\n if (metadata == null || payload == null) {\n return undefined;\n }\n\n if (value.kind === 'welcome') {\n const epoch = coerceIdentifier(payload.epoch);\n if (epoch == null) {\n return undefined;\n }\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: value.kind,\n payload: { epoch },\n };\n }\n if (!Array.isArray(payload.surfaces) || payload.surfaces.length > MAX_SURFACE_IDS) {\n return undefined;\n }\n const epoch = coerceIdentifier(payload.epoch);\n if (epoch == null) {\n return undefined;\n }\n const startAt = payload.startAt;\n if (typeof startAt !== 'number' || !Number.isFinite(startAt)) {\n return undefined;\n }\n const surfaces = [];\n for (const surface of payload.surfaces) {\n if (!isRecord(surface)) {\n return undefined;\n }\n const surfaceId = coerceIdentifier(surface.surfaceId);\n if (surfaceId == null) {\n return undefined;\n }\n surfaces.push({ surfaceId });\n }\n return {\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n ...metadata,\n kind: 'surfaceAck',\n payload: { epoch, startAt, surfaces },\n };\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { t as MessageType } from "../message-Cu84fcqB.mjs";
1
+ import { t as MessageType } from "../message-DaiDXonE.mjs";
2
2
  export { MessageType };
@@ -1,42 +1,42 @@
1
- import { t as PseudoClassProps } from "../PseudoClassProps-CcSlKNev.mjs";
1
+ import { t as PseudoClassProps } from "../PseudoClassProps-BPdn-ofQ.mjs";
2
2
 
3
3
  //#region lib/pseudoClass.d.ts
4
4
  declare const isDisabled: ({
5
5
  disabled
6
- }: PseudoClassProps) => "" | ":disabled";
6
+ }: PseudoClassProps) => ":disabled" | "";
7
7
  declare const isNotDisabled: ({
8
8
  disabled
9
9
  }: PseudoClassProps) => ":not(*)" | ":not(:disabled)";
10
10
  declare const isHovered: ({
11
11
  hovered
12
- }: PseudoClassProps) => "" | ":hover";
12
+ }: PseudoClassProps) => ":hover" | "";
13
13
  declare const isNotHovered: ({
14
14
  hovered
15
15
  }: PseudoClassProps) => ":not(*)" | ":not(:hover)";
16
16
  declare const isFocused: ({
17
17
  focused
18
- }: PseudoClassProps) => "" | ":focus";
18
+ }: PseudoClassProps) => ":focus" | "";
19
19
  declare const isNotFocused: ({
20
20
  focused
21
21
  }: PseudoClassProps) => ":not(*)" | ":not(:focus)";
22
22
  declare const isFocusedVisible: ({
23
23
  focused
24
- }: PseudoClassProps) => "" | ":focus-visible";
24
+ }: PseudoClassProps) => ":focus-visible" | "";
25
25
  declare const isNotFocusedVisible: ({
26
26
  focused
27
27
  }: PseudoClassProps) => ":not(*)" | ":not(:focus-visible)";
28
28
  declare const isActive: ({
29
29
  active
30
- }: PseudoClassProps) => "" | ":focus-within";
30
+ }: PseudoClassProps) => ":focus-within" | "";
31
31
  declare const isNotActive: ({
32
32
  active
33
33
  }: PseudoClassProps) => ":not(*)" | ":not(:focus-within)";
34
34
  declare const isChecked: ({
35
35
  checked
36
- }: PseudoClassProps) => "" | ":checked";
36
+ }: PseudoClassProps) => ":checked" | "";
37
37
  declare const isIndeterminate: ({
38
38
  mixed
39
- }: PseudoClassProps) => "" | ":indeterminate";
39
+ }: PseudoClassProps) => ":indeterminate" | "";
40
40
  declare const isNotChecked: ({
41
41
  checked
42
42
  }: PseudoClassProps) => ":not(*)" | ":not(:checked)";
@@ -1,6 +1,34 @@
1
1
  //#region lib/useEmbeddedSurface.d.ts
2
- /** Mount-scoped because React Aria mounts overlay content only while it is open. */
3
- declare function useEmbeddedSurface(): void;
2
+ /**
3
+ * How long the overlay stays paused waiting for an acknowledgement. It has to outlast the host's
4
+ * animation lead so a slow acknowledgement still gets used rather than raced by this fallback.
5
+ */
6
+ declare const EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS = 80;
7
+ /** Mints an id for a surface whose registration and host gate live in separate components. */
8
+ declare const useEmbeddedSurfaceId: () => string;
9
+ /**
10
+ * Announces the surface to the host for as long as the caller is mounted. Callers must render
11
+ * only while their overlay is on screen: the host dims the shell around every announced surface,
12
+ * and holding the announcement through React Aria's exit animation is what keeps the two halves
13
+ * of the dim disappearing together.
14
+ */
15
+ declare function useEmbeddedSurface(surfaceId?: string): void;
16
+ type EmbeddedSurfaceGate = {
17
+ /** False while the overlay must hold its opening animation paused on its first frame. */ready: boolean;
18
+ /**
19
+ * CSS `animation-delay` that lands the overlay's animation on the host's shared start instant.
20
+ * Negative when the acknowledgement arrived after that instant, so the animation joins in
21
+ * progress rather than starting late.
22
+ */
23
+ animationDelayMs: number;
24
+ };
25
+ /**
26
+ * Holds the surface's opening animation until the host acknowledges it, then reports the delay that
27
+ * aligns the animation with the host's shared start instant. Lives outside the overlay so the gate
28
+ * can hold the child's animation from its very first frame, before the overlay content mounts and
29
+ * announces.
30
+ */
31
+ declare const useEmbeddedSurfaceGate: (surfaceId: string, isOpen: boolean) => EmbeddedSurfaceGate;
4
32
  //#endregion
5
- export { useEmbeddedSurface as default };
33
+ export { EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS, EmbeddedSurfaceGate, useEmbeddedSurface as default, useEmbeddedSurfaceGate, useEmbeddedSurfaceId };
6
34
  //# sourceMappingURL=useEmbeddedSurface.d.mts.map
@@ -1,9 +1,14 @@
1
1
  import { EMBEDDED_SURFACE_CHANNEL, coerceChildboundEnvelope } from "./embeddedSurfaceProtocol.mjs";
2
2
  import { getEmbeddedSurfaceTransport, subscribeEmbeddedSurfaceTransportChanges } from "./embeddedSurfaceRegistry.mjs";
3
- import { useEffect, useRef, useState } from "react";
3
+ import { useEffect, useState } from "react";
4
4
  //#region lib/useEmbeddedSurface.ts
5
5
  const SURFACE_REANNOUNCE_INTERVAL_MS = 2e3;
6
6
  const HELLO_ROTATION_THRESHOLD = 2;
7
+ /**
8
+ * How long the overlay stays paused waiting for an acknowledgement. It has to outlast the host's
9
+ * animation lead so a slow acknowledgement still gets used rather than raced by this fallback.
10
+ */
11
+ const EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS = 80;
7
12
  let fallbackId = 0;
8
13
  const sessions = /* @__PURE__ */ new WeakMap();
9
14
  const mintId = (prefix) => {
@@ -18,7 +23,9 @@ const getSession = (transport) => {
18
23
  const session = {
19
24
  connectionId: mintId("connection"),
20
25
  surfaces: /* @__PURE__ */ new Set(),
21
- unansweredHellos: 0
26
+ unansweredHellos: 0,
27
+ acknowledgedAt: /* @__PURE__ */ new Map(),
28
+ acknowledgementListeners: /* @__PURE__ */ new Map()
22
29
  };
23
30
  sessions.set(transport, session);
24
31
  return session;
@@ -36,14 +43,21 @@ const sendSnapshot = (transport, session) => {
36
43
  if (session.epoch == null) return;
37
44
  send(transport, session, "surfaceSnapshot", {
38
45
  epoch: session.epoch,
39
- surfaces: Array.from(session.surfaces, (surfaceId) => ({ surfaceId }))
46
+ surfaces: Array.from(session.surfaces, (surfaceId) => ({ surfaceId })),
47
+ awaitsAck: true
40
48
  });
41
49
  };
42
50
  const rotateConnection = (session) => {
43
51
  session.connectionId = mintId("connection");
44
52
  session.epoch = void 0;
53
+ session.acknowledgedAt.clear();
45
54
  session.unansweredHellos = 0;
46
55
  };
56
+ const acknowledgeSurface = (session, surfaceId, startAt) => {
57
+ if (session.acknowledgedAt.has(surfaceId)) return;
58
+ session.acknowledgedAt.set(surfaceId, startAt);
59
+ session.acknowledgementListeners.get(surfaceId)?.forEach((listener) => listener(startAt));
60
+ };
47
61
  const startSurfaceLease = (transport, session) => {
48
62
  if (session.leaseTimer != null) return;
49
63
  session.leaseTimer = window.setInterval(() => {
@@ -61,13 +75,23 @@ const stopSurfaceLease = (session) => {
61
75
  const activateSession = (transport, session) => {
62
76
  if (session.unsubscribe != null) return;
63
77
  session.epoch = void 0;
78
+ session.acknowledgedAt.clear();
64
79
  session.unansweredHellos = 0;
65
80
  session.unsubscribe = transport.subscribe((message) => {
66
81
  const childbound = coerceChildboundEnvelope(message);
67
82
  if (!childbound || childbound.connectionId !== session.connectionId) return;
68
83
  session.unansweredHellos = 0;
69
- session.epoch = childbound.payload.epoch;
70
- sendSnapshot(transport, session);
84
+ if (childbound.kind === "welcome") {
85
+ if (session.epoch !== childbound.payload.epoch) session.acknowledgedAt.clear();
86
+ session.epoch = childbound.payload.epoch;
87
+ sendSnapshot(transport, session);
88
+ return;
89
+ }
90
+ if (childbound.payload.epoch !== session.epoch) return;
91
+ if (childbound.kind !== "surfaceAck") return;
92
+ childbound.payload.surfaces.forEach(({ surfaceId }) => {
93
+ acknowledgeSurface(session, surfaceId, childbound.payload.startAt);
94
+ });
71
95
  });
72
96
  send(transport, session, "hello", {});
73
97
  };
@@ -76,12 +100,11 @@ const deactivateSession = (session) => {
76
100
  session.unsubscribe = void 0;
77
101
  stopSurfaceLease(session);
78
102
  session.epoch = void 0;
103
+ session.acknowledgedAt.clear();
79
104
  session.unansweredHellos = 0;
80
105
  };
81
- /** Mount-scoped because React Aria mounts overlay content only while it is open. */
82
- function useEmbeddedSurface() {
106
+ const useEmbeddedSurfaceTransport = () => {
83
107
  const [transport, setTransport] = useState(getEmbeddedSurfaceTransport);
84
- const surfaceIdRef = useRef(void 0);
85
108
  useEffect(() => {
86
109
  const unsubscribe = subscribeEmbeddedSurfaceTransportChanges(() => {
87
110
  setTransport(getEmbeddedSurfaceTransport());
@@ -89,22 +112,39 @@ function useEmbeddedSurface() {
89
112
  setTransport(getEmbeddedSurfaceTransport());
90
113
  return unsubscribe;
91
114
  }, []);
115
+ return transport;
116
+ };
117
+ /** Mints an id for a surface whose registration and host gate live in separate components. */
118
+ const useEmbeddedSurfaceId = () => {
119
+ const [surfaceId] = useState(() => mintId("surface"));
120
+ return surfaceId;
121
+ };
122
+ /**
123
+ * Announces the surface to the host for as long as the caller is mounted. Callers must render
124
+ * only while their overlay is on screen: the host dims the shell around every announced surface,
125
+ * and holding the announcement through React Aria's exit animation is what keeps the two halves
126
+ * of the dim disappearing together.
127
+ */
128
+ function useEmbeddedSurface(surfaceId) {
129
+ const transport = useEmbeddedSurfaceTransport();
130
+ const fallbackSurfaceId = useEmbeddedSurfaceId();
131
+ const ownSurfaceId = surfaceId ?? fallbackSurfaceId;
92
132
  useEffect(() => {
93
133
  if (!transport) return;
94
- const surfaceId = surfaceIdRef.current ??= mintId("surface");
95
134
  const session = getSession(transport);
96
135
  activateSession(transport, session);
97
- session.surfaces.add(surfaceId);
136
+ session.surfaces.add(ownSurfaceId);
98
137
  if (session.surfaces.size === 1) startSurfaceLease(transport, session);
99
138
  if (session.epoch != null) sendSnapshot(transport, session);
100
139
  return () => {
101
- session.surfaces.delete(surfaceId);
140
+ session.surfaces.delete(ownSurfaceId);
141
+ session.acknowledgedAt.delete(ownSurfaceId);
102
142
  if (session.surfaces.size === 0) {
103
143
  if (session.epoch != null) sendSnapshot(transport, session);
104
144
  deactivateSession(session);
105
145
  } else sendSnapshot(transport, session);
106
146
  };
107
- }, [transport]);
147
+ }, [ownSurfaceId, transport]);
108
148
  useEffect(() => {
109
149
  if (!transport) return;
110
150
  let active = true;
@@ -129,7 +169,72 @@ function useEmbeddedSurface() {
129
169
  };
130
170
  }, [transport]);
131
171
  }
172
+ const PENDING_GATE = {
173
+ ready: false,
174
+ animationDelayMs: 0
175
+ };
176
+ const RELEASED_GATE = {
177
+ ready: true,
178
+ animationDelayMs: 0
179
+ };
180
+ const releasedGateAt = (startAt) => ({
181
+ ready: true,
182
+ animationDelayMs: Math.min(startAt - Date.now(), 80)
183
+ });
184
+ /**
185
+ * Holds the surface's opening animation until the host acknowledges it, then reports the delay that
186
+ * aligns the animation with the host's shared start instant. Lives outside the overlay so the gate
187
+ * can hold the child's animation from its very first frame, before the overlay content mounts and
188
+ * announces.
189
+ */
190
+ const useEmbeddedSurfaceGate = (surfaceId, isOpen) => {
191
+ const transport = useEmbeddedSurfaceTransport();
192
+ const [gate, setGate] = useState(() => getEmbeddedSurfaceTransport() == null ? RELEASED_GATE : PENDING_GATE);
193
+ const [wasOpen, setWasOpen] = useState(isOpen);
194
+ if (wasOpen !== isOpen) {
195
+ setWasOpen(isOpen);
196
+ if (isOpen && transport != null) setGate(PENDING_GATE);
197
+ }
198
+ useEffect(() => {
199
+ if (!transport) {
200
+ setGate(RELEASED_GATE);
201
+ return;
202
+ }
203
+ if (!isOpen) return;
204
+ const session = getSession(transport);
205
+ const acknowledgedStartAt = session.acknowledgedAt.get(surfaceId);
206
+ if (acknowledgedStartAt != null) {
207
+ setGate(releasedGateAt(acknowledgedStartAt));
208
+ return;
209
+ }
210
+ const listeners = session.acknowledgementListeners.get(surfaceId) ?? /* @__PURE__ */ new Set();
211
+ const unsubscribe = () => {
212
+ listeners.delete(release);
213
+ if (listeners.size === 0) session.acknowledgementListeners.delete(surfaceId);
214
+ };
215
+ const fallback = window.setTimeout(() => {
216
+ unsubscribe();
217
+ setGate(RELEASED_GATE);
218
+ }, 80);
219
+ const release = (startAt) => {
220
+ window.clearTimeout(fallback);
221
+ unsubscribe();
222
+ setGate(releasedGateAt(startAt));
223
+ };
224
+ listeners.add(release);
225
+ session.acknowledgementListeners.set(surfaceId, listeners);
226
+ return () => {
227
+ window.clearTimeout(fallback);
228
+ unsubscribe();
229
+ };
230
+ }, [
231
+ isOpen,
232
+ surfaceId,
233
+ transport
234
+ ]);
235
+ return gate;
236
+ };
132
237
  //#endregion
133
- export { useEmbeddedSurface as default };
238
+ export { EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS, useEmbeddedSurface as default, useEmbeddedSurfaceGate, useEmbeddedSurfaceId };
134
239
 
135
240
  //# sourceMappingURL=useEmbeddedSurface.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useEmbeddedSurface.mjs","names":[],"sources":["../../lib/useEmbeddedSurface.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport {\n EMBEDDED_SURFACE_PROTOCOL_VERSION,\n EMBEDDED_SURFACE_CHANNEL,\n coerceChildboundEnvelope,\n} from 'design-system/lib/embeddedSurfaceProtocol';\nimport {\n getEmbeddedSurfaceTransport,\n subscribeEmbeddedSurfaceTransportChanges,\n type EmbeddedSurfaceTransport,\n} from 'design-system/lib/embeddedSurfaceRegistry';\n\nconst SURFACE_REANNOUNCE_INTERVAL_MS = 2000;\nconst HELLO_ROTATION_THRESHOLD = 2;\n\nlet fallbackId = 0;\ntype SurfaceSession = {\n connectionId: string;\n surfaces: Set<string>;\n leaseTimer?: number;\n unsubscribe?: () => void;\n unansweredHellos: number;\n epoch?: string;\n};\nconst sessions = new WeakMap<EmbeddedSurfaceTransport, SurfaceSession>();\n\nconst mintId = (prefix: string): string => {\n const randomUUID =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : undefined;\n if (randomUUID) {\n return `${prefix}-${randomUUID}`;\n }\n fallbackId += 1;\n return `${prefix}-${fallbackId.toString(36)}`;\n};\n\nconst getSession = (transport: EmbeddedSurfaceTransport) => {\n const current = sessions.get(transport);\n if (current) {\n return current;\n }\n const session: SurfaceSession = {\n connectionId: mintId('connection'),\n surfaces: new Set<string>(),\n unansweredHellos: 0,\n };\n sessions.set(transport, session);\n return session;\n};\n\nconst send = (\n transport: EmbeddedSurfaceTransport,\n session: SurfaceSession,\n kind: 'hello' | 'surfaceSnapshot',\n payload: Record<string, never> | { epoch: string; surfaces: Array<{ surfaceId: string }> },\n) => {\n transport.send({\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n connectionId: session.connectionId,\n kind,\n payload,\n });\n};\n\nconst sendSnapshot = (transport: EmbeddedSurfaceTransport, session: SurfaceSession) => {\n if (session.epoch == null) {\n return;\n }\n send(transport, session, 'surfaceSnapshot', {\n epoch: session.epoch,\n surfaces: Array.from(session.surfaces, (surfaceId) => ({ surfaceId })),\n });\n};\n\nconst rotateConnection = (session: SurfaceSession) => {\n // The host may have retired this connectionId in its LRU, so hellos stay dropped\n // until a fresh connectionId is minted.\n session.connectionId = mintId('connection');\n session.epoch = undefined;\n session.unansweredHellos = 0;\n};\n\nconst startSurfaceLease = (transport: EmbeddedSurfaceTransport, session: SurfaceSession) => {\n if (session.leaseTimer != null) {\n return;\n }\n // Re-announces active surfaces to renew the host's lease. If the child stops\n // running, announcements cease and the host releases shell effects after timeout.\n session.leaseTimer = window.setInterval(() => {\n session.unansweredHellos += 1;\n if (session.unansweredHellos >= HELLO_ROTATION_THRESHOLD) {\n rotateConnection(session);\n }\n send(transport, session, 'hello', {});\n sendSnapshot(transport, session);\n }, SURFACE_REANNOUNCE_INTERVAL_MS);\n};\n\nconst stopSurfaceLease = (session: SurfaceSession) => {\n if (session.leaseTimer == null) {\n return;\n }\n window.clearInterval(session.leaseTimer);\n session.leaseTimer = undefined;\n};\n\nconst activateSession = (transport: EmbeddedSurfaceTransport, session: SurfaceSession) => {\n if (session.unsubscribe != null) {\n return;\n }\n session.epoch = undefined;\n session.unansweredHellos = 0;\n session.unsubscribe = transport.subscribe((message) => {\n const childbound = coerceChildboundEnvelope(message);\n if (!childbound || childbound.connectionId !== session.connectionId) {\n return;\n }\n session.unansweredHellos = 0;\n session.epoch = childbound.payload.epoch;\n sendSnapshot(transport, session);\n });\n send(transport, session, 'hello', {});\n};\n\nconst deactivateSession = (session: SurfaceSession) => {\n session.unsubscribe?.();\n session.unsubscribe = undefined;\n stopSurfaceLease(session);\n session.epoch = undefined;\n session.unansweredHellos = 0;\n};\n\n/** Mount-scoped because React Aria mounts overlay content only while it is open. */\nexport default function useEmbeddedSurface(): void {\n const [transport, setTransport] = useState<EmbeddedSurfaceTransport | null>(\n getEmbeddedSurfaceTransport,\n );\n const surfaceIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n const unsubscribe = subscribeEmbeddedSurfaceTransportChanges(() => {\n setTransport(getEmbeddedSurfaceTransport());\n });\n // A transport can register between render and this effect, and the registry only\n // notifies on change, so reconcile once the subscription is installed.\n setTransport(getEmbeddedSurfaceTransport());\n return unsubscribe;\n }, []);\n\n useEffect(() => {\n if (!transport) {\n return;\n }\n const surfaceId = (surfaceIdRef.current ??= mintId('surface'));\n const session = getSession(transport);\n activateSession(transport, session);\n session.surfaces.add(surfaceId);\n const wasEmpty = session.surfaces.size === 1;\n if (wasEmpty) {\n startSurfaceLease(transport, session);\n }\n if (session.epoch != null) {\n sendSnapshot(transport, session);\n }\n\n return () => {\n session.surfaces.delete(surfaceId);\n if (session.surfaces.size === 0) {\n if (session.epoch != null) {\n sendSnapshot(transport, session);\n }\n deactivateSession(session);\n } else {\n sendSnapshot(transport, session);\n }\n };\n }, [transport]);\n\n useEffect(() => {\n if (!transport) {\n return;\n }\n let active = true;\n let pendingAnimationFrame: number | null = null;\n const handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget != null) {\n return;\n }\n event.stopImmediatePropagation();\n if (!(event.target instanceof HTMLElement)) {\n return;\n }\n const target = event.target;\n if (pendingAnimationFrame != null) {\n cancelAnimationFrame(pendingAnimationFrame);\n }\n pendingAnimationFrame = requestAnimationFrame(() => {\n pendingAnimationFrame = null;\n if (!active || !target.isConnected) {\n return;\n }\n if (\n document.hasFocus() &&\n (document.activeElement == null || document.activeElement === document.body)\n ) {\n target.focus();\n }\n });\n };\n document.addEventListener('focusout', handleFocusOut, true);\n return () => {\n active = false;\n if (pendingAnimationFrame != null) {\n cancelAnimationFrame(pendingAnimationFrame);\n }\n document.removeEventListener('focusout', handleFocusOut, true);\n };\n }, [transport]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useEmbeddedSurface.mjs","names":[],"sources":["../../lib/useEmbeddedSurface.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport {\n EMBEDDED_SURFACE_PROTOCOL_VERSION,\n EMBEDDED_SURFACE_CHANNEL,\n coerceChildboundEnvelope,\n type EmbeddedSurfacePayloads,\n} from 'design-system/lib/embeddedSurfaceProtocol';\nimport {\n getEmbeddedSurfaceTransport,\n subscribeEmbeddedSurfaceTransportChanges,\n type EmbeddedSurfaceTransport,\n} from 'design-system/lib/embeddedSurfaceRegistry';\n\nconst SURFACE_REANNOUNCE_INTERVAL_MS = 2000;\nconst HELLO_ROTATION_THRESHOLD = 2;\n/**\n * How long the overlay stays paused waiting for an acknowledgement. It has to outlast the host's\n * animation lead so a slow acknowledgement still gets used rather than raced by this fallback.\n */\nexport const EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS = 80;\n\nlet fallbackId = 0;\ntype SurfaceSession = {\n connectionId: string;\n surfaces: Set<string>;\n leaseTimer?: number;\n unsubscribe?: () => void;\n unansweredHellos: number;\n epoch?: string;\n /** Acknowledged surfaces, keyed to the shared wall-clock instant their animation starts at. */\n acknowledgedAt: Map<string, number>;\n acknowledgementListeners: Map<string, Set<(startAt: number) => void>>;\n};\nconst sessions = new WeakMap<EmbeddedSurfaceTransport, SurfaceSession>();\n\nconst mintId = (prefix: string): string => {\n const randomUUID =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : undefined;\n if (randomUUID) {\n return `${prefix}-${randomUUID}`;\n }\n fallbackId += 1;\n return `${prefix}-${fallbackId.toString(36)}`;\n};\n\nconst getSession = (transport: EmbeddedSurfaceTransport) => {\n const current = sessions.get(transport);\n if (current) {\n return current;\n }\n const session: SurfaceSession = {\n connectionId: mintId('connection'),\n surfaces: new Set<string>(),\n unansweredHellos: 0,\n acknowledgedAt: new Map<string, number>(),\n acknowledgementListeners: new Map<string, Set<(startAt: number) => void>>(),\n };\n sessions.set(transport, session);\n return session;\n};\n\nconst send = (\n transport: EmbeddedSurfaceTransport,\n session: SurfaceSession,\n kind: 'hello' | 'surfaceSnapshot',\n payload: EmbeddedSurfacePayloads['hello'] | EmbeddedSurfacePayloads['surfaceSnapshot'],\n) => {\n transport.send({\n channel: EMBEDDED_SURFACE_CHANNEL,\n version: EMBEDDED_SURFACE_PROTOCOL_VERSION,\n connectionId: session.connectionId,\n kind,\n payload,\n });\n};\n\nconst sendSnapshot = (transport: EmbeddedSurfaceTransport, session: SurfaceSession) => {\n if (session.epoch == null) {\n return;\n }\n send(transport, session, 'surfaceSnapshot', {\n epoch: session.epoch,\n surfaces: Array.from(session.surfaces, (surfaceId) => ({ surfaceId })),\n awaitsAck: true,\n });\n};\n\nconst rotateConnection = (session: SurfaceSession) => {\n // The host may have retired this connectionId in its LRU, so hellos stay dropped\n // until a fresh connectionId is minted.\n session.connectionId = mintId('connection');\n session.epoch = undefined;\n session.acknowledgedAt.clear();\n session.unansweredHellos = 0;\n};\n\nconst acknowledgeSurface = (session: SurfaceSession, surfaceId: string, startAt: number) => {\n if (session.acknowledgedAt.has(surfaceId)) {\n return;\n }\n session.acknowledgedAt.set(surfaceId, startAt);\n session.acknowledgementListeners.get(surfaceId)?.forEach((listener) => listener(startAt));\n};\n\nconst startSurfaceLease = (transport: EmbeddedSurfaceTransport, session: SurfaceSession) => {\n if (session.leaseTimer != null) {\n return;\n }\n // Re-announces active surfaces to renew the host's lease. If the child stops\n // running, announcements cease and the host releases shell effects after timeout.\n session.leaseTimer = window.setInterval(() => {\n session.unansweredHellos += 1;\n if (session.unansweredHellos >= HELLO_ROTATION_THRESHOLD) {\n rotateConnection(session);\n }\n send(transport, session, 'hello', {});\n sendSnapshot(transport, session);\n }, SURFACE_REANNOUNCE_INTERVAL_MS);\n};\n\nconst stopSurfaceLease = (session: SurfaceSession) => {\n if (session.leaseTimer == null) {\n return;\n }\n window.clearInterval(session.leaseTimer);\n session.leaseTimer = undefined;\n};\n\nconst activateSession = (transport: EmbeddedSurfaceTransport, session: SurfaceSession) => {\n if (session.unsubscribe != null) {\n return;\n }\n session.epoch = undefined;\n session.acknowledgedAt.clear();\n session.unansweredHellos = 0;\n session.unsubscribe = transport.subscribe((message) => {\n const childbound = coerceChildboundEnvelope(message);\n if (!childbound || childbound.connectionId !== session.connectionId) {\n return;\n }\n session.unansweredHellos = 0;\n if (childbound.kind === 'welcome') {\n if (session.epoch !== childbound.payload.epoch) {\n session.acknowledgedAt.clear();\n }\n session.epoch = childbound.payload.epoch;\n sendSnapshot(transport, session);\n return;\n }\n if (childbound.payload.epoch !== session.epoch) {\n return;\n }\n if (childbound.kind !== 'surfaceAck') {\n return;\n }\n childbound.payload.surfaces.forEach(({ surfaceId }) => {\n acknowledgeSurface(session, surfaceId, childbound.payload.startAt);\n });\n });\n send(transport, session, 'hello', {});\n};\n\nconst deactivateSession = (session: SurfaceSession) => {\n session.unsubscribe?.();\n session.unsubscribe = undefined;\n stopSurfaceLease(session);\n session.epoch = undefined;\n session.acknowledgedAt.clear();\n session.unansweredHellos = 0;\n};\n\nconst useEmbeddedSurfaceTransport = (): EmbeddedSurfaceTransport | null => {\n const [transport, setTransport] = useState<EmbeddedSurfaceTransport | null>(\n getEmbeddedSurfaceTransport,\n );\n\n useEffect(() => {\n const unsubscribe = subscribeEmbeddedSurfaceTransportChanges(() => {\n setTransport(getEmbeddedSurfaceTransport());\n });\n // A transport can register between render and this effect, and the registry only\n // notifies on change, so reconcile once the subscription is installed.\n setTransport(getEmbeddedSurfaceTransport());\n return unsubscribe;\n }, []);\n\n return transport;\n};\n\n/** Mints an id for a surface whose registration and host gate live in separate components. */\nexport const useEmbeddedSurfaceId = (): string => {\n const [surfaceId] = useState(() => mintId('surface'));\n return surfaceId;\n};\n\n/**\n * Announces the surface to the host for as long as the caller is mounted. Callers must render\n * only while their overlay is on screen: the host dims the shell around every announced surface,\n * and holding the announcement through React Aria's exit animation is what keeps the two halves\n * of the dim disappearing together.\n */\nexport default function useEmbeddedSurface(surfaceId?: string): void {\n const transport = useEmbeddedSurfaceTransport();\n const fallbackSurfaceId = useEmbeddedSurfaceId();\n const ownSurfaceId = surfaceId ?? fallbackSurfaceId;\n\n useEffect(() => {\n if (!transport) {\n return;\n }\n const session = getSession(transport);\n activateSession(transport, session);\n session.surfaces.add(ownSurfaceId);\n if (session.surfaces.size === 1) {\n startSurfaceLease(transport, session);\n }\n if (session.epoch != null) {\n sendSnapshot(transport, session);\n }\n\n return () => {\n session.surfaces.delete(ownSurfaceId);\n session.acknowledgedAt.delete(ownSurfaceId);\n if (session.surfaces.size === 0) {\n if (session.epoch != null) {\n sendSnapshot(transport, session);\n }\n deactivateSession(session);\n } else {\n sendSnapshot(transport, session);\n }\n };\n }, [ownSurfaceId, transport]);\n\n useEffect(() => {\n if (!transport) {\n return;\n }\n let active = true;\n let pendingAnimationFrame: number | null = null;\n const handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget != null) {\n return;\n }\n event.stopImmediatePropagation();\n if (!(event.target instanceof HTMLElement)) {\n return;\n }\n const target = event.target;\n if (pendingAnimationFrame != null) {\n cancelAnimationFrame(pendingAnimationFrame);\n }\n pendingAnimationFrame = requestAnimationFrame(() => {\n pendingAnimationFrame = null;\n if (!active || !target.isConnected) {\n return;\n }\n if (\n document.hasFocus() &&\n (document.activeElement == null || document.activeElement === document.body)\n ) {\n target.focus();\n }\n });\n };\n document.addEventListener('focusout', handleFocusOut, true);\n return () => {\n active = false;\n if (pendingAnimationFrame != null) {\n cancelAnimationFrame(pendingAnimationFrame);\n }\n document.removeEventListener('focusout', handleFocusOut, true);\n };\n }, [transport]);\n}\n\nexport type EmbeddedSurfaceGate = {\n /** False while the overlay must hold its opening animation paused on its first frame. */\n ready: boolean;\n /**\n * CSS `animation-delay` that lands the overlay's animation on the host's shared start instant.\n * Negative when the acknowledgement arrived after that instant, so the animation joins in\n * progress rather than starting late.\n */\n animationDelayMs: number;\n};\n\nconst PENDING_GATE: EmbeddedSurfaceGate = { ready: false, animationDelayMs: 0 };\nconst RELEASED_GATE: EmbeddedSurfaceGate = { ready: true, animationDelayMs: 0 };\n// A start instant further out than the no-ack fallback would have waited is not a schedule worth\n// honouring; with fill-mode `both` an unbounded positive delay holds the overlay hidden.\nconst releasedGateAt = (startAt: number): EmbeddedSurfaceGate => ({\n ready: true,\n animationDelayMs: Math.min(startAt - Date.now(), EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS),\n});\n\n/**\n * Holds the surface's opening animation until the host acknowledges it, then reports the delay that\n * aligns the animation with the host's shared start instant. Lives outside the overlay so the gate\n * can hold the child's animation from its very first frame, before the overlay content mounts and\n * announces.\n */\nexport const useEmbeddedSurfaceGate = (surfaceId: string, isOpen: boolean): EmbeddedSurfaceGate => {\n const transport = useEmbeddedSurfaceTransport();\n const [gate, setGate] = useState(() =>\n getEmbeddedSurfaceTransport() == null ? RELEASED_GATE : PENDING_GATE,\n );\n // The gate stays mounted while closed, so a previous cycle left the surface released. Flip back\n // to pending during the opening render: an effect would land after the browser has painted a\n // frame of the entrance animation. Closing leaves the gate untouched so the overlay's animation\n // declaration is stable while React Aria watches it for an exit animation.\n const [wasOpen, setWasOpen] = useState(isOpen);\n if (wasOpen !== isOpen) {\n setWasOpen(isOpen);\n if (isOpen && transport != null) {\n setGate(PENDING_GATE);\n }\n }\n\n useEffect(() => {\n if (!transport) {\n setGate(RELEASED_GATE);\n return;\n }\n if (!isOpen) {\n return;\n }\n const session = getSession(transport);\n const acknowledgedStartAt = session.acknowledgedAt.get(surfaceId);\n if (acknowledgedStartAt != null) {\n setGate(releasedGateAt(acknowledgedStartAt));\n return;\n }\n\n const listeners =\n session.acknowledgementListeners.get(surfaceId) ?? new Set<(startAt: number) => void>();\n const unsubscribe = () => {\n listeners.delete(release);\n if (listeners.size === 0) {\n session.acknowledgementListeners.delete(surfaceId);\n }\n };\n // A host that never acknowledges (an older dashboard, or none at all) must not leave the\n // overlay paused at opacity 0. Once released either way, the animation is running and a later\n // acknowledgement must not reschedule it.\n const fallback = window.setTimeout(() => {\n unsubscribe();\n setGate(RELEASED_GATE);\n }, EMBEDDED_SURFACE_HOST_ACK_TIMEOUT_MS);\n const release = (startAt: number) => {\n window.clearTimeout(fallback);\n unsubscribe();\n setGate(releasedGateAt(startAt));\n };\n listeners.add(release);\n session.acknowledgementListeners.set(surfaceId, listeners);\n\n return () => {\n window.clearTimeout(fallback);\n unsubscribe();\n };\n }, [isOpen, surfaceId, transport]);\n\n return gate;\n};\n"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ //#region lib/useResizablePanel.d.ts
2
+ declare enum PanelState {
3
+ Drawer = "drawer",
4
+ Maximized = "maximized"
5
+ }
6
+ interface UseResizablePanelOptions {
7
+ initialPanelState?: PanelState;
8
+ initialSize?: number;
9
+ /** Smallest size the panel snaps back to when a drag ends below it. */
10
+ minSize: number;
11
+ /** Fraction of the available space past which a released drag snaps to maximized. */
12
+ snapThreshold?: number;
13
+ }
14
+ interface ResizablePanelState {
15
+ /** Leave maximized and return to the drawer at `size` (null = `minSize`). */
16
+ collapse: () => void;
17
+ /** Open the drawer at the given size. */
18
+ expandTo: (size: number) => void;
19
+ /**
20
+ * Called on every drag frame. `size` is the requested panel size and
21
+ * `maxSize` the space the panel can grow into; both in px.
22
+ */
23
+ handleDragMove: (size: number, maxSize: number) => void;
24
+ /** Called once when a drag ends; snaps to maximized or back to `minSize`. */
25
+ handleDragRelease: () => void;
26
+ maximize: () => void;
27
+ panelState: PanelState;
28
+ /**
29
+ * Return from maximized to the drawer size the panel had before maximizing
30
+ * (for a drag that snapped to maximized, the size when the drag started).
31
+ */
32
+ restore: () => void;
33
+ size: number | null;
34
+ toggleMaximized: () => void;
35
+ }
36
+ /**
37
+ * Size and maximize/restore state for a resizable panel. Coordinates are
38
+ * caller-supplied sizes, so the hook works for both viewport- and
39
+ * container-anchored panels.
40
+ */
41
+ declare const useResizablePanel: ({
42
+ initialPanelState,
43
+ initialSize,
44
+ minSize,
45
+ snapThreshold
46
+ }: UseResizablePanelOptions) => ResizablePanelState;
47
+ //#endregion
48
+ export { PanelState, ResizablePanelState, useResizablePanel };
49
+ //# sourceMappingURL=useResizablePanel.d.mts.map
@@ -0,0 +1,75 @@
1
+ import { useCallback, useRef, useState } from "react";
2
+ //#region lib/useResizablePanel.ts
3
+ let PanelState = /* @__PURE__ */ function(PanelState) {
4
+ PanelState["Drawer"] = "drawer";
5
+ PanelState["Maximized"] = "maximized";
6
+ return PanelState;
7
+ }({});
8
+ /**
9
+ * Size and maximize/restore state for a resizable panel. Coordinates are
10
+ * caller-supplied sizes, so the hook works for both viewport- and
11
+ * container-anchored panels.
12
+ */
13
+ const useResizablePanel = ({ initialPanelState = "drawer", initialSize, minSize, snapThreshold = .95 }) => {
14
+ const [size, setSize] = useState(initialSize ?? null);
15
+ const [panelState, setPanelState] = useState(initialPanelState);
16
+ const maxSizeRef = useRef(null);
17
+ const dragStartSizeRef = useRef(null);
18
+ const sizeBeforeMaximizeRef = useRef(initialPanelState === "maximized" ? initialSize ?? null : null);
19
+ const maximize = useCallback(() => {
20
+ if (panelState !== "maximized") sizeBeforeMaximizeRef.current = size;
21
+ setPanelState("maximized");
22
+ }, [panelState, size]);
23
+ const restore = useCallback(() => {
24
+ setPanelState("drawer");
25
+ setSize(sizeBeforeMaximizeRef.current ?? minSize);
26
+ }, [minSize]);
27
+ const toggleMaximized = useCallback(() => {
28
+ if (panelState === "maximized") restore();
29
+ else maximize();
30
+ }, [
31
+ maximize,
32
+ panelState,
33
+ restore
34
+ ]);
35
+ return {
36
+ collapse: useCallback(() => {
37
+ setPanelState("drawer");
38
+ setSize(null);
39
+ }, []),
40
+ expandTo: useCallback((nextSize) => {
41
+ setPanelState("drawer");
42
+ setSize(nextSize);
43
+ }, []),
44
+ handleDragMove: useCallback((nextSize, maxSize) => {
45
+ if (maxSizeRef.current == null) dragStartSizeRef.current = panelState === "maximized" ? null : size;
46
+ maxSizeRef.current = maxSize;
47
+ setPanelState("drawer");
48
+ setSize(Math.max(0, Math.min(nextSize, maxSize)));
49
+ }, [panelState, size]),
50
+ handleDragRelease: useCallback(() => {
51
+ const maxSize = maxSizeRef.current;
52
+ const dragStartSize = dragStartSizeRef.current;
53
+ maxSizeRef.current = null;
54
+ dragStartSizeRef.current = null;
55
+ if (size == null || maxSize == null) return;
56
+ if (size > maxSize * snapThreshold) {
57
+ sizeBeforeMaximizeRef.current = dragStartSize;
58
+ setPanelState("maximized");
59
+ } else if (size < minSize) setSize(minSize);
60
+ }, [
61
+ minSize,
62
+ size,
63
+ snapThreshold
64
+ ]),
65
+ maximize,
66
+ panelState,
67
+ restore,
68
+ size,
69
+ toggleMaximized
70
+ };
71
+ };
72
+ //#endregion
73
+ export { PanelState, useResizablePanel };
74
+
75
+ //# sourceMappingURL=useResizablePanel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useResizablePanel.mjs","names":[],"sources":["../../lib/useResizablePanel.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nexport enum PanelState {\n Drawer = 'drawer',\n Maximized = 'maximized',\n}\n\ninterface UseResizablePanelOptions {\n initialPanelState?: PanelState;\n initialSize?: number;\n /** Smallest size the panel snaps back to when a drag ends below it. */\n minSize: number;\n /** Fraction of the available space past which a released drag snaps to maximized. */\n snapThreshold?: number;\n}\n\nexport interface ResizablePanelState {\n /** Leave maximized and return to the drawer at `size` (null = `minSize`). */\n collapse: () => void;\n /** Open the drawer at the given size. */\n expandTo: (size: number) => void;\n /**\n * Called on every drag frame. `size` is the requested panel size and\n * `maxSize` the space the panel can grow into; both in px.\n */\n handleDragMove: (size: number, maxSize: number) => void;\n /** Called once when a drag ends; snaps to maximized or back to `minSize`. */\n handleDragRelease: () => void;\n maximize: () => void;\n panelState: PanelState;\n /**\n * Return from maximized to the drawer size the panel had before maximizing\n * (for a drag that snapped to maximized, the size when the drag started).\n */\n restore: () => void;\n size: number | null;\n toggleMaximized: () => void;\n}\n\n/**\n * Size and maximize/restore state for a resizable panel. Coordinates are\n * caller-supplied sizes, so the hook works for both viewport- and\n * container-anchored panels.\n */\nexport const useResizablePanel = ({\n initialPanelState = PanelState.Drawer,\n initialSize,\n minSize,\n snapThreshold = 0.95,\n}: UseResizablePanelOptions): ResizablePanelState => {\n const [size, setSize] = useState<number | null>(initialSize ?? null);\n const [panelState, setPanelState] = useState<PanelState>(initialPanelState);\n const maxSizeRef = useRef<number | null>(null);\n const dragStartSizeRef = useRef<number | null>(null);\n const sizeBeforeMaximizeRef = useRef<number | null>(\n initialPanelState === PanelState.Maximized ? (initialSize ?? null) : null,\n );\n\n const maximize = useCallback(() => {\n if (panelState !== PanelState.Maximized) {\n sizeBeforeMaximizeRef.current = size;\n }\n setPanelState(PanelState.Maximized);\n }, [panelState, size]);\n\n const restore = useCallback(() => {\n setPanelState(PanelState.Drawer);\n setSize(sizeBeforeMaximizeRef.current ?? minSize);\n }, [minSize]);\n\n const toggleMaximized = useCallback(() => {\n if (panelState === PanelState.Maximized) {\n restore();\n } else {\n maximize();\n }\n }, [maximize, panelState, restore]);\n\n const collapse = useCallback(() => {\n setPanelState(PanelState.Drawer);\n setSize(null);\n }, []);\n\n const expandTo = useCallback((nextSize: number) => {\n setPanelState(PanelState.Drawer);\n setSize(nextSize);\n }, []);\n\n const handleDragMove = useCallback(\n (nextSize: number, maxSize: number) => {\n if (maxSizeRef.current == null) {\n dragStartSizeRef.current = panelState === PanelState.Maximized ? null : size;\n }\n maxSizeRef.current = maxSize;\n setPanelState(PanelState.Drawer);\n setSize(Math.max(0, Math.min(nextSize, maxSize)));\n },\n [panelState, size],\n );\n\n const handleDragRelease = useCallback(() => {\n const maxSize = maxSizeRef.current;\n const dragStartSize = dragStartSizeRef.current;\n maxSizeRef.current = null;\n dragStartSizeRef.current = null;\n if (size == null || maxSize == null) {\n return;\n }\n\n if (size > maxSize * snapThreshold) {\n sizeBeforeMaximizeRef.current = dragStartSize;\n setPanelState(PanelState.Maximized);\n } else if (size < minSize) {\n setSize(minSize);\n }\n }, [minSize, size, snapThreshold]);\n\n return {\n collapse,\n expandTo,\n handleDragMove,\n handleDragRelease,\n maximize,\n panelState,\n restore,\n size,\n toggleMaximized,\n };\n};\n"],"mappings":";;AAEA,IAAY,aAAL,yBAAA,YAAA;AACL,YAAA,YAAA;AACA,YAAA,eAAA;;KACD;;;;;;AAuCD,MAAa,qBAAqB,EAChC,oBAAA,UACA,aACA,SACA,gBAAgB,UACmC;CACnD,MAAM,CAAC,MAAM,WAAW,SAAwB,eAAe,KAAK;CACpE,MAAM,CAAC,YAAY,iBAAiB,SAAqB,kBAAkB;CAC3E,MAAM,aAAa,OAAsB,KAAK;CAC9C,MAAM,mBAAmB,OAAsB,KAAK;CACpD,MAAM,wBAAwB,OAC5B,sBAAA,cAA8C,eAAe,OAAQ,KACtE;CAED,MAAM,WAAW,kBAAkB;AACjC,MAAI,eAAA,YACF,uBAAsB,UAAU;AAElC,gBAAA,YAAmC;IAClC,CAAC,YAAY,KAAK,CAAC;CAEtB,MAAM,UAAU,kBAAkB;AAChC,gBAAA,SAAgC;AAChC,UAAQ,sBAAsB,WAAW,QAAQ;IAChD,CAAC,QAAQ,CAAC;CAEb,MAAM,kBAAkB,kBAAkB;AACxC,MAAI,eAAA,YACF,UAAS;MAET,WAAU;IAEX;EAAC;EAAU;EAAY;EAAQ,CAAC;AAyCnC,QAAO;EACL,UAxCe,kBAAkB;AACjC,iBAAA,SAAgC;AAChC,WAAQ,KAAK;KACZ,EAAE,CAqCK;EACR,UApCe,aAAa,aAAqB;AACjD,iBAAA,SAAgC;AAChC,WAAQ,SAAS;KAChB,EAAE,CAiCK;EACR,gBAhCqB,aACpB,UAAkB,YAAoB;AACrC,OAAI,WAAW,WAAW,KACxB,kBAAiB,UAAU,eAAA,cAAsC,OAAO;AAE1E,cAAW,UAAU;AACrB,iBAAA,SAAgC;AAChC,WAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,QAAQ,CAAC,CAAC;KAEnD,CAAC,YAAY,KAAK,CAuBJ;EACd,mBArBwB,kBAAkB;GAC1C,MAAM,UAAU,WAAW;GAC3B,MAAM,gBAAgB,iBAAiB;AACvC,cAAW,UAAU;AACrB,oBAAiB,UAAU;AAC3B,OAAI,QAAQ,QAAQ,WAAW,KAC7B;AAGF,OAAI,OAAO,UAAU,eAAe;AAClC,0BAAsB,UAAU;AAChC,kBAAA,YAAmC;cAC1B,OAAO,QAChB,SAAQ,QAAQ;KAEjB;GAAC;GAAS;GAAM;GAAc,CAMd;EACjB;EACA;EACA;EACA;EACA;EACD"}
@@ -6,4 +6,4 @@ declare enum MessageType {
6
6
  }
7
7
  //#endregion
8
8
  export { MessageType as t };
9
- //# sourceMappingURL=message-Cu84fcqB.d.mts.map
9
+ //# sourceMappingURL=message-DaiDXonE.d.mts.map
@@ -1,4 +1,4 @@
1
- import { t as PseudoClassProps } from "../PseudoClassProps-CcSlKNev.mjs";
1
+ import { t as PseudoClassProps } from "../PseudoClassProps-BPdn-ofQ.mjs";
2
2
  import * as _$styled_components0 from "styled-components";
3
3
 
4
4
  //#region mixins/focus.d.ts
@@ -1,6 +1,6 @@
1
+ import { r as css } from "../styledComponentsInterop-8zScIQyC.mjs";
1
2
  import { isFocusedVisible, isNotDisabled } from "../lib/pseudoClass.mjs";
2
3
  import { Color } from "@persona/design-tokens";
3
- import { css } from "styled-components";
4
4
  //#region mixins/focus.ts
5
5
  const focusStyle = css`
6
6
  outline-offset: 1px;
@@ -1,5 +1,5 @@
1
- import { t as PseudoClassProps } from "../PseudoClassProps-CcSlKNev.mjs";
2
- import { i as Variant } from "../theme-D9Y6NOzb.mjs";
1
+ import { t as PseudoClassProps } from "../PseudoClassProps-BPdn-ofQ.mjs";
2
+ import { i as Variant } from "../theme-Biwx2eJZ.mjs";
3
3
  import * as _$styled_components0 from "styled-components";
4
4
 
5
5
  //#region mixins/hoverable.d.ts
@@ -1,8 +1,8 @@
1
+ import { r as css } from "../styledComponentsInterop-8zScIQyC.mjs";
2
+ import "../variables/transitions.mjs";
1
3
  import { isDisabled, isHovered, isNotDisabled } from "../lib/pseudoClass.mjs";
2
4
  import { focusOutlineControlled } from "./focus.mjs";
3
5
  import "../variables/effect.mjs";
4
- import "../variables/transitions.mjs";
5
- import { css } from "styled-components";
6
6
  //#region mixins/hoverable.ts
7
7
  const hoverMixin = css`
8
8
  box-shadow: