@persona/design-system 0.10.10 → 0.10.12
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.
- package/CHANGELOG.md +48 -0
- package/dist/AdvancedFilterRuleRow.d.mts +5 -2
- package/dist/AdvancedFilterRulesPopover.d.mts +6 -2
- package/dist/ArrayValueControl.d.mts +1 -1
- package/dist/{Badge-BCdsVKuj.mjs → Badge-B2AJMf3d.mjs} +2 -2
- package/dist/{Badge-BCdsVKuj.mjs.map → Badge-B2AJMf3d.mjs.map} +1 -1
- package/dist/BooleanValueControl.d.mts +1 -1
- package/dist/{Breadcrumbs-CMf3Uvow.mjs → Breadcrumbs-DRs9eo1o.mjs} +5 -5
- package/dist/Breadcrumbs-DRs9eo1o.mjs.map +1 -0
- package/dist/{CardV2-CrV6eEQb.mjs → CardV2-DO-8COfu.mjs} +11 -8
- package/dist/CardV2-DO-8COfu.mjs.map +1 -0
- package/dist/ChartFrame.d.mts +61 -0
- package/dist/ChartLegend.d.mts +60 -0
- package/dist/ChartPopover.d.mts +155 -0
- package/dist/{Checkbox-Dr4LMKHV.mjs → Checkbox-BAh-wF_F.mjs} +5 -5
- package/dist/Checkbox-BAh-wF_F.mjs.map +1 -0
- package/dist/{CheckboxGroupField-Bpu2j6G2.d.mts → CheckboxGroupField-XSVAmESI.d.mts} +2 -2
- package/dist/CheckboxGroupField.d.mts +1 -1
- package/dist/ChoicesValueControl.d.mts +1 -1
- package/dist/{Combobox-Gb_j1dg6.mjs → Combobox-BNjYEAmv.mjs} +313 -138
- package/dist/Combobox-BNjYEAmv.mjs.map +1 -0
- package/dist/Combobox-DbcSss15.d.mts +12 -0
- package/dist/Combobox.d.mts +3 -3
- package/dist/{ComboboxBase-BPXqJHaQ.d.mts → ComboboxBase-CrFweFGi.d.mts} +61 -21
- package/dist/ComboboxBase.d.mts +2 -2
- package/dist/{ComboboxMultiSelect-BwkkSymj.d.mts → ComboboxMultiSelect-Cp5GBGQj.d.mts} +10 -6
- package/dist/ComboboxMultiSelect.d.mts +2 -2
- package/dist/{ComboboxSingleSelect-CdNNJNkp.d.mts → ComboboxSingleSelect-u7fK3Yvy.d.mts} +8 -6
- package/dist/ComboboxSingleSelect.d.mts +2 -2
- package/dist/{DataTable-BE9inUi-.d.mts → DataTable-C1mdfmQa.d.mts} +17 -7
- package/dist/{DataTable-CIZJ1vO8.mjs → DataTable-DdSY9mzT.mjs} +36 -23
- package/dist/DataTable-DdSY9mzT.mjs.map +1 -0
- package/dist/DataTable.d.mts +1 -1
- package/dist/{DatePicker-C9redLBr.mjs → DatePicker-DiilpYQg.mjs} +5 -5
- package/dist/{DatePicker-C9redLBr.mjs.map → DatePicker-DiilpYQg.mjs.map} +1 -1
- package/dist/DateRangeValueControl.d.mts +1 -1
- package/dist/DateValueControl.d.mts +1 -1
- package/dist/{DropdownButton-DpLG-cIj.mjs → DropdownButton-BxZ5hn0X.mjs} +3 -3
- package/dist/{DropdownButton-DpLG-cIj.mjs.map → DropdownButton-BxZ5hn0X.mjs.map} +1 -1
- package/dist/DropdownButton.d.mts +1 -1
- package/dist/{DropdownMenu-B6D4stkF.d.mts → DropdownMenu-CQR0U-zM.d.mts} +2 -2
- package/dist/{DropdownMenu-c8XK2Lr4.mjs → DropdownMenu-Ip75l4Th.mjs} +21 -2
- package/dist/DropdownMenu-Ip75l4Th.mjs.map +1 -0
- package/dist/DropdownMenu.d.mts +1 -1
- package/dist/{FieldRegistry-C2NVPhMO.d.mts → FieldRegistry-CJwGpUVK.d.mts} +2 -2
- package/dist/FieldRegistry.d.mts +1 -1
- package/dist/{FilterBar-BE_gBM0H.d.mts → FilterBar-CA4mDAXK.d.mts} +13 -5
- package/dist/FilterBar.d.mts +1 -1
- package/dist/FilterPickerMenu.d.mts +2 -2
- package/dist/FilterPill.d.mts +1 -1
- package/dist/FilterPopover.d.mts +1 -1
- package/dist/FloatValueControl.d.mts +3 -2
- package/dist/{FloatingToolbar-DLRaE0o7.mjs → FloatingToolbar-BA8Fqmrz.mjs} +35 -38
- package/dist/FloatingToolbar-BA8Fqmrz.mjs.map +1 -0
- package/dist/{FormControl-BztNXLn6.mjs → FormControl-BoKGiWdQ.mjs} +2 -2
- package/dist/{FormControl-BztNXLn6.mjs.map → FormControl-BoKGiWdQ.mjs.map} +1 -1
- package/dist/{FormField-Cf1VMvoa.mjs → FormField-yYJFkJ6R.mjs} +13 -13
- package/dist/{FormField-Cf1VMvoa.mjs.map → FormField-yYJFkJ6R.mjs.map} +1 -1
- package/dist/{HoverCopyableField-XHC_n9tp.mjs → HoverCopyableField-X2XfKTTh.mjs} +10 -5
- package/dist/HoverCopyableField-X2XfKTTh.mjs.map +1 -0
- package/dist/{IconButton-DxHB2g80.mjs → IconButton-Bj1fry_K.mjs} +4 -3
- package/dist/IconButton-Bj1fry_K.mjs.map +1 -0
- package/dist/IndexTableLayout.d.mts +11 -3
- package/dist/InlineCombobox.d.mts +1 -1
- package/dist/InlineInput.d.mts +1 -1
- package/dist/{Input-RHXujO9u.mjs → Input-DcbzPaax.mjs} +2 -2
- package/dist/{Input-RHXujO9u.mjs.map → Input-DcbzPaax.mjs.map} +1 -1
- package/dist/IntegerValueControl.d.mts +3 -2
- package/dist/{Link-D_kCyLYX.mjs → Link-B29ZMN6m.mjs} +3 -3
- package/dist/Link-B29ZMN6m.mjs.map +1 -0
- package/dist/{ListBox-BZp6exb8.mjs → ListBox-4rTgr3IJ.mjs} +6 -6
- package/dist/{ListBox-BZp6exb8.mjs.map → ListBox-4rTgr3IJ.mjs.map} +1 -1
- package/dist/{ListBox-DpFcM-dM.d.mts → ListBox-ZDaitaXR.d.mts} +2 -2
- package/dist/ListBox.d.mts +1 -1
- package/dist/{ListBoxField-DL6Zk8TU.d.mts → ListBoxField-CGvVWKyL.d.mts} +4 -4
- package/dist/ListBoxField.d.mts +1 -1
- package/dist/{LoadingShimmer-oPIv2ESr.mjs → LoadingShimmer-BVVdBeN-.mjs} +18 -20
- package/dist/LoadingShimmer-BVVdBeN-.mjs.map +1 -0
- package/dist/{LogicRow-BakOUtzx.d.mts → LogicRow-Bzp5o1sL.d.mts} +2 -2
- package/dist/LogicRow.d.mts +1 -1
- package/dist/{Menu-D6OrKCTC.d.mts → Menu-DviYNrFd.d.mts} +2 -2
- package/dist/Menu.d.mts +1 -1
- package/dist/{Modal-De5_bPJ_.mjs → Modal-CiPFqr0L.mjs} +52 -23
- package/dist/{Modal-De5_bPJ_.mjs.map → Modal-CiPFqr0L.mjs.map} +1 -1
- package/dist/{PageHeader-7_Hf6rHl.mjs → PageHeader-6KvtGED-.mjs} +2 -2
- package/dist/{PageHeader-7_Hf6rHl.mjs.map → PageHeader-6KvtGED-.mjs.map} +1 -1
- package/dist/{PageLayout-DjtGrvJa.mjs → PageLayout-CPiVnS_r.mjs} +3 -1
- package/dist/PageLayout-CPiVnS_r.mjs.map +1 -0
- package/dist/{Pagination-DMH2IaV0.mjs → Pagination-CqFvnlXc.mjs} +4 -4
- package/dist/{Pagination-DMH2IaV0.mjs.map → Pagination-CqFvnlXc.mjs.map} +1 -1
- package/dist/{Pii-24D_nSRQ.mjs → Pii-jSYND7Cn.mjs} +2 -2
- package/dist/{Pii-24D_nSRQ.mjs.map → Pii-jSYND7Cn.mjs.map} +1 -1
- package/dist/{PillShell-B7Bm-dsE.d.mts → PillShell-Bkyu5FXB.d.mts} +2 -2
- package/dist/PillShell.d.mts +1 -1
- package/dist/{Popover-DordjYNM.mjs → Popover-CVX-dfYb.mjs} +48 -18
- package/dist/Popover-CVX-dfYb.mjs.map +1 -0
- package/dist/{Radio-BlEtetrr.mjs → Radio-B1H_S-Qj.mjs} +2 -2
- package/dist/Radio-B1H_S-Qj.mjs.map +1 -0
- package/dist/{RadioGroup-CMrXmmn4.mjs → RadioGroup-7hdcVhsp.mjs} +2 -2
- package/dist/{RadioGroup-CMrXmmn4.mjs.map → RadioGroup-7hdcVhsp.mjs.map} +1 -1
- package/dist/RuleEditorFields.d.mts +2 -2
- package/dist/RulesPill.d.mts +1 -1
- package/dist/{SegmentedControl-D_DA-MU1.mjs → SegmentedControl-BNOJ1FYQ.mjs} +5 -2
- package/dist/SegmentedControl-BNOJ1FYQ.mjs.map +1 -0
- package/dist/{Select-DOlw_LPR.mjs → Select-DbWEgH5c.mjs} +5 -3
- package/dist/Select-DbWEgH5c.mjs.map +1 -0
- package/dist/{Select-CR9TjFfo.d.mts → Select-DsVeAyZy.d.mts} +2 -2
- package/dist/Select.d.mts +1 -1
- package/dist/SmartTextInputField.d.mts +2 -2
- package/dist/{Spinner-CXb-KUs1.mjs → Spinner-k9ZiOdTr.mjs} +1 -1
- package/dist/{Spinner-CXb-KUs1.mjs.map → Spinner-k9ZiOdTr.mjs.map} +1 -1
- package/dist/{Sticker-C1_6I08u.mjs → Sticker-4VdGEFAu.mjs} +2 -2
- package/dist/{Sticker-C1_6I08u.mjs.map → Sticker-4VdGEFAu.mjs.map} +1 -1
- package/dist/StringValueControl.d.mts +2 -1
- package/dist/{TabBar-BCFO38E0.mjs → TabBar-d4sdknti.mjs} +5 -5
- package/dist/TabBar-d4sdknti.mjs.map +1 -0
- package/dist/{Table-DPi4Dt5H.mjs → Table-9mNn8Q-d.mjs} +14 -6
- package/dist/Table-9mNn8Q-d.mjs.map +1 -0
- package/dist/{TableBox-DNQsgQ8x.mjs → TableBox-D9NA-s9l.mjs} +16 -12
- package/dist/TableBox-D9NA-s9l.mjs.map +1 -0
- package/dist/TableBox.d.mts +1 -1
- package/dist/{TableBoxCell-CsRt_5gP.d.mts → TableBoxCell-CQOL30et.d.mts} +4 -4
- package/dist/TableBoxCell.d.mts +1 -1
- package/dist/{TableBoxField-Db0Vjo6Z.d.mts → TableBoxField-z0GIFeQw.d.mts} +5 -5
- package/dist/TableBoxField.d.mts +1 -1
- package/dist/{TableBoxRow-exMlZyc4.d.mts → TableBoxRow-tb9-KMr9.d.mts} +2 -2
- package/dist/TableBoxRow.d.mts +1 -1
- package/dist/{TableBoxRowActions-UO9YN34k.d.mts → TableBoxRowActions-BZwulsFP.d.mts} +2 -2
- package/dist/TableBoxRowActions.d.mts +1 -1
- package/dist/{TableControls-BrP_BqnF.mjs → TableControls-BXykbUBf.mjs} +126 -40
- package/dist/TableControls-BXykbUBf.mjs.map +1 -0
- package/dist/{TableControls-Clo_0Mty.d.mts → TableControls-DE6eHq8h.d.mts} +4 -4
- package/dist/TableControls.d.mts +1 -1
- package/dist/{TableControlsContext-BNd6z9mD.d.mts → TableControlsContext-C2_2EuMh.d.mts} +2 -2
- package/dist/TableControlsContext.d.mts +1 -1
- package/dist/{TableViewConfigurationDropdown-Cp7ausV_.d.mts → TableViewConfigurationDropdown-DE9HFXYY.d.mts} +2 -2
- package/dist/TableViewConfigurationDropdown.d.mts +1 -1
- package/dist/{TechnicalSticker-Cq5jzYKQ.mjs → TechnicalSticker-DtV7Gawf.mjs} +5 -3
- package/dist/TechnicalSticker-DtV7Gawf.mjs.map +1 -0
- package/dist/{TextArea-Dro-HH8O.mjs → TextArea-CQ1YNi2b.mjs} +4 -5
- package/dist/TextArea-CQ1YNi2b.mjs.map +1 -0
- package/dist/{Toggle-D9MzTIZs.mjs → Toggle-CzHoIR-n.mjs} +8 -4
- package/dist/Toggle-CzHoIR-n.mjs.map +1 -0
- package/dist/{Tooltip-YViXzMdm.mjs → Tooltip-CVBxc1yf.mjs} +17 -4
- package/dist/Tooltip-CVBxc1yf.mjs.map +1 -0
- package/dist/chartColors.d.mts +92 -0
- package/dist/chartFrameLayout.d.mts +46 -0
- package/dist/{clientFilterUtils-CGHYF5NE.d.mts → clientFilterUtils-2TBUC31K.d.mts} +2 -2
- package/dist/clientFilterUtils.d.mts +1 -1
- package/dist/components/Accordion/index.mjs +22 -13
- package/dist/components/Accordion/index.mjs.map +1 -1
- package/dist/components/Attribute/index.mjs +6 -4
- package/dist/components/Attribute/index.mjs.map +1 -1
- package/dist/components/Badge/index.mjs +1 -1
- package/dist/components/Banner/index.mjs +1 -1
- package/dist/components/BottomPanel/index.mjs +7 -5
- package/dist/components/BottomPanel/index.mjs.map +1 -1
- package/dist/components/Breadcrumbs/index.mjs +1 -1
- package/dist/components/Button/index.mjs +1 -1
- package/dist/components/ButtonGroup/index.mjs +1 -1
- package/dist/components/CardV2/index.mjs +1 -1
- package/dist/components/Chart/index.d.mts +9 -0
- package/dist/components/Chart/index.mjs +680 -0
- package/dist/components/Chart/index.mjs.map +1 -0
- package/dist/components/Checkbox/index.mjs +1 -1
- package/dist/components/CodeHighlight/index.mjs +1 -1
- package/dist/components/Combobox/index.d.mts +5 -3
- package/dist/components/Combobox/index.mjs +1 -1
- package/dist/components/DataTable/TableControls/index.d.mts +19 -19
- package/dist/components/DataTable/TableControls/index.mjs +2 -2
- package/dist/components/DataTable/index.d.mts +5 -5
- package/dist/components/DataTable/index.mjs +1 -1
- package/dist/components/DataTable/types.d.mts +1 -1
- package/dist/components/DatePicker/index.mjs +1 -1
- package/dist/components/DropdownButton/index.mjs +1 -1
- package/dist/components/DropdownMenu/index.d.mts +1 -1
- package/dist/components/DropdownMenu/index.mjs +1 -1
- package/dist/components/FloatingPanel/index.mjs +16 -14
- package/dist/components/FloatingPanel/index.mjs.map +1 -1
- package/dist/components/FloatingToolbar/index.mjs +1 -1
- package/dist/components/FormControl/index.mjs +1 -1
- package/dist/components/FormField/index.d.mts +4 -4
- package/dist/components/FormField/index.mjs +1 -1
- package/dist/components/HoverCopyableField/index.mjs +1 -1
- package/dist/components/ImageTile/index.mjs +7 -7
- package/dist/components/ImageTile/index.mjs.map +1 -1
- package/dist/components/Input/index.mjs +1 -1
- package/dist/components/Link/index.mjs +1 -1
- package/dist/components/ListBox/index.d.mts +3 -3
- package/dist/components/ListBox/index.mjs +1 -1
- package/dist/components/LoadingShimmer/index.mjs +1 -1
- package/dist/components/MaskedInput/index.mjs +1 -1
- package/dist/components/Menu/index.d.mts +1 -1
- package/dist/components/Modal/index.mjs +1 -1
- package/dist/components/PageHeader/index.mjs +1 -1
- package/dist/components/Pagination/index.mjs +1 -1
- package/dist/components/Pii/index.mjs +1 -1
- package/dist/components/Popover/index.mjs +1 -1
- package/dist/components/ProgressBar/index.mjs +20 -3
- package/dist/components/ProgressBar/index.mjs.map +1 -1
- package/dist/components/Radio/index.mjs +1 -1
- package/dist/components/RadioGroup/index.mjs +1 -1
- package/dist/components/RichTextEditor/index.mjs +5 -5
- package/dist/components/RightPanel/index.mjs +28 -13
- package/dist/components/RightPanel/index.mjs.map +1 -1
- package/dist/components/SegmentedControl/index.mjs +1 -1
- package/dist/components/Select/index.d.mts +1 -1
- package/dist/components/Select/index.mjs +1 -1
- package/dist/components/SelectionCard/index.mjs +2 -2
- package/dist/components/Slider/index.mjs +3 -2
- package/dist/components/Slider/index.mjs.map +1 -1
- package/dist/components/SmartTextInput/index.mjs +9 -78
- package/dist/components/SmartTextInput/index.mjs.map +1 -1
- package/dist/{safe-parse.d.mts → components/SmartTextInput/parser/safe-parse.d.mts} +1 -1
- package/dist/components/SmartTextInput/parser/safe-parse.mjs +30 -0
- package/dist/components/SmartTextInput/parser/safe-parse.mjs.map +1 -0
- package/dist/{tree.d.mts → components/SmartTextInput/parser/tree.d.mts} +1 -1
- package/dist/components/SmartTextInput/parser/tree.mjs +42 -0
- package/dist/components/SmartTextInput/parser/tree.mjs.map +1 -0
- package/dist/components/Spinner/index.mjs +1 -1
- package/dist/components/Sticker/index.mjs +1 -1
- package/dist/components/SwatchPicker/index.mjs +2 -1
- package/dist/components/SwatchPicker/index.mjs.map +1 -1
- package/dist/components/TabBar/index.mjs +1 -1
- package/dist/components/Table/index.mjs +1 -1
- package/dist/components/TableBox/index.d.mts +1 -1
- package/dist/components/TableBox/index.mjs +1 -1
- package/dist/components/TechnicalSticker/index.mjs +1 -1
- package/dist/components/TextArea/index.mjs +1 -1
- package/dist/components/Tile/index.mjs +2 -2
- package/dist/components/Toast/index.mjs +16 -10
- package/dist/components/Toast/index.mjs.map +1 -1
- package/dist/components/Toggle/index.mjs +1 -1
- package/dist/components/Tooltip/index.mjs +1 -1
- package/dist/components/VersionHistory/index.mjs +5 -5
- package/dist/compound-expression.d.mts +1 -1
- package/dist/{date-range-rule-value-ASr06ClE.d.mts → date-range-rule-value-DyLlMtjr.d.mts} +2 -2
- package/dist/date-range-rule-value.d.mts +1 -1
- package/dist/display.d.mts +1 -1
- package/dist/duration-token.d.mts +11 -0
- package/dist/exit-motion.d.mts +7 -0
- package/dist/fieldPickerOptions.d.mts +2 -2
- package/dist/{filter-size-context-CmFyIPCm.d.mts → filter-size-context-DVnjmuhk.d.mts} +2 -2
- package/dist/filter-size-context.d.mts +1 -1
- package/dist/{filters-DTBc0mE7.d.mts → filters-DW7pqWv3.d.mts} +2 -2
- package/dist/filters.d.mts +1 -1
- package/dist/{helpers-CBJ2AqGZ.d.mts → helpers-BTD2kXLs.d.mts} +2 -2
- package/dist/helpers.d.mts +1 -1
- package/dist/{index-OkdnW-u5.d.mts → index-B4tE0RxY.d.mts} +3 -3
- package/dist/{index-kIon1vPp.d.mts → index-DTM_t7OG.d.mts} +2 -2
- package/dist/index4.d.mts +3 -3
- package/dist/index5.d.mts +1 -1
- package/dist/index6.d.mts +14 -14
- package/dist/{inputFields-DpHeZiFX.d.mts → inputFields-DnBb3NhK.d.mts} +4 -4
- package/dist/inputFields.d.mts +1 -1
- package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
- package/dist/lib/useCloseFocus.d.mts +45 -0
- package/dist/lib/useCloseFocus.mjs +123 -0
- package/dist/lib/useCloseFocus.mjs.map +1 -0
- package/dist/lib/useModalInsetRight.d.mts +4 -3
- package/dist/lib/useModalInsetRight.mjs +7 -5
- package/dist/lib/useModalInsetRight.mjs.map +1 -1
- package/dist/lint/THIRD_PARTY_NOTICES.md +30 -0
- package/dist/lint/index.mjs +696 -11
- package/dist/lint/index.mjs.map +1 -1
- package/dist/lint/recommended.json +7 -1
- package/dist/mixins/hoverable.mjs +1 -1
- package/dist/mixins/hoverable.mjs.map +1 -1
- package/dist/mixins/input.mjs +1 -0
- package/dist/mixins/input.mjs.map +1 -1
- package/dist/mixins/menuItem.mjs +2 -0
- package/dist/mixins/menuItem.mjs.map +1 -1
- package/dist/mixins/motion.d.mts +28 -0
- package/dist/mixins/motion.mjs +66 -0
- package/dist/mixins/motion.mjs.map +1 -0
- package/dist/motion-origin.d.mts +7 -0
- package/dist/motion.d.mts +63 -0
- package/dist/no-layout-motion.d.mts +7 -0
- package/dist/no-transition-all.d.mts +7 -0
- package/dist/{operators-BHxKZcpD.d.mts → operators-B8_k3r69.d.mts} +10 -3
- package/dist/operators.d.mts +2 -2
- package/dist/overlay-motion.d.mts +7 -0
- package/dist/patterns/CardGrouping/index.mjs +6 -6
- package/dist/patterns/CardGrouping/index.mjs.map +1 -1
- package/dist/patterns/IndexTableLayout/index.mjs +23 -16
- package/dist/patterns/IndexTableLayout/index.mjs.map +1 -1
- package/dist/patterns/LayoutLoadingShimmer/index.mjs +4 -4
- package/dist/patterns/LayoutLoadingSpinner/index.mjs +3 -1
- package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -1
- package/dist/patterns/PageLayout/index.mjs +1 -1
- package/dist/patterns/WizardModal/index.mjs +2 -2
- package/dist/relative-date-label.d.mts +1 -1
- package/dist/{types-DLnCkvTt.d.mts → types-BJqmRXFV.d.mts} +15 -1
- package/dist/{types-CqcbWyUY.d.mts → types-BOsCi-kZ.d.mts} +8 -2
- package/dist/{types-BiqzeNsa.d.mts → types-Dws2XDz2.d.mts} +2 -2
- package/dist/{types-BEdERA4v.d.mts → types-NO2GRlM-.d.mts} +2 -2
- package/dist/types4.d.mts +1 -1
- package/dist/types5.d.mts +1 -1
- package/dist/types6.d.mts +1 -1
- package/dist/{url-state-CXUuK3_r.d.mts → url-state-CXPmXzIZ.d.mts} +2 -2
- package/dist/url-state.d.mts +1 -1
- package/dist/useChartColors.d.mts +30 -0
- package/dist/useChartSeriesVisibility.d.mts +22 -0
- package/dist/useChartStyles.d.mts +108 -0
- package/dist/useColumnConfiguration.d.mts +2 -2
- package/dist/useComboboxFooterAction.d.mts +1 -1
- package/dist/{useFilterStateV2-DBpbxAEC.d.mts → useFilterStateV2-DiTS9DTg.d.mts} +3 -3
- package/dist/useFilterStateV2.d.mts +1 -1
- package/dist/{useTableColumns-Xd14vx_h.d.mts → useTableColumns-tITjHasE.d.mts} +2 -2
- package/dist/useTableColumns.d.mts +1 -1
- package/dist/useTruncation.d.mts +1 -1
- package/dist/useValueControlError.d.mts +26 -0
- package/dist/utils.d.mts +1 -1
- package/dist/{validation-Tgg3AhuP.d.mts → validation-BDQdQ1cY.d.mts} +3 -3
- package/dist/validation.d.mts +1 -1
- package/dist/{value-control-resolver-XQbGCdsP.d.mts → value-control-resolver-BFJZEWDn.d.mts} +9 -3
- package/dist/value-control-resolver.d.mts +1 -1
- package/dist/value-labels.d.mts +12 -0
- package/dist/variables/keyframes.d.mts +2 -1
- package/dist/variables/keyframes.mjs +9 -1
- package/dist/variables/keyframes.mjs.map +1 -1
- package/dist/variables/transitions.d.mts +31 -1
- package/dist/variables/transitions.mjs +50 -1
- package/dist/variables/transitions.mjs.map +1 -1
- package/llms.txt +2 -1
- package/package.json +20 -4
- package/skills/new-screen/SKILL.md +33 -0
- package/skills/ui-authoring/COMPONENTS.md +19 -1
- package/skills/ui-authoring/PATTERNS.md +57 -36
- package/skills/ui-authoring/STANDARD.md +78 -4
- package/skills/ui-authoring/TOKENS.md +27 -24
- package/dist/Breadcrumbs-CMf3Uvow.mjs.map +0 -1
- package/dist/CardV2-CrV6eEQb.mjs.map +0 -1
- package/dist/Checkbox-Dr4LMKHV.mjs.map +0 -1
- package/dist/Combobox-CIKqTYZt.d.mts +0 -11
- package/dist/Combobox-Gb_j1dg6.mjs.map +0 -1
- package/dist/DataTable-CIZJ1vO8.mjs.map +0 -1
- package/dist/DropdownMenu-c8XK2Lr4.mjs.map +0 -1
- package/dist/FloatingToolbar-DLRaE0o7.mjs.map +0 -1
- package/dist/HoverCopyableField-XHC_n9tp.mjs.map +0 -1
- package/dist/IconButton-DxHB2g80.mjs.map +0 -1
- package/dist/Link-D_kCyLYX.mjs.map +0 -1
- package/dist/LoadingShimmer-oPIv2ESr.mjs.map +0 -1
- package/dist/PageLayout-DjtGrvJa.mjs.map +0 -1
- package/dist/Popover-DordjYNM.mjs.map +0 -1
- package/dist/Radio-BlEtetrr.mjs.map +0 -1
- package/dist/SegmentedControl-D_DA-MU1.mjs.map +0 -1
- package/dist/Select-DOlw_LPR.mjs.map +0 -1
- package/dist/TabBar-BCFO38E0.mjs.map +0 -1
- package/dist/Table-DPi4Dt5H.mjs.map +0 -1
- package/dist/TableBox-DNQsgQ8x.mjs.map +0 -1
- package/dist/TableControls-BrP_BqnF.mjs.map +0 -1
- package/dist/TechnicalSticker-Cq5jzYKQ.mjs.map +0 -1
- package/dist/TextArea-Dro-HH8O.mjs.map +0 -1
- package/dist/Toggle-D9MzTIZs.mjs.map +0 -1
- package/dist/Tooltip-YViXzMdm.mjs.map +0 -1
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
import { a as styled, o as useTheme, r as css } from "../../styledComponentsInterop-Cs5CCPRy.mjs";
|
|
2
|
+
import { chartingColors, semanticColor } from "../../lib/semanticColor.mjs";
|
|
3
|
+
import { chartingDark } from "../../variables/charting.mjs";
|
|
4
|
+
import { c as usePDSLocale } from "../../i18n-DaOKaFc2.mjs";
|
|
5
|
+
import { paragraphMixins } from "../../mixins/text.mjs";
|
|
6
|
+
import { i as Paragraph } from "../../Text-D0vEReED.mjs";
|
|
7
|
+
import { focusOutline } from "../../mixins/focus.mjs";
|
|
8
|
+
import { Hairline } from "../../variables/effect.mjs";
|
|
9
|
+
import { n as Stack } from "../../Stack-Bzom2BTR.mjs";
|
|
10
|
+
import { createContext, useCallback, useContext, useMemo, useState } from "react";
|
|
11
|
+
import { BorderRadius, Color, Spacing, Typography } from "@persona/design-tokens";
|
|
12
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
//#region src/components/Chart/chartColors.ts
|
|
14
|
+
/** @experimental */
|
|
15
|
+
const CHART_PALETTE_TOKENS = {
|
|
16
|
+
qualitative: "Qualitative",
|
|
17
|
+
sequentialMono: "SequentialMono",
|
|
18
|
+
sequentialDivergent: "SequentialDivergent"
|
|
19
|
+
};
|
|
20
|
+
/** @experimental */
|
|
21
|
+
const DEFAULT_CHART_PALETTE = "qualitative";
|
|
22
|
+
/**
|
|
23
|
+
* Marks a series colour override as a deliberate chart colour. It returns its argument unchanged;
|
|
24
|
+
* its job is to type-check the override (Persona tokens only, never hex) and to tell the
|
|
25
|
+
* `pds/semantic-color` lint rule that the `Color.*` inside is intended.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* { key: 'fraud', label: 'Fraud', color: chartColor(Color.CoreRed600) }
|
|
29
|
+
* { key: 'fraud', label: 'Fraud', color: chartColor({ light: Color.CoreRed600, dark: Color.CoreRed400 }) }
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @experimental
|
|
33
|
+
*/
|
|
34
|
+
const chartColor = (color) => color;
|
|
35
|
+
/** The ordered colours of `palette` in `tokens`. @experimental */
|
|
36
|
+
const chartPaletteColors = (tokens, palette = DEFAULT_CHART_PALETTE) => tokens[CHART_PALETTE_TOKENS[palette]];
|
|
37
|
+
/** Resolves an override to the single token for `mode`. @experimental */
|
|
38
|
+
const resolveChartColor = (color, mode) => typeof color === "string" ? color : color[mode];
|
|
39
|
+
/** `'dark'` when `theme` carries the dark charting palettes, else `'light'`. @experimental */
|
|
40
|
+
const chartColorModeOf = (theme) => theme?.charting === chartingDark ? "dark" : "light";
|
|
41
|
+
const warnedPaletteOverflow = /* @__PURE__ */ new Set();
|
|
42
|
+
/**
|
|
43
|
+
* Assigns each series a colour token, keyed by series key.
|
|
44
|
+
*
|
|
45
|
+
* Series without an override take the palette colour at their own index, so a series keeps its
|
|
46
|
+
* colour when another is hidden or overridden. Past the end of the palette colours repeat and a
|
|
47
|
+
* development warning suggests grouping the extra series (e.g. into "Other"): never invent colours.
|
|
48
|
+
*
|
|
49
|
+
* @experimental
|
|
50
|
+
*/
|
|
51
|
+
function resolveSeriesColors(series, { tokens = chartingColors(void 0), palette, mode = "light" } = {}) {
|
|
52
|
+
const colors = chartPaletteColors(tokens, palette);
|
|
53
|
+
const resolved = {};
|
|
54
|
+
series.forEach(({ key, color }, index) => {
|
|
55
|
+
resolved[key] = color ? resolveChartColor(color, mode) : colors[index % colors.length];
|
|
56
|
+
});
|
|
57
|
+
const overflowKey = `${palette ?? "qualitative"}:${series.length}`;
|
|
58
|
+
if (process.env.NODE_ENV !== "production" && series.length > colors.length && !warnedPaletteOverflow.has(overflowKey)) {
|
|
59
|
+
warnedPaletteOverflow.add(overflowKey);
|
|
60
|
+
console.warn(`[PDS charts] ${series.length} series exceed the ${colors.length}-colour ${palette ?? "qualitative"} palette, so colours repeat. Group the extra series (for example into "Other") instead of adding colours.`);
|
|
61
|
+
}
|
|
62
|
+
return resolved;
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/components/Chart/useChartColors.ts
|
|
66
|
+
/**
|
|
67
|
+
* The chart colours for the current PDS colour mode. Reads the charting palettes `PDSProvider` /
|
|
68
|
+
* `ColorModeScope` install on the styled-components theme, so charts follow dark mode with no
|
|
69
|
+
* extra setup; without a PDS colour mode it returns the light `ChartingColors`.
|
|
70
|
+
*
|
|
71
|
+
* ```tsx
|
|
72
|
+
* const { resolve } = useChartColors();
|
|
73
|
+
* const colors = resolve([{ key: 'approved' }, { key: 'declined', color: chartColor(Color.CoreRed600) }]);
|
|
74
|
+
* <Bar dataKey='approved' fill={colors.approved} />
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @experimental
|
|
78
|
+
*/
|
|
79
|
+
function useChartColors(palette = DEFAULT_CHART_PALETTE) {
|
|
80
|
+
const theme = useTheme();
|
|
81
|
+
const tokens = chartingColors(theme);
|
|
82
|
+
const mode = chartColorModeOf(theme);
|
|
83
|
+
const colors = chartPaletteColors(tokens, palette);
|
|
84
|
+
const resolve = useCallback((series) => resolveSeriesColors(series, {
|
|
85
|
+
tokens,
|
|
86
|
+
palette,
|
|
87
|
+
mode
|
|
88
|
+
}), [
|
|
89
|
+
tokens,
|
|
90
|
+
palette,
|
|
91
|
+
mode
|
|
92
|
+
]);
|
|
93
|
+
return useMemo(() => ({
|
|
94
|
+
mode,
|
|
95
|
+
colors,
|
|
96
|
+
resolve
|
|
97
|
+
}), [
|
|
98
|
+
mode,
|
|
99
|
+
colors,
|
|
100
|
+
resolve
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/components/Chart/chartFrameLayout.ts
|
|
105
|
+
/** @experimental */
|
|
106
|
+
const DEFAULT_CHART_LEGEND_POSITION = "stack";
|
|
107
|
+
/**
|
|
108
|
+
* Plot height in px when a `ChartFrame` is given none. The plot always fills the frame's width.
|
|
109
|
+
*
|
|
110
|
+
* @experimental
|
|
111
|
+
*/
|
|
112
|
+
const CHART_DEFAULT_HEIGHT = 300;
|
|
113
|
+
/**
|
|
114
|
+
* Opacity of a de-emphasised series: a hidden series' legend swatch, and the series a pointer is
|
|
115
|
+
* not on (its popover row and its segment in the hovered bar).
|
|
116
|
+
*
|
|
117
|
+
* @experimental
|
|
118
|
+
*/
|
|
119
|
+
const CHART_INACTIVE_OPACITY = .65;
|
|
120
|
+
/**
|
|
121
|
+
* Recharts margin for a plot inside a `ChartFrame`. The frame owns the spacing around the plot
|
|
122
|
+
* (`Spacing[3]` between legend and plot) and lets axis labels overflow the SVG, so the chart adds
|
|
123
|
+
* no margin of its own: `<BarChart margin={CHART_PLOT_MARGIN} ...>`.
|
|
124
|
+
*
|
|
125
|
+
* @experimental
|
|
126
|
+
*/
|
|
127
|
+
const CHART_PLOT_MARGIN = {
|
|
128
|
+
top: 0,
|
|
129
|
+
right: 0,
|
|
130
|
+
bottom: 0,
|
|
131
|
+
left: 0
|
|
132
|
+
};
|
|
133
|
+
const ChartLegendPositionContext = createContext(void 0);
|
|
134
|
+
/** Provided by `ChartFrame` so its `ChartLegend` lays its items out to match. */
|
|
135
|
+
const ChartLegendPositionProvider = ChartLegendPositionContext.Provider;
|
|
136
|
+
/** The legend position of the enclosing `ChartFrame`, or `undefined` outside one. */
|
|
137
|
+
const useChartLegendPosition = () => useContext(ChartLegendPositionContext);
|
|
138
|
+
//#endregion
|
|
139
|
+
//#region src/components/Chart/ChartFrame.tsx
|
|
140
|
+
const Frame = styled.figure`
|
|
141
|
+
display: flex;
|
|
142
|
+
gap: ${({ $position }) => $position === "right" ? Spacing[3] : Spacing[4]};
|
|
143
|
+
box-sizing: border-box;
|
|
144
|
+
width: 100%;
|
|
145
|
+
margin: 0;
|
|
146
|
+
min-width: 0;
|
|
147
|
+
${({ $position }) => $position === "right" ? css`
|
|
148
|
+
flex-direction: row-reverse;
|
|
149
|
+
align-items: flex-start;
|
|
150
|
+
` : css`
|
|
151
|
+
flex-direction: column;
|
|
152
|
+
align-items: flex-start;
|
|
153
|
+
`}
|
|
154
|
+
`;
|
|
155
|
+
const INLINE_LEGEND_MAX_WIDTH = "200px";
|
|
156
|
+
const LegendSlot = styled.div`
|
|
157
|
+
min-width: 0;
|
|
158
|
+
${({ $position }) => $position === "right" && css`
|
|
159
|
+
flex: 0 0 auto;
|
|
160
|
+
width: max-content; /* fits the longest label, on one line */
|
|
161
|
+
max-width: min(${INLINE_LEGEND_MAX_WIDTH}, 33%);
|
|
162
|
+
`}
|
|
163
|
+
`;
|
|
164
|
+
const Plot = styled.div`
|
|
165
|
+
align-self: stretch;
|
|
166
|
+
flex: 1 1 auto;
|
|
167
|
+
min-width: 0;
|
|
168
|
+
height: ${({ $height }) => $height}px;
|
|
169
|
+
|
|
170
|
+
/* Axis labels may overflow the plot box instead of needing a Recharts margin. */
|
|
171
|
+
.recharts-surface {
|
|
172
|
+
overflow: visible;
|
|
173
|
+
}
|
|
174
|
+
`;
|
|
175
|
+
/**
|
|
176
|
+
* Lays out a chart: its legend and the plot area, `Spacing[4]` apart stacked (`Spacing[3]` inline), with the legend left-aligned
|
|
177
|
+
* above the plot (`legendPosition='stack'`, the default) or inline on its right (`'right'`). The
|
|
178
|
+
* frame has no header, border or surface of its own: titles, descriptions and controls belong to
|
|
179
|
+
* the surrounding container (for example a `CardV2`), which also names the chart via
|
|
180
|
+
* `aria-labelledby`.
|
|
181
|
+
*
|
|
182
|
+
* Size: the chart fills 100% of its container's width, and the plot is 300px tall
|
|
183
|
+
* (`CHART_DEFAULT_HEIGHT`) unless `height` overrides it.
|
|
184
|
+
*
|
|
185
|
+
* @experimental Part of the in-progress PDS charting components; the API may change.
|
|
186
|
+
*/
|
|
187
|
+
function ChartFrame({ legend, legendPosition = DEFAULT_CHART_LEGEND_POSITION, height = 300, children, className, ...label }) {
|
|
188
|
+
return /* @__PURE__ */ jsx(ChartLegendPositionProvider, {
|
|
189
|
+
value: legendPosition,
|
|
190
|
+
children: /* @__PURE__ */ jsxs(Frame, {
|
|
191
|
+
$position: legendPosition,
|
|
192
|
+
className,
|
|
193
|
+
"data-legend-position": legendPosition,
|
|
194
|
+
...label,
|
|
195
|
+
children: [legend && /* @__PURE__ */ jsx(LegendSlot, {
|
|
196
|
+
$position: legendPosition,
|
|
197
|
+
children: legend
|
|
198
|
+
}), /* @__PURE__ */ jsx(Plot, {
|
|
199
|
+
$height: height,
|
|
200
|
+
children
|
|
201
|
+
})]
|
|
202
|
+
})
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//#endregion
|
|
206
|
+
//#region src/components/Chart/ChartLegend.tsx
|
|
207
|
+
const SWATCH_SIZE = Spacing[3];
|
|
208
|
+
const List = styled(Stack)`
|
|
209
|
+
min-width: 0;
|
|
210
|
+
max-width: 100%;
|
|
211
|
+
margin: 0;
|
|
212
|
+
padding: 0;
|
|
213
|
+
list-style: none;
|
|
214
|
+
`;
|
|
215
|
+
const ListItem = styled.li`
|
|
216
|
+
display: flex;
|
|
217
|
+
min-width: 0;
|
|
218
|
+
max-width: 100%;
|
|
219
|
+
`;
|
|
220
|
+
const Label = styled(Paragraph)`
|
|
221
|
+
min-width: 0;
|
|
222
|
+
overflow: hidden;
|
|
223
|
+
text-overflow: ellipsis;
|
|
224
|
+
white-space: nowrap;
|
|
225
|
+
`;
|
|
226
|
+
const Swatch$1 = styled.span`
|
|
227
|
+
flex-shrink: 0;
|
|
228
|
+
width: ${SWATCH_SIZE};
|
|
229
|
+
height: ${SWATCH_SIZE};
|
|
230
|
+
border-radius: ${BorderRadius.Sm};
|
|
231
|
+
background: ${({ $color }) => $color};
|
|
232
|
+
opacity: ${({ $hidden }) => $hidden ? CHART_INACTIVE_OPACITY : 1};
|
|
233
|
+
`;
|
|
234
|
+
const ToggleButton = styled.button`
|
|
235
|
+
${paragraphMixins.md};
|
|
236
|
+
display: flex;
|
|
237
|
+
align-items: center;
|
|
238
|
+
gap: ${Spacing[2]};
|
|
239
|
+
min-width: 0;
|
|
240
|
+
max-width: 100%;
|
|
241
|
+
margin: 0;
|
|
242
|
+
padding: 0;
|
|
243
|
+
border: 0;
|
|
244
|
+
border-radius: ${BorderRadius.Sm};
|
|
245
|
+
background: none;
|
|
246
|
+
color: inherit;
|
|
247
|
+
text-align: start;
|
|
248
|
+
cursor: pointer;
|
|
249
|
+
${focusOutline}
|
|
250
|
+
|
|
251
|
+
/* Hover and pressed fill, as on a text Button. The same-colour spread ring paints the fill a
|
|
252
|
+
little past the item without changing the legend's layout. */
|
|
253
|
+
&:hover {
|
|
254
|
+
${({ theme }) => {
|
|
255
|
+
const fill = semanticColor(theme, "ActionNeutralHover", Color.CoreSlate100);
|
|
256
|
+
return `background-color: ${fill}; box-shadow: 0 0 0 ${Spacing[1]} ${fill};`;
|
|
257
|
+
}}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
&:active {
|
|
261
|
+
${({ theme }) => {
|
|
262
|
+
const fill = semanticColor(theme, "ActionNeutralActive", Color.CoreSlate200);
|
|
263
|
+
return `background-color: ${fill}; box-shadow: 0 0 0 ${Spacing[1]} ${fill};`;
|
|
264
|
+
}}
|
|
265
|
+
}
|
|
266
|
+
`;
|
|
267
|
+
const StaticItem = styled.span`
|
|
268
|
+
${paragraphMixins.md};
|
|
269
|
+
display: flex;
|
|
270
|
+
align-items: center;
|
|
271
|
+
gap: ${Spacing[2]};
|
|
272
|
+
min-width: 0;
|
|
273
|
+
max-width: 100%;
|
|
274
|
+
`;
|
|
275
|
+
const GroupTitle = styled.span`
|
|
276
|
+
${paragraphMixins.smMono};
|
|
277
|
+
text-transform: uppercase;
|
|
278
|
+
color: ${({ theme }) => semanticColor(theme, "FgSecondary", Color.TextSecondary)};
|
|
279
|
+
`;
|
|
280
|
+
function LegendItems({ items, hidden, onToggle, "aria-label": ariaLabel, vertical, className }) {
|
|
281
|
+
return /* @__PURE__ */ jsx(List, {
|
|
282
|
+
as: "ul",
|
|
283
|
+
className,
|
|
284
|
+
"aria-label": ariaLabel,
|
|
285
|
+
direction: vertical ? "vertical" : "horizontal",
|
|
286
|
+
spacing: vertical ? Spacing[2] : Spacing[4],
|
|
287
|
+
wrap: vertical ? void 0 : "wrap",
|
|
288
|
+
align: vertical ? "flex-start" : "center",
|
|
289
|
+
children: items.map(({ key, label, color }) => {
|
|
290
|
+
const isHidden = hidden.includes(key);
|
|
291
|
+
const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Swatch$1, {
|
|
292
|
+
$color: color,
|
|
293
|
+
$hidden: isHidden,
|
|
294
|
+
"aria-hidden": true
|
|
295
|
+
}), /* @__PURE__ */ jsx(Label, {
|
|
296
|
+
as: "span",
|
|
297
|
+
size: "md",
|
|
298
|
+
color: isHidden ? "tertiary" : "primary",
|
|
299
|
+
title: label,
|
|
300
|
+
children: label
|
|
301
|
+
})] });
|
|
302
|
+
return /* @__PURE__ */ jsx(ListItem, { children: onToggle ? /* @__PURE__ */ jsx(ToggleButton, {
|
|
303
|
+
type: "button",
|
|
304
|
+
"aria-pressed": !isHidden,
|
|
305
|
+
onClick: () => onToggle(key),
|
|
306
|
+
children: content
|
|
307
|
+
}) : /* @__PURE__ */ jsx(StaticItem, { children: content }) }, key);
|
|
308
|
+
})
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* The series key for a chart: a square colour swatch and a `TextMedium` label per series, laid out
|
|
313
|
+
* in a row that wraps (a column when it sits right of the plot in a `ChartFrame`). With `onToggle`,
|
|
314
|
+
* each item toggles its series; a hidden series keeps a filled swatch at 65% opacity and gets a
|
|
315
|
+
* muted label.
|
|
316
|
+
*
|
|
317
|
+
* Pass `groups` instead of `items` for a grouped legend: groups stack `Spacing[2]` apart, each with
|
|
318
|
+
* an uppercase mono title `Spacing[1]` above its row of items.
|
|
319
|
+
*
|
|
320
|
+
* @experimental Part of the in-progress PDS charting components; the API may change.
|
|
321
|
+
*/
|
|
322
|
+
function ChartLegend({ items, groups, hidden = [], onToggle, "aria-label": ariaLabel = "Chart legend", className }) {
|
|
323
|
+
const vertical = useChartLegendPosition() === "right";
|
|
324
|
+
if (!groups) return /* @__PURE__ */ jsx(LegendItems, {
|
|
325
|
+
items,
|
|
326
|
+
hidden,
|
|
327
|
+
onToggle,
|
|
328
|
+
"aria-label": ariaLabel,
|
|
329
|
+
vertical,
|
|
330
|
+
className
|
|
331
|
+
});
|
|
332
|
+
return /* @__PURE__ */ jsx(Stack, {
|
|
333
|
+
role: "group",
|
|
334
|
+
"aria-label": ariaLabel,
|
|
335
|
+
className,
|
|
336
|
+
spacing: Spacing[2],
|
|
337
|
+
align: "flex-start",
|
|
338
|
+
children: groups.map((group) => /* @__PURE__ */ jsxs(Stack, {
|
|
339
|
+
spacing: Spacing[1],
|
|
340
|
+
align: "flex-start",
|
|
341
|
+
children: [/* @__PURE__ */ jsx(GroupTitle, {
|
|
342
|
+
"aria-hidden": true,
|
|
343
|
+
children: group.label
|
|
344
|
+
}), /* @__PURE__ */ jsx(LegendItems, {
|
|
345
|
+
items: group.items,
|
|
346
|
+
hidden,
|
|
347
|
+
onToggle,
|
|
348
|
+
"aria-label": group.label,
|
|
349
|
+
vertical
|
|
350
|
+
})]
|
|
351
|
+
}, group.key))
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
//#endregion
|
|
355
|
+
//#region src/components/Chart/useChartSeriesVisibility.ts
|
|
356
|
+
/**
|
|
357
|
+
* Show/hide state for a chart's series, driven by a {@link ChartLegend}. Every series may be hidden.
|
|
358
|
+
* Hide a Recharts series with its `hide` prop (`<Bar hide={isHidden(key)} />`) rather than
|
|
359
|
+
* unmounting it, so colours and axes stay put.
|
|
360
|
+
*
|
|
361
|
+
* @experimental
|
|
362
|
+
*/
|
|
363
|
+
function useChartSeriesVisibility(keys, initialHidden = []) {
|
|
364
|
+
const [hiddenSet, setHiddenSet] = useState(() => new Set(initialHidden));
|
|
365
|
+
const toggle = useCallback((key) => {
|
|
366
|
+
setHiddenSet((current) => {
|
|
367
|
+
const next = new Set(current);
|
|
368
|
+
if (next.has(key)) next.delete(key);
|
|
369
|
+
else next.add(key);
|
|
370
|
+
return next;
|
|
371
|
+
});
|
|
372
|
+
}, []);
|
|
373
|
+
const isHidden = useCallback((key) => hiddenSet.has(key), [hiddenSet]);
|
|
374
|
+
return useMemo(() => {
|
|
375
|
+
const hidden = keys.filter((key) => hiddenSet.has(key));
|
|
376
|
+
return {
|
|
377
|
+
hidden,
|
|
378
|
+
toggle,
|
|
379
|
+
isHidden,
|
|
380
|
+
allHidden: keys.length > 0 && hidden.length === keys.length
|
|
381
|
+
};
|
|
382
|
+
}, [
|
|
383
|
+
keys,
|
|
384
|
+
hiddenSet,
|
|
385
|
+
toggle,
|
|
386
|
+
isHidden
|
|
387
|
+
]);
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region src/components/Chart/ChartPopover.tsx
|
|
391
|
+
/** Default popover widths in px (Figma). @experimental */
|
|
392
|
+
const CHART_POPOVER_WIDTH = {
|
|
393
|
+
default: 256,
|
|
394
|
+
condensed: 210
|
|
395
|
+
};
|
|
396
|
+
const SPACING = {
|
|
397
|
+
default: {
|
|
398
|
+
padding: Spacing[3],
|
|
399
|
+
gap: Spacing[2]
|
|
400
|
+
},
|
|
401
|
+
condensed: {
|
|
402
|
+
padding: Spacing[2],
|
|
403
|
+
gap: Spacing[1]
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
const Panel = styled.div`
|
|
407
|
+
${paragraphMixins.md};
|
|
408
|
+
box-sizing: border-box;
|
|
409
|
+
display: flex;
|
|
410
|
+
flex-direction: column;
|
|
411
|
+
gap: ${({ $size }) => SPACING[$size].gap};
|
|
412
|
+
padding: ${({ $size }) => SPACING[$size].padding};
|
|
413
|
+
border-radius: ${BorderRadius.Md};
|
|
414
|
+
background-color: ${({ theme }) => semanticColor(theme, "SurfacePrimary", Color.BackgroundPrimary)};
|
|
415
|
+
box-shadow: ${"0px 8px 14px 0px rgba(0, 0, 0, 0.06), 0px 3px 24px 0px rgba(0, 0, 0, 0.06)"};
|
|
416
|
+
color: ${({ theme }) => semanticColor(theme, "FgPrimary", Color.TextPrimary)};
|
|
417
|
+
pointer-events: none;
|
|
418
|
+
`;
|
|
419
|
+
const Header = styled.div`
|
|
420
|
+
${paragraphMixins.mdBold};
|
|
421
|
+
`;
|
|
422
|
+
const Rows = styled.ul`
|
|
423
|
+
display: flex;
|
|
424
|
+
flex-direction: column;
|
|
425
|
+
gap: ${({ $size }) => SPACING[$size].gap};
|
|
426
|
+
margin: 0;
|
|
427
|
+
padding: 0;
|
|
428
|
+
list-style: none;
|
|
429
|
+
`;
|
|
430
|
+
const Row = styled.li`
|
|
431
|
+
display: grid;
|
|
432
|
+
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
433
|
+
align-items: center;
|
|
434
|
+
column-gap: ${Spacing[2]};
|
|
435
|
+
opacity: ${({ $dimmed }) => $dimmed ? CHART_INACTIVE_OPACITY : 1};
|
|
436
|
+
`;
|
|
437
|
+
const TotalRow = styled(Row)`
|
|
438
|
+
padding-top: ${Spacing[1]};
|
|
439
|
+
box-shadow: ${Hairline.Top};
|
|
440
|
+
`;
|
|
441
|
+
const Swatch = styled.span`
|
|
442
|
+
width: ${Spacing[3]};
|
|
443
|
+
height: ${Spacing[3]};
|
|
444
|
+
border-radius: ${"2px"};
|
|
445
|
+
flex-shrink: 0;
|
|
446
|
+
`;
|
|
447
|
+
const SeriesName = styled.span`
|
|
448
|
+
overflow: hidden;
|
|
449
|
+
color: ${({ theme }) => semanticColor(theme, "FgSecondary", Color.TextSecondary)};
|
|
450
|
+
text-overflow: ellipsis;
|
|
451
|
+
white-space: nowrap;
|
|
452
|
+
`;
|
|
453
|
+
const Value = styled.span`
|
|
454
|
+
${paragraphMixins.md};
|
|
455
|
+
text-align: right;
|
|
456
|
+
white-space: nowrap;
|
|
457
|
+
`;
|
|
458
|
+
const isPresent = (value) => typeof value === "number" ? !Number.isNaN(value) : typeof value === "string" && value !== "";
|
|
459
|
+
/**
|
|
460
|
+
* The chart popover body: an optional header, one row per series (swatch, name, right-aligned
|
|
461
|
+
* value) and an optional total row. Use it directly for a popover drawn outside Recharts; inside a
|
|
462
|
+
* Recharts chart use {@link ChartPopover}.
|
|
463
|
+
*
|
|
464
|
+
* @experimental Part of the in-progress PDS charting components; the API may change.
|
|
465
|
+
*/
|
|
466
|
+
function ChartPopoverPanel({ label, rows, valueFormatter, showTotal = false, total, totalLabel = "Total", size = "default", width, activeSeries, className }) {
|
|
467
|
+
const locale = usePDSLocale();
|
|
468
|
+
const format = (value, key) => {
|
|
469
|
+
if (valueFormatter) return valueFormatter(value, key);
|
|
470
|
+
return typeof value === "number" ? value.toLocaleString(locale) : value;
|
|
471
|
+
};
|
|
472
|
+
const totalValue = total ?? rows.reduce((sum, { value }) => typeof value === "number" && !Number.isNaN(value) ? sum + value : sum, 0);
|
|
473
|
+
const hasLabel = label !== void 0 && label !== null && label !== "";
|
|
474
|
+
return /* @__PURE__ */ jsxs(Panel, {
|
|
475
|
+
$size: size,
|
|
476
|
+
className,
|
|
477
|
+
"data-size": size,
|
|
478
|
+
"data-test": "chart-popover",
|
|
479
|
+
style: { width: width ?? CHART_POPOVER_WIDTH[size] },
|
|
480
|
+
children: [hasLabel && /* @__PURE__ */ jsx(Header, { children: label }), /* @__PURE__ */ jsxs(Rows, {
|
|
481
|
+
$size: size,
|
|
482
|
+
children: [rows.map((row) => /* @__PURE__ */ jsxs(Row, {
|
|
483
|
+
$dimmed: activeSeries !== void 0 && row.key !== activeSeries,
|
|
484
|
+
"data-active": activeSeries === row.key || void 0,
|
|
485
|
+
children: [
|
|
486
|
+
/* @__PURE__ */ jsx(Swatch, {
|
|
487
|
+
"aria-hidden": true,
|
|
488
|
+
style: { background: row.color }
|
|
489
|
+
}),
|
|
490
|
+
/* @__PURE__ */ jsx(SeriesName, {
|
|
491
|
+
title: typeof row.label === "string" ? row.label : void 0,
|
|
492
|
+
children: row.label
|
|
493
|
+
}),
|
|
494
|
+
/* @__PURE__ */ jsx(Value, { children: isPresent(row.value) ? format(row.value, row.key) : "–" })
|
|
495
|
+
]
|
|
496
|
+
}, row.key)), showTotal && size !== "condensed" && /* @__PURE__ */ jsxs(TotalRow, { children: [
|
|
497
|
+
/* @__PURE__ */ jsx(Swatch, { "aria-hidden": true }),
|
|
498
|
+
/* @__PURE__ */ jsx("span", { children: totalLabel }),
|
|
499
|
+
/* @__PURE__ */ jsx(Value, { children: format(totalValue, "total") })
|
|
500
|
+
] })]
|
|
501
|
+
})]
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
const entryKey = ({ dataKey, name }) => {
|
|
505
|
+
if (typeof dataKey === "string" || typeof dataKey === "number") return String(dataKey);
|
|
506
|
+
return typeof name === "string" || typeof name === "number" ? String(name) : void 0;
|
|
507
|
+
};
|
|
508
|
+
const isEntryVisible = (entry) => !entry.hide && !entry.inactive && entry.type !== "none";
|
|
509
|
+
/**
|
|
510
|
+
* Builds the popover rows from a Recharts tooltip payload: drops hidden and inactive series, then
|
|
511
|
+
* orders, labels and colours the rest by `series` (or keeps the payload order without it).
|
|
512
|
+
*
|
|
513
|
+
* @experimental
|
|
514
|
+
*/
|
|
515
|
+
function chartPopoverRows(payload, series, hiddenSeries) {
|
|
516
|
+
const hidden = new Set(hiddenSeries ?? []);
|
|
517
|
+
const visible = /* @__PURE__ */ new Map();
|
|
518
|
+
for (const entry of payload) {
|
|
519
|
+
const key = entryKey(entry);
|
|
520
|
+
if (key !== void 0 && !hidden.has(key) && isEntryVisible(entry) && !visible.has(key)) visible.set(key, entry);
|
|
521
|
+
}
|
|
522
|
+
const payloadColor = (entry) => entry.color ?? entry.fill ?? entry.stroke;
|
|
523
|
+
if (!series) return [...visible].map(([key, entry]) => ({
|
|
524
|
+
key,
|
|
525
|
+
label: isPresent(entry.name) ? entry.name : key,
|
|
526
|
+
color: payloadColor(entry),
|
|
527
|
+
value: entry.value
|
|
528
|
+
}));
|
|
529
|
+
return series.flatMap(({ key, label, color }) => {
|
|
530
|
+
const entry = visible.get(key);
|
|
531
|
+
return entry ? [{
|
|
532
|
+
key,
|
|
533
|
+
label,
|
|
534
|
+
color: color ?? payloadColor(entry),
|
|
535
|
+
value: entry.value
|
|
536
|
+
}] : [];
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Chart popover (tooltip) content for Recharts 2 and 3. Pass it to `<Tooltip content={...} />`;
|
|
541
|
+
* Recharts injects `active`, `payload` and `label`.
|
|
542
|
+
*
|
|
543
|
+
* ```tsx
|
|
544
|
+
* const series = [{ key: 'approved', label: 'Approved', color: colors.approved }, ...];
|
|
545
|
+
* <Tooltip cursor={false} content={<ChartPopover series={series} hiddenSeries={hidden} />} />
|
|
546
|
+
* ```
|
|
547
|
+
*
|
|
548
|
+
* Renders nothing while inactive or when every series is hidden.
|
|
549
|
+
*
|
|
550
|
+
* @experimental Part of the in-progress PDS charting components; the API may change.
|
|
551
|
+
*/
|
|
552
|
+
function ChartPopover({ active, payload, label, series, hiddenSeries, labelFormatter, ...panelProps }) {
|
|
553
|
+
if (!active || !payload || payload.length === 0) return null;
|
|
554
|
+
const rows = chartPopoverRows(payload, series, hiddenSeries);
|
|
555
|
+
if (rows.length === 0) return null;
|
|
556
|
+
const header = labelFormatter ? labelFormatter(label, payload) : label;
|
|
557
|
+
return /* @__PURE__ */ jsx(ChartPopoverPanel, {
|
|
558
|
+
...panelProps,
|
|
559
|
+
label: header,
|
|
560
|
+
rows
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
//#endregion
|
|
564
|
+
//#region src/components/Chart/useChartStyles.ts
|
|
565
|
+
const GRID_Z_INDEX = 250;
|
|
566
|
+
/**
|
|
567
|
+
* PDS styling for hand-built Recharts charts, as props to spread on Recharts' own components so a
|
|
568
|
+
* custom chart (reference lines, formatters, extra children) keeps the PDS look:
|
|
569
|
+
*
|
|
570
|
+
* ```tsx
|
|
571
|
+
* const styles = useChartStyles();
|
|
572
|
+
* <BarChart data={data} margin={CHART_PLOT_MARGIN}>
|
|
573
|
+
* <Tooltip cursor={styles.barCursor} content={<ChartPopover series={series} />} />
|
|
574
|
+
* <CartesianGrid {...styles.grid} />
|
|
575
|
+
* <XAxis dataKey='month' {...styles.xAxis} tickFormatter={formatMonth} />
|
|
576
|
+
* <YAxis {...styles.yAxis} />
|
|
577
|
+
* <ReferenceLine y={target} stroke={styles.colors.axis} strokeDasharray='4 4' />
|
|
578
|
+
* ...
|
|
579
|
+
* </BarChart>
|
|
580
|
+
* ```
|
|
581
|
+
*
|
|
582
|
+
* Colours come from semantic tokens, so they follow light and dark mode.
|
|
583
|
+
*
|
|
584
|
+
* @experimental Part of the in-progress PDS charting components; the API may change.
|
|
585
|
+
*/
|
|
586
|
+
function useChartStyles() {
|
|
587
|
+
const theme = useTheme();
|
|
588
|
+
const colors = {
|
|
589
|
+
grid: semanticColor(theme, "BorderDivider", Color.BorderHairline),
|
|
590
|
+
axis: semanticColor(theme, "BorderDefault", Color.BorderDivider),
|
|
591
|
+
text: semanticColor(theme, "FgSecondary", Color.TextSecondary),
|
|
592
|
+
surface: semanticColor(theme, "SurfacePrimary", Color.BackgroundPrimary),
|
|
593
|
+
hover: semanticColor(theme, "SurfaceHover", Color.BackgroundSecondary)
|
|
594
|
+
};
|
|
595
|
+
const tick = {
|
|
596
|
+
fill: colors.text,
|
|
597
|
+
fontSize: Typography.TextSmall.fontSize,
|
|
598
|
+
fontFamily: Typography.TextSmall.fontFamily
|
|
599
|
+
};
|
|
600
|
+
return {
|
|
601
|
+
colors,
|
|
602
|
+
/**
|
|
603
|
+
* `<CartesianGrid>`: horizontal gridlines only, drawn over the tooltip cursor band so they stay
|
|
604
|
+
* visible through it. Recharts 3 layers by `zIndex` (its cursor band is 200, bars 300); Recharts 2
|
|
605
|
+
* ignores `zIndex` and layers by child order, so put `<Tooltip>` before `<CartesianGrid>`.
|
|
606
|
+
*/
|
|
607
|
+
grid: {
|
|
608
|
+
vertical: false,
|
|
609
|
+
stroke: colors.grid,
|
|
610
|
+
zIndex: GRID_Z_INDEX
|
|
611
|
+
},
|
|
612
|
+
/** `<XAxis>`: no tick marks, a baseline in the default border colour. */
|
|
613
|
+
xAxis: {
|
|
614
|
+
tick,
|
|
615
|
+
tickLine: false,
|
|
616
|
+
axisLine: { stroke: colors.axis }
|
|
617
|
+
},
|
|
618
|
+
/** `<YAxis>`: no tick marks or axis line. */
|
|
619
|
+
yAxis: {
|
|
620
|
+
tick,
|
|
621
|
+
tickLine: false,
|
|
622
|
+
axisLine: false
|
|
623
|
+
},
|
|
624
|
+
/** `<Tooltip cursor>` for bar charts: a translucent band, so gridlines show through. */
|
|
625
|
+
barCursor: {
|
|
626
|
+
fill: colors.hover,
|
|
627
|
+
fillOpacity: CHART_INACTIVE_OPACITY
|
|
628
|
+
},
|
|
629
|
+
/** `<Tooltip cursor>` for line charts: a vertical line. */
|
|
630
|
+
lineCursor: { stroke: colors.axis },
|
|
631
|
+
/** `<Bar>` in a stack: a 1px surface-coloured line between segments. */
|
|
632
|
+
segmentGap: {
|
|
633
|
+
stroke: colors.surface,
|
|
634
|
+
strokeWidth: 1
|
|
635
|
+
},
|
|
636
|
+
/** `<Line activeDot>`: the hovered point, ringed in the surface colour. */
|
|
637
|
+
activeDot: {
|
|
638
|
+
r: 4,
|
|
639
|
+
stroke: colors.surface,
|
|
640
|
+
strokeWidth: 2
|
|
641
|
+
}
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Hover emphasis for bars holding several series (stacked or grouped): the segment under the
|
|
646
|
+
* pointer stays at full strength, the other segments of the same category drop to 65% opacity, and
|
|
647
|
+
* `activeSeries` dims the matching popover rows.
|
|
648
|
+
*
|
|
649
|
+
* ```tsx
|
|
650
|
+
* const { activeSeries, barHandlers, segmentOpacity } = useChartActiveSeries<Key>();
|
|
651
|
+
* <Tooltip content={<ChartPopover series={series} activeSeries={activeSeries} />} />
|
|
652
|
+
* {series.map(({ key }) => (
|
|
653
|
+
* <Bar key={key} dataKey={key} {...barHandlers(key)}>
|
|
654
|
+
* {data.map((_, i) => <Cell key={i} fillOpacity={segmentOpacity(key, i)} />)}
|
|
655
|
+
* </Bar>
|
|
656
|
+
* ))}
|
|
657
|
+
* ```
|
|
658
|
+
*
|
|
659
|
+
* @experimental
|
|
660
|
+
*/
|
|
661
|
+
function useChartActiveSeries() {
|
|
662
|
+
const [active, setActive] = useState(null);
|
|
663
|
+
const barHandlers = useCallback((key) => ({
|
|
664
|
+
onMouseEnter: (_data, index) => setActive({
|
|
665
|
+
key,
|
|
666
|
+
index
|
|
667
|
+
}),
|
|
668
|
+
onMouseLeave: () => setActive(null)
|
|
669
|
+
}), []);
|
|
670
|
+
const segmentOpacity = (key, index) => active && active.index === index && active.key !== key ? CHART_INACTIVE_OPACITY : 1;
|
|
671
|
+
return {
|
|
672
|
+
activeSeries: active?.key,
|
|
673
|
+
barHandlers,
|
|
674
|
+
segmentOpacity
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
//#endregion
|
|
678
|
+
export { CHART_DEFAULT_HEIGHT, CHART_INACTIVE_OPACITY, CHART_PALETTE_TOKENS, CHART_PLOT_MARGIN, ChartFrame, ChartLegend, ChartPopover, ChartPopoverPanel, DEFAULT_CHART_LEGEND_POSITION, DEFAULT_CHART_PALETTE, chartColor, chartColorModeOf, chartPaletteColors, chartPopoverRows, resolveChartColor, resolveSeriesColors, useChartActiveSeries, useChartColors, useChartSeriesVisibility, useChartStyles };
|
|
679
|
+
|
|
680
|
+
//# sourceMappingURL=index.mjs.map
|