@persona/design-system 0.3.0 → 0.3.1

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 (471) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +3 -3
  3. package/dist/{Action-CnNf5T-l.d.mts → Action-DL3kHI9Z.d.mts} +3 -3
  4. package/dist/Action.d.mts +1 -1
  5. package/dist/AdvancedFilterRuleRow.d.mts +3 -3
  6. package/dist/AdvancedFilterRulesPopover.d.mts +3 -3
  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/{Breadcrumb-DEwZFJHF.d.mts → Breadcrumb-Czgdi0xf.d.mts} +1 -1
  15. package/dist/Breadcrumb.d.mts +1 -1
  16. package/dist/{Breadcrumbs-CqKtnZqu.mjs → Breadcrumbs-ed4wRDS7.mjs} +12 -12
  17. package/dist/{Breadcrumbs-CqKtnZqu.mjs.map → Breadcrumbs-ed4wRDS7.mjs.map} +1 -1
  18. package/dist/{Breadcrumbs-0e_3v9FF.d.mts → Breadcrumbs-zei-cpdU.d.mts} +2 -2
  19. package/dist/Breadcrumbs.d.mts +1 -1
  20. package/dist/{Button-C0F0F2IL.d.mts → Button-CKzNTpPL.d.mts} +4 -4
  21. package/dist/Button.d.mts +1 -1
  22. package/dist/ButtonGroup.d.mts +1 -1
  23. package/dist/{Calendar-BvLNcHQM.d.mts → Calendar-CcxN7y3e.d.mts} +2 -2
  24. package/dist/Calendar.d.mts +1 -1
  25. package/dist/CalendarBase.d.mts +1 -1
  26. package/dist/{Card-BMCB9eFC.mjs → Card-CKrJtn1f.mjs} +4 -4
  27. package/dist/{Card-BMCB9eFC.mjs.map → Card-CKrJtn1f.mjs.map} +1 -1
  28. package/dist/{Card-BxNoIQWw.d.mts → Card-pr4FQWjn.d.mts} +4 -4
  29. package/dist/Card.d.mts +1 -1
  30. package/dist/Card2.d.mts +3 -3
  31. package/dist/{CardV2-B0ZweQYk.mjs → CardV2-D3m5EKlp.mjs} +19 -19
  32. package/dist/{CardV2-B0ZweQYk.mjs.map → CardV2-D3m5EKlp.mjs.map} +1 -1
  33. package/dist/{Checkbox-Bm8exUfH.d.mts → Checkbox-Bmm-r5ei.d.mts} +1 -1
  34. package/dist/{Checkbox-DAvbgZgO.mjs → Checkbox-Ccuicmlo.mjs} +8 -8
  35. package/dist/{Checkbox-DAvbgZgO.mjs.map → Checkbox-Ccuicmlo.mjs.map} +1 -1
  36. package/dist/Checkbox.d.mts +1 -1
  37. package/dist/CheckboxGroupField.d.mts +2 -2
  38. package/dist/ChoicesValueControl.d.mts +1 -1
  39. package/dist/{Combobox-xBrxiUAu.mjs → Combobox-BGRyr_-L.mjs} +22 -22
  40. package/dist/Combobox-BGRyr_-L.mjs.map +1 -0
  41. package/dist/{Combobox-C8ue0cBP.d.mts → Combobox-Bf_Xe1BG.d.mts} +3 -3
  42. package/dist/Combobox.d.mts +2 -2
  43. package/dist/{ComboboxBase-DJGTMf1_.d.mts → ComboboxBase-CWzN8GML.d.mts} +8 -8
  44. package/dist/ComboboxBase.d.mts +1 -1
  45. package/dist/{ComboboxMultiSelect-D7A2bbWU.d.mts → ComboboxMultiSelect-iSuvyOx2.d.mts} +2 -2
  46. package/dist/ComboboxMultiSelect.d.mts +1 -1
  47. package/dist/{ComboboxSingleSelect-D1uzEyKj.d.mts → ComboboxSingleSelect-DVRFKPi1.d.mts} +4 -4
  48. package/dist/ComboboxSingleSelect.d.mts +1 -1
  49. package/dist/{CompactBar-DMuvqaV5.d.mts → CompactBar-C_61pgp7.d.mts} +3 -3
  50. package/dist/CompactBar.d.mts +1 -1
  51. package/dist/{ConfigFormGroup-D2_sajXe.mjs → ConfigFormGroup-DGCTW3by.mjs} +4 -4
  52. package/dist/{ConfigFormGroup-D2_sajXe.mjs.map → ConfigFormGroup-DGCTW3by.mjs.map} +1 -1
  53. package/dist/{ControlBar-Dg8JeU8f.d.mts → ControlBar-0XwbM4yC.d.mts} +2 -2
  54. package/dist/ControlBar.d.mts +1 -1
  55. package/dist/DataTable.d.mts +4 -4
  56. package/dist/{DateField-Com9f2-j.d.mts → DateField-CKeSIhGy.d.mts} +2 -2
  57. package/dist/DateField.d.mts +1 -1
  58. package/dist/{DatePicker-BGO6doLx.d.mts → DatePicker-B1iWrqR5.d.mts} +2 -2
  59. package/dist/{DatePicker-BlnE2MBD.mjs → DatePicker-BNnZ6L1y.mjs} +29 -12
  60. package/dist/DatePicker-BNnZ6L1y.mjs.map +1 -0
  61. package/dist/DatePicker.d.mts +1 -1
  62. package/dist/{DateRangePicker-DfRBm9z4.d.mts → DateRangePicker-BmF9eH9R.d.mts} +2 -2
  63. package/dist/DateRangePicker.d.mts +1 -1
  64. package/dist/DateRangeValueControl.d.mts +2 -2
  65. package/dist/DateValueControl.d.mts +1 -1
  66. package/dist/{DropdownButton-CpWNRUma.mjs → DropdownButton-BlVeFbJ0.mjs} +3 -3
  67. package/dist/{DropdownButton-CpWNRUma.mjs.map → DropdownButton-BlVeFbJ0.mjs.map} +1 -1
  68. package/dist/DropdownButton.d.mts +2 -2
  69. package/dist/{DropdownMenu-BCyV8nC0.mjs → DropdownMenu-82xH1AZr.mjs} +4 -4
  70. package/dist/{DropdownMenu-BCyV8nC0.mjs.map → DropdownMenu-82xH1AZr.mjs.map} +1 -1
  71. package/dist/{DropdownMenu-CnaK78rP.d.mts → DropdownMenu-DuTnq9j7.d.mts} +3 -3
  72. package/dist/DropdownMenu.d.mts +1 -1
  73. package/dist/{ErrorProps-CN2XjaOX.d.mts → ErrorProps-DX50vo-U.d.mts} +1 -1
  74. package/dist/ErrorProps.d.mts +1 -1
  75. package/dist/{FieldRegistry-DdA63Vnh.d.mts → FieldRegistry-D1vghSC_.d.mts} +2 -2
  76. package/dist/FieldRegistry.d.mts +1 -1
  77. package/dist/{FilterBar-CxNsBVrn.d.mts → FilterBar-Ck085Dic.d.mts} +4 -4
  78. package/dist/FilterBar.d.mts +1 -1
  79. package/dist/FilterPickerMenu.d.mts +3 -3
  80. package/dist/FilterPill.d.mts +1 -1
  81. package/dist/FilterPopover.d.mts +2 -2
  82. package/dist/FloatValueControl.d.mts +1 -1
  83. package/dist/FloatingPanel.d.mts +1 -1
  84. package/dist/FloatingPanelContext.d.mts +1 -1
  85. package/dist/{FormControl-Doj2gvF0.d.mts → FormControl-CfpwZGlD.d.mts} +4 -4
  86. package/dist/{FormControl-HVzZEqJH.mjs → FormControl-D1HIqDKm.mjs} +6 -6
  87. package/dist/{FormControl-HVzZEqJH.mjs.map → FormControl-D1HIqDKm.mjs.map} +1 -1
  88. package/dist/FormControl.d.mts +1 -1
  89. package/dist/FormControlLabel.d.mts +2 -2
  90. package/dist/{FormField-D8dHbqZZ.d.mts → FormField-0p4y0sS5.d.mts} +2 -2
  91. package/dist/{FormField-B9P3BWvS.mjs → FormField-CVnbsNvU.mjs} +22 -22
  92. package/dist/FormField-CVnbsNvU.mjs.map +1 -0
  93. package/dist/FormField.d.mts +1 -1
  94. package/dist/{Header-CBlB65NY.d.mts → Header-gDUTQgWj.d.mts} +2 -2
  95. package/dist/Header.d.mts +1 -1
  96. package/dist/{HelperTooltip-C28h1zFl.d.mts → HelperTooltip-CqhiRb5g.d.mts} +3 -3
  97. package/dist/HelperTooltip.d.mts +1 -1
  98. package/dist/{HoverCopyableField-0Bzygbp9.mjs → HoverCopyableField-HWshrU_1.mjs} +31 -20
  99. package/dist/HoverCopyableField-HWshrU_1.mjs.map +1 -0
  100. package/dist/HoverCopyableField.d.mts +15 -4
  101. package/dist/{IconButton-BfDlic2K.mjs → IconButton-BgL3QUVO.mjs} +9 -9
  102. package/dist/{IconButton-BfDlic2K.mjs.map → IconButton-BgL3QUVO.mjs.map} +1 -1
  103. package/dist/{IconButton-CBcW7ZU8.d.mts → IconButton-CLsHdYm7.d.mts} +2 -2
  104. package/dist/IconButton.d.mts +1 -1
  105. package/dist/ImageTile.d.mts +2 -2
  106. package/dist/InlineCombobox.d.mts +2 -2
  107. package/dist/InlineInput.d.mts +1 -1
  108. package/dist/{Input-CVdjkX88.d.mts → Input-BHHWpSKN.d.mts} +6 -6
  109. package/dist/{Input-Bimw8KFj.mjs → Input-DoB8YswA.mjs} +6 -6
  110. package/dist/{Input-Bimw8KFj.mjs.map → Input-DoB8YswA.mjs.map} +1 -1
  111. package/dist/Input.d.mts +1 -1
  112. package/dist/{InputProps-BwKkmImn.d.mts → InputProps-sHxlDiss.d.mts} +2 -2
  113. package/dist/InputProps.d.mts +1 -1
  114. package/dist/IntegerValueControl.d.mts +1 -1
  115. package/dist/LayoutLoadingSpinner.d.mts +11 -0
  116. package/dist/Link.d.mts +3 -3
  117. package/dist/{ListBox-DKZpGYjo.mjs → ListBox-B9uuMt2R.mjs} +15 -15
  118. package/dist/{ListBox-DKZpGYjo.mjs.map → ListBox-B9uuMt2R.mjs.map} +1 -1
  119. package/dist/{ListBox-CDl5oZPX.d.mts → ListBox-BrY1bQ5-.d.mts} +5 -5
  120. package/dist/ListBox.d.mts +1 -1
  121. package/dist/ListBoxField.d.mts +3 -3
  122. package/dist/{LoadingShimmer-DC2vqicd.mjs → LoadingShimmer-dsBWRdTU.mjs} +2 -2
  123. package/dist/{LoadingShimmer-DC2vqicd.mjs.map → LoadingShimmer-dsBWRdTU.mjs.map} +1 -1
  124. package/dist/LoadingShimmer.d.mts +2 -2
  125. package/dist/{LogicRow-CkbyvrUw.d.mts → LogicRow-9a_klV2v.d.mts} +4 -4
  126. package/dist/LogicRow.d.mts +1 -1
  127. package/dist/MaskedInput.d.mts +2 -2
  128. package/dist/MatchHighlight.d.mts +1 -1
  129. package/dist/{Menu-Dir03WA9.mjs → Menu-CHbUf9PQ.mjs} +6 -6
  130. package/dist/{Menu-Dir03WA9.mjs.map → Menu-CHbUf9PQ.mjs.map} +1 -1
  131. package/dist/{Menu-CYRdEnfo.d.mts → Menu-D4Y_J-QI.d.mts} +4 -4
  132. package/dist/Menu.d.mts +1 -1
  133. package/dist/{MiddleTruncatedText-GXI-CPvs.mjs → MiddleTruncatedText-DnF7F_1D.mjs} +4 -4
  134. package/dist/{MiddleTruncatedText-GXI-CPvs.mjs.map → MiddleTruncatedText-DnF7F_1D.mjs.map} +1 -1
  135. package/dist/Modal.d.mts +4 -5
  136. package/dist/{PageHeader-C2IUKhCg.mjs → PageHeader-XxGsFLHb.mjs} +4 -4
  137. package/dist/{PageHeader-C2IUKhCg.mjs.map → PageHeader-XxGsFLHb.mjs.map} +1 -1
  138. package/dist/PageHeader.d.mts +2 -2
  139. package/dist/PageLayout.d.mts +1 -1
  140. package/dist/{PageSelector-vay4jpMp.d.mts → PageSelector-BDo3ge1E.d.mts} +3 -3
  141. package/dist/PageSelector.d.mts +1 -1
  142. package/dist/{Pagination-ygLutOst.d.mts → Pagination-Dcmv7bVe.d.mts} +2 -2
  143. package/dist/{Pagination-0VhVdXv0.mjs → Pagination-DvVKQLdC.mjs} +8 -8
  144. package/dist/{Pagination-0VhVdXv0.mjs.map → Pagination-DvVKQLdC.mjs.map} +1 -1
  145. package/dist/Pagination.d.mts +1 -1
  146. package/dist/{Pii-C7pA72Bh.mjs → Pii-BD48BtZ0.mjs} +2 -2
  147. package/dist/{Pii-C7pA72Bh.mjs.map → Pii-BD48BtZ0.mjs.map} +1 -1
  148. package/dist/Pii.d.mts +1 -1
  149. package/dist/PillShell.d.mts +1 -1
  150. package/dist/{Popover-BkDpDdaO.mjs → Popover-DNH8Jx1-.mjs} +6 -6
  151. package/dist/{Popover-BkDpDdaO.mjs.map → Popover-DNH8Jx1-.mjs.map} +1 -1
  152. package/dist/Popover.d.mts +1 -1
  153. package/dist/ProgressBar.d.mts +1 -1
  154. package/dist/ProgressIndicator.d.mts +1 -1
  155. package/dist/{PseudoClassProps-CcSlKNev.d.mts → PseudoClassProps-DgT5G_z5.d.mts} +1 -1
  156. package/dist/PseudoClassProps.d.mts +1 -1
  157. package/dist/{Radio-BaFutxgV.mjs → Radio-DSMPX5_2.mjs} +5 -5
  158. package/dist/{Radio-BaFutxgV.mjs.map → Radio-DSMPX5_2.mjs.map} +1 -1
  159. package/dist/{RadioGroup-ClMzOZl0.mjs → RadioGroup-D5IITQLz.mjs} +4 -4
  160. package/dist/{RadioGroup-ClMzOZl0.mjs.map → RadioGroup-D5IITQLz.mjs.map} +1 -1
  161. package/dist/{RadioGroup-BuJaitgG.d.mts → RadioGroup-Jl1yAvGu.d.mts} +1 -1
  162. package/dist/RadioGroup.d.mts +1 -1
  163. package/dist/RangeCalendar.d.mts +1 -1
  164. package/dist/RangeCalendarPresets.d.mts +1 -1
  165. package/dist/RuleEditorFields.d.mts +3 -3
  166. package/dist/RulesPill.d.mts +1 -1
  167. package/dist/{SearchInput-Ca3_np5e.d.mts → SearchInput-CaKHRC_s.d.mts} +3 -3
  168. package/dist/SearchInput.d.mts +1 -1
  169. package/dist/SectionHeading.d.mts +1 -1
  170. package/dist/{SegmentedControl-DgyJL4uN.mjs → SegmentedControl-JUgRw_M-.mjs} +5 -5
  171. package/dist/{SegmentedControl-DgyJL4uN.mjs.map → SegmentedControl-JUgRw_M-.mjs.map} +1 -1
  172. package/dist/{SegmentedControl-_I4sWeD7.d.mts → SegmentedControl-e6xDtoHC.d.mts} +2 -2
  173. package/dist/SegmentedControl.d.mts +1 -1
  174. package/dist/{Select-vwXGlHuW.d.mts → Select-CPYztD4m.d.mts} +4 -4
  175. package/dist/{Select-D6MqSYVa.mjs → Select-DX3toj6M.mjs} +12 -12
  176. package/dist/{Select-D6MqSYVa.mjs.map → Select-DX3toj6M.mjs.map} +1 -1
  177. package/dist/Select.d.mts +1 -1
  178. package/dist/Slider.d.mts +1 -1
  179. package/dist/SliderRHF.d.mts +1 -1
  180. package/dist/SliderThumb.d.mts +1 -1
  181. package/dist/{Spacer-CJp0lwkL.mjs → Spacer-BsK8tTwA.mjs} +2 -2
  182. package/dist/{Spacer-CJp0lwkL.mjs.map → Spacer-BsK8tTwA.mjs.map} +1 -1
  183. package/dist/{Spinner-BgBCCHGo.mjs → Spinner-D3wXIoXN.mjs} +3 -3
  184. package/dist/{Spinner-BgBCCHGo.mjs.map → Spinner-D3wXIoXN.mjs.map} +1 -1
  185. package/dist/{Stack-Bl54WmhY.mjs → Stack-Bre2oiov.mjs} +2 -2
  186. package/dist/{Stack-Bl54WmhY.mjs.map → Stack-Bre2oiov.mjs.map} +1 -1
  187. package/dist/{Stack-CkV7k7TE.d.mts → Stack-DHaK1-dw.d.mts} +2 -2
  188. package/dist/Stack.d.mts +1 -1
  189. package/dist/StatusIndicator.d.mts +1 -1
  190. package/dist/{Sticker-xtDMuOoN.mjs → Sticker-CQ6sOKUj.mjs} +6 -6
  191. package/dist/{Sticker-xtDMuOoN.mjs.map → Sticker-CQ6sOKUj.mjs.map} +1 -1
  192. package/dist/{Sticker-Dhx2wqTL.d.mts → Sticker-DnSemOcW.d.mts} +6 -6
  193. package/dist/Sticker.d.mts +1 -1
  194. package/dist/StringValueControl.d.mts +1 -1
  195. package/dist/SwatchPicker.d.mts +1 -1
  196. package/dist/Tab.d.mts +3 -3
  197. package/dist/{TabBar-D6UocZXi.mjs → TabBar-sYllYizt.mjs} +7 -7
  198. package/dist/{TabBar-D6UocZXi.mjs.map → TabBar-sYllYizt.mjs.map} +1 -1
  199. package/dist/TabBarIconButton.d.mts +2 -2
  200. package/dist/{Table-D1WyUQuv.mjs → Table-C2pkP5Xg.mjs} +8 -8
  201. package/dist/{Table-D1WyUQuv.mjs.map → Table-C2pkP5Xg.mjs.map} +1 -1
  202. package/dist/{Table-cO7ZwGPM.d.mts → Table-CFbPINKr.d.mts} +1 -1
  203. package/dist/Table.d.mts +1 -1
  204. package/dist/{TableBody-CirMgfAV.d.mts → TableBody-BQsGc4Lw.d.mts} +1 -1
  205. package/dist/TableBody.d.mts +1 -1
  206. package/dist/{TableBox-C5qWhr82.mjs → TableBox-CaTHcR4F.mjs} +16 -16
  207. package/dist/{TableBox-C5qWhr82.mjs.map → TableBox-CaTHcR4F.mjs.map} +1 -1
  208. package/dist/TableBox.d.mts +2 -2
  209. package/dist/{TableBoxCell-DmVX_tgn.d.mts → TableBoxCell-52g97gEg.d.mts} +8 -8
  210. package/dist/TableBoxCell.d.mts +1 -1
  211. package/dist/TableBoxField.d.mts +4 -4
  212. package/dist/{TableBoxRow-nwq41Bpi.d.mts → TableBoxRow-DnoumHIE.d.mts} +4 -4
  213. package/dist/TableBoxRow.d.mts +1 -1
  214. package/dist/{TableBoxRowActions-B4_ojiQo.d.mts → TableBoxRowActions-CDcREhP4.d.mts} +2 -2
  215. package/dist/TableBoxRowActions.d.mts +1 -1
  216. package/dist/TableCell.d.mts +1 -1
  217. package/dist/{TableControls-CZ9iu3ma.mjs → TableControls-3bXyd8gS.mjs} +104 -79
  218. package/dist/TableControls-3bXyd8gS.mjs.map +1 -0
  219. package/dist/{TableControls-RwIPBxyU.d.mts → TableControls-CrGGlkEG.d.mts} +5 -9
  220. package/dist/TableControls.d.mts +1 -1
  221. package/dist/{TableControlsContext-D_SBFZN1.d.mts → TableControlsContext-BKZt2Jid.d.mts} +2 -2
  222. package/dist/TableControlsContext.d.mts +1 -1
  223. package/dist/{TableHead-DMq_q_W0.d.mts → TableHead-CqVIJfjh.d.mts} +1 -1
  224. package/dist/TableHead.d.mts +1 -1
  225. package/dist/{TableHeaderCell-C2pqXBYO.d.mts → TableHeaderCell-DK4R8vdK.d.mts} +1 -1
  226. package/dist/TableHeaderCell.d.mts +1 -1
  227. package/dist/{TableLayout-DQKu6Rcj.d.mts → TableLayout-BcIazRB-.d.mts} +1 -1
  228. package/dist/TableLayout.d.mts +1 -1
  229. package/dist/{TableRow-CPqZ8DK3.d.mts → TableRow-DdJcjG2b.d.mts} +2 -2
  230. package/dist/TableRow.d.mts +1 -1
  231. package/dist/TableTH.d.mts +1 -1
  232. package/dist/{TableViewConfigurationDropdown-BYPh4dIP.d.mts → TableViewConfigurationDropdown-CHBOjw7O.d.mts} +5 -3
  233. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  234. package/dist/{TechnicalSticker-DTjg6d2F.mjs → TechnicalSticker-D3eeGMDR.mjs} +6 -6
  235. package/dist/{TechnicalSticker-DTjg6d2F.mjs.map → TechnicalSticker-D3eeGMDR.mjs.map} +1 -1
  236. package/dist/TechnicalSticker.d.mts +1 -1
  237. package/dist/{Text-RcEfNFLx.mjs → Text-B0orb-cZ.mjs} +2 -2
  238. package/dist/{Text-RcEfNFLx.mjs.map → Text-B0orb-cZ.mjs.map} +1 -1
  239. package/dist/{Text-CfIFUyHt.d.mts → Text-BIgrwIdS.d.mts} +4 -4
  240. package/dist/Text.d.mts +1 -1
  241. package/dist/{TextArea-DhPBI_1-.d.mts → TextArea-CiLttt0s.d.mts} +2 -2
  242. package/dist/{TextArea-ZMgbE_Lh.mjs → TextArea-DWXuV2aZ.mjs} +4 -4
  243. package/dist/{TextArea-ZMgbE_Lh.mjs.map → TextArea-DWXuV2aZ.mjs.map} +1 -1
  244. package/dist/TextArea.d.mts +1 -1
  245. package/dist/{TextUnderlineTooltip-BzmmiJlC.d.mts → TextUnderlineTooltip-_7mIrZ2-.d.mts} +3 -3
  246. package/dist/TextUnderlineTooltip.d.mts +1 -1
  247. package/dist/Tile.d.mts +2 -2
  248. package/dist/Toast.d.mts +1 -1
  249. package/dist/{Toggle-BGGQ4Ukl.d.mts → Toggle-Cav7bMxg.d.mts} +1 -1
  250. package/dist/{Toggle-BPgfSjuu.mjs → Toggle-e8DCYa6i.mjs} +7 -7
  251. package/dist/{Toggle-BPgfSjuu.mjs.map → Toggle-e8DCYa6i.mjs.map} +1 -1
  252. package/dist/Toggle.d.mts +1 -1
  253. package/dist/{Tooltip-D_a-RwAN.d.mts → Tooltip-DX-N-szt.d.mts} +3 -3
  254. package/dist/{Tooltip-BvDbmXak.mjs → Tooltip-iJcfJqxn.mjs} +5 -5
  255. package/dist/{Tooltip-BvDbmXak.mjs.map → Tooltip-iJcfJqxn.mjs.map} +1 -1
  256. package/dist/Tooltip.d.mts +1 -1
  257. package/dist/{TruncatedText-BJnowVTx.d.mts → TruncatedText-D2R7uy_y.d.mts} +2 -2
  258. package/dist/components/Attribute/index.mjs +7 -7
  259. package/dist/components/Attribute/index.mjs.map +1 -1
  260. package/dist/components/Badge/index.mjs +1 -1
  261. package/dist/components/Banner/index.mjs +3 -3
  262. package/dist/components/Breadcrumbs/index.d.mts +1 -1
  263. package/dist/components/Breadcrumbs/index.mjs +1 -1
  264. package/dist/components/Button/index.d.mts +2 -2
  265. package/dist/components/Button/index.mjs +1 -1
  266. package/dist/components/ButtonGroup/index.mjs +4 -4
  267. package/dist/components/Card/index.d.mts +2 -2
  268. package/dist/components/Card/index.mjs +1 -1
  269. package/dist/components/CardV2/index.d.mts +1 -1
  270. package/dist/components/CardV2/index.mjs +1 -1
  271. package/dist/components/Checkbox/index.d.mts +1 -1
  272. package/dist/components/Checkbox/index.mjs +1 -1
  273. package/dist/components/Combobox/index.d.mts +2 -2
  274. package/dist/components/Combobox/index.mjs +1 -1
  275. package/dist/components/ConfigFormGroup/index.mjs +2 -2
  276. package/dist/components/DataTable/TableControls/index.d.mts +15 -15
  277. package/dist/components/DataTable/TableControls/index.mjs +1 -1
  278. package/dist/components/DataTable/index.mjs +25 -25
  279. package/dist/components/DataTable/index.mjs.map +1 -1
  280. package/dist/components/DataTable/types.d.mts +2 -2
  281. package/dist/components/DatePicker/index.d.mts +4 -4
  282. package/dist/components/DatePicker/index.mjs +1 -1
  283. package/dist/components/DropdownButton/index.mjs +1 -1
  284. package/dist/components/DropdownMenu/index.d.mts +1 -1
  285. package/dist/components/DropdownMenu/index.mjs +1 -1
  286. package/dist/components/FloatingPanel/index.mjs +8 -8
  287. package/dist/components/FloatingPanel/index.mjs.map +1 -1
  288. package/dist/components/FormControl/index.d.mts +2 -2
  289. package/dist/components/FormControl/index.mjs +2 -2
  290. package/dist/components/FormField/index.d.mts +1 -1
  291. package/dist/components/FormField/index.mjs +1 -1
  292. package/dist/components/HoverCopyableField/index.d.mts +2 -2
  293. package/dist/components/HoverCopyableField/index.mjs +2 -2
  294. package/dist/components/ImageTile/index.mjs +10 -10
  295. package/dist/components/Input/index.d.mts +1 -1
  296. package/dist/components/Input/index.mjs +1 -1
  297. package/dist/components/Link/index.mjs +4 -4
  298. package/dist/components/Link/index.mjs.map +1 -1
  299. package/dist/components/ListBox/index.d.mts +3 -3
  300. package/dist/components/ListBox/index.mjs +1 -1
  301. package/dist/components/LoadingShimmer/index.mjs +1 -1
  302. package/dist/components/MaskedInput/index.mjs +2 -2
  303. package/dist/components/MatchHighlight/index.mjs +1 -1
  304. package/dist/components/Menu/index.d.mts +1 -1
  305. package/dist/components/Menu/index.mjs +1 -1
  306. package/dist/components/Modal/index.mjs +42 -12
  307. package/dist/components/Modal/index.mjs.map +1 -1
  308. package/dist/components/PageHeader/index.mjs +1 -1
  309. package/dist/components/Pagination/index.d.mts +3 -3
  310. package/dist/components/Pagination/index.mjs +1 -1
  311. package/dist/components/Pii/index.mjs +1 -1
  312. package/dist/components/Popover/index.mjs +1 -1
  313. package/dist/components/ProgressBar/index.mjs +2 -2
  314. package/dist/components/ProgressIndicator/index.mjs +2 -2
  315. package/dist/components/Radio/index.mjs +1 -1
  316. package/dist/components/RadioGroup/index.d.mts +1 -1
  317. package/dist/components/RadioGroup/index.mjs +1 -1
  318. package/dist/components/SegmentedControl/index.d.mts +1 -1
  319. package/dist/components/SegmentedControl/index.mjs +1 -1
  320. package/dist/components/Select/index.d.mts +1 -1
  321. package/dist/components/Select/index.mjs +1 -1
  322. package/dist/components/Slider/index.mjs +4 -4
  323. package/dist/components/Spacer/index.mjs +1 -1
  324. package/dist/components/Spinner/index.mjs +1 -1
  325. package/dist/components/Stack/index.d.mts +1 -1
  326. package/dist/components/Stack/index.mjs +1 -1
  327. package/dist/components/StatusIndicator/index.mjs +2 -2
  328. package/dist/components/Sticker/index.d.mts +1 -1
  329. package/dist/components/Sticker/index.mjs +1 -1
  330. package/dist/components/SwatchPicker/index.mjs +1 -1
  331. package/dist/components/TabBar/index.mjs +1 -1
  332. package/dist/components/Table/index.d.mts +7 -7
  333. package/dist/components/Table/index.mjs +1 -1
  334. package/dist/components/TableBox/index.d.mts +2 -2
  335. package/dist/components/TableBox/index.mjs +1 -1
  336. package/dist/components/TechnicalSticker/index.mjs +1 -1
  337. package/dist/components/Text/index.d.mts +1 -1
  338. package/dist/components/Text/index.mjs +1 -1
  339. package/dist/components/TextArea/index.d.mts +1 -1
  340. package/dist/components/TextArea/index.mjs +1 -1
  341. package/dist/components/Tile/index.mjs +5 -5
  342. package/dist/components/Toast/index.mjs +5 -5
  343. package/dist/components/Toggle/index.d.mts +1 -1
  344. package/dist/components/Toggle/index.mjs +1 -1
  345. package/dist/components/Tooltip/index.d.mts +3 -3
  346. package/dist/components/Tooltip/index.mjs +1 -1
  347. package/dist/compound-expression.d.mts +1 -1
  348. package/dist/{constants-BASogfT_.d.mts → constants-bA9kCzRQ.d.mts} +1 -1
  349. package/dist/constants.d.mts +1 -1
  350. package/dist/display.d.mts +1 -1
  351. package/dist/fieldPickerOptions.d.mts +2 -2
  352. package/dist/{filter-size-context-Bw5F7082.d.mts → filter-size-context-C7injfBh.d.mts} +2 -2
  353. package/dist/filter-size-context.d.mts +1 -1
  354. package/dist/helpers.d.mts +1 -1
  355. package/dist/{index--5Mfhlkj.d.mts → index-BPfK-u7y.d.mts} +2 -2
  356. package/dist/{index-DiCnyORA.d.mts → index-BxBsQi2S.d.mts} +5 -5
  357. package/dist/{index-C1bz13uw.d.mts → index-d_fTFuMM.d.mts} +5 -5
  358. package/dist/index.d.mts +1 -1
  359. package/dist/index2.d.mts +1 -1
  360. package/dist/index3.d.mts +3 -3
  361. package/dist/index4.d.mts +10 -10
  362. package/dist/{input-CzO-6_1V.d.mts → input-D9FuQmlI.d.mts} +3 -3
  363. package/dist/inputFields.d.mts +11 -11
  364. package/dist/{intersperse-yd3oMrQl.mjs → intersperse-CLkblj9A.mjs} +1 -1
  365. package/dist/{intersperse-yd3oMrQl.mjs.map → intersperse-CLkblj9A.mjs.map} +1 -1
  366. package/dist/lib/GlobalStyles.mjs +1 -1
  367. package/dist/lib/HeadlessAriaButton.mjs +1 -1
  368. package/dist/lib/MiddleTruncatedText.mjs +1 -1
  369. package/dist/lib/PDSProvider.d.mts +1 -1
  370. package/dist/lib/PDSProvider.mjs +1 -1
  371. package/dist/lib/TruncatedText.d.mts +1 -1
  372. package/dist/lib/TruncatedText.mjs +2 -2
  373. package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
  374. package/dist/lib/TruncatedTextWithTooltip.mjs +2 -2
  375. package/dist/lib/embeddedSurfaceProtocol.d.mts +13 -1
  376. package/dist/lib/embeddedSurfaceProtocol.mjs +32 -5
  377. package/dist/lib/embeddedSurfaceProtocol.mjs.map +1 -1
  378. package/dist/lib/message.d.mts +1 -1
  379. package/dist/lib/pseudoClass.d.mts +8 -8
  380. package/dist/lib/useEmbeddedSurface.d.mts +31 -3
  381. package/dist/lib/useEmbeddedSurface.mjs +118 -13
  382. package/dist/lib/useEmbeddedSurface.mjs.map +1 -1
  383. package/dist/{message-Cu84fcqB.d.mts → message-CqKB5mko.d.mts} +1 -1
  384. package/dist/mixins/focus.d.mts +1 -1
  385. package/dist/mixins/focus.mjs +1 -1
  386. package/dist/mixins/hoverable.d.mts +2 -2
  387. package/dist/mixins/hoverable.mjs +2 -2
  388. package/dist/mixins/input.d.mts +1 -1
  389. package/dist/mixins/input.mjs +2 -2
  390. package/dist/mixins/menuItem.d.mts +2 -2
  391. package/dist/mixins/menuItem.mjs +1 -1
  392. package/dist/mixins/print/index.mjs +1 -1
  393. package/dist/mixins/text.d.mts +1 -1
  394. package/dist/mixins/text.mjs +1 -1
  395. package/dist/{operators-CmSqHnTH.d.mts → operators-CgcsYzfy.d.mts} +2 -2
  396. package/dist/operators.d.mts +1 -1
  397. package/dist/patterns/LayoutLoadingShimmer/index.mjs +6 -6
  398. package/dist/patterns/LayoutLoadingSpinner/index.d.mts +2 -0
  399. package/dist/patterns/LayoutLoadingSpinner/index.mjs +56 -0
  400. package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -0
  401. package/dist/patterns/PageLayout/index.mjs +1 -1
  402. package/dist/styledComponentsInterop-8zScIQyC.mjs +33 -0
  403. package/dist/styledComponentsInterop-8zScIQyC.mjs.map +1 -0
  404. package/dist/{text-BaQdW8qa.d.mts → text-xwtyWIbE.d.mts} +1 -1
  405. package/dist/{theme-D9Y6NOzb.d.mts → theme-Ftogn9Wo.d.mts} +1 -1
  406. package/dist/theme.d.mts +1 -1
  407. package/dist/{types-DEh_pXgS.d.mts → types-0_9G0kWg.d.mts} +3 -1
  408. package/dist/{types-NJtAxsU1.d.mts → types-BrNreYUU.d.mts} +2 -2
  409. package/dist/{types-C-TkDdkG.d.mts → types-D55MZSyx.d.mts} +1 -1
  410. package/dist/{types-TV9nVfSe.d.mts → types-DVsBRqjZ.d.mts} +1 -1
  411. package/dist/types.d.mts +1 -1
  412. package/dist/types2.d.mts +1 -1
  413. package/dist/types3.d.mts +1 -1
  414. package/dist/types4.d.mts +1 -1
  415. package/dist/useComboboxFooterAction.d.mts +1 -1
  416. package/dist/{useFilterStateV2-C4itmN4S.d.mts → useFilterStateV2-D8Q8QKhS.d.mts} +3 -3
  417. package/dist/useFilterStateV2.d.mts +1 -1
  418. package/dist/{useFormField-B2U4GOH4.d.mts → useFormField-BBbq1izo.d.mts} +2 -2
  419. package/dist/{useFormField-eftOPiXj.mjs → useFormField-Bz2iMPBO.mjs} +2 -2
  420. package/dist/{useFormField-eftOPiXj.mjs.map → useFormField-Bz2iMPBO.mjs.map} +1 -1
  421. package/dist/useFormField.d.mts +1 -1
  422. package/dist/{useFormGroup-BMukAMAd.mjs → useFormGroup-CaTiD_Yt.mjs} +1 -1
  423. package/dist/{useFormGroup-BMukAMAd.mjs.map → useFormGroup-CaTiD_Yt.mjs.map} +1 -1
  424. package/dist/{useTableBoxDragAndDrop-CpemHLhL.d.mts → useTableBoxDragAndDrop-Bye8gJTl.d.mts} +1 -1
  425. package/dist/useTableBoxDragAndDrop.d.mts +1 -1
  426. package/dist/useTruncation.d.mts +1 -1
  427. package/dist/{utilities-DnSIlR1i.d.mts → utilities-Bmwk_DRn.d.mts} +1 -1
  428. package/dist/utilities.d.mts +1 -1
  429. package/dist/utils/storybook.mjs +1 -1
  430. package/dist/utils/testing.d.mts +1 -1
  431. package/dist/utils/testing.mjs +1 -1
  432. package/dist/utils.d.mts +1 -1
  433. package/dist/utils2.d.mts +12 -1
  434. package/dist/{validation-B5IXsdkE.d.mts → validation-CAtTuHO9.d.mts} +3 -3
  435. package/dist/validation.d.mts +1 -1
  436. package/dist/{value-control-resolver-BPlTeIX7.d.mts → value-control-resolver-DadI8r9a.d.mts} +2 -2
  437. package/dist/value-control-resolver.d.mts +1 -1
  438. package/dist/variables/keyframes.mjs +1 -1
  439. package/llms.txt +4 -4
  440. package/package.json +4 -2
  441. package/skills/ui-authoring/COMPONENTS.md +69 -305
  442. package/skills/ui-authoring/PATTERNS.md +362 -0
  443. package/skills/ui-authoring/SKILL.md +15 -147
  444. package/skills/ui-authoring/TOKENS.md +400 -0
  445. package/dist/Combobox-xBrxiUAu.mjs.map +0 -1
  446. package/dist/DatePicker-BlnE2MBD.mjs.map +0 -1
  447. package/dist/FormField-B9P3BWvS.mjs.map +0 -1
  448. package/dist/HoverCopyableField-0Bzygbp9.mjs.map +0 -1
  449. package/dist/TableControls-CZ9iu3ma.mjs.map +0 -1
  450. package/skills/ui-authoring/EXAMPLES.md +0 -370
  451. package/skills/ui-authoring/REFERENCE.md +0 -293
  452. /package/dist/{index-7rWKHdox.d.mts → index-0-W_aPej.d.mts} +0 -0
  453. /package/dist/{index-BMBcfD_R.d.mts → index-7in8TPrM.d.mts} +0 -0
  454. /package/dist/{index-BOn0AAue.d.mts → index-BINnViIh.d.mts} +0 -0
  455. /package/dist/{index-BYd3Btr1.d.mts → index-BNRXMhlr.d.mts} +0 -0
  456. /package/dist/{index-CKKoxA9V.d.mts → index-BO_854F2.d.mts} +0 -0
  457. /package/dist/{index-CNxS4Tlu.d.mts → index-BSVhZrWN.d.mts} +0 -0
  458. /package/dist/{index-CRo77wc3.d.mts → index-BrGZHEgX.d.mts} +0 -0
  459. /package/dist/{index-CWB6exYm.d.mts → index-BwAfCVZH2.d.mts} +0 -0
  460. /package/dist/{index-CtJuGxUp.d.mts → index-CCt0lwyI.d.mts} +0 -0
  461. /package/dist/{index-CzItj62a.d.mts → index-CDGG7lCB.d.mts} +0 -0
  462. /package/dist/{index-D4DUvwPf.d.mts → index-CFhUdAHM.d.mts} +0 -0
  463. /package/dist/{index-D5tSVhTd.d.mts → index-CREkvfw9.d.mts} +0 -0
  464. /package/dist/{index-DGsJdI5l.d.mts → index-CROz1VSV.d.mts} +0 -0
  465. /package/dist/{index-DkrC-i1D.d.mts → index-CzUpNo0e.d.mts} +0 -0
  466. /package/dist/{index-DztUdPP_.d.mts → index-DA6_cwf8.d.mts} +0 -0
  467. /package/dist/{index-Es5nKSSL.d.mts → index-DM6vVDZD.d.mts} +0 -0
  468. /package/dist/{index-FtE8MXJ_.d.mts → index-DeVKzGce.d.mts} +0 -0
  469. /package/dist/{index-IE5cwTAE2.d.mts → index-Jh0C5PIG.d.mts} +0 -0
  470. /package/dist/{index-e6k85DKM.d.mts → index-PWQavSPf.d.mts} +0 -0
  471. /package/dist/{index-ehD5GjMH.d.mts → index-sViox9YW.d.mts} +0 -0
