@persona/design-system 0.10.10 → 0.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/AdvancedFilterRuleRow.d.mts +5 -2
  3. package/dist/AdvancedFilterRulesPopover.d.mts +6 -2
  4. package/dist/ArrayValueControl.d.mts +1 -1
  5. package/dist/{Badge-BCdsVKuj.mjs → Badge-B2AJMf3d.mjs} +2 -2
  6. package/dist/{Badge-BCdsVKuj.mjs.map → Badge-B2AJMf3d.mjs.map} +1 -1
  7. package/dist/BooleanValueControl.d.mts +1 -1
  8. package/dist/{Breadcrumbs-CMf3Uvow.mjs → Breadcrumbs-DRs9eo1o.mjs} +5 -5
  9. package/dist/Breadcrumbs-DRs9eo1o.mjs.map +1 -0
  10. package/dist/{CardV2-CrV6eEQb.mjs → CardV2-DO-8COfu.mjs} +11 -8
  11. package/dist/CardV2-DO-8COfu.mjs.map +1 -0
  12. package/dist/ChartFrame.d.mts +61 -0
  13. package/dist/ChartLegend.d.mts +60 -0
  14. package/dist/ChartPopover.d.mts +155 -0
  15. package/dist/{Checkbox-Dr4LMKHV.mjs → Checkbox-BAh-wF_F.mjs} +5 -5
  16. package/dist/Checkbox-BAh-wF_F.mjs.map +1 -0
  17. package/dist/{CheckboxGroupField-Bpu2j6G2.d.mts → CheckboxGroupField-XSVAmESI.d.mts} +2 -2
  18. package/dist/CheckboxGroupField.d.mts +1 -1
  19. package/dist/ChoicesValueControl.d.mts +1 -1
  20. package/dist/{Combobox-Gb_j1dg6.mjs → Combobox-BNjYEAmv.mjs} +313 -138
  21. package/dist/Combobox-BNjYEAmv.mjs.map +1 -0
  22. package/dist/Combobox-DbcSss15.d.mts +12 -0
  23. package/dist/Combobox.d.mts +3 -3
  24. package/dist/{ComboboxBase-BPXqJHaQ.d.mts → ComboboxBase-CrFweFGi.d.mts} +61 -21
  25. package/dist/ComboboxBase.d.mts +2 -2
  26. package/dist/{ComboboxMultiSelect-BwkkSymj.d.mts → ComboboxMultiSelect-Cp5GBGQj.d.mts} +10 -6
  27. package/dist/ComboboxMultiSelect.d.mts +2 -2
  28. package/dist/{ComboboxSingleSelect-CdNNJNkp.d.mts → ComboboxSingleSelect-u7fK3Yvy.d.mts} +8 -6
  29. package/dist/ComboboxSingleSelect.d.mts +2 -2
  30. package/dist/{DataTable-BE9inUi-.d.mts → DataTable-C1mdfmQa.d.mts} +17 -7
  31. package/dist/{DataTable-CIZJ1vO8.mjs → DataTable-DdSY9mzT.mjs} +36 -23
  32. package/dist/DataTable-DdSY9mzT.mjs.map +1 -0
  33. package/dist/DataTable.d.mts +1 -1
  34. package/dist/{DatePicker-C9redLBr.mjs → DatePicker-DiilpYQg.mjs} +5 -5
  35. package/dist/{DatePicker-C9redLBr.mjs.map → DatePicker-DiilpYQg.mjs.map} +1 -1
  36. package/dist/DateRangeValueControl.d.mts +1 -1
  37. package/dist/DateValueControl.d.mts +1 -1
  38. package/dist/{DropdownButton-DpLG-cIj.mjs → DropdownButton-BxZ5hn0X.mjs} +3 -3
  39. package/dist/{DropdownButton-DpLG-cIj.mjs.map → DropdownButton-BxZ5hn0X.mjs.map} +1 -1
  40. package/dist/DropdownButton.d.mts +1 -1
  41. package/dist/{DropdownMenu-B6D4stkF.d.mts → DropdownMenu-CQR0U-zM.d.mts} +2 -2
  42. package/dist/{DropdownMenu-c8XK2Lr4.mjs → DropdownMenu-Ip75l4Th.mjs} +21 -2
  43. package/dist/DropdownMenu-Ip75l4Th.mjs.map +1 -0
  44. package/dist/DropdownMenu.d.mts +1 -1
  45. package/dist/{FieldRegistry-C2NVPhMO.d.mts → FieldRegistry-CJwGpUVK.d.mts} +2 -2
  46. package/dist/FieldRegistry.d.mts +1 -1
  47. package/dist/{FilterBar-BE_gBM0H.d.mts → FilterBar-CA4mDAXK.d.mts} +13 -5
  48. package/dist/FilterBar.d.mts +1 -1
  49. package/dist/FilterPickerMenu.d.mts +2 -2
  50. package/dist/FilterPill.d.mts +1 -1
  51. package/dist/FilterPopover.d.mts +1 -1
  52. package/dist/FloatValueControl.d.mts +3 -2
  53. package/dist/{FloatingToolbar-DLRaE0o7.mjs → FloatingToolbar-BA8Fqmrz.mjs} +35 -38
  54. package/dist/FloatingToolbar-BA8Fqmrz.mjs.map +1 -0
  55. package/dist/{FormControl-BztNXLn6.mjs → FormControl-BoKGiWdQ.mjs} +2 -2
  56. package/dist/{FormControl-BztNXLn6.mjs.map → FormControl-BoKGiWdQ.mjs.map} +1 -1
  57. package/dist/{FormField-Cf1VMvoa.mjs → FormField-yYJFkJ6R.mjs} +13 -13
  58. package/dist/{FormField-Cf1VMvoa.mjs.map → FormField-yYJFkJ6R.mjs.map} +1 -1
  59. package/dist/{HoverCopyableField-XHC_n9tp.mjs → HoverCopyableField-X2XfKTTh.mjs} +10 -5
  60. package/dist/HoverCopyableField-X2XfKTTh.mjs.map +1 -0
  61. package/dist/{IconButton-DxHB2g80.mjs → IconButton-Bj1fry_K.mjs} +4 -3
  62. package/dist/IconButton-Bj1fry_K.mjs.map +1 -0
  63. package/dist/IndexTableLayout.d.mts +11 -3
  64. package/dist/InlineCombobox.d.mts +1 -1
  65. package/dist/InlineInput.d.mts +1 -1
  66. package/dist/{Input-RHXujO9u.mjs → Input-DcbzPaax.mjs} +2 -2
  67. package/dist/{Input-RHXujO9u.mjs.map → Input-DcbzPaax.mjs.map} +1 -1
  68. package/dist/IntegerValueControl.d.mts +3 -2
  69. package/dist/{Link-D_kCyLYX.mjs → Link-B29ZMN6m.mjs} +3 -3
  70. package/dist/Link-B29ZMN6m.mjs.map +1 -0
  71. package/dist/{ListBox-BZp6exb8.mjs → ListBox-4rTgr3IJ.mjs} +6 -6
  72. package/dist/{ListBox-BZp6exb8.mjs.map → ListBox-4rTgr3IJ.mjs.map} +1 -1
  73. package/dist/{ListBox-DpFcM-dM.d.mts → ListBox-ZDaitaXR.d.mts} +2 -2
  74. package/dist/ListBox.d.mts +1 -1
  75. package/dist/{ListBoxField-DL6Zk8TU.d.mts → ListBoxField-CGvVWKyL.d.mts} +4 -4
  76. package/dist/ListBoxField.d.mts +1 -1
  77. package/dist/{LoadingShimmer-oPIv2ESr.mjs → LoadingShimmer-BVVdBeN-.mjs} +18 -20
  78. package/dist/LoadingShimmer-BVVdBeN-.mjs.map +1 -0
  79. package/dist/{LogicRow-BakOUtzx.d.mts → LogicRow-Bzp5o1sL.d.mts} +2 -2
  80. package/dist/LogicRow.d.mts +1 -1
  81. package/dist/{Menu-D6OrKCTC.d.mts → Menu-DviYNrFd.d.mts} +2 -2
  82. package/dist/Menu.d.mts +1 -1
  83. package/dist/{Modal-De5_bPJ_.mjs → Modal-CiPFqr0L.mjs} +52 -23
  84. package/dist/{Modal-De5_bPJ_.mjs.map → Modal-CiPFqr0L.mjs.map} +1 -1
  85. package/dist/{PageHeader-7_Hf6rHl.mjs → PageHeader-6KvtGED-.mjs} +2 -2
  86. package/dist/{PageHeader-7_Hf6rHl.mjs.map → PageHeader-6KvtGED-.mjs.map} +1 -1
  87. package/dist/{PageLayout-DjtGrvJa.mjs → PageLayout-CPiVnS_r.mjs} +3 -1
  88. package/dist/PageLayout-CPiVnS_r.mjs.map +1 -0
  89. package/dist/{Pagination-DMH2IaV0.mjs → Pagination-CqFvnlXc.mjs} +4 -4
  90. package/dist/{Pagination-DMH2IaV0.mjs.map → Pagination-CqFvnlXc.mjs.map} +1 -1
  91. package/dist/{Pii-24D_nSRQ.mjs → Pii-jSYND7Cn.mjs} +2 -2
  92. package/dist/{Pii-24D_nSRQ.mjs.map → Pii-jSYND7Cn.mjs.map} +1 -1
  93. package/dist/{PillShell-B7Bm-dsE.d.mts → PillShell-Bkyu5FXB.d.mts} +2 -2
  94. package/dist/PillShell.d.mts +1 -1
  95. package/dist/{Popover-DordjYNM.mjs → Popover-CVX-dfYb.mjs} +48 -18
  96. package/dist/Popover-CVX-dfYb.mjs.map +1 -0
  97. package/dist/{Radio-BlEtetrr.mjs → Radio-B1H_S-Qj.mjs} +2 -2
  98. package/dist/Radio-B1H_S-Qj.mjs.map +1 -0
  99. package/dist/{RadioGroup-CMrXmmn4.mjs → RadioGroup-7hdcVhsp.mjs} +2 -2
  100. package/dist/{RadioGroup-CMrXmmn4.mjs.map → RadioGroup-7hdcVhsp.mjs.map} +1 -1
  101. package/dist/RuleEditorFields.d.mts +2 -2
  102. package/dist/RulesPill.d.mts +1 -1
  103. package/dist/{SegmentedControl-D_DA-MU1.mjs → SegmentedControl-BNOJ1FYQ.mjs} +5 -2
  104. package/dist/SegmentedControl-BNOJ1FYQ.mjs.map +1 -0
  105. package/dist/{Select-DOlw_LPR.mjs → Select-DbWEgH5c.mjs} +5 -3
  106. package/dist/Select-DbWEgH5c.mjs.map +1 -0
  107. package/dist/{Select-CR9TjFfo.d.mts → Select-DsVeAyZy.d.mts} +2 -2
  108. package/dist/Select.d.mts +1 -1
  109. package/dist/SmartTextInputField.d.mts +2 -2
  110. package/dist/{Spinner-CXb-KUs1.mjs → Spinner-k9ZiOdTr.mjs} +1 -1
  111. package/dist/{Spinner-CXb-KUs1.mjs.map → Spinner-k9ZiOdTr.mjs.map} +1 -1
  112. package/dist/{Sticker-C1_6I08u.mjs → Sticker-4VdGEFAu.mjs} +2 -2
  113. package/dist/{Sticker-C1_6I08u.mjs.map → Sticker-4VdGEFAu.mjs.map} +1 -1
  114. package/dist/StringValueControl.d.mts +2 -1
  115. package/dist/{TabBar-BCFO38E0.mjs → TabBar-d4sdknti.mjs} +5 -5
  116. package/dist/TabBar-d4sdknti.mjs.map +1 -0
  117. package/dist/{Table-DPi4Dt5H.mjs → Table-9mNn8Q-d.mjs} +14 -6
  118. package/dist/Table-9mNn8Q-d.mjs.map +1 -0
  119. package/dist/{TableBox-DNQsgQ8x.mjs → TableBox-D9NA-s9l.mjs} +16 -12
  120. package/dist/TableBox-D9NA-s9l.mjs.map +1 -0
  121. package/dist/TableBox.d.mts +1 -1
  122. package/dist/{TableBoxCell-CsRt_5gP.d.mts → TableBoxCell-CQOL30et.d.mts} +4 -4
  123. package/dist/TableBoxCell.d.mts +1 -1
  124. package/dist/{TableBoxField-Db0Vjo6Z.d.mts → TableBoxField-z0GIFeQw.d.mts} +5 -5
  125. package/dist/TableBoxField.d.mts +1 -1
  126. package/dist/{TableBoxRow-exMlZyc4.d.mts → TableBoxRow-tb9-KMr9.d.mts} +2 -2
  127. package/dist/TableBoxRow.d.mts +1 -1
  128. package/dist/{TableBoxRowActions-UO9YN34k.d.mts → TableBoxRowActions-BZwulsFP.d.mts} +2 -2
  129. package/dist/TableBoxRowActions.d.mts +1 -1
  130. package/dist/{TableControls-BrP_BqnF.mjs → TableControls-BXykbUBf.mjs} +126 -40
  131. package/dist/TableControls-BXykbUBf.mjs.map +1 -0
  132. package/dist/{TableControls-Clo_0Mty.d.mts → TableControls-DE6eHq8h.d.mts} +4 -4
  133. package/dist/TableControls.d.mts +1 -1
  134. package/dist/{TableControlsContext-BNd6z9mD.d.mts → TableControlsContext-C2_2EuMh.d.mts} +2 -2
  135. package/dist/TableControlsContext.d.mts +1 -1
  136. package/dist/{TableViewConfigurationDropdown-Cp7ausV_.d.mts → TableViewConfigurationDropdown-DE9HFXYY.d.mts} +2 -2
  137. package/dist/TableViewConfigurationDropdown.d.mts +1 -1
  138. package/dist/{TechnicalSticker-Cq5jzYKQ.mjs → TechnicalSticker-DtV7Gawf.mjs} +5 -3
  139. package/dist/TechnicalSticker-DtV7Gawf.mjs.map +1 -0
  140. package/dist/{TextArea-Dro-HH8O.mjs → TextArea-CQ1YNi2b.mjs} +4 -5
  141. package/dist/TextArea-CQ1YNi2b.mjs.map +1 -0
  142. package/dist/{Toggle-D9MzTIZs.mjs → Toggle-CzHoIR-n.mjs} +8 -4
  143. package/dist/Toggle-CzHoIR-n.mjs.map +1 -0
  144. package/dist/{Tooltip-YViXzMdm.mjs → Tooltip-CVBxc1yf.mjs} +17 -4
  145. package/dist/Tooltip-CVBxc1yf.mjs.map +1 -0
  146. package/dist/chartColors.d.mts +92 -0
  147. package/dist/chartFrameLayout.d.mts +46 -0
  148. package/dist/{clientFilterUtils-CGHYF5NE.d.mts → clientFilterUtils-2TBUC31K.d.mts} +2 -2
  149. package/dist/clientFilterUtils.d.mts +1 -1
  150. package/dist/components/Accordion/index.mjs +22 -13
  151. package/dist/components/Accordion/index.mjs.map +1 -1
  152. package/dist/components/Attribute/index.mjs +6 -4
  153. package/dist/components/Attribute/index.mjs.map +1 -1
  154. package/dist/components/Badge/index.mjs +1 -1
  155. package/dist/components/Banner/index.mjs +1 -1
  156. package/dist/components/BottomPanel/index.mjs +7 -5
  157. package/dist/components/BottomPanel/index.mjs.map +1 -1
  158. package/dist/components/Breadcrumbs/index.mjs +1 -1
  159. package/dist/components/Button/index.mjs +1 -1
  160. package/dist/components/ButtonGroup/index.mjs +1 -1
  161. package/dist/components/CardV2/index.mjs +1 -1
  162. package/dist/components/Chart/index.d.mts +9 -0
  163. package/dist/components/Chart/index.mjs +680 -0
  164. package/dist/components/Chart/index.mjs.map +1 -0
  165. package/dist/components/Checkbox/index.mjs +1 -1
  166. package/dist/components/CodeHighlight/index.mjs +1 -1
  167. package/dist/components/Combobox/index.d.mts +5 -3
  168. package/dist/components/Combobox/index.mjs +1 -1
  169. package/dist/components/DataTable/TableControls/index.d.mts +19 -19
  170. package/dist/components/DataTable/TableControls/index.mjs +2 -2
  171. package/dist/components/DataTable/index.d.mts +5 -5
  172. package/dist/components/DataTable/index.mjs +1 -1
  173. package/dist/components/DataTable/types.d.mts +1 -1
  174. package/dist/components/DatePicker/index.mjs +1 -1
  175. package/dist/components/DropdownButton/index.mjs +1 -1
  176. package/dist/components/DropdownMenu/index.d.mts +1 -1
  177. package/dist/components/DropdownMenu/index.mjs +1 -1
  178. package/dist/components/FloatingPanel/index.mjs +16 -14
  179. package/dist/components/FloatingPanel/index.mjs.map +1 -1
  180. package/dist/components/FloatingToolbar/index.mjs +1 -1
  181. package/dist/components/FormControl/index.mjs +1 -1
  182. package/dist/components/FormField/index.d.mts +4 -4
  183. package/dist/components/FormField/index.mjs +1 -1
  184. package/dist/components/HoverCopyableField/index.mjs +1 -1
  185. package/dist/components/ImageTile/index.mjs +7 -7
  186. package/dist/components/ImageTile/index.mjs.map +1 -1
  187. package/dist/components/Input/index.mjs +1 -1
  188. package/dist/components/Link/index.mjs +1 -1
  189. package/dist/components/ListBox/index.d.mts +3 -3
  190. package/dist/components/ListBox/index.mjs +1 -1
  191. package/dist/components/LoadingShimmer/index.mjs +1 -1
  192. package/dist/components/MaskedInput/index.mjs +1 -1
  193. package/dist/components/Menu/index.d.mts +1 -1
  194. package/dist/components/Modal/index.mjs +1 -1
  195. package/dist/components/PageHeader/index.mjs +1 -1
  196. package/dist/components/Pagination/index.mjs +1 -1
  197. package/dist/components/Pii/index.mjs +1 -1
  198. package/dist/components/Popover/index.mjs +1 -1
  199. package/dist/components/ProgressBar/index.mjs +20 -3
  200. package/dist/components/ProgressBar/index.mjs.map +1 -1
  201. package/dist/components/Radio/index.mjs +1 -1
  202. package/dist/components/RadioGroup/index.mjs +1 -1
  203. package/dist/components/RichTextEditor/index.mjs +5 -5
  204. package/dist/components/RightPanel/index.mjs +28 -13
  205. package/dist/components/RightPanel/index.mjs.map +1 -1
  206. package/dist/components/SegmentedControl/index.mjs +1 -1
  207. package/dist/components/Select/index.d.mts +1 -1
  208. package/dist/components/Select/index.mjs +1 -1
  209. package/dist/components/SelectionCard/index.mjs +2 -2
  210. package/dist/components/Slider/index.mjs +3 -2
  211. package/dist/components/Slider/index.mjs.map +1 -1
  212. package/dist/components/SmartTextInput/index.mjs +9 -78
  213. package/dist/components/SmartTextInput/index.mjs.map +1 -1
  214. package/dist/{safe-parse.d.mts → components/SmartTextInput/parser/safe-parse.d.mts} +1 -1
  215. package/dist/components/SmartTextInput/parser/safe-parse.mjs +30 -0
  216. package/dist/components/SmartTextInput/parser/safe-parse.mjs.map +1 -0
  217. package/dist/{tree.d.mts → components/SmartTextInput/parser/tree.d.mts} +1 -1
  218. package/dist/components/SmartTextInput/parser/tree.mjs +42 -0
  219. package/dist/components/SmartTextInput/parser/tree.mjs.map +1 -0
  220. package/dist/components/Spinner/index.mjs +1 -1
  221. package/dist/components/Sticker/index.mjs +1 -1
  222. package/dist/components/SwatchPicker/index.mjs +2 -1
  223. package/dist/components/SwatchPicker/index.mjs.map +1 -1
  224. package/dist/components/TabBar/index.mjs +1 -1
  225. package/dist/components/Table/index.mjs +1 -1
  226. package/dist/components/TableBox/index.d.mts +1 -1
  227. package/dist/components/TableBox/index.mjs +1 -1
  228. package/dist/components/TechnicalSticker/index.mjs +1 -1
  229. package/dist/components/TextArea/index.mjs +1 -1
  230. package/dist/components/Tile/index.mjs +2 -2
  231. package/dist/components/Toast/index.mjs +16 -10
  232. package/dist/components/Toast/index.mjs.map +1 -1
  233. package/dist/components/Toggle/index.mjs +1 -1
  234. package/dist/components/Tooltip/index.mjs +1 -1
  235. package/dist/components/VersionHistory/index.mjs +5 -5
  236. package/dist/compound-expression.d.mts +1 -1
  237. package/dist/{date-range-rule-value-ASr06ClE.d.mts → date-range-rule-value-DyLlMtjr.d.mts} +2 -2
  238. package/dist/date-range-rule-value.d.mts +1 -1
  239. package/dist/display.d.mts +1 -1
  240. package/dist/duration-token.d.mts +11 -0
  241. package/dist/exit-motion.d.mts +7 -0
  242. package/dist/fieldPickerOptions.d.mts +2 -2
  243. package/dist/{filter-size-context-CmFyIPCm.d.mts → filter-size-context-DVnjmuhk.d.mts} +2 -2
  244. package/dist/filter-size-context.d.mts +1 -1
  245. package/dist/{filters-DTBc0mE7.d.mts → filters-DW7pqWv3.d.mts} +2 -2
  246. package/dist/filters.d.mts +1 -1
  247. package/dist/{helpers-CBJ2AqGZ.d.mts → helpers-BTD2kXLs.d.mts} +2 -2
  248. package/dist/helpers.d.mts +1 -1
  249. package/dist/{index-OkdnW-u5.d.mts → index-B4tE0RxY.d.mts} +3 -3
  250. package/dist/{index-kIon1vPp.d.mts → index-DTM_t7OG.d.mts} +2 -2
  251. package/dist/index4.d.mts +3 -3
  252. package/dist/index5.d.mts +1 -1
  253. package/dist/index6.d.mts +14 -14
  254. package/dist/{inputFields-DpHeZiFX.d.mts → inputFields-DnBb3NhK.d.mts} +4 -4
  255. package/dist/inputFields.d.mts +1 -1
  256. package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
  257. package/dist/lib/useCloseFocus.d.mts +45 -0
  258. package/dist/lib/useCloseFocus.mjs +123 -0
  259. package/dist/lib/useCloseFocus.mjs.map +1 -0
  260. package/dist/lib/useModalInsetRight.d.mts +4 -3
  261. package/dist/lib/useModalInsetRight.mjs +7 -5
  262. package/dist/lib/useModalInsetRight.mjs.map +1 -1
  263. package/dist/lint/THIRD_PARTY_NOTICES.md +30 -0
  264. package/dist/lint/index.mjs +696 -11
  265. package/dist/lint/index.mjs.map +1 -1
  266. package/dist/lint/recommended.json +7 -1
  267. package/dist/mixins/hoverable.mjs +1 -1
  268. package/dist/mixins/hoverable.mjs.map +1 -1
  269. package/dist/mixins/input.mjs +1 -0
  270. package/dist/mixins/input.mjs.map +1 -1
  271. package/dist/mixins/menuItem.mjs +2 -0
  272. package/dist/mixins/menuItem.mjs.map +1 -1
  273. package/dist/mixins/motion.d.mts +28 -0
  274. package/dist/mixins/motion.mjs +66 -0
  275. package/dist/mixins/motion.mjs.map +1 -0
  276. package/dist/motion-origin.d.mts +7 -0
  277. package/dist/motion.d.mts +63 -0
  278. package/dist/no-layout-motion.d.mts +7 -0
  279. package/dist/no-transition-all.d.mts +7 -0
  280. package/dist/{operators-BHxKZcpD.d.mts → operators-B8_k3r69.d.mts} +10 -3
  281. package/dist/operators.d.mts +2 -2
  282. package/dist/overlay-motion.d.mts +7 -0
  283. package/dist/patterns/CardGrouping/index.mjs +6 -6
  284. package/dist/patterns/CardGrouping/index.mjs.map +1 -1
  285. package/dist/patterns/IndexTableLayout/index.mjs +23 -16
  286. package/dist/patterns/IndexTableLayout/index.mjs.map +1 -1
  287. package/dist/patterns/LayoutLoadingShimmer/index.mjs +4 -4
  288. package/dist/patterns/LayoutLoadingSpinner/index.mjs +3 -1
  289. package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -1
  290. package/dist/patterns/PageLayout/index.mjs +1 -1
  291. package/dist/patterns/WizardModal/index.mjs +2 -2
  292. package/dist/relative-date-label.d.mts +1 -1
  293. package/dist/{types-DLnCkvTt.d.mts → types-BJqmRXFV.d.mts} +15 -1
  294. package/dist/{types-CqcbWyUY.d.mts → types-BOsCi-kZ.d.mts} +8 -2
  295. package/dist/{types-BiqzeNsa.d.mts → types-Dws2XDz2.d.mts} +2 -2
  296. package/dist/{types-BEdERA4v.d.mts → types-NO2GRlM-.d.mts} +2 -2
  297. package/dist/types4.d.mts +1 -1
  298. package/dist/types5.d.mts +1 -1
  299. package/dist/types6.d.mts +1 -1
  300. package/dist/{url-state-CXUuK3_r.d.mts → url-state-CXPmXzIZ.d.mts} +2 -2
  301. package/dist/url-state.d.mts +1 -1
  302. package/dist/useChartColors.d.mts +30 -0
  303. package/dist/useChartSeriesVisibility.d.mts +22 -0
  304. package/dist/useChartStyles.d.mts +108 -0
  305. package/dist/useColumnConfiguration.d.mts +2 -2
  306. package/dist/useComboboxFooterAction.d.mts +1 -1
  307. package/dist/{useFilterStateV2-DBpbxAEC.d.mts → useFilterStateV2-DiTS9DTg.d.mts} +3 -3
  308. package/dist/useFilterStateV2.d.mts +1 -1
  309. package/dist/{useTableColumns-Xd14vx_h.d.mts → useTableColumns-tITjHasE.d.mts} +2 -2
  310. package/dist/useTableColumns.d.mts +1 -1
  311. package/dist/useTruncation.d.mts +1 -1
  312. package/dist/useValueControlError.d.mts +26 -0
  313. package/dist/utils.d.mts +1 -1
  314. package/dist/{validation-Tgg3AhuP.d.mts → validation-BDQdQ1cY.d.mts} +3 -3
  315. package/dist/validation.d.mts +1 -1
  316. package/dist/{value-control-resolver-XQbGCdsP.d.mts → value-control-resolver-BFJZEWDn.d.mts} +9 -3
  317. package/dist/value-control-resolver.d.mts +1 -1
  318. package/dist/value-labels.d.mts +12 -0
  319. package/dist/variables/keyframes.d.mts +2 -1
  320. package/dist/variables/keyframes.mjs +9 -1
  321. package/dist/variables/keyframes.mjs.map +1 -1
  322. package/dist/variables/transitions.d.mts +31 -1
  323. package/dist/variables/transitions.mjs +50 -1
  324. package/dist/variables/transitions.mjs.map +1 -1
  325. package/llms.txt +2 -1
  326. package/package.json +20 -4
  327. package/skills/new-screen/SKILL.md +33 -0
  328. package/skills/ui-authoring/COMPONENTS.md +19 -1
  329. package/skills/ui-authoring/PATTERNS.md +57 -36
  330. package/skills/ui-authoring/STANDARD.md +78 -4
  331. package/skills/ui-authoring/TOKENS.md +27 -24
  332. package/dist/Breadcrumbs-CMf3Uvow.mjs.map +0 -1
  333. package/dist/CardV2-CrV6eEQb.mjs.map +0 -1
  334. package/dist/Checkbox-Dr4LMKHV.mjs.map +0 -1
  335. package/dist/Combobox-CIKqTYZt.d.mts +0 -11
  336. package/dist/Combobox-Gb_j1dg6.mjs.map +0 -1
  337. package/dist/DataTable-CIZJ1vO8.mjs.map +0 -1
  338. package/dist/DropdownMenu-c8XK2Lr4.mjs.map +0 -1
  339. package/dist/FloatingToolbar-DLRaE0o7.mjs.map +0 -1
  340. package/dist/HoverCopyableField-XHC_n9tp.mjs.map +0 -1
  341. package/dist/IconButton-DxHB2g80.mjs.map +0 -1
  342. package/dist/Link-D_kCyLYX.mjs.map +0 -1
  343. package/dist/LoadingShimmer-oPIv2ESr.mjs.map +0 -1
  344. package/dist/PageLayout-DjtGrvJa.mjs.map +0 -1
  345. package/dist/Popover-DordjYNM.mjs.map +0 -1
  346. package/dist/Radio-BlEtetrr.mjs.map +0 -1
  347. package/dist/SegmentedControl-D_DA-MU1.mjs.map +0 -1
  348. package/dist/Select-DOlw_LPR.mjs.map +0 -1
  349. package/dist/TabBar-BCFO38E0.mjs.map +0 -1
  350. package/dist/Table-DPi4Dt5H.mjs.map +0 -1
  351. package/dist/TableBox-DNQsgQ8x.mjs.map +0 -1
  352. package/dist/TableControls-BrP_BqnF.mjs.map +0 -1
  353. package/dist/TechnicalSticker-Cq5jzYKQ.mjs.map +0 -1
  354. package/dist/TextArea-Dro-HH8O.mjs.map +0 -1
  355. package/dist/Toggle-D9MzTIZs.mjs.map +0 -1
  356. package/dist/Tooltip-YViXzMdm.mjs.map +0 -1
