@persona/design-system 0.10.10 → 0.10.11

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 (447) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/{Action-CHWYwpYR.d.mts → Action-sLO73eKq.d.mts} +2 -2
  3. package/dist/Action.d.mts +1 -1
  4. package/dist/AdvancedFilterRuleRow.d.mts +2 -2
  5. package/dist/AdvancedFilterRulesPopover.d.mts +2 -2
  6. package/dist/ArrayValueControl.d.mts +1 -1
  7. package/dist/Attribute.d.mts +2 -2
  8. package/dist/{Badge-BCdsVKuj.mjs → Badge-DZq6ByIU.mjs} +2 -2
  9. package/dist/{Badge-BCdsVKuj.mjs.map → Badge-DZq6ByIU.mjs.map} +1 -1
  10. package/dist/BooleanValueControl.d.mts +1 -1
  11. package/dist/{Breadcrumbs-CMf3Uvow.mjs → Breadcrumbs-DpsNZWF9.mjs} +9 -9
  12. package/dist/Breadcrumbs-DpsNZWF9.mjs.map +1 -0
  13. package/dist/{Button-DjD8QxcY.d.mts → Button-C4a4BTjL.d.mts} +2 -2
  14. package/dist/Button.d.mts +1 -1
  15. package/dist/CalendarBase.d.mts +1 -1
  16. package/dist/{Card-DiUHtYg_.d.mts → Card-CPV4_mHk.d.mts} +4 -4
  17. package/dist/Card.d.mts +1 -1
  18. package/dist/Card2.d.mts +1 -1
  19. package/dist/CardGrouping.d.mts +1 -1
  20. package/dist/{CardV2-CrV6eEQb.mjs → CardV2-DCoDfEvr.mjs} +16 -13
  21. package/dist/CardV2-DCoDfEvr.mjs.map +1 -0
  22. package/dist/ChartFrame.d.mts +61 -0
  23. package/dist/ChartLegend.d.mts +60 -0
  24. package/dist/ChartPopover.d.mts +155 -0
  25. package/dist/{Checkbox-Dr4LMKHV.mjs → Checkbox-C3z7UUSC.mjs} +8 -8
  26. package/dist/Checkbox-C3z7UUSC.mjs.map +1 -0
  27. package/dist/{CheckboxGroupField-Bpu2j6G2.d.mts → CheckboxGroupField-BT87OVOF.d.mts} +2 -2
  28. package/dist/CheckboxGroupField.d.mts +1 -1
  29. package/dist/ChoicesValueControl.d.mts +1 -1
  30. package/dist/{Combobox-Gb_j1dg6.mjs → Combobox-BkK_tosd.mjs} +300 -116
  31. package/dist/Combobox-BkK_tosd.mjs.map +1 -0
  32. package/dist/Combobox-aOJDTjzC.d.mts +12 -0
  33. package/dist/Combobox.d.mts +3 -3
  34. package/dist/{ComboboxBase-BPXqJHaQ.d.mts → ComboboxBase-Brgv5nxk.d.mts} +65 -25
  35. package/dist/ComboboxBase.d.mts +2 -2
  36. package/dist/{ComboboxMultiSelect-BwkkSymj.d.mts → ComboboxMultiSelect-DJyAv0Eg.d.mts} +10 -6
  37. package/dist/ComboboxMultiSelect.d.mts +2 -2
  38. package/dist/{ComboboxSingleSelect-CdNNJNkp.d.mts → ComboboxSingleSelect-CP8-HLKl.d.mts} +8 -6
  39. package/dist/ComboboxSingleSelect.d.mts +2 -2
  40. package/dist/{CompactBar-BLZZWtIE.d.mts → CompactBar-B0LhjrYV.d.mts} +2 -2
  41. package/dist/CompactBar.d.mts +1 -1
  42. package/dist/{ConfigFormGroup-BCTWCws5.mjs → ConfigFormGroup-DAUqAhJW.mjs} +2 -2
  43. package/dist/{ConfigFormGroup-BCTWCws5.mjs.map → ConfigFormGroup-DAUqAhJW.mjs.map} +1 -1
  44. package/dist/{DataTable-BE9inUi-.d.mts → DataTable-CSl5Jn3E.d.mts} +18 -8
  45. package/dist/{DataTable-CIZJ1vO8.mjs → DataTable-DiwzhNMt.mjs} +41 -28
  46. package/dist/DataTable-DiwzhNMt.mjs.map +1 -0
  47. package/dist/DataTable.d.mts +1 -1
  48. package/dist/{DatePicker-C9redLBr.mjs → DatePicker-BK7ioKBm.mjs} +410 -410
  49. package/dist/DatePicker-BK7ioKBm.mjs.map +1 -0
  50. package/dist/DateRangeValueControl.d.mts +1 -1
  51. package/dist/DateValueControl.d.mts +1 -1
  52. package/dist/{DropdownButton-DpLG-cIj.mjs → DropdownButton-Dp-MZ5tA.mjs} +3 -3
  53. package/dist/{DropdownButton-DpLG-cIj.mjs.map → DropdownButton-Dp-MZ5tA.mjs.map} +1 -1
  54. package/dist/DropdownButton.d.mts +2 -2
  55. package/dist/{DropdownMenu-B6D4stkF.d.mts → DropdownMenu-BnHPeHOm.d.mts} +3 -3
  56. package/dist/{DropdownMenu-c8XK2Lr4.mjs → DropdownMenu-jJSHQaih.mjs} +4 -2
  57. package/dist/DropdownMenu-jJSHQaih.mjs.map +1 -0
  58. package/dist/DropdownMenu.d.mts +1 -1
  59. package/dist/{FieldRegistry-C2NVPhMO.d.mts → FieldRegistry-CJwGpUVK.d.mts} +2 -2
  60. package/dist/FieldRegistry.d.mts +1 -1
  61. package/dist/{FilterBar-BE_gBM0H.d.mts → FilterBar-DDyk14sx.d.mts} +4 -4
  62. package/dist/FilterBar.d.mts +1 -1
  63. package/dist/FilterPickerMenu.d.mts +2 -2
  64. package/dist/FilterPill.d.mts +1 -1
  65. package/dist/FilterPopover.d.mts +1 -1
  66. package/dist/FloatValueControl.d.mts +3 -2
  67. package/dist/{FloatingToolbar-DLRaE0o7.mjs → FloatingToolbar-rfKurDs8.mjs} +36 -39
  68. package/dist/FloatingToolbar-rfKurDs8.mjs.map +1 -0
  69. package/dist/{FormControl-BztNXLn6.mjs → FormControl--pbTH3bY.mjs} +3 -3
  70. package/dist/{FormControl-BztNXLn6.mjs.map → FormControl--pbTH3bY.mjs.map} +1 -1
  71. package/dist/{FormControl-BQe3GRhi.d.mts → FormControl-DPYbLcBK.d.mts} +2 -2
  72. package/dist/FormControl.d.mts +1 -1
  73. package/dist/FormControlLabel.d.mts +2 -2
  74. package/dist/{FormField-BW5uMzId.d.mts → FormField-CYNGm2bJ.d.mts} +2 -2
  75. package/dist/{FormField-Cf1VMvoa.mjs → FormField-DMxjftFw.mjs} +14 -14
  76. package/dist/{FormField-Cf1VMvoa.mjs.map → FormField-DMxjftFw.mjs.map} +1 -1
  77. package/dist/FormField.d.mts +1 -1
  78. package/dist/{Grid-CYpOqTUu.mjs → Grid-DVC0SSEZ.mjs} +2 -2
  79. package/dist/{Grid-CYpOqTUu.mjs.map → Grid-DVC0SSEZ.mjs.map} +1 -1
  80. package/dist/{Header-CV0Lcf0C.d.mts → Header-DaaUprCL.d.mts} +2 -2
  81. package/dist/Header.d.mts +1 -1
  82. package/dist/{HelperTooltip-BNM3pTM-.d.mts → HelperTooltip-C5BDdJSI.d.mts} +2 -2
  83. package/dist/HelperTooltip.d.mts +1 -1
  84. package/dist/HighlightedText.d.mts +1 -1
  85. package/dist/{HoverCopyableField-XHC_n9tp.mjs → HoverCopyableField-B2-xlwUt.mjs} +12 -7
  86. package/dist/HoverCopyableField-B2-xlwUt.mjs.map +1 -0
  87. package/dist/{IconButton-C_ReZm8v.d.mts → IconButton-7k-wjvH3.d.mts} +2 -2
  88. package/dist/{IconButton-DxHB2g80.mjs → IconButton-kSjnfhWt.mjs} +11 -10
  89. package/dist/IconButton-kSjnfhWt.mjs.map +1 -0
  90. package/dist/IconButton.d.mts +1 -1
  91. package/dist/ImageTile.d.mts +1 -1
  92. package/dist/IndexTableLayout.d.mts +4 -4
  93. package/dist/InlineCombobox.d.mts +1 -1
  94. package/dist/InlineInput.d.mts +1 -1
  95. package/dist/{Input-DH-5dKor.d.mts → Input-CwvrBsiS.d.mts} +3 -3
  96. package/dist/{Input-RHXujO9u.mjs → Input-TRmTBEav.mjs} +5 -5
  97. package/dist/{Input-RHXujO9u.mjs.map → Input-TRmTBEav.mjs.map} +1 -1
  98. package/dist/Input.d.mts +1 -1
  99. package/dist/IntegerValueControl.d.mts +3 -2
  100. package/dist/{Link-D_kCyLYX.mjs → Link-XvzUN8sY.mjs} +6 -6
  101. package/dist/Link-XvzUN8sY.mjs.map +1 -0
  102. package/dist/{ListBox-DpFcM-dM.d.mts → ListBox-BePQBYR7.d.mts} +3 -3
  103. package/dist/{ListBox-BZp6exb8.mjs → ListBox-DahM1PgU.mjs} +12 -12
  104. package/dist/{ListBox-BZp6exb8.mjs.map → ListBox-DahM1PgU.mjs.map} +1 -1
  105. package/dist/ListBox.d.mts +1 -1
  106. package/dist/{ListBoxField-DL6Zk8TU.d.mts → ListBoxField-lj7JN1BX.d.mts} +4 -4
  107. package/dist/ListBoxField.d.mts +1 -1
  108. package/dist/{LoadingShimmer-oPIv2ESr.mjs → LoadingShimmer-CpfKTSUs.mjs} +4 -3
  109. package/dist/LoadingShimmer-CpfKTSUs.mjs.map +1 -0
  110. package/dist/LoadingShimmer.d.mts +1 -1
  111. package/dist/{LogicRow-BakOUtzx.d.mts → LogicRow-Do7t7Suf.d.mts} +2 -2
  112. package/dist/LogicRow.d.mts +1 -1
  113. package/dist/MaskedInput.d.mts +2 -2
  114. package/dist/MatchHighlight.d.mts +1 -1
  115. package/dist/{Menu-BVn1jh46.mjs → Menu-BvMzSH2I.mjs} +5 -5
  116. package/dist/{Menu-BVn1jh46.mjs.map → Menu-BvMzSH2I.mjs.map} +1 -1
  117. package/dist/{Menu-D6OrKCTC.d.mts → Menu-Ca5ftvo6.d.mts} +4 -4
  118. package/dist/Menu.d.mts +1 -1
  119. package/dist/{MiddleTruncatedText-DicQsLDG.mjs → MiddleTruncatedText--jzGTD00.mjs} +2 -2
  120. package/dist/{MiddleTruncatedText-DicQsLDG.mjs.map → MiddleTruncatedText--jzGTD00.mjs.map} +1 -1
  121. package/dist/{Modal-De5_bPJ_.mjs → Modal-B6X5AgWj.mjs} +54 -25
  122. package/dist/{Modal-De5_bPJ_.mjs.map → Modal-B6X5AgWj.mjs.map} +1 -1
  123. package/dist/{Modal-CujB7DuB.d.mts → Modal-BPfFyzkw.d.mts} +3 -3
  124. package/dist/Modal.d.mts +1 -1
  125. package/dist/{PageHeader-UPiqJpIF.d.mts → PageHeader-BeBmYmUX.d.mts} +2 -2
  126. package/dist/{PageHeader-7_Hf6rHl.mjs → PageHeader-bhQTjuZF.mjs} +2 -2
  127. package/dist/{PageHeader-7_Hf6rHl.mjs.map → PageHeader-bhQTjuZF.mjs.map} +1 -1
  128. package/dist/PageHeader.d.mts +1 -1
  129. package/dist/{PageLayout-BdVM37bV.d.mts → PageLayout-BXM_pyrU.d.mts} +2 -2
  130. package/dist/{PageLayout-DjtGrvJa.mjs → PageLayout-DgEGcZgB.mjs} +3 -3
  131. package/dist/{PageLayout-DjtGrvJa.mjs.map → PageLayout-DgEGcZgB.mjs.map} +1 -1
  132. package/dist/PageLayout.d.mts +1 -1
  133. package/dist/{PageSelector-B5CcAzss.d.mts → PageSelector-C14ABZVL.d.mts} +2 -2
  134. package/dist/PageSelector.d.mts +1 -1
  135. package/dist/{Pagination-DMH2IaV0.mjs → Pagination-DE8wT55m.mjs} +5 -5
  136. package/dist/{Pagination-DMH2IaV0.mjs.map → Pagination-DE8wT55m.mjs.map} +1 -1
  137. package/dist/{Pii-24D_nSRQ.mjs → Pii-C42ZY88Y.mjs} +2 -2
  138. package/dist/{Pii-24D_nSRQ.mjs.map → Pii-C42ZY88Y.mjs.map} +1 -1
  139. package/dist/{PillShell-B7Bm-dsE.d.mts → PillShell-Bkyu5FXB.d.mts} +2 -2
  140. package/dist/PillShell.d.mts +1 -1
  141. package/dist/{Popover-DordjYNM.mjs → Popover-DuFjaSoq.mjs} +4 -2
  142. package/dist/Popover-DuFjaSoq.mjs.map +1 -0
  143. package/dist/Popover.d.mts +1 -1
  144. package/dist/ProgressBar.d.mts +1 -1
  145. package/dist/{ProgressIndicator-zt3ndT9U.mjs → ProgressIndicator-hy1P-RG1.mjs} +3 -3
  146. package/dist/{ProgressIndicator-zt3ndT9U.mjs.map → ProgressIndicator-hy1P-RG1.mjs.map} +1 -1
  147. package/dist/{Radio-BlEtetrr.mjs → Radio-B4TBAho6.mjs} +5 -5
  148. package/dist/Radio-B4TBAho6.mjs.map +1 -0
  149. package/dist/{RadioGroup-CMrXmmn4.mjs → RadioGroup-Bf24GKOb.mjs} +3 -3
  150. package/dist/{RadioGroup-CMrXmmn4.mjs.map → RadioGroup-Bf24GKOb.mjs.map} +1 -1
  151. package/dist/RichTextEditor.d.mts +1 -1
  152. package/dist/RuleEditorFields.d.mts +2 -2
  153. package/dist/RulesPill.d.mts +1 -1
  154. package/dist/SectionHeading.d.mts +1 -1
  155. package/dist/{SegmentedControl-D_DA-MU1.mjs → SegmentedControl-BpR7sUWO.mjs} +6 -3
  156. package/dist/SegmentedControl-BpR7sUWO.mjs.map +1 -0
  157. package/dist/{Select-CR9TjFfo.d.mts → Select-DYdn73Nh.d.mts} +2 -2
  158. package/dist/{Select-DOlw_LPR.mjs → Select-RdTT2KoH.mjs} +10 -8
  159. package/dist/Select-RdTT2KoH.mjs.map +1 -0
  160. package/dist/Select.d.mts +1 -1
  161. package/dist/SmartTextInput.d.mts +1 -1
  162. package/dist/SmartTextInputField.d.mts +2 -2
  163. package/dist/SmartTextInputFunctionDialog.d.mts +1 -1
  164. package/dist/SmartTextInputPopover.d.mts +1 -1
  165. package/dist/{Spinner-CXb-KUs1.mjs → Spinner-vcApnJzv.mjs} +2 -2
  166. package/dist/{Spinner-CXb-KUs1.mjs.map → Spinner-vcApnJzv.mjs.map} +1 -1
  167. package/dist/{Stack-CODxfzhl.d.mts → Stack-B6MrjJeW.d.mts} +2 -2
  168. package/dist/Stack.d.mts +1 -1
  169. package/dist/{StatusIndicator-CzRaEFSz.mjs → StatusIndicator-lwt35J6B.mjs} +3 -3
  170. package/dist/{StatusIndicator-CzRaEFSz.mjs.map → StatusIndicator-lwt35J6B.mjs.map} +1 -1
  171. package/dist/{Sticker-CLvRB8V5.d.mts → Sticker-C7Wv3Obx.d.mts} +4 -4
  172. package/dist/{Sticker-C1_6I08u.mjs → Sticker-jfOM4Yi6.mjs} +5 -5
  173. package/dist/{Sticker-C1_6I08u.mjs.map → Sticker-jfOM4Yi6.mjs.map} +1 -1
  174. package/dist/Sticker.d.mts +1 -1
  175. package/dist/StringValueControl.d.mts +2 -1
  176. package/dist/Tab.d.mts +2 -2
  177. package/dist/{TabBar-BCFO38E0.mjs → TabBar-DwHgbIQ6.mjs} +8 -8
  178. package/dist/TabBar-DwHgbIQ6.mjs.map +1 -0
  179. package/dist/{Table-DPi4Dt5H.mjs → Table-SMJAWqoe.mjs} +21 -13
  180. package/dist/Table-SMJAWqoe.mjs.map +1 -0
  181. package/dist/{TableBox-DNQsgQ8x.mjs → TableBox-DS8mpN3-.mjs} +21 -17
  182. package/dist/TableBox-DS8mpN3-.mjs.map +1 -0
  183. package/dist/TableBox.d.mts +1 -1
  184. package/dist/{TableBoxCell-CsRt_5gP.d.mts → TableBoxCell-Bo5xYEmR.d.mts} +6 -6
  185. package/dist/TableBoxCell.d.mts +1 -1
  186. package/dist/{TableBoxField-Db0Vjo6Z.d.mts → TableBoxField-CdgjSGLK.d.mts} +5 -5
  187. package/dist/TableBoxField.d.mts +1 -1
  188. package/dist/{TableBoxRow-exMlZyc4.d.mts → TableBoxRow-DuWS2iRC.d.mts} +2 -2
  189. package/dist/TableBoxRow.d.mts +1 -1
  190. package/dist/{TableBoxRowActions-UO9YN34k.d.mts → TableBoxRowActions-zW74DkXt.d.mts} +2 -2
  191. package/dist/TableBoxRowActions.d.mts +1 -1
  192. package/dist/{TableCell-CQsF7t4e.d.mts → TableCell-uv_jqT5e.d.mts} +2 -2
  193. package/dist/TableCell.d.mts +1 -1
  194. package/dist/{TableControls-Clo_0Mty.d.mts → TableControls-9vz-HfDu.d.mts} +4 -4
  195. package/dist/{TableControls-BrP_BqnF.mjs → TableControls-CX7BvgD2.mjs} +107 -43
  196. package/dist/TableControls-CX7BvgD2.mjs.map +1 -0
  197. package/dist/TableControls.d.mts +1 -1
  198. package/dist/{TableControlsContext-BNd6z9mD.d.mts → TableControlsContext-D0Hn3rwL.d.mts} +2 -2
  199. package/dist/TableControlsContext.d.mts +1 -1
  200. package/dist/{TableViewConfigurationDropdown-Cp7ausV_.d.mts → TableViewConfigurationDropdown-CZcLH8uR.d.mts} +2 -2
  201. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  202. package/dist/{TechnicalSticker-Cq5jzYKQ.mjs → TechnicalSticker-DrN45Vut.mjs} +9 -7
  203. package/dist/TechnicalSticker-DrN45Vut.mjs.map +1 -0
  204. package/dist/{Text-CvaqognH.d.mts → Text-CdHeSHCc.d.mts} +2 -2
  205. package/dist/Text.d.mts +1 -1
  206. package/dist/{TextArea-Dro-HH8O.mjs → TextArea-CQ1YNi2b.mjs} +4 -5
  207. package/dist/TextArea-CQ1YNi2b.mjs.map +1 -0
  208. package/dist/{TextUnderlineTooltip-Bd5e8KH3.d.mts → TextUnderlineTooltip-By1VVsSs.d.mts} +3 -3
  209. package/dist/TextUnderlineTooltip.d.mts +1 -1
  210. package/dist/Tile.d.mts +1 -1
  211. package/dist/{Toggle-D9MzTIZs.mjs → Toggle-DjmkjJlw.mjs} +13 -9
  212. package/dist/Toggle-DjmkjJlw.mjs.map +1 -0
  213. package/dist/{Tooltip-YViXzMdm.mjs → Tooltip-C2VB8I6y.mjs} +18 -5
  214. package/dist/Tooltip-C2VB8I6y.mjs.map +1 -0
  215. package/dist/{Tooltip-Ddy2Jq0K.d.mts → Tooltip-OxVvOfn8.d.mts} +3 -3
  216. package/dist/Tooltip.d.mts +1 -1
  217. package/dist/{TruncatedText-sr9Fhm3N.d.mts → TruncatedText-Dqj94BFK.d.mts} +2 -2
  218. package/dist/WizardModal.d.mts +1 -1
  219. package/dist/chartColors.d.mts +92 -0
  220. package/dist/chartFrameLayout.d.mts +46 -0
  221. package/dist/{clientFilterUtils-CGHYF5NE.d.mts → clientFilterUtils-CMLuN8kK.d.mts} +2 -2
  222. package/dist/clientFilterUtils.d.mts +1 -1
  223. package/dist/components/Accordion/index.mjs +25 -16
  224. package/dist/components/Accordion/index.mjs.map +1 -1
  225. package/dist/components/Attribute/index.mjs +8 -6
  226. package/dist/components/Attribute/index.mjs.map +1 -1
  227. package/dist/components/Badge/index.mjs +1 -1
  228. package/dist/components/Banner/index.mjs +3 -3
  229. package/dist/components/BottomPanel/index.mjs +10 -8
  230. package/dist/components/BottomPanel/index.mjs.map +1 -1
  231. package/dist/components/Breadcrumbs/index.mjs +1 -1
  232. package/dist/components/Button/index.d.mts +2 -2
  233. package/dist/components/Button/index.mjs +1 -1
  234. package/dist/components/ButtonGroup/index.mjs +2 -2
  235. package/dist/components/Card/index.d.mts +2 -2
  236. package/dist/components/CardV2/index.d.mts +1 -1
  237. package/dist/components/CardV2/index.mjs +1 -1
  238. package/dist/components/Chart/index.d.mts +9 -0
  239. package/dist/components/Chart/index.mjs +680 -0
  240. package/dist/components/Chart/index.mjs.map +1 -0
  241. package/dist/components/Checkbox/index.mjs +1 -1
  242. package/dist/components/CodeHighlight/index.mjs +4 -4
  243. package/dist/components/Combobox/index.d.mts +5 -3
  244. package/dist/components/Combobox/index.mjs +1 -1
  245. package/dist/components/ConfigFormGroup/index.mjs +1 -1
  246. package/dist/components/DataTable/TableControls/index.d.mts +20 -20
  247. package/dist/components/DataTable/TableControls/index.mjs +2 -2
  248. package/dist/components/DataTable/index.d.mts +5 -5
  249. package/dist/components/DataTable/index.mjs +1 -1
  250. package/dist/components/DataTable/types.d.mts +1 -1
  251. package/dist/components/DatePicker/index.mjs +1 -1
  252. package/dist/components/DropdownButton/index.mjs +1 -1
  253. package/dist/components/DropdownMenu/index.d.mts +1 -1
  254. package/dist/components/DropdownMenu/index.mjs +1 -1
  255. package/dist/components/FloatingPanel/index.mjs +20 -18
  256. package/dist/components/FloatingPanel/index.mjs.map +1 -1
  257. package/dist/components/FloatingToolbar/index.mjs +1 -1
  258. package/dist/components/FormControl/index.d.mts +1 -1
  259. package/dist/components/FormControl/index.mjs +1 -1
  260. package/dist/components/FormField/index.d.mts +5 -5
  261. package/dist/components/FormField/index.mjs +1 -1
  262. package/dist/components/Grid/index.mjs +1 -1
  263. package/dist/components/HoverCopyableField/index.mjs +1 -1
  264. package/dist/components/ImageTile/index.mjs +10 -10
  265. package/dist/components/ImageTile/index.mjs.map +1 -1
  266. package/dist/components/Input/index.d.mts +1 -1
  267. package/dist/components/Input/index.mjs +1 -1
  268. package/dist/components/Link/index.mjs +1 -1
  269. package/dist/components/ListBox/index.d.mts +3 -3
  270. package/dist/components/ListBox/index.mjs +1 -1
  271. package/dist/components/LoadingShimmer/index.mjs +1 -1
  272. package/dist/components/MaskedInput/index.mjs +1 -1
  273. package/dist/components/Menu/index.d.mts +1 -1
  274. package/dist/components/Menu/index.mjs +1 -1
  275. package/dist/components/Modal/index.d.mts +1 -1
  276. package/dist/components/Modal/index.mjs +1 -1
  277. package/dist/components/PageHeader/index.d.mts +1 -1
  278. package/dist/components/PageHeader/index.mjs +1 -1
  279. package/dist/components/Pagination/index.d.mts +1 -1
  280. package/dist/components/Pagination/index.mjs +1 -1
  281. package/dist/components/Pii/index.mjs +1 -1
  282. package/dist/components/Popover/index.mjs +1 -1
  283. package/dist/components/ProgressBar/index.mjs +20 -3
  284. package/dist/components/ProgressBar/index.mjs.map +1 -1
  285. package/dist/components/ProgressIndicator/index.mjs +1 -1
  286. package/dist/components/Radio/index.mjs +1 -1
  287. package/dist/components/RadioGroup/index.mjs +1 -1
  288. package/dist/components/RichTextEditor/index.mjs +9 -9
  289. package/dist/components/RightPanel/index.mjs +30 -15
  290. package/dist/components/RightPanel/index.mjs.map +1 -1
  291. package/dist/components/SegmentedControl/index.mjs +1 -1
  292. package/dist/components/Select/index.d.mts +1 -1
  293. package/dist/components/Select/index.mjs +1 -1
  294. package/dist/components/SelectionCard/index.mjs +5 -5
  295. package/dist/components/Slider/index.mjs +5 -4
  296. package/dist/components/Slider/index.mjs.map +1 -1
  297. package/dist/components/SmartTextInput/index.mjs +11 -18
  298. package/dist/components/SmartTextInput/index.mjs.map +1 -1
  299. package/dist/components/Spinner/index.mjs +1 -1
  300. package/dist/components/Stack/index.d.mts +1 -1
  301. package/dist/components/StatusIndicator/index.mjs +1 -1
  302. package/dist/components/Sticker/index.d.mts +1 -1
  303. package/dist/components/Sticker/index.mjs +1 -1
  304. package/dist/components/SwatchPicker/index.mjs +2 -1
  305. package/dist/components/SwatchPicker/index.mjs.map +1 -1
  306. package/dist/components/TabBar/index.mjs +1 -1
  307. package/dist/components/Table/index.d.mts +1 -1
  308. package/dist/components/Table/index.mjs +1 -1
  309. package/dist/components/TableBox/index.d.mts +1 -1
  310. package/dist/components/TableBox/index.mjs +1 -1
  311. package/dist/components/TechnicalSticker/index.mjs +1 -1
  312. package/dist/components/Text/index.d.mts +1 -1
  313. package/dist/components/TextArea/index.mjs +1 -1
  314. package/dist/components/Tile/index.mjs +2 -2
  315. package/dist/components/Toast/index.mjs +19 -13
  316. package/dist/components/Toast/index.mjs.map +1 -1
  317. package/dist/components/Toggle/index.mjs +1 -1
  318. package/dist/components/Tooltip/index.d.mts +3 -3
  319. package/dist/components/Tooltip/index.mjs +1 -1
  320. package/dist/components/VersionHistory/index.mjs +8 -8
  321. package/dist/compound-expression.d.mts +1 -1
  322. package/dist/{date-range-rule-value-ASr06ClE.d.mts → date-range-rule-value-DyLlMtjr.d.mts} +2 -2
  323. package/dist/date-range-rule-value.d.mts +1 -1
  324. package/dist/display.d.mts +1 -1
  325. package/dist/duration-token.d.mts +11 -0
  326. package/dist/exit-motion.d.mts +7 -0
  327. package/dist/fieldPickerOptions.d.mts +2 -2
  328. package/dist/{filter-size-context-CmFyIPCm.d.mts → filter-size-context-DVnjmuhk.d.mts} +2 -2
  329. package/dist/filter-size-context.d.mts +1 -1
  330. package/dist/{filters-DTBc0mE7.d.mts → filters-By_TYKAZ.d.mts} +3 -3
  331. package/dist/filters.d.mts +1 -1
  332. package/dist/{helpers-CBJ2AqGZ.d.mts → helpers-BIHsqdyX.d.mts} +2 -2
  333. package/dist/helpers.d.mts +1 -1
  334. package/dist/{index-kIon1vPp.d.mts → index-BozzRwby.d.mts} +2 -2
  335. package/dist/{index-OkdnW-u5.d.mts → index-CZJp4Af6.d.mts} +3 -3
  336. package/dist/index2.d.mts +1 -1
  337. package/dist/index4.d.mts +3 -3
  338. package/dist/index5.d.mts +1 -1
  339. package/dist/index6.d.mts +14 -14
  340. package/dist/{inputFields-DpHeZiFX.d.mts → inputFields-BqO2H-Kj.d.mts} +6 -6
  341. package/dist/inputFields.d.mts +1 -1
  342. package/dist/lib/MiddleTruncatedText.mjs +1 -1
  343. package/dist/lib/TruncatedText.d.mts +1 -1
  344. package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
  345. package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
  346. package/dist/lib/colorMode.d.mts +1 -1
  347. package/dist/lib/useChain.d.mts +1 -1
  348. package/dist/lib/useModalInsetRight.d.mts +4 -3
  349. package/dist/lib/useModalInsetRight.mjs +7 -5
  350. package/dist/lib/useModalInsetRight.mjs.map +1 -1
  351. package/dist/lint/THIRD_PARTY_NOTICES.md +30 -0
  352. package/dist/lint/index.mjs +696 -11
  353. package/dist/lint/index.mjs.map +1 -1
  354. package/dist/lint/recommended.json +7 -1
  355. package/dist/mixins/focus.mjs +1 -1
  356. package/dist/mixins/hoverable.mjs +2 -2
  357. package/dist/mixins/hoverable.mjs.map +1 -1
  358. package/dist/mixins/input.mjs +3 -2
  359. package/dist/mixins/input.mjs.map +1 -1
  360. package/dist/mixins/menuItem.mjs +2 -0
  361. package/dist/mixins/menuItem.mjs.map +1 -1
  362. package/dist/mixins/motion.d.mts +24 -0
  363. package/dist/mixins/motion.mjs +44 -0
  364. package/dist/mixins/motion.mjs.map +1 -0
  365. package/dist/motion-origin.d.mts +7 -0
  366. package/dist/motion.d.mts +63 -0
  367. package/dist/no-layout-motion.d.mts +7 -0
  368. package/dist/no-transition-all.d.mts +7 -0
  369. package/dist/{operators-BHxKZcpD.d.mts → operators-B8_k3r69.d.mts} +10 -3
  370. package/dist/operators.d.mts +2 -2
  371. package/dist/overlay-motion.d.mts +7 -0
  372. package/dist/patterns/CardGrouping/index.mjs +9 -9
  373. package/dist/patterns/CardGrouping/index.mjs.map +1 -1
  374. package/dist/patterns/IndexTableLayout/index.mjs +3 -3
  375. package/dist/patterns/LayoutLoadingShimmer/index.mjs +4 -4
  376. package/dist/patterns/LayoutLoadingSpinner/index.mjs +3 -1
  377. package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -1
  378. package/dist/patterns/PageLayout/index.d.mts +1 -1
  379. package/dist/patterns/PageLayout/index.mjs +1 -1
  380. package/dist/patterns/WizardModal/index.mjs +4 -4
  381. package/dist/relative-date-label.d.mts +1 -1
  382. package/dist/tone.d.mts +1 -1
  383. package/dist/{types-DLnCkvTt.d.mts → types-BJqmRXFV.d.mts} +15 -1
  384. package/dist/{types-CqcbWyUY.d.mts → types-BOsCi-kZ.d.mts} +8 -2
  385. package/dist/{types-BEdERA4v.d.mts → types-C_CncajO.d.mts} +2 -2
  386. package/dist/{types-BiqzeNsa.d.mts → types-D5txFacG.d.mts} +3 -3
  387. package/dist/types4.d.mts +1 -1
  388. package/dist/types5.d.mts +1 -1
  389. package/dist/types6.d.mts +1 -1
  390. package/dist/{url-state-CXUuK3_r.d.mts → url-state-CXPmXzIZ.d.mts} +2 -2
  391. package/dist/url-state.d.mts +1 -1
  392. package/dist/{useChain-B--KAtdN.d.mts → useChain-x9fd9Fyq.d.mts} +2 -2
  393. package/dist/useChainAtCursor.d.mts +1 -1
  394. package/dist/useChartColors.d.mts +30 -0
  395. package/dist/useChartSeriesVisibility.d.mts +22 -0
  396. package/dist/useChartStyles.d.mts +108 -0
  397. package/dist/useColumnConfiguration.d.mts +2 -2
  398. package/dist/useComboboxFooterAction.d.mts +1 -1
  399. package/dist/{useFilterStateV2-DBpbxAEC.d.mts → useFilterStateV2-DiTS9DTg.d.mts} +3 -3
  400. package/dist/useFilterStateV2.d.mts +1 -1
  401. package/dist/{useTableColumns-Xd14vx_h.d.mts → useTableColumns-BEKJNrb1.d.mts} +2 -2
  402. package/dist/useTableColumns.d.mts +1 -1
  403. package/dist/useTruncation.d.mts +1 -1
  404. package/dist/useValueControlError.d.mts +26 -0
  405. package/dist/utils.d.mts +1 -1
  406. package/dist/{validation-Tgg3AhuP.d.mts → validation-BDQdQ1cY.d.mts} +3 -3
  407. package/dist/validation.d.mts +1 -1
  408. package/dist/{value-control-resolver-XQbGCdsP.d.mts → value-control-resolver-BFJZEWDn.d.mts} +9 -3
  409. package/dist/value-control-resolver.d.mts +1 -1
  410. package/dist/variables/keyframes.d.mts +2 -1
  411. package/dist/variables/keyframes.mjs +9 -1
  412. package/dist/variables/keyframes.mjs.map +1 -1
  413. package/dist/variables/transitions.d.mts +31 -1
  414. package/dist/variables/transitions.mjs +50 -1
  415. package/dist/variables/transitions.mjs.map +1 -1
  416. package/llms.txt +1 -0
  417. package/package.json +14 -4
  418. package/skills/new-screen/SKILL.md +33 -0
  419. package/skills/ui-authoring/COMPONENTS.md +18 -0
  420. package/skills/ui-authoring/PATTERNS.md +51 -34
  421. package/skills/ui-authoring/STANDARD.md +68 -4
  422. package/skills/ui-authoring/TOKENS.md +27 -24
  423. package/dist/Breadcrumbs-CMf3Uvow.mjs.map +0 -1
  424. package/dist/CardV2-CrV6eEQb.mjs.map +0 -1
  425. package/dist/Checkbox-Dr4LMKHV.mjs.map +0 -1
  426. package/dist/Combobox-CIKqTYZt.d.mts +0 -11
  427. package/dist/Combobox-Gb_j1dg6.mjs.map +0 -1
  428. package/dist/DataTable-CIZJ1vO8.mjs.map +0 -1
  429. package/dist/DatePicker-C9redLBr.mjs.map +0 -1
  430. package/dist/DropdownMenu-c8XK2Lr4.mjs.map +0 -1
  431. package/dist/FloatingToolbar-DLRaE0o7.mjs.map +0 -1
  432. package/dist/HoverCopyableField-XHC_n9tp.mjs.map +0 -1
  433. package/dist/IconButton-DxHB2g80.mjs.map +0 -1
  434. package/dist/Link-D_kCyLYX.mjs.map +0 -1
  435. package/dist/LoadingShimmer-oPIv2ESr.mjs.map +0 -1
  436. package/dist/Popover-DordjYNM.mjs.map +0 -1
  437. package/dist/Radio-BlEtetrr.mjs.map +0 -1
  438. package/dist/SegmentedControl-D_DA-MU1.mjs.map +0 -1
  439. package/dist/Select-DOlw_LPR.mjs.map +0 -1
  440. package/dist/TabBar-BCFO38E0.mjs.map +0 -1
  441. package/dist/Table-DPi4Dt5H.mjs.map +0 -1
  442. package/dist/TableBox-DNQsgQ8x.mjs.map +0 -1
  443. package/dist/TableControls-BrP_BqnF.mjs.map +0 -1
  444. package/dist/TechnicalSticker-Cq5jzYKQ.mjs.map +0 -1
  445. package/dist/TextArea-Dro-HH8O.mjs.map +0 -1
  446. package/dist/Toggle-D9MzTIZs.mjs.map +0 -1
  447. package/dist/Tooltip-YViXzMdm.mjs.map +0 -1
