@persona/design-system 0.10.9 → 0.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/dist/{Action-CHWYwpYR.d.mts → Action-sLO73eKq.d.mts} +2 -2
- package/dist/Action.d.mts +1 -1
- package/dist/AdvancedFilterRuleRow.d.mts +2 -2
- package/dist/AdvancedFilterRulesPopover.d.mts +2 -2
- package/dist/ArrayValueControl.d.mts +1 -1
- package/dist/Attribute.d.mts +2 -2
- package/dist/{Badge-BCdsVKuj.mjs → Badge-DZq6ByIU.mjs} +2 -2
- package/dist/{Badge-BCdsVKuj.mjs.map → Badge-DZq6ByIU.mjs.map} +1 -1
- package/dist/BooleanValueControl.d.mts +1 -1
- package/dist/{Breadcrumbs-CMf3Uvow.mjs → Breadcrumbs-DpsNZWF9.mjs} +9 -9
- package/dist/Breadcrumbs-DpsNZWF9.mjs.map +1 -0
- package/dist/{Button-DjD8QxcY.d.mts → Button-C4a4BTjL.d.mts} +2 -2
- package/dist/Button.d.mts +1 -1
- package/dist/CalendarBase.d.mts +1 -1
- package/dist/{Card-DiUHtYg_.d.mts → Card-CPV4_mHk.d.mts} +4 -4
- package/dist/Card.d.mts +1 -1
- package/dist/Card2.d.mts +1 -1
- package/dist/CardGrouping.d.mts +1 -1
- package/dist/{CardV2-ACI5RIzF.mjs → CardV2-DCoDfEvr.mjs} +26 -13
- package/dist/CardV2-DCoDfEvr.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-C3z7UUSC.mjs} +8 -8
- package/dist/Checkbox-C3z7UUSC.mjs.map +1 -0
- package/dist/{CheckboxGroupField-DnVqlpwi.d.mts → CheckboxGroupField-BT87OVOF.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-BkK_tosd.mjs} +300 -116
- package/dist/Combobox-BkK_tosd.mjs.map +1 -0
- package/dist/Combobox-aOJDTjzC.d.mts +12 -0
- package/dist/Combobox.d.mts +3 -3
- package/dist/{ComboboxBase-Mb8HyeAI.d.mts → ComboboxBase-Brgv5nxk.d.mts} +65 -25
- package/dist/ComboboxBase.d.mts +2 -2
- package/dist/{ComboboxMultiSelect-C87lkXr7.d.mts → ComboboxMultiSelect-DJyAv0Eg.d.mts} +10 -6
- package/dist/ComboboxMultiSelect.d.mts +2 -2
- package/dist/{ComboboxSingleSelect-CIYakRW5.d.mts → ComboboxSingleSelect-CP8-HLKl.d.mts} +8 -6
- package/dist/ComboboxSingleSelect.d.mts +2 -2
- package/dist/{CompactBar-BLZZWtIE.d.mts → CompactBar-B0LhjrYV.d.mts} +2 -2
- package/dist/CompactBar.d.mts +1 -1
- package/dist/{ConfigFormGroup-BCTWCws5.mjs → ConfigFormGroup-DAUqAhJW.mjs} +2 -2
- package/dist/{ConfigFormGroup-BCTWCws5.mjs.map → ConfigFormGroup-DAUqAhJW.mjs.map} +1 -1
- package/dist/{DataTable-Bf1WDY0z.d.mts → DataTable-CSl5Jn3E.d.mts} +18 -8
- package/dist/{DataTable-CIZJ1vO8.mjs → DataTable-DiwzhNMt.mjs} +41 -28
- package/dist/DataTable-DiwzhNMt.mjs.map +1 -0
- package/dist/DataTable.d.mts +1 -1
- package/dist/{DatePicker-C9redLBr.mjs → DatePicker-BK7ioKBm.mjs} +410 -410
- package/dist/DatePicker-BK7ioKBm.mjs.map +1 -0
- package/dist/DateRangeValueControl.d.mts +1 -1
- package/dist/DateValueControl.d.mts +1 -1
- package/dist/{DropdownButton-DpLG-cIj.mjs → DropdownButton-Dp-MZ5tA.mjs} +3 -3
- package/dist/{DropdownButton-DpLG-cIj.mjs.map → DropdownButton-Dp-MZ5tA.mjs.map} +1 -1
- package/dist/DropdownButton.d.mts +2 -2
- package/dist/{DropdownMenu-DVxXQDRC.d.mts → DropdownMenu-BnHPeHOm.d.mts} +3 -3
- package/dist/{DropdownMenu-c8XK2Lr4.mjs → DropdownMenu-jJSHQaih.mjs} +4 -2
- package/dist/DropdownMenu-jJSHQaih.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-DDyk14sx.d.mts} +4 -4
- 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-rfKurDs8.mjs} +36 -39
- package/dist/FloatingToolbar-rfKurDs8.mjs.map +1 -0
- package/dist/{FormControl-BztNXLn6.mjs → FormControl--pbTH3bY.mjs} +3 -3
- package/dist/{FormControl-BztNXLn6.mjs.map → FormControl--pbTH3bY.mjs.map} +1 -1
- package/dist/{FormControl-BQe3GRhi.d.mts → FormControl-DPYbLcBK.d.mts} +2 -2
- package/dist/FormControl.d.mts +1 -1
- package/dist/FormControlLabel.d.mts +2 -2
- package/dist/{FormField-BW5uMzId.d.mts → FormField-CYNGm2bJ.d.mts} +2 -2
- package/dist/{FormField-Cf1VMvoa.mjs → FormField-DMxjftFw.mjs} +14 -14
- package/dist/{FormField-Cf1VMvoa.mjs.map → FormField-DMxjftFw.mjs.map} +1 -1
- package/dist/FormField.d.mts +1 -1
- package/dist/{Grid-CYpOqTUu.mjs → Grid-DVC0SSEZ.mjs} +2 -2
- package/dist/{Grid-CYpOqTUu.mjs.map → Grid-DVC0SSEZ.mjs.map} +1 -1
- package/dist/{Header-CV0Lcf0C.d.mts → Header-DaaUprCL.d.mts} +2 -2
- package/dist/Header.d.mts +1 -1
- package/dist/{HelperTooltip-BNM3pTM-.d.mts → HelperTooltip-C5BDdJSI.d.mts} +2 -2
- package/dist/HelperTooltip.d.mts +1 -1
- package/dist/HighlightedText.d.mts +1 -1
- package/dist/{HoverCopyableField-XHC_n9tp.mjs → HoverCopyableField-B2-xlwUt.mjs} +12 -7
- package/dist/HoverCopyableField-B2-xlwUt.mjs.map +1 -0
- package/dist/{IconButton-C_ReZm8v.d.mts → IconButton-7k-wjvH3.d.mts} +2 -2
- package/dist/{IconButton-DxHB2g80.mjs → IconButton-kSjnfhWt.mjs} +11 -10
- package/dist/IconButton-kSjnfhWt.mjs.map +1 -0
- package/dist/IconButton.d.mts +1 -1
- package/dist/ImageTile.d.mts +1 -1
- package/dist/IndexTableLayout.d.mts +4 -4
- package/dist/InlineCombobox.d.mts +1 -1
- package/dist/InlineInput.d.mts +1 -1
- package/dist/{Input-DH-5dKor.d.mts → Input-CwvrBsiS.d.mts} +3 -3
- package/dist/{Input-RHXujO9u.mjs → Input-TRmTBEav.mjs} +5 -5
- package/dist/{Input-RHXujO9u.mjs.map → Input-TRmTBEav.mjs.map} +1 -1
- package/dist/Input.d.mts +1 -1
- package/dist/IntegerValueControl.d.mts +3 -2
- package/dist/{Link-D_kCyLYX.mjs → Link-XvzUN8sY.mjs} +6 -6
- package/dist/Link-XvzUN8sY.mjs.map +1 -0
- package/dist/{ListBox-DxOACf6N.d.mts → ListBox-BePQBYR7.d.mts} +3 -3
- package/dist/{ListBox-BZp6exb8.mjs → ListBox-DahM1PgU.mjs} +12 -12
- package/dist/{ListBox-BZp6exb8.mjs.map → ListBox-DahM1PgU.mjs.map} +1 -1
- package/dist/ListBox.d.mts +1 -1
- package/dist/{ListBoxField-CgnDuhUw.d.mts → ListBoxField-lj7JN1BX.d.mts} +4 -4
- package/dist/ListBoxField.d.mts +1 -1
- package/dist/{LoadingShimmer-oPIv2ESr.mjs → LoadingShimmer-CpfKTSUs.mjs} +4 -3
- package/dist/LoadingShimmer-CpfKTSUs.mjs.map +1 -0
- package/dist/LoadingShimmer.d.mts +1 -1
- package/dist/{LogicRow-Dv_1G1TC.d.mts → LogicRow-Do7t7Suf.d.mts} +2 -2
- package/dist/LogicRow.d.mts +1 -1
- package/dist/MaskedInput.d.mts +2 -2
- package/dist/MatchHighlight.d.mts +1 -1
- package/dist/{Menu-BVn1jh46.mjs → Menu-BvMzSH2I.mjs} +5 -5
- package/dist/{Menu-BVn1jh46.mjs.map → Menu-BvMzSH2I.mjs.map} +1 -1
- package/dist/{Menu-BfjvH8mr.d.mts → Menu-Ca5ftvo6.d.mts} +4 -4
- package/dist/Menu.d.mts +1 -1
- package/dist/{MiddleTruncatedText-DicQsLDG.mjs → MiddleTruncatedText--jzGTD00.mjs} +2 -2
- package/dist/{MiddleTruncatedText-DicQsLDG.mjs.map → MiddleTruncatedText--jzGTD00.mjs.map} +1 -1
- package/dist/{Modal-De5_bPJ_.mjs → Modal-B6X5AgWj.mjs} +54 -25
- package/dist/{Modal-De5_bPJ_.mjs.map → Modal-B6X5AgWj.mjs.map} +1 -1
- package/dist/{Modal-CujB7DuB.d.mts → Modal-BPfFyzkw.d.mts} +3 -3
- package/dist/Modal.d.mts +1 -1
- package/dist/{PageHeader-UPiqJpIF.d.mts → PageHeader-BeBmYmUX.d.mts} +2 -2
- package/dist/{PageHeader-7_Hf6rHl.mjs → PageHeader-bhQTjuZF.mjs} +2 -2
- package/dist/{PageHeader-7_Hf6rHl.mjs.map → PageHeader-bhQTjuZF.mjs.map} +1 -1
- package/dist/PageHeader.d.mts +1 -1
- package/dist/{PageLayout-BdVM37bV.d.mts → PageLayout-BXM_pyrU.d.mts} +2 -2
- package/dist/{PageLayout-DjtGrvJa.mjs → PageLayout-DgEGcZgB.mjs} +3 -3
- package/dist/{PageLayout-DjtGrvJa.mjs.map → PageLayout-DgEGcZgB.mjs.map} +1 -1
- package/dist/PageLayout.d.mts +1 -1
- package/dist/{PageSelector-B5CcAzss.d.mts → PageSelector-C14ABZVL.d.mts} +2 -2
- package/dist/PageSelector.d.mts +1 -1
- package/dist/{Pagination-DMH2IaV0.mjs → Pagination-DE8wT55m.mjs} +5 -5
- package/dist/{Pagination-DMH2IaV0.mjs.map → Pagination-DE8wT55m.mjs.map} +1 -1
- package/dist/{Pii-24D_nSRQ.mjs → Pii-C42ZY88Y.mjs} +2 -2
- package/dist/{Pii-24D_nSRQ.mjs.map → Pii-C42ZY88Y.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-DuFjaSoq.mjs} +4 -2
- package/dist/Popover-DuFjaSoq.mjs.map +1 -0
- package/dist/Popover.d.mts +1 -1
- package/dist/ProgressBar.d.mts +1 -1
- package/dist/{ProgressIndicator-zt3ndT9U.mjs → ProgressIndicator-hy1P-RG1.mjs} +3 -3
- package/dist/{ProgressIndicator-zt3ndT9U.mjs.map → ProgressIndicator-hy1P-RG1.mjs.map} +1 -1
- package/dist/{Radio-BlEtetrr.mjs → Radio-B4TBAho6.mjs} +5 -5
- package/dist/Radio-B4TBAho6.mjs.map +1 -0
- package/dist/{RadioGroup-CMrXmmn4.mjs → RadioGroup-Bf24GKOb.mjs} +3 -3
- package/dist/{RadioGroup-CMrXmmn4.mjs.map → RadioGroup-Bf24GKOb.mjs.map} +1 -1
- package/dist/RichTextEditor.d.mts +1 -1
- package/dist/RuleEditorFields.d.mts +2 -2
- package/dist/RulesPill.d.mts +1 -1
- package/dist/SectionHeading.d.mts +1 -1
- package/dist/{SegmentedControl-D_DA-MU1.mjs → SegmentedControl-BpR7sUWO.mjs} +6 -3
- package/dist/SegmentedControl-BpR7sUWO.mjs.map +1 -0
- package/dist/{Select-CaG6OQi1.d.mts → Select-DYdn73Nh.d.mts} +2 -2
- package/dist/{Select-DOlw_LPR.mjs → Select-RdTT2KoH.mjs} +10 -8
- package/dist/Select-RdTT2KoH.mjs.map +1 -0
- package/dist/Select.d.mts +1 -1
- package/dist/SmartTextInput.d.mts +1 -1
- package/dist/SmartTextInputField.d.mts +2 -2
- package/dist/SmartTextInputFunctionDialog.d.mts +1 -1
- package/dist/SmartTextInputPopover.d.mts +1 -1
- package/dist/{Spinner-CXb-KUs1.mjs → Spinner-vcApnJzv.mjs} +2 -2
- package/dist/{Spinner-CXb-KUs1.mjs.map → Spinner-vcApnJzv.mjs.map} +1 -1
- package/dist/{Stack-CODxfzhl.d.mts → Stack-B6MrjJeW.d.mts} +2 -2
- package/dist/Stack.d.mts +1 -1
- package/dist/{StatusIndicator-CzRaEFSz.mjs → StatusIndicator-lwt35J6B.mjs} +3 -3
- package/dist/{StatusIndicator-CzRaEFSz.mjs.map → StatusIndicator-lwt35J6B.mjs.map} +1 -1
- package/dist/{Sticker-CLvRB8V5.d.mts → Sticker-C7Wv3Obx.d.mts} +4 -4
- package/dist/{Sticker-C1_6I08u.mjs → Sticker-jfOM4Yi6.mjs} +5 -5
- package/dist/{Sticker-C1_6I08u.mjs.map → Sticker-jfOM4Yi6.mjs.map} +1 -1
- package/dist/Sticker.d.mts +1 -1
- package/dist/StringValueControl.d.mts +2 -1
- package/dist/Tab.d.mts +2 -2
- package/dist/{TabBar-BCFO38E0.mjs → TabBar-DwHgbIQ6.mjs} +8 -8
- package/dist/TabBar-DwHgbIQ6.mjs.map +1 -0
- package/dist/{Table-DPi4Dt5H.mjs → Table-SMJAWqoe.mjs} +21 -13
- package/dist/Table-SMJAWqoe.mjs.map +1 -0
- package/dist/{TableBox-DNQsgQ8x.mjs → TableBox-DS8mpN3-.mjs} +21 -17
- package/dist/TableBox-DS8mpN3-.mjs.map +1 -0
- package/dist/TableBox.d.mts +1 -1
- package/dist/{TableBoxCell-B9KMWebc.d.mts → TableBoxCell-Bo5xYEmR.d.mts} +6 -6
- package/dist/TableBoxCell.d.mts +1 -1
- package/dist/{TableBoxField-0uIGzBhF.d.mts → TableBoxField-CdgjSGLK.d.mts} +5 -5
- package/dist/TableBoxField.d.mts +1 -1
- package/dist/{TableBoxRow-PjBBDcEk.d.mts → TableBoxRow-DuWS2iRC.d.mts} +2 -2
- package/dist/TableBoxRow.d.mts +1 -1
- package/dist/{TableBoxRowActions-B7stm6Q3.d.mts → TableBoxRowActions-zW74DkXt.d.mts} +2 -2
- package/dist/TableBoxRowActions.d.mts +1 -1
- package/dist/{TableCell-CQsF7t4e.d.mts → TableCell-uv_jqT5e.d.mts} +2 -2
- package/dist/TableCell.d.mts +1 -1
- package/dist/{TableControls-ODHrCDJM.d.mts → TableControls-9vz-HfDu.d.mts} +4 -4
- package/dist/{TableControls-BrP_BqnF.mjs → TableControls-CX7BvgD2.mjs} +107 -43
- package/dist/TableControls-CX7BvgD2.mjs.map +1 -0
- package/dist/TableControls.d.mts +1 -1
- package/dist/{TableControlsContext-CHuLxfa7.d.mts → TableControlsContext-D0Hn3rwL.d.mts} +2 -2
- package/dist/TableControlsContext.d.mts +1 -1
- package/dist/{TableViewConfigurationDropdown-BWBBUXCs.d.mts → TableViewConfigurationDropdown-CZcLH8uR.d.mts} +2 -2
- package/dist/TableViewConfigurationDropdown.d.mts +1 -1
- package/dist/{TechnicalSticker-Cq5jzYKQ.mjs → TechnicalSticker-DrN45Vut.mjs} +9 -7
- package/dist/TechnicalSticker-DrN45Vut.mjs.map +1 -0
- package/dist/{Text-CvaqognH.d.mts → Text-CdHeSHCc.d.mts} +2 -2
- package/dist/Text.d.mts +1 -1
- package/dist/{TextArea-Dro-HH8O.mjs → TextArea-CQ1YNi2b.mjs} +4 -5
- package/dist/TextArea-CQ1YNi2b.mjs.map +1 -0
- package/dist/{TextUnderlineTooltip-Bd5e8KH3.d.mts → TextUnderlineTooltip-By1VVsSs.d.mts} +3 -3
- package/dist/TextUnderlineTooltip.d.mts +1 -1
- package/dist/Tile.d.mts +1 -1
- package/dist/{Toggle-D9MzTIZs.mjs → Toggle-DjmkjJlw.mjs} +13 -9
- package/dist/Toggle-DjmkjJlw.mjs.map +1 -0
- package/dist/{Tooltip-YViXzMdm.mjs → Tooltip-C2VB8I6y.mjs} +18 -5
- package/dist/Tooltip-C2VB8I6y.mjs.map +1 -0
- package/dist/{Tooltip-Ddy2Jq0K.d.mts → Tooltip-OxVvOfn8.d.mts} +3 -3
- package/dist/Tooltip.d.mts +1 -1
- package/dist/{TruncatedText-sr9Fhm3N.d.mts → TruncatedText-Dqj94BFK.d.mts} +2 -2
- package/dist/WizardModal.d.mts +1 -1
- package/dist/chartColors.d.mts +92 -0
- package/dist/chartFrameLayout.d.mts +46 -0
- package/dist/{clientFilterUtils-scLlIuP_.d.mts → clientFilterUtils-CMLuN8kK.d.mts} +2 -2
- package/dist/clientFilterUtils.d.mts +1 -1
- package/dist/components/Accordion/index.mjs +25 -16
- package/dist/components/Accordion/index.mjs.map +1 -1
- package/dist/components/Attribute/index.mjs +8 -6
- package/dist/components/Attribute/index.mjs.map +1 -1
- package/dist/components/Badge/index.mjs +1 -1
- package/dist/components/Banner/index.mjs +3 -3
- package/dist/components/BottomPanel/index.mjs +10 -8
- package/dist/components/BottomPanel/index.mjs.map +1 -1
- package/dist/components/Breadcrumbs/index.mjs +1 -1
- package/dist/components/Button/index.d.mts +2 -2
- package/dist/components/Button/index.mjs +1 -1
- package/dist/components/ButtonGroup/index.mjs +2 -2
- package/dist/components/Card/index.d.mts +2 -2
- package/dist/components/CardV2/index.d.mts +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 +4 -4
- package/dist/components/Combobox/index.d.mts +5 -3
- package/dist/components/Combobox/index.mjs +1 -1
- package/dist/components/ConfigFormGroup/index.mjs +1 -1
- package/dist/components/DataTable/TableControls/index.d.mts +20 -20
- 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 +20 -18
- package/dist/components/FloatingPanel/index.mjs.map +1 -1
- package/dist/components/FloatingToolbar/index.mjs +1 -1
- package/dist/components/FormControl/index.d.mts +1 -1
- package/dist/components/FormControl/index.mjs +1 -1
- package/dist/components/FormField/index.d.mts +5 -5
- package/dist/components/FormField/index.mjs +1 -1
- package/dist/components/Grid/index.mjs +1 -1
- package/dist/components/HoverCopyableField/index.mjs +1 -1
- package/dist/components/ImageTile/index.mjs +10 -10
- package/dist/components/ImageTile/index.mjs.map +1 -1
- package/dist/components/Input/index.d.mts +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/Menu/index.mjs +1 -1
- package/dist/components/Modal/index.d.mts +1 -1
- package/dist/components/Modal/index.mjs +1 -1
- package/dist/components/PageHeader/index.d.mts +1 -1
- package/dist/components/PageHeader/index.mjs +1 -1
- package/dist/components/Pagination/index.d.mts +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/ProgressIndicator/index.mjs +1 -1
- package/dist/components/Radio/index.mjs +1 -1
- package/dist/components/RadioGroup/index.mjs +1 -1
- package/dist/components/RichTextEditor/index.mjs +9 -9
- package/dist/components/RightPanel/index.mjs +30 -15
- 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 +5 -5
- package/dist/components/Slider/index.mjs +5 -4
- package/dist/components/Slider/index.mjs.map +1 -1
- package/dist/components/SmartTextInput/index.mjs +11 -18
- package/dist/components/SmartTextInput/index.mjs.map +1 -1
- package/dist/components/Spinner/index.mjs +1 -1
- package/dist/components/Stack/index.d.mts +1 -1
- package/dist/components/StatusIndicator/index.mjs +1 -1
- package/dist/components/Sticker/index.d.mts +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.d.mts +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/Text/index.d.mts +1 -1
- package/dist/components/TextArea/index.mjs +1 -1
- package/dist/components/Tile/index.mjs +2 -2
- package/dist/components/Toast/index.mjs +19 -13
- package/dist/components/Toast/index.mjs.map +1 -1
- package/dist/components/Toggle/index.mjs +1 -1
- package/dist/components/Tooltip/index.d.mts +3 -3
- package/dist/components/Tooltip/index.mjs +1 -1
- package/dist/components/VersionHistory/index.mjs +8 -8
- 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-yfzOlqKx.d.mts → filters-By_TYKAZ.d.mts} +3 -3
- package/dist/filters.d.mts +1 -1
- package/dist/{helpers-BeCjgAeE.d.mts → helpers-BIHsqdyX.d.mts} +2 -2
- package/dist/helpers.d.mts +1 -1
- package/dist/{index-kIon1vPp.d.mts → index-BozzRwby.d.mts} +2 -2
- package/dist/{index-BEHNqAZa.d.mts → index-CZJp4Af6.d.mts} +3 -3
- package/dist/index2.d.mts +1 -1
- package/dist/index4.d.mts +3 -3
- package/dist/index5.d.mts +1 -1
- package/dist/index6.d.mts +14 -14
- package/dist/{inputFields-BnCdmuBt.d.mts → inputFields-BqO2H-Kj.d.mts} +6 -6
- package/dist/inputFields.d.mts +1 -1
- package/dist/lib/MiddleTruncatedText.mjs +1 -1
- package/dist/lib/TruncatedText.d.mts +1 -1
- package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
- package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
- package/dist/lib/colorMode.d.mts +1 -1
- package/dist/lib/schemaOptions.mjs +9 -4
- package/dist/lib/schemaOptions.mjs.map +1 -1
- package/dist/lib/useChain.d.mts +1 -1
- 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/focus.mjs +1 -1
- package/dist/mixins/hoverable.mjs +2 -2
- package/dist/mixins/hoverable.mjs.map +1 -1
- package/dist/mixins/input.mjs +3 -2
- 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 +24 -0
- package/dist/mixins/motion.mjs +44 -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 +9 -9
- package/dist/patterns/CardGrouping/index.mjs.map +1 -1
- package/dist/patterns/IndexTableLayout/index.mjs +3 -3
- 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.d.mts +1 -1
- package/dist/patterns/PageLayout/index.mjs +1 -1
- package/dist/patterns/WizardModal/index.mjs +4 -4
- package/dist/relative-date-label.d.mts +1 -1
- package/dist/tone.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-BXJ6qAGy.d.mts → types-C_CncajO.d.mts} +2 -2
- package/dist/{types-BeFBvQ1c.d.mts → types-D5txFacG.d.mts} +3 -3
- 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/{useChain-B--KAtdN.d.mts → useChain-x9fd9Fyq.d.mts} +2 -2
- package/dist/useChainAtCursor.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-DJFy0Gp8.d.mts → useTableColumns-BEKJNrb1.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/variables/charting.mjs +1 -1
- package/dist/variables/charting.mjs.map +1 -1
- 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 +3 -2
- package/package.json +14 -4
- package/skills/new-screen/SKILL.md +33 -0
- package/skills/ui-authoring/COMPONENTS.md +19 -1
- package/skills/ui-authoring/PATTERNS.md +57 -33
- package/skills/ui-authoring/STANDARD.md +68 -4
- package/skills/ui-authoring/TOKENS.md +27 -24
- package/dist/Breadcrumbs-CMf3Uvow.mjs.map +0 -1
- package/dist/CardV2-ACI5RIzF.mjs.map +0 -1
- package/dist/Checkbox-Dr4LMKHV.mjs.map +0 -1
- package/dist/Combobox-Gb_j1dg6.mjs.map +0 -1
- package/dist/Combobox-fYZjpn5-.d.mts +0 -11
- package/dist/DataTable-CIZJ1vO8.mjs.map +0 -1
- package/dist/DatePicker-C9redLBr.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/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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable-CIZJ1vO8.mjs","names":["DropdownMenu","Pii","PlusIcon","DropdownMenu","tanstackMemo","DetailComponent","Pagination"],"sources":["../src/components/DataTable/clientFilterUtils.ts","../src/components/DataTable/constants.ts","../src/components/DataTable/FloatingActionBar.tsx","../src/components/DataTable/helpers.tsx","../src/components/DataTable/Inserter.tsx","../src/components/DataTable/useTableColumns.tsx","../src/components/DataTable/DataTable.tsx"],"sourcesContent":["import type { Column, ColumnFiltersState, Header, RowData, Table } from '@tanstack/react-table';\nimport type { Dispatch, SetStateAction } from 'react';\n\nimport type { FilterConfig } from './TableControls/types';\nimport type { ClientFilterConfig } from './types';\n\nexport const getFilterFnName = (filterType: string): string => {\n switch (filterType) {\n case 'select':\n return 'equals';\n case 'multiselect':\n case 'multiselect-alt':\n case 'multiselect-legacy':\n return 'arrIncludesSome';\n case 'input':\n return 'includesString';\n default:\n return 'equals';\n }\n};\n\nconst isEmptyFilterValue = (value: unknown): boolean => {\n return value == null || value === '' || (Array.isArray(value) && value.length === 0);\n};\n\nconst isClientFilterConfig = (filter: unknown): filter is ClientFilterConfig => {\n if (typeof filter !== 'object' || filter === null || !('type' in filter)) {\n return false;\n }\n return filter.type === 'select' || filter.type === 'multiselect' || filter.type === 'input';\n};\n\n/** Converts column-level client filters into controls backed by TanStack's column-filter state. */\nexport const generateClientFilters = <TData extends RowData>(\n columns: Array<{\n id?: string;\n accessor: string;\n header:\n | string\n | ((props: {\n table: Table<TData>;\n header: Header<TData, unknown>;\n column: Column<TData, unknown>;\n }) => React.ReactNode);\n filter?: unknown;\n }>,\n columnFilters: ColumnFiltersState,\n setColumnFilters: Dispatch<SetStateAction<ColumnFiltersState>>,\n): FilterConfig[] => {\n return columns.flatMap((column): FilterConfig[] => {\n const filterConfig = column.filter;\n if (!isClientFilterConfig(filterConfig) || filterConfig.enabled === false) {\n return [];\n }\n\n const columnId = column.id || column.accessor;\n const name = typeof column.header === 'string' ? column.header : columnId;\n const currentValue = columnFilters.find((filter) => filter.id === columnId)?.value;\n const onChange = (value: unknown) => {\n setColumnFilters((previousFilters) => {\n if (isEmptyFilterValue(value)) {\n return previousFilters.filter((filter) => filter.id !== columnId);\n }\n\n const existingFilter = previousFilters.some((filter) => filter.id === columnId);\n if (existingFilter) {\n return previousFilters.map((filter) =>\n filter.id === columnId ? { ...filter, value } : filter,\n );\n }\n\n return [...previousFilters, { id: columnId, value }];\n });\n };\n\n const baseConfig = {\n id: columnId,\n name,\n placeholder: filterConfig.placeholder,\n enabled: true,\n };\n\n switch (filterConfig.type) {\n case 'select':\n return [\n {\n ...baseConfig,\n type: 'select',\n value: (currentValue as string | undefined) ?? '',\n options: filterConfig.options ?? [],\n onChange,\n },\n ];\n case 'multiselect':\n return [\n {\n ...baseConfig,\n type: 'multiselect',\n value: (currentValue as string[] | undefined) ?? [],\n options: filterConfig.options ?? [],\n onChange,\n },\n ];\n case 'input':\n return [\n {\n ...baseConfig,\n type: 'input',\n value: (currentValue as string | undefined) ?? '',\n onChange,\n onDelete: () => onChange(''),\n },\n ];\n default:\n return [];\n }\n });\n};\n","export function getColumnWidths(compact?: boolean) {\n return {\n EXPAND_COLUMN_WIDTH: compact ? 32 : 36,\n SELECT_COLUMN_WIDTH: compact ? 32 : 40,\n ACTION_COLUMN_WIDTH: compact ? 32 : 40,\n NEST_SPACING: compact ? 24 : 32,\n };\n}\n","import styled from 'styled-components';\n\nimport { BorderRadius, Spacing } from '@persona/design-tokens';\nimport { XIcon } from '@persona/icons';\n\nimport Button, { IconButton } from '#src/components/Button';\nimport DropdownMenu from '#src/components/DropdownMenu';\nimport { HStack } from '#src/components/Stack';\nimport { Paragraph } from '#src/components/Text';\nimport { usePDSStrings } from '#src/lib/i18n';\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { Elevation } from '#src/variables/effect';\n\nconst Bar = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n background-color: ${({ theme }) => semanticColor(theme, 'SurfaceElevated', theme.color.background.primary)};\n width: 100%;\n padding: ${Spacing[2]};\n border-radius: ${BorderRadius.Md};\n box-shadow: ${Elevation.Mid};\n gap: ${Spacing[8]};\n min-width: 380px;\n`;\n\ninterface FloatingActionBarProps {\n selectedCount: number;\n onClearSelection: React.MouseEventHandler<HTMLButtonElement>;\n extraContent?: React.ReactNode;\n actions: (\n | {\n label: string;\n variant?: 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n popover?: {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string) => void | Promise<void>;\n };\n onClick: () => void | Promise<void>;\n }\n | {\n 'aria-label': string;\n icon: React.ReactNode;\n variant?: 'basic' | 'primary' | 'inverse' | 'danger' | 'text' | 'outline';\n popover?: {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string) => void | Promise<void>;\n };\n onClick: () => void | Promise<void>;\n }\n )[];\n}\n\nconst FloatingActionBar = ({\n selectedCount,\n onClearSelection,\n extraContent,\n actions,\n}: FloatingActionBarProps) => {\n const strings = usePDSStrings();\n return (\n <Bar>\n <HStack align='center'>\n <IconButton size='sm' onClick={onClearSelection} aria-label={strings.clearSelection}>\n <XIcon />\n </IconButton>\n <Paragraph color='primary'>{strings.selectedItems(selectedCount)}</Paragraph>\n </HStack>\n <HStack align='center' spacing={Spacing[2]}>\n {extraContent}\n {actions.map((action, index) => {\n const key = 'label' in action ? action.label : `action-${index}`;\n\n if ('popover' in action) {\n let trigger = null;\n if ('icon' in action && 'aria-label' in action) {\n // Icon-only action\n trigger = (\n <IconButton key={key} size='sm' aria-label={action['aria-label']}>\n {action.icon}\n </IconButton>\n );\n } else {\n trigger = (\n <Button key={key} variant={action.variant || 'basic'} size='sm'>\n {'label' in action ? action.label : ''}\n </Button>\n );\n }\n\n return (\n // Portaled: the bar is absolutely positioned inside the table's\n // scroll container, which clips an inline menu when the table\n // has a sticky header (`overflow: auto`).\n <DropdownMenu key={key} trigger={trigger} align='center' portal>\n {(action.popover?.options ?? []).map((option) => (\n <DropdownMenu.Item\n id={option.value}\n key={option.value}\n onClick={() => action.popover!.onOptionSelect(option.value)}\n >\n {option.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n );\n } else {\n if ('icon' in action && 'aria-label' in action) {\n // Icon-only action\n return (\n <IconButton\n key={key}\n size='sm'\n aria-label={action['aria-label']}\n onClick={action.onClick}\n >\n {action.icon}\n </IconButton>\n );\n } else {\n return (\n <Button\n key={key}\n onClick={action.onClick}\n variant={action.variant || 'basic'}\n size='sm'\n >\n {'label' in action ? action.label : ''}\n </Button>\n );\n }\n }\n })}\n </HStack>\n </Bar>\n );\n};\n\nexport default FloatingActionBar;\n","import { DateTime } from 'luxon';\nimport type { ReactNode } from 'react';\nimport styled from 'styled-components';\n\nimport { BorderRadius, Spacing } from '@persona/design-tokens';\nimport { ImageIcon } from '@persona/icons';\n\nimport Checkbox, { type CheckboxProps } from '#src/components/Checkbox';\nimport HoverCopyableField from '#src/components/HoverCopyableField';\nimport Link from '#src/components/Link';\nimport Pii from '#src/components/Pii';\nimport { HStack } from '#src/components/Stack';\nimport Sticker from '#src/components/Sticker';\nimport { Paragraph, TabularNumber } from '#src/components/Text';\nimport {\n DEFAULT_COMMON_STRINGS,\n formatDate,\n formatDateTime,\n type CommonStrings,\n} from '#src/lib/i18n';\nimport { semanticColor, semanticOnly } from '#src/lib/semanticColor';\n\nimport type {\n DataTableColumnFormat,\n DataTableColumnIDFormat,\n DataTableColumnImageFormat,\n DataTableColumnPiiFormat,\n DataTableColumnStringFormat,\n DateConfig,\n DatetimeConfig,\n RenderValueStickerFormatConfig,\n} from './types';\n\nconst EmptyCellText = styled(Paragraph)`\n ${semanticOnly((tokens) => `color: ${tokens.FgSecondaryStatic};`)}\n`;\n\nexport const renderAsCheckbox = ({\n rowId,\n isChecked,\n onChange,\n onValueChange,\n columnHeader,\n disabled,\n indeterminate,\n strings = DEFAULT_COMMON_STRINGS,\n}: {\n rowId: string;\n isChecked: boolean;\n /**\n * Called when the checkbox is clicked\n * @param e - The event object\n */\n onChange?: CheckboxProps['onChange'];\n /**\n * Called when the checkbox value changes\n * @param rowId - The id of the row\n * @param checked - The new value of the checkbox\n */\n onValueChange?: (rowId: string, checked: boolean) => void;\n columnHeader?: string;\n disabled?: boolean;\n indeterminate?: boolean;\n /** Built-in copy, from `usePDSStrings()`; English when omitted. */\n strings?: Pick<CommonStrings, 'selectRow' | 'selectRowForColumn'>;\n}): ReactNode => {\n const ariaLabel = columnHeader\n ? strings.selectRowForColumn(columnHeader, rowId)\n : strings.selectRow(rowId);\n\n return (\n <Checkbox\n checked={isChecked}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(rowId, e.target.checked);\n }}\n containerProps={{\n onClick: (e) => {\n // Prevent checkbox clicks from triggering row selection\n e.stopPropagation();\n },\n }}\n aria-label={ariaLabel}\n indeterminate={indeterminate}\n disabled={disabled}\n />\n );\n};\n\nexport const renderAsCheckboxHeader = ({\n header,\n isChecked,\n isIndeterminate,\n onChange,\n onValueChange,\n strings = DEFAULT_COMMON_STRINGS,\n}: {\n /**\n * The header text to display to the right of the checkbox\n */\n header?: string;\n isChecked: boolean;\n isIndeterminate: boolean;\n /**\n * Called when the checkbox is clicked\n * @param e - The event object\n */\n onChange?: CheckboxProps['onChange'];\n /**\n * Called when the checkbox value changes\n * @param rowId - The id of the row\n * @param checked - The new value of the checkbox\n */\n onValueChange?: (checked: boolean) => void;\n /** Built-in copy, from `usePDSStrings()`; English when omitted. */\n strings?: Pick<CommonStrings, 'selectAll' | 'selectAllOf'>;\n}): ReactNode => {\n const checkbox = (\n <Checkbox\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.checked);\n }}\n containerProps={{\n onClick: (e) => {\n // Prevent checkbox clicks from triggering column sorting\n e.stopPropagation();\n },\n }}\n aria-label={header ? strings.selectAllOf(header) : strings.selectAll}\n />\n );\n\n if (header) {\n return (\n <HStack spacing={Spacing[3]} align='center'>\n {checkbox}\n <span>{header}</span>\n </HStack>\n );\n }\n\n return checkbox;\n};\n\n// ---------------------------------------------------------------------------\n// Generic PDS cell renderers\n// ---------------------------------------------------------------------------\n\n/**\n * Options the built-in PDS cell renderers read from the provider. `DataTable` fills these in from\n * `usePDSLocale()` / `usePDSStrings()`; direct callers may omit them to get the English output.\n */\nexport interface PDSFormatOptions {\n /** BCP 47 locale. Dates and times keep the historical English format when omitted or en-US. */\n locale?: string;\n strings?: Pick<CommonStrings, 'noImage'>;\n}\n\nexport const renderAsString = (value: unknown): string => {\n if (value == null) {\n return '';\n }\n return typeof value === 'string'\n ? value\n : typeof value === 'object'\n ? JSON.stringify(value, null, 2)\n : String(value);\n};\n\nexport const renderAsDate = (value: unknown, config?: DateConfig, locale?: string): string => {\n if (value == null || typeof value !== 'string') {\n return '';\n }\n const date = DateTime.fromISO(value);\n return date.isValid\n ? formatDate(date, { locale, format: config?.format, showTimeZone: config?.showTimeZone })\n : '';\n};\n\nexport const renderAsDatetime = (\n value: unknown,\n config?: DatetimeConfig,\n locale?: string,\n): string => {\n if (value == null || typeof value !== 'string') {\n return '';\n }\n const date = DateTime.fromISO(value);\n return date.isValid\n ? formatDateTime(date, { locale, format: config?.format, showTimeZone: config?.showTimeZone })\n : '';\n};\n\nexport const renderAsURL = (value: unknown): ReactNode => {\n if (value == null || typeof value !== 'string' || value.length === 0) {\n return '';\n }\n return (\n <Link url={value} target='_blank'>\n {value}\n </Link>\n );\n};\n\nexport const renderAsNumber = (value: unknown): ReactNode => {\n if (value == null) {\n return '';\n }\n return <TabularNumber>{value}</TabularNumber>;\n};\n\nconst createSticker = (\n item: string,\n config?: RenderValueStickerFormatConfig,\n key?: string,\n): ReactNode => {\n const displayLabel = config?.labels?.[item] ?? item;\n const variant = config?.colors?.[item] ?? config?.defaultColor;\n return (\n <Sticker key={key} variant={variant}>\n {displayLabel}\n </Sticker>\n );\n};\n\nexport const renderAsSticker = (\n value: unknown,\n config?: RenderValueStickerFormatConfig,\n): ReactNode => {\n if (value == null) {\n return '';\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '';\n }\n return (\n <span style={{ display: 'flex', flexWrap: 'wrap', gap: '4px', alignItems: 'center' }}>\n {value.map((item, index) =>\n typeof item === 'string' ? createSticker(item, config, `${item}-${index}`) : null,\n )}\n </span>\n );\n }\n if (typeof value !== 'string') {\n return '';\n }\n return createSticker(value, config);\n};\n\n// ---------------------------------------------------------------------------\n// Private primitives used by PDS renderers\n// ---------------------------------------------------------------------------\n\n/** Inline monospace text — private DataTable primitive, avoids the dashboard Typography dep. */\nconst MonoText = styled.span`\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n font-size: 0.875em;\n`;\n\nconst WrappingText = styled.span`\n display: inline-block;\n max-width: 100%;\n word-break: break-word;\n overflow-wrap: break-word;\n`;\n\ntype EmptyImageProps = { $width?: string; $height?: string };\n\nconst EmptyImageContainer = styled.div<EmptyImageProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: ${BorderRadius.Md};\n background-color: ${({ theme }) => semanticColor(theme, 'SurfaceSecondary', theme.color.background.secondary)};\n width: ${({ $width }) => $width ?? '200px'};\n height: ${({ $height }) => $height ?? '144px'};\n svg {\n color: ${({ theme }) => semanticColor(theme, 'FgDisabled', theme.color.border.disabled)};\n }\n`;\n\nconst LightweightImg = styled.img<{ $fit?: string }>`\n object-fit: ${({ $fit }) => $fit ?? 'cover'};\n display: block;\n`;\n\n// ---------------------------------------------------------------------------\n// Copyable string renderer (used by 'string' and 'id' formats)\n// ---------------------------------------------------------------------------\n\nexport const renderAsCopyableString = (\n value: unknown,\n config?: DataTableColumnStringFormat['config'] & { emptyText?: string },\n): ReactNode => {\n const valueAsString = renderAsString(value);\n const content = config?.mono ? <MonoText>{valueAsString}</MonoText> : valueAsString;\n\n if (!valueAsString) {\n return <EmptyCellText>{config?.emptyText ?? ''}</EmptyCellText>;\n }\n\n return (\n <WrappingText>\n {config?.copyable ? (\n <HoverCopyableField copyValue={valueAsString}>{content}</HoverCopyableField>\n ) : (\n content\n )}\n </WrappingText>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PII renderer\n// ---------------------------------------------------------------------------\n\nexport const renderAsPii = <TData = unknown>(\n row?: TData,\n config?: DataTableColumnPiiFormat<TData>['config'],\n): ReactNode => {\n if (!config || !row) {\n return '';\n }\n const { isRedacted, piiValue, emptyText } = config;\n const piiValueString = piiValue(row);\n\n if (piiValueString == null || piiValueString.length === 0) {\n return (\n <>\n <EmptyCellText>{emptyText}</EmptyCellText>\n {config.subComponent?.(row)}\n </>\n );\n }\n\n return (\n <>\n <Pii isRedacted={isRedacted(row)}>{piiValueString}</Pii>\n {config.subComponent?.(row)}\n </>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Lightweight image renderer (no Redux / modal / forensics deps)\n// ---------------------------------------------------------------------------\n\nexport const renderAsLightweightImage = (\n value: unknown,\n config?: DataTableColumnImageFormat['config'],\n strings: Pick<CommonStrings, 'noImage'> = DEFAULT_COMMON_STRINGS,\n): ReactNode => {\n const isEmpty = value == null || value === '' || (Array.isArray(value) && value.length === 0);\n\n if (isEmpty) {\n return config?.fallback ? (\n <>{config.fallback}</>\n ) : (\n <EmptyImageContainer\n $width={config?.width}\n $height={config?.height}\n aria-label={config?.alt ?? 'image'}\n >\n <ImageIcon size={24} aria-label={strings.noImage} />\n </EmptyImageContainer>\n );\n }\n\n const src = typeof value === 'string' ? value : '';\n return (\n <LightweightImg\n src={src}\n alt={config?.alt ?? 'image'}\n width={config?.width ?? '200px'}\n height={config?.height ?? '144px'}\n $fit={config?.fit}\n />\n );\n};\n\n/**\n * Default PDS cell renderer. Handles all generic format types built into the design system.\n * Hosts should supply their own `renderFormat` prop to DataTable for format types that require\n * application-specific components (e.g. tags, files, PII masking, status indicators).\n */\nexport const renderAsPDSFormat = <TData = unknown>(\n value: unknown,\n format?: DataTableColumnFormat<TData>,\n row?: TData,\n options: PDSFormatOptions = {},\n): string | ReactNode => {\n switch (format?.type) {\n case 'date':\n return renderAsDate(value, format.config, options.locale);\n case 'datetime':\n return renderAsDatetime(value, format.config, options.locale);\n case 'sticker':\n return renderAsSticker(value, format.config);\n case 'url':\n return renderAsURL(value);\n case 'number':\n return renderAsNumber(value);\n case 'image':\n return renderAsLightweightImage(value, format.config, options.strings);\n case 'checkbox':\n // Checkbox columns are handled specially by the DataTable; this path is unreachable.\n return '';\n case 'id':\n return renderAsCopyableString(value, {\n copyable: true,\n mono: true,\n ...(format as DataTableColumnIDFormat).config,\n });\n case 'pii':\n return renderAsPii<TData>(row, (format as DataTableColumnPiiFormat<TData>).config);\n default:\n return renderAsCopyableString(\n value,\n (format as DataTableColumnStringFormat | undefined)?.config,\n );\n }\n};\n","import { kebabCase } from 'lodash-es';\nimport styled from 'styled-components';\n\nimport { Color } from '@persona/design-tokens';\nimport { PlusIcon } from '@persona/icons/12px';\n\nimport { TableCell, TableRow } from '#src/components/Table';\nimport { isFocused } from '#src/lib/pseudoClass';\nimport { semanticColor } from '#src/lib/semanticColor';\nimport { Z_INDICES } from '#src/lib/zindex';\nimport { TransitionDuration } from '#src/variables/transitions';\n\nconst InserterTableCell = styled(TableCell)<{ $nestSpacing: number }>`\n padding: 0 !important;\n ${({ $nestSpacing }) => ($nestSpacing ? `padding-left: ${$nestSpacing}px !important` : '')};\n height: 0;\n position: relative;\n border: 0;\n z-index: ${Z_INDICES.withShadow};\n`;\n\nconst AddRowLine = styled.div<{ $nestSpacing: number }>`\n position: absolute;\n top: -1px;\n background-color: ${({ theme }) => semanticColor(theme, 'BorderAccent', theme.color.primary.brand)};\n width: ${({ $nestSpacing }) => ($nestSpacing ? `calc(100% - ${$nestSpacing}px)` : '100%')};\n transition-duration: ${TransitionDuration.Fast};\n transition-property: opacity;\n transition-timing-function: ease-in;\n`;\n\nconst StyledPlusButton = styled.button`\n position: absolute;\n top: -7px;\n left: calc(50% - 8px);\n border-radius: 50%;\n height: 14px;\n width: 14px;\n background-color: ${({ theme }) => semanticColor(theme, 'ActionPrimary', theme.color.primary.brand)};\n color: ${({ theme }) => semanticColor(theme, 'FgInverse', Color.BackgroundButtonInverse)};\n cursor: pointer;\n z-index: ${Z_INDICES.withShadow};\n // TODO: Add a focus style\n\n opacity: 0;\n\n &:hover {\n opacity: 1;\n }\n\n &:hover ~ ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n`;\n\nconst StyledTableRow = styled(TableRow)`\n &${isFocused} {\n box-shadow: none;\n }\n cursor: pointer;\n &:hover > ${AddRowLine}, &:focus > ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n\n &:hover > ${StyledPlusButton}, &:focus > ${StyledPlusButton} {\n opacity: 1;\n }\n`;\n\nconst HoverArea = styled.div<{ $nestSpacing: number }>`\n position: absolute;\n height: 12px;\n top: -6px;\n width: ${({ $nestSpacing }) => ($nestSpacing ? `calc(100% - ${$nestSpacing}px)` : '100%')};\n z-index: ${Z_INDICES.withShadow};\n &:hover ~ ${AddRowLine} {\n opacity: 1;\n height: 2px;\n }\n\n &:hover ~ ${StyledPlusButton} {\n opacity: 1;\n }\n`;\n\nconst StyledPlusIcon = styled(PlusIcon)`\n position: absolute;\n top: 1px;\n left: 1px;\n`;\n\ninterface InserterProps {\n priorRowLabel: string;\n colSpan: number;\n nestSpacing?: number;\n label?: string;\n onAddRow: () => void;\n}\n\nexport const Inserter: React.FC<InserterProps> = ({\n priorRowLabel,\n colSpan,\n nestSpacing = 0,\n label,\n onAddRow,\n}) => {\n return (\n <StyledTableRow\n onKeyDown={(evt) => {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n evt.stopPropagation();\n onAddRow();\n }\n }}\n tabIndex={0}\n >\n <InserterTableCell colSpan={colSpan} $nestSpacing={nestSpacing}>\n <HoverArea\n $nestSpacing={nestSpacing}\n role='presentation'\n aria-label={label || `Insert a row after ${priorRowLabel}`}\n onClick={onAddRow}\n />\n <StyledPlusButton\n id={`${kebabCase(priorRowLabel)}-inserter`}\n aria-label={label || `Insert a row after ${priorRowLabel}`}\n onClick={onAddRow}\n type='button'\n >\n <StyledPlusIcon color='currentColor' />\n </StyledPlusButton>\n <AddRowLine $nestSpacing={nestSpacing} onClick={onAddRow} />\n </InserterTableCell>\n </StyledTableRow>\n );\n};\n","import {\n type CellContext,\n type ColumnDef,\n createColumnHelper,\n type Row,\n type RowData,\n type Table,\n} from '@tanstack/react-table';\nimport { startCase } from 'lodash-es';\nimport { useCallback, useMemo, useRef } from 'react';\nimport styled from 'styled-components';\n\nimport { ChevronDownIcon, ChevronRightIcon, MoreIcon } from '@persona/icons';\n\nimport Button from '#src/components/Button';\nimport { getColumnWidths } from '#src/components/DataTable';\nimport type { HeadlessFilterConfig, RowAction, SortProps } from '#src/components/DataTable/types';\nimport DropdownMenu from '#src/components/DropdownMenu';\nimport { usePDSStrings } from '#src/lib/i18n';\nimport { semanticColor } from '#src/lib/semanticColor';\n\nimport { renderAsCheckbox, renderAsCheckboxHeader } from './helpers';\nimport type { DataTableColumnFormat, DataTableColumns } from './types';\n\nconst ExpandButton = styled.button`\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n`;\n\nconst ExpandColumnPlaceholder = styled.span`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n`;\n\n/**\n * Host-injected cell format renderer. Dashboard passes its own implementation\n * that handles all format types including tags, files, and status indicators.\n */\nexport type RenderFormatFn<TData = unknown, TFormat extends { type: string } = { type: string }> = (\n value: unknown,\n format?: TFormat,\n row?: TData,\n) => React.ReactNode;\n\nexport interface UseTableColumnsParams<\n TData extends RowData,\n TFormat extends { type: string } = DataTableColumnFormat<TData>,\n TFilter = unknown,\n> {\n columns: DataTableColumns<TData, TFormat, TFilter>;\n data: TData[];\n compact?: boolean;\n sort?: boolean | SortProps;\n clientSearch?: boolean | { placeholder?: string; initialValue?: string };\n clientFiltering?: boolean;\n expandColumnVisibility?: 'auto' | 'always';\n showControls?: boolean;\n enableRowSelection?: boolean;\n enableSubRowSelection?: boolean;\n rowActions?: RowAction[] | ((row: TData) => RowAction[]);\n getRowId?: (row: TData) => string;\n expandedRows: Set<string>;\n toggleRowExpansion: (rowId: string) => void;\n canRowExpand: (rowData: TData) => boolean;\n checkboxColumnStates: Record<string, Set<string>>;\n handleCheckboxCellChange: (columnId: string, rowId: string, checked: boolean) => void;\n handleSelectAllCheckboxCell: (columnId: string, checked: boolean) => void;\n getSelfAndNestedRowIds: (row: TData, indexPath: number[]) => string[];\n handleRowSelectionWithShift: (\n clickedRow: Row<TData>,\n table: Table<TData>,\n checked: boolean,\n isShiftKey: boolean,\n ) => void;\n renderFormat: RenderFormatFn<TData, TFormat>;\n}\n\nexport function useTableColumns<\n TData extends RowData,\n TFormat extends { type: string } = DataTableColumnFormat<TData>,\n TFilter = unknown,\n>({\n columns,\n data,\n compact,\n sort,\n clientSearch,\n clientFiltering,\n expandColumnVisibility = 'auto',\n showControls,\n enableRowSelection = false,\n enableSubRowSelection = true,\n rowActions,\n getRowId,\n expandedRows,\n toggleRowExpansion,\n canRowExpand,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n getSelfAndNestedRowIds,\n handleRowSelectionWithShift,\n renderFormat,\n}: UseTableColumnsParams<TData, TFormat, TFilter>): [\n ColumnDef<TData, any>[],\n { key: string; label: string }[],\n] {\n const { EXPAND_COLUMN_WIDTH, SELECT_COLUMN_WIDTH, ACTION_COLUMN_WIDTH } =\n getColumnWidths(compact);\n const strings = usePDSStrings();\n const stringsRef = useRef(strings);\n stringsRef.current = strings;\n\n // Stable renderer identity: an inline `cell` gets a new identity on each column\n // rebuild, which flexRender treats as a new component type and remounts —\n // closing any open row-actions menu. Read live `rowActions` from a ref instead.\n const rowActionsRef = useRef(rowActions);\n rowActionsRef.current = rowActions;\n const renderActionCell = useCallback((props: CellContext<TData, unknown>) => {\n const currentRowActions = rowActionsRef.current;\n const actions =\n typeof currentRowActions === 'function'\n ? currentRowActions(props.row.original)\n : currentRowActions;\n\n if (!actions || actions.length === 0) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <Button\n id={`data-table__row-actions-button--${props.row.id}`}\n variant='text'\n width='icon'\n size='sm'\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n aria-label={stringsRef.current.viewRowActions(props.row.index + 1)}\n >\n <MoreIcon />\n </Button>\n }\n portal\n >\n {actions.map(({ label, onClick, ...menuItemProps }, i) => (\n <DropdownMenu.Item\n key={label.toLowerCase().replace(/ /g, '-')}\n id={`data-table__row-actions--${props.row.id}-${i}`}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick(props.row.id);\n }}\n {...menuItemProps}\n >\n {label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu>\n );\n }, []);\n const hasRowActions = rowActions != null;\n\n return useMemo(() => {\n const columnHelper = createColumnHelper<TData>();\n\n const tableColumns: ColumnDef<TData, any>[] = columns.map((column) => {\n if (typeof column === 'object') {\n const columnHelperOptions: Parameters<typeof columnHelper.accessor>[1] = {\n header: column.header,\n id: column.id || column.accessor,\n // Treats undefined and null as the lowest values for sorting\n sortUndefined: -1,\n meta: {\n align: column.align,\n format: column.format,\n minWidth: column.minWidth,\n width: column.width,\n headerTooltip: column.headerTooltip,\n },\n minSize: column.minWidth,\n };\n\n if (column.renderCell != null) {\n const renderCell = column.renderCell;\n columnHelperOptions.cell = (props) =>\n renderCell({ cellValue: props.getValue(), row: props.row.original });\n // A custom cell renderer controls display only — it does not affect sorting.\n // Honor the column's explicit `enableSorting` opt-in (defaults to off) so\n // server-sortable columns that need custom rendering still expose a sort control.\n columnHelperOptions.enableSorting = sort != null && (column.enableSorting ?? false);\n } else if (column.format?.type === 'checkbox') {\n // Handle checkbox column format\n const columnId = column.id || column.accessor;\n\n // Custom header with select all checkbox\n columnHelperOptions.header = (headerProps) => {\n const columnState = checkboxColumnStates[columnId] || new Set();\n // Select all rows for this column\n const allRowIds = data.flatMap((row, index) => getSelfAndNestedRowIds(row, [index]));\n const isChecked = allRowIds.length > 0 && allRowIds.every((id) => columnState.has(id));\n const isIndeterminate = !isChecked && allRowIds.some((id) => columnState.has(id));\n\n // If column.header is a function, call it with TanStack context props\n if (typeof column.header === 'function') {\n return column.header(headerProps);\n }\n\n return renderAsCheckboxHeader({\n header: column.header,\n isChecked,\n isIndeterminate,\n onValueChange: (checked) => handleSelectAllCheckboxCell(columnId, checked),\n strings,\n });\n };\n\n // Custom cell with individual checkbox\n columnHelperOptions.cell = (props) => {\n const rowId = getRowId ? getRowId(props.row.original) : props.row.id;\n const columnState = checkboxColumnStates[columnId] || new Set();\n const isChecked = columnState.has(rowId);\n\n return renderAsCheckbox({\n rowId,\n isChecked,\n onValueChange: (rowId, checked) => handleCheckboxCellChange(columnId, rowId, checked),\n columnHeader: typeof column.header === 'string' ? column.header : undefined,\n strings,\n });\n };\n\n // Disable sorting for checkbox columns\n columnHelperOptions.enableSorting = false;\n } else {\n // Ensure value is rendered as a string regardless of column value\n columnHelperOptions.cell = (props) =>\n renderFormat(props?.getValue(), column.format, props.row.original);\n // Only enable column sorting if table-level sorting is enabled and column allows it\n columnHelperOptions.enableSorting = sort != null && column.enableSorting;\n }\n\n // Enable global filtering based on clientSearch and column searchable property\n columnHelperOptions.enableGlobalFilter = clientSearch && (column.searchable ?? true);\n // Enable column pinning based on column configuration\n columnHelperOptions.enablePinning = column.pinned ?? false;\n\n // Configure column filtering\n if (clientFiltering && column.filter) {\n const filterConfig = column.filter as Partial<HeadlessFilterConfig>;\n if (filterConfig.enabled !== false) {\n columnHelperOptions.enableColumnFilter = true;\n if (filterConfig.filterFn) {\n columnHelperOptions.filterFn = filterConfig.filterFn;\n }\n }\n }\n\n return columnHelper.accessor(column.accessor, columnHelperOptions);\n }\n\n return columnHelper.accessor(column, {\n header: startCase(column),\n enableGlobalFilter: Boolean(clientSearch),\n enableSorting: sort != null,\n });\n });\n\n if (showControls && enableRowSelection) {\n tableColumns.unshift(\n columnHelper.display({\n id: 'select-col',\n enablePinning: true,\n enableResizing: false,\n size: SELECT_COLUMN_WIDTH,\n meta: {\n width: SELECT_COLUMN_WIDTH,\n },\n header: ({ table }) =>\n renderAsCheckboxHeader({\n isChecked: table.getIsAllRowsSelected(),\n // Show the dash whenever any row is selected (including all rows), since\n // clicking the header in that state deselects everything.\n isIndeterminate: table.getIsSomeRowsSelected() || table.getIsAllRowsSelected(),\n onChange: table.getToggleAllRowsSelectedHandler(),\n strings,\n }),\n cell: ({ row, table }) =>\n renderAsCheckbox({\n rowId: row.id,\n isChecked: row.getIsSelected(),\n onChange: (e) =>\n handleRowSelectionWithShift(\n row,\n table,\n e.target.checked,\n e.nativeEvent instanceof MouseEvent && e.nativeEvent.shiftKey,\n ),\n indeterminate: enableSubRowSelection && row.getIsSomeSelected(),\n disabled: !row.getCanSelect(),\n strings,\n }),\n }),\n );\n }\n\n // Add expansion column when any row can expand, or when forced visible for layout parity\n const showExpandColumn = expandColumnVisibility === 'always' || data.some(canRowExpand);\n if (showExpandColumn) {\n tableColumns.unshift(\n columnHelper.display({\n id: 'expand-col',\n enablePinning: true,\n enableResizing: false,\n size: EXPAND_COLUMN_WIDTH,\n meta: {\n width: EXPAND_COLUMN_WIDTH,\n },\n header: '',\n cell: ({ row }) => {\n const rowData = row.original;\n if (!canRowExpand(rowData)) {\n return <ExpandColumnPlaceholder aria-hidden />;\n }\n\n const rowId = getRowId ? getRowId(rowData) : row.id;\n const isExpanded = expandedRows.has(rowId);\n\n return (\n <ExpandColumnPlaceholder>\n <ExpandButton\n type='button'\n id={`datatable-expand-${rowId}`}\n onClick={(e) => {\n e.stopPropagation();\n toggleRowExpansion(rowId);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n toggleRowExpansion(rowId);\n }\n }}\n aria-label={\n isExpanded ? `Hide details for row ${rowId}` : `View details for row ${rowId}`\n }\n aria-expanded={isExpanded}\n >\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </ExpandButton>\n </ExpandColumnPlaceholder>\n );\n },\n }),\n );\n }\n\n if (hasRowActions) {\n const emptyHeader = () => <></>;\n tableColumns.push(\n columnHelper.display({\n id: 'action-col',\n enableResizing: false,\n size: ACTION_COLUMN_WIDTH,\n meta: {\n width: ACTION_COLUMN_WIDTH,\n },\n header: emptyHeader,\n cell: renderActionCell,\n }),\n );\n }\n\n const columnOptions = columns.map((column) => {\n const key = typeof column === 'object' ? column.id || column.accessor : column;\n const label =\n typeof column === 'object'\n ? typeof column.header === 'string'\n ? column.header\n : key\n : startCase(column);\n\n return {\n key,\n label,\n };\n });\n\n return [tableColumns, columnOptions];\n }, [\n columns,\n enableRowSelection,\n hasRowActions,\n renderActionCell,\n showControls,\n sort,\n clientSearch,\n clientFiltering,\n data,\n canRowExpand,\n expandColumnVisibility,\n expandedRows,\n toggleRowExpansion,\n getRowId,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n handleRowSelectionWithShift,\n renderFormat,\n strings,\n ]);\n}\n","import {\n type Column,\n type ColumnFiltersState,\n type ColumnPinningState,\n type ExpandedState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getMemoOptions,\n getPaginationRowModel,\n getSortedRowModel,\n memo as tanstackMemo,\n type Row,\n type RowData,\n type RowModel,\n type RowSelectionState,\n type Table,\n type TableOptions,\n useReactTable,\n} from '@tanstack/react-table';\nimport {\n type ComponentProps,\n type Dispatch,\n type MouseEvent,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Spacing } from '@persona/design-tokens';\n\nimport Pagination, { MIN_PAGE_SIZE } from '#src/components/Pagination';\nimport {\n StickyTD,\n StickyTH,\n TableActionTD,\n TableLayout,\n TableTD,\n TableTH,\n TableTR,\n} from '#src/components/Table';\nimport { Paragraph } from '#src/components/Text';\nimport { TextUnderlineTooltip } from '#src/components/Tooltip';\nimport { usePDSLocale, usePDSStrings } from '#src/lib/i18n';\nimport { RouterLink } from '#src/lib/router';\nimport { Z_INDICES } from '#src/lib/zindex';\nimport { focusOutline } from '#src/mixins/focus';\nimport { semanticScrollbar } from '#src/mixins/scrollbar';\n\nimport { generateClientFilters, getFilterFnName } from './clientFilterUtils';\nimport { getColumnWidths } from './constants';\nimport FloatingActionBar from './FloatingActionBar';\nimport { renderAsPDSFormat } from './helpers';\nimport { Inserter } from './Inserter';\nimport TableControls, {\n isEmptyState,\n isFilterActive,\n TableViewConfigurationDropdown,\n type TableControlsProps,\n} from './TableControls';\nimport type { AttributeColumn, BaseFilterConfig, FilterConfig } from './TableControls/types';\nimport type {\n BulkAction,\n ColumnConfig,\n DataTableColumnFormat,\n DataTableColumns,\n RowAction,\n RowDataWithDetails,\n RowDataWithSubrows,\n RowDataWithSubrowsToAlwaysShowIds,\n RowDataWithTourTarget,\n SortProps,\n} from './types';\nimport { useTableColumns, type RenderFormatFn } from './useTableColumns';\n\n// https://tanstack.com/table/v8/docs/api/core/column-def#meta\ndeclare module '@tanstack/react-table' {\n // oxlint-disable-next-line no-unused-vars -- required for declaration merging\n interface ColumnMeta<TData extends RowData, TValue> {\n align?: 'left' | 'right';\n format?: { type: string };\n minWidth?: number;\n width?: number;\n headerTooltip?: React.ReactNode;\n }\n}\n\nconst forwardedRowLinkClicks = new WeakSet<Event>();\n\nconst TableEmptyState = styled.td`\n vertical-align: middle;\n text-align: center;\n width: 100%;\n height: 176px;\n`;\n\nconst StyledTableLayout = styled(TableLayout)<{ $onAddRow: boolean }>`\n ${({ $onAddRow }) =>\n $onAddRow &&\n css`\n padding-bottom: ${Spacing[3]};\n `}\n`;\n\nconst TableContainer = styled.div<{ $stickyHeader: boolean }>`\n position: relative;\n ${semanticScrollbar}\n\n ${({ $stickyHeader }) =>\n $stickyHeader &&\n css`\n flex-grow: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `}\n`;\n\nconst RowLink = styled(RouterLink)`\n /* Match surrounding cell text. The row is still a link; only URL cells use accent. */\n color: inherit;\n text-decoration: none;\n ${focusOutline}\n\n &:link,\n &:visited,\n &:hover,\n &:active {\n color: inherit;\n }\n`;\n\nconst StyledDataTableControls = styled(TableControls)``;\nexport const DataTableControls = StyledDataTableControls as typeof StyledDataTableControls &\n typeof TableControls;\n\nexport const DataTableContainer = styled.div<{ $stickyHeader: boolean }>`\n ${({ $stickyHeader }) =>\n $stickyHeader &&\n css`\n display: flex;\n flex-direction: column;\n height: 100%;\n `}\n`;\n\nconst StyledTableActionTD = styled(TableActionTD)<{ $nestSpacing?: number }>`\n ${({ $nestSpacing }) => css`\n ${\n $nestSpacing &&\n css`\n position: relative;\n left: ${$nestSpacing}px;\n `\n }\n `}\n`;\n\nconst StyledTableTD = styled(TableTD)<{ $nestSpacing?: number; $isFeatureCol?: boolean }>`\n // Move the cell to the right by the amount of the nest spacing, and\n // add same amount of padding to the right to not overlap with the next cell\n ${({ $nestSpacing, $isFeatureCol }) => css`\n ${\n $nestSpacing &&\n css`\n position: relative;\n left: ${$nestSpacing}px;\n `\n }\n ${\n !$isFeatureCol &&\n css`\n padding-right: ${$nestSpacing}px;\n `\n }\n `}\n`;\n\nconst DetailsTD = styled(TableTD)`\n padding: 0;\n border-top: none;\n border-left: none;\n border-right: none;\n`;\n\nconst StickyDetailsTD = styled(StickyTD)`\n padding: 0;\n border-top: none;\n border-left: none;\n border-right: none;\n`;\n\nconst StickyTDWithGapCoverage = styled(StickyTD)<{ $gapCoverage?: number }>`\n ${({ $gapCoverage }) =>\n $gapCoverage &&\n css`\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: ${-$gapCoverage}px;\n width: ${$gapCoverage}px;\n height: calc(100% + 1px); // +1px to cover the bottom border\n background: inherit;\n }\n `}\n`;\n\nexport const FloatingActionBarContainer = styled.div`\n position: absolute;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n`;\n\nconst isServerPagination = (\n pagination: DataTableProps<unknown>['pagination'],\n): pagination is ComponentProps<typeof Pagination> => {\n return typeof pagination === 'object' && !('clientPagination' in pagination);\n};\n\nconst isClientPagination = (\n pagination: DataTableProps<unknown>['pagination'],\n): pagination is ClientPaginationProps => {\n return typeof pagination === 'object' && 'clientPagination' in pagination;\n};\n\nconst isServerSorting = (sort: boolean | SortProps | undefined): sort is SortProps => {\n return typeof sort === 'object';\n};\n\nconst isRowWithDetails = <TData extends RowData>(row: TData): row is RowDataWithDetails<TData> => {\n return row != null && typeof row === 'object' && '_details' in row && row._details != null;\n};\n\nconst isRowWithSubrows = <TData extends RowData>(row: TData): row is RowDataWithSubrows<TData> => {\n return row != null && typeof row === 'object' && 'subrows' in row && row.subrows != null;\n};\n\nconst isRowWithSubrowsToAlwaysShowIds = <TData extends RowData>(\n row: TData,\n): row is RowDataWithSubrowsToAlwaysShowIds<TData> => {\n return (\n row != null &&\n typeof row === 'object' &&\n 'subrowsToAlwaysShowIds' in row &&\n row.subrowsToAlwaysShowIds != null\n );\n};\n\nconst isRowWithTourTarget = <TData extends RowData>(\n row: TData,\n): row is RowDataWithTourTarget<TData> => {\n return (\n row != null &&\n typeof row === 'object' &&\n 'dataTourTarget' in row &&\n typeof row.dataTourTarget === 'string'\n );\n};\n\ntype ClientPaginationProps = {\n clientPagination: true;\n pageSize?: number;\n pageSizeOptions?: number[];\n};\nexport interface DataTableProps<\n TData extends RowData,\n TFilter extends BaseFilterConfig = FilterConfig,\n> {\n /**\n * Data to render.\n * If a row has a _details property that is a function, it will be called\n * with the row data as props.\n * If a row has a _details property that is a React node, it will be rendered as is.\n */\n data: TData[];\n\n /**\n * Columns to display in the table. May be a string or column config object.\n *\n * Strings get converted from camelCase to Start Case.\n */\n columns: DataTableColumns<TData, DataTableColumnFormat<TData>>;\n\n /**\n * Component to render details for expandable rows.\n * Useful if we want to render the same details component for every row.\n * Receives rowData as props.\n */\n detailComponent?: React.ComponentType<{ rowData: TData }>;\n\n /**\n * When `'always'`, the leading expand column is shown even if no rows are expandable.\n * When `'auto'`, the column is omitted unless at least one row can expand. Rows that\n * cannot expand keep an empty spacer in this column so labels stay aligned.\n */\n expandColumnVisibility?: 'auto' | 'always';\n\n /**\n * Whether to display table controls such as search, filters, views, and selection\n */\n showControls?: boolean;\n\n /**\n * Props to pass to the TableControls component\n */\n controls?: TableControlsProps<TFilter>;\n\n /**\n * Custom text to display when the table is empty. Will default to \"No results found\"\n */\n emptyState?: {\n title?: string;\n description?: string;\n };\n\n /**\n * Whether to display pagination controls. If true, will use client-side pagination. If an object,\n * can be either advanced configuration of cleitn paginaton or server-side pagination state..\n */\n pagination?: boolean | ClientPaginationProps | ComponentProps<typeof Pagination>;\n\n /**\n * Whether to display sort controls. If true, will use client-side sorting. If an object, will use server-side sorting.\n */\n sort?: boolean | SortProps;\n\n /**\n * Whether to display the column properties button and popover. Allows control of column visiblity and ordering.\n */\n showColumnProperties?: boolean;\n\n /**\n * Whether to enable sorting removal. If true, will allow sorting to be removed by clicking the sort control.\n */\n enableSortingRemoval?: boolean;\n\n /**\n * Set to true to sort descending first, which is the case for most of our tables.\n */\n sortDescFirst?: boolean;\n\n /**\n * Called when column visibility or ordering is updated. Useful for saving column properties.\n */\n onUpdateColumnProperties?: (newConfiguration: AttributeColumn[]) => void;\n\n /**\n * Whether the table is loading data\n */\n isLoading?: boolean;\n\n /**\n * Whether to enable row selection\n */\n enableRowSelection?: boolean;\n\n /**\n * Whether to enable automatic sub row selection when a parent row is selected\n */\n enableSubRowSelection?: boolean;\n\n /**\n * Define the row id for the given row. Used by row selection and bulk actions.\n */\n getRowId?: (row: TData) => string;\n\n /**\n * Define the aria label for the given row.\n */\n getRowLabel?: (row: TData) => string;\n\n /**\n * Determine if a row can be selected. Used to disable row selection for specific rows.\n */\n getRowSelectable?: (row: TData) => boolean;\n\n /**\n * Makes the row link cell an anchor if provided. Get link for the given row.\n */\n getLinkToRow?: (row: TData) => string;\n\n /**\n * If set, each row will be a link to the given prefix + the row's `id` value.\n * `getLinkToRow` will override this.\n */\n rowLinkPrefix?: string;\n\n /**\n * Column id whose cell contains the row link when `getLinkToRow`/`rowLinkPrefix` is set.\n * Defaults to the first visible non-feature column (not select/expand/action). URL-formatted\n * columns are skipped.\n */\n rowLinkColumnId?: string;\n\n /**\n * Component to use for row links. Defaults to the PDS router-aware link.\n * Pass a custom component (e.g. Next.js Link) to use a different router.\n * The component renders as an inline anchor inside the link cell and receives `to`,\n * `className`, and `children`.\n */\n rowLinkComponent?: React.ElementType;\n\n /**\n * Whether to show the compact variant of the table.\n * Compact tables do not support views.\n */\n compact?: boolean;\n\n /**\n * Disables the row hover highlight. Use for read-only, non-interactive tables where the\n * hover background would misleadingly imply rows are selectable or clickable.\n */\n disableRowHover?: boolean;\n\n /**\n * Title to display in the table.\n */\n title?: string;\n\n /**\n * Whether to make the table header sticky when scrolling vertically.\n * When enabled, the controls and table header will remain visible at the top of the viewport while scrolling through table data.\n * Note that the sticky header styling assumes this component is contained within a parent with `display: flex` and `flex-direction: column`.\n */\n stickyHeader?: boolean;\n\n /**\n * Enable client-side search functionality.\n * Pass an object to configure the search input.\n */\n clientSearch?:\n | boolean\n | {\n placeholder?: string;\n initialValue?: string;\n };\n\n /**\n * Controlled search term for client-side search.\n * When provided, the search input becomes controlled.\n * Use with onSearchTermChange to manage search state externally.\n */\n searchTerm?: string;\n\n /**\n * Called when the search term changes (for controlled search).\n * Only used when searchTerm prop is provided.\n */\n onSearchTermChange?: (searchTerm: string) => void;\n\n /**\n * Whether to use manual filtering. If true, will not use the global filter function 'includesString'.\n */\n manualFiltering?: boolean;\n\n /**\n * Controlled expanded row IDs.\n * When provided, row expansion becomes controlled.\n * Use with onExpandedRowsChange to manage expansion state externally.\n */\n expandedRowIds?: Set<string>;\n\n /**\n * Called when expanded rows change (for controlled expansion).\n * Only used when expandedRowIds prop is provided.\n */\n onExpandedRowsChange?: (expandedRowIds: Set<string>) => void;\n\n /**\n * Enable client-side filtering functionality.\n * Users must explicitly define filter types for columns in TableControls.\n * Generated controls are legacy-only; `controls.filtersV2` does not drive client filtering.\n */\n clientFiltering?: boolean;\n\n /**\n * @internal Not part of the public API surface.\n * Used exclusively by the DashboardDataTable wrapper to share TanStack column-filter\n * state with the dashboard's generateClientFilters adapter.\n * Pass only via the wrapper's any-cast spread — do not use directly.\n * @deprecated Prefer `column.filter` for defining client-side filters.\n */\n columnFilters?: ColumnFiltersState;\n\n /**\n * When true, the empty-state message will read \"No results found. Try changing your filters.\"\n * even when the DataTable's own filter state is empty.\n * Use this when the host manages active server-side filters outside the DataTable\n * (e.g. via an injected filterPanel) so the conditional empty state still reflects those filters.\n */\n hasExternalActiveFilters?: boolean;\n\n /**\n * Called when the column-level filter state changes.\n * Use this to drive an injected filter-panel UI from outside the DataTable,\n * e.g. to feed `generateClientFilters` with the current TanStack filter state.\n */\n onColumnFiltersChange?: (filters: ColumnFiltersState) => void;\n\n /**\n * Host-provided cell format renderer.\n * The PDS built-in handles string, number, date, datetime, url, sticker, image, id, and pii.\n * Pass a custom renderer to handle additional application-specific formats (e.g. tags, files,\n * status indicators) or to override PDS defaults.\n */\n renderFormat?: RenderFormatFn<TData, DataTableColumnFormat<TData>>;\n\n /**\n * Actions to display in each table row.\n * Can be a static array (same actions for all rows) or a function that\n * receives the row data and returns actions specific to that row.\n */\n rowActions?: RowAction[] | ((row: TData) => RowAction[]);\n\n /**\n * Bulk actions to display when there are selected rows.\n * For standard variant, actions will be shown in the table controls.\n * For compact variant, actions will be shown in a floating action bar.\n * If bulkActions are provided in `controls.bulkActions`, they will override the bulkActions prop.\n */\n bulkActions?: BulkAction[];\n\n /**\n * Function that returns available bulk actions based on selected rows.\n * This allows dynamic bulk actions that change based on the selection.\n * Takes precedence over static bulkActions prop.\n */\n getAvailableBulkActions?: (selectedRows: TData[]) => BulkAction[];\n\n /**\n * Callback fired when the set of selected rows changes.\n * Receives the currently selected row data objects.\n */\n onRowSelectionChange?: (selectedRows: TData[]) => void;\n\n /**\n * If present, will display a thin row between rows as UI affordance to add a new row.\n * The row will be added after the row identified by the provided rowId, and the addAsChild flag will\n * indicate if the added row will be a sibling or a child of the referenced row\n * Adding said row will be handled by this `onAddRow` callback.\n */\n onAddRow?: (rowId: string, addAsChild: boolean) => void;\n\n /**\n * Called to determine if a row can be added after the provided row.\n * If not provided, assume true.\n * If this resolves to false, we will hide the inserter row.\n */\n canAddAfterRow?: (row: TData, addAsChild: boolean) => boolean;\n\n /**\n * Called when a row is clicked. If provided, rows will have cursor pointer\n * and clicking a row will call this function with the row id.\n * When omitted, rows that can expand (via `_details` or `detailComponent`) toggle expand/collapse on row click.\n */\n onRowClick?: (rowId: string) => void;\n\n /**\n * The active row id. If provided, the row will be in an active state.\n */\n activeRowId?: string;\n\n /**\n * Called with the ordered ids of the rows currently displayed, reflecting\n * client-side search, filtering, and sorting. Lets a parent step through the\n * on-screen order (e.g. prev/next navigation in a detail panel).\n */\n onDisplayedRowIdsChange?: (rowIds: string[]) => void;\n\n /**\n * Custom left offset in pixels to add to all pinned columns.\n * Useful when the table is nested inside containers that need additional spacing.\n */\n pinnedColumnLeftOffset?: number;\n\n /**\n * When false, the table does not scroll horizontally on its own and an ancestor is expected\n * to. Set this when a host scrolls the table and positions its header or pinned columns\n * against that ancestor, so those offsets are not trapped in the table's own scrollport.\n * Combining this with `stickyHeader` is contradictory: `stickyHeader` gives the table an\n * inner scrollport of its own, which is the thing this prop gives up.\n */\n scrollsHorizontally?: boolean;\n\n /**\n * Custom content to render inside the floating action bar, between the\n * selection count and the action buttons. Only rendered when the floating\n * action bar is visible (compact mode with selected rows).\n */\n floatingBarContent?: React.ReactNode;\n}\n\n// Unit-separator control char; joins row ids into a change-detection key that\n// can't collide with characters found in real row ids.\nconst DISPLAYED_ROW_IDS_SEPARATOR = '\\u001f';\n\n/**\n * The DataTable component is the core of Persona's table experiences.\n *\n * This component implements `@tanstack/react-table` and exposes a simplified, easy to use API.\n *\n * Planned functionality\n * - Column visibility, reordering\n * - Row selection\n * - Cell types (e.g. links, buttons, Stickers)\n *\n * Client-side support\n * - ✅ Sorting\n * - ✅ Search (enable with clientSearch prop)\n * - ✅ Pagination\n * - ✅ Filtering (requires explicit filter configuration in TableControls)\n *\n * Server-side support\n * - ✅ Sorting\n * - ✅ Filtering\n * - ✅ Pagination\n *\n * @example\n * // Basic usage with client-side search\n * <DataTable\n * data={data}\n * columns={columns}\n * showControls={true}\n * clientSearch={{ placeholder: \"Search accounts...\" }}\n * />\n *\n * @example\n * // Column-level search control\n * const columns = [\n * { accessor: 'id', header: 'ID', searchable: false },\n * { accessor: 'name', header: 'Name' }, // searchable by default\n * { accessor: 'email', header: 'Email' },\n * ];\n */\n\nexport const DataTable = <TData extends RowData, TFilter extends BaseFilterConfig = FilterConfig>({\n data,\n columns,\n detailComponent,\n expandColumnVisibility = 'auto',\n showControls,\n controls,\n emptyState,\n isLoading,\n pagination,\n sort,\n sortDescFirst,\n enableSortingRemoval,\n showColumnProperties = false,\n onUpdateColumnProperties,\n enableRowSelection = false,\n enableSubRowSelection = true,\n getRowId,\n getRowLabel,\n getRowSelectable,\n getLinkToRow,\n rowLinkPrefix,\n rowLinkColumnId,\n rowLinkComponent,\n compact,\n disableRowHover,\n title,\n clientSearch = false,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n manualFiltering,\n expandedRowIds: controlledExpandedRowIds,\n onExpandedRowsChange,\n clientFiltering = false,\n columnFilters: controlledColumnFilters,\n hasExternalActiveFilters = false,\n onColumnFiltersChange,\n renderFormat,\n rowActions,\n bulkActions,\n getAvailableBulkActions,\n onRowSelectionChange,\n onAddRow,\n stickyHeader = false,\n canAddAfterRow,\n onRowClick,\n activeRowId,\n onDisplayedRowIdsChange,\n pinnedColumnLeftOffset = 0,\n scrollsHorizontally = true,\n floatingBarContent,\n}: DataTableProps<TData, TFilter>) => {\n const DEFAULT_SEARCH_PLACEHOLDER = 'Search...';\n const { NEST_SPACING, EXPAND_COLUMN_WIDTH } = getColumnWidths(compact);\n const [columnVisibility, setColumnVisibility] = useState(() => {\n const visibility: { [key: string]: boolean } = {};\n columns.forEach((column) => {\n const columnId = typeof column === 'object' ? (column.id ?? column.accessor) : column;\n visibility[columnId] = typeof column === 'object' ? (column.visibility ?? true) : true; // Set default visibility to true if no option is passed in\n });\n return visibility;\n });\n const [columnOrder, setColumnOrder] = useState<string[]>([]);\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n // Tracks the most recently clicked selection checkbox to support shift+click range selection.\n const lastSelectedRowIdRef = useRef<string | null>(null);\n\n // Search term: use controlled state if provided, otherwise use internal state\n const isSearchControlled = controlledSearchTerm != null;\n const [internalSearchTerm, setInternalSearchTerm] = useState<string>(\n typeof clientSearch === 'object' ? clientSearch.initialValue || '' : '',\n );\n const globalFilter = isSearchControlled ? controlledSearchTerm : internalSearchTerm;\n const setGlobalFilter = useCallback(\n (value: string) => {\n if (isSearchControlled) {\n onSearchTermChange?.(value);\n } else {\n setInternalSearchTerm(value);\n }\n },\n [isSearchControlled, onSearchTermChange],\n );\n\n const isColumnFiltersControlled = controlledColumnFilters != null;\n const [internalColumnFilters, setInternalColumnFilters] = useState<ColumnFiltersState>([]);\n const columnFilters = isColumnFiltersControlled ? controlledColumnFilters : internalColumnFilters;\n\n const setColumnFilters = useCallback<Dispatch<SetStateAction<ColumnFiltersState>>>(\n (updater) => {\n const next = typeof updater === 'function' ? updater(columnFilters) : updater;\n if (!isColumnFiltersControlled) {\n setInternalColumnFilters(next);\n }\n onColumnFiltersChange?.(next);\n },\n [columnFilters, isColumnFiltersControlled, onColumnFiltersChange],\n );\n\n // Expanded rows: use controlled state if provided, otherwise use internal state\n const isExpansionControlled = controlledExpandedRowIds != null;\n const [internalExpandedRows, setInternalExpandedRows] = useState<Set<string>>(new Set());\n const expandedRows = isExpansionControlled ? controlledExpandedRowIds : internalExpandedRows;\n const setExpandedRows = useCallback(\n (updater: (prev: Set<string>) => Set<string>) => {\n if (isExpansionControlled) {\n const newValue = updater(expandedRows);\n onExpandedRowsChange?.(newValue);\n } else {\n setInternalExpandedRows(updater);\n }\n },\n [expandedRows, isExpansionControlled, onExpandedRowsChange],\n );\n\n const [checkboxColumnStates, setCheckboxColumnStates] = useState<Record<string, Set<string>>>({});\n\n const orderMap = columnOrder.reduce<{ [key: string]: number }>((acc, columnId, index) => {\n acc[columnId] = index;\n return acc;\n }, {});\n\n /**\n * If basic client pagination is enabled, create a configuration object for client pagination.\n */\n if (pagination === true) {\n pagination = {\n clientPagination: true,\n pageSize: MIN_PAGE_SIZE,\n };\n }\n\n // Helper function to check if a row can be expanded\n const canRowExpand = useCallback(\n (rowData: TData): boolean => {\n if (isRowWithSubrows(rowData)) {\n return rowData.subrows.length > 0;\n }\n if (isRowWithDetails(rowData)) {\n return Boolean(rowData._details);\n }\n return detailComponent != null;\n },\n [detailComponent],\n );\n\n // Calculate initial column pinning state from column configuration\n const initialColumnPinning = useMemo((): ColumnPinningState => {\n const pinnedColumns: string[] = [];\n\n // Check if we have any pinned columns\n const hasPinnedColumns = columns.some((column) => typeof column === 'object' && column.pinned);\n\n if (hasPinnedColumns) {\n // Add special columns first (they should be leftmost)\n const showExpandColumn = expandColumnVisibility === 'always' || data.some(canRowExpand);\n if (showExpandColumn) {\n pinnedColumns.push('expand-col');\n }\n if (showControls && enableRowSelection) {\n pinnedColumns.push('select-col');\n }\n\n // Then add user-defined pinned columns\n columns.forEach((column) => {\n if (typeof column === 'object' && column.pinned) {\n pinnedColumns.push(column.accessor);\n }\n });\n }\n\n return {\n left: pinnedColumns,\n };\n }, [columns, data, canRowExpand, expandColumnVisibility, showControls, enableRowSelection]);\n\n // Helper function to toggle row expansion\n const toggleRowExpansion = useCallback(\n (rowId: string) => {\n setExpandedRows((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(rowId)) {\n newSet.delete(rowId);\n } else {\n newSet.add(rowId);\n }\n return newSet;\n });\n },\n [setExpandedRows],\n );\n\n // Helper function to call onUpdate for checkbox columns\n const dispatchCheckboxCellOnUpdate = useCallback(\n (columnId: string, columnState: Set<string>) => {\n const column = columns.find(\n (col) =>\n typeof col === 'object' && col.accessor === columnId && col.format?.type === 'checkbox',\n );\n if (column && typeof column === 'object' && column.format?.type === 'checkbox') {\n column.format.onUpdate(Array.from(columnState));\n }\n },\n [columns],\n );\n\n // Helper function to handle checkbox column state changes\n const handleCheckboxCellChange = useCallback(\n (columnId: string, rowId: string, checked: boolean) => {\n setCheckboxColumnStates((prev) => {\n const newStates = { ...prev };\n if (!newStates[columnId]) {\n newStates[columnId] = new Set();\n }\n\n const columnState = new Set(newStates[columnId]);\n if (checked) {\n columnState.add(rowId);\n } else {\n columnState.delete(rowId);\n }\n\n newStates[columnId] = columnState;\n dispatchCheckboxCellOnUpdate(columnId, columnState);\n return newStates;\n });\n },\n [dispatchCheckboxCellOnUpdate],\n );\n\n const getSelfAndNestedRowIds = useCallback(\n (row: TData, indexPath: number[]): string[] => {\n const rowId = getRowId ? getRowId(row) : indexPath.join('.');\n if (isRowWithSubrows(row)) {\n return [\n rowId,\n ...(row.subrows ?? [])\n .map((subrow, subrowIndex) =>\n getSelfAndNestedRowIds(subrow, [...indexPath, subrowIndex]),\n )\n .flat(),\n ];\n }\n return [rowId];\n },\n [getRowId],\n );\n\n // Helper function to handle \"select all\" checkbox for a column\n const handleSelectAllCheckboxCell = useCallback(\n (columnId: string, checked: boolean) => {\n setCheckboxColumnStates((prev) => {\n const newStates = { ...prev };\n let columnState: Set<string>;\n\n if (checked) {\n // Select all rows for this column\n const allRowIds = data.flatMap((row, index) => getSelfAndNestedRowIds(row, [index]));\n columnState = new Set(allRowIds);\n } else {\n // Deselect all rows for this column\n columnState = new Set();\n }\n\n newStates[columnId] = columnState;\n dispatchCheckboxCellOnUpdate(columnId, columnState);\n return newStates;\n });\n },\n [data, getRowId, dispatchCheckboxCellOnUpdate],\n );\n\n const tableOptions: Partial<TableOptions<TData>> = useMemo(() => {\n const options: Partial<TableOptions<TData>> = {};\n\n // Client-side pagination\n if (isClientPagination(pagination)) {\n options.getPaginationRowModel = getPaginationRowModel();\n options.initialState = {\n pagination: {\n pageSize: pagination.pageSize,\n },\n };\n } else if (isServerPagination(pagination)) {\n const currentPage = pagination.paginationParams?.['current-page'] || 1;\n const pageSize = pagination.pageSize || MIN_PAGE_SIZE;\n\n options.manualPagination = true;\n options.onPaginationChange = (updaterOrValue) => {\n const oldPageSize = pageSize;\n const oldPageIndex = currentPage - 1;\n\n if (typeof updaterOrValue === 'function') {\n const newPaginationState = updaterOrValue({\n pageSize,\n pageIndex: currentPage - 1,\n });\n\n if (newPaginationState.pageSize !== oldPageSize) {\n pagination.handlePageSizeClick(newPaginationState.pageSize);\n }\n\n if (newPaginationState.pageIndex !== oldPageIndex) {\n pagination.handlePageLinkClick(newPaginationState.pageIndex + 1);\n }\n }\n };\n options.state = {\n pagination: {\n pageSize,\n pageIndex: currentPage - 1,\n },\n };\n options.rowCount = pagination?.paginationParams?.['total-count'];\n // TanStack clamps page changes to pageCount, so a page count that is only a lower bound would\n // stop Next at the last page it knows of; -1 leaves paging unbounded.\n options.pageCount = pagination.totalIsLowerBound\n ? -1\n : pagination?.paginationParams?.['total-pages'];\n }\n\n if (sort === true) {\n options.getSortedRowModel = getSortedRowModel();\n options.enableSorting = true;\n } else if (isServerSorting(sort)) {\n options.manualSorting = true;\n options.enableSorting = true;\n options.onSortingChange = (updaterOrValue) => {\n if (typeof updaterOrValue === 'function') {\n const newSortingState = updaterOrValue(sort.state);\n sort.handleSortClick(newSortingState);\n }\n };\n\n options.state = {\n ...(options.state ? options.state : {}),\n sorting: sort.state,\n };\n } else {\n options.enableSorting = false;\n }\n\n if (showControls && enableRowSelection) {\n options.enableRowSelection = getRowSelectable\n ? (row) => getRowSelectable(row.original)\n : true;\n options.onRowSelectionChange = setRowSelection;\n }\n\n if (!enableSubRowSelection) {\n options.enableSubRowSelection = false;\n }\n\n // Client-side global filtering\n if (clientSearch) {\n if (manualFiltering) {\n options.manualFiltering = true;\n } else {\n options.getFilteredRowModel = getFilteredRowModel();\n options.globalFilterFn = 'includesString';\n }\n options.onGlobalFilterChange = setGlobalFilter;\n }\n\n // Client-side column filtering\n if (clientFiltering) {\n options.getFilteredRowModel = getFilteredRowModel();\n options.onColumnFiltersChange = setColumnFilters;\n }\n\n // Build column visibility: use explicit values when provided, fall back to state or default\n const columnOptionsVisibility: Record<string, boolean> = {};\n columns.forEach((column) => {\n const columnId = typeof column === 'object' ? column.id || column.accessor : column;\n // Use explicit visibility if provided, otherwise fall back to state value or default true\n if (typeof column === 'object' && 'visibility' in column && column.visibility != null) {\n columnOptionsVisibility[columnId] = column.visibility;\n } else {\n columnOptionsVisibility[columnId] = columnVisibility[columnId] ?? true;\n }\n });\n options.state = { ...options.state, columnVisibility: columnOptionsVisibility };\n\n const expandedState: Record<string, boolean> = {};\n for (const rowId of expandedRows) {\n expandedState[rowId] = true;\n }\n options.state = {\n ...options.state,\n columnOrder,\n rowSelection,\n columnPinning: initialColumnPinning,\n expanded: expandedState,\n ...(clientSearch && { globalFilter }),\n ...(clientFiltering && { columnFilters }),\n };\n options.onColumnVisibilityChange = setColumnVisibility;\n options.onColumnOrderChange = setColumnOrder;\n options.enableSortingRemoval = enableSortingRemoval;\n options.sortDescFirst = sortDescFirst;\n options.enableColumnPinning = initialColumnPinning.left && initialColumnPinning.left.length > 0;\n\n return options;\n }, [\n pagination,\n columnVisibility,\n columnOrder,\n enableRowSelection,\n enableSubRowSelection,\n rowSelection,\n showControls,\n sort,\n enableSortingRemoval,\n sortDescFirst,\n clientSearch,\n globalFilter,\n clientFiltering,\n columnFilters,\n columns,\n initialColumnPinning,\n expandedRows,\n ]);\n\n // Handle row selection from the built-in select column, supporting shift+click range selection.\n // On shift+click, every selectable row between the last clicked row and the current row (in the\n // displayed order) is set to the clicked checkbox's new value.\n const handleRowSelectionWithShift = useCallback(\n (clickedRow: Row<TData>, table: Table<TData>, checked: boolean, isShiftKey: boolean) => {\n const displayedRows = table.getRowModel().rows;\n const currentIndex = displayedRows.findIndex((r) => r.id === clickedRow.id);\n const lastSelectedRowId = lastSelectedRowIdRef.current;\n const lastIndex =\n lastSelectedRowId != null ? displayedRows.findIndex((r) => r.id === lastSelectedRowId) : -1;\n\n if (isShiftKey && lastIndex !== -1 && currentIndex !== -1) {\n const startIndex = Math.min(lastIndex, currentIndex);\n const endIndex = Math.max(lastIndex, currentIndex);\n displayedRows.slice(startIndex, endIndex + 1).forEach((rangeRow) => {\n if (rangeRow.getCanSelect()) {\n rangeRow.toggleSelected(checked);\n }\n });\n } else {\n clickedRow.toggleSelected(checked);\n }\n\n lastSelectedRowIdRef.current = clickedRow.id;\n },\n [],\n );\n\n // Enrich columns with filterFn derived from ClientFilterConfig.type so that\n // the PDS useTableColumns hook sets the correct TanStack filter function.\n const columnsWithFilterFn = useMemo(() => {\n if (!clientFiltering) {\n return columns;\n }\n return columns.map((column) => {\n if (\n typeof column === 'object' &&\n column.filter != null &&\n typeof column.filter === 'object' &&\n 'type' in column.filter &&\n typeof (column.filter as { type: unknown }).type === 'string'\n ) {\n const filterType = (column.filter as { type: string }).type;\n return {\n ...column,\n filter: { ...column.filter, filterFn: getFilterFnName(filterType) },\n };\n }\n return column;\n }) as DataTableColumns<TData>;\n }, [columns, clientFiltering]);\n\n const strings = usePDSStrings();\n const locale = usePDSLocale();\n const defaultRenderFormat = useCallback<RenderFormatFn<TData, DataTableColumnFormat<TData>>>(\n (value, format, row) => renderAsPDSFormat(value, format, row, { locale, strings }),\n [locale, strings],\n );\n\n const [tableColumns, columnOptions] = useTableColumns({\n columns: columnsWithFilterFn,\n data,\n compact,\n sort,\n clientSearch,\n clientFiltering,\n expandColumnVisibility,\n showControls,\n enableRowSelection,\n enableSubRowSelection,\n rowActions,\n getRowId,\n expandedRows,\n toggleRowExpansion,\n canRowExpand,\n checkboxColumnStates,\n handleCheckboxCellChange,\n handleSelectAllCheckboxCell,\n getSelfAndNestedRowIds,\n handleRowSelectionWithShift,\n renderFormat: renderFormat ?? defaultRenderFormat,\n });\n\n // Custom getExpandedRowModel and expandRows functions to support showing specific nested rows even if the parent row is not expanded\n // Particularly useful when searching for specific rows and we want to show the nested rows that match the search term,\n // but not the other sibling nested rows. The logic is copied from the tanstack table's implementation, we are just\n // adding the above logic. https://github.com/TanStack/table/blob/v8.20.6/packages/table-core/src/utils/getExpandedRowModel.ts#L4\n const expandRowsCustom = useCallback((rowModel: RowModel<TData>): RowModel<TData> => {\n const expandedRows: Row<TData>[] = [];\n\n const handleRow = (row: Row<TData>) => {\n expandedRows.push(row);\n\n if (row.subRows?.length && row.getIsExpanded()) {\n row.subRows.forEach(handleRow);\n } else if (isRowWithSubrowsToAlwaysShowIds(row.original)) {\n row.subRows\n .filter((subrow) =>\n (\n row.original as RowDataWithSubrowsToAlwaysShowIds<TData>\n ).subrowsToAlwaysShowIds.includes(subrow.id),\n )\n .forEach(handleRow);\n }\n };\n\n rowModel.rows.forEach(handleRow);\n\n return {\n rows: expandedRows,\n flatRows: rowModel.flatRows,\n rowsById: rowModel.rowsById,\n };\n }, []);\n\n function getExpandedRowModelCustom(): (table: Table<TData>) => () => RowModel<TData> {\n return (table) =>\n tanstackMemo(\n () => [\n table.getState().expanded,\n table.getPreExpandedRowModel(),\n table.options.paginateExpandedRows,\n ],\n (\n expanded: ExpandedState,\n rowModel: RowModel<TData>,\n paginateExpandedRows: boolean | undefined,\n ) => {\n if (!rowModel.rows.length || (expanded !== true && !Object.keys(expanded ?? {}).length)) {\n return expandRowsCustom(rowModel);\n }\n\n if (!paginateExpandedRows) {\n // Only expand rows at this point if they are being paginated\n return rowModel;\n }\n\n return expandRowsCustom(rowModel);\n },\n getMemoOptions(table.options, 'debugTable', 'getExpandedRowModel'),\n );\n }\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n getSubRows: (row) => (isRowWithSubrows(row) ? row.subrows : []),\n getCoreRowModel: getCoreRowModel(),\n getExpandedRowModel: getExpandedRowModelCustom(),\n getRowId,\n ...tableOptions,\n });\n\n // We don't yet support multi-header groups across our products so we can assume there's only one\n const tableHeaderGroup = table.getHeaderGroups()[0];\n\n const unprocessedRows = table.getCoreRowModel().rows;\n const rows = table.getRowModel().rows;\n\n // Keyed on the ordered id list so the callback only fires when the displayed\n // rows actually change, not on every render (rows is a fresh array each time).\n const displayedRowIdsKey = rows.map((row) => row.id).join(DISPLAYED_ROW_IDS_SEPARATOR);\n useEffect(() => {\n onDisplayedRowIdsChange?.(\n displayedRowIdsKey ? displayedRowIdsKey.split(DISPLAYED_ROW_IDS_SEPARATOR) : [],\n );\n }, [displayedRowIdsKey, onDisplayedRowIdsChange]);\n\n // Generate checkbox column states based on table data and column values\n useEffect(() => {\n const states: Record<string, Set<string>> = {};\n\n // Find all checkbox columns from the original columns configuration\n const checkboxColumns = columns.filter(\n (column): column is ColumnConfig<TData> =>\n typeof column === 'object' && column.format?.type === 'checkbox',\n );\n\n // For each checkbox column, initialize its state based on the actual column values in the data\n for (const column of checkboxColumns) {\n const columnId = column.id || column.accessor;\n const checkedRowIds = new Set<string>();\n\n // Use table rows to get the actual row data and check the column values\n const getSelfAndNestedRows = (row: Row<TData>): Row<TData>[] => [\n row,\n ...row.subRows.map(getSelfAndNestedRows).flat(),\n ];\n const rootAndNestedRows = unprocessedRows.flatMap(getSelfAndNestedRows);\n for (const row of rootAndNestedRows) {\n const rowId = row.id;\n const rowData = row.original;\n\n // Get the column value from the row data (use accessor, not custom id)\n const columnValue = rowData[column.accessor as keyof TData];\n\n // If the column value is truthy, consider it checked\n if (columnValue) {\n checkedRowIds.add(rowId);\n }\n }\n\n states[columnId] = checkedRowIds;\n }\n\n setCheckboxColumnStates(states);\n }, [unprocessedRows, columns]);\n\n // Generate search props for TableControls when client search is enabled\n const generatedSearchProps = clientSearch\n ? {\n value: globalFilter,\n handleInput: setGlobalFilter,\n placeholder:\n typeof clientSearch === 'object'\n ? clientSearch.placeholder || DEFAULT_SEARCH_PLACEHOLDER\n : DEFAULT_SEARCH_PLACEHOLDER,\n ...(typeof clientSearch === 'object' && clientSearch),\n }\n : undefined;\n\n const unifiedFilters = useMemo<TFilter[]>(() => {\n const configuredFilters = controls?.filters ?? [];\n if (!clientFiltering) {\n return [...configuredFilters];\n }\n\n const clientFilters = generateClientFilters(\n columns.filter((column): column is ColumnConfig<TData> => typeof column === 'object'),\n columnFilters,\n setColumnFilters,\n );\n return [...configuredFilters, ...(clientFilters as unknown as TFilter[])];\n }, [clientFiltering, columnFilters, columns, controls?.filters, setColumnFilters]);\n\n // Helper function to get common pinning styles\n const getCommonPinningStyles = useCallback(\n (column: Column<TData>) => {\n const isPinned = column.getIsPinned();\n const isLastPinned = isPinned === 'left' && column.getIsLastColumn('left');\n\n return {\n left:\n isPinned === 'left' ? `${column.getStart('left') + pinnedColumnLeftOffset}px` : undefined,\n position: isPinned ? 'sticky' : 'relative',\n hasRightBorder: isLastPinned,\n };\n },\n [pinnedColumnLeftOffset],\n );\n\n /**\n * Check if the column is a table feature column.\n * Feature columns are special columns set by the table to\n * allow a user to perform an action.\n */\n const isFeatureCol = (columnId: string) => {\n return ['select-col', 'expand-col', 'action-col'].includes(columnId);\n };\n\n const selectedRows = table.getFilteredSelectedRowModel().flatRows;\n\n useEffect(() => {\n onRowSelectionChange?.(selectedRows.map((row) => row.original));\n }, [selectedRows, onRowSelectionChange]);\n\n const actions = useMemo(() => {\n // Use dynamic bulk actions if provided, otherwise fall back to static ones\n const availableActions = getAvailableBulkActions\n ? getAvailableBulkActions(selectedRows.map((row) => row.original))\n : bulkActions || controls?.bulkActions;\n return availableActions?.map((action) => {\n // Create clearSelection callback that actions can call when they're ready\n const clearSelection = () => table.setRowSelection({});\n\n const baseAction = {\n ...action,\n onClick: async () => {\n await action.onClick(\n selectedRows.map((row) => row.id),\n clearSelection,\n );\n },\n };\n\n // Check if action has popover configuration (only on bulkActions, not controls?.bulkActions)\n if ('popover' in action && action.popover) {\n const popoverConfig = action.popover as {\n options: { label: string; value: string }[];\n onOptionSelect: (option: string, selectedRows: string[]) => void | Promise<void>;\n };\n return {\n ...baseAction,\n popover: {\n options: popoverConfig.options,\n onOptionSelect: async (option: string) => {\n await popoverConfig.onOptionSelect(\n option,\n selectedRows.map((row) => row.id),\n );\n table.setRowSelection({});\n },\n },\n };\n }\n\n return baseAction;\n });\n }, [bulkActions, getAvailableBulkActions, selectedRows, table, controls?.bulkActions]);\n\n const shouldShowFloatingActionBar =\n compact && actions && actions.length > 0 && selectedRows.length > 0;\n\n // Check if any filters are active\n const hasGlobalFilter = clientSearch && globalFilter && globalFilter.trim().length > 0;\n const hasFilters =\n columnFilters.length > 0 ||\n (controls?.filterPanel == null &&\n (controls?.filtersV2 != null\n ? controls.filtersV2.initialState != null && !isEmptyState(controls.filtersV2.initialState)\n : unifiedFilters.some(\n (filter) =>\n filter.enabled !== false && isFilterActive(filter, controls?.filterResolver),\n )));\n const hasActiveFilters = hasGlobalFilter || hasFilters || hasExternalActiveFilters;\n\n return (\n <DataTableContainer $stickyHeader={stickyHeader}>\n {showControls && (\n <DataTableControls<TFilter>\n compact={compact}\n title={title}\n propertiesButton={\n showColumnProperties && (\n <TableViewConfigurationDropdown\n disabled={false}\n columnConfiguration={table\n .getVisibleFlatColumns()\n .filter((column) => !isFeatureCol(column.columnDef.id ?? ''))\n .map((column) => ({\n key: column.id,\n label: column.columnDef.header?.toString() || column.id,\n }))\n .sort((a, b) => {\n return (orderMap[a.key] || 0) - (orderMap[b.key] || 0);\n })}\n attributeOptions={columnOptions}\n updateColumnConfiguration={(newConfiguration) => {\n table.getAllColumns().map((column) => {\n column.toggleVisibility(!!newConfiguration.find((c) => c.key === column.id));\n });\n\n setColumnOrder(newConfiguration.map((c) => c.key));\n\n if (onUpdateColumnProperties) {\n onUpdateColumnProperties(newConfiguration);\n }\n }}\n size={compact ? 'sm' : undefined}\n variant={compact ? 'text' : 'basic'}\n />\n )\n }\n selectedRows={table.getFilteredSelectedRowModel().flatRows.map((row) => row.id)}\n onClearSelection={() => table.setRowSelection({})}\n searchProps={generatedSearchProps}\n {...controls}\n bulkActions={actions}\n filters={unifiedFilters}\n />\n )}\n <TableContainer $stickyHeader={stickyHeader}>\n <StyledTableLayout\n $onAddRow={!!onAddRow}\n stickyHeader={stickyHeader}\n containerScrollsHorizontally={scrollsHorizontally}\n headerTR={\n <>\n {tableHeaderGroup.headers.map((header) => {\n const pinningStyles = getCommonPinningStyles(header.column);\n const isPinned = pinningStyles.position === 'sticky';\n const width = header.column.columnDef.meta?.width\n ? `${header.column.columnDef.meta?.width}px`\n : undefined;\n const minWidth = header.column.columnDef.meta?.minWidth\n ? `${header.column.columnDef.meta?.minWidth}px`\n : (width ?? `${header.column.getSize()}px`);\n const thProps = {\n id: header.id,\n sortable: isFeatureCol(header.id) ? false : header.column.getCanSort(),\n onClick: isFeatureCol(header.id)\n ? undefined\n : header.column.getToggleSortingHandler(),\n sortDirection: isFeatureCol(header.id) ? undefined : header.column.getIsSorted(),\n colSpan: header.colSpan,\n align: header.column.columnDef.meta?.align,\n width: header.column.columnDef.meta?.width\n ? `${header.column.columnDef.meta?.width}px`\n : undefined,\n size: (compact ? 'sm' : 'md') as 'sm' | 'md',\n style: {\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n },\n };\n\n if (isPinned) {\n return (\n <StickyTH\n {...thProps}\n key={header.id}\n left={pinningStyles.left ? parseInt(pinningStyles.left) : 0}\n hasRightBorder={pinningStyles.hasRightBorder}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </StickyTH>\n );\n }\n\n return (\n <TableTH {...thProps} key={header.id}>\n {header.column.columnDef.meta?.headerTooltip ? (\n <TextUnderlineTooltip\n side='top'\n tooltip={header.column.columnDef.meta.headerTooltip}\n zIndex={Z_INDICES.topNavTooltip}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </TextUnderlineTooltip>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </TableTH>\n );\n })}\n </>\n }\n nullState={<p>{strings.noResults}</p>}\n isLoading={isLoading}\n size={compact ? 'sm' : undefined}\n >\n {columns.length === 0 ? (\n <TableTR disableHoverBackground>\n <TableEmptyState colSpan={1}>\n <Paragraph size='lg' weight='bold' color='primary'>\n {strings.noColumnsConfigured}\n </Paragraph>\n </TableEmptyState>\n </TableTR>\n ) : rows.length === 0 ? (\n <TableTR disableHoverBackground>\n <TableEmptyState colSpan={tableHeaderGroup.headers.length}>\n <Paragraph size='lg' weight='bold' color='primary'>\n {emptyState?.title ||\n (hasActiveFilters ? strings.noResultsTryFilters : strings.noResults)}\n </Paragraph>\n\n {emptyState?.description && (\n <Paragraph size='md' color='secondary'>\n {emptyState.description}\n </Paragraph>\n )}\n </TableEmptyState>\n </TableTR>\n ) : (\n rows.map((row) => {\n const rowData = row.original;\n const rowId = getRowId ? getRowId(rowData) : row.id;\n const rowLabel = getRowLabel?.(rowData);\n const isExpanded = expandedRows.has(rowId);\n const canExpand = canRowExpand(rowData);\n const rowLinkHref = getLinkToRow\n ? getLinkToRow(row.original)\n : rowLinkPrefix\n ? `${rowLinkPrefix}/${rowId}`\n : undefined;\n // Make the nested row's chevron / checkbox line up with the parent row's first column entry\n const dynamicNestSpacing =\n showControls && enableRowSelection ? NEST_SPACING + 8 : NEST_SPACING;\n\n const visibleCells = row.getVisibleCells();\n const isLinkableCell = (cell: (typeof visibleCells)[number]) =>\n !isFeatureCol(cell.column.id) && cell.column.columnDef.meta?.format?.type !== 'url';\n const rowLinkCellId = rowLinkHref\n ? (visibleCells.find(\n (cell) => cell.column.id === rowLinkColumnId && isLinkableCell(cell),\n )?.column.id ?? visibleCells.find(isLinkableCell)?.column.id)\n : undefined;\n const RowLinkComponent = rowLinkComponent ?? RouterLink;\n const renderCellContent = (cell: (typeof visibleCells)[number]) => {\n const content = flexRender(cell.column.columnDef.cell, cell.getContext());\n\n if (!rowLinkHref || cell.column.id !== rowLinkCellId) {\n return content;\n }\n\n const value = cell.getValue();\n const isEmpty = value == null || value === '';\n\n return (\n <RowLink\n as={RowLinkComponent}\n to={rowLinkHref}\n data-row-link\n aria-label={isEmpty ? rowLabel : undefined}\n >\n {content}\n </RowLink>\n );\n };\n\n let leftMostNonSpecialColumnFound = false;\n const rowElements = visibleCells.map((cell) => {\n const pinningStyles = getCommonPinningStyles(cell.column);\n const isPinned = pinningStyles.position === 'sticky';\n\n if (cell.column.id === 'action-col') {\n return (\n <StyledTableActionTD\n key={cell.id}\n style={{ textAlign: cell.column.columnDef.meta?.align }}\n $nestSpacing={row.depth * dynamicNestSpacing}\n >\n {renderCellContent(cell)}\n </StyledTableActionTD>\n );\n }\n\n if (isPinned) {\n const leftBumpFromNesting = !leftMostNonSpecialColumnFound\n ? row.depth * dynamicNestSpacing\n : 0;\n const width = cell.column.columnDef.meta?.width\n ? `${cell.column.columnDef.meta?.width}px`\n : undefined;\n const minWidth = cell.column.columnDef.meta?.minWidth\n ? `${cell.column.columnDef.meta?.minWidth}px`\n : (width ?? `${cell.column.getSize()}px`);\n\n // Use gap coverage component for expand column, regular StickyTD for others\n const isExpandColumn = cell.column.id === 'expand-col';\n const stickyTableCell = isExpandColumn ? (\n <StickyTDWithGapCoverage\n key={cell.id}\n left={\n (pinningStyles.left ? parseInt(pinningStyles.left) : 0) +\n leftBumpFromNesting\n }\n style={{\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n textAlign: cell.column.columnDef.meta?.align,\n }}\n hasRightBorder={pinningStyles.hasRightBorder}\n $gapCoverage={leftBumpFromNesting}\n >\n {renderCellContent(cell)}\n </StickyTDWithGapCoverage>\n ) : (\n <StickyTD\n key={cell.id}\n left={\n (pinningStyles.left ? parseInt(pinningStyles.left) : 0) +\n leftBumpFromNesting\n }\n style={{\n // We use `style` because this value is potentially highly dynamic.\n minWidth,\n textAlign: cell.column.columnDef.meta?.align,\n }}\n hasRightBorder={pinningStyles.hasRightBorder}\n >\n {renderCellContent(cell)}\n </StickyTD>\n );\n\n if (!leftMostNonSpecialColumnFound && !isFeatureCol(cell.column.id)) {\n leftMostNonSpecialColumnFound = true;\n }\n return stickyTableCell;\n }\n\n const tableCell = (\n <StyledTableTD\n key={cell.id}\n style={{ textAlign: cell.column.columnDef.meta?.align }}\n width={isFeatureCol(cell.column.id) ? '1%' : undefined}\n $nestSpacing={\n leftMostNonSpecialColumnFound ? undefined : row.depth * dynamicNestSpacing\n }\n $isFeatureCol={isFeatureCol(cell.column.id)}\n >\n {renderCellContent(cell)}\n </StyledTableTD>\n );\n if (!leftMostNonSpecialColumnFound && !isFeatureCol(cell.column.id)) {\n leftMostNonSpecialColumnFound = true;\n }\n\n return tableCell;\n });\n\n // Determine if row should be active and get active styling\n const isRowActive = rowId === activeRowId;\n const handleRowClick =\n onRowClick != null\n ? () => {\n onRowClick(rowId);\n }\n : canExpand\n ? () => {\n toggleRowExpansion(rowId);\n }\n : undefined;\n\n const handleRowClickWithLink = (event: MouseEvent<HTMLTableRowElement>) => {\n if (forwardedRowLinkClicks.has(event.nativeEvent)) {\n return;\n }\n\n handleRowClick?.();\n\n if (\n !rowLinkHref ||\n event.defaultPrevented ||\n (event.target as Element).closest(\n 'a, button, input, select, textarea, label, [role=\"checkbox\"], [role=\"button\"], [role=\"menuitem\"]',\n )\n ) {\n return;\n }\n\n const link = event.currentTarget.querySelector('a[data-row-link]');\n const ownerWindow = link?.ownerDocument.defaultView;\n\n if (!link || !ownerWindow) {\n return;\n }\n\n const forwardedClick = new ownerWindow.MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n button: event.button,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n });\n forwardedRowLinkClicks.add(forwardedClick);\n link.dispatchEvent(forwardedClick);\n };\n\n const rowProps = {\n 'aria-label': rowLabel,\n onClick: handleRowClickWithLink,\n $isActive: isRowActive,\n disableHoverBackground: disableRowHover,\n css: {\n cursor: rowLinkHref || handleRowClick ? 'pointer' : undefined,\n },\n // Add data-tour-target if present on row data\n ...(isRowWithTourTarget(row.original) && {\n 'data-tour-target': row.original.dataTourTarget,\n }),\n };\n\n const mainRow = (\n <TableTR key={rowId} {...rowProps}>\n {rowElements}\n </TableTR>\n );\n\n const elements = [mainRow];\n\n // Add detail row if expandable and expanded\n if (canExpand && isExpanded) {\n let detailContent: React.ReactNode = null;\n\n if (isRowWithDetails(rowData) && rowData._details) {\n if (typeof rowData._details === 'function') {\n // If it's a function, call it with the row data as props\n detailContent = rowData._details(rowData);\n } else {\n // If it's a React node\n detailContent = rowData._details;\n }\n } else if (detailComponent) {\n const DetailComponent = detailComponent;\n detailContent = <DetailComponent rowData={rowData} />;\n }\n\n if (detailContent) {\n const detailCells = initialColumnPinning?.left?.length ? (\n <>\n <StickyTD colSpan={1} left={pinnedColumnLeftOffset} />\n <StickyDetailsTD\n colSpan={tableHeaderGroup.headers.length - 1}\n left={EXPAND_COLUMN_WIDTH + pinnedColumnLeftOffset}\n >\n {detailContent}\n </StickyDetailsTD>\n </>\n ) : (\n <>\n <TableTD colSpan={1} />\n <DetailsTD colSpan={tableHeaderGroup.headers.length - 1}>\n {detailContent}\n </DetailsTD>\n </>\n );\n\n elements.push(\n <TableTR key={`${row.id}-details`} disableHoverBackground>\n {detailCells}\n </TableTR>,\n );\n }\n }\n\n // Add inserter row if onAddRow prop is provided\n if (\n onAddRow &&\n (!canAddAfterRow ||\n canAddAfterRow?.(rowData, row.getIsExpanded() && isRowWithSubrows(rowData)))\n ) {\n elements.push(\n <Inserter\n key={`${rowId}-inserter`}\n priorRowLabel={`Row ${rowId}`}\n colSpan={tableHeaderGroup.headers.length}\n onAddRow={() =>\n onAddRow(rowId, row.getIsExpanded() && isRowWithSubrows(rowData))\n }\n nestSpacing={row.depth * dynamicNestSpacing}\n />,\n );\n }\n\n return elements;\n })\n )}\n </StyledTableLayout>\n {shouldShowFloatingActionBar && actions && (\n <FloatingActionBarContainer>\n <FloatingActionBar\n selectedCount={selectedRows.length}\n onClearSelection={() => table.setRowSelection({})}\n actions={actions}\n extraContent={floatingBarContent}\n />\n </FloatingActionBarContainer>\n )}\n </TableContainer>\n {pagination && data.length > 0 && (\n <Pagination\n pageSize={table.getState().pagination.pageSize}\n pageSizeOptions={typeof pagination === 'object' ? pagination.pageSizeOptions : undefined}\n showPageSizeSelector={\n isServerPagination(pagination) ? pagination.showPageSizeSelector : undefined\n }\n paginationParams={{\n 'current-page': table.getState().pagination.pageIndex + 1,\n 'total-count': table.getRowCount(),\n 'total-pages':\n isServerPagination(pagination) && pagination.totalIsLowerBound\n ? (pagination.paginationParams?.['total-pages'] ??\n table.getState().pagination.pageIndex + 1)\n : table.getPageCount(),\n }}\n handlePageLinkClick={(pageNumber) => table.setPageIndex(pageNumber - 1)}\n handlePageSizeClick={table.setPageSize}\n onPageChange={isServerPagination(pagination) ? pagination.onPageChange : undefined}\n totalIsLowerBound={\n isServerPagination(pagination) ? pagination.totalIsLowerBound : undefined\n }\n />\n )}\n </DataTableContainer>\n );\n};\n\nexport default DataTable;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker-C9redLBr.mjs","names":["Card","RangeCalendarPresets","useLocale","OpenButton","Popover","Popover"],"sources":["../src/components/DatePicker/Calendar/CalendarBase.tsx","../src/components/DatePicker/Calendar/CalendarCell.tsx","../src/components/DatePicker/Calendar/CalendarGrid.tsx","../src/components/DatePicker/Calendar/RangeCalendarPresets.tsx","../src/components/DatePicker/common.ts","../src/components/DatePicker/time-range.ts","../src/components/DatePicker/Calendar/RangeCalendar.tsx","../src/components/DatePicker/DateField.tsx","../src/components/DatePicker/DateRangePicker.tsx","../src/components/DatePicker/Calendar/Calendar.tsx","../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import { useRef } from 'react';\nimport { useButton } from 'react-aria';\nimport styled from 'styled-components';\n\nimport { Spacing, Typography } from '@persona/design-tokens';\n\nimport { IconButton } from '#src/components/Button';\nimport type { IconButtonProps } from '#src/components/Button/IconButton';\n\nexport const CalendarContainer = styled.div`\n display: inline-block;\n`;\n\nexport const CalendarHeader = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: ${Spacing[2]};\n`;\n\nexport const CalendarHeading = styled.div`\n ${Typography.TextLargeBold};\n flex: 1;\n text-align: center;\n`;\n\nconst StyledCalendarButton = styled(IconButton)`\n width: 32px;\n height: 32px;\n`;\n\nexport const CalendarButton = (props: IconButtonProps) => {\n const ref = useRef();\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n const { buttonProps } = useButton(props, ref);\n\n return (\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n <StyledCalendarButton {...buttonProps} className={props.className} ref={ref}>\n {props.children}\n </StyledCalendarButton>\n );\n};\n","import { type CalendarDate, type DateValue, isSameDay, isSameMonth } from '@internationalized/date';\nimport { useRef } from 'react';\nimport { useCalendarCell } from 'react-aria';\nimport type { CalendarState, RangeCalendarState } from 'react-stately';\nimport styled, { css } from 'styled-components';\n\nimport { BorderRadius, Color, Typography } from '@persona/design-tokens';\n\nimport { withAlpha } from '#src/lib/color';\nimport { semanticColor, semanticTokens } from '#src/lib/semanticColor';\n\nconst CalendarCellContainer = styled.td`\n text-align: center;\n width: 38px;\n height: 38px;\n padding: 0px;\n`;\n\ninterface CalendarCellButtonProps {\n isSelected?: boolean;\n isSelectionStart?: boolean;\n isSelectionEnd?: boolean;\n isInvalid?: boolean;\n isDisabled?: boolean;\n}\n\nconst CalendarCellButton = styled.button<CalendarCellButtonProps>`\n ${Typography.TextMedium};\n border-style: none;\n padding: 0;\n background: none;\n width: 100%;\n height: 100%;\n cursor: pointer;\n position: relative;\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n\n ${({ isSelected, theme }) => {\n if (!isSelected) {\n return null;\n }\n const tokens = semanticTokens(theme);\n return css`\n background: ${tokens ? withAlpha(tokens.SurfaceAccent, tokens.Opacity25) : Color.CorePurple100};\n ${tokens ? `color: ${tokens.FgPrimary};` : ''}\n `;\n }}\n\n ${({ isSelectionStart, theme }) =>\n isSelectionStart &&\n css`\n background: ${semanticColor(theme, 'ActionPrimary', Color.BackgroundButtonPrimary)};\n color: ${semanticColor(theme, 'FgInverse', Color.TextInverse)};\n border-top-left-radius: ${BorderRadius.Sm};\n border-bottom-left-radius: ${BorderRadius.Sm};\n `}\n\n ${({ isSelectionEnd, theme }) =>\n isSelectionEnd &&\n css`\n background: ${semanticColor(theme, 'ActionPrimary', Color.BackgroundButtonPrimary)};\n color: ${semanticColor(theme, 'FgInverse', Color.TextInverse)};\n border-top-right-radius: ${BorderRadius.Sm};\n border-bottom-right-radius: ${BorderRadius.Sm};\n `}\n\n ${({ isDisabled, theme }) =>\n isDisabled &&\n css`\n color: ${semanticColor(theme, 'FgDisabled', Color.CoreSlate300)};\n `}\n\n ${({ isInvalid, theme }) =>\n isInvalid &&\n css`\n background: ${semanticColor(theme, 'FeedbackDanger4', Color.BackgroundButtonDanger)};\n color: ${semanticColor(theme, 'FgInverseStatic', Color.TextInverse)};\n `}\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => semanticColor(theme, 'BorderFocus', Color.BorderFocus)};\n outline-offset: -2px;\n box-shadow: ${({ theme }) => semanticColor(theme, 'SurfacePrimary', Color.PrimaryWhite)} 0px 0px 0px 3px inset;\n z-index: 1;\n }\n`;\n\ninterface CalendarCellProps {\n state: CalendarState | RangeCalendarState;\n date: CalendarDate;\n currentMonth: DateValue;\n}\n\nconst CalendarCell = ({ state, date, currentMonth }: CalendarCellProps) => {\n const ref = useRef();\n const { cellProps, buttonProps, isSelected, isInvalid, isDisabled, formattedDate } =\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n useCalendarCell({ date }, state, ref);\n\n const highlightedRange = 'highlightedRange' in state && state.highlightedRange;\n\n const isOutsideMonth = !isSameMonth(currentMonth, date);\n const isSelectionStart = highlightedRange ? isSameDay(date, highlightedRange.start) : isSelected;\n const isSelectionEnd = highlightedRange ? isSameDay(date, highlightedRange.end) : isSelected;\n\n return (\n <CalendarCellContainer {...cellProps}>\n <CalendarCellButton\n {...buttonProps}\n hidden={isOutsideMonth}\n isSelected={isSelected}\n isSelectionStart={isSelectionStart}\n isSelectionEnd={isSelectionEnd}\n isInvalid={isInvalid}\n isDisabled={isDisabled}\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n ref={ref}\n >\n {formattedDate}\n </CalendarCellButton>\n </CalendarCellContainer>\n );\n};\n\nexport default CalendarCell;\n","import { type DateDuration, endOfMonth, getWeeksInMonth } from '@internationalized/date';\nimport { useCalendarGrid, useLocale } from 'react-aria';\nimport type { CalendarState, RangeCalendarState } from 'react-stately';\nimport styled from 'styled-components';\n\nimport { Color, Typography } from '@persona/design-tokens';\n\nimport { semanticColor } from '#src/lib/semanticColor';\n\nimport CalendarCell from './CalendarCell';\n\nconst CalendarGridContainer = styled.table`\n width: 266px;\n border-spacing: 0px;\n border-collapse: collapse;\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => semanticColor(theme, 'BorderFocus', Color.BorderFocus)};\n outline-offset: 1px;\n }\n`;\n\nconst CalendarGridDayHeader = styled.th`\n ${Typography.TextMedium};\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', Color.TextSecondary)};\n`;\n\ninterface CalendarGridProps {\n state: CalendarState | RangeCalendarState;\n offset?: DateDuration;\n skipFromTabOrder?: boolean;\n}\n\nconst CalendarGrid = ({ state, offset = {}, skipFromTabOrder = false }: CalendarGridProps) => {\n const { locale } = useLocale();\n const startDate = state.visibleRange.start.add(offset);\n const endDate = endOfMonth(startDate);\n\n const { gridProps, headerProps, weekDays } = useCalendarGrid(\n {\n startDate,\n endDate,\n },\n state,\n );\n\n const weeksInMonth = getWeeksInMonth(startDate, locale);\n\n // Remove second calendar grid from tab order - use arrow keys to navigate between months\n const modifiedGridProps = skipFromTabOrder ? { ...gridProps, tabIndex: -1 } : gridProps;\n\n return (\n <CalendarGridContainer {...modifiedGridProps}>\n <thead {...headerProps}>\n <tr>\n {weekDays.map((day, index) => (\n <CalendarGridDayHeader key={index}>{day}</CalendarGridDayHeader>\n ))}\n </tr>\n </thead>\n <tbody>\n {[...new Array(weeksInMonth).keys()].map((weekIndex) => (\n <tr key={weekIndex}>\n {state\n .getDatesInWeek(weekIndex, startDate)\n .map((date, i) =>\n date ? (\n <CalendarCell key={i} state={state} date={date} currentMonth={startDate} />\n ) : (\n <td key={i} />\n ),\n )}\n </tr>\n ))}\n </tbody>\n </CalendarGridContainer>\n );\n};\n\nexport default CalendarGrid;\n","import {\n type CalendarDate,\n type DateValue,\n endOfMonth,\n endOfYear,\n startOfMonth,\n startOfYear,\n today,\n} from '@internationalized/date';\nimport type { RangeValue } from '@react-types/shared';\nimport { Settings } from 'luxon';\nimport { memo, useRef } from 'react';\nimport { mergeProps, useButton } from 'react-aria';\nimport type { RangeCalendarState } from 'react-stately';\nimport styled, { css } from 'styled-components';\n\nimport type { DateFilterPreset } from '@persona/design-system/lib/date-filter';\nimport { Color } from '@persona/design-tokens';\n\nimport { MenuItem, MenuList } from '#src/components/Menu';\nimport { isFocused, isHovered, isNotDisabled } from '#src/lib/pseudoClass';\nimport { semanticColor } from '#src/lib/semanticColor';\n\ninterface DateRangePreset {\n id: DateFilterPreset;\n label: string;\n range: RangeValue<CalendarDate>;\n}\n\n/** The preset windows the picker offers; the codec resolves the same ids on read. */\nexport const getDefaultPresets = (tz: string): DateRangePreset[] => {\n const now = today(tz);\n return [\n {\n id: 'last_7_days',\n label: 'Last 7 days',\n range: {\n start: now.subtract({ days: 7 }),\n end: now,\n },\n },\n {\n id: 'last_14_days',\n label: 'Last 14 days',\n range: {\n start: now.subtract({ days: 14 }),\n end: now,\n },\n },\n {\n id: 'last_30_days',\n label: 'Last 30 days',\n range: {\n start: now.subtract({ days: 30 }),\n end: now,\n },\n },\n {\n id: 'this_month',\n label: 'This month',\n range: {\n start: startOfMonth(now),\n // Effectively, this should always be today, since we can't look forward\n end: now,\n },\n },\n {\n id: 'last_month',\n label: 'Last month',\n range: {\n start: startOfMonth(now.subtract({ months: 1 })),\n end: endOfMonth(now.subtract({ months: 1 })),\n },\n },\n {\n id: 'this_year',\n label: 'This year',\n range: {\n start: startOfYear(now),\n end: now,\n },\n },\n {\n id: 'last_year',\n label: 'Last year',\n range: {\n start: startOfYear(now.subtract({ years: 1 })),\n end: endOfYear(now.subtract({ years: 1 })),\n },\n },\n ];\n};\n\n/**\n * Compare two date values by year/month/day only, ignoring time components.\n */\nconst datesMatchByDay = (a: CalendarDate, b: DateValue): boolean =>\n a.year === b.year && a.month === b.month && a.day === b.day;\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\ninterface PresetButtonProps {\n state: RangeCalendarState;\n preset: DateRangePreset;\n isSelected: boolean;\n setDateMode: (mode: 'start' | 'end' | null) => void;\n onPresetSelect?: (preset: DateFilterPreset, commit: () => void) => void;\n commitRange: (value: RangeValue<DateValue>) => void;\n}\n\nconst StyledPresetButton = styled(MenuItem)`\n ${({ selected }) =>\n !selected &&\n css`\n &${isNotDisabled}${isHovered}, &${isNotDisabled}${isFocused} {\n background-color: transparent;\n }\n `}\n\n &:focus-visible {\n // MenuItems default to outline: none, so we need to override it here.\n outline: 2px solid ${({ theme }) => semanticColor(theme, 'BorderFocus', Color.BorderFocus)} !important;\n outline-offset: 1px;\n }\n`;\n\ninterface DateRangePickerPresetsProps {\n presetsFn?: (tz: string) => DateRangePreset[];\n state: RangeCalendarState;\n setDateMode: (mode: 'start' | 'end' | null) => void;\n onPresetSelect?: (preset: DateFilterPreset, commit: () => void) => void;\n selectedPreset?: DateFilterPreset | null;\n commitRange: (value: RangeValue<DateValue>) => void;\n}\n\nconst PresetButton = ({\n commitRange,\n state,\n preset,\n isSelected,\n setDateMode,\n onPresetSelect,\n ...props\n}: PresetButtonProps) => {\n const ref = useRef<HTMLDivElement>();\n const { buttonProps } = useButton(\n {\n onPress: () => {\n const commit = () => commitRange(preset.range);\n\n if (onPresetSelect) {\n onPresetSelect(preset.id, commit);\n } else {\n commit();\n }\n setDateMode(null);\n },\n },\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n ref,\n );\n\n // Strip aria-current from useButton's props so it doesn't override MenuItem's.\n const { 'aria-current': _ariaCurrent, ...mergedProps } = mergeProps(props, buttonProps);\n\n return (\n <StyledPresetButton\n selected={isSelected}\n {...mergedProps}\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n ref={ref}\n >\n {preset.label}\n </StyledPresetButton>\n );\n};\n\nconst DateRangePickerPresets = ({\n presetsFn = getDefaultPresets,\n commitRange,\n state,\n setDateMode,\n onPresetSelect,\n selectedPreset,\n ...props\n}: DateRangePickerPresetsProps) => {\n // The reason that we need to do this at render time is because the default timezone for moment is set after\n // the current User's timezone is loaded. Thus we woudln't be getting the right timezone unless if we defer getting\n // the timezone.\n const presets = presetsFn(Settings.defaultZone.name);\n\n // First match wins — prevents multiple presets appearing selected when ranges overlap.\n const { value } = state;\n const selectedPresetIndex = value\n ? presets.findIndex(\n (preset) =>\n datesMatchByDay(preset.range.start, value.start) &&\n datesMatchByDay(preset.range.end, value.end),\n )\n : -1;\n\n // `undefined` falls back to matching on dates; `null` is an explicit \"no preset\".\n const infersSelection = typeof selectedPreset === 'undefined';\n\n return (\n <Container {...props}>\n <MenuList aria-label='Date range presets'>\n {presets.map((preset, i) => (\n <PresetButton\n key={i}\n preset={preset}\n commitRange={commitRange}\n state={state}\n setDateMode={setDateMode}\n onPresetSelect={onPresetSelect}\n isSelected={infersSelection ? i === selectedPresetIndex : preset.id === selectedPreset}\n />\n ))}\n </MenuList>\n </Container>\n );\n};\n\n// Skips re-renders driven by calendar state the preset list does not read —\n// focus and hover updates fire on every pointer move during range selection.\nconst arePropsEqual = (\n prevProps: DateRangePickerPresetsProps,\n nextProps: DateRangePickerPresetsProps,\n) => {\n if (\n prevProps.selectedPreset !== nextProps.selectedPreset ||\n prevProps.onPresetSelect !== nextProps.onPresetSelect ||\n prevProps.commitRange !== nextProps.commitRange ||\n prevProps.setDateMode !== nextProps.setDateMode ||\n prevProps.presetsFn !== nextProps.presetsFn\n ) {\n return false;\n }\n\n const prevValue = prevProps.state.value;\n const nextValue = nextProps.state.value;\n\n if (!prevValue && !nextValue) {\n return true;\n }\n if (!prevValue || !nextValue) {\n return false;\n }\n\n return (\n prevValue.start.compare(nextValue.start) === 0 && prevValue.end.compare(nextValue.end) === 0\n );\n};\n\nexport default memo(DateRangePickerPresets, arePropsEqual);\n","import { GregorianCalendar } from '@internationalized/date';\n\nexport const createCalendar = () => new GregorianCalendar();\n","import { type CalendarDateTime, now, toCalendarDateTime } from '@internationalized/date';\nimport { Settings } from 'luxon';\n\nconst earliest = (a: CalendarDateTime, b: CalendarDateTime) => (a.compare(b) <= 0 ? a : b);\n\nexport const presetEnd = (end: CalendarDateTime) =>\n earliest(\n end.set({ hour: 23, minute: 59, second: 59, millisecond: 999 }),\n toCalendarDateTime(now(Settings.defaultZone.name)).set({ second: 0, millisecond: 0 }),\n );\n","import {\n type CalendarDate,\n type DateValue,\n toCalendarDateTime,\n toZoned,\n} from '@internationalized/date';\nimport type { RangeValue } from '@react-types/shared';\nimport { range } from 'lodash-es';\nimport { Settings } from 'luxon';\nimport { type Ref, useCallback, useEffect, useRef } from 'react';\nimport {\n type DateRange,\n type RangeCalendarProps as RangeCalendarBaseProps,\n useDateFormatter,\n useLocale,\n useRangeCalendar,\n VisuallyHidden,\n} from 'react-aria';\nimport { type RangeCalendarState, useRangeCalendarState } from 'react-stately';\nimport styled from 'styled-components';\n\nimport type { DateFilterPreset } from '@persona/design-system/lib/date-filter';\nimport { BorderRadius, Color, Spacing } from '@persona/design-tokens';\nimport { ArrowLeftIcon, ArrowRightIcon } from '@persona/icons';\n\nimport Card from '#src/components/Card';\nimport {\n CalendarButton,\n CalendarContainer,\n CalendarHeader,\n CalendarHeading,\n} from '#src/components/DatePicker/Calendar/CalendarBase';\nimport CalendarGrid from '#src/components/DatePicker/Calendar/CalendarGrid';\nimport RangeCalendarPresets from '#src/components/DatePicker/Calendar/RangeCalendarPresets';\nimport { createCalendar } from '#src/components/DatePicker/common';\nimport { presetEnd } from '#src/components/DatePicker/time-range';\nimport { semanticColor } from '#src/lib/semanticColor';\n\nconst RangeCalendarHeader = styled(CalendarHeader)`\n gap: ${Spacing[5]};\n`;\n\nconst CalendarHeaderMonth = styled.div`\n display: grid;\n grid-template-columns: minmax(auto, 1fr) auto minmax(auto, 1fr);\n grid-template-areas: 'prev title next';\n width: 266px;\n align-items: center;\n`;\n\nconst CalendarGrids = styled.div`\n display: flex;\n gap: ${Spacing[5]};\n align-items: start;\n`;\n\nconst PrevButton = styled(CalendarButton)`\n grid-area: prev;\n justify-self: start;\n border-radius: ${BorderRadius.Sm};\n`;\n\nconst NextButton = styled(CalendarButton)`\n grid-area: next;\n justify-self: end;\n border-radius: ${BorderRadius.Sm};\n`;\n\nconst RangeCalendarHeading = styled(CalendarHeading)`\n grid-area: title;\n`;\n\nconst RangeCalendarContainer = styled.div`\n display: flex;\n`;\n\nconst PresetsContainer = styled(Card.Body)`\n border-right: 1px solid ${({ theme }) => semanticColor(theme, 'BorderDivider', Color.BorderHairline)};\n`;\n\nexport interface RangeCalendarProps extends RangeCalendarBaseProps<DateValue> {\n minDate?: RangeCalendarBaseProps<DateValue>['minValue'];\n maxDate?: RangeCalendarBaseProps<DateValue>['maxValue'];\n calendarRef?: Ref<HTMLDivElement>;\n hidePresets?: boolean;\n visibleMonths?: 1 | 2;\n onSelectDate?: (d: CalendarDate) => void;\n setDateMode: (mode: 'start' | 'end' | null) => void;\n onPresetSelect?: (preset: DateFilterPreset, commit: () => void) => void;\n selectedPreset?: DateFilterPreset | null;\n /**\n * From setValue of DateRangePicker\n */\n setValue: (value: DateRange | null) => void;\n granularity: 'day' | 'hour' | 'minute' | 'second';\n}\n\nconst hasTimeComponent = (date: DateValue) => 'hour' in date;\n\nconst RangeCalendar = ({\n calendarRef,\n onSelectDate,\n minDate,\n maxDate,\n hidePresets,\n visibleMonths = 2,\n setDateMode,\n onPresetSelect,\n selectedPreset,\n setValue,\n granularity,\n ...props\n}: RangeCalendarProps) => {\n const { locale } = useLocale();\n // Must gather the TZ from the user's settings.\n const timezoneName = Settings.defaultZone.name;\n const rangeCalendarState = useRangeCalendarState({\n ...props,\n minValue: minDate,\n maxValue: maxDate,\n visibleDuration: {\n months: visibleMonths,\n },\n locale,\n createCalendar,\n });\n\n const state: RangeCalendarState = {\n ...rangeCalendarState,\n setValue: (value) => {\n if (!value || granularity === 'day') {\n rangeCalendarState.setValue(value);\n return;\n }\n\n setValue({\n start: toZoned(toCalendarDateTime(value.start), timezoneName),\n // A date-only end comes from a preset, where the end date is inclusive.\n end: toZoned(\n hasTimeComponent(value.end)\n ? toCalendarDateTime(value.end)\n : presetEnd(toCalendarDateTime(value.end)),\n timezoneName,\n ),\n });\n },\n selectDate: (date) => {\n if (onSelectDate) {\n onSelectDate(date);\n rangeCalendarState.setAnchorDate(null);\n } else {\n rangeCalendarState.selectDate(date);\n }\n },\n };\n\n // The preset list is memoized on its own props, so it can hold a `state` from\n // an earlier render. Committing through a ref keeps the write on the current\n // `onChange` chain instead of one the parent has already replaced.\n const commitRef = useRef(state.setValue);\n useEffect(() => {\n commitRef.current = state.setValue;\n });\n const commitRange = useCallback((value: RangeValue<DateValue>) => commitRef.current(value), []);\n\n const ref = useRef();\n\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n const { calendarProps, prevButtonProps, nextButtonProps } = useRangeCalendar(props, state, ref);\n\n const monthDateFormatter = useDateFormatter({\n month: 'long',\n year: 'numeric',\n timeZone: timezoneName,\n });\n\n const monthHeaders = range(0, visibleMonths).map((i) => {\n return (\n <CalendarHeaderMonth key={`calendar-month-${i}`}>\n {i === 0 && (\n <PrevButton {...prevButtonProps}>\n <ArrowLeftIcon />\n </PrevButton>\n )}\n <RangeCalendarHeading aria-hidden>\n {monthDateFormatter.format(\n state.visibleRange.start.add({ months: i }).toDate(timezoneName),\n )}\n </RangeCalendarHeading>\n {i === visibleMonths - 1 && (\n <NextButton {...nextButtonProps}>\n <ArrowRightIcon />\n </NextButton>\n )}\n </CalendarHeaderMonth>\n );\n });\n\n const monthGrids = range(0, visibleMonths).map((i) => {\n return (\n <CalendarGrid\n key={`calendar-grid-${i}`}\n state={state}\n offset={{ months: i }}\n skipFromTabOrder={i > 0}\n />\n );\n });\n\n return (\n <RangeCalendarContainer ref={calendarRef}>\n {!hidePresets && (\n <PresetsContainer padding={Spacing[3]}>\n <RangeCalendarPresets\n state={state}\n commitRange={commitRange}\n setDateMode={setDateMode}\n onPresetSelect={onPresetSelect}\n selectedPreset={selectedPreset}\n />\n </PresetsContainer>\n )}\n <Card.Body padding={Spacing[3]}>\n {/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */}\n <CalendarContainer {...calendarProps} ref={ref}>\n {/* Calendar header is separate from grid like this to facilitate a11y. */}\n <RangeCalendarHeader>\n <VisuallyHidden isFocusable={false}>{calendarProps['aria-label']}</VisuallyHidden>\n {monthHeaders}\n </RangeCalendarHeader>\n <CalendarGrids>{monthGrids}</CalendarGrids>\n </CalendarContainer>\n </Card.Body>\n </RangeCalendarContainer>\n );\n};\n\nexport default RangeCalendar;\n","import type { DateValue } from '@internationalized/date';\nimport { type AriaDateFieldProps, useDateField, useDateSegment } from '@react-aria/datepicker';\nimport { useLocale } from '@react-aria/i18n';\nimport { mergeRefs } from '@react-aria/utils';\nimport {\n type DateFieldState,\n type DateSegment as DateSegmentObj,\n type SegmentType,\n useDateFieldState,\n} from '@react-stately/datepicker';\nimport { forwardRef, useRef } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Color, Spacing } from '@persona/design-tokens';\n\nimport { createCalendar } from '#src/components/DatePicker/common';\nimport { withAlpha } from '#src/lib/color';\nimport { isFocused, isFocusedVisible, isNotDisabled } from '#src/lib/pseudoClass';\nimport { semanticColor, semanticOnly, semanticTokens } from '#src/lib/semanticColor';\nimport { focusWithinOutline } from '#src/mixins/focus';\nimport inputMixin, { type InputMixinProps, type InputSizes } from '#src/mixins/input';\nimport type PseudoClassProps from '#src/types/PseudoClassProps';\n\ntype DateSegmentContainerProps = { $isComma?: boolean; $isTimezone?: boolean } & PseudoClassProps;\nconst DateSegmentContainer = styled.div<DateSegmentContainerProps>`\n font-variant-numeric: tabular-nums;\n box-sizing: content-box;\n text-align: end;\n\n ${isFocused} {\n outline: 2px solid ${({ theme }) => semanticColor(theme, 'BorderFocus', Color.BorderFocus)};\n outline-offset: 1px;\n background-color: ${({ theme }) => {\n const tokens = semanticTokens(theme);\n return tokens ? withAlpha(tokens.SurfaceAccent, tokens.Opacity25) : Color.CorePurple200;\n }};\n ${semanticOnly((tokens) => `color: ${tokens.FgAccent};`)}\n }\n\n ${({ $isComma, $isTimezone }) =>\n ($isComma || $isTimezone) &&\n css`\n margin-left: 0.25ch;\n margin-right: 0.25ch;\n `}\n\n ${({ $isTimezone }) =>\n $isTimezone &&\n css`\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', Color.TextSecondary)};\n pointer-events: none;\n\n &:focus {\n outline: none;\n background-color: transparent;\n }\n `}\n`;\n\ntype DateSegmentPlaceholderProps = { isPlaceholder?: boolean; type: SegmentType };\nconst DateSegmentPlaceholder = styled.span<DateSegmentPlaceholderProps>`\n display: block;\n width: 100%;\n pointer-events: none;\n\n &:focus {\n outline: none;\n }\n\n ${({ isPlaceholder }) =>\n isPlaceholder\n ? css`\n height: 100%;\n color: ${({ theme }) => semanticColor(theme, 'FgSecondary', theme.color.text.tertiary)};\n `\n : css`\n visibility: hidden;\n height: 0;\n `}\n ${({ type }) =>\n type === 'literal' &&\n css`\n padding-left: ${Spacing[1]};\n padding-right: ${Spacing[1]};\n `}\n ${({ type, isPlaceholder }) =>\n type === 'month' &&\n isPlaceholder &&\n css`\n width: 3ch;\n `}\n`;\n\ninterface DateSegmentProps {\n segment: DateSegmentObj;\n state: DateFieldState;\n}\n\nfunction DateSegment({ segment, state }: DateSegmentProps) {\n const ref = useRef();\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n let minWidth: string;\n\n switch (segment.type) {\n case 'dayPeriod': {\n minWidth = '2.75ch';\n break;\n }\n default: {\n minWidth = `${segment.maxValue != null && String(segment.maxValue).length + 0.25}ch`;\n break;\n }\n }\n\n const isComma = segment.type === 'literal' && segment.text === ', ';\n const isTimezone = segment.type === 'timeZoneName';\n\n return (\n <DateSegmentContainer\n {...segmentProps}\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n ref={ref}\n style={{\n ...segmentProps.style,\n minWidth,\n }}\n $isComma={isComma}\n $isTimezone={isTimezone}\n {...(isTimezone && { tabIndex: -1, role: 'presentation' })}\n >\n {/* Always reserve space for the placeholder, to prevent layout shift when editing. */}\n {segment.placeholder && (\n <DateSegmentPlaceholder\n aria-hidden='true'\n isPlaceholder={segment.isPlaceholder}\n type={segment.type}\n >\n {segment.placeholder}\n </DateSegmentPlaceholder>\n )}\n {segment.isPlaceholder ? '' : segment.text}\n </DateSegmentContainer>\n );\n}\n\nconst InputBox = styled.div<\n InputMixinProps & { $hasTimeZone: boolean; $inputPosition: 'start' | 'end' }\n>`\n ${inputMixin};\n display: flex;\n padding-left: ${Spacing[2]};\n padding-right: ${Spacing[2]};\n line-height: 1;\n position: relative;\n white-space: nowrap;\n\n ${({ $hasTimeZone }) =>\n $hasTimeZone &&\n css`\n width: auto;\n flex: 1 0 auto;\n `}\n\n &${isFocusedVisible}${isNotDisabled} {\n position: relative;\n z-index: 1;\n }\n\n ${focusWithinOutline}\n\n ${({ $inputPosition }) => {\n switch ($inputPosition) {\n case 'start': {\n return css`\n border-top-right-radius: 0px;\n border-bottom-right-radius: 0px;\n `;\n }\n case 'end': {\n return css`\n margin-left: -1px;\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n `;\n }\n }\n }}\n`;\n\ninterface DateFieldProps extends AriaDateFieldProps<DateValue> {\n inputPosition?: 'start' | 'end';\n focused?: boolean;\n readOnly?: boolean;\n value?: DateValue;\n disabled?: boolean;\n size?: InputSizes;\n style?: React.CSSProperties;\n dateFieldProps?: {\n style?: React.CSSProperties;\n };\n hasError?: boolean;\n}\n\nexport const DateField = forwardRef<HTMLDivElement, DateFieldProps>(function DateField(\n props: DateFieldProps,\n forwardedRef,\n) {\n const { locale } = useLocale();\n const state = useDateFieldState({\n ...props,\n locale,\n createCalendar,\n });\n\n const ref = useRef<HTMLDivElement>();\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n const { fieldProps } = useDateField(props, state, ref);\n\n return (\n <InputBox\n {...fieldProps}\n {...(props.dateFieldProps || {})}\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n ref={mergeRefs<HTMLDivElement>(ref, forwardedRef)}\n focused={props.focused}\n disabled={props.disabled}\n aria-label={props['aria-label']}\n $size={props.size ?? 'md'}\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n $inputPosition={props.inputPosition}\n $hasTimeZone={state.segments.some((segment) => segment.type === 'timeZoneName')}\n hasError={props.hasError}\n >\n {state.segments.map((segment, i) => (\n <DateSegment key={i} segment={segment} state={state} />\n ))}\n </InputBox>\n );\n});\n\nexport default DateField;\n","import {\n CalendarDate,\n type CalendarDateTime,\n type DateValue,\n parseAbsolute,\n toCalendarDateTime,\n toZoned,\n} from '@internationalized/date';\nimport type { DateRangePickerProps as DateRangePickerBase } from '@react-types/datepicker';\nimport type { AriaLabelingProps, RangeValue } from '@react-types/shared';\nimport { DateTime, Settings } from 'luxon';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n mergeProps,\n useButton,\n useDateRangePicker,\n useFocusWithin,\n usePress,\n VisuallyHidden,\n} from 'react-aria';\nimport { useDateRangePickerState } from 'react-stately';\nimport styled, { css } from 'styled-components';\n\nimport type { DateFilterPreset } from '@persona/design-system/lib/date-filter';\nimport { Spacing, Typography } from '@persona/design-tokens';\nimport { CircleXInverseIcon } from '@persona/icons';\n\nimport RangeCalendar from '#src/components/DatePicker/Calendar/RangeCalendar';\nimport DateField from '#src/components/DatePicker/DateField';\nimport { presetEnd } from '#src/components/DatePicker/time-range';\nimport { FormLabel } from '#src/components/FormControl';\nimport { ClearButton } from '#src/components/Input';\nimport Popover from '#src/components/Popover';\nimport { isDisabled } from '#src/lib/pseudoClass';\nimport type { InputSizes } from '#src/mixins/input';\n\nconst DateRangeContainer = styled.div`\n display: inline-flex;\n flex-direction: column;\n width: 100%;\n`;\n\nconst DateRangeInputs = styled.div<{ $wrapOnNarrow: boolean }>`\n display: flex;\n align-items: center;\n\n ${({ $wrapOnNarrow }) =>\n $wrapOnNarrow &&\n css`\n > div:first-child,\n > div:nth-child(2) {\n width: auto;\n flex: 1 0 auto;\n }\n\n /* Widest measured timezone field pair (556.5px) + 24px popover padding + 32px gutter, rounded up to the 4px grid. */\n @media (max-width: 616px) {\n flex-wrap: wrap;\n row-gap: ${Spacing[2]};\n\n > div:first-child,\n > div:nth-child(2) {\n border-radius: ${({ theme }) => theme.element.borderRadius};\n }\n\n > div:nth-child(2) {\n margin-left: 0;\n }\n }\n `}\n`;\n\nconst CustomFormLabel = styled(FormLabel)`\n margin-bottom: ${Spacing[2]};\n ${Typography.TextMediumBold};\n`;\n\nexport type DateRange = {\n startDate?: DateTime;\n endDate?: DateTime;\n};\n\nexport type DateFilterChange =\n | {\n source: 'preset';\n preset: DateFilterPreset;\n range: RangeValue<DateValue>;\n }\n | {\n source: 'calendar';\n range: RangeValue<DateValue> | null;\n }\n | {\n source: 'clear';\n };\n\n/**\n * `onChange` fires for controlled prop replay as well as user edits, so only the\n * code path that started a write can say what that write meant.\n */\ntype WriteOrigin =\n | { kind: 'interaction' }\n | { kind: 'sync' }\n | { kind: 'clear' }\n | { kind: 'preset'; preset: DateFilterPreset };\n\nexport interface DateRangePickerProps extends DateRangePickerBase<DateValue>, AriaLabelingProps {\n dateRange: DateRange;\n onChange: (range: RangeValue<DateValue> | null) => void;\n disabled?: boolean;\n size?: InputSizes;\n minDate?: DateValue;\n maxDate?: DateValue;\n label?: string | null;\n dataTest?: string;\n id?: string;\n hidePresets?: boolean;\n visibleMonths?: 1 | 2;\n className?: string;\n /**\n * Whether or not to display clear button\n */\n showClear?: boolean;\n /**\n * Called when the clear button is clicked/pressed\n */\n onClear?: () => void;\n /**\n * Additive notification of genuine user interactions. Never fires for\n * controlled prop synchronization. `onChange` is unaffected by this prop.\n */\n onDateFilterChange?: (change: DateFilterChange) => void;\n /** `undefined` infers from dates, `null` selects none, and an id selects that preset. */\n selectedPreset?: DateFilterPreset | null;\n /**\n * z-index of the calendar popover\n */\n calendarZIndex?: number;\n /**\n * Element that should contain the calendar portal.\n */\n portalContainer?: HTMLElement | null;\n}\n\nconst OpenButton = ({ onOpen, disabled }: { onOpen: () => void; disabled?: boolean }) => {\n const openCalBtnRef = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n isDisabled: disabled,\n onPress: onOpen,\n },\n openCalBtnRef,\n );\n\n return (\n <button\n {...buttonProps}\n type='button'\n ref={openCalBtnRef}\n aria-label='Open calendar'\n tabIndex={-1}\n />\n );\n};\n\nconst ClearRangeButton = styled(ClearButton)`\n height: 16px;\n width: 16px;\n margin-left: ${Spacing[2]};\n\n &${isDisabled}, &:disabled {\n background-color: transparent;\n }\n`;\n\nconst DateRangePicker = ({\n granularity = 'day',\n hideTimeZone = true,\n className,\n calendarZIndex,\n portalContainer,\n onDateFilterChange,\n selectedPreset,\n ...props\n}: DateRangePickerProps) => {\n const wrapOnNarrow = granularity !== 'day' && !hideTimeZone;\n const writeOriginRef = useRef<WriteOrigin>({ kind: 'interaction' });\n const writeWithOrigin = useCallback((origin: WriteOrigin, commit: () => void) => {\n writeOriginRef.current = origin;\n try {\n commit();\n } finally {\n writeOriginRef.current = { kind: 'interaction' };\n }\n }, []);\n\n const state = useDateRangePickerState({\n granularity,\n hideTimeZone,\n ...props,\n onChange: (range) => {\n props.onChange(range);\n\n const origin = writeOriginRef.current;\n if (origin.kind === 'sync' || origin.kind === 'clear') {\n return;\n }\n if (origin.kind === 'preset' && range) {\n onDateFilterChange?.({ source: 'preset', preset: origin.preset, range });\n return;\n }\n onDateFilterChange?.({ source: 'calendar', range });\n },\n });\n const ref = useRef<HTMLDivElement>(null);\n const startFieldRef = useRef<HTMLDivElement>(null);\n const endFieldRef = useRef<HTMLDivElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n const [dateMode, setDateMode] = useState<'start' | 'end' | null>(null);\n // A ref, not state: focus can return to a field before a state update would commit.\n const isClosingRef = useRef(false);\n const { groupProps, startFieldProps, endFieldProps, calendarProps, labelProps } =\n useDateRangePicker({ granularity, hideTimeZone, ...props }, state, ref);\n\n const focusCalendar = useCallback(() => {\n requestAnimationFrame(() => {\n const firstFocusableCalendarElement = calendarRef.current?.querySelector<HTMLElement>(\n '[role=\"menuitem\"], button:not(:disabled), [tabindex=\"0\"]',\n );\n firstFocusableCalendarElement?.focus();\n });\n }, []);\n\n const openCalendar = useCallback(() => {\n if (!props.disabled && !state.isOpen && !isClosingRef.current) {\n state.setOpen(true);\n }\n }, [props.disabled, state]);\n\n const openCalendarWithFocus = useCallback(() => {\n openCalendar();\n focusCalendar();\n }, [focusCalendar, openCalendar]);\n\n const handlePresetSelect = useCallback(\n (preset: DateFilterPreset, commit: () => void) =>\n writeWithOrigin({ kind: 'preset', preset }, commit),\n [writeWithOrigin],\n );\n\n // Keyed on instants rather than the `DateTime` identities: a caller that parses\n // its range during render hands us new objects every commit, and syncing on that\n // would call `setValue` -> `onChange` -> re-render without end.\n const startInstant = props.dateRange.startDate?.isValid\n ? props.dateRange.startDate.toMillis()\n : undefined;\n const endInstant = props.dateRange.endDate?.isValid\n ? props.dateRange.endDate.toMillis()\n : undefined;\n\n useEffect(() => {\n // If not set, return early\n if (startInstant == null || endInstant == null) {\n return;\n }\n\n // Find out the real time by adjusting the date to the user's timezone\n const startDate = DateTime.fromMillis(startInstant).setZone(Settings.defaultZone);\n const endDate = DateTime.fromMillis(endInstant).setZone(Settings.defaultZone);\n\n if (!startDate.isValid || !endDate.isValid) {\n return;\n }\n\n // Months are 1-indexed, no translations need to happen to CalendarDates\n const startCalendar = state.hasTime\n ? parseAbsolute(startDate.toISO(), Settings.defaultZone.name)\n : new CalendarDate(startDate.year, startDate.month, startDate.day);\n const endCalendar = state.hasTime\n ? parseAbsolute(endDate.toISO(), Settings.defaultZone.name)\n : new CalendarDate(endDate.year, endDate.month, endDate.day);\n\n const dateRangeV2: RangeValue<DateValue> = {\n start: startCalendar,\n end: endCalendar,\n };\n\n writeWithOrigin({ kind: 'sync' }, () => state.setValue(dateRangeV2));\n }, [startInstant, endInstant, granularity]);\n\n // Auto-close overlay when a complete range is selected (e.g., from presets with time enabled)\n const prevValueRef = useRef<RangeValue<DateValue | null> | null>(state.value);\n // The first calendar click in time mode seeds a distinct end, which must not read as a finished range.\n const skipAutoCloseRef = useRef(false);\n useEffect(() => {\n const prevValue = prevValueRef.current;\n const currentValue = state.value;\n\n // Update ref for next comparison\n prevValueRef.current = currentValue;\n\n if (skipAutoCloseRef.current) {\n skipAutoCloseRef.current = false;\n return;\n }\n\n // Close overlay only if BOTH start and end changed simultaneously to DIFFERENT dates (e.g., preset selection)\n // Do not close during manual date selection where:\n // 1. Only one date changes at a time, OR\n // 2. Both dates are set to the same value (initial selection from empty state)\n // Use value comparison (.compare) instead of object identity to handle controlled component re-renders\n const startChanged =\n prevValue?.start && currentValue?.start\n ? prevValue.start.compare(currentValue.start) !== 0\n : prevValue?.start !== currentValue?.start;\n const endChanged =\n prevValue?.end && currentValue?.end\n ? prevValue.end.compare(currentValue.end) !== 0\n : prevValue?.end !== currentValue?.end;\n const datesAreDifferent =\n currentValue?.start &&\n currentValue?.end &&\n currentValue.start.compare(currentValue.end) !== 0;\n\n if (state.isOpen && startChanged && endChanged && datesAreDifferent) {\n state.setOpen(false);\n }\n }, [state.value, state.isOpen]);\n\n const { focusWithinProps: startFocusWithinProps } = useFocusWithin({\n onFocusWithin: () => {\n setDateMode('start');\n openCalendar();\n },\n });\n\n const { focusWithinProps: endFocusWithinProps } = useFocusWithin({\n onFocusWithin: () => {\n setDateMode('end');\n openCalendar();\n },\n });\n\n const { focusWithinProps: containerFocusProps } = useFocusWithin({\n onBlurWithin: () => {\n requestAnimationFrame(() => {\n // Wait for popover focus transitions to settle before closing.\n const activeElement = document.activeElement;\n const isFocusInDateRangeInput =\n activeElement instanceof Node && ref.current?.contains(activeElement);\n const isFocusInCalendar =\n activeElement instanceof Node && calendarRef.current?.contains(activeElement);\n\n if (isFocusInDateRangeInput || isFocusInCalendar) {\n return;\n }\n\n setDateMode(null);\n if (state.isOpen) {\n state.setOpen(false);\n }\n });\n },\n });\n\n const handleOutsideClick = (e: Event) => {\n const target = e.target as Node;\n // Don't close if clicking on the date inputs themselves\n if (ref.current?.contains(target)) {\n return;\n }\n\n // When there's a click outside of the containers + calendars, reset the highlighted date\n // Only close the calendar if it's open\n // Note: Radix UI's onInteractOutside already ensures the interaction is outside the popover content\n if (state.isOpen) {\n setDateMode(null);\n state.setOpen(false);\n }\n };\n\n const { pressProps: pressClearProps } = usePress({\n onPress: () => {\n writeWithOrigin({ kind: 'clear' }, () => state.setValue(null));\n\n if (props.onClear) {\n props.onClear();\n }\n onDateFilterChange?.({ source: 'clear' });\n },\n });\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault(); // Prevent form submission\n openCalendarWithFocus();\n }\n },\n [openCalendarWithFocus],\n );\n\n const isValueNull = state.value && state.value.start == null && state.value.end == null;\n\n return (\n <DateRangeContainer data-test={props.dataTest} className={className}>\n {props.label && <CustomFormLabel {...labelProps}>{props.label}</CustomFormLabel>}\n <Popover\n open={state.isOpen}\n modal={false}\n portalProps={portalContainer ? { container: portalContainer } : undefined}\n contentProps={{\n align: 'start',\n 'aria-modal': true,\n 'aria-label': props['aria-label'] ?? undefined,\n onInteractOutside: handleOutsideClick,\n onOpenAutoFocus: (e: Event) => {\n // Field focus opens the calendar for editing, while Enter/Open calendar moves focus inside.\n e.preventDefault();\n },\n onEscapeKeyDown: () => {\n state.setOpen(false);\n // Restore focus to the date field for keyboard users\n if (dateMode) {\n const fieldRef = dateMode === 'start' ? startFieldRef : endFieldRef;\n const seg = fieldRef.current?.querySelector('[tabindex=\"0\"]');\n if (seg instanceof HTMLElement) {\n seg.focus();\n }\n }\n },\n onCloseAutoFocus: (e: Event) => {\n // Prevent Radix's default focus restoration — Escape handles its own above.\n e.preventDefault();\n isClosingRef.current = true;\n requestAnimationFrame(() => {\n isClosingRef.current = false;\n });\n },\n noPadding: true,\n style: { zIndex: calendarZIndex },\n zIndex: calendarZIndex,\n }}\n >\n <Popover.Trigger asChild>\n <DateRangeInputs\n {...mergeProps(groupProps, containerFocusProps)}\n ref={ref}\n $wrapOnNarrow={wrapOnNarrow}\n >\n {/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */}\n <DateField\n ref={startFieldRef}\n inputPosition='start'\n focused={dateMode === 'start'}\n disabled={props.disabled}\n size={props.size}\n {...mergeProps(startFieldProps, startFocusWithinProps, { onKeyDown: handleKeyDown })}\n />\n {/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */}\n <DateField\n ref={endFieldRef}\n inputPosition='end'\n focused={dateMode === 'end'}\n disabled={props.disabled}\n size={props.size}\n {...mergeProps(endFieldProps, endFocusWithinProps, { onKeyDown: handleKeyDown })}\n />\n {props.showClear && (\n <ClearRangeButton\n {...pressClearProps}\n type='button'\n disabled={isValueNull}\n aria-label='Clear date range'\n >\n <CircleXInverseIcon />\n </ClearRangeButton>\n )}\n <VisuallyHidden>\n <OpenButton onOpen={openCalendarWithFocus} disabled={props.disabled} />\n </VisuallyHidden>\n </DateRangeInputs>\n </Popover.Trigger>\n <RangeCalendar\n {...{ ...calendarProps, autoFocus: undefined }}\n calendarRef={calendarRef}\n setDateMode={setDateMode}\n setValue={state.setValue}\n granularity={granularity}\n hidePresets={props.hidePresets}\n visibleMonths={props.visibleMonths}\n onPresetSelect={handlePresetSelect}\n selectedPreset={selectedPreset}\n onSelectDate={(dateVal) => {\n const capToMax = <T extends DateValue>(end: T): T => {\n if (!state.hasTime || !props.maxDate) {\n return end;\n }\n const max =\n 'hour' in props.maxDate\n ? toCalendarDateTime(props.maxDate)\n : toCalendarDateTime(props.maxDate).set({\n hour: 23,\n minute: 59,\n second: 59,\n millisecond: 999,\n });\n if (toCalendarDateTime(end).compare(max) <= 0) {\n return end;\n }\n return end.set({\n year: max.year,\n month: max.month,\n day: max.day,\n hour: max.hour,\n minute: max.minute,\n second: max.second,\n millisecond: max.millisecond,\n }) as T;\n };\n /**\n * Please use caution when editing the logic below.\n * It is specific to react-aria's date picker and can be brittle.\n */\n if (dateVal) {\n const calendarDate = state.hasTime ? toCalendarDateTime(dateVal) : dateVal;\n const date = state.hasTime\n ? toZoned(calendarDate as CalendarDateTime, Settings.defaultZone.name)\n : calendarDate;\n const seededEnd = state.hasTime\n ? presetEnd(calendarDate as CalendarDateTime)\n : calendarDate;\n const emptyRangeEndValue =\n seededEnd.compare(calendarDate) < 0\n ? (calendarDate as CalendarDateTime).set({\n hour: 23,\n minute: 59,\n second: 59,\n millisecond: 999,\n })\n : seededEnd;\n const emptyRangeEnd = capToMax(\n state.hasTime\n ? toZoned(emptyRangeEndValue as CalendarDateTime, Settings.defaultZone.name)\n : emptyRangeEndValue,\n );\n // Typed endpoints are unzoned; zone them so both fields render the timezone segment.\n const toViewerZone = (value: DateValue | null) =>\n state.hasTime && value ? toZoned(value, Settings.defaultZone.name) : value;\n const start = toViewerZone(state.value.start);\n const end = toViewerZone(state.value.end);\n\n if (dateMode === 'start') {\n // Handle a case where we've deleted both dates\n if (end == null && start == null) {\n skipAutoCloseRef.current = true;\n state.setValue({\n start: date,\n end: emptyRangeEnd,\n });\n }\n // If end becomes the start\n else if (end && date.compare(end) > 0) {\n state.setValue({\n start: end,\n end: capToMax(end.set(dateVal)), // Preserve time\n });\n } else {\n state.setValue({\n // if start is not set, set it to the date or date + time value, otherwise set the dateVal to preserve time\n start: start == null ? date : start.set(dateVal),\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n\n end,\n });\n }\n setDateMode('end');\n } else {\n // Handle a case where we've deleted both dates\n if (end == null && start == null) {\n state.setValue({\n start: date,\n end: emptyRangeEnd,\n });\n }\n // If start becomes the end\n else if (start && date.compare(start) < 0) {\n state.setValue({\n start: start.set(dateVal),\n end: start,\n });\n } else {\n state.setValue({\n /* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\n start,\n // if end is not set, set it to the date or date + time value, otherwise set the dateVal to preserve time\n end: capToMax(end == null ? date : end.set(dateVal)),\n });\n }\n // Close popover and keep focus on end field\n state.setOpen(false);\n }\n }\n }}\n minDate={props.minDate}\n maxDate={props.maxDate}\n />\n </Popover>\n </DateRangeContainer>\n );\n};\n\nexport default DateRangePicker;\n","import type { Ref } from 'react';\nimport { type AriaCalendarProps, type DateValue, useCalendar, useLocale } from 'react-aria';\nimport { useCalendarState } from 'react-stately';\n\nimport { ArrowLeftIcon, ArrowRightIcon } from '@persona/icons';\n\nimport {\n CalendarButton,\n CalendarContainer,\n CalendarHeader,\n CalendarHeading,\n} from '#src/components/DatePicker/Calendar/CalendarBase';\nimport CalendarGrid from '#src/components/DatePicker/Calendar/CalendarGrid';\nimport { createCalendar } from '#src/components/DatePicker/common';\n\ninterface CalendarProps extends AriaCalendarProps<DateValue> {\n calendarRef?: Ref<HTMLDivElement>;\n}\n\nconst Calendar = (props: CalendarProps) => {\n const { locale } = useLocale();\n const state = useCalendarState({ ...props, locale, createCalendar });\n const { calendarProps, prevButtonProps, nextButtonProps, title } = useCalendar(props, state);\n\n return (\n <CalendarContainer {...calendarProps} ref={props.calendarRef}>\n <CalendarHeader>\n <CalendarButton {...prevButtonProps}>\n <ArrowLeftIcon />\n </CalendarButton>\n <CalendarHeading>{title}</CalendarHeading>\n <CalendarButton {...nextButtonProps}>\n <ArrowRightIcon />\n </CalendarButton>\n </CalendarHeader>\n <CalendarGrid state={state} />\n </CalendarContainer>\n );\n};\n\nexport default Calendar;\n","import type { DateValue } from '@internationalized/date';\nimport type { DatePickerProps as DatePickerBase } from '@react-types/datepicker';\nimport { type RefObject, useCallback, useRef } from 'react';\nimport { mergeProps, useButton, useDatePicker, useFocusWithin, VisuallyHidden } from 'react-aria';\nimport { useDatePickerState } from 'react-stately';\n\nimport Calendar from '#src/components/DatePicker/Calendar/Calendar';\nimport DateField from '#src/components/DatePicker/DateField';\nimport Popover from '#src/components/Popover';\nimport { Z_INDICES } from '#src/lib/zindex';\nimport type { InputSizes } from '#src/mixins/input';\n\nexport interface DatePickerProps extends DatePickerBase<DateValue> {\n id?: string;\n dateFieldProps?: {\n style?: React.CSSProperties;\n };\n disabled?: boolean;\n size?: InputSizes;\n useModalZIndex?: boolean;\n}\n\nconst OpenButton = ({ calendarRef }: { calendarRef: RefObject<HTMLElement> }) => {\n const openCalBtnRef = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress: () => {\n if (calendarRef.current) {\n (\n calendarRef.current.querySelector('button[aria-label=\"Previous\"]') as HTMLButtonElement\n ).focus();\n }\n },\n },\n openCalBtnRef,\n );\n\n return <button {...buttonProps} ref={openCalBtnRef} aria-label='Open calendar' />;\n};\n\nexport const DatePicker = (props: DatePickerProps) => {\n const state = useDatePickerState(props);\n const ref = useRef<HTMLDivElement>(null);\n const fieldRef = useRef<HTMLDivElement>(null);\n const { groupProps, fieldProps, calendarProps } = useDatePicker(props, state, ref);\n const calendarRef = useRef<HTMLDivElement>(null);\n // A ref, not state: the close sequence focuses the field before a state update would commit.\n const isClosingRef = useRef(false);\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin: () => {\n if (!state.isOpen && !isClosingRef.current) {\n state.setOpen(true);\n }\n },\n onBlurWithin: (e) => {\n // Close calendar if next target is not within the calendar\n if (e.relatedTarget && !calendarRef?.current?.contains(e.relatedTarget) && state.isOpen) {\n state.setOpen(false);\n }\n },\n });\n\n const handleOutsideClick = (e: Event) => {\n const target = e.target as Node;\n // Don't close if clicking on the date input itself\n if (ref.current?.contains(target)) {\n return;\n }\n if (state.isOpen) {\n state.setOpen(false);\n }\n };\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' && !state.isOpen) {\n event.preventDefault();\n state.setOpen(true);\n }\n },\n [state],\n );\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <Popover\n open={state.isOpen}\n modal={false}\n contentProps={{\n style: { zIndex: props.useModalZIndex ? Z_INDICES.modalDropdown : Z_INDICES.dropdown },\n align: 'start',\n 'aria-modal': true,\n onInteractOutside: handleOutsideClick,\n onEscapeKeyDown: () => {\n state.setOpen(false);\n },\n onCloseAutoFocus: (e: Event) => {\n // Prevent Radix's default focus restoration\n e.preventDefault();\n isClosingRef.current = true;\n\n // Manually restore focus to the date field\n if (fieldRef.current) {\n const firstEditableSegment = fieldRef.current.querySelector('[tabindex=\"0\"]');\n if (firstEditableSegment instanceof HTMLElement) {\n firstEditableSegment.focus();\n }\n }\n\n // Reset flag after focus is done\n requestAnimationFrame(() => {\n isClosingRef.current = false;\n });\n },\n noPadding: true,\n }}\n >\n <Popover.Trigger asChild>\n <div\n {...mergeProps(groupProps, focusWithinProps)}\n ref={ref}\n style={{ display: 'flex', position: 'relative' }}\n >\n <DateField\n ref={fieldRef}\n id={props.id}\n dateFieldProps={props.dateFieldProps}\n disabled={props.disabled}\n size={props.size}\n {...mergeProps(fieldProps, { onKeyDown: handleKeyDown })}\n value={fieldProps.value ?? undefined}\n />\n <VisuallyHidden>\n <OpenButton calendarRef={calendarRef} />\n </VisuallyHidden>\n </div>\n </Popover.Trigger>\n <Calendar\n {...{ ...calendarProps, autoFocus: undefined }}\n calendarRef={calendarRef}\n id='calendar-popover'\n />\n </Popover>\n </div>\n );\n};\n\nexport default DatePicker;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu-c8XK2Lr4.mjs","names":[],"sources":["../src/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import * as Primitive from '@radix-ui/react-dropdown-menu';\nimport type { Property } from 'csstype';\nimport {\n Children,\n type ComponentPropsWithoutRef,\n type ComponentPropsWithRef,\n type ElementType,\n type FC,\n forwardRef,\n type FunctionComponentElement,\n type Ref,\n} from 'react';\nimport styled from 'styled-components';\n\nimport Menu, {\n MenuDivider,\n MenuHeading,\n MenuItem,\n type MenuItemProps,\n} from '#src/components/Menu/Menu';\nimport { letPointerDownReachDocument } from '#src/lib/letPointerDownReachDocument';\nimport { Z_INDICES } from '#src/lib/zindex';\nimport { BASE } from '#src/variables/spacing';\n\nconst DropdownMenuContent = styled(Primitive.Content)<{ $zIndex?: Property.ZIndex }>`\n z-index: ${({ $zIndex }) => $zIndex || Z_INDICES.tooltip};\n`;\n\nexport interface DropdownMenuProps\n extends Primitive.DropdownMenuProps, Pick<Primitive.DropdownMenuContentProps, 'side' | 'align'> {\n id?: string;\n className?: string;\n\n trigger: FunctionComponentElement<any>;\n\n /**\n * Props passed to internal DropdownMenu.Content component.\n */\n contentProps?: Primitive.DropdownMenuContentProps;\n\n /**\n * Props passed to internal DropdownMenu.Trigger component.\n */\n triggerProps?: Primitive.DropdownMenuTriggerProps;\n\n /**\n * Props passed to internal DropdownMenu.Portal component.\n */\n portalProps?: Primitive.DropdownMenuPortalProps;\n\n /**\n * Whether or not to wrap menu with DropdownMenu.Portal component.\n */\n portal?: boolean;\n\n /**\n * Whether or not clicks render menu items.\n */\n disabled?: boolean;\n\n zIndex?: Property.ZIndex;\n}\n\nexport const DropdownMenu = ({\n trigger,\n children,\n side,\n align = 'end',\n contentProps,\n triggerProps,\n portalProps,\n className,\n portal = false, // Default to false for old behavior\n modal = false,\n disabled = false,\n zIndex,\n ...props\n}: DropdownMenuProps) => {\n if (Children.count(children) === 0) {\n return null;\n }\n\n const content = disabled ? null : (\n <DropdownMenuContent\n sideOffset={BASE}\n collisionPadding={BASE}\n align={align}\n side={side}\n $zIndex={zIndex}\n {...contentProps}\n onPointerDownCapture={(event) => {\n contentProps?.onPointerDownCapture?.(event);\n letPointerDownReachDocument(event);\n }}\n >\n <Menu className={className} doNotSetRole>\n {children}\n </Menu>\n </DropdownMenuContent>\n );\n\n return (\n <Primitive.Root modal={modal} {...props}>\n <Primitive.Trigger asChild {...triggerProps}>\n {trigger}\n </Primitive.Trigger>\n\n {portal ? <Primitive.Portal {...portalProps}>{content}</Primitive.Portal> : content}\n </Primitive.Root>\n );\n};\n\ninterface DropdownMenuItemProps<T extends ElementType = 'div'>\n extends MenuItemProps<T>, Omit<Primitive.DropdownMenuItemProps, 'asChild' | 'children'> {}\n\ninterface DropdownMenuItemType<T extends ElementType = 'div'> extends FC<\n DropdownMenuItemProps<T> & ComponentPropsWithRef<T>\n> {\n <T extends ElementType = 'div'>(\n props: DropdownMenuItemProps<T> & ComponentPropsWithoutRef<T>,\n ): ReturnType<FC<DropdownMenuItemProps<T> & ComponentPropsWithoutRef<T>>>;\n}\n\n/* @ts-expect-error [strict-migration] The following line is not strict; please fix! */\nconst DropdownMenuItem: DropdownMenuItemType = forwardRef(function DropdownMenuItem(\n { children, disabled, ...props },\n ref: Ref<HTMLDivElement>,\n) {\n return (\n <Primitive.Item asChild disabled={disabled} {...props}>\n <MenuItem disabled={disabled} ref={ref}>\n {children}\n </MenuItem>\n </Primitive.Item>\n );\n});\n\nexport default Object.assign(DropdownMenu, {\n Item: DropdownMenuItem,\n Heading: MenuHeading,\n Divider: MenuDivider,\n});\n"],"mappings":";;;;;;;;;AAwBA,MAAM,sBAAsB,OAAO,UAAU,QAAQ;cACvC,EAAE,cAAc,WAAW,UAAU,QAAQ;;AAsC3D,MAAa,gBAAgB,EAC3B,SACA,UACA,MACA,QAAQ,OACR,cACA,cACA,aACA,WACA,SAAS,OACT,QAAQ,OACR,WAAW,OACX,QACA,GAAG,YACoB;AACvB,KAAI,SAAS,MAAM,SAAS,KAAK,EAC/B,QAAO;CAGT,MAAM,UAAU,WAAW,OACzB,oBAAC,qBAAD;EACE,YAAA;EACA,kBAAA;EACO;EACD;EACN,SAAS;EACT,GAAI;EACJ,uBAAuB,UAAU;AAC/B,iBAAc,uBAAuB,MAAM;AAC3C,+BAA4B,MAAM;;YAGpC,oBAAC,MAAD;GAAiB;GAAW,cAAA;GACzB;GACI,CAAA;EACa,CAAA;AAGxB,QACE,qBAAC,UAAU,MAAX;EAAuB;EAAO,GAAI;YAAlC,CACE,oBAAC,UAAU,SAAX;GAAmB,SAAA;GAAQ,GAAI;aAC5B;GACiB,CAAA,EAEnB,SAAS,oBAAC,UAAU,QAAX;GAAkB,GAAI;aAAc;GAA2B,CAAA,GAAG,QAC7D;;;AAgBrB,MAAM,mBAAyC,WAAW,SAAS,iBACjE,EAAE,UAAU,UAAU,GAAG,SACzB,KACA;AACA,QACE,oBAAC,UAAU,MAAX;EAAgB,SAAA;EAAkB;EAAU,GAAI;YAC9C,oBAAC,UAAD;GAAoB;GAAe;GAChC;GACQ,CAAA;EACI,CAAA;EAEnB;AAEF,IAAA,uBAAe,OAAO,OAAO,cAAc;CACzC,MAAM;CACN,SAAS;CACT,SAAS;CACV,CAAC"}
|