@persona/design-system 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +3 -3
- package/dist/{Action-CnNf5T-l.d.mts → Action-CcAyQpYN.d.mts} +3 -3
- package/dist/Action.d.mts +1 -1
- package/dist/AdvancedFilterRuleRow.d.mts +5 -5
- package/dist/AdvancedFilterRulesPopover.d.mts +4 -4
- package/dist/ArrayValueControl.d.mts +1 -1
- package/dist/Attribute.d.mts +5 -5
- package/dist/AttributeGrid.d.mts +1 -1
- package/dist/{Badge-BqS6Nk4J.mjs → Badge-BL0J5oMa.mjs} +3 -3
- package/dist/{Badge-BqS6Nk4J.mjs.map → Badge-BL0J5oMa.mjs.map} +1 -1
- package/dist/Banner.d.mts +1 -1
- package/dist/BooleanValueControl.d.mts +1 -1
- package/dist/BottomPanel.d.mts +32 -0
- package/dist/{Breadcrumb-DEwZFJHF.d.mts → Breadcrumb-Df06cTnA.d.mts} +1 -1
- package/dist/Breadcrumb.d.mts +1 -1
- package/dist/{Breadcrumbs-0e_3v9FF.d.mts → Breadcrumbs-D_Gzd4_J.d.mts} +2 -2
- package/dist/{Breadcrumbs-CqKtnZqu.mjs → Breadcrumbs-Zi5p0HDR.mjs} +12 -12
- package/dist/{Breadcrumbs-CqKtnZqu.mjs.map → Breadcrumbs-Zi5p0HDR.mjs.map} +1 -1
- package/dist/Breadcrumbs.d.mts +1 -1
- package/dist/{Button-C0F0F2IL.d.mts → Button-BrI1s2-r.d.mts} +4 -4
- package/dist/Button.d.mts +1 -1
- package/dist/ButtonGroup.d.mts +1 -1
- package/dist/{Calendar-BvLNcHQM.d.mts → Calendar-DjnoZVcT.d.mts} +2 -2
- package/dist/Calendar.d.mts +1 -1
- package/dist/CalendarBase.d.mts +1 -1
- package/dist/{Card-BMCB9eFC.mjs → Card-CKrJtn1f.mjs} +4 -4
- package/dist/{Card-BMCB9eFC.mjs.map → Card-CKrJtn1f.mjs.map} +1 -1
- package/dist/{Card-BxNoIQWw.d.mts → Card-mZDNFaJy.d.mts} +4 -4
- package/dist/Card.d.mts +1 -1
- package/dist/Card2.d.mts +3 -3
- package/dist/{CardV2-B0ZweQYk.mjs → CardV2-CXxzl1EZ.mjs} +20 -20
- package/dist/{CardV2-B0ZweQYk.mjs.map → CardV2-CXxzl1EZ.mjs.map} +1 -1
- package/dist/{Checkbox-Bm8exUfH.d.mts → Checkbox-CwPXPLCi.d.mts} +1 -1
- package/dist/{Checkbox-DAvbgZgO.mjs → Checkbox-DxNHp59y.mjs} +8 -8
- package/dist/{Checkbox-DAvbgZgO.mjs.map → Checkbox-DxNHp59y.mjs.map} +1 -1
- package/dist/Checkbox.d.mts +1 -1
- package/dist/CheckboxGroupField.d.mts +2 -2
- package/dist/ChoicesValueControl.d.mts +1 -1
- package/dist/{Combobox-xBrxiUAu.mjs → Combobox-BUtqtzKl.mjs} +22 -22
- package/dist/Combobox-BUtqtzKl.mjs.map +1 -0
- package/dist/{Combobox-C8ue0cBP.d.mts → Combobox-C9QBItsc.d.mts} +3 -3
- package/dist/Combobox.d.mts +2 -2
- package/dist/{ComboboxBase-DJGTMf1_.d.mts → ComboboxBase-BkSpdmsT.d.mts} +8 -8
- package/dist/ComboboxBase.d.mts +1 -1
- package/dist/{ComboboxMultiSelect-D7A2bbWU.d.mts → ComboboxMultiSelect-DkVfwSKH.d.mts} +2 -2
- package/dist/ComboboxMultiSelect.d.mts +1 -1
- package/dist/{ComboboxSingleSelect-D1uzEyKj.d.mts → ComboboxSingleSelect-CpumBcDn.d.mts} +4 -4
- package/dist/ComboboxSingleSelect.d.mts +1 -1
- package/dist/{CompactBar-DMuvqaV5.d.mts → CompactBar-COxu_FDd.d.mts} +3 -3
- package/dist/CompactBar.d.mts +1 -1
- package/dist/{ConfigFormGroup-D2_sajXe.mjs → ConfigFormGroup-aSdn2r6Z.mjs} +4 -4
- package/dist/{ConfigFormGroup-D2_sajXe.mjs.map → ConfigFormGroup-aSdn2r6Z.mjs.map} +1 -1
- package/dist/{ControlBar-Dg8JeU8f.d.mts → ControlBar-DwAhPcb5.d.mts} +12 -2
- package/dist/ControlBar.d.mts +1 -1
- package/dist/DataTable.d.mts +5 -4
- package/dist/{DateField-Com9f2-j.d.mts → DateField-tOyrGcx1.d.mts} +2 -2
- package/dist/DateField.d.mts +1 -1
- package/dist/{DatePicker-BGO6doLx.d.mts → DatePicker-Bs9JODNg.d.mts} +2 -2
- package/dist/{DatePicker-BlnE2MBD.mjs → DatePicker-CLP-ajza.mjs} +95 -23
- package/dist/DatePicker-CLP-ajza.mjs.map +1 -0
- package/dist/DatePicker.d.mts +1 -1
- package/dist/{DateRangePicker-DfRBm9z4.d.mts → DateRangePicker-BT6-j8V7.d.mts} +24 -4
- package/dist/DateRangePicker.d.mts +2 -2
- package/dist/DateRangeValueControl.d.mts +8 -4
- package/dist/DateValueControl.d.mts +1 -1
- package/dist/{DropdownButton-CpWNRUma.mjs → DropdownButton-CCAfNZ9h.mjs} +3 -3
- package/dist/{DropdownButton-CpWNRUma.mjs.map → DropdownButton-CCAfNZ9h.mjs.map} +1 -1
- package/dist/DropdownButton.d.mts +2 -2
- package/dist/{DropdownMenu-CnaK78rP.d.mts → DropdownMenu-BoatixlO.d.mts} +3 -3
- package/dist/{DropdownMenu-BCyV8nC0.mjs → DropdownMenu-CUnf420M.mjs} +4 -4
- package/dist/{DropdownMenu-BCyV8nC0.mjs.map → DropdownMenu-CUnf420M.mjs.map} +1 -1
- package/dist/DropdownMenu.d.mts +1 -1
- package/dist/{ErrorProps-CN2XjaOX.d.mts → ErrorProps-C9T857Wk.d.mts} +1 -1
- package/dist/ErrorProps.d.mts +1 -1
- package/dist/{FieldRegistry-DdA63Vnh.d.mts → FieldRegistry-D6niLExM.d.mts} +2 -2
- package/dist/FieldRegistry.d.mts +1 -1
- package/dist/{FilterBar-CxNsBVrn.d.mts → FilterBar-DfBV7yKM.d.mts} +10 -4
- package/dist/FilterBar.d.mts +1 -1
- package/dist/FilterPickerMenu.d.mts +3 -3
- package/dist/FilterPill.d.mts +1 -1
- package/dist/FilterPopover.d.mts +2 -2
- package/dist/FloatValueControl.d.mts +1 -1
- package/dist/FloatingPanel.d.mts +1 -1
- package/dist/FloatingPanelContext.d.mts +1 -1
- package/dist/{FormControl-Doj2gvF0.d.mts → FormControl-0H0Jeind.d.mts} +4 -4
- package/dist/{FormControl-HVzZEqJH.mjs → FormControl-1BmoYFCu.mjs} +6 -6
- package/dist/{FormControl-HVzZEqJH.mjs.map → FormControl-1BmoYFCu.mjs.map} +1 -1
- package/dist/FormControl.d.mts +1 -1
- package/dist/FormControlLabel.d.mts +2 -2
- package/dist/{FormField-D8dHbqZZ.d.mts → FormField-BcaFdmo5.d.mts} +2 -2
- package/dist/{FormField-B9P3BWvS.mjs → FormField-oBKH25qf.mjs} +22 -22
- package/dist/FormField-oBKH25qf.mjs.map +1 -0
- package/dist/FormField.d.mts +1 -1
- package/dist/Grid.d.mts +38 -0
- package/dist/GridItem.d.mts +17 -0
- package/dist/{Header-CBlB65NY.d.mts → Header-BjSoTEX_.d.mts} +2 -2
- package/dist/Header.d.mts +1 -1
- package/dist/{HelperTooltip-C28h1zFl.d.mts → HelperTooltip-S20wVFCS.d.mts} +3 -3
- package/dist/HelperTooltip.d.mts +1 -1
- package/dist/{HoverCopyableField-0Bzygbp9.mjs → HoverCopyableField-GMXeF-3J.mjs} +31 -20
- package/dist/HoverCopyableField-GMXeF-3J.mjs.map +1 -0
- package/dist/HoverCopyableField.d.mts +15 -4
- package/dist/{IconButton-BfDlic2K.mjs → IconButton-BgL3QUVO.mjs} +9 -9
- package/dist/{IconButton-BfDlic2K.mjs.map → IconButton-BgL3QUVO.mjs.map} +1 -1
- package/dist/{IconButton-CBcW7ZU8.d.mts → IconButton-BpyOr8Ev.d.mts} +2 -2
- package/dist/IconButton.d.mts +1 -1
- package/dist/ImageTile.d.mts +2 -2
- package/dist/InlineCombobox.d.mts +2 -2
- package/dist/InlineInput.d.mts +1 -1
- package/dist/{Input-Bimw8KFj.mjs → Input-BWlvBYB3.mjs} +6 -6
- package/dist/{Input-Bimw8KFj.mjs.map → Input-BWlvBYB3.mjs.map} +1 -1
- package/dist/{Input-CVdjkX88.d.mts → Input-qlQVD5h0.d.mts} +5 -5
- package/dist/Input.d.mts +1 -1
- package/dist/{InputProps-BwKkmImn.d.mts → InputProps-D_7MnQfE.d.mts} +2 -2
- package/dist/InputProps.d.mts +1 -1
- package/dist/IntegerValueControl.d.mts +1 -1
- package/dist/LayoutLoadingSpinner.d.mts +11 -0
- package/dist/Link.d.mts +3 -3
- package/dist/{ListBox-DKZpGYjo.mjs → ListBox-9jHHEaqW.mjs} +15 -15
- package/dist/{ListBox-DKZpGYjo.mjs.map → ListBox-9jHHEaqW.mjs.map} +1 -1
- package/dist/{ListBox-CDl5oZPX.d.mts → ListBox-ZE3MYMt6.d.mts} +5 -5
- package/dist/ListBox.d.mts +1 -1
- package/dist/ListBoxField.d.mts +3 -3
- package/dist/{LoadingShimmer-DC2vqicd.mjs → LoadingShimmer-a2Hv0kAq.mjs} +2 -2
- package/dist/{LoadingShimmer-DC2vqicd.mjs.map → LoadingShimmer-a2Hv0kAq.mjs.map} +1 -1
- package/dist/LoadingShimmer.d.mts +2 -2
- package/dist/{LogicRow-CkbyvrUw.d.mts → LogicRow-CbMmaWXU.d.mts} +4 -4
- package/dist/LogicRow.d.mts +1 -1
- package/dist/MaskedInput.d.mts +2 -2
- package/dist/MatchHighlight.d.mts +1 -1
- package/dist/{Menu-Dir03WA9.mjs → Menu-38UCGcte.mjs} +6 -6
- package/dist/{Menu-Dir03WA9.mjs.map → Menu-38UCGcte.mjs.map} +1 -1
- package/dist/{Menu-CYRdEnfo.d.mts → Menu-ZShdhNd7.d.mts} +4 -4
- package/dist/Menu.d.mts +1 -1
- package/dist/{MiddleTruncatedText-GXI-CPvs.mjs → MiddleTruncatedText-DnF7F_1D.mjs} +4 -4
- package/dist/{MiddleTruncatedText-GXI-CPvs.mjs.map → MiddleTruncatedText-DnF7F_1D.mjs.map} +1 -1
- package/dist/Modal.d.mts +4 -5
- package/dist/{PageHeader-C2IUKhCg.mjs → PageHeader-B2-Slzhl.mjs} +4 -4
- package/dist/{PageHeader-C2IUKhCg.mjs.map → PageHeader-B2-Slzhl.mjs.map} +1 -1
- package/dist/PageHeader.d.mts +2 -2
- package/dist/PageLayout.d.mts +1 -1
- package/dist/{PageSelector-vay4jpMp.d.mts → PageSelector-BcZx4nqe.d.mts} +3 -3
- package/dist/PageSelector.d.mts +1 -1
- package/dist/{Pagination-0VhVdXv0.mjs → Pagination-CtUz0gdA.mjs} +8 -8
- package/dist/{Pagination-0VhVdXv0.mjs.map → Pagination-CtUz0gdA.mjs.map} +1 -1
- package/dist/{Pagination-ygLutOst.d.mts → Pagination-j4hF7GOk.d.mts} +2 -2
- package/dist/Pagination.d.mts +1 -1
- package/dist/{Pii-C7pA72Bh.mjs → Pii-RwKn-K84.mjs} +2 -2
- package/dist/{Pii-C7pA72Bh.mjs.map → Pii-RwKn-K84.mjs.map} +1 -1
- package/dist/Pii.d.mts +1 -1
- package/dist/PillShell.d.mts +1 -1
- package/dist/{Popover-BkDpDdaO.mjs → Popover-DlXyKYL5.mjs} +6 -6
- package/dist/{Popover-BkDpDdaO.mjs.map → Popover-DlXyKYL5.mjs.map} +1 -1
- package/dist/Popover.d.mts +1 -1
- package/dist/ProgressBar.d.mts +1 -1
- package/dist/ProgressIndicator.d.mts +6 -4
- package/dist/{PseudoClassProps-CcSlKNev.d.mts → PseudoClassProps-BPdn-ofQ.d.mts} +1 -1
- package/dist/PseudoClassProps.d.mts +1 -1
- package/dist/{Radio-BaFutxgV.mjs → Radio-cLL9oatf.mjs} +5 -5
- package/dist/{Radio-BaFutxgV.mjs.map → Radio-cLL9oatf.mjs.map} +1 -1
- package/dist/{RadioGroup-ClMzOZl0.mjs → RadioGroup-BGo_kXKh.mjs} +4 -4
- package/dist/{RadioGroup-ClMzOZl0.mjs.map → RadioGroup-BGo_kXKh.mjs.map} +1 -1
- package/dist/{RadioGroup-BuJaitgG.d.mts → RadioGroup-BqULCH-D.d.mts} +1 -1
- package/dist/RadioGroup.d.mts +1 -1
- package/dist/RangeCalendar.d.mts +6 -1
- package/dist/RangeCalendarPresets.d.mts +13 -3
- package/dist/ResizableVerticalPanel.d.mts +22 -0
- package/dist/ResizeHandle.d.mts +19 -0
- package/dist/RightPanel.d.mts +41 -0
- package/dist/RightPanelLoadingContent.d.mts +7 -0
- package/dist/RightPanelResizeHandle.d.mts +14 -0
- package/dist/RuleEditorFields.d.mts +5 -5
- package/dist/RulesPill.d.mts +1 -1
- package/dist/{SearchInput-Ca3_np5e.d.mts → SearchInput-Dc90GLTF.d.mts} +3 -3
- package/dist/SearchInput.d.mts +1 -1
- package/dist/SectionHeading.d.mts +1 -1
- package/dist/{SegmentedControl-DgyJL4uN.mjs → SegmentedControl-CvWJGhwy.mjs} +5 -5
- package/dist/{SegmentedControl-DgyJL4uN.mjs.map → SegmentedControl-CvWJGhwy.mjs.map} +1 -1
- package/dist/{SegmentedControl-_I4sWeD7.d.mts → SegmentedControl-Db78Pzo_.d.mts} +2 -2
- package/dist/SegmentedControl.d.mts +1 -1
- package/dist/{Select-D6MqSYVa.mjs → Select-U_vQhK1A.mjs} +12 -13
- package/dist/Select-U_vQhK1A.mjs.map +1 -0
- package/dist/{Select-vwXGlHuW.d.mts → Select-bafAe2wd.d.mts} +4 -4
- package/dist/Select.d.mts +1 -1
- package/dist/Slider.d.mts +1 -1
- package/dist/SliderRHF.d.mts +1 -1
- package/dist/SliderThumb.d.mts +1 -1
- package/dist/{Spacer-CJp0lwkL.mjs → Spacer-BsK8tTwA.mjs} +2 -2
- package/dist/{Spacer-CJp0lwkL.mjs.map → Spacer-BsK8tTwA.mjs.map} +1 -1
- package/dist/{Spinner-BgBCCHGo.mjs → Spinner-BTyc6glU.mjs} +3 -3
- package/dist/{Spinner-BgBCCHGo.mjs.map → Spinner-BTyc6glU.mjs.map} +1 -1
- package/dist/{Stack-Bl54WmhY.mjs → Stack-Bre2oiov.mjs} +2 -2
- package/dist/{Stack-Bl54WmhY.mjs.map → Stack-Bre2oiov.mjs.map} +1 -1
- package/dist/{Stack-CkV7k7TE.d.mts → Stack-_JcvIE31.d.mts} +2 -2
- package/dist/Stack.d.mts +1 -1
- package/dist/StatusIndicator.d.mts +1 -1
- package/dist/{Sticker-xtDMuOoN.mjs → Sticker-CQ6sOKUj.mjs} +6 -6
- package/dist/{Sticker-xtDMuOoN.mjs.map → Sticker-CQ6sOKUj.mjs.map} +1 -1
- package/dist/{Sticker-Dhx2wqTL.d.mts → Sticker-OKVOQt_C.d.mts} +6 -6
- package/dist/Sticker.d.mts +1 -1
- package/dist/StringValueControl.d.mts +1 -1
- package/dist/SwatchPicker.d.mts +1 -1
- package/dist/Tab.d.mts +3 -3
- package/dist/{TabBar-D6UocZXi.mjs → TabBar-B5NtgtgC.mjs} +7 -7
- package/dist/{TabBar-D6UocZXi.mjs.map → TabBar-B5NtgtgC.mjs.map} +1 -1
- package/dist/TabBarIconButton.d.mts +2 -2
- package/dist/{Table-cO7ZwGPM.d.mts → Table-BcAgCIWq.d.mts} +1 -1
- package/dist/{Table-D1WyUQuv.mjs → Table-DfUD3I2s.mjs} +8 -8
- package/dist/{Table-D1WyUQuv.mjs.map → Table-DfUD3I2s.mjs.map} +1 -1
- package/dist/Table.d.mts +1 -1
- package/dist/{TableBody-CirMgfAV.d.mts → TableBody-D-RDBun9.d.mts} +1 -1
- package/dist/TableBody.d.mts +1 -1
- package/dist/{TableBox-C5qWhr82.mjs → TableBox-0GvWjRln.mjs} +27 -21
- package/dist/{TableBox-C5qWhr82.mjs.map → TableBox-0GvWjRln.mjs.map} +1 -1
- package/dist/TableBox.d.mts +2 -2
- package/dist/{TableBoxCell-DmVX_tgn.d.mts → TableBoxCell-WXc57DwN.d.mts} +12 -9
- package/dist/TableBoxCell.d.mts +1 -1
- package/dist/TableBoxField.d.mts +4 -4
- package/dist/{TableBoxRow-nwq41Bpi.d.mts → TableBoxRow-BQz0a9vr.d.mts} +4 -4
- package/dist/TableBoxRow.d.mts +1 -1
- package/dist/{TableBoxRowActions-B4_ojiQo.d.mts → TableBoxRowActions-DfewtLrn.d.mts} +2 -2
- package/dist/TableBoxRowActions.d.mts +1 -1
- package/dist/TableCell.d.mts +1 -1
- package/dist/{TableControls-RwIPBxyU.d.mts → TableControls-C26vGkWZ.d.mts} +6 -9
- package/dist/{TableControls-CZ9iu3ma.mjs → TableControls-WUNbzSNq.mjs} +331 -113
- package/dist/TableControls-WUNbzSNq.mjs.map +1 -0
- package/dist/TableControls.d.mts +1 -1
- package/dist/{TableControlsContext-D_SBFZN1.d.mts → TableControlsContext-ChFsFEjR.d.mts} +2 -2
- package/dist/TableControlsContext.d.mts +1 -1
- package/dist/{TableHead-DMq_q_W0.d.mts → TableHead-PPaqXC0K.d.mts} +1 -1
- package/dist/TableHead.d.mts +1 -1
- package/dist/{TableHeaderCell-C2pqXBYO.d.mts → TableHeaderCell-K_avn-rR.d.mts} +1 -1
- package/dist/TableHeaderCell.d.mts +1 -1
- package/dist/{TableLayout-DQKu6Rcj.d.mts → TableLayout-_Hd-Tvto.d.mts} +1 -1
- package/dist/TableLayout.d.mts +1 -1
- package/dist/{TableRow-CPqZ8DK3.d.mts → TableRow-BTWf9xVC.d.mts} +2 -2
- package/dist/TableRow.d.mts +1 -1
- package/dist/TableTH.d.mts +1 -1
- package/dist/{TableViewConfigurationDropdown-BYPh4dIP.d.mts → TableViewConfigurationDropdown-BqB7pOh8.d.mts} +5 -3
- package/dist/TableViewConfigurationDropdown.d.mts +1 -1
- package/dist/{TechnicalSticker-DTjg6d2F.mjs → TechnicalSticker-ClRR_6Ly.mjs} +6 -6
- package/dist/{TechnicalSticker-DTjg6d2F.mjs.map → TechnicalSticker-ClRR_6Ly.mjs.map} +1 -1
- package/dist/TechnicalSticker.d.mts +1 -1
- package/dist/{Text-RcEfNFLx.mjs → Text-B0orb-cZ.mjs} +2 -2
- package/dist/{Text-RcEfNFLx.mjs.map → Text-B0orb-cZ.mjs.map} +1 -1
- package/dist/{Text-CfIFUyHt.d.mts → Text-CAKHcXSd.d.mts} +4 -4
- package/dist/Text.d.mts +1 -1
- package/dist/{TextArea-DhPBI_1-.d.mts → TextArea-NjdArapc.d.mts} +2 -2
- package/dist/{TextArea-ZMgbE_Lh.mjs → TextArea-n4IKHJKo.mjs} +4 -4
- package/dist/{TextArea-ZMgbE_Lh.mjs.map → TextArea-n4IKHJKo.mjs.map} +1 -1
- package/dist/TextArea.d.mts +1 -1
- package/dist/{TextUnderlineTooltip-BzmmiJlC.d.mts → TextUnderlineTooltip-Duzxfc_r.d.mts} +3 -3
- package/dist/TextUnderlineTooltip.d.mts +1 -1
- package/dist/Tile.d.mts +2 -2
- package/dist/Toast.d.mts +1 -1
- package/dist/{Toggle-BPgfSjuu.mjs → Toggle-e8DCYa6i.mjs} +7 -7
- package/dist/{Toggle-BPgfSjuu.mjs.map → Toggle-e8DCYa6i.mjs.map} +1 -1
- package/dist/{Toggle-BGGQ4Ukl.d.mts → Toggle-fh80PA8P.d.mts} +1 -1
- package/dist/Toggle.d.mts +1 -1
- package/dist/{Tooltip-D_a-RwAN.d.mts → Tooltip-DabloV0o.d.mts} +3 -3
- package/dist/{Tooltip-BvDbmXak.mjs → Tooltip-iJcfJqxn.mjs} +5 -5
- package/dist/{Tooltip-BvDbmXak.mjs.map → Tooltip-iJcfJqxn.mjs.map} +1 -1
- package/dist/Tooltip.d.mts +1 -1
- package/dist/{TruncatedText-BJnowVTx.d.mts → TruncatedText-B1W4BivL.d.mts} +2 -2
- package/dist/codec-B0dZTwlG.d.mts +29 -0
- package/dist/codec.d.mts +2 -0
- package/dist/components/Attribute/index.mjs +7 -7
- 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.d.mts +2 -0
- package/dist/components/BottomPanel/index.mjs +293 -0
- package/dist/components/BottomPanel/index.mjs.map +1 -0
- package/dist/components/Breadcrumbs/index.d.mts +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 +4 -4
- package/dist/components/Card/index.d.mts +2 -2
- package/dist/components/Card/index.mjs +1 -1
- package/dist/components/CardV2/index.d.mts +1 -1
- package/dist/components/CardV2/index.mjs +1 -1
- package/dist/components/Checkbox/index.d.mts +1 -1
- package/dist/components/Checkbox/index.mjs +1 -1
- package/dist/components/Combobox/index.d.mts +2 -2
- package/dist/components/Combobox/index.mjs +1 -1
- package/dist/components/ConfigFormGroup/index.mjs +2 -2
- package/dist/components/DataTable/TableControls/index.d.mts +19 -16
- package/dist/components/DataTable/TableControls/index.mjs +2 -2
- package/dist/components/DataTable/index.mjs +25 -25
- package/dist/components/DataTable/index.mjs.map +1 -1
- package/dist/components/DataTable/types.d.mts +2 -2
- package/dist/components/DatePicker/index.d.mts +5 -5
- 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 +8 -8
- package/dist/components/FloatingPanel/index.mjs.map +1 -1
- package/dist/components/FormControl/index.d.mts +2 -2
- package/dist/components/FormControl/index.mjs +2 -2
- package/dist/components/FormField/index.d.mts +1 -1
- package/dist/components/FormField/index.mjs +1 -1
- package/dist/components/Grid/index.d.mts +3 -0
- package/dist/components/Grid/index.mjs +85 -0
- package/dist/components/Grid/index.mjs.map +1 -0
- package/dist/components/HoverCopyableField/index.d.mts +2 -2
- package/dist/components/HoverCopyableField/index.mjs +2 -2
- package/dist/components/ImageTile/index.mjs +10 -10
- package/dist/components/Input/index.d.mts +1 -1
- package/dist/components/Input/index.mjs +1 -1
- package/dist/components/Link/index.mjs +4 -4
- package/dist/components/Link/index.mjs.map +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 +2 -2
- package/dist/components/MatchHighlight/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.mjs +42 -12
- package/dist/components/Modal/index.mjs.map +1 -1
- package/dist/components/PageHeader/index.mjs +1 -1
- package/dist/components/Pagination/index.d.mts +3 -3
- 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 +2 -2
- package/dist/components/ProgressIndicator/index.mjs +14 -10
- package/dist/components/ProgressIndicator/index.mjs.map +1 -1
- package/dist/components/Radio/index.mjs +1 -1
- package/dist/components/RadioGroup/index.d.mts +1 -1
- package/dist/components/RadioGroup/index.mjs +1 -1
- package/dist/components/RightPanel/index.d.mts +2 -0
- package/dist/components/RightPanel/index.mjs +294 -0
- package/dist/components/RightPanel/index.mjs.map +1 -0
- package/dist/components/SegmentedControl/index.d.mts +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/Slider/index.mjs +4 -4
- package/dist/components/Spacer/index.mjs +1 -1
- package/dist/components/Spinner/index.mjs +1 -1
- package/dist/components/Stack/index.d.mts +1 -1
- package/dist/components/Stack/index.mjs +1 -1
- package/dist/components/StatusIndicator/index.mjs +2 -2
- package/dist/components/Sticker/index.d.mts +1 -1
- package/dist/components/Sticker/index.mjs +1 -1
- package/dist/components/SwatchPicker/index.mjs +1 -1
- package/dist/components/TabBar/index.mjs +1 -1
- package/dist/components/Table/index.d.mts +7 -7
- package/dist/components/Table/index.mjs +1 -1
- package/dist/components/TableBox/index.d.mts +2 -2
- 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/Text/index.mjs +1 -1
- package/dist/components/TextArea/index.d.mts +1 -1
- package/dist/components/TextArea/index.mjs +1 -1
- package/dist/components/Tile/index.mjs +5 -5
- package/dist/components/Toast/index.mjs +5 -5
- package/dist/components/Toggle/index.d.mts +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/compound-expression.d.mts +1 -1
- package/dist/{constants-BASogfT_.d.mts → constants-DcJ3tnwY.d.mts} +1 -1
- package/dist/constants.d.mts +1 -1
- package/dist/date-filter-BbWgAXy3.mjs +176 -0
- package/dist/date-filter-BbWgAXy3.mjs.map +1 -0
- package/dist/date-range-rule-value-DBEEWTQp.d.mts +17 -0
- package/dist/date-range-rule-value.d.mts +2 -0
- package/dist/date-rule-intent-BArNGT2E.d.mts +20 -0
- package/dist/date-rule-intent.d.mts +2 -0
- package/dist/display.d.mts +2 -2
- package/dist/fieldPickerOptions.d.mts +2 -2
- package/dist/{filter-size-context-Bw5F7082.d.mts → filter-size-context-D1UhTwOG.d.mts} +2 -2
- package/dist/filter-size-context.d.mts +1 -1
- package/dist/helpers.d.mts +1 -1
- package/dist/{index--5Mfhlkj.d.mts → index-DASkW991.d.mts} +2 -2
- package/dist/{index-C1bz13uw.d.mts → index-Dc_BgmPv.d.mts} +5 -5
- package/dist/{index-DiCnyORA.d.mts → index-Dpo-RP6S.d.mts} +5 -5
- package/dist/index-dhjtMp5F.d.mts +1 -0
- package/dist/index-uY8Qbwfx.d.mts +1 -0
- package/dist/index.d.mts +1 -1
- package/dist/index2.d.mts +1 -1
- package/dist/index3.d.mts +3 -3
- package/dist/index4.d.mts +14 -11
- package/dist/{input-CzO-6_1V.d.mts → input-M7BEIewR.d.mts} +3 -3
- package/dist/inputFields.d.mts +11 -11
- package/dist/{intersperse-yd3oMrQl.mjs → intersperse-DQAyfeEw.mjs} +1 -1
- package/dist/{intersperse-yd3oMrQl.mjs.map → intersperse-DQAyfeEw.mjs.map} +1 -1
- package/dist/lib/GlobalStyles.mjs +1 -1
- package/dist/lib/HeadlessAriaButton.mjs +1 -1
- package/dist/lib/MiddleTruncatedText.mjs +1 -1
- package/dist/lib/PDSProvider.d.mts +1 -1
- package/dist/lib/PDSProvider.mjs +1 -1
- package/dist/lib/TruncatedText.d.mts +1 -1
- package/dist/lib/TruncatedText.mjs +2 -2
- package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
- package/dist/lib/TruncatedTextWithTooltip.mjs +2 -2
- package/dist/lib/date-filter/index.d.mts +3 -0
- package/dist/lib/date-filter/index.mjs +2 -0
- package/dist/lib/embeddedSurfaceProtocol.d.mts +13 -1
- package/dist/lib/embeddedSurfaceProtocol.mjs +32 -5
- package/dist/lib/embeddedSurfaceProtocol.mjs.map +1 -1
- package/dist/lib/message.d.mts +1 -1
- package/dist/lib/pseudoClass.d.mts +8 -8
- package/dist/lib/useEmbeddedSurface.d.mts +31 -3
- package/dist/lib/useEmbeddedSurface.mjs +118 -13
- package/dist/lib/useEmbeddedSurface.mjs.map +1 -1
- package/dist/lib/useResizablePanel.d.mts +49 -0
- package/dist/lib/useResizablePanel.mjs +75 -0
- package/dist/lib/useResizablePanel.mjs.map +1 -0
- package/dist/{message-Cu84fcqB.d.mts → message-DaiDXonE.d.mts} +1 -1
- package/dist/mixins/focus.d.mts +1 -1
- package/dist/mixins/focus.mjs +1 -1
- package/dist/mixins/hoverable.d.mts +2 -2
- package/dist/mixins/hoverable.mjs +2 -2
- package/dist/mixins/input.d.mts +1 -1
- package/dist/mixins/input.mjs +2 -2
- package/dist/mixins/menuItem.d.mts +2 -2
- package/dist/mixins/menuItem.mjs +1 -1
- package/dist/mixins/print/index.mjs +1 -1
- package/dist/mixins/text.d.mts +1 -1
- package/dist/mixins/text.mjs +1 -1
- package/dist/{operators-CmSqHnTH.d.mts → operators-BsSl7gPE.d.mts} +10 -3
- package/dist/operators.d.mts +2 -2
- package/dist/patterns/LayoutLoadingShimmer/index.mjs +6 -6
- package/dist/patterns/LayoutLoadingSpinner/index.d.mts +2 -0
- package/dist/patterns/LayoutLoadingSpinner/index.mjs +56 -0
- package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -0
- package/dist/patterns/PageLayout/index.mjs +1 -1
- package/dist/relative-date-label.d.mts +15 -0
- package/dist/styledComponentsInterop-8zScIQyC.mjs +33 -0
- package/dist/styledComponentsInterop-8zScIQyC.mjs.map +1 -0
- package/dist/{text-BaQdW8qa.d.mts → text-DjTGRUM1.d.mts} +1 -1
- package/dist/{theme-D9Y6NOzb.d.mts → theme-Biwx2eJZ.d.mts} +1 -1
- package/dist/theme.d.mts +1 -1
- package/dist/{types-NJtAxsU1.d.mts → types-B5VmRRMR.d.mts} +5 -3
- package/dist/types-Bsf1VsW6.d.mts +24 -0
- package/dist/{types-TV9nVfSe.d.mts → types-Cg3aXHUh2.d.mts} +1 -1
- package/dist/{types-DEh_pXgS.d.mts → types-Df0D37uh.d.mts} +3 -1
- package/dist/{types-C-TkDdkG.d.mts → types-V8UJX-rk.d.mts} +14 -2
- package/dist/types.d.mts +1 -1
- package/dist/types2.d.mts +2 -2
- package/dist/types3.d.mts +2 -2
- package/dist/types4.d.mts +2 -2
- package/dist/types5.d.mts +2 -0
- package/dist/url-state-ektb0HnB.d.mts +42 -0
- package/dist/url-state.d.mts +2 -0
- package/dist/useComboboxFooterAction.d.mts +1 -1
- package/dist/{useFilterStateV2-C4itmN4S.d.mts → useFilterStateV2-BB14vCC-.d.mts} +3 -3
- package/dist/useFilterStateV2.d.mts +1 -1
- package/dist/{useFormField-eftOPiXj.mjs → useFormField-Bz2iMPBO.mjs} +2 -2
- package/dist/{useFormField-eftOPiXj.mjs.map → useFormField-Bz2iMPBO.mjs.map} +1 -1
- package/dist/{useFormField-B2U4GOH4.d.mts → useFormField-CQo08dR4.d.mts} +2 -2
- package/dist/useFormField.d.mts +1 -1
- package/dist/{useFormGroup-BMukAMAd.mjs → useFormGroup-CaTiD_Yt.mjs} +1 -1
- package/dist/{useFormGroup-BMukAMAd.mjs.map → useFormGroup-CaTiD_Yt.mjs.map} +1 -1
- package/dist/{useTableBoxDragAndDrop-CpemHLhL.d.mts → useTableBoxDragAndDrop-B-Dev5D6.d.mts} +1 -1
- package/dist/useTableBoxDragAndDrop.d.mts +1 -1
- package/dist/useTruncation.d.mts +1 -1
- package/dist/{utilities-DnSIlR1i.d.mts → utilities-BHMNnJ8h.d.mts} +1 -1
- package/dist/utilities.d.mts +1 -1
- package/dist/utils/storybook.mjs +1 -1
- package/dist/utils/testing.d.mts +1 -1
- package/dist/utils/testing.mjs +1 -1
- package/dist/utils.d.mts +1 -1
- package/dist/utils2.d.mts +12 -1
- package/dist/{validation-B5IXsdkE.d.mts → validation-B22QjCrV.d.mts} +3 -3
- package/dist/validation.d.mts +1 -1
- package/dist/{value-control-resolver-BPlTeIX7.d.mts → value-control-resolver-qKTH1ErF.d.mts} +5 -3
- package/dist/value-control-resolver.d.mts +1 -1
- package/dist/variables/keyframes.mjs +1 -1
- package/llms.txt +6 -6
- package/package.json +14 -2
- package/skills/ui-authoring/COMPONENTS.md +71 -305
- package/skills/ui-authoring/PATTERNS.md +364 -0
- package/skills/ui-authoring/SKILL.md +15 -147
- package/skills/ui-authoring/TOKENS.md +400 -0
- package/dist/Combobox-xBrxiUAu.mjs.map +0 -1
- package/dist/DatePicker-BlnE2MBD.mjs.map +0 -1
- package/dist/FormField-B9P3BWvS.mjs.map +0 -1
- package/dist/HoverCopyableField-0Bzygbp9.mjs.map +0 -1
- package/dist/Select-D6MqSYVa.mjs.map +0 -1
- package/dist/TableControls-CZ9iu3ma.mjs.map +0 -1
- package/skills/ui-authoring/EXAMPLES.md +0 -370
- package/skills/ui-authoring/REFERENCE.md +0 -293
- /package/dist/{index-BMBcfD_R.d.mts → index-8SLBz2NH.d.mts} +0 -0
- /package/dist/{index-BOn0AAue.d.mts → index-BINnViIh.d.mts} +0 -0
- /package/dist/{index-BYd3Btr1.d.mts → index-B_BBnMou.d.mts} +0 -0
- /package/dist/{index-CKKoxA9V.d.mts → index-BcsXXrHq.d.mts} +0 -0
- /package/dist/{index-CNxS4Tlu.d.mts → index-Bt4QNofW.d.mts} +0 -0
- /package/dist/{index-CWB6exYm.d.mts → index-BwFl_eS0.d.mts} +0 -0
- /package/dist/{index-CsuikFeJ.d.mts → index-CDGG7lCB.d.mts} +0 -0
- /package/dist/{index-CtJuGxUp.d.mts → index-CMuRFTR3.d.mts} +0 -0
- /package/dist/{index-CzItj62a.d.mts → index-CX869wwk.d.mts} +0 -0
- /package/dist/{index-D5tSVhTd.d.mts → index-CliqZ9rj.d.mts} +0 -0
- /package/dist/{index-DGsJdI5l.d.mts → index-CuheJfs-.d.mts} +0 -0
- /package/dist/{index-DkrC-i1D.d.mts → index-DBGd4WeR.d.mts} +0 -0
- /package/dist/{index-Es5nKSSL.d.mts → index-DDdPqD_H.d.mts} +0 -0
- /package/dist/{index-FtE8MXJ_.d.mts → index-DMRtRo7y.d.mts} +0 -0
- /package/dist/{index-IE5cwTAE2.d.mts → index-Dflz2i1X.d.mts} +0 -0
- /package/dist/{index-Oio5ygqN.d.mts → index-DvmLVvRD.d.mts} +0 -0
- /package/dist/{index-ehD5GjMH.d.mts → index-Wc1llEvP.d.mts} +0 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Patterns
|
|
2
|
+
|
|
3
|
+
Pre-built compositions of PDS components.
|
|
4
|
+
|
|
5
|
+
Which pattern to use, and for what. Patterns with a dedicated doc link to
|
|
6
|
+
`patterns/<Name>/<Name>.mdx`.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
| Pattern | Use for |
|
|
10
|
+
| ------- | ------- |
|
|
11
|
+
| Forms | A settings or config screen where fields need labels, helper text, and errors. Unlabeled controls (search, toolbars) stay as `Input` |
|
|
12
|
+
| Stack / HStack | A heading above content, a cancel/save pair, a title next to an add button, or a wrapping row of tags |
|
|
13
|
+
| EmptyStates | A list, table, or card has no items yet and you want to invite adding one |
|
|
14
|
+
| Charting | Use `recharts` for all chart components. Always import colors from `ChartingColors` — never hardcode hex values. |
|
|
15
|
+
| Indicators | A record’s open, pending, completed, or failed state next to other content. An in-page notice the user shouldn’t miss (success, warning, error). Use `Toast` if it can auto-dismiss |
|
|
16
|
+
| PageLayout | Page shell |
|
|
17
|
+
| LayoutLoadingSpinner | Centered 120px loading ring that fills its container. Use as the loading state for a page or embedded app when no layout-specific shimmer exists. |
|
|
18
|
+
| LayoutLoadingShimmer | Filling space while content loads |
|
|
19
|
+
| [Panels](../../patterns/Panels/Panels.mdx) | Use `RightPanel` when the page should stay visible. Use `Modal` when the task needs full attention. Never a custom drawer. |
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## Forms
|
|
23
|
+
|
|
24
|
+
### Form Configuration
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import ConfigFormGroup from '@persona/design-system/components/ConfigFormGroup';
|
|
28
|
+
import { TextField, TextAreaField } from '@persona/design-system/components/FormField';
|
|
29
|
+
|
|
30
|
+
const [config, setConfig] = useState({ name: '', description: '', prompt: '' });
|
|
31
|
+
|
|
32
|
+
<ConfigFormGroup>
|
|
33
|
+
<TextField
|
|
34
|
+
label="Name"
|
|
35
|
+
value={config.name}
|
|
36
|
+
onChange={(e) => setConfig({ ...config, name: e.target.value })}
|
|
37
|
+
configField={true} // helperText becomes a tooltip
|
|
38
|
+
helperText="Unique identifier"
|
|
39
|
+
errorText={errors.name}
|
|
40
|
+
rightActions={<Button size="sm" variant="basic">Generate</Button>}
|
|
41
|
+
/>
|
|
42
|
+
<TextAreaField
|
|
43
|
+
label="Prompt"
|
|
44
|
+
value={config.prompt}
|
|
45
|
+
onChange={(e) => setConfig({ ...config, prompt: e.target.value })}
|
|
46
|
+
configField={true}
|
|
47
|
+
warningText={warnings.prompt}
|
|
48
|
+
/>
|
|
49
|
+
</ConfigFormGroup>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- `configField={true}` → helper text becomes a tooltip instead of inline text
|
|
53
|
+
- `ConfigFormGroup` provides consistent 20px spacing between fields
|
|
54
|
+
- Use controlled inputs; clear `errorText` on change via `updateField` in form state hook
|
|
55
|
+
|
|
56
|
+
### Form Pattern
|
|
57
|
+
|
|
58
|
+
**Always use** `ConfigFormGroup` **+** `TextField` **/** `TextAreaField` **— never hand-roll** `styled.input` **or**
|
|
59
|
+
`styled.label`**.** For a tooltip on a standalone label (not `helperText`), wrap the `Label` in
|
|
60
|
+
`TextUnderlineTooltip` — see Tooltip on Labels.
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
import ConfigFormGroup from '@persona/design-system/components/ConfigFormGroup';
|
|
64
|
+
import { TextField, TextAreaField } from '@persona/design-system/components/FormField';
|
|
65
|
+
import Select, { Option } from '@persona/design-system/components/Select';
|
|
66
|
+
import { Label } from '@persona/design-system/components/Text';
|
|
67
|
+
import Stack from '@persona/design-system/components/Stack';
|
|
68
|
+
import { Spacing } from '@persona/design-tokens';
|
|
69
|
+
|
|
70
|
+
<ConfigFormGroup>
|
|
71
|
+
<TextField
|
|
72
|
+
label="Name"
|
|
73
|
+
value={config.name}
|
|
74
|
+
onChange={(e) => setConfig({ ...config, name: e.target.value })}
|
|
75
|
+
configField={true}
|
|
76
|
+
helperText="Unique identifier"
|
|
77
|
+
errorText={errors.name}
|
|
78
|
+
rightActions={<Button size="sm" variant="basic">Generate</Button>}
|
|
79
|
+
/>
|
|
80
|
+
|
|
81
|
+
<TextAreaField
|
|
82
|
+
label="Description"
|
|
83
|
+
value={config.description}
|
|
84
|
+
onChange={(e) => setConfig({ ...config, description: e.target.value })}
|
|
85
|
+
configField={true}
|
|
86
|
+
helperText="Short summary shown in listings."
|
|
87
|
+
warningText={warnings.prompt}
|
|
88
|
+
/>
|
|
89
|
+
|
|
90
|
+
<Stack spacing={Spacing[2]}>
|
|
91
|
+
<Label size="sm" color="secondary">Enforcement</Label>
|
|
92
|
+
<Select
|
|
93
|
+
value={config.enforcement}
|
|
94
|
+
onChange={(e) => setConfig({ ...config, enforcement: e.target.value })}
|
|
95
|
+
>
|
|
96
|
+
<Option value="strict">Strict</Option>
|
|
97
|
+
<Option value="lenient">Lenient</Option>
|
|
98
|
+
<Option value="disabled">Disabled</Option>
|
|
99
|
+
</Select>
|
|
100
|
+
</Stack>
|
|
101
|
+
</ConfigFormGroup>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
### TextField / TextAreaField props
|
|
107
|
+
|
|
108
|
+
- `label` — field label
|
|
109
|
+
- `value` / `onChange` — controlled input
|
|
110
|
+
- `helperText` — help text (tooltip if `configField={true}`)
|
|
111
|
+
- `errorText` — error message (red)
|
|
112
|
+
- `warningText` — warning message (yellow)
|
|
113
|
+
- `configField` — boolean, renders helper as tooltip
|
|
114
|
+
- `rightActions` — ReactNode for buttons/icons next to label
|
|
115
|
+
- `disabled` — boolean
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
### Form state hook
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
const useFormState = (initialConfig) => {
|
|
123
|
+
const [config, setConfig] = useState(initialConfig);
|
|
124
|
+
const [errors, setErrors] = useState({});
|
|
125
|
+
|
|
126
|
+
const updateField = useCallback((field, value) => {
|
|
127
|
+
setConfig(prev => ({ ...prev, [field]: value }));
|
|
128
|
+
setErrors(prev => { const next = { ...prev }; delete next[field]; return next; });
|
|
129
|
+
}, []);
|
|
130
|
+
|
|
131
|
+
const validate = useCallback(() => {
|
|
132
|
+
const newErrors = {};
|
|
133
|
+
if (!config.name) newErrors.name = 'Required';
|
|
134
|
+
setErrors(newErrors);
|
|
135
|
+
return Object.keys(newErrors).length === 0;
|
|
136
|
+
}, [config]);
|
|
137
|
+
|
|
138
|
+
return { config, errors, updateField, validate };
|
|
139
|
+
};
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
### Form with footer buttons
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
import Stack from '@persona/design-system/components/Stack';
|
|
148
|
+
import { HStack } from '@persona/design-system/components/Stack';
|
|
149
|
+
|
|
150
|
+
<Stack spacing={Spacing[5]}>
|
|
151
|
+
<ConfigFormGroup>
|
|
152
|
+
<TextField label="Name" value={config.name} onChange={...} />
|
|
153
|
+
<TextAreaField label="Description" value={config.description} onChange={...} />
|
|
154
|
+
</ConfigFormGroup>
|
|
155
|
+
<HStack spacing={Spacing[3]} justify="flex-end">
|
|
156
|
+
<Button variant="basic" onClick={onCancel}>Cancel</Button>
|
|
157
|
+
<Button variant="primary" onClick={handleSave} isPending={isSaving}>Save</Button>
|
|
158
|
+
</HStack>
|
|
159
|
+
</Stack>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Tooltip on Labels
|
|
163
|
+
|
|
164
|
+
**Always use `TextUnderlineTooltip` — never place an info icon next to a label.**
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
// ❌ Deprecated: icon trigger next to label
|
|
168
|
+
<HStack spacing={Spacing[1]} align='center'>
|
|
169
|
+
<Label size='sm' color='secondary'>Review Type</Label>
|
|
170
|
+
<Tooltip iconTrigger={<CircleHelpIcon />} side='right'>…</Tooltip>
|
|
171
|
+
</HStack>
|
|
172
|
+
|
|
173
|
+
// ✅ Correct: dashed underline on the label itself
|
|
174
|
+
import { TextUnderlineTooltip } from '@persona/design-system/components/Tooltip';
|
|
175
|
+
|
|
176
|
+
<TextUnderlineTooltip tooltip='Explanation text.' side='right'>
|
|
177
|
+
<Label size='sm' color='secondary'>Review Type</Label>
|
|
178
|
+
</TextUnderlineTooltip>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
`iconTrigger` is only appropriate for standalone icon buttons with no adjacent label text.
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
## Layout
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
### Card with collapsible sections
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
import { Card } from '@persona/design-system/components/CardV2';
|
|
193
|
+
|
|
194
|
+
<Card>
|
|
195
|
+
<Card.Section heading={{ title: 'Basic Settings' }} collapsible={true} defaultCollapsed={false}>
|
|
196
|
+
<ConfigFormGroup>
|
|
197
|
+
<TextField label="Name" value={...} onChange={...} />
|
|
198
|
+
</ConfigFormGroup>
|
|
199
|
+
</Card.Section>
|
|
200
|
+
<Card.Section heading={{ title: 'Advanced' }} collapsible={true}>
|
|
201
|
+
{/* Advanced fields */}
|
|
202
|
+
</Card.Section>
|
|
203
|
+
</Card>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
- `collapsible` / `defaultCollapsed` — section disclosure
|
|
207
|
+
- `heading` — `{ title }` section heading text
|
|
208
|
+
- `loading` — boolean
|
|
209
|
+
- `empty` — boolean
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
## Indicators
|
|
214
|
+
|
|
215
|
+
### Status Indicators
|
|
216
|
+
|
|
217
|
+
Use `StatusIndicator` for a record’s named lifecycle state. Use `Sticker` for tags.
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
| Business status | `status` |
|
|
221
|
+
| ---------------------------------- | -------------- |
|
|
222
|
+
| open / initiated / inactive | `open` |
|
|
223
|
+
| pending / processing | `pending` |
|
|
224
|
+
| completed | `completed` |
|
|
225
|
+
| active / reviewed | `active` |
|
|
226
|
+
| failed / declined / error | `failed` |
|
|
227
|
+
| needs review / flagged | `needs_review` |
|
|
228
|
+
| canceled | `canceled` |
|
|
229
|
+
| archived | `archived` |
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
import StatusIndicator from '@persona/design-system/components/StatusIndicator';
|
|
234
|
+
|
|
235
|
+
<StatusIndicator status="open">Open</StatusIndicator>
|
|
236
|
+
<StatusIndicator status="pending">Pending</StatusIndicator>
|
|
237
|
+
<StatusIndicator status="completed">Completed</StatusIndicator>
|
|
238
|
+
<StatusIndicator status="active">Active</StatusIndicator>
|
|
239
|
+
<StatusIndicator status="failed">Failed</StatusIndicator>
|
|
240
|
+
<StatusIndicator status="needs_review">Needs Review</StatusIndicator>
|
|
241
|
+
<StatusIndicator status="canceled">Canceled</StatusIndicator>
|
|
242
|
+
<StatusIndicator status="archived">Archived</StatusIndicator>
|
|
243
|
+
|
|
244
|
+
<StatusIndicator type="success" background="filled">Approved</StatusIndicator>
|
|
245
|
+
<StatusIndicator type="critical" background="none">Failed</StatusIndicator>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
- `status` — `"open"` | `"pending"` | `"completed"` | `"active"` | `"failed"` | `"needs_review"` | `"canceled"` | `"archived"`
|
|
249
|
+
- `type` — `"neutral"` | `"attention"` | `"warning"` | `"critical"` | `"success"` | `"feature"` | `"informational"` | `"miscellaneous"`. Overrides `status` when both are set.
|
|
250
|
+
- `background` — `"filled"` (default) | `"none"`. `"none"` always shows the icon.
|
|
251
|
+
- `leadingIcon` — optional 12px icon; overrides the preset icon (`null` hides it)
|
|
252
|
+
- `showIcon` — `{false}` hides the icon on `"filled"` only; ignored when `background="none"`
|
|
253
|
+
- `truncate` — ellipsis plus a title tooltip when the label overflows
|
|
254
|
+
- `preserveCase` — keep authored casing (labels are capitalized by default)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
### Banner
|
|
259
|
+
|
|
260
|
+
```tsx
|
|
261
|
+
import Banner from '@persona/design-system/components/Banner';
|
|
262
|
+
import { CircleInfoIcon, CheckCircleIcon, AlertTriangleIcon, XCircleIcon } from '@persona/icons';
|
|
263
|
+
|
|
264
|
+
<Banner variant="informational"><CircleInfoIcon />This is an informational message.</Banner>
|
|
265
|
+
<Banner variant="success"><CheckCircleIcon />Changes saved successfully!</Banner>
|
|
266
|
+
<Banner variant="warning"><AlertTriangleIcon />Please review before submitting.</Banner>
|
|
267
|
+
<Banner variant="alert"><XCircleIcon />There was an error processing your request.</Banner>
|
|
268
|
+
|
|
269
|
+
<Banner variant="informational" onClose={() => setShowBanner(false)}>
|
|
270
|
+
<CircleInfoIcon />You can dismiss this message.
|
|
271
|
+
</Banner>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
## Feedback
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
### Spinner
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
import Spinner from '@persona/design-system/components/Spinner';
|
|
284
|
+
|
|
285
|
+
<Stack align="center" spacing={Spacing[3]}>
|
|
286
|
+
<Spinner size="md" srText="Loading policies..." />
|
|
287
|
+
</Stack>
|
|
288
|
+
|
|
289
|
+
<Button variant="primary" isPending>Saving...</Button>
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Prefer `Button isPending` for mutations. Prefer `Card.Section loading` when the content is inside a
|
|
293
|
+
card. Never `isLoading && <div>Loading...</div>`.
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
## Empty states
|
|
298
|
+
|
|
299
|
+
For tables/lists when there is no data to show:
|
|
300
|
+
|
|
301
|
+
```tsx
|
|
302
|
+
// Inside a Card section or table container
|
|
303
|
+
<Stack align="center" spacing={Spacing[3]} style={{ padding: Spacing[6] }}>
|
|
304
|
+
<Paragraph color="secondary">No policy rules yet.</Paragraph>
|
|
305
|
+
<Button variant="primary" size="sm" prefixIcon={<PlusIcon />}>Add Rule</Button>
|
|
306
|
+
</Stack>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Message-only (no CTA):
|
|
310
|
+
|
|
311
|
+
```tsx
|
|
312
|
+
<Stack align="center" spacing={Spacing[3]} style={{ padding: Spacing[6] }}>
|
|
313
|
+
<Paragraph color="secondary">No items yet.</Paragraph>
|
|
314
|
+
</Stack>
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
For `ListBox`, pass `emptyText="No items"` prop directly.
|
|
318
|
+
For `Card.Section`, pass `empty={true}` to show the built-in empty state.
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
## Charting
|
|
323
|
+
|
|
324
|
+
Use `recharts` for all chart components. Always import colors from `ChartingColors` — never
|
|
325
|
+
hardcode hex values.
|
|
326
|
+
|
|
327
|
+
```tsx
|
|
328
|
+
import { ChartingColors } from '@persona/design-tokens';
|
|
329
|
+
|
|
330
|
+
// Sequential — 8 values; for ordered/numeric data (score bands, age ranges, percentages)
|
|
331
|
+
// Use index 0 for the largest value on light backgrounds.
|
|
332
|
+
ChartingColors.Sequential
|
|
333
|
+
|
|
334
|
+
// Categorical — 14 values; for distinct unordered categories (status, type, country)
|
|
335
|
+
// Light backgrounds only. If > 14 categories, bundle similar items or link to an export view.
|
|
336
|
+
ChartingColors.Categorical
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Palette selection guide
|
|
340
|
+
|
|
341
|
+
| Data type | Palette | Max series |
|
|
342
|
+
|-----------|---------|-----------|
|
|
343
|
+
| Numeric / ordered | `Sequential` | 8 |
|
|
344
|
+
| Categorical / unordered | `Categorical` | 14 |
|
|
345
|
+
|
|
346
|
+
### Recharts pattern
|
|
347
|
+
|
|
348
|
+
```tsx
|
|
349
|
+
import { ChartingColors } from '@persona/design-tokens';
|
|
350
|
+
import { Cell, Pie, PieChart } from 'recharts';
|
|
351
|
+
|
|
352
|
+
<PieChart>
|
|
353
|
+
<Pie data={data} dataKey="value">
|
|
354
|
+
{data.map((_, i) => (
|
|
355
|
+
<Cell key={i} fill={ChartingColors.Categorical[i % ChartingColors.Categorical.length]} />
|
|
356
|
+
))}
|
|
357
|
+
</Pie>
|
|
358
|
+
</PieChart>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**Anti-patterns:**
|
|
362
|
+
- Hardcoding hex values instead of `ChartingColors`
|
|
363
|
+
- Using `Categorical` on a dark background
|
|
364
|
+
- Using `Sequential` for unordered categories
|
|
@@ -3,7 +3,7 @@ name: ui-authoring
|
|
|
3
3
|
description: Use when implementing UI, styling React components, working with design tokens, or making frontend changes, or when file paths include design-system/components/ or styled-components.
|
|
4
4
|
metadata:
|
|
5
5
|
library: '@persona/design-system'
|
|
6
|
-
library_version: '0.
|
|
6
|
+
library_version: '0.4.0'
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# UI Authoring
|
|
@@ -14,67 +14,24 @@ metadata:
|
|
|
14
14
|
import { Color, Spacing, Typography } from '@persona/design-tokens';
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
- `Spacing[0–9]` = 0/4/8/12/16/24/32/40/48/56px
|
|
17
|
+
- `Spacing[0–9]` = 0/4/8/12/16/24/32/40/48/56px. If you hardcode a value, use a multiple of 4 and comment what it's doing.
|
|
18
18
|
- Always use complete `Typography` styles (e.g. `Typography.TextMedium`), never individual font properties.
|
|
19
|
-
- See [
|
|
20
|
-
|
|
21
|
-
## Component-First — check this before creating any `styled` component
|
|
22
|
-
|
|
23
|
-
| Need | Component | Import |
|
|
24
|
-
|------|-----------|--------|
|
|
25
|
-
| Flex column | `Stack` | `@persona/design-system/components/Stack` |
|
|
26
|
-
| Flex row | `HStack` | `@persona/design-system/components/Stack` |
|
|
27
|
-
| Heading text | `Heading` | `@persona/design-system/components/Text` |
|
|
28
|
-
| Body text | `Paragraph` | `@persona/design-system/components/Text` |
|
|
29
|
-
| Form label | `Label` | `@persona/design-system/components/Text` |
|
|
30
|
-
| Button | `Button` | `@persona/design-system/components/Button` |
|
|
31
|
-
| Form fields | `ConfigFormGroup` + `TextField`/`TextAreaField` | `@persona/design-system/components/ConfigFormGroup`, `FormField` |
|
|
32
|
-
| Text input | `Input`, `TextArea` | `@persona/design-system/components/Input`, `TextArea` |
|
|
33
|
-
| Dropdown | `Select` | `@persona/design-system/components/Select` |
|
|
34
|
-
| Dynamic list | `ListBox` | `@persona/design-system/components/ListBox` |
|
|
35
|
-
| Collapsible sections | `Card` + `Card.Section` | `@persona/design-system/components/CardV2` |
|
|
36
|
-
| Modal | `Modal` | `@persona/design-system/components/Modal` |
|
|
37
|
-
| Floating panel | `Popover` | `@persona/design-system/components/Popover` |
|
|
38
|
-
| Status badge | `Sticker` | `@persona/design-system/components/Sticker` |
|
|
39
|
-
| Count badge | `Badge` | `@persona/design-system/components/Badge` |
|
|
40
|
-
| Tabs | `TabBar`, `Tab` | `@persona/design-system/components/TabBar` |
|
|
41
|
-
| Spinner | `Spinner` | `@persona/design-system/components/Spinner` |
|
|
42
|
-
| Alert / notification | `Banner` | `@persona/design-system/components/Banner` |
|
|
43
|
-
| Standalone tooltip | `Tooltip` | `@persona/design-system/components/Tooltip` |
|
|
44
|
-
| Tooltip on a label | `TextUnderlineTooltip` | `@persona/design-system/components/Tooltip` |
|
|
45
|
-
| Page title bar | `PageHeader` | `@persona/design-system/components/PageHeader` |
|
|
46
|
-
| Page shell | `Container`, `Section`, `Backdrop` | `@persona/design-system/patterns/PageLayout` |
|
|
47
|
-
| Data table | `DataTable` | `@persona/design-system/components/DataTable` |
|
|
48
|
-
| Table with loading/empty states | `TableLayout` + `Table` primitives | `@persona/design-system/components/Table` |
|
|
49
|
-
| Editable / form table | `TableBox`, `TableBoxField` | `@persona/design-system/components/TableBox`, `FormField` |
|
|
50
|
-
|
|
51
|
-
## Tooltip on Labels
|
|
52
|
-
|
|
53
|
-
**Always use `TextUnderlineTooltip` — never place an info icon next to a label.**
|
|
19
|
+
- See [TOKENS.md](TOKENS.md) for selection rules.
|
|
54
20
|
|
|
55
|
-
|
|
56
|
-
// ❌ Deprecated: icon trigger next to label
|
|
57
|
-
<HStack spacing={Spacing[1]} align='center'>
|
|
58
|
-
<Label size='sm' color='secondary'>Review Type</Label>
|
|
59
|
-
<Tooltip iconTrigger={<HelpCircleIcon />} side='right'>…</Tooltip>
|
|
60
|
-
</HStack>
|
|
61
|
-
|
|
62
|
-
// ✅ Correct: dashed underline on the label itself
|
|
63
|
-
import { TextUnderlineTooltip } from '@persona/design-system/components/Tooltip';
|
|
64
|
-
|
|
65
|
-
<TextUnderlineTooltip tooltip='Explanation text.' side='right'>
|
|
66
|
-
<Label size='sm' color='secondary'>Review Type</Label>
|
|
67
|
-
</TextUnderlineTooltip>
|
|
68
|
-
```
|
|
21
|
+
## PDS implementation guidelines
|
|
69
22
|
|
|
70
|
-
|
|
23
|
+
Start with [PATTERNS.md](PATTERNS.md) and use an existing pattern whenever one fits the use
|
|
24
|
+
case. If no pattern applies, review the component table in [COMPONENTS.md](COMPONENTS.md) to
|
|
25
|
+
select the appropriate component and import path. Only create a `styled` component or wrapper
|
|
26
|
+
when existing components cannot meet the need, and use tokens from [TOKENS.md](TOKENS.md) for
|
|
27
|
+
any custom styling.
|
|
71
28
|
|
|
72
29
|
## Table Guidelines
|
|
73
30
|
|
|
74
31
|
Never hand-roll `<table>`, `<thead>`, `<th>`, or `<td>`. Pick the component by use case:
|
|
75
32
|
|
|
76
33
|
- **`DataTable`** (`@persona/design-system/components/DataTable`) — data views with pagination, sorting, and server-side data.
|
|
77
|
-
- **`TableBox`** (`@persona/design-system/components/TableBox`) / **`TableBoxField`** (`FormField`) — small, form-adjacent tables in config editors: inline editing, row add/delete, drag-drop reorder. See
|
|
34
|
+
- **`TableBox`** (`@persona/design-system/components/TableBox`) / **`TableBoxField`** (`FormField`) — small, form-adjacent tables in config editors: inline editing, row add/delete, drag-drop reorder. See `TableBox.mdx`.
|
|
78
35
|
- **`TableLayout`** (`@persona/design-system/components/Table`, named export `TableLayout`) — lower-level table shell with built-in loading and empty states; use it when composing rows manually from `Table` primitives (`TableRow`, `TableCell`, `TableHeaderCell`).
|
|
79
36
|
|
|
80
37
|
### DataTable
|
|
@@ -117,61 +74,16 @@ const ModalOverlay = styled.div`position: fixed; ...`; // use <Modal> instead
|
|
|
117
74
|
// ✅ Use design system components
|
|
118
75
|
<Heading size="sm">Title</Heading>
|
|
119
76
|
<Stack spacing={Spacing[1]}><Label>Field</Label><Input /></Stack>
|
|
120
|
-
<Modal
|
|
77
|
+
<Modal open={isOpen} onOpenChange={onOpenChange} title="..." footer={...}>...</Modal>
|
|
121
78
|
```
|
|
122
79
|
|
|
123
80
|
- `Paragraph` defaults to `color="secondary"` (grey) — use `color="primary"` for black text.
|
|
124
81
|
- Field values in detail/metadata layouts: do not add `weight="bold"` unless the design explicitly calls it out.
|
|
125
82
|
|
|
126
|
-
## Form Pattern
|
|
127
|
-
|
|
128
|
-
```tsx
|
|
129
|
-
import ConfigFormGroup from '@persona/design-system/components/ConfigFormGroup';
|
|
130
|
-
import { TextField, TextAreaField } from '@persona/design-system/components/FormField';
|
|
131
|
-
|
|
132
|
-
<ConfigFormGroup>
|
|
133
|
-
<TextField
|
|
134
|
-
label="Name"
|
|
135
|
-
value={config.name}
|
|
136
|
-
onChange={(e) => setConfig({ ...config, name: e.target.value })}
|
|
137
|
-
configField={true} // helperText becomes a tooltip
|
|
138
|
-
helperText="Must be unique"
|
|
139
|
-
errorText={errors.name}
|
|
140
|
-
/>
|
|
141
|
-
<TextAreaField
|
|
142
|
-
label="Description"
|
|
143
|
-
value={config.description}
|
|
144
|
-
onChange={(e) => setConfig({ ...config, description: e.target.value })}
|
|
145
|
-
configField={true}
|
|
146
|
-
/>
|
|
147
|
-
</ConfigFormGroup>
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
`ConfigFormGroup` provides consistent 20px spacing between fields. See [COMPONENTS.md](COMPONENTS.md) for form state hook, `ListBox`, `TableBox`, `Card`, `Modal`, `Select` patterns and full props reference.
|
|
151
|
-
|
|
152
|
-
## Sticker Status Mapping
|
|
153
|
-
|
|
154
|
-
| Business status | Sticker variant |
|
|
155
|
-
|----------------|----------------|
|
|
156
|
-
| approved / active / verified / success | `success` |
|
|
157
|
-
| declined / failed / error | `danger` |
|
|
158
|
-
| pending / in-review / flagged | `caution` |
|
|
159
|
-
| inactive / archived / disabled | `basic` |
|
|
160
|
-
|
|
161
83
|
## Icon Sizes
|
|
162
84
|
|
|
163
85
|
- `@persona/icons` — 16px default; use for buttons and standalone icons.
|
|
164
|
-
- `@persona/icons/12px` — use for `Sticker` icons and inline text icons.
|
|
165
|
-
|
|
166
|
-
## Empty State
|
|
167
|
-
|
|
168
|
-
```tsx
|
|
169
|
-
<Stack align="center" spacing={Spacing[3]} style={{ padding: Spacing[6] }}>
|
|
170
|
-
<Paragraph color="secondary">No items yet.</Paragraph>
|
|
171
|
-
</Stack>
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
For tables/lists, also pass `emptyText` prop where supported (e.g. `ListBox`).
|
|
86
|
+
- `@persona/icons/12px` — use for `StatusIndicator` / `Sticker` icons and inline text icons.
|
|
175
87
|
|
|
176
88
|
## Loading States
|
|
177
89
|
|
|
@@ -212,52 +124,8 @@ export const WithErrors: StoryObj<typeof MyComponent> = { args: { errors: { name
|
|
|
212
124
|
|
|
213
125
|
Add `ComponentName.stories.tsx` for every new component or visual variant.
|
|
214
126
|
|
|
215
|
-
## Data Visualization (Charts)
|
|
216
|
-
|
|
217
|
-
Use `recharts` for all chart components. Always import colors from `ChartingColors` — never
|
|
218
|
-
hardcode hex values.
|
|
219
|
-
|
|
220
|
-
```tsx
|
|
221
|
-
import { ChartingColors } from '@persona/design-tokens';
|
|
222
|
-
|
|
223
|
-
// Sequential — 8 values; for ordered/numeric data (score bands, age ranges, percentages)
|
|
224
|
-
// Use index 0 for the largest value on light backgrounds.
|
|
225
|
-
ChartingColors.Sequential
|
|
226
|
-
|
|
227
|
-
// Categorical — 14 values; for distinct unordered categories (status, type, country)
|
|
228
|
-
// Light backgrounds only. If > 14 categories, bundle similar items or link to an export view.
|
|
229
|
-
ChartingColors.Categorical
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Palette selection guide
|
|
233
|
-
|
|
234
|
-
| Data type | Palette | Max series |
|
|
235
|
-
|-----------|---------|-----------|
|
|
236
|
-
| Numeric / ordered | `Sequential` | 8 |
|
|
237
|
-
| Categorical / unordered | `Categorical` | 14 |
|
|
238
|
-
|
|
239
|
-
### Recharts pattern
|
|
240
|
-
|
|
241
|
-
```tsx
|
|
242
|
-
import { ChartingColors } from '@persona/design-tokens';
|
|
243
|
-
import { Cell, Pie, PieChart } from 'recharts';
|
|
244
|
-
|
|
245
|
-
<PieChart>
|
|
246
|
-
<Pie data={data} dataKey="value">
|
|
247
|
-
{data.map((_, i) => (
|
|
248
|
-
<Cell key={i} fill={ChartingColors.Categorical[i % ChartingColors.Categorical.length]} />
|
|
249
|
-
))}
|
|
250
|
-
</Pie>
|
|
251
|
-
</PieChart>
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
**Anti-patterns:**
|
|
255
|
-
- Hardcoding hex values instead of `ChartingColors`
|
|
256
|
-
- Using `Categorical` on a dark background
|
|
257
|
-
- Using `Sequential` for unordered categories
|
|
258
|
-
|
|
259
127
|
## Resources
|
|
260
128
|
|
|
261
|
-
- [
|
|
262
|
-
- [
|
|
263
|
-
- [COMPONENTS.md](COMPONENTS.md) —
|
|
129
|
+
- [TOKENS.md](TOKENS.md) — Color / Spacing / Typography selection and catalog, radius, charts
|
|
130
|
+
- [PATTERNS.md](PATTERNS.md) — forms, layout, panels, indicators, feedback, empty states
|
|
131
|
+
- [COMPONENTS.md](COMPONENTS.md) — which PDS component to use, and its import path; APIs live in each component's `.mdx`
|