@persona/design-system 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{Action-C2FTJhnQ.d.mts → Action-C7INft7X.d.mts} +3 -3
  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 +3 -3
  8. package/dist/{Badge-BtNIvtDZ.mjs → Badge-BD0Ut46g.mjs} +2 -2
  9. package/dist/{Badge-BtNIvtDZ.mjs.map → Badge-BD0Ut46g.mjs.map} +1 -1
  10. package/dist/BooleanValueControl.d.mts +1 -1
  11. package/dist/{Breadcrumb-BlAhp45l.d.mts → Breadcrumb-DtW1R9xW.d.mts} +2 -2
  12. package/dist/Breadcrumb.d.mts +1 -1
  13. package/dist/{Breadcrumbs-DdZ14ZFw.d.mts → Breadcrumbs-B6JyoS8n.d.mts} +2 -2
  14. package/dist/{Breadcrumbs-ClKHNIr-.mjs → Breadcrumbs-CCmf8oZ4.mjs} +9 -9
  15. package/dist/Breadcrumbs-CCmf8oZ4.mjs.map +1 -0
  16. package/dist/Breadcrumbs.d.mts +1 -1
  17. package/dist/{Button-CTgyA3gc.d.mts → Button-HodDf_bB.d.mts} +18 -9
  18. package/dist/Button.d.mts +1 -1
  19. package/dist/{Calendar-_gM6U5ET.d.mts → Calendar-DrdTvzAa.d.mts} +1 -1
  20. package/dist/Calendar.d.mts +1 -1
  21. package/dist/CalendarBase.d.mts +1 -1
  22. package/dist/{Card-Dorym91P.d.mts → Card-CpDwATnX.d.mts} +3 -3
  23. package/dist/{Card-vQIPtdXi.mjs → Card-Dz6jqJuJ.mjs} +4 -4
  24. package/dist/{Card-vQIPtdXi.mjs.map → Card-Dz6jqJuJ.mjs.map} +1 -1
  25. package/dist/Card.d.mts +1 -1
  26. package/dist/Card2.d.mts +2 -2
  27. package/dist/{CardV2-CFTjYWoO.mjs → CardV2-Y_kRfd-R.mjs} +9 -9
  28. package/dist/{CardV2-CFTjYWoO.mjs.map → CardV2-Y_kRfd-R.mjs.map} +1 -1
  29. package/dist/{Checkbox-DRJXDs2T.d.mts → Checkbox-C-hMfItK.d.mts} +1 -1
  30. package/dist/{Checkbox-CyeitZ5q.mjs → Checkbox-DBAXDIQf.mjs} +4 -4
  31. package/dist/{Checkbox-CyeitZ5q.mjs.map → Checkbox-DBAXDIQf.mjs.map} +1 -1
  32. package/dist/Checkbox.d.mts +1 -1
  33. package/dist/CheckboxGroupField.d.mts +1 -1
  34. package/dist/ChoicesValueControl.d.mts +1 -1
  35. package/dist/{Combobox-Ddas5FN-.mjs → Combobox-CNdpK8VG.mjs} +10 -10
  36. package/dist/{Combobox-Ddas5FN-.mjs.map → Combobox-CNdpK8VG.mjs.map} +1 -1
  37. package/dist/{Combobox-DX4DLe1b.d.mts → Combobox-CPE-IV79.d.mts} +3 -3
  38. package/dist/Combobox.d.mts +2 -2
  39. package/dist/{ComboboxBase-Ds_i3K2m.d.mts → ComboboxBase-B3Es1y9g.d.mts} +5 -5
  40. package/dist/ComboboxBase.d.mts +1 -1
  41. package/dist/{ComboboxMultiSelect-S6oFJcOS.d.mts → ComboboxMultiSelect-4sRA7oL0.d.mts} +2 -2
  42. package/dist/ComboboxMultiSelect.d.mts +1 -1
  43. package/dist/{ComboboxSingleSelect-DFzCwW1Y.d.mts → ComboboxSingleSelect-DVPznL7L.d.mts} +4 -4
  44. package/dist/ComboboxSingleSelect.d.mts +1 -1
  45. package/dist/{CompactBar-DEqItiZr.d.mts → CompactBar-DhHh7Roq.d.mts} +3 -3
  46. package/dist/CompactBar.d.mts +1 -1
  47. package/dist/{ConfigFormGroup-DcsM-u8o.mjs → ConfigFormGroup-4lUy7CZH.mjs} +2 -2
  48. package/dist/{ConfigFormGroup-DcsM-u8o.mjs.map → ConfigFormGroup-4lUy7CZH.mjs.map} +1 -1
  49. package/dist/{ControlBar-BVG5Pbvh.d.mts → ControlBar-C8kagIck.d.mts} +2 -2
  50. package/dist/ControlBar.d.mts +1 -1
  51. package/dist/DataTable.d.mts +4 -4
  52. package/dist/{DateField-CBCo8_d3.d.mts → DateField-2aigfD4u.d.mts} +2 -2
  53. package/dist/DateField.d.mts +1 -1
  54. package/dist/{DatePicker-DTT-mJ8r.mjs → DatePicker-CSd20-CW.mjs} +8 -8
  55. package/dist/{DatePicker-DTT-mJ8r.mjs.map → DatePicker-CSd20-CW.mjs.map} +1 -1
  56. package/dist/{DatePicker-BZ4_I4Db.d.mts → DatePicker-DC_RKjdM.d.mts} +2 -2
  57. package/dist/DatePicker.d.mts +1 -1
  58. package/dist/{DateRangePicker-BMKJquPT.d.mts → DateRangePicker-ByD6IsLB.d.mts} +3 -3
  59. package/dist/DateRangePicker.d.mts +1 -1
  60. package/dist/DateRangeValueControl.d.mts +2 -2
  61. package/dist/DateValueControl.d.mts +1 -1
  62. package/dist/{DropdownButton-DV5if_uG.mjs → DropdownButton-gmGRrD1z.mjs} +3 -3
  63. package/dist/{DropdownButton-DV5if_uG.mjs.map → DropdownButton-gmGRrD1z.mjs.map} +1 -1
  64. package/dist/DropdownButton.d.mts +2 -2
  65. package/dist/{DropdownMenu-DovtBJBs.mjs → DropdownMenu-I5WDO-q5.mjs} +2 -2
  66. package/dist/{DropdownMenu-DovtBJBs.mjs.map → DropdownMenu-I5WDO-q5.mjs.map} +1 -1
  67. package/dist/{DropdownMenu-CbhEzWy1.d.mts → DropdownMenu-eP6v6XE4.d.mts} +2 -2
  68. package/dist/DropdownMenu.d.mts +1 -1
  69. package/dist/{ErrorProps-7eWoxSes.d.mts → ErrorProps-Dgu98PkH.d.mts} +1 -1
  70. package/dist/ErrorProps.d.mts +1 -1
  71. package/dist/{FieldRegistry-BslyuPZw.d.mts → FieldRegistry-BtdqMYUD.d.mts} +2 -2
  72. package/dist/FieldRegistry.d.mts +1 -1
  73. package/dist/{FilterBar-DjZE4PoB.d.mts → FilterBar-CAnqGXgE.d.mts} +4 -4
  74. package/dist/FilterBar.d.mts +1 -1
  75. package/dist/FilterPickerMenu.d.mts +2 -2
  76. package/dist/FilterPill.d.mts +1 -1
  77. package/dist/FilterPopover.d.mts +1 -1
  78. package/dist/FloatValueControl.d.mts +1 -1
  79. package/dist/{FormControl-BvRzRknE.mjs → FormControl-CButLg9b.mjs} +4 -4
  80. package/dist/{FormControl-BvRzRknE.mjs.map → FormControl-CButLg9b.mjs.map} +1 -1
  81. package/dist/{FormControl-gpLZZpNs.d.mts → FormControl-CJfYdgZF.d.mts} +2 -2
  82. package/dist/FormControl.d.mts +1 -1
  83. package/dist/FormControlLabel.d.mts +1 -1
  84. package/dist/{FormField-BDJ6zNE6.mjs → FormField-BHUeWCsa.mjs} +16 -16
  85. package/dist/{FormField-BDJ6zNE6.mjs.map → FormField-BHUeWCsa.mjs.map} +1 -1
  86. package/dist/{FormField-CZXKvCGt.d.mts → FormField-CK8o1sMB.d.mts} +2 -2
  87. package/dist/FormField.d.mts +1 -1
  88. package/dist/{Header-1laYnwRP.d.mts → Header-ZnHGm8fs.d.mts} +1 -1
  89. package/dist/Header.d.mts +1 -1
  90. package/dist/{HelperTooltip-BPJS3EwC.d.mts → HelperTooltip-CQpPO16Q.d.mts} +2 -2
  91. package/dist/HelperTooltip.d.mts +1 -1
  92. package/dist/{HoverCopyableField-WP6DPjy1.mjs → HoverCopyableField-B89NIwlE.mjs} +6 -6
  93. package/dist/{HoverCopyableField-WP6DPjy1.mjs.map → HoverCopyableField-B89NIwlE.mjs.map} +1 -1
  94. package/dist/{IconButton-CnJNIJVQ.mjs → IconButton-CqTPMhjV.mjs} +12 -5
  95. package/dist/IconButton-CqTPMhjV.mjs.map +1 -0
  96. package/dist/{IconButton-PnrnqQ1s.d.mts → IconButton-zu-VNp1h.d.mts} +2 -2
  97. package/dist/IconButton.d.mts +1 -1
  98. package/dist/ImageTile.d.mts +1 -1
  99. package/dist/InlineCombobox.d.mts +1 -1
  100. package/dist/InlineInput.d.mts +1 -1
  101. package/dist/{Input-DbfwNzS_.mjs → Input-C-TwCer2.mjs} +4 -4
  102. package/dist/{Input-DbfwNzS_.mjs.map → Input-C-TwCer2.mjs.map} +1 -1
  103. package/dist/{Input-Diztxhle.d.mts → Input-Ce8FvSYf.d.mts} +3 -3
  104. package/dist/Input.d.mts +1 -1
  105. package/dist/{InputProps-BILq1X-n.d.mts → InputProps-B1Xod4wm.d.mts} +2 -2
  106. package/dist/InputProps.d.mts +1 -1
  107. package/dist/IntegerValueControl.d.mts +1 -1
  108. package/dist/Link.d.mts +2 -2
  109. package/dist/{ListBox-CXh9Jfb-.mjs → ListBox-BHE4DO2l.mjs} +9 -9
  110. package/dist/{ListBox-CXh9Jfb-.mjs.map → ListBox-BHE4DO2l.mjs.map} +1 -1
  111. package/dist/{ListBox-P1eTecdo.d.mts → ListBox-CCBWdAUR.d.mts} +3 -3
  112. package/dist/ListBox.d.mts +1 -1
  113. package/dist/ListBoxField.d.mts +2 -2
  114. package/dist/{LoadingShimmer-DeVCDCjT.mjs → LoadingShimmer-JyGh7M7V.mjs} +1 -1
  115. package/dist/{LoadingShimmer-DeVCDCjT.mjs.map → LoadingShimmer-JyGh7M7V.mjs.map} +1 -1
  116. package/dist/LoadingShimmer.d.mts +1 -1
  117. package/dist/{LogicRow-DtZYOzQ8.d.mts → LogicRow-DmI8NKrI.d.mts} +3 -3
  118. package/dist/LogicRow.d.mts +1 -1
  119. package/dist/MaskedInput.d.mts +2 -2
  120. package/dist/{Menu-_loh8pe3.d.mts → Menu-C8RxFGOG.d.mts} +3 -3
  121. package/dist/{Menu-CAGTCBqj.mjs → Menu-xENvm-Oa.mjs} +2 -2
  122. package/dist/{Menu-CAGTCBqj.mjs.map → Menu-xENvm-Oa.mjs.map} +1 -1
  123. package/dist/Menu.d.mts +1 -1
  124. package/dist/Modal.d.mts +1 -1
  125. package/dist/{PageHeader-wpvRRTaa.mjs → PageHeader-7GBfUjU_.mjs} +3 -3
  126. package/dist/{PageHeader-wpvRRTaa.mjs.map → PageHeader-7GBfUjU_.mjs.map} +1 -1
  127. package/dist/PageHeader.d.mts +1 -1
  128. package/dist/{PageSelector-CIa3Zts9.d.mts → PageSelector-BMz2Q4P6.d.mts} +3 -3
  129. package/dist/PageSelector.d.mts +1 -1
  130. package/dist/{Pagination-wjr3W3xf.mjs → Pagination-BxNqU2yh.mjs} +5 -5
  131. package/dist/{Pagination-wjr3W3xf.mjs.map → Pagination-BxNqU2yh.mjs.map} +1 -1
  132. package/dist/{Pagination-C2eZEM7K.d.mts → Pagination-ne9hnVoe.d.mts} +2 -2
  133. package/dist/Pagination.d.mts +1 -1
  134. package/dist/{Pii-Bm-qkweh.mjs → Pii-B29k0Omf.mjs} +2 -2
  135. package/dist/{Pii-Bm-qkweh.mjs.map → Pii-B29k0Omf.mjs.map} +1 -1
  136. package/dist/{PillShell-D6dN9sWk.d.mts → PillShell-D9iQyM-8.d.mts} +2 -2
  137. package/dist/PillShell.d.mts +1 -1
  138. package/dist/{Popover-DUyzmq3e.mjs → Popover-Dn3xmzSK.mjs} +3 -3
  139. package/dist/{Popover-DUyzmq3e.mjs.map → Popover-Dn3xmzSK.mjs.map} +1 -1
  140. package/dist/{PseudoClassProps-DnlHhW5u.d.mts → PseudoClassProps-CdRF3QNn.d.mts} +1 -1
  141. package/dist/PseudoClassProps.d.mts +1 -1
  142. package/dist/{Radio-CkugnL91.mjs → Radio-BRPoGITE.mjs} +2 -2
  143. package/dist/{Radio-CkugnL91.mjs.map → Radio-BRPoGITE.mjs.map} +1 -1
  144. package/dist/{RadioGroup-8dI8gljw.mjs → RadioGroup-CahrWsXi.mjs} +2 -2
  145. package/dist/{RadioGroup-8dI8gljw.mjs.map → RadioGroup-CahrWsXi.mjs.map} +1 -1
  146. package/dist/{RadioGroup-Dg_gydUp.d.mts → RadioGroup-CxL6LW4q.d.mts} +1 -1
  147. package/dist/RadioGroup.d.mts +1 -1
  148. package/dist/RangeCalendar-B7TwRJbg.d.mts +40 -0
  149. package/dist/RangeCalendar.d.mts +2 -40
  150. package/dist/RangeCalendarPresets.d.mts +1 -1
  151. package/dist/RouterContext-B7N12wkK.d.mts +11 -0
  152. package/dist/RouterContext-CsPnkNdI.mjs +26 -0
  153. package/dist/RouterContext-CsPnkNdI.mjs.map +1 -0
  154. package/dist/RouterContext.d.mts +2 -0
  155. package/dist/RouterLink-Bq36EGjc.d.mts +8 -0
  156. package/dist/RouterLink.d.mts +2 -0
  157. package/dist/RuleEditorFields.d.mts +2 -2
  158. package/dist/RulesPill.d.mts +1 -1
  159. package/dist/{SearchInput-CNg109M5.d.mts → SearchInput-D69WxMNq.d.mts} +2 -2
  160. package/dist/SearchInput.d.mts +1 -1
  161. package/dist/SectionHeading.d.mts +1 -1
  162. package/dist/{SegmentedControl-DQE0hN57.mjs → SegmentedControl-DLkAC2kW.mjs} +2 -2
  163. package/dist/{SegmentedControl-DQE0hN57.mjs.map → SegmentedControl-DLkAC2kW.mjs.map} +1 -1
  164. package/dist/{SegmentedControl-BBIHKcvo.d.mts → SegmentedControl-vCnGsdXo.d.mts} +1 -1
  165. package/dist/SegmentedControl.d.mts +1 -1
  166. package/dist/{Select-wnr46ROZ.d.mts → Select-CpRijO_l.d.mts} +3 -3
  167. package/dist/{Select-D9OVjzPR.mjs → Select-YOgn_uD0.mjs} +7 -7
  168. package/dist/{Select-D9OVjzPR.mjs.map → Select-YOgn_uD0.mjs.map} +1 -1
  169. package/dist/Select.d.mts +1 -1
  170. package/dist/{Spacer-D58qwuXR.mjs → Spacer-BFOuo0sZ.mjs} +1 -1
  171. package/dist/{Spacer-D58qwuXR.mjs.map → Spacer-BFOuo0sZ.mjs.map} +1 -1
  172. package/dist/{Spinner-gBNWIwOn.mjs → Spinner-BDa0D1ze.mjs} +1 -1
  173. package/dist/{Spinner-gBNWIwOn.mjs.map → Spinner-BDa0D1ze.mjs.map} +1 -1
  174. package/dist/{Stack-DgC83-nw.d.mts → Stack-8KGPQp0u.d.mts} +1 -1
  175. package/dist/{Stack-BqQndGI9.mjs → Stack-ChsImaEY.mjs} +1 -1
  176. package/dist/{Stack-BqQndGI9.mjs.map → Stack-ChsImaEY.mjs.map} +1 -1
  177. package/dist/Stack.d.mts +1 -1
  178. package/dist/{Sticker-qvWkqEMw.d.mts → Sticker-Bf9rhSkv.d.mts} +4 -4
  179. package/dist/{Sticker-BDyejPZa.mjs → Sticker-C3Eb13OQ.mjs} +3 -3
  180. package/dist/{Sticker-BDyejPZa.mjs.map → Sticker-C3Eb13OQ.mjs.map} +1 -1
  181. package/dist/Sticker.d.mts +1 -1
  182. package/dist/StringValueControl.d.mts +1 -1
  183. package/dist/Tab.d.mts +1 -1
  184. package/dist/{TabBar-B__54oO3.mjs → TabBar-RenaeJJ6.mjs} +3 -3
  185. package/dist/{TabBar-B__54oO3.mjs.map → TabBar-RenaeJJ6.mjs.map} +1 -1
  186. package/dist/{Table-CPvIH27_.d.mts → Table-BefytM6w.d.mts} +1 -1
  187. package/dist/{Table-CqIi5mVF.mjs → Table-DaxiIS96.mjs} +4 -4
  188. package/dist/{Table-CqIi5mVF.mjs.map → Table-DaxiIS96.mjs.map} +1 -1
  189. package/dist/Table.d.mts +1 -1
  190. package/dist/{TableBody-CQYijW_3.d.mts → TableBody-BZ34-_wV.d.mts} +1 -1
  191. package/dist/TableBody.d.mts +1 -1
  192. package/dist/{TableBox-C-8RxZT4.mjs → TableBox-C7ZXamI7.mjs} +10 -10
  193. package/dist/{TableBox-C-8RxZT4.mjs.map → TableBox-C7ZXamI7.mjs.map} +1 -1
  194. package/dist/TableBox.d.mts +2 -2
  195. package/dist/{TableBoxCell-CQ3zT1jG.d.mts → TableBoxCell-B7kjO76l.d.mts} +6 -6
  196. package/dist/TableBoxCell.d.mts +1 -1
  197. package/dist/TableBoxField.d.mts +3 -3
  198. package/dist/{TableBoxRow-ClK2pceY.d.mts → TableBoxRow-oVGEFVOO.d.mts} +3 -3
  199. package/dist/TableBoxRow.d.mts +1 -1
  200. package/dist/{TableBoxRowActions-CoF3DuUQ.d.mts → TableBoxRowActions-DIZw2OPP.d.mts} +2 -2
  201. package/dist/TableBoxRowActions.d.mts +1 -1
  202. package/dist/{TableCell-BQv4ASkE.d.mts → TableCell-DorRxyke.d.mts} +2 -2
  203. package/dist/TableCell.d.mts +1 -1
  204. package/dist/{TableControls-CtEL3ioz.d.mts → TableControls-BtGFiZeD.d.mts} +3 -3
  205. package/dist/{TableControls-DplArh-9.mjs → TableControls-DxAUnR9v.mjs} +18 -18
  206. package/dist/{TableControls-DplArh-9.mjs.map → TableControls-DxAUnR9v.mjs.map} +1 -1
  207. package/dist/TableControls.d.mts +1 -1
  208. package/dist/{TableControlsContext-X-Lupvc6.d.mts → TableControlsContext-C3DYeUmB.d.mts} +2 -2
  209. package/dist/TableControlsContext.d.mts +1 -1
  210. package/dist/{TableHead-DLLn0zoP.d.mts → TableHead-B0Fdldgw.d.mts} +1 -1
  211. package/dist/TableHead.d.mts +1 -1
  212. package/dist/{TableHeaderCell-DiJ2jyw4.d.mts → TableHeaderCell-C_7X8QAT.d.mts} +1 -1
  213. package/dist/TableHeaderCell.d.mts +1 -1
  214. package/dist/{TableLayout-BgnUz8NO.d.mts → TableLayout-CXVVzq0e.d.mts} +1 -1
  215. package/dist/TableLayout.d.mts +1 -1
  216. package/dist/{TableRow-Dgg8hGy5.d.mts → TableRow-Dr61XJNw.d.mts} +2 -2
  217. package/dist/TableRow.d.mts +1 -1
  218. package/dist/TableTH.d.mts +1 -1
  219. package/dist/{TableViewConfigurationDropdown-DRxd562-.d.mts → TableViewConfigurationDropdown-CCtwcB3I.d.mts} +2 -2
  220. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  221. package/dist/{TechnicalSticker-D6MO_IfT.mjs → TechnicalSticker-D1PqG_yT.mjs} +3 -3
  222. package/dist/{TechnicalSticker-D6MO_IfT.mjs.map → TechnicalSticker-D1PqG_yT.mjs.map} +1 -1
  223. package/dist/{Text-Dn_p7ZvT.mjs → Text-BdluS7Fy.mjs} +1 -1
  224. package/dist/{Text-Dn_p7ZvT.mjs.map → Text-BdluS7Fy.mjs.map} +1 -1
  225. package/dist/{Text-tgFz40XD.d.mts → Text-DD_W_ixb.d.mts} +3 -3
  226. package/dist/Text.d.mts +1 -1
  227. package/dist/{TextArea-BxxXQSwP.d.mts → TextArea-DOofaXJi.d.mts} +2 -2
  228. package/dist/{TextArea-CYirq-B2.mjs → TextArea-wwV-s5Oa.mjs} +2 -2
  229. package/dist/{TextArea-CYirq-B2.mjs.map → TextArea-wwV-s5Oa.mjs.map} +1 -1
  230. package/dist/TextArea.d.mts +1 -1
  231. package/dist/{TextUnderlineTooltip-DQVYsLqM.d.mts → TextUnderlineTooltip-BPLKU9wu.d.mts} +2 -2
  232. package/dist/TextUnderlineTooltip.d.mts +1 -1
  233. package/dist/Tile.d.mts +1 -1
  234. package/dist/Toast.d.mts +1 -1
  235. package/dist/{Toggle-BmUl78kH.d.mts → Toggle-2nrUX591.d.mts} +1 -1
  236. package/dist/{Toggle-CqgFNIYS.mjs → Toggle-iG2x_IZR.mjs} +4 -4
  237. package/dist/{Toggle-CqgFNIYS.mjs.map → Toggle-iG2x_IZR.mjs.map} +1 -1
  238. package/dist/Toggle.d.mts +1 -1
  239. package/dist/{Tooltip-BsuYG0fw.mjs → Tooltip-C0FuZS1C.mjs} +2 -2
  240. package/dist/{Tooltip-BsuYG0fw.mjs.map → Tooltip-C0FuZS1C.mjs.map} +1 -1
  241. package/dist/{Tooltip-eSaiYjxT.d.mts → Tooltip-Cnqf1-tx.d.mts} +2 -2
  242. package/dist/Tooltip.d.mts +1 -1
  243. package/dist/{TruncatedText-B2v53Y11.d.mts → TruncatedText-g2T5HlqX.d.mts} +1 -1
  244. package/dist/{codec-D5qlDVgU.d.mts → codec-CoX6LfOY.d.mts} +2 -2
  245. package/dist/codec.d.mts +1 -1
  246. package/dist/{color-fQTsW4gq.d.mts → color-Bt0Lv1e3.d.mts} +2 -2
  247. package/dist/components/Attribute/index.mjs +4 -4
  248. package/dist/components/Badge/index.mjs +1 -1
  249. package/dist/components/Banner/index.mjs +1 -1
  250. package/dist/components/BottomPanel/index.mjs +3 -3
  251. package/dist/components/Breadcrumbs/index.d.mts +1 -1
  252. package/dist/components/Breadcrumbs/index.mjs +1 -1
  253. package/dist/components/Button/index.d.mts +2 -2
  254. package/dist/components/Button/index.mjs +1 -1
  255. package/dist/components/ButtonGroup/index.mjs +2 -2
  256. package/dist/components/Card/index.d.mts +2 -2
  257. package/dist/components/Card/index.mjs +1 -1
  258. package/dist/components/CardV2/index.d.mts +1 -1
  259. package/dist/components/CardV2/index.mjs +1 -1
  260. package/dist/components/Checkbox/index.d.mts +1 -1
  261. package/dist/components/Checkbox/index.mjs +1 -1
  262. package/dist/components/CodeHighlight/index.mjs +3 -3
  263. package/dist/components/Combobox/index.d.mts +2 -2
  264. package/dist/components/Combobox/index.mjs +1 -1
  265. package/dist/components/ConfigFormGroup/index.mjs +2 -2
  266. package/dist/components/DataTable/TableControls/index.d.mts +19 -19
  267. package/dist/components/DataTable/TableControls/index.mjs +1 -1
  268. package/dist/components/DataTable/index.mjs +15 -15
  269. package/dist/components/DataTable/index.mjs.map +1 -1
  270. package/dist/components/DataTable/types.d.mts +2 -2
  271. package/dist/components/DatePicker/index.d.mts +6 -5
  272. package/dist/components/DatePicker/index.mjs +2 -2
  273. package/dist/components/DropdownButton/index.mjs +1 -1
  274. package/dist/components/DropdownMenu/index.d.mts +1 -1
  275. package/dist/components/DropdownMenu/index.mjs +1 -1
  276. package/dist/components/FloatingPanel/index.mjs +12 -12
  277. package/dist/components/FloatingPanel/index.mjs.map +1 -1
  278. package/dist/components/FormControl/index.d.mts +2 -2
  279. package/dist/components/FormControl/index.mjs +2 -2
  280. package/dist/components/FormField/index.d.mts +1 -1
  281. package/dist/components/FormField/index.mjs +1 -1
  282. package/dist/components/HoverCopyableField/index.mjs +1 -1
  283. package/dist/components/ImageTile/index.mjs +7 -7
  284. package/dist/components/Input/index.d.mts +1 -1
  285. package/dist/components/Input/index.mjs +1 -1
  286. package/dist/components/Link/index.mjs +2 -2
  287. package/dist/components/Link/index.mjs.map +1 -1
  288. package/dist/components/ListBox/index.d.mts +3 -3
  289. package/dist/components/ListBox/index.mjs +1 -1
  290. package/dist/components/LoadingShimmer/index.mjs +1 -1
  291. package/dist/components/MaskedInput/index.mjs +1 -1
  292. package/dist/components/Menu/index.d.mts +1 -1
  293. package/dist/components/Menu/index.mjs +1 -1
  294. package/dist/components/Modal/index.mjs +7 -69
  295. package/dist/components/Modal/index.mjs.map +1 -1
  296. package/dist/components/PageHeader/index.mjs +1 -1
  297. package/dist/components/Pagination/index.d.mts +3 -3
  298. package/dist/components/Pagination/index.mjs +1 -1
  299. package/dist/components/Pii/index.mjs +1 -1
  300. package/dist/components/Popover/index.mjs +1 -1
  301. package/dist/components/ProgressBar/index.mjs +1 -1
  302. package/dist/components/Radio/index.mjs +1 -1
  303. package/dist/components/RadioGroup/index.d.mts +1 -1
  304. package/dist/components/RadioGroup/index.mjs +1 -1
  305. package/dist/components/RightPanel/index.mjs +4 -4
  306. package/dist/components/SegmentedControl/index.d.mts +1 -1
  307. package/dist/components/SegmentedControl/index.mjs +1 -1
  308. package/dist/components/Select/index.d.mts +1 -1
  309. package/dist/components/Select/index.mjs +1 -1
  310. package/dist/components/Slider/index.mjs +2 -2
  311. package/dist/components/SmartTextInput/parser/method-chain/grammar.pegjs +219 -0
  312. package/dist/components/SmartTextInput/parser/smart-text/grammar.pegjs +154 -0
  313. package/dist/components/Spacer/index.mjs +1 -1
  314. package/dist/components/Spinner/index.mjs +1 -1
  315. package/dist/components/Stack/index.d.mts +1 -1
  316. package/dist/components/Stack/index.mjs +1 -1
  317. package/dist/components/Sticker/index.d.mts +1 -1
  318. package/dist/components/Sticker/index.mjs +1 -1
  319. package/dist/components/TabBar/index.mjs +1 -1
  320. package/dist/components/Table/index.d.mts +8 -8
  321. package/dist/components/Table/index.mjs +1 -1
  322. package/dist/components/TableBox/index.d.mts +2 -2
  323. package/dist/components/TableBox/index.mjs +1 -1
  324. package/dist/components/TechnicalSticker/index.mjs +1 -1
  325. package/dist/components/Text/index.d.mts +1 -1
  326. package/dist/components/Text/index.mjs +1 -1
  327. package/dist/components/TextArea/index.d.mts +1 -1
  328. package/dist/components/TextArea/index.mjs +1 -1
  329. package/dist/components/Tile/index.mjs +4 -4
  330. package/dist/components/Toast/index.mjs +1 -1
  331. package/dist/components/Toggle/index.d.mts +1 -1
  332. package/dist/components/Toggle/index.mjs +1 -1
  333. package/dist/components/Tooltip/index.d.mts +3 -3
  334. package/dist/components/Tooltip/index.mjs +1 -1
  335. package/dist/compound-expression.d.mts +1 -1
  336. package/dist/{constants-zZyl7QbX.d.mts → constants-D8bzZ-7B.d.mts} +1 -1
  337. package/dist/constants.d.mts +1 -1
  338. package/dist/createPath-BDYRvl57.d.mts +7 -0
  339. package/dist/createPath.d.mts +2 -0
  340. package/dist/{date-filter-DMZnJwGs.mjs → date-filter-CZeChs9T.mjs} +1 -1
  341. package/dist/{date-filter-DMZnJwGs.mjs.map → date-filter-CZeChs9T.mjs.map} +1 -1
  342. package/dist/{date-range-rule-value-zJaa_jR9.d.mts → date-range-rule-value-C3wrh0jw.d.mts} +2 -2
  343. package/dist/date-range-rule-value.d.mts +1 -1
  344. package/dist/{date-rule-intent-CdWv68my.d.mts → date-rule-intent-CC1LdkE7.d.mts} +3 -3
  345. package/dist/date-rule-intent.d.mts +1 -1
  346. package/dist/display.d.mts +1 -1
  347. package/dist/fieldPickerOptions.d.mts +2 -2
  348. package/dist/{fieldSchemaTypes-COEJOqYL.d.mts → fieldSchemaTypes-BVYSm74B.d.mts} +1 -1
  349. package/dist/{filter-size-context-DYkfYMkX.d.mts → filter-size-context-CCfFnaib.d.mts} +2 -2
  350. package/dist/filter-size-context.d.mts +1 -1
  351. package/dist/helpers.d.mts +1 -1
  352. package/dist/{index-BX8dSNcy.d.mts → index-D-RD2Kfg.d.mts} +2 -2
  353. package/dist/{index-DxIXll2Z.d.mts → index-DalP_w0c.d.mts} +2 -2
  354. package/dist/{index-BJr_obTf.d.mts → index-Nip77QqW.d.mts} +3 -3
  355. package/dist/index-bHnO4ZKt.d.mts +1 -0
  356. package/dist/index.d.mts +1 -1
  357. package/dist/index2.d.mts +1 -1
  358. package/dist/index3.d.mts +3 -3
  359. package/dist/index4.d.mts +1 -1
  360. package/dist/index5.d.mts +14 -14
  361. package/dist/{input-DN_8iHVD.d.mts → input-DCJivcWf.d.mts} +3 -3
  362. package/dist/inputFields.d.mts +10 -10
  363. package/dist/{intersperse-CRUnXmnu.mjs → intersperse-DQAyfeEw.mjs} +1 -1
  364. package/dist/{intersperse-CRUnXmnu.mjs.map → intersperse-DQAyfeEw.mjs.map} +1 -1
  365. package/dist/{jsonSchema-B1VonQij.d.mts → jsonSchema-c_EfAj8y.d.mts} +2 -2
  366. package/dist/lib/PDSProvider.d.mts +3 -1
  367. package/dist/lib/PDSProvider.mjs +6 -2
  368. package/dist/lib/PDSProvider.mjs.map +1 -1
  369. package/dist/lib/TruncatedText.d.mts +1 -1
  370. package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
  371. package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
  372. package/dist/lib/color.d.mts +1 -1
  373. package/dist/lib/date-filter/index.d.mts +2 -2
  374. package/dist/lib/date-filter/index.mjs +1 -1
  375. package/dist/lib/fieldSchemaTypes.d.mts +1 -1
  376. package/dist/lib/jsonSchema.d.mts +1 -1
  377. package/dist/lib/message.d.mts +1 -1
  378. package/dist/lib/methodChain.d.mts +1 -1
  379. package/dist/lib/objectSchemaTypes.d.mts +1 -1
  380. package/dist/lib/pseudoClass.d.mts +1 -1
  381. package/dist/lib/router/adapters/reactRouter.d.mts +9 -0
  382. package/dist/lib/router/adapters/reactRouter.mjs +26 -0
  383. package/dist/lib/router/adapters/reactRouter.mjs.map +1 -0
  384. package/dist/lib/router/adapters/tanstack.d.mts +9 -0
  385. package/dist/lib/router/adapters/tanstack.mjs +65 -0
  386. package/dist/lib/router/adapters/tanstack.mjs.map +1 -0
  387. package/dist/lib/router/index.d.mts +6 -0
  388. package/dist/lib/router/index.mjs +3 -0
  389. package/dist/lib/semanticColor.d.mts +1 -1
  390. package/dist/lib/useModalInsetRight.mjs +69 -0
  391. package/dist/lib/useModalInsetRight.mjs.map +1 -0
  392. package/dist/{message-DfEpU8lV.d.mts → message-CjIHdhX1.d.mts} +1 -1
  393. package/dist/mixins/focus.d.mts +1 -1
  394. package/dist/mixins/hoverable.d.mts +2 -2
  395. package/dist/mixins/input.d.mts +1 -1
  396. package/dist/mixins/menuItem.d.mts +2 -2
  397. package/dist/mixins/text.d.mts +1 -1
  398. package/dist/navigationEvents.d.mts +6 -0
  399. package/dist/{operators-F8X0hyQB.d.mts → operators-C4yL6qbl.d.mts} +2 -2
  400. package/dist/operators.d.mts +1 -1
  401. package/dist/{palette-BANY1Xfs.d.mts → palette-qgPRWgUN.d.mts} +3 -3
  402. package/dist/palette.d.mts +1 -1
  403. package/dist/patterns/LayoutLoadingShimmer/index.mjs +5 -5
  404. package/dist/reactRouterFallback.d.mts +11 -0
  405. package/dist/relative-date-label.d.mts +1 -1
  406. package/dist/router-7FYDW80v.mjs +112 -0
  407. package/dist/router-7FYDW80v.mjs.map +1 -0
  408. package/dist/{semantic-Dy7mTyBP.d.mts → semantic-DUctmpu_.d.mts} +1 -1
  409. package/dist/{semanticColor-DkVQjcbc.d.mts → semanticColor-IAhXS17y.d.mts} +3 -3
  410. package/dist/{text-BaQdW8qa.d.mts → text-DjTGRUM1.d.mts} +1 -1
  411. package/dist/{theme-D02MOaH6.d.mts → theme-DKiszVRN.d.mts} +3 -3
  412. package/dist/theme.d.mts +1 -1
  413. package/dist/tone.d.mts +3 -3
  414. package/dist/{types-C2s9yhgO.d.mts → types-B8aAvU2a2.d.mts} +2 -2
  415. package/dist/{types-Ok2lRZeu.d.mts → types-CcZbBH0e.d.mts} +1 -1
  416. package/dist/types-CuQSgl1F.d.mts +36 -0
  417. package/dist/{types-COeginAF.d.mts → types-D8rWSj3z.d.mts} +1 -1
  418. package/dist/{types-1_JSe9Wr.d.mts → types-I9z-0m7q.d.mts} +2 -2
  419. package/dist/{types-CtLY82w5.d.mts → types-RWjW1d9I.d.mts} +1 -1
  420. package/dist/types.d.mts +2 -2
  421. package/dist/types2.d.mts +2 -2
  422. package/dist/types3.d.mts +2 -2
  423. package/dist/types4.d.mts +2 -2
  424. package/dist/types5.d.mts +2 -2
  425. package/dist/types6.d.mts +2 -0
  426. package/dist/{url-state-DP78aDol.d.mts → url-state-BOkOTKNZ.d.mts} +2 -2
  427. package/dist/url-state.d.mts +1 -1
  428. package/dist/useComboboxFooterAction.d.mts +1 -1
  429. package/dist/{useFilterStateV2-DC2rGXHK.d.mts → useFilterStateV2-CjXG2vjy.d.mts} +3 -3
  430. package/dist/useFilterStateV2.d.mts +1 -1
  431. package/dist/{useFormField-C-K1lgmv.mjs → useFormField-C61u9KvG.mjs} +2 -2
  432. package/dist/{useFormField-C-K1lgmv.mjs.map → useFormField-C61u9KvG.mjs.map} +1 -1
  433. package/dist/{useFormField--_14te0K.d.mts → useFormField-DDbo-ExT.d.mts} +2 -2
  434. package/dist/useFormField.d.mts +1 -1
  435. package/dist/{useFormGroup-y-duFylq.mjs → useFormGroup-C89-oI4w.mjs} +1 -1
  436. package/dist/{useFormGroup-y-duFylq.mjs.map → useFormGroup-C89-oI4w.mjs.map} +1 -1
  437. package/dist/useLocationPathname-K2N4fw8j.d.mts +5 -0
  438. package/dist/useLocationPathname.d.mts +2 -0
  439. package/dist/{useTableBoxDragAndDrop-DkCxC7Mi.d.mts → useTableBoxDragAndDrop-CbbH3pMK.d.mts} +1 -1
  440. package/dist/useTableBoxDragAndDrop.d.mts +1 -1
  441. package/dist/{useToggle-0zLL1E7s.mjs → useToggle-DUHQjohK.mjs} +1 -1
  442. package/dist/{useToggle-0zLL1E7s.mjs.map → useToggle-DUHQjohK.mjs.map} +1 -1
  443. package/dist/useTruncation.d.mts +1 -1
  444. package/dist/{utilities-C1hOxjt_.d.mts → utilities-D0EhDri-.d.mts} +1 -1
  445. package/dist/utilities.d.mts +1 -1
  446. package/dist/utils/storybook.mjs +1 -1
  447. package/dist/utils/testing.d.mts +2 -0
  448. package/dist/utils/testing.mjs +10 -6
  449. package/dist/utils/testing.mjs.map +1 -1
  450. package/dist/utils.d.mts +1 -1
  451. package/dist/{validation-CpDsI-TM.d.mts → validation-C07D6XjI.d.mts} +3 -3
  452. package/dist/validation.d.mts +1 -1
  453. package/dist/{value-control-resolver-DhaqxKmK.d.mts → value-control-resolver-zYNPNlRW.d.mts} +2 -2
  454. package/dist/value-control-resolver.d.mts +1 -1
  455. package/dist/variables/effect.d.mts +1 -1
  456. package/dist/variables/semantic.d.mts +1 -1
  457. package/llms.txt +2 -1
  458. package/package.json +16 -3
  459. package/skills/design-system-component-authoring/SKILL.md +79 -0
  460. package/skills/design-system-component-authoring/clarifying-scope.md +18 -0
  461. package/skills/design-system-component-authoring/component-conventions.md +70 -0
  462. package/skills/design-system-component-authoring/prop-interface-patterns.md +30 -0
  463. package/skills/ui-authoring/SKILL.md +28 -0
  464. package/dist/Breadcrumbs-ClKHNIr-.mjs.map +0 -1
  465. package/dist/IconButton-CnJNIJVQ.mjs.map +0 -1
  466. /package/dist/{index-1-AkepUA.d.mts → index-B33elXxm.d.mts} +0 -0
  467. /package/dist/{index-7rWKHdox.d.mts → index-BwAfCVZH2.d.mts} +0 -0
  468. /package/dist/{index-BFnNtGdX.d.mts → index-C6HcjJiY.d.mts} +0 -0
  469. /package/dist/{index-BPiqSRRl.d.mts → index-CRo77wc3.d.mts} +0 -0
  470. /package/dist/{index-BSVhZrWN.d.mts → index-CX869wwk.d.mts} +0 -0
  471. /package/dist/{index-BYd3Btr1.d.mts → index-CjDodOH2.d.mts} +0 -0
  472. /package/dist/{index-CMuRFTR3.d.mts → index-CoUVmp_Q.d.mts} +0 -0
  473. /package/dist/{index-Ci-uuV07.d.mts → index-CsuikFeJ.d.mts} +0 -0
  474. /package/dist/{index-CknANNvQ2.d.mts → index-CzItj62a.d.mts} +0 -0
  475. /package/dist/{index-CtJuGxUp.d.mts → index-D13oYj4_.d.mts} +0 -0
  476. /package/dist/{index-CuheJfs-.d.mts → index-D4DUvwPf.d.mts} +0 -0
  477. /package/dist/{index-DWfPppPU.d.mts → index-DMRtRo7y.d.mts} +0 -0
  478. /package/dist/{index-DYX_PQ7T2.d.mts → index-DXJd7-2Z.d.mts} +0 -0
  479. /package/dist/{index-De7MV8-j.d.mts → index-DeVKzGce.d.mts} +0 -0
  480. /package/dist/{index-N-OgGgfF.d.mts → index-Dflz2i1X.d.mts} +0 -0
  481. /package/dist/{index-VWno75SQ.d.mts → index-DkrC-i1D.d.mts} +0 -0
  482. /package/dist/{index-hcx6LMSC.d.mts → index-DztUdPP_.d.mts} +0 -0
  483. /package/dist/{index-uY8Qbwfx.d.mts → index-Rvd9MEUQ.d.mts} +0 -0
  484. /package/dist/{useModalInsetRight.d.mts → lib/useModalInsetRight.d.mts} +0 -0
