@persona/design-system 0.10.2 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/{Breadcrumb-BDbY1Ffu.d.mts → Breadcrumb-CA0vAzUN.d.mts} +7 -2
  3. package/dist/Breadcrumb.d.mts +2 -2
  4. package/dist/{Breadcrumbs-C2ThOYJ-.d.mts → Breadcrumbs-47jYLqNP.d.mts} +2 -2
  5. package/dist/{Breadcrumbs-CQUe9VTM.mjs → Breadcrumbs-gRAsKF4R.mjs} +50 -10
  6. package/dist/Breadcrumbs-gRAsKF4R.mjs.map +1 -0
  7. package/dist/Breadcrumbs.d.mts +1 -1
  8. package/dist/{Combobox-BXHCfVpE.mjs → Combobox-CBM-oY-e.mjs} +6 -4
  9. package/dist/{Combobox-BXHCfVpE.mjs.map → Combobox-CBM-oY-e.mjs.map} +1 -1
  10. package/dist/{CompactBar-CfrrZ69k.d.mts → CompactBar-D9egXqY_.d.mts} +2 -2
  11. package/dist/CompactBar.d.mts +1 -1
  12. package/dist/{ConfigFormGroup-BE3yR_VU.mjs → ConfigFormGroup-CidT_cE9.mjs} +1 -1
  13. package/dist/{ConfigFormGroup-BE3yR_VU.mjs.map → ConfigFormGroup-CidT_cE9.mjs.map} +1 -1
  14. package/dist/{ControlBar-D9KflqmH.d.mts → ControlBar-RIz-xjxs.d.mts} +18 -1
  15. package/dist/ControlBar.d.mts +1 -1
  16. package/dist/{DataTable-BdKUCgcZ.d.mts → DataTable-D15C5lfd.d.mts} +3 -2
  17. package/dist/{DataTable-F9R-aQCg.mjs → DataTable-DQ8axNfo.mjs} +7 -7
  18. package/dist/{DataTable-F9R-aQCg.mjs.map → DataTable-DQ8axNfo.mjs.map} +1 -1
  19. package/dist/DataTable.d.mts +1 -1
  20. package/dist/{DatePicker-CkNQjfCN.mjs → DatePicker-D0cvVbzq.mjs} +2 -2
  21. package/dist/{DatePicker-CkNQjfCN.mjs.map → DatePicker-D0cvVbzq.mjs.map} +1 -1
  22. package/dist/{FormField-D0y1uRV5.mjs → FormField-C0cd1zVd.mjs} +5 -5
  23. package/dist/{FormField-D0y1uRV5.mjs.map → FormField-C0cd1zVd.mjs.map} +1 -1
  24. package/dist/{HoverCopyableField-DkOosH8z.mjs → HoverCopyableField-D-BubaRd.mjs} +2 -2
  25. package/dist/{HoverCopyableField-DkOosH8z.mjs.map → HoverCopyableField-D-BubaRd.mjs.map} +1 -1
  26. package/dist/IndexTableLayout.d.mts +4 -4
  27. package/dist/{Link-BSuXrvTu.mjs → Link-Cf__H8gD.mjs} +1 -1
  28. package/dist/{Link-BSuXrvTu.mjs.map → Link-Cf__H8gD.mjs.map} +1 -1
  29. package/dist/{ListBox-BLoJVezh.mjs → ListBox-eoyBHtnJ.mjs} +2 -2
  30. package/dist/{ListBox-BLoJVezh.mjs.map → ListBox-eoyBHtnJ.mjs.map} +1 -1
  31. package/dist/{Modal-IJdbLORi.mjs → Modal-kjUptzg1.mjs} +1 -1
  32. package/dist/{Modal-IJdbLORi.mjs.map → Modal-kjUptzg1.mjs.map} +1 -1
  33. package/dist/{PageHeader-Czj42pyK.d.mts → PageHeader-CnpDVOck.d.mts} +2 -2
  34. package/dist/{PageHeader-DJF7nxgN.mjs → PageHeader-D2j2XHD9.mjs} +6 -2
  35. package/dist/PageHeader-D2j2XHD9.mjs.map +1 -0
  36. package/dist/PageHeader.d.mts +1 -1
  37. package/dist/{Pagination-C5ANr9M0.mjs → Pagination-DtK-jbEY.mjs} +2 -2
  38. package/dist/{Pagination-C5ANr9M0.mjs.map → Pagination-DtK-jbEY.mjs.map} +1 -1
  39. package/dist/{Pii-G16_b7Yk.mjs → Pii-DueIK287.mjs} +1 -1
  40. package/dist/{Pii-G16_b7Yk.mjs.map → Pii-DueIK287.mjs.map} +1 -1
  41. package/dist/{Popover-532iYFek.mjs → Popover-BcII7usF.mjs} +1 -1
  42. package/dist/{Popover-532iYFek.mjs.map → Popover-BcII7usF.mjs.map} +1 -1
  43. package/dist/{Select-hnXfPywt.mjs → Select-BJ9ACmRD.mjs} +1 -1
  44. package/dist/{Select-hnXfPywt.mjs.map → Select-BJ9ACmRD.mjs.map} +1 -1
  45. package/dist/SelectionCard.d.mts +0 -5
  46. package/dist/{Spinner-AnIk8d9M.mjs → Spinner-7Camx1vs.mjs} +4 -3
  47. package/dist/{Spinner-AnIk8d9M.mjs.map → Spinner-7Camx1vs.mjs.map} +1 -1
  48. package/dist/{Table-CmuWqmVN.mjs → Table-BIDaC0uS.mjs} +2 -2
  49. package/dist/{Table-CmuWqmVN.mjs.map → Table-BIDaC0uS.mjs.map} +1 -1
  50. package/dist/{TableBox-BRJunn09.mjs → TableBox-Bn_XZEYd.mjs} +4 -4
  51. package/dist/{TableBox-BRJunn09.mjs.map → TableBox-Bn_XZEYd.mjs.map} +1 -1
  52. package/dist/{TableControls-DCtTiWk6.d.mts → TableControls-ETB0Xk5X.d.mts} +3 -2
  53. package/dist/{TableControls-C5fNNdmT.mjs → TableControls-qxoq5abn.mjs} +102 -60
  54. package/dist/TableControls-qxoq5abn.mjs.map +1 -0
  55. package/dist/TableControls.d.mts +1 -1
  56. package/dist/components/Breadcrumbs/index.d.mts +1 -1
  57. package/dist/components/Breadcrumbs/index.mjs +1 -1
  58. package/dist/components/Combobox/index.mjs +1 -1
  59. package/dist/components/ConfigFormGroup/index.mjs +1 -1
  60. package/dist/components/DataTable/TableControls/index.d.mts +3 -3
  61. package/dist/components/DataTable/TableControls/index.mjs +1 -1
  62. package/dist/components/DataTable/index.d.mts +1 -1
  63. package/dist/components/DataTable/index.mjs +1 -1
  64. package/dist/components/DatePicker/index.mjs +1 -1
  65. package/dist/components/FormField/index.mjs +1 -1
  66. package/dist/components/HoverCopyableField/index.mjs +1 -1
  67. package/dist/components/Link/index.mjs +1 -1
  68. package/dist/components/ListBox/index.mjs +1 -1
  69. package/dist/components/Modal/index.mjs +1 -1
  70. package/dist/components/PageHeader/index.d.mts +1 -1
  71. package/dist/components/PageHeader/index.mjs +1 -1
  72. package/dist/components/Pagination/index.mjs +1 -1
  73. package/dist/components/Pii/index.mjs +1 -1
  74. package/dist/components/Popover/index.mjs +1 -1
  75. package/dist/components/Select/index.mjs +1 -1
  76. package/dist/components/SelectionCard/index.mjs +32 -24
  77. package/dist/components/SelectionCard/index.mjs.map +1 -1
  78. package/dist/components/SmartTextInput/index.mjs +1 -1
  79. package/dist/components/Spinner/index.mjs +1 -1
  80. package/dist/components/Table/index.mjs +1 -1
  81. package/dist/components/TableBox/index.mjs +1 -1
  82. package/dist/components/VersionHistory/index.mjs +2 -2
  83. package/dist/patterns/IndexTableLayout/index.mjs +2 -2
  84. package/dist/patterns/LayoutLoadingShimmer/index.mjs +2 -2
  85. package/dist/patterns/WizardModal/index.mjs +1 -1
  86. package/llms.txt +2 -1
  87. package/package.json +2 -2
  88. package/skills/ui-authoring/SKILL.md +8 -0
  89. package/skills/ui-authoring/STANDARD.md +137 -0
  90. package/skills/ui-authoring/TOKENS.md +3 -1
  91. package/skills/ui-authoring/lanes.json +22 -0
  92. package/dist/Breadcrumbs-CQUe9VTM.mjs.map +0 -1
  93. package/dist/PageHeader-DJF7nxgN.mjs.map +0 -1
  94. package/dist/TableControls-C5fNNdmT.mjs.map +0 -1
