@persona/design-system 0.8.2 → 0.9.1

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 (549) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/Accordion.d.mts +1 -1
  3. package/dist/AccordionItem.d.mts +1 -1
  4. package/dist/{Action-C6yvIekn.d.mts → Action-BleGvmsy.d.mts} +3 -3
  5. package/dist/Action.d.mts +1 -1
  6. package/dist/AdvancedFilterRuleRow.d.mts +2 -2
  7. package/dist/AdvancedFilterRulesPopover.d.mts +2 -2
  8. package/dist/ArrayValueControl.d.mts +1 -1
  9. package/dist/Attribute.d.mts +4 -4
  10. package/dist/{Badge-uY8l1p1R.mjs → Badge-BYa-iqNE.mjs} +2 -2
  11. package/dist/{Badge-uY8l1p1R.mjs.map → Badge-BYa-iqNE.mjs.map} +1 -1
  12. package/dist/BooleanValueControl.d.mts +1 -1
  13. package/dist/{Breadcrumb-Tjk9FyiF.d.mts → Breadcrumb-CEHEUe8l.d.mts} +1 -1
  14. package/dist/Breadcrumb.d.mts +1 -1
  15. package/dist/{Breadcrumbs-DSCbZmAx.d.mts → Breadcrumbs-BQ-Gj6UV.d.mts} +2 -2
  16. package/dist/{Breadcrumbs-EQm5iiRA.mjs → Breadcrumbs-BmlndU4V.mjs} +8 -8
  17. package/dist/{Breadcrumbs-EQm5iiRA.mjs.map → Breadcrumbs-BmlndU4V.mjs.map} +1 -1
  18. package/dist/Breadcrumbs.d.mts +1 -1
  19. package/dist/{Button-22DkIpYp.d.mts → Button-Dx7mHjWC.d.mts} +5 -5
  20. package/dist/Button.d.mts +1 -1
  21. package/dist/{Calendar-DANGQNlH.d.mts → Calendar-BvsTQ3e1.d.mts} +1 -1
  22. package/dist/Calendar.d.mts +1 -1
  23. package/dist/CalendarBase.d.mts +1 -1
  24. package/dist/{Card-DQE1J3gk.d.mts → Card-BPY0OU7e.d.mts} +4 -4
  25. package/dist/Card.d.mts +1 -1
  26. package/dist/Card2.d.mts +1 -1
  27. package/dist/CardGrouping.d.mts +38 -0
  28. package/dist/{CardV2-Ds6e577k.mjs → CardV2-Cq4QODeE.mjs} +11 -11
  29. package/dist/{CardV2-Ds6e577k.mjs.map → CardV2-Cq4QODeE.mjs.map} +1 -1
  30. package/dist/{Checkbox-CsJlWz-r.d.mts → Checkbox-CVa8WOf2.d.mts} +1 -1
  31. package/dist/{Checkbox-BQC_SmBt.mjs → Checkbox-Cttn1t8T.mjs} +10 -6
  32. package/dist/{Checkbox-BQC_SmBt.mjs.map → Checkbox-Cttn1t8T.mjs.map} +1 -1
  33. package/dist/Checkbox.d.mts +1 -1
  34. package/dist/{CheckboxGroupField-DjKp63Dr.d.mts → CheckboxGroupField-BpHN_2QP.d.mts} +3 -3
  35. package/dist/CheckboxGroupField.d.mts +1 -1
  36. package/dist/ChoicesValueControl.d.mts +1 -1
  37. package/dist/{Combobox-D1iXiYGV.d.mts → Combobox-C4C2P8lF.d.mts} +3 -3
  38. package/dist/{Combobox-MCaDc7h6.mjs → Combobox-CsXnJKvB.mjs} +73 -29
  39. package/dist/Combobox-CsXnJKvB.mjs.map +1 -0
  40. package/dist/Combobox.d.mts +2 -2
  41. package/dist/{ComboboxBase-DXhu2YSh.d.mts → ComboboxBase-2nVpt8oj.d.mts} +7 -7
  42. package/dist/ComboboxBase.d.mts +1 -1
  43. package/dist/{ComboboxMultiSelect-BSyJc46m.d.mts → ComboboxMultiSelect-BvJ--m6z.d.mts} +2 -2
  44. package/dist/ComboboxMultiSelect.d.mts +1 -1
  45. package/dist/{ComboboxSingleSelect-Dg_6h4iB.d.mts → ComboboxSingleSelect-BWrnRA2x.d.mts} +5 -4
  46. package/dist/ComboboxSingleSelect.d.mts +1 -1
  47. package/dist/{CompactBar-CVGNq7Zu.d.mts → CompactBar-CmTT9iuT.d.mts} +3 -3
  48. package/dist/CompactBar.d.mts +1 -1
  49. package/dist/{ConfigFormGroup-CidT_cE9.mjs → ConfigFormGroup-C0orlWwb.mjs} +2 -2
  50. package/dist/{ConfigFormGroup-CidT_cE9.mjs.map → ConfigFormGroup-C0orlWwb.mjs.map} +1 -1
  51. package/dist/{ControlBar-K43YI-LU.d.mts → ControlBar-Cg36sjz3.d.mts} +2 -2
  52. package/dist/ControlBar.d.mts +1 -1
  53. package/dist/DataTable.d.mts +4 -4
  54. package/dist/{DateField-DY3xCygL.d.mts → DateField-BXUuqbnb.d.mts} +2 -2
  55. package/dist/DateField.d.mts +1 -1
  56. package/dist/{DatePicker-C56kJLiX.d.mts → DatePicker-Cmn1vViU.d.mts} +2 -2
  57. package/dist/{DatePicker-CKk6Hnj2.mjs → DatePicker-DQHVCGnP.mjs} +10 -10
  58. package/dist/{DatePicker-CKk6Hnj2.mjs.map → DatePicker-DQHVCGnP.mjs.map} +1 -1
  59. package/dist/DatePicker.d.mts +1 -1
  60. package/dist/{DateRangePicker-C96NKOon.d.mts → DateRangePicker-CKhp9Obv.d.mts} +3 -3
  61. package/dist/DateRangePicker.d.mts +1 -1
  62. package/dist/DateRangeValueControl.d.mts +2 -2
  63. package/dist/DateValueControl.d.mts +1 -1
  64. package/dist/{DropdownButton-B-cYK2oi.mjs → DropdownButton-C9wWnB5w.mjs} +3 -3
  65. package/dist/{DropdownButton-B-cYK2oi.mjs.map → DropdownButton-C9wWnB5w.mjs.map} +1 -1
  66. package/dist/DropdownButton.d.mts +2 -2
  67. package/dist/{DropdownMenu-BwPtzVWg.d.mts → DropdownMenu-BZ62b8Cv.d.mts} +3 -3
  68. package/dist/{DropdownMenu-CedsmO5h.mjs → DropdownMenu-CPE8Q56k.mjs} +2 -2
  69. package/dist/{DropdownMenu-CedsmO5h.mjs.map → DropdownMenu-CPE8Q56k.mjs.map} +1 -1
  70. package/dist/DropdownMenu.d.mts +1 -1
  71. package/dist/{ErrorProps-C-sfKFxK.d.mts → ErrorProps-oCHtJzEB.d.mts} +1 -1
  72. package/dist/ErrorProps.d.mts +1 -1
  73. package/dist/{FieldRegistry-C2eIbP1X.d.mts → FieldRegistry-DAk_3PhH.d.mts} +2 -2
  74. package/dist/FieldRegistry.d.mts +1 -1
  75. package/dist/{FilterBar-BNbMjWDC.d.mts → FilterBar-C7ch6kYM.d.mts} +4 -4
  76. package/dist/FilterBar.d.mts +1 -1
  77. package/dist/FilterPickerMenu.d.mts +2 -2
  78. package/dist/FilterPill.d.mts +1 -1
  79. package/dist/FilterPopover.d.mts +3 -1
  80. package/dist/FloatValueControl.d.mts +6 -5
  81. package/dist/{FormControl-C4CiA0H-.mjs → FormControl-CD_FdAXA.mjs} +4 -4
  82. package/dist/{FormControl-C4CiA0H-.mjs.map → FormControl-CD_FdAXA.mjs.map} +1 -1
  83. package/dist/{FormControl-DICrNHcc.d.mts → FormControl-DX4vtUp6.d.mts} +3 -3
  84. package/dist/FormControl.d.mts +1 -1
  85. package/dist/FormControlLabel.d.mts +2 -2
  86. package/dist/{FormField-D97xQCxF.d.mts → FormField-C80kGAIV.d.mts} +2 -2
  87. package/dist/{FormField-CB0yCMro.mjs → FormField-DjysBTKn.mjs} +15 -15
  88. package/dist/{FormField-CB0yCMro.mjs.map → FormField-DjysBTKn.mjs.map} +1 -1
  89. package/dist/FormField.d.mts +1 -1
  90. package/dist/{Header-Ca554S1F.d.mts → Header-C-a5fL3k.d.mts} +2 -2
  91. package/dist/Header.d.mts +1 -1
  92. package/dist/{HelperTooltip-Dk2eqeC_.d.mts → HelperTooltip-hhMFkKmn.d.mts} +2 -2
  93. package/dist/HelperTooltip.d.mts +1 -1
  94. package/dist/HighlightedText.d.mts +3 -3
  95. package/dist/{HoverCopyableField-CewUtxZl.mjs → HoverCopyableField-Cgu3W31s.mjs} +4 -4
  96. package/dist/{HoverCopyableField-CewUtxZl.mjs.map → HoverCopyableField-Cgu3W31s.mjs.map} +1 -1
  97. package/dist/{I18nContext-DXcImEuM.d.mts → I18nContext-ioYM_vqG.d.mts} +2 -2
  98. package/dist/I18nContext.d.mts +1 -1
  99. package/dist/{IconButton-H5vDZOdo.mjs → IconButton-D4awF770.mjs} +7 -7
  100. package/dist/{IconButton-H5vDZOdo.mjs.map → IconButton-D4awF770.mjs.map} +1 -1
  101. package/dist/{IconButton-Vq0MUaNj.d.mts → IconButton-DJ3L_ZqN.d.mts} +2 -2
  102. package/dist/IconButton.d.mts +1 -1
  103. package/dist/ImageTile.d.mts +1 -1
  104. package/dist/InlineCombobox.d.mts +1 -1
  105. package/dist/InlineInput.d.mts +1 -1
  106. package/dist/{Input-BRe0qyUe.d.mts → Input-D3lXfJHq.d.mts} +4 -4
  107. package/dist/{Input-CY14-YeD.mjs → Input-DD4jzJhK.mjs} +5 -5
  108. package/dist/{Input-CY14-YeD.mjs.map → Input-DD4jzJhK.mjs.map} +1 -1
  109. package/dist/Input.d.mts +1 -1
  110. package/dist/{InputProps-B2ngFfvF.d.mts → InputProps-BU9iiBBz.d.mts} +2 -2
  111. package/dist/InputProps.d.mts +1 -1
  112. package/dist/IntegerValueControl.d.mts +6 -5
  113. package/dist/{Link-BSuXrvTu.mjs → Link-DGZu4J0x.mjs} +4 -4
  114. package/dist/{Link-BSuXrvTu.mjs.map → Link-DGZu4J0x.mjs.map} +1 -1
  115. package/dist/Link.d.mts +1 -1
  116. package/dist/{ListBox-2aYWNlO_.mjs → ListBox-BhWLad_L.mjs} +12 -12
  117. package/dist/{ListBox-2aYWNlO_.mjs.map → ListBox-BhWLad_L.mjs.map} +1 -1
  118. package/dist/{ListBox-DzZY7IFz.d.mts → ListBox-CjGb0mMY.d.mts} +3 -3
  119. package/dist/ListBox.d.mts +1 -1
  120. package/dist/{ListBoxField-DT_-4_Ct.d.mts → ListBoxField-BUkPeLiB.d.mts} +4 -4
  121. package/dist/ListBoxField.d.mts +1 -1
  122. package/dist/LoadingShimmer.d.mts +2 -2
  123. package/dist/{LogicRow-l66qss7_.d.mts → LogicRow-Bt6NPLOd.d.mts} +3 -3
  124. package/dist/LogicRow.d.mts +1 -1
  125. package/dist/MaskedInput.d.mts +2 -2
  126. package/dist/MatchHighlight.d.mts +1 -1
  127. package/dist/{Menu-DQXbnpDB.d.mts → Menu-BMrsN-Jz.d.mts} +4 -4
  128. package/dist/{Menu-Dw6Rcpk6.mjs → Menu-DlN0A5Nb.mjs} +4 -4
  129. package/dist/{Menu-Dw6Rcpk6.mjs.map → Menu-DlN0A5Nb.mjs.map} +1 -1
  130. package/dist/Menu.d.mts +1 -1
  131. package/dist/{Modal-Bz5Rer1b.d.mts → Modal-BoeGuR-h.d.mts} +3 -3
  132. package/dist/{Modal-dpBu2MKp.mjs → Modal-Cs5cZpEr.mjs} +4 -4
  133. package/dist/{Modal-dpBu2MKp.mjs.map → Modal-Cs5cZpEr.mjs.map} +1 -1
  134. package/dist/Modal.d.mts +1 -1
  135. package/dist/{PageHeader-CLO8SMXV.mjs → PageHeader-CCoAJUwJ.mjs} +2 -2
  136. package/dist/{PageHeader-CLO8SMXV.mjs.map → PageHeader-CCoAJUwJ.mjs.map} +1 -1
  137. package/dist/PageHeader.d.mts +2 -2
  138. package/dist/PageLayout-BlCo4hN4.d.mts +16 -0
  139. package/dist/PageLayout-C7ZC7GBA.mjs +132 -0
  140. package/dist/PageLayout-C7ZC7GBA.mjs.map +1 -0
  141. package/dist/PageLayout.d.mts +2 -16
  142. package/dist/PageLayoutFrame--HlvI4Pp.d.mts +28 -0
  143. package/dist/PageLayoutFrame.d.mts +2 -28
  144. package/dist/{PageSelector--kFA7Xt6.d.mts → PageSelector-BmevrorJ.d.mts} +3 -3
  145. package/dist/PageSelector.d.mts +1 -1
  146. package/dist/{Pagination-CglxJr3f.d.mts → Pagination-C67fsrxl.d.mts} +2 -2
  147. package/dist/{Pagination-BEddsarh.mjs → Pagination-Du2CPW2l.mjs} +5 -5
  148. package/dist/{Pagination-BEddsarh.mjs.map → Pagination-Du2CPW2l.mjs.map} +1 -1
  149. package/dist/Pagination.d.mts +1 -1
  150. package/dist/{Pii-Ct7yDY7d.mjs → Pii-CFVWZ_Yx.mjs} +2 -2
  151. package/dist/{Pii-Ct7yDY7d.mjs.map → Pii-CFVWZ_Yx.mjs.map} +1 -1
  152. package/dist/{PillShell-CvJzkRFh.d.mts → PillShell-jr6OyAd3.d.mts} +2 -2
  153. package/dist/PillShell.d.mts +1 -1
  154. package/dist/{Popover-532iYFek.mjs → Popover-DewrGOJB.mjs} +2 -2
  155. package/dist/{Popover-532iYFek.mjs.map → Popover-DewrGOJB.mjs.map} +1 -1
  156. package/dist/{ProgressIndicator-Cleq0Tfb.d.mts → ProgressIndicator-CdhC2LVI.d.mts} +1 -1
  157. package/dist/{ProgressIndicator-STyTM0Hq.mjs → ProgressIndicator-xV5Cl2Bw.mjs} +3 -3
  158. package/dist/{ProgressIndicator-STyTM0Hq.mjs.map → ProgressIndicator-xV5Cl2Bw.mjs.map} +1 -1
  159. package/dist/ProgressIndicator.d.mts +1 -1
  160. package/dist/{PseudoClassProps-B2R2dyr3.d.mts → PseudoClassProps-CverE9Ni.d.mts} +1 -1
  161. package/dist/PseudoClassProps.d.mts +1 -1
  162. package/dist/{Radio-BtomkCkL.mjs → Radio-i7AEQZHb.mjs} +4 -4
  163. package/dist/{Radio-BtomkCkL.mjs.map → Radio-i7AEQZHb.mjs.map} +1 -1
  164. package/dist/{RadioGroup-B6UaoJRd.mjs → RadioGroup-B0KcQpS7.mjs} +2 -2
  165. package/dist/{RadioGroup-B6UaoJRd.mjs.map → RadioGroup-B0KcQpS7.mjs.map} +1 -1
  166. package/dist/{RadioGroup-B3B4PCz6.d.mts → RadioGroup-CDEfCg-b.d.mts} +1 -1
  167. package/dist/RadioGroup.d.mts +1 -1
  168. package/dist/{RangeCalendar-C24q-nvR.d.mts → RangeCalendar-BOt59kTG.d.mts} +2 -2
  169. package/dist/RangeCalendar.d.mts +1 -1
  170. package/dist/RangeCalendarPresets.d.mts +1 -1
  171. package/dist/{RouterContext-BhPPG7d3.d.mts → RouterContext-D7HBESqO.d.mts} +2 -2
  172. package/dist/RouterContext.d.mts +1 -1
  173. package/dist/{RouterLink-IDO10cDE.d.mts → RouterLink-dppNWLgP.d.mts} +2 -2
  174. package/dist/RouterLink.d.mts +1 -1
  175. package/dist/RuleEditorFields.d.mts +2 -2
  176. package/dist/RulesPill.d.mts +1 -1
  177. package/dist/{SearchInput-7pBMxhuN.d.mts → SearchInput-B7JYHJZI.d.mts} +2 -2
  178. package/dist/SearchInput.d.mts +1 -1
  179. package/dist/SectionHeading.d.mts +1 -1
  180. package/dist/{SegmentedControl-BNVwf7nL.mjs → SegmentedControl-B2_bS806.mjs} +2 -2
  181. package/dist/{SegmentedControl-BNVwf7nL.mjs.map → SegmentedControl-B2_bS806.mjs.map} +1 -1
  182. package/dist/{SegmentedControl-B9yo9yMy.d.mts → SegmentedControl-C_7mTcuL.d.mts} +1 -1
  183. package/dist/SegmentedControl.d.mts +1 -1
  184. package/dist/{Select-D7_npfZr.d.mts → Select-BpAA5ETS.d.mts} +3 -3
  185. package/dist/{Select-DD7mFvR8.mjs → Select-oVJ0uLa7.mjs} +8 -8
  186. package/dist/{Select-DD7mFvR8.mjs.map → Select-oVJ0uLa7.mjs.map} +1 -1
  187. package/dist/Select.d.mts +1 -1
  188. package/dist/SingleColumnLayout-ByWxiD7d.d.mts +16 -0
  189. package/dist/SingleColumnLayout.d.mts +2 -16
  190. package/dist/SmartTextInput.d.mts +6 -6
  191. package/dist/SmartTextInputField.d.mts +2 -2
  192. package/dist/SmartTextInputFunctionDialog.d.mts +4 -4
  193. package/dist/SmartTextInputListbox.d.mts +2 -2
  194. package/dist/SmartTextInputPopover.d.mts +2 -2
  195. package/dist/{Spinner-uVZyOh1T.mjs → Spinner-0Vqw_68r.mjs} +2 -2
  196. package/dist/{Spinner-uVZyOh1T.mjs.map → Spinner-0Vqw_68r.mjs.map} +1 -1
  197. package/dist/SplitColumnLayout-DYyJabQ3.d.mts +19 -0
  198. package/dist/SplitColumnLayout.d.mts +2 -19
  199. package/dist/{Stack-opuYfQvc.d.mts → Stack-DpWl6orU.d.mts} +2 -2
  200. package/dist/Stack.d.mts +1 -1
  201. package/dist/{StatusIndicator-akDwBiBW.mjs → StatusIndicator-QsVgjRrt.mjs} +3 -3
  202. package/dist/{StatusIndicator-akDwBiBW.mjs.map → StatusIndicator-QsVgjRrt.mjs.map} +1 -1
  203. package/dist/{Sticker-rxBNVYlX.d.mts → Sticker-C260e6kl.d.mts} +5 -5
  204. package/dist/{Sticker-DdhSpTcV.mjs → Sticker-CUqHa9Mo.mjs} +5 -5
  205. package/dist/{Sticker-DdhSpTcV.mjs.map → Sticker-CUqHa9Mo.mjs.map} +1 -1
  206. package/dist/Sticker.d.mts +1 -1
  207. package/dist/StringValueControl.d.mts +1 -1
  208. package/dist/Tab.d.mts +2 -2
  209. package/dist/{TabBar-DBOPWUUa.mjs → TabBar-w_gxXSwA.mjs} +5 -5
  210. package/dist/{TabBar-DBOPWUUa.mjs.map → TabBar-w_gxXSwA.mjs.map} +1 -1
  211. package/dist/{Table-Bt7zAlgQ.d.mts → Table-BtNYI6QX.d.mts} +1 -1
  212. package/dist/{Table--o4ZLRbb.mjs → Table-PbYGf3PG.mjs} +8 -8
  213. package/dist/{Table--o4ZLRbb.mjs.map → Table-PbYGf3PG.mjs.map} +1 -1
  214. package/dist/Table.d.mts +1 -1
  215. package/dist/{TableBody-9AYpXi2y.d.mts → TableBody-DQ7pivxP.d.mts} +1 -1
  216. package/dist/TableBody.d.mts +1 -1
  217. package/dist/{TableBox-BGabyY7E.mjs → TableBox-DMYLTIpr.mjs} +13 -13
  218. package/dist/{TableBox-BGabyY7E.mjs.map → TableBox-DMYLTIpr.mjs.map} +1 -1
  219. package/dist/TableBox.d.mts +2 -2
  220. package/dist/{TableBoxCell-6ovTrboM.d.mts → TableBoxCell-DwAOA-oO.d.mts} +7 -7
  221. package/dist/TableBoxCell.d.mts +1 -1
  222. package/dist/{TableBoxField-mGTYb-Bz.d.mts → TableBoxField-Bdj_nY7j.d.mts} +5 -5
  223. package/dist/TableBoxField.d.mts +1 -1
  224. package/dist/{TableBoxRow-56QatuNm.d.mts → TableBoxRow-5WBwyAyn.d.mts} +3 -3
  225. package/dist/TableBoxRow.d.mts +1 -1
  226. package/dist/{TableBoxRowActions-9rR-k_4H.d.mts → TableBoxRowActions-Dq_Z2ted.d.mts} +2 -2
  227. package/dist/TableBoxRowActions.d.mts +1 -1
  228. package/dist/{TableCell-WD0ultKh.d.mts → TableCell-DXBHZ52E.d.mts} +3 -3
  229. package/dist/TableCell.d.mts +1 -1
  230. package/dist/{TableControls-B5UGCoO-.mjs → TableControls-C1MF2JvY.mjs} +390 -144
  231. package/dist/TableControls-C1MF2JvY.mjs.map +1 -0
  232. package/dist/{TableControls-DVO-obFo.d.mts → TableControls-Cw7LDHWj.d.mts} +3 -3
  233. package/dist/TableControls.d.mts +1 -1
  234. package/dist/{TableControlsContext-BDl9k4o4.d.mts → TableControlsContext-DgoZhMpQ.d.mts} +2 -2
  235. package/dist/TableControlsContext.d.mts +1 -1
  236. package/dist/{TableHead-DqcFsWpz.d.mts → TableHead-BGUg_aXc.d.mts} +1 -1
  237. package/dist/TableHead.d.mts +1 -1
  238. package/dist/{TableHeaderCell-C1PJHhXZ.d.mts → TableHeaderCell-DcZcMQyR.d.mts} +1 -1
  239. package/dist/TableHeaderCell.d.mts +1 -1
  240. package/dist/{TableLayout-B4qzMWXH.d.mts → TableLayout-CwYQaZlA.d.mts} +1 -1
  241. package/dist/TableLayout.d.mts +1 -1
  242. package/dist/{TableRow-B1yeAiVf.d.mts → TableRow-Dad6_CoD.d.mts} +2 -2
  243. package/dist/TableRow.d.mts +1 -1
  244. package/dist/TableTH.d.mts +1 -1
  245. package/dist/{TableViewConfigurationDropdown-DBdUHK__.d.mts → TableViewConfigurationDropdown-BGuWAarQ.d.mts} +2 -2
  246. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  247. package/dist/{TechnicalSticker-CALVwnrT.mjs → TechnicalSticker-RQ-4_Tdr.mjs} +5 -5
  248. package/dist/{TechnicalSticker-CALVwnrT.mjs.map → TechnicalSticker-RQ-4_Tdr.mjs.map} +1 -1
  249. package/dist/{Text-D4GzsXFA.d.mts → Text-BBMau410.d.mts} +4 -4
  250. package/dist/Text.d.mts +1 -1
  251. package/dist/{TextArea-kOkhZxNR.mjs → TextArea-BaA8H7s7.mjs} +2 -2
  252. package/dist/{TextArea-kOkhZxNR.mjs.map → TextArea-BaA8H7s7.mjs.map} +1 -1
  253. package/dist/{TextArea-BL8BTgwk.d.mts → TextArea-Djd1uT3B.d.mts} +2 -2
  254. package/dist/TextArea.d.mts +1 -1
  255. package/dist/{TextUnderlineTooltip-Sdxqsr6y.d.mts → TextUnderlineTooltip-C4N0bqbh.d.mts} +3 -3
  256. package/dist/TextUnderlineTooltip.d.mts +1 -1
  257. package/dist/Tile.d.mts +1 -1
  258. package/dist/Toast.d.mts +1 -1
  259. package/dist/{Toggle-CZF6iBql.mjs → Toggle-C9cZnajR.mjs} +6 -6
  260. package/dist/{Toggle-CZF6iBql.mjs.map → Toggle-C9cZnajR.mjs.map} +1 -1
  261. package/dist/{Toggle-cUtrUIIO.d.mts → Toggle-EYpW34LO.d.mts} +1 -1
  262. package/dist/Toggle.d.mts +1 -1
  263. package/dist/{Tooltip-CSM977L6.d.mts → Tooltip-Dj-DtGKz.d.mts} +3 -3
  264. package/dist/{Tooltip-B-0VRuKT.mjs → Tooltip-DogEteGl.mjs} +2 -2
  265. package/dist/{Tooltip-B-0VRuKT.mjs.map → Tooltip-DogEteGl.mjs.map} +1 -1
  266. package/dist/Tooltip.d.mts +1 -1
  267. package/dist/{TruncatedText-CCUrvW2a.d.mts → TruncatedText-BDNFUuhG.d.mts} +2 -2
  268. package/dist/VersionHistory.d.mts +1 -1
  269. package/dist/{VersionHistoryItem-DBjL9S5_.d.mts → VersionHistoryItem-iUabmk_y.d.mts} +1 -1
  270. package/dist/VersionHistoryItem.d.mts +1 -1
  271. package/dist/WizardModal.d.mts +2 -2
  272. package/dist/{accordionTitleTypography--GAczLo7.d.mts → accordionTitleTypography-C7VVJvlx.d.mts} +2 -2
  273. package/dist/accordionTitleTypography.d.mts +1 -1
  274. package/dist/{chainTypes-dY6jc22J.d.mts → chainTypes-DT-9j_sG.d.mts} +4 -4
  275. package/dist/{codec-D2uE0_oJ.d.mts → codec-CGj8cwcj.d.mts} +2 -2
  276. package/dist/codec.d.mts +1 -1
  277. package/dist/{color-DuKiTH5t.d.mts → color-BOm5A1Si.d.mts} +2 -2
  278. package/dist/components/Accordion/index.d.mts +1 -1
  279. package/dist/components/Accordion/index.mjs +4 -4
  280. package/dist/components/Attribute/index.mjs +4 -4
  281. package/dist/components/Badge/index.mjs +1 -1
  282. package/dist/components/Banner/index.mjs +3 -3
  283. package/dist/components/BottomPanel/index.mjs +4 -4
  284. package/dist/components/Breadcrumbs/index.d.mts +1 -1
  285. package/dist/components/Breadcrumbs/index.mjs +1 -1
  286. package/dist/components/Button/index.d.mts +2 -2
  287. package/dist/components/Button/index.mjs +1 -1
  288. package/dist/components/ButtonGroup/index.mjs +2 -2
  289. package/dist/components/Card/index.d.mts +2 -2
  290. package/dist/components/CardV2/index.d.mts +1 -1
  291. package/dist/components/CardV2/index.mjs +1 -1
  292. package/dist/components/Checkbox/index.d.mts +1 -1
  293. package/dist/components/Checkbox/index.mjs +1 -1
  294. package/dist/components/CodeHighlight/index.mjs +3 -3
  295. package/dist/components/Combobox/index.d.mts +2 -2
  296. package/dist/components/Combobox/index.mjs +1 -1
  297. package/dist/components/ConfigFormGroup/index.mjs +2 -2
  298. package/dist/components/DataTable/TableControls/index.d.mts +20 -20
  299. package/dist/components/DataTable/TableControls/index.mjs +2 -2
  300. package/dist/components/DataTable/index.mjs +18 -18
  301. package/dist/components/DataTable/index.mjs.map +1 -1
  302. package/dist/components/DataTable/types.d.mts +2 -2
  303. package/dist/components/DatePicker/index.d.mts +5 -5
  304. package/dist/components/DatePicker/index.mjs +1 -1
  305. package/dist/components/DropdownButton/index.mjs +1 -1
  306. package/dist/components/DropdownMenu/index.d.mts +1 -1
  307. package/dist/components/DropdownMenu/index.mjs +1 -1
  308. package/dist/components/FloatingPanel/index.mjs +5 -5
  309. package/dist/components/FormControl/index.d.mts +2 -2
  310. package/dist/components/FormControl/index.mjs +2 -2
  311. package/dist/components/FormField/index.d.mts +5 -5
  312. package/dist/components/FormField/index.mjs +1 -1
  313. package/dist/components/HoverCopyableField/index.mjs +1 -1
  314. package/dist/components/ImageTile/index.mjs +6 -6
  315. package/dist/components/Input/index.d.mts +1 -1
  316. package/dist/components/Input/index.mjs +1 -1
  317. package/dist/components/Link/index.mjs +1 -1
  318. package/dist/components/ListBox/index.d.mts +3 -3
  319. package/dist/components/ListBox/index.mjs +1 -1
  320. package/dist/components/MaskedInput/index.mjs +1 -1
  321. package/dist/components/Menu/index.d.mts +1 -1
  322. package/dist/components/Menu/index.mjs +1 -1
  323. package/dist/components/Modal/index.d.mts +1 -1
  324. package/dist/components/Modal/index.mjs +1 -1
  325. package/dist/components/PageHeader/index.mjs +1 -1
  326. package/dist/components/Pagination/index.d.mts +3 -3
  327. package/dist/components/Pagination/index.mjs +1 -1
  328. package/dist/components/Pii/index.mjs +1 -1
  329. package/dist/components/Popover/index.mjs +1 -1
  330. package/dist/components/ProgressBar/index.mjs +1 -1
  331. package/dist/components/ProgressIndicator/index.d.mts +1 -1
  332. package/dist/components/ProgressIndicator/index.mjs +1 -1
  333. package/dist/components/Radio/index.mjs +1 -1
  334. package/dist/components/RadioGroup/index.d.mts +1 -1
  335. package/dist/components/RadioGroup/index.mjs +1 -1
  336. package/dist/components/RightPanel/index.mjs +2 -2
  337. package/dist/components/SegmentedControl/index.d.mts +1 -1
  338. package/dist/components/SegmentedControl/index.mjs +1 -1
  339. package/dist/components/Select/index.d.mts +1 -1
  340. package/dist/components/Select/index.mjs +1 -1
  341. package/dist/components/Slider/index.mjs +2 -2
  342. package/dist/components/SmartTextInput/index.d.mts +2 -2
  343. package/dist/components/SmartTextInput/index.mjs +9 -8
  344. package/dist/components/SmartTextInput/index.mjs.map +1 -1
  345. package/dist/components/SmartTextInput/parser/method-chain/types.d.mts +1 -1
  346. package/dist/components/SmartTextInput/parser/smart-text/types.d.mts +2 -2
  347. package/dist/components/Spinner/index.mjs +1 -1
  348. package/dist/components/Stack/index.d.mts +1 -1
  349. package/dist/components/StatusIndicator/index.mjs +1 -1
  350. package/dist/components/Sticker/index.d.mts +1 -1
  351. package/dist/components/Sticker/index.mjs +1 -1
  352. package/dist/components/TabBar/index.mjs +1 -1
  353. package/dist/components/Table/index.d.mts +8 -8
  354. package/dist/components/Table/index.mjs +1 -1
  355. package/dist/components/TableBox/index.d.mts +2 -2
  356. package/dist/components/TableBox/index.mjs +1 -1
  357. package/dist/components/TechnicalSticker/index.mjs +1 -1
  358. package/dist/components/Text/index.d.mts +1 -1
  359. package/dist/components/TextArea/index.d.mts +1 -1
  360. package/dist/components/TextArea/index.mjs +1 -1
  361. package/dist/components/Tile/index.mjs +2 -2
  362. package/dist/components/Toast/index.mjs +4 -4
  363. package/dist/components/Toggle/index.d.mts +1 -1
  364. package/dist/components/Toggle/index.mjs +1 -1
  365. package/dist/components/Tooltip/index.d.mts +3 -3
  366. package/dist/components/Tooltip/index.mjs +1 -1
  367. package/dist/components/VersionHistory/index.d.mts +1 -1
  368. package/dist/components/VersionHistory/index.mjs +7 -7
  369. package/dist/compound-expression.d.mts +1 -1
  370. package/dist/{constants-BiOvZGO5.d.mts → constants-CwzbyAdc.d.mts} +1 -1
  371. package/dist/constants.d.mts +1 -1
  372. package/dist/{createPath-B8EZDtSz.d.mts → createPath-C4jIHe68.d.mts} +2 -2
  373. package/dist/createPath.d.mts +1 -1
  374. package/dist/{date-range-rule-value-DObVM8xO.d.mts → date-range-rule-value-BkbGpLNH.d.mts} +2 -2
  375. package/dist/date-range-rule-value.d.mts +1 -1
  376. package/dist/{date-rule-intent-DhMMe_wq.d.mts → date-rule-intent-zdKP-tW_.d.mts} +3 -3
  377. package/dist/date-rule-intent.d.mts +1 -1
  378. package/dist/display.d.mts +2 -2
  379. package/dist/fieldPickerOptions.d.mts +2 -2
  380. package/dist/{filter-size-context-DaBdvJHf.d.mts → filter-size-context-CW1guBfI.d.mts} +2 -2
  381. package/dist/filter-size-context.d.mts +1 -1
  382. package/dist/{formatDateTime-mPH4DsDC.d.mts → formatDateTime-zyRMjfH8.d.mts} +1 -1
  383. package/dist/formatDateTime.d.mts +1 -1
  384. package/dist/helpers.d.mts +2 -2
  385. package/dist/{i18n-UiE7OC4k.mjs → i18n-CeRarJIa.mjs} +11 -2
  386. package/dist/i18n-CeRarJIa.mjs.map +1 -0
  387. package/dist/{index-Blo6W_k0.d.mts → index-B7KIL3U6.d.mts} +2 -2
  388. package/dist/{index-CeUb5INA.d.mts → index-C7hEdRqK.d.mts} +2 -2
  389. package/dist/{index-CTcM_LlP.d.mts → index-DxFh2ArY.d.mts} +3 -3
  390. package/dist/index-xAZnxq0d2.d.mts +1 -0
  391. package/dist/index.d.mts +1 -1
  392. package/dist/index2.d.mts +1 -1
  393. package/dist/index3.d.mts +3 -3
  394. package/dist/index4.d.mts +1 -1
  395. package/dist/index5.d.mts +15 -15
  396. package/dist/{input-D9rsMlzl.d.mts → input-DMPo8gRT.d.mts} +3 -3
  397. package/dist/{inputFields-CXelxYhd.d.mts → inputFields-BCNC1FWx.d.mts} +11 -11
  398. package/dist/inputFields.d.mts +1 -1
  399. package/dist/{intersperse-ObkRVOag.mjs → intersperse-B8s6clcc.mjs} +1 -1
  400. package/dist/{intersperse-ObkRVOag.mjs.map → intersperse-B8s6clcc.mjs.map} +1 -1
  401. package/dist/{jsonSchema-BMPLdT4p.d.mts → jsonSchema-6mcLrVG3.d.mts} +1 -1
  402. package/dist/lib/PDSProvider.d.mts +3 -3
  403. package/dist/lib/PDSProvider.mjs +1 -1
  404. package/dist/lib/TruncatedText.d.mts +1 -1
  405. package/dist/lib/TruncatedTextWithTooltip.d.mts +1 -1
  406. package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
  407. package/dist/lib/chainTypes.d.mts +1 -1
  408. package/dist/lib/color.d.mts +1 -1
  409. package/dist/lib/customFunctionSchema.d.mts +1 -1
  410. package/dist/lib/date-filter/index.d.mts +2 -2
  411. package/dist/lib/i18n/index.d.mts +3 -3
  412. package/dist/lib/i18n/index.mjs +1 -1
  413. package/dist/lib/jsonSchema.d.mts +1 -1
  414. package/dist/lib/jsonSchemaType.d.mts +1 -1
  415. package/dist/lib/message.d.mts +1 -1
  416. package/dist/lib/methodChain.d.mts +2 -2
  417. package/dist/lib/methodChainNormalize.d.mts +2 -2
  418. package/dist/lib/methodChainTypes.d.mts +1 -1
  419. package/dist/lib/objectSchemaTypes.d.mts +1 -1
  420. package/dist/lib/platformObject.d.mts +1 -1
  421. package/dist/lib/pseudoClass.d.mts +1 -1
  422. package/dist/lib/router/adapters/reactRouter.d.mts +1 -1
  423. package/dist/lib/router/adapters/tanstack.d.mts +1 -1
  424. package/dist/lib/router/index.d.mts +5 -5
  425. package/dist/lib/schemaOptions.d.mts +1 -1
  426. package/dist/lib/semanticColor.d.mts +1 -1
  427. package/dist/lib/useChain.d.mts +1 -1
  428. package/dist/{listbox-options-BFaMbK-g.d.mts → listbox-options-yLjqZp4H.d.mts} +3 -3
  429. package/dist/listbox-options.d.mts +1 -1
  430. package/dist/{message-BOzjC5yA.d.mts → message-C5n7wFiN.d.mts} +1 -1
  431. package/dist/{methodChain-CGTIWafl.d.mts → methodChain-BNDytoaD.d.mts} +4 -4
  432. package/dist/{methodChainTypes-BtSMV5OZ.d.mts → methodChainTypes-BuwpPC73.d.mts} +2 -2
  433. package/dist/mixins/focus.d.mts +1 -1
  434. package/dist/mixins/focus.mjs +1 -1
  435. package/dist/mixins/hoverable.d.mts +2 -2
  436. package/dist/mixins/hoverable.mjs +1 -1
  437. package/dist/mixins/input.d.mts +1 -1
  438. package/dist/mixins/input.mjs +2 -2
  439. package/dist/mixins/menuItem.d.mts +2 -2
  440. package/dist/mixins/scrollbar.d.mts +1 -1
  441. package/dist/mixins/text.d.mts +1 -1
  442. package/dist/{operators-DfvW8Kmr.d.mts → operators-C34nhBuK.d.mts} +42 -12
  443. package/dist/operators.d.mts +2 -2
  444. package/dist/{palette-CBOBcVu3.d.mts → palette-BCszfY7I.d.mts} +3 -3
  445. package/dist/palette.d.mts +1 -1
  446. package/dist/patterns/CardGrouping/index.d.mts +2 -0
  447. package/dist/patterns/CardGrouping/index.mjs +280 -0
  448. package/dist/patterns/CardGrouping/index.mjs.map +1 -0
  449. package/dist/patterns/LayoutLoadingShimmer/index.mjs +3 -3
  450. package/dist/patterns/PageLayout/index.d.mts +5 -5
  451. package/dist/patterns/PageLayout/index.mjs +1 -131
  452. package/dist/patterns/WizardModal/index.mjs +3 -3
  453. package/dist/reactRouterFallback.d.mts +1 -1
  454. package/dist/relative-date-label.d.mts +1 -1
  455. package/dist/safe-parse.d.mts +1 -1
  456. package/dist/{schemaOptions-DTeNBwir.d.mts → schemaOptions-DBOUChxi.d.mts} +3 -3
  457. package/dist/{semantic-CfiNA4Yy.d.mts → semantic-Duoh2Pxp.d.mts} +1 -1
  458. package/dist/{semanticColor-BCPOKF9L.d.mts → semanticColor-BuG977_M.d.mts} +3 -3
  459. package/dist/{strings-BaQZhOjo.d.mts → strings-CUZrwL-Q.d.mts} +11 -1
  460. package/dist/strings.d.mts +1 -1
  461. package/dist/{text-ucZmPNyH.d.mts → text-B7hx6G99.d.mts} +1 -1
  462. package/dist/{theme-CAPmp1it.d.mts → theme-BKg55Zk1.d.mts} +3 -3
  463. package/dist/theme.d.mts +1 -1
  464. package/dist/tone.d.mts +3 -3
  465. package/dist/tree.d.mts +1 -1
  466. package/dist/{types-l-arEBLb.d.mts → types-4wnr5R9P.d.mts} +1 -1
  467. package/dist/{types-CBfgdnuB.d.mts → types-6QeQmbFm.d.mts} +1 -1
  468. package/dist/{types-CoTzVfFl.d.mts → types-BjMJFNYH.d.mts} +1 -1
  469. package/dist/{types-CptsgFbu.d.mts → types-CEQWndtF.d.mts} +4 -4
  470. package/dist/{types-BfrEduGv.d.mts → types-C_ZEgHNa.d.mts} +2 -2
  471. package/dist/{types-ClbV4wNp.d.mts → types-CgKSEQyB.d.mts} +1 -1
  472. package/dist/{types-B1KzKgBp.d.mts → types-CwzwClJx.d.mts} +1 -1
  473. package/dist/{types-Rj-C3LGL.d.mts → types-DEzlAdZW.d.mts} +35 -9
  474. package/dist/{types-BB5WwerD.d.mts → types-VgGkS4JB.d.mts} +2 -2
  475. package/dist/types.d.mts +1 -1
  476. package/dist/types2.d.mts +1 -1
  477. package/dist/types3.d.mts +1 -1
  478. package/dist/types4.d.mts +2 -2
  479. package/dist/types5.d.mts +1 -1
  480. package/dist/types6.d.mts +1 -1
  481. package/dist/types7.d.mts +1 -1
  482. package/dist/{url-state-CrnZ3Ocy.d.mts → url-state-B_gTQ9uu.d.mts} +2 -2
  483. package/dist/url-state.d.mts +1 -1
  484. package/dist/{useChain-DQq1UsGZ.d.mts → useChain-DPRVMwX8.d.mts} +6 -6
  485. package/dist/useChainAtCursor.d.mts +6 -6
  486. package/dist/useCodeChainFunctionPanel.d.mts +1 -1
  487. package/dist/useComboboxFooterAction.d.mts +5 -2
  488. package/dist/{useFilterStateV2-CGGABOcq.d.mts → useFilterStateV2-BQZppUR0.d.mts} +5 -4
  489. package/dist/useFilterStateV2.d.mts +1 -1
  490. package/dist/{useFormField-CbNYbDdp.mjs → useFormField-BAmkdxtA.mjs} +2 -2
  491. package/dist/{useFormField-CbNYbDdp.mjs.map → useFormField-BAmkdxtA.mjs.map} +1 -1
  492. package/dist/{useFormField-4w9TNFgD.d.mts → useFormField-DAwApAKK.d.mts} +2 -2
  493. package/dist/useFormField.d.mts +1 -1
  494. package/dist/{useFormGroup-CsKC93Pt.mjs → useFormGroup-BZayb9fZ.mjs} +1 -1
  495. package/dist/{useFormGroup-CsKC93Pt.mjs.map → useFormGroup-BZayb9fZ.mjs.map} +1 -1
  496. package/dist/{useLocationPathname-CZwH8h5n.d.mts → useLocationPathname-BHL0pgiu.d.mts} +1 -1
  497. package/dist/useLocationPathname.d.mts +1 -1
  498. package/dist/{useTableBoxDragAndDrop-Bw93rNFH.d.mts → useTableBoxDragAndDrop-Dq30b6yY.d.mts} +1 -1
  499. package/dist/useTableBoxDragAndDrop.d.mts +1 -1
  500. package/dist/useTruncation.d.mts +1 -1
  501. package/dist/{utilities-B8PzMOza.d.mts → utilities-B2ry7_20.d.mts} +1 -1
  502. package/dist/utilities.d.mts +1 -1
  503. package/dist/utils/testing.d.mts +1 -1
  504. package/dist/utils.d.mts +1 -1
  505. package/dist/utils4.d.mts +5 -5
  506. package/dist/{validation-DP8f6tgh.d.mts → validation-BODkbEvr.d.mts} +3 -3
  507. package/dist/validation.d.mts +1 -1
  508. package/dist/validation2.d.mts +4 -4
  509. package/dist/{value-control-resolver-CwjOaVAn.d.mts → value-control-resolver-BcZiReQ7.d.mts} +2 -2
  510. package/dist/value-control-resolver.d.mts +1 -1
  511. package/dist/variables/effect.d.mts +1 -1
  512. package/dist/variables/semantic.d.mts +1 -1
  513. package/llms.txt +1 -0
  514. package/package.json +5 -3
  515. package/skills/ui-authoring/COMPONENTS.md +1 -0
  516. package/skills/ui-authoring/PATTERNS.md +7 -2
  517. package/dist/Combobox-MCaDc7h6.mjs.map +0 -1
  518. package/dist/TableControls-B5UGCoO-.mjs.map +0 -1
  519. package/dist/i18n-UiE7OC4k.mjs.map +0 -1
  520. package/dist/patterns/PageLayout/index.mjs.map +0 -1
  521. /package/dist/{index-1-AkepUA.d.mts → index-7in8TPrM.d.mts} +0 -0
  522. /package/dist/{index-B-Y-ZG2x.d.mts → index-8SLBz2NH.d.mts} +0 -0
  523. /package/dist/{index-BO_854F2.d.mts → index-B24gUwOx.d.mts} +0 -0
  524. /package/dist/{index-BSVhZrWN.d.mts → index-B8M0Grl_2.d.mts} +0 -0
  525. /package/dist/{index-BYARwRq7.d.mts → index-BFnNtGdX.d.mts} +0 -0
  526. /package/dist/{index-B_BBnMou.d.mts → index-BTviwbFV.d.mts} +0 -0
  527. /package/dist/{index-BbPybiOV.d.mts → index-BjgW3E7y.d.mts} +0 -0
  528. /package/dist/{index-BcsXXrHq.d.mts → index-BwFl_eS0.d.mts} +0 -0
  529. /package/dist/{index-Bt4QNofW.d.mts → index-C3kE54DD.d.mts} +0 -0
  530. /package/dist/{index-C9achTF6.d.mts → index-C3usUse7.d.mts} +0 -0
  531. /package/dist/{index-CCt0lwyI.d.mts → index-C6HcjJiY.d.mts} +0 -0
  532. /package/dist/{index-CFuHCx9T.d.mts → index-CP2eJYlK.d.mts} +0 -0
  533. /package/dist/{index-CIABef8t.d.mts → index-CSf15oCd.d.mts} +0 -0
  534. /package/dist/{index-CTHojwxd.d.mts → index-CX869wwk.d.mts} +0 -0
  535. /package/dist/{index-CliqZ9rj.d.mts → index-CXaDbCtw.d.mts} +0 -0
  536. /package/dist/{index-Cm-1i165.d.mts → index-D4DUvwPf.d.mts} +0 -0
  537. /package/dist/{index-CryTAIZM.d.mts → index-DB7t8whN.d.mts} +0 -0
  538. /package/dist/{index-CzItj62a.d.mts → index-Deol7ZWO.d.mts} +0 -0
  539. /package/dist/{index-CzUpNo0e.d.mts → index-DhiymMxa.d.mts} +0 -0
  540. /package/dist/{index-D-giXKyu.d.mts → index-DjOaHFU3.d.mts} +0 -0
  541. /package/dist/{index-DGsJdI5l.d.mts → index-DkrC-i1D.d.mts} +0 -0
  542. /package/dist/{index-DMRtRo7y.d.mts → index-DvwPIy8X.d.mts} +0 -0
  543. /package/dist/{index-DUF59i3Q2.d.mts → index-Oio5ygqN.d.mts} +0 -0
  544. /package/dist/{index-DgJfEygr.d.mts → index-Wc1llEvP.d.mts} +0 -0
  545. /package/dist/{index-Es5nKSSL.d.mts → index-dzI_9J-Z.d.mts} +0 -0
  546. /package/dist/{index-NKYLt_R9.d.mts → index-gpCH5158.d.mts} +0 -0
  547. /package/dist/{index-Qwqzz3XM.d.mts → index-lIMqGGJz.d.mts} +0 -0
  548. /package/dist/{index-T2S0_qsg.d.mts → index-luywJTzJ.d.mts} +0 -0
  549. /package/dist/{index-kxcPLmUx2.d.mts → index-sViox9YW.d.mts} +0 -0
