@persona/design-system 0.10.5 → 0.10.6

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 (202) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/Badge-8YzapjWf.mjs.map +1 -1
  3. package/dist/Breadcrumbs-Dft2TR4v.mjs.map +1 -1
  4. package/dist/Card-DuQHyroh.mjs.map +1 -1
  5. package/dist/CardV2-BRJbRSts.mjs.map +1 -1
  6. package/dist/Checkbox-Dr4LMKHV.mjs.map +1 -1
  7. package/dist/{CheckboxGroupField-UHpA38U5.d.mts → CheckboxGroupField-CjeEoiPa.d.mts} +2 -2
  8. package/dist/CheckboxGroupField.d.mts +1 -1
  9. package/dist/Combobox-DQxaOCLA.mjs.map +1 -1
  10. package/dist/{Combobox-BXkcQ2aY.d.mts → Combobox-O6LbofT2.d.mts} +3 -3
  11. package/dist/Combobox.d.mts +2 -2
  12. package/dist/{ComboboxBase-D2rDQHYZ.d.mts → ComboboxBase-5aSDuY-E.d.mts} +2 -2
  13. package/dist/ComboboxBase.d.mts +1 -1
  14. package/dist/{ComboboxMultiSelect-CrvB6ap5.d.mts → ComboboxMultiSelect-D3mX4Dzq.d.mts} +2 -2
  15. package/dist/ComboboxMultiSelect.d.mts +1 -1
  16. package/dist/{ComboboxSingleSelect-Dp0iTdDO.d.mts → ComboboxSingleSelect-CfSy6sCU.d.mts} +3 -3
  17. package/dist/ComboboxSingleSelect.d.mts +1 -1
  18. package/dist/{DataTable-C000E74h.d.mts → DataTable-BXHmi-SW.d.mts} +7 -6
  19. package/dist/{DataTable-DEJHWrsy.mjs → DataTable-CAfZNJmb.mjs} +8 -7
  20. package/dist/DataTable-CAfZNJmb.mjs.map +1 -0
  21. package/dist/DataTable.d.mts +1 -1
  22. package/dist/DatePicker-D-_ibUd1.mjs.map +1 -1
  23. package/dist/DropdownButton-BiFRlSVD.mjs.map +1 -1
  24. package/dist/DropdownButton.d.mts +1 -1
  25. package/dist/{DropdownMenu-CQbS7ML5.d.mts → DropdownMenu-CAYVX9Q3.d.mts} +2 -2
  26. package/dist/DropdownMenu-Q8S-9rXm.mjs.map +1 -1
  27. package/dist/DropdownMenu.d.mts +1 -1
  28. package/dist/FormControl-BztNXLn6.mjs.map +1 -1
  29. package/dist/{FormField-g1zQFM9T.mjs → FormField-BStxmlZT.mjs} +2 -2
  30. package/dist/FormField-BStxmlZT.mjs.map +1 -0
  31. package/dist/{FormField-PBo1ctY8.d.mts → FormField-D10LW9-a.d.mts} +2 -2
  32. package/dist/FormField.d.mts +1 -1
  33. package/dist/HoverCopyableField-CW7Jxmni.mjs.map +1 -1
  34. package/dist/{I18nContext-EPmbUprm.d.mts → I18nContext-BBVKF9ui.d.mts} +2 -2
  35. package/dist/I18nContext.d.mts +1 -1
  36. package/dist/IconButton-DftINsp7.mjs.map +1 -1
  37. package/dist/IndexTableLayout.d.mts +3 -3
  38. package/dist/InlineCombobox.d.mts +1 -1
  39. package/dist/InlineInput.d.mts +1 -1
  40. package/dist/Input-DtO3qMnE.mjs.map +1 -1
  41. package/dist/Link-DKYmdL9t.mjs.map +1 -1
  42. package/dist/ListBox-CDG0EAPg.mjs.map +1 -1
  43. package/dist/{ListBox-D9SYTzOd.d.mts → ListBox-CvnFiHK5.d.mts} +2 -2
  44. package/dist/ListBox.d.mts +1 -1
  45. package/dist/{ListBoxField-CtPDd_Aw.d.mts → ListBoxField-DuUwx9Cv.d.mts} +4 -4
  46. package/dist/ListBoxField.d.mts +1 -1
  47. package/dist/LoadingShimmer-oPIv2ESr.mjs.map +1 -1
  48. package/dist/{LogicRow-BWIZ7262.d.mts → LogicRow-COvZNiUd.d.mts} +2 -2
  49. package/dist/LogicRow.d.mts +1 -1
  50. package/dist/{Menu-DizjcMbO.d.mts → Menu-ByYFNvgS.d.mts} +2 -2
  51. package/dist/Menu-EIT_MwK6.mjs.map +1 -1
  52. package/dist/Menu.d.mts +1 -1
  53. package/dist/{Modal-92O_uW8H.mjs → Modal-ziuzDCPN.mjs} +2 -2
  54. package/dist/Modal-ziuzDCPN.mjs.map +1 -0
  55. package/dist/PageHeader-BzvA_NNt.mjs.map +1 -1
  56. package/dist/PageLayout-DCe3F76N.mjs.map +1 -1
  57. package/dist/{PageSelector-QaKYtk6y.d.mts → PageSelector-BOe4EzbS.d.mts} +8 -2
  58. package/dist/PageSelector.d.mts +1 -1
  59. package/dist/{Pagination-dTsHLVAk.mjs → Pagination-Dpc6TadZ.mjs} +15 -11
  60. package/dist/Pagination-Dpc6TadZ.mjs.map +1 -0
  61. package/dist/{Pagination-DeXorbSK.d.mts → Pagination-Dy-OSH0Y.d.mts} +10 -2
  62. package/dist/Pagination.d.mts +1 -1
  63. package/dist/Popover-DordjYNM.mjs.map +1 -1
  64. package/dist/ProgressIndicator-ISARECzW.mjs.map +1 -1
  65. package/dist/Radio-BlEtetrr.mjs.map +1 -1
  66. package/dist/RadioGroup-CMrXmmn4.mjs.map +1 -1
  67. package/dist/SegmentedControl-D_DA-MU1.mjs.map +1 -1
  68. package/dist/{Select-Chk5WB1F.d.mts → Select-BLqHxJUz.d.mts} +2 -2
  69. package/dist/Select-DkUMz4LG.mjs.map +1 -1
  70. package/dist/Select.d.mts +1 -1
  71. package/dist/SmartTextInputField.d.mts +2 -2
  72. package/dist/Spacer-C4d9Aho6.mjs.map +1 -1
  73. package/dist/Spinner-CXb-KUs1.mjs.map +1 -1
  74. package/dist/StatusIndicator-pWl1-FLb.mjs.map +1 -1
  75. package/dist/Sticker-Bi_fezCO.mjs.map +1 -1
  76. package/dist/TabBar-DpXYsWgS.mjs.map +1 -1
  77. package/dist/Table-DPi4Dt5H.mjs.map +1 -1
  78. package/dist/TableBox-BfSF36Gy.mjs.map +1 -1
  79. package/dist/TableBox.d.mts +1 -1
  80. package/dist/{TableBoxCell-CwroLAWy.d.mts → TableBoxCell-DPXrw63v.d.mts} +4 -4
  81. package/dist/TableBoxCell.d.mts +1 -1
  82. package/dist/{TableBoxField-B7bHv7uV.d.mts → TableBoxField-C7MGSie9.d.mts} +5 -5
  83. package/dist/TableBoxField.d.mts +1 -1
  84. package/dist/{TableBoxRow-Dke8B99J.d.mts → TableBoxRow-uToXVWvl.d.mts} +2 -2
  85. package/dist/TableBoxRow.d.mts +1 -1
  86. package/dist/{TableBoxRowActions-CkUDVERC.d.mts → TableBoxRowActions-Do646IVE.d.mts} +2 -2
  87. package/dist/TableBoxRowActions.d.mts +1 -1
  88. package/dist/{TableControls-DAjx1TYG.d.mts → TableControls-BHv-tXA-.d.mts} +4 -3
  89. package/dist/{TableControls-BDXOQMr7.mjs → TableControls-C-0Dw8vM.mjs} +7 -5
  90. package/dist/TableControls-C-0Dw8vM.mjs.map +1 -0
  91. package/dist/TableControls.d.mts +1 -1
  92. package/dist/{TableControlsContext-BEIvE9qN.d.mts → TableControlsContext-D6rifk-v.d.mts} +2 -2
  93. package/dist/TableControlsContext.d.mts +1 -1
  94. package/dist/{TableViewConfigurationDropdown-vYnU0d4k.d.mts → TableViewConfigurationDropdown-C5bjxTGX.d.mts} +2 -2
  95. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  96. package/dist/TechnicalSticker-B_JlBkXZ.mjs.map +1 -1
  97. package/dist/Text-D0vEReED.mjs.map +1 -1
  98. package/dist/TextArea-Dro-HH8O.mjs.map +1 -1
  99. package/dist/Toggle-D9MzTIZs.mjs.map +1 -1
  100. package/dist/Tooltip-YViXzMdm.mjs.map +1 -1
  101. package/dist/{clientFilterUtils-DYKgw2Yq.d.mts → clientFilterUtils-DDDG1g7e.d.mts} +2 -2
  102. package/dist/clientFilterUtils.d.mts +1 -1
  103. package/dist/components/Accordion/index.mjs.map +1 -1
  104. package/dist/components/Attribute/index.mjs.map +1 -1
  105. package/dist/components/Banner/index.mjs.map +1 -1
  106. package/dist/components/BottomPanel/index.mjs.map +1 -1
  107. package/dist/components/ButtonGroup/index.mjs.map +1 -1
  108. package/dist/components/CodeHighlight/index.mjs.map +1 -1
  109. package/dist/components/Combobox/index.d.mts +2 -2
  110. package/dist/components/DataTable/TableControls/index.d.mts +6 -6
  111. package/dist/components/DataTable/TableControls/index.mjs +1 -1
  112. package/dist/components/DataTable/index.d.mts +5 -5
  113. package/dist/components/DataTable/index.mjs +1 -1
  114. package/dist/components/DataTable/types.d.mts +1 -1
  115. package/dist/components/DropdownMenu/index.d.mts +1 -1
  116. package/dist/components/FloatingPanel/index.mjs.map +1 -1
  117. package/dist/components/FormField/index.d.mts +5 -5
  118. package/dist/components/FormField/index.mjs +1 -1
  119. package/dist/components/ImageTile/index.mjs.map +1 -1
  120. package/dist/components/ListBox/index.d.mts +3 -3
  121. package/dist/components/MaskedInput/index.mjs.map +1 -1
  122. package/dist/components/MatchHighlight/index.mjs.map +1 -1
  123. package/dist/components/Menu/index.d.mts +1 -1
  124. package/dist/components/Modal/index.mjs +1 -1
  125. package/dist/components/Pagination/index.d.mts +2 -2
  126. package/dist/components/Pagination/index.mjs +1 -1
  127. package/dist/components/ProgressBar/index.mjs.map +1 -1
  128. package/dist/components/RichTextEditor/index.mjs +1 -1
  129. package/dist/components/RichTextEditor/index.mjs.map +1 -1
  130. package/dist/components/RightPanel/index.mjs.map +1 -1
  131. package/dist/components/Select/index.d.mts +1 -1
  132. package/dist/components/SelectionCard/index.mjs.map +1 -1
  133. package/dist/components/Slider/index.mjs.map +1 -1
  134. package/dist/components/SmartTextInput/index.mjs +1 -1
  135. package/dist/components/SmartTextInput/index.mjs.map +1 -1
  136. package/dist/components/SwatchPicker/index.mjs.map +1 -1
  137. package/dist/components/TableBox/index.d.mts +1 -1
  138. package/dist/components/Tile/index.mjs.map +1 -1
  139. package/dist/components/Toast/index.mjs.map +1 -1
  140. package/dist/components/VersionHistory/index.mjs +1 -1
  141. package/dist/components/VersionHistory/index.mjs.map +1 -1
  142. package/dist/display.d.mts +1 -1
  143. package/dist/fieldPickerOptions.d.mts +1 -1
  144. package/dist/{filters-DjXkx8GJ.d.mts → filters-CkAFU8LV.d.mts} +2 -2
  145. package/dist/filters.d.mts +1 -1
  146. package/dist/{helpers-CdxEL7ri.d.mts → helpers-Dvvcz-hL.d.mts} +3 -3
  147. package/dist/helpers.d.mts +1 -1
  148. package/dist/{i18n-BLyCaSdJ.mjs → i18n-CKRi992F.mjs} +2 -1
  149. package/dist/i18n-CKRi992F.mjs.map +1 -0
  150. package/dist/{index-DX5Zu9JU.d.mts → index-B3A74_ew.d.mts} +3 -3
  151. package/dist/index6.d.mts +1 -1
  152. package/dist/{inputFields-CYttsz5M.d.mts → inputFields-Dfpxi68z.d.mts} +5 -5
  153. package/dist/inputFields.d.mts +1 -1
  154. package/dist/lib/PDSProvider.d.mts +1 -1
  155. package/dist/lib/PDSProvider.mjs +1 -1
  156. package/dist/lib/PDSProvider.mjs.map +1 -1
  157. package/dist/lib/TruncatedText.mjs.map +1 -1
  158. package/dist/lib/TruncatedTextWithTooltip.mjs.map +1 -1
  159. package/dist/lib/color.mjs.map +1 -1
  160. package/dist/lib/colorMode.mjs.map +1 -1
  161. package/dist/lib/i18n/index.d.mts +2 -2
  162. package/dist/lib/i18n/index.mjs +1 -1
  163. package/dist/lib/pseudoClass.mjs.map +1 -1
  164. package/dist/lib/semanticColor.mjs.map +1 -1
  165. package/dist/lib/useEmbeddedSurface.mjs.map +1 -1
  166. package/dist/mixins/focus.mjs.map +1 -1
  167. package/dist/mixins/hoverable.mjs.map +1 -1
  168. package/dist/mixins/input.mjs.map +1 -1
  169. package/dist/mixins/menuItem.mjs.map +1 -1
  170. package/dist/mixins/print/index.mjs.map +1 -1
  171. package/dist/mixins/scrollbar.mjs.map +1 -1
  172. package/dist/{operators-gCG7uZ6y.d.mts → operators-BrrJKENE.d.mts} +2 -2
  173. package/dist/operators.d.mts +1 -1
  174. package/dist/patterns/CardGrouping/index.mjs.map +1 -1
  175. package/dist/patterns/IndexTableLayout/index.mjs +1 -1
  176. package/dist/patterns/IndexTableLayout/index.mjs.map +1 -1
  177. package/dist/patterns/LayoutLoadingShimmer/index.mjs.map +1 -1
  178. package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -1
  179. package/dist/patterns/WizardModal/index.mjs +1 -1
  180. package/dist/patterns/WizardModal/index.mjs.map +1 -1
  181. package/dist/{strings-CK9n6b65.d.mts → strings-BGXKl_m6.d.mts} +6 -1
  182. package/dist/strings.d.mts +1 -1
  183. package/dist/theme.mjs.map +1 -1
  184. package/dist/{types-DJobO07d.d.mts → types-DoJubhWu.d.mts} +2 -2
  185. package/dist/{types-CayYd8EX.d.mts → types-sUEmxsGM.d.mts} +2 -2
  186. package/dist/types5.d.mts +1 -1
  187. package/dist/useChain-D1aNsdvn.mjs.map +1 -1
  188. package/dist/useColumnConfiguration.d.mts +2 -2
  189. package/dist/useComboboxFooterAction.d.mts +1 -1
  190. package/dist/useFormField-pOVkb5BK.mjs.map +1 -1
  191. package/dist/{useTableColumns-BK-KYY0L.d.mts → useTableColumns-nPrbDfF_.d.mts} +2 -2
  192. package/dist/useTableColumns.d.mts +1 -1
  193. package/dist/useTruncation.d.mts +1 -1
  194. package/dist/utils/storybook.mjs.map +1 -1
  195. package/dist/variables/effect.mjs.map +1 -1
  196. package/package.json +16 -3
  197. package/dist/DataTable-DEJHWrsy.mjs.map +0 -1
  198. package/dist/FormField-g1zQFM9T.mjs.map +0 -1
  199. package/dist/Modal-92O_uW8H.mjs.map +0 -1
  200. package/dist/Pagination-dTsHLVAk.mjs.map +0 -1
  201. package/dist/TableControls-BDXOQMr7.mjs.map +0 -1
  202. package/dist/i18n-BLyCaSdJ.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/components/SwatchPicker/SwatchPicker.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react';\nimport styled from 'styled-components';\n\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { Elevation } from 'design-system/variables/effect';\n\nconst SwatchGrid = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: ${Spacing[1]};\n`;\n\nexport interface SwatchPickerProps extends Omit<ComponentPropsWithoutRef<'div'>, 'onChange'> {\n value: string;\n onChange: (color: string) => void;\n colors: string[];\n}\n\nexport const SwatchPicker = ({ value, onChange, colors, ...restProps }: SwatchPickerProps) => {\n return (\n <SwatchGrid {...restProps}>\n {colors.map((color) => (\n <Swatch key={color} color={color} selected={color === value} onSelect={onChange} />\n ))}\n </SwatchGrid>\n );\n};\n\nconst ColorSwatch = styled.button<{ selected: boolean; $color?: string }>`\n display: inline-block;\n width: 24px;\n height: 24px;\n padding: 0;\n background-color: ${({ $color }) => $color ?? 'transparent'};\n border-radius: ${BorderRadius.Circle};\n border: 2px solid ${({ theme }) => semanticColor(theme, 'InputSurfaceDefault', Color.PrimaryWhite)};\n transition: all 100ms ease-out;\n cursor: pointer;\n ${({ selected, theme }) =>\n selected\n ? `outline: 2px solid ${semanticColor(theme, 'BorderAccent', Color.BorderIconActive)}`\n : ''};\n\n &:hover {\n box-shadow: ${Elevation.Low};\n }\n`;\n\nconst WhiteSwatch = styled(ColorSwatch)`\n border-color: ${({ theme }) => semanticColor(theme, 'BorderDivider', Color.BorderHairline)};\n`;\n\ninterface SwatchProps {\n color: string;\n selected: boolean;\n onSelect: (color: string) => void;\n}\n\nconst Swatch = ({ color, selected, onSelect }: SwatchProps) => {\n // NOTE: This is a hack to get the white color to show up. In theory we may want to do this\n // for all colors close to white, but this gets the job done for now.\n return color.toUpperCase() === '#FFFFFF' ? (\n <WhiteSwatch selected={selected} title='#FFFFFF' onClick={() => onSelect(color)} />\n ) : (\n <ColorSwatch $color={color} selected={selected} title={color} onClick={() => onSelect(color)} />\n );\n};\n\nexport default SwatchPicker;\n"],"mappings":";;;;;;AAOA,MAAM,aAAa,OAAO,GAAG;;;;SAIpB,QAAQ,GAAG;;AASpB,MAAa,gBAAgB,EAAE,OAAO,UAAU,QAAQ,GAAG,gBAAmC;AAC5F,QACE,oBAAC,YAAD;EAAY,GAAI;YACb,OAAO,KAAK,UACX,oBAAC,QAAD;GAA2B;GAAO,UAAU,UAAU;GAAO,UAAU;GAAY,EAAtE,MAAsE,CACnF;EACS,CAAA;;AAIjB,MAAM,cAAc,OAAO,MAA8C;;;;;uBAKlD,EAAE,aAAa,UAAU,cAAc;mBAC3C,aAAa,OAAO;uBAChB,EAAE,YAAY,cAAc,OAAO,uBAAuB,MAAM,aAAa,CAAC;;;KAGhG,EAAE,UAAU,YACb,WACI,sBAAsB,cAAc,OAAO,gBAAgB,MAAM,iBAAiB,KAClF,GAAG;;;oIAGqB;;;AAIhC,MAAM,cAAc,OAAO,YAAY;mBACpB,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,eAAe,CAAC;;AAS7F,MAAM,UAAU,EAAE,OAAO,UAAU,eAA4B;AAG7D,QAAO,MAAM,aAAa,KAAK,YAC7B,oBAAC,aAAD;EAAuB;EAAU,OAAM;EAAU,eAAe,SAAS,MAAM;EAAI,CAAA,GAEnF,oBAAC,aAAD;EAAa,QAAQ;EAAiB;EAAU,OAAO;EAAO,eAAe,SAAS,MAAM;EAAI,CAAA"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/components/SwatchPicker/SwatchPicker.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from 'react';\nimport styled from 'styled-components';\n\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\n\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { Elevation } from '#src/variables/effect';\n\nconst SwatchGrid = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: ${Spacing[1]};\n`;\n\nexport interface SwatchPickerProps extends Omit<ComponentPropsWithoutRef<'div'>, 'onChange'> {\n value: string;\n onChange: (color: string) => void;\n colors: string[];\n}\n\nexport const SwatchPicker = ({ value, onChange, colors, ...restProps }: SwatchPickerProps) => {\n return (\n <SwatchGrid {...restProps}>\n {colors.map((color) => (\n <Swatch key={color} color={color} selected={color === value} onSelect={onChange} />\n ))}\n </SwatchGrid>\n );\n};\n\nconst ColorSwatch = styled.button<{ selected: boolean; $color?: string }>`\n display: inline-block;\n width: 24px;\n height: 24px;\n padding: 0;\n background-color: ${({ $color }) => $color ?? 'transparent'};\n border-radius: ${BorderRadius.Circle};\n border: 2px solid ${({ theme }) => semanticColor(theme, 'InputSurfaceDefault', Color.PrimaryWhite)};\n transition: all 100ms ease-out;\n cursor: pointer;\n ${({ selected, theme }) =>\n selected\n ? `outline: 2px solid ${semanticColor(theme, 'BorderAccent', Color.BorderIconActive)}`\n : ''};\n\n &:hover {\n box-shadow: ${Elevation.Low};\n }\n`;\n\nconst WhiteSwatch = styled(ColorSwatch)`\n border-color: ${({ theme }) => semanticColor(theme, 'BorderDivider', Color.BorderHairline)};\n`;\n\ninterface SwatchProps {\n color: string;\n selected: boolean;\n onSelect: (color: string) => void;\n}\n\nconst Swatch = ({ color, selected, onSelect }: SwatchProps) => {\n // NOTE: This is a hack to get the white color to show up. In theory we may want to do this\n // for all colors close to white, but this gets the job done for now.\n return color.toUpperCase() === '#FFFFFF' ? (\n <WhiteSwatch selected={selected} title='#FFFFFF' onClick={() => onSelect(color)} />\n ) : (\n <ColorSwatch $color={color} selected={selected} title={color} onClick={() => onSelect(color)} />\n );\n};\n\nexport default SwatchPicker;\n"],"mappings":";;;;;;AAQA,MAAM,aAAa,OAAO,GAAG;;;;SAIpB,QAAQ,GAAG;;AASpB,MAAa,gBAAgB,EAAE,OAAO,UAAU,QAAQ,GAAG,gBAAmC;AAC5F,QACE,oBAAC,YAAD;EAAY,GAAI;YACb,OAAO,KAAK,UACX,oBAAC,QAAD;GAA2B;GAAO,UAAU,UAAU;GAAO,UAAU;GAAY,EAAtE,MAAsE,CACnF;EACS,CAAA;;AAIjB,MAAM,cAAc,OAAO,MAA8C;;;;;uBAKlD,EAAE,aAAa,UAAU,cAAc;mBAC3C,aAAa,OAAO;uBAChB,EAAE,YAAY,cAAc,OAAO,uBAAuB,MAAM,aAAa,CAAC;;;KAGhG,EAAE,UAAU,YACb,WACI,sBAAsB,cAAc,OAAO,gBAAgB,MAAM,iBAAiB,KAClF,GAAG;;;oIAGqB;;;AAIhC,MAAM,cAAc,OAAO,YAAY;mBACpB,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,eAAe,CAAC;;AAS7F,MAAM,UAAU,EAAE,OAAO,UAAU,eAA4B;AAG7D,QAAO,MAAM,aAAa,KAAK,YAC7B,oBAAC,aAAD;EAAuB;EAAU,OAAM;EAAU,eAAe,SAAS,MAAM;EAAI,CAAA,GAEnF,oBAAC,aAAD;EAAa,QAAQ;EAAiB;EAAU,OAAO;EAAO,eAAe,SAAS,MAAM;EAAI,CAAA"}