@@ -1,20 +1,21 @@
1
1
  import { a as styled, r as css } from "./styledComponentsInterop-Cs5CCPRy.mjs";
2
2
  import { semanticColor } from "./lib/semanticColor.mjs";
3
3
  import { i as Paragraph } from "./Text-D0vEReED.mjs";
4
+ import { a as Tooltip } from "./Tooltip-CVBxc1yf.mjs";
4
5
  import { isDisabled, isHovered, isNotDisabled } from "./lib/pseudoClass.mjs";
5
6
  import { useOutsideClick } from "./lib/useOutsideClick.mjs";
6
7
  import { Z_INDICES } from "./lib/zindex.mjs";
7
8
  import { focusStyle } from "./mixins/focus.mjs";
8
9
  import { semanticScrollbar } from "./mixins/scrollbar.mjs";
9
10
  import { n as Stack } from "./Stack-Bzom2BTR.mjs";
10
- import { n as Button } from "./IconButton-DxHB2g80.mjs";
11
- import { n as Sticker } from "./Sticker-C1_6I08u.mjs";
11
+ import { n as Button } from "./IconButton-Bj1fry_K.mjs";
12
+ import { n as Sticker } from "./Sticker-4VdGEFAu.mjs";
12
13
  import { n as useFormField } from "./useFormField-pOVkb5BK.mjs";