@@ -1,36 +1,36 @@
1
1
  import { a as styled, n as createGlobalStyle, r as css } from "./styledComponentsInterop-NxwFjeA4.mjs";
2
- import { c as usePDSLocale, i as formatDateTime, l as usePDSStrings, u as DEFAULT_COMMON_STRINGS } from "./i18n-UiE7OC4k.mjs";
3
- import { TruncatedText } from "./lib/TruncatedText.mjs";
2
+ import { isActive, isDisabled, isFocused, isHovered, isNotDisabled } from "./lib/pseudoClass.mjs";
4
3
  import { semanticColor, semanticOnly, semanticTokens } from "./lib/semanticColor.mjs";
4
+ import { focusOutline, focusWithinOutline } from "./mixins/focus.mjs";
5
+ import "./variables/transitions.mjs";
6
+ import { transparent, withAlpha } from "./lib/color.mjs";
7
+ import { semanticScrollbar } from "./mixins/scrollbar.mjs";
5
8
  import { paragraphMixins } from "./mixins/text.mjs";
9
+ import { c as usePDSLocale, i as formatDateTime, l as usePDSStrings, u as DEFAULT_COMMON_STRINGS } from "./i18n-CeRarJIa.mjs";
10
+ import { TruncatedText } from "./lib/TruncatedText.mjs";
6
11
  import { t as Card_default } from "./Card-BXNxWX5C.mjs";