@@ -1,14 +1,15 @@
1
1
  import { a as styled, r as css } from "../../styledComponentsInterop-Cs5CCPRy.mjs";
2
+ import { isFocusedVisible, isNotDisabled } from "../../lib/pseudoClass.mjs";
2
3
  import { semanticColor } from "../../lib/semanticColor.mjs";
4
+ import { focusOutlineControlled } from "../../mixins/focus.mjs";
5
+ import { ReducedMotionFade } from "../../variables/transitions.mjs";
6
+ import { fadeIn } from "../../variables/keyframes.mjs";
3
7
  import { HeadlessAriaButton } from "../../lib/HeadlessAriaButton.mjs";
4
8
  import { TruncatedText } from "../../lib/TruncatedText.mjs";
5
9
  import { i as Paragraph, n as Heading$1 } from "../../Text-D0vEReED.mjs";
6
- import "../../variables/transitions.mjs";
7
- import { isFocusedVisible, isNotDisabled } from "../../lib/pseudoClass.mjs";
8
- import { focusOutlineControlled } from "../../mixins/focus.mjs";
9
10
  import { n as Stack, t as HStack } from "../../Stack-Bzom2BTR.mjs";
10
- import { useLayoutEffect, useRef } from "react";
11
11
  import { Color, Spacing } from "@persona/design-tokens";