13
- import { r as InputGroup } from "./Input-RHXujO9u.mjs";
14
+ import { r as InputGroup } from "./Input-DcbzPaax.mjs";
14
15
  import Input_default from "./components/Input/index.mjs";
15
16
  import { c as MenuList, n as IconContainer, o as MenuHeading, s as MenuItem, t as FloatingCard } from "./Menu-BVn1jh46.mjs";
16
- import { t as Checkbox } from "./Checkbox-Dr4LMKHV.mjs";
17
- import { t as Spinner } from "./Spinner-CXb-KUs1.mjs";
17
+ import { t as Checkbox } from "./Checkbox-BAh-wF_F.mjs";
18
+ import { t as Spinner } from "./Spinner-k9ZiOdTr.mjs";
18
19
  import { Fragment, cloneElement, forwardRef, isValidElement, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
19
20
  import { Color, Spacing, Typography } from "@persona/design-tokens";
20
21
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -28,6 +29,35 @@ function isOptionGroup(item) {
28
29
  return "options" in item && Array.isArray(item.options);
29
30
  }
30
31
  /**
32
+ * Moves disabled options after the enabled ones, keeping each run in its original order. A section
33
+ * header (inline group) is a boundary, so an option never leaves its section. Nested-group rows
34
+ * count as enabled. Recurses into every group.
35
+ */
36
+ function sortDisabledOptionsLast(items, isDisabled) {
37
+ const sorted = [];
38
+ let enabled = [];
39
+ let disabled = [];
40
+ const flush = () => {
41
+ sorted.push(...enabled, ...disabled);
42
+ enabled = [];
43
+ disabled = [];
44
+ };
45
+ for (const item of items) if (isOptionGroup(item)) {
46
+ const group = {
47
+ ...item,
48
+ options: sortDisabledOptionsLast(item.options, isDisabled)
49
+ };
50
+ if (item.nested) enabled.push(group);
51
+ else {
52
+ flush();
53
+ sorted.push(group);
54
+ }
55
+ } else if (isDisabled(item)) disabled.push(item);
56
+ else enabled.push(item);
57
+ flush();
58
+ return sorted;
59
+ }
60
+ /**
31
61
  * Flatten the visible leaves at the current navigation level. Inline
32
62
  * (non-nested) groups are walked through transparently — their leaves
33
63
  * surface at this level. Nested groups are skipped along with their
@@ -86,9 +116,7 @@ function findNestedGroupByLabel(items, label) {
86
116
  * nested groups).
87
117
  *
88
118
  * - Empty `path` returns the original top-level items unchanged.
89
- * - If any step doesn't resolve to a known nested group (e.g. stale
90
- * state after the registry changes), returns an empty list so the
91
- * consumer can fall back to the root view.
119
+ * - If a step no longer resolves to a nested group, returns an empty list.
92
120
  */
93
121
  function getOptionsAtPath(options, path) {
94
122
  let scope = options;
@@ -142,29 +170,107 @@ function getNavigableItemsAtLevel(items) {
142
170
  });
143
171
  return out;
144
172
  }
