@techzyapp/ui-library 1.0.20 → 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--pDmXYad.cjs → Table-AQ7yJhtW.cjs} +2 -2
- package/dist/{Table--pDmXYad.cjs.map → Table-AQ7yJhtW.cjs.map} +1 -1
- package/dist/{Table-CNjnvZ-k.js → Table-wn-B7iLj.js} +17 -17
- package/dist/{Table-CNjnvZ-k.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":"TextField-DvKEj36A.cjs","sources":["../src/components/TextField/TextField.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey, type ThemeColor } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport styles from './TextField.module.css'\n\nexport type TextFieldSize = 'sm' | 'md' | 'lg'\nexport type TextFieldAdornmentPosition = 'left' | 'right'\n\n/** Mask token → matcher. Any other character in a mask is treated as a literal. */\nconst MASK_TOKENS: Record<string, RegExp> = {\n 9: /[0-9]/, // digit\n a: /[A-Za-z]/, // letter\n '*': /[A-Za-z0-9]/, // alphanumeric\n}\n\n/** Formats `raw` against `mask` (`9` digit · `a` letter · `*` alphanumeric · everything else literal). */\nfunction applyMask(raw: string, mask: string): string {\n let out = ''\n let i = 0\n for (const m of mask) {\n const token = MASK_TOKENS[m]\n if (token) {\n while (i < raw.length && !token.test(raw[i])) i++ // skip chars that don't fit this slot\n if (i >= raw.length) break\n out += raw[i]\n i++\n } else {\n if (i >= raw.length) break // don't show a trailing literal until there's more input\n if (raw[i] === m) i++ // consume an already-present literal so it isn't re-read\n out += m\n }\n }\n return out\n}\n\n/** Drops the mask's literal characters, leaving only the data the user actually entered. */\nfunction stripMaskLiterals(value: string, mask: string): string {\n const literals = new Set([...mask].filter((c) => !MASK_TOKENS[c]))\n return [...value].filter((c) => !literals.has(c)).join('')\n}\n\n/**\n * Where to place the caret after re-masking: keep it after the same number of \"significant\"\n * (data, i.e. alphanumeric) chars it followed in the raw input — so inserting mid-value doesn't\n * jump the caret to the end. Literal mask chars (spaces, `()`, `-`, …) don't count.\n */\nconst SIGNIFICANT = /[A-Za-z0-9]/\nfunction maskCaretPosition(rawBeforeCaret: string, masked: string): number {\n const target = (rawBeforeCaret.match(/[A-Za-z0-9]/g) ?? []).length\n if (target <= 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (SIGNIFICANT.test(masked[i])) {\n count += 1\n if (count === target) return i + 1\n }\n }\n return masked.length\n}\n\n/** Password-strength buckets surfaced by the `passwordStrength` meter. */\nexport type PasswordStrength = 'weak' | 'medium' | 'strong'\n\n/**\n * A cheap, dependency-free password score: one point each for length ≥ 8, mixed upper/lower case, a\n * digit, and a symbol → 0–4. Empty input scores 0 (the meter hides). Not a security guarantee — a UX\n * hint that nudges toward longer, more varied passwords.\n */\nfunction scorePassword(pw: string): number {\n if (!pw) return 0\n let score = 0\n if (pw.length >= 8) score += 1\n if (/[a-z]/.test(pw) && /[A-Z]/.test(pw)) score += 1\n if (/\\d/.test(pw)) score += 1\n if (/[^A-Za-z0-9]/.test(pw)) score += 1\n return score\n}\n\n/** Maps a 0–4 score to a strength bucket (`null` when there's nothing to show). */\nfunction strengthLevel(score: number): PasswordStrength | null {\n if (score <= 0) return null\n if (score === 1) return 'weak'\n if (score === 2) return 'medium'\n return 'strong'\n}\n\nconst STRENGTH_META: Record<\n PasswordStrength,\n { labelKey: MessageKey; color: ThemeColor; bars: number }\n> = {\n weak: { labelKey: 'textField.strengthWeak', color: 'error', bars: 1 },\n medium: { labelKey: 'textField.strengthMedium', color: 'warning', bars: 2 },\n strong: { labelKey: 'textField.strengthStrong', color: 'success', bars: 3 },\n}\n\nexport interface TextFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'prefix'\n> {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — drives the control height (`--tz-control-height-*`), font size and padding. */\n size?: TextFieldSize\n /** Marks the field invalid: red border/focus ring and the `helperText` shown 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 (visual hint only — combine with native `required` if needed). */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /**\n * Content shown inside the field. A **string/number** renders as a muted prefix/suffix\n * (e.g. `\"https://\"`, `\"$\"`, `\"kg\"`); any other node renders as an icon (typically an `<Icon />`)\n * inside a square `IconButton` box.\n */\n adornment?: ReactNode\n /** Which side the adornment sits on. Defaults to `left`. */\n adornmentPosition?: TextFieldAdornmentPosition\n /** Makes an icon adornment a clickable `IconButton` and fires this on click (ignored for string adornments). */\n onAdornmentClick?: (event: MouseEvent<HTMLButtonElement>) => void\n /** Accessible label for the clickable icon adornment (used when `onAdornmentClick` is set). Defaults to `\"Field action\"`. */\n adornmentLabel?: string\n /** Allowed-input filter: a change whose value fails this pattern is rejected (e.g. `/^\\d*$/` for digits only). */\n regex?: RegExp\n /** Input mask, e.g. `\"(999) 999-9999\"` (`9` digit · `a` letter · `*` alphanumeric · other chars literal). Emits the masked value. */\n mask?: string\n /**\n * For `type=\"password\"`: show the built-in show/hide reveal toggle in the right adornment slot.\n * Defaults to `true`. Set `false` to drop it (e.g. to use your own right adornment instead).\n */\n passwordToggle?: boolean\n /**\n * Show a \"Caps Lock is on\" warning under the field while it's focused and Caps Lock is active.\n * Detected from key events, so it appears once the user starts typing. Defaults to `false`.\n */\n capsLockWarning?: boolean\n /**\n * Show a password-strength meter (segmented bar + label) under the field, derived from the current\n * value. A UX hint only — not a security check. Defaults to `false` (best paired with `type=\"password\"`).\n */\n passwordStrength?: boolean\n}\n\n/**\n * A labeled text input. Renders an optional label and helper/validation text, an\n * error state (red border + helper), and an optional `adornment` on either side —\n * a string prefix/suffix (e.g. `\"https://\"`) or an icon, which can be made\n * interactive via `onAdornmentClick`. Supports an allowed-input `regex` filter and\n * a formatting `mask`. Works controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`); when a `mask` is set, `onChange` emits the masked value. Passing\n * `type=\"password\"` automatically adds a show/hide reveal toggle in the right adornment\n * slot. Inside a `<Form>`, a `name` prop auto-binds value/validation from the form (no need to\n * spread `field()`). Styling comes entirely from `--tz-*` tokens.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n adornment,\n adornmentPosition = 'left',\n onAdornmentClick,\n adornmentLabel,\n regex,\n mask,\n passwordToggle = true,\n capsLockWarning = false,\n passwordStrength = false,\n name,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n disabled = false,\n type,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — so `<TextField name=\"email\" />` just works,\n // pulling value/onChange/onBlur/error/helperText from the form. Explicit props still win.\n const form = useFormContext()\n const bound = form && name ? form.field(name) : undefined\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const isControlled = value !== undefined || bound !== undefined\n const [internal, setInternal] = useState<string>(defaultValue != null ? String(defaultValue) : '')\n const currentValue = value !== undefined ? value : bound ? bound.value : internal\n\n // merge the consumer ref with an internal one so we can restore the caret after re-masking\n const innerRef = useRef<HTMLInputElement | null>(null)\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n const pendingCaret = useRef<number | null>(null)\n useLayoutEffect(() => {\n const pos = pendingCaret.current\n if (pos == null) return\n pendingCaret.current = null\n innerRef.current?.setSelectionRange(pos, pos)\n })\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const el = event.target\n let next = el.value\n if (mask) {\n const caret = el.selectionStart ?? el.value.length\n const rawBeforeCaret = el.value.slice(0, caret) // capture before applyMask reassigns `next`\n next = applyMask(next, mask)\n // keep the caret after the same run of data chars, so mid-value edits don't jump to the end\n pendingCaret.current = maskCaretPosition(rawBeforeCaret, next)\n }\n if (regex) {\n const candidate = mask ? stripMaskLiterals(next, mask) : next\n if (!regex.test(candidate)) {\n pendingCaret.current = null\n return // reject the change, leaving the value unchanged\n }\n }\n if (!isControlled) setInternal(next)\n el.value = next // hand consumers the masked/filtered value\n bound?.onChange(event)\n onChange?.(event)\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setCapsOn(false) // hide the Caps Lock hint once focus leaves the field\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n // Caps Lock warning — read the modifier off key events (can't be known until the user types), and\n // clear it on blur. Cheap: only tracks state when the feature is enabled.\n const [capsOn, setCapsOn] = useState(false)\n const readCaps = (event: KeyboardEvent<HTMLInputElement>) => {\n if (capsLockWarning) setCapsOn(event.getModifierState?.('CapsLock') ?? false)\n }\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyDown?.(event)\n }\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyUp?.(event)\n }\n\n // Password fields get an automatic reveal toggle in the (right) adornment slot (unless\n // `passwordToggle={false}`); it flips the input between `password`/`text` and overrides any\n // adornment props for that field.\n const [revealed, setRevealed] = useState(false)\n const isPasswordField = type === 'password'\n const showReveal = isPasswordField && passwordToggle\n const inputType = isPasswordField && revealed ? 'text' : type\n\n const effAdornment = showReveal ? <Icon name={revealed ? 'EyeSlash' : 'Eye'} /> : adornment\n const effAdornmentPosition = showReveal ? 'right' : adornmentPosition\n const effOnAdornmentClick = showReveal ? () => setRevealed((shown) => !shown) : onAdornmentClick\n const effAdornmentLabel = showReveal\n ? revealed\n ? t('textField.hidePassword')\n : t('textField.showPassword')\n : (adornmentLabel ?? t('textField.fieldAction'))\n\n // Password-strength meter, derived from the current value (a UX hint, not a security check).\n const strength = passwordStrength\n ? strengthLevel(scorePassword(String(currentValue ?? '')))\n : null\n const strengthId = `${id}-strength`\n const capsId = `${id}-caps`\n const describedBy =\n [resolvedHelperText != null ? helperId : null, capsLockWarning && capsOn ? capsId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n const hasAdornment = effAdornment != null && effAdornment !== false\n const isTextAdornment = typeof effAdornment === 'string' || typeof effAdornment === 'number'\n\n let adornmentNode: ReactNode = null\n if (hasAdornment) {\n if (isTextAdornment) {\n adornmentNode = <span className={styles.textAdornment}>{effAdornment}</span>\n } else if (effOnAdornmentClick) {\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={effAdornmentLabel}\n onClick={effOnAdornmentClick}\n // Don't steal focus from the input on click — keeps the control's focus ring tied to the\n // input itself (clicking the icon shouldn't light up the field's :focus-within ring).\n onMouseDown={(event) => event.preventDefault()}\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n } else {\n // Decorative icon: same IconButton box (so it sizes identically to the clickable one),\n // but non-interactive and hidden from the a11y tree.\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n nonClickable\n aria-hidden=\"true\"\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n }\n }\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 as CSSProperties}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\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 </label>\n )}\n\n <div\n className={clsx(\n styles.control,\n hasAdornment && effAdornmentPosition === 'left' && styles.hasLeftAdornment,\n hasAdornment && effAdornmentPosition === 'right' && styles.hasRightAdornment,\n )}\n >\n {effAdornmentPosition === 'left' && adornmentNode}\n <input\n ref={setInputRef}\n id={id}\n name={name}\n type={inputType}\n className={styles.input}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n disabled={disabled}\n aria-invalid={resolvedError || undefined}\n aria-describedby={describedBy}\n {...props}\n />\n {effAdornmentPosition === 'right' && adornmentNode}\n </div>\n\n {capsLockWarning && capsOn && (\n <Typography\n as=\"span\"\n id={capsId}\n variant=\"bodySmall\"\n color=\"warning\"\n className={styles.caps}\n role=\"alert\"\n >\n <Icon name=\"Danger\" />\n {t('textField.capsLock')}\n </Typography>\n )}\n\n {strength && (\n <div\n className={styles.strength}\n style={\n {\n '--tz-strength-color': `var(--tz-color-${STRENGTH_META[strength].color})`,\n } as CSSProperties\n }\n >\n <span className={styles.strengthBars} aria-hidden=\"true\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={styles.strengthBar}\n data-on={i < STRENGTH_META[strength].bars}\n />\n ))}\n </span>\n <Typography\n as=\"span\"\n id={strengthId}\n variant=\"bodySmall\"\n color={STRENGTH_META[strength].color}\n className={styles.strengthLabel}\n >\n {t(STRENGTH_META[strength].labelKey)}\n </Typography>\n </div>\n )}\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":["MASK_TOKENS","applyMask","raw","mask","out","i","m","token","stripMaskLiterals","value","literals","c","SIGNIFICANT","maskCaretPosition","rawBeforeCaret","masked","target","count","scorePassword","pw","score","strengthLevel","STRENGTH_META","TextField","forwardRef","label","size","error","helperText","required","fullWidth","adornment","adornmentPosition","onAdornmentClick","adornmentLabel","regex","passwordToggle","capsLockWarning","passwordStrength","name","defaultValue","onChange","onBlur","onFocus","onKeyDown","onKeyUp","disabled","type","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","bound","resolvedError","resolvedHelperText","isControlled","internal","setInternal","useState","currentValue","innerRef","useRef","setInputRef","useCallback","node","pendingCaret","useLayoutEffect","pos","_a","handleChange","event","el","next","caret","candidate","handleBlur","setCapsOn","capsOn","readCaps","handleKeyDown","handleKeyUp","revealed","setRevealed","isPasswordField","showReveal","inputType","effAdornment","jsx","Icon","effAdornmentPosition","effOnAdornmentClick","shown","effAdornmentLabel","strength","strengthId","capsId","describedBy","hasAdornment","isTextAdornment","adornmentNode","styles","IconButton","jsxs","clsx","Typography"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextField-DNqnpAWB.cjs","sources":["../src/components/TextField/TextField.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey, type ThemeColor } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport styles from './TextField.module.css'\n\nexport type TextFieldSize = 'sm' | 'md' | 'lg'\nexport type TextFieldAdornmentPosition = 'left' | 'right'\n\n/** Mask token → matcher. Any other character in a mask is treated as a literal. */\nconst MASK_TOKENS: Record<string, RegExp> = {\n 9: /[0-9]/, // digit\n a: /[A-Za-z]/, // letter\n '*': /[A-Za-z0-9]/, // alphanumeric\n}\n\n/** Formats `raw` against `mask` (`9` digit · `a` letter · `*` alphanumeric · everything else literal). */\nfunction applyMask(raw: string, mask: string): string {\n let out = ''\n let i = 0\n for (const m of mask) {\n const token = MASK_TOKENS[m]\n if (token) {\n while (i < raw.length && !token.test(raw[i])) i++ // skip chars that don't fit this slot\n if (i >= raw.length) break\n out += raw[i]\n i++\n } else {\n if (i >= raw.length) break // don't show a trailing literal until there's more input\n if (raw[i] === m) i++ // consume an already-present literal so it isn't re-read\n out += m\n }\n }\n return out\n}\n\n/** Drops the mask's literal characters, leaving only the data the user actually entered. */\nfunction stripMaskLiterals(value: string, mask: string): string {\n const literals = new Set([...mask].filter((c) => !MASK_TOKENS[c]))\n return [...value].filter((c) => !literals.has(c)).join('')\n}\n\n/**\n * Where to place the caret after re-masking: keep it after the same number of \"significant\"\n * (data, i.e. alphanumeric) chars it followed in the raw input — so inserting mid-value doesn't\n * jump the caret to the end. Literal mask chars (spaces, `()`, `-`, …) don't count.\n */\nconst SIGNIFICANT = /[A-Za-z0-9]/\nfunction maskCaretPosition(rawBeforeCaret: string, masked: string): number {\n const target = (rawBeforeCaret.match(/[A-Za-z0-9]/g) ?? []).length\n if (target <= 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (SIGNIFICANT.test(masked[i])) {\n count += 1\n if (count === target) return i + 1\n }\n }\n return masked.length\n}\n\n/** Password-strength buckets surfaced by the `passwordStrength` meter. */\nexport type PasswordStrength = 'weak' | 'medium' | 'strong'\n\n/**\n * A cheap, dependency-free password score: one point each for length ≥ 8, mixed upper/lower case, a\n * digit, and a symbol → 0–4. Empty input scores 0 (the meter hides). Not a security guarantee — a UX\n * hint that nudges toward longer, more varied passwords.\n */\nfunction scorePassword(pw: string): number {\n if (!pw) return 0\n let score = 0\n if (pw.length >= 8) score += 1\n if (/[a-z]/.test(pw) && /[A-Z]/.test(pw)) score += 1\n if (/\\d/.test(pw)) score += 1\n if (/[^A-Za-z0-9]/.test(pw)) score += 1\n return score\n}\n\n/** Maps a 0–4 score to a strength bucket (`null` when there's nothing to show). */\nfunction strengthLevel(score: number): PasswordStrength | null {\n if (score <= 0) return null\n if (score === 1) return 'weak'\n if (score === 2) return 'medium'\n return 'strong'\n}\n\nconst STRENGTH_META: Record<\n PasswordStrength,\n { labelKey: MessageKey; color: ThemeColor; bars: number }\n> = {\n weak: { labelKey: 'textField.strengthWeak', color: 'error', bars: 1 },\n medium: { labelKey: 'textField.strengthMedium', color: 'warning', bars: 2 },\n strong: { labelKey: 'textField.strengthStrong', color: 'success', bars: 3 },\n}\n\nexport interface TextFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'prefix'\n> {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — drives the control height (`--tz-control-height-*`), font size and padding. */\n size?: TextFieldSize\n /** Marks the field invalid: red border/focus ring and the `helperText` shown 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 (visual hint only — combine with native `required` if needed). */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /**\n * Content shown inside the field. A **string/number** renders as a muted prefix/suffix\n * (e.g. `\"https://\"`, `\"$\"`, `\"kg\"`); any other node renders as an icon (typically an `<Icon />`)\n * inside a square `IconButton` box.\n */\n adornment?: ReactNode\n /** Which side the adornment sits on. Defaults to `left`. */\n adornmentPosition?: TextFieldAdornmentPosition\n /** Makes an icon adornment a clickable `IconButton` and fires this on click (ignored for string adornments). */\n onAdornmentClick?: (event: MouseEvent<HTMLButtonElement>) => void\n /** Accessible label for the clickable icon adornment (used when `onAdornmentClick` is set). Defaults to `\"Field action\"`. */\n adornmentLabel?: string\n /** Allowed-input filter: a change whose value fails this pattern is rejected (e.g. `/^\\d*$/` for digits only). */\n regex?: RegExp\n /** Input mask, e.g. `\"(999) 999-9999\"` (`9` digit · `a` letter · `*` alphanumeric · other chars literal). Emits the masked value. */\n mask?: string\n /**\n * For `type=\"password\"`: show the built-in show/hide reveal toggle in the right adornment slot.\n * Defaults to `true`. Set `false` to drop it (e.g. to use your own right adornment instead).\n */\n passwordToggle?: boolean\n /**\n * Show a \"Caps Lock is on\" warning under the field while it's focused and Caps Lock is active.\n * Detected from key events, so it appears once the user starts typing. Defaults to `false`.\n */\n capsLockWarning?: boolean\n /**\n * Show a password-strength meter (segmented bar + label) under the field, derived from the current\n * value. A UX hint only — not a security check. Defaults to `false` (best paired with `type=\"password\"`).\n */\n passwordStrength?: boolean\n}\n\n/**\n * A labeled text input. Renders an optional label and helper/validation text, an\n * error state (red border + helper), and an optional `adornment` on either side —\n * a string prefix/suffix (e.g. `\"https://\"`) or an icon, which can be made\n * interactive via `onAdornmentClick`. Supports an allowed-input `regex` filter and\n * a formatting `mask`. Works controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`); when a `mask` is set, `onChange` emits the masked value. Passing\n * `type=\"password\"` automatically adds a show/hide reveal toggle in the right adornment\n * slot. Inside a `<Form>`, a `name` prop auto-binds value/validation from the form (no need to\n * spread `field()`). Styling comes entirely from `--tz-*` tokens.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n adornment,\n adornmentPosition = 'left',\n onAdornmentClick,\n adornmentLabel,\n regex,\n mask,\n passwordToggle = true,\n capsLockWarning = false,\n passwordStrength = false,\n name,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n disabled = false,\n type,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — so `<TextField name=\"email\" />` just works,\n // pulling value/onChange/onBlur/error/helperText from the form. Explicit props still win.\n const form = useFormContext()\n const bound = form && name ? form.field(name) : undefined\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const isControlled = value !== undefined || bound !== undefined\n const [internal, setInternal] = useState<string>(defaultValue != null ? String(defaultValue) : '')\n const currentValue = value !== undefined ? value : bound ? bound.value : internal\n\n // merge the consumer ref with an internal one so we can restore the caret after re-masking\n const innerRef = useRef<HTMLInputElement | null>(null)\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n const pendingCaret = useRef<number | null>(null)\n useLayoutEffect(() => {\n const pos = pendingCaret.current\n if (pos == null) return\n pendingCaret.current = null\n innerRef.current?.setSelectionRange(pos, pos)\n })\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const el = event.target\n let next = el.value\n if (mask) {\n const caret = el.selectionStart ?? el.value.length\n const rawBeforeCaret = el.value.slice(0, caret) // capture before applyMask reassigns `next`\n next = applyMask(next, mask)\n // keep the caret after the same run of data chars, so mid-value edits don't jump to the end\n pendingCaret.current = maskCaretPosition(rawBeforeCaret, next)\n }\n if (regex) {\n const candidate = mask ? stripMaskLiterals(next, mask) : next\n if (!regex.test(candidate)) {\n pendingCaret.current = null\n return // reject the change, leaving the value unchanged\n }\n }\n if (!isControlled) setInternal(next)\n el.value = next // hand consumers the masked/filtered value\n bound?.onChange(event)\n onChange?.(event)\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setCapsOn(false) // hide the Caps Lock hint once focus leaves the field\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n // Caps Lock warning — read the modifier off key events (can't be known until the user types), and\n // clear it on blur. Cheap: only tracks state when the feature is enabled.\n const [capsOn, setCapsOn] = useState(false)\n const readCaps = (event: KeyboardEvent<HTMLInputElement>) => {\n if (capsLockWarning) setCapsOn(event.getModifierState?.('CapsLock') ?? false)\n }\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyDown?.(event)\n }\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyUp?.(event)\n }\n\n // Password fields get an automatic reveal toggle in the (right) adornment slot (unless\n // `passwordToggle={false}`); it flips the input between `password`/`text` and overrides any\n // adornment props for that field.\n const [revealed, setRevealed] = useState(false)\n const isPasswordField = type === 'password'\n const showReveal = isPasswordField && passwordToggle\n const inputType = isPasswordField && revealed ? 'text' : type\n\n const effAdornment = showReveal ? <Icon name={revealed ? 'EyeSlash' : 'Eye'} /> : adornment\n const effAdornmentPosition = showReveal ? 'right' : adornmentPosition\n const effOnAdornmentClick = showReveal ? () => setRevealed((shown) => !shown) : onAdornmentClick\n const effAdornmentLabel = showReveal\n ? revealed\n ? t('textField.hidePassword')\n : t('textField.showPassword')\n : (adornmentLabel ?? t('textField.fieldAction'))\n\n // Password-strength meter, derived from the current value (a UX hint, not a security check).\n const strength = passwordStrength\n ? strengthLevel(scorePassword(String(currentValue ?? '')))\n : null\n const strengthId = `${id}-strength`\n const capsId = `${id}-caps`\n const describedBy =\n [resolvedHelperText != null ? helperId : null, capsLockWarning && capsOn ? capsId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n const hasAdornment = effAdornment != null && effAdornment !== false\n const isTextAdornment = typeof effAdornment === 'string' || typeof effAdornment === 'number'\n\n let adornmentNode: ReactNode = null\n if (hasAdornment) {\n if (isTextAdornment) {\n adornmentNode = <span className={styles.textAdornment}>{effAdornment}</span>\n } else if (effOnAdornmentClick) {\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={effAdornmentLabel}\n onClick={effOnAdornmentClick}\n // Don't steal focus from the input on click — keeps the control's focus ring tied to the\n // input itself (clicking the icon shouldn't light up the field's :focus-within ring).\n onMouseDown={(event) => event.preventDefault()}\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n } else {\n // Decorative icon: same IconButton box (so it sizes identically to the clickable one),\n // but non-interactive and hidden from the a11y tree.\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n nonClickable\n aria-hidden=\"true\"\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n }\n }\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 as CSSProperties}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\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 </label>\n )}\n\n <div\n className={clsx(\n styles.control,\n hasAdornment && effAdornmentPosition === 'left' && styles.hasLeftAdornment,\n hasAdornment && effAdornmentPosition === 'right' && styles.hasRightAdornment,\n )}\n >\n {effAdornmentPosition === 'left' && adornmentNode}\n <input\n ref={setInputRef}\n id={id}\n name={name}\n type={inputType}\n className={styles.input}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n disabled={disabled}\n aria-invalid={resolvedError || undefined}\n aria-describedby={describedBy}\n {...props}\n />\n {effAdornmentPosition === 'right' && adornmentNode}\n </div>\n\n {capsLockWarning && capsOn && (\n <Typography\n as=\"span\"\n id={capsId}\n variant=\"bodySmall\"\n color=\"warning\"\n className={styles.caps}\n role=\"alert\"\n >\n <Icon name=\"Danger\" />\n {t('textField.capsLock')}\n </Typography>\n )}\n\n {strength && (\n <div\n className={styles.strength}\n style={\n {\n '--tz-strength-color': `var(--tz-color-${STRENGTH_META[strength].color})`,\n } as CSSProperties\n }\n >\n <span className={styles.strengthBars} aria-hidden=\"true\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={styles.strengthBar}\n data-on={i < STRENGTH_META[strength].bars}\n />\n ))}\n </span>\n <Typography\n as=\"span\"\n id={strengthId}\n variant=\"bodySmall\"\n color={STRENGTH_META[strength].color}\n className={styles.strengthLabel}\n >\n {t(STRENGTH_META[strength].labelKey)}\n </Typography>\n </div>\n )}\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":["MASK_TOKENS","applyMask","raw","mask","out","i","m","token","stripMaskLiterals","value","literals","c","SIGNIFICANT","maskCaretPosition","rawBeforeCaret","masked","target","count","scorePassword","pw","score","strengthLevel","STRENGTH_META","TextField","forwardRef","label","size","error","helperText","required","fullWidth","adornment","adornmentPosition","onAdornmentClick","adornmentLabel","regex","passwordToggle","capsLockWarning","passwordStrength","name","defaultValue","onChange","onBlur","onFocus","onKeyDown","onKeyUp","disabled","type","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","bound","resolvedError","resolvedHelperText","isControlled","internal","setInternal","useState","currentValue","innerRef","useRef","setInputRef","useCallback","node","pendingCaret","useLayoutEffect","pos","_a","handleChange","event","el","next","caret","candidate","handleBlur","setCapsOn","capsOn","readCaps","handleKeyDown","handleKeyUp","revealed","setRevealed","isPasswordField","showReveal","inputType","effAdornment","jsx","Icon","effAdornmentPosition","effOnAdornmentClick","shown","effAdornmentLabel","strength","strengthId","capsId","describedBy","hasAdornment","isTextAdornment","adornmentNode","styles","IconButton","jsxs","clsx","Typography"],"mappings":"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"}
|
|
@@ -2,11 +2,11 @@ import { jsxs as x, jsx as o } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as Et, useId as Mt, useState as w, useRef as Y, useCallback as zt, useLayoutEffect as Lt } from "react";
|
|
3
3
|
import { clsx as U } from "clsx";
|
|
4
4
|
import { u as Pt } from "./formContext-B7ln1Miy.js";
|
|
5
|
-
import { I as tt } from "./Icon-
|
|
6
|
-
import { I as et } from "./IconButton-
|
|
5
|
+
import { I as tt } from "./Icon-DaTvzLBu.js";
|
|
6
|
+
import { I as et } from "./IconButton-DXMmtuLA.js";
|
|
7
7
|
import { T } from "./Typography-Cta6Rg4L.js";
|
|
8
8
|
import { f as r } from "./TextField.module-QePvGeJ3.js";
|
|
9
|
-
import { a as Zt } from "./ConfigProvider-
|
|
9
|
+
import { a as Zt } from "./ConfigProvider-DT0yrgmd.js";
|
|
10
10
|
const rt = {
|
|
11
11
|
9: /[0-9]/,
|
|
12
12
|
// digit
|
|
@@ -263,4 +263,4 @@ const I = {
|
|
|
263
263
|
export {
|
|
264
264
|
Yt as T
|
|
265
265
|
};
|
|
266
|
-
//# sourceMappingURL=TextField-
|
|
266
|
+
//# sourceMappingURL=TextField-DcdwUA9d.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextField-CRCYLPpr.js","sources":["../src/components/TextField/TextField.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey, type ThemeColor } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport styles from './TextField.module.css'\n\nexport type TextFieldSize = 'sm' | 'md' | 'lg'\nexport type TextFieldAdornmentPosition = 'left' | 'right'\n\n/** Mask token → matcher. Any other character in a mask is treated as a literal. */\nconst MASK_TOKENS: Record<string, RegExp> = {\n 9: /[0-9]/, // digit\n a: /[A-Za-z]/, // letter\n '*': /[A-Za-z0-9]/, // alphanumeric\n}\n\n/** Formats `raw` against `mask` (`9` digit · `a` letter · `*` alphanumeric · everything else literal). */\nfunction applyMask(raw: string, mask: string): string {\n let out = ''\n let i = 0\n for (const m of mask) {\n const token = MASK_TOKENS[m]\n if (token) {\n while (i < raw.length && !token.test(raw[i])) i++ // skip chars that don't fit this slot\n if (i >= raw.length) break\n out += raw[i]\n i++\n } else {\n if (i >= raw.length) break // don't show a trailing literal until there's more input\n if (raw[i] === m) i++ // consume an already-present literal so it isn't re-read\n out += m\n }\n }\n return out\n}\n\n/** Drops the mask's literal characters, leaving only the data the user actually entered. */\nfunction stripMaskLiterals(value: string, mask: string): string {\n const literals = new Set([...mask].filter((c) => !MASK_TOKENS[c]))\n return [...value].filter((c) => !literals.has(c)).join('')\n}\n\n/**\n * Where to place the caret after re-masking: keep it after the same number of \"significant\"\n * (data, i.e. alphanumeric) chars it followed in the raw input — so inserting mid-value doesn't\n * jump the caret to the end. Literal mask chars (spaces, `()`, `-`, …) don't count.\n */\nconst SIGNIFICANT = /[A-Za-z0-9]/\nfunction maskCaretPosition(rawBeforeCaret: string, masked: string): number {\n const target = (rawBeforeCaret.match(/[A-Za-z0-9]/g) ?? []).length\n if (target <= 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (SIGNIFICANT.test(masked[i])) {\n count += 1\n if (count === target) return i + 1\n }\n }\n return masked.length\n}\n\n/** Password-strength buckets surfaced by the `passwordStrength` meter. */\nexport type PasswordStrength = 'weak' | 'medium' | 'strong'\n\n/**\n * A cheap, dependency-free password score: one point each for length ≥ 8, mixed upper/lower case, a\n * digit, and a symbol → 0–4. Empty input scores 0 (the meter hides). Not a security guarantee — a UX\n * hint that nudges toward longer, more varied passwords.\n */\nfunction scorePassword(pw: string): number {\n if (!pw) return 0\n let score = 0\n if (pw.length >= 8) score += 1\n if (/[a-z]/.test(pw) && /[A-Z]/.test(pw)) score += 1\n if (/\\d/.test(pw)) score += 1\n if (/[^A-Za-z0-9]/.test(pw)) score += 1\n return score\n}\n\n/** Maps a 0–4 score to a strength bucket (`null` when there's nothing to show). */\nfunction strengthLevel(score: number): PasswordStrength | null {\n if (score <= 0) return null\n if (score === 1) return 'weak'\n if (score === 2) return 'medium'\n return 'strong'\n}\n\nconst STRENGTH_META: Record<\n PasswordStrength,\n { labelKey: MessageKey; color: ThemeColor; bars: number }\n> = {\n weak: { labelKey: 'textField.strengthWeak', color: 'error', bars: 1 },\n medium: { labelKey: 'textField.strengthMedium', color: 'warning', bars: 2 },\n strong: { labelKey: 'textField.strengthStrong', color: 'success', bars: 3 },\n}\n\nexport interface TextFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'prefix'\n> {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — drives the control height (`--tz-control-height-*`), font size and padding. */\n size?: TextFieldSize\n /** Marks the field invalid: red border/focus ring and the `helperText` shown 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 (visual hint only — combine with native `required` if needed). */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /**\n * Content shown inside the field. A **string/number** renders as a muted prefix/suffix\n * (e.g. `\"https://\"`, `\"$\"`, `\"kg\"`); any other node renders as an icon (typically an `<Icon />`)\n * inside a square `IconButton` box.\n */\n adornment?: ReactNode\n /** Which side the adornment sits on. Defaults to `left`. */\n adornmentPosition?: TextFieldAdornmentPosition\n /** Makes an icon adornment a clickable `IconButton` and fires this on click (ignored for string adornments). */\n onAdornmentClick?: (event: MouseEvent<HTMLButtonElement>) => void\n /** Accessible label for the clickable icon adornment (used when `onAdornmentClick` is set). Defaults to `\"Field action\"`. */\n adornmentLabel?: string\n /** Allowed-input filter: a change whose value fails this pattern is rejected (e.g. `/^\\d*$/` for digits only). */\n regex?: RegExp\n /** Input mask, e.g. `\"(999) 999-9999\"` (`9` digit · `a` letter · `*` alphanumeric · other chars literal). Emits the masked value. */\n mask?: string\n /**\n * For `type=\"password\"`: show the built-in show/hide reveal toggle in the right adornment slot.\n * Defaults to `true`. Set `false` to drop it (e.g. to use your own right adornment instead).\n */\n passwordToggle?: boolean\n /**\n * Show a \"Caps Lock is on\" warning under the field while it's focused and Caps Lock is active.\n * Detected from key events, so it appears once the user starts typing. Defaults to `false`.\n */\n capsLockWarning?: boolean\n /**\n * Show a password-strength meter (segmented bar + label) under the field, derived from the current\n * value. A UX hint only — not a security check. Defaults to `false` (best paired with `type=\"password\"`).\n */\n passwordStrength?: boolean\n}\n\n/**\n * A labeled text input. Renders an optional label and helper/validation text, an\n * error state (red border + helper), and an optional `adornment` on either side —\n * a string prefix/suffix (e.g. `\"https://\"`) or an icon, which can be made\n * interactive via `onAdornmentClick`. Supports an allowed-input `regex` filter and\n * a formatting `mask`. Works controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`); when a `mask` is set, `onChange` emits the masked value. Passing\n * `type=\"password\"` automatically adds a show/hide reveal toggle in the right adornment\n * slot. Inside a `<Form>`, a `name` prop auto-binds value/validation from the form (no need to\n * spread `field()`). Styling comes entirely from `--tz-*` tokens.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n adornment,\n adornmentPosition = 'left',\n onAdornmentClick,\n adornmentLabel,\n regex,\n mask,\n passwordToggle = true,\n capsLockWarning = false,\n passwordStrength = false,\n name,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n disabled = false,\n type,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — so `<TextField name=\"email\" />` just works,\n // pulling value/onChange/onBlur/error/helperText from the form. Explicit props still win.\n const form = useFormContext()\n const bound = form && name ? form.field(name) : undefined\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const isControlled = value !== undefined || bound !== undefined\n const [internal, setInternal] = useState<string>(defaultValue != null ? String(defaultValue) : '')\n const currentValue = value !== undefined ? value : bound ? bound.value : internal\n\n // merge the consumer ref with an internal one so we can restore the caret after re-masking\n const innerRef = useRef<HTMLInputElement | null>(null)\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n const pendingCaret = useRef<number | null>(null)\n useLayoutEffect(() => {\n const pos = pendingCaret.current\n if (pos == null) return\n pendingCaret.current = null\n innerRef.current?.setSelectionRange(pos, pos)\n })\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const el = event.target\n let next = el.value\n if (mask) {\n const caret = el.selectionStart ?? el.value.length\n const rawBeforeCaret = el.value.slice(0, caret) // capture before applyMask reassigns `next`\n next = applyMask(next, mask)\n // keep the caret after the same run of data chars, so mid-value edits don't jump to the end\n pendingCaret.current = maskCaretPosition(rawBeforeCaret, next)\n }\n if (regex) {\n const candidate = mask ? stripMaskLiterals(next, mask) : next\n if (!regex.test(candidate)) {\n pendingCaret.current = null\n return // reject the change, leaving the value unchanged\n }\n }\n if (!isControlled) setInternal(next)\n el.value = next // hand consumers the masked/filtered value\n bound?.onChange(event)\n onChange?.(event)\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setCapsOn(false) // hide the Caps Lock hint once focus leaves the field\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n // Caps Lock warning — read the modifier off key events (can't be known until the user types), and\n // clear it on blur. Cheap: only tracks state when the feature is enabled.\n const [capsOn, setCapsOn] = useState(false)\n const readCaps = (event: KeyboardEvent<HTMLInputElement>) => {\n if (capsLockWarning) setCapsOn(event.getModifierState?.('CapsLock') ?? false)\n }\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyDown?.(event)\n }\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyUp?.(event)\n }\n\n // Password fields get an automatic reveal toggle in the (right) adornment slot (unless\n // `passwordToggle={false}`); it flips the input between `password`/`text` and overrides any\n // adornment props for that field.\n const [revealed, setRevealed] = useState(false)\n const isPasswordField = type === 'password'\n const showReveal = isPasswordField && passwordToggle\n const inputType = isPasswordField && revealed ? 'text' : type\n\n const effAdornment = showReveal ? <Icon name={revealed ? 'EyeSlash' : 'Eye'} /> : adornment\n const effAdornmentPosition = showReveal ? 'right' : adornmentPosition\n const effOnAdornmentClick = showReveal ? () => setRevealed((shown) => !shown) : onAdornmentClick\n const effAdornmentLabel = showReveal\n ? revealed\n ? t('textField.hidePassword')\n : t('textField.showPassword')\n : (adornmentLabel ?? t('textField.fieldAction'))\n\n // Password-strength meter, derived from the current value (a UX hint, not a security check).\n const strength = passwordStrength\n ? strengthLevel(scorePassword(String(currentValue ?? '')))\n : null\n const strengthId = `${id}-strength`\n const capsId = `${id}-caps`\n const describedBy =\n [resolvedHelperText != null ? helperId : null, capsLockWarning && capsOn ? capsId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n const hasAdornment = effAdornment != null && effAdornment !== false\n const isTextAdornment = typeof effAdornment === 'string' || typeof effAdornment === 'number'\n\n let adornmentNode: ReactNode = null\n if (hasAdornment) {\n if (isTextAdornment) {\n adornmentNode = <span className={styles.textAdornment}>{effAdornment}</span>\n } else if (effOnAdornmentClick) {\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={effAdornmentLabel}\n onClick={effOnAdornmentClick}\n // Don't steal focus from the input on click — keeps the control's focus ring tied to the\n // input itself (clicking the icon shouldn't light up the field's :focus-within ring).\n onMouseDown={(event) => event.preventDefault()}\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n } else {\n // Decorative icon: same IconButton box (so it sizes identically to the clickable one),\n // but non-interactive and hidden from the a11y tree.\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n nonClickable\n aria-hidden=\"true\"\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n }\n }\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 as CSSProperties}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\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 </label>\n )}\n\n <div\n className={clsx(\n styles.control,\n hasAdornment && effAdornmentPosition === 'left' && styles.hasLeftAdornment,\n hasAdornment && effAdornmentPosition === 'right' && styles.hasRightAdornment,\n )}\n >\n {effAdornmentPosition === 'left' && adornmentNode}\n <input\n ref={setInputRef}\n id={id}\n name={name}\n type={inputType}\n className={styles.input}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n disabled={disabled}\n aria-invalid={resolvedError || undefined}\n aria-describedby={describedBy}\n {...props}\n />\n {effAdornmentPosition === 'right' && adornmentNode}\n </div>\n\n {capsLockWarning && capsOn && (\n <Typography\n as=\"span\"\n id={capsId}\n variant=\"bodySmall\"\n color=\"warning\"\n className={styles.caps}\n role=\"alert\"\n >\n <Icon name=\"Danger\" />\n {t('textField.capsLock')}\n </Typography>\n )}\n\n {strength && (\n <div\n className={styles.strength}\n style={\n {\n '--tz-strength-color': `var(--tz-color-${STRENGTH_META[strength].color})`,\n } as CSSProperties\n }\n >\n <span className={styles.strengthBars} aria-hidden=\"true\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={styles.strengthBar}\n data-on={i < STRENGTH_META[strength].bars}\n />\n ))}\n </span>\n <Typography\n as=\"span\"\n id={strengthId}\n variant=\"bodySmall\"\n color={STRENGTH_META[strength].color}\n className={styles.strengthLabel}\n >\n {t(STRENGTH_META[strength].labelKey)}\n </Typography>\n </div>\n )}\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":["MASK_TOKENS","applyMask","raw","mask","out","i","m","token","stripMaskLiterals","value","literals","c","SIGNIFICANT","maskCaretPosition","rawBeforeCaret","masked","target","count","scorePassword","pw","score","strengthLevel","STRENGTH_META","TextField","forwardRef","label","size","error","helperText","required","fullWidth","adornment","adornmentPosition","onAdornmentClick","adornmentLabel","regex","passwordToggle","capsLockWarning","passwordStrength","name","defaultValue","onChange","onBlur","onFocus","onKeyDown","onKeyUp","disabled","type","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","bound","resolvedError","resolvedHelperText","isControlled","internal","setInternal","useState","currentValue","innerRef","useRef","setInputRef","useCallback","node","pendingCaret","useLayoutEffect","pos","_a","handleChange","event","el","next","caret","candidate","handleBlur","setCapsOn","capsOn","readCaps","handleKeyDown","handleKeyUp","revealed","setRevealed","isPasswordField","showReveal","inputType","effAdornment","jsx","Icon","effAdornmentPosition","effOnAdornmentClick","shown","effAdornmentLabel","strength","strengthId","capsId","describedBy","hasAdornment","isTextAdornment","adornmentNode","styles","IconButton","jsxs","clsx","Typography"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextField-DcdwUA9d.js","sources":["../src/components/TextField/TextField.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type FocusEvent,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type MessageKey, type ThemeColor } from '../../theme'\nimport { useFormContext } from '../../form/formContext'\nimport { Icon } from '../Icon'\nimport { IconButton } from '../IconButton'\nimport { Typography } from '../Typography'\nimport styles from './TextField.module.css'\n\nexport type TextFieldSize = 'sm' | 'md' | 'lg'\nexport type TextFieldAdornmentPosition = 'left' | 'right'\n\n/** Mask token → matcher. Any other character in a mask is treated as a literal. */\nconst MASK_TOKENS: Record<string, RegExp> = {\n 9: /[0-9]/, // digit\n a: /[A-Za-z]/, // letter\n '*': /[A-Za-z0-9]/, // alphanumeric\n}\n\n/** Formats `raw` against `mask` (`9` digit · `a` letter · `*` alphanumeric · everything else literal). */\nfunction applyMask(raw: string, mask: string): string {\n let out = ''\n let i = 0\n for (const m of mask) {\n const token = MASK_TOKENS[m]\n if (token) {\n while (i < raw.length && !token.test(raw[i])) i++ // skip chars that don't fit this slot\n if (i >= raw.length) break\n out += raw[i]\n i++\n } else {\n if (i >= raw.length) break // don't show a trailing literal until there's more input\n if (raw[i] === m) i++ // consume an already-present literal so it isn't re-read\n out += m\n }\n }\n return out\n}\n\n/** Drops the mask's literal characters, leaving only the data the user actually entered. */\nfunction stripMaskLiterals(value: string, mask: string): string {\n const literals = new Set([...mask].filter((c) => !MASK_TOKENS[c]))\n return [...value].filter((c) => !literals.has(c)).join('')\n}\n\n/**\n * Where to place the caret after re-masking: keep it after the same number of \"significant\"\n * (data, i.e. alphanumeric) chars it followed in the raw input — so inserting mid-value doesn't\n * jump the caret to the end. Literal mask chars (spaces, `()`, `-`, …) don't count.\n */\nconst SIGNIFICANT = /[A-Za-z0-9]/\nfunction maskCaretPosition(rawBeforeCaret: string, masked: string): number {\n const target = (rawBeforeCaret.match(/[A-Za-z0-9]/g) ?? []).length\n if (target <= 0) return 0\n let count = 0\n for (let i = 0; i < masked.length; i++) {\n if (SIGNIFICANT.test(masked[i])) {\n count += 1\n if (count === target) return i + 1\n }\n }\n return masked.length\n}\n\n/** Password-strength buckets surfaced by the `passwordStrength` meter. */\nexport type PasswordStrength = 'weak' | 'medium' | 'strong'\n\n/**\n * A cheap, dependency-free password score: one point each for length ≥ 8, mixed upper/lower case, a\n * digit, and a symbol → 0–4. Empty input scores 0 (the meter hides). Not a security guarantee — a UX\n * hint that nudges toward longer, more varied passwords.\n */\nfunction scorePassword(pw: string): number {\n if (!pw) return 0\n let score = 0\n if (pw.length >= 8) score += 1\n if (/[a-z]/.test(pw) && /[A-Z]/.test(pw)) score += 1\n if (/\\d/.test(pw)) score += 1\n if (/[^A-Za-z0-9]/.test(pw)) score += 1\n return score\n}\n\n/** Maps a 0–4 score to a strength bucket (`null` when there's nothing to show). */\nfunction strengthLevel(score: number): PasswordStrength | null {\n if (score <= 0) return null\n if (score === 1) return 'weak'\n if (score === 2) return 'medium'\n return 'strong'\n}\n\nconst STRENGTH_META: Record<\n PasswordStrength,\n { labelKey: MessageKey; color: ThemeColor; bars: number }\n> = {\n weak: { labelKey: 'textField.strengthWeak', color: 'error', bars: 1 },\n medium: { labelKey: 'textField.strengthMedium', color: 'warning', bars: 2 },\n strong: { labelKey: 'textField.strengthStrong', color: 'success', bars: 3 },\n}\n\nexport interface TextFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'prefix'\n> {\n /** Label rendered above the field. */\n label?: ReactNode\n /** Preset size — drives the control height (`--tz-control-height-*`), font size and padding. */\n size?: TextFieldSize\n /** Marks the field invalid: red border/focus ring and the `helperText` shown 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 (visual hint only — combine with native `required` if needed). */\n required?: boolean\n /** Stretches the field to fill its container width. Defaults to `true`. */\n fullWidth?: boolean\n /**\n * Content shown inside the field. A **string/number** renders as a muted prefix/suffix\n * (e.g. `\"https://\"`, `\"$\"`, `\"kg\"`); any other node renders as an icon (typically an `<Icon />`)\n * inside a square `IconButton` box.\n */\n adornment?: ReactNode\n /** Which side the adornment sits on. Defaults to `left`. */\n adornmentPosition?: TextFieldAdornmentPosition\n /** Makes an icon adornment a clickable `IconButton` and fires this on click (ignored for string adornments). */\n onAdornmentClick?: (event: MouseEvent<HTMLButtonElement>) => void\n /** Accessible label for the clickable icon adornment (used when `onAdornmentClick` is set). Defaults to `\"Field action\"`. */\n adornmentLabel?: string\n /** Allowed-input filter: a change whose value fails this pattern is rejected (e.g. `/^\\d*$/` for digits only). */\n regex?: RegExp\n /** Input mask, e.g. `\"(999) 999-9999\"` (`9` digit · `a` letter · `*` alphanumeric · other chars literal). Emits the masked value. */\n mask?: string\n /**\n * For `type=\"password\"`: show the built-in show/hide reveal toggle in the right adornment slot.\n * Defaults to `true`. Set `false` to drop it (e.g. to use your own right adornment instead).\n */\n passwordToggle?: boolean\n /**\n * Show a \"Caps Lock is on\" warning under the field while it's focused and Caps Lock is active.\n * Detected from key events, so it appears once the user starts typing. Defaults to `false`.\n */\n capsLockWarning?: boolean\n /**\n * Show a password-strength meter (segmented bar + label) under the field, derived from the current\n * value. A UX hint only — not a security check. Defaults to `false` (best paired with `type=\"password\"`).\n */\n passwordStrength?: boolean\n}\n\n/**\n * A labeled text input. Renders an optional label and helper/validation text, an\n * error state (red border + helper), and an optional `adornment` on either side —\n * a string prefix/suffix (e.g. `\"https://\"`) or an icon, which can be made\n * interactive via `onAdornmentClick`. Supports an allowed-input `regex` filter and\n * a formatting `mask`. Works controlled (`value` + `onChange`) or uncontrolled\n * (`defaultValue`); when a `mask` is set, `onChange` emits the masked value. Passing\n * `type=\"password\"` automatically adds a show/hide reveal toggle in the right adornment\n * slot. Inside a `<Form>`, a `name` prop auto-binds value/validation from the form (no need to\n * spread `field()`). Styling comes entirely from `--tz-*` tokens.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n label,\n size = 'md',\n error,\n helperText,\n required = false,\n fullWidth = true,\n adornment,\n adornmentPosition = 'left',\n onAdornmentClick,\n adornmentLabel,\n regex,\n mask,\n passwordToggle = true,\n capsLockWarning = false,\n passwordStrength = false,\n name,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n disabled = false,\n type,\n id: idProp,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const reactId = useId()\n const id = idProp ?? reactId\n const helperId = `${id}-helper`\n\n // Auto-bind to a surrounding <Form> by `name` — so `<TextField name=\"email\" />` just works,\n // pulling value/onChange/onBlur/error/helperText from the form. Explicit props still win.\n const form = useFormContext()\n const bound = form && name ? form.field(name) : undefined\n\n const resolvedError = error ?? bound?.error ?? false\n const resolvedHelperText = helperText ?? bound?.helperText\n\n const isControlled = value !== undefined || bound !== undefined\n const [internal, setInternal] = useState<string>(defaultValue != null ? String(defaultValue) : '')\n const currentValue = value !== undefined ? value : bound ? bound.value : internal\n\n // merge the consumer ref with an internal one so we can restore the caret after re-masking\n const innerRef = useRef<HTMLInputElement | null>(null)\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as { current: HTMLInputElement | null }).current = node\n },\n [ref],\n )\n const pendingCaret = useRef<number | null>(null)\n useLayoutEffect(() => {\n const pos = pendingCaret.current\n if (pos == null) return\n pendingCaret.current = null\n innerRef.current?.setSelectionRange(pos, pos)\n })\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const el = event.target\n let next = el.value\n if (mask) {\n const caret = el.selectionStart ?? el.value.length\n const rawBeforeCaret = el.value.slice(0, caret) // capture before applyMask reassigns `next`\n next = applyMask(next, mask)\n // keep the caret after the same run of data chars, so mid-value edits don't jump to the end\n pendingCaret.current = maskCaretPosition(rawBeforeCaret, next)\n }\n if (regex) {\n const candidate = mask ? stripMaskLiterals(next, mask) : next\n if (!regex.test(candidate)) {\n pendingCaret.current = null\n return // reject the change, leaving the value unchanged\n }\n }\n if (!isControlled) setInternal(next)\n el.value = next // hand consumers the masked/filtered value\n bound?.onChange(event)\n onChange?.(event)\n }\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setCapsOn(false) // hide the Caps Lock hint once focus leaves the field\n bound?.onBlur(event)\n onBlur?.(event)\n }\n\n // Caps Lock warning — read the modifier off key events (can't be known until the user types), and\n // clear it on blur. Cheap: only tracks state when the feature is enabled.\n const [capsOn, setCapsOn] = useState(false)\n const readCaps = (event: KeyboardEvent<HTMLInputElement>) => {\n if (capsLockWarning) setCapsOn(event.getModifierState?.('CapsLock') ?? false)\n }\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyDown?.(event)\n }\n const handleKeyUp = (event: KeyboardEvent<HTMLInputElement>) => {\n readCaps(event)\n onKeyUp?.(event)\n }\n\n // Password fields get an automatic reveal toggle in the (right) adornment slot (unless\n // `passwordToggle={false}`); it flips the input between `password`/`text` and overrides any\n // adornment props for that field.\n const [revealed, setRevealed] = useState(false)\n const isPasswordField = type === 'password'\n const showReveal = isPasswordField && passwordToggle\n const inputType = isPasswordField && revealed ? 'text' : type\n\n const effAdornment = showReveal ? <Icon name={revealed ? 'EyeSlash' : 'Eye'} /> : adornment\n const effAdornmentPosition = showReveal ? 'right' : adornmentPosition\n const effOnAdornmentClick = showReveal ? () => setRevealed((shown) => !shown) : onAdornmentClick\n const effAdornmentLabel = showReveal\n ? revealed\n ? t('textField.hidePassword')\n : t('textField.showPassword')\n : (adornmentLabel ?? t('textField.fieldAction'))\n\n // Password-strength meter, derived from the current value (a UX hint, not a security check).\n const strength = passwordStrength\n ? strengthLevel(scorePassword(String(currentValue ?? '')))\n : null\n const strengthId = `${id}-strength`\n const capsId = `${id}-caps`\n const describedBy =\n [resolvedHelperText != null ? helperId : null, capsLockWarning && capsOn ? capsId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n const hasAdornment = effAdornment != null && effAdornment !== false\n const isTextAdornment = typeof effAdornment === 'string' || typeof effAdornment === 'number'\n\n let adornmentNode: ReactNode = null\n if (hasAdornment) {\n if (isTextAdornment) {\n adornmentNode = <span className={styles.textAdornment}>{effAdornment}</span>\n } else if (effOnAdornmentClick) {\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n aria-label={effAdornmentLabel}\n onClick={effOnAdornmentClick}\n // Don't steal focus from the input on click — keeps the control's focus ring tied to the\n // input itself (clicking the icon shouldn't light up the field's :focus-within ring).\n onMouseDown={(event) => event.preventDefault()}\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n } else {\n // Decorative icon: same IconButton box (so it sizes identically to the clickable one),\n // but non-interactive and hidden from the a11y tree.\n adornmentNode = (\n <IconButton\n variant=\"text\"\n color=\"primary\"\n size={size}\n disabled={disabled}\n nonClickable\n aria-hidden=\"true\"\n className={styles.iconButton}\n >\n {effAdornment}\n </IconButton>\n )\n }\n }\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 as CSSProperties}\n >\n {label != null && (\n <label htmlFor={id} className={styles.label}>\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 </label>\n )}\n\n <div\n className={clsx(\n styles.control,\n hasAdornment && effAdornmentPosition === 'left' && styles.hasLeftAdornment,\n hasAdornment && effAdornmentPosition === 'right' && styles.hasRightAdornment,\n )}\n >\n {effAdornmentPosition === 'left' && adornmentNode}\n <input\n ref={setInputRef}\n id={id}\n name={name}\n type={inputType}\n className={styles.input}\n value={currentValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n disabled={disabled}\n aria-invalid={resolvedError || undefined}\n aria-describedby={describedBy}\n {...props}\n />\n {effAdornmentPosition === 'right' && adornmentNode}\n </div>\n\n {capsLockWarning && capsOn && (\n <Typography\n as=\"span\"\n id={capsId}\n variant=\"bodySmall\"\n color=\"warning\"\n className={styles.caps}\n role=\"alert\"\n >\n <Icon name=\"Danger\" />\n {t('textField.capsLock')}\n </Typography>\n )}\n\n {strength && (\n <div\n className={styles.strength}\n style={\n {\n '--tz-strength-color': `var(--tz-color-${STRENGTH_META[strength].color})`,\n } as CSSProperties\n }\n >\n <span className={styles.strengthBars} aria-hidden=\"true\">\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className={styles.strengthBar}\n data-on={i < STRENGTH_META[strength].bars}\n />\n ))}\n </span>\n <Typography\n as=\"span\"\n id={strengthId}\n variant=\"bodySmall\"\n color={STRENGTH_META[strength].color}\n className={styles.strengthLabel}\n >\n {t(STRENGTH_META[strength].labelKey)}\n </Typography>\n </div>\n )}\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":["MASK_TOKENS","applyMask","raw","mask","out","i","m","token","stripMaskLiterals","value","literals","c","SIGNIFICANT","maskCaretPosition","rawBeforeCaret","masked","target","count","scorePassword","pw","score","strengthLevel","STRENGTH_META","TextField","forwardRef","label","size","error","helperText","required","fullWidth","adornment","adornmentPosition","onAdornmentClick","adornmentLabel","regex","passwordToggle","capsLockWarning","passwordStrength","name","defaultValue","onChange","onBlur","onFocus","onKeyDown","onKeyUp","disabled","type","idProp","className","style","props","ref","t","useT","reactId","useId","id","helperId","form","useFormContext","bound","resolvedError","resolvedHelperText","isControlled","internal","setInternal","useState","currentValue","innerRef","useRef","setInputRef","useCallback","node","pendingCaret","useLayoutEffect","pos","_a","handleChange","event","el","next","caret","candidate","handleBlur","setCapsOn","capsOn","readCaps","handleKeyDown","handleKeyUp","revealed","setRevealed","isPasswordField","showReveal","inputType","effAdornment","jsx","Icon","effAdornmentPosition","effOnAdornmentClick","shown","effAdornmentLabel","strength","strengthId","capsId","describedBy","hasAdornment","isTextAdornment","adornmentNode","styles","IconButton","jsxs","clsx","Typography"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as m } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as s } from "react";
|
|
3
|
-
import { I as f } from "./Icon-
|
|
4
|
-
import { I as g } from "./IconButton-
|
|
5
|
-
import { m as T, a as d } from "./ConfigProvider-
|
|
3
|
+
import { I as f } from "./Icon-DaTvzLBu.js";
|
|
4
|
+
import { I as g } from "./IconButton-DXMmtuLA.js";
|
|
5
|
+
import { m as T, a as d } from "./ConfigProvider-DT0yrgmd.js";
|
|
6
6
|
const x = s(function({ variant: n = "outlined", ...e }, a) {
|
|
7
7
|
const { mode: r, toggleMode: i } = T(), c = d(), o = r === "dark";
|
|
8
8
|
return /* @__PURE__ */ m(
|
|
@@ -25,4 +25,4 @@ const x = s(function({ variant: n = "outlined", ...e }, a) {
|
|
|
25
25
|
export {
|
|
26
26
|
x as T
|
|
27
27
|
};
|
|
28
|
-
//# sourceMappingURL=ThemeToggle-
|
|
28
|
+
//# sourceMappingURL=ThemeToggle-BVQmSMsj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeToggle-
|
|
1
|
+
{"version":3,"file":"ThemeToggle-BVQmSMsj.js","sources":["../src/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { useTheme, useT } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton, type IconButtonProps } from '../IconButton'\n\n/** Inherits `IconButton`'s look (variant, color, size); the icon and toggle behavior are built in. */\nexport type ThemeToggleProps = Omit<IconButtonProps, 'children'>\n\n/**\n * A one-tap color-theme switch. Renders an `IconButton` showing the `Sun` icon\n * in light mode and the `Moon` icon in dark mode, and flips `mode` on click.\n * Styling comes from `IconButton`, so `variant`, `color` and `size` pass through.\n */\nexport const ThemeToggle = forwardRef<HTMLButtonElement, ThemeToggleProps>(function ThemeToggle(\n { variant = 'outlined', ...props },\n ref,\n) {\n const { mode, toggleMode } = useTheme()\n const t = useT()\n const isDark = mode === 'dark'\n\n return (\n <IconButton\n ref={ref}\n variant={variant}\n role=\"switch\"\n aria-checked={isDark}\n aria-label={t('themeToggle.label')}\n {...props}\n onClick={(event) => {\n props.onClick?.(event) // preserve a caller-supplied handler, then toggle\n toggleMode()\n }}\n >\n <Icon name={isDark ? 'Moon' : 'Sun'} />\n </IconButton>\n )\n})\n"],"names":["ThemeToggle","forwardRef","variant","props","ref","mode","toggleMode","useTheme","t","useT","isDark","jsx","IconButton","event","_a","Icon"],"mappings":";;;;;AAaO,MAAMA,IAAcC,EAAgD,SACzE,EAAE,SAAAC,IAAU,YAAY,GAAGC,EAAA,GAC3BC,GACA;AACA,QAAM,EAAE,MAAAC,GAAM,YAAAC,EAAA,IAAeC,EAAA,GACvBC,IAAIC,EAAA,GACJC,IAASL,MAAS;AAExB,SACE,gBAAAM;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,KAAAR;AAAA,MACA,SAAAF;AAAA,MACA,MAAK;AAAA,MACL,gBAAcQ;AAAA,MACd,cAAYF,EAAE,mBAAmB;AAAA,MAChC,GAAGL;AAAA,MACJ,SAAS,CAACU,MAAU;;AAClB,SAAAC,IAAAX,EAAM,YAAN,QAAAW,EAAA,KAAAX,GAAgBU,IAChBP,EAAA;AAAA,MACF;AAAA,MAEA,UAAA,gBAAAK,EAACI,GAAA,EAAK,MAAML,IAAS,SAAS,MAAA,CAAO;AAAA,IAAA;AAAA,EAAA;AAG3C,CAAC;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const t=require("react/jsx-runtime"),g=require("react"),T=require("./Icon-
|
|
2
|
-
//# sourceMappingURL=ThemeToggle-
|
|
1
|
+
"use strict";const t=require("react/jsx-runtime"),g=require("react"),T=require("./Icon-BVULqOJD.cjs"),d=require("./IconButton-Lv0sDDR9.cjs"),c=require("./ConfigProvider-C7DUWHrb.cjs"),h=g.forwardRef(function({variant:r="outlined",...e},i){const{mode:u,toggleMode:l}=c.useTheme(),s=c.useT(),n=u==="dark";return t.jsx(d.IconButton,{ref:i,variant:r,role:"switch","aria-checked":n,"aria-label":s("themeToggle.label"),...e,onClick:a=>{var o;(o=e.onClick)==null||o.call(e,a),l()},children:t.jsx(T.Icon,{name:n?"Moon":"Sun"})})});exports.ThemeToggle=h;
|
|
2
|
+
//# sourceMappingURL=ThemeToggle-isboxfZk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeToggle-
|
|
1
|
+
{"version":3,"file":"ThemeToggle-isboxfZk.cjs","sources":["../src/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { useTheme, useT } from '../../theme'\nimport { Icon } from '../Icon'\nimport { IconButton, type IconButtonProps } from '../IconButton'\n\n/** Inherits `IconButton`'s look (variant, color, size); the icon and toggle behavior are built in. */\nexport type ThemeToggleProps = Omit<IconButtonProps, 'children'>\n\n/**\n * A one-tap color-theme switch. Renders an `IconButton` showing the `Sun` icon\n * in light mode and the `Moon` icon in dark mode, and flips `mode` on click.\n * Styling comes from `IconButton`, so `variant`, `color` and `size` pass through.\n */\nexport const ThemeToggle = forwardRef<HTMLButtonElement, ThemeToggleProps>(function ThemeToggle(\n { variant = 'outlined', ...props },\n ref,\n) {\n const { mode, toggleMode } = useTheme()\n const t = useT()\n const isDark = mode === 'dark'\n\n return (\n <IconButton\n ref={ref}\n variant={variant}\n role=\"switch\"\n aria-checked={isDark}\n aria-label={t('themeToggle.label')}\n {...props}\n onClick={(event) => {\n props.onClick?.(event) // preserve a caller-supplied handler, then toggle\n toggleMode()\n }}\n >\n <Icon name={isDark ? 'Moon' : 'Sun'} />\n </IconButton>\n )\n})\n"],"names":["ThemeToggle","forwardRef","variant","props","ref","mode","toggleMode","useTheme","t","useT","isDark","jsx","IconButton","event","_a","Icon"],"mappings":"wLAaaA,EAAcC,EAAAA,WAAgD,SACzE,CAAE,QAAAC,EAAU,WAAY,GAAGC,CAAA,EAC3BC,EACA,CACA,KAAM,CAAE,KAAAC,EAAM,WAAAC,CAAA,EAAeC,WAAA,EACvBC,EAAIC,EAAAA,KAAA,EACJC,EAASL,IAAS,OAExB,OACEM,EAAAA,IAACC,EAAAA,WAAA,CACC,IAAAR,EACA,QAAAF,EACA,KAAK,SACL,eAAcQ,EACd,aAAYF,EAAE,mBAAmB,EAChC,GAAGL,EACJ,QAAUU,GAAU,QAClBC,EAAAX,EAAM,UAAN,MAAAW,EAAA,KAAAX,EAAgBU,GAChBP,EAAA,CACF,EAEA,SAAAK,EAAAA,IAACI,OAAA,CAAK,KAAML,EAAS,OAAS,KAAA,CAAO,CAAA,CAAA,CAG3C,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as w, jsx as d } from "react/jsx-runtime";
|
|
|
2
2
|
import { useRef as M, useState as N, useEffect as v } from "react";
|
|
3
3
|
import { clsx as O } from "clsx";
|
|
4
4
|
import { t as P, r as S, g as T } from "./DatePicker.module-BZDftL4g.js";
|
|
5
|
-
import { a as q } from "./ConfigProvider-
|
|
5
|
+
import { a as q } from "./ConfigProvider-DT0yrgmd.js";
|
|
6
6
|
const E = "_popover_1mo4p_5", H = "_tabs_1mo4p_13", R = "_timePane_1mo4p_30", j = "_timeCols_1mo4p_36", A = "_timeCol_1mo4p_36", K = "_timeColLabel_1mo4p_47", V = "_timeScroll_1mo4p_57", g = "_timeCell_1mo4p_85", B = "_timeCellSelected_1mo4p_110", F = "_footer_1mo4p_120", f = {
|
|
7
7
|
popover: E,
|
|
8
8
|
tabs: H,
|
|
@@ -144,4 +144,4 @@ export {
|
|
|
144
144
|
W as T,
|
|
145
145
|
f as d
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=TimeColumns-
|
|
147
|
+
//# sourceMappingURL=TimeColumns-CFy_PynH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeColumns-D3nqkQbh.js","sources":["../src/components/DateTimePicker/TimeColumns.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { pad2, range, today, type Dayjs } from '../DatePicker/dateUtils'\nimport styles from './DateTimePicker.module.css'\n\nexport interface TimeColumnsProps {\n /** The working datetime (selected value) or null. */\n value: Dayjs | null\n /** Emit the next datetime when an hour / minute / second / meridiem is chosen. */\n onChange: (next: Dayjs) => void\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). */\n hour12: boolean\n /** Minute increment for the minutes column. */\n minuteStep: number\n /** Show a seconds column. */\n showSeconds: boolean\n /** Focus the hours column on mount (when there's no calendar to take focus, e.g. `TimePicker`). */\n autoFocus?: boolean\n}\n\ninterface Option<V> {\n value: V\n label: string\n}\n\n/** One scrollable, roving-focus column of time options (hours / minutes / seconds / meridiem). */\nfunction TimeList<V>({\n options,\n selected,\n onSelect,\n label,\n autoFocus,\n}: {\n options: Option<V>[]\n selected: V | null\n onSelect: (value: V) => void\n label: string\n autoFocus?: boolean\n}) {\n const listRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n const selectedIndex = options.findIndex((o) => o.value === selected)\n const [focusedIndex, setFocusedIndex] = useState(selectedIndex >= 0 ? selectedIndex : 0)\n\n // re-anchor roving focus to the selected option and scroll it into view when it changes externally\n useEffect(() => {\n if (selectedIndex >= 0) setFocusedIndex(selectedIndex)\n const el =\n listRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected])\n\n // move DOM focus to the roving option after a keyboard move\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focusedIndex])\n\n const move = (index: number) => {\n focusOnRender.current = true\n setFocusedIndex(Math.max(0, Math.min(options.length - 1, index)))\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n move(focusedIndex - 1)\n break\n case 'ArrowDown':\n event.preventDefault()\n move(focusedIndex + 1)\n break\n case 'Home':\n event.preventDefault()\n move(0)\n break\n case 'End':\n event.preventDefault()\n move(options.length - 1)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n onSelect(options[focusedIndex].value)\n break\n }\n }\n\n return (\n <div className={styles.timeCol}>\n <span className={styles.timeColLabel}>{label}</span>\n <div\n ref={listRef}\n className={styles.timeScroll}\n role=\"listbox\"\n aria-label={label}\n onKeyDown={handleKeyDown}\n >\n {options.map((opt, i) => {\n const isSelected = opt.value === selected\n return (\n <button\n key={opt.label}\n type=\"button\"\n role=\"option\"\n className={clsx(styles.timeCell, isSelected && styles.timeCellSelected)}\n tabIndex={i === focusedIndex ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => onSelect(opt.value)}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst numberOptions = (values: number[]): Option<number>[] =>\n values.map((v) => ({ value: v, label: pad2(v) }))\n\n/**\n * The time-picker columns shown beside the calendar in `DateTimePicker`. Scrollable hour + minute\n * (+ optional seconds) lists plus an AM/PM toggle in 12-hour mode — each a roving-focus listbox. All\n * math is UTC; each pick keeps the rest of the datetime intact (changing the hour preserves\n * minutes/seconds, etc.). When `value` is null a pick anchors to today's date at the chosen time.\n */\nexport function TimeColumns({\n value,\n onChange,\n hour12,\n minuteStep,\n showSeconds,\n autoFocus,\n}: TimeColumnsProps) {\n const t = useT()\n const meridiemOptions: Option<boolean>[] = [\n { value: false, label: t('time.am') },\n { value: true, label: t('time.pm') },\n ]\n const base = value ?? today()\n const h24 = base.hour()\n const isPM = h24 >= 12\n const step = minuteStep >= 1 ? Math.floor(minuteStep) : 1\n\n const hourOptions = numberOptions(hour12 ? range(1, 12) : range(0, 23))\n const selectedHour = value ? (hour12 ? h24 % 12 || 12 : h24) : null\n\n // snap the highlighted minute to the nearest step so a non-aligned value (e.g. :37 with step 15)\n // still lands on a real option — otherwise selectedIndex is -1 and roving focus sticks at :00\n const maxMinuteOption = Math.floor(59 / step) * step\n const selectedMinute = value\n ? Math.min(Math.round(base.minute() / step) * step, maxMinuteOption)\n : null\n\n const pickHour = (h: number) =>\n onChange(hour12 ? base.hour((h % 12) + (isPM ? 12 : 0)) : base.hour(h))\n const pickMinute = (m: number) => onChange(base.minute(m))\n const pickSecond = (s: number) => onChange(base.second(s))\n const pickMeridiem = (pm: boolean) =>\n onChange(pm === isPM ? base : base.hour(pm ? h24 + 12 : h24 - 12))\n\n return (\n <div className={styles.timeCols}>\n <TimeList\n options={hourOptions}\n selected={selectedHour}\n onSelect={pickHour}\n label={t('time.hour')}\n autoFocus={autoFocus}\n />\n <TimeList\n options={numberOptions(range(0, 59, step))}\n selected={selectedMinute}\n onSelect={pickMinute}\n label={t('time.minute')}\n />\n {showSeconds && (\n <TimeList\n options={numberOptions(range(0, 59))}\n selected={value ? base.second() : null}\n onSelect={pickSecond}\n label={t('time.second')}\n />\n )}\n {hour12 && (\n <TimeList\n options={meridiemOptions}\n selected={value ? isPM : null}\n onSelect={pickMeridiem}\n label={t('time.meridiem')}\n />\n )}\n </div>\n )\n}\n"],"names":["TimeList","options","selected","onSelect","label","autoFocus","listRef","useRef","focusOnRender","selectedIndex","o","focusedIndex","setFocusedIndex","useState","useEffect","el","_a","_b","_c","move","index","handleKeyDown","event","jsxs","styles","jsx","opt","i","isSelected","clsx","numberOptions","values","v","pad2","TimeColumns","value","onChange","hour12","minuteStep","showSeconds","t","useT","meridiemOptions","base","today","h24","isPM","step","hourOptions","range","selectedHour","maxMinuteOption","selectedMinute","pickHour","h","pickMinute","m","pickSecond","s","pickMeridiem","pm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimeColumns-CFy_PynH.js","sources":["../src/components/DateTimePicker/TimeColumns.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { pad2, range, today, type Dayjs } from '../DatePicker/dateUtils'\nimport styles from './DateTimePicker.module.css'\n\nexport interface TimeColumnsProps {\n /** The working datetime (selected value) or null. */\n value: Dayjs | null\n /** Emit the next datetime when an hour / minute / second / meridiem is chosen. */\n onChange: (next: Dayjs) => void\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). */\n hour12: boolean\n /** Minute increment for the minutes column. */\n minuteStep: number\n /** Show a seconds column. */\n showSeconds: boolean\n /** Focus the hours column on mount (when there's no calendar to take focus, e.g. `TimePicker`). */\n autoFocus?: boolean\n}\n\ninterface Option<V> {\n value: V\n label: string\n}\n\n/** One scrollable, roving-focus column of time options (hours / minutes / seconds / meridiem). */\nfunction TimeList<V>({\n options,\n selected,\n onSelect,\n label,\n autoFocus,\n}: {\n options: Option<V>[]\n selected: V | null\n onSelect: (value: V) => void\n label: string\n autoFocus?: boolean\n}) {\n const listRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n const selectedIndex = options.findIndex((o) => o.value === selected)\n const [focusedIndex, setFocusedIndex] = useState(selectedIndex >= 0 ? selectedIndex : 0)\n\n // re-anchor roving focus to the selected option and scroll it into view when it changes externally\n useEffect(() => {\n if (selectedIndex >= 0) setFocusedIndex(selectedIndex)\n const el =\n listRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected])\n\n // move DOM focus to the roving option after a keyboard move\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focusedIndex])\n\n const move = (index: number) => {\n focusOnRender.current = true\n setFocusedIndex(Math.max(0, Math.min(options.length - 1, index)))\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n move(focusedIndex - 1)\n break\n case 'ArrowDown':\n event.preventDefault()\n move(focusedIndex + 1)\n break\n case 'Home':\n event.preventDefault()\n move(0)\n break\n case 'End':\n event.preventDefault()\n move(options.length - 1)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n onSelect(options[focusedIndex].value)\n break\n }\n }\n\n return (\n <div className={styles.timeCol}>\n <span className={styles.timeColLabel}>{label}</span>\n <div\n ref={listRef}\n className={styles.timeScroll}\n role=\"listbox\"\n aria-label={label}\n onKeyDown={handleKeyDown}\n >\n {options.map((opt, i) => {\n const isSelected = opt.value === selected\n return (\n <button\n key={opt.label}\n type=\"button\"\n role=\"option\"\n className={clsx(styles.timeCell, isSelected && styles.timeCellSelected)}\n tabIndex={i === focusedIndex ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => onSelect(opt.value)}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst numberOptions = (values: number[]): Option<number>[] =>\n values.map((v) => ({ value: v, label: pad2(v) }))\n\n/**\n * The time-picker columns shown beside the calendar in `DateTimePicker`. Scrollable hour + minute\n * (+ optional seconds) lists plus an AM/PM toggle in 12-hour mode — each a roving-focus listbox. All\n * math is UTC; each pick keeps the rest of the datetime intact (changing the hour preserves\n * minutes/seconds, etc.). When `value` is null a pick anchors to today's date at the chosen time.\n */\nexport function TimeColumns({\n value,\n onChange,\n hour12,\n minuteStep,\n showSeconds,\n autoFocus,\n}: TimeColumnsProps) {\n const t = useT()\n const meridiemOptions: Option<boolean>[] = [\n { value: false, label: t('time.am') },\n { value: true, label: t('time.pm') },\n ]\n const base = value ?? today()\n const h24 = base.hour()\n const isPM = h24 >= 12\n const step = minuteStep >= 1 ? Math.floor(minuteStep) : 1\n\n const hourOptions = numberOptions(hour12 ? range(1, 12) : range(0, 23))\n const selectedHour = value ? (hour12 ? h24 % 12 || 12 : h24) : null\n\n // snap the highlighted minute to the nearest step so a non-aligned value (e.g. :37 with step 15)\n // still lands on a real option — otherwise selectedIndex is -1 and roving focus sticks at :00\n const maxMinuteOption = Math.floor(59 / step) * step\n const selectedMinute = value\n ? Math.min(Math.round(base.minute() / step) * step, maxMinuteOption)\n : null\n\n const pickHour = (h: number) =>\n onChange(hour12 ? base.hour((h % 12) + (isPM ? 12 : 0)) : base.hour(h))\n const pickMinute = (m: number) => onChange(base.minute(m))\n const pickSecond = (s: number) => onChange(base.second(s))\n const pickMeridiem = (pm: boolean) =>\n onChange(pm === isPM ? base : base.hour(pm ? h24 + 12 : h24 - 12))\n\n return (\n <div className={styles.timeCols}>\n <TimeList\n options={hourOptions}\n selected={selectedHour}\n onSelect={pickHour}\n label={t('time.hour')}\n autoFocus={autoFocus}\n />\n <TimeList\n options={numberOptions(range(0, 59, step))}\n selected={selectedMinute}\n onSelect={pickMinute}\n label={t('time.minute')}\n />\n {showSeconds && (\n <TimeList\n options={numberOptions(range(0, 59))}\n selected={value ? base.second() : null}\n onSelect={pickSecond}\n label={t('time.second')}\n />\n )}\n {hour12 && (\n <TimeList\n options={meridiemOptions}\n selected={value ? isPM : null}\n onSelect={pickMeridiem}\n label={t('time.meridiem')}\n />\n )}\n </div>\n )\n}\n"],"names":["TimeList","options","selected","onSelect","label","autoFocus","listRef","useRef","focusOnRender","selectedIndex","o","focusedIndex","setFocusedIndex","useState","useEffect","el","_a","_b","_c","move","index","handleKeyDown","event","jsxs","styles","jsx","opt","i","isSelected","clsx","numberOptions","values","v","pad2","TimeColumns","value","onChange","hour12","minuteStep","showSeconds","t","useT","meridiemOptions","base","today","h24","isPM","step","hourOptions","range","selectedHour","maxMinuteOption","selectedMinute","pickHour","h","pickMinute","m","pickSecond","s","pickMeridiem","pm"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const i=require("react/jsx-runtime"),C=require("react"),w=require("clsx"),f=require("./DatePicker.module-tE-tGNBd.cjs"),y=require("./ConfigProvider-
|
|
2
|
-
//# sourceMappingURL=TimeColumns-
|
|
1
|
+
"use strict";const i=require("react/jsx-runtime"),C=require("react"),w=require("clsx"),f=require("./DatePicker.module-tE-tGNBd.cjs"),y=require("./ConfigProvider-C7DUWHrb.cjs"),I="_popover_1mo4p_5",P="_tabs_1mo4p_13",L="_timePane_1mo4p_30",N="_timeCols_1mo4p_36",O="_timeCol_1mo4p_36",R="_timeColLabel_1mo4p_47",g="_timeScroll_1mo4p_57",E="_timeCell_1mo4p_85",T="_timeCellSelected_1mo4p_110",H="_footer_1mo4p_120",p={popover:I,tabs:P,timePane:L,timeCols:N,timeCol:O,timeColLabel:R,timeScroll:g,timeCell:E,timeCellSelected:T,footer:H};function h({options:o,selected:l,onSelect:u,label:x,autoFocus:k}){const b=C.useRef(null),s=C.useRef(!!k),_=o.findIndex(e=>e.value===l),[t,a]=C.useState(_>=0?_:0);C.useEffect(()=>{var c,n,S;_>=0&&a(_);const e=((c=b.current)==null?void 0:c.querySelector('[aria-selected="true"]'))??((n=b.current)==null?void 0:n.querySelector('[tabindex="0"]'));(S=e==null?void 0:e.scrollIntoView)==null||S.call(e,{block:"nearest"})},[l]),C.useEffect(()=>{var c,n;if(!s.current)return;s.current=!1;const e=(c=b.current)==null?void 0:c.querySelector('[tabindex="0"]');e==null||e.focus(),(n=e==null?void 0:e.scrollIntoView)==null||n.call(e,{block:"nearest"})},[t]);const m=e=>{s.current=!0,a(Math.max(0,Math.min(o.length-1,e)))},d=e=>{switch(e.key){case"ArrowUp":e.preventDefault(),m(t-1);break;case"ArrowDown":e.preventDefault(),m(t+1);break;case"Home":e.preventDefault(),m(0);break;case"End":e.preventDefault(),m(o.length-1);break;case"Enter":case" ":e.preventDefault(),u(o[t].value);break}};return i.jsxs("div",{className:p.timeCol,children:[i.jsx("span",{className:p.timeColLabel,children:x}),i.jsx("div",{ref:b,className:p.timeScroll,role:"listbox","aria-label":x,onKeyDown:d,children:o.map((e,c)=>{const n=e.value===l;return i.jsx("button",{type:"button",role:"option",className:w.clsx(p.timeCell,n&&p.timeCellSelected),tabIndex:c===t?0:-1,"aria-selected":n,onClick:()=>u(e.value),children:e.label},e.label)})})]})}const M=o=>o.map(l=>({value:l,label:f.pad2(l)}));function A({value:o,onChange:l,hour12:u,minuteStep:x,showSeconds:k,autoFocus:b}){const s=y.useT(),_=[{value:!1,label:s("time.am")},{value:!0,label:s("time.pm")}],t=o??f.today(),a=t.hour(),m=a>=12,d=x>=1?Math.floor(x):1,e=M(u?f.range(1,12):f.range(0,23)),c=o?u?a%12||12:a:null,n=Math.floor(59/d)*d,S=o?Math.min(Math.round(t.minute()/d)*d,n):null,j=r=>l(u?t.hour(r%12+(m?12:0)):t.hour(r)),v=r=>l(t.minute(r)),D=r=>l(t.second(r)),q=r=>l(r===m?t:t.hour(r?a+12:a-12));return i.jsxs("div",{className:p.timeCols,children:[i.jsx(h,{options:e,selected:c,onSelect:j,label:s("time.hour"),autoFocus:b}),i.jsx(h,{options:M(f.range(0,59,d)),selected:S,onSelect:v,label:s("time.minute")}),k&&i.jsx(h,{options:M(f.range(0,59)),selected:o?t.second():null,onSelect:D,label:s("time.second")}),u&&i.jsx(h,{options:_,selected:o?m:null,onSelect:q,label:s("time.meridiem")})]})}exports.TimeColumns=A;exports.dt=p;
|
|
2
|
+
//# sourceMappingURL=TimeColumns-DxFjjtc7.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeColumns-DB-V4KpQ.cjs","sources":["../src/components/DateTimePicker/TimeColumns.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { pad2, range, today, type Dayjs } from '../DatePicker/dateUtils'\nimport styles from './DateTimePicker.module.css'\n\nexport interface TimeColumnsProps {\n /** The working datetime (selected value) or null. */\n value: Dayjs | null\n /** Emit the next datetime when an hour / minute / second / meridiem is chosen. */\n onChange: (next: Dayjs) => void\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). */\n hour12: boolean\n /** Minute increment for the minutes column. */\n minuteStep: number\n /** Show a seconds column. */\n showSeconds: boolean\n /** Focus the hours column on mount (when there's no calendar to take focus, e.g. `TimePicker`). */\n autoFocus?: boolean\n}\n\ninterface Option<V> {\n value: V\n label: string\n}\n\n/** One scrollable, roving-focus column of time options (hours / minutes / seconds / meridiem). */\nfunction TimeList<V>({\n options,\n selected,\n onSelect,\n label,\n autoFocus,\n}: {\n options: Option<V>[]\n selected: V | null\n onSelect: (value: V) => void\n label: string\n autoFocus?: boolean\n}) {\n const listRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n const selectedIndex = options.findIndex((o) => o.value === selected)\n const [focusedIndex, setFocusedIndex] = useState(selectedIndex >= 0 ? selectedIndex : 0)\n\n // re-anchor roving focus to the selected option and scroll it into view when it changes externally\n useEffect(() => {\n if (selectedIndex >= 0) setFocusedIndex(selectedIndex)\n const el =\n listRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected])\n\n // move DOM focus to the roving option after a keyboard move\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focusedIndex])\n\n const move = (index: number) => {\n focusOnRender.current = true\n setFocusedIndex(Math.max(0, Math.min(options.length - 1, index)))\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n move(focusedIndex - 1)\n break\n case 'ArrowDown':\n event.preventDefault()\n move(focusedIndex + 1)\n break\n case 'Home':\n event.preventDefault()\n move(0)\n break\n case 'End':\n event.preventDefault()\n move(options.length - 1)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n onSelect(options[focusedIndex].value)\n break\n }\n }\n\n return (\n <div className={styles.timeCol}>\n <span className={styles.timeColLabel}>{label}</span>\n <div\n ref={listRef}\n className={styles.timeScroll}\n role=\"listbox\"\n aria-label={label}\n onKeyDown={handleKeyDown}\n >\n {options.map((opt, i) => {\n const isSelected = opt.value === selected\n return (\n <button\n key={opt.label}\n type=\"button\"\n role=\"option\"\n className={clsx(styles.timeCell, isSelected && styles.timeCellSelected)}\n tabIndex={i === focusedIndex ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => onSelect(opt.value)}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst numberOptions = (values: number[]): Option<number>[] =>\n values.map((v) => ({ value: v, label: pad2(v) }))\n\n/**\n * The time-picker columns shown beside the calendar in `DateTimePicker`. Scrollable hour + minute\n * (+ optional seconds) lists plus an AM/PM toggle in 12-hour mode — each a roving-focus listbox. All\n * math is UTC; each pick keeps the rest of the datetime intact (changing the hour preserves\n * minutes/seconds, etc.). When `value` is null a pick anchors to today's date at the chosen time.\n */\nexport function TimeColumns({\n value,\n onChange,\n hour12,\n minuteStep,\n showSeconds,\n autoFocus,\n}: TimeColumnsProps) {\n const t = useT()\n const meridiemOptions: Option<boolean>[] = [\n { value: false, label: t('time.am') },\n { value: true, label: t('time.pm') },\n ]\n const base = value ?? today()\n const h24 = base.hour()\n const isPM = h24 >= 12\n const step = minuteStep >= 1 ? Math.floor(minuteStep) : 1\n\n const hourOptions = numberOptions(hour12 ? range(1, 12) : range(0, 23))\n const selectedHour = value ? (hour12 ? h24 % 12 || 12 : h24) : null\n\n // snap the highlighted minute to the nearest step so a non-aligned value (e.g. :37 with step 15)\n // still lands on a real option — otherwise selectedIndex is -1 and roving focus sticks at :00\n const maxMinuteOption = Math.floor(59 / step) * step\n const selectedMinute = value\n ? Math.min(Math.round(base.minute() / step) * step, maxMinuteOption)\n : null\n\n const pickHour = (h: number) =>\n onChange(hour12 ? base.hour((h % 12) + (isPM ? 12 : 0)) : base.hour(h))\n const pickMinute = (m: number) => onChange(base.minute(m))\n const pickSecond = (s: number) => onChange(base.second(s))\n const pickMeridiem = (pm: boolean) =>\n onChange(pm === isPM ? base : base.hour(pm ? h24 + 12 : h24 - 12))\n\n return (\n <div className={styles.timeCols}>\n <TimeList\n options={hourOptions}\n selected={selectedHour}\n onSelect={pickHour}\n label={t('time.hour')}\n autoFocus={autoFocus}\n />\n <TimeList\n options={numberOptions(range(0, 59, step))}\n selected={selectedMinute}\n onSelect={pickMinute}\n label={t('time.minute')}\n />\n {showSeconds && (\n <TimeList\n options={numberOptions(range(0, 59))}\n selected={value ? base.second() : null}\n onSelect={pickSecond}\n label={t('time.second')}\n />\n )}\n {hour12 && (\n <TimeList\n options={meridiemOptions}\n selected={value ? isPM : null}\n onSelect={pickMeridiem}\n label={t('time.meridiem')}\n />\n )}\n </div>\n )\n}\n"],"names":["TimeList","options","selected","onSelect","label","autoFocus","listRef","useRef","focusOnRender","selectedIndex","o","focusedIndex","setFocusedIndex","useState","useEffect","el","_a","_b","_c","move","index","handleKeyDown","event","jsxs","styles","jsx","opt","i","isSelected","clsx","numberOptions","values","v","pad2","TimeColumns","value","onChange","hour12","minuteStep","showSeconds","t","useT","meridiemOptions","base","today","h24","isPM","step","hourOptions","range","selectedHour","maxMinuteOption","selectedMinute","pickHour","h","pickMinute","m","pickSecond","s","pickMeridiem","pm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TimeColumns-DxFjjtc7.cjs","sources":["../src/components/DateTimePicker/TimeColumns.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type KeyboardEvent } from 'react'\nimport { clsx } from 'clsx'\nimport { useT } from '../../theme'\nimport { pad2, range, today, type Dayjs } from '../DatePicker/dateUtils'\nimport styles from './DateTimePicker.module.css'\n\nexport interface TimeColumnsProps {\n /** The working datetime (selected value) or null. */\n value: Dayjs | null\n /** Emit the next datetime when an hour / minute / second / meridiem is chosen. */\n onChange: (next: Dayjs) => void\n /** 12-hour clock (1–12 + AM/PM) instead of 24-hour (0–23). */\n hour12: boolean\n /** Minute increment for the minutes column. */\n minuteStep: number\n /** Show a seconds column. */\n showSeconds: boolean\n /** Focus the hours column on mount (when there's no calendar to take focus, e.g. `TimePicker`). */\n autoFocus?: boolean\n}\n\ninterface Option<V> {\n value: V\n label: string\n}\n\n/** One scrollable, roving-focus column of time options (hours / minutes / seconds / meridiem). */\nfunction TimeList<V>({\n options,\n selected,\n onSelect,\n label,\n autoFocus,\n}: {\n options: Option<V>[]\n selected: V | null\n onSelect: (value: V) => void\n label: string\n autoFocus?: boolean\n}) {\n const listRef = useRef<HTMLDivElement | null>(null)\n const focusOnRender = useRef(Boolean(autoFocus))\n const selectedIndex = options.findIndex((o) => o.value === selected)\n const [focusedIndex, setFocusedIndex] = useState(selectedIndex >= 0 ? selectedIndex : 0)\n\n // re-anchor roving focus to the selected option and scroll it into view when it changes externally\n useEffect(() => {\n if (selectedIndex >= 0) setFocusedIndex(selectedIndex)\n const el =\n listRef.current?.querySelector<HTMLElement>('[aria-selected=\"true\"]') ??\n listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.scrollIntoView?.({ block: 'nearest' })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected])\n\n // move DOM focus to the roving option after a keyboard move\n useEffect(() => {\n if (!focusOnRender.current) return\n focusOnRender.current = false\n const el = listRef.current?.querySelector<HTMLElement>('[tabindex=\"0\"]')\n el?.focus()\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [focusedIndex])\n\n const move = (index: number) => {\n focusOnRender.current = true\n setFocusedIndex(Math.max(0, Math.min(options.length - 1, index)))\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault()\n move(focusedIndex - 1)\n break\n case 'ArrowDown':\n event.preventDefault()\n move(focusedIndex + 1)\n break\n case 'Home':\n event.preventDefault()\n move(0)\n break\n case 'End':\n event.preventDefault()\n move(options.length - 1)\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n onSelect(options[focusedIndex].value)\n break\n }\n }\n\n return (\n <div className={styles.timeCol}>\n <span className={styles.timeColLabel}>{label}</span>\n <div\n ref={listRef}\n className={styles.timeScroll}\n role=\"listbox\"\n aria-label={label}\n onKeyDown={handleKeyDown}\n >\n {options.map((opt, i) => {\n const isSelected = opt.value === selected\n return (\n <button\n key={opt.label}\n type=\"button\"\n role=\"option\"\n className={clsx(styles.timeCell, isSelected && styles.timeCellSelected)}\n tabIndex={i === focusedIndex ? 0 : -1}\n aria-selected={isSelected}\n onClick={() => onSelect(opt.value)}\n >\n {opt.label}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst numberOptions = (values: number[]): Option<number>[] =>\n values.map((v) => ({ value: v, label: pad2(v) }))\n\n/**\n * The time-picker columns shown beside the calendar in `DateTimePicker`. Scrollable hour + minute\n * (+ optional seconds) lists plus an AM/PM toggle in 12-hour mode — each a roving-focus listbox. All\n * math is UTC; each pick keeps the rest of the datetime intact (changing the hour preserves\n * minutes/seconds, etc.). When `value` is null a pick anchors to today's date at the chosen time.\n */\nexport function TimeColumns({\n value,\n onChange,\n hour12,\n minuteStep,\n showSeconds,\n autoFocus,\n}: TimeColumnsProps) {\n const t = useT()\n const meridiemOptions: Option<boolean>[] = [\n { value: false, label: t('time.am') },\n { value: true, label: t('time.pm') },\n ]\n const base = value ?? today()\n const h24 = base.hour()\n const isPM = h24 >= 12\n const step = minuteStep >= 1 ? Math.floor(minuteStep) : 1\n\n const hourOptions = numberOptions(hour12 ? range(1, 12) : range(0, 23))\n const selectedHour = value ? (hour12 ? h24 % 12 || 12 : h24) : null\n\n // snap the highlighted minute to the nearest step so a non-aligned value (e.g. :37 with step 15)\n // still lands on a real option — otherwise selectedIndex is -1 and roving focus sticks at :00\n const maxMinuteOption = Math.floor(59 / step) * step\n const selectedMinute = value\n ? Math.min(Math.round(base.minute() / step) * step, maxMinuteOption)\n : null\n\n const pickHour = (h: number) =>\n onChange(hour12 ? base.hour((h % 12) + (isPM ? 12 : 0)) : base.hour(h))\n const pickMinute = (m: number) => onChange(base.minute(m))\n const pickSecond = (s: number) => onChange(base.second(s))\n const pickMeridiem = (pm: boolean) =>\n onChange(pm === isPM ? base : base.hour(pm ? h24 + 12 : h24 - 12))\n\n return (\n <div className={styles.timeCols}>\n <TimeList\n options={hourOptions}\n selected={selectedHour}\n onSelect={pickHour}\n label={t('time.hour')}\n autoFocus={autoFocus}\n />\n <TimeList\n options={numberOptions(range(0, 59, step))}\n selected={selectedMinute}\n onSelect={pickMinute}\n label={t('time.minute')}\n />\n {showSeconds && (\n <TimeList\n options={numberOptions(range(0, 59))}\n selected={value ? base.second() : null}\n onSelect={pickSecond}\n label={t('time.second')}\n />\n )}\n {hour12 && (\n <TimeList\n options={meridiemOptions}\n selected={value ? isPM : null}\n onSelect={pickMeridiem}\n label={t('time.meridiem')}\n />\n )}\n </div>\n )\n}\n"],"names":["TimeList","options","selected","onSelect","label","autoFocus","listRef","useRef","focusOnRender","selectedIndex","o","focusedIndex","setFocusedIndex","useState","useEffect","el","_a","_b","_c","move","index","handleKeyDown","event","jsxs","styles","jsx","opt","i","isSelected","clsx","numberOptions","values","v","pad2","TimeColumns","value","onChange","hour12","minuteStep","showSeconds","t","useT","meridiemOptions","base","today","h24","isPM","step","hourOptions","range","selectedHour","maxMinuteOption","selectedMinute","pickHour","h","pickMinute","m","pickSecond","s","pickMeridiem","pm"],"mappings":"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"}
|
|
@@ -3,13 +3,13 @@ import { forwardRef as xe, useId as Ne, useState as V, useEffect as ge, useRef a
|
|
|
3
3
|
import { clsx as $ } from "clsx";
|
|
4
4
|
import { u as Be } from "./formContext-B7ln1Miy.js";
|
|
5
5
|
import { F as He } from "./FloatingPanel-BG9Uag__.js";
|
|
6
|
-
import { B as Pe } from "./Button-
|
|
7
|
-
import { I as G } from "./Icon-
|
|
8
|
-
import { I as be } from "./IconButton-
|
|
6
|
+
import { B as Pe } from "./Button-RljTGqHl.js";
|
|
7
|
+
import { I as G } from "./Icon-DaTvzLBu.js";
|
|
8
|
+
import { I as be } from "./IconButton-DXMmtuLA.js";
|
|
9
9
|
import { T as J } from "./Typography-Cta6Rg4L.js";
|
|
10
|
-
import { T as Re } from "./TimeColumns-
|
|
10
|
+
import { T as Re } from "./TimeColumns-CFy_PynH.js";
|
|
11
11
|
import { u as De, h as K, m as Ee, s as o, b as Q, c as Le, l as Me } from "./DatePicker.module-BZDftL4g.js";
|
|
12
|
-
import { a as Ve } from "./ConfigProvider-
|
|
12
|
+
import { a as Ve } from "./ConfigProvider-DT0yrgmd.js";
|
|
13
13
|
const We = "_footer_p1ea2_7", _e = {
|
|
14
14
|
footer: We
|
|
15
15
|
};
|
|
@@ -191,4 +191,4 @@ const Qe = xe(function({
|
|
|
191
191
|
export {
|
|
192
192
|
Qe as T
|
|
193
193
|
};
|
|
194
|
-
//# sourceMappingURL=TimePicker-
|
|
194
|
+
//# sourceMappingURL=TimePicker-ZO7jOJVa.js.map
|