12
+ import { useLayoutEffect, useRef } from "react";
12
13
  import { Disclosure, DisclosurePanel } from "react-aria-components";
13
14
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
14
15
  import { ChevronDownIcon, ChevronRightIcon } from "@persona/icons/12px";
@@ -119,11 +120,7 @@ const ChevronContainer = styled.span`
119
120
  width: ${Spacing[3]};
120
121
  height: ${Spacing[3]};
121
122
  color: ${({ theme }) => semanticColor(theme, "FgSecondary", Color.BorderIconSecondary)};
122
- transition: color ${"200ms"} ease;
123
-
124
- @media (prefers-reduced-motion: reduce) {
125
- transition: none;
126
- }
123
+ transition: color ${"200ms"} ${"cubic-bezier(0.4, 0, 0.2, 1)"};
127
124
  `;
128
125
  const TriggerButton = styled(HeadlessAriaButton)`
129
126
  width: 100%;
@@ -135,13 +132,9 @@ const TriggerButton = styled(HeadlessAriaButton)`
135
132
  border-radius: 0;
136
133
  background-color: transparent;
137
134
  color: ${({ theme }) => semanticColor(theme, "FgPrimary", theme.color.text.primary)};
138
- transition: background-color ${"200ms"} ease-in-out;
135
+ transition: background-color ${"200ms"} ${"cubic-bezier(0.4, 0, 0.2, 1)"};
139
136
  ${focusOutlineControlled}
140
137
 