@@ -1,2 +1,2 @@
1
- import { n as TableControlsFiltersV2Props, r as TableControlsProps, t as TableControls } from "./TableControls-DCtTiWk6.mjs";
1
+ import { n as TableControlsFiltersV2Props, r as TableControlsProps, t as TableControls } from "./TableControls-ETB0Xk5X.mjs";
2
2
  export { TableControlsFiltersV2Props, TableControlsProps, TableControls as default };
@@ -1,2 +1,2 @@
1
- import { n as BreadcrumbsItemProps, r as BreadcrumbsProps, t as Breadcrumbs } from "../../Breadcrumbs-C2ThOYJ-.mjs";
1
+ import { n as BreadcrumbsItemProps, r as BreadcrumbsProps, t as Breadcrumbs } from "../../Breadcrumbs-47jYLqNP.mjs";
2
2
  export { Breadcrumbs, Breadcrumbs as default, BreadcrumbsItemProps, BreadcrumbsProps };
@@ -1,2 +1,2 @@
1
- import { t as Breadcrumbs } from "../../Breadcrumbs-CQUe9VTM.mjs";
1
+ import { t as Breadcrumbs } from "../../Breadcrumbs-gRAsKF4R.mjs";
2
2
  export { Breadcrumbs, Breadcrumbs as default };
@@ -1,2 +1,2 @@
1
- import { n as CaretButton, r as flattenOptions, t as Combobox } from "../../Combobox-BXHCfVpE.mjs";
1
+ import { n as CaretButton, r as flattenOptions, t as Combobox } from "../../Combobox-CBM-oY-e.mjs";
2
2
  export { CaretButton, Combobox, Combobox as default, flattenOptions };
@@ -1,3 +1,3 @@
1
1
  import { n as useFormGroup, t as FormGroupContext } from "../../useFormGroup-CsKC93Pt.mjs";
2
- import { t as ConfigFormGroup } from "../../ConfigFormGroup-BE3yR_VU.mjs";
2
+ import { t as ConfigFormGroup } from "../../ConfigFormGroup-CidT_cE9.mjs";
3
3
  export { ConfigFormGroup, ConfigFormGroup as default, FormGroupContext, useFormGroup };
@@ -1,12 +1,12 @@
1
- import { n as ControlBarProps, t as ControlBar } from "../../../ControlBar-D9KflqmH.mjs";
1
+ import { n as ControlBarProps, t as ControlBar } from "../../../ControlBar-RIz-xjxs.mjs";
2
2
  import { a as FilterConditionOperator, c as FilterFieldType, d as FilterRuleValue, f as FilterRuleValueChange, g as isEmptyState, h as TopLevelFilterRule, i as EMPTY_FILTER_STATE, l as FilterOperator, m as FilterStateV2, n as CompoundExpression, o as FilterField, p as FilterSize, r as DateRangeFilterValue, s as FilterFieldSource, t as AndGroup, u as FilterRule } from "../../../types-EodOhsjw.mjs";
3
3
  import { n as RawFieldInfo, r as buildFieldRegistry, t as FieldRegistry } from "../../../FieldRegistry-B5E-GN91.mjs";
4
4
  import { n as ValueControlResolver, r as resolveValueControl, t as ResolveValueControlOptions } from "../../../value-control-resolver-C-UrXVlB.mjs";
5
5
  import { t as FilterBar } from "../../../FilterBar-BQWpTi2b.mjs";
6
6
  import { a as ComboboxFilterConfig, c as FilterRenderOptions, d as InputFilterConfig, f as MultiSelectFilterConfig, i as BaseFilterConfig, l as FilterTypeDefinition, o as DateRangeFilterConfig, p as SelectFilterConfig, r as BaseActiveFilter, s as FilterConfig, t as ActiveFilter, u as FilterTypeResolver } from "../../../types-CrRWZ0Ia.mjs";
7
7
  import { i as TableViewConfigurationProps, n as TableViewConfigurationDropdown, r as TableViewConfigurationDropdownProps, t as TableViewConfiguration } from "../../../TableViewConfigurationDropdown-BvOlDkJy.mjs";
8
- import { n as TableControlsFiltersV2Props, r as TableControlsProps, t as TableControls } from "../../../TableControls-DCtTiWk6.mjs";
9
- import { n as DataTableCompactBar } from "../../../CompactBar-CfrrZ69k.mjs";
8
+ import { n as TableControlsFiltersV2Props, r as TableControlsProps, t as TableControls } from "../../../TableControls-ETB0Xk5X.mjs";
9
+ import { n as DataTableCompactBar } from "../../../CompactBar-D9egXqY_.mjs";
10
10
  import { i as useTableControls, n as TableControlsContextProps, r as TableControlsProvider, t as TableControlsContext } from "../../../TableControlsContext-CzJCMrSe.mjs";
11
11
  import { a as resolveFilterTypeDefinition, i as isFilterActive, n as FiltersContainer, r as getActiveFilters } from "../../../filters-jG9Y3UKb.mjs";
12
12
  import { t as dateRuleIntent } from "../../../date-rule-intent-C5C8HB1v.mjs";
@@ -1,2 +1,2 @@
1
- import { A as isNumericComparisonOperator, B as useTableControls, C as useFilterBarSize, D as getOperatorsForField, E as getDefaultOperatorForType, F as getActiveFilters, H as DataTableCompactBar, I as isFilterActive, L as resolveFilterTypeDefinition, M as isValuelessOperator, N as reconcileValueForOperator, O as getOperatorsForType, P as FiltersContainer, R as TableControlsContext, S as FILTER_SIZE_TOKENS, T as emptyValueForRule, V as ControlBar, _ as EMPTY_FILTER_STATE, a as encodeFilterStateToUrlParam, b as resolveValueControl, c as FilterBar_default, d as TableViewConfiguration, f as TableViewConfigurationDropdown, g as pruneToRegistry, h as isFilterStateV2, i as decodeFilterStateFromUrl, j as isRangeOperator, k as isCompleteDateRange, l as resolveDateRangeRuleValue, m as hasCompleteValue, n as applyFilterStateToSearchParams, o as FieldRegistry, p as useFilterStateV2, r as decodeFilterStateFromString, s as buildFieldRegistry, t as FILTER_STATE_URL_PARAM, u as TableControls, v as isEmptyState, w as NUMERIC_COMPARISON_OPERATORS, x as dateRuleIntent, y as PillShell, z as TableControlsProvider } from "../../../TableControls-C5fNNdmT.mjs";
1
+ import { A as isNumericComparisonOperator, B as useTableControls, C as useFilterBarSize, D as getOperatorsForField, E as getDefaultOperatorForType, F as getActiveFilters, H as DataTableCompactBar, I as isFilterActive, L as resolveFilterTypeDefinition, M as isValuelessOperator, N as reconcileValueForOperator, O as getOperatorsForType, P as FiltersContainer, R as TableControlsContext, S as FILTER_SIZE_TOKENS, T as emptyValueForRule, V as ControlBar, _ as EMPTY_FILTER_STATE, a as encodeFilterStateToUrlParam, b as resolveValueControl, c as FilterBar_default, d as TableViewConfiguration, f as TableViewConfigurationDropdown, g as pruneToRegistry, h as isFilterStateV2, i as decodeFilterStateFromUrl, j as isRangeOperator, k as isCompleteDateRange, l as resolveDateRangeRuleValue, m as hasCompleteValue, n as applyFilterStateToSearchParams, o as FieldRegistry, p as useFilterStateV2, r as decodeFilterStateFromString, s as buildFieldRegistry, t as FILTER_STATE_URL_PARAM, u as TableControls, v as isEmptyState, w as NUMERIC_COMPARISON_OPERATORS, x as dateRuleIntent, y as PillShell, z as TableControlsProvider } from "../../../TableControls-qxoq5abn.mjs";
2
2
  export { ControlBar, DataTableCompactBar, EMPTY_FILTER_STATE, FILTER_SIZE_TOKENS, FILTER_STATE_URL_PARAM, FieldRegistry, FilterBar_default as FilterBar, FiltersContainer, NUMERIC_COMPARISON_OPERATORS, PillShell, TableControlsContext, TableControlsProvider, TableViewConfiguration, TableViewConfigurationDropdown, applyFilterStateToSearchParams, buildFieldRegistry, dateRuleIntent, decodeFilterStateFromString, decodeFilterStateFromUrl, TableControls as default, emptyValueForRule, encodeFilterStateToUrlParam, getActiveFilters, getDefaultOperatorForType, getOperatorsForField, getOperatorsForType, hasCompleteValue, isCompleteDateRange, isEmptyState, isFilterActive, isFilterStateV2, isNumericComparisonOperator, isRangeOperator, isValuelessOperator, pruneToRegistry, reconcileValueForOperator, resolveDateRangeRuleValue, resolveFilterTypeDefinition, resolveValueControl, useFilterBarSize, useFilterStateV2, useTableControls };