145
- /**
146
- * A hook which provides the caller with dynamically filtered options
147
- *
148
- * @param options - The options to filter (can be flat or grouped)
149
- * @param inputValue - The input value to filter the options by
150
- * @returns The subset of the options that match the input value according to the fuse.js library
151
- */
152
- function useFilteredOptions(options, inputValue) {
153
- return useMemo(() => {
154
- const flatOptions = flattenOptions(options);
155
- const fuse = new Fuse(flatOptions, {
156
- shouldSort: false,
157
- threshold: 0,
158
- ignoreLocation: true,
159
- minMatchCharLength: 1,
160
- keys: [
161
- "label",
162
- "description",
163
- "keywords"
164
- ]
173
+ function filterComboboxOptions(options, inputValue) {
174
+ const flatOptions = flattenOptions(options);
175
+ const fuse = new Fuse(flatOptions, {
176
+ shouldSort: false,
177
+ threshold: 0,
178
+ ignoreLocation: true,
179
+ minMatchCharLength: 1,
180
+ keys: [
181
+ "label",
182
+ "description",
183
+ "keywords"
184
+ ]
185
+ });
186
+ return inputValue === "" ? flatOptions : Array.from(new Set(fuse.search(inputValue).map(({ item }) => item)).values());
187
+ }
188
+ /** All server-specific behavior lives here; client event/filtering behavior passes through. */
189
+ function useComboboxServerMode(props, values, clientOptions = props.options, selectAll = false) {
190
+ const server = props.filterMode === "server";
191
+ const options = useMemo(() => server ? flattenLeafOptions(props.options).map(({ option }) => option) : clientOptions, [
192
+ server,
193
+ props.options,
194
+ clientOptions
195
+ ]);
196
+ const selectedItems = useMemo(() => {
197
+ if (!server) return flattenLeafOptions(options).map(({ option }) => option).filter((option) => values.includes(option.value));
198
+ const byValue = /* @__PURE__ */ new Map();
199
+ if (props.filterMode === "server") props.selectedOptions?.forEach((option) => byValue.set(option.value, option));
200
+ flattenLeafOptions(options).forEach(({ option }) => byValue.set(option.value, option));
201
+ return values.flatMap((value) => {
202
+ const option = byValue.get(value) ?? (server ? {
203
+ value,
204
+ label: String(value)
205
+ } : void 0);
206
+ return option ? [option] : [];
165
207
  });
166
- return inputValue === "" ? flatOptions : Array.from(new Set(fuse.search(inputValue).map(({ item }) => item)).values());
167
- }, [options, inputValue]);
208
+ }, [
209
+ options,
210
+ server,
211
+ props.filterMode,
212
+ props.selectedOptions,
213
+ values
214
+ ]);
215
+ const itemToKey = useCallback((item) => item?.value, []);
216
+ const filterOptions = useCallback((source, inputValue) => server ? flattenOptions(source) : filterComboboxOptions(source, inputValue), [server]);
217
+ const scrollRef = useRef(null);
218
+ const scrollState = useRef({
219
+ open: false,
220
+ rowHeight: 32
221
+ });
222
+ scrollState.current.rowHeight = props.size === "sm" ? 24 : 32;
223
+ scrollState.current.callback = props.filterMode === "server" ? props.onScrollEnd : void 0;
224
+ const checkScrollEnd = useCallback((shortOnly = false) => {
225
+ const list = scrollRef.current;
226
+ if (!scrollState.current.open || !list || list.clientHeight <= 0) return;
227
+ if (shortOnly ? list.scrollHeight <= list.clientHeight : list.scrollHeight - list.scrollTop - list.clientHeight <= scrollState.current.rowHeight) scrollState.current.callback?.();
228
+ }, []);
229
+ const onMenuOpenChange = useCallback((open) => {
230
+ if (scrollState.current.open === open) return;
231
+ scrollState.current.open = open;
232
+ if (open) checkScrollEnd(true);
233
+ }, [checkScrollEnd]);
234
+ useEffect(() => checkScrollEnd(true), [checkScrollEnd, options.length]);
235
+ const getQueryInputProps = (inputProps, isOpen = true, onQueryEdit) => {
236
+ if (props.filterMode !== "server") return inputProps;
237
+ return {
238
+ ...inputProps,
239
+ value: isOpen ? props.query : inputProps.value,
240
+ onKeyDown: (event) => {
241
+ if (!isOpen && !event.nativeEvent.isComposing && (event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey || event.key === "Backspace" || event.key === "Delete" || event.key === "Process" || event.key === "Unidentified" || event.key === "Dead")) event.currentTarget.select();
242
+ inputProps.onKeyDown?.(event);
243
+ },
244
+ onPaste: (event) => {
245
+ if (!isOpen) event.currentTarget.select();
246
+ inputProps.onPaste?.(event);
247
+ },
248
+ onChange: (event) => {
249
+ const nextInput = event.currentTarget.value;
250
+ inputProps.onChange?.(event);
251
+ onQueryEdit?.();
252
+ props.onQueryChange(nextInput);
253
+ }
254
+ };
255
+ };
256
+ return {
257
+ options,
258
+ selectedItems,
259
+ scrollRef,
260
+ onMenuOpenChange,
261
+ onScroll: server ? () => checkScrollEnd() : void 0,
262
+ loadingMore: props.filterMode === "server" && props.isLoadingMore ? /* @__PURE__ */ jsx(LoadingMoreRow, { children: /* @__PURE__ */ jsx(Spinner, {
263
+ size: "sm",
264
+ srText: "Loading more options"
265
+ }) }) : null,
266
+ itemToKey,
267
+ filterOptions,
268
+ getQueryInputProps,
269
+ query: props.filterMode === "server" ? props.query : void 0,
270
+ onInputChange: server ? void 0 : props.onInputChange,
271
+ selectAll: !server && selectAll,
272
+ preserveOptionOrder: server
273
+ };
168
274
  }
169
275
  function buildVirtualRows(options, filteredOptions, indexRealToIndexVirtual) {
170
276
  const rows = [];
@@ -392,6 +498,10 @@ const LoadingContainer = styled.div`
392
498
  min-height: 136px;
393
499
  padding: ${Spacing[3]};
394
500
  `;
501
+ const LoadingMoreRow = styled(LoadingContainer)`
502
+ min-height: 0;
503
+ padding: ${Spacing[2]};
504
+ `;
395
505
  const FooterActionContainer = styled.div`
396
506
  flex-shrink: 0;
397
507
  padding-top: ${Spacing[1]};
@@ -768,8 +878,14 @@ const CheckboxLabel = styled.span`
768
878
  position: relative;
769
879
  bottom: -1px;
770
880
  `;
771
- function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOptionsLoading, values = [], onValuesChange, searchPlaceholder = "Search...", onInputChange, placeholder = "Select an option...", emptyStateMessage = "No options found", disabled = false, hasWarning, hasError, required, id, labelId, "aria-label": ariaLabel, onOpenChange, truncate = false, selectAll = false, stableOptionOrder = false, portal = false, portalContainerRef: externalPortalContainerRef, trigger, embedded = false, virtualize = false, footerAction, ...props }, ref) {
772
- const options = useMemo(() => containsNestedGroup(rawOptions) ? inlineNestedGroups(rawOptions) : rawOptions, [rawOptions]);
881
+ function ComboboxMultiSelectComponent(componentProps, ref) {
882
+ const { size = "md", options: rawOptions, isOptionsLoading, filterMode: _filterMode, selectedOptions: _selectedOptions, query: _query, onQueryChange: _onQueryChange, onScrollEnd: _onScrollEnd, isLoadingMore: _isLoadingMore, values = [], onValuesChange, searchPlaceholder = "Search...", onInputChange: _onInputChange, placeholder = "Select an option...", emptyStateMessage = "No options found", disabled = false, hasWarning, hasError, required, id, labelId, "aria-label": ariaLabel, onOpenChange, truncate = false, selectAll: requestedSelectAll = false, stableOptionOrder = false, portal = false, portalContainerRef: externalPortalContainerRef, trigger, embedded = false, virtualize = false, footerAction, ...props } = {
883
+ onScrollEnd: void 0,
884
+ isLoadingMore: void 0,
885
+ ...componentProps
886
+ };
887
+ const mode = useComboboxServerMode(componentProps, values, useMemo(() => containsNestedGroup(rawOptions) ? inlineNestedGroups(rawOptions) : rawOptions, [rawOptions]), requestedSelectAll);
888
+ const { options, selectedItems, selectAll } = mode;
773
889
  const field = useFormField({
774
890
  hasWarning,
775
891
  hasError,
@@ -782,7 +898,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
782
898
  const comboboxInputRef = useRef(null);
783
899
  const caretButtonRef = useRef(null);
784
900
  const comboboxContainerRef = useRef(null);
785
- const scrollableListRef = useRef(null);
901
+ const scrollableListRef = mode.scrollRef;
786
902
  const selectedItemsContainerRef = useRef(null);
787
903
  const measurementStickerRefs = useRef([]);
788
904
  const measurementTruncatorRef = useRef(null);
@@ -790,8 +906,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
790
906
  setEmbeddedOpen(embedded);
791
907
  }, [embedded]);
792
908
  const portalContainerRef = externalPortalContainerRef || comboboxContainerRef;
793
- const flatOptions = useMemo(() => flattenOptions(options), [options]);
794
- const selectedItems = flatOptions.filter((option) => values.includes(option.value));
909
+ const preserveOptionOrder = stableOptionOrder || mode.preserveOptionOrder;
795
910
  useEffect(() => {
796
911
  measurementStickerRefs.current = measurementStickerRefs.current.slice(0, selectedItems.length);
797
912
  }, [selectedItems.length]);
@@ -802,10 +917,14 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
802
917
  if (searchInputRef.current) searchInputRef.current.focus();
803
918
  }
804
919
  }), []);
805
- const filteredOptions = useFilteredOptions(options, inputValue);
920
+ const filteredOptions = useMemo(() => mode.filterOptions(options, inputValue), [
921
+ mode.filterOptions,
922
+ options,
923
+ inputValue
924
+ ]);
806
925
  const isGrouped = useMemo(() => options.some(isOptionGroup), [options]);
807
926
  const optionsWithSelectedFirstInGroups = useMemo(() => {
808
- if (!isGrouped || values.length === 0 || stableOptionOrder) return options;
927
+ if (!isGrouped || values.length === 0 || preserveOptionOrder) return options;
809
928
  return options.map((item) => {
810
929
  if (isOptionGroup(item)) {
811
930
  const groupLeaves = flattenOptions(item.options);
@@ -824,7 +943,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
824
943
  options,
825
944
  isGrouped,
826
945
  values,
827
- stableOptionOrder
946
+ preserveOptionOrder
828
947
  ]);
829
948
  const navigableItems = useMemo(() => {
830
949
  const items = [];
@@ -838,7 +957,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
838
957
  } else if (filteredOptions.some((f) => f.value === item.value)) items.push(item);
839
958
  return items;
840
959
  }
841
- const orderedFiltered = !isGrouped && values.length > 0 && !stableOptionOrder ? filteredOptions.toSorted((a, b) => {
960
+ const orderedFiltered = !isGrouped && values.length > 0 && !preserveOptionOrder ? filteredOptions.toSorted((a, b) => {
842
961
  const aSelected = values.includes(a.value);
843
962
  if (aSelected === values.includes(b.value)) return 0;
844
963
  return aSelected ? -1 : 1;
@@ -855,7 +974,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
855
974
  isGrouped,
856
975
  values,
857
976
  optionsWithSelectedFirstInGroups,
858
- stableOptionOrder
977
+ preserveOptionOrder
859
978
  ]);
860
979
  const optionsToRender = useMemo(() => {
861
980
  if (!isGrouped && values.length > 0) return navigableItems;
@@ -895,6 +1014,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
895
1014
  const getOptionId = useCallback((index) => `${field.inputId}-option-${index}`, [field.inputId]);
896
1015
  const { addSelectedItem, getSelectedItemProps, getDropdownProps, removeSelectedItem, reset, setSelectedItems } = useMultipleSelection({
897
1016
  selectedItems,
1017
+ itemToKey: mode.itemToKey,
898
1018
  onStateChange: ({ selectedItems: newSelectedItems, type }) => {
899
1019
  switch (type) {
900
1020
  case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownBackspace:
@@ -949,6 +1069,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
949
1069
  const { isOpen, getToggleButtonProps, getMenuProps, getInputProps, getItemProps, highlightedIndex, setHighlightedIndex, closeMenu, openMenu } = useCombobox({
950
1070
  items: navigableItems,
951
1071
  itemToString,
1072
+ itemToKey: mode.itemToKey,
952
1073
  getItemId: getOptionId,
953
1074
  isOpen: embedded ? embeddedOpen : void 0,
954
1075
  selectedItem: null,
@@ -967,7 +1088,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
967
1088
  switch (type) {
968
1089
  case useCombobox.stateChangeTypes.InputChange:
969
1090
  setInputValue(newInputValue || "");
970
- onInputChange?.(newInputValue || "");
1091
+ mode.onInputChange?.(newInputValue || "");
971
1092
  break;
972
1093
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
973
1094
  case useCombobox.stateChangeTypes.ItemClick:
@@ -1083,7 +1204,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1083
1204
  isOptionsLoading,
1084
1205
  itemCount: navigableItems.length,
1085
1206
  isMenuOpen,
1086
- inputValue,
1207
+ inputValue: mode.query ?? inputValue,
1087
1208
  highlightedIndex,
1088
1209
  setHighlightedIndex,
1089
1210
  inputId: field.inputId
@@ -1093,8 +1214,13 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1093
1214
  }, [isMenuOpen, openMenu]);
1094
1215
  const dropdownPosition = useDropdownPosition(portalContainerRef, isMenuOpen, embedded ? false : portal);
1095
1216
  useEffect(() => {
1217
+ mode.onMenuOpenChange(isMenuOpen);
1096
1218
  onOpenChange?.(isMenuOpen);
1097
- }, [isMenuOpen, onOpenChange]);
1219
+ }, [
1220
+ isMenuOpen,
1221
+ onOpenChange,
1222
+ mode.onMenuOpenChange
1223
+ ]);
1098
1224
  useEffect(() => {
1099
1225
  if (isMenuOpen && navigableItems.length > 0 && !isFooterHighlighted) {
1100
1226
  if (highlightedIndex === -1 || highlightedIndex >= navigableItems.length) setHighlightedIndex(0);
@@ -1179,8 +1305,9 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1179
1305
  const handleSearchInputBlur = useCallback((e) => {
1180
1306
  if (!isMenuOpen) return;
1181
1307
  const relatedTarget = e.relatedTarget;
1182
- const staysInCombobox = relatedTarget != null && (Boolean(comboboxContainerRef.current?.contains(relatedTarget)) || Boolean(relatedTarget.closest("#combobox-dropdown-portal-wrapper")));
1183
- if (!embedded && !staysInCombobox) closeMenu();
1308
+ if (!(relatedTarget != null && (Boolean(comboboxContainerRef.current?.contains(relatedTarget)) || Boolean(relatedTarget.closest("#combobox-dropdown-portal-wrapper"))))) {
1309
+ if (!embedded) closeMenu();
1310
+ }
1184
1311
  }, [
1185
1312
  embedded,
1186
1313
  isMenuOpen,
@@ -1227,7 +1354,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1227
1354
  return /* @__PURE__ */ jsx("div", {
1228
1355
  ref: (el) => measurementStickerRefs.current[index] = el,
1229
1356
  children: /* @__PURE__ */ jsx(Sticker, {
1230
- variant: flatOptions.find((opt) => opt.value === item.value)?.labelStickerVariant || "grey",
1357
+ variant: item?.labelStickerVariant || "grey",
1231
1358
  disabled: field.disabled,
1232
1359
  children: item.label
1233
1360
  })
@@ -1250,7 +1377,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1250
1377
  selectedItem: item,
1251
1378
  index
1252
1379
  });
1253
- const stickerVariant = flatOptions.find((opt) => opt.value === item.value)?.labelStickerVariant || "grey";
1380
+ const stickerVariant = item?.labelStickerVariant || "grey";
1254
1381
  return /* @__PURE__ */ jsx(TruncatedSticker, {
1255
1382
  ...stickerProps,
1256
1383
  variant: stickerVariant,
@@ -1267,7 +1394,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1267
1394
  selectedItem: item,
1268
1395
  index
1269
1396
  });
1270
- const stickerVariant = flatOptions.find((opt) => opt.value === item.value)?.labelStickerVariant || "grey";
1397
+ const stickerVariant = item?.labelStickerVariant || "grey";
1271
1398
  return /* @__PURE__ */ jsx(Sticker, {
1272
1399
  ...stickerProps,
1273
1400
  variant: stickerVariant,
@@ -1315,14 +1442,16 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1315
1442
  leftIcon: embedded ? void 0 : /* @__PURE__ */ jsx(SearchIcon, {}),
1316
1443
  size,
1317
1444
  children: /* @__PURE__ */ jsx(SearchInput, {
1318
- ...searchInputDownshiftProps,
1445
+ ...mode.getQueryInputProps({
1446
+ ...searchInputDownshiftProps,
1447
+ value: inputValue,
1448
+ onChange: (event) => {
1449
+ setInputValue(event.target.value);
1450
+ mode.onInputChange?.(event.target.value);
1451
+ }
1452
+ }, true, () => setHighlightedIndex(0)),
1319
1453
  $embedded: embedded,
1320
1454
  placeholder: searchPlaceholder,
1321
- value: inputValue,
1322
- onChange: (e) => {
1323
- setInputValue(e.target.value);
1324
- onInputChange?.(e.target.value);
1325
- },
1326
1455
  onKeyDown: handleSearchInputKeyDown,
1327
1456
  onBlur: handleSearchInputBlur,
1328
1457
  disabled: field.disabled,
@@ -1335,23 +1464,28 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
1335
1464
  $embedded: embedded,
1336
1465
  tabIndex: -1,
1337
1466
  ref: scrollableListRef,
1338
- children: isMenuOpen && /* @__PURE__ */ jsxs(Fragment$1, { children: [isOptionsLoading ? /* @__PURE__ */ jsx(LoadingContainer, { children: /* @__PURE__ */ jsx(Spinner, { size: "md" }) }) : navigableItems.length > 0 ? renderOptionsWithGroups({
1339
- options: optionsToRender,
1340
- filteredOptions: navigableItems,
1341
- renderOption,
1342
- virtualizer: virtualize ? virtualizer : void 0,
1343
- virtualRows: virtualize ? virtualRows : void 0
1344
- }) : /* @__PURE__ */ jsx(EmptyState, {
1345
- role: "status",
1346
- "aria-live": "polite",
1347
- size,
1348
- children: emptyStateMessage
1349
- }), showFooterAction && footerAction && /* @__PURE__ */ jsx(FooterActionRow, {
1350
- action: footerAction,
1351
- size,
1352
- id: footerActionId,
1353
- isHighlighted: isFooterHighlighted
1354
- })] })
1467
+ onScroll: mode.onScroll,
1468
+ children: isMenuOpen && /* @__PURE__ */ jsxs(Fragment$1, { children: [
1469
+ isOptionsLoading ? /* @__PURE__ */ jsx(LoadingContainer, { children: /* @__PURE__ */ jsx(Spinner, { size: "md" }) }) : navigableItems.length > 0 ? renderOptionsWithGroups({
1470
+ options: optionsToRender,
1471
+ filteredOptions: navigableItems,
1472
+ renderOption,
1473
+ virtualizer: virtualize ? virtualizer : void 0,
1474
+ virtualRows: virtualize ? virtualRows : void 0
1475
+ }) : /* @__PURE__ */ jsx(EmptyState, {
1476
+ role: "status",
1477
+ "aria-live": "polite",
1478
+ size,
1479
+ children: emptyStateMessage
1480
+ }),
1481
+ mode.loadingMore,
1482
+ showFooterAction && footerAction && /* @__PURE__ */ jsx(FooterActionRow, {
1483
+ action: footerAction,
1484
+ size,
1485
+ id: footerActionId,
1486
+ isHighlighted: isFooterHighlighted
1487
+ })
1488
+ ] })
1355
1489
  })]
1356
1490
  })
1357
1491
  })]
@@ -1375,7 +1509,37 @@ const StyledMenuItem = styled(MenuItem)`
1375
1509
  min-width: 0;
1376
1510
  box-sizing: border-box;
1377
1511
  }
1512
+
1513
+ /* MenuItem drops pointer events when disabled; keep them so the reason tooltip opens on hover.
1514
+ \`stateReducer\` refuses a click on a disabled option, so it still can't be picked. */
1515
+ &[aria-disabled='true'] {
1516
+ pointer-events: auto;
1517
+ }
1378
1518
  `;
1519
+ /** Room the reason tooltip needs beside its row: its 250px max width, 8px offset and 8px margin. */
1520
+ const REASON_TOOLTIP_SPACE = 266;
1521
+ /**
1522
+ * A disabled option's reason, shown on hover. It opens to the right of the row, or above it when
1523
+ * the row reaches too close to the right edge of the screen (an embedded or narrow menu).
1524
+ */
1525
+ function DisabledReasonTooltip({ reason, children }) {
1526
+ const [side, setSide] = useState("right");
1527
+ return /* @__PURE__ */ jsx(Tooltip, {
1528
+ trigger: children,
1529
+ triggerProps: { onPointerEnter: (event) => {
1530
+ const { right } = event.currentTarget.getBoundingClientRect();
1531
+ setSide(window.innerWidth - right >= REASON_TOOLTIP_SPACE ? "right" : "top");
1532
+ } },
1533
+ side,
1534
+ align: side === "top" ? "start" : "center",
1535
+ collisionPadding: 8,
1536
+ hideWhenDetached: true,
1537
+ size: "sm",
1538
+ zIndex: Z_INDICES.modalDropdownTooltip,
1539
+ interactive: false,
1540
+ children: reason
1541
+ });
1542
+ }
1379
1543
  const ParentMenuItem = styled(MenuItem)`
1380
1544
  ${IconContainer} {
1381
1545
  margin-right: 0;
@@ -1425,7 +1589,15 @@ const StickerComboboxInput = styled(ComboboxInput)`
1425
1589
  color: transparent;
1426
1590
  caret-color: transparent;
1427
1591
  `;
1428
- function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading, value, onChange, optionDisabledReason, onInputChange, placeholder = "Select an option...", emptyStateMessage = "No options found", disabled = false, hasWarning, hasError, required, id, labelId, "aria-label": ariaLabel, onOpenChange, portal = false, portalContainerRef: externalPortalContainerRef, trigger, embedded = false, footerAction, ...props }, ref) {
1592
+ function ComboboxSingleSelectComponent(componentProps, ref) {
1593
+ const { size = "md", options: optionsProp, isOptionsLoading, filterMode: _filterMode, selectedOptions: _selectedOptions, query: _query, onQueryChange: _onQueryChange, onScrollEnd: _onScrollEnd, isLoadingMore: _isLoadingMore, value, onChange, optionDisabledReason, onInputChange: _onInputChange, placeholder = "Select an option...", emptyStateMessage = "No options found", disabled = false, hasWarning, hasError, required, id, labelId, "aria-label": ariaLabel, onOpenChange, portal = false, portalContainerRef: externalPortalContainerRef, trigger, embedded = false, footerAction, ...props } = {
1594
+ onScrollEnd: void 0,
1595
+ isLoadingMore: void 0,
1596
+ ...componentProps
1597
+ };
1598
+ const clientOptions = useMemo(() => optionDisabledReason == null ? optionsProp : sortDisabledOptionsLast(optionsProp, (option) => optionDisabledReason(option) != null), [optionsProp, optionDisabledReason]);
1599
+ const mode = useComboboxServerMode(componentProps, useMemo(() => value == null ? [] : [value], [value]), clientOptions);
1600
+ const options = mode.options;
1429
1601
  const field = useFormField({
1430
1602
  hasWarning,
1431
1603
  hasError,
@@ -1437,7 +1609,6 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1437
1609
  const [navigationPath, setNavigationPath] = useState([]);
1438
1610
  const comboboxInputRef = useRef(null);
1439
1611
  const internalContainerRef = useRef(null);
1440
- const pendingDescentRef = useRef(null);
1441
1612
  const committedLabelRef = useRef(null);
1442
1613
  const lastValueRef = useRef(value);
1443
1614
  useEffect(() => {
@@ -1487,7 +1658,11 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1487
1658
  hasNestedGroups
1488
1659
  ]);
1489
1660
  const renderSource = isSearching ? hasNestedGroups ? searchableLeaves : options : nestedOptions;
1490
- const standardFilteredOptions = useFilteredOptions(renderSource, inputValue);
1661
+ const standardFilteredOptions = useMemo(() => mode.filterOptions(renderSource, inputValue), [
1662
+ mode.filterOptions,
1663
+ renderSource,
1664
+ inputValue
1665
+ ]);
1491
1666
  const filteredOptions = useMemo(() => {
1492
1667
  if (!isSearching || !hasNestedGroups || searchableLeafFuse == null) return standardFilteredOptions;
1493
1668
  if (inputValue === "") return searchableLeaves;
@@ -1513,9 +1688,7 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1513
1688
  navigableItems
1514
1689
  ]);
1515
1690
  const downshiftNodes = useMemo(() => new Set(downshiftItems.map((item) => item.kind === "group" ? item.group : item.option)), [downshiftItems]);
1516
- const allLeaves = useMemo(() => flattenLeafOptions(options), [options]);
1517
- const flatOptionsForFallback = useMemo(() => flattenOptions(options), [options]);
1518
- const selectedOption = allLeaves.find(({ option }) => option.value === value)?.option ?? flatOptionsForFallback.find((option) => option.value === value) ?? null;
1691
+ const selectedOption = mode.selectedItems[0] ?? null;
1519
1692
  const selectedNavigableItem = useMemo(() => selectedOption ? {
1520
1693
  kind: "leaf",
1521
1694
  option: selectedOption
@@ -1528,30 +1701,26 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1528
1701
  setNavigationPath((prev) => prev.length > 0 ? prev.slice(0, -1) : prev);
1529
1702
  setInputValue("");
1530
1703
  }, []);
1531
- const handleDescend = useCallback((groupLabel) => {
1532
- setNavigationPath((prev) => [...prev, groupLabel]);
1533
- setInputValue("");
1534
- }, []);
1535
1704
  const isItemDisabled = useCallback((item) => item?.kind === "leaf" && optionDisabledReason?.(item.option) != null, [optionDisabledReason]);
1536
1705
  const { isOpen, getToggleButtonProps, getMenuProps, getInputProps, getItemProps, highlightedIndex, setHighlightedIndex, openMenu } = useCombobox({
1537
1706
  items: downshiftItems,
1538
1707
  itemToString,
1539
- isItemDisabled,
1708
+ itemToKey: (item) => item?.kind === "leaf" ? mode.itemToKey(item.option) : item?.group.label,
1540
1709
  isOpen: embedded ? isDropdownOpen : void 0,
1541
1710
  selectedItem: isDropdownOpen ? null : selectedNavigableItem,
1542
- inputValue,
1711
+ inputValue: isDropdownOpen ? mode.query ?? inputValue : inputValue,
1543
1712
  onInputValueChange({ inputValue: newInputValue, type }) {
1544
1713
  if (type === useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem && isDropdownOpen && !embedded) return;
1545
- const isUserEdit = type === useCombobox.stateChangeTypes.InputChange || type === useCombobox.stateChangeTypes.InputKeyDownEscape;
1714
+ const isUserEdit = type === useCombobox.stateChangeTypes.InputChange && (mode.query === void 0 || !isDropdownOpen) || type === useCombobox.stateChangeTypes.InputKeyDownEscape;
1546
1715
  if (newInputValue === "" && isUserEdit && !embedded && trigger == null) onChange?.(null);
1547
1716
  setInputValue(newInputValue || "");
1548
- onInputChange?.(newInputValue || "");
1717
+ mode.onInputChange?.(newInputValue || "");
1549
1718
  },
1550
1719
  onIsOpenChange({ isOpen: newIsOpen }) {
1551
1720
  if (embedded) return;
1552
1721
  setIsDropdownOpen(newIsOpen);
1553
1722
  if (newIsOpen) {
1554
- if (selectedOption || committedLabelRef.current != null || value && inputValue === flatOptionsForFallback.find((opt) => opt.value === value)?.label) setInputValue("");
1723
+ if (selectedOption || committedLabelRef.current != null) setInputValue("");
1555
1724
  } else setInputValue(committedLabelRef.current ?? selectedOption?.label ?? "");
1556
1725
  },
1557
1726
  onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {
@@ -1577,27 +1746,22 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1577
1746
  case useCombobox.stateChangeTypes.InputKeyDownEnter: {
1578
1747
  const candidate = changes.selectedItem;
1579
1748
  if (candidate?.kind === "leaf" && optionDisabledReason?.(candidate.option) != null) return state;
1580
- if (candidate && candidate.kind === "group") {
1581
- pendingDescentRef.current = candidate.group.label;
1582
- return {
1583
- ...changes,
1584
- selectedItem: state.selectedItem,
1585
- isOpen: true
1586
- };
1587
- }
1749
+ if (candidate && candidate.kind === "group") return {
1750
+ ...changes,
1751
+ selectedItem: state.selectedItem,
1752
+ isOpen: true
1753
+ };
1588
1754
  return changes;
1589
1755
  }
1590
1756
  default: return changes;
1591
1757
  }
1592
1758
  }
1593
1759
  });
1594
- useEffect(() => {
1595
- if (pendingDescentRef.current != null) {
1596
- const target = pendingDescentRef.current;
1597
- pendingDescentRef.current = null;
1598
- handleDescend(target);
1599
- }
1600
- });
1760
+ const handleDescend = useCallback((groupLabel) => {
1761
+ setNavigationPath((prev) => [...prev, groupLabel]);
1762
+ setInputValue("");
1763
+ setHighlightedIndex(-1);
1764
+ }, [setHighlightedIndex]);
1601
1765
  useEffect(() => {
1602
1766
  if (!isOpen && !embedded && navigationPath.length > 0) setNavigationPath([]);
1603
1767
  }, [
@@ -1616,7 +1780,8 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1616
1780
  option
1617
1781
  },
1618
1782
  index: currentIndex,
1619
- "aria-selected": isSelected
1783
+ "aria-selected": isSelected,
1784
+ "aria-disabled": disabledReason != null ? true : void 0
1620
1785
  });
1621
1786
  const labelContent = option.labelStickerVariant ? /* @__PURE__ */ jsx(Sticker, {
1622
1787
  variant: option.labelStickerVariant,
@@ -1629,7 +1794,8 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1629
1794
  title: option.description,
1630
1795
  children: option.description
1631
1796
  })] });
1632
- return /* @__PURE__ */ jsxs(StyledMenuItem, {
1797
+ const key = `leaf-${String(option.value)}-${currentIndex}`;
1798
+ const item = /* @__PURE__ */ jsxs(StyledMenuItem, {
1633
1799
  ...itemProps,
1634
1800
  disabled: disabledReason != null,
1635
1801
  "aria-describedby": disabledReason != null ? descriptionId : void 0,
@@ -1637,11 +1803,16 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1637
1803
  selected: isSelected,
1638
1804
  size,
1639
1805
  tabIndex: -1,
1640
- children: [labelContent, disabledReason != null && /* @__PURE__ */ jsx(Description, {
1806
+ children: [labelContent, disabledReason != null && /* @__PURE__ */ jsx("span", {
1641
1807
  id: descriptionId,
1808
+ hidden: true,
1642
1809
  children: disabledReason
1643
1810
  })]
1644
- }, `leaf-${String(option.value)}-${currentIndex}`);
1811
+ }, key);
1812
+ return disabledReason == null ? item : /* @__PURE__ */ jsx(DisabledReasonTooltip, {
1813
+ reason: disabledReason,
1814
+ children: item
1815
+ }, key);
1645
1816
  }, [
1646
1817
  highlightedIndex,
1647
1818
  selectedOption,
@@ -1660,6 +1831,7 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1660
1831
  },
1661
1832
  index: currentIndex
1662
1833
  }),
1834
+ onClick: () => handleDescend(group.label),
1663
1835
  "aria-haspopup": "menu",
1664
1836
  focused: isHighlighted,
1665
1837
  prefixIcon: group.prefixIcon,
@@ -1681,7 +1853,8 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1681
1853
  }, [
1682
1854
  highlightedIndex,
1683
1855
  getItemProps,
1684
- size
1856
+ size,
1857
+ handleDescend
1685
1858
  ]);
