@particle-academy/react-fancy 6.11.0 → 6.12.0
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/CHANGELOG.md +28 -0
- package/dist/accordion-panel.cjs +7 -7
- package/dist/accordion-panel.js +1 -1
- package/dist/accordion.cjs +3 -3
- package/dist/accordion.js +1 -1
- package/dist/autocomplete.cjs +2 -2
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +2 -2
- package/dist/avatar.js +1 -1
- package/dist/breadcrumbs.cjs +2 -2
- package/dist/breadcrumbs.js +1 -1
- package/dist/calendar.cjs +2 -2
- package/dist/calendar.js +1 -1
- package/dist/carousel.cjs +7 -7
- package/dist/carousel.js +1 -1
- package/dist/chart.cjs +2 -2
- package/dist/chart.js +1 -1
- package/dist/chat-drawer.cjs +2 -2
- package/dist/chat-drawer.js +1 -1
- package/dist/chat-thread.cjs +4 -4
- package/dist/chat-thread.js +2 -2
- package/dist/{chunk-GB2EGMVQ.cjs → chunk-2JNOPH3B.cjs} +3 -3
- package/dist/chunk-2JNOPH3B.cjs.map +1 -0
- package/dist/{chunk-R3PCZSBQ.js → chunk-2OCWIAGS.js} +4 -4
- package/dist/chunk-2OCWIAGS.js.map +1 -0
- package/dist/{chunk-KRECSPD3.js → chunk-2PNQTEXK.js} +3 -3
- package/dist/chunk-2PNQTEXK.js.map +1 -0
- package/dist/{chunk-RVBA4LEB.cjs → chunk-2SO4WS2E.cjs} +4 -4
- package/dist/{chunk-RVBA4LEB.cjs.map → chunk-2SO4WS2E.cjs.map} +1 -1
- package/dist/{chunk-NWP5EGSR.cjs → chunk-2U2VQ2QF.cjs} +4 -4
- package/dist/{chunk-NWP5EGSR.cjs.map → chunk-2U2VQ2QF.cjs.map} +1 -1
- package/dist/{chunk-LXEOBSEZ.js → chunk-32542ZE6.js} +3 -3
- package/dist/{chunk-LXEOBSEZ.js.map → chunk-32542ZE6.js.map} +1 -1
- package/dist/{chunk-XQF4HCOV.cjs → chunk-3ISEBGRC.cjs} +14 -14
- package/dist/chunk-3ISEBGRC.cjs.map +1 -0
- package/dist/{chunk-ZHTK4IPQ.js → chunk-4676NOI6.js} +17 -13
- package/dist/chunk-4676NOI6.js.map +1 -0
- package/dist/{chunk-J57JSHDC.js → chunk-5EOVD46D.js} +5 -5
- package/dist/{chunk-J57JSHDC.js.map → chunk-5EOVD46D.js.map} +1 -1
- package/dist/{chunk-NFUKNVB7.cjs → chunk-7J7RHUGH.cjs} +5 -5
- package/dist/chunk-7J7RHUGH.cjs.map +1 -0
- package/dist/{chunk-NW2LQRUP.js → chunk-7YUXEZXU.js} +3 -3
- package/dist/{chunk-NW2LQRUP.js.map → chunk-7YUXEZXU.js.map} +1 -1
- package/dist/{chunk-AR5DLM4K.js → chunk-AADPWMZV.js} +3 -3
- package/dist/{chunk-AR5DLM4K.js.map → chunk-AADPWMZV.js.map} +1 -1
- package/dist/{chunk-5FA6V7JF.js → chunk-B4NXPUOF.js} +3 -3
- package/dist/{chunk-5FA6V7JF.js.map → chunk-B4NXPUOF.js.map} +1 -1
- package/dist/{chunk-FZQWFDUV.cjs → chunk-BDYIKGV5.cjs} +4 -4
- package/dist/chunk-BDYIKGV5.cjs.map +1 -0
- package/dist/{chunk-VOAC5OKY.cjs → chunk-BEKJQHOX.cjs} +3 -3
- package/dist/{chunk-VOAC5OKY.cjs.map → chunk-BEKJQHOX.cjs.map} +1 -1
- package/dist/{chunk-TBLKVTJC.cjs → chunk-CR3AZMQE.cjs} +3 -3
- package/dist/{chunk-TBLKVTJC.cjs.map → chunk-CR3AZMQE.cjs.map} +1 -1
- package/dist/{chunk-7K2C744H.cjs → chunk-CXR54P5L.cjs} +4 -4
- package/dist/chunk-CXR54P5L.cjs.map +1 -0
- package/dist/{chunk-5NJF7SQX.js → chunk-D4K666OI.js} +3 -3
- package/dist/{chunk-5NJF7SQX.js.map → chunk-D4K666OI.js.map} +1 -1
- package/dist/{chunk-C2VGO375.js → chunk-EVFWX2HA.js} +3 -3
- package/dist/{chunk-C2VGO375.js.map → chunk-EVFWX2HA.js.map} +1 -1
- package/dist/{chunk-UBLMYH6C.js → chunk-EXD56OPP.js} +4 -4
- package/dist/chunk-EXD56OPP.js.map +1 -0
- package/dist/{chunk-I65KXHYL.js → chunk-F6IRLWBS.js} +6 -6
- package/dist/{chunk-I65KXHYL.js.map → chunk-F6IRLWBS.js.map} +1 -1
- package/dist/{chunk-C6EVRWXZ.cjs → chunk-FUBGTLKL.cjs} +3 -3
- package/dist/{chunk-C6EVRWXZ.cjs.map → chunk-FUBGTLKL.cjs.map} +1 -1
- package/dist/{chunk-7N7XVBH7.cjs → chunk-GOIZT7CW.cjs} +6 -6
- package/dist/{chunk-7N7XVBH7.cjs.map → chunk-GOIZT7CW.cjs.map} +1 -1
- package/dist/{chunk-R4SANV3G.cjs → chunk-IHCG3EHP.cjs} +15 -15
- package/dist/chunk-IHCG3EHP.cjs.map +1 -0
- package/dist/{chunk-6B2GMKE4.cjs → chunk-IJIP6MWS.cjs} +9 -9
- package/dist/chunk-IJIP6MWS.cjs.map +1 -0
- package/dist/{chunk-TKGMH5PA.js → chunk-J6YPMR7E.js} +3 -3
- package/dist/{chunk-TKGMH5PA.js.map → chunk-J6YPMR7E.js.map} +1 -1
- package/dist/{chunk-NIFHAFKK.cjs → chunk-JFPBW5MO.cjs} +17 -13
- package/dist/chunk-JFPBW5MO.cjs.map +1 -0
- package/dist/{chunk-LG2O26CG.js → chunk-JI4AI3K4.js} +5 -5
- package/dist/chunk-JI4AI3K4.js.map +1 -0
- package/dist/{chunk-CO2NEUFK.js → chunk-JUQGTTED.js} +4 -4
- package/dist/chunk-JUQGTTED.js.map +1 -0
- package/dist/{chunk-CG3RCQVL.cjs → chunk-K3NIG7O4.cjs} +6 -6
- package/dist/{chunk-CG3RCQVL.cjs.map → chunk-K3NIG7O4.cjs.map} +1 -1
- package/dist/{chunk-LJCQI6ZS.js → chunk-KHHTTAKZ.js} +3 -3
- package/dist/{chunk-LJCQI6ZS.js.map → chunk-KHHTTAKZ.js.map} +1 -1
- package/dist/{chunk-EEFU5BVM.cjs → chunk-KJUUCMHH.cjs} +7 -7
- package/dist/{chunk-EEFU5BVM.cjs.map → chunk-KJUUCMHH.cjs.map} +1 -1
- package/dist/{chunk-LHHELLMT.cjs → chunk-KRQZGVN3.cjs} +4 -4
- package/dist/chunk-KRQZGVN3.cjs.map +1 -0
- package/dist/{chunk-KDRBUF5S.js → chunk-LCBMI4WO.js} +3 -3
- package/dist/{chunk-KDRBUF5S.js.map → chunk-LCBMI4WO.js.map} +1 -1
- package/dist/{chunk-AXW55PQG.js → chunk-M5EKV5PK.js} +3 -3
- package/dist/{chunk-AXW55PQG.js.map → chunk-M5EKV5PK.js.map} +1 -1
- package/dist/{chunk-D6NISIKV.js → chunk-MSLAK77J.js} +4 -4
- package/dist/chunk-MSLAK77J.js.map +1 -0
- package/dist/{chunk-26GRLVCQ.js → chunk-N2XFWVF7.js} +3 -3
- package/dist/chunk-N2XFWVF7.js.map +1 -0
- package/dist/{chunk-3O3ZWWLG.js → chunk-NBIRHOM6.js} +4 -4
- package/dist/{chunk-3O3ZWWLG.js.map → chunk-NBIRHOM6.js.map} +1 -1
- package/dist/{chunk-FY2WDVKF.cjs → chunk-ND2T3PMH.cjs} +3 -3
- package/dist/{chunk-FY2WDVKF.cjs.map → chunk-ND2T3PMH.cjs.map} +1 -1
- package/dist/{chunk-GE2ZGE3A.cjs → chunk-O23KGVXS.cjs} +6 -6
- package/dist/chunk-O23KGVXS.cjs.map +1 -0
- package/dist/{chunk-4EQ336PQ.js → chunk-OIX3DCKN.js} +3 -3
- package/dist/{chunk-4EQ336PQ.js.map → chunk-OIX3DCKN.js.map} +1 -1
- package/dist/{chunk-JJYMRV62.js → chunk-OIYZCYEY.js} +3 -3
- package/dist/chunk-OIYZCYEY.js.map +1 -0
- package/dist/{chunk-TH7VP4CL.cjs → chunk-OKHXAI75.cjs} +3 -3
- package/dist/{chunk-TH7VP4CL.cjs.map → chunk-OKHXAI75.cjs.map} +1 -1
- package/dist/{chunk-5SVZX6WF.cjs → chunk-OLIYEZ4C.cjs} +6 -6
- package/dist/{chunk-5SVZX6WF.cjs.map → chunk-OLIYEZ4C.cjs.map} +1 -1
- package/dist/{chunk-FX37P4KR.js → chunk-OSNDO2ZF.js} +4 -4
- package/dist/{chunk-FX37P4KR.js.map → chunk-OSNDO2ZF.js.map} +1 -1
- package/dist/{chunk-K6Q542VL.js → chunk-OUG3YE6E.js} +6 -6
- package/dist/{chunk-K6Q542VL.js.map → chunk-OUG3YE6E.js.map} +1 -1
- package/dist/{chunk-TXQT6S4D.cjs → chunk-OXR2FUEV.cjs} +3 -3
- package/dist/chunk-OXR2FUEV.cjs.map +1 -0
- package/dist/{chunk-SD6YAMDH.cjs → chunk-PDE63TMC.cjs} +3 -3
- package/dist/{chunk-SD6YAMDH.cjs.map → chunk-PDE63TMC.cjs.map} +1 -1
- package/dist/{chunk-HKLBCA5X.cjs → chunk-PIPF34XD.cjs} +4 -4
- package/dist/{chunk-HKLBCA5X.cjs.map → chunk-PIPF34XD.cjs.map} +1 -1
- package/dist/{chunk-CDW7MFPG.js → chunk-Q5P5WG6Q.js} +4 -4
- package/dist/{chunk-CDW7MFPG.js.map → chunk-Q5P5WG6Q.js.map} +1 -1
- package/dist/{chunk-ISAHWGMD.cjs → chunk-QJVQEGB7.cjs} +4 -4
- package/dist/{chunk-ISAHWGMD.cjs.map → chunk-QJVQEGB7.cjs.map} +1 -1
- package/dist/{chunk-6EPM5JG7.cjs → chunk-QLFV2KUQ.cjs} +3 -3
- package/dist/{chunk-6EPM5JG7.cjs.map → chunk-QLFV2KUQ.cjs.map} +1 -1
- package/dist/{chunk-GISORLGW.cjs → chunk-QMNDEIOJ.cjs} +3 -3
- package/dist/{chunk-GISORLGW.cjs.map → chunk-QMNDEIOJ.cjs.map} +1 -1
- package/dist/{chunk-OUPHLIXV.cjs → chunk-RBM5VYQG.cjs} +11 -11
- package/dist/{chunk-OUPHLIXV.cjs.map → chunk-RBM5VYQG.cjs.map} +1 -1
- package/dist/{chunk-24RWB7Q3.js → chunk-RC76D7FD.js} +5 -4
- package/dist/chunk-RC76D7FD.js.map +1 -0
- package/dist/{chunk-FSLEFL4U.cjs → chunk-RKDQ7RRL.cjs} +3 -3
- package/dist/{chunk-FSLEFL4U.cjs.map → chunk-RKDQ7RRL.cjs.map} +1 -1
- package/dist/{chunk-Z6M3UELD.js → chunk-S2I4QQBM.js} +3 -3
- package/dist/{chunk-Z6M3UELD.js.map → chunk-S2I4QQBM.js.map} +1 -1
- package/dist/{chunk-EW2N52FD.js → chunk-SUVSEI7N.js} +4 -4
- package/dist/{chunk-EW2N52FD.js.map → chunk-SUVSEI7N.js.map} +1 -1
- package/dist/{chunk-FR3V5IAJ.cjs → chunk-T6CBYOES.cjs} +5 -4
- package/dist/chunk-T6CBYOES.cjs.map +1 -0
- package/dist/{chunk-FECD3WKN.js → chunk-TDY5YPSU.js} +3 -3
- package/dist/{chunk-FECD3WKN.js.map → chunk-TDY5YPSU.js.map} +1 -1
- package/dist/{chunk-ZFXCZ2QO.cjs → chunk-TQIE25DE.cjs} +11 -11
- package/dist/{chunk-ZFXCZ2QO.cjs.map → chunk-TQIE25DE.cjs.map} +1 -1
- package/dist/{chunk-GE6TSA3M.cjs → chunk-TRXMF2NG.cjs} +3 -3
- package/dist/{chunk-GE6TSA3M.cjs.map → chunk-TRXMF2NG.cjs.map} +1 -1
- package/dist/{chunk-AF33UCTN.cjs → chunk-ULEJD5SQ.cjs} +3 -3
- package/dist/chunk-ULEJD5SQ.cjs.map +1 -0
- package/dist/{chunk-PIYQPXLT.js → chunk-VDD5SLBI.js} +3 -3
- package/dist/{chunk-PIYQPXLT.js.map → chunk-VDD5SLBI.js.map} +1 -1
- package/dist/{chunk-VOGI7GX3.js → chunk-VKNQ2BGO.js} +3 -3
- package/dist/{chunk-VOGI7GX3.js.map → chunk-VKNQ2BGO.js.map} +1 -1
- package/dist/{chunk-3BBEVHSP.cjs → chunk-VQHM3UUK.cjs} +3 -3
- package/dist/{chunk-3BBEVHSP.cjs.map → chunk-VQHM3UUK.cjs.map} +1 -1
- package/dist/{chunk-QMZK7SRS.cjs → chunk-VWZCUKV5.cjs} +3 -3
- package/dist/{chunk-QMZK7SRS.cjs.map → chunk-VWZCUKV5.cjs.map} +1 -1
- package/dist/{chunk-3W6BKQVZ.js → chunk-X4SUHI3G.js} +4 -4
- package/dist/{chunk-3W6BKQVZ.js.map → chunk-X4SUHI3G.js.map} +1 -1
- package/dist/{chunk-DQWAG7YY.cjs → chunk-X6XUEM2V.cjs} +4 -4
- package/dist/{chunk-DQWAG7YY.cjs.map → chunk-X6XUEM2V.cjs.map} +1 -1
- package/dist/{chunk-EDIB6V6Y.cjs → chunk-XIP2TPSX.cjs} +4 -4
- package/dist/{chunk-EDIB6V6Y.cjs.map → chunk-XIP2TPSX.cjs.map} +1 -1
- package/dist/{chunk-MD7HUHJB.js → chunk-XKUIPBJD.js} +10 -10
- package/dist/chunk-XKUIPBJD.js.map +1 -0
- package/dist/{chunk-SOIGBPK6.js → chunk-Y3CBLOD6.js} +6 -6
- package/dist/chunk-Y3CBLOD6.js.map +1 -0
- package/dist/{chunk-YZW7HQXH.js → chunk-YAZGTSKS.js} +14 -14
- package/dist/chunk-YAZGTSKS.js.map +1 -0
- package/dist/{chunk-MKDTXMCE.js → chunk-YFFW4E77.js} +4 -4
- package/dist/{chunk-MKDTXMCE.js.map → chunk-YFFW4E77.js.map} +1 -1
- package/dist/{chunk-YPYZZLZ5.js → chunk-YMDFLW47.js} +9 -9
- package/dist/chunk-YMDFLW47.js.map +1 -0
- package/dist/{chunk-LREJ7AV2.cjs → chunk-Z3IM25W7.cjs} +4 -4
- package/dist/{chunk-LREJ7AV2.cjs.map → chunk-Z3IM25W7.cjs.map} +1 -1
- package/dist/{chunk-AE6ICNJR.js → chunk-Z5DMAMVG.js} +3 -3
- package/dist/{chunk-AE6ICNJR.js.map → chunk-Z5DMAMVG.js.map} +1 -1
- package/dist/{chunk-JN5DHZ6I.js → chunk-ZC2H5GM2.js} +6 -6
- package/dist/{chunk-JN5DHZ6I.js.map → chunk-ZC2H5GM2.js.map} +1 -1
- package/dist/{chunk-DPPDZOMY.cjs → chunk-ZEQXMUXE.cjs} +4 -4
- package/dist/chunk-ZEQXMUXE.cjs.map +1 -0
- package/dist/{chunk-OP7A4SZZ.cjs → chunk-ZGSSUUK2.cjs} +4 -4
- package/dist/{chunk-OP7A4SZZ.cjs.map → chunk-ZGSSUUK2.cjs.map} +1 -1
- package/dist/{chunk-3T3LBIQA.cjs → chunk-ZQE2Q3R2.cjs} +4 -4
- package/dist/{chunk-3T3LBIQA.cjs.map → chunk-ZQE2Q3R2.cjs.map} +1 -1
- package/dist/{chunk-HCIEXBEB.js → chunk-ZRV5TRYW.js} +3 -3
- package/dist/{chunk-HCIEXBEB.js.map → chunk-ZRV5TRYW.js.map} +1 -1
- package/dist/command.cjs +3 -3
- package/dist/command.js +1 -1
- package/dist/composer.cjs +4 -4
- package/dist/composer.js +2 -2
- package/dist/drawer.cjs +3 -3
- package/dist/drawer.js +1 -1
- package/dist/editor.cjs +3 -3
- package/dist/editor.js +1 -1
- package/dist/emoji-select.cjs +2 -2
- package/dist/emoji-select.js +1 -1
- package/dist/file-browser.cjs +5 -5
- package/dist/file-browser.js +1 -1
- package/dist/file-upload.cjs +3 -3
- package/dist/file-upload.js +1 -1
- package/dist/index.cjs +129 -129
- package/dist/index.js +41 -41
- package/dist/input-tag.cjs +6 -6
- package/dist/input-tag.js +1 -1
- package/dist/input.cjs +3 -3
- package/dist/input.js +2 -2
- package/dist/inputs.cjs +7 -7
- package/dist/inputs.js +4 -4
- package/dist/json-editor.cjs +15 -15
- package/dist/json-editor.js +4 -4
- package/dist/magic-wand.cjs +2 -2
- package/dist/magic-wand.js +1 -1
- package/dist/media-viewer.cjs +3 -3
- package/dist/media-viewer.js +2 -2
- package/dist/mobile-menu.cjs +3 -3
- package/dist/mobile-menu.js +1 -1
- package/dist/modal.cjs +3 -3
- package/dist/modal.js +1 -1
- package/dist/mood-meter.cjs +2 -2
- package/dist/mood-meter.js +1 -1
- package/dist/navbar.cjs +3 -3
- package/dist/navbar.js +1 -1
- package/dist/number-field.cjs +4 -4
- package/dist/number-field.js +3 -3
- package/dist/pagination.cjs +2 -2
- package/dist/pagination.js +1 -1
- package/dist/paste-pills.cjs +14 -14
- package/dist/paste-pills.js +1 -1
- package/dist/phone-input.cjs +6 -6
- package/dist/phone-input.js +3 -3
- package/dist/pillbox.cjs +2 -2
- package/dist/pillbox.js +1 -1
- package/dist/profile.cjs +3 -3
- package/dist/profile.js +2 -2
- package/dist/prompt-input.cjs +5 -5
- package/dist/prompt-input.js +2 -2
- package/dist/reason-tag.cjs +2 -2
- package/dist/reason-tag.js +1 -1
- package/dist/select.cjs +2 -2
- package/dist/select.js +1 -1
- package/dist/sidebar.cjs +3 -3
- package/dist/sidebar.js +1 -1
- package/dist/table.cjs +11 -11
- package/dist/table.js +1 -1
- package/dist/time-grid.cjs +2 -2
- package/dist/time-grid.js +1 -1
- package/dist/time-picker.cjs +2 -2
- package/dist/time-picker.js +1 -1
- package/dist/toast.cjs +3 -3
- package/dist/toast.js +1 -1
- package/dist/video-viewer.cjs +2 -2
- package/dist/video-viewer.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-24RWB7Q3.js.map +0 -1
- package/dist/chunk-26GRLVCQ.js.map +0 -1
- package/dist/chunk-6B2GMKE4.cjs.map +0 -1
- package/dist/chunk-7K2C744H.cjs.map +0 -1
- package/dist/chunk-AF33UCTN.cjs.map +0 -1
- package/dist/chunk-CO2NEUFK.js.map +0 -1
- package/dist/chunk-D6NISIKV.js.map +0 -1
- package/dist/chunk-DPPDZOMY.cjs.map +0 -1
- package/dist/chunk-FR3V5IAJ.cjs.map +0 -1
- package/dist/chunk-FZQWFDUV.cjs.map +0 -1
- package/dist/chunk-GB2EGMVQ.cjs.map +0 -1
- package/dist/chunk-GE2ZGE3A.cjs.map +0 -1
- package/dist/chunk-JJYMRV62.js.map +0 -1
- package/dist/chunk-KRECSPD3.js.map +0 -1
- package/dist/chunk-LG2O26CG.js.map +0 -1
- package/dist/chunk-LHHELLMT.cjs.map +0 -1
- package/dist/chunk-MD7HUHJB.js.map +0 -1
- package/dist/chunk-NFUKNVB7.cjs.map +0 -1
- package/dist/chunk-NIFHAFKK.cjs.map +0 -1
- package/dist/chunk-R3PCZSBQ.js.map +0 -1
- package/dist/chunk-R4SANV3G.cjs.map +0 -1
- package/dist/chunk-SOIGBPK6.js.map +0 -1
- package/dist/chunk-TXQT6S4D.cjs.map +0 -1
- package/dist/chunk-UBLMYH6C.js.map +0 -1
- package/dist/chunk-XQF4HCOV.cjs.map +0 -1
- package/dist/chunk-YPYZZLZ5.js.map +0 -1
- package/dist/chunk-YZW7HQXH.js.map +0 -1
- package/dist/chunk-ZHTK4IPQ.js.map +0 -1
|
@@ -360,8 +360,8 @@ function SidebarToggle({ className }) {
|
|
|
360
360
|
onClick: () => setCollapsed(!collapsed),
|
|
361
361
|
title: collapsed ? "Expand sidebar" : "Collapse sidebar",
|
|
362
362
|
className: chunkZU5Q77OT_cjs.cn(
|
|
363
|
-
"flex items-center justify-center rounded-md p-1.5 text-zinc-400 transition-colors",
|
|
364
|
-
"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-
|
|
363
|
+
"flex items-center justify-center rounded-md p-1.5 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors",
|
|
364
|
+
"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
|
|
365
365
|
className
|
|
366
366
|
),
|
|
367
367
|
children: collapsed ? (
|
|
@@ -439,5 +439,5 @@ var Sidebar = Object.assign(SidebarRoot, {
|
|
|
439
439
|
|
|
440
440
|
exports.Sidebar = Sidebar;
|
|
441
441
|
exports.useSidebar = useSidebar;
|
|
442
|
-
//# sourceMappingURL=chunk-
|
|
443
|
-
//# sourceMappingURL=chunk-
|
|
442
|
+
//# sourceMappingURL=chunk-X6XUEM2V.cjs.map
|
|
443
|
+
//# sourceMappingURL=chunk-X6XUEM2V.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Sidebar/Sidebar.context.ts","../src/components/Sidebar/Sidebar.keyboard.ts","../src/components/Sidebar/SidebarItem.tsx","../src/components/Sidebar/SidebarGroup.tsx","../src/components/Sidebar/SidebarSubmenu.tsx","../src/components/Sidebar/SidebarToggle.tsx","../src/components/Sidebar/Sidebar.tsx"],"names":["createContext","useContext","useEffect","useCallback","jsx","jsxs","Fragment","cn","badgeDot","Tooltip","getLetters","useState","ChevronDown","PanelLeftOpen","PanelLeftClose","useControllableState","useRef"],"mappings":"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","file":"chunk-DQWAG7YY.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { SidebarContextValue } from \"./Sidebar.types\";\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar(): SidebarContextValue {\n const ctx = useContext(SidebarContext);\n if (!ctx) {\n throw new Error(\"useSidebar must be used within a <Sidebar> component\");\n }\n return ctx;\n}\n","import { useCallback, useEffect, type KeyboardEvent, type RefObject } from \"react\";\n\n/**\n * What arrow keys move between: every `Sidebar.Item`, plus an EXPANDED\n * `Sidebar.Submenu`'s trigger button. (A collapsed submenu renders a plain\n * `<div>`, which is not focusable, so there is nothing to move to.)\n *\n * Selected by the handles the components already render, so `keyboardNav`\n * adds no markup to a Sidebar that does not use it.\n */\nconst ITEM_SELECTOR =\n \"[data-react-fancy-sidebar-item], [data-react-fancy-sidebar-submenu] > button\";\n\nconst NAV_KEYS = new Set([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"]);\n\n/**\n * Inside a closed submenu — the panel is collapsed to zero height but its\n * items are still mounted, so without this they would be focusable while\n * invisible. `SidebarSubmenu` sets `aria-expanded` on its trigger only when\n * `keyboardNav` is on; a submenu's OWN trigger is not inside its panel.\n */\nfunction inClosedSubmenu(el: HTMLElement, root: HTMLElement): boolean {\n let sub = el.parentElement?.closest<HTMLElement>(\"[data-react-fancy-sidebar-submenu]\");\n while (sub && root.contains(sub)) {\n const trigger = sub.querySelector<HTMLElement>(\":scope > button\");\n if (trigger && trigger !== el && trigger.getAttribute(\"aria-expanded\") === \"false\") {\n return true;\n }\n sub = sub.parentElement?.closest<HTMLElement>(\"[data-react-fancy-sidebar-submenu]\");\n }\n return false;\n}\n\nfunction isNavigable(el: HTMLElement, root: HTMLElement): boolean {\n if (el.getAttribute(\"aria-disabled\") === \"true\") return false;\n if ((el as HTMLButtonElement).disabled) return false;\n return !inClosedSubmenu(el, root);\n}\n\nfunction allItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(ITEM_SELECTOR));\n}\n\n/**\n * Roving tabindex + ArrowUp / ArrowDown / Home / End for `Sidebar keyboardNav`.\n *\n * The tab stop is kept on the DOM rather than in React state because items\n * can mount from anywhere below the root (a consumer's own component, a\n * submenu opening) without the root re-rendering. A MutationObserver re-applies\n * it when the set of items, or their disabled / expanded / current state,\n * changes; focus moving onto an item (by click, Tab or arrow) makes that item\n * the stop. Turning `keyboardNav` off removes every tabindex it set.\n *\n * React never renders a `tabIndex` on these items itself, so writing the\n * attribute does not fight reconciliation. (A consumer who passes `tabIndex`\n * to an item while `keyboardNav` is on is overriding the roving stop, and\n * React will reassert theirs on its next render of that item.)\n */\nexport function useSidebarKeyboardNav(\n rootRef: RefObject<HTMLElement | null>,\n enabled: boolean,\n): ((event: KeyboardEvent<HTMLElement>) => void) | undefined {\n useEffect(() => {\n const root = rootRef.current;\n if (!enabled || !root) return;\n\n const touched = new Set<HTMLElement>();\n let current: HTMLElement | null = null;\n\n const apply = () => {\n const items = allItems(root);\n const navigable = items.filter((el) => isNavigable(el, root));\n if (!current || !navigable.includes(current)) {\n current =\n navigable.find((el) => el.getAttribute(\"aria-current\") === \"page\") ??\n navigable[0] ??\n null;\n }\n for (const el of items) {\n const want = el === current ? \"0\" : \"-1\";\n if (el.getAttribute(\"tabindex\") !== want) el.setAttribute(\"tabindex\", want);\n touched.add(el);\n }\n };\n\n const onFocusIn = (event: FocusEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target || !target.matches(ITEM_SELECTOR) || !root.contains(target)) return;\n if (!isNavigable(target, root)) return;\n current = target;\n apply();\n };\n\n apply();\n root.addEventListener(\"focusin\", onFocusIn);\n const observer = new MutationObserver(apply);\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n // NOT tabindex: that is what `apply` writes.\n attributeFilter: [\"aria-disabled\", \"aria-expanded\", \"aria-current\", \"disabled\"],\n });\n\n return () => {\n observer.disconnect();\n root.removeEventListener(\"focusin\", onFocusIn);\n for (const el of touched) el.removeAttribute(\"tabindex\");\n };\n }, [rootRef, enabled]);\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const root = rootRef.current;\n if (!root || !NAV_KEYS.has(event.key)) return;\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n // Only when an ITEM has focus. An input, textarea, select or\n // contenteditable inside the sidebar (a filter box, say) keeps its keys:\n // it does not match the item selector, so it never gets here.\n const target = event.target as HTMLElement;\n if (!target.matches(ITEM_SELECTOR)) return;\n\n const items = allItems(root);\n const navigable = items.filter((el) => isNavigable(el, root));\n if (navigable.length === 0) return;\n\n let next: HTMLElement | undefined;\n if (event.key === \"Home\") next = navigable[0];\n else if (event.key === \"End\") next = navigable[navigable.length - 1];\n else {\n // Walk from the target's position among ALL items, so a focused item\n // that is itself not navigable (disabled while focused) still moves.\n const from = items.indexOf(target);\n const step = event.key === \"ArrowDown\" ? 1 : -1;\n for (let i = from + step; i >= 0 && i < items.length; i += step) {\n if (navigable.includes(items[i])) {\n next = items[i];\n break;\n }\n }\n }\n\n // Handled either way: an arrow at the end of the list must not scroll\n // the page instead. No wrap, matching a list rather than a menu.\n event.preventDefault();\n next?.focus();\n },\n [rootRef],\n );\n\n return enabled ? onKeyDown : undefined;\n}\n","import type { ElementType, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { badgeDot } from \"../Badge/Badge.colors\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarDotColor, SidebarItemProps } from \"./Sidebar.types\";\n\n/**\n * The surface-coloured ring separates the dot from whatever it sits on (an\n * icon, the active-row fill) in both modes.\n */\nconst DOT_BASE =\n \"pointer-events-none absolute h-2 w-2 rounded-full ring-2 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\n\n/** Extract first 3 characters from a ReactNode if it's a string. */\nfunction getLetters(children: React.ReactNode): string {\n if (typeof children === \"string\") return children.slice(0, 3);\n return \"...\";\n}\n\nexport function SidebarItem({\n children,\n href,\n as: As,\n icon,\n active = false,\n disabled = false,\n badge,\n badgeLabel,\n collapsedBadge = false,\n dot,\n dotLabel,\n dotTooltip = false,\n onClick,\n className,\n ...rest\n}: SidebarItemProps) {\n const { collapsed, collapseMode } = useSidebar();\n\n // Link mode engages on `href` OR `as` — a `to`-based router (TanStack Router,\n // React Router) passes no href, and would otherwise render a <button> that\n // navigates nowhere. `onClick` now rides along in link mode instead of being\n // dropped: an item that both navigates and closes a drawer is the common case.\n const isLink = Boolean(href || As);\n const Tag = isLink ? ((As ?? \"a\") as ElementType) : \"button\";\n const tagProps = isLink\n ? { ...(href ? { href } : {}), onClick }\n : { type: \"button\" as const, onClick };\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n const title = typeof children === \"string\" ? children : undefined;\n\n // --- Attention marks (6.1.0). All of this is inert unless `dot` or\n // `collapsedBadge` is passed, so an item without them renders exactly the\n // markup it always did.\n const dotColor: SidebarDotColor | null = dot === true ? \"red\" : dot || null;\n const showCollapsedBadge = collapsed && collapsedBadge && Boolean(badge);\n const hasMarks = dotColor !== null || showCollapsedBadge;\n // `badgeLabel` (6.2.0) is read in place of the visible badge, so it only\n // exists while the badge is actually rendered: always expanded, and\n // collapsed only with `collapsedBadge`.\n const badgeShown = Boolean(badge) && (!collapsed || showCollapsedBadge);\n const badgeLabelEl =\n badgeShown && badgeLabel ? (\n // The comma is the separator, so whatever renders before this must not\n // end in a space (\"tynn , 2 agents\"); see the two trailing spaces below.\n <span className=\"sr-only\" data-react-fancy-sidebar-badge-label=\"\">\n {`, ${badgeLabel}`}\n </span>\n ) : null;\n const dotLabelEl =\n dotColor && dotLabel ? (\n // The spaces are load-bearing: adjacent inline elements concatenate in\n // the accessible name, so without them it reads \"Inbox3 unread\".\n <span className=\"sr-only\" data-react-fancy-sidebar-dot-label=\"\">\n {\" \"}\n {dotLabel}\n {badgeLabelEl ? null : \" \"}\n </span>\n ) : null;\n // Collapsed, the item's visible content is only an icon (or an\n // abbreviation), and its name came from `title`. But accname takes CONTENT\n // over `title`, so a dot label or a badge count would become the item's\n // whole name (\"3 unread\" instead of \"Inbox\"). A visually hidden copy of the\n // label keeps the name first.\n const needsHiddenLabel = collapsed && (dotLabelEl !== null || showCollapsedBadge);\n\n const renderMarks = (anchoredToItem: boolean): ReactNode => (\n <>\n {showCollapsedBadge && (\n <span\n data-react-fancy-sidebar-badge=\"\"\n aria-hidden={badgeLabelEl ? \"true\" : undefined}\n className=\"pointer-events-none absolute -end-3 -top-2.5 whitespace-nowrap\"\n >\n {badge}\n </span>\n )}\n {dotColor && (\n <span\n aria-hidden=\"true\"\n data-react-fancy-sidebar-dot=\"\"\n data-color={dotColor}\n // A collapsed badge takes the top corner; the dot moves to the\n // bottom one rather than hiding under it.\n data-position={showCollapsedBadge ? \"bottom\" : \"top\"}\n className={cn(\n DOT_BASE,\n badgeDot[dotColor],\n anchoredToItem\n ? \"end-1.5 top-1.5\"\n : showCollapsedBadge\n ? \"-bottom-0.5 -end-0.5\"\n : \"-end-0.5 -top-0.5\",\n )}\n />\n )}\n </>\n );\n // Marks sit at the icon's corner when there is an icon, at the letters'\n // corner on a lettered rail, and at the item's own corner otherwise.\n const iconClass = cn(\n \"flex h-5 w-5 shrink-0 items-center justify-center\",\n hasMarks && \"relative\",\n );\n\n // `dotTooltip` (6.2.0) shows the dot's words to sighted users too. It needs\n // words to show, so it is inert without both `dot` and `dotLabel`.\n const showDotTooltip = dotTooltip && dotLabelEl !== null;\n\n const node = (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-sidebar-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n // With a dot tooltip the native `title` would be a second bubble over\n // the first, so the tooltip takes over and carries the label itself.\n // The name does not depend on it: a collapsed item with a dot label\n // already has the visually hidden label copy.\n title={collapsed && !showDotTooltip ? title : undefined}\n className={cn(\n // `w-full` matters when the Tag is a <button>: form controls size to\n // FIT-CONTENT, not to their parent, so a long label made the item wider\n // than the sidebar and an ancestor clipped the overflow — which reads as\n // a label cut off mid-word rather than an ellipsis. Without this,\n // `min-w-0` on the label below can never engage, because the item is\n // never under width pressure in the first place.\n \"flex w-full items-center rounded-md text-sm font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n collapsed ? \"justify-center px-2 py-2\" : \"gap-2 px-3 py-2\",\n active\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\"\n : \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n disabled && \"pointer-events-none opacity-50\",\n // Containing block for the visually hidden labels, and for a dot that\n // has no icon to sit on.\n hasMarks && \"relative\",\n className,\n )}\n >\n {needsHiddenLabel && (\n <span className=\"sr-only\" data-react-fancy-sidebar-label=\"\">\n {children}\n {badgeLabelEl && !dotLabelEl ? null : \" \"}\n </span>\n )}\n {collapsed && dotLabelEl}\n {collapsed && badgeLabelEl}\n {showIconOnly && (\n <span className={iconClass}>\n {icon}\n {renderMarks(false)}\n </span>\n )}\n {showLetters && (\n <span\n className={cn(\"text-xs font-semibold uppercase\", hasMarks && \"relative\")}\n // The abbreviation would otherwise read as part of the name (\"Inb\").\n aria-hidden={needsHiddenLabel || undefined}\n >\n {getLetters(children)}\n {renderMarks(false)}\n </span>\n )}\n {!collapsed && (\n <>\n {icon && (\n <span className={iconClass}>\n {icon}\n {renderMarks(false)}\n </span>\n )}\n {!icon && renderMarks(true)}\n {/*\n `min-w-0` is load-bearing, not tidiness. A flex item defaults to\n `min-width: auto`, which resolves to its MIN-CONTENT width — so with\n `truncate` alone the span refuses to shrink below the full label,\n and the item grows wider than the sidebar instead of ellipsing.\n The overflow then gets clipped by an ancestor, which looks like a\n mid-word cut rather than a truncation.\n\n Only shows up with labels longer than the sidebar is wide, which is\n why it survived: short nav labels never trigger it.\n */}\n <span className=\"min-w-0 flex-1 truncate text-start\">{children}</span>\n {dotLabelEl}\n {/*\n Label and badge are adjacent elements, and adjacent elements\n concatenate in a layout-unaware accessible name: \"tynn2\". A visually\n hidden space separates them (6.2.0); with `badgeLabel`, the label is\n read instead and the badge itself is hidden from assistive tech.\n */}\n {badge && (badgeLabelEl ?? <span className=\"sr-only\"> </span>)}\n {badge && (\n <span className=\"shrink-0\" aria-hidden={badgeLabelEl ? \"true\" : undefined}>\n {badge}\n </span>\n )}\n </>\n )}\n </Tag>\n );\n\n if (!showDotTooltip) return node;\n\n return (\n <Tooltip\n placement=\"right\"\n content={\n // aria-hidden, and deliberately NOT linked with aria-describedby:\n // the same words are already in the item's accessible name via\n // `dotLabel`, so exposing the bubble would read them twice.\n <span aria-hidden=\"true\" data-react-fancy-sidebar-tooltip=\"\">\n {collapsed && (\n <span className=\"block font-medium\" data-react-fancy-sidebar-tooltip-label=\"\">\n {children}\n </span>\n )}\n {dotLabel}\n </span>\n }\n >\n {node}\n </Tooltip>\n );\n}\n\nSidebarItem.displayName = \"SidebarItem\";\n","import { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarGroupProps } from \"./Sidebar.types\";\n\nexport function SidebarGroup({ children, label, className }: SidebarGroupProps) {\n const { collapsed } = useSidebar();\n\n return (\n <div data-react-fancy-sidebar-group=\"\" className={cn(\"py-1\", className)}>\n {label && !collapsed && (\n <p className=\"mb-1 px-3 text-xs font-semibold uppercase tracking-wider text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">\n {label}\n </p>\n )}\n {label && collapsed && (\n <div className=\"mx-auto mb-1 h-px w-6 bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\" />\n )}\n {children}\n </div>\n );\n}\n\nSidebarGroup.displayName = \"SidebarGroup\";\n","import { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarSubmenuProps } from \"./Sidebar.types\";\n\n/** Extract first 3 characters from a string. */\nfunction getLetters(label: string): string {\n return label.slice(0, 3);\n}\n\nexport function SidebarSubmenu({\n children,\n label,\n icon,\n defaultOpen = false,\n className,\n}: SidebarSubmenuProps) {\n const [open, setOpen] = useState(defaultOpen);\n const { collapsed, collapseMode, keyboardNav } = useSidebar();\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n // When collapsed, just show the icon/letters as a simple item (no expand)\n if (collapsed) {\n return (\n <div\n data-react-fancy-sidebar-submenu=\"\"\n title={label}\n className={cn(\n \"flex items-center justify-center rounded-md px-2 py-2 text-sm font-medium transition-colors\",\n \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))]\",\n \"dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n className,\n )}\n >\n {showIconOnly && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>\n )}\n {showLetters && (\n <span className=\"text-xs font-semibold uppercase\">{getLetters(label)}</span>\n )}\n </div>\n );\n }\n\n return (\n <div data-react-fancy-sidebar-submenu=\"\" className={className}>\n <button\n type=\"button\"\n // Only with `keyboardNav`, which reads it to skip a closed panel's\n // still-mounted items; without it the markup is unchanged from 6.0.\n aria-expanded={keyboardNav ? open : undefined}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))]\",\n \"dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n )}\n >\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 text-start\">{label}</span>\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 opacity-60 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n />\n </button>\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200\",\n open ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"ms-4 border-s border-[color:var(--fancy-border,var(--color-zinc-200))] ps-2 pt-1 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nSidebarSubmenu.displayName = \"SidebarSubmenu\";\n","import { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarToggleProps } from \"./Sidebar.types\";\n\nexport function SidebarToggle({ className }: SidebarToggleProps) {\n const { collapsed, setCollapsed } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-react-fancy-sidebar-toggle=\"\"\n onClick={() => setCollapsed(!collapsed)}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className={cn(\n \"flex items-center justify-center rounded-md p-1.5 text-zinc-400 transition-colors\",\n \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300\",\n className,\n )}\n >\n {collapsed ? (\n // The glyph draws the rail on the inline-start side: mirrored in RTL.\n <PanelLeftOpen className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <PanelLeftClose className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n );\n}\n\nSidebarToggle.displayName = \"SidebarToggle\";\n","import { useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks\";\nimport { SidebarContext } from \"./Sidebar.context\";\nimport { useSidebarKeyboardNav } from \"./Sidebar.keyboard\";\nimport { SidebarItem } from \"./SidebarItem\";\nimport { SidebarGroup } from \"./SidebarGroup\";\nimport { SidebarSubmenu } from \"./SidebarSubmenu\";\nimport { SidebarToggle } from \"./SidebarToggle\";\nimport type { SidebarProps } from \"./Sidebar.types\";\n\nfunction SidebarRoot({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseMode = \"icons\",\n embedded = false,\n navLabel,\n keyboardNav = false,\n className,\n}: SidebarProps) {\n const [collapsed, setCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange,\n );\n const rootRef = useRef<HTMLElement>(null);\n const onKeyDown = useSidebarKeyboardNav(rootRef, keyboardNav);\n\n return (\n <SidebarContext.Provider value={{ collapsed, collapseMode, setCollapsed, keyboardNav }}>\n <aside\n ref={rootRef}\n onKeyDown={onKeyDown}\n data-react-fancy-sidebar=\"\"\n data-collapsed={collapsed || undefined}\n data-embedded={embedded || undefined}\n className={cn(\n \"flex flex-col gap-0.5 transition-[width] duration-200\",\n // The app-shell chrome. Correct for the rail this is usually used as,\n // and actively wrong inside a container that already draws its own —\n // a 240px rail in a 300px card puts its right border 240px in, which\n // reads as a stray line slicing the panel rather than an edge.\n !embedded && \"border-e border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n // Collapsed is a fixed icon rail either way; only the expanded width\n // defers to the container.\n collapsed ? \"w-16\" : embedded ? \"w-full\" : \"w-60\",\n className,\n )}\n >\n {navLabel ? (\n // The <aside> is a complementary landmark, not a navigation one, so\n // without this a screen reader's landmark list shows no navigation.\n // Opt-in: an element between the <aside> and its children is a DOM\n // change a consumer's CSS (`aside > a`) or tests may depend on. The\n // <nav> takes over the column layout and fills the rail, so a footer\n // pushed down with `mt-auto` still reaches the bottom.\n <nav\n data-react-fancy-sidebar-nav=\"\"\n aria-label={navLabel}\n className=\"flex min-h-0 flex-1 flex-col gap-0.5\"\n >\n {children}\n </nav>\n ) : (\n children\n )}\n </aside>\n </SidebarContext.Provider>\n );\n}\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Item: SidebarItem,\n Group: SidebarGroup,\n Submenu: SidebarSubmenu,\n Toggle: SidebarToggle,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Sidebar/Sidebar.context.ts","../src/components/Sidebar/Sidebar.keyboard.ts","../src/components/Sidebar/SidebarItem.tsx","../src/components/Sidebar/SidebarGroup.tsx","../src/components/Sidebar/SidebarSubmenu.tsx","../src/components/Sidebar/SidebarToggle.tsx","../src/components/Sidebar/Sidebar.tsx"],"names":["createContext","useContext","useEffect","useCallback","jsx","jsxs","Fragment","cn","badgeDot","Tooltip","getLetters","useState","ChevronDown","PanelLeftOpen","PanelLeftClose","useControllableState","useRef"],"mappings":"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","file":"chunk-X6XUEM2V.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { SidebarContextValue } from \"./Sidebar.types\";\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar(): SidebarContextValue {\n const ctx = useContext(SidebarContext);\n if (!ctx) {\n throw new Error(\"useSidebar must be used within a <Sidebar> component\");\n }\n return ctx;\n}\n","import { useCallback, useEffect, type KeyboardEvent, type RefObject } from \"react\";\n\n/**\n * What arrow keys move between: every `Sidebar.Item`, plus an EXPANDED\n * `Sidebar.Submenu`'s trigger button. (A collapsed submenu renders a plain\n * `<div>`, which is not focusable, so there is nothing to move to.)\n *\n * Selected by the handles the components already render, so `keyboardNav`\n * adds no markup to a Sidebar that does not use it.\n */\nconst ITEM_SELECTOR =\n \"[data-react-fancy-sidebar-item], [data-react-fancy-sidebar-submenu] > button\";\n\nconst NAV_KEYS = new Set([\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"]);\n\n/**\n * Inside a closed submenu — the panel is collapsed to zero height but its\n * items are still mounted, so without this they would be focusable while\n * invisible. `SidebarSubmenu` sets `aria-expanded` on its trigger only when\n * `keyboardNav` is on; a submenu's OWN trigger is not inside its panel.\n */\nfunction inClosedSubmenu(el: HTMLElement, root: HTMLElement): boolean {\n let sub = el.parentElement?.closest<HTMLElement>(\"[data-react-fancy-sidebar-submenu]\");\n while (sub && root.contains(sub)) {\n const trigger = sub.querySelector<HTMLElement>(\":scope > button\");\n if (trigger && trigger !== el && trigger.getAttribute(\"aria-expanded\") === \"false\") {\n return true;\n }\n sub = sub.parentElement?.closest<HTMLElement>(\"[data-react-fancy-sidebar-submenu]\");\n }\n return false;\n}\n\nfunction isNavigable(el: HTMLElement, root: HTMLElement): boolean {\n if (el.getAttribute(\"aria-disabled\") === \"true\") return false;\n if ((el as HTMLButtonElement).disabled) return false;\n return !inClosedSubmenu(el, root);\n}\n\nfunction allItems(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(ITEM_SELECTOR));\n}\n\n/**\n * Roving tabindex + ArrowUp / ArrowDown / Home / End for `Sidebar keyboardNav`.\n *\n * The tab stop is kept on the DOM rather than in React state because items\n * can mount from anywhere below the root (a consumer's own component, a\n * submenu opening) without the root re-rendering. A MutationObserver re-applies\n * it when the set of items, or their disabled / expanded / current state,\n * changes; focus moving onto an item (by click, Tab or arrow) makes that item\n * the stop. Turning `keyboardNav` off removes every tabindex it set.\n *\n * React never renders a `tabIndex` on these items itself, so writing the\n * attribute does not fight reconciliation. (A consumer who passes `tabIndex`\n * to an item while `keyboardNav` is on is overriding the roving stop, and\n * React will reassert theirs on its next render of that item.)\n */\nexport function useSidebarKeyboardNav(\n rootRef: RefObject<HTMLElement | null>,\n enabled: boolean,\n): ((event: KeyboardEvent<HTMLElement>) => void) | undefined {\n useEffect(() => {\n const root = rootRef.current;\n if (!enabled || !root) return;\n\n const touched = new Set<HTMLElement>();\n let current: HTMLElement | null = null;\n\n const apply = () => {\n const items = allItems(root);\n const navigable = items.filter((el) => isNavigable(el, root));\n if (!current || !navigable.includes(current)) {\n current =\n navigable.find((el) => el.getAttribute(\"aria-current\") === \"page\") ??\n navigable[0] ??\n null;\n }\n for (const el of items) {\n const want = el === current ? \"0\" : \"-1\";\n if (el.getAttribute(\"tabindex\") !== want) el.setAttribute(\"tabindex\", want);\n touched.add(el);\n }\n };\n\n const onFocusIn = (event: FocusEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target || !target.matches(ITEM_SELECTOR) || !root.contains(target)) return;\n if (!isNavigable(target, root)) return;\n current = target;\n apply();\n };\n\n apply();\n root.addEventListener(\"focusin\", onFocusIn);\n const observer = new MutationObserver(apply);\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n // NOT tabindex: that is what `apply` writes.\n attributeFilter: [\"aria-disabled\", \"aria-expanded\", \"aria-current\", \"disabled\"],\n });\n\n return () => {\n observer.disconnect();\n root.removeEventListener(\"focusin\", onFocusIn);\n for (const el of touched) el.removeAttribute(\"tabindex\");\n };\n }, [rootRef, enabled]);\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const root = rootRef.current;\n if (!root || !NAV_KEYS.has(event.key)) return;\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n // Only when an ITEM has focus. An input, textarea, select or\n // contenteditable inside the sidebar (a filter box, say) keeps its keys:\n // it does not match the item selector, so it never gets here.\n const target = event.target as HTMLElement;\n if (!target.matches(ITEM_SELECTOR)) return;\n\n const items = allItems(root);\n const navigable = items.filter((el) => isNavigable(el, root));\n if (navigable.length === 0) return;\n\n let next: HTMLElement | undefined;\n if (event.key === \"Home\") next = navigable[0];\n else if (event.key === \"End\") next = navigable[navigable.length - 1];\n else {\n // Walk from the target's position among ALL items, so a focused item\n // that is itself not navigable (disabled while focused) still moves.\n const from = items.indexOf(target);\n const step = event.key === \"ArrowDown\" ? 1 : -1;\n for (let i = from + step; i >= 0 && i < items.length; i += step) {\n if (navigable.includes(items[i])) {\n next = items[i];\n break;\n }\n }\n }\n\n // Handled either way: an arrow at the end of the list must not scroll\n // the page instead. No wrap, matching a list rather than a menu.\n event.preventDefault();\n next?.focus();\n },\n [rootRef],\n );\n\n return enabled ? onKeyDown : undefined;\n}\n","import type { ElementType, ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { badgeDot } from \"../Badge/Badge.colors\";\nimport { Tooltip } from \"../Tooltip\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarDotColor, SidebarItemProps } from \"./Sidebar.types\";\n\n/**\n * The surface-coloured ring separates the dot from whatever it sits on (an\n * icon, the active-row fill) in both modes.\n */\nconst DOT_BASE =\n \"pointer-events-none absolute h-2 w-2 rounded-full ring-2 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\n\n/** Extract first 3 characters from a ReactNode if it's a string. */\nfunction getLetters(children: React.ReactNode): string {\n if (typeof children === \"string\") return children.slice(0, 3);\n return \"...\";\n}\n\nexport function SidebarItem({\n children,\n href,\n as: As,\n icon,\n active = false,\n disabled = false,\n badge,\n badgeLabel,\n collapsedBadge = false,\n dot,\n dotLabel,\n dotTooltip = false,\n onClick,\n className,\n ...rest\n}: SidebarItemProps) {\n const { collapsed, collapseMode } = useSidebar();\n\n // Link mode engages on `href` OR `as` — a `to`-based router (TanStack Router,\n // React Router) passes no href, and would otherwise render a <button> that\n // navigates nowhere. `onClick` now rides along in link mode instead of being\n // dropped: an item that both navigates and closes a drawer is the common case.\n const isLink = Boolean(href || As);\n const Tag = isLink ? ((As ?? \"a\") as ElementType) : \"button\";\n const tagProps = isLink\n ? { ...(href ? { href } : {}), onClick }\n : { type: \"button\" as const, onClick };\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n const title = typeof children === \"string\" ? children : undefined;\n\n // --- Attention marks (6.1.0). All of this is inert unless `dot` or\n // `collapsedBadge` is passed, so an item without them renders exactly the\n // markup it always did.\n const dotColor: SidebarDotColor | null = dot === true ? \"red\" : dot || null;\n const showCollapsedBadge = collapsed && collapsedBadge && Boolean(badge);\n const hasMarks = dotColor !== null || showCollapsedBadge;\n // `badgeLabel` (6.2.0) is read in place of the visible badge, so it only\n // exists while the badge is actually rendered: always expanded, and\n // collapsed only with `collapsedBadge`.\n const badgeShown = Boolean(badge) && (!collapsed || showCollapsedBadge);\n const badgeLabelEl =\n badgeShown && badgeLabel ? (\n // The comma is the separator, so whatever renders before this must not\n // end in a space (\"tynn , 2 agents\"); see the two trailing spaces below.\n <span className=\"sr-only\" data-react-fancy-sidebar-badge-label=\"\">\n {`, ${badgeLabel}`}\n </span>\n ) : null;\n const dotLabelEl =\n dotColor && dotLabel ? (\n // The spaces are load-bearing: adjacent inline elements concatenate in\n // the accessible name, so without them it reads \"Inbox3 unread\".\n <span className=\"sr-only\" data-react-fancy-sidebar-dot-label=\"\">\n {\" \"}\n {dotLabel}\n {badgeLabelEl ? null : \" \"}\n </span>\n ) : null;\n // Collapsed, the item's visible content is only an icon (or an\n // abbreviation), and its name came from `title`. But accname takes CONTENT\n // over `title`, so a dot label or a badge count would become the item's\n // whole name (\"3 unread\" instead of \"Inbox\"). A visually hidden copy of the\n // label keeps the name first.\n const needsHiddenLabel = collapsed && (dotLabelEl !== null || showCollapsedBadge);\n\n const renderMarks = (anchoredToItem: boolean): ReactNode => (\n <>\n {showCollapsedBadge && (\n <span\n data-react-fancy-sidebar-badge=\"\"\n aria-hidden={badgeLabelEl ? \"true\" : undefined}\n className=\"pointer-events-none absolute -end-3 -top-2.5 whitespace-nowrap\"\n >\n {badge}\n </span>\n )}\n {dotColor && (\n <span\n aria-hidden=\"true\"\n data-react-fancy-sidebar-dot=\"\"\n data-color={dotColor}\n // A collapsed badge takes the top corner; the dot moves to the\n // bottom one rather than hiding under it.\n data-position={showCollapsedBadge ? \"bottom\" : \"top\"}\n className={cn(\n DOT_BASE,\n badgeDot[dotColor],\n anchoredToItem\n ? \"end-1.5 top-1.5\"\n : showCollapsedBadge\n ? \"-bottom-0.5 -end-0.5\"\n : \"-end-0.5 -top-0.5\",\n )}\n />\n )}\n </>\n );\n // Marks sit at the icon's corner when there is an icon, at the letters'\n // corner on a lettered rail, and at the item's own corner otherwise.\n const iconClass = cn(\n \"flex h-5 w-5 shrink-0 items-center justify-center\",\n hasMarks && \"relative\",\n );\n\n // `dotTooltip` (6.2.0) shows the dot's words to sighted users too. It needs\n // words to show, so it is inert without both `dot` and `dotLabel`.\n const showDotTooltip = dotTooltip && dotLabelEl !== null;\n\n const node = (\n <Tag\n {...tagProps}\n {...rest}\n data-react-fancy-sidebar-item=\"\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n // With a dot tooltip the native `title` would be a second bubble over\n // the first, so the tooltip takes over and carries the label itself.\n // The name does not depend on it: a collapsed item with a dot label\n // already has the visually hidden label copy.\n title={collapsed && !showDotTooltip ? title : undefined}\n className={cn(\n // `w-full` matters when the Tag is a <button>: form controls size to\n // FIT-CONTENT, not to their parent, so a long label made the item wider\n // than the sidebar and an ancestor clipped the overflow — which reads as\n // a label cut off mid-word rather than an ellipsis. Without this,\n // `min-w-0` on the label below can never engage, because the item is\n // never under width pressure in the first place.\n \"flex w-full items-center rounded-md text-sm font-medium transition-colors\",\n \"outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n collapsed ? \"justify-center px-2 py-2\" : \"gap-2 px-3 py-2\",\n active\n ? \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] text-[color:var(--fancy-text,var(--color-zinc-900))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\"\n : \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n disabled && \"pointer-events-none opacity-50\",\n // Containing block for the visually hidden labels, and for a dot that\n // has no icon to sit on.\n hasMarks && \"relative\",\n className,\n )}\n >\n {needsHiddenLabel && (\n <span className=\"sr-only\" data-react-fancy-sidebar-label=\"\">\n {children}\n {badgeLabelEl && !dotLabelEl ? null : \" \"}\n </span>\n )}\n {collapsed && dotLabelEl}\n {collapsed && badgeLabelEl}\n {showIconOnly && (\n <span className={iconClass}>\n {icon}\n {renderMarks(false)}\n </span>\n )}\n {showLetters && (\n <span\n className={cn(\"text-xs font-semibold uppercase\", hasMarks && \"relative\")}\n // The abbreviation would otherwise read as part of the name (\"Inb\").\n aria-hidden={needsHiddenLabel || undefined}\n >\n {getLetters(children)}\n {renderMarks(false)}\n </span>\n )}\n {!collapsed && (\n <>\n {icon && (\n <span className={iconClass}>\n {icon}\n {renderMarks(false)}\n </span>\n )}\n {!icon && renderMarks(true)}\n {/*\n `min-w-0` is load-bearing, not tidiness. A flex item defaults to\n `min-width: auto`, which resolves to its MIN-CONTENT width — so with\n `truncate` alone the span refuses to shrink below the full label,\n and the item grows wider than the sidebar instead of ellipsing.\n The overflow then gets clipped by an ancestor, which looks like a\n mid-word cut rather than a truncation.\n\n Only shows up with labels longer than the sidebar is wide, which is\n why it survived: short nav labels never trigger it.\n */}\n <span className=\"min-w-0 flex-1 truncate text-start\">{children}</span>\n {dotLabelEl}\n {/*\n Label and badge are adjacent elements, and adjacent elements\n concatenate in a layout-unaware accessible name: \"tynn2\". A visually\n hidden space separates them (6.2.0); with `badgeLabel`, the label is\n read instead and the badge itself is hidden from assistive tech.\n */}\n {badge && (badgeLabelEl ?? <span className=\"sr-only\"> </span>)}\n {badge && (\n <span className=\"shrink-0\" aria-hidden={badgeLabelEl ? \"true\" : undefined}>\n {badge}\n </span>\n )}\n </>\n )}\n </Tag>\n );\n\n if (!showDotTooltip) return node;\n\n return (\n <Tooltip\n placement=\"right\"\n content={\n // aria-hidden, and deliberately NOT linked with aria-describedby:\n // the same words are already in the item's accessible name via\n // `dotLabel`, so exposing the bubble would read them twice.\n <span aria-hidden=\"true\" data-react-fancy-sidebar-tooltip=\"\">\n {collapsed && (\n <span className=\"block font-medium\" data-react-fancy-sidebar-tooltip-label=\"\">\n {children}\n </span>\n )}\n {dotLabel}\n </span>\n }\n >\n {node}\n </Tooltip>\n );\n}\n\nSidebarItem.displayName = \"SidebarItem\";\n","import { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarGroupProps } from \"./Sidebar.types\";\n\nexport function SidebarGroup({ children, label, className }: SidebarGroupProps) {\n const { collapsed } = useSidebar();\n\n return (\n <div data-react-fancy-sidebar-group=\"\" className={cn(\"py-1\", className)}>\n {label && !collapsed && (\n <p className=\"mb-1 px-3 text-xs font-semibold uppercase tracking-wider text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\">\n {label}\n </p>\n )}\n {label && collapsed && (\n <div className=\"mx-auto mb-1 h-px w-6 bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\" />\n )}\n {children}\n </div>\n );\n}\n\nSidebarGroup.displayName = \"SidebarGroup\";\n","import { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarSubmenuProps } from \"./Sidebar.types\";\n\n/** Extract first 3 characters from a string. */\nfunction getLetters(label: string): string {\n return label.slice(0, 3);\n}\n\nexport function SidebarSubmenu({\n children,\n label,\n icon,\n defaultOpen = false,\n className,\n}: SidebarSubmenuProps) {\n const [open, setOpen] = useState(defaultOpen);\n const { collapsed, collapseMode, keyboardNav } = useSidebar();\n\n const showIconOnly = collapsed && collapseMode === \"icons\" && icon;\n const showLetters = collapsed && (collapseMode === \"letters\" || (collapseMode === \"icons\" && !icon));\n\n // When collapsed, just show the icon/letters as a simple item (no expand)\n if (collapsed) {\n return (\n <div\n data-react-fancy-sidebar-submenu=\"\"\n title={label}\n className={cn(\n \"flex items-center justify-center rounded-md px-2 py-2 text-sm font-medium transition-colors\",\n \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))]\",\n \"dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n className,\n )}\n >\n {showIconOnly && (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>\n )}\n {showLetters && (\n <span className=\"text-xs font-semibold uppercase\">{getLetters(label)}</span>\n )}\n </div>\n );\n }\n\n return (\n <div data-react-fancy-sidebar-submenu=\"\" className={className}>\n <button\n type=\"button\"\n // Only with `keyboardNav`, which reads it to skip a closed panel's\n // still-mounted items; without it the markup is unchanged from 6.0.\n aria-expanded={keyboardNav ? open : undefined}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors\",\n \"text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] hover:bg-[color:var(--fancy-surface-hover,var(--color-zinc-50))] hover:text-[color:var(--fancy-text,var(--color-zinc-900))]\",\n \"dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] dark:hover:bg-[color:var(--fancy-surface-hover-dark,color-mix(in_oklab,var(--color-zinc-800)_50%,transparent))] dark:hover:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\",\n )}\n >\n {icon && <span className=\"flex h-5 w-5 shrink-0 items-center justify-center\">{icon}</span>}\n <span className=\"flex-1 text-start\">{label}</span>\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 opacity-60 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n />\n </button>\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200\",\n open ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n )}\n >\n <div className=\"overflow-hidden\">\n <div className=\"ms-4 border-s border-[color:var(--fancy-border,var(--color-zinc-200))] ps-2 pt-1 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\">\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nSidebarSubmenu.displayName = \"SidebarSubmenu\";\n","import { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { useSidebar } from \"./Sidebar.context\";\nimport type { SidebarToggleProps } from \"./Sidebar.types\";\n\nexport function SidebarToggle({ className }: SidebarToggleProps) {\n const { collapsed, setCollapsed } = useSidebar();\n\n return (\n <button\n type=\"button\"\n data-react-fancy-sidebar-toggle=\"\"\n onClick={() => setCollapsed(!collapsed)}\n title={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n className={cn(\n \"flex items-center justify-center rounded-md p-1.5 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors\",\n \"hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\",\n className,\n )}\n >\n {collapsed ? (\n // The glyph draws the rail on the inline-start side: mirrored in RTL.\n <PanelLeftOpen className=\"h-4 w-4 rtl:-scale-x-100\" />\n ) : (\n <PanelLeftClose className=\"h-4 w-4 rtl:-scale-x-100\" />\n )}\n </button>\n );\n}\n\nSidebarToggle.displayName = \"SidebarToggle\";\n","import { useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { useControllableState } from \"../../hooks\";\nimport { SidebarContext } from \"./Sidebar.context\";\nimport { useSidebarKeyboardNav } from \"./Sidebar.keyboard\";\nimport { SidebarItem } from \"./SidebarItem\";\nimport { SidebarGroup } from \"./SidebarGroup\";\nimport { SidebarSubmenu } from \"./SidebarSubmenu\";\nimport { SidebarToggle } from \"./SidebarToggle\";\nimport type { SidebarProps } from \"./Sidebar.types\";\n\nfunction SidebarRoot({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseMode = \"icons\",\n embedded = false,\n navLabel,\n keyboardNav = false,\n className,\n}: SidebarProps) {\n const [collapsed, setCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange,\n );\n const rootRef = useRef<HTMLElement>(null);\n const onKeyDown = useSidebarKeyboardNav(rootRef, keyboardNav);\n\n return (\n <SidebarContext.Provider value={{ collapsed, collapseMode, setCollapsed, keyboardNav }}>\n <aside\n ref={rootRef}\n onKeyDown={onKeyDown}\n data-react-fancy-sidebar=\"\"\n data-collapsed={collapsed || undefined}\n data-embedded={embedded || undefined}\n className={cn(\n \"flex flex-col gap-0.5 transition-[width] duration-200\",\n // The app-shell chrome. Correct for the rail this is usually used as,\n // and actively wrong inside a container that already draws its own —\n // a 240px rail in a 300px card puts its right border 240px in, which\n // reads as a stray line slicing the panel rather than an edge.\n !embedded && \"border-e border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n // Collapsed is a fixed icon rail either way; only the expanded width\n // defers to the container.\n collapsed ? \"w-16\" : embedded ? \"w-full\" : \"w-60\",\n className,\n )}\n >\n {navLabel ? (\n // The <aside> is a complementary landmark, not a navigation one, so\n // without this a screen reader's landmark list shows no navigation.\n // Opt-in: an element between the <aside> and its children is a DOM\n // change a consumer's CSS (`aside > a`) or tests may depend on. The\n // <nav> takes over the column layout and fills the rail, so a footer\n // pushed down with `mt-auto` still reaches the bottom.\n <nav\n data-react-fancy-sidebar-nav=\"\"\n aria-label={navLabel}\n className=\"flex min-h-0 flex-1 flex-col gap-0.5\"\n >\n {children}\n </nav>\n ) : (\n children\n )}\n </aside>\n </SidebarContext.Provider>\n );\n}\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Item: SidebarItem,\n Group: SidebarGroup,\n Submenu: SidebarSubmenu,\n Toggle: SidebarToggle,\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkKJUUCMHH_cjs = require('./chunk-KJUUCMHH.cjs');
|
|
4
4
|
var chunkSNHU2AI4_cjs = require('./chunk-SNHU2AI4.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -91,7 +91,7 @@ var NumberField = react.forwardRef(
|
|
|
91
91
|
};
|
|
92
92
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-react-fancy-number-field": "", children: [
|
|
93
93
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
94
|
-
|
|
94
|
+
chunkKJUUCMHH_cjs.Input,
|
|
95
95
|
{
|
|
96
96
|
"aria-invalid": problem ? true : void 0,
|
|
97
97
|
"aria-valuemax": max,
|
|
@@ -137,5 +137,5 @@ var NumberField = react.forwardRef(
|
|
|
137
137
|
NumberField.displayName = "NumberField";
|
|
138
138
|
|
|
139
139
|
exports.NumberField = NumberField;
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-XIP2TPSX.cjs.map
|
|
141
|
+
//# sourceMappingURL=chunk-XIP2TPSX.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/inputs/NumberField/NumberField.tsx"],"names":["k","forwardRef","useControllableState","useState","useRef","useEffect","jsxs","jsx","Input"],"mappings":";;;;;;;AASA,IAAM,MAAA,GAAS,2CAAA;AACf,IAAM,KAAA,GAAQ,YAAA;AAGd,SAAS,YAAY,IAAA,EAA6B;AAChD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAO,GAAG,OAAO,IAAA;AAElC,EAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,IAAA;AAEhC,EAAA,IAAI,KAAA,CAAM,KAAK,OAAO,CAAA,IAAK,CAAC,MAAA,CAAO,aAAA,CAAc,CAAC,CAAA,EAAG,OAAO,IAAA;AAE5D,EAAA,OAAO,CAAA,KAAM,IAAI,CAAA,GAAI,CAAA;AACvB;AAEA,SAAS,aAAa,KAAA,EAA8B;AAClD,EAAA,OAAO,KAAA,KAAU,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,KAAK,CAAA;AAC3C;AAGA,SAAS,SAAS,CAAA,EAAmB;AACnC,EAAA,MAAM,CAAC,UAAU,QAAQ,CAAA,GAAI,OAAO,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA;AAChD,EAAA,MAAM,MAAA,GAAA,CAAU,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,MAAA,GAAS,MAAA,CAAO,QAAA,IAAY,CAAC,CAAA;AAC3E,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,MAAA,EAAQ,CAAC,GAAG,GAAG,CAAA;AAC1C;AAEA,SAAS,OAAA,CACP,OAAA,EACA,SAAA,EACA,GAAA,EACA,KACA,IAAA,EACQ;AACR,EAAA,MAAM,OAAO,GAAA,IAAO,CAAA;AACpB,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA;AACtD,EAAA,MAAM,EAAA,GAAK,CAACA,EAAAA,KAAc,MAAA,CAAA,CAAQ,OAAOA,EAAAA,GAAI,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAClE,EAAA,MAAM,QAAA,GAAA,CAAA,CAAa,OAAA,IAAW,CAAA,IAAK,IAAA,IAAQ,IAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,IAAA;AAGd,EAAA,IAAI,CAAA,GACF,SAAA,KAAc,CAAA,GACV,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA,GAAI,CAAA,GAC/B,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,KAAK,CAAA,GAAI,CAAA;AAEpC,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,EAAA,CAAG,CAAC,CAAA,GAAI,GAAA,EAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,GAAM,IAAA,IAAQ,IAAA,GAAO,KAAK,CAAA;AAChF,EAAA,IAAI,QAAQ,MAAA,IAAa,EAAA,CAAG,CAAC,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA;AAE1C,EAAA,OAAO,GAAG,CAAC,CAAA;AACb;AAEO,IAAM,WAAA,GAAcC,gBAAA;AAAA,EACzB,CACE;AAAA,IACE,KAAA;AAAA,IACA,YAAA,GAAe,IAAA;AAAA,IACf,aAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,CAAC,IAAA,EAAM,QAAQ,CAAA,GAAIC,sCAAA;AAAA,MACvB,KAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,IAAA;AAQ3E,IAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIC,eAAS,MAAM,YAAA,CAAa,OAAO,CAAC,CAAA;AAC5D,IAAA,IAAI,YAAY,IAAI,CAAA,KAAM,WAAW,IAAA,KAAS,YAAA,CAAa,OAAO,CAAA,EAAG;AACnE,MAAA,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,WAAW,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,GAAO,IAAI,IAAA,GAAO,CAAA;AAE/D,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,KAAK,IAAA,EAAK,KAAM,MAAM,WAAA,CAAY,IAAI,MAAM,IAAA,EAAM;AACpD,QAAA,OAAO,UAAU,OAAA,IAAW,iBAAA;AAAA,MAC9B;AACA,MAAA,IAAI,OAAA,KAAY,MAAM,OAAO,EAAA;AAC7B,MAAA,IAAI,GAAA,KAAQ,UAAa,OAAA,GAAU,GAAA,SAAY,QAAA,EAAU,GAAA,IAAO,oBAAoB,GAAG,CAAA,CAAA,CAAA;AACvF,MAAA,IAAI,GAAA,KAAQ,UAAa,OAAA,GAAU,GAAA,SAAY,QAAA,EAAU,GAAA,IAAO,mBAAmB,GAAG,CAAA,CAAA,CAAA;AACtF,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,GAAO,CAAA,EAAG;AACxC,QAAA,MAAM,QAAA,GAAA,CAAY,OAAA,IAAW,GAAA,IAAO,CAAA,CAAA,IAAM,IAAA;AAC1C,QAAA,IAAI,IAAA,CAAK,IAAI,QAAA,GAAW,IAAA,CAAK,MAAM,QAAQ,CAAC,IAAI,IAAA,EAAM;AACpD,UAAA,OAAO,QAAA,EAAU,IAAA,IAAQ,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,CAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA,GAAG;AAIH,IAAA,MAAM,QAAA,GAAWC,aAAgC,IAAI,CAAA;AACrD,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,QAAA,CAAS,OAAA,EAAS,kBAAkB,OAAO,CAAA;AAAA,IAC7C,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAuC;AAC5D,MAAA,SAAA,GAAY,CAAC,CAAA;AACb,MAAA,IAAI,CAAA,CAAE,gBAAA,IAAoB,IAAA,CAAK,QAAA,IAAY,KAAK,QAAA,EAAU;AAC1D,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,QAAQ,WAAA,EAAa;AAElD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,GAAA,KAAQ,YAAY,CAAA,GAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,QAAQ,CAAA;AAC9E,MAAA,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AAC1B,MAAA,IAAI,IAAA,KAAS,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA;AAAA,IACrC,CAAA;AAEA,IAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,+BAAA,EAA8B,EAAA,EACjC,QAAA,EAAA;AAAA,sBAAAC,cAAA;AAAA,QAACC,uBAAA;AAAA,QAAA;AAAA,UACC,cAAA,EAAc,UAAU,IAAA,GAAO,MAAA;AAAA,UAC/B,eAAA,EAAe,GAAA;AAAA,UACf,eAAA,EAAe,GAAA;AAAA,UACf,iBAAe,OAAA,IAAW,MAAA;AAAA,UAC1B,SAAA,EACE,SAAA;AAAA;AAAA,WAGC,GAAA,KAAQ,MAAA,IAAa,GAAA,IAAO,CAAA,GACzB,OAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,GAC/C,SAAA,GACA,SAAA,GACF,MAAA,CAAA;AAAA,UAEN,IAAA,EAAK,YAAA;AAAA,UACJ,GAAG,IAAA;AAAA,UACJ,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,YAAA,QAAA,CAAS,OAAA,GAAU,EAAA;AACnB,YAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,EAAE,CAAA;AAAA,iBAAA,IAC5B,GAAA,MAAS,OAAA,GAAU,EAAA;AAAA,UAC9B,CAAA;AAAA,UAIA,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,aAAA,EAAe,CAAC,IAAA,KAAS;AACvB,YAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,YAAA,MAAM,MAAA,GAAS,YAAY,IAAI,CAAA;AAC/B,YAAA,IAAI,MAAA,KAAW,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAAA,UACzC,CAAA;AAAA,UACA,SAAA,EAAW,aAAA;AAAA,UACX,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,YAAA,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAC7B,YAAA,MAAA,GAAS,CAAC,CAAA;AAAA,UACZ;AAAA;AAAA,OACF;AAAA,MAEC,IAAA,mBACCD,cAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,IAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,KAAA,EAAO,aAAa,OAAO;AAAA;AAAA,OAC7B,GACE;AAAA,KAAA,EACN,CAAA;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-EDIB6V6Y.cjs","sourcesContent":["import { forwardRef, useEffect, useRef, useState, type KeyboardEvent } from \"react\";\nimport { useControllableState } from \"../../../hooks/use-controllable-state\";\nimport { Input } from \"../Input\";\nimport type { NumberFieldProps } from \"./NumberField.types\";\n\n/**\n * Plain decimal notation only. `Number()` alone is not safe here: it reads \"0x10\"\n * as 16 and \"Infinity\" as a number, and those are wrong numbers to emit.\n */\nconst NUMBER = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\nconst WHOLE = /^[+-]?\\d+$/;\n\n/** The number the text says, or `null` if it does not say one. */\nfunction parseNumber(text: string): number | null {\n const trimmed = text.trim();\n if (!NUMBER.test(trimmed)) return null;\n\n const n = Number(trimmed);\n if (!Number.isFinite(n)) return null;\n // Past 2^53 a whole number rounds to a different one than was typed.\n if (WHOLE.test(trimmed) && !Number.isSafeInteger(n)) return null;\n\n return n === 0 ? 0 : n; // -0 is 0\n}\n\nfunction formatNumber(value: number | null): string {\n return value === null ? \"\" : String(value);\n}\n\n/** Decimal places in a number, so stepping can round away floating-point dust. */\nfunction decimals(n: number): number {\n const [mantissa, exponent] = String(n).split(\"e\");\n const places = (mantissa.split(\".\")[1] ?? \"\").length - Number(exponent ?? 0);\n return Math.min(Math.max(places, 0), 100);\n}\n\nfunction stepped(\n current: number | null,\n direction: 1 | -1,\n min: number | undefined,\n max: number | undefined,\n step: number,\n): number {\n const base = min ?? 0;\n const places = Math.max(decimals(step), decimals(base));\n const at = (k: number) => Number((base + k * step).toFixed(places));\n const position = ((current ?? 0) - base) / step;\n const nudge = 1e-9;\n\n // The next grid line in that direction, so an off-grid value lands on the grid.\n let k =\n direction === 1\n ? Math.floor(position + nudge) + 1\n : Math.ceil(position - nudge) - 1;\n\n if (max !== undefined && at(k) > max) k = Math.floor((max - base) / step + nudge);\n if (min !== undefined && at(k) < min) k = 0;\n\n return at(k);\n}\n\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(\n (\n {\n value,\n defaultValue = null,\n onValueChange,\n min,\n max,\n step,\n messages,\n name,\n form,\n inputMode,\n onKeyDown,\n onBlur,\n ...rest\n },\n ref,\n ) => {\n const [held, setValue] = useControllableState<number | null>(\n value,\n defaultValue,\n onValueChange,\n );\n // A host's NaN or Infinity has no text form, so it reads as no number.\n const current = typeof held === \"number\" && Number.isFinite(held) ? held : null;\n\n /*\n * The text is held apart from the number because \"1.\" and \"-\" have no number\n * that displays them. It only moves on its own when the number moved to\n * something the text does not say: a change from outside, or a parent refusing\n * this one.\n */\n const [text, setText] = useState(() => formatNumber(current));\n if (parseNumber(text) !== current && text !== formatNumber(current)) {\n setText(formatNumber(current));\n }\n\n const stepSize = typeof step === \"number\" && step > 0 ? step : 1;\n\n const problem = (() => {\n if (text.trim() !== \"\" && parseNumber(text) === null) {\n return messages?.invalid ?? \"Enter a number.\";\n }\n if (current === null) return \"\";\n if (min !== undefined && current < min) return messages?.min ?? `Must be at least ${min}.`;\n if (max !== undefined && current > max) return messages?.max ?? `Must be at most ${max}.`;\n if (typeof step === \"number\" && step > 0) {\n const position = (current - (min ?? 0)) / step;\n if (Math.abs(position - Math.round(position)) > 1e-9) {\n return messages?.step ?? `Must be in steps of ${step}.`;\n }\n }\n return \"\";\n })();\n\n // The text input has no min/max/step of its own, so a form learns of them here.\n // Runs every render: click-to-edit mounts a fresh input.\n const inputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n inputRef.current?.setCustomValidity(problem);\n });\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented || rest.disabled || rest.readOnly) return;\n if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") return;\n\n e.preventDefault(); // or the caret jumps to the end of the text\n const next = stepped(current, e.key === \"ArrowUp\" ? 1 : -1, min, max, stepSize);\n setText(formatNumber(next));\n if (next !== current) setValue(next);\n };\n\n return (\n <div data-react-fancy-number-field=\"\">\n <Input\n aria-invalid={problem ? true : undefined}\n aria-valuemax={max}\n aria-valuemin={min}\n aria-valuenow={current ?? undefined}\n inputMode={\n inputMode ??\n // A numeric or decimal keypad has no minus sign on iOS, so those are\n // only offered where a negative number cannot be valid.\n (min !== undefined && min >= 0\n ? typeof step === \"number\" && Number.isInteger(step)\n ? \"numeric\"\n : \"decimal\"\n : \"text\")\n }\n role=\"spinbutton\"\n {...rest}\n ref={(el) => {\n inputRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n // Text, not `number`: a browser reports \"-\" and \"1e\" in a number input as\n // an empty value, indistinguishable from blank, and turns the wheel into\n // a value change on a focused field. Neither applies to a text input.\n type=\"text\"\n value={text}\n onValueChange={(next) => {\n setText(next);\n const parsed = parseNumber(next);\n if (parsed !== current) setValue(parsed);\n }}\n onKeyDown={handleKeyDown}\n onBlur={(e) => {\n setText(formatNumber(current));\n onBlur?.(e);\n }}\n />\n {/* What a native submit posts: the number, never the half-typed text. */}\n {name ? (\n <input\n type=\"hidden\"\n name={name}\n form={form}\n disabled={rest.disabled}\n value={formatNumber(current)}\n />\n ) : null}\n </div>\n );\n },\n);\n\nNumberField.displayName = \"NumberField\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/inputs/NumberField/NumberField.tsx"],"names":["k","forwardRef","useControllableState","useState","useRef","useEffect","jsxs","jsx","Input"],"mappings":"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","file":"chunk-XIP2TPSX.cjs","sourcesContent":["import { forwardRef, useEffect, useRef, useState, type KeyboardEvent } from \"react\";\nimport { useControllableState } from \"../../../hooks/use-controllable-state\";\nimport { Input } from \"../Input\";\nimport type { NumberFieldProps } from \"./NumberField.types\";\n\n/**\n * Plain decimal notation only. `Number()` alone is not safe here: it reads \"0x10\"\n * as 16 and \"Infinity\" as a number, and those are wrong numbers to emit.\n */\nconst NUMBER = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/;\nconst WHOLE = /^[+-]?\\d+$/;\n\n/** The number the text says, or `null` if it does not say one. */\nfunction parseNumber(text: string): number | null {\n const trimmed = text.trim();\n if (!NUMBER.test(trimmed)) return null;\n\n const n = Number(trimmed);\n if (!Number.isFinite(n)) return null;\n // Past 2^53 a whole number rounds to a different one than was typed.\n if (WHOLE.test(trimmed) && !Number.isSafeInteger(n)) return null;\n\n return n === 0 ? 0 : n; // -0 is 0\n}\n\nfunction formatNumber(value: number | null): string {\n return value === null ? \"\" : String(value);\n}\n\n/** Decimal places in a number, so stepping can round away floating-point dust. */\nfunction decimals(n: number): number {\n const [mantissa, exponent] = String(n).split(\"e\");\n const places = (mantissa.split(\".\")[1] ?? \"\").length - Number(exponent ?? 0);\n return Math.min(Math.max(places, 0), 100);\n}\n\nfunction stepped(\n current: number | null,\n direction: 1 | -1,\n min: number | undefined,\n max: number | undefined,\n step: number,\n): number {\n const base = min ?? 0;\n const places = Math.max(decimals(step), decimals(base));\n const at = (k: number) => Number((base + k * step).toFixed(places));\n const position = ((current ?? 0) - base) / step;\n const nudge = 1e-9;\n\n // The next grid line in that direction, so an off-grid value lands on the grid.\n let k =\n direction === 1\n ? Math.floor(position + nudge) + 1\n : Math.ceil(position - nudge) - 1;\n\n if (max !== undefined && at(k) > max) k = Math.floor((max - base) / step + nudge);\n if (min !== undefined && at(k) < min) k = 0;\n\n return at(k);\n}\n\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(\n (\n {\n value,\n defaultValue = null,\n onValueChange,\n min,\n max,\n step,\n messages,\n name,\n form,\n inputMode,\n onKeyDown,\n onBlur,\n ...rest\n },\n ref,\n ) => {\n const [held, setValue] = useControllableState<number | null>(\n value,\n defaultValue,\n onValueChange,\n );\n // A host's NaN or Infinity has no text form, so it reads as no number.\n const current = typeof held === \"number\" && Number.isFinite(held) ? held : null;\n\n /*\n * The text is held apart from the number because \"1.\" and \"-\" have no number\n * that displays them. It only moves on its own when the number moved to\n * something the text does not say: a change from outside, or a parent refusing\n * this one.\n */\n const [text, setText] = useState(() => formatNumber(current));\n if (parseNumber(text) !== current && text !== formatNumber(current)) {\n setText(formatNumber(current));\n }\n\n const stepSize = typeof step === \"number\" && step > 0 ? step : 1;\n\n const problem = (() => {\n if (text.trim() !== \"\" && parseNumber(text) === null) {\n return messages?.invalid ?? \"Enter a number.\";\n }\n if (current === null) return \"\";\n if (min !== undefined && current < min) return messages?.min ?? `Must be at least ${min}.`;\n if (max !== undefined && current > max) return messages?.max ?? `Must be at most ${max}.`;\n if (typeof step === \"number\" && step > 0) {\n const position = (current - (min ?? 0)) / step;\n if (Math.abs(position - Math.round(position)) > 1e-9) {\n return messages?.step ?? `Must be in steps of ${step}.`;\n }\n }\n return \"\";\n })();\n\n // The text input has no min/max/step of its own, so a form learns of them here.\n // Runs every render: click-to-edit mounts a fresh input.\n const inputRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n inputRef.current?.setCustomValidity(problem);\n });\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented || rest.disabled || rest.readOnly) return;\n if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") return;\n\n e.preventDefault(); // or the caret jumps to the end of the text\n const next = stepped(current, e.key === \"ArrowUp\" ? 1 : -1, min, max, stepSize);\n setText(formatNumber(next));\n if (next !== current) setValue(next);\n };\n\n return (\n <div data-react-fancy-number-field=\"\">\n <Input\n aria-invalid={problem ? true : undefined}\n aria-valuemax={max}\n aria-valuemin={min}\n aria-valuenow={current ?? undefined}\n inputMode={\n inputMode ??\n // A numeric or decimal keypad has no minus sign on iOS, so those are\n // only offered where a negative number cannot be valid.\n (min !== undefined && min >= 0\n ? typeof step === \"number\" && Number.isInteger(step)\n ? \"numeric\"\n : \"decimal\"\n : \"text\")\n }\n role=\"spinbutton\"\n {...rest}\n ref={(el) => {\n inputRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n // Text, not `number`: a browser reports \"-\" and \"1e\" in a number input as\n // an empty value, indistinguishable from blank, and turns the wheel into\n // a value change on a focused field. Neither applies to a text input.\n type=\"text\"\n value={text}\n onValueChange={(next) => {\n setText(next);\n const parsed = parseNumber(next);\n if (parsed !== current) setValue(parsed);\n }}\n onKeyDown={handleKeyDown}\n onBlur={(e) => {\n setText(formatNumber(current));\n onBlur?.(e);\n }}\n />\n {/* What a native submit posts: the number, never the half-typed text. */}\n {name ? (\n <input\n type=\"hidden\"\n name={name}\n form={form}\n disabled={rest.disabled}\n value={formatNumber(current)}\n />\n ) : null}\n </div>\n );\n },\n);\n\nNumberField.displayName = \"NumberField\";\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Tooltip } from './chunk-OE4AIUAN.js';
|
|
2
2
|
import { useAcknowledgedSubmit } from './chunk-J6IQHJET.js';
|
|
3
|
-
import { useInlinePaste, InlinePasteEditor, PastedFilesInput, markedIds, expandMarkers } from './chunk-
|
|
3
|
+
import { useInlinePaste, InlinePasteEditor, PastedFilesInput, markedIds, expandMarkers } from './chunk-TDY5YPSU.js';
|
|
4
4
|
import { visuallyHidden } from './chunk-I3LAFKJU.js';
|
|
5
5
|
import { isImeComposing } from './chunk-S42OGG43.js';
|
|
6
6
|
import { Button } from './chunk-Q4CNEHVN.js';
|
|
@@ -634,9 +634,9 @@ var PromptInput = forwardRef(function PromptInput2({
|
|
|
634
634
|
"data-react-fancy-prompt-input-attachment": a.id,
|
|
635
635
|
className: "inline-flex items-center gap-1.5 rounded-md bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] px-2 py-0.5 text-[11px] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
|
|
636
636
|
children: [
|
|
637
|
-
/* @__PURE__ */ jsx(Icon, { name: "paperclip", size: "xs", className: "text-zinc-400" }),
|
|
637
|
+
/* @__PURE__ */ jsx(Icon, { name: "paperclip", size: "xs", "aria-hidden": "true", className: "text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]" }),
|
|
638
638
|
/* @__PURE__ */ jsx("span", { className: "font-mono", children: a.name }),
|
|
639
|
-
/* @__PURE__ */ jsx("span", { className: "text-zinc-400", children: fmtSize(a.bytes) }),
|
|
639
|
+
/* @__PURE__ */ jsx("span", { className: "text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]", children: fmtSize(a.bytes) }),
|
|
640
640
|
/* @__PURE__ */ jsx(
|
|
641
641
|
"button",
|
|
642
642
|
{
|
|
@@ -706,7 +706,7 @@ var PromptInput = forwardRef(function PromptInput2({
|
|
|
706
706
|
onPaste,
|
|
707
707
|
placeholder: resolvedPlaceholder,
|
|
708
708
|
spellCheck: false,
|
|
709
|
-
className: "block w-full resize-none bg-transparent px-3 py-2.5 text-[14px] leading-relaxed outline-none placeholder:text-zinc-400",
|
|
709
|
+
className: "block w-full resize-none bg-transparent px-3 py-2.5 text-[14px] leading-relaxed outline-none placeholder:text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:placeholder:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]",
|
|
710
710
|
rows: 3
|
|
711
711
|
}
|
|
712
712
|
),
|
|
@@ -716,7 +716,7 @@ var PromptInput = forwardRef(function PromptInput2({
|
|
|
716
716
|
"data-react-fancy-prompt-input-menu": picker.kind,
|
|
717
717
|
className: "absolute bottom-full start-2 z-10 mb-1 w-72 overflow-hidden rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] shadow-lg dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]",
|
|
718
718
|
children: [
|
|
719
|
-
/* @__PURE__ */ jsxs("div", { className: "border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-500 dark:border-zinc-800 dark:bg-zinc-950", children: [
|
|
719
|
+
/* @__PURE__ */ jsxs("div", { className: "border-b border-zinc-100 bg-zinc-50 px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:border-zinc-800 dark:bg-zinc-950", children: [
|
|
720
720
|
picker.kind === "cmd" ? "Commands" : "Mention",
|
|
721
721
|
" \xB7 ",
|
|
722
722
|
items.length
|
|
@@ -750,7 +750,7 @@ var PromptInput = forwardRef(function PromptInput2({
|
|
|
750
750
|
className: `cursor-pointer px-2 py-1.5 text-[12px] ${active ? "bg-violet-100 dark:bg-violet-900/30" : "hover:bg-zinc-50 dark:hover:bg-zinc-800"}`,
|
|
751
751
|
children: [
|
|
752
752
|
/* @__PURE__ */ jsx("div", { className: "font-mono font-medium text-violet-700 [overflow-wrap:anywhere] dark:text-violet-300", children: c.name }),
|
|
753
|
-
/* @__PURE__ */ jsx("div", { className: "text-[11px] text-zinc-
|
|
753
|
+
/* @__PURE__ */ jsx("div", { className: "text-[11px] text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))] [overflow-wrap:anywhere]", children: c.hint })
|
|
754
754
|
]
|
|
755
755
|
},
|
|
756
756
|
c.name
|
|
@@ -781,7 +781,7 @@ var PromptInput = forwardRef(function PromptInput2({
|
|
|
781
781
|
/* @__PURE__ */ jsx(
|
|
782
782
|
"span",
|
|
783
783
|
{
|
|
784
|
-
className: "min-w-0 max-w-[40%] truncate text-[10px] uppercase tracking-wider text-zinc-400",
|
|
784
|
+
className: "min-w-0 max-w-[40%] truncate text-[10px] uppercase tracking-wider text-[color:var(--fancy-text-subtle,var(--color-zinc-600))] dark:text-[color:var(--fancy-text-subtle-dark,var(--color-zinc-400))]",
|
|
785
785
|
title: m.kind,
|
|
786
786
|
children: m.kind
|
|
787
787
|
}
|
|
@@ -852,7 +852,7 @@ var PromptInput = forwardRef(function PromptInput2({
|
|
|
852
852
|
showHint && sendButton !== "icon" && /* @__PURE__ */ jsxs(
|
|
853
853
|
"span",
|
|
854
854
|
{
|
|
855
|
-
className: "hidden text-[10px] text-zinc-500 sm:inline",
|
|
855
|
+
className: "hidden text-[10px] text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] sm:inline",
|
|
856
856
|
"data-react-fancy-prompt-input-hint": modKey === "\u2318" ? "apple" : "generic",
|
|
857
857
|
children: [
|
|
858
858
|
/* @__PURE__ */ jsx("kbd", { className: "rounded border border-[color:var(--fancy-border-strong,var(--color-zinc-300))] bg-zinc-50 px-1 py-0.5 font-mono text-[9px] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:border-[color:var(--fancy-border-strong-dark,var(--color-zinc-700))] dark:bg-zinc-800 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]", children: modKey }),
|
|
@@ -937,5 +937,5 @@ function fmtSize(b) {
|
|
|
937
937
|
}
|
|
938
938
|
|
|
939
939
|
export { PromptInput, browserPlatformHints, detectPlatform, modifierKeyLabel, promptDataUrlToFile, promptFileToDataUrl };
|
|
940
|
-
//# sourceMappingURL=chunk-
|
|
941
|
-
//# sourceMappingURL=chunk-
|
|
940
|
+
//# sourceMappingURL=chunk-XKUIPBJD.js.map
|
|
941
|
+
//# sourceMappingURL=chunk-XKUIPBJD.js.map
|