@@ -1,6 +1,6 @@
1
1
  import { C as RowAction, D as RowDataWithTourTarget, E as RowDataWithSubrowsToAlwaysShowIds, O as SortProps, S as RenderValueStickerFormatConfig, T as RowDataWithSubrows, _ as DataTableColumns, a as DataTableColumnBaseFormat, b as DatetimeConfig, c as DataTableColumnDatetimeFormat, d as DataTableColumnImageFormat, f as DataTableColumnNumberFormat, g as DataTableColumnURLFormat, h as DataTableColumnStringFormat, i as ColumnConfig, k as StickerMapping, l as DataTableColumnFormat, m as DataTableColumnStickerFormat, n as ClientFilterConfig, o as DataTableColumnCheckboxFormat, p as DataTableColumnPiiFormat, r as ClientFilterType, s as DataTableColumnDateFormat, t as BulkAction, u as DataTableColumnIDFormat, v as DataTableVariables, w as RowDataWithDetails, x as HeadlessFilterConfig, y as DateConfig } from "../../types-DxJyE_U8.mjs";
2
2
  import { r as useTableColumns, t as RenderFormatFn } from "../../useTableColumns-DSXRInPb.mjs";
3
- import { a as FloatingActionBarContainer, i as DataTableProps, n as DataTableContainer, r as DataTableControls, t as DataTable } from "../../DataTable-BdKUCgcZ.mjs";
3
+ import { a as FloatingActionBarContainer, i as DataTableProps, n as DataTableContainer, r as DataTableControls, t as DataTable } from "../../DataTable-D15C5lfd.mjs";
4
4
  import { t as FloatingActionBar } from "../../FloatingActionBar-CpvLefPm.mjs";
5
5
  import { t as Inserter } from "../../Inserter-BKVrJ4M5.mjs";
6
6
  import { n as getFilterFnName, t as generateClientFilters } from "../../clientFilterUtils-BqDn44aM.mjs";
@@ -1,2 +1,2 @@
1
- import { S as getFilterFnName, _ as renderAsString, a as useTableColumns, b as getColumnWidths, c as renderAsCheckboxHeader, d as renderAsDatetime, f as renderAsLightweightImage, g as renderAsSticker, h as renderAsPii, i as FloatingActionBarContainer, l as renderAsCopyableString, m as renderAsPDSFormat, n as DataTableContainer, o as Inserter, p as renderAsNumber, r as DataTableControls, s as renderAsCheckbox, t as DataTable, u as renderAsDate, v as renderAsURL, x as generateClientFilters, y as FloatingActionBar } from "../../DataTable-F9R-aQCg.mjs";
1
+ import { S as getFilterFnName, _ as renderAsString, a as useTableColumns, b as getColumnWidths, c as renderAsCheckboxHeader, d as renderAsDatetime, f as renderAsLightweightImage, g as renderAsSticker, h as renderAsPii, i as FloatingActionBarContainer, l as renderAsCopyableString, m as renderAsPDSFormat, n as DataTableContainer, o as Inserter, p as renderAsNumber, r as DataTableControls, s as renderAsCheckbox, t as DataTable, u as renderAsDate, v as renderAsURL, x as generateClientFilters, y as FloatingActionBar } from "../../DataTable-DQ8axNfo.mjs";
2
2
  export { DataTable, DataTable as default, DataTableContainer, DataTableControls, FloatingActionBar, FloatingActionBarContainer, Inserter, generateClientFilters, getColumnWidths, getFilterFnName, renderAsCheckbox, renderAsCheckboxHeader, renderAsCopyableString, renderAsDate, renderAsDatetime, renderAsLightweightImage, renderAsNumber, renderAsPDSFormat, renderAsPii, renderAsSticker, renderAsString, renderAsURL, useTableColumns };
@@ -1,2 +1,2 @@
1
- import { a as RangeCalendar, i as DateField, n as Calendar, r as DateRangePicker, t as DatePicker } from "../../DatePicker-CkNQjfCN.mjs";
1
+ import { a as RangeCalendar, i as DateField, n as Calendar, r as DateRangePicker, t as DatePicker } from "../../DatePicker-D0cvVbzq.mjs";
2
2
  export { Calendar, DateField, DatePicker, DatePicker as default, DateRangePicker, RangeCalendar };
@@ -1,2 +1,2 @@
1
- import { a as CheckboxField, c as SegmentedControlField, d as TextField, f as ToggleField, i as CheckboxGroupField, l as SelectField, m as FormField, n as TableBoxField, o as ComboboxField, p as splitOutFormFieldProps, r as ListBoxField, s as RadioGroupField, t as TABLE_BOX_FIELD_ADD_BUTTON_ARIA_LABEL, u as TextAreaField } from "../../FormField-D0y1uRV5.mjs";
1
+ import { a as CheckboxField, c as SegmentedControlField, d as TextField, f as ToggleField, i as CheckboxGroupField, l as SelectField, m as FormField, n as TableBoxField, o as ComboboxField, p as splitOutFormFieldProps, r as ListBoxField, s as RadioGroupField, t as TABLE_BOX_FIELD_ADD_BUTTON_ARIA_LABEL, u as TextAreaField } from "../../FormField-C0cd1zVd.mjs";
2
2
  export { CheckboxField, CheckboxGroupField, ComboboxField, FormField, FormField as default, ListBoxField, RadioGroupField, SegmentedControlField, SelectField, TABLE_BOX_FIELD_ADD_BUTTON_ARIA_LABEL, TableBoxField, TextAreaField, TextField, ToggleField, splitOutFormFieldProps };
@@ -1,2 +1,2 @@
1
- import { t as HoverCopyableField } from "../../HoverCopyableField-DkOosH8z.mjs";
1
+ import { t as HoverCopyableField } from "../../HoverCopyableField-D-BubaRd.mjs";
2
2
  export { HoverCopyableField as default };
@@ -1,2 +1,2 @@
1
- import { t as Link } from "../../Link-BSuXrvTu.mjs";
1
+ import { t as Link } from "../../Link-Cf__H8gD.mjs";
2
2
  export { Link, Link as default };
@@ -1,2 +1,2 @@
1
- import { n as useListBoxContext, t as ListBox } from "../../ListBox-BLoJVezh.mjs";
1
+ import { n as useListBoxContext, t as ListBox } from "../../ListBox-eoyBHtnJ.mjs";
2
2
  export { ListBox, ListBox as default, useListBoxContext };
@@ -1,2 +1,2 @@
1
- import { i as Modal_default, n as ModalContent, r as ModalTrigger, t as ModalClose } from "../../Modal-IJdbLORi.mjs";
1
+ import { i as Modal_default, n as ModalContent, r as ModalTrigger, t as ModalClose } from "../../Modal-kjUptzg1.mjs";
2
2
  export { ModalClose, ModalContent, ModalTrigger, Modal_default as default };
@@ -1,2 +1,2 @@
1
- import { n as PageHeaderContainer, r as PageHeaderProps, t as PageHeader } from "../../PageHeader-Czj42pyK.mjs";
1
+ import { n as PageHeaderContainer, r as PageHeaderProps, t as PageHeader } from "../../PageHeader-CnpDVOck.mjs";
2
2
  export { PageHeaderContainer, PageHeaderProps, PageHeader as default };
@@ -1,2 +1,2 @@
1
- import { n as PageHeaderContainer, t as PageHeader } from "../../PageHeader-DJF7nxgN.mjs";
1
+ import { n as PageHeaderContainer, t as PageHeader } from "../../PageHeader-D2j2XHD9.mjs";
2
2
  export { PageHeaderContainer, PageHeader as default };
@@ -1,2 +1,2 @@
1
- import { a as MIN_PAGE_SIZE, i as DEFAULT_PAGE_SIZE_OPTIONS, n as PAGE_LIMIT_BEFORE_SCROLL_MODE, r as PageSelector, t as Pagination_default } from "../../Pagination-C5ANr9M0.mjs";
1
+ import { a as MIN_PAGE_SIZE, i as DEFAULT_PAGE_SIZE_OPTIONS, n as PAGE_LIMIT_BEFORE_SCROLL_MODE, r as PageSelector, t as Pagination_default } from "../../Pagination-DtK-jbEY.mjs";
2
2
  export { DEFAULT_PAGE_SIZE_OPTIONS, MIN_PAGE_SIZE, PAGE_LIMIT_BEFORE_SCROLL_MODE, PageSelector, Pagination_default as default };