@@ -1,5 +1,5 @@
1
- import { o as StickerProps } from "../../Sticker-Dhx2wqTL.mjs";
2
- import { l as MenuItemProps } from "../../Menu-CYRdEnfo.mjs";
1
+ import { o as StickerProps } from "../../Sticker-DnSemOcW.mjs";
2
+ import { l as MenuItemProps } from "../../Menu-D4Y_J-QI.mjs";
3
3
  import { ReactNode } from "react";
4
4
  import { Column, DeepKeys, FilterFnOption, Header, RowData, SortingState, Table } from "@tanstack/react-table";
5
5
 
@@ -1,5 +1,5 @@
1
- import { n as DatePickerProps, t as DatePicker } from "../../DatePicker-BGO6doLx.mjs";
2
- import { n as DateRangePicker, r as DateRangePickerProps, t as DateRange } from "../../DateRangePicker-DfRBm9z4.mjs";
3
- import { t as DateField } from "../../DateField-Com9f2-j.mjs";
4
- import { t as Calendar } from "../../Calendar-BvLNcHQM.mjs";
1
+ import { n as DatePickerProps, t as DatePicker } from "../../DatePicker-B1iWrqR5.mjs";
2
+ import { n as DateRangePicker, r as DateRangePickerProps, t as DateRange } from "../../DateRangePicker-BmF9eH9R.mjs";
3
+ import { t as DateField } from "../../DateField-CKeSIhGy.mjs";
4
+ import { t as Calendar } from "../../Calendar-CcxN7y3e.mjs";
5
5
  export { Calendar, DateField, DatePicker, DatePicker as default, DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps };
@@ -1,2 +1,2 @@
1
- import { i as Calendar, n as DatePicker, r as DateField, t as DateRangePicker } from "../../DatePicker-BlnE2MBD.mjs";
1
+ import { i as Calendar, n as DatePicker, r as DateField, t as DateRangePicker } from "../../DatePicker-BNnZ6L1y.mjs";
2
2
  export { Calendar, DateField, DatePicker, DatePicker as default, DateRangePicker };
@@ -1,2 +1,2 @@
1
- import { t as DropdownButton } from "../../DropdownButton-CpWNRUma.mjs";
1
+ import { t as DropdownButton } from "../../DropdownButton-BlVeFbJ0.mjs";
2
2
  export { DropdownButton, DropdownButton as default };
@@ -1,2 +1,2 @@
1
- import { n as DropdownMenuProps, r as _default, t as DropdownMenu } from "../../DropdownMenu-CnaK78rP.mjs";
1
+ import { n as DropdownMenuProps, r as _default, t as DropdownMenu } from "../../DropdownMenu-DuTnq9j7.mjs";
2
2
  export { DropdownMenu, DropdownMenuProps, _default as default };
@@ -1,2 +1,2 @@
1
- import { n as DropdownMenu_default, t as DropdownMenu } from "../../DropdownMenu-BCyV8nC0.mjs";
1
+ import { n as DropdownMenu_default, t as DropdownMenu } from "../../DropdownMenu-82xH1AZr.mjs";
2
2
  export { DropdownMenu, DropdownMenu_default as default };
@@ -1,15 +1,15 @@
1
- import "../../variables/effect.mjs";
2
- import { paragraphMixins } from "../../mixins/text.mjs";
3
- import { n as Stack } from "../../Stack-Bl54WmhY.mjs";
4
1
  import ConfigContext from "../../lib/ConfigContext.mjs";
2
+ import { a as styled, r as css } from "../../styledComponentsInterop-8zScIQyC.mjs";
3
+ import { paragraphMixins } from "../../mixins/text.mjs";
5
4
  import { Z_INDICES } from "../../lib/zindex.mjs";
6
- import { t as IconButton } from "../../IconButton-BfDlic2K.mjs";
5
+ import "../../variables/effect.mjs";
6
+ import { n as Stack } from "../../Stack-Bre2oiov.mjs";
7
+ import { t as IconButton } from "../../IconButton-BgL3QUVO.mjs";
7
8
  import { BorderRadius, Color, Spacing } from "@persona/design-tokens";
8
- import styled, { css } from "styled-components";
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
- import { useLocation } from "react-router-dom";
11
9
  import { cloneElement, createContext, isValidElement, useCallback, useContext, useEffect, useRef, useState } from "react";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
11
  import { ArrowCollapseIcon, ArrowExpandIcon, XIcon } from "@persona/icons";
12
+ import { useLocation } from "react-router-dom";
13
13
  import { motion, useDragControls, useMotionValue, useReducedMotion } from "framer-motion";
14
14
  import { createPortal, flushSync } from "react-dom";
15
15
  import { v4 } from "uuid";
@@ -538,7 +538,7 @@ function FloatingPanel({ title = "Panel title", children, portal = true, trigger
538
538
  /* @__PURE__ */ jsx(ResizeHandleRight, { onMouseDown: (event) => handleResizeMouseDown(event, "e") })
539
539
  ]
540
540
  });
541
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [dismissOnNavigate && /* @__PURE__ */ jsx(DismissOnNavigate, { onClose }), panelContent] });
541
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [dismissOnNavigate && /* @__PURE__ */ jsx(DismissOnNavigate, { onClose }), panelContent] });
542
542
  return portal ? createPortal(content, document.body) : content;
543
543
  }