@@ -1,3 +1,3 @@
1
1
  import { t as DragDirection } from "../../useTableBoxDragAndDrop-8NS4JBuI.mjs";
2
- import { a as TableBox, o as TableBoxContext, r as InlineEditConfig, s as TableBoxProps } from "../../TableBoxCell-CwroLAWy.mjs";
2
+ import { a as TableBox, o as TableBoxContext, r as InlineEditConfig, s as TableBoxProps } from "../../TableBoxCell-DPXrw63v.mjs";
3
3
  export { DragDirection, InlineEditConfig, TableBoxContext, TableBoxProps, TableBox as default };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["ArrowRightIcon12","ArrowRightIcon16"],"sources":["../../../src/components/Tile/Tile.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport Stack, { HStack } from '@persona/design-system/components/Stack';\nimport Sticker, { type StickerProps } from '@persona/design-system/components/Sticker';\nimport { Heading, Paragraph } from '@persona/design-system/components/Text';\nimport { TextUnderlineTooltip } from '@persona/design-system/components/Tooltip';\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { ArrowRightIcon as ArrowRightIcon12 } from '@persona/icons/12px';\nimport { ArrowRightIcon as ArrowRightIcon16 } from '@persona/icons/16px';\nimport { semanticColor } from 'design-system/lib/semanticColor';\n\nexport type TileSize = 'sm' | 'md';\n\nexport interface TileStickerProps extends Omit<\n StickerProps,\n 'children' | 'onDismiss' | 'dismissButtonProps'\n> {\n /**\n * Text content of the sticker. The Tile owns rendering so callers cannot\n * inject arbitrary JSX.\n */\n text: string;\n}\n\nexport interface TileProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Size of the tile. Controls value typography and padding.\n *\n * @defaultValue 'md'\n */\n size?: TileSize;\n\n /**\n * Label rendered above the value.\n */\n label: string;\n\n /**\n * Tooltip content shown when hovering the label. When provided, the label\n * is rendered with a dashed-underline trigger.\n */\n labelTooltip?: ReactNode;\n\n /**\n * Main value displayed prominently. Pass a `[before, after]` tuple to render\n * a transition between two values with a right-pointing arrow between them.\n */\n value: string | [string, string];\n\n /**\n * Optional sticker rendered to the right of the value. The Tile renders the\n * `<Sticker>` itself; callers configure it via these props (text + any\n * non-children sticker props such as `variant` or `icon`).\n */\n sticker?: TileStickerProps;\n\n /**\n * Optional metadata text rendered beneath the value.\n */\n metadata?: string;\n\n /**\n * Tooltip content shown when hovering the metadata. When provided, the\n * metadata is rendered with a dashed-underline trigger.\n */\n metadataTooltip?: ReactNode;\n}\n\nconst PADDING_BY_SIZE: Record<TileSize, string> = {\n sm: Spacing[3],\n md: Spacing[4],\n};\n\nconst TILE_MAX_WIDTH_PX = '220px';\n\nconst TileContainer = styled(Stack)<{ $size: TileSize }>`\n background-color: ${({ theme }) => semanticColor(theme, 'SurfacePrimary', theme.color.background.primary)};\n box-sizing: border-box;\n width: 100%;\n max-width: ${TILE_MAX_WIDTH_PX};\n padding: ${({ $size }) => PADDING_BY_SIZE[$size]};\n border: 1px solid ${({ theme }) => semanticColor(theme, 'BorderDivider', theme.color.border.primary)};\n border-radius: ${({ theme }) => theme.card.borderRadius};\n`;\n\nconst TransitionArrow = styled.span`\n display: inline-flex;\n align-items: center;\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', Color.BorderIconSecondary)};\n line-height: 0;\n`;\n\nexport const Tile = ({\n size = 'md',\n label,\n labelTooltip,\n value,\n sticker,\n metadata,\n metadataTooltip,\n ...props\n}: TileProps) => {\n const labelNode = labelTooltip ? (\n <TextUnderlineTooltip tooltip={labelTooltip} side='top'>\n {label}\n </TextUnderlineTooltip>\n ) : (\n label\n );\n\n const metadataNode =\n metadata != null && metadataTooltip ? (\n <TextUnderlineTooltip tooltip={metadataTooltip}>{metadata}</TextUnderlineTooltip>\n ) : (\n metadata\n );\n\n const { text: stickerText, ...stickerRest } = sticker ?? { text: '' };\n\n return (\n <TileContainer $size={size} spacing={Spacing[1]} {...props}>\n <Paragraph size={size} color='secondary' as='div'>\n {labelNode}\n </Paragraph>\n <HStack spacing={Spacing[2]} align='center'>\n {Array.isArray(value) ? (\n <>\n <Heading size={size} color='primary' as='p'>\n {value[0]}\n </Heading>\n <TransitionArrow data-test='tile-transition-arrow' aria-hidden='true'>\n {size === 'sm' ? <ArrowRightIcon12 /> : <ArrowRightIcon16 />}\n </TransitionArrow>\n <Heading size={size} color='primary' as='p'>\n {value[1]}\n </Heading>\n </>\n ) : (\n <Heading size={size} color='primary' as='p'>\n {value}\n </Heading>\n )}\n {sticker != null && <Sticker {...stickerRest}>{stickerText}</Sticker>}\n </HStack>\n {metadata != null && (\n <Paragraph size='sm' color='secondary' as='div'>\n {metadataNode}\n </Paragraph>\n )}\n </TileContainer>\n );\n};\n\nexport default Tile;\n"],"mappings":";;;;;;;;;;;AAqEA,MAAM,kBAA4C;CAChD,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACb;AAID,MAAM,gBAAgB,OAAO,MAAM;uBACZ,EAAE,YAAY,cAAc,OAAO,kBAAkB,MAAM,MAAM,WAAW,QAAQ,CAAC;;;eAG7F,QAAkB;cACnB,EAAE,YAAY,gBAAgB,OAAO;uBAC5B,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,MAAM,OAAO,QAAQ,CAAC;oBACnF,EAAE,YAAY,MAAM,KAAK,aAAa;;AAG1D,MAAM,kBAAkB,OAAO,IAAI;;;YAGvB,EAAE,YAAY,cAAc,OAAO,eAAe,MAAM,oBAAoB,CAAC;;;AAIzF,MAAa,QAAQ,EACnB,OAAO,MACP,OACA,cACA,OACA,SACA,UACA,iBACA,GAAG,YACY;CACf,MAAM,YAAY,eAChB,oBAAC,sBAAD;EAAsB,SAAS;EAAc,MAAK;YAC/C;EACoB,CAAA,GAEvB;CAGF,MAAM,eACJ,YAAY,QAAQ,kBAClB,oBAAC,sBAAD;EAAsB,SAAS;YAAkB;EAAgC,CAAA,GAEjF;CAGJ,MAAM,EAAE,MAAM,aAAa,GAAG,gBAAgB,WAAW,EAAE,MAAM,IAAI;AAErE,QACE,qBAAC,eAAD;EAAe,OAAO;EAAM,SAAS,QAAQ;EAAI,GAAI;YAArD;GACE,oBAAC,WAAD;IAAiB;IAAM,OAAM;IAAY,IAAG;cACzC;IACS,CAAA;GACZ,qBAAC,QAAD;IAAQ,SAAS,QAAQ;IAAI,OAAM;cAAnC,CACG,MAAM,QAAQ,MAAM,GACnB,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,SAAD;MAAe;MAAM,OAAM;MAAU,IAAG;gBACrC,MAAM;MACC,CAAA;KACV,oBAAC,iBAAD;MAAiB,aAAU;MAAwB,eAAY;gBAC5D,SAAS,OAAO,oBAACA,gBAAD,EAAoB,CAAA,GAAG,oBAACC,kBAAD,EAAoB,CAAA;MAC5C,CAAA;KAClB,oBAAC,SAAD;MAAe;MAAM,OAAM;MAAU,IAAG;gBACrC,MAAM;MACC,CAAA;KACT,EAAA,CAAA,GAEH,oBAAC,SAAD;KAAe;KAAM,OAAM;KAAU,IAAG;eACrC;KACO,CAAA,EAEX,WAAW,QAAQ,oBAAC,SAAD;KAAS,GAAI;eAAc;KAAsB,CAAA,CAC9D;;GACR,YAAY,QACX,oBAAC,WAAD;IAAW,MAAK;IAAK,OAAM;IAAY,IAAG;cACvC;IACS,CAAA;GAEA"}