@@ -1,2 +1,2 @@
1
- import { t as Pii_default } from "../../Pii-G16_b7Yk.mjs";
1
+ import { t as Pii_default } from "../../Pii-DueIK287.mjs";
2
2
  export { Pii_default as default };
@@ -1,2 +1,2 @@
1
- import { a as PopoverPortal, i as PopoverContent, n as PopoverCard, o as PopoverTrigger, r as PopoverClose, s as Popover_default, t as PopoverAnchor } from "../../Popover-532iYFek.mjs";
1
+ import { a as PopoverPortal, i as PopoverContent, n as PopoverCard, o as PopoverTrigger, r as PopoverClose, s as Popover_default, t as PopoverAnchor } from "../../Popover-BcII7usF.mjs";
2
2
  export { PopoverAnchor, PopoverCard, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, Popover_default as default };
@@ -1,2 +1,2 @@
1
- import { n as Select, r as SelectHeader, t as Option } from "../../Select-hnXfPywt.mjs";
1
+ import { n as Select, r as SelectHeader, t as Option } from "../../Select-BJ9ACmRD.mjs";
2
2
  export { Option, Select, Select as default, SelectHeader };
@@ -8,7 +8,7 @@ import { focusStyle } from "../../mixins/focus.mjs";
8
8
  import { n as Stack, t as HStack } from "../../Stack-BkC7FCdF.mjs";
9
9
  import { n as useFormField, t as FormControlContext } from "../../useFormField-CbNYbDdp.mjs";
10
10
  import { t as Checkbox } from "../../Checkbox-BaJ-dGdX.mjs";
11
- import { Color, Spacing } from "@persona/design-tokens";
11
+ import { Color, Spacing, Typography } from "@persona/design-tokens";
12
12
  import { Children, cloneElement, isValidElement, useContext } from "react";
13
13
  import { jsx, jsxs } from "react/jsx-runtime";
14
14
  //#region components/SelectionCard/SelectionCard.tsx
@@ -63,33 +63,41 @@ const Copy = styled(Stack)`
63
63
  flex: 1 1 auto;
64
64
  min-width: 0;
65
65
  `;
66
- /** Centers a 16px icon on the label line. `iconBackground` gives it a 32px well. */
66
+ /** Height of one line of label text. */
67
+ const LABEL_LINE_HEIGHT = Typography.TextMediumBold.lineHeight;
68
+ /** Size of the checkbox and the icon. */
69
+ const CONTROL_SIZE = Spacing[4];
70
+ /**
71
+ * Holds the label. With a checkbox or icon, the label's first line is pulled up to share their
72
+ * 16px height and center line. Only the top moves, so the gap to the description stays the same
73
+ * with or without a checkbox or icon.
74
+ */
75
+ const LabelRow = styled.span`
76
+ display: block;
77
+ ${({ $withControl }) => $withControl && css`
78
+ margin-top: calc((${CONTROL_SIZE} - ${LABEL_LINE_HEIGHT}) / 2);
79
+ `}
80
+ `;
81
+ /** Centers a 16px icon on the checkbox and label center line. */
67
82
  const IconSlot = styled.span`
68
83
  display: inline-flex;
69
84
  flex: 0 0 auto;
70
85
  align-items: center;
71
86
  justify-content: center;
72
87
  align-self: flex-start;
73
- min-height: ${Spacing[5]};
88
+ height: ${CONTROL_SIZE};
74
89
  color: ${({ theme }) => semanticColor(theme, "FgPrimary", theme.color.text.primary)};
75
90
 
76
91
  svg {
77
- width: 16px;
78
- height: 16px;
92
+ width: ${CONTROL_SIZE};
93
+ height: ${CONTROL_SIZE};
79
94
  }
80
-
81
- ${({ $background, theme }) => $background && css`
82
- width: ${Spacing[6]};
83
- height: ${Spacing[6]};
84
- border-radius: ${theme.card.borderRadius};
85
- background-color: ${semanticColor(theme, "SurfaceSecondary", theme.color.background.secondary)};
86
- `}
87
95
  `;
88
96
  const Marker = styled.span`
89
97
  display: inline-flex;
90
98
  flex: 0 0 auto;
91
99
  align-items: center;
92
- height: ${Spacing[5]};
100
+ height: ${CONTROL_SIZE};
93
101
 
94
102
  /* The card draws the only focus ring and the only disabled fade. */
95
103
  && input:focus-visible ~ [aria-hidden] {
@@ -116,7 +124,7 @@ const TooltipTrigger = styled.span`
116
124
  width: 100%;
117
125
  align-self: stretch;