7
12
  import { t as Spacer_default } from "./Spacer-J_HuhxX2.mjs";
8
13
  import { i as Paragraph, r as Label$1 } from "./Text-CSwFifQF.mjs";
9
- import "./variables/transitions.mjs";
10
- import { a as Tooltip } from "./Tooltip-B-0VRuKT.mjs";
11
- import { transparent, withAlpha } from "./lib/color.mjs";
14
+ import { a as Tooltip } from "./Tooltip-DogEteGl.mjs";
12
15
  import { letPointerDownReachDocument } from "./lib/letPointerDownReachDocument.mjs";
13
- import { isActive, isDisabled, isFocused, isHovered, isNotDisabled } from "./lib/pseudoClass.mjs";
14
16
  import { moveItemByIndex } from "./lib/reorderItems.mjs";
15
17
  import { useScrollOverflow } from "./lib/useScrollOverflow.mjs";
16
18
  import { Z_INDICES } from "./lib/zindex.mjs";
17
- import { focusOutline, focusWithinOutline } from "./mixins/focus.mjs";
18
- import { semanticScrollbar } from "./mixins/scrollbar.mjs";
19
19
  import { n as Stack, t as HStack } from "./Stack-BkC7FCdF.mjs";
20
- import { n as Button, t as IconButton } from "./IconButton-H5vDZOdo.mjs";
21
- import { i as TabBar, n as StyledTab, r as Tab } from "./TabBar-DBOPWUUa.mjs";
22
- import { r as InputGroup } from "./Input-CY14-YeD.mjs";
20
+ import { n as Button, t as IconButton } from "./IconButton-D4awF770.mjs";
21
+ import { i as TabBar, n as StyledTab, r as Tab } from "./TabBar-w_gxXSwA.mjs";
22
+ import { r as InputGroup } from "./Input-DD4jzJhK.mjs";
23
23
  import Input_default from "./components/Input/index.mjs";