1686
1859
  const renderNestedLevel = useCallback((items) => {
1687
1860
  let navIndex = -1;
@@ -1716,27 +1889,14 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1716
1889
  if (embedded && isMenuOpen && comboboxInputRef.current) comboboxInputRef.current.focus({ preventScroll: true });
1717
1890
  }, [embedded, isMenuOpen]);
1718
1891
  const dropdownPosition = useDropdownPosition(portalContainerRef, isMenuOpen, embedded ? false : portal);
1719
- const { firstNavigableIndex, lastNavigableIndex } = useMemo(() => {
1720
- let firstNavigableIndex = -1;
1721
- let lastNavigableIndex = -1;
1722
- downshiftItems.forEach((item, index) => {
1723
- if (isItemDisabled(item)) return;
1724
- if (firstNavigableIndex === -1) firstNavigableIndex = index;
1725
- lastNavigableIndex = index;
1726
- });
1727
- return {
1728
- firstNavigableIndex,
1729
- lastNavigableIndex
1730
- };
1731
- }, [downshiftItems, isItemDisabled]);
1892
+ const firstEnabledIndex = useMemo(() => downshiftItems.findIndex((item) => !isItemDisabled(item)), [downshiftItems, isItemDisabled]);
1732
1893
  const { isFooterHighlighted, footerActionId, showFooterAction, handleFooterKeyDown } = useComboboxFooterAction({
1733
1894
  footerAction,
1734
1895
  isOptionsLoading,
1735
1896
  itemCount: downshiftItems.length,
1736
- firstNavigableIndex,
1737
- lastNavigableIndex,
1897
+ firstNavigableIndex: downshiftItems.length > 0 ? 0 : -1,
1738
1898
  isMenuOpen,
1739
- inputValue,
1899
+ inputValue: mode.query ?? inputValue,
1740
1900
  highlightedIndex,
1741
1901
  setHighlightedIndex,
1742
1902
  inputId: field.inputId
@@ -1749,14 +1909,13 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1749
1909
  if (!isMenuOpen) return;
1750
1910
  if (handleFooterKeyDown(event)) return;
1751
1911
  if (isSearching) return;
1752
- if (event.key === "Enter" && downshiftItems[highlightedIndex]?.kind === "group") {
1753
- event.stopPropagation();
1754
- return;
1755
- }
1756
- if (event.key === "ArrowRight") {
1912
+ if (event.key === "Enter" || event.key === "ArrowRight") {
1757
1913
  const highlighted = downshiftItems[highlightedIndex];
1758
- if (highlighted && highlighted.kind === "group") {
1914
+ if (highlighted?.kind === "group") {
1759
1915
  event.preventDefault();
1916
+ if (event.key === "Enter") event.stopPropagation();
1917
+ const nativeEvent = event.nativeEvent;
1918
+ nativeEvent.preventDownshiftDefault = true;
1760
1919
  handleDescend(highlighted.group.label);
1761
1920
  }
1762
1921
  return;
@@ -1780,8 +1939,13 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1780
1939
  handleAscend
1781
1940
  ]);
1782
1941
  useEffect(() => {
1942
+ mode.onMenuOpenChange(isMenuOpen);
1783
1943
  onOpenChange?.(isMenuOpen);
1784
- }, [isMenuOpen, onOpenChange]);
1944
+ }, [
1945
+ isMenuOpen,
1946
+ onOpenChange,
1947
+ mode.onMenuOpenChange
1948
+ ]);
1785
1949
  useEffect(() => {
1786
1950
  if (!embedded && !isMenuOpen) setInputValue(committedLabelRef.current ?? selectedOption?.label ?? "");
1787
1951
  }, [
@@ -1789,19 +1953,23 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1789
1953
  selectedOption,
1790
1954
  isMenuOpen
1791
1955
  ]);
1956
+ const levelKey = JSON.stringify([navigationPath, mode.query ?? inputValue]);
1957
+ const levelKeyRef = useRef(levelKey);
1792
1958
  useEffect(() => {
1793
- if (!isMenuOpen || isFooterHighlighted) return;
1959
+ const levelChanged = levelKeyRef.current !== levelKey;
1960
+ levelKeyRef.current = levelKey;
1961
+ if (!isMenuOpen || isFooterHighlighted || firstEnabledIndex === -1) return;
1794
1962
  const highlighted = downshiftItems[highlightedIndex];
1795
- if (highlighted != null && !isItemDisabled(highlighted)) return;
1796
- if (highlightedIndex !== firstNavigableIndex) setHighlightedIndex(firstNavigableIndex);
1963
+ if (highlighted == null || levelChanged && isItemDisabled(highlighted)) setHighlightedIndex(firstEnabledIndex);
1797
1964
  }, [
1798
1965
  downshiftItems,
1799
1966
  isMenuOpen,
1800
1967
  highlightedIndex,
1801
1968
  isFooterHighlighted,
1802
1969
  setHighlightedIndex,
1970
+ firstEnabledIndex,
1803
1971
  isItemDisabled,
1804
- firstNavigableIndex
1972
+ levelKey
1805
1973
  ]);
1806
1974
  const displayValue = isMenuOpen ? inputValue : committedLabelRef.current ?? selectedOption?.label ?? "";
1807
1975
  const hasSticker = !isMenuOpen && selectedOption?.labelStickerVariant;
@@ -1853,12 +2021,14 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1853
2021
  children: selectedOption.label
1854
2022
  }),