@@ -0,0 +1,70 @@
1
+ # Component conventions (compose, tokens, structure, a11y, docs)
2
+
3
+ ## Compose, don't recreate
4
+
5
+ - Build from existing DS components — `Button`/`IconButton`, `Link`, `Input`, `Stack`/`HStack`,
6
+ `Text` (`Heading`/`Paragraph`/`Label`), `Tooltip`, `Spinner`, `Sticker`, etc. Check the
7
+ `ui-authoring` component catalog (`COMPONENTS.md`, `PATTERNS.md`) and
8
+ `packages/design-system/components/` before writing anything custom.
9
+ - **Use each component directly and keep its built-in styles.** Never copy/paste a DS component's
10
+ CSS into a `styled.div`. Wrapping a DS component with `styled(Component)` for _layout/positioning_
11
+ tweaks (margin, width, alignment) is fine, and adjusting a state with a _semantic token_ (e.g. `theme.color.text.tertiary`) is acceptable — but don't hardcode colors or arbitrarily change a component's visual identity. If the design truly needs a different look, that's a question for the designer/engineer, not a silent restyle.
12
+ - Replace raw flex wrappers with `Stack`/`HStack`. Do not re-implement `display: flex; gap` that
13
+ `HStack` already provides.
14
+ - Reach for a semantic HTML element (`nav`, `ul`/`li`, `button`) only when **no** DS component
15
+ covers the need.
16
+
17
+ ## Style with tokens
18
+
19
+ - All CSS values come from design tokens (see `ui-authoring`). No hardcoded hex or px.
20
+ - **Prefer semantic tokens over foundational ones:** `theme.color.text.tertiary` /
21
+ `Color.TextPrimary` over `Color.CorePurple500`. Foundational `Core*` colors are a last resort and
22
+ need a comment.
23
+ - Consolidate nested styled elements — every wrapper must earn its place.
24
+
25
+ ## File structure
26
+
27
+ ```
28
+ packages/design-system/components/ComponentName/
29
+ ├── ComponentName.tsx # public component (+ a private child .tsx if using an items array)
30
+ ├── index.ts # barrel export
31
+ ├── ComponentName.stories.tsx # stories per variant/state
32
+ ├── ComponentName.spec.tsx # tests
33
+ └── ComponentName.mdx # docs
34
+ ```
35
+
36
+ - **Name files/exports for what they are.** Name a plural + singular pair `Breadcrumbs` +
37
+ `Breadcrumb` (each file exports the component of its own name), not `Breadcrumbs` +
38
+ `BreadcrumbSingle`. When the singular is a constrained-items child, keep it a _private_ child —
39
+ don't barrel-export it.
40
+ - `index.ts` re-exports the public component (default + named) and its public types only, not
41
+ private children. See `Breadcrumbs/index.ts`: it exports `Breadcrumbs` and the item/size types,
42
+ but not the private `Breadcrumb`.
43
+ - Extract self-contained logic (clipboard, inline-edit lifecycle, debouncing) into a `useX` hook so
44
+ the component file stays focused on presentation and structure.
45
+ - **Don't over-engineer.** Do not add a context provider just to thread a `size`/`variant` — pass it
46
+ as a prop. Context is for genuinely cross-cutting state shared across deeply nested descendants.
47
+
48
+ ## Accessibility
49
+
50
+ Use proper roles/landmarks and aria affordances: `aria-label`, `aria-current`, `aria-busy`,
51
+ `aria-hidden` on decorative elements, and label association for inputs. Manage focus for interactive
52
+ widgets. Stories should set `parameters: { a11y: { test: 'error' } }`, and tests should target
53
+ accessible roles/labels (avoid `data-testid`).
54
+
55
+ ## Document in Storybook
56
+
57
+ Add `ComponentName.mdx` alongside the stories:
58
+
59
+ ```tsx
60
+ import { Canvas, Controls, Meta } from '@storybook/addon-docs/blocks';
61
+ import * as stories from './ComponentName.stories';
62
+
63
+ <Meta of={stories} />
64
+
65
+ <Canvas of={stories.Playground} />
66
+ <Controls of={stories.Playground} />
67
+ ```
68
+
69
+ Keep MDX prose readable and follow the repository's Storybook conventions for titles and Chromatic
70
+ settings.
@@ -0,0 +1,30 @@
1
+ # Prop interface patterns
2
+
3
+ The props ARE the contract. Make incorrect usage impossible to express.
4
+
5
+ | Rule | Instead of | Prefer |
6
+ | ------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
7
+ | Callback implies capability | `editable: boolean; onEdit: () => void` | `onEdit?: (v: string) => void` — editability = `onEdit != null` |
8
+ | Make impossible states unrepresentable | `loading?: boolean; data?: Data` (both can be set) | one discriminated field: `state: { kind: 'loading' } \| { kind: 'ready'; data: Data }`, or derive loading from `data == null` |
9
+ | Boolean over a 2-value union | `variant: 'default' \| 'compact'` | `compact?: boolean` — use a string union only for **3+** real, mutually-exclusive variants |
10
+ | Text is a string | `title: ReactNode` | `title: string` (+ optional `icon?: IconType` if it needs one). Two typed props beat an arbitrary node |
11
+ | Props are the interface | a parallel `interface FooState` layered on `interface FooProps` | let the props type be the interface. One item-shape type for an array (like `BreadcrumbsItemProps`) is fine; a redundant second interface is not |
12
+ | Constrain content when callers shouldn't style it | `children: ReactNode` | `items: ItemProps[]` rendered by a private child component. Use `children` only for genuinely open containers |
13
+ | Right owner for each piece of state | everything internal, or everything external | caller owns meaningful data (`value`/`onChange`); component keeps transient UI state (`isOpen`, `isEditing`) internal |
14
+
15
+ **Impossible-states rule of thumb:** if two optional props describe the same thing at different
16
+ times (loading vs loaded data, error vs value), collapse them so only one can exist at a time.
17
+
18
+ ## Common rationalizations
19
+
20
+ | Rationalization | Reality |
21
+ | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
22
+ | "I'll add `editable` for clarity even though `onEdit` exists" | Redundant state that can contradict itself. Presence of `onEdit` _is_ editability. |
23
+ | "Separate optional `loading` and `data` is flexible" | It lets callers represent impossible states. Model one-or-the-other. |
24
+ | "A `variant` union is more extensible than a boolean" | Two-value unions add ceremony now for a third case that may never come. Boolean until there are 3+ real variants. |
25
+ | "A `ReactNode` title is more flexible" | It invites arbitrary markup you can't style or constrain. `string` (+ optional `icon`) covers the real need. |
26
+ | "`children` lets designers compose freely" | For DS components that usually means inconsistent, unstyleable content. Prefer a typed `items[]` + private child unless it's truly an open container. |
27
+ | "I'll add `fullWidth`/`className` while I'm here" | Unrequested API surface. Ask first. |
28
+ | "Some list items are probably not editable" | Don't invent constraints. Assume uniform behavior or ask the designer. |
29
+ | "A context provider is cleaner for size" | Overkill for one value. Pass the prop. |
30
+ | "I'll copy the Button styles so it matches" | Duplicated styles drift. Use `Button` directly and keep its styles. |
@@ -97,6 +97,34 @@ if (isLoading) return <Stack align="center" spacing={Spacing[3]}><Spinner srText
97
97
 
