@techzyapp/ui-library 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Accordion-Dy_dM79Y.cjs → Accordion-P3PNqSER.cjs} +2 -2
- package/dist/{Accordion-Dy_dM79Y.cjs.map → Accordion-P3PNqSER.cjs.map} +1 -1
- package/dist/{Accordion-CAxa1I-m.js → Accordion-w-w_WxxV.js} +3 -3
- package/dist/{Accordion-CAxa1I-m.js.map → Accordion-w-w_WxxV.js.map} +1 -1
- package/dist/{AdminRoot-DlpMJNTx.cjs → AdminRoot-BDRLuMX6.cjs} +2 -2
- package/dist/{AdminRoot-DlpMJNTx.cjs.map → AdminRoot-BDRLuMX6.cjs.map} +1 -1
- package/dist/{AdminRoot-B2J1cHK5.js → AdminRoot-DvF0js0q.js} +4 -4
- package/dist/{AdminRoot-B2J1cHK5.js.map → AdminRoot-DvF0js0q.js.map} +1 -1
- package/dist/{Alert-DRZdNwDm.cjs → Alert-CwoRkKq4.cjs} +2 -2
- package/dist/{Alert-DRZdNwDm.cjs.map → Alert-CwoRkKq4.cjs.map} +1 -1
- package/dist/{Alert-yldGvhVM.js → Alert-DPYmdaWs.js} +5 -5
- package/dist/{Alert-yldGvhVM.js.map → Alert-DPYmdaWs.js.map} +1 -1
- package/dist/{AuthLayout-B1tzhzHo.cjs → AuthLayout-BRUxDgzs.cjs} +2 -2
- package/dist/{AuthLayout-B1tzhzHo.cjs.map → AuthLayout-BRUxDgzs.cjs.map} +1 -1
- package/dist/{AuthLayout-j7EAPPXT.js → AuthLayout-CP9qu6Bv.js} +2 -2
- package/dist/{AuthLayout-j7EAPPXT.js.map → AuthLayout-CP9qu6Bv.js.map} +1 -1
- package/dist/{Avatar-_ufXh3AY.cjs → Avatar-Dgf04PBC.cjs} +2 -2
- package/dist/{Avatar-_ufXh3AY.cjs.map → Avatar-Dgf04PBC.cjs.map} +1 -1
- package/dist/{Avatar-BJVCdo-K.js → Avatar-Q50J8wdN.js} +3 -3
- package/dist/{Avatar-BJVCdo-K.js.map → Avatar-Q50J8wdN.js.map} +1 -1
- package/dist/{AvatarGroup-DdJf4aT7.js → AvatarGroup-YaNasLMS.js} +2 -2
- package/dist/{AvatarGroup-DdJf4aT7.js.map → AvatarGroup-YaNasLMS.js.map} +1 -1
- package/dist/{AvatarGroup-TW1pt4tj.cjs → AvatarGroup-uW0SD5P4.cjs} +2 -2
- package/dist/{AvatarGroup-TW1pt4tj.cjs.map → AvatarGroup-uW0SD5P4.cjs.map} +1 -1
- package/dist/{Breadcrumbs-f0GE4lCI.cjs → Breadcrumbs-CknDBLMw.cjs} +2 -2
- package/dist/{Breadcrumbs-f0GE4lCI.cjs.map → Breadcrumbs-CknDBLMw.cjs.map} +1 -1
- package/dist/{Breadcrumbs-FpIOHx_q.js → Breadcrumbs-l0PlUpQ4.js} +5 -5
- package/dist/{Breadcrumbs-FpIOHx_q.js.map → Breadcrumbs-l0PlUpQ4.js.map} +1 -1
- package/dist/{Button-Cu0XdnW6.cjs → Button-BdihbLYJ.cjs} +2 -2
- package/dist/{Button-Cu0XdnW6.cjs.map → Button-BdihbLYJ.cjs.map} +1 -1
- package/dist/{Button-BkjZ7wEu.js → Button-RljTGqHl.js} +2 -2
- package/dist/{Button-BkjZ7wEu.js.map → Button-RljTGqHl.js.map} +1 -1
- package/dist/{Calendar-DsJ6GICt.js → Calendar-CKCikOQL.js} +4 -4
- package/dist/{Calendar-DsJ6GICt.js.map → Calendar-CKCikOQL.js.map} +1 -1
- package/dist/{Calendar-CGQCditF.cjs → Calendar-DVg1uQuj.cjs} +2 -2
- package/dist/{Calendar-CGQCditF.cjs.map → Calendar-DVg1uQuj.cjs.map} +1 -1
- package/dist/{Card-CumMi_XB.js → Card-B0bYi4g2.js} +4 -4
- package/dist/{Card-CumMi_XB.js.map → Card-B0bYi4g2.js.map} +1 -1
- package/dist/{Card-DGTGdaTZ.cjs → Card-BYFuYD-a.cjs} +2 -2
- package/dist/{Card-DGTGdaTZ.cjs.map → Card-BYFuYD-a.cjs.map} +1 -1
- package/dist/Checkbox-ZYOSBYRt.js +98 -0
- package/dist/Checkbox-ZYOSBYRt.js.map +1 -0
- package/dist/Checkbox-fzJCwe0j.cjs +2 -0
- package/dist/Checkbox-fzJCwe0j.cjs.map +1 -0
- package/dist/{Chip-D83svOCW.js → Chip-BiqfnRUi.js} +3 -3
- package/dist/{Chip-D83svOCW.js.map → Chip-BiqfnRUi.js.map} +1 -1
- package/dist/{Chip-CJuAvgst.cjs → Chip-CdKUtUGE.cjs} +2 -2
- package/dist/{Chip-CJuAvgst.cjs.map → Chip-CdKUtUGE.cjs.map} +1 -1
- package/dist/{ChoiceCardGroup-CvFzZlgI.js → ChoiceCardGroup-DBohUnRj.js} +3 -3
- package/dist/{ChoiceCardGroup-CvFzZlgI.js.map → ChoiceCardGroup-DBohUnRj.js.map} +1 -1
- package/dist/{ChoiceCardGroup-6eFM1eL0.cjs → ChoiceCardGroup-d0VVTUi5.cjs} +2 -2
- package/dist/{ChoiceCardGroup-6eFM1eL0.cjs.map → ChoiceCardGroup-d0VVTUi5.cjs.map} +1 -1
- package/dist/{CodeBlock-BK_KXhos.js → CodeBlock-BX_0tpk3.js} +4 -4
- package/dist/{CodeBlock-BK_KXhos.js.map → CodeBlock-BX_0tpk3.js.map} +1 -1
- package/dist/{CodeBlock-C_UDrrY6.cjs → CodeBlock-CAAggVXS.cjs} +2 -2
- package/dist/{CodeBlock-C_UDrrY6.cjs.map → CodeBlock-CAAggVXS.cjs.map} +1 -1
- package/dist/{ColorPicker-BmxZnsNC.cjs → ColorPicker-BCSaT1A-.cjs} +2 -2
- package/dist/{ColorPicker-BmxZnsNC.cjs.map → ColorPicker-BCSaT1A-.cjs.map} +1 -1
- package/dist/{ColorPicker-DLnB_AvZ.js → ColorPicker-DhSlvwNj.js} +3 -3
- package/dist/{ColorPicker-DLnB_AvZ.js.map → ColorPicker-DhSlvwNj.js.map} +1 -1
- package/dist/{ColorPickerPanel-CoyKplF5.cjs → ColorPickerPanel-BOGYXXF1.cjs} +2 -2
- package/dist/{ColorPickerPanel-CoyKplF5.cjs.map → ColorPickerPanel-BOGYXXF1.cjs.map} +1 -1
- package/dist/{ColorPickerPanel-CG9idF4A.js → ColorPickerPanel-D4t3b9bB.js} +3 -3
- package/dist/{ColorPickerPanel-CG9idF4A.js.map → ColorPickerPanel-D4t3b9bB.js.map} +1 -1
- package/dist/{ConfigProvider-h1WoGC3R.cjs → ConfigProvider-C7DUWHrb.cjs} +2 -2
- package/dist/{ConfigProvider-h1WoGC3R.cjs.map → ConfigProvider-C7DUWHrb.cjs.map} +1 -1
- package/dist/{ConfigProvider-DDuIJSM7.js → ConfigProvider-DT0yrgmd.js} +2 -2
- package/dist/{ConfigProvider-DDuIJSM7.js.map → ConfigProvider-DT0yrgmd.js.map} +1 -1
- package/dist/{CopyButton-tRMAy59I.cjs → CopyButton-3585thVM.cjs} +2 -2
- package/dist/{CopyButton-tRMAy59I.cjs.map → CopyButton-3585thVM.cjs.map} +1 -1
- package/dist/{CopyButton-DdQ-8ExN.js → CopyButton-BEY1gJzK.js} +4 -4
- package/dist/{CopyButton-DdQ-8ExN.js.map → CopyButton-BEY1gJzK.js.map} +1 -1
- package/dist/{DashedButton-q7AOqKUE.cjs → DashedButton-3C4IZuo4.cjs} +2 -2
- package/dist/{DashedButton-q7AOqKUE.cjs.map → DashedButton-3C4IZuo4.cjs.map} +1 -1
- package/dist/{DashedButton-DeiALUPA.js → DashedButton-BXZAyMtw.js} +3 -3
- package/dist/{DashedButton-DeiALUPA.js.map → DashedButton-BXZAyMtw.js.map} +1 -1
- package/dist/{DatePicker-pz634ktl.js → DatePicker-CEFGgXLF.js} +5 -5
- package/dist/{DatePicker-pz634ktl.js.map → DatePicker-CEFGgXLF.js.map} +1 -1
- package/dist/{DatePicker-eryY6Xmx.cjs → DatePicker-Dyj2halw.cjs} +2 -2
- package/dist/{DatePicker-eryY6Xmx.cjs.map → DatePicker-Dyj2halw.cjs.map} +1 -1
- package/dist/{DateTimePicker-CmH3ZuzN.cjs → DateTimePicker-CjX4-8PP.cjs} +2 -2
- package/dist/{DateTimePicker-CmH3ZuzN.cjs.map → DateTimePicker-CjX4-8PP.cjs.map} +1 -1
- package/dist/{DateTimePicker-BJLq9Fud.js → DateTimePicker-hmYBEuUM.js} +8 -8
- package/dist/{DateTimePicker-BJLq9Fud.js.map → DateTimePicker-hmYBEuUM.js.map} +1 -1
- package/dist/{EmptyState-Cxf4H8Cc.cjs → EmptyState-Bj-vX_UV.cjs} +2 -2
- package/dist/{EmptyState-Cxf4H8Cc.cjs.map → EmptyState-Bj-vX_UV.cjs.map} +1 -1
- package/dist/{EmptyState-B2QPNhWW.js → EmptyState-DJDNLKT7.js} +4 -4
- package/dist/{EmptyState-B2QPNhWW.js.map → EmptyState-DJDNLKT7.js.map} +1 -1
- package/dist/{FileCard-Do9D72NA.js → FileCard-C9Ncifnu.js} +5 -5
- package/dist/{FileCard-Do9D72NA.js.map → FileCard-C9Ncifnu.js.map} +1 -1
- package/dist/{FileCard-D0Sa7WJt.cjs → FileCard-Dr5-z1R3.cjs} +2 -2
- package/dist/{FileCard-D0Sa7WJt.cjs.map → FileCard-Dr5-z1R3.cjs.map} +1 -1
- package/dist/{FileUploader-B1Arfj1a.cjs → FileUploader-DeyZENqq.cjs} +2 -2
- package/dist/{FileUploader-B1Arfj1a.cjs.map → FileUploader-DeyZENqq.cjs.map} +1 -1
- package/dist/{FileUploader-4900qKEE.js → FileUploader-XFmBNkA0.js} +6 -6
- package/dist/{FileUploader-4900qKEE.js.map → FileUploader-XFmBNkA0.js.map} +1 -1
- package/dist/{Flag-DNhhLtCC.js → Flag-Bs0xNP-P.js} +2 -2
- package/dist/{Flag-DNhhLtCC.js.map → Flag-Bs0xNP-P.js.map} +1 -1
- package/dist/{Flag-D7Vlczlw.cjs → Flag-Bxnx26DM.cjs} +2 -2
- package/dist/{Flag-D7Vlczlw.cjs.map → Flag-Bxnx26DM.cjs.map} +1 -1
- package/dist/{FullscreenToggle-dU2ai_OZ.cjs → FullscreenToggle-BncatGKj.cjs} +2 -2
- package/dist/{FullscreenToggle-dU2ai_OZ.cjs.map → FullscreenToggle-BncatGKj.cjs.map} +1 -1
- package/dist/{FullscreenToggle-Bc4fB-Mi.js → FullscreenToggle-DMlp05UN.js} +4 -4
- package/dist/{FullscreenToggle-Bc4fB-Mi.js.map → FullscreenToggle-DMlp05UN.js.map} +1 -1
- package/dist/Icon-BVULqOJD.cjs +2 -0
- package/dist/Icon-BVULqOJD.cjs.map +1 -0
- package/dist/{Icon-CophpkHo.js → Icon-DaTvzLBu.js} +2 -1
- package/dist/Icon-DaTvzLBu.js.map +1 -0
- package/dist/{IconButton-DpTxmj3d.js → IconButton-DXMmtuLA.js} +2 -2
- package/dist/{IconButton-DpTxmj3d.js.map → IconButton-DXMmtuLA.js.map} +1 -1
- package/dist/{IconButton-DyRC514t.cjs → IconButton-Lv0sDDR9.cjs} +2 -2
- package/dist/{IconButton-DyRC514t.cjs.map → IconButton-Lv0sDDR9.cjs.map} +1 -1
- package/dist/{ListItem-B4Upc0Hy.js → ListItem-Cn15lJBr.js} +3 -3
- package/dist/{ListItem-B4Upc0Hy.js.map → ListItem-Cn15lJBr.js.map} +1 -1
- package/dist/{ListItem-DWQorRxG.cjs → ListItem-yXXjtepZ.cjs} +2 -2
- package/dist/{ListItem-DWQorRxG.cjs.map → ListItem-yXXjtepZ.cjs.map} +1 -1
- package/dist/{Loader-B45H2SMP.cjs → Loader-53HFNMVX.cjs} +2 -2
- package/dist/{Loader-B45H2SMP.cjs.map → Loader-53HFNMVX.cjs.map} +1 -1
- package/dist/{Loader-B9VXX401.js → Loader-WsjQFl4p.js} +2 -2
- package/dist/{Loader-B9VXX401.js.map → Loader-WsjQFl4p.js.map} +1 -1
- package/dist/{Modal-Us_E-lb2.js → Modal-DBYcoCbJ.js} +5 -5
- package/dist/{Modal-Us_E-lb2.js.map → Modal-DBYcoCbJ.js.map} +1 -1
- package/dist/{Modal-DsoSz0Sp.cjs → Modal-V6eyGSzW.cjs} +2 -2
- package/dist/{Modal-DsoSz0Sp.cjs.map → Modal-V6eyGSzW.cjs.map} +1 -1
- package/dist/{MultiSelect-sKk2KzOd.js → MultiSelect-BsYPr3LD.js} +6 -6
- package/dist/{MultiSelect-sKk2KzOd.js.map → MultiSelect-BsYPr3LD.js.map} +1 -1
- package/dist/{MultiSelect-CtLpWaBX.cjs → MultiSelect-DS2DRpaP.cjs} +2 -2
- package/dist/{MultiSelect-CtLpWaBX.cjs.map → MultiSelect-DS2DRpaP.cjs.map} +1 -1
- package/dist/{NumberField-C6qj3nCa.cjs → NumberField-DC3TdGTt.cjs} +2 -2
- package/dist/{NumberField-C6qj3nCa.cjs.map → NumberField-DC3TdGTt.cjs.map} +1 -1
- package/dist/{NumberField-Cz03nksO.js → NumberField-mFb9pKCx.js} +4 -4
- package/dist/{NumberField-Cz03nksO.js.map → NumberField-mFb9pKCx.js.map} +1 -1
- package/dist/{OtpField-DLXQYMw1.js → OtpField-1ullIIZQ.js} +2 -2
- package/dist/{OtpField-DLXQYMw1.js.map → OtpField-1ullIIZQ.js.map} +1 -1
- package/dist/{OtpField-B46P6aMy.cjs → OtpField-BYj9SDHb.cjs} +2 -2
- package/dist/{OtpField-B46P6aMy.cjs.map → OtpField-BYj9SDHb.cjs.map} +1 -1
- package/dist/{PageLayout-BfeRjBek.cjs → PageLayout-pYL43wI9.cjs} +2 -2
- package/dist/{PageLayout-BfeRjBek.cjs.map → PageLayout-pYL43wI9.cjs.map} +1 -1
- package/dist/{PageLayout-BWU-p_N9.js → PageLayout-qf0H_EmS.js} +2 -2
- package/dist/{PageLayout-BWU-p_N9.js.map → PageLayout-qf0H_EmS.js.map} +1 -1
- package/dist/{PageNotFound-nvZm-UCG.cjs → PageNotFound-D1795gJ7.cjs} +2 -2
- package/dist/{PageNotFound-nvZm-UCG.cjs.map → PageNotFound-D1795gJ7.cjs.map} +1 -1
- package/dist/{PageNotFound-B_nTMrCD.js → PageNotFound-YGVMVvyG.js} +5 -5
- package/dist/{PageNotFound-B_nTMrCD.js.map → PageNotFound-YGVMVvyG.js.map} +1 -1
- package/dist/{Pagination-BYXUhmSz.js → Pagination-BTvUJiee.js} +3 -3
- package/dist/{Pagination-BYXUhmSz.js.map → Pagination-BTvUJiee.js.map} +1 -1
- package/dist/{Pagination-CsClNqIu.cjs → Pagination-WJq_7QNi.cjs} +2 -2
- package/dist/{Pagination-CsClNqIu.cjs.map → Pagination-WJq_7QNi.cjs.map} +1 -1
- package/dist/{RemoveDialog-PHdZi9-d.js → RemoveDialog-BSQ6EMW-.js} +5 -5
- package/dist/{RemoveDialog-PHdZi9-d.js.map → RemoveDialog-BSQ6EMW-.js.map} +1 -1
- package/dist/{RemoveDialog-D5J9TYap.cjs → RemoveDialog-BhcwsY0q.cjs} +2 -2
- package/dist/{RemoveDialog-D5J9TYap.cjs.map → RemoveDialog-BhcwsY0q.cjs.map} +1 -1
- package/dist/{RichTextEditor-jWv0t3vJ.cjs → RichTextEditor-Bc1fhvzn.cjs} +2 -2
- package/dist/{RichTextEditor-jWv0t3vJ.cjs.map → RichTextEditor-Bc1fhvzn.cjs.map} +1 -1
- package/dist/{RichTextEditor-BcmsnYGJ.js → RichTextEditor-CaGPtwXe.js} +9 -9
- package/dist/{RichTextEditor-BcmsnYGJ.js.map → RichTextEditor-CaGPtwXe.js.map} +1 -1
- package/dist/{RootLayout-q_oWf5et.js → RootLayout-BNwHsuhC.js} +31 -31
- package/dist/{RootLayout-q_oWf5et.js.map → RootLayout-BNwHsuhC.js.map} +1 -1
- package/dist/{RootLayout-DtZcqk9N.cjs → RootLayout-CB-3FgOp.cjs} +2 -2
- package/dist/{RootLayout-DtZcqk9N.cjs.map → RootLayout-CB-3FgOp.cjs.map} +1 -1
- package/dist/{Select-CWCeBQ8Q.cjs → Select-Cx1Yl8nq.cjs} +2 -2
- package/dist/{Select-CWCeBQ8Q.cjs.map → Select-Cx1Yl8nq.cjs.map} +1 -1
- package/dist/{Select-UygxT1Ry.js → Select-vKZzS9K4.js} +6 -6
- package/dist/{Select-UygxT1Ry.js.map → Select-vKZzS9K4.js.map} +1 -1
- package/dist/{Sidebar-C0OJK29L.js → Sidebar-CJ7DtOqb.js} +5 -5
- package/dist/{Sidebar-C0OJK29L.js.map → Sidebar-CJ7DtOqb.js.map} +1 -1
- package/dist/{Sidebar-BfBggyuh.cjs → Sidebar-Cv95DJxZ.cjs} +2 -2
- package/dist/{Sidebar-BfBggyuh.cjs.map → Sidebar-Cv95DJxZ.cjs.map} +1 -1
- package/dist/{SpeedDial-DbvOJ4no.js → SpeedDial-Bb0ioXaO.js} +4 -4
- package/dist/{SpeedDial-DbvOJ4no.js.map → SpeedDial-Bb0ioXaO.js.map} +1 -1
- package/dist/{SpeedDial-cKvuSMuk.cjs → SpeedDial-D6sO-9ES.cjs} +2 -2
- package/dist/{SpeedDial-cKvuSMuk.cjs.map → SpeedDial-D6sO-9ES.cjs.map} +1 -1
- package/dist/{Stepper-BxGrP6JZ.js → Stepper-BaEOUnYe.js} +4 -4
- package/dist/{Stepper-BxGrP6JZ.js.map → Stepper-BaEOUnYe.js.map} +1 -1
- package/dist/{Stepper-Db_ALAc4.cjs → Stepper-CVY8NJEI.cjs} +2 -2
- package/dist/{Stepper-Db_ALAc4.cjs.map → Stepper-CVY8NJEI.cjs.map} +1 -1
- package/dist/{SwatchPicker-DbAU9-ux.cjs → SwatchPicker-CCJltwHI.cjs} +2 -2
- package/dist/{SwatchPicker-DbAU9-ux.cjs.map → SwatchPicker-CCJltwHI.cjs.map} +1 -1
- package/dist/{SwatchPicker-D30aSrbY.js → SwatchPicker-CqyWngFJ.js} +2 -2
- package/dist/{SwatchPicker-D30aSrbY.js.map → SwatchPicker-CqyWngFJ.js.map} +1 -1
- package/dist/{Table-Dvna5_TR.cjs → Table-AQ7yJhtW.cjs} +2 -2
- package/dist/{Table-Dvna5_TR.cjs.map → Table-AQ7yJhtW.cjs.map} +1 -1
- package/dist/{Table-tPOJ9umi.js → Table-wn-B7iLj.js} +143 -143
- package/dist/{Table-tPOJ9umi.js.map → Table-wn-B7iLj.js.map} +1 -1
- package/dist/{Tabs-ozklGWmX.cjs → Tabs-BtcJ2jBl.cjs} +2 -2
- package/dist/{Tabs-ozklGWmX.cjs.map → Tabs-BtcJ2jBl.cjs.map} +1 -1
- package/dist/{Tabs-B0mWCNaC.js → Tabs-DJMfAUni.js} +4 -4
- package/dist/{Tabs-B0mWCNaC.js.map → Tabs-DJMfAUni.js.map} +1 -1
- package/dist/{TagsField-BIxwLfSJ.cjs → TagsField-4x3RmGwt.cjs} +2 -2
- package/dist/{TagsField-BIxwLfSJ.cjs.map → TagsField-4x3RmGwt.cjs.map} +1 -1
- package/dist/{TagsField-CGFm17lP.js → TagsField-Bvh6Fm5Y.js} +5 -5
- package/dist/{TagsField-CGFm17lP.js.map → TagsField-Bvh6Fm5Y.js.map} +1 -1
- package/dist/{TextField-DvKEj36A.cjs → TextField-DNqnpAWB.cjs} +2 -2
- package/dist/{TextField-DvKEj36A.cjs.map → TextField-DNqnpAWB.cjs.map} +1 -1
- package/dist/{TextField-CRCYLPpr.js → TextField-DcdwUA9d.js} +4 -4
- package/dist/{TextField-CRCYLPpr.js.map → TextField-DcdwUA9d.js.map} +1 -1
- package/dist/{ThemeToggle-BwW9L115.js → ThemeToggle-BVQmSMsj.js} +4 -4
- package/dist/{ThemeToggle-BwW9L115.js.map → ThemeToggle-BVQmSMsj.js.map} +1 -1
- package/dist/{ThemeToggle-DxxLN79b.cjs → ThemeToggle-isboxfZk.cjs} +2 -2
- package/dist/{ThemeToggle-DxxLN79b.cjs.map → ThemeToggle-isboxfZk.cjs.map} +1 -1
- package/dist/{TimeColumns-D3nqkQbh.js → TimeColumns-CFy_PynH.js} +2 -2
- package/dist/{TimeColumns-D3nqkQbh.js.map → TimeColumns-CFy_PynH.js.map} +1 -1
- package/dist/{TimeColumns-DB-V4KpQ.cjs → TimeColumns-DxFjjtc7.cjs} +2 -2
- package/dist/{TimeColumns-DB-V4KpQ.cjs.map → TimeColumns-DxFjjtc7.cjs.map} +1 -1
- package/dist/{TimePicker-D51QkQYy.js → TimePicker-ZO7jOJVa.js} +6 -6
- package/dist/{TimePicker-D51QkQYy.js.map → TimePicker-ZO7jOJVa.js.map} +1 -1
- package/dist/{TimePicker-D__72q2J.cjs → TimePicker-v1yA7Igl.cjs} +2 -2
- package/dist/{TimePicker-D__72q2J.cjs.map → TimePicker-v1yA7Igl.cjs.map} +1 -1
- package/dist/{Timeline-WkV4k_we.js → Timeline-D3kzt1dy.js} +3 -3
- package/dist/{Timeline-WkV4k_we.js.map → Timeline-D3kzt1dy.js.map} +1 -1
- package/dist/{Timeline-CoxW0Ia_.cjs → Timeline-ONU_3gi3.cjs} +2 -2
- package/dist/{Timeline-CoxW0Ia_.cjs.map → Timeline-ONU_3gi3.cjs.map} +1 -1
- package/dist/{Toaster-BynCHvUr.js → Toaster-C6UK_2TB.js} +2 -2
- package/dist/{Toaster-BynCHvUr.js.map → Toaster-C6UK_2TB.js.map} +1 -1
- package/dist/{Toaster-tHet1M-T.cjs → Toaster-Qnsq3guQ.cjs} +2 -2
- package/dist/{Toaster-tHet1M-T.cjs.map → Toaster-Qnsq3guQ.cjs.map} +1 -1
- package/dist/{ToggleButtonGroup-BWd7MOcc.js → ToggleButtonGroup-D9odYMzD.js} +3 -3
- package/dist/{ToggleButtonGroup-BWd7MOcc.js.map → ToggleButtonGroup-D9odYMzD.js.map} +1 -1
- package/dist/{ToggleButtonGroup-DYRLwKKh.cjs → ToggleButtonGroup-M2oj_3mc.cjs} +2 -2
- package/dist/{ToggleButtonGroup-DYRLwKKh.cjs.map → ToggleButtonGroup-M2oj_3mc.cjs.map} +1 -1
- package/dist/{TranslatedFields-DHRFcB3n.js → TranslatedFields-Bo5rZ7so.js} +5 -5
- package/dist/{TranslatedFields-DHRFcB3n.js.map → TranslatedFields-Bo5rZ7so.js.map} +1 -1
- package/dist/{TranslatedFields-B3Gli3TZ.cjs → TranslatedFields-CLMvRpJi.cjs} +2 -2
- package/dist/{TranslatedFields-B3Gli3TZ.cjs.map → TranslatedFields-CLMvRpJi.cjs.map} +1 -1
- package/dist/UserCard-454Kc7JS.js +74 -0
- package/dist/UserCard-454Kc7JS.js.map +1 -0
- package/dist/UserCard-CIjZz5xd.cjs +2 -0
- package/dist/UserCard-CIjZz5xd.cjs.map +1 -0
- package/dist/components/Accordion/index.cjs +1 -1
- package/dist/components/Accordion/index.js +1 -1
- package/dist/components/Alert/index.cjs +1 -1
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/AuthLayout/index.cjs +1 -1
- package/dist/components/AuthLayout/index.js +1 -1
- package/dist/components/Avatar/index.cjs +1 -1
- package/dist/components/Avatar/index.js +2 -2
- package/dist/components/Breadcrumbs/index.cjs +1 -1
- package/dist/components/Breadcrumbs/index.js +1 -1
- package/dist/components/Button/index.cjs +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Card/index.cjs +1 -1
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Checkbox/Checkbox.d.cts +7 -0
- package/dist/components/Checkbox/Checkbox.d.ts +7 -0
- package/dist/components/Checkbox/index.cjs +1 -1
- package/dist/components/Checkbox/index.js +1 -1
- package/dist/components/Chip/index.cjs +1 -1
- package/dist/components/Chip/index.js +1 -1
- package/dist/components/ChoiceCard/index.cjs +1 -1
- package/dist/components/ChoiceCard/index.js +1 -1
- package/dist/components/CodeBlock/index.cjs +1 -1
- package/dist/components/CodeBlock/index.js +1 -1
- package/dist/components/ColorPicker/index.cjs +1 -1
- package/dist/components/ColorPicker/index.js +1 -1
- package/dist/components/CopyButton/index.cjs +1 -1
- package/dist/components/CopyButton/index.js +1 -1
- package/dist/components/DashedButton/index.cjs +1 -1
- package/dist/components/DashedButton/index.js +1 -1
- package/dist/components/DatePicker/index.cjs +1 -1
- package/dist/components/DatePicker/index.js +1 -1
- package/dist/components/DateTimePicker/index.cjs +1 -1
- package/dist/components/DateTimePicker/index.js +1 -1
- package/dist/components/EmptyState/index.cjs +1 -1
- package/dist/components/EmptyState/index.js +1 -1
- package/dist/components/FileCard/index.cjs +1 -1
- package/dist/components/FileCard/index.js +1 -1
- package/dist/components/FileUploader/index.cjs +1 -1
- package/dist/components/FileUploader/index.js +1 -1
- package/dist/components/Flag/index.cjs +1 -1
- package/dist/components/Flag/index.js +1 -1
- package/dist/components/FullscreenToggle/index.cjs +1 -1
- package/dist/components/FullscreenToggle/index.js +1 -1
- package/dist/components/Icon/index.cjs +1 -1
- package/dist/components/Icon/index.js +2 -2
- package/dist/components/IconButton/index.cjs +1 -1
- package/dist/components/IconButton/index.js +1 -1
- package/dist/components/List/index.cjs +1 -1
- package/dist/components/List/index.js +1 -1
- package/dist/components/Loader/index.cjs +1 -1
- package/dist/components/Loader/index.js +1 -1
- package/dist/components/Modal/index.cjs +1 -1
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/MultiSelect/index.cjs +1 -1
- package/dist/components/MultiSelect/index.js +1 -1
- package/dist/components/NumberField/index.cjs +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OtpField/index.cjs +1 -1
- package/dist/components/OtpField/index.js +1 -1
- package/dist/components/PageLayout/index.cjs +1 -1
- package/dist/components/PageLayout/index.js +1 -1
- package/dist/components/PageNotFound/index.cjs +1 -1
- package/dist/components/PageNotFound/index.js +1 -1
- package/dist/components/Pagination/index.cjs +1 -1
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/RemoveDialog/index.cjs +1 -1
- package/dist/components/RemoveDialog/index.js +1 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/RootLayout/index.cjs +1 -1
- package/dist/components/RootLayout/index.js +1 -1
- package/dist/components/Select/index.cjs +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Sidebar/index.cjs +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/SpeedDial/index.cjs +1 -1
- package/dist/components/SpeedDial/index.js +1 -1
- package/dist/components/Stepper/index.cjs +1 -1
- package/dist/components/Stepper/index.js +1 -1
- package/dist/components/SwatchPicker/index.cjs +1 -1
- package/dist/components/SwatchPicker/index.js +1 -1
- package/dist/components/Table/index.cjs +1 -1
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Tabs/index.cjs +1 -1
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/TagsField/index.cjs +1 -1
- package/dist/components/TagsField/index.js +1 -1
- package/dist/components/TextField/index.cjs +1 -1
- package/dist/components/TextField/index.js +1 -1
- package/dist/components/ThemeToggle/index.cjs +1 -1
- package/dist/components/ThemeToggle/index.js +1 -1
- package/dist/components/TimePicker/index.cjs +1 -1
- package/dist/components/TimePicker/index.js +1 -1
- package/dist/components/Timeline/index.cjs +1 -1
- package/dist/components/Timeline/index.js +1 -1
- package/dist/components/Toast/index.cjs +1 -1
- package/dist/components/Toast/index.js +1 -1
- package/dist/components/ToggleButton/index.cjs +1 -1
- package/dist/components/ToggleButton/index.js +1 -1
- package/dist/components/TranslatedFields/index.cjs +1 -1
- package/dist/components/TranslatedFields/index.js +1 -1
- package/dist/components/UserCard/UserCard.d.cts +4 -1
- package/dist/components/UserCard/UserCard.d.ts +4 -1
- package/dist/components/UserCard/index.cjs +1 -1
- package/dist/components/UserCard/index.js +1 -1
- package/dist/entries/app.cjs +1 -1
- package/dist/entries/app.js +1 -1
- package/dist/entries/components.cjs +1 -1
- package/dist/entries/components.js +53 -53
- package/dist/entries/i18n.cjs +1 -1
- package/dist/entries/i18n.js +2 -2
- package/dist/entries/icons.cjs +1 -1
- package/dist/entries/icons.js +2 -2
- package/dist/entries/theme.cjs +1 -1
- package/dist/entries/theme.js +1 -1
- package/dist/i18n/messages.d.cts +1 -0
- package/dist/i18n/messages.d.ts +1 -0
- package/dist/icons/names.d.cts +3 -3
- package/dist/icons/names.d.ts +3 -3
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +56 -56
- package/dist/{messages-FciBtnCL.js → messages-CGHhwf6F.js} +10 -3
- package/dist/messages-CGHhwf6F.js.map +1 -0
- package/dist/messages-DZJyiaf9.cjs +36 -0
- package/dist/messages-DZJyiaf9.cjs.map +1 -0
- package/dist/names-BJnFU_5m.cjs +2 -0
- package/dist/names-BJnFU_5m.cjs.map +1 -0
- package/dist/{names-D8ABK2Wk.js → names-r21QPjcU.js} +3 -2
- package/dist/names-r21QPjcU.js.map +1 -0
- package/package.json +1 -1
- package/dist/Checkbox-DXOzYIAz.cjs +0 -2
- package/dist/Checkbox-DXOzYIAz.cjs.map +0 -1
- package/dist/Checkbox-XKL_Q5qj.js +0 -84
- package/dist/Checkbox-XKL_Q5qj.js.map +0 -1
- package/dist/Icon-CXTl_QAP.cjs +0 -2
- package/dist/Icon-CXTl_QAP.cjs.map +0 -1
- package/dist/Icon-CophpkHo.js.map +0 -1
- package/dist/UserCard-D7U-CLbM.js +0 -74
- package/dist/UserCard-D7U-CLbM.js.map +0 -1
- package/dist/UserCard-GHw2gTx9.cjs +0 -2
- package/dist/UserCard-GHw2gTx9.cjs.map +0 -1
- package/dist/messages-C0YutUM1.cjs +0 -36
- package/dist/messages-C0YutUM1.cjs.map +0 -1
- package/dist/messages-FciBtnCL.js.map +0 -1
- package/dist/names-C2Yj1p3u.cjs +0 -2
- package/dist/names-C2Yj1p3u.cjs.map +0 -1
- package/dist/names-D8ABK2Wk.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select-CWCeBQ8Q.cjs","sources":["../src/components/Select/Select.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { List, ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { Typography } from '../Typography'\nimport styles from './Select.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\n\n/** A single selectable option. */\nexport interface SelectOption {\n /** The value committed when this option is chosen. */\n value: string\n /** Display + search text. */\n label: string\n /** Greys out and blocks selecting this option. */\n disabled?: boolean\n /** Leading icon — a known `IconName` (rendered as `<Icon>`) or any node. */\n icon?: IconName | ReactNode\n}\n\n/** Renders an option's icon (an `IconName` becomes an `<Icon>`; anything else is used as-is). */\nfunction renderIcon(icon: IconName | ReactNode, size: 'sm' | 'md'): ReactNode {\n if (icon == null) return null\n if (typeof icon === 'string' && ICON_NAME_SET.has(icon))\n return <Icon name={icon as IconName} size={size} />\n return icon\n}\n\nexport interface SelectProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** The selectable options. */\n options: SelectOption[]\n /** Preset size — control height, font and option density. */\n size?: SelectSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — the chosen option's `value` (`''` = nothing selected). */\n value?: string\n /** Initial value for uncontrolled use. */\n defaultValue?: string\n /** Fires with the next value (`''` when cleared). */\n onChange?: (value: string) => void\n /** Text shown in the trigger when nothing is selected. Defaults to `\"Select…\"`. */\n placeholder?: string\n /** Shows a clear (×) button in the trigger when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Adds a search box inside the popover that filters options by label. */\n searchable?: boolean\n /** Placeholder for the search box. Defaults to `\"Search…\"`. */\n searchPlaceholder?: string\n /**\n * Fires with the search query as the user types. **Providing this switches off the built-in\n * local filtering** — you own `options` (e.g. fetch them from a server for the current query).\n */\n onSearchChange?: (query: string) => void\n /** Shows a loading indicator in the popover (e.g. while fetching server-side search results). */\n loading?: boolean\n /** Text shown next to the loader while `loading`. Defaults to `\"Loading…\"`. */\n loadingText?: ReactNode\n /**\n * Shown in the popover when no option matches. Defaults to `\"No options\"`. Pass a function\n * `(query) => node` to vary the message by the current search text — e.g. a \"Type to search\" hint\n * while it's empty vs a \"No results\" message after typing.\n */\n noOptionsText?: ReactNode | ((query: string) => ReactNode)\n /** Show the trailing tick on the selected option. Defaults to `true` (the row still gets its tint). */\n showSelectedTick?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the option's `value`). */\n name?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A labeled single-select. The trigger reuses TextField-style chrome (label, helper/error, sizes,\n * `required`, `fullWidth`, `disabled`); clicking it opens a `Dropdown`-style popover — portaled to\n * `<body>`, opening below (flipping above only when it would overflow), locking page scroll,\n * re-positioning on scroll/resize, matching the trigger width, and entering with the shared\n * opacity + translate animation. Options render as `ListItem`s in a `role=\"listbox\"`; the chosen\n * option is highlighted with a tick, disabled options are inert. Full keyboard support\n * (Arrow/Home/End to move, Enter/Space to select, Escape to close, type-ahead) and ARIA\n * (`listbox`/`option`, `aria-activedescendant`, `aria-expanded`). Optionally `searchable` (a filter\n * box) and `clearable` (a × to reset); pass `onSearchChange` to drive the search **server-side** (the\n * consumer owns `options` for the current query — local filtering is skipped) with a `loading`\n * indicator. Controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`), and binds to a surrounding `<Form>` by `name` (value = the option's `value`;\n * validate with e.g. `z.string().min(1, 'Required')`). Token-only styling.\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(function Select(\n {\n label,\n options,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n placeholder,\n clearable = true,\n searchable = false,\n searchPlaceholder,\n onSearchChange,\n loading = false,\n loadingText,\n noOptionsText,\n showSelectedTick = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const reactId = useId()\n const id = idProp ?? reactId\n const labelId = `${id}-label`\n const listboxId = `${id}-listbox`\n const helperId = `${id}-helper`\n const optionId = (index: number) => `${id}-opt-${index}`\n\n const t = useT()\n const searchPh = searchPlaceholder ?? t('common.search')\n\n // ── value (controlled / form-bound / uncontrolled) ─────────────────────────────────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const selected = options.find((o) => o.value === currentValue)\n const hasValue = selected != null\n\n const commit = (next: string) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // ── popover open state ─────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const searchInputRef = useRef<HTMLInputElement | null>(null)\n const typeahead = useRef({ buffer: '', timer: 0 })\n // stable handle to the form field's blur (touched) callback — field() returns a fresh object each render\n const fieldBlur = useRef<(() => void) | undefined>(undefined)\n fieldBlur.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n\n const setTriggerRef = useCallback(\n (node: HTMLDivElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n },\n [ref],\n )\n\n // options shown right now. When `onSearchChange` is set the consumer owns `options` (server-side\n // search) — skip the built-in local filter; otherwise filter the given options by label.\n const filteredOptions = useMemo(() => {\n if (!searchable || onSearchChange || !searchQuery.trim()) return options\n const q = searchQuery.trim().toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(q))\n }, [searchable, onSearchChange, searchQuery, options])\n\n const findEnabled = useCallback(\n (start: number, delta: number) => {\n let i = start\n while (i >= 0 && i < filteredOptions.length) {\n if (!filteredOptions[i].disabled) return i\n i += delta\n }\n return -1\n },\n [filteredOptions],\n )\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n // single dismiss path: clears search + type-ahead buffer, marks the field touched, optionally refocuses\n const closeMenu = useCallback((refocus: boolean) => {\n setOpen(false)\n setSearchQuery('')\n window.clearTimeout(typeahead.current.timer)\n typeahead.current.buffer = ''\n fieldBlur.current?.()\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // on open: highlight the selected option (or first enabled), focus the search box if searchable\n useEffect(() => {\n if (!open) return\n const selIdx = filteredOptions.findIndex((o) => o.value === currentValue)\n setHighlightedIndex(\n selIdx >= 0 && !filteredOptions[selIdx].disabled ? selIdx : findEnabled(0, 1),\n )\n if (searchable) requestAnimationFrame(() => searchInputRef.current?.focus())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // keep the highlighted option scrolled into view\n useEffect(() => {\n if (!open || highlightedIndex < 0) return\n document.getElementById(optionId(highlightedIndex))?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, highlightedIndex])\n\n // when the search filter changes, re-anchor the highlight to the first match\n useEffect(() => {\n if (open && searchable) setHighlightedIndex(findEnabled(0, 1))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery])\n\n // if the option count changes while open (async load / list shrink), keep the highlight in range\n useEffect(() => {\n if (open) setHighlightedIndex((i) => (i < filteredOptions.length ? i : findEnabled(0, 1)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filteredOptions.length])\n\n const openMenu = () => {\n if (!disabled) setOpen(true)\n }\n const selectOption = (opt: SelectOption | undefined) => {\n if (!opt || opt.disabled) return\n commit(opt.value)\n closeMenu(true)\n }\n const moveHighlight = (delta: number) => {\n setHighlightedIndex((cur) => {\n const start = cur < 0 ? (delta > 0 ? 0 : filteredOptions.length - 1) : cur + delta\n const found = findEnabled(start, delta)\n return found === -1 ? cur : found\n })\n }\n\n // type-ahead (non-searchable): jump to the option whose label starts with the typed buffer\n const handleTypeahead = (char: string) => {\n const t = typeahead.current\n window.clearTimeout(t.timer)\n t.buffer += char.toLowerCase()\n t.timer = window.setTimeout(() => (t.buffer = ''), 500)\n const match = filteredOptions.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(t.buffer),\n )\n if (match >= 0) setHighlightedIndex(match)\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent) => {\n if (disabled) return\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n open ? moveHighlight(1) : openMenu()\n break\n case 'ArrowUp':\n event.preventDefault()\n open ? moveHighlight(-1) : openMenu()\n break\n case 'Enter':\n event.preventDefault()\n if (!open) openMenu()\n else selectOption(filteredOptions[highlightedIndex])\n break\n case ' ':\n // Space opens a closed menu (any mode); selects only when open & not searchable\n // (so a focused search box can still type spaces)\n if (!open) {\n event.preventDefault()\n openMenu()\n } else if (!searchable) {\n event.preventDefault()\n selectOption(filteredOptions[highlightedIndex])\n }\n break\n case 'Escape':\n if (open) {\n event.preventDefault()\n event.stopPropagation() // don't let FloatingPanel's own Escape also fire closeMenu/onBlur\n closeMenu(true)\n }\n break\n case 'Tab':\n // refocus the trigger so Tab continues from the field's visual location, not the portaled\n // search input's DOM position (end of <body>); don't preventDefault — let Tab move on\n if (open) closeMenu(true)\n break\n case 'Home':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(0, 1))\n }\n break\n case 'End':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(filteredOptions.length - 1, -1))\n }\n break\n default:\n if (\n !searchable &&\n open &&\n event.key.length === 1 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey\n ) {\n handleTypeahead(event.key)\n }\n }\n }\n\n const handleTriggerBlur = (event: FocusEvent<HTMLDivElement>) => {\n // mark the form field touched only when focus leaves the whole widget (not into the popover)\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n const handleClear = (event: ReactMouseEvent) => {\n event.stopPropagation()\n commit('')\n triggerRef.current?.focus()\n }\n\n const activeId = open && highlightedIndex >= 0 ? optionId(highlightedIndex) : undefined\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n // chevron size per field size: sm 16 · md 14 · lg 12\n const chevronPx = size === 'sm' ? 16 : size === 'md' ? 14 : 12\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <span\n id={labelId}\n className={styles.label}\n onClick={() => !disabled && triggerRef.current?.focus()}\n >\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n <div\n ref={setTriggerRef}\n id={id}\n // `name` lets the form's scroll-to-error find + focus this field\n {...(name ? { name } : {})}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={searchable ? undefined : activeId}\n aria-labelledby={label != null ? labelId : undefined}\n aria-disabled={disabled || undefined}\n aria-required={required || undefined}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n className={clsx(styles.control, open && styles.open)}\n onClick={() => (open ? closeMenu(false) : openMenu())}\n onKeyDown={handleKeyDown}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !hasValue && styles.placeholder)}>\n {selected?.icon != null && (\n <span className={styles.valueIcon}>{renderIcon(selected.icon, iconSize)}</span>\n )}\n <span className={styles.valueLabel}>\n {selected ? selected.label : (placeholder ?? t('select.placeholder'))}\n </span>\n </span>\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('select.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <Icon\n name=\"ArrowDown4\"\n className={styles.chevron}\n style={{ width: chevronPx, height: chevronPx }}\n aria-hidden=\"true\"\n />\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closeMenu}\n matchTriggerWidth\n className={styles.popover}\n >\n {searchable && (\n <div className={styles.search}>\n <Icon name=\"SearchNormal\" size=\"sm\" className={styles.searchIcon} aria-hidden=\"true\" />\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={searchPh}\n placeholder={searchPh}\n value={searchQuery}\n spellCheck={false}\n onChange={(e) => {\n setSearchQuery(e.target.value)\n onSearchChange?.(e.target.value)\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n )}\n\n {/* the listbox always carries `listboxId` (even when empty) so aria-controls never dangles */}\n <List\n role=\"listbox\"\n id={listboxId}\n aria-labelledby={label != null ? labelId : undefined}\n size={size}\n className={styles.listbox}\n // clear the mouse highlight when the pointer leaves the list (no lingering hover)\n onMouseLeave={() => setHighlightedIndex(-1)}\n >\n {loading ? (\n <div className={styles.loading}>\n <Loader size=\"sm\" />\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {loadingText ?? t('common.loading')}\n </Typography>\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className={styles.noOptions}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {noOptionsText == null\n ? t('select.noOptions')\n : typeof noOptionsText === 'function'\n ? noOptionsText(searchQuery)\n : noOptionsText}\n </Typography>\n </div>\n ) : (\n filteredOptions.map((opt, index) => {\n const isSelected = opt.value === currentValue\n return (\n <ListItem\n key={opt.value}\n id={optionId(index)}\n role=\"option\"\n tabIndex={-1}\n aria-selected={isSelected}\n aria-current={undefined}\n clickable\n selected={isSelected}\n disabled={opt.disabled}\n icon={opt.icon}\n className={clsx(index === highlightedIndex && styles.active)}\n trailing={\n isSelected && showSelectedTick ? (\n <Icon name=\"TickCircle\" size=\"sm\" />\n ) : undefined\n }\n onMouseEnter={() => !opt.disabled && setHighlightedIndex(index)}\n onClick={() => selectOption(opt)}\n >\n {opt.label}\n </ListItem>\n )\n })\n )}\n </List>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","renderIcon","icon","size","jsx","Icon","Select","forwardRef","label","options","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","placeholder","clearable","searchable","searchPlaceholder","onSearchChange","loading","loadingText","noOptionsText","showSelectedTick","name","idProp","className","style","ref","reactId","useId","id","labelId","listboxId","helperId","optionId","index","t","useT","searchPh","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","resolvedError","resolvedHelperText","selected","o","hasValue","commit","next","triggerRef","useRef","searchInputRef","typeahead","fieldBlur","open","setOpen","searchQuery","setSearchQuery","highlightedIndex","setHighlightedIndex","setTriggerRef","useCallback","node","filteredOptions","useMemo","q","findEnabled","start","delta","i","popoverRef","closeMenu","refocus","_a","_b","useEffect","selIdx","openMenu","selectOption","opt","moveHighlight","cur","found","handleTypeahead","char","match","handleKeyDown","event","handleTriggerBlur","handleClear","activeId","iconSize","chevronPx","jsxs","clsx","styles","Typography","FloatingPanel","List","Loader","isSelected","ListItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select-Cx1Yl8nq.cjs","sources":["../src/components/Select/Select.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { List, ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { Typography } from '../Typography'\nimport styles from './Select.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\n\n/** A single selectable option. */\nexport interface SelectOption {\n /** The value committed when this option is chosen. */\n value: string\n /** Display + search text. */\n label: string\n /** Greys out and blocks selecting this option. */\n disabled?: boolean\n /** Leading icon — a known `IconName` (rendered as `<Icon>`) or any node. */\n icon?: IconName | ReactNode\n}\n\n/** Renders an option's icon (an `IconName` becomes an `<Icon>`; anything else is used as-is). */\nfunction renderIcon(icon: IconName | ReactNode, size: 'sm' | 'md'): ReactNode {\n if (icon == null) return null\n if (typeof icon === 'string' && ICON_NAME_SET.has(icon))\n return <Icon name={icon as IconName} size={size} />\n return icon\n}\n\nexport interface SelectProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** The selectable options. */\n options: SelectOption[]\n /** Preset size — control height, font and option density. */\n size?: SelectSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — the chosen option's `value` (`''` = nothing selected). */\n value?: string\n /** Initial value for uncontrolled use. */\n defaultValue?: string\n /** Fires with the next value (`''` when cleared). */\n onChange?: (value: string) => void\n /** Text shown in the trigger when nothing is selected. Defaults to `\"Select…\"`. */\n placeholder?: string\n /** Shows a clear (×) button in the trigger when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Adds a search box inside the popover that filters options by label. */\n searchable?: boolean\n /** Placeholder for the search box. Defaults to `\"Search…\"`. */\n searchPlaceholder?: string\n /**\n * Fires with the search query as the user types. **Providing this switches off the built-in\n * local filtering** — you own `options` (e.g. fetch them from a server for the current query).\n */\n onSearchChange?: (query: string) => void\n /** Shows a loading indicator in the popover (e.g. while fetching server-side search results). */\n loading?: boolean\n /** Text shown next to the loader while `loading`. Defaults to `\"Loading…\"`. */\n loadingText?: ReactNode\n /**\n * Shown in the popover when no option matches. Defaults to `\"No options\"`. Pass a function\n * `(query) => node` to vary the message by the current search text — e.g. a \"Type to search\" hint\n * while it's empty vs a \"No results\" message after typing.\n */\n noOptionsText?: ReactNode | ((query: string) => ReactNode)\n /** Show the trailing tick on the selected option. Defaults to `true` (the row still gets its tint). */\n showSelectedTick?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the option's `value`). */\n name?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A labeled single-select. The trigger reuses TextField-style chrome (label, helper/error, sizes,\n * `required`, `fullWidth`, `disabled`); clicking it opens a `Dropdown`-style popover — portaled to\n * `<body>`, opening below (flipping above only when it would overflow), locking page scroll,\n * re-positioning on scroll/resize, matching the trigger width, and entering with the shared\n * opacity + translate animation. Options render as `ListItem`s in a `role=\"listbox\"`; the chosen\n * option is highlighted with a tick, disabled options are inert. Full keyboard support\n * (Arrow/Home/End to move, Enter/Space to select, Escape to close, type-ahead) and ARIA\n * (`listbox`/`option`, `aria-activedescendant`, `aria-expanded`). Optionally `searchable` (a filter\n * box) and `clearable` (a × to reset); pass `onSearchChange` to drive the search **server-side** (the\n * consumer owns `options` for the current query — local filtering is skipped) with a `loading`\n * indicator. Controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`), and binds to a surrounding `<Form>` by `name` (value = the option's `value`;\n * validate with e.g. `z.string().min(1, 'Required')`). Token-only styling.\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(function Select(\n {\n label,\n options,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n placeholder,\n clearable = true,\n searchable = false,\n searchPlaceholder,\n onSearchChange,\n loading = false,\n loadingText,\n noOptionsText,\n showSelectedTick = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const reactId = useId()\n const id = idProp ?? reactId\n const labelId = `${id}-label`\n const listboxId = `${id}-listbox`\n const helperId = `${id}-helper`\n const optionId = (index: number) => `${id}-opt-${index}`\n\n const t = useT()\n const searchPh = searchPlaceholder ?? t('common.search')\n\n // ── value (controlled / form-bound / uncontrolled) ─────────────────────────────────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const selected = options.find((o) => o.value === currentValue)\n const hasValue = selected != null\n\n const commit = (next: string) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // ── popover open state ─────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const searchInputRef = useRef<HTMLInputElement | null>(null)\n const typeahead = useRef({ buffer: '', timer: 0 })\n // stable handle to the form field's blur (touched) callback — field() returns a fresh object each render\n const fieldBlur = useRef<(() => void) | undefined>(undefined)\n fieldBlur.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n\n const setTriggerRef = useCallback(\n (node: HTMLDivElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n },\n [ref],\n )\n\n // options shown right now. When `onSearchChange` is set the consumer owns `options` (server-side\n // search) — skip the built-in local filter; otherwise filter the given options by label.\n const filteredOptions = useMemo(() => {\n if (!searchable || onSearchChange || !searchQuery.trim()) return options\n const q = searchQuery.trim().toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(q))\n }, [searchable, onSearchChange, searchQuery, options])\n\n const findEnabled = useCallback(\n (start: number, delta: number) => {\n let i = start\n while (i >= 0 && i < filteredOptions.length) {\n if (!filteredOptions[i].disabled) return i\n i += delta\n }\n return -1\n },\n [filteredOptions],\n )\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n // single dismiss path: clears search + type-ahead buffer, marks the field touched, optionally refocuses\n const closeMenu = useCallback((refocus: boolean) => {\n setOpen(false)\n setSearchQuery('')\n window.clearTimeout(typeahead.current.timer)\n typeahead.current.buffer = ''\n fieldBlur.current?.()\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // on open: highlight the selected option (or first enabled), focus the search box if searchable\n useEffect(() => {\n if (!open) return\n const selIdx = filteredOptions.findIndex((o) => o.value === currentValue)\n setHighlightedIndex(\n selIdx >= 0 && !filteredOptions[selIdx].disabled ? selIdx : findEnabled(0, 1),\n )\n if (searchable) requestAnimationFrame(() => searchInputRef.current?.focus())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // keep the highlighted option scrolled into view\n useEffect(() => {\n if (!open || highlightedIndex < 0) return\n document.getElementById(optionId(highlightedIndex))?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, highlightedIndex])\n\n // when the search filter changes, re-anchor the highlight to the first match\n useEffect(() => {\n if (open && searchable) setHighlightedIndex(findEnabled(0, 1))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery])\n\n // if the option count changes while open (async load / list shrink), keep the highlight in range\n useEffect(() => {\n if (open) setHighlightedIndex((i) => (i < filteredOptions.length ? i : findEnabled(0, 1)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filteredOptions.length])\n\n const openMenu = () => {\n if (!disabled) setOpen(true)\n }\n const selectOption = (opt: SelectOption | undefined) => {\n if (!opt || opt.disabled) return\n commit(opt.value)\n closeMenu(true)\n }\n const moveHighlight = (delta: number) => {\n setHighlightedIndex((cur) => {\n const start = cur < 0 ? (delta > 0 ? 0 : filteredOptions.length - 1) : cur + delta\n const found = findEnabled(start, delta)\n return found === -1 ? cur : found\n })\n }\n\n // type-ahead (non-searchable): jump to the option whose label starts with the typed buffer\n const handleTypeahead = (char: string) => {\n const t = typeahead.current\n window.clearTimeout(t.timer)\n t.buffer += char.toLowerCase()\n t.timer = window.setTimeout(() => (t.buffer = ''), 500)\n const match = filteredOptions.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(t.buffer),\n )\n if (match >= 0) setHighlightedIndex(match)\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent) => {\n if (disabled) return\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n open ? moveHighlight(1) : openMenu()\n break\n case 'ArrowUp':\n event.preventDefault()\n open ? moveHighlight(-1) : openMenu()\n break\n case 'Enter':\n event.preventDefault()\n if (!open) openMenu()\n else selectOption(filteredOptions[highlightedIndex])\n break\n case ' ':\n // Space opens a closed menu (any mode); selects only when open & not searchable\n // (so a focused search box can still type spaces)\n if (!open) {\n event.preventDefault()\n openMenu()\n } else if (!searchable) {\n event.preventDefault()\n selectOption(filteredOptions[highlightedIndex])\n }\n break\n case 'Escape':\n if (open) {\n event.preventDefault()\n event.stopPropagation() // don't let FloatingPanel's own Escape also fire closeMenu/onBlur\n closeMenu(true)\n }\n break\n case 'Tab':\n // refocus the trigger so Tab continues from the field's visual location, not the portaled\n // search input's DOM position (end of <body>); don't preventDefault — let Tab move on\n if (open) closeMenu(true)\n break\n case 'Home':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(0, 1))\n }\n break\n case 'End':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(filteredOptions.length - 1, -1))\n }\n break\n default:\n if (\n !searchable &&\n open &&\n event.key.length === 1 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey\n ) {\n handleTypeahead(event.key)\n }\n }\n }\n\n const handleTriggerBlur = (event: FocusEvent<HTMLDivElement>) => {\n // mark the form field touched only when focus leaves the whole widget (not into the popover)\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n const handleClear = (event: ReactMouseEvent) => {\n event.stopPropagation()\n commit('')\n triggerRef.current?.focus()\n }\n\n const activeId = open && highlightedIndex >= 0 ? optionId(highlightedIndex) : undefined\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n // chevron size per field size: sm 16 · md 14 · lg 12\n const chevronPx = size === 'sm' ? 16 : size === 'md' ? 14 : 12\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <span\n id={labelId}\n className={styles.label}\n onClick={() => !disabled && triggerRef.current?.focus()}\n >\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n <div\n ref={setTriggerRef}\n id={id}\n // `name` lets the form's scroll-to-error find + focus this field\n {...(name ? { name } : {})}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={searchable ? undefined : activeId}\n aria-labelledby={label != null ? labelId : undefined}\n aria-disabled={disabled || undefined}\n aria-required={required || undefined}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n className={clsx(styles.control, open && styles.open)}\n onClick={() => (open ? closeMenu(false) : openMenu())}\n onKeyDown={handleKeyDown}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !hasValue && styles.placeholder)}>\n {selected?.icon != null && (\n <span className={styles.valueIcon}>{renderIcon(selected.icon, iconSize)}</span>\n )}\n <span className={styles.valueLabel}>\n {selected ? selected.label : (placeholder ?? t('select.placeholder'))}\n </span>\n </span>\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('select.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <Icon\n name=\"ArrowDown4\"\n className={styles.chevron}\n style={{ width: chevronPx, height: chevronPx }}\n aria-hidden=\"true\"\n />\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closeMenu}\n matchTriggerWidth\n className={styles.popover}\n >\n {searchable && (\n <div className={styles.search}>\n <Icon name=\"SearchNormal\" size=\"sm\" className={styles.searchIcon} aria-hidden=\"true\" />\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={searchPh}\n placeholder={searchPh}\n value={searchQuery}\n spellCheck={false}\n onChange={(e) => {\n setSearchQuery(e.target.value)\n onSearchChange?.(e.target.value)\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n )}\n\n {/* the listbox always carries `listboxId` (even when empty) so aria-controls never dangles */}\n <List\n role=\"listbox\"\n id={listboxId}\n aria-labelledby={label != null ? labelId : undefined}\n size={size}\n className={styles.listbox}\n // clear the mouse highlight when the pointer leaves the list (no lingering hover)\n onMouseLeave={() => setHighlightedIndex(-1)}\n >\n {loading ? (\n <div className={styles.loading}>\n <Loader size=\"sm\" />\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {loadingText ?? t('common.loading')}\n </Typography>\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className={styles.noOptions}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {noOptionsText == null\n ? t('select.noOptions')\n : typeof noOptionsText === 'function'\n ? noOptionsText(searchQuery)\n : noOptionsText}\n </Typography>\n </div>\n ) : (\n filteredOptions.map((opt, index) => {\n const isSelected = opt.value === currentValue\n return (\n <ListItem\n key={opt.value}\n id={optionId(index)}\n role=\"option\"\n tabIndex={-1}\n aria-selected={isSelected}\n aria-current={undefined}\n clickable\n selected={isSelected}\n disabled={opt.disabled}\n icon={opt.icon}\n className={clsx(index === highlightedIndex && styles.active)}\n trailing={\n isSelected && showSelectedTick ? (\n <Icon name=\"TickCircle\" size=\"sm\" />\n ) : undefined\n }\n onMouseEnter={() => !opt.disabled && setHighlightedIndex(index)}\n onClick={() => selectOption(opt)}\n >\n {opt.label}\n </ListItem>\n )\n })\n )}\n </List>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","renderIcon","icon","size","jsx","Icon","Select","forwardRef","label","options","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","placeholder","clearable","searchable","searchPlaceholder","onSearchChange","loading","loadingText","noOptionsText","showSelectedTick","name","idProp","className","style","ref","reactId","useId","id","labelId","listboxId","helperId","optionId","index","t","useT","searchPh","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","resolvedError","resolvedHelperText","selected","o","hasValue","commit","next","triggerRef","useRef","searchInputRef","typeahead","fieldBlur","open","setOpen","searchQuery","setSearchQuery","highlightedIndex","setHighlightedIndex","setTriggerRef","useCallback","node","filteredOptions","useMemo","q","findEnabled","start","delta","i","popoverRef","closeMenu","refocus","_a","_b","useEffect","selIdx","openMenu","selectOption","opt","moveHighlight","cur","found","handleTypeahead","char","match","handleKeyDown","event","handleTriggerBlur","handleClear","activeId","iconSize","chevronPx","jsxs","clsx","styles","Typography","FloatingPanel","List","Loader","isSelected","ListItem"],"mappings":"+xCAyBMA,GAAgB,IAAI,IAAYC,aAAU,EAiBhD,SAASC,GAAWC,EAA4BC,EAA8B,CAC5E,OAAID,GAAQ,KAAa,KACrB,OAAOA,GAAS,UAAYH,GAAc,IAAIG,CAAI,EAC7CE,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAMH,EAAkB,KAAAC,CAAA,CAAY,EAC5CD,CACT,CAyEO,MAAMI,GAASC,EAAAA,WAAwC,SAC5D,CACE,MAAAC,EACA,QAAAC,EACA,KAAAN,EAAO,KACP,MAAAO,GACA,WAAAC,GACA,SAAAC,EAAW,GACX,UAAAC,GAAY,GACZ,SAAAC,EAAW,GACX,MAAAC,EACA,aAAAC,GACA,SAAAC,EACA,YAAAC,GACA,UAAAC,GAAY,GACZ,WAAAC,EAAa,GACb,kBAAAC,GACA,eAAAC,EACA,QAAAC,GAAU,GACV,YAAAC,GACA,cAAAC,EACA,iBAAAC,GAAmB,GACnB,KAAAC,EACA,GAAIC,GACJ,UAAAC,GACA,MAAAC,EACF,EACAC,EACA,CACA,MAAMC,GAAUC,EAAAA,MAAA,EACVC,EAAKN,IAAUI,GACfG,EAAU,GAAGD,CAAE,SACfE,EAAY,GAAGF,CAAE,WACjBG,EAAW,GAAGH,CAAE,UAChBI,EAAYC,GAAkB,GAAGL,CAAE,QAAQK,CAAK,GAEhDC,EAAIC,GAAAA,KAAA,EACJC,EAAWrB,IAAqBmB,EAAE,eAAe,EAGjDG,EAAOC,GAAAA,eAAA,EACPC,EAAc,GAAQF,GAAQhB,GAC9BmB,EAAQD,EAAcF,EAAM,MAAMhB,CAAK,EAAI,OAC3CoB,GACJhC,IAAU,OACNA,EACA8B,EACIF,EAAM,OAAOhB,CAAK,GAA4B,GAChD,OACFqB,EAAejC,IAAU,QAAa8B,EACtC,CAACI,GAAUC,EAAW,EAAIC,EAAAA,SAAiBnC,IAAgB,EAAE,EAC7DoC,EAAeJ,EAAeD,GAAiBE,GAE/CI,EAAgB3C,KAASoC,GAAA,YAAAA,EAAO,QAAS,GACzCQ,EAAqB3C,KAAcmC,GAAA,YAAAA,EAAO,YAE1CS,EAAW9C,EAAQ,KAAM+C,GAAMA,EAAE,QAAUJ,CAAY,EACvDK,GAAWF,GAAY,KAEvBG,EAAUC,GAAiB,CAC1BX,GAAcE,GAAYS,CAAI,EAC/Bd,GAAaF,EAAM,SAAShB,EAAOgC,CAAI,EAC3C1C,GAAA,MAAAA,EAAW0C,EACb,EAGMC,EAAaC,EAAAA,OAA8B,IAAI,EAC/CC,EAAiBD,EAAAA,OAAgC,IAAI,EACrDE,EAAYF,EAAAA,OAAO,CAAE,OAAQ,GAAI,MAAO,EAAG,EAE3CG,EAAYH,EAAAA,OAAiC,MAAS,EAC5DG,EAAU,QAAUlB,EAAQ,IAAMA,EAAM,OAAO,CAAA,CAAkC,EAAI,OACrF,KAAM,CAACmB,EAAMC,CAAO,EAAIf,EAAAA,SAAS,EAAK,EAChC,CAACgB,EAAaC,CAAc,EAAIjB,EAAAA,SAAS,EAAE,EAC3C,CAACkB,EAAkBC,CAAmB,EAAInB,EAAAA,SAAS,EAAE,EAErDoB,GAAgBC,EAAAA,YACnBC,GAAgC,CAC/Bb,EAAW,QAAUa,EACjB,OAAO1C,GAAQ,WAAYA,EAAI0C,CAAI,EAC9B1C,IAAMA,EAA2C,QAAU0C,EACtE,EACA,CAAC1C,CAAG,CAAA,EAKA2C,EAAkBC,EAAAA,QAAQ,IAAM,CACpC,GAAI,CAACvD,GAAcE,GAAkB,CAAC6C,EAAY,KAAA,EAAQ,OAAO1D,EACjE,MAAMmE,EAAIT,EAAY,KAAA,EAAO,YAAA,EAC7B,OAAO1D,EAAQ,OAAQ+C,GAAMA,EAAE,MAAM,YAAA,EAAc,SAASoB,CAAC,CAAC,CAChE,EAAG,CAACxD,EAAYE,EAAgB6C,EAAa1D,CAAO,CAAC,EAE/CoE,EAAcL,EAAAA,YAClB,CAACM,EAAeC,IAAkB,CAChC,IAAIC,EAAIF,EACR,KAAOE,GAAK,GAAKA,EAAIN,EAAgB,QAAQ,CAC3C,GAAI,CAACA,EAAgBM,CAAC,EAAE,SAAU,OAAOA,EACzCA,GAAKD,CACP,CACA,MAAO,EACT,EACA,CAACL,CAAe,CAAA,EAIZO,GAAapB,EAAAA,OAA8B,IAAI,EAG/CqB,EAAYV,cAAaW,GAAqB,SAClDjB,EAAQ,EAAK,EACbE,EAAe,EAAE,EACjB,OAAO,aAAaL,EAAU,QAAQ,KAAK,EAC3CA,EAAU,QAAQ,OAAS,IAC3BqB,EAAApB,EAAU,UAAV,MAAAoB,EAAA,KAAApB,GACImB,KAASE,EAAAzB,EAAW,UAAX,MAAAyB,EAAoB,QACnC,EAAG,CAAA,CAAE,EAGLC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACrB,EAAM,OACX,MAAMsB,EAASb,EAAgB,UAAWlB,GAAMA,EAAE,QAAUJ,CAAY,EACxEkB,EACEiB,GAAU,GAAK,CAACb,EAAgBa,CAAM,EAAE,SAAWA,EAASV,EAAY,EAAG,CAAC,CAAA,EAE1EzD,GAAY,sBAAsB,IAAA,OAAM,OAAAgE,EAAAtB,EAAe,UAAf,YAAAsB,EAAwB,QAAO,CAE7E,EAAG,CAACnB,CAAI,CAAC,EAGTqB,EAAAA,UAAU,IAAM,SACV,CAACrB,GAAQI,EAAmB,IAChCgB,GAAAD,EAAA,SAAS,eAAe9C,EAAS+B,CAAgB,CAAC,IAAlD,YAAAe,EAAqD,iBAArD,MAAAC,EAAA,KAAAD,EAAsE,CAAE,MAAO,WAEjF,EAAG,CAACnB,EAAMI,CAAgB,CAAC,EAG3BiB,EAAAA,UAAU,IAAM,CACVrB,GAAQ7C,GAAYkD,EAAoBO,EAAY,EAAG,CAAC,CAAC,CAE/D,EAAG,CAACV,CAAW,CAAC,EAGhBmB,EAAAA,UAAU,IAAM,CACVrB,GAAMK,EAAqBU,GAAOA,EAAIN,EAAgB,OAASM,EAAIH,EAAY,EAAG,CAAC,CAAE,CAE3F,EAAG,CAACH,EAAgB,MAAM,CAAC,EAE3B,MAAMc,EAAW,IAAM,CAChB1E,GAAUoD,EAAQ,EAAI,CAC7B,EACMuB,EAAgBC,GAAkC,CAClD,CAACA,GAAOA,EAAI,WAChBhC,EAAOgC,EAAI,KAAK,EAChBR,EAAU,EAAI,EAChB,EACMS,GAAiBZ,GAAkB,CACvCT,EAAqBsB,GAAQ,CAC3B,MAAMd,EAAQc,EAAM,EAAKb,EAAQ,EAAI,EAAIL,EAAgB,OAAS,EAAKkB,EAAMb,EACvEc,EAAQhB,EAAYC,EAAOC,CAAK,EACtC,OAAOc,IAAU,GAAKD,EAAMC,CAC9B,CAAC,CACH,EAGMC,GAAmBC,GAAiB,CACxC,MAAMvD,EAAIuB,EAAU,QACpB,OAAO,aAAavB,EAAE,KAAK,EAC3BA,EAAE,QAAUuD,EAAK,YAAA,EACjBvD,EAAE,MAAQ,OAAO,WAAW,IAAOA,EAAE,OAAS,GAAK,GAAG,EACtD,MAAMwD,EAAQtB,EAAgB,UAC3BlB,GAAM,CAACA,EAAE,UAAYA,EAAE,MAAM,YAAA,EAAc,WAAWhB,EAAE,MAAM,CAAA,EAE7DwD,GAAS,GAAG1B,EAAoB0B,CAAK,CAC3C,EAEMC,GAAiBC,GAA8B,CACnD,GAAI,CAAApF,EACJ,OAAQoF,EAAM,IAAA,CACZ,IAAK,YACHA,EAAM,eAAA,EACNjC,EAAO0B,GAAc,CAAC,EAAIH,EAAA,EAC1B,MACF,IAAK,UACHU,EAAM,eAAA,EACNjC,EAAO0B,GAAc,EAAE,EAAIH,EAAA,EAC3B,MACF,IAAK,QACHU,EAAM,eAAA,EACDjC,EACAwB,EAAaf,EAAgBL,CAAgB,CAAC,EADxCmB,EAAA,EAEX,MACF,IAAK,IAGEvB,EAGO7C,IACV8E,EAAM,eAAA,EACNT,EAAaf,EAAgBL,CAAgB,CAAC,IAJ9C6B,EAAM,eAAA,EACNV,EAAA,GAKF,MACF,IAAK,SACCvB,IACFiC,EAAM,eAAA,EACNA,EAAM,gBAAA,EACNhB,EAAU,EAAI,GAEhB,MACF,IAAK,MAGCjB,KAAgB,EAAI,EACxB,MACF,IAAK,OACCA,IACFiC,EAAM,eAAA,EACN5B,EAAoBO,EAAY,EAAG,CAAC,CAAC,GAEvC,MACF,IAAK,MACCZ,IACFiC,EAAM,eAAA,EACN5B,EAAoBO,EAAYH,EAAgB,OAAS,EAAG,EAAE,CAAC,GAEjE,MACF,QAEI,CAACtD,GACD6C,GACAiC,EAAM,IAAI,SAAW,GACrB,CAACA,EAAM,SACP,CAACA,EAAM,SACP,CAACA,EAAM,QAEPJ,GAAgBI,EAAM,GAAG,CAC3B,CAEN,EAEMC,GAAqBD,GAAsC,SAE/D,MAAMvC,EAAOuC,EAAM,cACfvC,KAASyB,EAAAH,GAAW,UAAX,MAAAG,EAAoB,SAASzB,KAAS0B,EAAAzB,EAAW,UAAX,MAAAyB,EAAoB,SAAS1B,KAChFb,GAAA,MAAAA,EAAO,OAAOoD,EAChB,EAEME,GAAeF,GAA2B,OAC9CA,EAAM,gBAAA,EACNxC,EAAO,EAAE,GACT0B,EAAAxB,EAAW,UAAX,MAAAwB,EAAoB,OACtB,EAEMiB,GAAWpC,GAAQI,GAAoB,EAAI/B,EAAS+B,CAAgB,EAAI,OACxEiC,GAAwBnG,IAAS,KAAO,KAAO,KAE/CoG,GAAYpG,IAAS,KAAO,GAAKA,IAAS,KAAO,GAAK,GAE5D,OACEqG,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,KACTC,EAAO,MACPA,EAAOvG,CAAI,EACXU,IAAa6F,EAAO,UACpBrD,GAAiBqD,EAAO,MACxB5F,GAAY4F,EAAO,SACnB7E,EAAA,EAEF,MAAAC,GAEC,SAAA,CAAAtB,GAAS,MACRgG,EAAAA,KAAC,OAAA,CACC,GAAIrE,EACJ,UAAWuE,EAAO,MAClB,QAAS,IAAA,OAAM,OAAC5F,KAAYsE,EAAAxB,EAAW,UAAX,YAAAwB,EAAoB,UAEhD,SAAA,CAAAhF,EAAAA,IAACuG,EAAAA,YAAW,GAAG,OAAO,QAAQ,YAAY,MAAM,QAC7C,SAAAnG,CAAA,CACH,EACCI,SACE,OAAA,CAAK,UAAW8F,EAAO,SAAU,cAAY,OAAO,SAAA,GAAA,CAErD,CAAA,CAAA,CAAA,EAKNF,EAAAA,KAAC,MAAA,CACC,IAAKjC,GACL,GAAArC,EAEC,GAAIP,EAAO,CAAE,KAAAA,CAAA,EAAS,CAAA,EACvB,KAAK,WACL,SAAUb,EAAW,GAAK,EAC1B,gBAAc,UACd,gBAAemD,EACf,gBAAeA,EAAO7B,EAAY,OAClC,wBAAuBhB,EAAa,OAAYiF,GAChD,kBAAiB7F,GAAS,KAAO2B,EAAU,OAC3C,gBAAerB,GAAY,OAC3B,gBAAeF,GAAY,OAC3B,eAAcyC,GAAiB,OAC/B,mBAAkBC,GAAsB,KAAOjB,EAAW,OAC1D,UAAWoE,EAAAA,KAAKC,EAAO,QAASzC,GAAQyC,EAAO,IAAI,EACnD,QAAS,IAAOzC,EAAOiB,EAAU,EAAK,EAAIM,EAAA,EAC1C,UAAWS,GACX,OAAQE,GAER,SAAA,CAAAK,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAAA,KAAKC,EAAO,MAAO,CAACjD,IAAYiD,EAAO,WAAW,EAChE,SAAA,EAAAnD,GAAA,YAAAA,EAAU,OAAQ,MACjBnD,EAAAA,IAAC,OAAA,CAAK,UAAWsG,EAAO,UAAY,SAAAzG,GAAWsD,EAAS,KAAM+C,EAAQ,CAAA,CAAE,EAE1ElG,EAAAA,IAAC,OAAA,CAAK,UAAWsG,EAAO,WACrB,SAAAnD,EAAWA,EAAS,MAASrC,IAAesB,EAAE,oBAAoB,CAAA,CACrE,CAAA,EACF,EAECrB,IAAaiC,IAAiB,IAAM,CAACtC,GACpCV,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAWsG,EAAO,MAClB,aAAYlE,EAAE,cAAc,EAC5B,SAAU,GACV,YAAc,GAAM,EAAE,eAAA,EACtB,QAAS4D,GAET,SAAAhG,EAAAA,IAACC,OAAA,CAAK,KAAK,cAAc,KAAK,IAAA,CAAK,CAAA,CAAA,EAIvCD,EAAAA,IAACC,EAAAA,KAAA,CACC,KAAK,aACL,UAAWqG,EAAO,QAClB,MAAO,CAAE,MAAOH,GAAW,OAAQA,EAAA,EACnC,cAAY,MAAA,CAAA,CACd,CAAA,CAAA,EAGFC,EAAAA,KAACI,GAAAA,cAAA,CACC,IAAK3B,GACL,KAAAhB,EACA,WAAAL,EACA,QAASsB,EACT,kBAAiB,GACjB,UAAWwB,EAAO,QAEjB,SAAA,CAAAtF,GACCoF,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,OACrB,SAAA,CAAAtG,EAAAA,IAACC,EAAAA,KAAA,CAAK,KAAK,eAAe,KAAK,KAAK,UAAWqG,EAAO,WAAY,cAAY,MAAA,CAAO,EACrFtG,EAAAA,IAAC,QAAA,CACC,IAAK0D,EACL,UAAW4C,EAAO,YAClB,KAAK,OACL,KAAK,WACL,gBAAc,OACd,gBAAetE,EACf,wBAAuBiE,GACvB,oBAAkB,OAClB,aAAY3D,EACZ,YAAaA,EACb,MAAOyB,EACP,WAAY,GACZ,SAAW,GAAM,CACfC,EAAe,EAAE,OAAO,KAAK,EAC7B9C,GAAA,MAAAA,EAAiB,EAAE,OAAO,MAC5B,EACA,UAAW2E,EAAA,CAAA,CACb,EACF,EAIF7F,EAAAA,IAACyG,GAAAA,KAAA,CACC,KAAK,UACL,GAAIzE,EACJ,kBAAiB5B,GAAS,KAAO2B,EAAU,OAC3C,KAAAhC,EACA,UAAWuG,EAAO,QAElB,aAAc,IAAMpC,EAAoB,EAAE,EAEzC,SAAA/C,GACCiF,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,QACrB,SAAA,CAAAtG,EAAAA,IAAC0G,GAAAA,OAAA,CAAO,KAAK,IAAA,CAAK,EAClB1G,EAAAA,IAACuG,EAAAA,WAAA,CAAW,GAAG,OAAO,QAAQ,YAAY,MAAM,QAC7C,SAAAnF,IAAegB,EAAE,gBAAgB,CAAA,CACpC,CAAA,CAAA,CACF,EACEkC,EAAgB,SAAW,QAC5B,MAAA,CAAI,UAAWgC,EAAO,UACrB,eAACC,aAAA,CAAW,GAAG,OAAO,QAAQ,YAAY,MAAM,QAC7C,SAAAlF,GAAiB,KACde,EAAE,kBAAkB,EACpB,OAAOf,GAAkB,WACvBA,EAAc0C,CAAW,EACzB1C,CAAA,CACR,EACF,EAEAiD,EAAgB,IAAI,CAACgB,EAAKnD,IAAU,CAClC,MAAMwE,EAAarB,EAAI,QAAUtC,EACjC,OACEhD,EAAAA,IAAC4G,GAAAA,SAAA,CAEC,GAAI1E,EAASC,CAAK,EAClB,KAAK,SACL,SAAU,GACV,gBAAewE,EACf,eAAc,OACd,UAAS,GACT,SAAUA,EACV,SAAUrB,EAAI,SACd,KAAMA,EAAI,KACV,UAAWe,EAAAA,KAAKlE,IAAU8B,GAAoBqC,EAAO,MAAM,EAC3D,SACEK,GAAcrF,GACZtB,EAAAA,IAACC,EAAAA,MAAK,KAAK,aAAa,KAAK,IAAA,CAAK,EAChC,OAEN,aAAc,IAAM,CAACqF,EAAI,UAAYpB,EAAoB/B,CAAK,EAC9D,QAAS,IAAMkD,EAAaC,CAAG,EAE9B,SAAAA,EAAI,KAAA,EAnBAA,EAAI,KAAA,CAsBf,CAAC,CAAA,CAAA,CAEL,CAAA,CAAA,EAGDpC,GAAsB,MACrBlD,EAAAA,IAACuG,EAAAA,WAAA,CACC,GAAG,OACH,GAAItE,EACJ,QAAQ,YACR,MAAOgB,EAAgB,QAAU,QACjC,UAAWqD,EAAO,OAEjB,SAAApD,CAAA,CAAA,CACH,CAAA,CAAA,CAIR,CAAC"}
|
|
@@ -3,13 +3,13 @@ import { forwardRef as Me, useId as Oe, useState as B, useRef as T, useCallback
|
|
|
3
3
|
import { clsx as R } from "clsx";
|
|
4
4
|
import { u as Ae } from "./formContext-B7ln1Miy.js";
|
|
5
5
|
import { F as Be } from "./FloatingPanel-BG9Uag__.js";
|
|
6
|
-
import { a as Ke } from "./names-
|
|
7
|
-
import { I as E } from "./Icon-
|
|
6
|
+
import { a as Ke } from "./names-r21QPjcU.js";
|
|
7
|
+
import { I as E } from "./Icon-DaTvzLBu.js";
|
|
8
8
|
import { L as Re } from "./List-LqbfF6gU.js";
|
|
9
|
-
import { L as We } from "./ListItem-
|
|
10
|
-
import { L as Fe } from "./Loader-
|
|
9
|
+
import { L as We } from "./ListItem-Cn15lJBr.js";
|
|
10
|
+
import { L as Fe } from "./Loader-WsjQFl4p.js";
|
|
11
11
|
import { T as W } from "./Typography-Cta6Rg4L.js";
|
|
12
|
-
import { a as Pe } from "./ConfigProvider-
|
|
12
|
+
import { a as Pe } from "./ConfigProvider-DT0yrgmd.js";
|
|
13
13
|
const Ve = "_field_17o9l_1", $e = "_fullWidth_17o9l_7", He = "_label_17o9l_13", je = "_required_17o9l_22", Qe = "_control_17o9l_28", ze = "_open_17o9l_47", Ue = "_error_17o9l_52", Ge = "_disabled_17o9l_60", Je = "_value_17o9l_70", Xe = "_valueIcon_17o9l_78", Ye = "_valueLabel_17o9l_82", Ze = "_placeholder_17o9l_87", eo = "_clear_17o9l_92", oo = "_chevron_17o9l_111", lo = "_sm_17o9l_121", ro = "_md_17o9l_125", to = "_lg_17o9l_129", ao = "_helper_17o9l_134", no = "_popover_17o9l_139", so = "_search_17o9l_147", co = "_searchIcon_17o9l_156", io = "_searchInput_17o9l_160", uo = "_listbox_17o9l_176", fo = "_active_17o9l_184", mo = "_noOptions_17o9l_188", po = "_loading_17o9l_194", l = {
|
|
14
14
|
field: Ve,
|
|
15
15
|
fullWidth: $e,
|
|
@@ -335,4 +335,4 @@ const Eo = Me(function({
|
|
|
335
335
|
export {
|
|
336
336
|
Eo as S
|
|
337
337
|
};
|
|
338
|
-
//# sourceMappingURL=Select-
|
|
338
|
+
//# sourceMappingURL=Select-vKZzS9K4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select-UygxT1Ry.js","sources":["../src/components/Select/Select.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { List, ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { Typography } from '../Typography'\nimport styles from './Select.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\n\n/** A single selectable option. */\nexport interface SelectOption {\n /** The value committed when this option is chosen. */\n value: string\n /** Display + search text. */\n label: string\n /** Greys out and blocks selecting this option. */\n disabled?: boolean\n /** Leading icon — a known `IconName` (rendered as `<Icon>`) or any node. */\n icon?: IconName | ReactNode\n}\n\n/** Renders an option's icon (an `IconName` becomes an `<Icon>`; anything else is used as-is). */\nfunction renderIcon(icon: IconName | ReactNode, size: 'sm' | 'md'): ReactNode {\n if (icon == null) return null\n if (typeof icon === 'string' && ICON_NAME_SET.has(icon))\n return <Icon name={icon as IconName} size={size} />\n return icon\n}\n\nexport interface SelectProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** The selectable options. */\n options: SelectOption[]\n /** Preset size — control height, font and option density. */\n size?: SelectSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — the chosen option's `value` (`''` = nothing selected). */\n value?: string\n /** Initial value for uncontrolled use. */\n defaultValue?: string\n /** Fires with the next value (`''` when cleared). */\n onChange?: (value: string) => void\n /** Text shown in the trigger when nothing is selected. Defaults to `\"Select…\"`. */\n placeholder?: string\n /** Shows a clear (×) button in the trigger when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Adds a search box inside the popover that filters options by label. */\n searchable?: boolean\n /** Placeholder for the search box. Defaults to `\"Search…\"`. */\n searchPlaceholder?: string\n /**\n * Fires with the search query as the user types. **Providing this switches off the built-in\n * local filtering** — you own `options` (e.g. fetch them from a server for the current query).\n */\n onSearchChange?: (query: string) => void\n /** Shows a loading indicator in the popover (e.g. while fetching server-side search results). */\n loading?: boolean\n /** Text shown next to the loader while `loading`. Defaults to `\"Loading…\"`. */\n loadingText?: ReactNode\n /**\n * Shown in the popover when no option matches. Defaults to `\"No options\"`. Pass a function\n * `(query) => node` to vary the message by the current search text — e.g. a \"Type to search\" hint\n * while it's empty vs a \"No results\" message after typing.\n */\n noOptionsText?: ReactNode | ((query: string) => ReactNode)\n /** Show the trailing tick on the selected option. Defaults to `true` (the row still gets its tint). */\n showSelectedTick?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the option's `value`). */\n name?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A labeled single-select. The trigger reuses TextField-style chrome (label, helper/error, sizes,\n * `required`, `fullWidth`, `disabled`); clicking it opens a `Dropdown`-style popover — portaled to\n * `<body>`, opening below (flipping above only when it would overflow), locking page scroll,\n * re-positioning on scroll/resize, matching the trigger width, and entering with the shared\n * opacity + translate animation. Options render as `ListItem`s in a `role=\"listbox\"`; the chosen\n * option is highlighted with a tick, disabled options are inert. Full keyboard support\n * (Arrow/Home/End to move, Enter/Space to select, Escape to close, type-ahead) and ARIA\n * (`listbox`/`option`, `aria-activedescendant`, `aria-expanded`). Optionally `searchable` (a filter\n * box) and `clearable` (a × to reset); pass `onSearchChange` to drive the search **server-side** (the\n * consumer owns `options` for the current query — local filtering is skipped) with a `loading`\n * indicator. Controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`), and binds to a surrounding `<Form>` by `name` (value = the option's `value`;\n * validate with e.g. `z.string().min(1, 'Required')`). Token-only styling.\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(function Select(\n {\n label,\n options,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n placeholder,\n clearable = true,\n searchable = false,\n searchPlaceholder,\n onSearchChange,\n loading = false,\n loadingText,\n noOptionsText,\n showSelectedTick = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const reactId = useId()\n const id = idProp ?? reactId\n const labelId = `${id}-label`\n const listboxId = `${id}-listbox`\n const helperId = `${id}-helper`\n const optionId = (index: number) => `${id}-opt-${index}`\n\n const t = useT()\n const searchPh = searchPlaceholder ?? t('common.search')\n\n // ── value (controlled / form-bound / uncontrolled) ─────────────────────────────────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const selected = options.find((o) => o.value === currentValue)\n const hasValue = selected != null\n\n const commit = (next: string) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // ── popover open state ─────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const searchInputRef = useRef<HTMLInputElement | null>(null)\n const typeahead = useRef({ buffer: '', timer: 0 })\n // stable handle to the form field's blur (touched) callback — field() returns a fresh object each render\n const fieldBlur = useRef<(() => void) | undefined>(undefined)\n fieldBlur.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n\n const setTriggerRef = useCallback(\n (node: HTMLDivElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n },\n [ref],\n )\n\n // options shown right now. When `onSearchChange` is set the consumer owns `options` (server-side\n // search) — skip the built-in local filter; otherwise filter the given options by label.\n const filteredOptions = useMemo(() => {\n if (!searchable || onSearchChange || !searchQuery.trim()) return options\n const q = searchQuery.trim().toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(q))\n }, [searchable, onSearchChange, searchQuery, options])\n\n const findEnabled = useCallback(\n (start: number, delta: number) => {\n let i = start\n while (i >= 0 && i < filteredOptions.length) {\n if (!filteredOptions[i].disabled) return i\n i += delta\n }\n return -1\n },\n [filteredOptions],\n )\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n // single dismiss path: clears search + type-ahead buffer, marks the field touched, optionally refocuses\n const closeMenu = useCallback((refocus: boolean) => {\n setOpen(false)\n setSearchQuery('')\n window.clearTimeout(typeahead.current.timer)\n typeahead.current.buffer = ''\n fieldBlur.current?.()\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // on open: highlight the selected option (or first enabled), focus the search box if searchable\n useEffect(() => {\n if (!open) return\n const selIdx = filteredOptions.findIndex((o) => o.value === currentValue)\n setHighlightedIndex(\n selIdx >= 0 && !filteredOptions[selIdx].disabled ? selIdx : findEnabled(0, 1),\n )\n if (searchable) requestAnimationFrame(() => searchInputRef.current?.focus())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // keep the highlighted option scrolled into view\n useEffect(() => {\n if (!open || highlightedIndex < 0) return\n document.getElementById(optionId(highlightedIndex))?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, highlightedIndex])\n\n // when the search filter changes, re-anchor the highlight to the first match\n useEffect(() => {\n if (open && searchable) setHighlightedIndex(findEnabled(0, 1))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery])\n\n // if the option count changes while open (async load / list shrink), keep the highlight in range\n useEffect(() => {\n if (open) setHighlightedIndex((i) => (i < filteredOptions.length ? i : findEnabled(0, 1)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filteredOptions.length])\n\n const openMenu = () => {\n if (!disabled) setOpen(true)\n }\n const selectOption = (opt: SelectOption | undefined) => {\n if (!opt || opt.disabled) return\n commit(opt.value)\n closeMenu(true)\n }\n const moveHighlight = (delta: number) => {\n setHighlightedIndex((cur) => {\n const start = cur < 0 ? (delta > 0 ? 0 : filteredOptions.length - 1) : cur + delta\n const found = findEnabled(start, delta)\n return found === -1 ? cur : found\n })\n }\n\n // type-ahead (non-searchable): jump to the option whose label starts with the typed buffer\n const handleTypeahead = (char: string) => {\n const t = typeahead.current\n window.clearTimeout(t.timer)\n t.buffer += char.toLowerCase()\n t.timer = window.setTimeout(() => (t.buffer = ''), 500)\n const match = filteredOptions.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(t.buffer),\n )\n if (match >= 0) setHighlightedIndex(match)\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent) => {\n if (disabled) return\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n open ? moveHighlight(1) : openMenu()\n break\n case 'ArrowUp':\n event.preventDefault()\n open ? moveHighlight(-1) : openMenu()\n break\n case 'Enter':\n event.preventDefault()\n if (!open) openMenu()\n else selectOption(filteredOptions[highlightedIndex])\n break\n case ' ':\n // Space opens a closed menu (any mode); selects only when open & not searchable\n // (so a focused search box can still type spaces)\n if (!open) {\n event.preventDefault()\n openMenu()\n } else if (!searchable) {\n event.preventDefault()\n selectOption(filteredOptions[highlightedIndex])\n }\n break\n case 'Escape':\n if (open) {\n event.preventDefault()\n event.stopPropagation() // don't let FloatingPanel's own Escape also fire closeMenu/onBlur\n closeMenu(true)\n }\n break\n case 'Tab':\n // refocus the trigger so Tab continues from the field's visual location, not the portaled\n // search input's DOM position (end of <body>); don't preventDefault — let Tab move on\n if (open) closeMenu(true)\n break\n case 'Home':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(0, 1))\n }\n break\n case 'End':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(filteredOptions.length - 1, -1))\n }\n break\n default:\n if (\n !searchable &&\n open &&\n event.key.length === 1 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey\n ) {\n handleTypeahead(event.key)\n }\n }\n }\n\n const handleTriggerBlur = (event: FocusEvent<HTMLDivElement>) => {\n // mark the form field touched only when focus leaves the whole widget (not into the popover)\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n const handleClear = (event: ReactMouseEvent) => {\n event.stopPropagation()\n commit('')\n triggerRef.current?.focus()\n }\n\n const activeId = open && highlightedIndex >= 0 ? optionId(highlightedIndex) : undefined\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n // chevron size per field size: sm 16 · md 14 · lg 12\n const chevronPx = size === 'sm' ? 16 : size === 'md' ? 14 : 12\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <span\n id={labelId}\n className={styles.label}\n onClick={() => !disabled && triggerRef.current?.focus()}\n >\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n <div\n ref={setTriggerRef}\n id={id}\n // `name` lets the form's scroll-to-error find + focus this field\n {...(name ? { name } : {})}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={searchable ? undefined : activeId}\n aria-labelledby={label != null ? labelId : undefined}\n aria-disabled={disabled || undefined}\n aria-required={required || undefined}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n className={clsx(styles.control, open && styles.open)}\n onClick={() => (open ? closeMenu(false) : openMenu())}\n onKeyDown={handleKeyDown}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !hasValue && styles.placeholder)}>\n {selected?.icon != null && (\n <span className={styles.valueIcon}>{renderIcon(selected.icon, iconSize)}</span>\n )}\n <span className={styles.valueLabel}>\n {selected ? selected.label : (placeholder ?? t('select.placeholder'))}\n </span>\n </span>\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('select.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <Icon\n name=\"ArrowDown4\"\n className={styles.chevron}\n style={{ width: chevronPx, height: chevronPx }}\n aria-hidden=\"true\"\n />\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closeMenu}\n matchTriggerWidth\n className={styles.popover}\n >\n {searchable && (\n <div className={styles.search}>\n <Icon name=\"SearchNormal\" size=\"sm\" className={styles.searchIcon} aria-hidden=\"true\" />\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={searchPh}\n placeholder={searchPh}\n value={searchQuery}\n spellCheck={false}\n onChange={(e) => {\n setSearchQuery(e.target.value)\n onSearchChange?.(e.target.value)\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n )}\n\n {/* the listbox always carries `listboxId` (even when empty) so aria-controls never dangles */}\n <List\n role=\"listbox\"\n id={listboxId}\n aria-labelledby={label != null ? labelId : undefined}\n size={size}\n className={styles.listbox}\n // clear the mouse highlight when the pointer leaves the list (no lingering hover)\n onMouseLeave={() => setHighlightedIndex(-1)}\n >\n {loading ? (\n <div className={styles.loading}>\n <Loader size=\"sm\" />\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {loadingText ?? t('common.loading')}\n </Typography>\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className={styles.noOptions}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {noOptionsText == null\n ? t('select.noOptions')\n : typeof noOptionsText === 'function'\n ? noOptionsText(searchQuery)\n : noOptionsText}\n </Typography>\n </div>\n ) : (\n filteredOptions.map((opt, index) => {\n const isSelected = opt.value === currentValue\n return (\n <ListItem\n key={opt.value}\n id={optionId(index)}\n role=\"option\"\n tabIndex={-1}\n aria-selected={isSelected}\n aria-current={undefined}\n clickable\n selected={isSelected}\n disabled={opt.disabled}\n icon={opt.icon}\n className={clsx(index === highlightedIndex && styles.active)}\n trailing={\n isSelected && showSelectedTick ? (\n <Icon name=\"TickCircle\" size=\"sm\" />\n ) : undefined\n }\n onMouseEnter={() => !opt.disabled && setHighlightedIndex(index)}\n onClick={() => selectOption(opt)}\n >\n {opt.label}\n </ListItem>\n )\n })\n )}\n </List>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","renderIcon","icon","size","jsx","Icon","Select","forwardRef","label","options","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","placeholder","clearable","searchable","searchPlaceholder","onSearchChange","loading","loadingText","noOptionsText","showSelectedTick","name","idProp","className","style","ref","reactId","useId","id","labelId","listboxId","helperId","optionId","index","t","useT","searchPh","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","resolvedError","resolvedHelperText","selected","o","hasValue","commit","next","triggerRef","useRef","searchInputRef","typeahead","fieldBlur","open","setOpen","searchQuery","setSearchQuery","highlightedIndex","setHighlightedIndex","setTriggerRef","useCallback","node","filteredOptions","useMemo","q","findEnabled","start","delta","i","popoverRef","closeMenu","refocus","_a","_b","useEffect","selIdx","openMenu","selectOption","opt","moveHighlight","cur","found","handleTypeahead","char","match","handleKeyDown","event","handleTriggerBlur","handleClear","activeId","iconSize","chevronPx","jsxs","clsx","styles","Typography","FloatingPanel","List","Loader","isSelected","ListItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select-vKZzS9K4.js","sources":["../src/components/Select/Select.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { FloatingPanel } from '../FloatingPanel/FloatingPanel'\nimport { ICON_NAMES, type IconName } from '../../icons/names'\nimport { Icon } from '../Icon'\nimport { List, ListItem } from '../List'\nimport { Loader } from '../Loader'\nimport { Typography } from '../Typography'\nimport styles from './Select.module.css'\n\nconst ICON_NAME_SET = new Set<string>(ICON_NAMES)\n\nexport type SelectSize = 'sm' | 'md' | 'lg'\n\n/** A single selectable option. */\nexport interface SelectOption {\n /** The value committed when this option is chosen. */\n value: string\n /** Display + search text. */\n label: string\n /** Greys out and blocks selecting this option. */\n disabled?: boolean\n /** Leading icon — a known `IconName` (rendered as `<Icon>`) or any node. */\n icon?: IconName | ReactNode\n}\n\n/** Renders an option's icon (an `IconName` becomes an `<Icon>`; anything else is used as-is). */\nfunction renderIcon(icon: IconName | ReactNode, size: 'sm' | 'md'): ReactNode {\n if (icon == null) return null\n if (typeof icon === 'string' && ICON_NAME_SET.has(icon))\n return <Icon name={icon as IconName} size={size} />\n return icon\n}\n\nexport interface SelectProps {\n /** Label rendered above the field. */\n label?: ReactNode\n /** The selectable options. */\n options: SelectOption[]\n /** Preset size — control height, font and option density. */\n size?: SelectSize\n /** Marks the field invalid: red border/ring + the `helperText` in the error color. */\n error?: boolean\n /** Helper / validation text under the field. Adopts the error color while `error`. */\n helperText?: ReactNode\n /** Adds a red asterisk after the label. */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /** Disables the field. */\n disabled?: boolean\n /** Controlled value — the chosen option's `value` (`''` = nothing selected). */\n value?: string\n /** Initial value for uncontrolled use. */\n defaultValue?: string\n /** Fires with the next value (`''` when cleared). */\n onChange?: (value: string) => void\n /** Text shown in the trigger when nothing is selected. Defaults to `\"Select…\"`. */\n placeholder?: string\n /** Shows a clear (×) button in the trigger when a value is set. Defaults to `true`. */\n clearable?: boolean\n /** Adds a search box inside the popover that filters options by label. */\n searchable?: boolean\n /** Placeholder for the search box. Defaults to `\"Search…\"`. */\n searchPlaceholder?: string\n /**\n * Fires with the search query as the user types. **Providing this switches off the built-in\n * local filtering** — you own `options` (e.g. fetch them from a server for the current query).\n */\n onSearchChange?: (query: string) => void\n /** Shows a loading indicator in the popover (e.g. while fetching server-side search results). */\n loading?: boolean\n /** Text shown next to the loader while `loading`. Defaults to `\"Loading…\"`. */\n loadingText?: ReactNode\n /**\n * Shown in the popover when no option matches. Defaults to `\"No options\"`. Pass a function\n * `(query) => node` to vary the message by the current search text — e.g. a \"Type to search\" hint\n * while it's empty vs a \"No results\" message after typing.\n */\n noOptionsText?: ReactNode | ((query: string) => ReactNode)\n /** Show the trailing tick on the selected option. Defaults to `true` (the row still gets its tint). */\n showSelectedTick?: boolean\n /** Form field name — auto-binds to a surrounding `<Form>` (value is the option's `value`). */\n name?: string\n /** Id for the trigger (label association). */\n id?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * A labeled single-select. The trigger reuses TextField-style chrome (label, helper/error, sizes,\n * `required`, `fullWidth`, `disabled`); clicking it opens a `Dropdown`-style popover — portaled to\n * `<body>`, opening below (flipping above only when it would overflow), locking page scroll,\n * re-positioning on scroll/resize, matching the trigger width, and entering with the shared\n * opacity + translate animation. Options render as `ListItem`s in a `role=\"listbox\"`; the chosen\n * option is highlighted with a tick, disabled options are inert. Full keyboard support\n * (Arrow/Home/End to move, Enter/Space to select, Escape to close, type-ahead) and ARIA\n * (`listbox`/`option`, `aria-activedescendant`, `aria-expanded`). Optionally `searchable` (a filter\n * box) and `clearable` (a × to reset); pass `onSearchChange` to drive the search **server-side** (the\n * consumer owns `options` for the current query — local filtering is skipped) with a `loading`\n * indicator. Controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`), and binds to a surrounding `<Form>` by `name` (value = the option's `value`;\n * validate with e.g. `z.string().min(1, 'Required')`). Token-only styling.\n */\nexport const Select = forwardRef<HTMLDivElement, SelectProps>(function Select(\n {\n label,\n options,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n disabled = false,\n value,\n defaultValue,\n onChange,\n placeholder,\n clearable = true,\n searchable = false,\n searchPlaceholder,\n onSearchChange,\n loading = false,\n loadingText,\n noOptionsText,\n showSelectedTick = true,\n name,\n id: idProp,\n className,\n style,\n },\n ref,\n) {\n const reactId = useId()\n const id = idProp ?? reactId\n const labelId = `${id}-label`\n const listboxId = `${id}-listbox`\n const helperId = `${id}-helper`\n const optionId = (index: number) => `${id}-opt-${index}`\n\n const t = useT()\n const searchPh = searchPlaceholder ?? t('common.search')\n\n // ── value (controlled / form-bound / uncontrolled) ─────────────────────────────────────────────\n const form = useFormContext()\n const isFormBound = Boolean(form && name)\n const bound = isFormBound ? form!.field(name!) : undefined\n const externalValue =\n value !== undefined\n ? value\n : isFormBound\n ? ((form!.values[name!] as string | undefined) ?? '')\n : undefined\n const isControlled = value !== undefined || isFormBound\n const [internal, setInternal] = useState<string>(defaultValue ?? '')\n const currentValue = isControlled ? externalValue! : internal\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const selected = options.find((o) => o.value === currentValue)\n const hasValue = selected != null\n\n const commit = (next: string) => {\n if (!isControlled) setInternal(next)\n if (isFormBound) form!.setValue(name!, next)\n onChange?.(next)\n }\n\n // ── popover open state ─────────────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const searchInputRef = useRef<HTMLInputElement | null>(null)\n const typeahead = useRef({ buffer: '', timer: 0 })\n // stable handle to the form field's blur (touched) callback — field() returns a fresh object each render\n const fieldBlur = useRef<(() => void) | undefined>(undefined)\n fieldBlur.current = bound ? () => bound.onBlur({} as FocusEvent<HTMLInputElement>) : undefined\n const [open, setOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n\n const setTriggerRef = useCallback(\n (node: HTMLDivElement | null) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node\n },\n [ref],\n )\n\n // options shown right now. When `onSearchChange` is set the consumer owns `options` (server-side\n // search) — skip the built-in local filter; otherwise filter the given options by label.\n const filteredOptions = useMemo(() => {\n if (!searchable || onSearchChange || !searchQuery.trim()) return options\n const q = searchQuery.trim().toLowerCase()\n return options.filter((o) => o.label.toLowerCase().includes(q))\n }, [searchable, onSearchChange, searchQuery, options])\n\n const findEnabled = useCallback(\n (start: number, delta: number) => {\n let i = start\n while (i >= 0 && i < filteredOptions.length) {\n if (!filteredOptions[i].disabled) return i\n i += delta\n }\n return -1\n },\n [filteredOptions],\n )\n\n // the floating panel forwards its node here, for the focus-leaves-the-widget check on blur\n const popoverRef = useRef<HTMLDivElement | null>(null)\n\n // single dismiss path: clears search + type-ahead buffer, marks the field touched, optionally refocuses\n const closeMenu = useCallback((refocus: boolean) => {\n setOpen(false)\n setSearchQuery('')\n window.clearTimeout(typeahead.current.timer)\n typeahead.current.buffer = ''\n fieldBlur.current?.()\n if (refocus) triggerRef.current?.focus()\n }, [])\n\n // on open: highlight the selected option (or first enabled), focus the search box if searchable\n useEffect(() => {\n if (!open) return\n const selIdx = filteredOptions.findIndex((o) => o.value === currentValue)\n setHighlightedIndex(\n selIdx >= 0 && !filteredOptions[selIdx].disabled ? selIdx : findEnabled(0, 1),\n )\n if (searchable) requestAnimationFrame(() => searchInputRef.current?.focus())\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n // keep the highlighted option scrolled into view\n useEffect(() => {\n if (!open || highlightedIndex < 0) return\n document.getElementById(optionId(highlightedIndex))?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, highlightedIndex])\n\n // when the search filter changes, re-anchor the highlight to the first match\n useEffect(() => {\n if (open && searchable) setHighlightedIndex(findEnabled(0, 1))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery])\n\n // if the option count changes while open (async load / list shrink), keep the highlight in range\n useEffect(() => {\n if (open) setHighlightedIndex((i) => (i < filteredOptions.length ? i : findEnabled(0, 1)))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filteredOptions.length])\n\n const openMenu = () => {\n if (!disabled) setOpen(true)\n }\n const selectOption = (opt: SelectOption | undefined) => {\n if (!opt || opt.disabled) return\n commit(opt.value)\n closeMenu(true)\n }\n const moveHighlight = (delta: number) => {\n setHighlightedIndex((cur) => {\n const start = cur < 0 ? (delta > 0 ? 0 : filteredOptions.length - 1) : cur + delta\n const found = findEnabled(start, delta)\n return found === -1 ? cur : found\n })\n }\n\n // type-ahead (non-searchable): jump to the option whose label starts with the typed buffer\n const handleTypeahead = (char: string) => {\n const t = typeahead.current\n window.clearTimeout(t.timer)\n t.buffer += char.toLowerCase()\n t.timer = window.setTimeout(() => (t.buffer = ''), 500)\n const match = filteredOptions.findIndex(\n (o) => !o.disabled && o.label.toLowerCase().startsWith(t.buffer),\n )\n if (match >= 0) setHighlightedIndex(match)\n }\n\n const handleKeyDown = (event: ReactKeyboardEvent) => {\n if (disabled) return\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n open ? moveHighlight(1) : openMenu()\n break\n case 'ArrowUp':\n event.preventDefault()\n open ? moveHighlight(-1) : openMenu()\n break\n case 'Enter':\n event.preventDefault()\n if (!open) openMenu()\n else selectOption(filteredOptions[highlightedIndex])\n break\n case ' ':\n // Space opens a closed menu (any mode); selects only when open & not searchable\n // (so a focused search box can still type spaces)\n if (!open) {\n event.preventDefault()\n openMenu()\n } else if (!searchable) {\n event.preventDefault()\n selectOption(filteredOptions[highlightedIndex])\n }\n break\n case 'Escape':\n if (open) {\n event.preventDefault()\n event.stopPropagation() // don't let FloatingPanel's own Escape also fire closeMenu/onBlur\n closeMenu(true)\n }\n break\n case 'Tab':\n // refocus the trigger so Tab continues from the field's visual location, not the portaled\n // search input's DOM position (end of <body>); don't preventDefault — let Tab move on\n if (open) closeMenu(true)\n break\n case 'Home':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(0, 1))\n }\n break\n case 'End':\n if (open) {\n event.preventDefault()\n setHighlightedIndex(findEnabled(filteredOptions.length - 1, -1))\n }\n break\n default:\n if (\n !searchable &&\n open &&\n event.key.length === 1 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey\n ) {\n handleTypeahead(event.key)\n }\n }\n }\n\n const handleTriggerBlur = (event: FocusEvent<HTMLDivElement>) => {\n // mark the form field touched only when focus leaves the whole widget (not into the popover)\n const next = event.relatedTarget as Node | null\n if (next && (popoverRef.current?.contains(next) || triggerRef.current?.contains(next))) return\n bound?.onBlur(event as unknown as FocusEvent<HTMLInputElement>)\n }\n\n const handleClear = (event: ReactMouseEvent) => {\n event.stopPropagation()\n commit('')\n triggerRef.current?.focus()\n }\n\n const activeId = open && highlightedIndex >= 0 ? optionId(highlightedIndex) : undefined\n const iconSize: 'sm' | 'md' = size === 'sm' ? 'sm' : 'md'\n // chevron size per field size: sm 16 · md 14 · lg 12\n const chevronPx = size === 'sm' ? 16 : size === 'md' ? 14 : 12\n\n return (\n <div\n className={clsx(\n styles.field,\n styles[size],\n fullWidth && styles.fullWidth,\n resolvedError && styles.error,\n disabled && styles.disabled,\n className,\n )}\n style={style}\n >\n {label != null && (\n <span\n id={labelId}\n className={styles.label}\n onClick={() => !disabled && triggerRef.current?.focus()}\n >\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {label}\n </Typography>\n {required && (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n )}\n\n <div\n ref={setTriggerRef}\n id={id}\n // `name` lets the form's scroll-to-error find + focus this field\n {...(name ? { name } : {})}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={searchable ? undefined : activeId}\n aria-labelledby={label != null ? labelId : undefined}\n aria-disabled={disabled || undefined}\n aria-required={required || undefined}\n aria-invalid={resolvedError || undefined}\n aria-describedby={resolvedHelperText != null ? helperId : undefined}\n className={clsx(styles.control, open && styles.open)}\n onClick={() => (open ? closeMenu(false) : openMenu())}\n onKeyDown={handleKeyDown}\n onBlur={handleTriggerBlur}\n >\n <span className={clsx(styles.value, !hasValue && styles.placeholder)}>\n {selected?.icon != null && (\n <span className={styles.valueIcon}>{renderIcon(selected.icon, iconSize)}</span>\n )}\n <span className={styles.valueLabel}>\n {selected ? selected.label : (placeholder ?? t('select.placeholder'))}\n </span>\n </span>\n\n {clearable && currentValue !== '' && !disabled && (\n <button\n type=\"button\"\n className={styles.clear}\n aria-label={t('select.clear')}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n >\n <Icon name=\"CloseCircle\" size=\"sm\" />\n </button>\n )}\n\n <Icon\n name=\"ArrowDown4\"\n className={styles.chevron}\n style={{ width: chevronPx, height: chevronPx }}\n aria-hidden=\"true\"\n />\n </div>\n\n <FloatingPanel\n ref={popoverRef}\n open={open}\n triggerRef={triggerRef}\n onClose={closeMenu}\n matchTriggerWidth\n className={styles.popover}\n >\n {searchable && (\n <div className={styles.search}>\n <Icon name=\"SearchNormal\" size=\"sm\" className={styles.searchIcon} aria-hidden=\"true\" />\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={searchPh}\n placeholder={searchPh}\n value={searchQuery}\n spellCheck={false}\n onChange={(e) => {\n setSearchQuery(e.target.value)\n onSearchChange?.(e.target.value)\n }}\n onKeyDown={handleKeyDown}\n />\n </div>\n )}\n\n {/* the listbox always carries `listboxId` (even when empty) so aria-controls never dangles */}\n <List\n role=\"listbox\"\n id={listboxId}\n aria-labelledby={label != null ? labelId : undefined}\n size={size}\n className={styles.listbox}\n // clear the mouse highlight when the pointer leaves the list (no lingering hover)\n onMouseLeave={() => setHighlightedIndex(-1)}\n >\n {loading ? (\n <div className={styles.loading}>\n <Loader size=\"sm\" />\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {loadingText ?? t('common.loading')}\n </Typography>\n </div>\n ) : filteredOptions.length === 0 ? (\n <div className={styles.noOptions}>\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\">\n {noOptionsText == null\n ? t('select.noOptions')\n : typeof noOptionsText === 'function'\n ? noOptionsText(searchQuery)\n : noOptionsText}\n </Typography>\n </div>\n ) : (\n filteredOptions.map((opt, index) => {\n const isSelected = opt.value === currentValue\n return (\n <ListItem\n key={opt.value}\n id={optionId(index)}\n role=\"option\"\n tabIndex={-1}\n aria-selected={isSelected}\n aria-current={undefined}\n clickable\n selected={isSelected}\n disabled={opt.disabled}\n icon={opt.icon}\n className={clsx(index === highlightedIndex && styles.active)}\n trailing={\n isSelected && showSelectedTick ? (\n <Icon name=\"TickCircle\" size=\"sm\" />\n ) : undefined\n }\n onMouseEnter={() => !opt.disabled && setHighlightedIndex(index)}\n onClick={() => selectOption(opt)}\n >\n {opt.label}\n </ListItem>\n )\n })\n )}\n </List>\n </FloatingPanel>\n\n {resolvedHelperText != null && (\n <Typography\n as=\"span\"\n id={helperId}\n variant=\"bodySmall\"\n color={resolvedError ? 'error' : 'muted'}\n className={styles.helper}\n >\n {resolvedHelperText}\n </Typography>\n )}\n </div>\n )\n})\n"],"names":["ICON_NAME_SET","ICON_NAMES","renderIcon","icon","size","jsx","Icon","Select","forwardRef","label","options","error","helperText","required","fullWidth","disabled","value","defaultValue","onChange","placeholder","clearable","searchable","searchPlaceholder","onSearchChange","loading","loadingText","noOptionsText","showSelectedTick","name","idProp","className","style","ref","reactId","useId","id","labelId","listboxId","helperId","optionId","index","t","useT","searchPh","form","useFormContext","isFormBound","bound","externalValue","isControlled","internal","setInternal","useState","currentValue","resolvedError","resolvedHelperText","selected","o","hasValue","commit","next","triggerRef","useRef","searchInputRef","typeahead","fieldBlur","open","setOpen","searchQuery","setSearchQuery","highlightedIndex","setHighlightedIndex","setTriggerRef","useCallback","node","filteredOptions","useMemo","q","findEnabled","start","delta","i","popoverRef","closeMenu","refocus","_a","_b","useEffect","selIdx","openMenu","selectOption","opt","moveHighlight","cur","found","handleTypeahead","char","match","handleKeyDown","event","handleTriggerBlur","handleClear","activeId","iconSize","chevronPx","jsxs","clsx","styles","Typography","FloatingPanel","List","Loader","isSelected","ListItem"],"mappings":"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"}
|
|
@@ -2,12 +2,12 @@ import { jsx as u, jsxs as P, Fragment as A } from "react/jsx-runtime";
|
|
|
2
2
|
import { useMemo as L, useState as T, useRef as Y, useEffect as k } from "react";
|
|
3
3
|
import { Navigate as U, useRouterState as N, Link as y, useRouter as M, useNavigate as F } from "@tanstack/react-router";
|
|
4
4
|
import { clsx as W } from "clsx";
|
|
5
|
-
import { I as O } from "./Icon-
|
|
5
|
+
import { I as O } from "./Icon-DaTvzLBu.js";
|
|
6
6
|
import { L as w } from "./List-LqbfF6gU.js";
|
|
7
|
-
import { L as E } from "./ListItem-
|
|
8
|
-
import { T as q } from "./TextField-
|
|
7
|
+
import { L as E } from "./ListItem-Cn15lJBr.js";
|
|
8
|
+
import { T as q } from "./TextField-DcdwUA9d.js";
|
|
9
9
|
import { u as H, h as G } from "./access-Db4knwyR.js";
|
|
10
|
-
import { a as Q } from "./ConfigProvider-
|
|
10
|
+
import { a as Q } from "./ConfigProvider-DT0yrgmd.js";
|
|
11
11
|
const X = "_nav_a1zzi_4", J = "_module_a1zzi_17", Z = "_search_a1zzi_25", ee = "_searchPanel_a1zzi_31", te = "_moduleLabel_a1zzi_46", oe = "_leaves_a1zzi_61", ne = "_navBadge_a1zzi_66", ae = "_navDot_a1zzi_78", se = "_leafDot_a1zzi_86", le = "_collapsible_a1zzi_95", re = "_collapsibleClosed_a1zzi_100", ce = "_collapsibleInner_a1zzi_103", ie = "_chevron_a1zzi_109", ue = "_chevronButton_a1zzi_119", b = {
|
|
12
12
|
nav: X,
|
|
13
13
|
module: J,
|
|
@@ -510,4 +510,4 @@ export {
|
|
|
510
510
|
j as f,
|
|
511
511
|
Oe as u
|
|
512
512
|
};
|
|
513
|
-
//# sourceMappingURL=Sidebar-
|
|
513
|
+
//# sourceMappingURL=Sidebar-CJ7DtOqb.js.map
|