141
- @media (prefers-reduced-motion: reduce) {
142
- transition: none;
143
- }
144
-
145
138
  &${isFocusedVisible}${isNotDisabled} {
146
139
  position: relative;
147
140
  z-index: 1;
@@ -178,10 +171,16 @@ const TitleWrapper = styled.span`
178
171
  const Panel = styled(DisclosurePanel)`
179
172
  height: var(--disclosure-panel-height);
180
173
  overflow: clip;
181
- transition: height ${"200ms"} ease-out;
174
+ transition: height ${"200ms"} ${"cubic-bezier(0.4, 0, 0.2, 1)"};
182
175
 
176
+ /* No height motion: on expand the panel opens at once; on collapse it waits for the content's fade
177
+ to finish, then closes. React Aria hides the panel when this delayed transition ends. */
183
178
  @media (prefers-reduced-motion: reduce) {
184
- transition: none;
179
+ transition: height 0s linear ${ReducedMotionFade.duration};
180
+
181
+ ${ItemContainer}[data-expanded] > & {
182
+ transition: none;
183
+ }
185
184
  }
186
185
  `;
187
186
  const TitleHeading = styled(Heading$1)`
@@ -196,6 +195,16 @@ const TitleHeading = styled(Heading$1)`
196
195
  `;
197
196
  const PanelContent = styled.div`
198
197
  padding: ${Spacing[3]} ${Spacing[4]};
198
+
199
+ @media (prefers-reduced-motion: reduce) {
200
+ opacity: 0;
201
+ transition: opacity ${ReducedMotionFade.duration} ${ReducedMotionFade.easing};
202
+
203
+ ${ItemContainer}[data-expanded] > ${Panel} > & {
204
+ opacity: 1;
205
+ animation: ${fadeIn} ${ReducedMotionFade.duration} ${ReducedMotionFade.easing};
206
+ }
207
+ }
199
208
  `;
200
209
  const TitleText = styled.span`
201
210
  min-width: 0;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Heading"],"sources":["../../../src/components/Accordion/scrollExpandedItemIntoView.ts","../../../src/components/Accordion/AccordionItem.tsx","../../../src/components/Accordion/accordionTitleTypography.ts","../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { TransitionDurationInSeconds } from '#src/variables/transitions';\n\nexport type ScrollExpandedItemTarget = {\n itemElement: HTMLElement;\n triggerElement: HTMLElement;\n};\n\nconst SCROLL_ALIGN_THRESHOLD_PX = 4;\n\nconst prefersReducedMotion = () =>\n typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\nconst getScrollBehavior = (): ScrollBehavior => (prefersReducedMotion() ? 'auto' : 'smooth');\n\nconst isScrollableOverflow = (overflowY: string) =>\n overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay';\n\nexport const findScrollContainer = (element: HTMLElement): HTMLElement | null => {\n let parent = element.parentElement;\n\n while (parent) {\n const { overflowY } = getComputedStyle(parent);\n if (isScrollableOverflow(overflowY) && parent.scrollHeight > parent.clientHeight) {\n return parent;\n }\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst getContainerRect = (container: HTMLElement | null) => {\n if (container) {\n return container.getBoundingClientRect();\n }\n\n return {\n top: 0,\n bottom: window.innerHeight,\n } as Pick<DOMRect, 'top' | 'bottom'>;\n};\n\nconst scrollBy = (container: HTMLElement | null, deltaY: number) => {\n if (Math.abs(deltaY) <= SCROLL_ALIGN_THRESHOLD_PX) {\n return;\n }\n\n const behavior = getScrollBehavior();\n\n if (container) {\n container.scrollTo({ top: container.scrollTop + deltaY, behavior });\n return;\n }\n\n window.scrollBy({ top: deltaY, behavior });\n};\n\nexport const scrollExpandedItemIntoView = (target: ScrollExpandedItemTarget | null) => {\n if (!target) {\n return;\n }\n\n const { itemElement, triggerElement } = target;\n const container = findScrollContainer(itemElement);\n const containerRect = getContainerRect(container);\n const itemRect = itemElement.getBoundingClientRect();\n const triggerRect = triggerElement.getBoundingClientRect();\n const overflowBottom = itemRect.bottom - containerRect.bottom;\n\n if (overflowBottom > SCROLL_ALIGN_THRESHOLD_PX) {\n const maxScrollWithoutHidingTrigger = Math.max(0, triggerRect.top - containerRect.top);\n const deltaY = Math.min(overflowBottom, maxScrollWithoutHidingTrigger);\n scrollBy(container, deltaY);\n }\n};\n\nexport const scrollExpandedItemIntoViewAfterExpand = (target: ScrollExpandedItemTarget | null) => {\n scrollExpandedItemIntoView(target);\n\n if (!target) {\n return undefined;\n }\n\n const cleanups: Array<() => void> = [];\n const resyncScroll = () => scrollExpandedItemIntoView(target);\n\n const timeoutId = window.setTimeout(resyncScroll, TransitionDurationInSeconds.Fast * 1000);\n cleanups.push(() => window.clearTimeout(timeoutId));\n\n const panel = target.itemElement.querySelector<HTMLElement>('[data-accordion-panel]');\n if (panel) {\n const onTransitionEnd = (event: TransitionEvent) => {\n if (event.target !== panel || event.propertyName !== 'height') {\n return;\n }\n\n resyncScroll();\n };\n\n panel.addEventListener('transitionend', onTransitionEnd);\n cleanups.push(() => panel.removeEventListener('transitionend', onTransitionEnd));\n }\n\n const rafId = window.requestAnimationFrame(() => {\n const innerRafId = window.requestAnimationFrame(resyncScroll);\n cleanups.push(() => window.cancelAnimationFrame(innerRafId));\n });\n cleanups.push(() => window.cancelAnimationFrame(rafId));\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n };\n};\n\nexport const resolveAccordionTriggerElement = (itemElement: HTMLElement | null) => {\n if (!itemElement) {\n return null;\n }\n\n return (\n itemElement.querySelector<HTMLElement>('[slot=\"trigger\"]') ??\n itemElement.querySelector<HTMLElement>('button')\n );\n};\n","import type { ReactNode, RefObject } from 'react';\nimport { useLayoutEffect, useRef } from 'react';\nimport { Disclosure, DisclosurePanel } from 'react-aria-components';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { ChevronDownIcon, ChevronRightIcon } from '@persona/icons/12px';\n\nimport { HStack } from '#src/components/Stack';\nimport { Heading, Paragraph } from '#src/components/Text';\nimport { HeadlessAriaButton } from '#src/lib/HeadlessAriaButton';\nimport { isFocusedVisible, isNotDisabled } from '#src/lib/pseudoClass';\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { TruncatedText } from '#src/lib/TruncatedText';\nimport { focusOutlineControlled } from '#src/mixins/focus';\nimport { TransitionDuration } from '#src/variables/transitions';\n\nimport type { AccordionSize, AccordionTitleTypography } from './accordionTitleTypography';\nimport {\n scrollExpandedItemIntoViewAfterExpand,\n resolveAccordionTriggerElement,\n} from './scrollExpandedItemIntoView';\n\nexport type AccordionTitleHeadingAs = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport type { AccordionSize, AccordionTitleTypography };\n\nconst SIZE_HEIGHT: Record<AccordionSize, string> = {\n sm: Spacing[5],\n md: Spacing[6],\n lg: Spacing[7],\n};\n\nconst ItemContainer = styled(Disclosure)<{ $showDivider: boolean }>`\n display: flex;\n flex-direction: column;\n position: relative;\n\n &:focus-within {\n z-index: 1;\n }\n\n ${({ $showDivider }) =>\n $showDivider &&\n css`\n border-top: 1px solid\n ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n `}\n`;\n\nconst ChevronContainer = styled.span`\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: ${Spacing[3]};\n height: ${Spacing[3]};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', Color.BorderIconSecondary)};\n transition: color ${TransitionDuration.Fast} ease;\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n`;\n\nconst TriggerButton = styled(HeadlessAriaButton)<{\n $size: AccordionSize;\n $usesTitleTypographyOverride: boolean;\n}>`\n width: 100%;\n min-height: ${({ $size }) => SIZE_HEIGHT[$size]};\n height: ${({ $size, $usesTitleTypographyOverride }) =>\n $usesTitleTypographyOverride ? 'auto' : SIZE_HEIGHT[$size]};\n display: flex;\n align-items: center;\n text-align: left;\n border-radius: 0;\n background-color: transparent;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n transition: background-color ${TransitionDuration.Fast} ease-in-out;\n ${focusOutlineControlled}\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n\n &${isFocusedVisible}${isNotDisabled} {\n position: relative;\n z-index: 1;\n }\n\n &:disabled {\n cursor: default;\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', theme.color.text.disabled)};\n background-color: transparent;\n\n ${ChevronContainer} {\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', Color.BorderIconDisabled)};\n }\n }\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceHover', Color.BackgroundInteractiveHover)};\n }\n\n &:not(:disabled):hover ${ChevronContainer},\n &${isFocusedVisible}${isNotDisabled} ${ChevronContainer} {\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', Color.BorderIconPrimary)};\n }\n`;\n\nconst CollapseTitle = styled(HStack)`\n width: 100%;\n min-width: 0;\n`;\n\nconst TitleWrapper = styled.span`\n display: flex;\n align-items: center;\n min-width: 0;\n`;\n\nconst Panel = styled(DisclosurePanel)`\n height: var(--disclosure-panel-height);\n overflow: clip;\n transition: height ${TransitionDuration.Fast} ease-out;\n\n @media (prefers-reduced-motion: reduce) {\n transition: none;\n }\n`;\n\nconst TitleHeading = styled(Heading)`\n margin: 0;\n width: 100%;\n min-width: 0;\n font: inherit;\n font-size: inherit;\n line-height: inherit;\n font-weight: inherit;\n letter-spacing: inherit;\n`;\n\nconst PanelContent = styled.div`\n padding: ${Spacing[3]} ${Spacing[4]};\n`;\n\nconst TitleText = styled.span`\n min-width: 0;\n flex: 1;\n`;\n\nexport type AccordionItemComponentProps = {\n title: string;\n children: ReactNode;\n defaultExpanded?: boolean;\n disabled?: boolean;\n showDivider?: boolean;\n size: AccordionSize;\n titleTypography: AccordionTitleTypography;\n usesTitleTypographyOverride: boolean;\n titleHeadingAs: AccordionTitleHeadingAs;\n};\n\nconst renderTitleLabel = (\n title: string,\n titleTypography: AccordionTitleTypography,\n disabled: boolean,\n) => {\n const content = <TruncatedText>{title}</TruncatedText>;\n const textColor = disabled ? 'disabled' : 'primary';\n\n if (titleTypography.variant === 'heading') {\n return (\n <TitleText>\n <TitleWrapper>\n <Heading as='span' color={textColor} size={titleTypography.size}>\n {content}\n </Heading>\n </TitleWrapper>\n </TitleText>\n );\n }\n\n return (\n <TitleText>\n <TitleWrapper>\n <Paragraph\n as='span'\n color={textColor}\n size={titleTypography.size}\n weight={titleTypography.weight ?? 'normal'}\n >\n {content}\n </Paragraph>\n </TitleWrapper>\n </TitleText>\n );\n};\n\nconst renderChevron = (isExpanded: boolean) =>\n isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />;\n\nconst ExpandScrollSync = ({\n disabled,\n isExpanded,\n itemRef,\n}: {\n disabled: boolean;\n isExpanded: boolean;\n itemRef: RefObject<HTMLElement | null>;\n}) => {\n const wasExpandedRef = useRef(isExpanded);\n\n useLayoutEffect(() => {\n if (disabled) {\n wasExpandedRef.current = isExpanded;\n return undefined;\n }\n\n const didExpand = isExpanded && !wasExpandedRef.current;\n wasExpandedRef.current = isExpanded;\n\n const itemElement = itemRef.current;\n const triggerElement = resolveAccordionTriggerElement(itemElement);\n\n if (!didExpand || !itemElement || !triggerElement) {\n return undefined;\n }\n\n return scrollExpandedItemIntoViewAfterExpand({\n itemElement,\n triggerElement,\n });\n }, [disabled, isExpanded, itemRef]);\n\n return null;\n};\n\nconst AccordionItem = ({\n title,\n children,\n defaultExpanded = false,\n disabled = false,\n showDivider = false,\n size,\n titleTypography,\n usesTitleTypographyOverride,\n titleHeadingAs,\n}: AccordionItemComponentProps) => {\n const itemRef = useRef<HTMLDivElement>(null);\n\n return (\n <ItemContainer\n ref={itemRef}\n defaultExpanded={disabled ? false : defaultExpanded}\n isDisabled={disabled}\n $showDivider={showDivider}\n >\n {({ isExpanded }) => (\n <>\n <ExpandScrollSync disabled={disabled} isExpanded={isExpanded} itemRef={itemRef} />\n <TitleHeading forwardedAs={titleHeadingAs} size='xsm'>\n <TriggerButton\n slot='trigger'\n $size={size}\n $usesTitleTypographyOverride={usesTitleTypographyOverride}\n isDisabled={disabled}\n >\n <CollapseTitle align='center' spacing={Spacing[1]}>\n <ChevronContainer aria-hidden='true'>{renderChevron(isExpanded)}</ChevronContainer>\n {renderTitleLabel(title, titleTypography, disabled)}\n </CollapseTitle>\n </TriggerButton>\n </TitleHeading>\n <Panel data-accordion-panel>\n <PanelContent>{children}</PanelContent>\n </Panel>\n </>\n )}\n </ItemContainer>\n );\n};\n\nexport default AccordionItem;\n","import type { HeadingSize, ParagraphSize } from '#src/mixins/text';\n\nexport type AccordionSize = 'sm' | 'md' | 'lg';\n\nexport type AccordionTitleTypography =\n | { variant: 'heading'; size: HeadingSize }\n | {\n variant: 'paragraph';\n size: Extract<ParagraphSize, 'sm' | 'md' | 'lg'>;\n weight?: 'normal' | 'bold';\n };\n\nexport const getDefaultTitleTypography = (size: AccordionSize): AccordionTitleTypography => {\n if (size === 'lg') {\n return { variant: 'heading', size: 'xsm' };\n }\n\n if (size === 'sm') {\n return { variant: 'paragraph', size: 'sm', weight: 'normal' };\n }\n\n return { variant: 'paragraph', size: 'md', weight: 'bold' };\n};\n\nexport const resolveTitleTypography = (\n size: AccordionSize,\n titleTypography?: AccordionTitleTypography,\n): AccordionTitleTypography => titleTypography ?? getDefaultTitleTypography(size);\n","import type { ReactNode } from 'react';\n\nimport { Spacing } from '@persona/design-tokens';\n\nimport { Stack } from '#src/components/Stack';\n\nimport AccordionItem, {\n type AccordionSize,\n type AccordionTitleHeadingAs,\n type AccordionTitleTypography,\n} from './AccordionItem';\nimport { resolveTitleTypography } from './accordionTitleTypography';\n\nexport type AccordionItemProps = {\n id?: string;\n title: string;\n children: ReactNode;\n defaultExpanded?: boolean;\n disabled?: boolean;\n};\n\nexport type AccordionProps = {\n items: AccordionItemProps[];\n size?: AccordionSize;\n dividers?: boolean;\n titleTypography?: AccordionTitleTypography;\n /**\n * Heading element for each item title (inside the trigger), matching Card section headings.\n * Defaults to `h3`; use a lower level when the page already uses higher headings.\n */\n titleHeadingAs?: AccordionTitleHeadingAs;\n 'aria-label'?: string;\n className?: string;\n};\n\nexport const Accordion = ({\n items,\n size = 'md',\n dividers = false,\n titleTypography,\n titleHeadingAs = 'h3',\n 'aria-label': ariaLabel = 'Accordion',\n className,\n}: AccordionProps) => {\n if (items.length === 0) {\n return null;\n }\n\n const resolvedTitleTypography = resolveTitleTypography(size, titleTypography);\n const usesTitleTypographyOverride = titleTypography != null;\n\n return (\n <Stack aria-label={ariaLabel} className={className} fullWidth role='group' spacing={Spacing[0]}>\n {items.map((item, index) => (\n <AccordionItem\n key={item.id ?? `${item.title}-${index}`}\n defaultExpanded={item.defaultExpanded}\n disabled={item.disabled}\n showDivider={dividers}\n size={size}\n title={item.title}\n titleHeadingAs={titleHeadingAs}\n titleTypography={resolvedTitleTypography}\n usesTitleTypographyOverride={usesTitleTypographyOverride}\n >\n {item.children}\n </AccordionItem>\n ))}\n </Stack>\n );\n};\n\nexport default Accordion;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["Heading"],"sources":["../../../src/components/Accordion/scrollExpandedItemIntoView.ts","../../../src/components/Accordion/AccordionItem.tsx","../../../src/components/Accordion/accordionTitleTypography.ts","../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["import { TransitionDurationInSeconds } from '#src/variables/transitions';\n\nexport type ScrollExpandedItemTarget = {\n itemElement: HTMLElement;\n triggerElement: HTMLElement;\n};\n\nconst SCROLL_ALIGN_THRESHOLD_PX = 4;\n\nconst prefersReducedMotion = () =>\n typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\nconst getScrollBehavior = (): ScrollBehavior => (prefersReducedMotion() ? 'auto' : 'smooth');\n\nconst isScrollableOverflow = (overflowY: string) =>\n overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay';\n\nexport const findScrollContainer = (element: HTMLElement): HTMLElement | null => {\n let parent = element.parentElement;\n\n while (parent) {\n const { overflowY } = getComputedStyle(parent);\n if (isScrollableOverflow(overflowY) && parent.scrollHeight > parent.clientHeight) {\n return parent;\n }\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst getContainerRect = (container: HTMLElement | null) => {\n if (container) {\n return container.getBoundingClientRect();\n }\n\n return {\n top: 0,\n bottom: window.innerHeight,\n } as Pick<DOMRect, 'top' | 'bottom'>;\n};\n\nconst scrollBy = (container: HTMLElement | null, deltaY: number) => {\n if (Math.abs(deltaY) <= SCROLL_ALIGN_THRESHOLD_PX) {\n return;\n }\n\n const behavior = getScrollBehavior();\n\n if (container) {\n container.scrollTo({ top: container.scrollTop + deltaY, behavior });\n return;\n }\n\n window.scrollBy({ top: deltaY, behavior });\n};\n\nexport const scrollExpandedItemIntoView = (target: ScrollExpandedItemTarget | null) => {\n if (!target) {\n return;\n }\n\n const { itemElement, triggerElement } = target;\n const container = findScrollContainer(itemElement);\n const containerRect = getContainerRect(container);\n const itemRect = itemElement.getBoundingClientRect();\n const triggerRect = triggerElement.getBoundingClientRect();\n const overflowBottom = itemRect.bottom - containerRect.bottom;\n\n if (overflowBottom > SCROLL_ALIGN_THRESHOLD_PX) {\n const maxScrollWithoutHidingTrigger = Math.max(0, triggerRect.top - containerRect.top);\n const deltaY = Math.min(overflowBottom, maxScrollWithoutHidingTrigger);\n scrollBy(container, deltaY);\n }\n};\n\nexport const scrollExpandedItemIntoViewAfterExpand = (target: ScrollExpandedItemTarget | null) => {\n scrollExpandedItemIntoView(target);\n\n if (!target) {\n return undefined;\n }\n\n const cleanups: Array<() => void> = [];\n const resyncScroll = () => scrollExpandedItemIntoView(target);\n\n const timeoutId = window.setTimeout(resyncScroll, TransitionDurationInSeconds.Fast * 1000);\n cleanups.push(() => window.clearTimeout(timeoutId));\n\n const panel = target.itemElement.querySelector<HTMLElement>('[data-accordion-panel]');\n if (panel) {\n const onTransitionEnd = (event: TransitionEvent) => {\n if (event.target !== panel || event.propertyName !== 'height') {\n return;\n }\n\n resyncScroll();\n };\n\n panel.addEventListener('transitionend', onTransitionEnd);\n cleanups.push(() => panel.removeEventListener('transitionend', onTransitionEnd));\n }\n\n const rafId = window.requestAnimationFrame(() => {\n const innerRafId = window.requestAnimationFrame(resyncScroll);\n cleanups.push(() => window.cancelAnimationFrame(innerRafId));\n });\n cleanups.push(() => window.cancelAnimationFrame(rafId));\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n };\n};\n\nexport const resolveAccordionTriggerElement = (itemElement: HTMLElement | null) => {\n if (!itemElement) {\n return null;\n }\n\n return (\n itemElement.querySelector<HTMLElement>('[slot=\"trigger\"]') ??\n itemElement.querySelector<HTMLElement>('button')\n );\n};\n","import type { ReactNode, RefObject } from 'react';\nimport { useLayoutEffect, useRef } from 'react';\nimport { Disclosure, DisclosurePanel } from 'react-aria-components';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { ChevronDownIcon, ChevronRightIcon } from '@persona/icons/12px';\n\nimport { HStack } from '#src/components/Stack';\nimport { Heading, Paragraph } from '#src/components/Text';\nimport { HeadlessAriaButton } from '#src/lib/HeadlessAriaButton';\nimport { isFocusedVisible, isNotDisabled } from '#src/lib/pseudoClass';\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { TruncatedText } from '#src/lib/TruncatedText';\nimport { focusOutlineControlled } from '#src/mixins/focus';\nimport { fadeIn } from '#src/variables/keyframes';\nimport {\n ReducedMotionFade,\n TransitionDuration,\n TransitionEasing,\n} from '#src/variables/transitions';\n\nimport type { AccordionSize, AccordionTitleTypography } from './accordionTitleTypography';\nimport {\n scrollExpandedItemIntoViewAfterExpand,\n resolveAccordionTriggerElement,\n} from './scrollExpandedItemIntoView';\n\nexport type AccordionTitleHeadingAs = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport type { AccordionSize, AccordionTitleTypography };\n\nconst SIZE_HEIGHT: Record<AccordionSize, string> = {\n sm: Spacing[5],\n md: Spacing[6],\n lg: Spacing[7],\n};\n\nconst ItemContainer = styled(Disclosure)<{ $showDivider: boolean }>`\n display: flex;\n flex-direction: column;\n position: relative;\n\n &:focus-within {\n z-index: 1;\n }\n\n ${({ $showDivider }) =>\n $showDivider &&\n css`\n border-top: 1px solid\n ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n `}\n`;\n\nconst ChevronContainer = styled.span`\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: ${Spacing[3]};\n height: ${Spacing[3]};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', Color.BorderIconSecondary)};\n transition: color ${TransitionDuration.Fast} ${TransitionEasing.Move};\n`;\n\nconst TriggerButton = styled(HeadlessAriaButton)<{\n $size: AccordionSize;\n $usesTitleTypographyOverride: boolean;\n}>`\n width: 100%;\n min-height: ${({ $size }) => SIZE_HEIGHT[$size]};\n height: ${({ $size, $usesTitleTypographyOverride }) =>\n $usesTitleTypographyOverride ? 'auto' : SIZE_HEIGHT[$size]};\n display: flex;\n align-items: center;\n text-align: left;\n border-radius: 0;\n background-color: transparent;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n transition: background-color ${TransitionDuration.Fast} ${TransitionEasing.Move};\n ${focusOutlineControlled}\n\n &${isFocusedVisible}${isNotDisabled} {\n position: relative;\n z-index: 1;\n }\n\n &:disabled {\n cursor: default;\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', theme.color.text.disabled)};\n background-color: transparent;\n\n ${ChevronContainer} {\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', Color.BorderIconDisabled)};\n }\n }\n\n &:hover:not(:disabled) {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceHover', Color.BackgroundInteractiveHover)};\n }\n\n &:not(:disabled):hover ${ChevronContainer},\n &${isFocusedVisible}${isNotDisabled} ${ChevronContainer} {\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', Color.BorderIconPrimary)};\n }\n`;\n\nconst CollapseTitle = styled(HStack)`\n width: 100%;\n min-width: 0;\n`;\n\nconst TitleWrapper = styled.span`\n display: flex;\n align-items: center;\n min-width: 0;\n`;\n\nconst Panel = styled(DisclosurePanel)`\n height: var(--disclosure-panel-height);\n overflow: clip;\n transition: height ${TransitionDuration.Fast} ${TransitionEasing.Move};\n\n /* No height motion: on expand the panel opens at once; on collapse it waits for the content's fade\n to finish, then closes. React Aria hides the panel when this delayed transition ends. */\n @media (prefers-reduced-motion: reduce) {\n transition: height 0s linear ${ReducedMotionFade.duration};\n\n ${ItemContainer}[data-expanded] > & {\n transition: none;\n }\n }\n`;\n\nconst TitleHeading = styled(Heading)`\n margin: 0;\n width: 100%;\n min-width: 0;\n font: inherit;\n font-size: inherit;\n line-height: inherit;\n font-weight: inherit;\n letter-spacing: inherit;\n`;\n\nconst PanelContent = styled.div`\n padding: ${Spacing[3]} ${Spacing[4]};\n\n @media (prefers-reduced-motion: reduce) {\n opacity: 0;\n transition: opacity ${ReducedMotionFade.duration} ${ReducedMotionFade.easing};\n\n ${ItemContainer}[data-expanded] > ${Panel} > & {\n opacity: 1;\n animation: ${fadeIn} ${ReducedMotionFade.duration} ${ReducedMotionFade.easing};\n }\n }\n`;\n\nconst TitleText = styled.span`\n min-width: 0;\n flex: 1;\n`;\n\nexport type AccordionItemComponentProps = {\n title: string;\n children: ReactNode;\n defaultExpanded?: boolean;\n disabled?: boolean;\n showDivider?: boolean;\n size: AccordionSize;\n titleTypography: AccordionTitleTypography;\n usesTitleTypographyOverride: boolean;\n titleHeadingAs: AccordionTitleHeadingAs;\n};\n\nconst renderTitleLabel = (\n title: string,\n titleTypography: AccordionTitleTypography,\n disabled: boolean,\n) => {\n const content = <TruncatedText>{title}</TruncatedText>;\n const textColor = disabled ? 'disabled' : 'primary';\n\n if (titleTypography.variant === 'heading') {\n return (\n <TitleText>\n <TitleWrapper>\n <Heading as='span' color={textColor} size={titleTypography.size}>\n {content}\n </Heading>\n </TitleWrapper>\n </TitleText>\n );\n }\n\n return (\n <TitleText>\n <TitleWrapper>\n <Paragraph\n as='span'\n color={textColor}\n size={titleTypography.size}\n weight={titleTypography.weight ?? 'normal'}\n >\n {content}\n </Paragraph>\n </TitleWrapper>\n </TitleText>\n );\n};\n\nconst renderChevron = (isExpanded: boolean) =>\n isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />;\n\nconst ExpandScrollSync = ({\n disabled,\n isExpanded,\n itemRef,\n}: {\n disabled: boolean;\n isExpanded: boolean;\n itemRef: RefObject<HTMLElement | null>;\n}) => {\n const wasExpandedRef = useRef(isExpanded);\n\n useLayoutEffect(() => {\n if (disabled) {\n wasExpandedRef.current = isExpanded;\n return undefined;\n }\n\n const didExpand = isExpanded && !wasExpandedRef.current;\n wasExpandedRef.current = isExpanded;\n\n const itemElement = itemRef.current;\n const triggerElement = resolveAccordionTriggerElement(itemElement);\n\n if (!didExpand || !itemElement || !triggerElement) {\n return undefined;\n }\n\n return scrollExpandedItemIntoViewAfterExpand({\n itemElement,\n triggerElement,\n });\n }, [disabled, isExpanded, itemRef]);\n\n return null;\n};\n\nconst AccordionItem = ({\n title,\n children,\n defaultExpanded = false,\n disabled = false,\n showDivider = false,\n size,\n titleTypography,\n usesTitleTypographyOverride,\n titleHeadingAs,\n}: AccordionItemComponentProps) => {\n const itemRef = useRef<HTMLDivElement>(null);\n\n return (\n <ItemContainer\n ref={itemRef}\n defaultExpanded={disabled ? false : defaultExpanded}\n isDisabled={disabled}\n $showDivider={showDivider}\n >\n {({ isExpanded }) => (\n <>\n <ExpandScrollSync disabled={disabled} isExpanded={isExpanded} itemRef={itemRef} />\n <TitleHeading forwardedAs={titleHeadingAs} size='xsm'>\n <TriggerButton\n slot='trigger'\n $size={size}\n $usesTitleTypographyOverride={usesTitleTypographyOverride}\n isDisabled={disabled}\n >\n <CollapseTitle align='center' spacing={Spacing[1]}>\n <ChevronContainer aria-hidden='true'>{renderChevron(isExpanded)}</ChevronContainer>\n {renderTitleLabel(title, titleTypography, disabled)}\n </CollapseTitle>\n </TriggerButton>\n </TitleHeading>\n <Panel data-accordion-panel>\n <PanelContent>{children}</PanelContent>\n </Panel>\n </>\n )}\n </ItemContainer>\n );\n};\n\nexport default AccordionItem;\n","import type { HeadingSize, ParagraphSize } from '#src/mixins/text';\n\nexport type AccordionSize = 'sm' | 'md' | 'lg';\n\nexport type AccordionTitleTypography =\n | { variant: 'heading'; size: HeadingSize }\n | {\n variant: 'paragraph';\n size: Extract<ParagraphSize, 'sm' | 'md' | 'lg'>;\n weight?: 'normal' | 'bold';\n };\n\nexport const getDefaultTitleTypography = (size: AccordionSize): AccordionTitleTypography => {\n if (size === 'lg') {\n return { variant: 'heading', size: 'xsm' };\n }\n\n if (size === 'sm') {\n return { variant: 'paragraph', size: 'sm', weight: 'normal' };\n }\n\n return { variant: 'paragraph', size: 'md', weight: 'bold' };\n};\n\nexport const resolveTitleTypography = (\n size: AccordionSize,\n titleTypography?: AccordionTitleTypography,\n): AccordionTitleTypography => titleTypography ?? getDefaultTitleTypography(size);\n","import type { ReactNode } from 'react';\n\nimport { Spacing } from '@persona/design-tokens';\n\nimport { Stack } from '#src/components/Stack';\n\nimport AccordionItem, {\n type AccordionSize,\n type AccordionTitleHeadingAs,\n type AccordionTitleTypography,\n} from './AccordionItem';\nimport { resolveTitleTypography } from './accordionTitleTypography';\n\nexport type AccordionItemProps = {\n id?: string;\n title: string;\n children: ReactNode;\n defaultExpanded?: boolean;\n disabled?: boolean;\n};\n\nexport type AccordionProps = {\n items: AccordionItemProps[];\n size?: AccordionSize;\n dividers?: boolean;\n titleTypography?: AccordionTitleTypography;\n /**\n * Heading element for each item title (inside the trigger), matching Card section headings.\n * Defaults to `h3`; use a lower level when the page already uses higher headings.\n */\n titleHeadingAs?: AccordionTitleHeadingAs;\n 'aria-label'?: string;\n className?: string;\n};\n\nexport const Accordion = ({\n items,\n size = 'md',\n dividers = false,\n titleTypography,\n titleHeadingAs = 'h3',\n 'aria-label': ariaLabel = 'Accordion',\n className,\n}: AccordionProps) => {\n if (items.length === 0) {\n return null;\n }\n\n const resolvedTitleTypography = resolveTitleTypography(size, titleTypography);\n const usesTitleTypographyOverride = titleTypography != null;\n\n return (\n <Stack aria-label={ariaLabel} className={className} fullWidth role='group' spacing={Spacing[0]}>\n {items.map((item, index) => (\n <AccordionItem\n key={item.id ?? `${item.title}-${index}`}\n defaultExpanded={item.defaultExpanded}\n disabled={item.disabled}\n showDivider={dividers}\n size={size}\n title={item.title}\n titleHeadingAs={titleHeadingAs}\n titleTypography={resolvedTitleTypography}\n usesTitleTypographyOverride={usesTitleTypographyOverride}\n >\n {item.children}\n </AccordionItem>\n ))}\n </Stack>\n );\n};\n\nexport default Accordion;\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { a as styled, r as css } from "../../styledComponentsInterop-Cs5CCPRy.mjs";
2
+ import { isHovered, isNotDisabled } from "../../lib/pseudoClass.mjs";
2
3
  import { semanticColor, semanticOnly } from "../../lib/semanticColor.mjs";
4
+ import "../../variables/transitions.mjs";
3
5
  import { i as Paragraph } from "../../Text-D0vEReED.mjs";
4
- import { r as HelperTooltip } from "../../Tooltip-YViXzMdm.mjs";
5
- import { isHovered, isNotDisabled } from "../../lib/pseudoClass.mjs";
6
- import { t as IconButton } from "../../IconButton-DxHB2g80.mjs";
7
- import { n as Sticker } from "../../Sticker-C1_6I08u.mjs";
8
- import { createContext, useContext, useEffect, useMemo, useRef } from "react";
6
+ import { r as HelperTooltip } from "../../Tooltip-C2VB8I6y.mjs";
7
+ import { t as IconButton } from "../../IconButton-kSjnfhWt.mjs";
8
+ import { n as Sticker } from "../../Sticker-jfOM4Yi6.mjs";
9
9
  import { Color, Spacing, Typography } from "@persona/design-tokens";
10
+ import { createContext, useContext, useEffect, useMemo, useRef } from "react";
10
11
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
12
  import { EyeIcon, EyeOffIcon } from "@persona/icons";
12
13
  import { repeat, uniqueId } from "lodash-es";
@@ -20,7 +21,8 @@ const IconButtonContainer = styled(IconButton)`
20
21
  justify-content: center;
21
22
 
22
23
  svg {
23
- transition-duration: 150ms;
24
+ transition-duration: ${"100ms"};
25
+ transition-timing-function: ${"cubic-bezier(0.4, 0, 0.2, 1)"};
24
26
  }
25
27
 
26
28
  :hover {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/components/Attribute/Attribute.tsx","../../../src/components/Attribute/AttributeGrid.tsx"],"sourcesContent":["import { repeat, uniqueId } from 'lodash-es';\nimport {\n type ComponentPropsWithoutRef,\n type ComponentType,\n createContext,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { useToggleButton } from 'react-aria';\nimport { useToggleState } from 'react-stately';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing, Typography } from '@persona/design-tokens';\nimport { EyeIcon, EyeOffIcon } from '@persona/icons';\n\nimport IconButton from '#src/components/Button/IconButton';\nimport Sticker from '#src/components/Sticker';\nimport { Paragraph } from '#src/components/Text';\nimport { HelperTooltip } from '#src/components/Tooltip';\nimport { isHovered, isNotDisabled } from '#src/lib/pseudoClass';\nimport { semanticColor, semanticOnly } from '#src/lib/semanticColor';\nimport type { ParagraphSize } from '#src/mixins/text';\n\nexport type WordBreak = 'break-all' | 'break-word' | 'normal';\nexport type TextTransform = 'capitalize' | 'sentence';\nexport type TableLayoutValue = boolean | 'full-width';\n\nexport type AttributeSize = 'sm' | 'md';\n\nexport const AttributeContext = createContext<{\n table?: TableLayoutValue;\n horizontal?: boolean;\n size?: AttributeSize;\n}>({});\n\n// TODO: Create Toggle Button component\nexport const IconButtonContainer = styled(IconButton)`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n svg {\n transition-duration: 150ms;\n }\n\n :hover {\n svg {\n color: ${({ theme }) => semanticColor(theme, 'FgAccent', Color.CorePurple800)};\n }\n }\n\n ${semanticOnly(\n (tokens) => css`\n background-color: ${tokens.ActionNeutral};\n color: ${tokens.FgPrimary};\n\n svg {\n color: ${tokens.FgPrimary};\n }\n\n svg.pds-icon path[stroke] {\n stroke: currentColor;\n }\n\n &${isHovered}${isNotDisabled} {\n background-color: ${tokens.ActionNeutralHover};\n color: ${tokens.FgAccent};\n\n svg path {\n stroke: currentColor;\n }\n }\n `,\n )}\n`;\n\ninterface AttributeValueProps {\n placeholder: ReactNode;\n show?: boolean;\n redacted?: boolean;\n value?: ReactNode;\n textTransform?: TextTransform;\n wordBreak?: WordBreak;\n size?: AttributeSize;\n 'aria-labelledby': string;\n id: string;\n}\n\ninterface ValueFormatterProps {\n isPlaceholder?: boolean;\n wordBreak?: WordBreak;\n size?: AttributeSize;\n}\n\nconst Value = styled.dd<ValueFormatterProps>`\n ${({ size }) => (size === 'sm' ? Typography.TextSmall : Typography.TextMedium)};\n color: ${({ isPlaceholder, theme }) =>\n isPlaceholder\n ? semanticColor(theme, 'FgSecondary', Color.TextSecondary)\n : semanticColor(theme, 'FgPrimary', Color.CoreSlate1000)};\n margin: 0;\n text-overflow: ellipsis;\n overflow-x: hidden;\n word-break: ${({ wordBreak }) => (wordBreak ? wordBreak : 'normal')};\n\n ul,\n ol {\n list-style-position: inside;\n }\n\n a {\n color: ${({ theme }) => semanticColor(theme, 'FgAccent', theme.color.text.brand)};\n text-decoration: none;\n\n &:visited {\n color: ${({ theme }) => semanticColor(theme, 'FgAccent', theme.color.text.brand)};\n }\n }\n`;\n\nexport const AttributeValue = ({\n placeholder,\n show,\n redacted,\n value,\n wordBreak,\n size,\n id,\n 'aria-labelledby': ariaLabelledBy,\n}: AttributeValueProps) => {\n const isEmpty = value == null || value === '';\n\n const renderedVal = isEmpty ? (\n placeholder\n ) : (\n <>{!show ? repeat('•', typeof value === 'string' ? value.length : 8) : value}</>\n );\n\n return (\n <Value\n isPlaceholder={isEmpty}\n wordBreak={wordBreak}\n size={size}\n title={typeof value === 'string' ? value : undefined}\n aria-labelledby={ariaLabelledBy}\n id={id}\n >\n {redacted ? <Sticker id={id}>Redacted</Sticker> : renderedVal}\n </Value>\n );\n};\n\nexport interface AttributeProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Title of the attribute. Rendered as a <dt>.\n */\n label: ReactNode;\n\n /**\n * Value to display. Rendered as a <dd>.\n */\n value?: ReactNode;\n\n /**\n * Will display a \"Redacted\" sticker if there is a value.\n */\n redacted?: boolean;\n\n /**\n * Renders toggleable eye button to the right of the label\n */\n toggleable?: boolean;\n\n /**\n * Text to display in presence of null value.\n */\n placeholder?: string;\n\n /**\n * Word break styling for value.\n */\n wordBreak?: WordBreak;\n\n /**\n * Render a custom label component\n */\n labelComponent?: FC<PropsWithChildren<{ id: string; size?: ParagraphSize }>>;\n\n /**\n * Render a custom value component\n */\n valueComponent?: ComponentType<AttributeValueProps>;\n\n /**\n * Renders a HelperTooltip to display help text to the right of the label.\n */\n helpText?: ReactNode;\n\n /**\n * Custom adornments to display to the right of the label.\n */\n right?: ReactNode;\n\n /**\n * Renders attributes in a tabular layout.\n */\n table?: TableLayoutValue;\n}\n\ntype AttributeContainerProps = {\n horizontal?: boolean;\n table?: TableLayoutValue;\n size?: AttributeSize;\n};\nconst AttributeContainer = styled('div')<AttributeContainerProps>`\n ${({ table, size }) =>\n table &&\n css`\n display: table-row;\n\n > * {\n display: table-cell;\n }\n\n & > ${AttributeLabel} {\n padding: ${Spacing[1]} 0;\n padding-right: ${size === 'sm' ? Spacing[2] : Spacing[3]};\n }\n & > ${Value} {\n padding: ${size === 'sm' ? Spacing[1] : Spacing[2]} 0;\n }\n `}\n\n ${({ horizontal }) =>\n horizontal &&\n css`\n display: grid;\n gap: ${Spacing[4]};\n grid-template-columns: subgrid;\n grid-column: span 2;\n `}\n`;\n\nexport const AttributeLabel = styled(Paragraph).attrs<{ size?: ParagraphSize }>((props) => ({\n size: props.size ?? 'md',\n color: 'tertiary',\n as: 'dt',\n}))`\n margin: 0;\n overflow-wrap: break-word;\n ${semanticOnly((tokens) => `color: ${tokens.FgSecondary};`)}\n`;\n\nconst RightContainer = styled.span`\n display: inline-block;\n vertical-align: middle;\n margin-left: ${Spacing[2]};\n`;\n\nexport const Attribute = ({\n label,\n value,\n redacted,\n placeholder = '-',\n wordBreak,\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n labelComponent: LabelComponent = AttributeLabel,\n valueComponent: ValueComponent = AttributeValue,\n right,\n helpText,\n toggleable,\n table,\n ...elemProps\n}: AttributeProps) => {\n const attrCtx = useContext(AttributeContext);\n const size = attrCtx?.size ?? 'md';\n const toggleRef = useRef();\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n const valueAsArray = [].concat(value).filter(Boolean);\n const showToggleButton = toggleable && !redacted && valueAsArray.length > 0;\n const state = useToggleState({ defaultSelected: !toggleable });\n const { buttonProps } = useToggleButton(\n {\n 'aria-label': state.isSelected ? `Hide ${label} value` : `Show ${label} value`,\n elementType: 'button',\n },\n state,\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n toggleRef,\n );\n const labelId = useMemo(() => uniqueId('pds_attribute_label__'), []);\n const valueId = useMemo(() => uniqueId('pds_attribute_value__'), []);\n const show = state.isSelected;\n\n useEffect(() => {\n state.setSelected(!toggleable);\n }, [toggleable]);\n\n return (\n <AttributeContainer\n table={table || attrCtx?.table}\n horizontal={attrCtx?.horizontal}\n size={size}\n {...elemProps}\n >\n <LabelComponent id={labelId} aria-details={valueId} size={size}>\n {label}\n {helpText && (\n <RightContainer>\n <HelperTooltip size='sm'>{helpText}</HelperTooltip>\n </RightContainer>\n )}\n {showToggleButton && (\n <RightContainer>\n {/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */}\n <IconButtonContainer {...buttonProps} ref={toggleRef}>\n {show ? <EyeIcon /> : <EyeOffIcon />}\n </IconButtonContainer>\n </RightContainer>\n )}\n {right && <RightContainer>{right}</RightContainer>}\n </LabelComponent>\n <ValueComponent\n id={valueId}\n value={value}\n placeholder={placeholder}\n wordBreak={wordBreak}\n redacted={redacted}\n show={show}\n size={size}\n aria-labelledby={labelId}\n />\n </AttributeContainer>\n );\n};\n\nexport default Attribute;\n","import type { ReactNode } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\n\nimport { AttributeContext, type AttributeSize, type TableLayoutValue } from './Attribute';\n\ntype AttributeGridProps = {\n children?: ReactNode;\n /**\n * Sets the font size and spacing density for all child Attributes.\n * Defaults to `'md'`.\n */\n size?: AttributeSize;\n} & (\n | {\n /**\n * Set a fixed number of columns for the grid.\n */\n colCount?: number;\n /**\n * Display attributes in a stacked list with label first then value.\n */\n horizontal?: boolean;\n\n table?: never;\n }\n | {\n /**\n * Display attributes in a fixed tabular layout.\n * Set to `full-width` to expand to full width of container.\n */\n table?: TableLayoutValue;\n\n colCount?: never;\n horizontal?: never;\n }\n);\n\ntype AttributeGridComponentProps = {\n colCount?: number;\n horizontal?: boolean;\n table?: TableLayoutValue;\n size?: AttributeSize;\n};\nconst AttributeGridComponent = styled.dl<AttributeGridComponentProps>`\n ${({ colCount, table, horizontal, size }) =>\n table\n ? css`\n display: table;\n ${\n table === 'full-width' &&\n css`\n width: 100%;\n table-layout: fixed;\n border-spacing: 0 ${size === 'sm' ? Spacing[1] : Spacing[2]};\n `\n };\n `\n : css`\n display: grid;\n gap: ${size === 'sm' ? Spacing[2] : Spacing[4]};\n /* If the layout is horizontal we guarentee an even number of columns */\n grid-template-columns: ${\n colCount\n ? `repeat(${colCount}, ${horizontal ? '1fr 2fr' : '1fr'})`\n : `repeat(auto-fit, ${horizontal ? 'minmax(120px, 1fr) minmax(225px, 2fr)' : 'minmax(225px, 1fr)'})`\n };\n `}\n margin: 0;\n\n & + & {\n padding-bottom: ${Spacing[5]};\n }\n`;\n\nconst AttributeGrid = ({ children, horizontal, table, size, ...props }: AttributeGridProps) => {\n return (\n <AttributeGridComponent table={table} horizontal={horizontal} size={size} {...props}>\n <AttributeContext.Provider value={{ horizontal, table, size }}>\n {children}\n </AttributeContext.Provider>\n </AttributeGridComponent>\n );\n};\n\nexport default AttributeGrid;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/components/Attribute/Attribute.tsx","../../../src/components/Attribute/AttributeGrid.tsx"],"sourcesContent":["import { repeat, uniqueId } from 'lodash-es';\nimport {\n type ComponentPropsWithoutRef,\n type ComponentType,\n createContext,\n type FC,\n type PropsWithChildren,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { useToggleButton } from 'react-aria';\nimport { useToggleState } from 'react-stately';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing, Typography } from '@persona/design-tokens';\nimport { EyeIcon, EyeOffIcon } from '@persona/icons';\n\nimport IconButton from '#src/components/Button/IconButton';\nimport Sticker from '#src/components/Sticker';\nimport { Paragraph } from '#src/components/Text';\nimport { HelperTooltip } from '#src/components/Tooltip';\nimport { isHovered, isNotDisabled } from '#src/lib/pseudoClass';\nimport { semanticColor, semanticOnly } from '#src/lib/semanticColor';\nimport type { ParagraphSize } from '#src/mixins/text';\nimport { TransitionDuration, TransitionEasing } from '#src/variables/transitions';\n\nexport type WordBreak = 'break-all' | 'break-word' | 'normal';\nexport type TextTransform = 'capitalize' | 'sentence';\nexport type TableLayoutValue = boolean | 'full-width';\n\nexport type AttributeSize = 'sm' | 'md';\n\nexport const AttributeContext = createContext<{\n table?: TableLayoutValue;\n horizontal?: boolean;\n size?: AttributeSize;\n}>({});\n\n// TODO: Create Toggle Button component\nexport const IconButtonContainer = styled(IconButton)`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n svg {\n transition-duration: ${TransitionDuration.ExtraFast};\n transition-timing-function: ${TransitionEasing.Move};\n }\n\n :hover {\n svg {\n color: ${({ theme }) => semanticColor(theme, 'FgAccent', Color.CorePurple800)};\n }\n }\n\n ${semanticOnly(\n (tokens) => css`\n background-color: ${tokens.ActionNeutral};\n color: ${tokens.FgPrimary};\n\n svg {\n color: ${tokens.FgPrimary};\n }\n\n svg.pds-icon path[stroke] {\n stroke: currentColor;\n }\n\n &${isHovered}${isNotDisabled} {\n background-color: ${tokens.ActionNeutralHover};\n color: ${tokens.FgAccent};\n\n svg path {\n stroke: currentColor;\n }\n }\n `,\n )}\n`;\n\ninterface AttributeValueProps {\n placeholder: ReactNode;\n show?: boolean;\n redacted?: boolean;\n value?: ReactNode;\n textTransform?: TextTransform;\n wordBreak?: WordBreak;\n size?: AttributeSize;\n 'aria-labelledby': string;\n id: string;\n}\n\ninterface ValueFormatterProps {\n isPlaceholder?: boolean;\n wordBreak?: WordBreak;\n size?: AttributeSize;\n}\n\nconst Value = styled.dd<ValueFormatterProps>`\n ${({ size }) => (size === 'sm' ? Typography.TextSmall : Typography.TextMedium)};\n color: ${({ isPlaceholder, theme }) =>\n isPlaceholder\n ? semanticColor(theme, 'FgSecondary', Color.TextSecondary)\n : semanticColor(theme, 'FgPrimary', Color.CoreSlate1000)};\n margin: 0;\n text-overflow: ellipsis;\n overflow-x: hidden;\n word-break: ${({ wordBreak }) => (wordBreak ? wordBreak : 'normal')};\n\n ul,\n ol {\n list-style-position: inside;\n }\n\n a {\n color: ${({ theme }) => semanticColor(theme, 'FgAccent', theme.color.text.brand)};\n text-decoration: none;\n\n &:visited {\n color: ${({ theme }) => semanticColor(theme, 'FgAccent', theme.color.text.brand)};\n }\n }\n`;\n\nexport const AttributeValue = ({\n placeholder,\n show,\n redacted,\n value,\n wordBreak,\n size,\n id,\n 'aria-labelledby': ariaLabelledBy,\n}: AttributeValueProps) => {\n const isEmpty = value == null || value === '';\n\n const renderedVal = isEmpty ? (\n placeholder\n ) : (\n <>{!show ? repeat('•', typeof value === 'string' ? value.length : 8) : value}</>\n );\n\n return (\n <Value\n isPlaceholder={isEmpty}\n wordBreak={wordBreak}\n size={size}\n title={typeof value === 'string' ? value : undefined}\n aria-labelledby={ariaLabelledBy}\n id={id}\n >\n {redacted ? <Sticker id={id}>Redacted</Sticker> : renderedVal}\n </Value>\n );\n};\n\nexport interface AttributeProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Title of the attribute. Rendered as a <dt>.\n */\n label: ReactNode;\n\n /**\n * Value to display. Rendered as a <dd>.\n */\n value?: ReactNode;\n\n /**\n * Will display a \"Redacted\" sticker if there is a value.\n */\n redacted?: boolean;\n\n /**\n * Renders toggleable eye button to the right of the label\n */\n toggleable?: boolean;\n\n /**\n * Text to display in presence of null value.\n */\n placeholder?: string;\n\n /**\n * Word break styling for value.\n */\n wordBreak?: WordBreak;\n\n /**\n * Render a custom label component\n */\n labelComponent?: FC<PropsWithChildren<{ id: string; size?: ParagraphSize }>>;\n\n /**\n * Render a custom value component\n */\n valueComponent?: ComponentType<AttributeValueProps>;\n\n /**\n * Renders a HelperTooltip to display help text to the right of the label.\n */\n helpText?: ReactNode;\n\n /**\n * Custom adornments to display to the right of the label.\n */\n right?: ReactNode;\n\n /**\n * Renders attributes in a tabular layout.\n */\n table?: TableLayoutValue;\n}\n\ntype AttributeContainerProps = {\n horizontal?: boolean;\n table?: TableLayoutValue;\n size?: AttributeSize;\n};\nconst AttributeContainer = styled('div')<AttributeContainerProps>`\n ${({ table, size }) =>\n table &&\n css`\n display: table-row;\n\n > * {\n display: table-cell;\n }\n\n & > ${AttributeLabel} {\n padding: ${Spacing[1]} 0;\n padding-right: ${size === 'sm' ? Spacing[2] : Spacing[3]};\n }\n & > ${Value} {\n padding: ${size === 'sm' ? Spacing[1] : Spacing[2]} 0;\n }\n `}\n\n ${({ horizontal }) =>\n horizontal &&\n css`\n display: grid;\n gap: ${Spacing[4]};\n grid-template-columns: subgrid;\n grid-column: span 2;\n `}\n`;\n\nexport const AttributeLabel = styled(Paragraph).attrs<{ size?: ParagraphSize }>((props) => ({\n size: props.size ?? 'md',\n color: 'tertiary',\n as: 'dt',\n}))`\n margin: 0;\n overflow-wrap: break-word;\n ${semanticOnly((tokens) => `color: ${tokens.FgSecondary};`)}\n`;\n\nconst RightContainer = styled.span`\n display: inline-block;\n vertical-align: middle;\n margin-left: ${Spacing[2]};\n`;\n\nexport const Attribute = ({\n label,\n value,\n redacted,\n placeholder = '-',\n wordBreak,\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n labelComponent: LabelComponent = AttributeLabel,\n valueComponent: ValueComponent = AttributeValue,\n right,\n helpText,\n toggleable,\n table,\n ...elemProps\n}: AttributeProps) => {\n const attrCtx = useContext(AttributeContext);\n const size = attrCtx?.size ?? 'md';\n const toggleRef = useRef();\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n const valueAsArray = [].concat(value).filter(Boolean);\n const showToggleButton = toggleable && !redacted && valueAsArray.length > 0;\n const state = useToggleState({ defaultSelected: !toggleable });\n const { buttonProps } = useToggleButton(\n {\n 'aria-label': state.isSelected ? `Hide ${label} value` : `Show ${label} value`,\n elementType: 'button',\n },\n state,\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n toggleRef,\n );\n const labelId = useMemo(() => uniqueId('pds_attribute_label__'), []);\n const valueId = useMemo(() => uniqueId('pds_attribute_value__'), []);\n const show = state.isSelected;\n\n useEffect(() => {\n state.setSelected(!toggleable);\n }, [toggleable]);\n\n return (\n <AttributeContainer\n table={table || attrCtx?.table}\n horizontal={attrCtx?.horizontal}\n size={size}\n {...elemProps}\n >\n <LabelComponent id={labelId} aria-details={valueId} size={size}>\n {label}\n {helpText && (\n <RightContainer>\n <HelperTooltip size='sm'>{helpText}</HelperTooltip>\n </RightContainer>\n )}\n {showToggleButton && (\n <RightContainer>\n {/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */}\n <IconButtonContainer {...buttonProps} ref={toggleRef}>\n {show ? <EyeIcon /> : <EyeOffIcon />}\n </IconButtonContainer>\n </RightContainer>\n )}\n {right && <RightContainer>{right}</RightContainer>}\n </LabelComponent>\n <ValueComponent\n id={valueId}\n value={value}\n placeholder={placeholder}\n wordBreak={wordBreak}\n redacted={redacted}\n show={show}\n size={size}\n aria-labelledby={labelId}\n />\n </AttributeContainer>\n );\n};\n\nexport default Attribute;\n","import type { ReactNode } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\n\nimport { AttributeContext, type AttributeSize, type TableLayoutValue } from './Attribute';\n\ntype AttributeGridProps = {\n children?: ReactNode;\n /**\n * Sets the font size and spacing density for all child Attributes.\n * Defaults to `'md'`.\n */\n size?: AttributeSize;\n} & (\n | {\n /**\n * Set a fixed number of columns for the grid.\n */\n colCount?: number;\n /**\n * Display attributes in a stacked list with label first then value.\n */\n horizontal?: boolean;\n\n table?: never;\n }\n | {\n /**\n * Display attributes in a fixed tabular layout.\n * Set to `full-width` to expand to full width of container.\n */\n table?: TableLayoutValue;\n\n colCount?: never;\n horizontal?: never;\n }\n);\n\ntype AttributeGridComponentProps = {\n colCount?: number;\n horizontal?: boolean;\n table?: TableLayoutValue;\n size?: AttributeSize;\n};\nconst AttributeGridComponent = styled.dl<AttributeGridComponentProps>`\n ${({ colCount, table, horizontal, size }) =>\n table\n ? css`\n display: table;\n ${\n table === 'full-width' &&\n css`\n width: 100%;\n table-layout: fixed;\n border-spacing: 0 ${size === 'sm' ? Spacing[1] : Spacing[2]};\n `\n };\n `\n : css`\n display: grid;\n gap: ${size === 'sm' ? Spacing[2] : Spacing[4]};\n /* If the layout is horizontal we guarentee an even number of columns */\n grid-template-columns: ${\n colCount\n ? `repeat(${colCount}, ${horizontal ? '1fr 2fr' : '1fr'})`\n : `repeat(auto-fit, ${horizontal ? 'minmax(120px, 1fr) minmax(225px, 2fr)' : 'minmax(225px, 1fr)'})`\n };\n `}\n margin: 0;\n\n & + & {\n padding-bottom: ${Spacing[5]};\n }\n`;\n\nconst AttributeGrid = ({ children, horizontal, table, size, ...props }: AttributeGridProps) => {\n return (\n <AttributeGridComponent table={table} horizontal={horizontal} size={size} {...props}>\n <AttributeContext.Provider value={{ horizontal, table, size }}>\n {children}\n </AttributeContext.Provider>\n </AttributeGridComponent>\n );\n};\n\nexport default AttributeGrid;\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { t as Badge } from "../../Badge-BCdsVKuj.mjs";
1
+ import { t as Badge } from "../../Badge-DZq6ByIU.mjs";
2
2
  export { Badge, Badge as default };
@@ -1,9 +1,9 @@
1
1
  import { a as styled, r as css } from "../../styledComponentsInterop-Cs5CCPRy.mjs";
2
+ import { isActive, isFocused, isHovered, isNotDisabled } from "../../lib/pseudoClass.mjs";
2
3
  import { semanticOnly, semanticTokens } from "../../lib/semanticColor.mjs";
3
- import { paragraphMixins } from "../../mixins/text.mjs";
4
4
  import { withAlpha } from "../../lib/color.mjs";
5
- import { isActive, isFocused, isHovered, isNotDisabled } from "../../lib/pseudoClass.mjs";
6
- import { n as Button } from "../../IconButton-DxHB2g80.mjs";
5
+ import { paragraphMixins } from "../../mixins/text.mjs";
6
+ import { n as Button } from "../../IconButton-kSjnfhWt.mjs";
7
7
  import { Color, Spacing } from "@persona/design-tokens";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { XIcon } from "@persona/icons";
@@ -1,17 +1,18 @@
1
1
  import { a as styled, o as useTheme, r as css } from "../../styledComponentsInterop-Cs5CCPRy.mjs";
2
2
  import { semanticColor } from "../../lib/semanticColor.mjs";
3
+ import { focusOutline } from "../../mixins/focus.mjs";
4
+ import "../../variables/transitions.mjs";
5
+ import { semanticScrollbar } from "../../mixins/scrollbar.mjs";
3
6
  import { l as usePDSStrings } from "../../i18n-DaOKaFc2.mjs";
4
7
  import { i as Paragraph } from "../../Text-D0vEReED.mjs";
5
8
  import { useResizablePanel } from "../../lib/useResizablePanel.mjs";
6
9
  import { Z_INDICES } from "../../lib/zindex.mjs";
7
- import { focusOutline } from "../../mixins/focus.mjs";
8
- import { semanticScrollbar } from "../../mixins/scrollbar.mjs";
9
10
  import { n as Stack, t as HStack } from "../../Stack-Bzom2BTR.mjs";
10
- import { t as IconButton } from "../../IconButton-DxHB2g80.mjs";
11
- import { t as Badge } from "../../Badge-BCdsVKuj.mjs";
12
- import { i as TabBar, r as Tab } from "../../TabBar-BCFO38E0.mjs";
13
- import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
11
+ import { t as IconButton } from "../../IconButton-kSjnfhWt.mjs";
12
+ import { t as Badge } from "../../Badge-DZq6ByIU.mjs";
13
+ import { i as TabBar, r as Tab } from "../../TabBar-DwHgbIQ6.mjs";
14
14
  import { BorderRadius, Color, Spacing } from "@persona/design-tokens";
15
+ import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react";
15
16
  import { jsx, jsxs } from "react/jsx-runtime";
16
17
  import { ArrowCollapseIcon, ArrowExpandIcon, CircleXInverseIcon, XIcon } from "@persona/icons";
17
18
  import { useId } from "react-aria";
@@ -35,12 +36,13 @@ const ResizeHandleContainer = styled.div`
35
36
  right: 0;
36
37
  height: 2px;
37
38
  background-color: transparent;
38
- transition: background-color 0.15s ease-in;
39
- transition-delay: 0.025s;
39
+ transition: background-color ${"200ms"} ${"cubic-bezier(0.4, 0, 0.2, 1)"};
40
40
  }