24
- import { c as MenuList, s as MenuItem } from "./Menu-Dw6Rcpk6.mjs";
25
- import { n as DropdownMenu_default } from "./DropdownMenu-CedsmO5h.mjs";
26
- import { t as Combobox } from "./Combobox-MCaDc7h6.mjs";
27
- import { s as Popover_default } from "./Popover-532iYFek.mjs";
28
- import { i as Modal_default } from "./Modal-dpBu2MKp.mjs";
29
- import { t as Toggle } from "./Toggle-CZF6iBql.mjs";
24
+ import { c as MenuList, s as MenuItem } from "./Menu-DlN0A5Nb.mjs";
25
+ import { n as DropdownMenu_default } from "./DropdownMenu-CPE8Q56k.mjs";
26
+ import { t as Combobox } from "./Combobox-CsXnJKvB.mjs";
27
+ import { s as Popover_default } from "./Popover-DewrGOJB.mjs";
28
+ import { i as Modal_default } from "./Modal-Cs5cZpEr.mjs";
29
+ import { t as Toggle } from "./Toggle-C9cZnajR.mjs";
30
30
  import { i as selectedPresetFor, n as parseDateFilterValue, r as resolveDateFilterValue, t as formatDateFilterValue } from "./date-filter-CWgCXz85.mjs";
31
- import { t as ListBox } from "./ListBox-2aYWNlO_.mjs";
32
- import { m as FormField, o as ComboboxField } from "./FormField-CB0yCMro.mjs";
33
- import { r as DatePicker, t as DateRangePicker } from "./DatePicker-CKk6Hnj2.mjs";
31
+ import { t as ListBox } from "./ListBox-BhWLad_L.mjs";
32
+ import { m as FormField, o as ComboboxField } from "./FormField-DjysBTKn.mjs";
33
+ import { r as DatePicker, t as DateRangePicker } from "./DatePicker-DQHVCGnP.mjs";
34
34
  import { BorderRadius, Color, Spacing, Typography } from "@persona/design-tokens";
