@misael703/ui 1.24.0 → 1.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CGOUG3W5.mjs → chunk-24TLFBBQ.mjs} +3 -3
- package/dist/{chunk-CGOUG3W5.mjs.map → chunk-24TLFBBQ.mjs.map} +1 -1
- package/dist/{chunk-X2DBGT7M.mjs → chunk-2LHXOVX2.mjs} +3 -3
- package/dist/{chunk-X2DBGT7M.mjs.map → chunk-2LHXOVX2.mjs.map} +1 -1
- package/dist/{chunk-IZELILHK.js → chunk-2T5KZJGY.js} +5 -5
- package/dist/{chunk-IZELILHK.js.map → chunk-2T5KZJGY.js.map} +1 -1
- package/dist/{chunk-PKCLA2FD.mjs → chunk-2X66MNCR.mjs} +4 -4
- package/dist/{chunk-PKCLA2FD.mjs.map → chunk-2X66MNCR.mjs.map} +1 -1
- package/dist/{chunk-RQOTH7I7.js → chunk-3HA3VO2I.js} +40 -2
- package/dist/chunk-3HA3VO2I.js.map +1 -0
- package/dist/{chunk-56NJXIH7.js → chunk-3OT3FROI.js} +6 -6
- package/dist/{chunk-56NJXIH7.js.map → chunk-3OT3FROI.js.map} +1 -1
- package/dist/{chunk-JUSOPJZW.mjs → chunk-3U6C2BFM.mjs} +3 -3
- package/dist/{chunk-JUSOPJZW.mjs.map → chunk-3U6C2BFM.mjs.map} +1 -1
- package/dist/{chunk-55TOQMS2.js → chunk-4CPGEYY3.js} +5 -5
- package/dist/{chunk-55TOQMS2.js.map → chunk-4CPGEYY3.js.map} +1 -1
- package/dist/{chunk-B4I6BMNS.mjs → chunk-4N2PCBGA.mjs} +9 -6
- package/dist/chunk-4N2PCBGA.mjs.map +1 -0
- package/dist/{chunk-LYM2VPFL.js → chunk-4RHJW6JI.js} +4 -4
- package/dist/{chunk-LYM2VPFL.js.map → chunk-4RHJW6JI.js.map} +1 -1
- package/dist/{chunk-PRECODB3.js → chunk-5LSPN6Q6.js} +8 -5
- package/dist/chunk-5LSPN6Q6.js.map +1 -0
- package/dist/{chunk-LVLJ75ND.mjs → chunk-5OMB6FC5.mjs} +3 -3
- package/dist/{chunk-LVLJ75ND.mjs.map → chunk-5OMB6FC5.mjs.map} +1 -1
- package/dist/{chunk-PRML6VEF.mjs → chunk-5XT2LX3I.mjs} +10 -3
- package/dist/chunk-5XT2LX3I.mjs.map +1 -0
- package/dist/{chunk-S4YPRJQQ.js → chunk-6BRRRENF.js} +5 -5
- package/dist/{chunk-S4YPRJQQ.js.map → chunk-6BRRRENF.js.map} +1 -1
- package/dist/{chunk-RHPXE3E7.js → chunk-6DMU73SO.js} +10 -10
- package/dist/{chunk-RHPXE3E7.js.map → chunk-6DMU73SO.js.map} +1 -1
- package/dist/{chunk-IZ3FMCZ5.js → chunk-6HNR25ID.js} +4 -4
- package/dist/{chunk-IZ3FMCZ5.js.map → chunk-6HNR25ID.js.map} +1 -1
- package/dist/{chunk-HYUINOPJ.js → chunk-74ALPTUE.js} +4 -4
- package/dist/{chunk-HYUINOPJ.js.map → chunk-74ALPTUE.js.map} +1 -1
- package/dist/{chunk-RBJRQ44B.mjs → chunk-7IPB5A75.mjs} +3 -3
- package/dist/{chunk-RBJRQ44B.mjs.map → chunk-7IPB5A75.mjs.map} +1 -1
- package/dist/{chunk-VCBVLG3Q.js → chunk-A6DHNAM7.js} +4 -4
- package/dist/{chunk-VCBVLG3Q.js.map → chunk-A6DHNAM7.js.map} +1 -1
- package/dist/{chunk-2BPYXHGW.mjs → chunk-ADF5YEMJ.mjs} +3 -3
- package/dist/{chunk-2BPYXHGW.mjs.map → chunk-ADF5YEMJ.mjs.map} +1 -1
- package/dist/{chunk-EJ263Y5X.mjs → chunk-ARGGKLQD.mjs} +3 -3
- package/dist/{chunk-EJ263Y5X.mjs.map → chunk-ARGGKLQD.mjs.map} +1 -1
- package/dist/{chunk-ADQM725E.js → chunk-AS4NTE2Q.js} +5 -5
- package/dist/{chunk-ADQM725E.js.map → chunk-AS4NTE2Q.js.map} +1 -1
- package/dist/{chunk-VFZ2X655.mjs → chunk-AZTZAY2S.mjs} +4 -4
- package/dist/{chunk-VFZ2X655.mjs.map → chunk-AZTZAY2S.mjs.map} +1 -1
- package/dist/{chunk-OJNEGJ3P.mjs → chunk-B4BPE3LC.mjs} +4 -4
- package/dist/{chunk-OJNEGJ3P.mjs.map → chunk-B4BPE3LC.mjs.map} +1 -1
- package/dist/{chunk-FA6526ME.mjs → chunk-CDX256RG.mjs} +3 -3
- package/dist/{chunk-FA6526ME.mjs.map → chunk-CDX256RG.mjs.map} +1 -1
- package/dist/{chunk-7I5LFBQR.js → chunk-CRKYET66.js} +10 -3
- package/dist/chunk-CRKYET66.js.map +1 -0
- package/dist/{chunk-XLLARFVP.mjs → chunk-CUWWADL2.mjs} +4 -4
- package/dist/{chunk-XLLARFVP.mjs.map → chunk-CUWWADL2.mjs.map} +1 -1
- package/dist/{chunk-U3I4IMJI.js → chunk-CXYZK3TK.js} +6 -6
- package/dist/{chunk-U3I4IMJI.js.map → chunk-CXYZK3TK.js.map} +1 -1
- package/dist/{chunk-5QQ6BTD5.mjs → chunk-D4K255ZA.mjs} +5 -5
- package/dist/{chunk-5QQ6BTD5.mjs.map → chunk-D4K255ZA.mjs.map} +1 -1
- package/dist/{chunk-VDBGWTIG.js → chunk-DMMZWL7W.js} +4 -4
- package/dist/{chunk-VDBGWTIG.js.map → chunk-DMMZWL7W.js.map} +1 -1
- package/dist/{chunk-R6XMFBVH.mjs → chunk-EB4TS7VJ.mjs} +3 -3
- package/dist/{chunk-R6XMFBVH.mjs.map → chunk-EB4TS7VJ.mjs.map} +1 -1
- package/dist/{chunk-XCZVZVYJ.js → chunk-EFEEQBS3.js} +8 -8
- package/dist/{chunk-XCZVZVYJ.js.map → chunk-EFEEQBS3.js.map} +1 -1
- package/dist/{chunk-QZACPKQ4.js → chunk-F3O6JAL3.js} +4 -4
- package/dist/{chunk-QZACPKQ4.js.map → chunk-F3O6JAL3.js.map} +1 -1
- package/dist/{chunk-JYHY3UWA.js → chunk-H7HFKEUI.js} +8 -8
- package/dist/{chunk-JYHY3UWA.js.map → chunk-H7HFKEUI.js.map} +1 -1
- package/dist/{chunk-L353APIO.js → chunk-HEI6PUMK.js} +4 -4
- package/dist/{chunk-L353APIO.js.map → chunk-HEI6PUMK.js.map} +1 -1
- package/dist/{chunk-L4JQRY4U.mjs → chunk-I3ADS32J.mjs} +4 -4
- package/dist/{chunk-L4JQRY4U.mjs.map → chunk-I3ADS32J.mjs.map} +1 -1
- package/dist/{chunk-BCE5WXM6.mjs → chunk-JO5WBKF2.mjs} +5 -5
- package/dist/{chunk-BCE5WXM6.mjs.map → chunk-JO5WBKF2.mjs.map} +1 -1
- package/dist/{chunk-O72DMPH6.js → chunk-KS7CSKO6.js} +9 -9
- package/dist/{chunk-O72DMPH6.js.map → chunk-KS7CSKO6.js.map} +1 -1
- package/dist/{chunk-4SEJTTTV.mjs → chunk-LJG3AH7G.mjs} +3 -3
- package/dist/{chunk-4SEJTTTV.mjs.map → chunk-LJG3AH7G.mjs.map} +1 -1
- package/dist/{chunk-55ITZTLL.js → chunk-LJSNE6YQ.js} +8 -8
- package/dist/{chunk-55ITZTLL.js.map → chunk-LJSNE6YQ.js.map} +1 -1
- package/dist/{chunk-MJ6UOTWQ.js → chunk-M3RO3GSC.js} +12 -12
- package/dist/{chunk-MJ6UOTWQ.js.map → chunk-M3RO3GSC.js.map} +1 -1
- package/dist/{chunk-2I7NE7QR.mjs → chunk-MSEDQM7C.mjs} +3 -3
- package/dist/{chunk-2I7NE7QR.mjs.map → chunk-MSEDQM7C.mjs.map} +1 -1
- package/dist/{chunk-XW7DOPY4.mjs → chunk-MVY4UEFB.mjs} +3 -3
- package/dist/{chunk-XW7DOPY4.mjs.map → chunk-MVY4UEFB.mjs.map} +1 -1
- package/dist/{chunk-L4ITC2U6.mjs → chunk-NCXODB4O.mjs} +4 -4
- package/dist/{chunk-L4ITC2U6.mjs.map → chunk-NCXODB4O.mjs.map} +1 -1
- package/dist/{chunk-FGNHN34U.js → chunk-NDMMQZZZ.js} +12 -12
- package/dist/{chunk-FGNHN34U.js.map → chunk-NDMMQZZZ.js.map} +1 -1
- package/dist/{chunk-MOHWK6FH.js → chunk-OEFOGREP.js} +14 -14
- package/dist/{chunk-MOHWK6FH.js.map → chunk-OEFOGREP.js.map} +1 -1
- package/dist/{chunk-FS42XEU7.js → chunk-PPU5WKZS.js} +6 -6
- package/dist/{chunk-FS42XEU7.js.map → chunk-PPU5WKZS.js.map} +1 -1
- package/dist/{chunk-HRDLEOYO.mjs → chunk-PVSP7Y2F.mjs} +4 -4
- package/dist/{chunk-HRDLEOYO.mjs.map → chunk-PVSP7Y2F.mjs.map} +1 -1
- package/dist/{chunk-BSAHYKPF.js → chunk-Q3DKZR44.js} +5 -5
- package/dist/{chunk-BSAHYKPF.js.map → chunk-Q3DKZR44.js.map} +1 -1
- package/dist/{chunk-5A3MAGA3.mjs → chunk-QAOFEIG4.mjs} +4 -4
- package/dist/{chunk-5A3MAGA3.mjs.map → chunk-QAOFEIG4.mjs.map} +1 -1
- package/dist/{chunk-QM7BCSCL.mjs → chunk-RDX3D3P5.mjs} +3 -3
- package/dist/{chunk-QM7BCSCL.mjs.map → chunk-RDX3D3P5.mjs.map} +1 -1
- package/dist/{chunk-HAZDZYF4.mjs → chunk-SHS4QYYN.mjs} +3 -3
- package/dist/{chunk-HAZDZYF4.mjs.map → chunk-SHS4QYYN.mjs.map} +1 -1
- package/dist/{chunk-YSU3WFND.mjs → chunk-STZ7YDMR.mjs} +3 -3
- package/dist/{chunk-YSU3WFND.mjs.map → chunk-STZ7YDMR.mjs.map} +1 -1
- package/dist/{chunk-RCXLCU5A.js → chunk-TCFO7YBF.js} +6 -6
- package/dist/{chunk-RCXLCU5A.js.map → chunk-TCFO7YBF.js.map} +1 -1
- package/dist/{chunk-4QXDOJ7A.js → chunk-TD732KXM.js} +5 -5
- package/dist/{chunk-4QXDOJ7A.js.map → chunk-TD732KXM.js.map} +1 -1
- package/dist/{chunk-GVYZAOWU.mjs → chunk-TS3WC3G4.mjs} +3 -3
- package/dist/{chunk-GVYZAOWU.mjs.map → chunk-TS3WC3G4.mjs.map} +1 -1
- package/dist/{chunk-IKGW7HHG.js → chunk-VAAB5DXM.js} +9 -9
- package/dist/{chunk-IKGW7HHG.js.map → chunk-VAAB5DXM.js.map} +1 -1
- package/dist/{chunk-CIBJKJV3.mjs → chunk-VHYTJD6Z.mjs} +36 -3
- package/dist/chunk-VHYTJD6Z.mjs.map +1 -0
- package/dist/{chunk-JT2SFHBH.js → chunk-WGEEYXVZ.js} +4 -4
- package/dist/{chunk-JT2SFHBH.js.map → chunk-WGEEYXVZ.js.map} +1 -1
- package/dist/{chunk-IOBAPH6I.mjs → chunk-Y6EGYS4L.mjs} +3 -3
- package/dist/{chunk-IOBAPH6I.mjs.map → chunk-Y6EGYS4L.mjs.map} +1 -1
- package/dist/{chunk-GKSUYHGO.js → chunk-YLISYQNI.js} +4 -4
- package/dist/{chunk-GKSUYHGO.js.map → chunk-YLISYQNI.js.map} +1 -1
- package/dist/{chunk-ORUQ5GCU.mjs → chunk-ZA2AXUIB.mjs} +3 -3
- package/dist/{chunk-ORUQ5GCU.mjs.map → chunk-ZA2AXUIB.mjs.map} +1 -1
- package/dist/components/AdvancedPickers.js +7 -7
- package/dist/components/AdvancedPickers.mjs +3 -3
- package/dist/components/AppShell.js +4 -4
- package/dist/components/AppShell.mjs +2 -2
- package/dist/components/Carousel.js +3 -3
- package/dist/components/Carousel.mjs +2 -2
- package/dist/components/Code.js +4 -4
- package/dist/components/Code.mjs +2 -2
- package/dist/components/Comments.js +7 -7
- package/dist/components/Comments.mjs +4 -4
- package/dist/components/Commerce.js +14 -14
- package/dist/components/Commerce.mjs +3 -3
- package/dist/components/ContextMenu.js +3 -3
- package/dist/components/ContextMenu.mjs +2 -2
- package/dist/components/DataTable.js +10 -10
- package/dist/components/DataTable.mjs +4 -4
- package/dist/components/Display.js +13 -13
- package/dist/components/Display.mjs +2 -2
- package/dist/components/Display2.js +7 -7
- package/dist/components/Display2.mjs +3 -3
- package/dist/components/Display3.js +10 -10
- package/dist/components/Display3.mjs +4 -4
- package/dist/components/Editing.js +9 -9
- package/dist/components/Editing.mjs +4 -4
- package/dist/components/Filters.js +8 -8
- package/dist/components/Filters.mjs +2 -2
- package/dist/components/Form.js +12 -12
- package/dist/components/Form.mjs +2 -2
- package/dist/components/Gallery.js +4 -4
- package/dist/components/Gallery.mjs +2 -2
- package/dist/components/HoverCard.js +3 -3
- package/dist/components/HoverCard.mjs +2 -2
- package/dist/components/Icons.d.mts +6 -1
- package/dist/components/Icons.d.ts +6 -1
- package/dist/components/Icons.js +87 -67
- package/dist/components/Icons.mjs +1 -1
- package/dist/components/Inputs.js +6 -6
- package/dist/components/Inputs.mjs +2 -2
- package/dist/components/InputsExtra.js +11 -11
- package/dist/components/InputsExtra.mjs +2 -2
- package/dist/components/Layout.js +22 -22
- package/dist/components/Layout.mjs +3 -3
- package/dist/components/Marketing.js +5 -5
- package/dist/components/Marketing.mjs +2 -2
- package/dist/components/Menubar.js +3 -3
- package/dist/components/Menubar.mjs +2 -2
- package/dist/components/NavigationMenu.js +4 -4
- package/dist/components/NavigationMenu.mjs +3 -3
- package/dist/components/Notifications.js +3 -3
- package/dist/components/Notifications.mjs +2 -2
- package/dist/components/Overlay.js +4 -4
- package/dist/components/Overlay.mjs +2 -2
- package/dist/components/Permissions.js +4 -4
- package/dist/components/Permissions.mjs +3 -3
- package/dist/components/Pickers.js +8 -8
- package/dist/components/Pickers.mjs +3 -3
- package/dist/components/Popover.js +3 -3
- package/dist/components/Popover.mjs +2 -2
- package/dist/components/Toast.js +4 -4
- package/dist/components/Toast.mjs +2 -2
- package/dist/components/Toggle.d.mts +8 -0
- package/dist/components/Toggle.d.ts +8 -0
- package/dist/components/Toggle.js +6 -6
- package/dist/components/Toggle.mjs +1 -1
- package/dist/hooks/index.js +2 -2
- package/dist/hooks/index.mjs +1 -1
- package/dist/hooks/usePopoverPosition.js +2 -2
- package/dist/hooks/usePopoverPosition.mjs +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +247 -227
- package/dist/index.mjs +31 -31
- package/package.json +1 -1
- package/dist/chunk-7I5LFBQR.js.map +0 -1
- package/dist/chunk-B4I6BMNS.mjs.map +0 -1
- package/dist/chunk-CIBJKJV3.mjs.map +0 -1
- package/dist/chunk-PRECODB3.js.map +0 -1
- package/dist/chunk-PRML6VEF.mjs.map +0 -1
- package/dist/chunk-RQOTH7I7.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useLocale } from './chunk-PQV7HHCJ.mjs';
|
|
3
|
-
import { Info, AlertCircle, AlertTriangle, CheckCircle, X } from './chunk-
|
|
3
|
+
import { Info, AlertCircle, AlertTriangle, CheckCircle, X } from './chunk-VHYTJD6Z.mjs';
|
|
4
4
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
import { createPortal } from 'react-dom';
|
|
@@ -120,5 +120,5 @@ function useToast() {
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
export { ToastProvider, useToast };
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-24TLFBBQ.mjs.map
|
|
124
|
+
//# sourceMappingURL=chunk-24TLFBBQ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Toast.tsx"],"names":[],"mappings":";;;;;;;AAOA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,WAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAIA,IAAM,OAAA,GAAU,GAAA;AAgBhB,IAAM,YAAA,GAAqB,oBAAwC,IAAI,CAAA;AAQhE,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAAkC;AACzE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,KAAA,CAAA,QAAA,CAAsB,EAAE,CAAA;AAI1D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAU,KAAA,CAAA,QAAA,iBAAsB,IAAI,KAAK,CAAA;AAOzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,eAAS,KAAK,CAAA;AAClD,EAAM,gBAAU,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,EAAE,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAe,KAAA,CAAA,MAAA,iBAAqC,IAAI,GAAA,EAAK,CAAA;AACnE,EAAA,MAAM,UAAA,GAAmB,KAAA,CAAA,MAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AACrF,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,OAAA,GAAgB,KAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAChD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,MAAM,MAAM,CAAA;AACzB,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AAChC,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,WAAW,MAAM;AAC9B,MAAA,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC5B,MAAA,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAC,CAAA;AAC3D,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,OAAO,IAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,GAAG,OAAO,CAAA;AACV,IAAA,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,MAAM,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAa,KAAA,CAAA,WAAA;AAAA,IACjB,CAAC,CAAA,KAA6B;AAC5B,MAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAkB,EAAE,EAAA,EAAI,QAAA,EAAU,KAAM,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA,EAAE;AACpE,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACnC,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,GAAW,CAAA,EAAG;AACtC,QAAA,MAAM,SAAS,UAAA,CAAW,MAAM,QAAQ,EAAE,CAAA,EAAG,KAAK,QAAQ,CAAA;AAC1D,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,MACpF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAIA,EAAA,MAAM,KAAA,GAAc,KAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAC9C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,YAAA,CAAa,MAAM,MAAM,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AACnC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,YAAY,OAAO,CAAA;AACvD,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EAChD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAe,KAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAC/C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,SAAS,UAAA,CAAW,MAAM,QAAQ,EAAE,CAAA,EAAG,MAAM,SAAS,CAAA;AAC5D,IAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AAAA,EACtF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,MAAM,QAAQ,UAAA,CAAW,OAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,QAAQ,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AACjD,MAAA,GAAA,CAAI,KAAA,EAAM;AACV,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,KAAW,YAAA,CAAa,MAAM,CAAC,CAAA;AAC9C,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,KAAA,mBACJ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,aAAU,QAAA,EACpC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjB,IAAA,MAAM,OAAA,GAAU,EAAE,OAAA,IAAW,MAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,EAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,YAAY,CAAA;AAAA,QAChF,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAc,MAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AAAA,QAC9B,YAAA,EAAc,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AAAA,QACzB,MAAA,EAAQ,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAEzB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,aAAA,EAAc,aAAA,EAAY,QAAO,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,0BACnE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAgB,YAAE,KAAA,EAAM,CAAA;AAAA,YAClD,EAAE,WAAA,oBAAe,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAe,YAAE,WAAA,EAAY;AAAA,WAAA,EAChE,CAAA;AAAA,0BACA,GAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,cAAA,EAAe,YAAA,EAAY,OAAO,aAAa,CAAA,EAAG,SAAS,MAAM,OAAA,CAAQ,EAAE,EAAE,CAAA,EAAG,8BAAC,CAAA,EAAA,EAAE,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA;AAAA,OAAA;AAAA,MAb1H,CAAA,CAAE;AAAA,KAcT;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAMF,EAAA,MAAM,GAAA,GAAY,KAAA,CAAA,OAAA,CAAQ,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,CAAA,EAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEpF,EAAA,uBACE,IAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAO,GAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,WAAW,OAAO,QAAA,KAAa,eAAe,YAAA,CAAa,KAAA,EAAO,SAAS,IAAI;AAAA,GAAA,EAClF,CAAA;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,GAAA,GAAY,iBAAW,YAAY,CAAA;AACzC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,8CAA8C,CAAA;AACxE,EAAA,OAAO,GAAA;AACT","file":"chunk-CGOUG3W5.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, CheckCircle, AlertTriangle, AlertCircle, Info } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { cx } from '../utils/cx';\n\nconst VARIANT_ICON = {\n success: CheckCircle,\n warning: AlertTriangle,\n danger: AlertCircle,\n info: Info,\n} as const;\n\n// Exit animation duration. Must match `--duration-exit` and the\n// `.toast.is-closing` keyframes (`toastSlideOut`) in src/styles/index.css.\nconst EXIT_MS = 150;\n\nexport interface ToastItem {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n variant?: 'info' | 'success' | 'warning' | 'danger';\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: ToastItem[];\n push: (t: Omit<ToastItem, 'id'>) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\ninterface ToastTimerState {\n handle: ReturnType<typeof setTimeout>;\n startedAt: number;\n remaining: number;\n}\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n // Toasts in the closing window: still rendered with `is-closing` class so\n // CSS can play the exit animation, but already removed from new-toast\n // accounting (auto-dismiss timer cancelled, can't be paused/resumed).\n const [closingIds, setClosingIds] = React.useState<Set<string>>(new Set());\n // SSR-safe portal gating. Without this, the first client render emits a\n // `toast-stack` div into document.body via createPortal, while the\n // server-rendered HTML doesn't — Next.js App Router flags it as a\n // hydration mismatch. Starting `mounted=false` keeps the first client\n // render identical to the server; the effect flips it true after\n // hydration and the portal mounts on the next pass.\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => setMounted(true), []);\n const timers = React.useRef<Map<string, ToastTimerState>>(new Map());\n const exitTimers = React.useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const locale = useLocale();\n\n const dismiss = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (state) {\n clearTimeout(state.handle);\n timers.current.delete(id);\n }\n // Already in the closing window? skip (idempotent).\n if (exitTimers.current.has(id)) return;\n setClosingIds((prev) => {\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n const handle = setTimeout(() => {\n exitTimers.current.delete(id);\n setToasts((list) => list.filter((toast) => toast.id !== id));\n setClosingIds((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, EXIT_MS);\n exitTimers.current.set(id, handle);\n }, []);\n\n const push = React.useCallback(\n (t: Omit<ToastItem, 'id'>) => {\n const id = Math.random().toString(36).slice(2);\n const item: ToastItem = { id, duration: 4000, variant: 'info', ...t };\n setToasts((list) => [...list, item]);\n if (item.duration && item.duration > 0) {\n const handle = setTimeout(() => dismiss(id), item.duration);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: item.duration });\n }\n return id;\n },\n [dismiss]\n );\n\n // Pause auto-dismiss while pointer is over the toast — users reading a\n // multi-line message shouldn't have it disappear mid-read.\n const pause = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n clearTimeout(state.handle);\n const elapsed = Date.now() - state.startedAt;\n const remaining = Math.max(0, state.remaining - elapsed);\n timers.current.set(id, { ...state, remaining });\n }, []);\n\n const resume = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n const handle = setTimeout(() => dismiss(id), state.remaining);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: state.remaining });\n }, [dismiss]);\n\n React.useEffect(() => {\n const map = timers.current;\n const exits = exitTimers.current;\n return () => {\n map.forEach((state) => clearTimeout(state.handle));\n map.clear();\n exits.forEach((handle) => clearTimeout(handle));\n exits.clear();\n };\n }, []);\n\n // Portal the stack to body so it isn't clipped by ancestor stacking contexts\n // (overflow:hidden, transform, filter on app shell layouts).\n // aria-atomic intentionally omitted: with `false` (default), screen readers\n // announce only newly added toasts instead of re-reading the entire stack.\n const stack = (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => {\n const variant = t.variant ?? 'info';\n const Icon = VARIANT_ICON[variant];\n return (\n <div\n key={t.id}\n className={cx('toast', `toast--${variant}`, closingIds.has(t.id) && 'is-closing')}\n role=\"status\"\n onMouseEnter={() => pause(t.id)}\n onMouseLeave={() => resume(t.id)}\n onFocus={() => pause(t.id)}\n onBlur={() => resume(t.id)}\n >\n <span className=\"toast__icon\" aria-hidden=\"true\"><Icon size={20} /></span>\n <div className=\"toast__body\">\n {t.title && <div className=\"toast__title\">{t.title}</div>}\n {t.description && <div className=\"toast__desc\">{t.description}</div>}\n </div>\n <button type=\"button\" className=\"toast__close\" aria-label={locale['toast.close']} onClick={() => dismiss(t.id)}><X size={16} /></button>\n </div>\n );\n })}\n </div>\n );\n\n // Memoize the provider value so consumers calling useToast() to access\n // only `push`/`dismiss` (the common case) don't re-render on every state\n // change. Without this, every toast push churned every consumer.\n const ctx = React.useMemo(() => ({ toasts, push, dismiss }), [toasts, push, dismiss]);\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {mounted && typeof document !== 'undefined' && createPortal(stack, document.body)}\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used inside <ToastProvider>');\n return ctx;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Toast.tsx"],"names":[],"mappings":";;;;;;;AAOA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,WAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAA;AAIA,IAAM,OAAA,GAAU,GAAA;AAgBhB,IAAM,YAAA,GAAqB,oBAAwC,IAAI,CAAA;AAQhE,SAAS,aAAA,CAAc,EAAE,QAAA,EAAS,EAAkC;AACzE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,KAAA,CAAA,QAAA,CAAsB,EAAE,CAAA;AAI1D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAU,KAAA,CAAA,QAAA,iBAAsB,IAAI,KAAK,CAAA;AAOzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,eAAS,KAAK,CAAA;AAClD,EAAM,gBAAU,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,EAAE,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAe,KAAA,CAAA,MAAA,iBAAqC,IAAI,GAAA,EAAK,CAAA;AACnE,EAAA,MAAM,UAAA,GAAmB,KAAA,CAAA,MAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AACrF,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,OAAA,GAAgB,KAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAChD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,MAAM,MAAM,CAAA;AACzB,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AAChC,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,WAAW,MAAM;AAC9B,MAAA,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC5B,MAAA,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAC,CAAA;AAC3D,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,GAAG,OAAO,IAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,GAAG,OAAO,CAAA;AACV,IAAA,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,MAAM,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAa,KAAA,CAAA,WAAA;AAAA,IACjB,CAAC,CAAA,KAA6B;AAC5B,MAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAkB,EAAE,EAAA,EAAI,QAAA,EAAU,KAAM,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA,EAAE;AACpE,MAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACnC,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,GAAW,CAAA,EAAG;AACtC,QAAA,MAAM,SAAS,UAAA,CAAW,MAAM,QAAQ,EAAE,CAAA,EAAG,KAAK,QAAQ,CAAA;AAC1D,QAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,EAAW,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,MACpF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAIA,EAAA,MAAM,KAAA,GAAc,KAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAC9C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,YAAA,CAAa,MAAM,MAAM,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AACnC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,YAAY,OAAO,CAAA;AACvD,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EAChD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAAe,KAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AAC/C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,SAAS,UAAA,CAAW,MAAM,QAAQ,EAAE,CAAA,EAAG,MAAM,SAAS,CAAA;AAC5D,IAAA,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AAAA,EACtF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,MAAM,QAAQ,UAAA,CAAW,OAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,QAAQ,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AACjD,MAAA,GAAA,CAAI,KAAA,EAAM;AACV,MAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,KAAW,YAAA,CAAa,MAAM,CAAC,CAAA;AAC9C,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,KAAA,mBACJ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,aAAU,QAAA,EACpC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjB,IAAA,MAAM,OAAA,GAAU,EAAE,OAAA,IAAW,MAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,EAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,YAAY,CAAA;AAAA,QAChF,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAc,MAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AAAA,QAC9B,YAAA,EAAc,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,KAAA,CAAM,CAAA,CAAE,EAAE,CAAA;AAAA,QACzB,MAAA,EAAQ,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAEzB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,aAAA,EAAc,aAAA,EAAY,QAAO,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,0BACnE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,yBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAgB,YAAE,KAAA,EAAM,CAAA;AAAA,YAClD,EAAE,WAAA,oBAAe,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAe,YAAE,WAAA,EAAY;AAAA,WAAA,EAChE,CAAA;AAAA,0BACA,GAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,cAAA,EAAe,YAAA,EAAY,OAAO,aAAa,CAAA,EAAG,SAAS,MAAM,OAAA,CAAQ,EAAE,EAAE,CAAA,EAAG,8BAAC,CAAA,EAAA,EAAE,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA;AAAA,OAAA;AAAA,MAb1H,CAAA,CAAE;AAAA,KAcT;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAMF,EAAA,MAAM,GAAA,GAAY,KAAA,CAAA,OAAA,CAAQ,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,CAAA,EAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEpF,EAAA,uBACE,IAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAO,GAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,WAAW,OAAO,QAAA,KAAa,eAAe,YAAA,CAAa,KAAA,EAAO,SAAS,IAAI;AAAA,GAAA,EAClF,CAAA;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,GAAA,GAAY,iBAAW,YAAY,CAAA;AACzC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,8CAA8C,CAAA;AACxE,EAAA,OAAO,GAAA;AACT","file":"chunk-24TLFBBQ.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, CheckCircle, AlertTriangle, AlertCircle, Info } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { cx } from '../utils/cx';\n\nconst VARIANT_ICON = {\n success: CheckCircle,\n warning: AlertTriangle,\n danger: AlertCircle,\n info: Info,\n} as const;\n\n// Exit animation duration. Must match `--duration-exit` and the\n// `.toast.is-closing` keyframes (`toastSlideOut`) in src/styles/index.css.\nconst EXIT_MS = 150;\n\nexport interface ToastItem {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n variant?: 'info' | 'success' | 'warning' | 'danger';\n duration?: number;\n}\n\ninterface ToastContextValue {\n toasts: ToastItem[];\n push: (t: Omit<ToastItem, 'id'>) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\ninterface ToastTimerState {\n handle: ReturnType<typeof setTimeout>;\n startedAt: number;\n remaining: number;\n}\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n // Toasts in the closing window: still rendered with `is-closing` class so\n // CSS can play the exit animation, but already removed from new-toast\n // accounting (auto-dismiss timer cancelled, can't be paused/resumed).\n const [closingIds, setClosingIds] = React.useState<Set<string>>(new Set());\n // SSR-safe portal gating. Without this, the first client render emits a\n // `toast-stack` div into document.body via createPortal, while the\n // server-rendered HTML doesn't — Next.js App Router flags it as a\n // hydration mismatch. Starting `mounted=false` keeps the first client\n // render identical to the server; the effect flips it true after\n // hydration and the portal mounts on the next pass.\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => setMounted(true), []);\n const timers = React.useRef<Map<string, ToastTimerState>>(new Map());\n const exitTimers = React.useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const locale = useLocale();\n\n const dismiss = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (state) {\n clearTimeout(state.handle);\n timers.current.delete(id);\n }\n // Already in the closing window? skip (idempotent).\n if (exitTimers.current.has(id)) return;\n setClosingIds((prev) => {\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n const handle = setTimeout(() => {\n exitTimers.current.delete(id);\n setToasts((list) => list.filter((toast) => toast.id !== id));\n setClosingIds((prev) => {\n if (!prev.has(id)) return prev;\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, EXIT_MS);\n exitTimers.current.set(id, handle);\n }, []);\n\n const push = React.useCallback(\n (t: Omit<ToastItem, 'id'>) => {\n const id = Math.random().toString(36).slice(2);\n const item: ToastItem = { id, duration: 4000, variant: 'info', ...t };\n setToasts((list) => [...list, item]);\n if (item.duration && item.duration > 0) {\n const handle = setTimeout(() => dismiss(id), item.duration);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: item.duration });\n }\n return id;\n },\n [dismiss]\n );\n\n // Pause auto-dismiss while pointer is over the toast — users reading a\n // multi-line message shouldn't have it disappear mid-read.\n const pause = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n clearTimeout(state.handle);\n const elapsed = Date.now() - state.startedAt;\n const remaining = Math.max(0, state.remaining - elapsed);\n timers.current.set(id, { ...state, remaining });\n }, []);\n\n const resume = React.useCallback((id: string) => {\n const state = timers.current.get(id);\n if (!state) return;\n const handle = setTimeout(() => dismiss(id), state.remaining);\n timers.current.set(id, { handle, startedAt: Date.now(), remaining: state.remaining });\n }, [dismiss]);\n\n React.useEffect(() => {\n const map = timers.current;\n const exits = exitTimers.current;\n return () => {\n map.forEach((state) => clearTimeout(state.handle));\n map.clear();\n exits.forEach((handle) => clearTimeout(handle));\n exits.clear();\n };\n }, []);\n\n // Portal the stack to body so it isn't clipped by ancestor stacking contexts\n // (overflow:hidden, transform, filter on app shell layouts).\n // aria-atomic intentionally omitted: with `false` (default), screen readers\n // announce only newly added toasts instead of re-reading the entire stack.\n const stack = (\n <div className=\"toast-stack\" aria-live=\"polite\">\n {toasts.map((t) => {\n const variant = t.variant ?? 'info';\n const Icon = VARIANT_ICON[variant];\n return (\n <div\n key={t.id}\n className={cx('toast', `toast--${variant}`, closingIds.has(t.id) && 'is-closing')}\n role=\"status\"\n onMouseEnter={() => pause(t.id)}\n onMouseLeave={() => resume(t.id)}\n onFocus={() => pause(t.id)}\n onBlur={() => resume(t.id)}\n >\n <span className=\"toast__icon\" aria-hidden=\"true\"><Icon size={20} /></span>\n <div className=\"toast__body\">\n {t.title && <div className=\"toast__title\">{t.title}</div>}\n {t.description && <div className=\"toast__desc\">{t.description}</div>}\n </div>\n <button type=\"button\" className=\"toast__close\" aria-label={locale['toast.close']} onClick={() => dismiss(t.id)}><X size={16} /></button>\n </div>\n );\n })}\n </div>\n );\n\n // Memoize the provider value so consumers calling useToast() to access\n // only `push`/`dismiss` (the common case) don't re-render on every state\n // change. Without this, every toast push churned every consumer.\n const ctx = React.useMemo(() => ({ toasts, push, dismiss }), [toasts, push, dismiss]);\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {mounted && typeof document !== 'undefined' && createPortal(stack, document.body)}\n </ToastContext.Provider>\n );\n}\n\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used inside <ToastProvider>');\n return ctx;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { Star, ChevronDown } from './chunk-
|
|
2
|
+
import { Star, ChevronDown } from './chunk-VHYTJD6Z.mjs';
|
|
3
3
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -114,5 +114,5 @@ function CategoryNav({ categories, className, ...rest }) {
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
export { CategoryNav, Hero, Testimonial };
|
|
117
|
-
//# sourceMappingURL=chunk-
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
117
|
+
//# sourceMappingURL=chunk-2LHXOVX2.mjs.map
|
|
118
|
+
//# sourceMappingURL=chunk-2LHXOVX2.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Marketing.tsx"],"names":[],"mappings":"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","file":"chunk-X2DBGT7M.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronDown, Star } from './Icons';\n\n// ---------- Hero / Banner ----------------------------------------------\nexport interface HeroProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n eyebrow?: React.ReactNode;\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n /** Imagen de fondo. */\n image?: string;\n /** Posiciona el contenido. Default: center. */\n align?: 'start' | 'center' | 'end';\n /** Variantes visuales. */\n tone?: 'brand' | 'inverse' | 'subtle' | 'image';\n /** Altura. */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function Hero({\n eyebrow, title, subtitle, actions, image,\n align = 'center', tone = 'brand', size = 'md',\n className, style, children, ...rest\n}: HeroProps) {\n const computedTone = image ? 'image' : tone;\n return (\n <section\n className={cx('hero', `hero--${computedTone}`, `hero--align-${align}`, `hero--${size}`, className)}\n style={image ? { backgroundImage: `url(${image})`, ...style } : style}\n {...rest}\n >\n <div className=\"hero__inner\">\n {eyebrow && <div className=\"hero__eyebrow\">{eyebrow}</div>}\n <h1 className=\"hero__title\">{title}</h1>\n {subtitle && <p className=\"hero__subtitle\">{subtitle}</p>}\n {actions && <div className=\"hero__actions\">{actions}</div>}\n {children}\n </div>\n </section>\n );\n}\n\n// ---------- Testimonial -------------------------------------------------\nexport interface TestimonialProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'role'> {\n quote: React.ReactNode;\n author: React.ReactNode;\n role?: React.ReactNode;\n company?: React.ReactNode;\n avatarSrc?: string;\n rating?: number; // 0..5\n}\n\nexport function Testimonial({\n quote, author, role, company, avatarSrc, rating,\n className, ...rest\n}: TestimonialProps) {\n return (\n <figure className={cx('testimonial', className)} {...rest}>\n {rating != null && (\n <div className=\"testimonial__rating\" aria-label={`${rating} de 5 estrellas`}>\n {Array.from({ length: 5 }, (_, i) => (\n <Star key={i} size={14} className={i < rating ? 'is-filled' : ''} />\n ))}\n </div>\n )}\n <blockquote className=\"testimonial__quote\">\"{quote}\"</blockquote>\n <figcaption className=\"testimonial__caption\">\n {avatarSrc && <img src={avatarSrc} alt=\"\" className=\"testimonial__avatar\" />}\n <div>\n <div className=\"testimonial__author\">{author}</div>\n {(role || company) && (\n <div className=\"testimonial__meta\">\n {role}{role && company ? ' · ' : ''}{company}\n </div>\n )}\n </div>\n </figcaption>\n </figure>\n );\n}\n\n// ---------- CategoryNav (mega menu) ------------------------------------\nexport interface CategoryItem {\n id: string;\n label: React.ReactNode;\n href?: string;\n /** Subcategorías agrupadas (mega menu). */\n groups?: Array<{ title: React.ReactNode; items: Array<{ label: React.ReactNode; href?: string }> }>;\n /** Si tiene groups, se muestra el mega menu en hover. */\n}\n\nexport interface CategoryNavProps extends React.HTMLAttributes<HTMLElement> {\n categories: CategoryItem[];\n}\n\nexport function CategoryNav({ categories, className, ...rest }: CategoryNavProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n const ref = React.useRef<HTMLElement>(null);\n\n React.useEffect(() => {\n if (!openId) return;\n const onClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpenId(null);\n };\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpenId(null); };\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [openId]);\n\n return (\n <nav ref={ref} className={cx('category-nav', className)} aria-label=\"Categorías\" {...rest}>\n <ul className=\"category-nav__list\">\n {categories.map((c) => {\n const hasMega = !!(c.groups && c.groups.length);\n const isOpen = openId === c.id;\n return (\n <li key={c.id} className=\"category-nav__item\">\n {hasMega ? (\n <button\n type=\"button\"\n className={cx('category-nav__link', isOpen && 'is-open')}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n onClick={() => setOpenId(isOpen ? null : c.id)}\n >\n {c.label}\n <ChevronDown size={12} />\n </button>\n ) : (\n <a href={c.href ?? '#'} className=\"category-nav__link\">{c.label}</a>\n )}\n {hasMega && isOpen && (\n // Click-to-open instead of hover so the mega menu works\n // identically on touch devices (no hover events) and is\n // accessible to keyboard/screen-reader users. Closes on\n // outside click via the document mousedown listener above.\n <div className=\"category-nav__mega\">\n {c.groups!.map((g, i) => (\n <div key={i} className=\"category-nav__group\">\n <div className=\"category-nav__group-title\">{g.title}</div>\n <ul className=\"category-nav__group-items\">\n {g.items.map((it, j) => (\n <li key={j}><a href={it.href ?? '#'}>{it.label}</a></li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Marketing.tsx"],"names":[],"mappings":";;;;;AAqBO,SAAS,IAAA,CAAK;AAAA,EACnB,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,KAAA;AAAA,EACnC,KAAA,GAAQ,QAAA;AAAA,EAAU,IAAA,GAAO,OAAA;AAAA,EAAS,IAAA,GAAO,IAAA;AAAA,EACzC,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,GAAG;AACjC,CAAA,EAAc;AACZ,EAAA,MAAM,YAAA,GAAe,QAAQ,OAAA,GAAU,IAAA;AACvC,EAAA,uBACE,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,CAAA,MAAA,EAAS,YAAY,CAAA,CAAA,EAAI,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,MACjG,KAAA,EAAO,QAAQ,EAAE,eAAA,EAAiB,OAAO,KAAK,CAAA,CAAA,CAAA,EAAK,GAAG,KAAA,EAAM,GAAI,KAAA;AAAA,MAC/D,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,QAAA,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBACpD,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAClC,QAAA,oBAAY,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAkB,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,QACpD,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QACnD;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAYO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,MAAA;AAAA,EACzC,SAAA;AAAA,EAAW,GAAG;AAChB,CAAA,EAAqB;AACnB,EAAA,uBACE,IAAA,CAAC,YAAO,SAAA,EAAW,EAAA,CAAG,eAAe,SAAS,CAAA,EAAI,GAAG,IAAA,EAClD,QAAA,EAAA;AAAA,IAAA,MAAA,IAAU,IAAA,oBACT,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,YAAA,EAAY,CAAA,EAAG,MAAM,CAAA,eAAA,CAAA,EACvD,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,qBAC7B,GAAA,CAAC,IAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,CAAA,GAAI,MAAA,GAAS,WAAA,GAAc,EAAA,EAAA,EAAnD,CAAuD,CACnE,CAAA,EACH,CAAA;AAAA,oBAEF,IAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,KAAA;AAAA,MAAM;AAAA,KAAA,EAAC,CAAA;AAAA,oBACpD,IAAA,CAAC,YAAA,EAAA,EAAW,SAAA,EAAU,sBAAA,EACnB,QAAA,EAAA;AAAA,MAAA,SAAA,wBAAc,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,GAAA,EAAI,EAAA,EAAG,WAAU,qBAAA,EAAsB,CAAA;AAAA,2BACzE,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QAAA,CAC3C,IAAA,IAAQ,OAAA,qBACR,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAM,IAAA,IAAQ,UAAU,QAAA,GAAQ,EAAA;AAAA,UAAI;AAAA,SAAA,EACvC;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAgBO,SAAS,YAAY,EAAE,UAAA,EAAY,SAAA,EAAW,GAAG,MAAK,EAAqB;AAChF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,GAAA,GAAY,aAAoB,IAAI,CAAA;AAE1C,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAc,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA;AAAA,IAC5E,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAAE,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,SAAA,CAAU,IAAI,CAAA;AAAA,IAAG,CAAA;AAC/E,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AACjD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,2BACG,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,cAAA,EAAgB,SAAS,CAAA,EAAG,YAAA,EAAW,iBAAc,GAAG,IAAA,EACnF,8BAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sBACX,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AACrB,IAAA,MAAM,UAAU,CAAC,EAAE,CAAA,CAAE,MAAA,IAAU,EAAE,MAAA,CAAO,MAAA,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,WAAW,CAAA,CAAE,EAAA;AAC5B,IAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAc,SAAA,EAAU,oBAAA,EACtB,QAAA,EAAA;AAAA,MAAA,OAAA,mBACC,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,MAAA,IAAU,SAAS,CAAA;AAAA,UACvD,eAAA,EAAe,MAAA;AAAA,UACf,eAAA,EAAc,MAAA;AAAA,UACd,SAAS,MAAM,SAAA,CAAU,MAAA,GAAS,IAAA,GAAO,EAAE,EAAE,CAAA;AAAA,UAE5C,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,KAAA;AAAA,4BACH,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,EAAA,EAAI;AAAA;AAAA;AAAA,OACzB,mBAEA,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAQ,GAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,MAEjE,OAAA,IAAW,MAAA;AAAA;AAAA;AAAA;AAAA,sBAKV,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACZ,QAAA,EAAA,CAAA,CAAE,MAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjB,IAAA,CAAC,KAAA,EAAA,EAAY,WAAU,qBAAA,EACrB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,wBACpD,GAAA,CAAC,QAAG,SAAA,EAAU,2BAAA,EACX,YAAE,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBAChB,GAAA,CAAC,QAAW,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,IAAQ,GAAA,EAAM,aAAG,KAAA,EAAM,CAAA,EAAA,EAAtC,CAA0C,CACpD,CAAA,EACH;AAAA,OAAA,EAAA,EANQ,CAOV,CACD,CAAA,EACH;AAAA,KAAA,EAAA,EA/BK,EAAE,EAiCX,CAAA;AAAA,EAEJ,CAAC,GACH,CAAA,EACF,CAAA;AAEJ","file":"chunk-2LHXOVX2.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { ChevronDown, Star } from './Icons';\n\n// ---------- Hero / Banner ----------------------------------------------\nexport interface HeroProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n eyebrow?: React.ReactNode;\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n /** Imagen de fondo. */\n image?: string;\n /** Posiciona el contenido. Default: center. */\n align?: 'start' | 'center' | 'end';\n /** Variantes visuales. */\n tone?: 'brand' | 'inverse' | 'subtle' | 'image';\n /** Altura. */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function Hero({\n eyebrow, title, subtitle, actions, image,\n align = 'center', tone = 'brand', size = 'md',\n className, style, children, ...rest\n}: HeroProps) {\n const computedTone = image ? 'image' : tone;\n return (\n <section\n className={cx('hero', `hero--${computedTone}`, `hero--align-${align}`, `hero--${size}`, className)}\n style={image ? { backgroundImage: `url(${image})`, ...style } : style}\n {...rest}\n >\n <div className=\"hero__inner\">\n {eyebrow && <div className=\"hero__eyebrow\">{eyebrow}</div>}\n <h1 className=\"hero__title\">{title}</h1>\n {subtitle && <p className=\"hero__subtitle\">{subtitle}</p>}\n {actions && <div className=\"hero__actions\">{actions}</div>}\n {children}\n </div>\n </section>\n );\n}\n\n// ---------- Testimonial -------------------------------------------------\nexport interface TestimonialProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'role'> {\n quote: React.ReactNode;\n author: React.ReactNode;\n role?: React.ReactNode;\n company?: React.ReactNode;\n avatarSrc?: string;\n rating?: number; // 0..5\n}\n\nexport function Testimonial({\n quote, author, role, company, avatarSrc, rating,\n className, ...rest\n}: TestimonialProps) {\n return (\n <figure className={cx('testimonial', className)} {...rest}>\n {rating != null && (\n <div className=\"testimonial__rating\" aria-label={`${rating} de 5 estrellas`}>\n {Array.from({ length: 5 }, (_, i) => (\n <Star key={i} size={14} className={i < rating ? 'is-filled' : ''} />\n ))}\n </div>\n )}\n <blockquote className=\"testimonial__quote\">\"{quote}\"</blockquote>\n <figcaption className=\"testimonial__caption\">\n {avatarSrc && <img src={avatarSrc} alt=\"\" className=\"testimonial__avatar\" />}\n <div>\n <div className=\"testimonial__author\">{author}</div>\n {(role || company) && (\n <div className=\"testimonial__meta\">\n {role}{role && company ? ' · ' : ''}{company}\n </div>\n )}\n </div>\n </figcaption>\n </figure>\n );\n}\n\n// ---------- CategoryNav (mega menu) ------------------------------------\nexport interface CategoryItem {\n id: string;\n label: React.ReactNode;\n href?: string;\n /** Subcategorías agrupadas (mega menu). */\n groups?: Array<{ title: React.ReactNode; items: Array<{ label: React.ReactNode; href?: string }> }>;\n /** Si tiene groups, se muestra el mega menu en hover. */\n}\n\nexport interface CategoryNavProps extends React.HTMLAttributes<HTMLElement> {\n categories: CategoryItem[];\n}\n\nexport function CategoryNav({ categories, className, ...rest }: CategoryNavProps) {\n const [openId, setOpenId] = React.useState<string | null>(null);\n const ref = React.useRef<HTMLElement>(null);\n\n React.useEffect(() => {\n if (!openId) return;\n const onClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpenId(null);\n };\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpenId(null); };\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [openId]);\n\n return (\n <nav ref={ref} className={cx('category-nav', className)} aria-label=\"Categorías\" {...rest}>\n <ul className=\"category-nav__list\">\n {categories.map((c) => {\n const hasMega = !!(c.groups && c.groups.length);\n const isOpen = openId === c.id;\n return (\n <li key={c.id} className=\"category-nav__item\">\n {hasMega ? (\n <button\n type=\"button\"\n className={cx('category-nav__link', isOpen && 'is-open')}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n onClick={() => setOpenId(isOpen ? null : c.id)}\n >\n {c.label}\n <ChevronDown size={12} />\n </button>\n ) : (\n <a href={c.href ?? '#'} className=\"category-nav__link\">{c.label}</a>\n )}\n {hasMega && isOpen && (\n // Click-to-open instead of hover so the mega menu works\n // identically on touch devices (no hover events) and is\n // accessible to keyboard/screen-reader users. Closes on\n // outside click via the document mousedown listener above.\n <div className=\"category-nav__mega\">\n {c.groups!.map((g, i) => (\n <div key={i} className=\"category-nav__group\">\n <div className=\"category-nav__group-title\">{g.title}</div>\n <ul className=\"category-nav__group-items\">\n {g.items.map((it, j) => (\n <li key={j}><a href={it.href ?? '#'}>{it.label}</a></li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
var chunk4VMQLSHV_js = require('./chunk-4VMQLSHV.js');
|
|
5
5
|
var chunkEUB4PHPI_js = require('./chunk-EUB4PHPI.js');
|
|
6
|
-
var
|
|
6
|
+
var chunk3HA3VO2I_js = require('./chunk-3HA3VO2I.js');
|
|
7
7
|
var chunkPASF6T4H_js = require('./chunk-PASF6T4H.js');
|
|
8
8
|
var React = require('react');
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -98,7 +98,7 @@ function Alert({ variant = "info", title, icon, onClose, className, children, ..
|
|
|
98
98
|
title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "alert__title", children: title }),
|
|
99
99
|
children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "alert__desc", children })
|
|
100
100
|
] }),
|
|
101
|
-
onClose && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "alert__close", onClick: onClose, "aria-label": t["alert.close"], children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
101
|
+
onClose && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "alert__close", onClick: onClose, "aria-label": t["alert.close"], children: /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.X, { size: 16 }) })
|
|
102
102
|
] });
|
|
103
103
|
}
|
|
104
104
|
function Skeleton({ width, height, rounded, className, style, ...rest }) {
|
|
@@ -138,7 +138,7 @@ function Chip({ active, onRemove, removeLabel, className, children, ...rest }) {
|
|
|
138
138
|
e.stopPropagation();
|
|
139
139
|
onRemove();
|
|
140
140
|
},
|
|
141
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
141
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunk3HA3VO2I_js.X, { size: 12 })
|
|
142
142
|
}
|
|
143
143
|
)
|
|
144
144
|
] });
|
|
@@ -190,5 +190,5 @@ exports.ChipGroup = ChipGroup;
|
|
|
190
190
|
exports.ProductCard = ProductCard;
|
|
191
191
|
exports.Skeleton = Skeleton;
|
|
192
192
|
exports.Spinner = Spinner;
|
|
193
|
-
//# sourceMappingURL=chunk-
|
|
194
|
-
//# sourceMappingURL=chunk-
|
|
193
|
+
//# sourceMappingURL=chunk-2T5KZJGY.js.map
|
|
194
|
+
//# sourceMappingURL=chunk-2T5KZJGY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Display.tsx"],"names":["React","Card","cx","Slot","CardHeader","jsx","CardBody","CardFooter","jsxs","useLocale","X","ChipGroup"],"mappings":"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","file":"chunk-IZELILHK.js","sourcesContent":["import * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { Slot } from './Primitives';\nimport type { Extensible } from '../utils/types';\n\nexport type CategoryAccent = 'cat-1' | 'cat-2' | 'cat-3' | 'cat-4' | 'cat-5' | 'cat-6';\nexport type CardAccent =\n | 'brand' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n | CategoryAccent;\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n interactive?: boolean;\n accent?: Extensible<CardAccent>;\n /**\n * Render as the provided single child element instead of `<div>` (e.g.\n * a clickable card as `next/link`'s `<a>`). Card classes, ref and handlers\n * are merged onto it. Default `false` (identical behavior).\n */\n asChild?: boolean;\n}\n\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(function Card(\n { interactive, accent, className, asChild = false, ...rest },\n ref\n) {\n const cls = cx(\n 'card',\n interactive && 'card--interactive',\n accent && `card--accent-${accent}`,\n className\n );\n if (asChild) {\n return <Slot ref={ref as React.Ref<HTMLElement>} className={cls} {...rest} />;\n }\n return <div ref={ref} className={cls} {...rest} />;\n});\n\nexport const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function CardHeader({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('card__header', className)} {...rest} />;\n }\n);\n\nexport const CardBody = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function CardBody({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('card__body', className)} {...rest} />;\n }\n);\n\nexport const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function CardFooter({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('card__footer', className)} {...rest} />;\n }\n);\n\n// ---------- Badge --------------------------------------------------------\nexport type BadgeVariant =\n | 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n | CategoryAccent;\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: Extensible<BadgeVariant>;\n dot?: boolean;\n /**\n * Pulsing status dot. Lets ONE component cover a \"status\" column\n * (previously you had to mix `StatusIndicator` + `Badge`, which read\n * inconsistently). Implies a dot. Respects `prefers-reduced-motion`.\n */\n pulse?: boolean;\n /**\n * Typographic register. `'data'` (default) is the quiet data-chip:\n * sentence case, tinted, no hard border — it reads as metadata in a\n * dense table. `'label'` is the brand micro-label: uppercase texture\n * for eyebrows, kickers and short tags. Opt into `'label'` only when\n * the badge is a label, not a value.\n */\n tone?: 'data' | 'label';\n /**\n * Surface intensity, orthogonal to `variant` (which is the colour\n * role). `'soft'` (default) is the tinted chip. `'solid'` is a filled\n * chip (the variant's deep tone + white text). `'outline'` is a hairline\n * chip (transparent fill, the variant's deep tone for text + border).\n * `variant=\"neutral\" appearance=\"solid\"` is the dark/ink tag. Supersedes\n * the legacy `variant=\"solid\"` / `\"solid-orange\"` magic strings (still\n * supported, not removed).\n */\n appearance?: 'soft' | 'solid' | 'outline';\n}\n\nexport function Badge({\n variant = 'neutral', dot, pulse, tone = 'data', appearance = 'soft', className, children, ...rest\n}: BadgeProps) {\n const showDot = dot || pulse;\n return (\n <span\n className={cx(\n 'badge',\n `badge--${variant}`,\n tone === 'label' && 'badge--label',\n appearance !== 'soft' && `badge--app-${appearance}`,\n className\n )}\n {...rest}\n >\n {showDot && (\n <span\n className={cx('badge__dot', pulse && 'is-pulsing')}\n aria-hidden=\"true\"\n />\n )}\n {children}\n </span>\n );\n}\n\n// ---------- Alert --------------------------------------------------------\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n variant?: Extensible<AlertVariant>;\n title?: React.ReactNode;\n icon?: React.ReactNode;\n onClose?: () => void;\n}\n\nexport function Alert({ variant = 'info', title, icon, onClose, className, children, ...rest }: AlertProps) {\n const t = useLocale();\n return (\n <div role=\"alert\" className={cx('alert', `alert--${variant}`, className)} {...rest}>\n {icon && <span className=\"alert__icon\" aria-hidden=\"true\">{icon}</span>}\n <div className=\"alert__body\">\n {title && <div className=\"alert__title\">{title}</div>}\n {children && <div className=\"alert__desc\">{children}</div>}\n </div>\n {onClose && (\n <button type=\"button\" className=\"alert__close\" onClick={onClose} aria-label={t['alert.close']}>\n <X size={16} />\n </button>\n )}\n </div>\n );\n}\n\n// ---------- Skeleton & Spinner ------------------------------------------\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n width?: number | string;\n height?: number | string;\n rounded?: boolean;\n}\n\nexport function Skeleton({ width, height, rounded, className, style, ...rest }: SkeletonProps) {\n return (\n <div\n className={cx('skel', className)}\n style={{ width, height, borderRadius: rounded ? 999 : undefined, ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n}\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: 'sm' | 'md' | 'lg';\n inverse?: boolean;\n}\n\nexport function Spinner({ size = 'md', inverse, className, ...rest }: SpinnerProps) {\n const t = useLocale();\n return (\n <span\n role=\"status\"\n aria-label={t['spinner.loading']}\n className={cx('spinner', size === 'lg' && 'spinner--lg', inverse && 'spinner--inverse', className)}\n {...rest}\n />\n );\n}\n\n// ---------- Chip + ChipGroup --------------------------------------------\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement> {\n active?: boolean;\n onRemove?: () => void;\n removeLabel?: string;\n}\n\nexport function Chip({ active, onRemove, removeLabel, className, children, ...rest }: ChipProps) {\n const t = useLocale();\n return (\n <span className={cx('chip', active && 'chip--active', className)} {...rest}>\n <span>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className=\"chip__close\"\n aria-label={removeLabel ?? t['chip.remove']}\n onClick={(e) => { e.stopPropagation(); onRemove(); }}\n >\n <X size={12} />\n </button>\n )}\n </span>\n );\n}\n\nexport const ChipGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function ChipGroup({ className, style, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cx('chip-group', className)}\n style={{ display: 'flex', flexWrap: 'wrap', gap: 8, ...style }}\n {...rest}\n />\n );\n }\n);\n\n// ---------- ProductCard -------------------------------------------------\nexport interface ProductCardProps extends React.HTMLAttributes<HTMLElement> {\n sku?: React.ReactNode;\n name: React.ReactNode;\n price?: React.ReactNode;\n image?: string;\n imageAlt?: string;\n tag?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport function ProductCard({\n sku, name, price, image, imageAlt, tag, footer, className, ...rest\n}: ProductCardProps) {\n return (\n <article className={cx('product-card', className)} {...rest}>\n {tag && <span className=\"product-card__tag\">{tag}</span>}\n <div className=\"product-card__media\">\n {image ? (\n <img src={image} alt={imageAlt ?? (typeof name === 'string' ? name : '')} />\n ) : (\n <div className=\"product-card__placeholder\">{sku ? `[ ${sku} ]` : 'SKU'}</div>\n )}\n </div>\n <div className=\"product-card__body\">\n {sku && <div className=\"product-card__sku\">{sku}</div>}\n <h4 className=\"product-card__title\">{name}</h4>\n {price && <div className=\"product-card__price\">{price}</div>}\n </div>\n {footer && <div className=\"product-card__footer\">{footer}</div>}\n </article>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Display.tsx"],"names":["React","Card","cx","Slot","CardHeader","jsx","CardBody","CardFooter","jsxs","useLocale","X","ChipGroup"],"mappings":"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","file":"chunk-2T5KZJGY.js","sourcesContent":["import * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { X } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { Slot } from './Primitives';\nimport type { Extensible } from '../utils/types';\n\nexport type CategoryAccent = 'cat-1' | 'cat-2' | 'cat-3' | 'cat-4' | 'cat-5' | 'cat-6';\nexport type CardAccent =\n | 'brand' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n | CategoryAccent;\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n interactive?: boolean;\n accent?: Extensible<CardAccent>;\n /**\n * Render as the provided single child element instead of `<div>` (e.g.\n * a clickable card as `next/link`'s `<a>`). Card classes, ref and handlers\n * are merged onto it. Default `false` (identical behavior).\n */\n asChild?: boolean;\n}\n\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(function Card(\n { interactive, accent, className, asChild = false, ...rest },\n ref\n) {\n const cls = cx(\n 'card',\n interactive && 'card--interactive',\n accent && `card--accent-${accent}`,\n className\n );\n if (asChild) {\n return <Slot ref={ref as React.Ref<HTMLElement>} className={cls} {...rest} />;\n }\n return <div ref={ref} className={cls} {...rest} />;\n});\n\nexport const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function CardHeader({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('card__header', className)} {...rest} />;\n }\n);\n\nexport const CardBody = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function CardBody({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('card__body', className)} {...rest} />;\n }\n);\n\nexport const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function CardFooter({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('card__footer', className)} {...rest} />;\n }\n);\n\n// ---------- Badge --------------------------------------------------------\nexport type BadgeVariant =\n | 'primary' | 'accent' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n | CategoryAccent;\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: Extensible<BadgeVariant>;\n dot?: boolean;\n /**\n * Pulsing status dot. Lets ONE component cover a \"status\" column\n * (previously you had to mix `StatusIndicator` + `Badge`, which read\n * inconsistently). Implies a dot. Respects `prefers-reduced-motion`.\n */\n pulse?: boolean;\n /**\n * Typographic register. `'data'` (default) is the quiet data-chip:\n * sentence case, tinted, no hard border — it reads as metadata in a\n * dense table. `'label'` is the brand micro-label: uppercase texture\n * for eyebrows, kickers and short tags. Opt into `'label'` only when\n * the badge is a label, not a value.\n */\n tone?: 'data' | 'label';\n /**\n * Surface intensity, orthogonal to `variant` (which is the colour\n * role). `'soft'` (default) is the tinted chip. `'solid'` is a filled\n * chip (the variant's deep tone + white text). `'outline'` is a hairline\n * chip (transparent fill, the variant's deep tone for text + border).\n * `variant=\"neutral\" appearance=\"solid\"` is the dark/ink tag. Supersedes\n * the legacy `variant=\"solid\"` / `\"solid-orange\"` magic strings (still\n * supported, not removed).\n */\n appearance?: 'soft' | 'solid' | 'outline';\n}\n\nexport function Badge({\n variant = 'neutral', dot, pulse, tone = 'data', appearance = 'soft', className, children, ...rest\n}: BadgeProps) {\n const showDot = dot || pulse;\n return (\n <span\n className={cx(\n 'badge',\n `badge--${variant}`,\n tone === 'label' && 'badge--label',\n appearance !== 'soft' && `badge--app-${appearance}`,\n className\n )}\n {...rest}\n >\n {showDot && (\n <span\n className={cx('badge__dot', pulse && 'is-pulsing')}\n aria-hidden=\"true\"\n />\n )}\n {children}\n </span>\n );\n}\n\n// ---------- Alert --------------------------------------------------------\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n variant?: Extensible<AlertVariant>;\n title?: React.ReactNode;\n icon?: React.ReactNode;\n onClose?: () => void;\n}\n\nexport function Alert({ variant = 'info', title, icon, onClose, className, children, ...rest }: AlertProps) {\n const t = useLocale();\n return (\n <div role=\"alert\" className={cx('alert', `alert--${variant}`, className)} {...rest}>\n {icon && <span className=\"alert__icon\" aria-hidden=\"true\">{icon}</span>}\n <div className=\"alert__body\">\n {title && <div className=\"alert__title\">{title}</div>}\n {children && <div className=\"alert__desc\">{children}</div>}\n </div>\n {onClose && (\n <button type=\"button\" className=\"alert__close\" onClick={onClose} aria-label={t['alert.close']}>\n <X size={16} />\n </button>\n )}\n </div>\n );\n}\n\n// ---------- Skeleton & Spinner ------------------------------------------\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n width?: number | string;\n height?: number | string;\n rounded?: boolean;\n}\n\nexport function Skeleton({ width, height, rounded, className, style, ...rest }: SkeletonProps) {\n return (\n <div\n className={cx('skel', className)}\n style={{ width, height, borderRadius: rounded ? 999 : undefined, ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n );\n}\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: 'sm' | 'md' | 'lg';\n inverse?: boolean;\n}\n\nexport function Spinner({ size = 'md', inverse, className, ...rest }: SpinnerProps) {\n const t = useLocale();\n return (\n <span\n role=\"status\"\n aria-label={t['spinner.loading']}\n className={cx('spinner', size === 'lg' && 'spinner--lg', inverse && 'spinner--inverse', className)}\n {...rest}\n />\n );\n}\n\n// ---------- Chip + ChipGroup --------------------------------------------\nexport interface ChipProps extends React.HTMLAttributes<HTMLSpanElement> {\n active?: boolean;\n onRemove?: () => void;\n removeLabel?: string;\n}\n\nexport function Chip({ active, onRemove, removeLabel, className, children, ...rest }: ChipProps) {\n const t = useLocale();\n return (\n <span className={cx('chip', active && 'chip--active', className)} {...rest}>\n <span>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className=\"chip__close\"\n aria-label={removeLabel ?? t['chip.remove']}\n onClick={(e) => { e.stopPropagation(); onRemove(); }}\n >\n <X size={12} />\n </button>\n )}\n </span>\n );\n}\n\nexport const ChipGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n function ChipGroup({ className, style, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cx('chip-group', className)}\n style={{ display: 'flex', flexWrap: 'wrap', gap: 8, ...style }}\n {...rest}\n />\n );\n }\n);\n\n// ---------- ProductCard -------------------------------------------------\nexport interface ProductCardProps extends React.HTMLAttributes<HTMLElement> {\n sku?: React.ReactNode;\n name: React.ReactNode;\n price?: React.ReactNode;\n image?: string;\n imageAlt?: string;\n tag?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport function ProductCard({\n sku, name, price, image, imageAlt, tag, footer, className, ...rest\n}: ProductCardProps) {\n return (\n <article className={cx('product-card', className)} {...rest}>\n {tag && <span className=\"product-card__tag\">{tag}</span>}\n <div className=\"product-card__media\">\n {image ? (\n <img src={image} alt={imageAlt ?? (typeof name === 'string' ? name : '')} />\n ) : (\n <div className=\"product-card__placeholder\">{sku ? `[ ${sku} ]` : 'SKU'}</div>\n )}\n </div>\n <div className=\"product-card__body\">\n {sku && <div className=\"product-card__sku\">{sku}</div>}\n <h4 className=\"product-card__title\">{name}</h4>\n {price && <div className=\"product-card__price\">{price}</div>}\n </div>\n {footer && <div className=\"product-card__footer\">{footer}</div>}\n </article>\n );\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { Avatar } from './chunk-
|
|
2
|
+
import { Avatar } from './chunk-B4BPE3LC.mjs';
|
|
3
3
|
import { startOfMonth, addMonths, isSameDay } from './chunk-4QHE5H36.mjs';
|
|
4
4
|
import { useLocale } from './chunk-PQV7HHCJ.mjs';
|
|
5
|
-
import { ChevronDown, ChevronRight } from './chunk-
|
|
5
|
+
import { ChevronDown, ChevronRight } from './chunk-VHYTJD6Z.mjs';
|
|
6
6
|
import { cx } from './chunk-IEPCH3JB.mjs';
|
|
7
7
|
import * as React from 'react';
|
|
8
8
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -297,5 +297,5 @@ function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, cl
|
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
export { Calendar, StatusIndicator, Timeline, TimelineItem, Tree, UserCell };
|
|
300
|
-
//# sourceMappingURL=chunk-
|
|
301
|
-
//# sourceMappingURL=chunk-
|
|
300
|
+
//# sourceMappingURL=chunk-2X66MNCR.mjs.map
|
|
301
|
+
//# sourceMappingURL=chunk-2X66MNCR.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Display3.tsx"],"names":["Timeline"],"mappings":"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","file":"chunk-PKCLA2FD.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { ChevronRight, ChevronDown } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { startOfMonth, addMonths, isSameDay } from '../utils/dateFormat';\n\n// ---------- UserCell ----------------------------------------------------\nexport interface UserCellProps extends React.HTMLAttributes<HTMLDivElement> {\n name: React.ReactNode;\n meta?: React.ReactNode; // role / email / etc.\n avatarSrc?: string;\n avatarAlt?: string;\n size?: 24 | 32 | 40 | 48;\n}\n\nexport function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }: UserCellProps) {\n const initialsName = typeof name === 'string' ? name : undefined;\n return (\n <div className={cx('user-cell', className)} {...rest}>\n <Avatar src={avatarSrc} alt={avatarAlt} name={initialsName} size={size} />\n <div className=\"user-cell__body\">\n <div className=\"user-cell__name\">{name}</div>\n {meta && <div className=\"user-cell__meta\">{meta}</div>}\n </div>\n </div>\n );\n}\n\n// ---------- StatusIndicator (pulsing dot) ------------------------------\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport interface StatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: StatusTone;\n pulse?: boolean;\n label?: React.ReactNode;\n}\n\nexport function StatusIndicator({ tone = 'success', pulse, label, className, ...rest }: StatusIndicatorProps) {\n return (\n <span className={cx('status-indicator', className)} role=\"status\" {...rest}>\n <span className={cx('status-indicator__dot', `status-indicator__dot--${tone}`, pulse && 'is-pulsing')} aria-hidden=\"true\" />\n {label && <span className=\"status-indicator__label\">{label}</span>}\n </span>\n );\n}\n\n// ---------- Timeline ----------------------------------------------------\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {}\n\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(\n function Timeline({ className, ...rest }, ref) {\n return <ol ref={ref} className={cx('timeline', className)} {...rest} />;\n }\n);\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'title'> {\n icon?: React.ReactNode;\n tone?: StatusTone;\n title: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport function TimelineItem({ icon, tone = 'neutral', title, meta, children, className, ...rest }: TimelineItemProps) {\n return (\n <li className={cx('timeline__item', className)} {...rest}>\n <span className={cx('timeline__marker', `timeline__marker--${tone}`)} aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"timeline__body\">\n <div className=\"timeline__title\">{title}</div>\n {meta && <div className=\"timeline__meta\">{meta}</div>}\n {children && <div className=\"timeline__content\">{children}</div>}\n </div>\n </li>\n );\n}\n\n// ---------- Tree --------------------------------------------------------\nexport interface TreeNodeData {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n children?: TreeNodeData[];\n meta?: React.ReactNode;\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n nodes: TreeNodeData[];\n defaultExpanded?: string[];\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nfunction firstNodeId(nodes: TreeNodeData[]): string | undefined {\n return nodes[0]?.id;\n}\n\nexport function Tree({\n nodes,\n defaultExpanded = [],\n selectedId,\n onSelect,\n className,\n onKeyDown,\n ...rest\n}: TreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(new Set(defaultExpanded));\n const [activeId, setActiveId] = React.useState<string | undefined>(undefined);\n const rootRef = React.useRef<HTMLUListElement>(null);\n\n // Roving tabindex: one treeitem is tabbable at a time. Falls back to the\n // selected node, then the first node, so the tree is reachable on first Tab.\n const effectiveActive = activeId ?? selectedId ?? firstNodeId(nodes);\n\n const toggle = React.useCallback((id: string) => {\n setExpanded((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const visibleItems = (): HTMLElement[] =>\n Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[role=\"treeitem\"]') ?? []);\n\n const focusItem = (el: HTMLElement | undefined): void => {\n if (!el) return;\n setActiveId(el.dataset.treeId);\n el.focus();\n };\n\n // WAI-ARIA TreeView keyboard model. Focus lives on the treeitem element;\n // querySelectorAll returns items in DOM order, which equals visual order\n // (collapsed branches are not rendered, so they are not navigable).\n const handleKeyDown = (e: React.KeyboardEvent<HTMLUListElement>): void => {\n onKeyDown?.(e);\n const targetEl = (e.target as HTMLElement).closest<HTMLElement>('[role=\"treeitem\"]');\n if (!targetEl || !rootRef.current?.contains(targetEl)) return;\n const list = visibleItems();\n const idx = list.indexOf(targetEl);\n if (idx === -1) return;\n const id = targetEl.dataset.treeId;\n if (!id) return;\n const depth = Number(targetEl.dataset.depth ?? 0);\n const expandedAttr = targetEl.getAttribute('aria-expanded');\n const hasChildren = expandedAttr !== null;\n const isOpen = expandedAttr === 'true';\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusItem(list[Math.min(idx + 1, list.length - 1)]);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusItem(list[Math.max(idx - 1, 0)]);\n break;\n case 'Home':\n e.preventDefault();\n focusItem(list[0]);\n break;\n case 'End':\n e.preventDefault();\n focusItem(list[list.length - 1]);\n break;\n case 'ArrowRight':\n e.preventDefault();\n if (hasChildren && !isOpen) toggle(id);\n else if (hasChildren && isOpen) focusItem(list[idx + 1]);\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (hasChildren && isOpen) {\n toggle(id);\n } else {\n for (let i = idx - 1; i >= 0; i--) {\n const candidate = list[i];\n if (candidate && Number(candidate.dataset.depth ?? 0) < depth) {\n focusItem(candidate);\n break;\n }\n }\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onSelect?.(id);\n break;\n default:\n break;\n }\n };\n\n return (\n <ul\n ref={rootRef}\n role=\"tree\"\n className={cx('tree', className)}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {nodes.map((n) => (\n <TreeNode\n key={n.id}\n node={n}\n depth={0}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={effectiveActive}\n onSelect={onSelect}\n onFocusItem={setActiveId}\n />\n ))}\n </ul>\n );\n}\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expanded: Set<string>;\n toggle: (id: string) => void;\n selectedId?: string;\n activeId?: string;\n onSelect?: (id: string) => void;\n onFocusItem: (id: string) => void;\n}\n\nfunction TreeNode({\n node,\n depth,\n expanded,\n toggle,\n selectedId,\n activeId,\n onSelect,\n onFocusItem,\n}: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length);\n const isOpen = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const isActive = activeId === node.id;\n return (\n <li role=\"none\" className=\"tree__node\">\n <div\n role=\"treeitem\"\n data-tree-id={node.id}\n data-depth={depth}\n aria-expanded={hasChildren ? isOpen : undefined}\n aria-selected={isSelected}\n tabIndex={isActive ? 0 : -1}\n className={cx('tree__row', isSelected && 'is-selected')}\n style={{ paddingLeft: `calc(var(--space-2) + var(--space-4) * ${depth})` }}\n onClick={() => {\n onFocusItem(node.id);\n onSelect?.(node.id);\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"tree__chev\"\n onClick={(e) => { e.stopPropagation(); toggle(node.id); }}\n >\n {isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}\n </button>\n ) : (\n <span className=\"tree__chev tree__chev--placeholder\" aria-hidden=\"true\" />\n )}\n {node.icon && <span className=\"tree__icon\" aria-hidden=\"true\">{node.icon}</span>}\n <span className=\"tree__label\">{node.label}</span>\n {node.meta && <span className=\"tree__meta\">{node.meta}</span>}\n </div>\n {hasChildren && isOpen && (\n <ul role=\"group\" className=\"tree__children\">\n {node.children!.map((c) => (\n <TreeNode\n key={c.id}\n node={c}\n depth={depth + 1}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={activeId}\n onSelect={onSelect}\n onFocusItem={onFocusItem}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ---------- Calendar (vista mes completa, no picker) -------------------\nexport interface CalendarEvent {\n date: Date;\n label: React.ReactNode;\n tone?: StatusTone;\n onClick?: () => void;\n}\n\nexport interface CalendarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Mes a mostrar. Default: mes actual. */\n month?: Date;\n events?: CalendarEvent[];\n onMonthChange?: (m: Date) => void;\n onDayClick?: (d: Date) => void;\n}\n\nexport function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, className, ...rest }: CalendarProps) {\n const [internalMonth, setInternalMonth] = React.useState(() => startOfMonth(monthProp ?? new Date()));\n const month = monthProp ? startOfMonth(monthProp) : internalMonth;\n const t = useLocale();\n const weekdays = t['calendar.weekdays'];\n const months = t['calendar.months'];\n const setMonth = (m: Date) => {\n if (!monthProp) setInternalMonth(m);\n onMonthChange?.(m);\n };\n\n const today = new Date();\n\n // primer día visible: lunes anterior al primer día del mes\n const firstDay = startOfMonth(month);\n const firstWeekday = (firstDay.getDay() + 6) % 7; // domingo=0 → 6, lunes=1 → 0\n const gridStart = new Date(firstDay);\n gridStart.setDate(firstDay.getDate() - firstWeekday);\n\n const days: Date[] = Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n\n const eventsByDay = React.useMemo(() => {\n const m = new Map<string, CalendarEvent[]>();\n for (const ev of events) {\n const key = `${ev.date.getFullYear()}-${ev.date.getMonth()}-${ev.date.getDate()}`;\n const list = m.get(key) ?? [];\n list.push(ev);\n m.set(key, list);\n }\n return m;\n }, [events]);\n\n return (\n <div className={cx('calendar', className)} {...rest}>\n <div className=\"calendar__head\">\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.prevMonth']} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronRight size={16} style={{ transform: 'rotate(180deg)' }} />\n </button>\n <div className=\"calendar__title\">{months[month.getMonth()]} {month.getFullYear()}</div>\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.nextMonth']} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronRight size={16} />\n </button>\n </div>\n <div className=\"calendar__grid calendar__weekdays\">\n {weekdays.map((w) => <div key={w} className=\"calendar__weekday\">{w}</div>)}\n </div>\n <div className=\"calendar__grid\">\n {days.map((d, i) => {\n const inMonth = d.getMonth() === month.getMonth();\n const isToday = isSameDay(d, today);\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = eventsByDay.get(key) ?? [];\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('calendar__day', !inMonth && 'is-out', isToday && 'is-today')}\n onClick={() => onDayClick?.(d)}\n >\n <span className=\"calendar__daynum\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <div className=\"calendar__events\">\n {dayEvents.slice(0, 2).map((ev, idx) => (\n <span\n key={idx}\n className={cx('calendar__event', `calendar__event--${ev.tone ?? 'neutral'}`)}\n onClick={(e) => { e.stopPropagation(); ev.onClick?.(); }}\n >\n {ev.label}\n </span>\n ))}\n {dayEvents.length > 2 && <span className=\"calendar__more\">+{dayEvents.length - 2}</span>}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Display3.tsx"],"names":["Timeline"],"mappings":"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","file":"chunk-2X66MNCR.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\nimport { cx } from '../utils/cx';\nimport { Avatar } from './Display2';\nimport { ChevronRight, ChevronDown } from './Icons';\nimport { useLocale } from '../locale/LocaleProvider';\nimport { startOfMonth, addMonths, isSameDay } from '../utils/dateFormat';\n\n// ---------- UserCell ----------------------------------------------------\nexport interface UserCellProps extends React.HTMLAttributes<HTMLDivElement> {\n name: React.ReactNode;\n meta?: React.ReactNode; // role / email / etc.\n avatarSrc?: string;\n avatarAlt?: string;\n size?: 24 | 32 | 40 | 48;\n}\n\nexport function UserCell({ name, meta, avatarSrc, avatarAlt, size = 32, className, ...rest }: UserCellProps) {\n const initialsName = typeof name === 'string' ? name : undefined;\n return (\n <div className={cx('user-cell', className)} {...rest}>\n <Avatar src={avatarSrc} alt={avatarAlt} name={initialsName} size={size} />\n <div className=\"user-cell__body\">\n <div className=\"user-cell__name\">{name}</div>\n {meta && <div className=\"user-cell__meta\">{meta}</div>}\n </div>\n </div>\n );\n}\n\n// ---------- StatusIndicator (pulsing dot) ------------------------------\nexport type StatusTone = 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport interface StatusIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: StatusTone;\n pulse?: boolean;\n label?: React.ReactNode;\n}\n\nexport function StatusIndicator({ tone = 'success', pulse, label, className, ...rest }: StatusIndicatorProps) {\n return (\n <span className={cx('status-indicator', className)} role=\"status\" {...rest}>\n <span className={cx('status-indicator__dot', `status-indicator__dot--${tone}`, pulse && 'is-pulsing')} aria-hidden=\"true\" />\n {label && <span className=\"status-indicator__label\">{label}</span>}\n </span>\n );\n}\n\n// ---------- Timeline ----------------------------------------------------\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {}\n\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(\n function Timeline({ className, ...rest }, ref) {\n return <ol ref={ref} className={cx('timeline', className)} {...rest} />;\n }\n);\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, 'title'> {\n icon?: React.ReactNode;\n tone?: StatusTone;\n title: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport function TimelineItem({ icon, tone = 'neutral', title, meta, children, className, ...rest }: TimelineItemProps) {\n return (\n <li className={cx('timeline__item', className)} {...rest}>\n <span className={cx('timeline__marker', `timeline__marker--${tone}`)} aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"timeline__body\">\n <div className=\"timeline__title\">{title}</div>\n {meta && <div className=\"timeline__meta\">{meta}</div>}\n {children && <div className=\"timeline__content\">{children}</div>}\n </div>\n </li>\n );\n}\n\n// ---------- Tree --------------------------------------------------------\nexport interface TreeNodeData {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n children?: TreeNodeData[];\n meta?: React.ReactNode;\n}\n\nexport interface TreeProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n nodes: TreeNodeData[];\n defaultExpanded?: string[];\n selectedId?: string;\n onSelect?: (id: string) => void;\n}\n\nfunction firstNodeId(nodes: TreeNodeData[]): string | undefined {\n return nodes[0]?.id;\n}\n\nexport function Tree({\n nodes,\n defaultExpanded = [],\n selectedId,\n onSelect,\n className,\n onKeyDown,\n ...rest\n}: TreeProps) {\n const [expanded, setExpanded] = React.useState<Set<string>>(new Set(defaultExpanded));\n const [activeId, setActiveId] = React.useState<string | undefined>(undefined);\n const rootRef = React.useRef<HTMLUListElement>(null);\n\n // Roving tabindex: one treeitem is tabbable at a time. Falls back to the\n // selected node, then the first node, so the tree is reachable on first Tab.\n const effectiveActive = activeId ?? selectedId ?? firstNodeId(nodes);\n\n const toggle = React.useCallback((id: string) => {\n setExpanded((curr) => {\n const next = new Set(curr);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const visibleItems = (): HTMLElement[] =>\n Array.from(rootRef.current?.querySelectorAll<HTMLElement>('[role=\"treeitem\"]') ?? []);\n\n const focusItem = (el: HTMLElement | undefined): void => {\n if (!el) return;\n setActiveId(el.dataset.treeId);\n el.focus();\n };\n\n // WAI-ARIA TreeView keyboard model. Focus lives on the treeitem element;\n // querySelectorAll returns items in DOM order, which equals visual order\n // (collapsed branches are not rendered, so they are not navigable).\n const handleKeyDown = (e: React.KeyboardEvent<HTMLUListElement>): void => {\n onKeyDown?.(e);\n const targetEl = (e.target as HTMLElement).closest<HTMLElement>('[role=\"treeitem\"]');\n if (!targetEl || !rootRef.current?.contains(targetEl)) return;\n const list = visibleItems();\n const idx = list.indexOf(targetEl);\n if (idx === -1) return;\n const id = targetEl.dataset.treeId;\n if (!id) return;\n const depth = Number(targetEl.dataset.depth ?? 0);\n const expandedAttr = targetEl.getAttribute('aria-expanded');\n const hasChildren = expandedAttr !== null;\n const isOpen = expandedAttr === 'true';\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusItem(list[Math.min(idx + 1, list.length - 1)]);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusItem(list[Math.max(idx - 1, 0)]);\n break;\n case 'Home':\n e.preventDefault();\n focusItem(list[0]);\n break;\n case 'End':\n e.preventDefault();\n focusItem(list[list.length - 1]);\n break;\n case 'ArrowRight':\n e.preventDefault();\n if (hasChildren && !isOpen) toggle(id);\n else if (hasChildren && isOpen) focusItem(list[idx + 1]);\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (hasChildren && isOpen) {\n toggle(id);\n } else {\n for (let i = idx - 1; i >= 0; i--) {\n const candidate = list[i];\n if (candidate && Number(candidate.dataset.depth ?? 0) < depth) {\n focusItem(candidate);\n break;\n }\n }\n }\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n onSelect?.(id);\n break;\n default:\n break;\n }\n };\n\n return (\n <ul\n ref={rootRef}\n role=\"tree\"\n className={cx('tree', className)}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {nodes.map((n) => (\n <TreeNode\n key={n.id}\n node={n}\n depth={0}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={effectiveActive}\n onSelect={onSelect}\n onFocusItem={setActiveId}\n />\n ))}\n </ul>\n );\n}\n\ninterface TreeNodeProps {\n node: TreeNodeData;\n depth: number;\n expanded: Set<string>;\n toggle: (id: string) => void;\n selectedId?: string;\n activeId?: string;\n onSelect?: (id: string) => void;\n onFocusItem: (id: string) => void;\n}\n\nfunction TreeNode({\n node,\n depth,\n expanded,\n toggle,\n selectedId,\n activeId,\n onSelect,\n onFocusItem,\n}: TreeNodeProps) {\n const hasChildren = !!(node.children && node.children.length);\n const isOpen = expanded.has(node.id);\n const isSelected = selectedId === node.id;\n const isActive = activeId === node.id;\n return (\n <li role=\"none\" className=\"tree__node\">\n <div\n role=\"treeitem\"\n data-tree-id={node.id}\n data-depth={depth}\n aria-expanded={hasChildren ? isOpen : undefined}\n aria-selected={isSelected}\n tabIndex={isActive ? 0 : -1}\n className={cx('tree__row', isSelected && 'is-selected')}\n style={{ paddingLeft: `calc(var(--space-2) + var(--space-4) * ${depth})` }}\n onClick={() => {\n onFocusItem(node.id);\n onSelect?.(node.id);\n }}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"tree__chev\"\n onClick={(e) => { e.stopPropagation(); toggle(node.id); }}\n >\n {isOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}\n </button>\n ) : (\n <span className=\"tree__chev tree__chev--placeholder\" aria-hidden=\"true\" />\n )}\n {node.icon && <span className=\"tree__icon\" aria-hidden=\"true\">{node.icon}</span>}\n <span className=\"tree__label\">{node.label}</span>\n {node.meta && <span className=\"tree__meta\">{node.meta}</span>}\n </div>\n {hasChildren && isOpen && (\n <ul role=\"group\" className=\"tree__children\">\n {node.children!.map((c) => (\n <TreeNode\n key={c.id}\n node={c}\n depth={depth + 1}\n expanded={expanded}\n toggle={toggle}\n selectedId={selectedId}\n activeId={activeId}\n onSelect={onSelect}\n onFocusItem={onFocusItem}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ---------- Calendar (vista mes completa, no picker) -------------------\nexport interface CalendarEvent {\n date: Date;\n label: React.ReactNode;\n tone?: StatusTone;\n onClick?: () => void;\n}\n\nexport interface CalendarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Mes a mostrar. Default: mes actual. */\n month?: Date;\n events?: CalendarEvent[];\n onMonthChange?: (m: Date) => void;\n onDayClick?: (d: Date) => void;\n}\n\nexport function Calendar({ month: monthProp, events = [], onMonthChange, onDayClick, className, ...rest }: CalendarProps) {\n const [internalMonth, setInternalMonth] = React.useState(() => startOfMonth(monthProp ?? new Date()));\n const month = monthProp ? startOfMonth(monthProp) : internalMonth;\n const t = useLocale();\n const weekdays = t['calendar.weekdays'];\n const months = t['calendar.months'];\n const setMonth = (m: Date) => {\n if (!monthProp) setInternalMonth(m);\n onMonthChange?.(m);\n };\n\n const today = new Date();\n\n // primer día visible: lunes anterior al primer día del mes\n const firstDay = startOfMonth(month);\n const firstWeekday = (firstDay.getDay() + 6) % 7; // domingo=0 → 6, lunes=1 → 0\n const gridStart = new Date(firstDay);\n gridStart.setDate(firstDay.getDate() - firstWeekday);\n\n const days: Date[] = Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n\n const eventsByDay = React.useMemo(() => {\n const m = new Map<string, CalendarEvent[]>();\n for (const ev of events) {\n const key = `${ev.date.getFullYear()}-${ev.date.getMonth()}-${ev.date.getDate()}`;\n const list = m.get(key) ?? [];\n list.push(ev);\n m.set(key, list);\n }\n return m;\n }, [events]);\n\n return (\n <div className={cx('calendar', className)} {...rest}>\n <div className=\"calendar__head\">\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.prevMonth']} onClick={() => setMonth(addMonths(month, -1))}>\n <ChevronRight size={16} style={{ transform: 'rotate(180deg)' }} />\n </button>\n <div className=\"calendar__title\">{months[month.getMonth()]} {month.getFullYear()}</div>\n <button type=\"button\" className=\"calendar__nav\" aria-label={t['calendar.nextMonth']} onClick={() => setMonth(addMonths(month, 1))}>\n <ChevronRight size={16} />\n </button>\n </div>\n <div className=\"calendar__grid calendar__weekdays\">\n {weekdays.map((w) => <div key={w} className=\"calendar__weekday\">{w}</div>)}\n </div>\n <div className=\"calendar__grid\">\n {days.map((d, i) => {\n const inMonth = d.getMonth() === month.getMonth();\n const isToday = isSameDay(d, today);\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n const dayEvents = eventsByDay.get(key) ?? [];\n return (\n <button\n key={i}\n type=\"button\"\n className={cx('calendar__day', !inMonth && 'is-out', isToday && 'is-today')}\n onClick={() => onDayClick?.(d)}\n >\n <span className=\"calendar__daynum\">{d.getDate()}</span>\n {dayEvents.length > 0 && (\n <div className=\"calendar__events\">\n {dayEvents.slice(0, 2).map((ev, idx) => (\n <span\n key={idx}\n className={cx('calendar__event', `calendar__event--${ev.tone ?? 'neutral'}`)}\n onClick={(e) => { e.stopPropagation(); ev.onClick?.(); }}\n >\n {ev.label}\n </span>\n ))}\n {dayEvents.length > 2 && <span className=\"calendar__more\">+{dayEvents.length - 2}</span>}\n </div>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -238,6 +238,18 @@ var CalendarIcon = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { c
|
|
|
238
238
|
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "2", x2: "8", y2: "6" }),
|
|
239
239
|
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "10", x2: "21", y2: "10" })
|
|
240
240
|
] }), "CalendarIcon");
|
|
241
|
+
var CalendarDays = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "4", width: "18", height: "18", rx: "2", ry: "2" }),
|
|
243
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "16", y1: "2", x2: "16", y2: "6" }),
|
|
244
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "2", x2: "8", y2: "6" }),
|
|
245
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "10", x2: "21", y2: "10" }),
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "14", x2: "8.01", y2: "14" }),
|
|
247
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "14", x2: "12.01", y2: "14" }),
|
|
248
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "16", y1: "14", x2: "16.01", y2: "14" }),
|
|
249
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "18", x2: "8.01", y2: "18" }),
|
|
250
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18" }),
|
|
251
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "16", y1: "18", x2: "16.01", y2: "18" })
|
|
252
|
+
] }), "CalendarDays");
|
|
241
253
|
var Clock = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
242
254
|
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
|
|
243
255
|
/* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "12 6 12 12 16 14" })
|
|
@@ -268,6 +280,11 @@ var MapPin = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { childre
|
|
|
268
280
|
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" }),
|
|
269
281
|
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "10", r: "3" })
|
|
270
282
|
] }), "MapPin");
|
|
283
|
+
var Map = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
284
|
+
/* @__PURE__ */ jsxRuntime.jsx("polygon", { points: "1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6" }),
|
|
285
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "2", x2: "8", y2: "18" }),
|
|
286
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "16", y1: "6", x2: "16", y2: "22" })
|
|
287
|
+
] }), "Map");
|
|
271
288
|
var Lock = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
272
289
|
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }),
|
|
273
290
|
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
|
|
@@ -331,6 +348,22 @@ var AlignRight = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { chi
|
|
|
331
348
|
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "21", y1: "14", x2: "3", y2: "14" }),
|
|
332
349
|
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "21", y1: "18", x2: "7", y2: "18" })
|
|
333
350
|
] }), "AlignRight");
|
|
351
|
+
var Rows3 = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
352
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
|
|
353
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "9", x2: "21", y2: "9" }),
|
|
354
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "3", y1: "15", x2: "21", y2: "15" })
|
|
355
|
+
] }), "Rows3");
|
|
356
|
+
var LayoutGrid = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
357
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1" }),
|
|
358
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "14", y: "3", width: "7", height: "7", rx: "1" }),
|
|
359
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "14", y: "14", width: "7", height: "7", rx: "1" }),
|
|
360
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" })
|
|
361
|
+
] }), "LayoutGrid");
|
|
362
|
+
var Columns3 = make(/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
363
|
+
/* @__PURE__ */ jsxRuntime.jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }),
|
|
364
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "9", y1: "3", x2: "9", y2: "21" }),
|
|
365
|
+
/* @__PURE__ */ jsxRuntime.jsx("line", { x1: "15", y1: "3", x2: "15", y2: "21" })
|
|
366
|
+
] }), "Columns3");
|
|
334
367
|
|
|
335
368
|
exports.AlertCircle = AlertCircle;
|
|
336
369
|
exports.AlertTriangle = AlertTriangle;
|
|
@@ -344,6 +377,7 @@ exports.ArrowUp = ArrowUp;
|
|
|
344
377
|
exports.Bell = Bell;
|
|
345
378
|
exports.Bold = Bold;
|
|
346
379
|
exports.Building = Building;
|
|
380
|
+
exports.CalendarDays = CalendarDays;
|
|
347
381
|
exports.CalendarIcon = CalendarIcon;
|
|
348
382
|
exports.Check = Check;
|
|
349
383
|
exports.CheckCircle = CheckCircle;
|
|
@@ -352,6 +386,7 @@ exports.ChevronLeft = ChevronLeft;
|
|
|
352
386
|
exports.ChevronRight = ChevronRight;
|
|
353
387
|
exports.ChevronUp = ChevronUp;
|
|
354
388
|
exports.Clock = Clock;
|
|
389
|
+
exports.Columns3 = Columns3;
|
|
355
390
|
exports.Copy = Copy;
|
|
356
391
|
exports.CreditCard = CreditCard;
|
|
357
392
|
exports.Download = Download;
|
|
@@ -367,11 +402,13 @@ exports.Heart = Heart;
|
|
|
367
402
|
exports.Home = Home;
|
|
368
403
|
exports.Info = Info;
|
|
369
404
|
exports.Italic = Italic;
|
|
405
|
+
exports.LayoutGrid = LayoutGrid;
|
|
370
406
|
exports.Link = Link;
|
|
371
407
|
exports.Loader = Loader;
|
|
372
408
|
exports.Lock = Lock;
|
|
373
409
|
exports.LogOut = LogOut;
|
|
374
410
|
exports.Mail = Mail;
|
|
411
|
+
exports.Map = Map;
|
|
375
412
|
exports.MapPin = MapPin;
|
|
376
413
|
exports.MenuIcon = MenuIcon;
|
|
377
414
|
exports.Minus = Minus;
|
|
@@ -382,6 +419,7 @@ exports.Package = Package;
|
|
|
382
419
|
exports.Phone = Phone;
|
|
383
420
|
exports.Plus = Plus;
|
|
384
421
|
exports.RefreshCw = RefreshCw;
|
|
422
|
+
exports.Rows3 = Rows3;
|
|
385
423
|
exports.Search = Search;
|
|
386
424
|
exports.Settings = Settings;
|
|
387
425
|
exports.ShoppingCart = ShoppingCart;
|
|
@@ -398,5 +436,5 @@ exports.User = User;
|
|
|
398
436
|
exports.Users = Users;
|
|
399
437
|
exports.Wrench = Wrench;
|
|
400
438
|
exports.X = X;
|
|
401
|
-
//# sourceMappingURL=chunk-
|
|
402
|
-
//# sourceMappingURL=chunk-
|
|
439
|
+
//# sourceMappingURL=chunk-3HA3VO2I.js.map
|
|
440
|
+
//# sourceMappingURL=chunk-3HA3VO2I.js.map
|