41
41
 
42
42
  &:hover::after,
43
43
  &.${DRAGGING_CLASSNAME}::after {
44
+ /* Filters out a pointer passing over the handle; the hover-out has no delay. */
45
+ transition-delay: 25ms;
44
46
  background-color: ${({ theme }) => theme.color.border.active};
45
47
  }
46
48
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/components/BottomPanel/ResizeHandle.tsx","../../../src/components/BottomPanel/ResizableVerticalPanel.tsx","../../../src/components/BottomPanel/BottomPanel.tsx"],"sourcesContent":["import { type FC, type RefObject, useEffect, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { Z_INDICES } from '@persona/design-system/lib/zindex';\nimport { Spacing } from '@persona/design-tokens';\n\nconst DRAGGING_CLASSNAME = 'dragging';\n\ninterface ResizeHandleProps {\n ariaLabel: string;\n /** Fires on double-click or Enter/Space so the host can toggle/reset the size. */\n onDoubleClick?: () => void;\n /** Called on each pointer move with the new top edge position (clientY) in px. */\n onMoveTo: (position: number) => void;\n /** Called once when the drag ends (pointerup, cancel, or lost capture). */\n onRelease?: () => void;\n /** The panel being resized; its edge seeds the grab offset so the handle doesn't jump. */\n panelRef: RefObject<HTMLDivElement>;\n}\n\n// The visible line is 2px tall on the panel's top border; the hitbox is Spacing[2] tall and\n// straddles that border so it is easy to grab without covering the header row's controls.\nconst ResizeHandleContainer = styled.div`\n cursor: row-resize;\n position: absolute;\n height: ${Spacing[2]};\n top: -${Spacing[1]};\n left: 0;\n right: 0;\n z-index: ${Z_INDICES.dropdown};\n touch-action: none;\n\n &::after {\n content: '';\n position: absolute;\n top: ${Spacing[1]};\n left: 0;\n right: 0;\n height: 2px;\n background-color: transparent;\n transition: background-color 0.15s ease-in;\n transition-delay: 0.025s;\n }\n\n &:hover::after,\n &.${DRAGGING_CLASSNAME}::after {\n background-color: ${({ theme }) => theme.color.border.active};\n }\n`;\n\n/** Vertical resize handle pinned to the top edge of a bottom-anchored panel. */\nexport const ResizeHandle: FC<ResizeHandleProps> = ({\n ariaLabel,\n onDoubleClick,\n onMoveTo,\n onRelease,\n panelRef,\n}) => {\n const resizeHandleRef = useRef<HTMLDivElement>(null);\n const panelOffsetRef = useRef(0);\n const activePointerIdRef = useRef<number | null>(null);\n const documentListenersRef = useRef<{\n handleEnd: (event: PointerEvent) => void;\n handleMove: (event: PointerEvent) => void;\n } | null>(null);\n // Document listeners are registered once per drag; reading the callbacks through\n // refs keeps them on the latest props without re-registering mid-drag.\n const onMoveToRef = useRef(onMoveTo);\n const onReleaseRef = useRef(onRelease);\n onMoveToRef.current = onMoveTo;\n onReleaseRef.current = onRelease;\n\n const removeDocumentListeners = () => {\n const listeners = documentListenersRef.current;\n if (!listeners) {\n return;\n }\n\n document.removeEventListener('pointermove', listeners.handleMove);\n document.removeEventListener('pointerup', listeners.handleEnd);\n document.removeEventListener('pointercancel', listeners.handleEnd);\n documentListenersRef.current = null;\n };\n\n // Pointer capture routes events through the handle (including over iframes), but\n // some surfaces still drop pointerup. Document-level listeners during an active\n // drag are the release safety net. Only the pointer that started the drag may\n // move or end it.\n const endDrag = (pointerId: number) => {\n if (activePointerIdRef.current !== pointerId) {\n return;\n }\n\n activePointerIdRef.current = null;\n removeDocumentListeners();\n try {\n resizeHandleRef.current?.releasePointerCapture(pointerId);\n } catch {\n // No active capture (or unsupported, e.g. jsdom) — nothing to release.\n }\n\n resizeHandleRef.current?.classList.remove(DRAGGING_CLASSNAME);\n panelOffsetRef.current = 0;\n onReleaseRef.current?.();\n };\n\n const handleDocumentPointerMove = (event: PointerEvent) => {\n if (activePointerIdRef.current !== event.pointerId) {\n return;\n }\n\n onMoveToRef.current(event.clientY + panelOffsetRef.current);\n };\n\n const addDocumentListeners = () => {\n removeDocumentListeners();\n\n const listeners = {\n handleEnd: (event: PointerEvent) => endDrag(event.pointerId),\n handleMove: handleDocumentPointerMove,\n };\n documentListenersRef.current = listeners;\n document.addEventListener('pointermove', listeners.handleMove);\n document.addEventListener('pointerup', listeners.handleEnd);\n document.addEventListener('pointercancel', listeners.handleEnd);\n };\n\n const endDragRef = useRef(endDrag);\n endDragRef.current = endDrag;\n useEffect(() => {\n return () => {\n const activePointerId = activePointerIdRef.current;\n if (activePointerId != null) {\n endDragRef.current(activePointerId);\n }\n };\n }, []);\n\n return (\n <ResizeHandleContainer\n aria-label={ariaLabel}\n onDoubleClick={onDoubleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n onDoubleClick?.();\n e.preventDefault();\n }\n }}\n onLostPointerCapture={(e) => endDrag(e.pointerId)}\n onPointerCancel={(e) => endDrag(e.pointerId)}\n onPointerDown={(e) => {\n // Primary button / touch / pen only; ignore secondary and middle clicks,\n // and a second pointer while a drag is already active.\n if (e.button !== 0 || activePointerIdRef.current != null) {\n return;\n }\n const panelRect = panelRef.current?.getBoundingClientRect();\n panelOffsetRef.current = panelRect ? panelRect.top - e.clientY : 0;\n activePointerIdRef.current = e.pointerId;\n resizeHandleRef.current?.classList.add(DRAGGING_CLASSNAME);\n addDocumentListeners();\n try {\n resizeHandleRef.current?.setPointerCapture(e.pointerId);\n } catch {\n // Pointer capture unsupported (e.g. jsdom) — document listeners still\n // route move/up events for the duration of the drag.\n }\n e.preventDefault();\n e.stopPropagation();\n }}\n onPointerUp={(e) => endDrag(e.pointerId)}\n ref={resizeHandleRef}\n role='button'\n tabIndex={0}\n />\n );\n};\n","import { type FC, type ReactNode, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { IconButton } from '@persona/design-system/components/Button';\nimport { PanelState, type ResizablePanelState } from '@persona/design-system/lib/useResizablePanel';\nimport { Z_INDICES } from '@persona/design-system/lib/zindex';\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { ArrowCollapseIcon, ArrowExpandIcon, XIcon } from '@persona/icons';\n\nimport { semanticScrollbar } from '#src/mixins/scrollbar';\n\nimport { ResizeHandle } from './ResizeHandle';\n\ninterface ResizableVerticalPanelProps {\n /** Panel body, rendered in the scrollable content area below the header. */\n children: ReactNode;\n /** Content for the header row, left of the maximize/minimize/close buttons. */\n headerContent?: ReactNode;\n /** State and drag/resize handlers from `useResizablePanel`. */\n hookState: ResizablePanelState;\n /** Minimum panel height in px. */\n minHeight: number;\n}\n\nconst TriStatePanel = styled.div.attrs<{\n customHeight: number | null;\n minHeight: number;\n panelState: PanelState;\n}>(({ customHeight, minHeight, panelState }) => ({\n style: {\n height: panelState === PanelState.Maximized ? '100%' : `${customHeight ?? minHeight}px`,\n },\n}))<{\n customHeight: number | null;\n minHeight: number;\n panelState: PanelState;\n}>`\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n background-color: ${({ theme }) => theme.color.background.primary};\n position: relative;\n min-height: ${({ minHeight }) => minHeight}px;\n width: 100%;\n border-top: 1px solid ${Color.BorderDivider};\n z-index: ${Z_INDICES.topNav};\n`;\n\nconst TopRowContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n box-shadow: inset 0px -1px 0px 0px ${Color.BorderDivider};\n`;\n\nconst TopRightIconsContainer = styled.div`\n display: flex;\n align-items: center;\n padding: 0 ${Spacing[2]};\n gap: ${Spacing[2]};\n flex-direction: row;\n`;\n\nconst ContentContainer = styled.div`\n /* offset by the top row container height */\n height: calc(100% - ${Spacing[6]});\n overflow: auto;\n ${semanticScrollbar}\n display: flex;\n flex-direction: column;\n min-height: 0;\n`;\n\n/**\n * Bottom-anchored panel with a drag-to-resize top edge, a header row, and\n * maximize/minimize/close controls.\n */\nexport const ResizableVerticalPanel: FC<ResizableVerticalPanelProps> = ({\n children,\n headerContent,\n hookState,\n minHeight,\n}) => {\n const {\n collapse,\n handleDragMove: handlePanelDragMove,\n handleDragRelease,\n maximize,\n panelState,\n restore,\n size,\n toggleMaximized,\n } = hookState;\n const panelRef = useRef<HTMLDivElement>(null);\n // Controls only make sense once the drawer is taller than its collapsed header.\n const showControls = (size != null && size > minHeight) || panelState === PanelState.Maximized;\n // Converts the dragged top edge (clientY) into a panel height bounded by the\n // panel's container.\n const handleDragMove = (clientY: number) => {\n const panel = panelRef.current;\n const container = panel?.parentElement;\n if (!panel || !container) {\n return;\n }\n const panelBottom = panel.getBoundingClientRect().bottom;\n const containerTop = container.getBoundingClientRect().top;\n handlePanelDragMove(panelBottom - clientY, panelBottom - containerTop);\n };\n\n return (\n <TriStatePanel\n aria-label='Bottom panel'\n customHeight={size}\n minHeight={minHeight}\n panelState={panelState}\n ref={panelRef}\n role='region'\n >\n <ResizeHandle\n ariaLabel='Drag to resize bottom panel'\n onDoubleClick={toggleMaximized}\n onMoveTo={handleDragMove}\n onRelease={handleDragRelease}\n panelRef={panelRef}\n />\n\n <TopRowContainer>\n {headerContent}\n\n {showControls && (\n <TopRightIconsContainer>\n {panelState === PanelState.Maximized ? (\n <IconButton aria-label='Restore the bottom panel' onClick={restore} size='sm'>\n <ArrowCollapseIcon />\n </IconButton>\n ) : (\n <IconButton aria-label='Maximize the bottom panel' onClick={maximize} size='sm'>\n <ArrowExpandIcon />\n </IconButton>\n )}\n <IconButton aria-label='Close bottom panel' onClick={collapse} size='sm'>\n <XIcon />\n </IconButton>\n </TopRightIconsContainer>\n )}\n </TopRowContainer>\n\n <ContentContainer>{children}</ContentContainer>\n </TriStatePanel>\n );\n};\n","import {\n forwardRef,\n type ReactNode,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport { useId } from 'react-aria';\nimport styled, { css, useTheme } from 'styled-components';\n\nimport Badge from '@persona/design-system/components/Badge';\nimport { HStack, Stack } from '@persona/design-system/components/Stack';\nimport TabBar, { Tab } from '@persona/design-system/components/TabBar';\nimport { Paragraph } from '@persona/design-system/components/Text';\nimport { usePDSStrings } from '@persona/design-system/lib/i18n';\nimport { semanticColor } from '@persona/design-system/lib/semanticColor';\nimport { PanelState, useResizablePanel } from '@persona/design-system/lib/useResizablePanel';\nimport { focusOutline } from '@persona/design-system/mixins/focus';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { CircleXInverseIcon } from '@persona/icons';\n\nimport { ResizableVerticalPanel } from './ResizableVerticalPanel';\n\n// One-pixel panel top border plus the 32px header row sets the collapsed drawer height.\nconst PANEL_MIN_HEIGHT = 33;\n// Where the drawer opens to when a collapsed tab is selected; the user can drag from there.\nconst OPEN_HEIGHT = 200;\n\nexport interface BottomPanelItemProps {\n /** Tab text; also the key `openPanel(label)` looks up. Unique per BottomPanel. */\n label: string;\n /**\n * Tab body. Every panel stays mounted while another tab is selected, so local\n * state (scroll, expanded rows) survives a switch.\n */\n content: ReactNode;\n /** Count shown as a badge on the tab. `0`/`undefined` hides it. */\n badge?: number;\n}\n\nexport interface BottomPanelHandle {\n /** Select the tab and expand the drawer if collapsed. No-op for an unknown label. */\n openPanel: (label: string) => void;\n}\n\nexport interface BottomPanelProps {\n /** Tabs to show, in order. */\n panels: BottomPanelItemProps[];\n /**\n * Error count rendered as an icon + count at the right edge of the header, next to\n * the expand/collapse controls. `0` renders dimmed; `undefined` hides it.\n */\n errorCount?: number;\n /** Turns the error count into a button (e.g. to open the panel listing the errors). */\n onErrorCountClick?: () => void;\n}\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding-left: ${Spacing[4]};\n`;\n\nconst ErrorSummary = styled(HStack).attrs({ align: 'center' })`\n flex-shrink: 0;\n padding-right: ${Spacing[2]};\n`;\n\nconst ErrorSummaryDivider = styled.div`\n width: 1px;\n height: ${Spacing[6]};\n background: ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n`;\n\n// styled(Stack), not styled(HStack): HStack is a plain function component, so `as` would\n// replace it entirely and drop the flex layout when this renders as a <button>.\nconst ErrorIndicator = styled(Stack).attrs<{ $clickable: boolean }>({\n align: 'center',\n direction: 'horizontal',\n spacing: Spacing[1],\n})`\n padding: ${Spacing[1]} ${Spacing[2]};\n background: none;\n border: none;\n border-radius: ${BorderRadius.Sm};\n font: inherit;\n color: inherit;\n ${({ $clickable }) =>\n $clickable\n ? css`\n cursor: pointer;\n\n &:hover {\n background: ${({ theme }) =>\n semanticColor(theme, 'ActionNeutralHover', theme.color.variants.basic.hover)};\n }\n\n &:active {\n background: ${({ theme }) =>\n semanticColor(theme, 'ActionNeutralActive', theme.color.variants.basic.highlight)};\n }\n\n ${focusOutline}\n `\n : ''}\n`;\n\n// The header row draws the divider edge to edge; the tab bar must not add its own.\n// It shrinks and clips overflowing tabs so the header controls stay pinned right.\nconst HeaderTabBar = styled(TabBar)`\n border-bottom: none;\n flex: 1;\n min-width: 0;\n`;\n\nconst PanelContent = styled.div<{ $hidden: boolean }>`\n ${({ $hidden }) =>\n $hidden\n ? css`\n position: absolute;\n inset: 0;\n overflow: hidden;\n visibility: hidden;\n pointer-events: none;\n `\n : css`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n `}\n`;\n\n/**\n * Resizable drawer anchored to the bottom of its container with one tab per\n * panel. Owns the tab bar, expand/collapse/resize, and always-mounted content;\n * the caller owns what each panel shows.\n */\nconst BottomPanel = forwardRef<BottomPanelHandle, BottomPanelProps>(function BottomPanel(\n { panels, errorCount, onErrorCountClick },\n ref,\n) {\n const strings = usePDSStrings();\n const theme = useTheme();\n const baseId = useId();\n const [selected, setSelected] = useState<string | undefined>(panels[0]?.label);\n // Falls back to the first panel when the selected label has left `panels`, and\n // commits the fallback so the old label does not regain selection if it returns.\n const hasSelected = panels.some((panel) => panel.label === selected);\n const selectedLabel = hasSelected ? selected : panels[0]?.label;\n useEffect(() => {\n if (!hasSelected) {\n setSelected(selectedLabel);\n }\n }, [hasSelected, selectedLabel]);\n\n const resizablePanelState = useResizablePanel({\n initialSize: PANEL_MIN_HEIGHT,\n minSize: PANEL_MIN_HEIGHT,\n });\n const { expandTo, panelState, size } = resizablePanelState;\n\n // Selecting a tab opens a collapsed drawer but leaves a maximized one as is.\n const openPanel = useCallback(\n (label: string) => {\n if (panelState === PanelState.Drawer && (size == null || size <= PANEL_MIN_HEIGHT)) {\n expandTo(OPEN_HEIGHT);\n }\n setSelected(label);\n },\n [expandTo, panelState, size],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n openPanel: (label: string) => {\n if (panels.some((panel) => panel.label === label)) {\n openPanel(label);\n }\n },\n }),\n [openPanel, panels],\n );\n\n return (\n <ResizableVerticalPanel\n headerContent={\n <Header>\n <HeaderTabBar>\n {panels.map((panel, index) => (\n <Tab\n aria-controls={`${baseId}-panel-${index}`}\n badge={panel.badge ? <Badge>{panel.badge}</Badge> : undefined}\n id={`${baseId}-tab-${index}`}\n key={panel.label}\n onClick={() => openPanel(panel.label)}\n selected={selectedLabel === panel.label}\n >\n {panel.label}\n </Tab>\n ))}\n </HeaderTabBar>\n {errorCount != null && (\n <ErrorSummary>\n <ErrorSummaryDivider aria-hidden />\n <ErrorIndicator\n $clickable={onErrorCountClick != null}\n aria-label={strings.errorCount(errorCount)}\n as={onErrorCountClick ? 'button' : 'div'}\n onClick={onErrorCountClick}\n role={onErrorCountClick ? undefined : 'img'}\n type={onErrorCountClick ? 'button' : undefined}\n >\n <CircleXInverseIcon\n aria-hidden\n color={\n errorCount === 0\n ? semanticColor(theme, 'FgDisabled', Color.TextDisabled)\n : semanticColor(theme, 'FgDanger1', Color.TextDanger)\n }\n />\n <Paragraph as='span' color={errorCount === 0 ? 'disabled' : 'primary'} size='md'>\n {errorCount}\n </Paragraph>\n </ErrorIndicator>\n </ErrorSummary>\n )}\n </Header>\n }\n hookState={resizablePanelState}\n minHeight={PANEL_MIN_HEIGHT}\n >\n {panels.map((panel, index) => {\n const isSelected = selectedLabel === panel.label;\n return (\n <PanelContent\n $hidden={!isSelected}\n aria-hidden={!isSelected}\n aria-labelledby={`${baseId}-tab-${index}`}\n id={`${baseId}-panel-${index}`}\n key={panel.label}\n role='tabpanel'\n >\n {panel.content}\n </PanelContent>\n );\n })}\n </ResizableVerticalPanel>\n );\n});\n\nexport default BottomPanel;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/components/BottomPanel/ResizeHandle.tsx","../../../src/components/BottomPanel/ResizableVerticalPanel.tsx","../../../src/components/BottomPanel/BottomPanel.tsx"],"sourcesContent":["import { type FC, type RefObject, useEffect, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { Z_INDICES } from '@persona/design-system/lib/zindex';\nimport { Spacing } from '@persona/design-tokens';\n\nimport { TransitionDuration, TransitionEasing } from '#src/variables/transitions';\n\nconst DRAGGING_CLASSNAME = 'dragging';\n\ninterface ResizeHandleProps {\n ariaLabel: string;\n /** Fires on double-click or Enter/Space so the host can toggle/reset the size. */\n onDoubleClick?: () => void;\n /** Called on each pointer move with the new top edge position (clientY) in px. */\n onMoveTo: (position: number) => void;\n /** Called once when the drag ends (pointerup, cancel, or lost capture). */\n onRelease?: () => void;\n /** The panel being resized; its edge seeds the grab offset so the handle doesn't jump. */\n panelRef: RefObject<HTMLDivElement>;\n}\n\n// The visible line is 2px tall on the panel's top border; the hitbox is Spacing[2] tall and\n// straddles that border so it is easy to grab without covering the header row's controls.\nconst ResizeHandleContainer = styled.div`\n cursor: row-resize;\n position: absolute;\n height: ${Spacing[2]};\n top: -${Spacing[1]};\n left: 0;\n right: 0;\n z-index: ${Z_INDICES.dropdown};\n touch-action: none;\n\n &::after {\n content: '';\n position: absolute;\n top: ${Spacing[1]};\n left: 0;\n right: 0;\n height: 2px;\n background-color: transparent;\n transition: background-color ${TransitionDuration.Fast} ${TransitionEasing.Move};\n }\n\n &:hover::after,\n &.${DRAGGING_CLASSNAME}::after {\n /* Filters out a pointer passing over the handle; the hover-out has no delay. */\n transition-delay: 25ms;\n background-color: ${({ theme }) => theme.color.border.active};\n }\n`;\n\n/** Vertical resize handle pinned to the top edge of a bottom-anchored panel. */\nexport const ResizeHandle: FC<ResizeHandleProps> = ({\n ariaLabel,\n onDoubleClick,\n onMoveTo,\n onRelease,\n panelRef,\n}) => {\n const resizeHandleRef = useRef<HTMLDivElement>(null);\n const panelOffsetRef = useRef(0);\n const activePointerIdRef = useRef<number | null>(null);\n const documentListenersRef = useRef<{\n handleEnd: (event: PointerEvent) => void;\n handleMove: (event: PointerEvent) => void;\n } | null>(null);\n // Document listeners are registered once per drag; reading the callbacks through\n // refs keeps them on the latest props without re-registering mid-drag.\n const onMoveToRef = useRef(onMoveTo);\n const onReleaseRef = useRef(onRelease);\n onMoveToRef.current = onMoveTo;\n onReleaseRef.current = onRelease;\n\n const removeDocumentListeners = () => {\n const listeners = documentListenersRef.current;\n if (!listeners) {\n return;\n }\n\n document.removeEventListener('pointermove', listeners.handleMove);\n document.removeEventListener('pointerup', listeners.handleEnd);\n document.removeEventListener('pointercancel', listeners.handleEnd);\n documentListenersRef.current = null;\n };\n\n // Pointer capture routes events through the handle (including over iframes), but\n // some surfaces still drop pointerup. Document-level listeners during an active\n // drag are the release safety net. Only the pointer that started the drag may\n // move or end it.\n const endDrag = (pointerId: number) => {\n if (activePointerIdRef.current !== pointerId) {\n return;\n }\n\n activePointerIdRef.current = null;\n removeDocumentListeners();\n try {\n resizeHandleRef.current?.releasePointerCapture(pointerId);\n } catch {\n // No active capture (or unsupported, e.g. jsdom) — nothing to release.\n }\n\n resizeHandleRef.current?.classList.remove(DRAGGING_CLASSNAME);\n panelOffsetRef.current = 0;\n onReleaseRef.current?.();\n };\n\n const handleDocumentPointerMove = (event: PointerEvent) => {\n if (activePointerIdRef.current !== event.pointerId) {\n return;\n }\n\n onMoveToRef.current(event.clientY + panelOffsetRef.current);\n };\n\n const addDocumentListeners = () => {\n removeDocumentListeners();\n\n const listeners = {\n handleEnd: (event: PointerEvent) => endDrag(event.pointerId),\n handleMove: handleDocumentPointerMove,\n };\n documentListenersRef.current = listeners;\n document.addEventListener('pointermove', listeners.handleMove);\n document.addEventListener('pointerup', listeners.handleEnd);\n document.addEventListener('pointercancel', listeners.handleEnd);\n };\n\n const endDragRef = useRef(endDrag);\n endDragRef.current = endDrag;\n useEffect(() => {\n return () => {\n const activePointerId = activePointerIdRef.current;\n if (activePointerId != null) {\n endDragRef.current(activePointerId);\n }\n };\n }, []);\n\n return (\n <ResizeHandleContainer\n aria-label={ariaLabel}\n onDoubleClick={onDoubleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n onDoubleClick?.();\n e.preventDefault();\n }\n }}\n onLostPointerCapture={(e) => endDrag(e.pointerId)}\n onPointerCancel={(e) => endDrag(e.pointerId)}\n onPointerDown={(e) => {\n // Primary button / touch / pen only; ignore secondary and middle clicks,\n // and a second pointer while a drag is already active.\n if (e.button !== 0 || activePointerIdRef.current != null) {\n return;\n }\n const panelRect = panelRef.current?.getBoundingClientRect();\n panelOffsetRef.current = panelRect ? panelRect.top - e.clientY : 0;\n activePointerIdRef.current = e.pointerId;\n resizeHandleRef.current?.classList.add(DRAGGING_CLASSNAME);\n addDocumentListeners();\n try {\n resizeHandleRef.current?.setPointerCapture(e.pointerId);\n } catch {\n // Pointer capture unsupported (e.g. jsdom) — document listeners still\n // route move/up events for the duration of the drag.\n }\n e.preventDefault();\n e.stopPropagation();\n }}\n onPointerUp={(e) => endDrag(e.pointerId)}\n ref={resizeHandleRef}\n role='button'\n tabIndex={0}\n />\n );\n};\n","import { type FC, type ReactNode, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { IconButton } from '@persona/design-system/components/Button';\nimport { PanelState, type ResizablePanelState } from '@persona/design-system/lib/useResizablePanel';\nimport { Z_INDICES } from '@persona/design-system/lib/zindex';\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { ArrowCollapseIcon, ArrowExpandIcon, XIcon } from '@persona/icons';\n\nimport { semanticScrollbar } from '#src/mixins/scrollbar';\n\nimport { ResizeHandle } from './ResizeHandle';\n\ninterface ResizableVerticalPanelProps {\n /** Panel body, rendered in the scrollable content area below the header. */\n children: ReactNode;\n /** Content for the header row, left of the maximize/minimize/close buttons. */\n headerContent?: ReactNode;\n /** State and drag/resize handlers from `useResizablePanel`. */\n hookState: ResizablePanelState;\n /** Minimum panel height in px. */\n minHeight: number;\n}\n\nconst TriStatePanel = styled.div.attrs<{\n customHeight: number | null;\n minHeight: number;\n panelState: PanelState;\n}>(({ customHeight, minHeight, panelState }) => ({\n style: {\n height: panelState === PanelState.Maximized ? '100%' : `${customHeight ?? minHeight}px`,\n },\n}))<{\n customHeight: number | null;\n minHeight: number;\n panelState: PanelState;\n}>`\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n background-color: ${({ theme }) => theme.color.background.primary};\n position: relative;\n min-height: ${({ minHeight }) => minHeight}px;\n width: 100%;\n border-top: 1px solid ${Color.BorderDivider};\n z-index: ${Z_INDICES.topNav};\n`;\n\nconst TopRowContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n box-shadow: inset 0px -1px 0px 0px ${Color.BorderDivider};\n`;\n\nconst TopRightIconsContainer = styled.div`\n display: flex;\n align-items: center;\n padding: 0 ${Spacing[2]};\n gap: ${Spacing[2]};\n flex-direction: row;\n`;\n\nconst ContentContainer = styled.div`\n /* offset by the top row container height */\n height: calc(100% - ${Spacing[6]});\n overflow: auto;\n ${semanticScrollbar}\n display: flex;\n flex-direction: column;\n min-height: 0;\n`;\n\n/**\n * Bottom-anchored panel with a drag-to-resize top edge, a header row, and\n * maximize/minimize/close controls.\n */\nexport const ResizableVerticalPanel: FC<ResizableVerticalPanelProps> = ({\n children,\n headerContent,\n hookState,\n minHeight,\n}) => {\n const {\n collapse,\n handleDragMove: handlePanelDragMove,\n handleDragRelease,\n maximize,\n panelState,\n restore,\n size,\n toggleMaximized,\n } = hookState;\n const panelRef = useRef<HTMLDivElement>(null);\n // Controls only make sense once the drawer is taller than its collapsed header.\n const showControls = (size != null && size > minHeight) || panelState === PanelState.Maximized;\n // Converts the dragged top edge (clientY) into a panel height bounded by the\n // panel's container.\n const handleDragMove = (clientY: number) => {\n const panel = panelRef.current;\n const container = panel?.parentElement;\n if (!panel || !container) {\n return;\n }\n const panelBottom = panel.getBoundingClientRect().bottom;\n const containerTop = container.getBoundingClientRect().top;\n handlePanelDragMove(panelBottom - clientY, panelBottom - containerTop);\n };\n\n return (\n <TriStatePanel\n aria-label='Bottom panel'\n customHeight={size}\n minHeight={minHeight}\n panelState={panelState}\n ref={panelRef}\n role='region'\n >\n <ResizeHandle\n ariaLabel='Drag to resize bottom panel'\n onDoubleClick={toggleMaximized}\n onMoveTo={handleDragMove}\n onRelease={handleDragRelease}\n panelRef={panelRef}\n />\n\n <TopRowContainer>\n {headerContent}\n\n {showControls && (\n <TopRightIconsContainer>\n {panelState === PanelState.Maximized ? (\n <IconButton aria-label='Restore the bottom panel' onClick={restore} size='sm'>\n <ArrowCollapseIcon />\n </IconButton>\n ) : (\n <IconButton aria-label='Maximize the bottom panel' onClick={maximize} size='sm'>\n <ArrowExpandIcon />\n </IconButton>\n )}\n <IconButton aria-label='Close bottom panel' onClick={collapse} size='sm'>\n <XIcon />\n </IconButton>\n </TopRightIconsContainer>\n )}\n </TopRowContainer>\n\n <ContentContainer>{children}</ContentContainer>\n </TriStatePanel>\n );\n};\n","import {\n forwardRef,\n type ReactNode,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport { useId } from 'react-aria';\nimport styled, { css, useTheme } from 'styled-components';\n\nimport Badge from '@persona/design-system/components/Badge';\nimport { HStack, Stack } from '@persona/design-system/components/Stack';\nimport TabBar, { Tab } from '@persona/design-system/components/TabBar';\nimport { Paragraph } from '@persona/design-system/components/Text';\nimport { usePDSStrings } from '@persona/design-system/lib/i18n';\nimport { semanticColor } from '@persona/design-system/lib/semanticColor';\nimport { PanelState, useResizablePanel } from '@persona/design-system/lib/useResizablePanel';\nimport { focusOutline } from '@persona/design-system/mixins/focus';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { CircleXInverseIcon } from '@persona/icons';\n\nimport { ResizableVerticalPanel } from './ResizableVerticalPanel';\n\n// One-pixel panel top border plus the 32px header row sets the collapsed drawer height.\nconst PANEL_MIN_HEIGHT = 33;\n// Where the drawer opens to when a collapsed tab is selected; the user can drag from there.\nconst OPEN_HEIGHT = 200;\n\nexport interface BottomPanelItemProps {\n /** Tab text; also the key `openPanel(label)` looks up. Unique per BottomPanel. */\n label: string;\n /**\n * Tab body. Every panel stays mounted while another tab is selected, so local\n * state (scroll, expanded rows) survives a switch.\n */\n content: ReactNode;\n /** Count shown as a badge on the tab. `0`/`undefined` hides it. */\n badge?: number;\n}\n\nexport interface BottomPanelHandle {\n /** Select the tab and expand the drawer if collapsed. No-op for an unknown label. */\n openPanel: (label: string) => void;\n}\n\nexport interface BottomPanelProps {\n /** Tabs to show, in order. */\n panels: BottomPanelItemProps[];\n /**\n * Error count rendered as an icon + count at the right edge of the header, next to\n * the expand/collapse controls. `0` renders dimmed; `undefined` hides it.\n */\n errorCount?: number;\n /** Turns the error count into a button (e.g. to open the panel listing the errors). */\n onErrorCountClick?: () => void;\n}\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding-left: ${Spacing[4]};\n`;\n\nconst ErrorSummary = styled(HStack).attrs({ align: 'center' })`\n flex-shrink: 0;\n padding-right: ${Spacing[2]};\n`;\n\nconst ErrorSummaryDivider = styled.div`\n width: 1px;\n height: ${Spacing[6]};\n background: ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n`;\n\n// styled(Stack), not styled(HStack): HStack is a plain function component, so `as` would\n// replace it entirely and drop the flex layout when this renders as a <button>.\nconst ErrorIndicator = styled(Stack).attrs<{ $clickable: boolean }>({\n align: 'center',\n direction: 'horizontal',\n spacing: Spacing[1],\n})`\n padding: ${Spacing[1]} ${Spacing[2]};\n background: none;\n border: none;\n border-radius: ${BorderRadius.Sm};\n font: inherit;\n color: inherit;\n ${({ $clickable }) =>\n $clickable\n ? css`\n cursor: pointer;\n\n &:hover {\n background: ${({ theme }) =>\n semanticColor(theme, 'ActionNeutralHover', theme.color.variants.basic.hover)};\n }\n\n &:active {\n background: ${({ theme }) =>\n semanticColor(theme, 'ActionNeutralActive', theme.color.variants.basic.highlight)};\n }\n\n ${focusOutline}\n `\n : ''}\n`;\n\n// The header row draws the divider edge to edge; the tab bar must not add its own.\n// It shrinks and clips overflowing tabs so the header controls stay pinned right.\nconst HeaderTabBar = styled(TabBar)`\n border-bottom: none;\n flex: 1;\n min-width: 0;\n`;\n\nconst PanelContent = styled.div<{ $hidden: boolean }>`\n ${({ $hidden }) =>\n $hidden\n ? css`\n position: absolute;\n inset: 0;\n overflow: hidden;\n visibility: hidden;\n pointer-events: none;\n `\n : css`\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n `}\n`;\n\n/**\n * Resizable drawer anchored to the bottom of its container with one tab per\n * panel. Owns the tab bar, expand/collapse/resize, and always-mounted content;\n * the caller owns what each panel shows.\n */\nconst BottomPanel = forwardRef<BottomPanelHandle, BottomPanelProps>(function BottomPanel(\n { panels, errorCount, onErrorCountClick },\n ref,\n) {\n const strings = usePDSStrings();\n const theme = useTheme();\n const baseId = useId();\n const [selected, setSelected] = useState<string | undefined>(panels[0]?.label);\n // Falls back to the first panel when the selected label has left `panels`, and\n // commits the fallback so the old label does not regain selection if it returns.\n const hasSelected = panels.some((panel) => panel.label === selected);\n const selectedLabel = hasSelected ? selected : panels[0]?.label;\n useEffect(() => {\n if (!hasSelected) {\n setSelected(selectedLabel);\n }\n }, [hasSelected, selectedLabel]);\n\n const resizablePanelState = useResizablePanel({\n initialSize: PANEL_MIN_HEIGHT,\n minSize: PANEL_MIN_HEIGHT,\n });\n const { expandTo, panelState, size } = resizablePanelState;\n\n // Selecting a tab opens a collapsed drawer but leaves a maximized one as is.\n const openPanel = useCallback(\n (label: string) => {\n if (panelState === PanelState.Drawer && (size == null || size <= PANEL_MIN_HEIGHT)) {\n expandTo(OPEN_HEIGHT);\n }\n setSelected(label);\n },\n [expandTo, panelState, size],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n openPanel: (label: string) => {\n if (panels.some((panel) => panel.label === label)) {\n openPanel(label);\n }\n },\n }),\n [openPanel, panels],\n );\n\n return (\n <ResizableVerticalPanel\n headerContent={\n <Header>\n <HeaderTabBar>\n {panels.map((panel, index) => (\n <Tab\n aria-controls={`${baseId}-panel-${index}`}\n badge={panel.badge ? <Badge>{panel.badge}</Badge> : undefined}\n id={`${baseId}-tab-${index}`}\n key={panel.label}\n onClick={() => openPanel(panel.label)}\n selected={selectedLabel === panel.label}\n >\n {panel.label}\n </Tab>\n ))}\n </HeaderTabBar>\n {errorCount != null && (\n <ErrorSummary>\n <ErrorSummaryDivider aria-hidden />\n <ErrorIndicator\n $clickable={onErrorCountClick != null}\n aria-label={strings.errorCount(errorCount)}\n as={onErrorCountClick ? 'button' : 'div'}\n onClick={onErrorCountClick}\n role={onErrorCountClick ? undefined : 'img'}\n type={onErrorCountClick ? 'button' : undefined}\n >\n <CircleXInverseIcon\n aria-hidden\n color={\n errorCount === 0\n ? semanticColor(theme, 'FgDisabled', Color.TextDisabled)\n : semanticColor(theme, 'FgDanger1', Color.TextDanger)\n }\n />\n <Paragraph as='span' color={errorCount === 0 ? 'disabled' : 'primary'} size='md'>\n {errorCount}\n </Paragraph>\n </ErrorIndicator>\n </ErrorSummary>\n )}\n </Header>\n }\n hookState={resizablePanelState}\n minHeight={PANEL_MIN_HEIGHT}\n >\n {panels.map((panel, index) => {\n const isSelected = selectedLabel === panel.label;\n return (\n <PanelContent\n $hidden={!isSelected}\n aria-hidden={!isSelected}\n aria-labelledby={`${baseId}-tab-${index}`}\n id={`${baseId}-panel-${index}`}\n key={panel.label}\n role='tabpanel'\n >\n {panel.content}\n </PanelContent>\n );\n })}\n </ResizableVerticalPanel>\n );\n});\n\nexport default BottomPanel;\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { t as Breadcrumbs } from "../../Breadcrumbs-CMf3Uvow.mjs";
1
+ import { t as Breadcrumbs } from "../../Breadcrumbs-DpsNZWF9.mjs";
2
2
  export { Breadcrumbs, Breadcrumbs as default };
@@ -1,3 +1,3 @@
1
- import { a as SuffixIconContainer, i as StyledButton, n as ButtonChildren, r as ButtonProps, t as Button } from "../../Button-DjD8QxcY.mjs";
2
- import { t as IconButton } from "../../IconButton-C_ReZm8v.mjs";
1
+ import { a as SuffixIconContainer, i as StyledButton, n as ButtonChildren, r as ButtonProps, t as Button } from "../../Button-C4a4BTjL.mjs";
2
+ import { t as IconButton } from "../../IconButton-7k-wjvH3.mjs";
3
3
  export { Button, Button as default, ButtonChildren, ButtonProps, IconButton, StyledButton, SuffixIconContainer };
@@ -1,2 +1,2 @@
1
- import { a as SuffixIconContainer, i as StyledButton, n as Button, r as ButtonChildren, t as IconButton } from "../../IconButton-DxHB2g80.mjs";
1
+ import { a as SuffixIconContainer, i as StyledButton, n as Button, r as ButtonChildren, t as IconButton } from "../../IconButton-kSjnfhWt.mjs";
2
2
  export { Button, Button as default, ButtonChildren, IconButton, StyledButton, SuffixIconContainer };
@@ -1,10 +1,10 @@
1
1
  import { a as styled, r as css } from "../../styledComponentsInterop-Cs5CCPRy.mjs";
2
2
  import { semanticOnly } from "../../lib/semanticColor.mjs";
3
3
  import { withAlpha } from "../../lib/color.mjs";
4
- import { o as buttonPalette, t as IconButton } from "../../IconButton-DxHB2g80.mjs";
4
+ import { o as buttonPalette, t as IconButton } from "../../IconButton-kSjnfhWt.mjs";
5
5
  import { n as useFormField } from "../../useFormField-pOVkb5BK.mjs";
6
- import { forwardRef } from "react";
7
6
  import { BorderRadius } from "@persona/design-tokens";
7
+ import { forwardRef } from "react";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
10
10
  //#region src/components/ButtonGroup/ButtonGroup.tsx
@@ -1,3 +1,3 @@
1
- import { a as Root, i as HeaderProps, n as Header, o as Title, r as HeaderContainer, s as TitleContainer, t as ActionsContainer } from "../../Header-CV0Lcf0C.mjs";
2
- import { n as SectionProps, r as _default, t as CardProps } from "../../Card-DiUHtYg_.mjs";
1
+ import { a as Root, i as HeaderProps, n as Header, o as Title, r as HeaderContainer, s as TitleContainer, t as ActionsContainer } from "../../Header-DaaUprCL.mjs";
2
+ import { n as SectionProps, r as _default, t as CardProps } from "../../Card-CPV4_mHk.mjs";
3
3
  export { ActionsContainer, CardProps, Header, HeaderContainer, HeaderProps, Root, SectionProps, Title, TitleContainer, _default as default };
@@ -1,4 +1,4 @@
1
- import { i as TextAction, n as IconAction, r as MenuAction } from "../../Action-CHWYwpYR.mjs";
1
+ import { i as TextAction, n as IconAction, r as MenuAction } from "../../Action-sLO73eKq.mjs";
2
2
  import { CARD_HEADING_STICKY_OFFSET } from "../../SectionHeading.mjs";
3
3
  import _default from "../../Card2.mjs";
4
4
  export { CARD_HEADING_STICKY_OFFSET, _default as Card, _default as default, type IconAction, type MenuAction, type TextAction };
@@ -1,2 +1,2 @@
1
- import { n as CARD_HEADING_STICKY_OFFSET, t as Card_default } from "../../CardV2-CrV6eEQb.mjs";
1
+ import { n as CARD_HEADING_STICKY_OFFSET, t as Card_default } from "../../CardV2-DCoDfEvr.mjs";
2
2
  export { CARD_HEADING_STICKY_OFFSET, Card_default as Card, Card_default as default };
@@ -0,0 +1,9 @@
1
+ import { CHART_DEFAULT_HEIGHT, CHART_INACTIVE_OPACITY, CHART_PLOT_MARGIN, ChartLegendPosition, DEFAULT_CHART_LEGEND_POSITION } from "../../chartFrameLayout.mjs";
2
+ import { ChartLegend, ChartLegendContent, ChartLegendGroup, ChartLegendItem, ChartLegendProps } from "../../ChartLegend.mjs";
3
+ import { ChartFrame, ChartFrameProps } from "../../ChartFrame.mjs";
4
+ import { ChartPopover, ChartPopoverPanel, ChartPopoverPanelProps, ChartPopoverPayloadEntry, ChartPopoverProps, ChartPopoverRow, ChartPopoverSeries, ChartPopoverSize, chartPopoverRows } from "../../ChartPopover.mjs";
5
+ import { CHART_PALETTE_TOKENS, ChartColor, ChartColorMode, ChartPalette, ChartSeriesColorInput, DEFAULT_CHART_PALETTE, ResolveSeriesColorsOptions, chartColor, chartColorModeOf, chartPaletteColors, resolveChartColor, resolveSeriesColors } from "../../chartColors.mjs";
6
+ import { ChartColors, useChartColors } from "../../useChartColors.mjs";
7
+ import { ChartSeriesVisibility, useChartSeriesVisibility } from "../../useChartSeriesVisibility.mjs";
8
+ import { ChartActiveSeries, ChartStyles, ChartTickStyle, useChartActiveSeries, useChartStyles } from "../../useChartStyles.mjs";
9
+ export { CHART_DEFAULT_HEIGHT, CHART_INACTIVE_OPACITY, CHART_PALETTE_TOKENS, CHART_PLOT_MARGIN, type ChartActiveSeries, type ChartColor, type ChartColorMode, type ChartColors, ChartFrame, type ChartFrameProps, ChartLegend, type ChartLegendContent, type ChartLegendGroup, type ChartLegendItem, type ChartLegendPosition, type ChartLegendProps, type ChartPalette, ChartPopover, ChartPopoverPanel, type ChartPopoverPanelProps, type ChartPopoverPayloadEntry, type ChartPopoverProps, type ChartPopoverRow, type ChartPopoverSeries, type ChartPopoverSize, type ChartSeriesColorInput, type ChartSeriesVisibility, type ChartStyles, type ChartTickStyle, DEFAULT_CHART_LEGEND_POSITION, DEFAULT_CHART_PALETTE, type ResolveSeriesColorsOptions, chartColor, chartColorModeOf, chartPaletteColors, chartPopoverRows, resolveChartColor, resolveSeriesColors, useChartActiveSeries, useChartColors, useChartSeriesVisibility, useChartStyles };