35
35
  import { Fragment, createContext, createElement, forwardRef, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
36
36
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -39,10 +39,11 @@ import { CaretDownIcon, CheckIcon, CircleInfoIcon, CirclePlusIcon, CopyIcon, Eye
39
39
  import { CaretDownIcon as CaretDownIcon$1, CircleInfoIcon as CircleInfoIcon$1, LockedIcon as LockedIcon$1, MoreIcon as MoreIcon$1, PlusIcon as PlusIcon$1, SearchIcon as SearchIcon$1, XIcon as XIcon$1 } from "@persona/icons/12px";
40
40
  import { debounce, isEqual, noop, partition, startCase, union, uniqueId } from "lodash-es";
41
41
  import { useId } from "react-aria";
42
+ import { mergeRefs } from "@react-aria/utils";
42
43
  import Fuse from "fuse.js";
43
44
  import { DragIcon as DragIcon$1 } from "@persona/icons/24px";
44
45
  import * as PopoverPrimitive from "@radix-ui/react-popover";
45
- import { DndContext, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
46
+ import { DndContext, PointerSensor, closestCenter, pointerWithin, useSensor, useSensors } from "@dnd-kit/core";
46
47
  import { SortableContext, horizontalListSortingStrategy, useSortable } from "@dnd-kit/sortable";
47
48
  import { DragDropContext, Draggable, Droppable } from "@hello-pangea/dnd";
48
49
  import { parseAbsolute, parseDate, toCalendarDate, toZoned } from "@internationalized/date";
@@ -332,6 +333,7 @@ const ViewNameInput = styled(Input_default)`
332
333
  const AddViewButton = styled(IconButton)`
333
334
  color: ${({ theme }) => semanticColor(theme, "FgSecondary", theme.color.text.secondary)};
334
335
  `;
336
+ const MIN_TAB_WIDTH_FOR_HIDE_BUTTON = 32;
335
337
  const HideViewButton = styled(IconButton)`
336
338
  position: absolute;
337
339
  top: 50%;
@@ -527,15 +529,28 @@ const SavedViewTab = ({ view, selected, tabIdPrefix = TAB_ID_PREFIX, canEditView
527
529
  });
528
530
  return tab;
529
531
  };
530
- const SavedViewTabSlot = ({ slotRef, slotStyle, ...props }) => {
532
+ const SavedViewTabSlot = ({ slotRef, slotStyle, slotListeners, ...props }) => {
531
533
  const { view, selected, onViewHiddenChange, onHideView } = props;
532
534
  const strings = usePDSStrings();
535
+ const [slotElement, setSlotElement] = useState(null);
536
+ const mergedSlotRef = useMemo(() => mergeRefs(slotRef, setSlotElement), [slotRef]);
537
+ const [isTooNarrowForHideButton, setIsTooNarrowForHideButton] = useState(false);
538
+ useLayoutEffect(() => {
539
+ const tab = slotElement?.querySelector("[role=\"tab\"]");
540
+ if (!tab) return;
541
+ const measure = () => setIsTooNarrowForHideButton(tab.offsetWidth > 0 && tab.offsetWidth < MIN_TAB_WIDTH_FOR_HIDE_BUTTON);
542
+ measure();
543
+ const resizeObserver = new ResizeObserver(measure);
544
+ resizeObserver.observe(tab);
545
+ return () => resizeObserver.disconnect();
546
+ }, [slotElement, selected]);
533
547
  return /* @__PURE__ */ jsxs(TabSlot, {
534
- ref: slotRef,
548
+ ref: mergedSlotRef,
535
549
  "data-tab-view": true,
536
550
  "data-tab-slot": true,
537
551
  style: slotStyle,
538
- children: [/* @__PURE__ */ jsx(SavedViewTab, { ...props }), !selected && onViewHiddenChange && /* @__PURE__ */ jsx(HideViewButton, {
552
+ ...slotListeners,
553
+ children: [/* @__PURE__ */ jsx(SavedViewTab, { ...props }), !selected && onViewHiddenChange && !isTooNarrowForHideButton && /* @__PURE__ */ jsx(HideViewButton, {
539
554
  id: `table-controls__view-tab-hide_${view.id}`,
540
555
  "aria-label": strings.hideViewNamed(view.name),
541
556
  title: strings.hideViewTitle,
@@ -546,9 +561,12 @@ const SavedViewTabSlot = ({ slotRef, slotStyle, ...props }) => {
546
561
  };
547
562
  const SortableSavedViewTab = (props) => {
548
563
  const { setNodeRef, listeners, transform, transition, isDragging } = useSortable({ id: props.view.id });
564
+ const slotListeners = useMemo(() => listeners && Object.fromEntries(Object.entries(listeners).map(([eventName, handler]) => [eventName, (event) => {
565
+ if (event.currentTarget.contains(event.target)) handler(event);
566
+ }])), [listeners]);
549
567
  return /* @__PURE__ */ jsx(SavedViewTabSlot, {
550
568
  ...props,
551
- ...listeners,
569
+ slotListeners,
552
570
  slotRef: setNodeRef,
553
571
  slotStyle: {
554
572
  transform: transform ? `translate3d(${transform.x}px, 0, 0)` : void 0,
@@ -667,7 +685,7 @@ const ControlBar = ({ presetViews, currentView, onSelectView, views, hiddenViewI
667
685
  const [isAddViewOverflowing, setIsAddViewOverflowing] = useState(false);
668
686
  useEffect(() => {
669
687
  const previousPendingDeleteView = previousPendingDeleteViewRef.current;
670
- if (!pendingDeleteView && previousPendingDeleteView) (document.getElementById(`${OVERFLOW_TAB_ID_PREFIX}${previousPendingDeleteView.id}`) ?? document.getElementById(`${TAB_ID_PREFIX}${previousPendingDeleteView.id}`))?.focus();
688
+ if (!pendingDeleteView && previousPendingDeleteView) (document.getElementById(`${OVERFLOW_TAB_ID_PREFIX}${previousPendingDeleteView.id}`) ?? document.getElementById(`${TAB_ID_PREFIX}${previousPendingDeleteView.id}`))?.focus({ preventScroll: true });
671
689
  previousPendingDeleteViewRef.current = pendingDeleteView;
672
690
  }, [pendingDeleteView]);
673
691
  const [shownViews, hiddenViews] = useMemo(() => {
@@ -734,15 +752,17 @@ const ControlBar = ({ presetViews, currentView, onSelectView, views, hiddenViewI
734
752
  bottom: tabListRect.bottom
735
753
  } : null;
736
754
  };
737
- const closestVisibleTabCenter = useCallback((args) => {
755
+ const visibleTabCollision = useCallback((args) => {
738
756
  const bounds = dragBoundsRef.current;
739
- return closestCenter({
757
+ const visibleArgs = {
740
758
  ...args,
741
759
  droppableContainers: args.droppableContainers.filter((container) => {
742
760
  const rect = args.droppableRects.get(container.id);
743
761
  return bounds == null || rect != null && rect.bottom <= bounds.bottom + 1;
744
762
  })
745
- });
763
+ };
764
+ const pointerCollisions = pointerWithin(visibleArgs);
765
+ return pointerCollisions.length > 0 ? pointerCollisions : closestCenter(visibleArgs);
746
766
  }, []);
747
767
  const restrictToVisibleSavedTabs = useCallback(({ transform, draggingNodeRect }) => {
748
768
  const bounds = dragBoundsRef.current;
@@ -774,12 +794,14 @@ const ControlBar = ({ presetViews, currentView, onSelectView, views, hiddenViewI
774
794
  if (over) moveView(String(active.id), indexOfView(String(over.id)));
775
795
  };
776
796
  const hideView = (viewId) => {
777
- const index = shownViews.findIndex((view) => view.id === viewId);
797
+ const overflowIds = new Set(overflowViews.map((view) => view.id));
798
+ const visibleViews = shownViews.filter((view) => !overflowIds.has(view.id));
799
+ const index = visibleViews.findIndex((view) => view.id === viewId);
778
800
  const isCurrent = viewId === currentView;
779
- const focusTarget = isCurrent ? void 0 : shownViews[index + 1] ?? shownViews[index - 1];
801
+ const focusTarget = isCurrent || index === -1 ? void 0 : visibleViews[index + 1] ?? visibleViews[index - 1];
780
802
  onViewHiddenChange?.(viewId, true);
781
803
  if (isCurrent) onSelectView?.(null);
782
- document.getElementById(`${TAB_ID_PREFIX}${focusTarget ? focusTarget.id : "default"}`)?.focus();
804
+ document.getElementById(`${TAB_ID_PREFIX}${focusTarget ? focusTarget.id : "default"}`)?.focus({ preventScroll: true });
783
805
  };
784
806
  const moveViewWithKeyboard = (viewId, direction) => {
785
807
  const neighbor = shownViews[shownViews.findIndex((view) => view.id === viewId) + direction];
@@ -960,7 +982,7 @@ const ControlBar = ({ presetViews, currentView, onSelectView, views, hiddenViewI
960
982
  /* @__PURE__ */ jsx(ProductTourStyles, {}),
961
983
  showViewsBar && (onReorderViews ? /* @__PURE__ */ jsx(DndContext, {
962
984
  sensors,
963
- collisionDetection: closestVisibleTabCenter,
985
+ collisionDetection: visibleTabCollision,
964
986
  modifiers: [restrictToVisibleSavedTabs],
965
987
  onDragStart: handleDragStart,
966
988
  onDragEnd: handleDragEnd,
@@ -1506,6 +1528,55 @@ const OPERATORS_BY_TYPE = {
1506
1528
  signals: ["is"],
1507
1529
  date_range: ["is"]
1508
1530
  };
1531
+ /**
1532
+ * Numeric comparison operators. Together with `is` (is equal to) they give
1533
+ * `integer` and `float` fields greater-than / less-than / equal-to filtering.
1534
+ * Inclusive bounds are deliberately not offered: "at least 5" is
1535
+ * `gt 5` OR `is 5`, built with the Rules editor.
1536
+ *
1537
+ * They are opt-in rather than part of the default numeric vocabulary above:
1538
+ * a host whose backend serializes them lists them in the field's
1539
+ * `allowedOperators` (e.g. `['is', ...NUMERIC_COMPARISON_OPERATORS]`).
1540
+ * Adding them to the default vocabulary would surface operators in every
1541
+ * existing numeric field whose host can't serialize them.
1542
+ */
1543
+ const NUMERIC_COMPARISON_OPERATORS = ["gt", "lt"];
1544
+ const NUMERIC_COMPARISON_OPERATOR_SET = new Set(NUMERIC_COMPARISON_OPERATORS);
1545
+ const NUMERIC_FIELD_TYPES = new Set(["integer", "float"]);
1546
+ function isNumericComparisonOperator(operator) {
1547
+ return NUMERIC_COMPARISON_OPERATOR_SET.has(operator);
1548
+ }
1549
+ /**
1550
+ * Whether a comparison value is complete for a numeric field: a finite
1551
+ * number, and a safe integer when the field is an `integer`. Strings are
1552
+ * rejected — the numeric value controls always emit numbers, so a string
1553
+ * here is a corrupted or hand-crafted rule the backend can't compare.
1554
+ */
1555
+ function isCompleteNumericComparisonValue(value, fieldType) {
1556
+ if (typeof value !== "number" || !Number.isFinite(value)) return false;
1557
+ return fieldType === "integer" ? Number.isSafeInteger(value) : true;
1558
+ }
1559
+ /**
1560
+ * Carry `value` into a numeric comparison. Equality rules on numeric fields
1561
+ * tolerate strings (v1 URLs hydrate `'5'`), but a comparison is only complete
1562
+ * with a number, so a numeric string is converted — truncated on `integer`
1563
+ * fields, matching what `IntegerValueControl` emits — and anything else
1564
+ * becomes an empty draft rather than a committed rule validation rejects.
1565
+ */
1566
+ function numericComparisonValue(value, fieldType) {
1567
+ const parsed = typeof value === "number" ? value : typeof value === "string" && value.trim() !== "" ? Number(value) : NaN;
1568
+ if (!Number.isFinite(parsed)) return "";
1569
+ const normalized = fieldType === "integer" ? Math.trunc(parsed) : parsed;
1570
+ return isCompleteNumericComparisonValue(normalized, fieldType) ? normalized : "";
1571
+ }
1572
+ /**
1573
+ * Whether `(fieldType, operator)` is a built-in numeric comparison — the
1574
+ * case validators and labels specialize. Comparisons on non-numeric types
1575
+ * (only reachable through `condition`) are not.
1576
+ */
1577
+ function isNumericComparison(operator, fieldType) {
1578
+ return fieldType != null && NUMERIC_FIELD_TYPES.has(fieldType) && isNumericComparisonOperator(operator);
1579
+ }
1509
1580
  /** Operators that have no value control (the operator itself is the predicate). */
1510
1581
  const VALUELESS_OPERATORS = new Set(["is_empty", "is_not_empty"]);
1511
1582
  /**
@@ -1532,6 +1603,7 @@ function getOperatorsForType(type) {
1532
1603
  * field can never surface an operator the host application can't serialize.
1533
1604
  */
1534
1605
  function getOperatorsForField(field) {
1606
+ if (field.condition != null) return field.condition.operators.map(({ operator }) => operator);
1535
1607
  const { allowedOperators } = field;
1536
1608
  if (allowedOperators == null || allowedOperators.length === 0) return getOperatorsForType(field.type);
1537
1609
  return allowedOperators;
@@ -1541,8 +1613,26 @@ function getDefaultOperatorForType(type) {
1541
1613
  if (list.length === 0) throw new Error(`No operators defined for field type "${type}"`);
1542
1614
  return list[0];
1543
1615
  }
1544
- function isValuelessOperator(operator) {
1545
- return VALUELESS_OPERATORS.has(operator);
1616
+ function getConditionOperator(field, operator) {
1617
+ return field?.condition?.operators.find((config) => config.operator === operator);
1618
+ }
1619
+ function isValuelessOperator(operator, field) {
1620
+ const config = getConditionOperator(field, operator);
1621
+ return config != null ? config.valueType === "none" : VALUELESS_OPERATORS.has(operator);
1622
+ }
1623
+ function hasCompleteConditionValue(rule, field) {
1624
+ const config = getConditionOperator(field, rule.operator);
1625
+ if (config == null) return false;
1626
+ const { value } = rule;
1627
+ if (config.isComplete != null && !config.isComplete(value)) return false;
1628
+ switch (config.valueType) {
1629
+ case "none": return value === null;
1630
+ case "boolean": return typeof value === "boolean";
1631
+ case "number": return typeof value === "number" && Number.isFinite(value);
1632
+ case "integer": return typeof value === "number" && Number.isSafeInteger(value);
1633
+ case "string": return typeof value === "string" && value.length > 0;
1634
+ case "string_array": return Array.isArray(value) && value.length > 0 && value.every((entry) => typeof entry === "string");
1635
+ }
1546
1636
  }
1547
1637
  /**
1548
1638
  * Whether a rule's value is a date range: a range operator, or a field that is
@@ -1587,6 +1677,10 @@ function fieldHasMultipleOperators(field) {
1587
1677
  * translatable `CommonStrings` table (English defaults: "is", "is not", "contains", ...).
1588
1678
  */
1589
1679
  const OPERATOR_LABEL_KEYS = {
1680
+ gt: "operatorGreaterThan",
1681
+ gte: "operatorGreaterThanOrEqual",
1682
+ lt: "operatorLessThan",
1683
+ lte: "operatorLessThanOrEqual",
1590
1684
  is: "operatorIs",
1591
1685
  is_not: "operatorIsNot",
1592
1686
  contains: "operatorContains",
@@ -1607,16 +1701,33 @@ const OPERATOR_LABEL_KEYS = {
1607
1701
  * Only present for `(fieldType, operator)` pairs that diverge from the
1608
1702
  * generic label; everything else falls through to `OPERATOR_LABEL_KEYS`.
1609
1703
  */
1610
- const OPERATOR_LABEL_KEYS_BY_TYPE = { multi_choices: {
1611
- is: "operatorIsAnyOf",
1612
- is_not: "operatorIsNoneOf"
1613
- } };
1704
+ /**
1705
+ * Numeric fields read as a sentence ("Members is equal to 5", "Members is greater
1706
+ * than 5") rather than the generic "is" / bare `>` labels. `is_not` keeps the
1707
+ * generic "is not".
1708
+ */
1709
+ const NUMERIC_LABEL_KEYS = {
1710
+ is: "operatorIsEqualTo",
1711
+ gt: "operatorIsGreaterThan",
1712
+ lt: "operatorIsLessThan"
1713
+ };
1714
+ const OPERATOR_LABEL_KEYS_BY_TYPE = {
1715
+ multi_choices: {
1716
+ is: "operatorIsAnyOf",
1717
+ is_not: "operatorIsNoneOf"
1718
+ },
1719
+ integer: NUMERIC_LABEL_KEYS,
1720
+ float: NUMERIC_LABEL_KEYS
1721
+ };
1614
1722
  /**
1615
1723
  * The label for `operator`, specialized for `fieldType` where the generic label is ambiguous.
1616
1724
  * Pass `strings` from `usePDSStrings()` to translate it; English when omitted.
1617
1725
  */
1618
- function getOperatorLabel(operator, fieldType, strings = DEFAULT_COMMON_STRINGS) {
1619
- return strings[fieldType && OPERATOR_LABEL_KEYS_BY_TYPE[fieldType]?.[operator] || OPERATOR_LABEL_KEYS[operator]];
1726
+ function getOperatorLabel(operator, fieldType, strings = DEFAULT_COMMON_STRINGS, field) {
1727
+ const config = getConditionOperator(field, operator);
1728
+ if (config != null) return config.label;
1729
+ const key = fieldType && OPERATOR_LABEL_KEYS_BY_TYPE[fieldType]?.[operator] || OPERATOR_LABEL_KEYS[operator];
1730
+ return key != null ? strings[key] : operator;
1620
1731
  }
1621
1732
  /**
1622
1733
  * Empty-but-present value seeded when a rule switches from a valueless operator
@@ -1650,7 +1761,16 @@ function emptyDateRange() {
1650
1761
  * `between`.
1651
1762
  */
1652
1763
  function emptyValueForRule(field, operator) {
1653
- if (isValuelessOperator(operator)) return null;
1764
+ if (isValuelessOperator(operator, field)) return null;
1765
+ const config = getConditionOperator(field, operator);
1766
+ if (config != null) {
1767
+ if (config.defaultValue != null) return config.defaultValue;
1768
+ switch (config.valueType) {
1769
+ case "string_array": return [];
1770
+ case "boolean": return true;
1771
+ default: return "";
1772
+ }
1773
+ }
1654
1774
  if (isRangeOperator(operator) || field.type === "date_range") return emptyDateRange();
1655
1775
  return emptyValueForFieldType(field.type);
1656
1776
  }
@@ -1661,8 +1781,10 @@ function emptyValueForRule(field, operator) {
1661
1781
  * the range control can't read it and the wire format would reject it.
1662
1782
  */
1663
1783
  function reconcileValueForOperator(field, nextOperator, previousOperator, value) {
1664
- if (isValuelessOperator(nextOperator)) return null;
1784
+ if (isValuelessOperator(nextOperator, field)) return null;
1785
+ if (field.condition != null) return getConditionOperator(field, nextOperator)?.valueType === getConditionOperator(field, previousOperator)?.valueType ? value ?? emptyValueForRule(field, nextOperator) : emptyValueForRule(field, nextOperator);
1665
1786
  if (isRangeOperator(nextOperator) !== isRangeOperator(previousOperator)) return emptyValueForRule(field, nextOperator);
1787
+ if (isNumericComparison(nextOperator, field.type)) return numericComparisonValue(value, field.type);
1666
1788
  if (field.type === "date" && nextOperator === "is" && typeof value === "string" && TIME_COMPONENT$1.test(value)) return DateTime.fromISO(value).setZone(Settings.defaultZone).toISODate();
1667
1789
  if (field.type === "date" && (previousOperator === "before" || previousOperator === "after") && (nextOperator === "before" || nextOperator === "after") && previousOperator !== nextOperator && typeof value === "string" && TIME_COMPONENT$1.test(value)) {
1668
1790
  const dateTime = DateTime.fromISO(value, { setZone: true });
@@ -1748,6 +1870,7 @@ function valueDisplayString(value, optionLabels, relativeDate, fieldType, { loca
1748
1870
  }
1749
1871
  }
1750
1872
  function draftValueFor(field, operator) {
1873
+ if (field.condition != null) return emptyValueForRule(field, operator);
1751
1874
  if (isValuelessOperator(operator)) return null;
1752
1875
  if (field.type === "boolean") return true;
1753
1876
  if (isRangeOperator(operator)) return emptyValueForRule(field, operator);
@@ -1833,29 +1956,50 @@ function nodeToOptions(node) {
1833
1956
  * `fieldsLabel` names the custom-field submenu; pass `usePDSStrings().fields` to translate it.
1834
1957
  */
1835
1958
  function buildFieldPickerOptions(registry, visibleCustomFieldParents, excludeFieldIds, fieldsLabel = FIELDS_SUBMENU_LABEL) {
1836
- const systemFields = registry.systemFieldsList();
1959
+ const systemFields = registry.all().filter((field) => field.source === "system" || field.pickerGroup != null);
1837
1960
  const customGroups = registry.customFieldGroups();
1838
1961
  const excluded = excludeFieldIds == null ? null : new Set(excludeFieldIds);
1839
- const tree = systemFields.filter((field) => excluded == null || !excluded.has(field.id)).map((field) => ({
1840
- label: field.label,
1841
- value: field.id
1842
- }));
1962
+ const tree = [];
1963
+ const pickerGroups = /* @__PURE__ */ new Map();
1964
+ for (const field of systemFields) {
1965
+ if (excluded?.has(field.id)) continue;
1966
+ const option = {
1967
+ label: field.label,
1968
+ value: field.id
1969
+ };
1970
+ if (field.pickerGroup == null) {
1971
+ tree.push(option);
1972
+ continue;
1973
+ }
1974
+ const options = pickerGroups.get(field.pickerGroup) ?? [];
1975
+ options.push(option);
1976
+ pickerGroups.set(field.pickerGroup, options);
1977
+ }
1978
+ for (const [label, options] of pickerGroups) tree.push({
1979
+ label,
1980
+ nested: true,
1981
+ options
1982
+ });
1843
1983
  const allowedParents = visibleCustomFieldParents == null ? null : new Set(visibleCustomFieldParents);
1844
1984
  const customRoot = newNode();
1845
1985
  for (const group of customGroups) {
1846
1986
  if (allowedParents != null && !allowedParents.has(group.parent)) continue;
1847
1987
  const description = group.parent !== "" ? group.parent : void 0;
1848
1988
  for (const field of group.fields) {
1849
- if (excluded != null && excluded.has(field.id)) continue;
1989
+ if (field.pickerGroup != null || excluded?.has(field.id)) continue;
1850
1990
  insertField(customRoot, field, description);
1851
1991
  }
1852
1992
  }
1853
1993
  const customOptions = nodeToOptions(customRoot);
1854
- if (customOptions.length > 0) tree.push({
1855
- label: fieldsLabel,
1856
- nested: true,
1857
- options: customOptions
1858
- });
1994
+ if (customOptions.length > 0) {
1995
+ const existingGroup = pickerGroups.get(fieldsLabel);
1996
+ if (existingGroup != null) existingGroup.push(...customOptions);
1997
+ else tree.push({
1998
+ label: fieldsLabel,
1999
+ nested: true,
2000
+ options: customOptions
2001
+ });
2002
+ }
1859
2003
  return tree;
1860
2004
  }
1861
2005
  //#endregion
@@ -1876,17 +2020,45 @@ function RuleEditorFields({ registry, dateTimesEnabled, field, groupIndex, ruleI
1876
2020
  const strings = usePDSStrings();
1877
2021
  const minutePrecisionValue = field != null && isMinutePrecisionDate(field, rule.operator, dateTimesEnabled);
1878
2022
  const fieldOptions = useMemo(() => buildFieldPickerOptions(registry, void 0, void 0, strings.fields), [registry, strings.fields]);
2023
+ const optionDisabledReason = useCallback((option) => registry.get(option.value)?.disabledReason, [registry]);
2024
+ const operatorOptions = useMemo(() => operators.map((operator) => ({
2025
+ label: getOperatorLabel(operator, field?.type, strings, field),
2026
+ value: operator
2027
+ })), [
2028
+ operators,
2029
+ field,
2030
+ strings
2031
+ ]);
2032
+ const handleFieldChange = useCallback((next) => {
2033
+ if (next != null && registry.get(next)?.disabledReason == null) onFieldChange(groupIndex, ruleIndex, next);
2034
+ }, [
2035
+ registry,
2036
+ onFieldChange,
2037
+ groupIndex,
2038
+ ruleIndex
2039
+ ]);
2040
+ const handleOperatorChange = useCallback((next) => {
2041
+ if (next != null) onOperatorChange(groupIndex, ruleIndex, next);
2042
+ }, [
2043
+ onOperatorChange,
2044
+ groupIndex,
2045
+ ruleIndex
2046
+ ]);
2047
+ const handleValueChange = useCallback((next, relativeDate) => onValueChange(groupIndex, ruleIndex, next, relativeDate), [
2048
+ onValueChange,
2049
+ groupIndex,
2050
+ ruleIndex
2051
+ ]);
1879
2052
  return /* @__PURE__ */ jsxs(StatementFields, { children: [
1880
2053
  /* @__PURE__ */ jsx(ComboboxField, {
1881
- label: strings.value,
2054
+ label: strings.field,
1882
2055
  labelProps: { size },
1883
2056
  "aria-label": strings.fieldForRule(ruleIndex + 1, groupIndex + 1),
1884
2057
  size,
1885
2058
  options: fieldOptions,
2059
+ optionDisabledReason,
1886
2060
  value: rule.fieldId,
1887
- onChange: (next) => {
1888
- if (typeof next === "string") onFieldChange(groupIndex, ruleIndex, next);
1889
- },
2061
+ onChange: handleFieldChange,
1890
2062
  placeholder: strings.selectField,
1891
2063
  portal: false
1892
2064
  }),
@@ -1895,14 +2067,9 @@ function RuleEditorFields({ registry, dateTimesEnabled, field, groupIndex, ruleI
1895
2067
  labelProps: { size },
1896
2068
  "aria-label": strings.operatorForRule(ruleIndex + 1, groupIndex + 1),
1897
2069
  size,
1898
- options: operators.map((op) => ({
1899
- label: getOperatorLabel(op, field?.type, strings),
1900
- value: op
1901
- })),
2070
+ options: operatorOptions,
1902
2071
  value: rule.operator,
1903
- onChange: (next) => {
1904
- if (typeof next === "string") onOperatorChange(groupIndex, ruleIndex, next);
1905
- },
2072
+ onChange: handleOperatorChange,
1906
2073
  portal: false
1907
2074
  }) : /* @__PURE__ */ jsx(FormField, {
1908
2075
  label: strings.operator,
@@ -1910,16 +2077,16 @@ function RuleEditorFields({ registry, dateTimesEnabled, field, groupIndex, ruleI
1910
2077
  children: /* @__PURE__ */ jsx(Input_default, {
1911
2078
  size,
1912
2079
  "aria-label": strings.operatorForRule(ruleIndex + 1, groupIndex + 1),
1913
- value: getOperatorLabel(rule.operator, field?.type, strings),
2080
+ value: getOperatorLabel(rule.operator, field?.type, strings, field),
1914
2081
  disabled: true,
1915
2082
  readOnly: true
1916
2083
  })
1917
2084
  }),
1918
- field && !isValuelessOperator(rule.operator) ? /* @__PURE__ */ jsx(FormField, {
2085
+ field && !isValuelessOperator(rule.operator, field) ? /* @__PURE__ */ jsx(FormField, {
1919
2086
  label: strings.value,
1920
2087
  labelProps: { size },
1921
2088
  configField: minutePrecisionValue ? false : void 0,
1922
- children: /* @__PURE__ */ jsx(Fragment$1, { children: renderValueControl(field, rule.operator, rule.value, (next, relativeDate) => onValueChange(groupIndex, ruleIndex, next, relativeDate), rule.relativeDate) })
2089
+ children: /* @__PURE__ */ jsx(Fragment$1, { children: renderValueControl(field, rule.operator, rule.value, handleValueChange, rule.relativeDate) })
1923
2090
  }) : null
1924
2091
  ] });
1925
2092
  }
@@ -1933,14 +2100,14 @@ function AdvancedFilterRuleRow({ registry, dateTimesEnabled, groupIndex, ruleInd
1933
2100
  const operatorConfigurable = field ? fieldHasMultipleOperators(field) : true;
1934
2101
  const condition = ruleIndex === 0 ? strings.conditionIf : strings.conditionAnd;
1935
2102
  const rowId = `${groupIndex}-${ruleIndex}`;
1936
- const valueDisplay = isValuelessOperator(rule.operator) ? void 0 : valueDisplayString(rule.value, registry.optionLabelsFor(rule.fieldId), carriesDateRange(rule.operator, field?.type) ? rule.relativeDate : void 0, field?.type, {
2103
+ const valueDisplay = isValuelessOperator(rule.operator, field) ? void 0 : valueDisplayString(rule.value, registry.optionLabelsFor(rule.fieldId), carriesDateRange(rule.operator, field?.type) ? rule.relativeDate : void 0, field?.type, {
1937
2104
  locale,
1938
2105
  strings
1939
2106
  });
1940
2107
  const textValue = [
1941
2108
  condition,
1942
2109
  field?.label ?? rule.fieldId,
1943
- getOperatorLabel(rule.operator, field?.type, strings),
2110
+ getOperatorLabel(rule.operator, field?.type, strings, field),
1944
2111
  valueDisplay
1945
2112
  ].filter(Boolean).join(" ");
1946
2113
  return /* @__PURE__ */ jsx(ListBox.LogicRow, {
@@ -1948,7 +2115,7 @@ function AdvancedFilterRuleRow({ registry, dateTimesEnabled, groupIndex, ruleInd
1948
2115
  condition,
1949
2116
  hideCondition: true,
1950
2117
  attributeName: field?.label ?? rule.fieldId,
1951
- operator: getOperatorLabel(rule.operator, field?.type, strings),
2118
+ operator: getOperatorLabel(rule.operator, field?.type, strings, field),
1952
2119
  matchLevelName: valueDisplay,
1953
2120
  textValue,
1954
2121
  size,
@@ -2200,11 +2367,11 @@ const AdvancedFilterRulesPopover = ({ registry, compound, onChange, trigger, ope
2200
2367
  onOpenChange?.(next);
2201
2368
  }, [isControlled, onOpenChange]);
2202
2369
  const baseId = useMemo(() => uniqueId("advanced-filter-rules__"), []);
2203
- const fields = registry.all();
2370
+ const fields = useMemo(() => registry.all().filter((field) => field.disabledReason == null), [registry]);
2204
2371
  const handleAddOrGroup = useCallback(() => {
2205
2372
  const firstField = fields[0];
2206
2373
  if (!firstField) return;
2207
- const operator = registry.reconcileOperator(firstField.id, "is");
2374
+ const operator = firstField.condition != null ? registry.defaultOperatorFor(firstField.id) : registry.reconcileOperator(firstField.id, "is");
2208
2375
  const groupIndex = compound.groups.length;
2209
2376
  onChange(addRuleToGroup(compound, groupIndex, {
2210
2377
  fieldId: firstField.id,
@@ -2221,7 +2388,7 @@ const AdvancedFilterRulesPopover = ({ registry, compound, onChange, trigger, ope
2221
2388
  const handleAddRuleToGroup = useCallback((groupIndex) => {
2222
2389
  const firstField = fields[0];
2223
2390
  if (!firstField) return;
2224
- const operator = registry.reconcileOperator(firstField.id, "is");
2391
+ const operator = firstField.condition != null ? registry.defaultOperatorFor(firstField.id) : registry.reconcileOperator(firstField.id, "is");
2225
2392
  const newRowId = `${groupIndex}-${compound.groups[groupIndex]?.rules.length ?? 0}`;
2226
2393
  onChange(addRuleToGroup(compound, groupIndex, {
2227
2394
  fieldId: firstField.id,
@@ -2243,7 +2410,7 @@ const AdvancedFilterRulesPopover = ({ registry, compound, onChange, trigger, ope
2243
2410
  }, [compound, applyCompoundChange]);
2244
2411
  const handleFieldChange = useCallback((groupIndex, ruleIndex, nextFieldId) => {
2245
2412
  const field = registry.get(nextFieldId);
2246
- if (!field) return;
2413
+ if (!field || field.disabledReason != null) return;
2247
2414
  const prev = compound.groups[groupIndex]?.rules[ruleIndex];
2248
2415
  if (!prev) return;
2249
2416
  const operator = registry.reconcileOperator(field.id, prev.operator);
@@ -2301,9 +2468,11 @@ const AdvancedFilterRulesPopover = ({ registry, compound, onChange, trigger, ope
2301
2468
  if (event.key !== "Enter") return;
2302
2469
  if (selectedRowKey != null) {
2303
2470
  event.preventDefault();
2304
- closeSelectedRow();
2305
2471
  requestAnimationFrame(() => {
2306
- popoverContentRef.current?.focus();
2472
+ closeSelectedRow();
2473
+ requestAnimationFrame(() => {
2474
+ popoverContentRef.current?.focus();
2475
+ });
2307
2476
  });
2308
2477
  return;
2309
2478
  }
@@ -2356,6 +2525,7 @@ const AdvancedFilterRulesPopover = ({ registry, compound, onChange, trigger, ope
2356
2525
  })
2357
2526
  }), /* @__PURE__ */ jsx(IconButton, {
2358
2527
  size: subtleIconSize,
2528
+ disabled: fields.length === 0,
2359
2529
  onClick: () => handleAddRuleToGroup(groupIndex),
2360
2530
  "aria-label": strings.addRuleToFilterGroup(groupIndex + 1),
2361
2531
  "data-test": `advanced-filter-rules__add-rule-${groupIndex}`,
@@ -2398,6 +2568,7 @@ const AdvancedFilterRulesPopover = ({ registry, compound, onChange, trigger, ope
2398
2568
  width: "auto",
2399
2569
  prefixIcon: /* @__PURE__ */ jsx(PlusIcon, {}),
2400
2570
  onClick: handleAddOrGroup,
2571
+ disabled: fields.length === 0,
2401
2572
  "data-test": "advanced-filter-rules__add-or-group",
2402
2573
  children: strings.orGroup
2403
2574
  }) })] })]
@@ -2824,10 +2995,11 @@ function numericDisplayValue(value) {
2824
2995
  /**
2825
2996
  * Float-typed value control for the Filter UI v2 popover.
2826
2997
  *
2827
- * Used for `float` fields with operators `is` / `is_not`. The popover
2998
+ * Used for `float` fields with operators `is` / `is_not`, and with the
2999
+ * opt-in comparisons `gt` / `lt` when the field's
3000
+ * `allowedOperators` lists them — all carry a single number. The popover
2828
3001
  * renders nothing when the operator is valueless (`is_empty` /
2829
- * `is_not_empty`). Range operators are not part of the current numeric
2830
- * field vocabulary.
3002
+ * `is_not_empty`). Range operators are not part of the numeric vocabulary.
2831
3003
  *
2832
3004
  * The control accepts decimal input and emits a `number` via `onChange`.
2833
3005
  * We keep local display state as a string so partial input like `"3."` is
@@ -2844,7 +3016,7 @@ function numericDisplayValue(value) {
2844
3016
  * rule actually carries when focus leaves.
2845
3017
  *
2846
3018
  * `onChange` is debounced (300ms) to avoid committing on every keystroke;
2847
- * the debounce flushes on blur and on unmount so no pending value is lost.
3019
+ * the debounce flushes on blur or Enter and cancels on unmount.
2848
3020
  */
2849
3021
  const FloatValueControl = ({ field, operator, value, onChange, ariaLabel }) => {
2850
3022
  const strings = usePDSStrings();
@@ -2872,6 +3044,9 @@ const FloatValueControl = ({ field, operator, value, onChange, ariaLabel }) => {
2872
3044
  if (!Number.isFinite(parsed)) return;
2873
3045
  debouncedOnChange(parsed);
2874
3046
  }, [debouncedOnChange]);
3047
+ const handleKeyDown = useCallback((event) => {
3048
+ if (event.key === "Enter" && !event.defaultPrevented && !event.nativeEvent.isComposing) debouncedOnChange.flush();
3049
+ }, [debouncedOnChange]);
2875
3050
  if (isValuelessOperator(operator)) return null;
2876
3051
  return /* @__PURE__ */ jsx(Input_default, {
2877
3052
  type: "number",
@@ -2882,6 +3057,7 @@ const FloatValueControl = ({ field, operator, value, onChange, ariaLabel }) => {
2882
3057
  "aria-label": ariaLabel ?? strings.fieldValue(field.label),
2883
3058
  value: localValue,
2884
3059
  onChange: (e) => handleChange(e.target.value),
3060
+ onKeyDown: handleKeyDown,
2885
3061
  onFocus: () => {
2886
3062
  isFocusedRef.current = true;
2887
3063
  },
@@ -2897,10 +3073,11 @@ const FloatValueControl = ({ field, operator, value, onChange, ariaLabel }) => {
2897
3073
  /**
2898
3074
  * Integer-typed value control for the Filter UI v2 popover.
2899
3075
  *
2900
- * Used for `integer` fields with operators `is` / `is_not`. The popover
3076
+ * Used for `integer` fields with operators `is` / `is_not`, and with the
3077
+ * opt-in comparisons `gt` / `lt` when the field's
3078
+ * `allowedOperators` lists them — all carry a single number. The popover
2901
3079
  * renders nothing when the operator is valueless (`is_empty` /
2902
- * `is_not_empty`). Range operators are not part of the current numeric
2903
- * field vocabulary.
3080
+ * `is_not_empty`). Range operators are not part of the numeric vocabulary.
2904
3081
  *
2905
3082
  * The control accepts any numeric input but always emits an integer via
2906
3083
  * `onChange`. We truncate (rather than round) so that typing `3` -> `3.` -> `3.7`
@@ -2916,7 +3093,7 @@ const FloatValueControl = ({ field, operator, value, onChange, ariaLabel }) => {
2916
3093
  * the user's next keystroke.
2917
3094
  *
2918
3095
  * `onChange` is debounced (300ms) to avoid committing on every keystroke;
2919
- * the debounce flushes on blur and on unmount so no pending value is lost.
3096
+ * the debounce flushes on blur or Enter and cancels on unmount.
2920
3097
  */
2921
3098
  const IntegerValueControl = ({ field, operator, value, onChange, ariaLabel }) => {
2922
3099
  const strings = usePDSStrings();
@@ -2944,6 +3121,9 @@ const IntegerValueControl = ({ field, operator, value, onChange, ariaLabel }) =>
2944
3121
  if (!Number.isFinite(parsed)) return;
2945
3122
  debouncedOnChange(Math.trunc(parsed));
2946
3123
  }, [debouncedOnChange]);
3124
+ const handleKeyDown = useCallback((event) => {
3125
+ if (event.key === "Enter" && !event.defaultPrevented && !event.nativeEvent.isComposing) debouncedOnChange.flush();
3126
+ }, [debouncedOnChange]);
2947
3127
  if (isValuelessOperator(operator)) return null;
2948
3128
  return /* @__PURE__ */ jsx(Input_default, {
2949
3129
  type: "number",
@@ -2954,6 +3134,7 @@ const IntegerValueControl = ({ field, operator, value, onChange, ariaLabel }) =>
2954
3134
  "aria-label": ariaLabel ?? strings.fieldValue(field.label),
2955
3135
  value: localValue,
2956
3136
  onChange: (e) => handleChange(e.target.value),
3137
+ onKeyDown: handleKeyDown,
2957
3138
  onFocus: () => {
2958
3139
  isFocusedRef.current = true;
2959
3140
  },
@@ -2996,7 +3177,7 @@ function StringValueControl({ field, operator, value, onChange, ariaLabel, input
2996
3177
  debouncedOnChange.flush();
2997
3178
  },
2998
3179
  onKeyDown: (event) => {
2999
- if (event.key === "Enter") debouncedOnChange.flush();
3180
+ if (event.key === "Enter" && !event.defaultPrevented && !event.nativeEvent.isComposing) debouncedOnChange.flush();
3000
3181
  }
3001
3182
  });
3002
3183
  }
@@ -3018,8 +3199,27 @@ const RESOLVERS = {
3018
3199
  array: (opts) => /* @__PURE__ */ jsx(ArrayValueControl, { ...opts })
3019
3200
  };
3020
3201
  function resolveValueControl(opts, hostResolver) {
3202
+ if (opts.field.condition != null && isValuelessOperator(opts.operator, opts.field)) return null;
3021
3203
  const hostControl = hostResolver?.(opts);
3022
3204
  if (hostControl != null) return hostControl;
3205
+ const config = getConditionOperator(opts.field, opts.operator);
3206
+ if (config != null) {
3207
+ if (config.valueType === "string_array") return opts.field.options != null ? /* @__PURE__ */ jsx(ChoicesValueControl, {
3208
+ multiple: true,
3209
+ ...opts,
3210
+ operator: "is"
3211
+ }) : null;
3212
+ const type = config.valueType === "number" ? "float" : config.valueType;
3213
+ if (type === "none") return null;
3214
+ return RESOLVERS[type]?.({
3215
+ ...opts,
3216
+ operator: "is",
3217
+ field: {
3218
+ ...opts.field,
3219
+ type
3220
+ }
3221
+ }) ?? null;
3222
+ }
3023
3223
  const renderer = RESOLVERS[opts.field.type];
3024
3224
  if (!renderer) return null;
3025
3225
  return renderer(opts);
@@ -3063,10 +3263,11 @@ const FilterPickerMenu = ({ registry, onPickField, triggerLabel, compact = false
3063
3263
  unfilteredOptions,
3064
3264
  strings.fields
3065
3265
  ]);
3266
+ const optionDisabledReason = useCallback((option) => registry.get(option.value)?.disabledReason, [registry]);
3066
3267
  const handleChange = useCallback((value) => {
3067
3268
  if (value == null) return;
3068
3269
  const field = registry.get(value);
3069
- if (!field) return;
3270
+ if (!field || field.disabledReason != null) return;
3070
3271
  onPickField(field);
3071
3272
  }, [registry, onPickField]);
3072
3273
  if (options.length === 0 && unfilteredOptions.length > 0) return null;
@@ -3088,6 +3289,7 @@ const FilterPickerMenu = ({ registry, onPickField, triggerLabel, compact = false
3088
3289
  $isOpen: false,
3089
3290
  children: /* @__PURE__ */ jsx(Combobox, {
3090
3291
  options,
3292
+ optionDisabledReason,
3091
3293
  value: null,
3092
3294
  onChange: handleChange,
3093
3295
  size: resolvedSize,
@@ -3347,9 +3549,10 @@ function normalizeValueToDisplay(value, optionLabels, relativeDate, fieldType, s
3347
3549
  */
3348
3550
  function buildAccessibleName(field, rule, displayedValues, strings = DEFAULT_COMMON_STRINGS) {
3349
3551
  if (rule == null) return field.label;
3350
- if (!isValuelessOperator(rule.operator) && displayedValues.length === 0) return field.label;
3351
- const operatorLabel = getOperatorLabel(rule.operator, field.type, strings);
3352
- if (isValuelessOperator(rule.operator)) return `${field.label} ${operatorLabel}`;
3552
+ if (field.condition != null && !hasCompleteConditionValue(rule, field)) return field.label;
3553
+ if (!isValuelessOperator(rule.operator, field) && displayedValues.length === 0) return field.label;
3554
+ const operatorLabel = getOperatorLabel(rule.operator, field.type, strings, field);
3555
+ if (isValuelessOperator(rule.operator, field)) return `${field.label} ${operatorLabel}`;
3353
3556
  return `${field.label} ${operatorLabel} ${displayedValues.join(", ")}`;
3354
3557
  }
3355
3558
  const FilterPill = forwardRef(function FilterPill({ field, rule, onClick, onDismiss, variant = "default", optionLabels, size, ...rest }, ref) {
@@ -3357,16 +3560,16 @@ const FilterPill = forwardRef(function FilterPill({ field, rule, onClick, onDism
3357
3560
  const resolvedSize = useFilterBarSize(size);
3358
3561
  const strings = usePDSStrings();
3359
3562
  const locale = usePDSLocale();
3360
- const displayedValues = useMemo(() => rule && !isValuelessOperator(rule.operator) ? normalizeValueToDisplay(rule.value, optionLabels, carriesDateRange(rule.operator, field?.type) ? rule.relativeDate : void 0, field?.type, strings, locale) : [], [
3563
+ const displayedValues = useMemo(() => rule && !isValuelessOperator(rule.operator, field) ? normalizeValueToDisplay(rule.value, optionLabels, carriesDateRange(rule.operator, field?.type) ? rule.relativeDate : void 0, field?.type, strings, locale) : [], [
3361
3564
  rule,
3362
3565
  optionLabels,
3363
- field?.type,
3566
+ field,
3364
3567
  strings,
3365
3568
  locale
3366
3569
  ]);
3367
3570
  const accessibleName = buildAccessibleName(field, rule, displayedValues, strings);
3368
3571
  const hasRule = rule != null;
3369
- const isComplete = hasRule && (isValuelessOperator(rule.operator) || displayedValues.length > 0);
3572
+ const isComplete = hasRule && (field.condition != null ? hasCompleteConditionValue(rule, field) : isValuelessOperator(rule.operator, field) || displayedValues.length > 0);
3370
3573
  const firstValue = displayedValues[0];
3371
3574
  const overflowValues = displayedValues.slice(1);
3372
3575
  const overflowTooltipId = `${reactId}-overflow`;
@@ -3381,8 +3584,8 @@ const FilterPill = forwardRef(function FilterPill({ field, rule, onClick, onDism
3381
3584
  ...rest,
3382
3585
  children: [
3383
3586
  /* @__PURE__ */ jsx(FieldLabel, { children: /* @__PURE__ */ jsx(TruncatedText, { children: field.label }) }),
3384
- isComplete && hasRule && /* @__PURE__ */ jsx(OperatorLabel, { children: getOperatorLabel(rule.operator, field.type, strings) }),
3385
- isComplete && hasRule && !isValuelessOperator(rule.operator) && firstValue != null && /* @__PURE__ */ jsxs(ValueChipGroup, { children: [/* @__PURE__ */ jsx(ValueChip, {
3587
+ isComplete && hasRule && /* @__PURE__ */ jsx(OperatorLabel, { children: getOperatorLabel(rule.operator, field.type, strings, field) }),
3588
+ isComplete && hasRule && !isValuelessOperator(rule.operator, field) && firstValue != null && /* @__PURE__ */ jsxs(ValueChipGroup, { children: [/* @__PURE__ */ jsx(ValueChip, {
3386
3589
  $variant: variant,
3387
3590
  $size: resolvedSize,
3388
3591
  children: /* @__PURE__ */ jsx(TruncatedText, { children: firstValue })
@@ -3519,10 +3722,10 @@ const Footer = styled(HStack).attrs({
3519
3722
  * back through `onChangeOperator` and forwards open/close transitions
3520
3723
  * through Radix's controlled props.
3521
3724
  */
3522
- const FilterPopover = ({ field, operator, onChangeOperator, valueControlSlot, onClose, trigger, open, onOpenChange, size, wide = false }) => {
3725
+ const FilterPopover = ({ field, operator, onChangeOperator, valueControlSlot, onClose, onApply, trigger, open, onOpenChange, size, wide = false }) => {
3523
3726
  const strings = usePDSStrings();
3524
3727
  const resolvedSize = useFilterBarSize(size);
3525
- const valueless = isValuelessOperator(operator);
3728
+ const valueless = isValuelessOperator(operator, field);
3526
3729
  const CaretIcon = resolvedSize === "sm" ? CaretDownIcon$1 : CaretDownIcon;
3527
3730
  const InfoIcon = resolvedSize === "sm" ? CircleInfoIcon$1 : CircleInfoIcon;
3528
3731
  const showOperatorSelector = fieldHasMultipleOperators(field);
@@ -3532,6 +3735,7 @@ const FilterPopover = ({ field, operator, onChangeOperator, valueControlSlot, on
3532
3735
  if (!next) onClose();
3533
3736
  }, [onOpenChange, onClose]);
3534
3737
  const valueSlotRef = useRef(null);
3738
+ const applyButtonRef = useRef(null);
3535
3739
  useEffect(() => {
3536
3740
  if (open !== true || valueless) return;
3537
3741
  const handle = requestAnimationFrame(() => {
@@ -3545,16 +3749,19 @@ const FilterPopover = ({ field, operator, onChangeOperator, valueControlSlot, on
3545
3749
  field.id,
3546
3750
  valueless
3547
3751
  ]);
3548
- const handleKeyDown = (event) => {
3549
- if (event.key !== "Enter") return;
3752
+ const handleKeyDown = useCallback((event) => {
3753
+ if (event.key !== "Enter" || event.defaultPrevented || event.nativeEvent.isComposing) return;
3550
3754
  const target = event.target;
3551
3755
  if (!target || target.tagName !== "INPUT") return;
3552
3756
  const input = target;
3553
- if (input.type === "checkbox" || input.type === "radio") return;
3554
- if (input.getAttribute("role") === "combobox") return;
3757
+ if (input.type === "checkbox" || input.type === "radio" || input.getAttribute("role") === "combobox") return;
3555
3758
  event.preventDefault();
3759
+ if (applyButtonRef.current != null) {
3760
+ applyButtonRef.current.click();
3761
+ return;
3762
+ }
3556
3763
  handleOpenChange(false);
3557
- };
3764
+ }, [handleOpenChange]);
3558
3765
  return /* @__PURE__ */ jsxs(Popover_default, {
3559
3766
  open,
3560
3767
  onOpenChange: handleOpenChange,
@@ -3578,31 +3785,43 @@ const FilterPopover = ({ field, operator, onChangeOperator, valueControlSlot, on
3578
3785
  children: [/* @__PURE__ */ jsxs(Main, {
3579
3786
  $valueless: valueless,
3580
3787
  "data-test": "filter-popover__main",
3581
- children: [/* @__PURE__ */ jsxs(HeaderRow, {
3582
- $size: resolvedSize,
3583
- children: [/* @__PURE__ */ jsx(FieldTypeLabel, {
3788
+ children: [
3789
+ /* @__PURE__ */ jsxs(HeaderRow, {
3584
3790
  $size: resolvedSize,
3585
- children: /* @__PURE__ */ jsx(TruncatedText, { children: field.label })
3586
- }), showOperatorSelector ? /* @__PURE__ */ jsx(OperatorMenu, {
3587
- trigger: /* @__PURE__ */ jsxs(InlineOperatorTrigger, {
3588
- type: "button",
3589
- "aria-label": strings.operator,
3791
+ children: [/* @__PURE__ */ jsx(FieldTypeLabel, {
3590
3792
  $size: resolvedSize,
3591
- children: [getOperatorLabel(operator, field.type, strings), /* @__PURE__ */ jsx(CaretIcon, { "aria-hidden": "true" })]
3592
- }),
3593
- align: "start",
3594
- portal: true,
3595
- zIndex: Z_INDICES.layeredDropdown,
3596
- children: operatorOptions.map((op) => /* @__PURE__ */ jsx(DropdownMenu_default.Item, {
3793
+ children: /* @__PURE__ */ jsx(TruncatedText, { children: field.label })
3794
+ }), showOperatorSelector ? /* @__PURE__ */ jsx(OperatorMenu, {
3795
+ trigger: /* @__PURE__ */ jsxs(InlineOperatorTrigger, {
3796
+ type: "button",
3797
+ "aria-label": strings.operator,
3798
+ $size: resolvedSize,
3799
+ children: [getOperatorLabel(operator, field.type, strings, field), /* @__PURE__ */ jsx(CaretIcon, { "aria-hidden": "true" })]
3800
+ }),
3801
+ align: "start",
3802
+ portal: true,
3803
+ zIndex: Z_INDICES.layeredDropdown,
3804
+ children: operatorOptions.map((op) => /* @__PURE__ */ jsx(DropdownMenu_default.Item, {
3805
+ size: resolvedSize,
3806
+ onClick: () => onChangeOperator(op),
3807
+ children: getOperatorLabel(op, field.type, strings, field)
3808
+ }, op))
3809
+ }) : /* @__PURE__ */ jsx("span", { children: getOperatorLabel(operator, field.type, strings, field) })]
3810
+ }),
3811
+ !valueless ? /* @__PURE__ */ jsx(ValueSlot, {
3812
+ ref: valueSlotRef,
3813
+ children: valueControlSlot
3814
+ }) : null,
3815
+ onApply != null && /* @__PURE__ */ jsx(PopoverPrimitive.Close, {
3816
+ asChild: true,
3817
+ children: /* @__PURE__ */ jsx(Button, {
3818
+ ref: applyButtonRef,
3597
3819
  size: resolvedSize,
3598
- onClick: () => onChangeOperator(op),
3599
- children: getOperatorLabel(op, field.type, strings)
3600
- }, op))
3601
- }) : /* @__PURE__ */ jsx("span", { children: getOperatorLabel(operator, field.type, strings) })]
3602
- }), !valueless ? /* @__PURE__ */ jsx(ValueSlot, {
3603
- ref: valueSlotRef,
3604
- children: valueControlSlot
3605
- }) : null]
3820
+ onClick: onApply,
3821
+ children: strings.applyFilter
3822
+ })
3823
+ })
3824
+ ]
3606
3825
  }), field.source === "custom" && field.parentRecordType != null && /* @__PURE__ */ jsxs(Footer, { children: [/* @__PURE__ */ jsx(InfoIcon, { "aria-hidden": "true" }), /* @__PURE__ */ jsxs(TruncatedText, { children: [
3607
3826
  field.label,
3608
3827
  " is a field on ",
@@ -3720,6 +3939,10 @@ function isEmptyState(state) {
3720
3939
  const OPERATOR_SET = new Set([
3721
3940
  "is",
3722
3941
  "is_not",
3942
+ "gt",
3943
+ "gte",
3944
+ "lt",
3945
+ "lte",
3723
3946
  "contains",
3724
3947
  "does_not_contain",
3725
3948
  "is_empty",
@@ -3758,7 +3981,7 @@ function isFilterRule(value) {
3758
3981
  if (typeof value !== "object" || value == null) return false;
3759
3982
  const v = value;
3760
3983
  if (typeof v.fieldId !== "string" || v.fieldId.length === 0) return false;
3761
- if (typeof v.operator !== "string" || !OPERATOR_SET.has(v.operator)) return false;
3984
+ if (typeof v.operator !== "string" || !OPERATOR_SET.has(v.operator) && !/^custom:.+/.test(v.operator)) return false;
3762
3985
  if (!isFilterRuleValue(v.value)) return false;
3763
3986
  return true;
3764
3987
  }
@@ -3834,7 +4057,7 @@ function pruneToRegistry(state, registry) {
3834
4057
  */
3835
4058
  function coerceBooleanRule(rule, registry) {
3836
4059
  const field = registry.get(rule.fieldId);
3837
- if (!field || field.type !== "boolean") return rule;
4060
+ if (!field || field.condition != null || field.type !== "boolean") return rule;
3838
4061
  if (rule.operator === "is_true") return {
3839
4062
  ...rule,
3840
4063
  operator: "is",
@@ -3864,9 +4087,16 @@ function coerceBooleanRules(state, registry) {
3864
4087
  };
3865
4088
  }
3866
4089
  function isDraftRuleValue(rule, registry) {
3867
- if (isValuelessOperator(rule.operator)) return false;
3868
4090
  const field = registry.get(rule.fieldId);
3869
4091
  if (!field) return false;
4092
+ const config = getConditionOperator(field, rule.operator);
4093
+ if (config != null) switch (config.valueType) {
4094
+ case "none":
4095
+ case "boolean": return false;
4096
+ case "string_array": return Array.isArray(rule.value) && rule.value.length === 0;
4097
+ default: return rule.value === "" || rule.value == null;
4098
+ }
4099
+ if (isValuelessOperator(rule.operator)) return false;
3870
4100
  if (isRangeOperator(rule.operator)) return !isCompleteDateRange(rule.value);
3871
4101
  switch (field.type) {
3872
4102
  case "multi_choices":
@@ -3879,11 +4109,14 @@ function isDraftRuleValue(rule, registry) {
3879
4109
  }
3880
4110
  }
3881
4111
  function isRuleAllowed(rule, registry, options = { allowDraftValues: false }) {
3882
- if (!registry.has(rule.fieldId)) return false;
4112
+ const field = registry.get(rule.fieldId);
4113
+ if (field == null) return false;
3883
4114
  if (!registry.operatorsFor(rule.fieldId).includes(rule.operator)) return false;
4115
+ if (field.condition != null) return hasCompleteConditionValue(rule, field) || options.allowDraftValues && isDraftRuleValue(rule, registry);
3884
4116
  if (isValuelessOperator(rule.operator)) return rule.value == null;
3885
4117
  if (options.allowDraftValues && isDraftRuleValue(rule, registry)) return true;
3886
4118
  if (isRangeOperator(rule.operator)) return isCompleteDateRange(rule.value);
4119
+ if (isNumericComparison(rule.operator, field.type)) return isCompleteNumericComparisonValue(rule.value, field.type);
3887
4120
  if (registry.get(rule.fieldId)?.type === "boolean") return typeof rule.value === "boolean";
3888
4121
  if (registry.get(rule.fieldId)?.type === "date") return typeof rule.value === "string" && rule.value.length > 0;
3889
4122
  if (registry.get(rule.fieldId)?.type === "multi_choices") {
@@ -3907,10 +4140,13 @@ function isRuleAllowed(rule, registry, options = { allowDraftValues: false }) {
3907
4140
  * does not gate operator vocabulary or registry membership.
3908
4141
  */
3909
4142
  function hasCompleteValue(rule, registry) {
4143
+ const field = registry.get(rule.fieldId);
4144
+ if (field?.condition != null) return hasCompleteConditionValue(rule, field);
3910
4145
  if (isValuelessOperator(rule.operator)) return rule.value == null;
3911
4146
  const { value } = rule;
3912
4147
  if (value == null) return false;
3913
4148
  if (isRangeOperator(rule.operator)) return isCompleteDateRange(value);
4149
+ if (field != null && isNumericComparison(rule.operator, field.type)) return isCompleteNumericComparisonValue(value, field.type);
3914
4150
  switch (registry.get(rule.fieldId)?.type) {
3915
4151
  case "boolean": return typeof value === "boolean";
3916
4152
  case "date": return typeof value === "string" && value.length > 0;
@@ -4010,20 +4246,22 @@ function useFilterStateV2(options) {
4010
4246
  ...prev.all,
4011
4247
  topLevelRules: [...prev.all.topLevelRules, added]
4012
4248
  },
4013
- heldIds: isHeldRule(added) ? withId(prev.heldIds, id) : prev.heldIds
4249
+ heldIds: registry.get(rule.fieldId)?.condition != null || isHeldRule(added, registry) ? withId(prev.heldIds, id) : prev.heldIds
4014
4250
  }));
4015
4251
  return id;
4016
- }, []),
4017
- updateTopLevelRule: useCallback((id, rule) => {
4252
+ }, [registry]),
4253
+ updateTopLevelRule: useCallback((id, update) => {
4018
4254
  setInternal((prev) => {
4019
4255
  const idx = prev.all.topLevelRules.findIndex((r) => r.id === id);
4020
- if (idx < 0) return prev;
4256
+ const currentRule = prev.all.topLevelRules[idx];
4257
+ if (currentRule == null) return prev;
4258
+ const rule = typeof update === "function" ? update(currentRule) : update;
4021
4259
  const topLevelRules = [...prev.all.topLevelRules];
4022
4260
  topLevelRules[idx] = {
4023
4261
  ...rule,
4024
4262
  id
4025
4263
  };
4026
- const heldIds = isHeldRule(rule) ? withId(prev.heldIds, id) : withoutId(prev.heldIds, id);
4264
+ const heldIds = isHeldRule(rule, registry) ? withId(prev.heldIds, id) : withoutId(prev.heldIds, id);
4027
4265
  return {
4028
4266
  all: {
4029
4267
  ...prev.all,
@@ -4032,7 +4270,7 @@ function useFilterStateV2(options) {
4032
4270
  heldIds
4033
4271
  };
4034
4272
  });
4035
- }, []),
4273
+ }, [registry]),
4036
4274
  removeTopLevelRule: useCallback((id) => {
4037
4275
  setInternal((prev) => {
4038
4276
  const topLevelRules = prev.all.topLevelRules.filter((r) => r.id !== id);
@@ -4053,7 +4291,8 @@ function useFilterStateV2(options) {
4053
4291
  * `''` and `[]` are values a user can choose, and a filter cleared to one is
4054
4292
  * still a filter.
4055
4293
  */
4056
- function isHeldRule(rule) {
4294
+ function isHeldRule(rule, registry) {
4295
+ if (registry.get(rule.fieldId)?.condition != null) return !hasCompleteValue(rule, registry);
4057
4296
  return !isValuelessOperator(rule.operator) && rule.value == null;
4058
4297
  }
4059
4298
  function heldRulesOf(state) {
@@ -4247,6 +4486,7 @@ function FilterBar({ registry, initialState, onChange, advancedRulesEnabled = tr
4247
4486
  onChangeRef.current = onChange;
4248
4487
  }, [onChange]);
4249
4488
  const { committedState } = filterState;
4489
+ const committedRuleIds = useMemo(() => new Set(committedState.topLevelRules.map((rule) => rule.id)), [committedState.topLevelRules]);
4250
4490
  const lastReportedState = useRef(committedState);
4251
4491
  useEffect(() => {
4252
4492
  if (isEqual(lastReportedState.current, committedState)) return;
@@ -4255,13 +4495,15 @@ function FilterBar({ registry, initialState, onChange, advancedRulesEnabled = tr
4255
4495
  }, [committedState]);
4256
4496
  const pendingEditRuleIdRef = useRef(null);
4257
4497
  const openedViaScrollIntoViewRef = useRef(false);
4258
- const handlePickField = (field) => {
4259
- pendingEditRuleIdRef.current = filterState.addTopLevelRule({
4498
+ const { addTopLevelRule } = filterState;
4499
+ const handlePickField = useCallback((field) => {
4500
+ const operator = registry.defaultOperatorFor(field.id);
4501
+ pendingEditRuleIdRef.current = addTopLevelRule({
4260
4502
  fieldId: field.id,
4261
- operator: registry.defaultOperatorFor(field.id),
4262
- value: null
4503
+ operator,
4504
+ value: field.condition != null ? emptyValueForRule(field, operator) : null
4263
4505
  });
4264
- };
4506
+ }, [addTopLevelRule, registry]);
4265
4507
  const hasPills = filterState.state.topLevelRules.length > 0;
4266
4508
  const excludeFieldIds = useStableFieldIds(singleUseFields ? filterState.state.topLevelRules.map((rule) => rule.fieldId) : void 0);
4267
4509
  const pillsScrollRef = useRef(null);
@@ -4409,6 +4651,7 @@ function FilterBar({ registry, initialState, onChange, advancedRulesEnabled = tr
4409
4651
  dateTimesEnabled
4410
4652
  }, valueControlResolver),
4411
4653
  onClose: () => setEditingRuleId(null),
4654
+ onApply: field.condition != null && !committedRuleIds.has(rule.id) && hasCompleteValue(rule, registry) ? () => filterState.updateTopLevelRule(rule.id, (currentRule) => currentRule) : void 0,
4412
4655
  open: isOpen,
4413
4656
  onOpenChange: (open) => setEditingRuleId(open ? rule.id : null),
4414
4657
  trigger: /* @__PURE__ */ jsx(FilterPill, {
@@ -4417,7 +4660,7 @@ function FilterBar({ registry, initialState, onChange, advancedRulesEnabled = tr
4417
4660
  else pillNodesRef.current.delete(rule.id);
4418
4661
  },
4419
4662
  field,
4420
- rule,
4663
+ rule: field.condition != null && !committedRuleIds.has(rule.id) ? null : rule,
4421
4664
  variant: isOpen ? "active" : "default",
4422
4665
  optionLabels,
4423
4666
  onDismiss: () => filterState.removeTopLevelRule(rule.id)
@@ -4583,7 +4826,10 @@ var FieldRegistry = class {
4583
4826
  }
4584
4827
  /** Default operator for a registered field. Used when creating a new pill. */
4585
4828
  defaultOperatorFor(fieldId) {
4586
- const [defaultOperator] = getOperatorsForField(this.getOrThrow(fieldId));
4829
+ const field = this.getOrThrow(fieldId);
4830
+ const operators = getOperatorsForField(field);
4831
+ const defaultOperator = field.condition?.defaultOperator ?? operators[0];
4832
+ if (defaultOperator != null && !operators.includes(defaultOperator)) throw new Error(`FieldRegistry: default operator is not available for field "${fieldId}"`);
4587
4833
  if (defaultOperator == null) throw new Error(`FieldRegistry: no operators available for field "${fieldId}"`);
4588
4834
  return defaultOperator;
4589
4835
  }
@@ -4752,6 +4998,6 @@ function decodeBase64(input) {
4752
4998
  return decodeURIComponent(escape(atob(input)));
4753
4999
  }
4754
5000
  //#endregion
4755
- export { TableControlsProvider as A, getOperatorsForType as C, reconcileValueForOperator as D, isValuelessOperator as E, ControlBar as F, DataTableCompactBar as I, TableViewConfiguration as M, TableViewConfigurationDropdown as N, dateRuleIntent as O, TableControls as P, getOperatorsForField as S, isRangeOperator as T, FILTER_SIZE_TOKENS as _, encodeFilterStateToUrlParam as a, emptyValueForRule as b, FilterBar_default as c, isFilterStateV2 as d, pruneToRegistry as f, resolveValueControl as g, PillShell as h, decodeFilterStateFromUrl as i, useTableControls as j, TableControlsContext as k, useFilterStateV2 as l, isEmptyState as m, applyFilterStateToSearchParams as n, FieldRegistry as o, EMPTY_FILTER_STATE as p, decodeFilterStateFromString as r, buildFieldRegistry as s, FILTER_STATE_URL_PARAM as t, hasCompleteValue as u, useFilterBarSize as v, isCompleteDateRange as w, getDefaultOperatorForType as x, resolveDateRangeRuleValue as y };
5001
+ export { dateRuleIntent as A, getOperatorsForField as C, isRangeOperator as D, isNumericComparisonOperator as E, TableViewConfigurationDropdown as F, TableControls as I, ControlBar as L, TableControlsProvider as M, useTableControls as N, isValuelessOperator as O, TableViewConfiguration as P, DataTableCompactBar as R, getDefaultOperatorForType as S, isCompleteDateRange as T, FILTER_SIZE_TOKENS as _, encodeFilterStateToUrlParam as a, NUMERIC_COMPARISON_OPERATORS as b, FilterBar_default as c, isFilterStateV2 as d, pruneToRegistry as f, resolveValueControl as g, PillShell as h, decodeFilterStateFromUrl as i, TableControlsContext as j, reconcileValueForOperator as k, useFilterStateV2 as l, isEmptyState as m, applyFilterStateToSearchParams as n, FieldRegistry as o, EMPTY_FILTER_STATE as p, decodeFilterStateFromString as r, buildFieldRegistry as s, FILTER_STATE_URL_PARAM as t, hasCompleteValue as u, useFilterBarSize as v, getOperatorsForType as w, emptyValueForRule as x, resolveDateRangeRuleValue as y };
4756
5002
 
4757
- //# sourceMappingURL=TableControls-B5UGCoO-.mjs.map
5003
+ //# sourceMappingURL=TableControls-C1MF2JvY.mjs.map