544
544
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["uuid"],"sources":["../../../components/FloatingPanel/utils.ts","../../../components/FloatingPanel/FloatingPanel.tsx","../../../components/FloatingPanel/FloatingPanelContext.tsx","../../../components/FloatingPanel/FloatingPanelRenderer.tsx"],"sourcesContent":["export const PADDING = 8;\nexport const EDGE_PADDING = PADDING * 6;\n\n// Cap a content-fitting panel's height to the room below its top edge so it\n// can't overflow the viewport bottom when anchored partway down the screen.\nexport function autoFitMaxHeight(viewportHeight: number, topOffset: number, minHeight: number) {\n return Math.max(minHeight, viewportHeight - Math.max(EDGE_PADDING, topOffset) - EDGE_PADDING);\n}\n","import { flip, offset, type Placement, shift, useFloating } from '@floating-ui/react';\nimport { motion, useDragControls, useMotionValue, useReducedMotion } from 'framer-motion';\nimport {\n isValidElement,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useLocation } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\n\nimport { IconButton } from '@persona/design-system/components/Button';\nimport Stack from '@persona/design-system/components/Stack';\nimport { Z_INDICES } from '@persona/design-system/lib/zindex';\nimport { paragraphMixins } from '@persona/design-system/mixins/text';\nimport { Elevation } from '@persona/design-system/variables/effect';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { ArrowCollapseIcon, ArrowExpandIcon, XIcon } from '@persona/icons';\nimport ConfigContext from 'design-system/lib/ConfigContext';\n\nimport { autoFitMaxHeight, PADDING } from './utils';\n\nexport const FLOATING_PANEL_ID_PREFIX = 'floating-panel__' as const;\n\nenum ResizeDirection {\n North = 'n',\n South = 's',\n East = 'e',\n West = 'w',\n NorthEast = 'ne',\n NorthWest = 'nw',\n SouthEast = 'se',\n SouthWest = 'sw',\n}\n\nexport interface FloatingPanelProps {\n /** The title text displayed in the panel header */\n title: ReactNode;\n /** Callback function called when the close button is clicked */\n onClose?: () => void;\n /** Content to render inside the main panel area */\n children?: ReactNode;\n /** Optional React component rendered to the left of the expand button in the header */\n headerActions?: ReactNode;\n\n /** Whether the panel displays the fullsize button */\n canFullsize?: boolean;\n\n /** When true, the panel opens already in full-size (maximized) mode. */\n defaultFullSize?: boolean;\n\n /** Initial width of the panel in pixels */\n initialWidth?: number;\n /** Initial height of the panel in pixels */\n initialHeight?: number;\n /** Minimum width the panel can be resized to in pixels */\n minWidth?: number;\n /** Minimum height the panel can be resized to in pixels */\n minHeight?: number;\n\n footerButtons?: ReactNode;\n\n footerAdditionalAction?: ReactNode;\n\n portal?: boolean;\n\n /** Reference to the element that triggered this panel, used for automatic positioning */\n triggerRef?: RefObject<HTMLElement>;\n\n /** Which placement of the trigger element to position the panel on */\n placement?: Placement;\n\n /** Additional main axis offset in pixels from the calculated position. Main axis is defined as the axis in position to where its being defined\n * i.e. right, top, left ,bottom */\n mainAxisOffset?: number;\n\n /** Additional cross offset in pixels from the calculated position. Cross is defined as the axis that runs along the alignment\n * of the floating element. */\n crossAxisOffset?: number;\n\n /** remove padding from the panel content */\n noPadding?: boolean;\n\n /** When true, automatically calls `onClose` if the route changes after the\n * panel mounts. Mirrors the auto-dismiss-on-navigation behavior provided by\n * `PanelProvider` / `usePersistentFloatingPanel` for panels that don't opt\n * into the persistent panel context. Defaults to `false` so existing\n * consumers (e.g. dirty-check confirmation flows) are not broken. */\n dismissOnNavigate?: boolean;\n\n /** When true, the panel's height auto-fits its content via CSS (`max-content`)\n * up to the viewport, instead of using `initialHeight`. Once the user manually\n * resizes, the panel switches to pixel mode and stays there. `initialHeight`\n * is ignored while auto-fitting. */\n fitContent?: boolean;\n}\n\nconst FloatingPanelContainer = styled(motion.div)<{\n $fitHeight?: boolean;\n $maxHeight?: number;\n $minHeight?: number;\n}>`\n position: absolute;\n z-index: ${Z_INDICES.modal};\n background: ${({ theme }) => theme.color.background.primary};\n border: 1px solid ${Color.BorderDivider};\n border-radius: ${BorderRadius.Lg};\n box-shadow: ${Elevation.Low};\n display: flex;\n flex-direction: column;\n cursor: auto;\n ${({ $fitHeight, $maxHeight, $minHeight }) =>\n $fitHeight &&\n css`\n height: auto;\n max-height: ${$maxHeight ?? 0}px;\n min-height: ${$minHeight ?? 0}px;\n `}\n`;\n\nconst DragHandle = styled(motion.div)<{ isFullSize: boolean }>`\n cursor: ${({ isFullSize }) => (isFullSize ? 'default' : 'grab')};\n user-select: none;\n\n &:active {\n cursor: ${({ isFullSize }) => (isFullSize ? 'default' : 'grabbing')};\n }\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-height: 48px;\n height: 48px;\n overflow: hidden;\n padding: ${Spacing[1]} ${Spacing[1]} ${Spacing[1]} ${Spacing[3]};\n border-bottom: 1px solid ${Color.BorderDivider};\n`;\n\nconst Footer = styled.div`\n padding: ${Spacing[1]} ${Spacing[1]} ${Spacing[1]} ${Spacing[3]};\n border-top: 1px solid ${Color.BorderDivider};\n overflow-x: hidden;\n background-color: ${({ theme }) => theme.color.background.primary};\n width: 100%;\n border-radius: 0 0 ${BorderRadius.Lg} ${BorderRadius.Lg};\n`;\n\nconst ResizeHandleBase = styled.div`\n position: absolute;\n user-select: none;\n`;\n\n// Sets the width and height for base corner to 20px\nconst ResizeHandleBaseCorner = styled(ResizeHandleBase)`\n width: 1.25rem;\n height: 1.25rem;\n`;\n\nconst ResizeHandleBottomRight = styled(ResizeHandleBaseCorner)`\n bottom: -0.75rem;\n right: -0.75rem;\n cursor: nwse-resize;\n`;\n\nconst ResizeHandleBottomLeft = styled(ResizeHandleBaseCorner)`\n bottom: -0.75rem;\n left: -0.75rem;\n cursor: nesw-resize;\n`;\n\nconst ResizeHandleTopLeft = styled(ResizeHandleBaseCorner)`\n top: -0.75rem;\n left: -0.75rem;\n cursor: nwse-resize;\n`;\n\nconst ResizeHandleTopRight = styled(ResizeHandleBaseCorner)`\n top: -0.75rem;\n right: -0.75rem;\n cursor: nesw-resize;\n`;\n\n// These are all the Resize handles for the four cardinal direction,\n// To calculate the width, we subtract by the padding of 1rem on both sides\n// which are corners of the panel\nconst ResizeHandleBottom = styled(ResizeHandleBase)`\n bottom: -0.75rem;\n left: 0.5rem;\n width: calc(100% - 1rem);\n height: 1rem;\n cursor: ns-resize;\n user-select: none;\n`;\n\nconst ResizeHandleTop = styled(ResizeHandleBase)`\n top: -0.75rem;\n left: 0.5rem;\n width: calc(100% - 1rem);\n height: 1rem;\n cursor: ns-resize;\n`;\n\nconst ResizeHandleRight = styled(ResizeHandleBase)`\n right: -0.75rem;\n top: 0.5rem;\n width: 1rem;\n height: calc(100% - 1rem);\n cursor: ew-resize;\n`;\n\nconst ResizeHandleLeft = styled(ResizeHandleBase)`\n left: -0.75rem;\n top: 0.5rem;\n width: 1rem;\n height: calc(100% - 1rem);\n cursor: ew-resize;\n`;\n\nconst PanelContent = styled.div<{ $noPadding?: boolean; $fitHeight?: boolean }>`\n overflow-y: auto;\n overscroll-behavior: contain;\n min-height: 0;\n /* While the panel height is derived from its content, the content must size\n itself (a percentage flex-basis against an indefinite height collapses in\n WebKit); it still shrinks when the panel hits its max-height. */\n flex: ${({ $fitHeight }) => ($fitHeight ? '0 1 auto' : '1 1 0%')};\n padding: ${({ $noPadding }) => ($noPadding ? 0 : Spacing[3])};\n`;\n\n// Sets a min width so that the text will display, but overflows if needed\nconst PanelText = styled.p`\n ${paragraphMixins.sm}\n white-space: nowrap;\n min-width: 3rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n font-weight: 500;\n`;\n\nconst StyledIconButton = styled(IconButton)`\n width: 1.5rem;\n height: 1.5rem;\n border-radius: ${BorderRadius.Md};\n`;\n\n// Only rendered when dismissOnNavigate is true, keeping useLocation() out of the\n// main component body so FloatingPanel works without a Router when not needed.\nfunction DismissOnNavigate({ onClose }: { onClose: () => void }) {\n const location = useLocation();\n const initialPathname = useRef(location.pathname);\n useEffect(() => {\n if (location.pathname !== initialPathname.current) {\n onClose();\n }\n }, [location.pathname, onClose]);\n return null;\n}\n\nexport default function FloatingPanel({\n title = 'Panel title',\n children,\n portal = true,\n triggerRef,\n initialWidth = 400,\n initialHeight = 600,\n minWidth = 100,\n minHeight = 150,\n mainAxisOffset = 0,\n crossAxisOffset = 0,\n footerButtons,\n footerAdditionalAction,\n placement = 'right',\n canFullsize = true,\n defaultFullSize = false,\n noPadding,\n headerActions,\n dismissOnNavigate = false,\n fitContent = false,\n onClose = () => {},\n ...restProps\n}: FloatingPanelProps) {\n const { floatingPanel } = useContext(ConfigContext);\n const fullscreenRightInset = floatingPanel?.fullscreenRightInset ?? PADDING;\n const hasFooter = footerButtons || footerAdditionalAction;\n const isAdditionalActionButton =\n isValidElement(footerAdditionalAction) && footerAdditionalAction.type === 'button';\n\n const [panelSize, setPanelSize] = useState({ width: initialWidth, height: initialHeight });\n const panelSizeRef = useRef({ width: initialWidth, height: initialHeight });\n const [panelPosition, setPanelPosition] = useState({ x: 0, y: 0 });\n const [isPositionReady, setIsPositionReady] = useState(!triggerRef); // Ready immediately if no triggerRef\n\n const [fullSize, setFullSize] = useState(defaultFullSize);\n const resizeBottomRef = useRef<number | null>(null);\n const resizeRightRef = useRef<number | null>(null);\n\n const [wasFullSizeToggled, setWasFullSizeToggled] = useState(false);\n const resizeOffsetRef = useRef({ x: 0, y: 0 });\n\n const resizeDirectionRef = useRef<ResizeDirection | null>(null);\n const resizeStartDimensionsRef = useRef({\n width: initialWidth,\n height: initialHeight,\n x: 0,\n y: 0,\n });\n\n // Track if the user has manually resized the panel\n const [hasManuallyResized, setHasManuallyResized] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Track reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const dragControls = useDragControls();\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n const {\n x: floatingX,\n y: floatingY,\n refs,\n } = useFloating({\n placement: placement,\n elements: {\n reference: triggerRef?.current || undefined,\n },\n middleware: [\n offset({\n mainAxis: mainAxisOffset,\n crossAxis: crossAxisOffset,\n }),\n flip(),\n // flip() only swaps sides, so a large panel can still open clipped off an\n // edge. shift() slides it back into view on both axes (crossAxis covers the\n // side axis flip leaves unhandled).\n shift({ crossAxis: true, padding: PADDING }),\n ],\n });\n\n useEffect(() => {\n // Only update position when floating values are not at the default 0,0\n // or when we don't have a triggerRef (meaning we should use initial position)\n if (!triggerRef || floatingX !== 0 || floatingY !== 0) {\n setPanelPosition({\n x: floatingX,\n y: floatingY,\n });\n setIsPositionReady(true);\n }\n }, [floatingX, floatingY, triggerRef]);\n\n // Window dimensions and drag constraints\n const [windowDimensions, setWindowDimensions] = useState({\n width: typeof window !== 'undefined' ? window.innerWidth : 1200,\n height: typeof window !== 'undefined' ? window.innerHeight : 800,\n });\n\n // Update window dimensions on resize\n useEffect(() => {\n const handleResize = () => {\n setWindowDimensions({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const dragConstraints = fullSize\n ? undefined\n : {\n left: PADDING,\n right: Math.max(PADDING, windowDimensions.width - panelSize.width - PADDING),\n top: PADDING,\n bottom: Math.max(PADDING, windowDimensions.height - panelSize.height - PADDING),\n };\n\n // Clamp initial position and any position updates to be within bounds\n const clampPositionToBounds = useCallback(\n (position: { x: number; y: number }) => {\n if (fullSize) {\n return position;\n }\n\n return {\n x: Math.max(\n PADDING,\n Math.min(\n position.x,\n Math.max(PADDING, windowDimensions.width - panelSize.width - PADDING),\n ),\n ),\n y: Math.max(\n PADDING,\n Math.min(\n position.y,\n Math.max(PADDING, windowDimensions.height - panelSize.height - PADDING),\n ),\n ),\n };\n },\n [windowDimensions, panelSize, fullSize],\n );\n\n // Clamp position on window resize\n useEffect(() => {\n if (!fullSize) {\n const clampedPosition = clampPositionToBounds(panelPosition);\n if (clampedPosition.x !== panelPosition.x || clampedPosition.y !== panelPosition.y) {\n setPanelPosition(clampedPosition);\n }\n }\n }, [windowDimensions, panelPosition, clampPositionToBounds, fullSize]);\n\n useEffect(() => {\n if (wasFullSizeToggled) {\n const timer = setTimeout(() => setWasFullSizeToggled(false), 400); // match duration\n return () => clearTimeout(timer);\n }\n }, [wasFullSizeToggled]);\n\n // We need this useEffect here to sync a ref to the panel size, which is needed for resizing\n useEffect(() => {\n panelSizeRef.current = panelSize;\n }, [panelSize]);\n\n // True while the panel is letting CSS auto-fit its height to content\n // (`fitContent` opt-in, no manual resize yet, not in fullsize). In this mode\n // we omit `height` from the framer-motion animate prop so the styled\n // container's `height: max-content` is in effect.\n const isAutoHeight = fitContent && !hasManuallyResized && !fullSize;\n\n // Unified resize handler for all directions\n function handleResizeMouseDown(\n event: React.MouseEvent<HTMLDivElement>,\n direction: ResizeDirection,\n ) {\n event.preventDefault();\n event.stopPropagation();\n\n let currentWidth: number;\n let currentHeight: number;\n let currentX: number;\n let currentY: number;\n\n if (fullSize) {\n // Exit fullscreen but preserve the current rendered dimensions so the panel\n // appears to stay in place while the user resizes from the edges.\n // Measure from the DOM so we get the real pixel width/height regardless of\n // what `calc(100% - 16px)` resolves to (differs for portaled vs. in-place\n // panels because `100%` is relative to the containing block, not the viewport).\n const container = contentRef.current?.parentElement;\n currentWidth = container?.offsetWidth ?? windowDimensions.width - 16;\n currentHeight = container?.offsetHeight ?? windowDimensions.height - 16;\n currentX = 8;\n currentY = 8;\n // Sync motion values now so x.get()/y.get() return the correct position for\n // computing fixed-edge anchors below.\n x.set(8);\n y.set(8);\n setFullSize(false);\n setPanelSize({ width: currentWidth, height: currentHeight });\n setPanelPosition({ x: currentX, y: currentY });\n } else if (isAutoHeight) {\n // If we're leaving CSS auto-fit, capture the current rendered height so the\n // panel doesn't jump from its content-fit size back to `initialHeight` when\n // pixel mode takes over.\n const container = contentRef.current?.parentElement;\n currentHeight = container?.offsetHeight ?? panelSize.height;\n currentWidth = panelSize.width;\n currentX = panelPosition.x;\n currentY = panelPosition.y;\n setPanelSize({ width: currentWidth, height: currentHeight });\n } else {\n currentWidth = panelSize.width;\n currentHeight = panelSize.height;\n currentX = panelPosition.x;\n currentY = panelPosition.y;\n }\n\n panelSizeRef.current = { width: currentWidth, height: currentHeight };\n // Capture start dimensions in a ref so handleResizeMouseMove (stale closure)\n // can read the correct initial values for unchanged axes without depending on\n // panelSize/panelPosition state captured at listener-registration time.\n resizeStartDimensionsRef.current = {\n width: currentWidth,\n height: currentHeight,\n x: currentX,\n y: currentY,\n };\n\n // Mark that user has manually resized - disable auto-resize from now on\n setHasManuallyResized(true);\n\n resizeDirectionRef.current = direction;\n\n // Calculate initial offsets and fixed points based on direction\n if (direction === ResizeDirection.SouthEast) {\n // Bottom-right: resize from bottom-right corner\n resizeOffsetRef.current = {\n x: event.clientX - currentWidth,\n y: event.clientY - currentHeight,\n };\n } else if (direction === ResizeDirection.SouthWest) {\n // Bottom-left: resize from bottom-left corner\n resizeRightRef.current = x.get() + currentWidth;\n resizeOffsetRef.current = {\n x: event.clientX,\n y: event.clientY - currentHeight,\n };\n } else if (direction === ResizeDirection.NorthWest) {\n // Top-left: resize from top-left corner\n resizeRightRef.current = x.get() + currentWidth;\n resizeBottomRef.current = y.get() + currentHeight;\n resizeOffsetRef.current = {\n x: event.clientX,\n y: event.clientY,\n };\n } else if (direction === ResizeDirection.NorthEast) {\n // Top-right: resize from top-right corner\n resizeBottomRef.current = y.get() + currentHeight;\n resizeOffsetRef.current = {\n x: event.clientX - currentWidth,\n y: event.clientY,\n };\n } else if (direction === ResizeDirection.West) {\n // Left edge\n resizeRightRef.current = x.get() + currentWidth;\n resizeOffsetRef.current = {\n x: event.clientX,\n y: 0,\n };\n } else if (direction === ResizeDirection.East) {\n // Right edge\n resizeOffsetRef.current = {\n x: event.clientX - currentWidth,\n y: 0,\n };\n } else if (direction === ResizeDirection.North) {\n // Top edge\n resizeBottomRef.current = y.get() + currentHeight;\n resizeOffsetRef.current = {\n x: 0,\n y: event.clientY,\n };\n } else if (direction === ResizeDirection.South) {\n // Bottom edge\n resizeOffsetRef.current = {\n x: 0,\n y: event.clientY - currentHeight,\n };\n }\n\n document.addEventListener('mousemove', handleResizeMouseMove);\n document.addEventListener('mouseup', handleResizeMouseUp);\n }\n\n // ResizeMouseMove to calculate the new size and position of the panel\n function handleResizeMouseMove(event: MouseEvent) {\n const direction = resizeDirectionRef.current;\n // Use resizeStartDimensionsRef (a ref, always current) rather than panelSize/panelPosition\n // (stale closure values). For unchanged axes, these provide the correct starting dimensions\n // set at drag start — including the case where the drag began in fullscreen mode.\n let newWidth = resizeStartDimensionsRef.current.width;\n let newHeight = resizeStartDimensionsRef.current.height;\n let clampedX = resizeStartDimensionsRef.current.x;\n let clampedY = resizeStartDimensionsRef.current.y;\n\n if (direction === ResizeDirection.SouthEast) {\n // Bottom-right corner\n newWidth = Math.round(Math.max(minWidth, event.clientX - resizeOffsetRef.current.x));\n newHeight = Math.round(Math.max(minHeight, event.clientY - resizeOffsetRef.current.y));\n } else if (direction === ResizeDirection.SouthWest) {\n // Bottom-left corner\n const right = resizeRightRef.current!;\n const proposedX = event.clientX;\n newWidth = Math.round(Math.max(minWidth, right - proposedX));\n clampedX = Math.round(right - newWidth);\n newHeight = Math.round(Math.max(minHeight, event.clientY - resizeOffsetRef.current.y));\n } else if (direction === ResizeDirection.NorthWest) {\n // Top-left corner\n const right = resizeRightRef.current!;\n const bottom = resizeBottomRef.current!;\n const proposedX = event.clientX;\n const proposedY = event.clientY;\n newWidth = Math.round(Math.max(minWidth, right - proposedX));\n newHeight = Math.round(Math.max(minHeight, bottom - proposedY));\n clampedX = Math.round(right - newWidth);\n clampedY = Math.round(bottom - newHeight);\n } else if (direction === ResizeDirection.NorthEast) {\n // Top-right corner\n const bottom = resizeBottomRef.current!;\n const proposedY = event.clientY;\n newWidth = Math.round(Math.max(minWidth, event.clientX - resizeOffsetRef.current.x));\n newHeight = Math.round(Math.max(minHeight, bottom - proposedY));\n clampedY = Math.round(bottom - newHeight);\n } else if (direction === ResizeDirection.West) {\n // Left edge\n const right = resizeRightRef.current!;\n const proposedX = event.clientX;\n newWidth = Math.round(Math.max(minWidth, right - proposedX));\n clampedX = Math.round(right - newWidth);\n } else if (direction === ResizeDirection.East) {\n // Right edge\n newWidth = Math.round(Math.max(minWidth, event.clientX - resizeOffsetRef.current.x));\n } else if (direction === ResizeDirection.North) {\n // Top edge\n const bottom = resizeBottomRef.current!;\n const proposedY = event.clientY;\n newHeight = Math.round(Math.max(minHeight, bottom - proposedY));\n clampedY = Math.round(bottom - newHeight);\n } else if (direction === ResizeDirection.South) {\n // Bottom edge\n newHeight = Math.round(Math.max(minHeight, event.clientY - resizeOffsetRef.current.y));\n }\n\n // We need to flush sync here because it would create jitter while the panel resizes from other directions\n // this is because the browser will animate serially, but we want to update the position and size together\n // so that the panel doesn't jump around\n flushSync(() => {\n setPanelPosition({ x: clampedX, y: clampedY });\n setPanelSize({ width: newWidth, height: newHeight });\n });\n }\n\n function handleResizeMouseUp() {\n document.removeEventListener('mousemove', handleResizeMouseMove);\n document.removeEventListener('mouseup', handleResizeMouseUp);\n }\n\n const panelContent = (\n <FloatingPanelContainer\n // Need to keep the values of x and y for positioning\n ref={refs.setFloating}\n $fitHeight={isAutoHeight}\n $maxHeight={autoFitMaxHeight(windowDimensions.height, panelPosition.y, minHeight)}\n $minHeight={minHeight}\n style={{\n x,\n y,\n }}\n initial={{\n top: 0,\n left: 0,\n opacity: 0,\n }}\n animate={{\n x: fullSize ? PADDING : panelPosition.x,\n y: fullSize ? PADDING : panelPosition.y,\n\n // When fullscreen, leave space for any reserved right-side content.\n width: fullSize ? `calc(100% - ${PADDING + fullscreenRightInset}px)` : panelSize.width,\n // Omit height when CSS auto-fit is active so `height: max-content`\n // on the styled container takes effect.\n ...(isAutoHeight ? {} : { height: fullSize ? 'calc(100% - 16px)' : panelSize.height }),\n opacity: isPositionReady ? 1 : 0,\n }}\n transition={\n wasFullSizeToggled\n ? {\n type: 'tween',\n // Easing curve for a smooth transition\n ease: [0.83, 0.0, 0.17, 1.0],\n duration: prefersReducedMotion ? 1.2 : 0.4,\n }\n : { opacity: { duration: 0.15, ease: 'easeOut' }, duration: 0 }\n }\n onDragEnd={() => {\n if (!fullSize) {\n const newPosition = { x: x.get(), y: y.get() };\n const clampedPosition = clampPositionToBounds(newPosition);\n setPanelPosition(clampedPosition);\n }\n }}\n drag={!fullSize}\n dragControls={dragControls}\n dragListener={false}\n dragMomentum={false}\n dragConstraints={dragConstraints}\n // The frame portals to the body, so panels that dismiss on an outside click\n // need this id to recognize a click in here as one of their own overlays.\n id={`${FLOATING_PANEL_ID_PREFIX}container`}\n {...restProps}\n >\n <DragHandle isFullSize={fullSize} onPointerDown={(e) => dragControls.start(e)}>\n <Stack align='center' direction='horizontal' justify='space-between'>\n <PanelText>{title}</PanelText>\n <Stack direction='horizontal' align='center' spacing={Spacing[1]}>\n {headerActions}\n {canFullsize && (\n <StyledIconButton\n size='sm'\n aria-label={fullSize ? 'collapse' : 'expand'}\n id='floating-panel__toggle-fullsize'\n onClick={() => {\n setWasFullSizeToggled(true);\n setFullSize(!fullSize);\n }}\n >\n {fullSize ? <ArrowCollapseIcon /> : <ArrowExpandIcon />}\n </StyledIconButton>\n )}\n\n <StyledIconButton\n size='sm'\n id='floating-panel__close-panel'\n onClick={() => onClose?.()}\n aria-label='close'\n >\n <XIcon />\n </StyledIconButton>\n </Stack>\n </Stack>\n </DragHandle>\n <PanelContent ref={contentRef} $noPadding={noPadding} $fitHeight={isAutoHeight}>\n {children}\n </PanelContent>\n {hasFooter && (\n <Footer style={{ paddingLeft: isAdditionalActionButton ? Spacing[1] : Spacing[3] }}>\n <Stack\n align='center'\n direction='horizontal'\n justify={footerAdditionalAction ? 'space-between' : 'flex-end'}\n >\n {footerAdditionalAction &&\n (isAdditionalActionButton ? (\n footerAdditionalAction\n ) : (\n <PanelText>{footerAdditionalAction}</PanelText>\n ))}\n\n {footerButtons && <div>{footerButtons}</div>}\n </Stack>\n </Footer>\n )}\n <ResizeHandleBottomRight\n data-test='resize-handle-se'\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.SouthEast)}\n />\n <ResizeHandleBottom\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.South)}\n />\n <ResizeHandleBottomLeft\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.SouthWest)}\n />\n <ResizeHandleLeft\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.West)}\n />\n <ResizeHandleTopLeft\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.NorthWest)}\n />\n <ResizeHandleTop\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.North)}\n />\n <ResizeHandleTopRight\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.NorthEast)}\n />\n <ResizeHandleRight\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.East)}\n />\n </FloatingPanelContainer>\n );\n\n const content = (\n <>\n {dismissOnNavigate && <DismissOnNavigate onClose={onClose} />}\n {panelContent}\n </>\n );\n\n return portal ? createPortal(content, document.body) : content;\n}\n","import {\n createContext,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { v4 as uuid } from 'uuid';\n\nexport type Panel = {\n key: string;\n panelElement: ReactElement;\n persistUntilPathRoot?: string;\n};\n\ninterface PanelContextType {\n openPanel: (panel: Panel) => void;\n closePanel: (key: string) => void;\n togglePanel: (panel: Panel) => void;\n closeAllPanels: () => void;\n isPanelOpen: (key: string) => boolean;\n panels: Panel[];\n}\n\nconst PanelContext = createContext<PanelContextType | null>(null);\n\nexport const PanelProvider = ({ children }: { children: ReactNode }) => {\n const [panels, setPanels] = useState<Panel[]>([]);\n const location = useLocation();\n\n function shouldPanelPersist(currentUrl: string, persistUntilPathRoot?: string): boolean {\n if (!persistUntilPathRoot) {\n return false;\n }\n return currentUrl.includes(persistUntilPathRoot);\n }\n\n const openPanel = useCallback(\n (panel: Panel) => {\n const { key, panelElement, persistUntilPathRoot } = panel;\n const pathRoot = persistUntilPathRoot || location.pathname;\n setPanels((prev) => [\n ...prev.filter((p) => p.key !== key), // Remove existing panel with same key\n { key, panelElement, persistUntilPathRoot: pathRoot },\n ]);\n },\n [location.pathname],\n );\n\n const closePanel = useCallback((key: string) => {\n setPanels((prev) => prev.filter((panel) => panel.key !== key));\n }, []);\n\n const isPanelOpen = useCallback(\n (key: string) => {\n return panels.some((panel) => panel.key === key);\n },\n [panels],\n );\n\n const togglePanel = useCallback(\n (panel: Panel) => {\n const { key } = panel;\n if (isPanelOpen(key)) {\n closePanel(key);\n } else {\n openPanel(panel);\n }\n },\n [isPanelOpen, closePanel, openPanel],\n );\n\n const closeAllPanels = useCallback(() => {\n setPanels([]);\n }, []);\n\n useEffect(() => {\n const nextLocation = location.pathname;\n\n setPanels((prevPanels) =>\n prevPanels.filter((panel) => shouldPanelPersist(nextLocation, panel.persistUntilPathRoot)),\n );\n }, [location.pathname]);\n\n return (\n <PanelContext.Provider\n value={{ openPanel, closePanel, togglePanel, closeAllPanels, panels, isPanelOpen }}\n >\n {children}\n </PanelContext.Provider>\n );\n};\n\nexport const usePersistentFloatingPanels = () => {\n const ctx = useContext(PanelContext);\n if (!ctx) {\n throw new Error('usePersistentFloatingPanels must be used within a PanelProvider');\n }\n return ctx;\n};\n\n// This hook is used to open a panel that persists across multiple pages\n// For single page panels, use the useToggle hook instead to manage individual panel state.\nexport const usePersistentFloatingPanel = (panelId?: string) => {\n const ctx = useContext(PanelContext);\n if (!ctx) {\n throw new Error('usePersistentFloatingPanels must be used within a PanelProvider');\n }\n\n // If the panel doesn't need to persist across multiple pages, we generate an id that can be passed back\n const currentPanelId = panelId || `panel-${uuid()}`;\n\n return {\n id: currentPanelId,\n openPanel: useCallback(\n (panel: Panel) => {\n ctx.openPanel(panel);\n },\n [ctx],\n ),\n closePanel: useCallback(() => {\n ctx.closePanel(currentPanelId);\n }, [currentPanelId, ctx]),\n togglePanel: useCallback(\n (panel: Panel) => {\n ctx.togglePanel(panel);\n },\n [ctx],\n ),\n isPanelOpen: ctx.isPanelOpen(currentPanelId),\n };\n};\n","import { cloneElement } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { usePersistentFloatingPanels } from './FloatingPanelContext';\n\nexport default function FloatingPanelRenderer() {\n const { panels, closePanel } = usePersistentFloatingPanels();\n\n if (panels.length === 0) {\n return null;\n }\n\n return createPortal(\n panels.map(({ key, panelElement: panel }) => {\n return cloneElement(panel, { onClose: () => closePanel(key), key: key });\n }),\n document.body,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["uuid"],"sources":["../../../components/FloatingPanel/utils.ts","../../../components/FloatingPanel/FloatingPanel.tsx","../../../components/FloatingPanel/FloatingPanelContext.tsx","../../../components/FloatingPanel/FloatingPanelRenderer.tsx"],"sourcesContent":["export const PADDING = 8;\nexport const EDGE_PADDING = PADDING * 6;\n\n// Cap a content-fitting panel's height to the room below its top edge so it\n// can't overflow the viewport bottom when anchored partway down the screen.\nexport function autoFitMaxHeight(viewportHeight: number, topOffset: number, minHeight: number) {\n return Math.max(minHeight, viewportHeight - Math.max(EDGE_PADDING, topOffset) - EDGE_PADDING);\n}\n","import { flip, offset, type Placement, shift, useFloating } from '@floating-ui/react';\nimport { motion, useDragControls, useMotionValue, useReducedMotion } from 'framer-motion';\nimport {\n isValidElement,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useLocation } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\n\nimport { IconButton } from '@persona/design-system/components/Button';\nimport Stack from '@persona/design-system/components/Stack';\nimport { Z_INDICES } from '@persona/design-system/lib/zindex';\nimport { paragraphMixins } from '@persona/design-system/mixins/text';\nimport { Elevation } from '@persona/design-system/variables/effect';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { ArrowCollapseIcon, ArrowExpandIcon, XIcon } from '@persona/icons';\nimport ConfigContext from 'design-system/lib/ConfigContext';\n\nimport { autoFitMaxHeight, PADDING } from './utils';\n\nexport const FLOATING_PANEL_ID_PREFIX = 'floating-panel__' as const;\n\nenum ResizeDirection {\n North = 'n',\n South = 's',\n East = 'e',\n West = 'w',\n NorthEast = 'ne',\n NorthWest = 'nw',\n SouthEast = 'se',\n SouthWest = 'sw',\n}\n\nexport interface FloatingPanelProps {\n /** The title text displayed in the panel header */\n title: ReactNode;\n /** Callback function called when the close button is clicked */\n onClose?: () => void;\n /** Content to render inside the main panel area */\n children?: ReactNode;\n /** Optional React component rendered to the left of the expand button in the header */\n headerActions?: ReactNode;\n\n /** Whether the panel displays the fullsize button */\n canFullsize?: boolean;\n\n /** When true, the panel opens already in full-size (maximized) mode. */\n defaultFullSize?: boolean;\n\n /** Initial width of the panel in pixels */\n initialWidth?: number;\n /** Initial height of the panel in pixels */\n initialHeight?: number;\n /** Minimum width the panel can be resized to in pixels */\n minWidth?: number;\n /** Minimum height the panel can be resized to in pixels */\n minHeight?: number;\n\n footerButtons?: ReactNode;\n\n footerAdditionalAction?: ReactNode;\n\n portal?: boolean;\n\n /** Reference to the element that triggered this panel, used for automatic positioning */\n triggerRef?: RefObject<HTMLElement>;\n\n /** Which placement of the trigger element to position the panel on */\n placement?: Placement;\n\n /** Additional main axis offset in pixels from the calculated position. Main axis is defined as the axis in position to where its being defined\n * i.e. right, top, left ,bottom */\n mainAxisOffset?: number;\n\n /** Additional cross offset in pixels from the calculated position. Cross is defined as the axis that runs along the alignment\n * of the floating element. */\n crossAxisOffset?: number;\n\n /** remove padding from the panel content */\n noPadding?: boolean;\n\n /** When true, automatically calls `onClose` if the route changes after the\n * panel mounts. Mirrors the auto-dismiss-on-navigation behavior provided by\n * `PanelProvider` / `usePersistentFloatingPanel` for panels that don't opt\n * into the persistent panel context. Defaults to `false` so existing\n * consumers (e.g. dirty-check confirmation flows) are not broken. */\n dismissOnNavigate?: boolean;\n\n /** When true, the panel's height auto-fits its content via CSS (`max-content`)\n * up to the viewport, instead of using `initialHeight`. Once the user manually\n * resizes, the panel switches to pixel mode and stays there. `initialHeight`\n * is ignored while auto-fitting. */\n fitContent?: boolean;\n}\n\nconst FloatingPanelContainer = styled(motion.div)<{\n $fitHeight?: boolean;\n $maxHeight?: number;\n $minHeight?: number;\n}>`\n position: absolute;\n z-index: ${Z_INDICES.modal};\n background: ${({ theme }) => theme.color.background.primary};\n border: 1px solid ${Color.BorderDivider};\n border-radius: ${BorderRadius.Lg};\n box-shadow: ${Elevation.Low};\n display: flex;\n flex-direction: column;\n cursor: auto;\n ${({ $fitHeight, $maxHeight, $minHeight }) =>\n $fitHeight &&\n css`\n height: auto;\n max-height: ${$maxHeight ?? 0}px;\n min-height: ${$minHeight ?? 0}px;\n `}\n`;\n\nconst DragHandle = styled(motion.div)<{ isFullSize: boolean }>`\n cursor: ${({ isFullSize }) => (isFullSize ? 'default' : 'grab')};\n user-select: none;\n\n &:active {\n cursor: ${({ isFullSize }) => (isFullSize ? 'default' : 'grabbing')};\n }\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-height: 48px;\n height: 48px;\n overflow: hidden;\n padding: ${Spacing[1]} ${Spacing[1]} ${Spacing[1]} ${Spacing[3]};\n border-bottom: 1px solid ${Color.BorderDivider};\n`;\n\nconst Footer = styled.div`\n padding: ${Spacing[1]} ${Spacing[1]} ${Spacing[1]} ${Spacing[3]};\n border-top: 1px solid ${Color.BorderDivider};\n overflow-x: hidden;\n background-color: ${({ theme }) => theme.color.background.primary};\n width: 100%;\n border-radius: 0 0 ${BorderRadius.Lg} ${BorderRadius.Lg};\n`;\n\nconst ResizeHandleBase = styled.div`\n position: absolute;\n user-select: none;\n`;\n\n// Sets the width and height for base corner to 20px\nconst ResizeHandleBaseCorner = styled(ResizeHandleBase)`\n width: 1.25rem;\n height: 1.25rem;\n`;\n\nconst ResizeHandleBottomRight = styled(ResizeHandleBaseCorner)`\n bottom: -0.75rem;\n right: -0.75rem;\n cursor: nwse-resize;\n`;\n\nconst ResizeHandleBottomLeft = styled(ResizeHandleBaseCorner)`\n bottom: -0.75rem;\n left: -0.75rem;\n cursor: nesw-resize;\n`;\n\nconst ResizeHandleTopLeft = styled(ResizeHandleBaseCorner)`\n top: -0.75rem;\n left: -0.75rem;\n cursor: nwse-resize;\n`;\n\nconst ResizeHandleTopRight = styled(ResizeHandleBaseCorner)`\n top: -0.75rem;\n right: -0.75rem;\n cursor: nesw-resize;\n`;\n\n// These are all the Resize handles for the four cardinal direction,\n// To calculate the width, we subtract by the padding of 1rem on both sides\n// which are corners of the panel\nconst ResizeHandleBottom = styled(ResizeHandleBase)`\n bottom: -0.75rem;\n left: 0.5rem;\n width: calc(100% - 1rem);\n height: 1rem;\n cursor: ns-resize;\n user-select: none;\n`;\n\nconst ResizeHandleTop = styled(ResizeHandleBase)`\n top: -0.75rem;\n left: 0.5rem;\n width: calc(100% - 1rem);\n height: 1rem;\n cursor: ns-resize;\n`;\n\nconst ResizeHandleRight = styled(ResizeHandleBase)`\n right: -0.75rem;\n top: 0.5rem;\n width: 1rem;\n height: calc(100% - 1rem);\n cursor: ew-resize;\n`;\n\nconst ResizeHandleLeft = styled(ResizeHandleBase)`\n left: -0.75rem;\n top: 0.5rem;\n width: 1rem;\n height: calc(100% - 1rem);\n cursor: ew-resize;\n`;\n\nconst PanelContent = styled.div<{ $noPadding?: boolean; $fitHeight?: boolean }>`\n overflow-y: auto;\n overscroll-behavior: contain;\n min-height: 0;\n /* While the panel height is derived from its content, the content must size\n itself (a percentage flex-basis against an indefinite height collapses in\n WebKit); it still shrinks when the panel hits its max-height. */\n flex: ${({ $fitHeight }) => ($fitHeight ? '0 1 auto' : '1 1 0%')};\n padding: ${({ $noPadding }) => ($noPadding ? 0 : Spacing[3])};\n`;\n\n// Sets a min width so that the text will display, but overflows if needed\nconst PanelText = styled.p`\n ${paragraphMixins.sm}\n white-space: nowrap;\n min-width: 3rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n align-items: center;\n font-weight: 500;\n`;\n\nconst StyledIconButton = styled(IconButton)`\n width: 1.5rem;\n height: 1.5rem;\n border-radius: ${BorderRadius.Md};\n`;\n\n// Only rendered when dismissOnNavigate is true, keeping useLocation() out of the\n// main component body so FloatingPanel works without a Router when not needed.\nfunction DismissOnNavigate({ onClose }: { onClose: () => void }) {\n const location = useLocation();\n const initialPathname = useRef(location.pathname);\n useEffect(() => {\n if (location.pathname !== initialPathname.current) {\n onClose();\n }\n }, [location.pathname, onClose]);\n return null;\n}\n\nexport default function FloatingPanel({\n title = 'Panel title',\n children,\n portal = true,\n triggerRef,\n initialWidth = 400,\n initialHeight = 600,\n minWidth = 100,\n minHeight = 150,\n mainAxisOffset = 0,\n crossAxisOffset = 0,\n footerButtons,\n footerAdditionalAction,\n placement = 'right',\n canFullsize = true,\n defaultFullSize = false,\n noPadding,\n headerActions,\n dismissOnNavigate = false,\n fitContent = false,\n onClose = () => {},\n ...restProps\n}: FloatingPanelProps) {\n const { floatingPanel } = useContext(ConfigContext);\n const fullscreenRightInset = floatingPanel?.fullscreenRightInset ?? PADDING;\n const hasFooter = footerButtons || footerAdditionalAction;\n const isAdditionalActionButton =\n isValidElement(footerAdditionalAction) && footerAdditionalAction.type === 'button';\n\n const [panelSize, setPanelSize] = useState({ width: initialWidth, height: initialHeight });\n const panelSizeRef = useRef({ width: initialWidth, height: initialHeight });\n const [panelPosition, setPanelPosition] = useState({ x: 0, y: 0 });\n const [isPositionReady, setIsPositionReady] = useState(!triggerRef); // Ready immediately if no triggerRef\n\n const [fullSize, setFullSize] = useState(defaultFullSize);\n const resizeBottomRef = useRef<number | null>(null);\n const resizeRightRef = useRef<number | null>(null);\n\n const [wasFullSizeToggled, setWasFullSizeToggled] = useState(false);\n const resizeOffsetRef = useRef({ x: 0, y: 0 });\n\n const resizeDirectionRef = useRef<ResizeDirection | null>(null);\n const resizeStartDimensionsRef = useRef({\n width: initialWidth,\n height: initialHeight,\n x: 0,\n y: 0,\n });\n\n // Track if the user has manually resized the panel\n const [hasManuallyResized, setHasManuallyResized] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Track reduced motion preference\n const prefersReducedMotion = useReducedMotion();\n\n const dragControls = useDragControls();\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n const {\n x: floatingX,\n y: floatingY,\n refs,\n } = useFloating({\n placement: placement,\n elements: {\n reference: triggerRef?.current || undefined,\n },\n middleware: [\n offset({\n mainAxis: mainAxisOffset,\n crossAxis: crossAxisOffset,\n }),\n flip(),\n // flip() only swaps sides, so a large panel can still open clipped off an\n // edge. shift() slides it back into view on both axes (crossAxis covers the\n // side axis flip leaves unhandled).\n shift({ crossAxis: true, padding: PADDING }),\n ],\n });\n\n useEffect(() => {\n // Only update position when floating values are not at the default 0,0\n // or when we don't have a triggerRef (meaning we should use initial position)\n if (!triggerRef || floatingX !== 0 || floatingY !== 0) {\n setPanelPosition({\n x: floatingX,\n y: floatingY,\n });\n setIsPositionReady(true);\n }\n }, [floatingX, floatingY, triggerRef]);\n\n // Window dimensions and drag constraints\n const [windowDimensions, setWindowDimensions] = useState({\n width: typeof window !== 'undefined' ? window.innerWidth : 1200,\n height: typeof window !== 'undefined' ? window.innerHeight : 800,\n });\n\n // Update window dimensions on resize\n useEffect(() => {\n const handleResize = () => {\n setWindowDimensions({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const dragConstraints = fullSize\n ? undefined\n : {\n left: PADDING,\n right: Math.max(PADDING, windowDimensions.width - panelSize.width - PADDING),\n top: PADDING,\n bottom: Math.max(PADDING, windowDimensions.height - panelSize.height - PADDING),\n };\n\n // Clamp initial position and any position updates to be within bounds\n const clampPositionToBounds = useCallback(\n (position: { x: number; y: number }) => {\n if (fullSize) {\n return position;\n }\n\n return {\n x: Math.max(\n PADDING,\n Math.min(\n position.x,\n Math.max(PADDING, windowDimensions.width - panelSize.width - PADDING),\n ),\n ),\n y: Math.max(\n PADDING,\n Math.min(\n position.y,\n Math.max(PADDING, windowDimensions.height - panelSize.height - PADDING),\n ),\n ),\n };\n },\n [windowDimensions, panelSize, fullSize],\n );\n\n // Clamp position on window resize\n useEffect(() => {\n if (!fullSize) {\n const clampedPosition = clampPositionToBounds(panelPosition);\n if (clampedPosition.x !== panelPosition.x || clampedPosition.y !== panelPosition.y) {\n setPanelPosition(clampedPosition);\n }\n }\n }, [windowDimensions, panelPosition, clampPositionToBounds, fullSize]);\n\n useEffect(() => {\n if (wasFullSizeToggled) {\n const timer = setTimeout(() => setWasFullSizeToggled(false), 400); // match duration\n return () => clearTimeout(timer);\n }\n }, [wasFullSizeToggled]);\n\n // We need this useEffect here to sync a ref to the panel size, which is needed for resizing\n useEffect(() => {\n panelSizeRef.current = panelSize;\n }, [panelSize]);\n\n // True while the panel is letting CSS auto-fit its height to content\n // (`fitContent` opt-in, no manual resize yet, not in fullsize). In this mode\n // we omit `height` from the framer-motion animate prop so the styled\n // container's `height: max-content` is in effect.\n const isAutoHeight = fitContent && !hasManuallyResized && !fullSize;\n\n // Unified resize handler for all directions\n function handleResizeMouseDown(\n event: React.MouseEvent<HTMLDivElement>,\n direction: ResizeDirection,\n ) {\n event.preventDefault();\n event.stopPropagation();\n\n let currentWidth: number;\n let currentHeight: number;\n let currentX: number;\n let currentY: number;\n\n if (fullSize) {\n // Exit fullscreen but preserve the current rendered dimensions so the panel\n // appears to stay in place while the user resizes from the edges.\n // Measure from the DOM so we get the real pixel width/height regardless of\n // what `calc(100% - 16px)` resolves to (differs for portaled vs. in-place\n // panels because `100%` is relative to the containing block, not the viewport).\n const container = contentRef.current?.parentElement;\n currentWidth = container?.offsetWidth ?? windowDimensions.width - 16;\n currentHeight = container?.offsetHeight ?? windowDimensions.height - 16;\n currentX = 8;\n currentY = 8;\n // Sync motion values now so x.get()/y.get() return the correct position for\n // computing fixed-edge anchors below.\n x.set(8);\n y.set(8);\n setFullSize(false);\n setPanelSize({ width: currentWidth, height: currentHeight });\n setPanelPosition({ x: currentX, y: currentY });\n } else if (isAutoHeight) {\n // If we're leaving CSS auto-fit, capture the current rendered height so the\n // panel doesn't jump from its content-fit size back to `initialHeight` when\n // pixel mode takes over.\n const container = contentRef.current?.parentElement;\n currentHeight = container?.offsetHeight ?? panelSize.height;\n currentWidth = panelSize.width;\n currentX = panelPosition.x;\n currentY = panelPosition.y;\n setPanelSize({ width: currentWidth, height: currentHeight });\n } else {\n currentWidth = panelSize.width;\n currentHeight = panelSize.height;\n currentX = panelPosition.x;\n currentY = panelPosition.y;\n }\n\n panelSizeRef.current = { width: currentWidth, height: currentHeight };\n // Capture start dimensions in a ref so handleResizeMouseMove (stale closure)\n // can read the correct initial values for unchanged axes without depending on\n // panelSize/panelPosition state captured at listener-registration time.\n resizeStartDimensionsRef.current = {\n width: currentWidth,\n height: currentHeight,\n x: currentX,\n y: currentY,\n };\n\n // Mark that user has manually resized - disable auto-resize from now on\n setHasManuallyResized(true);\n\n resizeDirectionRef.current = direction;\n\n // Calculate initial offsets and fixed points based on direction\n if (direction === ResizeDirection.SouthEast) {\n // Bottom-right: resize from bottom-right corner\n resizeOffsetRef.current = {\n x: event.clientX - currentWidth,\n y: event.clientY - currentHeight,\n };\n } else if (direction === ResizeDirection.SouthWest) {\n // Bottom-left: resize from bottom-left corner\n resizeRightRef.current = x.get() + currentWidth;\n resizeOffsetRef.current = {\n x: event.clientX,\n y: event.clientY - currentHeight,\n };\n } else if (direction === ResizeDirection.NorthWest) {\n // Top-left: resize from top-left corner\n resizeRightRef.current = x.get() + currentWidth;\n resizeBottomRef.current = y.get() + currentHeight;\n resizeOffsetRef.current = {\n x: event.clientX,\n y: event.clientY,\n };\n } else if (direction === ResizeDirection.NorthEast) {\n // Top-right: resize from top-right corner\n resizeBottomRef.current = y.get() + currentHeight;\n resizeOffsetRef.current = {\n x: event.clientX - currentWidth,\n y: event.clientY,\n };\n } else if (direction === ResizeDirection.West) {\n // Left edge\n resizeRightRef.current = x.get() + currentWidth;\n resizeOffsetRef.current = {\n x: event.clientX,\n y: 0,\n };\n } else if (direction === ResizeDirection.East) {\n // Right edge\n resizeOffsetRef.current = {\n x: event.clientX - currentWidth,\n y: 0,\n };\n } else if (direction === ResizeDirection.North) {\n // Top edge\n resizeBottomRef.current = y.get() + currentHeight;\n resizeOffsetRef.current = {\n x: 0,\n y: event.clientY,\n };\n } else if (direction === ResizeDirection.South) {\n // Bottom edge\n resizeOffsetRef.current = {\n x: 0,\n y: event.clientY - currentHeight,\n };\n }\n\n document.addEventListener('mousemove', handleResizeMouseMove);\n document.addEventListener('mouseup', handleResizeMouseUp);\n }\n\n // ResizeMouseMove to calculate the new size and position of the panel\n function handleResizeMouseMove(event: MouseEvent) {\n const direction = resizeDirectionRef.current;\n // Use resizeStartDimensionsRef (a ref, always current) rather than panelSize/panelPosition\n // (stale closure values). For unchanged axes, these provide the correct starting dimensions\n // set at drag start — including the case where the drag began in fullscreen mode.\n let newWidth = resizeStartDimensionsRef.current.width;\n let newHeight = resizeStartDimensionsRef.current.height;\n let clampedX = resizeStartDimensionsRef.current.x;\n let clampedY = resizeStartDimensionsRef.current.y;\n\n if (direction === ResizeDirection.SouthEast) {\n // Bottom-right corner\n newWidth = Math.round(Math.max(minWidth, event.clientX - resizeOffsetRef.current.x));\n newHeight = Math.round(Math.max(minHeight, event.clientY - resizeOffsetRef.current.y));\n } else if (direction === ResizeDirection.SouthWest) {\n // Bottom-left corner\n const right = resizeRightRef.current!;\n const proposedX = event.clientX;\n newWidth = Math.round(Math.max(minWidth, right - proposedX));\n clampedX = Math.round(right - newWidth);\n newHeight = Math.round(Math.max(minHeight, event.clientY - resizeOffsetRef.current.y));\n } else if (direction === ResizeDirection.NorthWest) {\n // Top-left corner\n const right = resizeRightRef.current!;\n const bottom = resizeBottomRef.current!;\n const proposedX = event.clientX;\n const proposedY = event.clientY;\n newWidth = Math.round(Math.max(minWidth, right - proposedX));\n newHeight = Math.round(Math.max(minHeight, bottom - proposedY));\n clampedX = Math.round(right - newWidth);\n clampedY = Math.round(bottom - newHeight);\n } else if (direction === ResizeDirection.NorthEast) {\n // Top-right corner\n const bottom = resizeBottomRef.current!;\n const proposedY = event.clientY;\n newWidth = Math.round(Math.max(minWidth, event.clientX - resizeOffsetRef.current.x));\n newHeight = Math.round(Math.max(minHeight, bottom - proposedY));\n clampedY = Math.round(bottom - newHeight);\n } else if (direction === ResizeDirection.West) {\n // Left edge\n const right = resizeRightRef.current!;\n const proposedX = event.clientX;\n newWidth = Math.round(Math.max(minWidth, right - proposedX));\n clampedX = Math.round(right - newWidth);\n } else if (direction === ResizeDirection.East) {\n // Right edge\n newWidth = Math.round(Math.max(minWidth, event.clientX - resizeOffsetRef.current.x));\n } else if (direction === ResizeDirection.North) {\n // Top edge\n const bottom = resizeBottomRef.current!;\n const proposedY = event.clientY;\n newHeight = Math.round(Math.max(minHeight, bottom - proposedY));\n clampedY = Math.round(bottom - newHeight);\n } else if (direction === ResizeDirection.South) {\n // Bottom edge\n newHeight = Math.round(Math.max(minHeight, event.clientY - resizeOffsetRef.current.y));\n }\n\n // We need to flush sync here because it would create jitter while the panel resizes from other directions\n // this is because the browser will animate serially, but we want to update the position and size together\n // so that the panel doesn't jump around\n flushSync(() => {\n setPanelPosition({ x: clampedX, y: clampedY });\n setPanelSize({ width: newWidth, height: newHeight });\n });\n }\n\n function handleResizeMouseUp() {\n document.removeEventListener('mousemove', handleResizeMouseMove);\n document.removeEventListener('mouseup', handleResizeMouseUp);\n }\n\n const panelContent = (\n <FloatingPanelContainer\n // Need to keep the values of x and y for positioning\n ref={refs.setFloating}\n $fitHeight={isAutoHeight}\n $maxHeight={autoFitMaxHeight(windowDimensions.height, panelPosition.y, minHeight)}\n $minHeight={minHeight}\n style={{\n x,\n y,\n }}\n initial={{\n top: 0,\n left: 0,\n opacity: 0,\n }}\n animate={{\n x: fullSize ? PADDING : panelPosition.x,\n y: fullSize ? PADDING : panelPosition.y,\n\n // When fullscreen, leave space for any reserved right-side content.\n width: fullSize ? `calc(100% - ${PADDING + fullscreenRightInset}px)` : panelSize.width,\n // Omit height when CSS auto-fit is active so `height: max-content`\n // on the styled container takes effect.\n ...(isAutoHeight ? {} : { height: fullSize ? 'calc(100% - 16px)' : panelSize.height }),\n opacity: isPositionReady ? 1 : 0,\n }}\n transition={\n wasFullSizeToggled\n ? {\n type: 'tween',\n // Easing curve for a smooth transition\n ease: [0.83, 0.0, 0.17, 1.0],\n duration: prefersReducedMotion ? 1.2 : 0.4,\n }\n : { opacity: { duration: 0.15, ease: 'easeOut' }, duration: 0 }\n }\n onDragEnd={() => {\n if (!fullSize) {\n const newPosition = { x: x.get(), y: y.get() };\n const clampedPosition = clampPositionToBounds(newPosition);\n setPanelPosition(clampedPosition);\n }\n }}\n drag={!fullSize}\n dragControls={dragControls}\n dragListener={false}\n dragMomentum={false}\n dragConstraints={dragConstraints}\n // The frame portals to the body, so panels that dismiss on an outside click\n // need this id to recognize a click in here as one of their own overlays.\n id={`${FLOATING_PANEL_ID_PREFIX}container`}\n {...restProps}\n >\n <DragHandle isFullSize={fullSize} onPointerDown={(e) => dragControls.start(e)}>\n <Stack align='center' direction='horizontal' justify='space-between'>\n <PanelText>{title}</PanelText>\n <Stack direction='horizontal' align='center' spacing={Spacing[1]}>\n {headerActions}\n {canFullsize && (\n <StyledIconButton\n size='sm'\n aria-label={fullSize ? 'collapse' : 'expand'}\n id='floating-panel__toggle-fullsize'\n onClick={() => {\n setWasFullSizeToggled(true);\n setFullSize(!fullSize);\n }}\n >\n {fullSize ? <ArrowCollapseIcon /> : <ArrowExpandIcon />}\n </StyledIconButton>\n )}\n\n <StyledIconButton\n size='sm'\n id='floating-panel__close-panel'\n onClick={() => onClose?.()}\n aria-label='close'\n >\n <XIcon />\n </StyledIconButton>\n </Stack>\n </Stack>\n </DragHandle>\n <PanelContent ref={contentRef} $noPadding={noPadding} $fitHeight={isAutoHeight}>\n {children}\n </PanelContent>\n {hasFooter && (\n <Footer style={{ paddingLeft: isAdditionalActionButton ? Spacing[1] : Spacing[3] }}>\n <Stack\n align='center'\n direction='horizontal'\n justify={footerAdditionalAction ? 'space-between' : 'flex-end'}\n >\n {footerAdditionalAction &&\n (isAdditionalActionButton ? (\n footerAdditionalAction\n ) : (\n <PanelText>{footerAdditionalAction}</PanelText>\n ))}\n\n {footerButtons && <div>{footerButtons}</div>}\n </Stack>\n </Footer>\n )}\n <ResizeHandleBottomRight\n data-test='resize-handle-se'\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.SouthEast)}\n />\n <ResizeHandleBottom\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.South)}\n />\n <ResizeHandleBottomLeft\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.SouthWest)}\n />\n <ResizeHandleLeft\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.West)}\n />\n <ResizeHandleTopLeft\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.NorthWest)}\n />\n <ResizeHandleTop\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.North)}\n />\n <ResizeHandleTopRight\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.NorthEast)}\n />\n <ResizeHandleRight\n onMouseDown={(event) => handleResizeMouseDown(event, ResizeDirection.East)}\n />\n </FloatingPanelContainer>\n );\n\n const content = (\n <>\n {dismissOnNavigate && <DismissOnNavigate onClose={onClose} />}\n {panelContent}\n </>\n );\n\n return portal ? createPortal(content, document.body) : content;\n}\n","import {\n createContext,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { v4 as uuid } from 'uuid';\n\nexport type Panel = {\n key: string;\n panelElement: ReactElement;\n persistUntilPathRoot?: string;\n};\n\ninterface PanelContextType {\n openPanel: (panel: Panel) => void;\n closePanel: (key: string) => void;\n togglePanel: (panel: Panel) => void;\n closeAllPanels: () => void;\n isPanelOpen: (key: string) => boolean;\n panels: Panel[];\n}\n\nconst PanelContext = createContext<PanelContextType | null>(null);\n\nexport const PanelProvider = ({ children }: { children: ReactNode }) => {\n const [panels, setPanels] = useState<Panel[]>([]);\n const location = useLocation();\n\n function shouldPanelPersist(currentUrl: string, persistUntilPathRoot?: string): boolean {\n if (!persistUntilPathRoot) {\n return false;\n }\n return currentUrl.includes(persistUntilPathRoot);\n }\n\n const openPanel = useCallback(\n (panel: Panel) => {\n const { key, panelElement, persistUntilPathRoot } = panel;\n const pathRoot = persistUntilPathRoot || location.pathname;\n setPanels((prev) => [\n ...prev.filter((p) => p.key !== key), // Remove existing panel with same key\n { key, panelElement, persistUntilPathRoot: pathRoot },\n ]);\n },\n [location.pathname],\n );\n\n const closePanel = useCallback((key: string) => {\n setPanels((prev) => prev.filter((panel) => panel.key !== key));\n }, []);\n\n const isPanelOpen = useCallback(\n (key: string) => {\n return panels.some((panel) => panel.key === key);\n },\n [panels],\n );\n\n const togglePanel = useCallback(\n (panel: Panel) => {\n const { key } = panel;\n if (isPanelOpen(key)) {\n closePanel(key);\n } else {\n openPanel(panel);\n }\n },\n [isPanelOpen, closePanel, openPanel],\n );\n\n const closeAllPanels = useCallback(() => {\n setPanels([]);\n }, []);\n\n useEffect(() => {\n const nextLocation = location.pathname;\n\n setPanels((prevPanels) =>\n prevPanels.filter((panel) => shouldPanelPersist(nextLocation, panel.persistUntilPathRoot)),\n );\n }, [location.pathname]);\n\n return (\n <PanelContext.Provider\n value={{ openPanel, closePanel, togglePanel, closeAllPanels, panels, isPanelOpen }}\n >\n {children}\n </PanelContext.Provider>\n );\n};\n\nexport const usePersistentFloatingPanels = () => {\n const ctx = useContext(PanelContext);\n if (!ctx) {\n throw new Error('usePersistentFloatingPanels must be used within a PanelProvider');\n }\n return ctx;\n};\n\n// This hook is used to open a panel that persists across multiple pages\n// For single page panels, use the useToggle hook instead to manage individual panel state.\nexport const usePersistentFloatingPanel = (panelId?: string) => {\n const ctx = useContext(PanelContext);\n if (!ctx) {\n throw new Error('usePersistentFloatingPanels must be used within a PanelProvider');\n }\n\n // If the panel doesn't need to persist across multiple pages, we generate an id that can be passed back\n const currentPanelId = panelId || `panel-${uuid()}`;\n\n return {\n id: currentPanelId,\n openPanel: useCallback(\n (panel: Panel) => {\n ctx.openPanel(panel);\n },\n [ctx],\n ),\n closePanel: useCallback(() => {\n ctx.closePanel(currentPanelId);\n }, [currentPanelId, ctx]),\n togglePanel: useCallback(\n (panel: Panel) => {\n ctx.togglePanel(panel);\n },\n [ctx],\n ),\n isPanelOpen: ctx.isPanelOpen(currentPanelId),\n };\n};\n","import { cloneElement } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { usePersistentFloatingPanels } from './FloatingPanelContext';\n\nexport default function FloatingPanelRenderer() {\n const { panels, closePanel } = usePersistentFloatingPanels();\n\n if (panels.length === 0) {\n return null;\n }\n\n return createPortal(\n panels.map(({ key, panelElement: panel }) => {\n return cloneElement(panel, { onClose: () => closePanel(key), key: key });\n }),\n document.body,\n );\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { a as FormControlProps, c as FormLabelProps, i as FormControlBaseProps, l as HelperText, n as ErrorText, o as FormInputContainer, r as FormControl, s as FormLabel, t as Container, u as WarningText } from "../../FormControl-Doj2gvF0.mjs";
2
- import { r as useFormField } from "../../useFormField-B2U4GOH4.mjs";
1
+ import { a as FormControlProps, c as FormLabelProps, i as FormControlBaseProps, l as HelperText, n as ErrorText, o as FormInputContainer, r as FormControl, s as FormLabel, t as Container, u as WarningText } from "../../FormControl-CfpwZGlD.mjs";
2
+ import { r as useFormField } from "../../useFormField-BBbq1izo.mjs";
3
3
  export { Container, ErrorText, FormControl, FormControl as default, FormControlBaseProps, FormControlProps, FormInputContainer, FormLabel, FormLabelProps, HelperText, WarningText, useFormField };
@@ -1,3 +1,3 @@
1
- import { n as useFormField } from "../../useFormField-eftOPiXj.mjs";
2
- import { a as FormLabel, i as FormInputContainer, n as ErrorText, o as HelperText, r as FormControl, s as WarningText, t as Container } from "../../FormControl-HVzZEqJH.mjs";
1
+ import { n as useFormField } from "../../useFormField-Bz2iMPBO.mjs";
2
+ import { a as FormLabel, i as FormInputContainer, n as ErrorText, o as HelperText, r as FormControl, s as WarningText, t as Container } from "../../FormControl-D1HIqDKm.mjs";
3
3
  export { Container, ErrorText, FormControl, FormControl as default, FormInputContainer, FormLabel, HelperText, WarningText, useFormField };
@@ -1,4 +1,4 @@
1
- import { n as FormFieldBaseProps, r as FormFieldProps, t as FormField } from "../../FormField-D8dHbqZZ.mjs";
1
+ import { n as FormFieldBaseProps, r as FormFieldProps, t as FormField } from "../../FormField-0p4y0sS5.mjs";
2
2
  import { CheckboxField, CheckboxFieldProps, ComboboxField, ComboboxMultiSelectFieldProps, ComboboxSingleSelectFieldProps, ImplementsFormField, RadioGroupField, RadioGroupFieldProps, SegmentedControlField, SegmentedControlFieldProps, SelectField, SelectFieldProps, TextAreaField, TextAreaFieldProps, TextField, TextFieldProps, ToggleField, ToggleFieldProps, splitOutFormFieldProps } from "../../inputFields.mjs";
3
3
  import CheckboxGroupField from "../../CheckboxGroupField.mjs";
4
4
  import ListBoxField from "../../ListBoxField.mjs";
@@ -1,2 +1,2 @@
1
- import { a as CheckboxField, c as SegmentedControlField, d as TextField, f as ToggleField, i as CheckboxGroupField, l as SelectField, m as FormField, n as TableBoxField, o as ComboboxField, p as splitOutFormFieldProps, r as ListBoxField, s as RadioGroupField, t as TABLE_BOX_FIELD_ADD_BUTTON_ARIA_LABEL, u as TextAreaField } from "../../FormField-B9P3BWvS.mjs";
1
+ import { a as CheckboxField, c as SegmentedControlField, d as TextField, f as ToggleField, i as CheckboxGroupField, l as SelectField, m as FormField, n as TableBoxField, o as ComboboxField, p as splitOutFormFieldProps, r as ListBoxField, s as RadioGroupField, t as TABLE_BOX_FIELD_ADD_BUTTON_ARIA_LABEL, u as TextAreaField } from "../../FormField-CVnbsNvU.mjs";
2
2
  export { CheckboxField, CheckboxGroupField, ComboboxField, FormField, FormField as default, ListBoxField, RadioGroupField, SegmentedControlField, SelectField, TABLE_BOX_FIELD_ADD_BUTTON_ARIA_LABEL, TableBoxField, TextAreaField, TextField, ToggleField, splitOutFormFieldProps };
@@ -1,2 +1,2 @@
1
- import HoverCopyableField from "../../HoverCopyableField.mjs";
2
- export { HoverCopyableField as default };
1
+ import HoverCopyableField, { CopySuccessDetail, HoverCopyableFieldProps } from "../../HoverCopyableField.mjs";
2
+ export { type CopySuccessDetail, type HoverCopyableFieldProps, HoverCopyableField as default };
@@ -1,2 +1,2 @@
1
- import { t as HoverCopyableField_default } from "../../HoverCopyableField-0Bzygbp9.mjs";
2
- export { HoverCopyableField_default as default };
1
+ import { t as HoverCopyableField } from "../../HoverCopyableField-HWshrU_1.mjs";
2
+ export { HoverCopyableField as default };
@@ -1,16 +1,16 @@
1
- import { focusOutline } from "../../mixins/focus.mjs";
1
+ import { a as styled, r as css } from "../../styledComponentsInterop-8zScIQyC.mjs";
2
+ import { i as Paragraph } from "../../Text-B0orb-cZ.mjs";
2
3
  import "../../variables/transitions.mjs";
3
- import { n as Stack } from "../../Stack-Bl54WmhY.mjs";
4
- import { i as Paragraph } from "../../Text-RcEfNFLx.mjs";
5
- import { a as Tooltip } from "../../Tooltip-BvDbmXak.mjs";
6
- import { t as IconButton } from "../../IconButton-BfDlic2K.mjs";
7
- import { n as DropdownMenu_default } from "../../DropdownMenu-BCyV8nC0.mjs";
8
- import { t as LoadingShimmer } from "../../LoadingShimmer-DC2vqicd.mjs";
9
- import { t as Checkbox } from "../../Checkbox-DAvbgZgO.mjs";
4
+ import { a as Tooltip } from "../../Tooltip-iJcfJqxn.mjs";
5
+ import { focusOutline } from "../../mixins/focus.mjs";
6
+ import { n as Stack } from "../../Stack-Bre2oiov.mjs";
7
+ import { t as IconButton } from "../../IconButton-BgL3QUVO.mjs";
8
+ import { n as DropdownMenu_default } from "../../DropdownMenu-82xH1AZr.mjs";
9
+ import { t as LoadingShimmer } from "../../LoadingShimmer-dsBWRdTU.mjs";
10
+ import { t as Checkbox } from "../../Checkbox-Ccuicmlo.mjs";
10
11
  import { Color, Spacing } from "@persona/design-tokens";
11
- import styled, { css } from "styled-components";
12
- import { jsx, jsxs } from "react/jsx-runtime";
13
12
  import { useEffect, useState } from "react";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
14
  import { ImageIcon, LockedIcon, MoreIcon } from "@persona/icons";
15
15
  //#region components/ImageTile/ImageTile.tsx
16
16
  const MIN_WIDTH = "180px";
@@ -1,2 +1,2 @@
1
- import { a as InputProps, i as InputGroupProps, n as Input, r as InputGroup, t as ClearButton } from "../../Input-CVdjkX88.mjs";
1
+ import { a as InputProps, i as InputGroupProps, n as Input, r as InputGroup, t as ClearButton } from "../../Input-BHHWpSKN.mjs";
2
2
  export { ClearButton, Input, Input as default, InputGroup, InputGroupProps, InputProps };
@@ -1,4 +1,4 @@
1
- import { n as Input, r as InputGroup, t as ClearButton } from "../../Input-Bimw8KFj.mjs";
1
+ import { n as Input, r as InputGroup, t as ClearButton } from "../../Input-DoB8YswA.mjs";
2
2
  //#region components/Input/index.ts
3
3
  var Input_default = Input;
4
4
  //#endregion
@@ -1,11 +1,11 @@
1
- import { focusOutline } from "../../mixins/focus.mjs";
2
- import "../../variables/transitions.mjs";
1
+ import { a as styled, r as css } from "../../styledComponentsInterop-8zScIQyC.mjs";
3
2
  import { paragraphMixins } from "../../mixins/text.mjs";
3
+ import "../../variables/transitions.mjs";
4
+ import { focusOutline } from "../../mixins/focus.mjs";
4
5
  import { Color, Spacing } from "@persona/design-tokens";
5
- import styled, { css } from "styled-components";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
- import { Link as Link$1 } from "react-router-dom";
8
7
  import { LinkExternalIcon } from "@persona/icons";
8
+ import { Link as Link$1 } from "react-router-dom";
9
9
  //#region components/Link/Link.tsx
10
10
  const IconContainer = styled.span`
11
11
  display: inline-block;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["RouterLink"],"sources":["../../../components/Link/Link.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes, ReactNode } from 'react';\nimport { Link as RouterLink, type LinkProps as RouterLinkProps } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { LinkExternalIcon } from '@persona/icons';\nimport { focusOutline } from 'design-system/mixins/focus';\nimport { paragraphMixins } from 'design-system/mixins/text';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\ntype Target = '_blank' | '_self' | '_parent' | '_top';\n\ninterface BaseLinkProps {\n /**\n * The content to display inside the link.\n *\n */\n children?: ReactNode;\n /**\n * Provides an accessible name for the link when the visible text alone\n * isn't descriptive enough for screen reader users\n */\n 'aria-label'?: string;\n}\n\ninterface ExternalLinkProps extends BaseLinkProps, AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * The URL to navigate to. Can be internal (e.g., \"/dashboard\") or external (e.g., \"https://example.com\").\n */\n url: string;\n\n /**\n * Where to open the link. Use \"_blank\" for external links to open in a new tab.\n */\n target?: Target;\n}\n\ninterface InternalLinkProps extends BaseLinkProps, Omit<RouterLinkProps, 'to'> {\n /**\n * The URL to navigate to. Should be an internal route (e.g., \"/dashboard\").\n */\n url: string;\n}\n\nexport type LinkProps = ExternalLinkProps | InternalLinkProps;\n\nconst IconContainer = styled.span`\n display: inline-block;\n vertical-align: middle;\n /* Uses padding here since we can't define flex on the element for multiline support */\n padding-left: 2px;\n /* Needed to reset the height of the container for SVG */\n line-height: 0;\n position: relative;\n /* Optical alignment adjustments */\n bottom: 1px;\n`;\n\nconst baseLinkStyles = css`\n ${paragraphMixins.md};\n color: ${Color.CorePurple600};\n width: fit-content;\n position: relative;\n overflow: hidden;\n text-decoration: underline;\n\n transition:\n color ${TransitionDuration.ExtraFast} ease-out,\n text-underline-offset ${TransitionDuration.ExtraFast} ease-out;\n text-underline-offset: 2px;\n\n &:hover {\n /* TODO (ivan): move to semantic tokens */\n color: ${Color.CorePurple800};\n text-underline-offset: ${Spacing[1]};\n }\n\n border-radius: ${({ theme }) => theme.button.borderRadius};\n ${focusOutline}\n\n &:active {\n /* TODO (ivan): move to semantic tokens */\n color: ${Color.CorePurple900};\n }\n`;\n\nconst StyledAnchor = styled.a`\n ${baseLinkStyles}\n`;\n\nconst StyledRouterLink = styled(RouterLink)`\n ${baseLinkStyles}\n`;\n\nexport const Link = ({ children, url, ...props }: LinkProps) => {\n // Check if the URL is external by looking at the protocol or if target is _blank\n const isAbsoluteUrl = /^https?:\\/\\//.test(url);\n const hasBlankTarget = props.target === '_blank';\n const isExternal = isAbsoluteUrl || hasBlankTarget;\n\n if (isExternal) {\n const { 'aria-label': ariaLabel, ...anchorProps } = props;\n const externalProps = {\n href: url,\n target: '_blank',\n rel: 'noopener noreferrer',\n 'aria-label': ariaLabel,\n // Automatically inform screen readers that link opens in new window\n title: ariaLabel ? undefined : 'Opens in new window',\n ...anchorProps,\n };\n\n return (\n <StyledAnchor {...externalProps}>\n {children}\n <IconContainer>\n <LinkExternalIcon size={12} />\n </IconContainer>\n </StyledAnchor>\n );\n }\n\n // Internal link using React Router\n const { 'aria-label': ariaLabel, ...routerProps } = props;\n const internalProps = {\n to: url,\n 'aria-label': ariaLabel,\n\n ...routerProps,\n };\n\n return <StyledRouterLink {...internalProps}>{children}</StyledRouterLink>;\n};\n\nexport default Link;\n"],"mappings":";;;;;;;;;AA8CA,MAAM,gBAAgB,OAAO,IAAI;;;;;;;;;;;AAYjC,MAAM,iBAAiB,GAAG;IACtB,gBAAgB,GAAG;WACZ,MAAM,cAAc;;;;;;;oBAOU;oCACgB;;;;;aAK5C,MAAM,cAAc;6BACJ,QAAQ,GAAG;;;oBAGpB,EAAE,YAAY,MAAM,OAAO,aAAa;IACxD,aAAa;;;;aAIJ,MAAM,cAAc;;;AAIjC,MAAM,eAAe,OAAO,CAAC;IACzB,eAAe;;AAGnB,MAAM,mBAAmB,OAAOA,OAAW;IACvC,eAAe;;AAGnB,MAAa,QAAQ,EAAE,UAAU,KAAK,GAAG,YAAuB;CAE9D,MAAM,gBAAgB,eAAe,KAAK,IAAI;CAC9C,MAAM,iBAAiB,MAAM,WAAW;AAGxC,KAFmB,iBAAiB,gBAEpB;EACd,MAAM,EAAE,cAAc,WAAW,GAAG,gBAAgB;AAWpD,SACE,qBAAC,cAAD;GAVA,MAAM;GACN,QAAQ;GACR,KAAK;GACL,cAAc;GAEd,OAAO,YAAY,KAAA,IAAY;GAC/B,GAAG;aAIH,CACG,UACD,oBAAC,eAAD,EAAA,UACE,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA,EAChB,CAAA,CACH;;;CAKnB,MAAM,EAAE,cAAc,WAAW,GAAG,gBAAgB;AAQpD,QAAO,oBAAC,kBAAD;EANL,IAAI;EACJ,cAAc;EAEd,GAAG;EAGwC;EAA4B,CAAA"}
1
+ {"version":3,"file":"index.mjs","names":["RouterLink"],"sources":["../../../components/Link/Link.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes, ReactNode } from 'react';\nimport { Link as RouterLink, type LinkProps as RouterLinkProps } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { LinkExternalIcon } from '@persona/icons';\nimport { focusOutline } from 'design-system/mixins/focus';\nimport { paragraphMixins } from 'design-system/mixins/text';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\ntype Target = '_blank' | '_self' | '_parent' | '_top';\n\ninterface BaseLinkProps {\n /**\n * The content to display inside the link.\n *\n */\n children?: ReactNode;\n /**\n * Provides an accessible name for the link when the visible text alone\n * isn't descriptive enough for screen reader users\n */\n 'aria-label'?: string;\n}\n\ninterface ExternalLinkProps extends BaseLinkProps, AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * The URL to navigate to. Can be internal (e.g., \"/settings\") or external (e.g., \"https://example.com\").\n */\n url: string;\n\n /**\n * Where to open the link. Use \"_blank\" for external links to open in a new tab.\n */\n target?: Target;\n}\n\ninterface InternalLinkProps extends BaseLinkProps, Omit<RouterLinkProps, 'to'> {\n /**\n * The URL to navigate to. Should be an internal route (e.g., \"/settings\").\n */\n url: string;\n}\n\nexport type LinkProps = ExternalLinkProps | InternalLinkProps;\n\nconst IconContainer = styled.span`\n display: inline-block;\n vertical-align: middle;\n /* Uses padding here since we can't define flex on the element for multiline support */\n padding-left: 2px;\n /* Needed to reset the height of the container for SVG */\n line-height: 0;\n position: relative;\n /* Optical alignment adjustments */\n bottom: 1px;\n`;\n\nconst baseLinkStyles = css`\n ${paragraphMixins.md};\n color: ${Color.CorePurple600};\n width: fit-content;\n position: relative;\n overflow: hidden;\n text-decoration: underline;\n\n transition:\n color ${TransitionDuration.ExtraFast} ease-out,\n text-underline-offset ${TransitionDuration.ExtraFast} ease-out;\n text-underline-offset: 2px;\n\n &:hover {\n /* TODO (ivan): move to semantic tokens */\n color: ${Color.CorePurple800};\n text-underline-offset: ${Spacing[1]};\n }\n\n border-radius: ${({ theme }) => theme.button.borderRadius};\n ${focusOutline}\n\n &:active {\n /* TODO (ivan): move to semantic tokens */\n color: ${Color.CorePurple900};\n }\n`;\n\nconst StyledAnchor = styled.a`\n ${baseLinkStyles}\n`;\n\nconst StyledRouterLink = styled(RouterLink)`\n ${baseLinkStyles}\n`;\n\nexport const Link = ({ children, url, ...props }: LinkProps) => {\n // Check if the URL is external by looking at the protocol or if target is _blank\n const isAbsoluteUrl = /^https?:\\/\\//.test(url);\n const hasBlankTarget = props.target === '_blank';\n const isExternal = isAbsoluteUrl || hasBlankTarget;\n\n if (isExternal) {\n const { 'aria-label': ariaLabel, ...anchorProps } = props;\n const externalProps = {\n href: url,\n target: '_blank',\n rel: 'noopener noreferrer',\n 'aria-label': ariaLabel,\n // Automatically inform screen readers that link opens in new window\n title: ariaLabel ? undefined : 'Opens in new window',\n ...anchorProps,\n };\n\n return (\n <StyledAnchor {...externalProps}>\n {children}\n <IconContainer>\n <LinkExternalIcon size={12} />\n </IconContainer>\n </StyledAnchor>\n );\n }\n\n // Internal link using React Router\n const { 'aria-label': ariaLabel, ...routerProps } = props;\n const internalProps = {\n to: url,\n 'aria-label': ariaLabel,\n\n ...routerProps,\n };\n\n return <StyledRouterLink {...internalProps}>{children}</StyledRouterLink>;\n};\n\nexport default Link;\n"],"mappings":";;;;;;;;;AA8CA,MAAM,gBAAgB,OAAO,IAAI;;;;;;;;;;;AAYjC,MAAM,iBAAiB,GAAG;IACtB,gBAAgB,GAAG;WACZ,MAAM,cAAc;;;;;;;oBAOU;oCACgB;;;;;aAK5C,MAAM,cAAc;6BACJ,QAAQ,GAAG;;;oBAGpB,EAAE,YAAY,MAAM,OAAO,aAAa;IACxD,aAAa;;;;aAIJ,MAAM,cAAc;;;AAIjC,MAAM,eAAe,OAAO,CAAC;IACzB,eAAe;;AAGnB,MAAM,mBAAmB,OAAOA,OAAW;IACvC,eAAe;;AAGnB,MAAa,QAAQ,EAAE,UAAU,KAAK,GAAG,YAAuB;CAE9D,MAAM,gBAAgB,eAAe,KAAK,IAAI;CAC9C,MAAM,iBAAiB,MAAM,WAAW;AAGxC,KAFmB,iBAAiB,gBAEpB;EACd,MAAM,EAAE,cAAc,WAAW,GAAG,gBAAgB;AAWpD,SACE,qBAAC,cAAD;GAVA,MAAM;GACN,QAAQ;GACR,KAAK;GACL,cAAc;GAEd,OAAO,YAAY,KAAA,IAAY;GAC/B,GAAG;aAIH,CACG,UACD,oBAAC,eAAD,EAAA,UACE,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA,EAChB,CAAA,CACH;;;CAKnB,MAAM,EAAE,cAAc,WAAW,GAAG,gBAAgB;AAQpD,QAAO,oBAAC,kBAAD;EANL,IAAI;EACJ,cAAc;EAEd,GAAG;EAGwC;EAA4B,CAAA"}
@@ -1,4 +1,4 @@
1
- import { i as useListBoxContext, n as ListBoxItemProps, r as ListBoxProps } from "../../ListBox-CDl5oZPX.mjs";
2
- import { n as LogicRowProps } from "../../LogicRow-CkbyvrUw.mjs";
3
- import { t as ListBox } from "../../index-DiCnyORA.mjs";
1
+ import { i as useListBoxContext, n as ListBoxItemProps, r as ListBoxProps } from "../../ListBox-BrY1bQ5-.mjs";
2
+ import { n as LogicRowProps } from "../../LogicRow-9a_klV2v.mjs";
3
+ import { t as ListBox } from "../../index-BxBsQi2S.mjs";
4
4
  export { ListBox, ListBox as default, ListBoxItemProps, ListBoxProps, LogicRowProps, useListBoxContext };
@@ -1,2 +1,2 @@
1
- import { n as useListBoxContext, t as ListBox } from "../../ListBox-DKZpGYjo.mjs";
1
+ import { n as useListBoxContext, t as ListBox } from "../../ListBox-B9uuMt2R.mjs";
2
2
  export { ListBox, ListBox as default, useListBoxContext };
@@ -1,2 +1,2 @@
1
- import { i as MaybeLoadingShimmer, n as LoadingShimmerHeading, r as LoadingShimmerParagraph, t as LoadingShimmer } from "../../LoadingShimmer-DC2vqicd.mjs";
1
+ import { i as MaybeLoadingShimmer, n as LoadingShimmerHeading, r as LoadingShimmerParagraph, t as LoadingShimmer } from "../../LoadingShimmer-dsBWRdTU.mjs";
2
2
  export { LoadingShimmer, LoadingShimmerHeading, LoadingShimmerParagraph, MaybeLoadingShimmer };
@@ -1,6 +1,6 @@
1
- import { n as Input } from "../../Input-Bimw8KFj.mjs";
2
- import { jsx } from "react/jsx-runtime";
1
+ import { n as Input } from "../../Input-DoB8YswA.mjs";
3
2
  import { forwardRef } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
4
  import { IMaskMixin } from "react-imask";
5
5
  //#region components/MaskedInput/MaskedInput.tsx
6
6
  const MaskedInputBase = IMaskMixin(({ inputRef, size, componentProps, ...props }) => /* @__PURE__ */ jsx(Input, {
@@ -1,5 +1,5 @@
1
+ import { a as styled } from "../../styledComponentsInterop-8zScIQyC.mjs";
1
2
  import { Spacing } from "@persona/design-tokens";
2
- import styled from "styled-components";
3
3
  //#region components/MatchHighlight/MatchHighlight.tsx
4
4
  const MatchHighlight = styled.span`
5
5
  /* Sizing and Borders */
@@ -1,2 +1,2 @@
1
- import { a as MenuDivider, c as MenuItem, d as MenuList, f as MenuProps, i as Menu, l as MenuItemProps, n as IconContainer, o as MenuHeading, r as ListItem, s as MenuHeadingProps, t as FloatingCard, u as MenuItemType } from "../../Menu-CYRdEnfo.mjs";
1
+ import { a as MenuDivider, c as MenuItem, d as MenuList, f as MenuProps, i as Menu, l as MenuItemProps, n as IconContainer, o as MenuHeading, r as ListItem, s as MenuHeadingProps, t as FloatingCard, u as MenuItemType } from "../../Menu-D4Y_J-QI.mjs";
2
2
  export { FloatingCard, IconContainer, ListItem, Menu, Menu as default, MenuDivider, MenuHeading, MenuHeadingProps, MenuItem, MenuItemProps, MenuItemType, MenuList, MenuProps };
@@ -1,2 +1,2 @@
1
- import { a as MenuDivider, c as MenuList, i as Menu, n as IconContainer, o as MenuHeading, r as ListItem, s as MenuItem, t as FloatingCard } from "../../Menu-Dir03WA9.mjs";
1
+ import { a as MenuDivider, c as MenuList, i as Menu, n as IconContainer, o as MenuHeading, r as ListItem, s as MenuItem, t as FloatingCard } from "../../Menu-CHbUf9PQ.mjs";
2
2
  export { FloatingCard, IconContainer, ListItem, Menu, Menu as default, MenuDivider, MenuHeading, MenuItem, MenuList };
@@ -1,14 +1,14 @@
1
- import { n as Stack, t as HStack } from "../../Stack-Bl54WmhY.mjs";
2
- import { t as Card_default } from "../../Card-BMCB9eFC.mjs";
3
- import { n as Heading$1 } from "../../Text-RcEfNFLx.mjs";
4
- import useEmbeddedSurface from "../../lib/useEmbeddedSurface.mjs";
5
- import { n as Button$1 } from "../../IconButton-BfDlic2K.mjs";
6
- import { i as TabBar, r as Tab } from "../../TabBar-D6UocZXi.mjs";
1
+ import { a as styled } from "../../styledComponentsInterop-8zScIQyC.mjs";
2
+ import { t as Card_default } from "../../Card-CKrJtn1f.mjs";
3
+ import { n as Heading$1 } from "../../Text-B0orb-cZ.mjs";
4
+ import useEmbeddedSurface, { useEmbeddedSurfaceGate, useEmbeddedSurfaceId } from "../../lib/useEmbeddedSurface.mjs";
5
+ import { n as Stack, t as HStack } from "../../Stack-Bre2oiov.mjs";
6
+ import { n as Button$1 } from "../../IconButton-BgL3QUVO.mjs";
7
+ import { i as TabBar, r as Tab } from "../../TabBar-sYllYizt.mjs";
7
8
  import { Color, Spacing } from "@persona/design-tokens";
8
- import styled from "styled-components";
9
+ import { forwardRef, useContext, useEffect, useRef, useState } from "react";
10
+ import { Button, Dialog, DialogTrigger, Heading, Modal, ModalOverlay, OverlayTriggerStateContext, Pressable } from "react-aria-components";
9
11
  import { jsx, jsxs } from "react/jsx-runtime";
10
- import { Button, Dialog, DialogTrigger, Heading, Modal, ModalOverlay, Pressable } from "react-aria-components";
11
- import { forwardRef, useEffect, useRef, useState } from "react";
12
12
  import { XIcon } from "@persona/icons";
13
13
  //#region lib/useModalInsetRight.ts
14
14
  const CSS_VAR = "--modal-inset-right";
@@ -91,6 +91,16 @@ const StyledModalOverlay = styled(ModalOverlay)`
91
91
  right: ${({ $insetRight }) => $insetRight};
92
92
  transition: right ${({ $transitionMs }) => $transitionMs}ms ease-out;
93
93
  animation: overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1);
94
+ animation-delay: ${({ $animationDelayMs }) => $animationDelayMs}ms;
95
+ animation-fill-mode: both;
96
+ ${({ $hostPending }) => $hostPending && `
97
+ animation-play-state: paused;
98
+ `}
99
+ @media (prefers-reduced-motion: reduce) {
100
+ animation-duration: 0ms;
101
+ animation-delay: 0ms;
102
+ animation-play-state: running;
103
+ }
94
104
  z-index: 10000;
95
105
  display: flex;
96
106
  align-items: center;
@@ -102,13 +112,30 @@ const StyledModal = styled(Modal)`
102
112
  width: fit-content;
103
113
  max-width: 100%;
104
114
  `;
105
- const EmbeddedSurfaceModal = forwardRef(function EmbeddedSurfaceModal({ children }, ref) {
106
- useEmbeddedSurface();
115
+ /**
116
+ * React Aria keeps the overlay mounted through the exit animation, so announcing the surface from
117
+ * here — rather than from the persistent gate below — releases the host's backdrop exactly when the
118
+ * modal stops being painted.
119
+ */
120
+ const EmbeddedSurfaceModal = forwardRef(function EmbeddedSurfaceModal({ children, surfaceId }, ref) {
121
+ useEmbeddedSurface(surfaceId);
107
122
  return /* @__PURE__ */ jsx(StyledModal, {
108
123
  ref,
109
124
  children
110
125
  });
111
126
  });
127
+ const EmbeddedSurfaceOverlay = ({ surfaceId, ...props }) => {
128
+ const isOpen = useContext(OverlayTriggerStateContext)?.isOpen ?? false;
129
+ const { ready, animationDelayMs } = useEmbeddedSurfaceGate(surfaceId, isOpen);
130
+ const { $insetRight, $transitionMs, ...overlayProps } = props;
131
+ return /* @__PURE__ */ jsx(StyledModalOverlay, {
132
+ ...overlayProps,
133
+ $insetRight,
134
+ $transitionMs,
135
+ $animationDelayMs: animationDelayMs,
136
+ $hostPending: isOpen && !ready
137
+ });
138
+ };
112
139
  const ModalCloseButton = styled(Button$1)`
113
140
  display: inline-flex;
114
141
  padding: ${Spacing[2]};
@@ -252,6 +279,7 @@ const ModalCard = forwardRef(function ModalCard({ title, children, showCloseButt
252
279
  });
253
280
  const Modal$1 = ({ children, trigger, contentProps, noBodyPadding = false, size = "md", title, footer, tabs, defaultOpen, onOpenChange, isDismissable = false, isKeyboardDismissDisabled = false, open }) => {
254
281
  const [portalContainer, setPortalContainer] = useState(null);
282
+ const surfaceId = useEmbeddedSurfaceId();
255
283
  const { insetRight: modalInsetRight, panelState } = useModalInsetRight();
256
284
  const transitionMs = panelState === "opening" ? 425 : panelState === "closing" ? 200 : 0;
257
285
  const content = /* @__PURE__ */ jsx(ModalCard, {
@@ -268,7 +296,8 @@ const Modal$1 = ({ children, trigger, contentProps, noBodyPadding = false, size
268
296
  isOpen: open,
269
297
  defaultOpen,
270
298
  onOpenChange,
271
- children: [trigger ? /* @__PURE__ */ jsx(Pressable, { children: trigger }) : null, /* @__PURE__ */ jsx(StyledModalOverlay, {
299
+ children: [trigger ? /* @__PURE__ */ jsx(Pressable, { children: trigger }) : null, /* @__PURE__ */ jsx(EmbeddedSurfaceOverlay, {
300
+ surfaceId,
272
301
  $insetRight: modalInsetRight,
273
302
  $transitionMs: transitionMs,
274
303
  isDismissable,
@@ -276,6 +305,7 @@ const Modal$1 = ({ children, trigger, contentProps, noBodyPadding = false, size
276
305
  shouldCloseOnInteractOutside: (element) => !element.closest("[data-react-aria-top-layer]"),
277
306
  children: /* @__PURE__ */ jsx(EmbeddedSurfaceModal, {
278
307
  ref: setPortalContainer,
308
+ surfaceId,
279
309
  children: content
280
310
  })
281
311
  })]