1
+ {"version":3,"file":"index.mjs","names":["ArrowRightIcon12","ArrowRightIcon16"],"sources":["../../../src/components/Tile/Tile.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport Stack, { HStack } from '@persona/design-system/components/Stack';\nimport Sticker, { type StickerProps } from '@persona/design-system/components/Sticker';\nimport { Heading, Paragraph } from '@persona/design-system/components/Text';\nimport { TextUnderlineTooltip } from '@persona/design-system/components/Tooltip';\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { ArrowRightIcon as ArrowRightIcon12 } from '@persona/icons/12px';\nimport { ArrowRightIcon as ArrowRightIcon16 } from '@persona/icons/16px';\n\nimport { semanticColor } from '#src/lib/semanticColor';\n\nexport type TileSize = 'sm' | 'md';\n\nexport interface TileStickerProps extends Omit<\n StickerProps,\n 'children' | 'onDismiss' | 'dismissButtonProps'\n> {\n /**\n * Text content of the sticker. The Tile owns rendering so callers cannot\n * inject arbitrary JSX.\n */\n text: string;\n}\n\nexport interface TileProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * Size of the tile. Controls value typography and padding.\n *\n * @defaultValue 'md'\n */\n size?: TileSize;\n\n /**\n * Label rendered above the value.\n */\n label: string;\n\n /**\n * Tooltip content shown when hovering the label. When provided, the label\n * is rendered with a dashed-underline trigger.\n */\n labelTooltip?: ReactNode;\n\n /**\n * Main value displayed prominently. Pass a `[before, after]` tuple to render\n * a transition between two values with a right-pointing arrow between them.\n */\n value: string | [string, string];\n\n /**\n * Optional sticker rendered to the right of the value. The Tile renders the\n * `<Sticker>` itself; callers configure it via these props (text + any\n * non-children sticker props such as `variant` or `icon`).\n */\n sticker?: TileStickerProps;\n\n /**\n * Optional metadata text rendered beneath the value.\n */\n metadata?: string;\n\n /**\n * Tooltip content shown when hovering the metadata. When provided, the\n * metadata is rendered with a dashed-underline trigger.\n */\n metadataTooltip?: ReactNode;\n}\n\nconst PADDING_BY_SIZE: Record<TileSize, string> = {\n sm: Spacing[3],\n md: Spacing[4],\n};\n\nconst TILE_MAX_WIDTH_PX = '220px';\n\nconst TileContainer = styled(Stack)<{ $size: TileSize }>`\n background-color: ${({ theme }) => semanticColor(theme, 'SurfacePrimary', theme.color.background.primary)};\n box-sizing: border-box;\n width: 100%;\n max-width: ${TILE_MAX_WIDTH_PX};\n padding: ${({ $size }) => PADDING_BY_SIZE[$size]};\n border: 1px solid ${({ theme }) => semanticColor(theme, 'BorderDivider', theme.color.border.primary)};\n border-radius: ${({ theme }) => theme.card.borderRadius};\n`;\n\nconst TransitionArrow = styled.span`\n display: inline-flex;\n align-items: center;\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', Color.BorderIconSecondary)};\n line-height: 0;\n`;\n\nexport const Tile = ({\n size = 'md',\n label,\n labelTooltip,\n value,\n sticker,\n metadata,\n metadataTooltip,\n ...props\n}: TileProps) => {\n const labelNode = labelTooltip ? (\n <TextUnderlineTooltip tooltip={labelTooltip} side='top'>\n {label}\n </TextUnderlineTooltip>\n ) : (\n label\n );\n\n const metadataNode =\n metadata != null && metadataTooltip ? (\n <TextUnderlineTooltip tooltip={metadataTooltip}>{metadata}</TextUnderlineTooltip>\n ) : (\n metadata\n );\n\n const { text: stickerText, ...stickerRest } = sticker ?? { text: '' };\n\n return (\n <TileContainer $size={size} spacing={Spacing[1]} {...props}>\n <Paragraph size={size} color='secondary' as='div'>\n {labelNode}\n </Paragraph>\n <HStack spacing={Spacing[2]} align='center'>\n {Array.isArray(value) ? (\n <>\n <Heading size={size} color='primary' as='p'>\n {value[0]}\n </Heading>\n <TransitionArrow data-test='tile-transition-arrow' aria-hidden='true'>\n {size === 'sm' ? <ArrowRightIcon12 /> : <ArrowRightIcon16 />}\n </TransitionArrow>\n <Heading size={size} color='primary' as='p'>\n {value[1]}\n </Heading>\n </>\n ) : (\n <Heading size={size} color='primary' as='p'>\n {value}\n </Heading>\n )}\n {sticker != null && <Sticker {...stickerRest}>{stickerText}</Sticker>}\n </HStack>\n {metadata != null && (\n <Paragraph size='sm' color='secondary' as='div'>\n {metadataNode}\n </Paragraph>\n )}\n </TileContainer>\n );\n};\n\nexport default Tile;\n"],"mappings":";;;;;;;;;;;AAsEA,MAAM,kBAA4C;CAChD,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACb;AAID,MAAM,gBAAgB,OAAO,MAAM;uBACZ,EAAE,YAAY,cAAc,OAAO,kBAAkB,MAAM,MAAM,WAAW,QAAQ,CAAC;;;eAG7F,QAAkB;cACnB,EAAE,YAAY,gBAAgB,OAAO;uBAC5B,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,MAAM,OAAO,QAAQ,CAAC;oBACnF,EAAE,YAAY,MAAM,KAAK,aAAa;;AAG1D,MAAM,kBAAkB,OAAO,IAAI;;;YAGvB,EAAE,YAAY,cAAc,OAAO,eAAe,MAAM,oBAAoB,CAAC;;;AAIzF,MAAa,QAAQ,EACnB,OAAO,MACP,OACA,cACA,OACA,SACA,UACA,iBACA,GAAG,YACY;CACf,MAAM,YAAY,eAChB,oBAAC,sBAAD;EAAsB,SAAS;EAAc,MAAK;YAC/C;EACoB,CAAA,GAEvB;CAGF,MAAM,eACJ,YAAY,QAAQ,kBAClB,oBAAC,sBAAD;EAAsB,SAAS;YAAkB;EAAgC,CAAA,GAEjF;CAGJ,MAAM,EAAE,MAAM,aAAa,GAAG,gBAAgB,WAAW,EAAE,MAAM,IAAI;AAErE,QACE,qBAAC,eAAD;EAAe,OAAO;EAAM,SAAS,QAAQ;EAAI,GAAI;YAArD;GACE,oBAAC,WAAD;IAAiB;IAAM,OAAM;IAAY,IAAG;cACzC;IACS,CAAA;GACZ,qBAAC,QAAD;IAAQ,SAAS,QAAQ;IAAI,OAAM;cAAnC,CACG,MAAM,QAAQ,MAAM,GACnB,qBAAA,UAAA,EAAA,UAAA;KACE,oBAAC,SAAD;MAAe;MAAM,OAAM;MAAU,IAAG;gBACrC,MAAM;MACC,CAAA;KACV,oBAAC,iBAAD;MAAiB,aAAU;MAAwB,eAAY;gBAC5D,SAAS,OAAO,oBAACA,gBAAD,EAAoB,CAAA,GAAG,oBAACC,kBAAD,EAAoB,CAAA;MAC5C,CAAA;KAClB,oBAAC,SAAD;MAAe;MAAM,OAAM;MAAU,IAAG;gBACrC,MAAM;MACC,CAAA;KACT,EAAA,CAAA,GAEH,oBAAC,SAAD;KAAe;KAAM,OAAM;KAAU,IAAG;eACrC;KACO,CAAA,EAEX,WAAW,QAAQ,oBAAC,SAAD;KAAS,GAAI;eAAc;KAAsB,CAAA,CAC9D;;GACR,YAAY,QACX,oBAAC,WAAD;IAAW,MAAK;IAAK,OAAM;IAAY,IAAG;cACvC;IACS,CAAA;GAEA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["XIcon"],"sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import { type HTMLMotionProps, motion } from 'framer-motion';\nimport type { ReactElement } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { IconButton } from '@persona/design-system/components/Button';\nimport {\n isActive,\n isFocused,\n isHovered,\n isNotDisabled,\n} from '@persona/design-system/lib/pseudoClass';\nimport { paragraphMixins } from '@persona/design-system/mixins/text';\nimport { Elevation } from '@persona/design-system/variables/effect';\nimport { TransitionDurationInSeconds } from '@persona/design-system/variables/transitions';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { CircleAlertIcon, CircleCheckIcon, CircleInfoIcon } from '@persona/icons';\nimport { XIcon } from '@persona/icons/12px';\nimport { withAlpha } from 'design-system/lib/color';\nimport { MessageType } from 'design-system/lib/message';\nimport { semanticColor, semanticOnly, semanticTokens } from 'design-system/lib/semanticColor';\n\nexport interface ToastProps extends HTMLMotionProps<'div'> {\n id: string;\n message: React.ReactNode;\n messageType: MessageType;\n onDismiss?: () => void;\n shouldClipOverflow?: boolean;\n}\n\n// This is exported and used by whatever container is rendering the Toasts\nexport const TOAST_WIDTH = '324px';\n\nconst BaseToast = styled(motion.div)`\n border-radius: ${BorderRadius.Md};\n box-shadow: ${Elevation.Low};\n color: ${({ theme }) => semanticColor(theme, 'FgPrimaryStatic', theme.color.text.primary)};\n ${paragraphMixins.md};\n display: flex;\n align-items: center;\n gap: ${Spacing[2]};\n box-sizing: border-box;\n padding: ${Spacing[2]} ${Spacing[3]};\n width: 100%;\n`;\n\nconst ToastIcon = styled.div`\n flex-shrink: 0;\n display: flex;\n line-height: 0;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimaryStatic', Color.BorderIconPrimary)};\n`;\n\nconst ToastContent = styled.div<{ $clip?: boolean }>`\n flex: 1;\n min-width: 0; /* needed for text to wrap/truncate inside flex container */\n ${({ $clip }) =>\n $clip &&\n css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `}\n`;\n\nconst CloseButton = styled(IconButton)<{ isFocusVisible?: boolean }>`\n flex-shrink: 0;\n margin-left: auto;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimaryStatic', Color.BorderIconPrimary)};\n\n &${isActive}${isNotDisabled}, &${isHovered}${isNotDisabled} {\n background-color: ${({ theme }) => {\n const tokens = semanticTokens(theme);\n return tokens\n ? withAlpha(tokens.ActionNeutralHover, tokens.Opacity25)\n : 'rgba(0, 0, 0, 0.05)';\n }};\n ${semanticOnly((tokens) => `color: ${tokens.FgPrimaryStatic};`)}\n }\n\n ${({ isFocusVisible }) =>\n !isFocusVisible &&\n css`\n &${isHovered}${isFocused}${isNotDisabled} {\n box-shadow: none;\n }\n &${isFocused}${isNotDisabled} {\n box-shadow: none;\n }\n `}\n`;\n\nconst NoticeToast = styled(BaseToast)`\n background: ${({ theme }) => semanticColor(theme, 'StatusInfo1', Color.CorePurple200)};\n`;\n\nconst SuccessToast = styled(BaseToast)`\n background: ${({ theme }) => semanticColor(theme, 'StatusSuccess1', Color.CoreGreen200)};\n`;\n\nconst FailureToast = styled(BaseToast)`\n background: ${({ theme }) => semanticColor(theme, 'StatusDanger2', Color.CoreRed200)};\n`;\n\nconst getStyledComponent = (variant: MessageType) => {\n switch (variant) {\n case MessageType.Success:\n return SuccessToast;\n case MessageType.Failure:\n return FailureToast;\n case MessageType.Notice:\n default:\n return NoticeToast;\n }\n};\n\nconst getIcon = (variant: MessageType): ReactElement => {\n switch (variant) {\n case MessageType.Success:\n return <CircleCheckIcon />;\n case MessageType.Failure:\n return <CircleAlertIcon />;\n case MessageType.Notice:\n default:\n return <CircleInfoIcon />;\n }\n};\n\nexport const Toast = ({\n message,\n messageType,\n onDismiss,\n shouldClipOverflow,\n ...elemProps\n}: ToastProps) => {\n const StyledToast = getStyledComponent(messageType);\n\n return (\n <StyledToast\n initial={{ y: 64, opacity: 0, scale: 0.96 }}\n animate={{ y: 0, opacity: 1, scale: 1 }}\n exit={{\n opacity: 0,\n scale: 0.9,\n transition: { duration: TransitionDurationInSeconds.MediumFast, ease: 'easeOut' },\n }}\n role='alert'\n aria-live='polite'\n transition={{ type: 'tween', duration: TransitionDurationInSeconds.Medium, ease: 'easeOut' }}\n {...elemProps}\n >\n <ToastIcon>{getIcon(messageType)}</ToastIcon>\n <ToastContent $clip={shouldClipOverflow}>{message}</ToastContent>\n {onDismiss && (\n <CloseButton size='sm' aria-label='Close' title='Close' onClick={onDismiss}>\n <XIcon />\n </CloseButton>\n )}\n </StyledToast>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAa,cAAc;AAE3B,MAAM,YAAY,OAAO,OAAO,IAAI;mBACjB,aAAa,GAAG;kIACL;YAClB,EAAE,YAAY,cAAc,OAAO,mBAAmB,MAAM,MAAM,KAAK,QAAQ,CAAC;IACxF,gBAAgB,GAAG;;;SAGd,QAAQ,GAAG;;aAEP,QAAQ,GAAG,GAAG,QAAQ,GAAG;;;AAItC,MAAM,YAAY,OAAO,GAAG;;;;YAIhB,EAAE,YAAY,cAAc,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;;AAG3F,MAAM,eAAe,OAAO,GAAwB;;;KAG/C,EAAE,YACH,SACA,GAAG;;;;MAID;;AAGN,MAAM,cAAc,OAAO,WAAW;;;YAG1B,EAAE,YAAY,cAAc,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;;KAEtF,WAAW,cAAc,KAAK,YAAY,cAAc;yBACpC,EAAE,YAAY;CACjC,MAAM,SAAS,eAAe,MAAM;AACpC,QAAO,SACH,UAAU,OAAO,oBAAoB,OAAO,UAAU,GACtD;EACJ;MACA,cAAc,WAAW,UAAU,OAAO,gBAAgB,GAAG,CAAC;;;KAG/D,EAAE,qBACH,CAAC,kBACD,GAAG;SACE,YAAY,YAAY,cAAc;;;SAGtC,YAAY,cAAc;;;MAG7B;;AAGN,MAAM,cAAc,OAAO,UAAU;iBACpB,EAAE,YAAY,cAAc,OAAO,eAAe,MAAM,cAAc,CAAC;;AAGxF,MAAM,eAAe,OAAO,UAAU;iBACrB,EAAE,YAAY,cAAc,OAAO,kBAAkB,MAAM,aAAa,CAAC;;AAG1F,MAAM,eAAe,OAAO,UAAU;iBACrB,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,WAAW,CAAC;;AAGvF,MAAM,sBAAsB,YAAyB;AACnD,SAAQ,SAAR;EACE,KAAA,UACE,QAAO;EACT,KAAA,UACE,QAAO;EAET,QACE,QAAO;;;AAIb,MAAM,WAAW,YAAuC;AACtD,SAAQ,SAAR;EACE,KAAA,UACE,QAAO,oBAAC,iBAAD,EAAmB,CAAA;EAC5B,KAAA,UACE,QAAO,oBAAC,iBAAD,EAAmB,CAAA;EAE5B,QACE,QAAO,oBAAC,gBAAD,EAAkB,CAAA;;;AAI/B,MAAa,SAAS,EACpB,SACA,aACA,WACA,oBACA,GAAG,gBACa;AAGhB,QACE,qBAHkB,mBAAmB,YAGzB,EAAZ;EACE,SAAS;GAAE,GAAG;GAAI,SAAS;GAAG,OAAO;GAAM;EAC3C,SAAS;GAAE,GAAG;GAAG,SAAS;GAAG,OAAO;GAAG;EACvC,MAAM;GACJ,SAAS;GACT,OAAO;GACP,YAAY;IAAE,UAAA;IAAkD,MAAM;IAAW;GAClF;EACD,MAAK;EACL,aAAU;EACV,YAAY;GAAE,MAAM;GAAS,UAAA;GAA8C,MAAM;GAAW;EAC5F,GAAI;YAXN;GAaE,oBAAC,WAAD,EAAA,UAAY,QAAQ,YAAY,EAAa,CAAA;GAC7C,oBAAC,cAAD;IAAc,OAAO;cAAqB;IAAuB,CAAA;GAChE,aACC,oBAAC,aAAD;IAAa,MAAK;IAAK,cAAW;IAAQ,OAAM;IAAQ,SAAS;cAC/D,oBAACA,SAAD,EAAS,CAAA;IACG,CAAA;GAEJ"}
1
+ {"version":3,"file":"index.mjs","names":["XIcon"],"sources":["../../../src/components/Toast/Toast.tsx"],"sourcesContent":["import { type HTMLMotionProps, motion } from 'framer-motion';\nimport type { ReactElement } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { IconButton } from '@persona/design-system/components/Button';\nimport {\n isActive,\n isFocused,\n isHovered,\n isNotDisabled,\n} from '@persona/design-system/lib/pseudoClass';\nimport { paragraphMixins } from '@persona/design-system/mixins/text';\nimport { Elevation } from '@persona/design-system/variables/effect';\nimport { TransitionDurationInSeconds } from '@persona/design-system/variables/transitions';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { CircleAlertIcon, CircleCheckIcon, CircleInfoIcon } from '@persona/icons';\nimport { XIcon } from '@persona/icons/12px';\n\nimport { withAlpha } from '#src/lib/color';\nimport { MessageType } from '#src/lib/message';\nimport { semanticColor, semanticOnly, semanticTokens } from '#src/lib/semanticColor';\n\nexport interface ToastProps extends HTMLMotionProps<'div'> {\n id: string;\n message: React.ReactNode;\n messageType: MessageType;\n onDismiss?: () => void;\n shouldClipOverflow?: boolean;\n}\n\n// This is exported and used by whatever container is rendering the Toasts\nexport const TOAST_WIDTH = '324px';\n\nconst BaseToast = styled(motion.div)`\n border-radius: ${BorderRadius.Md};\n box-shadow: ${Elevation.Low};\n color: ${({ theme }) => semanticColor(theme, 'FgPrimaryStatic', theme.color.text.primary)};\n ${paragraphMixins.md};\n display: flex;\n align-items: center;\n gap: ${Spacing[2]};\n box-sizing: border-box;\n padding: ${Spacing[2]} ${Spacing[3]};\n width: 100%;\n`;\n\nconst ToastIcon = styled.div`\n flex-shrink: 0;\n display: flex;\n line-height: 0;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimaryStatic', Color.BorderIconPrimary)};\n`;\n\nconst ToastContent = styled.div<{ $clip?: boolean }>`\n flex: 1;\n min-width: 0; /* needed for text to wrap/truncate inside flex container */\n ${({ $clip }) =>\n $clip &&\n css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `}\n`;\n\nconst CloseButton = styled(IconButton)<{ isFocusVisible?: boolean }>`\n flex-shrink: 0;\n margin-left: auto;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimaryStatic', Color.BorderIconPrimary)};\n\n &${isActive}${isNotDisabled}, &${isHovered}${isNotDisabled} {\n background-color: ${({ theme }) => {\n const tokens = semanticTokens(theme);\n return tokens\n ? withAlpha(tokens.ActionNeutralHover, tokens.Opacity25)\n : 'rgba(0, 0, 0, 0.05)';\n }};\n ${semanticOnly((tokens) => `color: ${tokens.FgPrimaryStatic};`)}\n }\n\n ${({ isFocusVisible }) =>\n !isFocusVisible &&\n css`\n &${isHovered}${isFocused}${isNotDisabled} {\n box-shadow: none;\n }\n &${isFocused}${isNotDisabled} {\n box-shadow: none;\n }\n `}\n`;\n\nconst NoticeToast = styled(BaseToast)`\n background: ${({ theme }) => semanticColor(theme, 'StatusInfo1', Color.CorePurple200)};\n`;\n\nconst SuccessToast = styled(BaseToast)`\n background: ${({ theme }) => semanticColor(theme, 'StatusSuccess1', Color.CoreGreen200)};\n`;\n\nconst FailureToast = styled(BaseToast)`\n background: ${({ theme }) => semanticColor(theme, 'StatusDanger2', Color.CoreRed200)};\n`;\n\nconst getStyledComponent = (variant: MessageType) => {\n switch (variant) {\n case MessageType.Success:\n return SuccessToast;\n case MessageType.Failure:\n return FailureToast;\n case MessageType.Notice:\n default:\n return NoticeToast;\n }\n};\n\nconst getIcon = (variant: MessageType): ReactElement => {\n switch (variant) {\n case MessageType.Success:\n return <CircleCheckIcon />;\n case MessageType.Failure:\n return <CircleAlertIcon />;\n case MessageType.Notice:\n default:\n return <CircleInfoIcon />;\n }\n};\n\nexport const Toast = ({\n message,\n messageType,\n onDismiss,\n shouldClipOverflow,\n ...elemProps\n}: ToastProps) => {\n const StyledToast = getStyledComponent(messageType);\n\n return (\n <StyledToast\n initial={{ y: 64, opacity: 0, scale: 0.96 }}\n animate={{ y: 0, opacity: 1, scale: 1 }}\n exit={{\n opacity: 0,\n scale: 0.9,\n transition: { duration: TransitionDurationInSeconds.MediumFast, ease: 'easeOut' },\n }}\n role='alert'\n aria-live='polite'\n transition={{ type: 'tween', duration: TransitionDurationInSeconds.Medium, ease: 'easeOut' }}\n {...elemProps}\n >\n <ToastIcon>{getIcon(messageType)}</ToastIcon>\n <ToastContent $clip={shouldClipOverflow}>{message}</ToastContent>\n {onDismiss && (\n <CloseButton size='sm' aria-label='Close' title='Close' onClick={onDismiss}>\n <XIcon />\n </CloseButton>\n )}\n </StyledToast>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AA+BA,MAAa,cAAc;AAE3B,MAAM,YAAY,OAAO,OAAO,IAAI;mBACjB,aAAa,GAAG;kIACL;YAClB,EAAE,YAAY,cAAc,OAAO,mBAAmB,MAAM,MAAM,KAAK,QAAQ,CAAC;IACxF,gBAAgB,GAAG;;;SAGd,QAAQ,GAAG;;aAEP,QAAQ,GAAG,GAAG,QAAQ,GAAG;;;AAItC,MAAM,YAAY,OAAO,GAAG;;;;YAIhB,EAAE,YAAY,cAAc,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;;AAG3F,MAAM,eAAe,OAAO,GAAwB;;;KAG/C,EAAE,YACH,SACA,GAAG;;;;MAID;;AAGN,MAAM,cAAc,OAAO,WAAW;;;YAG1B,EAAE,YAAY,cAAc,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;;KAEtF,WAAW,cAAc,KAAK,YAAY,cAAc;yBACpC,EAAE,YAAY;CACjC,MAAM,SAAS,eAAe,MAAM;AACpC,QAAO,SACH,UAAU,OAAO,oBAAoB,OAAO,UAAU,GACtD;EACJ;MACA,cAAc,WAAW,UAAU,OAAO,gBAAgB,GAAG,CAAC;;;KAG/D,EAAE,qBACH,CAAC,kBACD,GAAG;SACE,YAAY,YAAY,cAAc;;;SAGtC,YAAY,cAAc;;;MAG7B;;AAGN,MAAM,cAAc,OAAO,UAAU;iBACpB,EAAE,YAAY,cAAc,OAAO,eAAe,MAAM,cAAc,CAAC;;AAGxF,MAAM,eAAe,OAAO,UAAU;iBACrB,EAAE,YAAY,cAAc,OAAO,kBAAkB,MAAM,aAAa,CAAC;;AAG1F,MAAM,eAAe,OAAO,UAAU;iBACrB,EAAE,YAAY,cAAc,OAAO,iBAAiB,MAAM,WAAW,CAAC;;AAGvF,MAAM,sBAAsB,YAAyB;AACnD,SAAQ,SAAR;EACE,KAAA,UACE,QAAO;EACT,KAAA,UACE,QAAO;EAET,QACE,QAAO;;;AAIb,MAAM,WAAW,YAAuC;AACtD,SAAQ,SAAR;EACE,KAAA,UACE,QAAO,oBAAC,iBAAD,EAAmB,CAAA;EAC5B,KAAA,UACE,QAAO,oBAAC,iBAAD,EAAmB,CAAA;EAE5B,QACE,QAAO,oBAAC,gBAAD,EAAkB,CAAA;;;AAI/B,MAAa,SAAS,EACpB,SACA,aACA,WACA,oBACA,GAAG,gBACa;AAGhB,QACE,qBAHkB,mBAAmB,YAGzB,EAAZ;EACE,SAAS;GAAE,GAAG;GAAI,SAAS;GAAG,OAAO;GAAM;EAC3C,SAAS;GAAE,GAAG;GAAG,SAAS;GAAG,OAAO;GAAG;EACvC,MAAM;GACJ,SAAS;GACT,OAAO;GACP,YAAY;IAAE,UAAA;IAAkD,MAAM;IAAW;GAClF;EACD,MAAK;EACL,aAAU;EACV,YAAY;GAAE,MAAM;GAAS,UAAA;GAA8C,MAAM;GAAW;EAC5F,GAAI;YAXN;GAaE,oBAAC,WAAD,EAAA,UAAY,QAAQ,YAAY,EAAa,CAAA;GAC7C,oBAAC,cAAD;IAAc,OAAO;cAAqB;IAAuB,CAAA;GAChE,aACC,oBAAC,aAAD;IAAa,MAAK;IAAK,cAAW;IAAQ,OAAM;IAAQ,SAAS;cAC/D,oBAACA,SAAD,EAAS,CAAA;IACG,CAAA;GAEJ"}
@@ -7,7 +7,7 @@ import { n as Stack, t as HStack } from "../../Stack-Bzom2BTR.mjs";
7
7
  import { n as Button, t as IconButton } from "../../IconButton-DftINsp7.mjs";
8
8
  import { n as DropdownMenu_default } from "../../DropdownMenu-Q8S-9rXm.mjs";
9
9
  import { t as Spinner } from "../../Spinner-CXb-KUs1.mjs";
10
- import { i as Modal_default } from "../../Modal-92O_uW8H.mjs";
10
+ import { i as Modal_default } from "../../Modal-ziuzDCPN.mjs";
11
11
  import { t as TextAreaWithStyle } from "../../TextArea-Dro-HH8O.mjs";
12
12
  import { n as StatusIndicator } from "../../StatusIndicator-pWl1-FLb.mjs";
13
13
  import { useCallback, useMemo, useState } from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Modal","TextArea","DropdownMenu"],"sources":["../../../src/components/VersionHistory/VersionHistoryItem.tsx","../../../src/components/VersionHistory/VersionHistory.tsx"],"sourcesContent":["import { type MouseEvent, useMemo, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { MoreIcon } from '@persona/icons';\nimport Button, { IconButton } from 'design-system/components/Button';\nimport DropdownMenu from 'design-system/components/DropdownMenu';\nimport Modal from 'design-system/components/Modal';\nimport Spinner from 'design-system/components/Spinner';\nimport { HStack, Stack } from 'design-system/components/Stack';\nimport StatusIndicator from 'design-system/components/StatusIndicator';\nimport { Paragraph } from 'design-system/components/Text';\nimport TextArea from 'design-system/components/TextArea';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { focusOutline } from 'design-system/mixins/focus';\n\nexport type VersionHistoryStatus = 'live' | 'saved' | 'unsaved' | 'published';\n\nexport type VersionHistoryItemProps = {\n id: string;\n title: string;\n status: VersionHistoryStatus;\n timestamp: string;\n lastUpdater?: string;\n description?: string;\n compareLabel?: string;\n restoreLabel?: string;\n discardLabel?: string;\n editDescriptionLabel?: string;\n onRestore?: () => void;\n onDiscard?: () => void | Promise<void>;\n onCompare?: () => void;\n onEditDescription?: (description: string) => void;\n};\n\nconst DEFAULT_COMPARE_LABEL = 'Compare to latest version';\nconst DEFAULT_RESTORE_LABEL = 'Restore';\nconst DEFAULT_DISCARD_LABEL = 'Discard';\nconst DEFAULT_EDIT_DESCRIPTION_LABEL = 'Edit description';\n\nexport const hasVersionHistoryItemActions = (item: VersionHistoryItemProps) =>\n item.onCompare != null ||\n item.onRestore != null ||\n item.onDiscard != null ||\n item.onEditDescription != null;\n\ntype VersionHistoryItemViewProps = VersionHistoryItemProps & {\n isFirst: boolean;\n isLast: boolean;\n isSelected: boolean;\n isLoadingVersion: boolean;\n onSelect: () => void;\n showActionSlot: boolean;\n};\n\n/** Timeline stroke; 3px is the rail weight from the source panel. */\nconst RAIL_THICKNESS = '3px';\n\nconst ACTION_SLOT_WIDTH = `calc(${Spacing[8]} + ${Spacing[4]})`;\n\nconst Row = styled.div<{ $withActionSlot: boolean }>`\n display: grid;\n grid-template-columns: ${({ $withActionSlot }) =>\n $withActionSlot\n ? `${Spacing[7]} minmax(0, 1fr) ${ACTION_SLOT_WIDTH}`\n : `${Spacing[7]} minmax(0, 1fr)`};\n cursor: pointer;\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfacePrimary', Color.BackgroundPrimary)};\n ${focusOutline}\n\n &:hover:not([aria-current='true']) {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceHover', Color.BackgroundSecondary)};\n }\n\n &[aria-current='true'] {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceAccent', theme.color.background.highlight)};\n }\n`;\n\nconst RailColumn = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst RailSegment = styled.div<{ $selected: boolean }>`\n width: 0;\n border-left: ${RAIL_THICKNESS} solid\n ${({ theme, $selected }) =>\n $selected\n ? semanticColor(theme, 'FgAccent', Color.TextActive)\n : semanticColor(theme, 'BorderDefault', Color.BorderDivider)};\n flex: 1;\n`;\n\nconst RailStart = styled.div`\n height: ${Spacing[5]};\n flex-shrink: 0;\n`;\n\nconst TimelineDot = styled.span<{ $selected: boolean }>`\n width: ${Spacing[2]};\n height: ${Spacing[2]};\n border-radius: 50%;\n flex-shrink: 0;\n background-color: ${({ theme, $selected }) =>\n $selected\n ? semanticColor(theme, 'FgAccent', Color.TextActive)\n : semanticColor(theme, 'BorderDefault', Color.BorderDivider)};\n`;\n\nconst BodyColumn = styled.div`\n min-width: 0;\n padding: ${Spacing[4]} 0;\n`;\n\nconst ActionsColumn = styled.div<{ $revealed: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n width: ${ACTION_SLOT_WIDTH};\n padding: ${Spacing[4]} ${Spacing[4]} ${Spacing[4]} ${Spacing[2]};\n box-sizing: border-box;\n\n > * {\n visibility: ${({ $revealed }) => ($revealed ? 'visible' : 'hidden')};\n }\n\n ${Row}:hover &,\n ${Row}:focus-within & {\n > * {\n visibility: visible;\n }\n }\n`;\n\nconst StatusChip = ({ status }: { status: VersionHistoryStatus }) => {\n const chip = useMemo(() => {\n switch (status) {\n case 'live':\n return { label: 'Deployed', type: 'success' as const };\n case 'unsaved':\n return { label: 'Unsaved', type: 'critical' as const };\n case 'saved':\n return { label: 'Saved', type: 'feature' as const };\n default:\n return null;\n }\n }, [status]);\n\n if (chip == null) {\n return null;\n }\n\n return (\n <StatusIndicator type={chip.type} showIcon={false}>\n {chip.label}\n </StatusIndicator>\n );\n};\n\nconst VersionHistoryItem = ({\n id,\n title,\n status,\n timestamp,\n lastUpdater,\n description,\n compareLabel = DEFAULT_COMPARE_LABEL,\n restoreLabel = DEFAULT_RESTORE_LABEL,\n discardLabel = DEFAULT_DISCARD_LABEL,\n editDescriptionLabel = DEFAULT_EDIT_DESCRIPTION_LABEL,\n onRestore,\n onDiscard,\n onCompare,\n onEditDescription,\n isFirst,\n isLast,\n isSelected,\n isLoadingVersion,\n onSelect,\n showActionSlot,\n}: VersionHistoryItemViewProps) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isDiscardOpen, setIsDiscardOpen] = useState(false);\n const [isDiscarding, setIsDiscarding] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [draftDescription, setDraftDescription] = useState(description ?? '');\n\n const menuItems = [\n onCompare != null && {\n id: `${id}__compare`,\n label: compareLabel,\n variant: 'basic' as const,\n onClick: onCompare,\n },\n onRestore != null && {\n id: `${id}__restore`,\n label: restoreLabel,\n variant: 'basic' as const,\n onClick: onRestore,\n },\n onDiscard != null && {\n id: `${id}__discard`,\n label: discardLabel,\n variant: 'basic' as const,\n onClick: () => setIsDiscardOpen(true),\n },\n onEditDescription != null && {\n id: `${id}__edit-description`,\n label: editDescriptionLabel,\n variant: 'basic' as const,\n onClick: () => {\n setDraftDescription(description ?? '');\n setIsEditOpen(true);\n },\n },\n ].filter((item): item is Exclude<typeof item, false> => Boolean(item));\n\n const stopRowClick = (event: MouseEvent) => {\n event.stopPropagation();\n };\n\n const confirmDiscard = async () => {\n setIsDiscarding(true);\n try {\n await onDiscard?.();\n setIsDiscardOpen(false);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsDiscarding(false);\n }\n };\n\n const confirmEdit = () => {\n onEditDescription?.(draftDescription);\n setIsEditOpen(false);\n };\n\n return (\n <>\n <Modal\n open={isDiscardOpen}\n onOpenChange={setIsDiscardOpen}\n isKeyboardDismissDisabled={isDiscarding}\n contentProps={isDiscarding ? { showCloseButton: false } : undefined}\n title='Discard draft?'\n footer={\n <>\n <Button\n variant='basic'\n width='auto'\n disabled={isDiscarding}\n onClick={() => setIsDiscardOpen(false)}\n >\n Cancel\n </Button>\n <Button variant='danger' width='auto' isPending={isDiscarding} onClick={confirmDiscard}>\n Discard\n </Button>\n </>\n }\n >\n <Paragraph color='primary'>\n All unpublished changes in this draft will be discarded. This action is permanent and\n cannot be undone.\n </Paragraph>\n </Modal>\n <Modal\n open={isEditOpen}\n onOpenChange={(open) => {\n setIsEditOpen(open);\n if (open) {\n setDraftDescription(description ?? '');\n }\n }}\n title='Edit description'\n footer={\n <>\n <Button variant='basic' width='auto' onClick={() => setIsEditOpen(false)}>\n Cancel\n </Button>\n <Button variant='primary' width='auto' onClick={confirmEdit}>\n Confirm\n </Button>\n </>\n }\n >\n <TextArea\n autoFocus\n value={draftDescription}\n onChange={(event) => setDraftDescription(event.target.value)}\n placeholder='No description'\n />\n </Modal>\n <Row\n role='listitem'\n $withActionSlot={showActionSlot}\n aria-current={isSelected || undefined}\n aria-busy={isLoadingVersion || undefined}\n tabIndex={0}\n onClick={() => {\n if (!isSelected) {\n onSelect();\n }\n }}\n onKeyDown={(event) => {\n if (isSelected) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <RailColumn>\n {isFirst ? <RailStart /> : <RailSegment $selected={isSelected} />}\n <TimelineDot $selected={isSelected} />\n {!isLast && <RailSegment $selected={isSelected} />}\n </RailColumn>\n <BodyColumn>\n <Stack spacing={Spacing[1]}>\n <HStack spacing={Spacing[2]} align='center'>\n <Paragraph color='primary' as='span'>\n {timestamp}\n </Paragraph>\n <StatusChip status={status} />\n {isLoadingVersion && !showActionSlot && <Spinner srText='Version loading' />}\n </HStack>\n <HStack spacing={Spacing[1]} align='center'>\n <Paragraph color='secondary' size='sm'>\n {title}\n </Paragraph>\n {lastUpdater && (\n <>\n <Paragraph color='secondary' size='sm'>\n &middot;\n </Paragraph>\n <Paragraph color='secondary' size='sm'>\n {lastUpdater}\n </Paragraph>\n </>\n )}\n </HStack>\n {description != null && description !== '' && (\n <Paragraph color='secondary' size='sm'>\n {description}\n </Paragraph>\n )}\n </Stack>\n </BodyColumn>\n {showActionSlot && (\n <ActionsColumn\n $revealed={isLoadingVersion || isMenuOpen}\n onClick={isLoadingVersion ? undefined : stopRowClick}\n >\n {isLoadingVersion ? (\n <Spinner srText='Version loading' />\n ) : (\n menuItems.length > 0 && (\n <DropdownMenu\n portal\n onOpenChange={setIsMenuOpen}\n trigger={\n <IconButton size='md' aria-label='More'>\n <MoreIcon />\n </IconButton>\n }\n >\n {menuItems.map((item) => (\n <DropdownMenu.Item\n key={item.id}\n variant={item.variant}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n item.onClick?.();\n }}\n >\n {item.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n )\n )}\n </ActionsColumn>\n )}\n </Row>\n </>\n );\n};\n\nexport default VersionHistoryItem;\n","import { useCallback, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { XIcon } from '@persona/icons';\nimport { IconButton } from 'design-system/components/Button';\nimport Spinner from 'design-system/components/Spinner';\nimport { HStack, Stack } from 'design-system/components/Stack';\nimport { Paragraph } from 'design-system/components/Text';\nimport { semanticColor } from 'design-system/lib/semanticColor';\nimport { semanticScrollbar } from 'design-system/mixins/scrollbar';\n\nimport VersionHistoryItem, {\n hasVersionHistoryItemActions,\n type VersionHistoryItemProps,\n} from './VersionHistoryItem';\n\nexport type { VersionHistoryItemProps, VersionHistoryStatus } from './VersionHistoryItem';\n\n/** Matches the redesigned dashboard panel width. */\nconst PANEL_WIDTH = '600px';\n\nexport type VersionHistoryProps = {\n items: VersionHistoryItemProps[];\n selectedVersionId: string;\n onSelectVersion: (id: string) => void | Promise<void>;\n onClose?: () => void;\n loading?: boolean;\n emptyText?: string;\n};\n\nconst Panel = styled.nav`\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n width: ${PANEL_WIDTH};\n height: 100%;\n overflow: hidden;\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfacePrimary', Color.BackgroundPrimary)};\n border-left: 1px solid\n ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n`;\n\nconst Header = styled.div`\n flex-shrink: 0;\n padding: ${Spacing[3]} ${Spacing[5]};\n border-bottom: 1px solid\n ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n`;\n\nconst List = styled.div`\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n ${semanticScrollbar}\n`;\n\nconst LoadingBody = styled.div`\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n`;\n\nconst VersionHistory = ({\n items,\n selectedVersionId,\n onSelectVersion,\n onClose,\n loading = false,\n emptyText = 'No versions yet. Save or publish your changes to create one.',\n}: VersionHistoryProps) => {\n const [pendingVersionId, setPendingVersionId] = useState<string | null>(null);\n\n const selectVersion = useCallback(\n (versionId: string) => {\n if (pendingVersionId != null) {\n return;\n }\n const result = onSelectVersion(versionId);\n if (result instanceof Promise) {\n setPendingVersionId(versionId);\n const clearPending = () => setPendingVersionId(null);\n result.then(clearPending, clearPending);\n }\n },\n [onSelectVersion, pendingVersionId],\n );\n\n const showActionSlot = items.some(hasVersionHistoryItemActions);\n\n return (\n <Panel aria-label='Version History'>\n <Header>\n <HStack justify='space-between' align='center' spacing={Spacing[2]}>\n <Paragraph as='h3' size='lg' weight='bold' color='primary'>\n Version History\n </Paragraph>\n {onClose != null && (\n <IconButton size='md' aria-label='Close' onClick={onClose}>\n <XIcon />\n </IconButton>\n )}\n </HStack>\n </Header>\n {loading ? (\n <LoadingBody>\n <Spinner size='md' srText='Loading versions...' />\n </LoadingBody>\n ) : items.length === 0 ? (\n <Stack spacing={Spacing[3]} style={{ padding: Spacing[5] }}>\n <Paragraph color='secondary'>{emptyText}</Paragraph>\n </Stack>\n ) : (\n <List role='list' aria-label='Version history'>\n {items.map((item, index) => (\n <VersionHistoryItem\n key={item.id}\n {...item}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n isSelected={item.id === (pendingVersionId ?? selectedVersionId)}\n isLoadingVersion={item.id === pendingVersionId}\n showActionSlot={showActionSlot}\n onSelect={() => selectVersion(item.id)}\n />\n ))}\n </List>\n )}\n </Panel>\n );\n};\n\nexport { VersionHistory };\nexport default VersionHistory;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["Modal","TextArea","DropdownMenu"],"sources":["../../../src/components/VersionHistory/VersionHistoryItem.tsx","../../../src/components/VersionHistory/VersionHistory.tsx"],"sourcesContent":["import { type MouseEvent, useMemo, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { MoreIcon } from '@persona/icons';\n\nimport Button, { IconButton } from '#src/components/Button';\nimport DropdownMenu from '#src/components/DropdownMenu';\nimport Modal from '#src/components/Modal';\nimport Spinner from '#src/components/Spinner';\nimport { HStack, Stack } from '#src/components/Stack';\nimport StatusIndicator from '#src/components/StatusIndicator';\nimport { Paragraph } from '#src/components/Text';\nimport TextArea from '#src/components/TextArea';\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { focusOutline } from '#src/mixins/focus';\n\nexport type VersionHistoryStatus = 'live' | 'saved' | 'unsaved' | 'published';\n\nexport type VersionHistoryItemProps = {\n id: string;\n title: string;\n status: VersionHistoryStatus;\n timestamp: string;\n lastUpdater?: string;\n description?: string;\n compareLabel?: string;\n restoreLabel?: string;\n discardLabel?: string;\n editDescriptionLabel?: string;\n onRestore?: () => void;\n onDiscard?: () => void | Promise<void>;\n onCompare?: () => void;\n onEditDescription?: (description: string) => void;\n};\n\nconst DEFAULT_COMPARE_LABEL = 'Compare to latest version';\nconst DEFAULT_RESTORE_LABEL = 'Restore';\nconst DEFAULT_DISCARD_LABEL = 'Discard';\nconst DEFAULT_EDIT_DESCRIPTION_LABEL = 'Edit description';\n\nexport const hasVersionHistoryItemActions = (item: VersionHistoryItemProps) =>\n item.onCompare != null ||\n item.onRestore != null ||\n item.onDiscard != null ||\n item.onEditDescription != null;\n\ntype VersionHistoryItemViewProps = VersionHistoryItemProps & {\n isFirst: boolean;\n isLast: boolean;\n isSelected: boolean;\n isLoadingVersion: boolean;\n onSelect: () => void;\n showActionSlot: boolean;\n};\n\n/** Timeline stroke; 3px is the rail weight from the source panel. */\nconst RAIL_THICKNESS = '3px';\n\nconst ACTION_SLOT_WIDTH = `calc(${Spacing[8]} + ${Spacing[4]})`;\n\nconst Row = styled.div<{ $withActionSlot: boolean }>`\n display: grid;\n grid-template-columns: ${({ $withActionSlot }) =>\n $withActionSlot\n ? `${Spacing[7]} minmax(0, 1fr) ${ACTION_SLOT_WIDTH}`\n : `${Spacing[7]} minmax(0, 1fr)`};\n cursor: pointer;\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfacePrimary', Color.BackgroundPrimary)};\n ${focusOutline}\n\n &:hover:not([aria-current='true']) {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceHover', Color.BackgroundSecondary)};\n }\n\n &[aria-current='true'] {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceAccent', theme.color.background.highlight)};\n }\n`;\n\nconst RailColumn = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\n\nconst RailSegment = styled.div<{ $selected: boolean }>`\n width: 0;\n border-left: ${RAIL_THICKNESS} solid\n ${({ theme, $selected }) =>\n $selected\n ? semanticColor(theme, 'FgAccent', Color.TextActive)\n : semanticColor(theme, 'BorderDefault', Color.BorderDivider)};\n flex: 1;\n`;\n\nconst RailStart = styled.div`\n height: ${Spacing[5]};\n flex-shrink: 0;\n`;\n\nconst TimelineDot = styled.span<{ $selected: boolean }>`\n width: ${Spacing[2]};\n height: ${Spacing[2]};\n border-radius: 50%;\n flex-shrink: 0;\n background-color: ${({ theme, $selected }) =>\n $selected\n ? semanticColor(theme, 'FgAccent', Color.TextActive)\n : semanticColor(theme, 'BorderDefault', Color.BorderDivider)};\n`;\n\nconst BodyColumn = styled.div`\n min-width: 0;\n padding: ${Spacing[4]} 0;\n`;\n\nconst ActionsColumn = styled.div<{ $revealed: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n width: ${ACTION_SLOT_WIDTH};\n padding: ${Spacing[4]} ${Spacing[4]} ${Spacing[4]} ${Spacing[2]};\n box-sizing: border-box;\n\n > * {\n visibility: ${({ $revealed }) => ($revealed ? 'visible' : 'hidden')};\n }\n\n ${Row}:hover &,\n ${Row}:focus-within & {\n > * {\n visibility: visible;\n }\n }\n`;\n\nconst StatusChip = ({ status }: { status: VersionHistoryStatus }) => {\n const chip = useMemo(() => {\n switch (status) {\n case 'live':\n return { label: 'Deployed', type: 'success' as const };\n case 'unsaved':\n return { label: 'Unsaved', type: 'critical' as const };\n case 'saved':\n return { label: 'Saved', type: 'feature' as const };\n default:\n return null;\n }\n }, [status]);\n\n if (chip == null) {\n return null;\n }\n\n return (\n <StatusIndicator type={chip.type} showIcon={false}>\n {chip.label}\n </StatusIndicator>\n );\n};\n\nconst VersionHistoryItem = ({\n id,\n title,\n status,\n timestamp,\n lastUpdater,\n description,\n compareLabel = DEFAULT_COMPARE_LABEL,\n restoreLabel = DEFAULT_RESTORE_LABEL,\n discardLabel = DEFAULT_DISCARD_LABEL,\n editDescriptionLabel = DEFAULT_EDIT_DESCRIPTION_LABEL,\n onRestore,\n onDiscard,\n onCompare,\n onEditDescription,\n isFirst,\n isLast,\n isSelected,\n isLoadingVersion,\n onSelect,\n showActionSlot,\n}: VersionHistoryItemViewProps) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isDiscardOpen, setIsDiscardOpen] = useState(false);\n const [isDiscarding, setIsDiscarding] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [draftDescription, setDraftDescription] = useState(description ?? '');\n\n const menuItems = [\n onCompare != null && {\n id: `${id}__compare`,\n label: compareLabel,\n variant: 'basic' as const,\n onClick: onCompare,\n },\n onRestore != null && {\n id: `${id}__restore`,\n label: restoreLabel,\n variant: 'basic' as const,\n onClick: onRestore,\n },\n onDiscard != null && {\n id: `${id}__discard`,\n label: discardLabel,\n variant: 'basic' as const,\n onClick: () => setIsDiscardOpen(true),\n },\n onEditDescription != null && {\n id: `${id}__edit-description`,\n label: editDescriptionLabel,\n variant: 'basic' as const,\n onClick: () => {\n setDraftDescription(description ?? '');\n setIsEditOpen(true);\n },\n },\n ].filter((item): item is Exclude<typeof item, false> => Boolean(item));\n\n const stopRowClick = (event: MouseEvent) => {\n event.stopPropagation();\n };\n\n const confirmDiscard = async () => {\n setIsDiscarding(true);\n try {\n await onDiscard?.();\n setIsDiscardOpen(false);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsDiscarding(false);\n }\n };\n\n const confirmEdit = () => {\n onEditDescription?.(draftDescription);\n setIsEditOpen(false);\n };\n\n return (\n <>\n <Modal\n open={isDiscardOpen}\n onOpenChange={setIsDiscardOpen}\n isKeyboardDismissDisabled={isDiscarding}\n contentProps={isDiscarding ? { showCloseButton: false } : undefined}\n title='Discard draft?'\n footer={\n <>\n <Button\n variant='basic'\n width='auto'\n disabled={isDiscarding}\n onClick={() => setIsDiscardOpen(false)}\n >\n Cancel\n </Button>\n <Button variant='danger' width='auto' isPending={isDiscarding} onClick={confirmDiscard}>\n Discard\n </Button>\n </>\n }\n >\n <Paragraph color='primary'>\n All unpublished changes in this draft will be discarded. This action is permanent and\n cannot be undone.\n </Paragraph>\n </Modal>\n <Modal\n open={isEditOpen}\n onOpenChange={(open) => {\n setIsEditOpen(open);\n if (open) {\n setDraftDescription(description ?? '');\n }\n }}\n title='Edit description'\n footer={\n <>\n <Button variant='basic' width='auto' onClick={() => setIsEditOpen(false)}>\n Cancel\n </Button>\n <Button variant='primary' width='auto' onClick={confirmEdit}>\n Confirm\n </Button>\n </>\n }\n >\n <TextArea\n autoFocus\n value={draftDescription}\n onChange={(event) => setDraftDescription(event.target.value)}\n placeholder='No description'\n />\n </Modal>\n <Row\n role='listitem'\n $withActionSlot={showActionSlot}\n aria-current={isSelected || undefined}\n aria-busy={isLoadingVersion || undefined}\n tabIndex={0}\n onClick={() => {\n if (!isSelected) {\n onSelect();\n }\n }}\n onKeyDown={(event) => {\n if (isSelected) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <RailColumn>\n {isFirst ? <RailStart /> : <RailSegment $selected={isSelected} />}\n <TimelineDot $selected={isSelected} />\n {!isLast && <RailSegment $selected={isSelected} />}\n </RailColumn>\n <BodyColumn>\n <Stack spacing={Spacing[1]}>\n <HStack spacing={Spacing[2]} align='center'>\n <Paragraph color='primary' as='span'>\n {timestamp}\n </Paragraph>\n <StatusChip status={status} />\n {isLoadingVersion && !showActionSlot && <Spinner srText='Version loading' />}\n </HStack>\n <HStack spacing={Spacing[1]} align='center'>\n <Paragraph color='secondary' size='sm'>\n {title}\n </Paragraph>\n {lastUpdater && (\n <>\n <Paragraph color='secondary' size='sm'>\n &middot;\n </Paragraph>\n <Paragraph color='secondary' size='sm'>\n {lastUpdater}\n </Paragraph>\n </>\n )}\n </HStack>\n {description != null && description !== '' && (\n <Paragraph color='secondary' size='sm'>\n {description}\n </Paragraph>\n )}\n </Stack>\n </BodyColumn>\n {showActionSlot && (\n <ActionsColumn\n $revealed={isLoadingVersion || isMenuOpen}\n onClick={isLoadingVersion ? undefined : stopRowClick}\n >\n {isLoadingVersion ? (\n <Spinner srText='Version loading' />\n ) : (\n menuItems.length > 0 && (\n <DropdownMenu\n portal\n onOpenChange={setIsMenuOpen}\n trigger={\n <IconButton size='md' aria-label='More'>\n <MoreIcon />\n </IconButton>\n }\n >\n {menuItems.map((item) => (\n <DropdownMenu.Item\n key={item.id}\n variant={item.variant}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n item.onClick?.();\n }}\n >\n {item.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n )\n )}\n </ActionsColumn>\n )}\n </Row>\n </>\n );\n};\n\nexport default VersionHistoryItem;\n","import { useCallback, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\nimport { XIcon } from '@persona/icons';\n\nimport { IconButton } from '#src/components/Button';\nimport Spinner from '#src/components/Spinner';\nimport { HStack, Stack } from '#src/components/Stack';\nimport { Paragraph } from '#src/components/Text';\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { semanticScrollbar } from '#src/mixins/scrollbar';\n\nimport VersionHistoryItem, {\n hasVersionHistoryItemActions,\n type VersionHistoryItemProps,\n} from './VersionHistoryItem';\n\nexport type { VersionHistoryItemProps, VersionHistoryStatus } from './VersionHistoryItem';\n\n/** Matches the redesigned dashboard panel width. */\nconst PANEL_WIDTH = '600px';\n\nexport type VersionHistoryProps = {\n items: VersionHistoryItemProps[];\n selectedVersionId: string;\n onSelectVersion: (id: string) => void | Promise<void>;\n onClose?: () => void;\n loading?: boolean;\n emptyText?: string;\n};\n\nconst Panel = styled.nav`\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n width: ${PANEL_WIDTH};\n height: 100%;\n overflow: hidden;\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfacePrimary', Color.BackgroundPrimary)};\n border-left: 1px solid\n ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n`;\n\nconst Header = styled.div`\n flex-shrink: 0;\n padding: ${Spacing[3]} ${Spacing[5]};\n border-bottom: 1px solid\n ${({ theme }) => semanticColor(theme, 'BorderSubtle', Color.BorderDivider)};\n`;\n\nconst List = styled.div`\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n ${semanticScrollbar}\n`;\n\nconst LoadingBody = styled.div`\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n`;\n\nconst VersionHistory = ({\n items,\n selectedVersionId,\n onSelectVersion,\n onClose,\n loading = false,\n emptyText = 'No versions yet. Save or publish your changes to create one.',\n}: VersionHistoryProps) => {\n const [pendingVersionId, setPendingVersionId] = useState<string | null>(null);\n\n const selectVersion = useCallback(\n (versionId: string) => {\n if (pendingVersionId != null) {\n return;\n }\n const result = onSelectVersion(versionId);\n if (result instanceof Promise) {\n setPendingVersionId(versionId);\n const clearPending = () => setPendingVersionId(null);\n result.then(clearPending, clearPending);\n }\n },\n [onSelectVersion, pendingVersionId],\n );\n\n const showActionSlot = items.some(hasVersionHistoryItemActions);\n\n return (\n <Panel aria-label='Version History'>\n <Header>\n <HStack justify='space-between' align='center' spacing={Spacing[2]}>\n <Paragraph as='h3' size='lg' weight='bold' color='primary'>\n Version History\n </Paragraph>\n {onClose != null && (\n <IconButton size='md' aria-label='Close' onClick={onClose}>\n <XIcon />\n </IconButton>\n )}\n </HStack>\n </Header>\n {loading ? (\n <LoadingBody>\n <Spinner size='md' srText='Loading versions...' />\n </LoadingBody>\n ) : items.length === 0 ? (\n <Stack spacing={Spacing[3]} style={{ padding: Spacing[5] }}>\n <Paragraph color='secondary'>{emptyText}</Paragraph>\n </Stack>\n ) : (\n <List role='list' aria-label='Version history'>\n {items.map((item, index) => (\n <VersionHistoryItem\n key={item.id}\n {...item}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n isSelected={item.id === (pendingVersionId ?? selectedVersionId)}\n isLoadingVersion={item.id === pendingVersionId}\n showActionSlot={showActionSlot}\n onSelect={() => selectVersion(item.id)}\n />\n ))}\n </List>\n )}\n </Panel>\n );\n};\n\nexport { VersionHistory };\nexport default VersionHistory;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { c as FilterFieldType, d as FilterRuleValue, l as FilterOperator, o as FilterField, u as FilterRule } from "./types-DbOD5vE_.mjs";
2
- import { i as CommonStrings } from "./strings-CK9n6b65.mjs";
2
+ import { i as CommonStrings } from "./strings-BGXKl_m6.mjs";
3
3
  //#region src/components/DataTable/TableControls/FiltersV2/AdvancedFilterRulesPopover/display.d.ts
4
4
  interface ValueDisplayOptions {
5
5
  /** `PDSProvider` locale for date values; English format when omitted. */
@@ -1,4 +1,4 @@
1
- import { o as ComboboxOptionsOrGroups } from "./ComboboxBase-D2rDQHYZ.mjs";
1
+ import { o as ComboboxOptionsOrGroups } from "./ComboboxBase-5aSDuY-E.mjs";
2
2
  import { t as FieldRegistry } from "./FieldRegistry-a44G08fS.mjs";
3
3
 
4
4
  //#region src/components/DataTable/TableControls/FiltersV2/fieldPickerOptions.d.ts
@@ -1,4 +1,4 @@
1
- import { i as BaseFilterConfig, l as FilterTypeDefinition, t as ActiveFilter, u as FilterTypeResolver } from "./types-CayYd8EX.mjs";
1
+ import { i as BaseFilterConfig, l as FilterTypeDefinition, t as ActiveFilter, u as FilterTypeResolver } from "./types-sUEmxsGM.mjs";
2
2
  import { ComponentProps } from "react";
3
3
  import * as _$styled_components0 from "styled-components";
4
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
@@ -19,4 +19,4 @@ declare const Filters: <TFilter extends BaseFilterConfig>({
19
19
  }) => _$react_jsx_runtime0.JSX.Element;
20
20
  //#endregion
21
21
  export { resolveFilterTypeDefinition as a, isFilterActive as i, FiltersContainer as n, synchronizeActiveFilters as o, getActiveFilters as r, Filters as t };
22
- //# sourceMappingURL=filters-DjXkx8GJ.d.mts.map
22
+ //# sourceMappingURL=filters-CkAFU8LV.d.mts.map
@@ -1,2 +1,2 @@
1
- import { a as resolveFilterTypeDefinition, i as isFilterActive, n as FiltersContainer, o as synchronizeActiveFilters, r as getActiveFilters, t as Filters } from "./filters-DjXkx8GJ.mjs";
1
+ import { a as resolveFilterTypeDefinition, i as isFilterActive, n as FiltersContainer, o as synchronizeActiveFilters, r as getActiveFilters, t as Filters } from "./filters-CkAFU8LV.mjs";
2
2
  export { Filters, FiltersContainer, getActiveFilters, isFilterActive, resolveFilterTypeDefinition, synchronizeActiveFilters };
@@ -1,6 +1,6 @@
1
1
  import { n as CheckboxProps } from "./Checkbox-ZywrdT_h.mjs";
2
- import { i as CommonStrings } from "./strings-CK9n6b65.mjs";
3
- import { S as RenderValueStickerFormatConfig, b as DatetimeConfig, d as DataTableColumnImageFormat, h as DataTableColumnStringFormat, l as DataTableColumnFormat, p as DataTableColumnPiiFormat, y as DateConfig } from "./types-DJobO07d.mjs";
2
+ import { i as CommonStrings } from "./strings-BGXKl_m6.mjs";
3
+ import { S as RenderValueStickerFormatConfig, b as DatetimeConfig, d as DataTableColumnImageFormat, h as DataTableColumnStringFormat, l as DataTableColumnFormat, p as DataTableColumnPiiFormat, y as DateConfig } from "./types-DoJubhWu.mjs";
4
4
  import { ReactNode } from "react";
5
5
 
6
6
  //#region src/components/DataTable/helpers.d.ts
@@ -87,4 +87,4 @@ declare const renderAsLightweightImage: (value: unknown, config?: DataTableColum
87
87
  declare const renderAsPDSFormat: <TData = unknown>(value: unknown, format?: DataTableColumnFormat<TData>, row?: TData, options?: PDSFormatOptions) => string | ReactNode;
88
88
  //#endregion
89
89
  export { renderAsDate as a, renderAsNumber as c, renderAsSticker as d, renderAsString as f, renderAsCopyableString as i, renderAsPDSFormat as l, renderAsCheckbox as n, renderAsDatetime as o, renderAsURL as p, renderAsCheckboxHeader as r, renderAsLightweightImage as s, PDSFormatOptions as t, renderAsPii as u };
90
- //# sourceMappingURL=helpers-CdxEL7ri.d.mts.map
90
+ //# sourceMappingURL=helpers-Dvvcz-hL.d.mts.map
@@ -1,2 +1,2 @@
1
- import { a as renderAsDate, c as renderAsNumber, d as renderAsSticker, f as renderAsString, i as renderAsCopyableString, l as renderAsPDSFormat, n as renderAsCheckbox, o as renderAsDatetime, p as renderAsURL, r as renderAsCheckboxHeader, s as renderAsLightweightImage, t as PDSFormatOptions, u as renderAsPii } from "./helpers-CdxEL7ri.mjs";
1
+ import { a as renderAsDate, c as renderAsNumber, d as renderAsSticker, f as renderAsString, i as renderAsCopyableString, l as renderAsPDSFormat, n as renderAsCheckbox, o as renderAsDatetime, p as renderAsURL, r as renderAsCheckboxHeader, s as renderAsLightweightImage, t as PDSFormatOptions, u as renderAsPii } from "./helpers-Dvvcz-hL.mjs";
2
2
  export { PDSFormatOptions, renderAsCheckbox, renderAsCheckboxHeader, renderAsCopyableString, renderAsDate, renderAsDatetime, renderAsLightweightImage, renderAsNumber, renderAsPDSFormat, renderAsPii, renderAsSticker, renderAsString, renderAsURL };
@@ -20,6 +20,7 @@ const DEFAULT_COMMON_STRINGS = {
20
20
  showingItems: (firstItem, lastItem, totalItems) => `Showing ${firstItem}-${lastItem} of ${totalItems} items`,
21
21
  pageCount: (_currentPage, totalPages) => `of ${totalPages} pages`,
22
22
  many: "many",
23
+ atLeast: (count) => `${count}+`,
23
24
  goToPageNumber: "Go to page number",
24
25
  previousPage: "Previous page",
25
26
  nextPage: "Next page",
@@ -221,4 +222,4 @@ function formatTimeZoneName(dateTime, locale) {
221
222
  //#endregion
222
223
  export { formatTimeZoneName as a, usePDSLocale as c, resolveCommonStrings as d, formatDateTime as i, usePDSStrings as l, LEGACY_DATE_FORMAT as n, usesLegacyDateFormat as o, formatDate as r, PDSI18nProvider as s, LEGACY_DATETIME_FORMAT as t, DEFAULT_COMMON_STRINGS as u };
223
224
 
224
- //# sourceMappingURL=i18n-BLyCaSdJ.mjs.map
225
+ //# sourceMappingURL=i18n-CKRi992F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n-CKRi992F.mjs","names":[],"sources":["../src/lib/i18n/strings.ts","../src/lib/i18n/I18nContext.tsx","../src/lib/i18n/formatDateTime.ts"],"sourcesContent":["/**\n * Built-in, user-visible copy rendered by PDS components.\n *\n * Every key has an English default in `DEFAULT_COMMON_STRINGS`. Hosts translate by passing\n * overrides to `PDSProvider`'s `strings` prop; any key they omit keeps its English default.\n * Function-valued keys take the interpolated values (counts, names, labels) as arguments.\n *\n * Key names line up with the `CommonStringOverrides` tables that\n * `@persona-id/persona-dashboard-app` ships (`useCommonStrings()`), so a dashboard can pass\n * those tables straight through.\n */\ntype Arg = string | number;\n\nexport interface CommonStrings {\n // --- Modal ------------------------------------------------------------------------------\n closeModal: string;\n\n // --- DataTable --------------------------------------------------------------------------\n noResults: string;\n noResultsTryFilters: string;\n noColumnsConfigured: string;\n selectAll: string;\n selectAllOf: (header: Arg) => string;\n selectRow: (rowId: Arg) => string;\n selectRowForColumn: (columnHeader: Arg, rowId: Arg) => string;\n clearSelection: string;\n selectedItems: (count: Arg) => string;\n noImage: string;\n viewRowActions: (rowNumber: Arg) => string;\n\n // --- Pagination -------------------------------------------------------------------------\n pagination: string;\n itemsPerPage: string;\n showingItems: (firstItem: Arg, lastItem: Arg, totalItems: Arg) => string;\n /**\n * Totals phrase rendered right after the current page (the go-to-page input, or the page number\n * as text), e.g. `of 3 pages` in `[1] of 3 pages`. Return only that phrase: the current page is\n * already on screen, so do not interpolate `currentPage` into the result. It is passed only for\n * languages whose wording depends on it. `totalPages` is `many` when the total is unknown.\n */\n pageCount: (currentPage: Arg, totalPages: Arg) => string;\n /** Stands in for an unknown total (\"of many pages\") when the server only knows a lower bound. */\n many: string;\n /**\n * A total known only as a minimum, e.g. `13+` in `of 13+ pages` or `650+` in `of 650+ items`.\n * Rendered in place of `totalPages` and `totalItems` when the pager's total is a lower bound.\n */\n atLeast: (count: Arg) => string;\n goToPageNumber: string;\n previousPage: string;\n nextPage: string;\n previousShort: string;\n next: string;\n\n // --- Column configuration (table properties gear) --------------------------------------\n tableProperties: string;\n configureViewPermissionDenied: string;\n configureColumns: string;\n searchColumns: string;\n shownColumns: string;\n hiddenColumns: string;\n noMatchingColumns: string;\n showColumn: (label: Arg) => string;\n hideColumn: (label: Arg) => string;\n\n // --- Saved views (control bar tabs) -----------------------------------------------------\n defaultView: string;\n saveView: string;\n saveCurrentView: string;\n addNewView: string;\n searchViews: string;\n moreViews: (count: Arg) => string;\n duplicateView: string;\n resetView: string;\n saveViewMenuItem: string;\n setAsDefaultView: string;\n unsetDefaultView: string;\n setDefaultViewTitle: string;\n setDefaultViewConfirmation: (viewName: Arg) => string;\n unsetDefaultViewTitle: string;\n unsetDefaultViewConfirmation: (viewName: Arg) => string;\n showView: string;\n hideView: string;\n hideViewTitle: string;\n hideViewNamed: (viewName: Arg) => string;\n delete: string;\n cancel: string;\n deleteViewTitle: string;\n deleteViewConfirmation: (viewName: Arg) => string;\n showFilters: string;\n hideFilters: string;\n showSearchBar: string;\n\n // --- Config-driven TableControls filters -----------------------------------------------\n filterType: string;\n filterActions: string;\n selectFilterOption: string;\n selectFilterType: string;\n deleteFilter: string;\n addFilter: string;\n filterGroupLabel: (filterName: Arg) => string;\n\n // --- Filters V2: bar, pills and field picker -------------------------------------------\n filterBar: string;\n filter: string;\n filterFieldPicker: string;\n fields: string;\n editFilter: (description: Arg) => string;\n removeFilter: (description: Arg) => string;\n editFilterFor: (fieldLabel: Arg) => string;\n additionalValues: string;\n operator: string;\n groupCount: (count: Arg) => string;\n booleanTrue: string;\n booleanFalse: string;\n booleanValue: string;\n fieldValue: (fieldLabel: Arg) => string;\n applyFilter: string;\n selectAnOptionPlaceholder: string;\n enterAValue: string;\n enterANumber: string;\n searchPlaceholder: string;\n noMatches: string;\n\n // --- Filters V2: advanced rules builder -------------------------------------------------\n rules: string;\n rulesWithCount: (count: Arg) => string;\n advancedFilterRules: string;\n conditionIf: string;\n conditionAnd: string;\n conditionOr: string;\n editStatement: (condition: Arg) => string;\n clearAll: string;\n deleteGroup: string;\n filterGroup: (groupNumber: Arg) => string;\n moreActionsForFilterGroup: (groupNumber: Arg) => string;\n addRuleToFilterGroup: (groupNumber: Arg) => string;\n noRulesYet: string;\n rulesInGroup: (groupNumber: Arg) => string;\n orGroup: string;\n field: string;\n value: string;\n selectField: string;\n fieldForRule: (ruleNumber: Arg, groupNumber: Arg) => string;\n operatorForRule: (ruleNumber: Arg, groupNumber: Arg) => string;\n\n // --- Filters V2: operator labels --------------------------------------------------------\n operatorIs: string;\n operatorIsNot: string;\n operatorContains: string;\n operatorDoesNotContain: string;\n operatorIsEmpty: string;\n operatorIsNotEmpty: string;\n operatorIsTrue: string;\n operatorIsFalse: string;\n operatorBefore: string;\n operatorAfter: string;\n operatorBetween: string;\n operatorIsAnyOf: string;\n operatorIsNoneOf: string;\n operatorGreaterThan: string;\n operatorGreaterThanOrEqual: string;\n operatorLessThan: string;\n operatorLessThanOrEqual: string;\n /** Numeric (`integer` / `float`) field operators, e.g. \"Members is equal to 5\". */\n operatorIsEqualTo: string;\n operatorIsGreaterThan: string;\n operatorIsLessThan: string;\n}\n\nexport type CommonStringKey = keyof CommonStrings;\n\n/** A single override value: plain copy, or a formatter for keys that interpolate. */\nexport type CommonStringValue = string | ((...args: Arg[]) => string);\n\n/**\n * What `PDSProvider` accepts. Deliberately loose (any string key, string or formatter value) so a\n * host's translation table can be passed through untyped; values whose kind does not match the\n * default (a string where a formatter is expected, or vice versa) are ignored.\n */\nexport type CommonStringOverrides = Readonly<Record<string, CommonStringValue | undefined>>;\n\nexport const DEFAULT_COMMON_STRINGS: Readonly<CommonStrings> = {\n closeModal: 'Close',\n\n noResults: 'No results found.',\n noResultsTryFilters: 'No results found. Try changing your filters.',\n noColumnsConfigured: 'No columns configured',\n selectAll: 'Select all',\n selectAllOf: (header) => `Select all ${header}`,\n selectRow: (rowId) => `Select row ${rowId}`,\n selectRowForColumn: (columnHeader, rowId) => `${columnHeader} for row ${rowId}`,\n clearSelection: 'Clear selection',\n selectedItems: (count) => `${count} selected`,\n noImage: 'No image',\n viewRowActions: (rowNumber) => `View actions for row ${rowNumber}`,\n\n pagination: 'pagination',\n itemsPerPage: 'Items per page:',\n showingItems: (firstItem, lastItem, totalItems) =>\n `Showing ${firstItem}-${lastItem} of ${totalItems} items`,\n pageCount: (_currentPage, totalPages) => `of ${totalPages} pages`,\n many: 'many',\n atLeast: (count) => `${count}+`,\n goToPageNumber: 'Go to page number',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n previousShort: 'Prev',\n next: 'Next',\n\n tableProperties: 'Table Properties',\n configureViewPermissionDenied: 'Your role does not have permission to configure the view.',\n configureColumns: 'Configure columns',\n searchColumns: 'Search by item...',\n shownColumns: 'Shown attributes',\n hiddenColumns: 'Hidden attributes',\n noMatchingColumns: 'No matching attributes',\n showColumn: (label) => `Show ${label}`,\n hideColumn: (label) => `Hide ${label}`,\n\n defaultView: 'Default view',\n saveView: 'Save view',\n saveCurrentView: 'Save current view',\n addNewView: 'Add new view',\n searchViews: 'Search for a view...',\n moreViews: (count) => `${count} more\\u2026`,\n duplicateView: 'Duplicate',\n resetView: 'Reset',\n saveViewMenuItem: 'Save',\n setAsDefaultView: 'Set as default',\n unsetDefaultView: 'Unset default',\n setDefaultViewTitle: 'Set as default view?',\n setDefaultViewConfirmation: (viewName) =>\n `This will change the default view for your entire organization. Everyone will see \\u201c${viewName}\\u201d when they open this table without a view selected.`,\n unsetDefaultViewTitle: 'Unset default view?',\n unsetDefaultViewConfirmation: (viewName) =>\n `This will change the default view for your entire organization. Everyone will see the built-in default view instead of \\u201c${viewName}\\u201d.`,\n showView: 'Show',\n hideView: 'Hide',\n hideViewTitle: 'Hide view',\n hideViewNamed: (viewName) => `Hide ${viewName}`,\n delete: 'Delete',\n cancel: 'Cancel',\n deleteViewTitle: 'Delete view?',\n deleteViewConfirmation: (viewName) =>\n `This will permanently delete \\u201c${viewName}\\u201d. This action cannot be undone.`,\n showFilters: 'Show filters',\n hideFilters: 'Hide filters',\n showSearchBar: 'Show search bar',\n\n filterType: 'Filter type',\n filterActions: 'Filter actions',\n selectFilterOption: 'Select...',\n selectFilterType: 'Select filter type',\n deleteFilter: 'Delete filter',\n addFilter: 'Add filter',\n filterGroupLabel: (filterName) => `${filterName} filter`,\n\n filterBar: 'Filter bar',\n filter: 'Filter',\n filterFieldPicker: 'Filter field picker',\n fields: 'Fields',\n editFilter: (description) => `Edit filter: ${description}`,\n removeFilter: (description) => `Remove filter: ${description}`,\n editFilterFor: (fieldLabel) => `Edit filter for ${fieldLabel}`,\n additionalValues: 'Additional values',\n operator: 'Operator',\n groupCount: (count) => `${count} group${Number(count) === 1 ? '' : 's'}`,\n booleanTrue: 'True',\n booleanFalse: 'False',\n booleanValue: 'Boolean value',\n fieldValue: (fieldLabel) => `${fieldLabel} value`,\n applyFilter: 'Apply filter',\n selectAnOptionPlaceholder: 'Select an option',\n enterAValue: 'Enter a value',\n enterANumber: 'Enter a number',\n searchPlaceholder: 'Search',\n noMatches: 'No matches',\n\n rules: 'Rules',\n rulesWithCount: (count) => `Rules ${count}`,\n advancedFilterRules: 'Advanced filter rules',\n conditionIf: 'If',\n conditionAnd: 'And',\n conditionOr: 'Or',\n editStatement: (condition) => `Edit \\u2018${condition}\\u2019 statement`,\n clearAll: 'Clear all',\n deleteGroup: 'Delete group',\n filterGroup: (groupNumber) => `Filter group ${groupNumber}`,\n moreActionsForFilterGroup: (groupNumber) => `More actions for filter group ${groupNumber}`,\n addRuleToFilterGroup: (groupNumber) => `Add rule to filter group ${groupNumber}`,\n noRulesYet: 'No rules yet',\n rulesInGroup: (groupNumber) => `Rules in group ${groupNumber}`,\n orGroup: 'Or group',\n field: 'Field',\n value: 'Value',\n selectField: 'Select field',\n fieldForRule: (ruleNumber, groupNumber) => `Field for rule ${ruleNumber} in group ${groupNumber}`,\n operatorForRule: (ruleNumber, groupNumber) =>\n `Operator for rule ${ruleNumber} in group ${groupNumber}`,\n\n operatorIs: 'is',\n operatorIsNot: 'is not',\n operatorContains: 'contains',\n operatorDoesNotContain: 'does not contain',\n operatorIsEmpty: 'is empty',\n operatorIsNotEmpty: 'is not empty',\n operatorIsTrue: 'is true',\n operatorIsFalse: 'is false',\n operatorBefore: 'before',\n operatorAfter: 'after',\n operatorBetween: 'is between',\n operatorIsAnyOf: 'is any of',\n operatorIsNoneOf: 'is none of',\n operatorGreaterThan: '>',\n operatorGreaterThanOrEqual: '≥',\n operatorLessThan: '<',\n operatorLessThanOrEqual: '≤',\n operatorIsEqualTo: 'is equal to',\n operatorIsGreaterThan: 'is greater than',\n operatorIsLessThan: 'is less than',\n};\n\n/**\n * Layer `overrides` on top of `base`. A value only replaces the base entry when it has the same\n * kind (string vs. formatter), so a mistyped override can never crash a render.\n */\nexport function resolveCommonStrings(\n overrides: CommonStringOverrides | undefined,\n base: Readonly<CommonStrings> = DEFAULT_COMMON_STRINGS,\n): CommonStrings {\n const resolved = { ...base } as Record<CommonStringKey, CommonStringValue>;\n if (!overrides) {\n return resolved as unknown as CommonStrings;\n }\n (Object.keys(base) as CommonStringKey[]).forEach((key) => {\n const override = Object.prototype.hasOwnProperty.call(overrides, key)\n ? overrides[key]\n : undefined;\n if (override != null && typeof override === typeof base[key]) {\n resolved[key] = override;\n }\n });\n return resolved as unknown as CommonStrings;\n}\n","import { createContext, useContext, useMemo, type FC, type PropsWithChildren } from 'react';\n\nimport {\n DEFAULT_COMMON_STRINGS,\n resolveCommonStrings,\n type CommonStringOverrides,\n type CommonStrings,\n} from './strings';\n\ninterface PDSI18nContextValue {\n strings: CommonStrings;\n locale: string | undefined;\n}\n\nconst PDSI18nContext = createContext<PDSI18nContextValue>({\n strings: DEFAULT_COMMON_STRINGS,\n locale: undefined,\n});\n\nexport interface PDSI18nProviderProps {\n /** Overrides for built-in copy; omitted keys inherit from an outer provider, then English. */\n strings?: CommonStringOverrides;\n /** BCP 47 locale for date/time formatting; inherits from an outer provider when omitted. */\n locale?: string;\n}\n\n/**\n * Supplies translated built-in copy and the active locale to PDS components. `PDSProvider`\n * always renders this; use it directly only to override a subtree.\n */\nexport const PDSI18nProvider: FC<PropsWithChildren<PDSI18nProviderProps>> = ({\n strings,\n locale,\n children,\n}) => {\n const parent = useContext(PDSI18nContext);\n const value = useMemo(\n () => ({\n strings: strings ? resolveCommonStrings(strings, parent.strings) : parent.strings,\n locale: locale ?? parent.locale,\n }),\n [parent, strings, locale],\n );\n return <PDSI18nContext.Provider value={value}>{children}</PDSI18nContext.Provider>;\n};\n\n/** Built-in copy for the current locale (English unless a provider supplied overrides). */\nexport function usePDSStrings(): CommonStrings {\n return useContext(PDSI18nContext).strings;\n}\n\n/** The locale supplied to `PDSProvider`, or `undefined` when the host has not set one. */\nexport function usePDSLocale(): string | undefined {\n return useContext(PDSI18nContext).locale;\n}\n","import { DateTime, type DateTimeFormatOptions } from 'luxon';\n\n/** Luxon medium date, e.g. \"Oct 5, 2011\". */\nexport const LEGACY_DATE_FORMAT = 'DD';\n/** e.g. \"Oct 5, 2011 2:48 PM\". */\nexport const LEGACY_DATETIME_FORMAT = 'MMM d, yyyy h:mm a';\n/** Short time zone name, e.g. \"EDT\" (en-US) or \"HAE\" (fr-CA). */\nconst TIME_ZONE_TOKEN = 'ZZZZ';\n\n/**\n * Whether `locale` keeps PDS's historical English token formats. No locale (a host that has not\n * opted in) and US English render exactly as before; every other locale gets `Intl` presets so\n * the day/month order, month names, 24-hour clock and separators follow the locale.\n */\nexport function usesLegacyDateFormat(locale: string | undefined): boolean {\n if (!locale) {\n return true;\n }\n const normalized = locale.toLowerCase().replace('_', '-');\n return normalized === 'en' || normalized === 'en-us';\n}\n\nexport interface FormatDateTimeOptions {\n /** BCP 47 locale, usually from `usePDSLocale()`. */\n locale?: string;\n /** Explicit Luxon `toFormat` tokens; month/day names still localize when a locale is set. */\n format?: string;\n /** Append the short time zone name, localized (\"EDT\" in en-US, \"HAE\" in fr-CA). */\n showTimeZone?: boolean;\n}\n\nfunction withLocale(dateTime: DateTime, locale: string | undefined): DateTime {\n return locale ? dateTime.setLocale(locale) : dateTime;\n}\n\nfunction format(\n dateTime: DateTime,\n legacyFormat: string,\n preset: DateTimeFormatOptions,\n { locale, format: explicitFormat, showTimeZone }: FormatDateTimeOptions,\n): string {\n const localized = withLocale(dateTime, locale);\n if (explicitFormat || usesLegacyDateFormat(locale)) {\n const formatted = localized.toFormat(explicitFormat ?? legacyFormat);\n return showTimeZone ? `${formatted} ${localized.toFormat(TIME_ZONE_TOKEN)}` : formatted;\n }\n return localized.toLocaleString(showTimeZone ? { ...preset, timeZoneName: 'short' } : preset);\n}\n\n/** Format a calendar date for display (\"Oct 5, 2011\" / \"5 oct. 2011\"). */\nexport function formatDate(dateTime: DateTime, options: FormatDateTimeOptions = {}): string {\n return format(dateTime, LEGACY_DATE_FORMAT, DateTime.DATE_MED, options);\n}\n\n/** Format a date and time for display (\"Oct 5, 2011 2:48 PM\" / \"5 oct. 2011, 14 h 48\"). */\nexport function formatDateTime(dateTime: DateTime, options: FormatDateTimeOptions = {}): string {\n return format(dateTime, LEGACY_DATETIME_FORMAT, DateTime.DATETIME_MED, options);\n}\n\n/** The short time zone name for `dateTime`'s zone in `locale` (\"EDT\" / \"HAE\"). */\nexport function formatTimeZoneName(dateTime: DateTime, locale?: string): string {\n return withLocale(dateTime, locale).toFormat(TIME_ZONE_TOKEN);\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as ListBoxItemProps, r as ListBoxProps$1 } from "./ListBox-D9SYTzOd.mjs";
2
- import { n as LogicRowProps } from "./LogicRow-BWIZ7262.mjs";
1
+ import { n as ListBoxItemProps, r as ListBoxProps$1 } from "./ListBox-CvnFiHK5.mjs";
2
+ import { n as LogicRowProps } from "./LogicRow-COvZNiUd.mjs";
3
3
  import * as _$react from "react";
4
4
  import * as _$react_aria_components0 from "react-aria-components";
5
5
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
@@ -52,4 +52,4 @@ declare const ListBox: {
52
52
  };
53
53
  //#endregion
54
54
  export { ListBox as t };
55
- //# sourceMappingURL=index-DX5Zu9JU.d.mts.map
55
+ //# sourceMappingURL=index-B3A74_ew.d.mts.map
package/dist/index6.d.mts CHANGED
@@ -7,7 +7,7 @@ import { t as resolveDateRangeRuleValue } from "./date-range-rule-value-CrVBpQcf
7
7
  import { t as FilterBarProps } from "./index-FgIOTuJ4.mjs";
8
8
  import { a as useFilterBarSize, i as FilterSizeTokens, t as FILTER_SIZE_TOKENS } from "./filter-size-context-CbT4pi3S.mjs";
9
9
  import { n as PillShellProps, t as PillShell } from "./PillShell-B35z66jZ.mjs";
10
- import { _ as isNumericComparisonOperator, a as emptyValueForRule, b as reconcileValueForOperator, c as getDefaultOperatorForType, d as getOperatorsForType, n as NumericComparisonOperator, p as isCompleteDateRange, t as NUMERIC_COMPARISON_OPERATORS, u as getOperatorsForField, v as isRangeOperator, y as isValuelessOperator } from "./operators-gCG7uZ6y.mjs";
10
+ import { _ as isNumericComparisonOperator, a as emptyValueForRule, b as reconcileValueForOperator, c as getDefaultOperatorForType, d as getOperatorsForType, n as NumericComparisonOperator, p as isCompleteDateRange, t as NUMERIC_COMPARISON_OPERATORS, u as getOperatorsForField, v as isRangeOperator, y as isValuelessOperator } from "./operators-BrrJKENE.mjs";
11
11
  import { a as decodeFilterStateFromUrl, i as decodeFilterStateFromString, n as UrlStateCodecResult, o as encodeFilterStateToUrlParam, r as applyFilterStateToSearchParams, t as FILTER_STATE_URL_PARAM } from "./url-state-CmgyDnG7.mjs";
12
12
  import { n as UseFilterStateV2Result, r as useFilterStateV2, t as UseFilterStateV2Options } from "./useFilterStateV2-CPBt0qwc.mjs";
13
13
  import { n as isFilterStateV2, r as pruneToRegistry, t as hasCompleteValue } from "./validation-BaqPVG1C.mjs";
@@ -1,11 +1,11 @@
1
1
  import { n as CheckboxProps } from "./Checkbox-ZywrdT_h.mjs";
2
- import { n as ComboboxMultiSelectProps } from "./ComboboxMultiSelect-CrvB6ap5.mjs";
3
- import { n as ComboboxSingleSelectProps } from "./ComboboxSingleSelect-Dp0iTdDO.mjs";
4
- import { n as FormFieldBaseProps } from "./FormField-PBo1ctY8.mjs";
2
+ import { n as ComboboxMultiSelectProps } from "./ComboboxMultiSelect-D3mX4Dzq.mjs";
3
+ import { n as ComboboxSingleSelectProps } from "./ComboboxSingleSelect-CfSy6sCU.mjs";
4
+ import { n as FormFieldBaseProps } from "./FormField-D10LW9-a.mjs";
5
5
  import { a as InputProps } from "./Input-QNjbGo38.mjs";
6
6
  import { n as RadioGroupProps } from "./RadioGroup-pyGpWhhj.mjs";
7
7
  import { i as SegmentedControlProps } from "./SegmentedControl-UV03Ujqn.mjs";
8
- import { i as SelectProps } from "./Select-Chk5WB1F.mjs";
8
+ import { i as SelectProps } from "./Select-BLqHxJUz.mjs";
9
9
  import { t as TextAreaProps } from "./TextArea-gtSlghjy.mjs";
10
10
  import { n as ToggleProps } from "./Toggle-BlvrM-Cw.mjs";
11
11
  import * as _$react from "react";
@@ -68,4 +68,4 @@ type ComboboxMultiSelectFieldProps<T = string> = ImplementsFormField & ComboboxM
68
68
  declare const ComboboxField: (props: ComboboxSingleSelectFieldProps | ComboboxMultiSelectFieldProps) => _$react_jsx_runtime0.JSX.Element;
69
69
  //#endregion
70
70
  export { ToggleField as _, ComboboxSingleSelectFieldProps as a, RadioGroupFieldProps as c, SelectField as d, SelectFieldProps as f, TextFieldProps as g, TextField as h, ComboboxMultiSelectFieldProps as i, SegmentedControlField as l, TextAreaFieldProps as m, CheckboxFieldProps as n, ImplementsFormField as o, TextAreaField as p, ComboboxField as r, RadioGroupField as s, CheckboxField as t, SegmentedControlFieldProps as u, ToggleFieldProps as v, splitOutFormFieldProps as y };
71
- //# sourceMappingURL=inputFields-CYttsz5M.d.mts.map
71
+ //# sourceMappingURL=inputFields-Dfpxi68z.d.mts.map
@@ -1,2 +1,2 @@
1
- import { _ as ToggleField, a as ComboboxSingleSelectFieldProps, c as RadioGroupFieldProps, d as SelectField, f as SelectFieldProps, g as TextFieldProps, h as TextField, i as ComboboxMultiSelectFieldProps, l as SegmentedControlField, m as TextAreaFieldProps, n as CheckboxFieldProps, o as ImplementsFormField, p as TextAreaField, r as ComboboxField, s as RadioGroupField, t as CheckboxField, u as SegmentedControlFieldProps, v as ToggleFieldProps, y as splitOutFormFieldProps } from "./inputFields-CYttsz5M.mjs";
1
+ import { _ as ToggleField, a as ComboboxSingleSelectFieldProps, c as RadioGroupFieldProps, d as SelectField, f as SelectFieldProps, g as TextFieldProps, h as TextField, i as ComboboxMultiSelectFieldProps, l as SegmentedControlField, m as TextAreaFieldProps, n as CheckboxFieldProps, o as ImplementsFormField, p as TextAreaField, r as ComboboxField, s as RadioGroupField, t as CheckboxField, u as SegmentedControlFieldProps, v as ToggleFieldProps, y as splitOutFormFieldProps } from "./inputFields-Dfpxi68z.mjs";
2
2
  export { CheckboxField, CheckboxFieldProps, ComboboxField, ComboboxMultiSelectFieldProps, ComboboxSingleSelectFieldProps, ImplementsFormField, RadioGroupField, RadioGroupFieldProps, SegmentedControlField, SegmentedControlFieldProps, SelectField, SelectFieldProps, TextAreaField, TextAreaFieldProps, TextField, TextFieldProps, ToggleField, ToggleFieldProps, splitOutFormFieldProps };
@@ -1,6 +1,6 @@
1
1
  import { i as PersonaTheme } from "../theme-mQ4WkH90.mjs";
2
2
  import { n as RouterAdapter } from "../types-Dhz6VMKx.mjs";
3
- import { n as CommonStringOverrides } from "../strings-CK9n6b65.mjs";
3
+ import { n as CommonStringOverrides } from "../strings-BGXKl_m6.mjs";
4
4
  import { ColorMode } from "./colorMode.mjs";
5
5
  import { FC, PropsWithChildren } from "react";
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { t as ThemeProvider } from "../styledComponentsInterop-Cs5CCPRy.mjs";
2
2
  import defaultTheme, { withPdsTheming } from "../theme.mjs";
3
3
  import { SemanticCssVariables } from "./colorMode.mjs";
4
- import { s as PDSI18nProvider } from "../i18n-BLyCaSdJ.mjs";
4
+ import { s as PDSI18nProvider } from "../i18n-CKRi992F.mjs";
5
5
  import { n as RouterProvider } from "../RouterContext-DAQHKOv6.mjs";
6
6
  import { useMemo } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"file":"PDSProvider.mjs","names":[],"sources":["../../src/lib/PDSProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, useMemo } from 'react';\nimport { ThemeProvider } from 'styled-components';\n\nimport defaultTheme, { type PersonaTheme, withPdsTheming } from '@persona/design-system/theme';\nimport { type ColorMode, SemanticCssVariables } from 'design-system/lib/colorMode';\nimport { PDSI18nProvider, type CommonStringOverrides } from 'design-system/lib/i18n';\nimport { RouterProvider, type RouterAdapter } from 'design-system/lib/router';\n\ninterface PDSProviderProps {\n theme?: PersonaTheme;\n router?: RouterAdapter;\n /**\n * Translations for built-in component copy (table footer, column configuration, saved-view\n * tabs, filters). Keys you omit keep their English defaults. See `CommonStrings` in\n * `@persona/design-system/lib/i18n` for the keys.\n */\n strings?: CommonStringOverrides;\n /**\n * BCP 47 locale (e.g. `'fr-CA'`). Table dates and times follow it; omitted or `'en-US'` keeps\n * the historical English format.\n */\n locale?: string;\n /**\n * Installs the semantic palette for this mode on `theme` (`withPdsTheming(theme, colorMode)`) and\n * publishes it as `--pds-*` variables on `:root`. Omit it to keep today's behaviour. Pass\n * `readDocumentColorMode()` from `@persona/design-system/lib/colorMode` to follow the host\n * dashboard.\n */\n colorMode?: ColorMode;\n}\n\nconst PDSProvider: FC<PropsWithChildren<PDSProviderProps>> = ({\n children,\n theme = defaultTheme,\n router,\n strings,\n locale,\n colorMode,\n}) => {\n const providedTheme = useMemo(\n () => (colorMode ? withPdsTheming(theme, colorMode) : theme),\n [theme, colorMode],\n );\n const routed = router ? <RouterProvider {...router}>{children}</RouterProvider> : children;\n // Always mounted, even without `strings`/`locale` (it then inherits the outer values), so a host\n // that turns localization on or off later updates context instead of remounting the subtree.\n return (\n <ThemeProvider theme={providedTheme}>\n {colorMode && <SemanticCssVariables mode={colorMode} />}\n <PDSI18nProvider strings={strings} locale={locale}>\n {routed}\n </PDSI18nProvider>\n </ThemeProvider>\n );\n};\n\nexport default PDSProvider;\n"],"mappings":";;;;;;;;AA+BA,MAAM,eAAwD,EAC5D,UACA,QAAQ,cACR,QACA,SACA,QACA,gBACI;CACJ,MAAM,gBAAgB,cACb,YAAY,eAAe,OAAO,UAAU,GAAG,OACtD,CAAC,OAAO,UAAU,CACnB;CACD,MAAM,SAAS,SAAS,oBAAC,gBAAD;EAAgB,GAAI;EAAS;EAA0B,CAAA,GAAG;AAGlF,QACE,qBAAC,eAAD;EAAe,OAAO;YAAtB,CACG,aAAa,oBAAC,sBAAD,EAAsB,MAAM,WAAa,CAAA,EACvD,oBAAC,iBAAD;GAA0B;GAAiB;aACxC;GACe,CAAA,CACJ"}
1
+ {"version":3,"file":"PDSProvider.mjs","names":[],"sources":["../../src/lib/PDSProvider.tsx"],"sourcesContent":["import { type FC, type PropsWithChildren, useMemo } from 'react';\nimport { ThemeProvider } from 'styled-components';\n\nimport defaultTheme, { type PersonaTheme, withPdsTheming } from '@persona/design-system/theme';\n\nimport { type ColorMode, SemanticCssVariables } from '#src/lib/colorMode';\nimport { PDSI18nProvider, type CommonStringOverrides } from '#src/lib/i18n';\nimport { RouterProvider, type RouterAdapter } from '#src/lib/router';\n\ninterface PDSProviderProps {\n theme?: PersonaTheme;\n router?: RouterAdapter;\n /**\n * Translations for built-in component copy (table footer, column configuration, saved-view\n * tabs, filters). Keys you omit keep their English defaults. See `CommonStrings` in\n * `@persona/design-system/lib/i18n` for the keys.\n */\n strings?: CommonStringOverrides;\n /**\n * BCP 47 locale (e.g. `'fr-CA'`). Table dates and times follow it; omitted or `'en-US'` keeps\n * the historical English format.\n */\n locale?: string;\n /**\n * Installs the semantic palette for this mode on `theme` (`withPdsTheming(theme, colorMode)`) and\n * publishes it as `--pds-*` variables on `:root`. Omit it to keep today's behaviour. Pass\n * `readDocumentColorMode()` from `@persona/design-system/lib/colorMode` to follow the host\n * dashboard.\n */\n colorMode?: ColorMode;\n}\n\nconst PDSProvider: FC<PropsWithChildren<PDSProviderProps>> = ({\n children,\n theme = defaultTheme,\n router,\n strings,\n locale,\n colorMode,\n}) => {\n const providedTheme = useMemo(\n () => (colorMode ? withPdsTheming(theme, colorMode) : theme),\n [theme, colorMode],\n );\n const routed = router ? <RouterProvider {...router}>{children}</RouterProvider> : children;\n // Always mounted, even without `strings`/`locale` (it then inherits the outer values), so a host\n // that turns localization on or off later updates context instead of remounting the subtree.\n return (\n <ThemeProvider theme={providedTheme}>\n {colorMode && <SemanticCssVariables mode={colorMode} />}\n <PDSI18nProvider strings={strings} locale={locale}>\n {routed}\n </PDSI18nProvider>\n </ThemeProvider>\n );\n};\n\nexport default PDSProvider;\n"],"mappings":";;;;;;;;AAgCA,MAAM,eAAwD,EAC5D,UACA,QAAQ,cACR,QACA,SACA,QACA,gBACI;CACJ,MAAM,gBAAgB,cACb,YAAY,eAAe,OAAO,UAAU,GAAG,OACtD,CAAC,OAAO,UAAU,CACnB;CACD,MAAM,SAAS,SAAS,oBAAC,gBAAD;EAAgB,GAAI;EAAS;EAA0B,CAAA,GAAG;AAGlF,QACE,qBAAC,eAAD;EAAe,OAAO;YAAtB,CACG,aAAa,oBAAC,sBAAD,EAAsB,MAAM,WAAa,CAAA,EACvD,oBAAC,iBAAD;GAA0B;GAAiB;aACxC;GACe,CAAA,CACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"TruncatedText.mjs","names":[],"sources":["../../src/lib/TruncatedText.tsx"],"sourcesContent":["import { type ComponentPropsWithoutRef, type FC, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { useIsOverflow } from 'design-system/lib/useIsOverflow';\n\nexport const OverflowEllipsisSpan = styled.span`\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport interface TruncatedTextProps extends ComponentPropsWithoutRef<'span'> {\n titleBehavior?: 'always' | 'conditional';\n}\n\n/**\n * Truncates the text if it is too long to fit in the container.\n *\n * The text truncation is CSS-driven, but we use JavaScript to detect when truncation\n * happens so we can set a title attribute dynamically.\n */\nexport const TruncatedText: FC<TruncatedTextProps> = ({\n children,\n titleBehavior = 'conditional',\n ...props\n}) => {\n const ref = useRef<HTMLSpanElement>(null);\n const { isOverflowWidth } = useIsOverflow(ref);\n\n return (\n <OverflowEllipsisSpan\n title={\n isOverflowWidth || titleBehavior === 'always' ? (ref.current?.textContent ?? '') : undefined\n }\n {...props}\n // After the spread so a `ref` prop (React 19, e.g. `ref: null` from a `styled()` wrapper) can't\n // replace the ref used for overflow detection.\n ref={ref}\n >\n {children}\n </OverflowEllipsisSpan>\n );\n};\n\nexport default TruncatedText;\n"],"mappings":";;;;;AAKA,MAAa,uBAAuB,OAAO,IAAI;;;;;;;;;;;;AAiB/C,MAAa,iBAAyC,EACpD,UACA,gBAAgB,eAChB,GAAG,YACC;CACJ,MAAM,MAAM,OAAwB,KAAK;CACzC,MAAM,EAAE,oBAAoB,cAAc,IAAI;AAE9C,QACE,oBAAC,sBAAD;EACE,OACE,mBAAmB,kBAAkB,WAAY,IAAI,SAAS,eAAe,KAAM,KAAA;EAErF,GAAI;EAGC;EAEJ;EACoB,CAAA"}
1
+ {"version":3,"file":"TruncatedText.mjs","names":[],"sources":["../../src/lib/TruncatedText.tsx"],"sourcesContent":["import { type ComponentPropsWithoutRef, type FC, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { useIsOverflow } from '#src/lib/useIsOverflow';\n\nexport const OverflowEllipsisSpan = styled.span`\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport interface TruncatedTextProps extends ComponentPropsWithoutRef<'span'> {\n titleBehavior?: 'always' | 'conditional';\n}\n\n/**\n * Truncates the text if it is too long to fit in the container.\n *\n * The text truncation is CSS-driven, but we use JavaScript to detect when truncation\n * happens so we can set a title attribute dynamically.\n */\nexport const TruncatedText: FC<TruncatedTextProps> = ({\n children,\n titleBehavior = 'conditional',\n ...props\n}) => {\n const ref = useRef<HTMLSpanElement>(null);\n const { isOverflowWidth } = useIsOverflow(ref);\n\n return (\n <OverflowEllipsisSpan\n title={\n isOverflowWidth || titleBehavior === 'always' ? (ref.current?.textContent ?? '') : undefined\n }\n {...props}\n // After the spread so a `ref` prop (React 19, e.g. `ref: null` from a `styled()` wrapper) can't\n // replace the ref used for overflow detection.\n ref={ref}\n >\n {children}\n </OverflowEllipsisSpan>\n );\n};\n\nexport default TruncatedText;\n"],"mappings":";;;;;AAKA,MAAa,uBAAuB,OAAO,IAAI;;;;;;;;;;;;AAiB/C,MAAa,iBAAyC,EACpD,UACA,gBAAgB,eAChB,GAAG,YACC;CACJ,MAAM,MAAM,OAAwB,KAAK;CACzC,MAAM,EAAE,oBAAoB,cAAc,IAAI;AAE9C,QACE,oBAAC,sBAAD;EACE,OACE,mBAAmB,kBAAkB,WAAY,IAAI,SAAS,eAAe,KAAM,KAAA;EAErF,GAAI;EAGC;EAEJ;EACoB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TruncatedTextWithTooltip.mjs","names":[],"sources":["../../src/lib/TruncatedTextWithTooltip.tsx"],"sourcesContent":["import { type ComponentProps, type ComponentPropsWithoutRef, type FC, useRef } from 'react';\n\nimport Tooltip from 'design-system/components/Tooltip';\nimport { OverflowEllipsisSpan } from 'design-system/lib/TruncatedText';\nimport { useIsOverflow } from 'design-system/lib/useIsOverflow';\n\ninterface TruncatedTextWithTooltipProps extends ComponentPropsWithoutRef<'span'> {\n tooltipProps?: Pick<ComponentProps<typeof Tooltip>, 'side' | 'zIndex' | 'maxWidth'>;\n}\n\n/**\n * Truncates the text if it is too long to fit in the container and shows a tooltip if the text\n * is truncated.\n */\nexport const TruncatedTextWithTooltip: FC<TruncatedTextWithTooltipProps> = ({\n children,\n tooltipProps = {},\n ...props\n}) => {\n const ref = useRef<HTMLSpanElement>(null);\n const { isOverflowWidth } = useIsOverflow(ref);\n\n return (\n <Tooltip\n trigger={\n <OverflowEllipsisSpan {...props} ref={ref}>\n {children}\n </OverflowEllipsisSpan>\n }\n disabled={!isOverflowWidth}\n {...tooltipProps}\n >\n {children}\n </Tooltip>\n );\n};\n\nexport default TruncatedTextWithTooltip;\n"],"mappings":";;;;;;;;;;AAcA,MAAa,4BAA+D,EAC1E,UACA,eAAe,EAAE,EACjB,GAAG,YACC;CACJ,MAAM,MAAM,OAAwB,KAAK;CACzC,MAAM,EAAE,oBAAoB,cAAc,IAAI;AAE9C,QACE,oBAAC,SAAD;EACE,SACE,oBAAC,sBAAD;GAAsB,GAAI;GAAY;GACnC;GACoB,CAAA;EAEzB,UAAU,CAAC;EACX,GAAI;EAEH;EACO,CAAA"}
1
+ {"version":3,"file":"TruncatedTextWithTooltip.mjs","names":[],"sources":["../../src/lib/TruncatedTextWithTooltip.tsx"],"sourcesContent":["import { type ComponentProps, type ComponentPropsWithoutRef, type FC, useRef } from 'react';\n\nimport Tooltip from '#src/components/Tooltip';\nimport { OverflowEllipsisSpan } from '#src/lib/TruncatedText';\nimport { useIsOverflow } from '#src/lib/useIsOverflow';\n\ninterface TruncatedTextWithTooltipProps extends ComponentPropsWithoutRef<'span'> {\n tooltipProps?: Pick<ComponentProps<typeof Tooltip>, 'side' | 'zIndex' | 'maxWidth'>;\n}\n\n/**\n * Truncates the text if it is too long to fit in the container and shows a tooltip if the text\n * is truncated.\n */\nexport const TruncatedTextWithTooltip: FC<TruncatedTextWithTooltipProps> = ({\n children,\n tooltipProps = {},\n ...props\n}) => {\n const ref = useRef<HTMLSpanElement>(null);\n const { isOverflowWidth } = useIsOverflow(ref);\n\n return (\n <Tooltip\n trigger={\n <OverflowEllipsisSpan {...props} ref={ref}>\n {children}\n </OverflowEllipsisSpan>\n }\n disabled={!isOverflowWidth}\n {...tooltipProps}\n >\n {children}\n </Tooltip>\n );\n};\n\nexport default TruncatedTextWithTooltip;\n"],"mappings":";;;;;;;;;;AAcA,MAAa,4BAA+D,EAC1E,UACA,eAAe,EAAE,EACjB,GAAG,YACC;CACJ,MAAM,MAAM,OAAwB,KAAK;CACzC,MAAM,EAAE,oBAAoB,cAAc,IAAI;AAE9C,QACE,oBAAC,SAAD;EACE,SACE,oBAAC,sBAAD;GAAsB,GAAI;GAAY;GACnC;GACoB,CAAA;EAEzB,UAAU,CAAC;EACX,GAAI;EAEH;EACO,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"color.mjs","names":[],"sources":["../../src/lib/color.ts"],"sourcesContent":["import ColorValue from 'color';\n\nimport type { Color } from '@persona/design-tokens';\nimport type { CssPercentage } from 'design-system/variables/semantic';\n\n/**\n * A computed theme colour (not a token primitive). Property-branded rather than `unique symbol`\n * so the brand survives declaration emit.\n */\nexport type CssColor = string & { readonly __pdsCssColor: true };\n\nexport type PdsColor = Color | CssColor;\n\nexport const transparent = 'transparent' as CssColor;\n\nconst HEX = /^#([0-9a-f]{6})$/i;\n\n/** Percentage token as a unitless `opacity`; percentage `opacity` is below the browserslist floor. */\nexport const opacityOf = (amount: CssPercentage): string => String(Number.parseFloat(amount) / 100);\n\nconst assertHex = (color: Color, name: string) => {\n if (!HEX.test(color)) {\n throw new Error(`${name} expects a six-digit hex primitive, received \"${color}\"`);\n }\n};\n\nconst unit = (amount: CssPercentage) => Number.parseFloat(amount) / 100;\n\n/** Full alpha collapses to `rgb()`; partial alpha stays `rgba()`. */\nexport const withAlpha = (color: Color, amount: CssPercentage): CssColor => {\n assertHex(color, 'withAlpha');\n return ColorValue(color).alpha(unit(amount)).rgb().string() as CssColor;\n};\n\n/**\n * Source-over composite of `overlay` at `amount` onto `base`, as an opaque `rgb()`.\n * Sticky cells that inherit a translucent wash paint it a second time.\n */\nexport const opaqueOver = (overlay: Color, amount: CssPercentage, base: Color): CssColor => {\n assertHex(overlay, 'opaqueOver');\n assertHex(base, 'opaqueOver');\n return ColorValue(base).mix(ColorValue(overlay), unit(amount)).rgb().string() as CssColor;\n};\n"],"mappings":";;AAaA,MAAa,cAAc;AAE3B,MAAM,MAAM;;AAGZ,MAAa,aAAa,WAAkC,OAAO,OAAO,WAAW,OAAO,GAAG,IAAI;AAEnG,MAAM,aAAa,OAAc,SAAiB;AAChD,KAAI,CAAC,IAAI,KAAK,MAAM,CAClB,OAAM,IAAI,MAAM,GAAG,KAAK,gDAAgD,MAAM,GAAG;;AAIrF,MAAM,QAAQ,WAA0B,OAAO,WAAW,OAAO,GAAG;;AAGpE,MAAa,aAAa,OAAc,WAAoC;AAC1E,WAAU,OAAO,YAAY;AAC7B,QAAO,WAAW,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ;;;;;;AAO7D,MAAa,cAAc,SAAgB,QAAuB,SAA0B;AAC1F,WAAU,SAAS,aAAa;AAChC,WAAU,MAAM,aAAa;AAC7B,QAAO,WAAW,KAAK,CAAC,IAAI,WAAW,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ"}
1
+ {"version":3,"file":"color.mjs","names":[],"sources":["../../src/lib/color.ts"],"sourcesContent":["import ColorValue from 'color';\n\nimport type { Color } from '@persona/design-tokens';\n\nimport type { CssPercentage } from '#src/variables/semantic';\n\n/**\n * A computed theme colour (not a token primitive). Property-branded rather than `unique symbol`\n * so the brand survives declaration emit.\n */\nexport type CssColor = string & { readonly __pdsCssColor: true };\n\nexport type PdsColor = Color | CssColor;\n\nexport const transparent = 'transparent' as CssColor;\n\nconst HEX = /^#([0-9a-f]{6})$/i;\n\n/** Percentage token as a unitless `opacity`; percentage `opacity` is below the browserslist floor. */\nexport const opacityOf = (amount: CssPercentage): string => String(Number.parseFloat(amount) / 100);\n\nconst assertHex = (color: Color, name: string) => {\n if (!HEX.test(color)) {\n throw new Error(`${name} expects a six-digit hex primitive, received \"${color}\"`);\n }\n};\n\nconst unit = (amount: CssPercentage) => Number.parseFloat(amount) / 100;\n\n/** Full alpha collapses to `rgb()`; partial alpha stays `rgba()`. */\nexport const withAlpha = (color: Color, amount: CssPercentage): CssColor => {\n assertHex(color, 'withAlpha');\n return ColorValue(color).alpha(unit(amount)).rgb().string() as CssColor;\n};\n\n/**\n * Source-over composite of `overlay` at `amount` onto `base`, as an opaque `rgb()`.\n * Sticky cells that inherit a translucent wash paint it a second time.\n */\nexport const opaqueOver = (overlay: Color, amount: CssPercentage, base: Color): CssColor => {\n assertHex(overlay, 'opaqueOver');\n assertHex(base, 'opaqueOver');\n return ColorValue(base).mix(ColorValue(overlay), unit(amount)).rgb().string() as CssColor;\n};\n"],"mappings":";;AAcA,MAAa,cAAc;AAE3B,MAAM,MAAM;;AAGZ,MAAa,aAAa,WAAkC,OAAO,OAAO,WAAW,OAAO,GAAG,IAAI;AAEnG,MAAM,aAAa,OAAc,SAAiB;AAChD,KAAI,CAAC,IAAI,KAAK,MAAM,CAClB,OAAM,IAAI,MAAM,GAAG,KAAK,gDAAgD,MAAM,GAAG;;AAIrF,MAAM,QAAQ,WAA0B,OAAO,WAAW,OAAO,GAAG;;AAGpE,MAAa,aAAa,OAAc,WAAoC;AAC1E,WAAU,OAAO,YAAY;AAC7B,QAAO,WAAW,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ;;;;;;AAO7D,MAAa,cAAc,SAAgB,QAAuB,SAA0B;AAC1F,WAAU,SAAS,aAAa;AAChC,WAAU,MAAM,aAAa;AAC7B,QAAO,WAAW,KAAK,CAAC,IAAI,WAAW,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"colorMode.mjs","names":[],"sources":["../../src/lib/colorMode.tsx"],"sourcesContent":["/**\n * Colour-mode helpers for apps embedded in the Persona dashboard.\n *\n * The host stamps the dashboard's mode on `<html data-color-mode>` before first paint (an inline\n * script in each app's `index.html`). These helpers read it, install the matching semantic palette\n * on the styled-components theme, and publish that palette as `--pds-*` CSS custom properties so\n * plain stylesheets resolve the same colours as PDS components.\n *\n * Most apps only need `PDSProvider colorMode={readDocumentColorMode()}`. `ColorModeScope` renders\n * part of a page in the other mode.\n *\n * Portals: PDS overlays portal to `document.body`. styled-components context crosses the portal, so\n * a PDS overlay opened inside a `ColorModeScope` renders in the scope's mode. CSS custom properties\n * don't: plain CSS inside a portaled overlay resolves the `:root` palette, not the scope's.\n */\nimport { type FC, type PropsWithChildren, useMemo } from 'react';\nimport styled, { createGlobalStyle, ThemeProvider, useTheme } from 'styled-components';\n\nimport defaultTheme, {\n type PdsThemingMode,\n type PersonaTheme,\n withPdsTheming,\n} from 'design-system/theme';\nimport { semanticDark, semanticLight, type SemanticTokens } from 'design-system/variables/semantic';\n\nexport type ColorMode = Exclude<PdsThemingMode, 'off'>;\n\n/** `'dark'` only when `<html data-color-mode=\"dark\">`; anything else (absent, `DARK`, junk) is light. */\nexport function readDocumentColorMode(doc: Document = document): ColorMode {\n return doc.documentElement.dataset.colorMode === 'dark' ? 'dark' : 'light';\n}\n\n/** `withPdsTheming(baseTheme, mode)`; `baseTheme` defaults to the PDS default theme. */\nexport function createPdsTheme(\n mode: ColorMode,\n baseTheme: PersonaTheme = defaultTheme,\n): PersonaTheme {\n return withPdsTheming(baseTheme, mode);\n}\n\n/** `FgPrimary` -> `--pds-fg-primary`, `FeedbackDanger1` -> `--pds-feedback-danger-1`. */\nexport function semanticCssVariable(token: keyof SemanticTokens): string {\n return `--pds-${token\n .replace(/([a-z])([A-Z0-9])/g, '$1-$2')\n .replace(/([0-9])([A-Z])/g, '$1-$2')\n .toLowerCase()}`;\n}\n\n/** `--pds-*: value;` for every semantic token. */\nexport function semanticCssDeclarations(semantic: SemanticTokens): string {\n return (Object.keys(semantic) as (keyof SemanticTokens)[])\n .map((token) => `${semanticCssVariable(token)}: ${semantic[token]};`)\n .join('\\n');\n}\n\nconst semanticCss: Record<ColorMode, string> = {\n light: semanticCssDeclarations(semanticLight),\n dark: semanticCssDeclarations(semanticDark),\n};\n\n/** Global style: publishes the palette for `mode` on `:root`. */\nexport const SemanticCssVariables = createGlobalStyle<{ mode: ColorMode }>`\n :root {\n ${({ mode }) => semanticCss[mode]}\n }\n`;\n\nconst ColorModeScopeRoot = styled.div<{ $mode: ColorMode }>`\n display: contents;\n ${({ $mode }) => semanticCss[$mode]}\n`;\n\n/**\n * Renders `children` in `mode`, whatever the surrounding mode is: a nested `ThemeProvider` with\n * `withPdsTheming(outerTheme, mode)` and a `display: contents` wrapper carrying `data-color-mode`\n * and the `--pds-*` declarations for `mode`.\n */\nexport const ColorModeScope: FC<PropsWithChildren<{ mode: ColorMode }>> = ({ children, mode }) => {\n const outerTheme = useTheme() as PersonaTheme | undefined;\n const scopedTheme = useMemo(\n () => withPdsTheming(outerTheme ?? defaultTheme, mode),\n [outerTheme, mode],\n );\n\n return (\n <ThemeProvider theme={scopedTheme}>\n <ColorModeScopeRoot $mode={mode} data-color-mode={mode}>\n {children}\n </ColorModeScopeRoot>\n </ThemeProvider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,sBAAsB,MAAgB,UAAqB;AACzE,QAAO,IAAI,gBAAgB,QAAQ,cAAc,SAAS,SAAS;;;AAIrE,SAAgB,eACd,MACA,YAA0B,cACZ;AACd,QAAO,eAAe,WAAW,KAAK;;;AAIxC,SAAgB,oBAAoB,OAAqC;AACvE,QAAO,SAAS,MACb,QAAQ,sBAAsB,QAAQ,CACtC,QAAQ,mBAAmB,QAAQ,CACnC,aAAa;;;AAIlB,SAAgB,wBAAwB,UAAkC;AACxE,QAAQ,OAAO,KAAK,SAAS,CAC1B,KAAK,UAAU,GAAG,oBAAoB,MAAM,CAAC,IAAI,SAAS,OAAO,GAAG,CACpE,KAAK,KAAK;;AAGf,MAAM,cAAyC;CAC7C,OAAO,wBAAwB,cAAc;CAC7C,MAAM,wBAAwB,aAAa;CAC5C;;AAGD,MAAa,uBAAuB,iBAAsC;;OAEnE,EAAE,WAAW,YAAY,MAAM;;;AAItC,MAAM,qBAAqB,OAAO,GAAyB;;KAEtD,EAAE,YAAY,YAAY,OAAO;;;;;;;AAQtC,MAAa,kBAA8D,EAAE,UAAU,WAAW;CAChG,MAAM,aAAa,UAAU;AAM7B,QACE,oBAAC,eAAD;EAAe,OANG,cACZ,eAAe,cAAc,cAAc,KAAK,EACtD,CAAC,YAAY,KAAK,CAIe;YAC/B,oBAAC,oBAAD;GAAoB,OAAO;GAAM,mBAAiB;GAC/C;GACkB,CAAA;EACP,CAAA"}
1
+ {"version":3,"file":"colorMode.mjs","names":[],"sources":["../../src/lib/colorMode.tsx"],"sourcesContent":["/**\n * Colour-mode helpers for apps embedded in the Persona dashboard.\n *\n * The host stamps the dashboard's mode on `<html data-color-mode>` before first paint (an inline\n * script in each app's `index.html`). These helpers read it, install the matching semantic palette\n * on the styled-components theme, and publish that palette as `--pds-*` CSS custom properties so\n * plain stylesheets resolve the same colours as PDS components.\n *\n * Most apps only need `PDSProvider colorMode={readDocumentColorMode()}`. `ColorModeScope` renders\n * part of a page in the other mode.\n *\n * Portals: PDS overlays portal to `document.body`. styled-components context crosses the portal, so\n * a PDS overlay opened inside a `ColorModeScope` renders in the scope's mode. CSS custom properties\n * don't: plain CSS inside a portaled overlay resolves the `:root` palette, not the scope's.\n */\nimport { type FC, type PropsWithChildren, useMemo } from 'react';\nimport styled, { createGlobalStyle, ThemeProvider, useTheme } from 'styled-components';\n\nimport defaultTheme, { type PdsThemingMode, type PersonaTheme, withPdsTheming } from '#src/theme';\nimport { semanticDark, semanticLight, type SemanticTokens } from '#src/variables/semantic';\n\nexport type ColorMode = Exclude<PdsThemingMode, 'off'>;\n\n/** `'dark'` only when `<html data-color-mode=\"dark\">`; anything else (absent, `DARK`, junk) is light. */\nexport function readDocumentColorMode(doc: Document = document): ColorMode {\n return doc.documentElement.dataset.colorMode === 'dark' ? 'dark' : 'light';\n}\n\n/** `withPdsTheming(baseTheme, mode)`; `baseTheme` defaults to the PDS default theme. */\nexport function createPdsTheme(\n mode: ColorMode,\n baseTheme: PersonaTheme = defaultTheme,\n): PersonaTheme {\n return withPdsTheming(baseTheme, mode);\n}\n\n/** `FgPrimary` -> `--pds-fg-primary`, `FeedbackDanger1` -> `--pds-feedback-danger-1`. */\nexport function semanticCssVariable(token: keyof SemanticTokens): string {\n return `--pds-${token\n .replace(/([a-z])([A-Z0-9])/g, '$1-$2')\n .replace(/([0-9])([A-Z])/g, '$1-$2')\n .toLowerCase()}`;\n}\n\n/** `--pds-*: value;` for every semantic token. */\nexport function semanticCssDeclarations(semantic: SemanticTokens): string {\n return (Object.keys(semantic) as (keyof SemanticTokens)[])\n .map((token) => `${semanticCssVariable(token)}: ${semantic[token]};`)\n .join('\\n');\n}\n\nconst semanticCss: Record<ColorMode, string> = {\n light: semanticCssDeclarations(semanticLight),\n dark: semanticCssDeclarations(semanticDark),\n};\n\n/** Global style: publishes the palette for `mode` on `:root`. */\nexport const SemanticCssVariables = createGlobalStyle<{ mode: ColorMode }>`\n :root {\n ${({ mode }) => semanticCss[mode]}\n }\n`;\n\nconst ColorModeScopeRoot = styled.div<{ $mode: ColorMode }>`\n display: contents;\n ${({ $mode }) => semanticCss[$mode]}\n`;\n\n/**\n * Renders `children` in `mode`, whatever the surrounding mode is: a nested `ThemeProvider` with\n * `withPdsTheming(outerTheme, mode)` and a `display: contents` wrapper carrying `data-color-mode`\n * and the `--pds-*` declarations for `mode`.\n */\nexport const ColorModeScope: FC<PropsWithChildren<{ mode: ColorMode }>> = ({ children, mode }) => {\n const outerTheme = useTheme() as PersonaTheme | undefined;\n const scopedTheme = useMemo(\n () => withPdsTheming(outerTheme ?? defaultTheme, mode),\n [outerTheme, mode],\n );\n\n return (\n <ThemeProvider theme={scopedTheme}>\n <ColorModeScopeRoot $mode={mode} data-color-mode={mode}>\n {children}\n </ColorModeScopeRoot>\n </ThemeProvider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,sBAAsB,MAAgB,UAAqB;AACzE,QAAO,IAAI,gBAAgB,QAAQ,cAAc,SAAS,SAAS;;;AAIrE,SAAgB,eACd,MACA,YAA0B,cACZ;AACd,QAAO,eAAe,WAAW,KAAK;;;AAIxC,SAAgB,oBAAoB,OAAqC;AACvE,QAAO,SAAS,MACb,QAAQ,sBAAsB,QAAQ,CACtC,QAAQ,mBAAmB,QAAQ,CACnC,aAAa;;;AAIlB,SAAgB,wBAAwB,UAAkC;AACxE,QAAQ,OAAO,KAAK,SAAS,CAC1B,KAAK,UAAU,GAAG,oBAAoB,MAAM,CAAC,IAAI,SAAS,OAAO,GAAG,CACpE,KAAK,KAAK;;AAGf,MAAM,cAAyC;CAC7C,OAAO,wBAAwB,cAAc;CAC7C,MAAM,wBAAwB,aAAa;CAC5C;;AAGD,MAAa,uBAAuB,iBAAsC;;OAEnE,EAAE,WAAW,YAAY,MAAM;;;AAItC,MAAM,qBAAqB,OAAO,GAAyB;;KAEtD,EAAE,YAAY,YAAY,OAAO;;;;;;;AAQtC,MAAa,kBAA8D,EAAE,UAAU,WAAW;CAChG,MAAM,aAAa,UAAU;AAM7B,QACE,oBAAC,eAAD;EAAe,OANG,cACZ,eAAe,cAAc,cAAc,KAAK,EACtD,CAAC,YAAY,KAAK,CAIe;YAC/B,oBAAC,oBAAD;GAAoB,OAAO;GAAM,mBAAiB;GAC/C;GACkB,CAAA;EACP,CAAA"}
@@ -1,4 +1,4 @@
1
- import { a as DEFAULT_COMMON_STRINGS, i as CommonStrings, n as CommonStringOverrides, o as resolveCommonStrings, r as CommonStringValue, t as CommonStringKey } from "../../strings-CK9n6b65.mjs";
2
- import { i as usePDSStrings, n as PDSI18nProviderProps, r as usePDSLocale, t as PDSI18nProvider } from "../../I18nContext-EPmbUprm.mjs";
1
+ import { a as DEFAULT_COMMON_STRINGS, i as CommonStrings, n as CommonStringOverrides, o as resolveCommonStrings, r as CommonStringValue, t as CommonStringKey } from "../../strings-BGXKl_m6.mjs";
2
+ import { i as usePDSStrings, n as PDSI18nProviderProps, r as usePDSLocale, t as PDSI18nProvider } from "../../I18nContext-BBVKF9ui.mjs";
3
3
  import { a as formatDateTime, i as formatDate, n as LEGACY_DATETIME_FORMAT, o as formatTimeZoneName, r as LEGACY_DATE_FORMAT, s as usesLegacyDateFormat, t as FormatDateTimeOptions } from "../../formatDateTime-BikGGrvq.mjs";
4
4
  export { CommonStringKey, CommonStringOverrides, CommonStringValue, CommonStrings, DEFAULT_COMMON_STRINGS, FormatDateTimeOptions, LEGACY_DATETIME_FORMAT, LEGACY_DATE_FORMAT, PDSI18nProvider, PDSI18nProviderProps, formatDate, formatDateTime, formatTimeZoneName, resolveCommonStrings, usePDSLocale, usePDSStrings, usesLegacyDateFormat };
@@ -1,2 +1,2 @@
1
- import { a as formatTimeZoneName, c as usePDSLocale, d as resolveCommonStrings, i as formatDateTime, l as usePDSStrings, n as LEGACY_DATE_FORMAT, o as usesLegacyDateFormat, r as formatDate, s as PDSI18nProvider, t as LEGACY_DATETIME_FORMAT, u as DEFAULT_COMMON_STRINGS } from "../../i18n-BLyCaSdJ.mjs";
1
+ import { a as formatTimeZoneName, c as usePDSLocale, d as resolveCommonStrings, i as formatDateTime, l as usePDSStrings, n as LEGACY_DATE_FORMAT, o as usesLegacyDateFormat, r as formatDate, s as PDSI18nProvider, t as LEGACY_DATETIME_FORMAT, u as DEFAULT_COMMON_STRINGS } from "../../i18n-CKRi992F.mjs";
2
2
  export { DEFAULT_COMMON_STRINGS, LEGACY_DATETIME_FORMAT, LEGACY_DATE_FORMAT, PDSI18nProvider, formatDate, formatDateTime, formatTimeZoneName, resolveCommonStrings, usePDSLocale, usePDSStrings, usesLegacyDateFormat };
@@ -1 +1 @@
1
- {"version":3,"file":"pseudoClass.mjs","names":[],"sources":["../../src/lib/pseudoClass.ts"],"sourcesContent":["/**\n * @file Contains utility functions that allow targeting pseudo-classes with props.\n * When used, allows props.active to act like :active, etc.\n *\n * When used, a preceding ampersand is needed.\n * `&${isHovered}${isNotActive}`\n */\nimport type PseudoClassProps from 'design-system/types/PseudoClassProps';\n\nexport const isDisabled = ({ disabled }: PseudoClassProps) => (disabled ? '' : ':disabled');\nexport const isNotDisabled = ({ disabled }: PseudoClassProps) =>\n disabled ? ':not(*)' : ':not(:disabled)';\n\nexport const isHovered = ({ hovered }: PseudoClassProps) => (hovered ? '' : ':hover');\nexport const isNotHovered = ({ hovered }: PseudoClassProps) =>\n hovered ? ':not(*)' : ':not(:hover)';\n\nexport const isFocused = ({ focused }: PseudoClassProps) => (focused ? '' : ':focus');\nexport const isNotFocused = ({ focused }: PseudoClassProps) =>\n focused ? ':not(*)' : ':not(:focus)';\n\nexport const isFocusedVisible = ({ focused }: PseudoClassProps) =>\n focused ? '' : ':focus-visible';\nexport const isNotFocusedVisible = ({ focused }: PseudoClassProps) =>\n focused ? ':not(*)' : ':not(:focus-visible)';\n\nexport const isActive = ({ active }: PseudoClassProps) => (active ? '' : ':focus-within');\nexport const isNotActive = ({ active }: PseudoClassProps) =>\n active ? ':not(*)' : ':not(:focus-within)';\n\nexport const isChecked = ({ checked }: PseudoClassProps) => (checked ? '' : ':checked');\nexport const isIndeterminate = ({ mixed }: PseudoClassProps) => (mixed ? '' : ':indeterminate');\nexport const isNotChecked = ({ checked }: PseudoClassProps) =>\n checked ? ':not(*)' : ':not(:checked)';\n"],"mappings":";AASA,MAAa,cAAc,EAAE,eAAkC,WAAW,KAAK;AAC/E,MAAa,iBAAiB,EAAE,eAC9B,WAAW,YAAY;AAEzB,MAAa,aAAa,EAAE,cAAiC,UAAU,KAAK;AAC5E,MAAa,gBAAgB,EAAE,cAC7B,UAAU,YAAY;AAExB,MAAa,aAAa,EAAE,cAAiC,UAAU,KAAK;AAC5E,MAAa,gBAAgB,EAAE,cAC7B,UAAU,YAAY;AAExB,MAAa,oBAAoB,EAAE,cACjC,UAAU,KAAK;AACjB,MAAa,uBAAuB,EAAE,cACpC,UAAU,YAAY;AAExB,MAAa,YAAY,EAAE,aAAgC,SAAS,KAAK;AACzE,MAAa,eAAe,EAAE,aAC5B,SAAS,YAAY;AAEvB,MAAa,aAAa,EAAE,cAAiC,UAAU,KAAK;AAC5E,MAAa,mBAAmB,EAAE,YAA+B,QAAQ,KAAK;AAC9E,MAAa,gBAAgB,EAAE,cAC7B,UAAU,YAAY"}
1
+ {"version":3,"file":"pseudoClass.mjs","names":[],"sources":["../../src/lib/pseudoClass.ts"],"sourcesContent":["/**\n * @file Contains utility functions that allow targeting pseudo-classes with props.\n * When used, allows props.active to act like :active, etc.\n *\n * When used, a preceding ampersand is needed.\n * `&${isHovered}${isNotActive}`\n */\nimport type PseudoClassProps from '#src/types/PseudoClassProps';\n\nexport const isDisabled = ({ disabled }: PseudoClassProps) => (disabled ? '' : ':disabled');\nexport const isNotDisabled = ({ disabled }: PseudoClassProps) =>\n disabled ? ':not(*)' : ':not(:disabled)';\n\nexport const isHovered = ({ hovered }: PseudoClassProps) => (hovered ? '' : ':hover');\nexport const isNotHovered = ({ hovered }: PseudoClassProps) =>\n hovered ? ':not(*)' : ':not(:hover)';\n\nexport const isFocused = ({ focused }: PseudoClassProps) => (focused ? '' : ':focus');\nexport const isNotFocused = ({ focused }: PseudoClassProps) =>\n focused ? ':not(*)' : ':not(:focus)';\n\nexport const isFocusedVisible = ({ focused }: PseudoClassProps) =>\n focused ? '' : ':focus-visible';\nexport const isNotFocusedVisible = ({ focused }: PseudoClassProps) =>\n focused ? ':not(*)' : ':not(:focus-visible)';\n\nexport const isActive = ({ active }: PseudoClassProps) => (active ? '' : ':focus-within');\nexport const isNotActive = ({ active }: PseudoClassProps) =>\n active ? ':not(*)' : ':not(:focus-within)';\n\nexport const isChecked = ({ checked }: PseudoClassProps) => (checked ? '' : ':checked');\nexport const isIndeterminate = ({ mixed }: PseudoClassProps) => (mixed ? '' : ':indeterminate');\nexport const isNotChecked = ({ checked }: PseudoClassProps) =>\n checked ? ':not(*)' : ':not(:checked)';\n"],"mappings":";AASA,MAAa,cAAc,EAAE,eAAkC,WAAW,KAAK;AAC/E,MAAa,iBAAiB,EAAE,eAC9B,WAAW,YAAY;AAEzB,MAAa,aAAa,EAAE,cAAiC,UAAU,KAAK;AAC5E,MAAa,gBAAgB,EAAE,cAC7B,UAAU,YAAY;AAExB,MAAa,aAAa,EAAE,cAAiC,UAAU,KAAK;AAC5E,MAAa,gBAAgB,EAAE,cAC7B,UAAU,YAAY;AAExB,MAAa,oBAAoB,EAAE,cACjC,UAAU,KAAK;AACjB,MAAa,uBAAuB,EAAE,cACpC,UAAU,YAAY;AAExB,MAAa,YAAY,EAAE,aAAgC,SAAS,KAAK;AACzE,MAAa,eAAe,EAAE,aAC5B,SAAS,YAAY;AAEvB,MAAa,aAAa,EAAE,cAAiC,UAAU,KAAK;AAC5E,MAAa,mBAAmB,EAAE,YAA+B,QAAQ,KAAK;AAC9E,MAAa,gBAAgB,EAAE,cAC7B,UAAU,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"semanticColor.mjs","names":[],"sources":["../../src/lib/semanticColor.ts"],"sourcesContent":["import type { CssColor } from 'design-system/lib/color';\nimport type { CssPercentage, SemanticTokens } from 'design-system/variables/semantic';\n\n/** PDS components also render under foreign themes (Relay, darkTheme), so `semantic` is optional. */\nexport interface MaybeSemanticTheme {\n semantic?: SemanticTokens;\n}\n\n/** Colour tokens also accept a computed `CssColor` fallback; percentage tokens only their own type. */\nexport type SemanticFallback<K extends keyof SemanticTokens> =\n | SemanticTokens[K]\n | (SemanticTokens[K] extends CssPercentage ? never : CssColor);\n\n/**\n * Reads a semantic token, falling back to `legacy` when the theme has no semantic namespace.\n * `legacy` must be the component's pre-migration expression (not a generic default) so themes\n * without semantic tokens keep rendering exactly as before. It is evaluated by the caller, so a\n * component Relay renders must pass a constant: Relay's theme has no `theme.color` either.\n * `theme` may be `undefined` (`useTheme()` outside a provider).\n */\nexport const semanticColor = <K extends keyof SemanticTokens>(\n theme: MaybeSemanticTheme | undefined,\n token: K,\n legacy: SemanticFallback<K>,\n): SemanticFallback<K> => theme?.semantic?.[token] ?? legacy;\n\n/** For palettes derived from several tokens; callers must branch and keep the legacy path intact. */\nexport const semanticTokens = (theme: MaybeSemanticTheme | undefined): SemanticTokens | undefined =>\n theme?.semantic;\n\n/** Interpolation for declarations that exist only under semantic theming; emits nothing otherwise. */\nexport const semanticOnly =\n <T>(build: (tokens: SemanticTokens) => T) =>\n ({ theme }: { theme?: MaybeSemanticTheme }): T | undefined =>\n theme?.semantic ? build(theme.semantic) : undefined;\n"],"mappings":";;;;;;;;AAoBA,MAAa,iBACX,OACA,OACA,WACwB,OAAO,WAAW,UAAU;;AAGtD,MAAa,kBAAkB,UAC7B,OAAO;;AAGT,MAAa,gBACP,WACH,EAAE,YACD,OAAO,WAAW,MAAM,MAAM,SAAS,GAAG,KAAA"}
1
+ {"version":3,"file":"semanticColor.mjs","names":[],"sources":["../../src/lib/semanticColor.ts"],"sourcesContent":["import type { CssColor } from '#src/lib/color';\nimport type { CssPercentage, SemanticTokens } from '#src/variables/semantic';\n\n/** PDS components also render under foreign themes (Relay, darkTheme), so `semantic` is optional. */\nexport interface MaybeSemanticTheme {\n semantic?: SemanticTokens;\n}\n\n/** Colour tokens also accept a computed `CssColor` fallback; percentage tokens only their own type. */\nexport type SemanticFallback<K extends keyof SemanticTokens> =\n | SemanticTokens[K]\n | (SemanticTokens[K] extends CssPercentage ? never : CssColor);\n\n/**\n * Reads a semantic token, falling back to `legacy` when the theme has no semantic namespace.\n * `legacy` must be the component's pre-migration expression (not a generic default) so themes\n * without semantic tokens keep rendering exactly as before. It is evaluated by the caller, so a\n * component Relay renders must pass a constant: Relay's theme has no `theme.color` either.\n * `theme` may be `undefined` (`useTheme()` outside a provider).\n */\nexport const semanticColor = <K extends keyof SemanticTokens>(\n theme: MaybeSemanticTheme | undefined,\n token: K,\n legacy: SemanticFallback<K>,\n): SemanticFallback<K> => theme?.semantic?.[token] ?? legacy;\n\n/** For palettes derived from several tokens; callers must branch and keep the legacy path intact. */\nexport const semanticTokens = (theme: MaybeSemanticTheme | undefined): SemanticTokens | undefined =>\n theme?.semantic;\n\n/** Interpolation for declarations that exist only under semantic theming; emits nothing otherwise. */\nexport const semanticOnly =\n <T>(build: (tokens: SemanticTokens) => T) =>\n ({ theme }: { theme?: MaybeSemanticTheme }): T | undefined =>\n theme?.semantic ? build(theme.semantic) : undefined;\n"],"mappings":";;;;;;;;AAoBA,MAAa,iBACX,OACA,OACA,WACwB,OAAO,WAAW,UAAU;;AAGtD,MAAa,kBAAkB,UAC7B,OAAO;;AAGT,MAAa,gBACP,WACH,EAAE,YACD,OAAO,WAAW,MAAM,MAAM,SAAS,GAAG,KAAA"}