118
126
  `;
119
- const SelectionCard = ({ value, label, description, icon, iconBackground = false, disabled: disabledProp, disabledReason, name, checked = false, onChange, multiple = false, className }) => {
127
+ const SelectionCard = ({ value, label, description, icon, disabled: disabledProp, disabledReason, name, checked = false, onChange, multiple = false, className }) => {
120
128
  const disabled = !!useFormField({ disabled: disabledProp || void 0 }).disabled;
121
129
  const card = /* @__PURE__ */ jsxs(CardRoot, {
122
130
  className,
@@ -133,18 +141,18 @@ const SelectionCard = ({ value, label, description, icon, iconBackground = false
133
141
  disabled,
134
142
  onChange: (event) => onChange?.(event.target.checked)
135
143
  }) }),
136
- icon && /* @__PURE__ */ jsx(IconSlot, {
137
- $background: iconBackground,
138
- children: icon
139
- }),
144
+ icon && /* @__PURE__ */ jsx(IconSlot, { children: icon }),
140
145
  /* @__PURE__ */ jsxs(Copy, {
141
146
  spacing: Spacing[1],
142
- children: [/* @__PURE__ */ jsx(Paragraph, {
143
- as: "span",
144
- size: "lg",
145
- weight: "bold",
146
- color: disabled ? "disabled" : "primary",
147
- children: label
147
+ children: [/* @__PURE__ */ jsx(LabelRow, {
148
+ $withControl: multiple || !!icon,
149
+ children: /* @__PURE__ */ jsx(Paragraph, {
150
+ as: "span",
151
+ size: "md",
152
+ weight: "bold",
153
+ color: disabled ? "disabled" : "primary",
154
+ children: label
155
+ })
148
156
  }), description && /* @__PURE__ */ jsx(Paragraph, {
149
157
  as: "span",
150
158
  size: "md",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../components/SelectionCard/SelectionCard.tsx","../../../components/SelectionCard/SelectionCardGroup.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport Checkbox from '@persona/design-system/components/Checkbox';\nimport { HStack, Stack } from '@persona/design-system/components/Stack';\nimport { Paragraph } from '@persona/design-system/components/Text';\nimport { Tooltip } from '@persona/design-system/components/Tooltip';\nimport { focusStyle } from '@persona/design-system/mixins/focus';\nimport { Color, Spacing } from '@persona/design-tokens';\nimport useFormField from 'design-system/components/FormControl/useFormField';\nimport { opacityOf, withAlpha } from 'design-system/lib/color';\nimport { semanticColor, semanticOnly, semanticTokens } from 'design-system/lib/semanticColor';\n\nexport interface SelectionCardProps {\n /** Value submitted with the group when this card is selected. */\n value: string;\n /** Required visible name. Left-aligned with `description`. */\n label: string;\n /** Optional supporting copy under the label. Omitted when not passed. */\n description?: string;\n /**\n * Optional icon to the left of the label. Leave it off when it does not add\n * meaning, including in multiple mode.\n */\n icon?: ReactElement;\n /**\n * Draw a secondary background behind `icon`. Ignored when `icon` is omitted.\n */\n iconBackground?: boolean;\n disabled?: boolean;\n /** Tooltip shown on hover only while `disabled` is set. */\n disabledReason?: string;\n /** Injected by `SelectionCardGroup`. */\n name?: string;\n /** Injected by `SelectionCardGroup`. */\n checked?: boolean;\n /** Injected by `SelectionCardGroup`. */\n onChange?: (checked: boolean) => void;\n /** Injected by `SelectionCardGroup`. */\n multiple?: boolean;\n /** Layout hook for this card. */\n className?: string;\n}\n\nconst CardRoot = styled.label<{ $selected: boolean; $disabled: boolean }>`\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n cursor: ${({ $disabled }) => ($disabled ? 'default' : 'pointer')};\n pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};\n border-radius: ${({ theme }) => theme.card.borderRadius};\n outline: none;\n\n /* Keyboard focus only. A click focuses the input too, and should not draw this ring. */\n &:has(:focus-visible) {\n ${focusStyle}\n }\n\n border: 1px solid\n ${({ theme, $selected, $disabled }) => {\n if ($disabled) {\n return semanticColor(theme, 'InputBorderDisabled', Color.BorderInputDisabled);\n }\n if ($selected) {\n return semanticColor(theme, 'BorderAccent', theme.color.primary.brand);\n }\n return semanticColor(theme, 'BorderDefault', theme.color.border.input);\n }};\n\n background-color: ${({ theme, $selected, $disabled }) => {\n if ($disabled) {\n return semanticColor(theme, 'InputSurfaceDisabled', Color.BackgroundInputDisabled);\n }\n if ($selected) {\n const tokens = semanticTokens(theme);\n return tokens\n ? withAlpha(tokens.SurfaceAccent, tokens.Opacity25)\n : theme.color.background.highlight;\n }\n return semanticColor(theme, 'SurfacePrimary', theme.color.background.primary);\n }};\n\n ${({ $disabled, $selected }) =>\n !$disabled &&\n !$selected &&\n css`\n &:hover {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceHover', Color.BackgroundInteractiveHover)};\n }\n `}\n\n ${({ $disabled }) =>\n $disabled &&\n css`\n ${semanticOnly((tokens) => `opacity: ${opacityOf(tokens.Opacity65)};`)}\n `}\n`;\n\nconst Body = styled.div`\n padding: ${Spacing[4]};\n`;\n\nconst Copy = styled(Stack)`\n flex: 1 1 auto;\n min-width: 0;\n`;\n\n/** Centers a 16px icon on the label line. `iconBackground` gives it a 32px well. */\nconst IconSlot = styled.span<{ $background: boolean }>`\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n align-self: flex-start;\n min-height: ${Spacing[5]};\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n\n svg {\n width: 16px;\n height: 16px;\n }\n\n ${({ $background, theme }) =>\n $background &&\n css`\n width: ${Spacing[6]};\n height: ${Spacing[6]};\n border-radius: ${theme.card.borderRadius};\n background-color: ${semanticColor(theme, 'SurfaceSecondary', theme.color.background.secondary)};\n `}\n`;\nconst Marker = styled.span`\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n height: ${Spacing[5]};\n\n /* The card draws the only focus ring and the only disabled fade. */\n && input:focus-visible ~ [aria-hidden] {\n outline: none;\n }\n\n && input ~ [aria-hidden] {\n opacity: 1;\n }\n`;\n\nconst NativeRadio = styled.input`\n cursor: inherit;\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n border: 0;\n outline: none;\n pointer-events: none;\n`;\n\nconst TooltipTrigger = styled.span`\n display: flex;\n flex-direction: column;\n width: 100%;\n align-self: stretch;\n`;\n\nexport const SelectionCard = ({\n value,\n label,\n description,\n icon,\n iconBackground = false,\n disabled: disabledProp,\n disabledReason,\n name,\n checked = false,\n onChange,\n multiple = false,\n className,\n}: SelectionCardProps) => {\n const field = useFormField({ disabled: disabledProp || undefined });\n const disabled = !!field.disabled;\n const card = (\n <CardRoot className={className} $selected={checked} $disabled={disabled}>\n <Body>\n <HStack align='flex-start' spacing={icon ? Spacing[3] : Spacing[2]}>\n {multiple && (\n <Marker>\n <Checkbox\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={(event) => onChange?.(event.target.checked)}\n />\n </Marker>\n )}\n {icon && <IconSlot $background={iconBackground}>{icon}</IconSlot>}\n <Copy spacing={Spacing[1]}>\n <Paragraph as='span' size='lg' weight='bold' color={disabled ? 'disabled' : 'primary'}>\n {label}\n </Paragraph>\n {description && (\n <Paragraph\n as='span'\n size='md'\n color={disabled ? 'disabled' : checked ? 'primary' : 'secondary'}\n >\n {description}\n </Paragraph>\n )}\n </Copy>\n </HStack>\n </Body>\n {!multiple && (\n <NativeRadio\n type='radio'\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={() => onChange?.(true)}\n />\n )}\n </CardRoot>\n );\n\n if (disabled && disabledReason) {\n return <Tooltip trigger={<TooltipTrigger>{card}</TooltipTrigger>}>{disabledReason}</Tooltip>;\n }\n\n return card;\n};\n\nexport default SelectionCard;\n","import {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useContext,\n} from 'react';\nimport styled, { css } from 'styled-components';\n\nimport Stack from '@persona/design-system/components/Stack';\nimport { Spacing } from '@persona/design-tokens';\nimport { FormControlContext } from 'design-system/components/FormControl/useFormField';\nimport useControlled from 'design-system/lib/useControlled';\n\nimport SelectionCard, { type SelectionCardProps } from './SelectionCard';\n\ninterface SelectionCardGroupBaseProps {\n /** Shared input name. Radios in a single group arrow-key together. */\n name?: string;\n /** Layout hook for the group. Not forwarded onto each card. */\n className?: string;\n /** Place two cards in a column. Two cards sit side by side when this is omitted. Three or more always stack. */\n stack?: boolean;\n /** Accessible name for the group. */\n 'aria-label'?: string;\n /** Id of the element that names the group, such as a field label. */\n 'aria-labelledby'?: string;\n children: ReactNode;\n}\n\nexport interface SelectionCardGroupSingleProps extends SelectionCardGroupBaseProps {\n /** One card may be selected. Cards render no radio mark. */\n multiple?: false;\n 'aria-required'?: boolean;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n}\n\nexport interface SelectionCardGroupMultipleProps extends SelectionCardGroupBaseProps {\n /** Several cards may be selected. Each card shows a checkbox. */\n multiple: true;\n value?: string[];\n defaultValue?: string[];\n onChange?: (value: string[]) => void;\n}\n\nexport type SelectionCardGroupProps =\n | SelectionCardGroupSingleProps\n | SelectionCardGroupMultipleProps;\n\nconst selectionCards = (children: ReactNode) =>\n Children.toArray(children).filter(\n (child): child is ReactElement<SelectionCardProps> =>\n isValidElement(child) && child.type === SelectionCard,\n );\n\nconst firstSelectableValue = (children: ReactNode) =>\n selectionCards(children).find((card) => !card.props.disabled)?.props.value;\n\nconst groupLayout = (children: ReactNode, stack?: boolean) => {\n const inline = selectionCards(children).length === 2 && !stack;\n return {\n $inline: inline,\n direction: inline ? ('horizontal' as const) : ('vertical' as const),\n equal: inline,\n align: inline ? ('stretch' as const) : undefined,\n };\n};\n\nconst Group = styled(Stack)<{ $inline: boolean }>`\n ${({ $inline }) =>\n $inline &&\n css`\n > * {\n width: auto;\n min-width: 0;\n align-self: stretch;\n }\n `}\n`;\nconst renderCards = (\n children: ReactNode,\n getProps: (card: SelectionCardProps) => Partial<SelectionCardProps>,\n) =>\n Children.map(children, (child) => {\n if (!isValidElement(child) || child.type !== SelectionCard) {\n return child;\n }\n const card = child as ReactElement<SelectionCardProps>;\n return cloneElement(card, getProps(card.props));\n });\n\nconst SingleGroup = ({\n name,\n className,\n stack,\n children,\n value: valueProp,\n defaultValue,\n onChange,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-required': ariaRequired,\n}: SelectionCardGroupSingleProps) => {\n const field = useContext(FormControlContext);\n const [value, setValue] = useControlled({\n controlledValue: valueProp,\n default: defaultValue ?? (field.disabled ? undefined : firstSelectableValue(children)),\n });\n\n return (\n <Group\n {...groupLayout(children, stack)}\n className={className}\n spacing={Spacing[2]}\n role='radiogroup'\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-required={ariaRequired}\n >\n {renderCards(children, (card) => ({\n name,\n multiple: false,\n checked: card.value === value,\n onChange: () => {\n if (field.disabled || card.disabled) {\n return;\n }\n setValue(card.value);\n onChange?.(card.value);\n },\n }))}\n </Group>\n );\n};\n\nconst MultipleGroup = ({\n name,\n className,\n stack,\n children,\n value: valueProp,\n defaultValue,\n onChange,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n}: SelectionCardGroupMultipleProps) => {\n const field = useContext(FormControlContext);\n const [value, setValue] = useControlled({\n controlledValue: valueProp,\n default: defaultValue ?? [],\n });\n const selected = value ?? [];\n\n return (\n <Group\n {...groupLayout(children, stack)}\n className={className}\n spacing={Spacing[2]}\n role='group'\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n >\n {renderCards(children, (card) => ({\n name,\n multiple: true,\n checked: selected.includes(card.value),\n onChange: (checked: boolean) => {\n if (field.disabled || card.disabled) {\n return;\n }\n const next = checked\n ? selected.includes(card.value)\n ? selected\n : [...selected, card.value]\n : selected.filter((item) => item !== card.value);\n setValue(next);\n onChange?.(next);\n },\n }))}\n </Group>\n );\n};\n\nexport const SelectionCardGroup = (props: SelectionCardGroupProps) => {\n const field = useContext(FormControlContext);\n /* Each card's checkbox would otherwise take the enclosing field's shared input id. */\n return (\n <FormControlContext.Provider value={{ ...field, inputId: undefined }}>\n {props.multiple ? <MultipleGroup {...props} /> : <SingleGroup {...props} />}\n </FormControlContext.Provider>\n );\n};\n\nexport default SelectionCardGroup;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../components/SelectionCard/SelectionCard.tsx","../../../components/SelectionCard/SelectionCardGroup.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport Checkbox from '@persona/design-system/components/Checkbox';\nimport { HStack, Stack } from '@persona/design-system/components/Stack';\nimport { Paragraph } from '@persona/design-system/components/Text';\nimport { Tooltip } from '@persona/design-system/components/Tooltip';\nimport { focusStyle } from '@persona/design-system/mixins/focus';\nimport { Color, Spacing, Typography } from '@persona/design-tokens';\nimport useFormField from 'design-system/components/FormControl/useFormField';\nimport { opacityOf, withAlpha } from 'design-system/lib/color';\nimport { semanticColor, semanticOnly, semanticTokens } from 'design-system/lib/semanticColor';\n\nexport interface SelectionCardProps {\n /** Value submitted with the group when this card is selected. */\n value: string;\n /** Required visible name. Left-aligned with `description`. */\n label: string;\n /** Optional supporting copy under the label. Omitted when not passed. */\n description?: string;\n /**\n * Optional icon to the left of the label. Leave it off when it does not add\n * meaning, including in multiple mode.\n */\n icon?: ReactElement;\n disabled?: boolean;\n /** Tooltip shown on hover only while `disabled` is set. */\n disabledReason?: string;\n /** Injected by `SelectionCardGroup`. */\n name?: string;\n /** Injected by `SelectionCardGroup`. */\n checked?: boolean;\n /** Injected by `SelectionCardGroup`. */\n onChange?: (checked: boolean) => void;\n /** Injected by `SelectionCardGroup`. */\n multiple?: boolean;\n /** Layout hook for this card. */\n className?: string;\n}\n\nconst CardRoot = styled.label<{ $selected: boolean; $disabled: boolean }>`\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n width: 100%;\n box-sizing: border-box;\n overflow: hidden;\n cursor: ${({ $disabled }) => ($disabled ? 'default' : 'pointer')};\n pointer-events: ${({ $disabled }) => ($disabled ? 'none' : 'auto')};\n border-radius: ${({ theme }) => theme.card.borderRadius};\n outline: none;\n\n /* Keyboard focus only. A click focuses the input too, and should not draw this ring. */\n &:has(:focus-visible) {\n ${focusStyle}\n }\n\n border: 1px solid\n ${({ theme, $selected, $disabled }) => {\n if ($disabled) {\n return semanticColor(theme, 'InputBorderDisabled', Color.BorderInputDisabled);\n }\n if ($selected) {\n return semanticColor(theme, 'BorderAccent', theme.color.primary.brand);\n }\n return semanticColor(theme, 'BorderDefault', theme.color.border.input);\n }};\n\n background-color: ${({ theme, $selected, $disabled }) => {\n if ($disabled) {\n return semanticColor(theme, 'InputSurfaceDisabled', Color.BackgroundInputDisabled);\n }\n if ($selected) {\n const tokens = semanticTokens(theme);\n return tokens\n ? withAlpha(tokens.SurfaceAccent, tokens.Opacity25)\n : theme.color.background.highlight;\n }\n return semanticColor(theme, 'SurfacePrimary', theme.color.background.primary);\n }};\n\n ${({ $disabled, $selected }) =>\n !$disabled &&\n !$selected &&\n css`\n &:hover {\n background-color: ${({ theme }) =>\n semanticColor(theme, 'SurfaceHover', Color.BackgroundInteractiveHover)};\n }\n `}\n\n ${({ $disabled }) =>\n $disabled &&\n css`\n ${semanticOnly((tokens) => `opacity: ${opacityOf(tokens.Opacity65)};`)}\n `}\n`;\n\nconst Body = styled.div`\n padding: ${Spacing[4]};\n`;\n\nconst Copy = styled(Stack)`\n flex: 1 1 auto;\n min-width: 0;\n`;\n\n/** Height of one line of label text. */\nconst LABEL_LINE_HEIGHT = Typography.TextMediumBold.lineHeight;\n\n/** Size of the checkbox and the icon. */\nconst CONTROL_SIZE = Spacing[4];\n\n/**\n * Holds the label. With a checkbox or icon, the label's first line is pulled up to share their\n * 16px height and center line. Only the top moves, so the gap to the description stays the same\n * with or without a checkbox or icon.\n */\nconst LabelRow = styled.span<{ $withControl: boolean }>`\n display: block;\n ${({ $withControl }) =>\n $withControl &&\n css`\n margin-top: calc((${CONTROL_SIZE} - ${LABEL_LINE_HEIGHT}) / 2);\n `}\n`;\n\n/** Centers a 16px icon on the checkbox and label center line. */\nconst IconSlot = styled.span`\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n align-self: flex-start;\n height: ${CONTROL_SIZE};\n color: ${({ theme }) => semanticColor(theme, 'FgPrimary', theme.color.text.primary)};\n\n svg {\n width: ${CONTROL_SIZE};\n height: ${CONTROL_SIZE};\n }\n`;\nconst Marker = styled.span`\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n height: ${CONTROL_SIZE};\n\n /* The card draws the only focus ring and the only disabled fade. */\n && input:focus-visible ~ [aria-hidden] {\n outline: none;\n }\n\n && input ~ [aria-hidden] {\n opacity: 1;\n }\n`;\n\nconst NativeRadio = styled.input`\n cursor: inherit;\n position: absolute;\n inset: 0;\n margin: 0;\n opacity: 0;\n border: 0;\n outline: none;\n pointer-events: none;\n`;\n\nconst TooltipTrigger = styled.span`\n display: flex;\n flex-direction: column;\n width: 100%;\n align-self: stretch;\n`;\n\nexport const SelectionCard = ({\n value,\n label,\n description,\n icon,\n disabled: disabledProp,\n disabledReason,\n name,\n checked = false,\n onChange,\n multiple = false,\n className,\n}: SelectionCardProps) => {\n const field = useFormField({ disabled: disabledProp || undefined });\n const disabled = !!field.disabled;\n const card = (\n <CardRoot className={className} $selected={checked} $disabled={disabled}>\n <Body>\n <HStack align='flex-start' spacing={icon ? Spacing[3] : Spacing[2]}>\n {multiple && (\n <Marker>\n <Checkbox\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={(event) => onChange?.(event.target.checked)}\n />\n </Marker>\n )}\n {icon && <IconSlot>{icon}</IconSlot>}\n <Copy spacing={Spacing[1]}>\n <LabelRow $withControl={multiple || !!icon}>\n <Paragraph\n as='span'\n size='md'\n weight='bold'\n color={disabled ? 'disabled' : 'primary'}\n >\n {label}\n </Paragraph>\n </LabelRow>\n {description && (\n <Paragraph\n as='span'\n size='md'\n color={disabled ? 'disabled' : checked ? 'primary' : 'secondary'}\n >\n {description}\n </Paragraph>\n )}\n </Copy>\n </HStack>\n </Body>\n {!multiple && (\n <NativeRadio\n type='radio'\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={() => onChange?.(true)}\n />\n )}\n </CardRoot>\n );\n\n if (disabled && disabledReason) {\n return <Tooltip trigger={<TooltipTrigger>{card}</TooltipTrigger>}>{disabledReason}</Tooltip>;\n }\n\n return card;\n};\n\nexport default SelectionCard;\n","import {\n Children,\n cloneElement,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useContext,\n} from 'react';\nimport styled, { css } from 'styled-components';\n\nimport Stack from '@persona/design-system/components/Stack';\nimport { Spacing } from '@persona/design-tokens';\nimport { FormControlContext } from 'design-system/components/FormControl/useFormField';\nimport useControlled from 'design-system/lib/useControlled';\n\nimport SelectionCard, { type SelectionCardProps } from './SelectionCard';\n\ninterface SelectionCardGroupBaseProps {\n /** Shared input name. Radios in a single group arrow-key together. */\n name?: string;\n /** Layout hook for the group. Not forwarded onto each card. */\n className?: string;\n /** Place two cards in a column. Two cards sit side by side when this is omitted. Three or more always stack. */\n stack?: boolean;\n /** Accessible name for the group. */\n 'aria-label'?: string;\n /** Id of the element that names the group, such as a field label. */\n 'aria-labelledby'?: string;\n children: ReactNode;\n}\n\nexport interface SelectionCardGroupSingleProps extends SelectionCardGroupBaseProps {\n /** One card may be selected. Cards render no radio mark. */\n multiple?: false;\n 'aria-required'?: boolean;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n}\n\nexport interface SelectionCardGroupMultipleProps extends SelectionCardGroupBaseProps {\n /** Several cards may be selected. Each card shows a checkbox. */\n multiple: true;\n value?: string[];\n defaultValue?: string[];\n onChange?: (value: string[]) => void;\n}\n\nexport type SelectionCardGroupProps =\n | SelectionCardGroupSingleProps\n | SelectionCardGroupMultipleProps;\n\nconst selectionCards = (children: ReactNode) =>\n Children.toArray(children).filter(\n (child): child is ReactElement<SelectionCardProps> =>\n isValidElement(child) && child.type === SelectionCard,\n );\n\nconst firstSelectableValue = (children: ReactNode) =>\n selectionCards(children).find((card) => !card.props.disabled)?.props.value;\n\nconst groupLayout = (children: ReactNode, stack?: boolean) => {\n const inline = selectionCards(children).length === 2 && !stack;\n return {\n $inline: inline,\n direction: inline ? ('horizontal' as const) : ('vertical' as const),\n equal: inline,\n align: inline ? ('stretch' as const) : undefined,\n };\n};\n\nconst Group = styled(Stack)<{ $inline: boolean }>`\n ${({ $inline }) =>\n $inline &&\n css`\n > * {\n width: auto;\n min-width: 0;\n align-self: stretch;\n }\n `}\n`;\nconst renderCards = (\n children: ReactNode,\n getProps: (card: SelectionCardProps) => Partial<SelectionCardProps>,\n) =>\n Children.map(children, (child) => {\n if (!isValidElement(child) || child.type !== SelectionCard) {\n return child;\n }\n const card = child as ReactElement<SelectionCardProps>;\n return cloneElement(card, getProps(card.props));\n });\n\nconst SingleGroup = ({\n name,\n className,\n stack,\n children,\n value: valueProp,\n defaultValue,\n onChange,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-required': ariaRequired,\n}: SelectionCardGroupSingleProps) => {\n const field = useContext(FormControlContext);\n const [value, setValue] = useControlled({\n controlledValue: valueProp,\n default: defaultValue ?? (field.disabled ? undefined : firstSelectableValue(children)),\n });\n\n return (\n <Group\n {...groupLayout(children, stack)}\n className={className}\n spacing={Spacing[2]}\n role='radiogroup'\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-required={ariaRequired}\n >\n {renderCards(children, (card) => ({\n name,\n multiple: false,\n checked: card.value === value,\n onChange: () => {\n if (field.disabled || card.disabled) {\n return;\n }\n setValue(card.value);\n onChange?.(card.value);\n },\n }))}\n </Group>\n );\n};\n\nconst MultipleGroup = ({\n name,\n className,\n stack,\n children,\n value: valueProp,\n defaultValue,\n onChange,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n}: SelectionCardGroupMultipleProps) => {\n const field = useContext(FormControlContext);\n const [value, setValue] = useControlled({\n controlledValue: valueProp,\n default: defaultValue ?? [],\n });\n const selected = value ?? [];\n\n return (\n <Group\n {...groupLayout(children, stack)}\n className={className}\n spacing={Spacing[2]}\n role='group'\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n >\n {renderCards(children, (card) => ({\n name,\n multiple: true,\n checked: selected.includes(card.value),\n onChange: (checked: boolean) => {\n if (field.disabled || card.disabled) {\n return;\n }\n const next = checked\n ? selected.includes(card.value)\n ? selected\n : [...selected, card.value]\n : selected.filter((item) => item !== card.value);\n setValue(next);\n onChange?.(next);\n },\n }))}\n </Group>\n );\n};\n\nexport const SelectionCardGroup = (props: SelectionCardGroupProps) => {\n const field = useContext(FormControlContext);\n /* Each card's checkbox would otherwise take the enclosing field's shared input id. */\n return (\n <FormControlContext.Provider value={{ ...field, inputId: undefined }}>\n {props.multiple ? <MultipleGroup {...props} /> : <SingleGroup {...props} />}\n </FormControlContext.Provider>\n );\n};\n\nexport default SelectionCardGroup;\n"],"mappings":"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"}
@@ -16,7 +16,7 @@ import { n as Button } from "../../IconButton-HWx5Hlmi.mjs";
16
16
  import { n as useFormField } from "../../useFormField-CbNYbDdp.mjs";
17
17
  import Input_default from "../Input/index.mjs";
18
18
  import { n as ErrorText } from "../../FormControl-C4CiA0H-.mjs";
19
- import { m as FormField, n as TableBoxField, p as splitOutFormFieldProps } from "../../FormField-D0y1uRV5.mjs";
19
+ import { m as FormField, n as TableBoxField, p as splitOutFormFieldProps } from "../../FormField-C0cd1zVd.mjs";
20
20
  import PillType from "./PillType.mjs";
21
21
  import { ErrorMessageByKind, NodeType, isASTChainNode, isASTContainerNode, isMethodChainNode } from "./parser/smart-text/types.mjs";
22
22
  import { parse as peg$parse } from "./parser/smart-text/parser.mjs";
@@ -1,2 +1,2 @@
1
- import { t as Spinner } from "../../Spinner-AnIk8d9M.mjs";
1
+ import { t as Spinner } from "../../Spinner-7Camx1vs.mjs";
2
2
  export { Spinner, Spinner as default };
@@ -1,2 +1,2 @@
1
- import { a as StickyTH, c as TableCellTitle, d as TableTR, f as TableTH, h as Table, i as StickyTD, l as TableIconTD, m as TableHeaderCell, n as TableBody, o as TableActionTD, p as TableRow, r as TableHead, s as TableCell, t as TableLayout, u as TableTD } from "../../Table-CmuWqmVN.mjs";
1
+ import { a as StickyTH, c as TableCellTitle, d as TableTR, f as TableTH, h as Table, i as StickyTD, l as TableIconTD, m as TableHeaderCell, n as TableBody, o as TableActionTD, p as TableRow, r as TableHead, s as TableCell, t as TableLayout, u as TableTD } from "../../Table-BIDaC0uS.mjs";
2
2
  export { StickyTD, StickyTH, Table, Table as default, TableActionTD, TableBody, TableCell, TableCellTitle, TableHead, TableHeaderCell, TableIconTD, TableLayout, TableRow, TableTD, TableTH, TableTR };
@@ -1,2 +1,2 @@
1
- import { n as TableBoxContext, t as TableBox } from "../../TableBox-BRJunn09.mjs";
1
+ import { n as TableBoxContext, t as TableBox } from "../../TableBox-Bn_XZEYd.mjs";
2
2
  export { TableBoxContext, TableBox as default };
@@ -6,8 +6,8 @@ import { semanticScrollbar } from "../../mixins/scrollbar.mjs";
6
6
  import { n as Stack, t as HStack } from "../../Stack-BkC7FCdF.mjs";
7
7
  import { n as Button, t as IconButton } from "../../IconButton-HWx5Hlmi.mjs";
8
8
  import { n as DropdownMenu_default } from "../../DropdownMenu-CedsmO5h.mjs";
9
- import { t as Spinner } from "../../Spinner-AnIk8d9M.mjs";
10
- import { i as Modal_default } from "../../Modal-IJdbLORi.mjs";
9
+ import { t as Spinner } from "../../Spinner-7Camx1vs.mjs";
10
+ import { i as Modal_default } from "../../Modal-kjUptzg1.mjs";
11
11
  import { t as TextAreaWithStyle } from "../../TextArea-CaIEBz8d.mjs";
12
12
  import { n as StatusIndicator } from "../../StatusIndicator-Bunn9YLV.mjs";
13
13
  import { Color, Spacing } from "@persona/design-tokens";
@@ -1,6 +1,6 @@
1
1
  import { t as Card_default } from "../../Card-BXNxWX5C.mjs";
2
- import { t as DataTable } from "../../DataTable-F9R-aQCg.mjs";
3
- import { t as PageHeader } from "../../PageHeader-DJF7nxgN.mjs";
2
+ import { t as DataTable } from "../../DataTable-DQ8axNfo.mjs";
3
+ import { t as PageHeader } from "../../PageHeader-D2j2XHD9.mjs";
4
4
  import { a as Section, i as Container } from "../../PageLayout-fXJW7daI.mjs";
5
5
  import { useMemo } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -2,8 +2,8 @@ import { a as styled } from "../../styledComponentsInterop-NxwFjeA4.mjs";
2
2
  import { n as Stack, t as HStack } from "../../Stack-BkC7FCdF.mjs";
3
3
  import { t as LoadingShimmer } from "../../LoadingShimmer-Bqjdut7i.mjs";
4
4
  import { t as Card_default } from "../../CardV2-Dp4eHSE-.mjs";
5
- import { h as Table, m as TableHeaderCell, n as TableBody, p as TableRow, r as TableHead, s as TableCell } from "../../Table-CmuWqmVN.mjs";
6
- import { n as PageHeaderContainer } from "../../PageHeader-DJF7nxgN.mjs";
5
+ import { h as Table, m as TableHeaderCell, n as TableBody, p as TableRow, r as TableHead, s as TableCell } from "../../Table-BIDaC0uS.mjs";
6
+ import { n as PageHeaderContainer } from "../../PageHeader-D2j2XHD9.mjs";
7
7
  import { Color, Spacing } from "@persona/design-tokens";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region patterns/containers.tsx
@@ -2,7 +2,7 @@ import { a as styled } from "../../styledComponentsInterop-NxwFjeA4.mjs";
2
2
  import { semanticColor } from "../../lib/semanticColor.mjs";
3
3
  import { t as HStack } from "../../Stack-BkC7FCdF.mjs";
4
4
  import { n as Button } from "../../IconButton-HWx5Hlmi.mjs";
5
- import { i as Modal_default } from "../../Modal-IJdbLORi.mjs";
5
+ import { i as Modal_default } from "../../Modal-kjUptzg1.mjs";
6
6
  import { t as ProgressIndicator } from "../../ProgressIndicator-CM37EU1B.mjs";
7
7
  import { Color, Spacing } from "@persona/design-tokens";
8
8
  import { useState } from "react";
package/llms.txt CHANGED
@@ -14,6 +14,7 @@ For exact prop types, prefer the published type declarations (`dist/**/*.d.mts`,
14
14
  ## Skills
15
15
 
16
16
  - [ui-authoring](skills/ui-authoring/SKILL.md): design tokens, PDS implementation guidelines, table guidelines (DataTable vs TableBox vs TableLayout), routing/link adapters (react-router, TanStack, custom), localization (PDSProvider strings/locale), loading states, testing, Storybook
17
+ - [Product UI standard](skills/ui-authoring/STANDARD.md): the rules every screen meets (11 px minimum for copy and 8 px for labels inside charts and diagrams, WCAG AA contrast, reduced motion, status not by colour alone), the screen brief, and the `new-screen` task lane defined in `lanes.json`
17
18
  - [Tokens](skills/ui-authoring/TOKENS.md): semantic color tokens (Fg / Surface / Border / Action / Input / Feedback / Status / Opacity) with recipes and a dark-mode checklist; Spacing / Typography catalog, radius, elevation, charts
18
19
  - [Patterns](skills/ui-authoring/PATTERNS.md): forms, layout, index tables, indicators, feedback, empty states, charts, panels
19
20
  - [Components](skills/ui-authoring/COMPONENTS.md): which PDS component to use (and its import path); APIs live in that component's `.mdx` when one exists, otherwise in `dist/components/<Name>/index.d.mts`
@@ -39,7 +40,7 @@ their own subpaths.
39
40
  - Modal close button: localize the default with `PDSProvider strings={{ closeModal: translatedLabel }}` (English: "Close"), or override one modal with `contentProps.closeButtonLabel`.
40
41
  - Forms: `ConfigFormGroup`, `FormField` (`TextField`, `TextAreaField`, `TableBoxField`), `Input`, `TextArea`, `Select`, `Combobox`, `Checkbox`, `Radio`, `Toggle`, `DatePicker`
41
42
  - Status: `Sticker` (status badges), `Badge` (counts), `StatusIndicator`
42
- - Saved views: `TableControls` (or `DataTable.controls`) requires `onSetDefaultView` and `onUnsetDefaultView` together, or neither. Editable views offer "Set as default" / "Unset default" based on `view.isDefault`; the design system confirms before calling either callback and warns that both changes affect the entire organization. Consumers own persistence and must remove their own confirmations to avoid double prompts. Compact controls omit saved views.
43
+ - Saved views: `TableControls` (or `DataTable.controls`) requires `onSetDefaultView` and `onUnsetDefaultView` together, or neither. Editable views offer "Set as default" / "Unset default" based on `view.isDefault`; the design system confirms before calling either callback and warns that both changes affect the entire organization. Consumers own persistence and must remove their own confirmations to avoid double prompts. Compact controls omit saved views. Pass `starredDefaultView` to star the default view: the `isDefault` view is pinned first with a star icon, cannot be dragged, hidden, deleted or unset, and its menu offers only Save and Duplicate (its name field still renames it); every other view gets the full menu. Rename and Duplicate on it call `onViewNameChange` / `onDuplicateView` with its id; Save calls `onSaveView()` with no id, saving whatever the consumer treats as the current view. A null `currentView` is shown as the starred view, so `onSaveView` and toolbar Save must treat null as the starred view; while an `isDefault` view exists, pass its id as `currentView` rather than null. A lazy default is a consumer-owned placeholder view with `isDefault: true`. While a view is the default the built-in tab is not shown and a `null` `currentView` is displayed as the starred view; with no `isDefault` view the built-in tab is shown starred and read-only.
43
44
  - DataTable filters: pass `filtersV2` (`TableControlsFiltersV2Props` / `FilterBarProps`) through `DataTable.controls` or directly to `TableControls` for a first-class FilterBar; defaults visible with size derived from `compact`. Hosts own V2 data filtering and feed `onChange` back to `initialState` for active-filter messaging; hydration needs no remount key. Precedence: `filterPanel` → `filtersV2` → legacy `filters`. Legacy `filters` supports `input`, `select`, `multiselect`, `combobox`, and `daterange` with optional `filterResolver`. With `clientFiltering`, `column.filter` generates legacy-only controls backed by TanStack column-filter state, not V2 filtering.
44
45
  - SmartTextInput: when method chains are allowed (`ValueType.MethodChain` or `{{...}}` interpolation), you MUST pass `renderFunctionForm`. PDS does not build the function-parameter form, so without it the dialog opened by placing the cursor in a call like `convert_to(...)` shows only the function name over an empty body. It receives `FunctionFormRenderProps` and must call `onComplete(nodes)` or `onCancel()`. In persona-web, `useDashboardSmartTextInputProps` supplies it (backed by `InputMethodChain/FunctionForm`). See components/SmartTextInput/SmartTextInput.mdx.
45
46
  - FilterBar: optional `FilterField.condition`, `pickerGroup`, and `disabledReason` support host-defined individual predicates in pills and native Rules; existing aggregate fields stay unchanged. See components/DataTable/DataTable.mdx. Hosts own feature activation and serialization.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@persona/design-system",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "description": "React components for Persona UI",
5
5
  "keywords": [
6
6
  "tanstack-intent"
@@ -243,7 +243,7 @@
243
243
  "jsdom": "^27.4.0",
244
244
  "lodash": "^4.18.1",
245
245
  "msw": "^2.12.14",
246
- "playwright": "1.60.0",
246
+ "playwright": "1.61.0",
247
247
  "react": "^17.0.2",
248
248
  "react-dom": "^17.0.2",
249
249
  "react-router-dom": "^6.30.5",
@@ -8,6 +8,13 @@ metadata:
8
8
 
9
9
  # UI Authoring
10
10
 
11
+ ## Product UI standard
12
+
13
+ Building a screen in an app? [STANDARD.md](STANDARD.md) holds the rules every screen meets: text the
14
+ user reads is at least 11 px (8 px for a label inside a chart or diagram), contrast meets WCAG AA in light and dark, motion honours
15
+ `prefers-reduced-motion`, and status never relies on colour alone. It also defines the `new-screen`
16
+ lane for building one screen with no designer. Read it first, then the sections below.
17
+
11
18
  ## Design Tokens
12
19
 
13
20
  ```tsx
@@ -184,6 +191,7 @@ Add `ComponentName.stories.tsx` for every new component or visual variant.
184
191
 
185
192
  ## Resources
186
193
 
194
+ - [STANDARD.md](STANDARD.md) — product UI standard: accessibility values, screen brief, `new-screen` lane ([lanes.json](lanes.json)), checks, departures
187
195
  - [TOKENS.md](TOKENS.md) — semantic color tokens (Fg / Surface / Border / Action / Input / Feedback / Status / Opacity), recipes and dark-mode checklist; Spacing / Typography catalog, radius, elevation, charts
188
196
  - [PATTERNS.md](PATTERNS.md) — forms, layout, panels, indicators, feedback, empty states
189
197
  - [COMPONENTS.md](COMPONENTS.md) — which PDS component to use, and its import path; APIs live in each component's `.mdx`