98
98
  Never: `isLoading && <div>Loading...</div>` — always use `<Spinner>` or the `loading` prop.
99
99
 
100
+ ## Routing
101
+
102
+ PDS link-capable components (`Link`, `Button to=`, `Breadcrumbs` `href`, `DataTable` row links) are
103
+ router-agnostic. Internally they render `RouterLink` from
104
+ `@persona/design-system/lib/router`, which resolves in this order: PDS `RouterProvider` adapter
105
+ (`linkComponent` > `navigate`/`useHref`), then react-router `<Link>` when inside a react-router
106
+ context (backwards compatible — existing apps need no changes), then a plain `<a>` (never throws
107
+ outside a router). External `https://` URLs always render plain anchors. `react-router-dom`
108
+ remains a required install for now — the auto-detect fallback imports it statically. `Link` and
109
+ `RouterLink` accept `reloadDocument` to force full document navigation (skip client routing).
110
+
111
+ Plug in your router once near the root:
112
+
113
+ ```tsx
114
+ // react-router — auto-detected, but an explicit adapter is also available:
115
+ <PDSProvider router={useReactRouterAdapter()}>...</PDSProvider>
116
+
117
+ // TanStack Router — required; there is no auto-detection fallback:
118
+ <TanStackRouterAdapter>...</TanStackRouterAdapter> // from '@persona/design-system/lib/router/adapters/tanstack'
119
+
120
+ // Any other router — pass your own RouterAdapter:
121
+ <PDSProvider router={{ navigate, useHref, useLocation }}>...</PDSProvider>
122
+ ```
123
+
124
+ `ReactRouterAdapter` lives at `@persona/design-system/lib/router/adapters/reactRouter`;
125
+ both adapters only need their router's context above them. The TanStack adapter requires
126
+ React 18+ (TanStack Router's peer range), while PDS itself still supports React 17.
127
+
100
128
  ## Testing
101
129
 
102
130
  - Prefer `getByRole`, `getByLabelText`, `getByText` over `getByTestId`.
@@ -1 +0,0 @@
1
- {"version":3,"file":"Breadcrumbs-ClKHNIr-.mjs","names":["Input"],"sources":["../components/Breadcrumbs/Breadcrumb.tsx","../components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { type ChangeEvent, useEffect, useRef, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport { CopyIcon, EditIcon } from '@persona/icons';\nimport { IconButton } from 'design-system/components/Button';\nimport Input from 'design-system/components/Input';\nimport { HStack } from 'design-system/components/Stack';\nimport TechnicalSticker from 'design-system/components/TechnicalSticker';\nimport { Paragraph } from 'design-system/components/Text';\nimport Tooltip from 'design-system/components/Tooltip';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { focusOutline } from 'design-system/mixins/focus';\nimport { paragraphMixins } from 'design-system/mixins/text';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\nexport type BreadcrumbSize = 'md' | 'lg';\n\nexport type BreadcrumbHeadingAs = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nconst COPY_TOOLTIP_LABEL = 'Copy ID';\nconst COPIED_TOOLTIP_LABEL = 'Copied!';\nconst DEFAULT_EDIT_MAX_LENGTH = 100;\nconst COPY_TOOLTIP_STICKER_MAX_WIDTH = '96px';\nconst COPY_TOOLTIP_STICKER_TOOLTIP_MAX_WIDTH = '250px';\n\nexport type BreadcrumbProps = {\n label: string;\n size?: BreadcrumbSize;\n current?: boolean;\n /**\n * Overrides the heading element rendered for the current crumb. Defaults to `h1`; use `h2` or\n * lower when the page already has an `h1`.\n */\n headingAs?: BreadcrumbHeadingAs;\n showCopyAction?: boolean;\n copyValue?: string;\n copyTooltipLabel?: string;\n /** Copy tooltip text shown after a successful copy. Defaults to `Copied!`. */\n copiedTooltipLabel?: string;\n /**\n * Appends `copyValue` to both copy tooltip texts as a `TechnicalSticker`, so the tooltip shows\n * which token is being copied.\n */\n showCopyValueInTooltip?: boolean;\n /** Internal dashboard path (e.g. `/cases`). Passed to the router `Link` as `to`. */\n href?: string;\n /**\n * Activates a non-current crumb without a route change, for trails that navigate in-place (e.g.\n * a control panel drilling into a sub-panel). Ignored when `href` is set.\n */\n onClick?: () => void;\n onEdit?: (newLabel: string) => void;\n editMaxLength?: number;\n onCopy?: () => void;\n};\n\nconst LABEL_ACTION_GAP = Spacing[2];\nconst ACTION_BUTTON_GAP = Spacing[1];\n\nconst CrumbRow = styled(HStack)`\n align-items: center;\n min-width: 0;\n`;\n\nconst crumbLayoutStyles = (size: BreadcrumbSize) => css`\n display: inline-flex;\n align-items: center;\n min-width: 0;\n min-height: ${({ theme }) => theme.element.height.xs};\n ${\n size === 'lg'\n ? css`\n font-size: ${({ theme }) => theme.text.paragraph.lg.fontSize};\n line-height: ${({ theme }) => theme.text.paragraph.lg.lineHeight};\n `\n : css``\n };\n`;\n\nconst editInputTextStyles = (size: BreadcrumbSize, current: boolean) => {\n if (current) {\n return size === 'lg' ? paragraphMixins.lgBold : paragraphMixins.mdBold;\n }\n return size === 'lg' ? paragraphMixins.lg : paragraphMixins.md;\n};\n\nconst ancestorCrumbStyles = css<{ $size: BreadcrumbSize }>`\n ${paragraphMixins.md};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', theme.color.text.secondary)};\n text-decoration: none;\n transition: color ${TransitionDuration.ExtraFast} ease-out;\n ${focusOutline}\n ${({ $size }) => crumbLayoutStyles($size)}\n\n &:hover {\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n }\n`;\n\nconst AncestorNavLink = styled(Link)<{ $size: BreadcrumbSize }>`\n ${ancestorCrumbStyles}\n`;\n\nconst AncestorNavButton = styled.button<{ $size: BreadcrumbSize }>`\n ${ancestorCrumbStyles}\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n`;\n\nconst InlineEditInput = styled(Input)<{\n $size: BreadcrumbSize;\n $current: boolean;\n $editMinWidth?: number;\n}>`\n margin: 0;\n padding: 2px 10px;\n width: auto;\n max-width: 100%;\n min-width: ${({ $editMinWidth }) => ($editMinWidth != null ? `${$editMinWidth}px` : '0')};\n field-sizing: content;\n display: inline-block;\n ${({ $size, $current }) => editInputTextStyles($size, $current)};\n background-color: ${({ theme }) => semanticColor(theme, 'SurfacePrimary', theme.color.background.primary)};\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n\n &:not(:focus) {\n border-color: transparent;\n }\n\n &:hover:not(:disabled) {\n border-style: solid;\n }\n`;\n\nconst CurrentLabel = styled(Paragraph)<{ $size: BreadcrumbSize }>`\n margin: 0;\n ${({ $size }) => crumbLayoutStyles($size)}\n`;\n\nconst copyToClipboard = async (value: string): Promise<boolean> => {\n try {\n if (navigator.clipboard?.writeText == null) {\n return false;\n }\n\n await navigator.clipboard.writeText(value);\n return true;\n } catch {\n return false;\n }\n};\n\nconst BreadcrumbCopyButton = ({\n copyValue,\n copyTooltipLabel = COPY_TOOLTIP_LABEL,\n copiedTooltipLabel = COPIED_TOOLTIP_LABEL,\n showCopyValueInTooltip = false,\n onCopy,\n}: {\n copyValue: string;\n copyTooltipLabel?: string;\n copiedTooltipLabel?: string;\n showCopyValueInTooltip?: boolean;\n onCopy?: () => void;\n}) => {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n const success = await copyToClipboard(copyValue);\n if (!success) {\n return;\n }\n\n setCopied(true);\n setTooltipOpen(true);\n onCopy?.();\n\n window.setTimeout(() => {\n setTooltipOpen(false);\n window.setTimeout(() => setCopied(false), 200);\n }, 1000);\n };\n\n const handleMouseEnter = () => {\n if (!copied) {\n setTooltipOpen(true);\n }\n };\n\n const handleMouseLeave = () => {\n if (!copied) {\n setTooltipOpen(false);\n }\n };\n\n const trigger = (\n <span onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <IconButton\n type='button'\n size='sm'\n aria-label={`Copy ${copyValue}`}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void handleCopy();\n }}\n >\n <CopyIcon />\n </IconButton>\n </span>\n );\n\n const tooltipLabel = copied ? copiedTooltipLabel : copyTooltipLabel;\n\n return (\n <Tooltip\n trigger={trigger}\n open={tooltipOpen}\n side='top'\n sideOffset={4}\n size='sm'\n contentAlignment='center'\n interactive={false}\n hideArrow\n portal={false}\n maxWidth={showCopyValueInTooltip ? COPY_TOOLTIP_STICKER_TOOLTIP_MAX_WIDTH : undefined}\n >\n {showCopyValueInTooltip ? (\n <HStack spacing={ACTION_BUTTON_GAP} align='center'>\n <span>{tooltipLabel}</span>\n <TechnicalSticker copyable={false} maxWidth={COPY_TOOLTIP_STICKER_MAX_WIDTH}>\n {copyValue}\n </TechnicalSticker>\n </HStack>\n ) : (\n tooltipLabel\n )}\n </Tooltip>\n );\n};\n\nconst Breadcrumb = ({\n label,\n size = 'md',\n current = false,\n headingAs = 'h1',\n showCopyAction = false,\n copyValue,\n copyTooltipLabel,\n copiedTooltipLabel,\n showCopyValueInTooltip,\n href,\n onClick,\n onEdit,\n editMaxLength = DEFAULT_EDIT_MAX_LENGTH,\n onCopy,\n}: BreadcrumbProps) => {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(label);\n const [editMinWidth, setEditMinWidth] = useState<number | undefined>();\n const editInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!isEditing) {\n setEditValue(label);\n }\n }, [isEditing, label]);\n\n useEffect(() => {\n if (!isEditing) {\n setEditMinWidth(undefined);\n return;\n }\n\n const input = editInputRef.current;\n if (input == null) {\n return;\n }\n\n setEditMinWidth(input.offsetWidth);\n input.focus();\n input.select();\n }, [isEditing]);\n\n const commitEdit = () => {\n if (!isEditing) {\n return;\n }\n\n setIsEditing(false);\n if (editValue !== label) {\n onEdit?.(editValue);\n }\n };\n\n const inlineActions = !isEditing && (showCopyAction || onEdit) && (\n <HStack spacing={ACTION_BUTTON_GAP} align='center'>\n {onEdit && (\n <IconButton\n type='button'\n size='sm'\n aria-label={`Edit ${label}`}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setIsEditing(true);\n }}\n >\n <EditIcon />\n </IconButton>\n )}\n {showCopyAction && copyValue != null && (\n <BreadcrumbCopyButton\n copyValue={copyValue}\n copyTooltipLabel={copyTooltipLabel}\n copiedTooltipLabel={copiedTooltipLabel}\n showCopyValueInTooltip={showCopyValueInTooltip}\n onCopy={onCopy}\n />\n )}\n </HStack>\n );\n\n if (isEditing) {\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <InlineEditInput\n ref={editInputRef}\n $size={size}\n $current={current}\n $editMinWidth={editMinWidth}\n size='md'\n aria-label={`Edit ${label}`}\n maxLength={editMaxLength}\n value={editValue}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setEditValue(event.target.value)}\n onBlur={commitEdit}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n commitEdit();\n }\n if (event.key === 'Escape') {\n setEditValue(label);\n setIsEditing(false);\n }\n }}\n />\n </CrumbRow>\n );\n }\n\n if (current) {\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <CurrentLabel\n $size={size}\n size={size === 'lg' ? 'lg' : 'md'}\n weight='bold'\n color='primary'\n as={headingAs}\n >\n {label}\n </CurrentLabel>\n {inlineActions}\n </CrumbRow>\n );\n }\n\n if (href == null && onClick != null) {\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <AncestorNavButton type='button' onClick={onClick} $size={size}>\n {label}\n </AncestorNavButton>\n {inlineActions}\n </CrumbRow>\n );\n }\n\n return (\n <CrumbRow spacing={LABEL_ACTION_GAP}>\n <AncestorNavLink to={href ?? ''} $size={size}>\n {label}\n </AncestorNavLink>\n {inlineActions}\n </CrumbRow>\n );\n};\n\nexport default Breadcrumb;\n","import styled from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\nimport { intersperse } from 'design-system/lib/intersperse';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { paragraphMixins } from 'design-system/mixins/text';\n\nimport Breadcrumb, {\n type BreadcrumbHeadingAs,\n type BreadcrumbProps,\n type BreadcrumbSize,\n} from './Breadcrumb';\n\nexport type BreadcrumbsItemProps = Omit<BreadcrumbProps, 'size' | 'current' | 'headingAs'>;\n\nexport type BreadcrumbsProps = {\n items: BreadcrumbsItemProps[];\n size?: BreadcrumbSize;\n /**\n * Overrides the heading element rendered for the current crumb. Defaults to `h1`; use `h2` or\n * lower when the page already has an `h1`.\n */\n headingAs?: BreadcrumbHeadingAs;\n 'aria-label'?: string;\n className?: string;\n};\n\nconst BreadcrumbList = styled.ol`\n max-width: 100%;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n list-style: none;\n margin: 0;\n padding: 0;\n min-width: 0;\n`;\n\nconst BreadcrumbListItem = styled.li`\n display: flex;\n align-items: center;\n min-width: 0;\n`;\n\nconst Separator = styled.span<{ $size: BreadcrumbSize }>`\n padding: 0 ${Spacing[2]};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', theme.color.text.tertiary)};\n user-select: none;\n ${({ $size }) => ($size === 'lg' ? paragraphMixins.lg : paragraphMixins.md)};\n`;\n\nexport const Breadcrumbs = ({\n items,\n size = 'md',\n headingAs = 'h1',\n 'aria-label': ariaLabel = 'Breadcrumbs',\n className,\n}: BreadcrumbsProps) => {\n if (items.length === 0) {\n return null;\n }\n\n const crumbNodes = items.map((item, index) => {\n const isCurrent = index === items.length - 1;\n\n return (\n <BreadcrumbListItem\n key={`${item.label}-${index}`}\n aria-current={isCurrent ? 'page' : undefined}\n >\n <Breadcrumb {...item} size={size} current={isCurrent} headingAs={headingAs} />\n </BreadcrumbListItem>\n );\n });\n\n const listItems = intersperse(crumbNodes, (separatorIndex: number) => (\n <BreadcrumbListItem key={`separator-${separatorIndex}`} aria-hidden='true'>\n <Separator $size={size}>/</Separator>\n </BreadcrumbListItem>\n ));\n\n return (\n <nav aria-label={ariaLabel} className={className}>\n <BreadcrumbList>{listItems}</BreadcrumbList>\n </nav>\n );\n};\n\nexport default Breadcrumbs;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"IconButton-CnJNIJVQ.mjs","names":["noop"],"sources":["../components/Button/palette.ts","../components/Button/Button.tsx","../components/Button/IconButton.tsx"],"sourcesContent":["import type { Color } from '@persona/design-tokens';\nimport { type PdsColor, transparent, withAlpha } from 'design-system/lib/color';\nimport { semanticTokens } from 'design-system/lib/semanticColor';\nimport type { PersonaTheme } from 'design-system/theme';\nimport type { SemanticTokens } from 'design-system/variables/semantic';\n\nexport type ButtonVariant = 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n\nexport interface ButtonPalette {\n default: PdsColor;\n hover: Color;\n active: Color;\n disabled: PdsColor;\n text: Color;\n textDisabled: PdsColor;\n /** Set only under semantic theming; legacy leaves disabled icon colour to the stroke rules. */\n iconDisabled?: PdsColor;\n highlightDark: Color;\n}\n\nconst buildSemanticPalettes = (tokens: SemanticTokens): Record<ButtonVariant, ButtonPalette> => {\n const neutral = {\n hover: tokens.ActionNeutralHover,\n active: tokens.ActionNeutralActive,\n text: tokens.FgPrimary,\n textDisabled: tokens.FgDisabled,\n iconDisabled: tokens.FgDisabled,\n highlightDark: tokens.FgDisabled,\n };\n return {\n basic: {\n ...neutral,\n default: tokens.ActionNeutral,\n disabled: withAlpha(tokens.ActionNeutral, tokens.Opacity65),\n },\n text: { ...neutral, default: transparent, disabled: transparent },\n outline: {\n ...neutral,\n default: transparent,\n hover: tokens.ActionOutlineHover,\n active: tokens.ActionOutlineActive,\n disabled: transparent,\n },\n primary: {\n default: tokens.ActionPrimary,\n hover: tokens.ActionPrimaryHover,\n active: tokens.ActionPrimaryActive,\n disabled: tokens.ActionPrimary,\n text: tokens.FgInverse,\n textDisabled: tokens.FgInverse,\n iconDisabled: tokens.FgInverse,\n highlightDark: tokens.FgInverse,\n },\n danger: {\n default: tokens.ActionDanger,\n hover: tokens.ActionDangerHover,\n active: tokens.ActionDangerActive,\n disabled: tokens.ActionDanger,\n text: tokens.FgInverse,\n textDisabled: tokens.FgInverse,\n iconDisabled: tokens.FgInverse,\n highlightDark: tokens.FgInverse,\n },\n inverse: {\n default: tokens.ActionInverse,\n hover: tokens.ActionInverseHover,\n active: tokens.ActionInverseActive,\n disabled: withAlpha(tokens.ActionInverse, tokens.Opacity65),\n text: tokens.FgPrimaryStatic,\n textDisabled: withAlpha(tokens.FgPrimaryStatic, tokens.Opacity65),\n iconDisabled: withAlpha(tokens.FgPrimaryStatic, tokens.Opacity65),\n highlightDark: tokens.ActionNeutralActive,\n },\n };\n};\n\nconst semanticPaletteCache = new WeakMap<SemanticTokens, Record<ButtonVariant, ButtonPalette>>();\n\nconst semanticPalettes = (tokens: SemanticTokens): Record<ButtonVariant, ButtonPalette> => {\n let palettes = semanticPaletteCache.get(tokens);\n if (!palettes) {\n palettes = buildSemanticPalettes(tokens);\n semanticPaletteCache.set(tokens, palettes);\n }\n return palettes;\n};\n\nexport const buttonPalette = (theme: PersonaTheme, variant: ButtonVariant): ButtonPalette => {\n const tokens = semanticTokens(theme);\n return tokens ? semanticPalettes(tokens)[variant] : theme.color.variants[variant];\n};\n","import { isEmpty, isFunction } from 'lodash-es';\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MouseEvent,\n type ReactNode,\n type Ref,\n useCallback,\n} from 'react';\nimport { Link, type LinkProps } from 'react-router-dom';\nimport styled, {\n css,\n type DefaultTheme,\n type FlattenInterpolation,\n type ThemeProps,\n} from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { LoaderIcon } from '@persona/icons';\nimport { opacityOf, withAlpha } from 'design-system/lib/color';\nimport { isDisabled, isHovered, isNotDisabled } from 'design-system/lib/pseudoClass';\nimport { semanticColor, semanticOnly, semanticTokens } from 'design-system/lib/semanticColor';\nimport useToggle from 'design-system/lib/useToggle';\nimport { focusOutlineControlled } from 'design-system/mixins/focus';\nimport { printMixins } from 'design-system/mixins/print';\nimport { paragraphMixins } from 'design-system/mixins/text';\nimport type PseudoClassProps from 'design-system/types/PseudoClassProps';\nimport { rotate } from 'design-system/variables/keyframes';\nimport { TransitionDuration } from 'design-system/variables/transitions';\n\nimport { type ButtonVariant, buttonPalette } from './palette';\n\nconst noop = (): void => undefined;\n\n// TODO(joseph): Bring this fix back to pseudoClass\nconst isActive = ({ active }: PseudoClassProps) => (active ? '' : ':active:enabled');\n\n/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\nconst sizeStyles: Record<ButtonProps['size'], FlattenInterpolation<ThemeProps<DefaultTheme>>> = {\n md: css`\n ${paragraphMixins.md}\n height: ${({ theme }) => theme.button.height.md};\n padding: ${Spacing[2]};\n svg {\n height: 16px;\n width: 16px;\n }\n `,\n sm: css`\n ${paragraphMixins.sm}\n height: ${({ theme }) => theme.button.height.sm};\n padding: ${Spacing[1]} 6px;\n svg {\n height: 16px;\n width: 16px;\n }\n `,\n};\n\n/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\nconst widthStyles: Record<ButtonProps['width'], FlattenInterpolation<ThemeProps<DefaultTheme>>> = {\n full: css`\n width: 100%;\n `,\n auto: css`\n width: auto;\n `,\n // TODO: rename this prop to 'element' as a standard unresponsive element width\n button: css`\n width: ${({ theme }) => theme.element.width.md};\n `,\n icon: css<ButtonProps>`\n width: ${({ theme, size }) => {\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n return theme.button.height[size];\n }};\n padding: 0;\n flex: none;\n `,\n};\n\ninterface ButtonPropsWithTransientProps extends Omit<ButtonProps, 'isPending'> {\n $isPending: boolean;\n $onSecondaryBackground?: boolean;\n}\n\nexport const StyledButton = styled.button.attrs<ButtonPropsWithTransientProps>(({ to, target }) => {\n if (isEmpty(to)) {\n return 'button';\n } else if (typeof to === 'string' && to.startsWith('https://')) {\n return {\n as: 'a',\n href: to,\n target: target ?? '_blank',\n rel: 'noreferrer',\n };\n } else {\n return {\n as: Link,\n };\n }\n})<ButtonPropsWithTransientProps>`\n cursor: pointer;\n border: none;\n box-sizing: border-box;\n white-space: nowrap;\n ${({ theme, variant = 'primary' }) => {\n const palette = buttonPalette(theme, variant);\n const tokens = semanticTokens(theme);\n return css`\n &:disabled {\n background-color: ${palette.disabled};\n color: ${palette.textDisabled};\n ${\n tokens &&\n (variant === 'primary' || variant === 'danger') &&\n css`\n opacity: ${opacityOf(tokens.Opacity65)};\n `\n }\n ${\n palette.iconDisabled &&\n css`\n svg {\n color: ${palette.iconDisabled};\n }\n `\n }\n svg path {\n stroke: ${palette.iconDisabled ?? palette.textDisabled};\n }\n\n /* For backwards compatibility with current coloring scheme (targeting stroke property) */\n svg.pds-icon {\n path {\n stroke: unset;\n }\n\n /* Support icons with stroke */\n path[stroke] {\n stroke: currentColor;\n }\n }\n\n user-select: none;\n }\n `;\n }}\n\n ${({ theme, variant }) =>\n variant === 'outline' &&\n css`\n border: 1px solid ${semanticColor(theme, 'BorderDefault', theme.color.border.input)};\n `}\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n /* To properly position loading spinner */\n position: relative;\n\n border-radius: ${({ theme }) => theme.button.borderRadius};\n\n transition-duration: ${TransitionDuration.Fast};\n transition-property: background-color, color, border-color, width, height;\n\n ${({ size }) => {\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n return sizeStyles[size];\n }}\n ${({ width }) => {\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n return widthStyles[width];\n }}\n\n /* Variant styling */\n ${({ theme, variant = 'primary', $isPending, $onSecondaryBackground }) => {\n let palette = buttonPalette(theme, variant);\n\n if (variant === 'basic' && $onSecondaryBackground) {\n const tokens = semanticTokens(theme);\n palette = tokens\n ? {\n ...palette,\n default: tokens.ActionNeutralHover,\n hover: tokens.ActionNeutralActive,\n active: tokens.ActionNeutralActive,\n disabled: withAlpha(tokens.ActionNeutralHover, tokens.Opacity65),\n }\n : {\n ...palette,\n default: Color.CoreSlate300,\n hover: Color.CoreSlate400,\n active: Color.CoreSlate400,\n disabled: Color.CoreSlate100,\n };\n }\n\n return css`\n background-color: ${palette.default};\n color: ${palette.text};\n svg path {\n stroke: ${palette.text};\n }\n\n svg.pds-icon {\n path {\n stroke: unset;\n }\n\n path[stroke] {\n stroke: currentColor;\n }\n }\n\n &${isHovered}${isNotDisabled} {\n background-color: ${palette.hover};\n }\n\n &${isDisabled} {\n cursor: not-allowed;\n }\n\n &${isActive} {\n background-color: ${palette.active};\n }\n\n ${focusOutlineControlled}\n\n ${\n $isPending &&\n css`\n cursor: default;\n background-color: ${palette.active};\n &:disabled {\n background-color: ${buttonPalette(theme, variant).active};\n user-select: none;\n ${semanticOnly(() => 'opacity: 1;')}\n }\n\n svg path {\n stroke: ${palette.highlightDark};\n }\n\n // For backwards compatibility with current coloring scheme (targeting stroke property)\n svg.pds-icon {\n path {\n stroke: unset;\n }\n\n path[stroke] {\n stroke: currentColor;\n }\n }\n `\n }\n `;\n }}\n\n\n ${printMixins.hide}\n`;\n\ntype WithPendingProps = Pick<ButtonProps, 'isPending'>;\n\nconst LoaderContainer = styled.div<WithPendingProps>`\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 2s;\n opacity: ${({ isPending }) => (isPending ? '1' : '0')};\n`;\n\nconst Loader = styled(LoaderIcon)`\n animation: ${rotate} linear 1s infinite;\n`;\n\nexport const ButtonChildren = styled('div').attrs(({ isPending }: WithPendingProps) => ({\n ['aria-hidden']: isPending,\n}))<WithPendingProps>`\n width: 100%;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: center;\n transition: opacity ${TransitionDuration.Fast};\n opacity: ${({ isPending }) => (isPending ? '0' : '1')};\n gap: ${Spacing[1]};\n`;\n\nconst PrefixIconContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst InheritPrefixIconContainer = styled.div`\n display: flex;\n align-items: center;\n\n & svg {\n width: inherit;\n height: inherit;\n }\n`;\n\nexport const SuffixIconContainer = styled(PrefixIconContainer)`\n margin-right: 0;\n flex-grow: 1;\n justify-content: flex-end;\n`;\n\nconst ButtonText = styled.span<{ size: 'md' | 'sm'; width: 'full' | 'auto' | 'button' | 'icon' }>`\n position: relative;\n\n /* Needed to align for browsers that don't support text-box yet\n (which at this time, is firefox, and opera, and a few niche browsers)\n This checks firefox. Otherwise, it will default back to the original\n which is a slightly misaligned button\n */\n\n /* Was trying to use this with @supports not, but genuinely could not figure out why this wouldn't\n work */\n\n line-height: ${({ width }) => (width === 'icon' ? '0' : 'inherit')};\n @-moz-document url-prefix() {\n top: ${({ size }) => (size === 'md' ? '1px' : '0.5px')};\n }\n\n @supports (text-box: cap alphabetic) {\n text-box: ${({ width }) => (width === 'icon' ? 'normal' : 'cap alphabetic')};\n }\n`;\n\ntype MaybePromise =\n | ((e: MouseEvent<HTMLButtonElement>) => void)\n | ((e: MouseEvent<HTMLButtonElement>) => Promise<void>);\n\nexport interface ButtonProps\n extends ComponentPropsWithoutRef<'button'>, Omit<PseudoClassProps, 'checked'> {\n /**\n * Visual style of the button.\n *\n * - `primary` – filled brand colour, for the primary action on a surface.\n * - `basic` – subtle grey fill, for secondary actions.\n * - `outline` – transparent with a border, alternative secondary style.\n * - `text` – no background or border, for tertiary / inline actions.\n * - `inverse` – inverted fill for use on dark/coloured backgrounds.\n * - `danger` – red fill, for destructive actions.\n *\n * @defaultValue 'primary'\n */\n variant?: ButtonVariant;\n /**\n * Shows a loading spinner and disables the button. Also triggers automatically\n * when `onClick` returns a Promise, clearing once the promise settles.\n */\n isPending?: boolean;\n /**\n * Icon rendered to the left of the button label.\n * Import from `@persona/icons`.\n */\n prefixIcon?: ReactNode;\n /**\n * Controls how the prefix icon inherits sizing.\n *\n * - `basic` – icon is rendered inside a fixed-size container.\n * - `inherit` – icon stretches to fill the surrounding element's dimensions.\n *\n * @defaultValue 'basic'\n */\n prefixIconType?: 'basic' | 'inherit';\n\n /**\n * Icon rendered to the right of the button label.\n * Import from `@persona/icons`.\n */\n suffixIcon?: ReactNode;\n\n /**\n * Height and typography scale of the button.\n *\n * @defaultValue 'md'\n */\n size?: 'md' | 'sm';\n\n /**\n * Changes the button into a link.\n * Pass a relative path to use `react-router-dom` `<Link>`, or an absolute\n * `https://` URL to render an `<a>` tag that opens in a new tab.\n */\n to?: LinkProps['to'];\n\n /**\n * Overrides the target of the link if `to` is provided and is an external link.\n */\n target?: LinkProps['target'];\n\n /**\n * Note: we may want to default this to 'button' in the future, but many instances of this Button component\n * in dashboard currently rely on the default 'submit' behavior that occurs when using this in redux-form\n * so we'll have to comb through and manually add the type='submit' prop.\n */\n type?: 'button' | 'reset' | 'submit';\n /**\n * Controls the width of the button.\n *\n * - `full` – stretches to fill its container (`width: 100%`).\n * - `auto` – shrinks to fit its content.\n * - `button` – a fixed medium element width (from design tokens).\n * - `icon` – square, sized to match the button height; use for icon-only buttons.\n *\n * @defaultValue 'full'\n */\n width?: 'full' | 'auto' | 'button' | 'icon';\n onClick?: MaybePromise;\n ref?: Ref<HTMLButtonElement>;\n\n /**\n * In some cases we render a button on a secondary background, which needs an adjustment\n * for certain variants.\n */\n onSecondaryBackground?: boolean;\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n id,\n children,\n prefixIcon,\n suffixIcon,\n disabled,\n isPending,\n type = 'button',\n prefixIconType = 'basic',\n variant = 'primary',\n size = 'md',\n width = 'full',\n onClick,\n onSecondaryBackground,\n ...props\n }: ButtonProps,\n ref,\n) {\n const [isResolving, { enable, disable }] = useToggle(false);\n const innerOnClick: MaybePromise = isFunction(onClick) ? onClick : noop;\n const loading = isPending || isResolving;\n\n const handleClick = useCallback(\n async (e: MouseEvent<HTMLButtonElement>) => {\n if (loading) {\n return;\n }\n\n const maybePromise = innerOnClick(e);\n\n if (maybePromise instanceof Promise) {\n enable();\n await maybePromise;\n disable();\n }\n },\n [loading, innerOnClick],\n );\n\n return (\n <StyledButton\n id={id}\n type={type}\n data-test={'button__' + variant}\n variant={variant}\n size={size}\n width={width}\n disabled={disabled || loading}\n $isPending={loading}\n $onSecondaryBackground={onSecondaryBackground}\n {...props}\n onClick={handleClick}\n ref={ref}\n >\n {loading && (\n <LoaderContainer isPending={loading}>\n <Loader aria-label={`Loading ${props['aria-label'] || ''}`} />\n </LoaderContainer>\n )}\n <ButtonChildren isPending={loading}>\n {prefixIcon != null && (\n <>\n {prefixIconType === 'basic' && <PrefixIconContainer>{prefixIcon}</PrefixIconContainer>}\n {prefixIconType === 'inherit' && (\n <InheritPrefixIconContainer>{prefixIcon}</InheritPrefixIconContainer>\n )}\n </>\n )}\n {children && (\n <ButtonText width={width} size={size}>\n {children}\n </ButtonText>\n )}\n {suffixIcon != null && <SuffixIconContainer>{suffixIcon}</SuffixIconContainer>}\n </ButtonChildren>\n </StyledButton>\n );\n});\n\nexport default Button;\n","import { forwardRef } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { BorderRadius } from '@persona/design-tokens';\nimport { semanticOnly } from 'design-system/lib/semanticColor';\n\nimport Button, { type ButtonProps } from './Button';\n\nconst BUTTON_SIZE_MAP = {\n xs: '16px',\n sm: '24px',\n md: '32px',\n};\n\nconst ICON_SIZE_MAP = {\n xs: '12px',\n sm: '16px',\n md: '16px',\n};\n\ntype IconBtnSize = keyof typeof BUTTON_SIZE_MAP;\n\nconst IconBtn = styled(Button).attrs({\n width: 'icon',\n variant: 'basic',\n})`\n background-color: transparent;\n padding: 0;\n border-radius: ${BorderRadius.Md};\n\n ${semanticOnly(\n () => css`\n &:disabled {\n background-color: transparent;\n }\n `,\n )}\n\n ${({ size }) => css`\n height: ${BUTTON_SIZE_MAP[size as IconBtnSize]};\n width: ${BUTTON_SIZE_MAP[size as IconBtnSize]};\n\n svg {\n width: ${ICON_SIZE_MAP[size as IconBtnSize]};\n height: ${ICON_SIZE_MAP[size as IconBtnSize]};\n }\n `}\n`;\n\nexport interface IconButtonProps extends Omit<\n ButtonProps,\n 'width' | 'prefixIcon' | 'prefixIconType' | 'suffixIcon' | 'variant' | 'size'\n> {\n /**\n * `xs` - 16px. `sm` - 24px. `md` - 32px.\n * Pair with a PDS icon in the prescribed size.\n */\n size?: IconBtnSize;\n}\n\n/**\n * Use to render icon-only buttons. Ensure buttons have proper aria properties.\n */\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { size = 'xs', ...props },\n ref,\n) {\n return <IconBtn size={size as ButtonProps['size']} ref={ref} {...props} />;\n});\n\nexport default IconButton;\n"],"mappings":"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"}