1855
2023
  /* @__PURE__ */ jsx(InputComponent, {
1856
- ...mainInputProps,
2024
+ ...mode.getQueryInputProps({
2025
+ ...mainInputProps,
2026
+ value: displayValue
2027
+ }, isMenuOpen),
1857
2028
  size,
1858
2029
  $isOpen: isMenuOpen,
1859
2030
  hasWarning: field.hasWarning,
1860
2031
  hasError: field.hasError,
1861
- value: displayValue,
1862
2032
  $selectedItemStyle: selectedOption?.PLEASE_DO_NOT_USE_labelFontStyle
1863
2033
  }),
1864
2034
  /* @__PURE__ */ jsx(CaretButton, {
@@ -1887,17 +2057,21 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1887
2057
  size,
1888
2058
  children: /* @__PURE__ */ jsx(SearchInput, {
1889
2059
  $embedded: embedded,
1890
- ...searchInputProps,
2060
+ ...mode.getQueryInputProps({
2061
+ ...searchInputProps,
2062
+ value: inputValue
2063
+ }),
1891
2064
  size,
1892
2065
  hasWarning: field.hasWarning,
1893
2066
  hasError: field.hasError,
1894
- value: inputValue,
1895
2067
  autoComplete: "off"
1896
2068
  })
1897
2069
  })
1898
2070
  }), /* @__PURE__ */ jsx(SingleSelectScrollableMenuList, {
1899
2071
  $embedded: embedded,
1900
2072
  tabIndex: -1,
2073
+ ref: mode.scrollRef,
2074
+ onScroll: mode.onScroll,
1901
2075
  children: isMenuOpen && /* @__PURE__ */ jsxs(Fragment$1, { children: [
1902
2076
  showBackRow && /* @__PURE__ */ jsxs(BackRow, {
1903
2077
  type: "button",
@@ -1926,6 +2100,7 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
1926
2100
  size,
1927
2101
  children: emptyStateMessage
1928
2102
  }),
2103
+ mode.loadingMore,
1929
2104
  showFooterAction && footerAction && /* @__PURE__ */ jsx(FooterActionRow, {
1930
2105
  action: footerAction,
1931
2106
  size,
@@ -1955,4 +2130,4 @@ const Combobox = forwardRef(ComboboxComponent);
1955
2130
  //#endregion
1956
2131
  export { CaretButton as n, flattenOptions as r, Combobox as t };
1957
2132
 
1958
- //# sourceMappingURL=Combobox-Gb_j1dg6.mjs.map
2133
+ //# sourceMappingURL=Combobox-BNjYEAmv.mjs.map