@akashjs/runtime 0.2.2 → 0.2.7
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/a11y.cjs +2 -0
- package/dist/a11y.cjs.map +1 -0
- package/dist/a11y.d.cts +99 -0
- package/dist/a11y.d.ts +99 -0
- package/dist/a11y.js +2 -0
- package/dist/a11y.js.map +1 -0
- package/dist/async-component.cjs +2 -0
- package/dist/async-component.cjs.map +1 -0
- package/dist/async-component.d.cts +44 -0
- package/dist/async-component.d.ts +44 -0
- package/dist/async-component.js +2 -0
- package/dist/async-component.js.map +1 -0
- package/dist/await-block.cjs +2 -0
- package/dist/await-block.cjs.map +1 -0
- package/dist/await-block.d.cts +37 -0
- package/dist/await-block.d.ts +37 -0
- package/dist/await-block.js +2 -0
- package/dist/await-block.js.map +1 -0
- package/dist/browser.cjs +2 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +125 -0
- package/dist/browser.d.ts +125 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-2HLDEWRT.cjs +2 -0
- package/dist/chunk-2HLDEWRT.cjs.map +1 -0
- package/dist/chunk-2LKFIID7.cjs +2 -0
- package/dist/chunk-2LKFIID7.cjs.map +1 -0
- package/dist/chunk-34PQECMN.cjs +2 -0
- package/dist/chunk-34PQECMN.cjs.map +1 -0
- package/dist/chunk-36VM3RJW.cjs +2 -0
- package/dist/chunk-36VM3RJW.cjs.map +1 -0
- package/dist/chunk-3PGU24B5.cjs +3 -0
- package/dist/chunk-3PGU24B5.cjs.map +1 -0
- package/dist/chunk-3XREYIJH.cjs +2 -0
- package/dist/chunk-3XREYIJH.cjs.map +1 -0
- package/dist/chunk-45DPEU7T.cjs +2 -0
- package/dist/chunk-45DPEU7T.cjs.map +1 -0
- package/dist/chunk-4J3QBQVW.js +4 -0
- package/dist/chunk-4J3QBQVW.js.map +1 -0
- package/dist/{chunk-NVZLEJXB.cjs → chunk-4NQEIKH5.cjs} +2 -2
- package/dist/{chunk-NVZLEJXB.cjs.map → chunk-4NQEIKH5.cjs.map} +1 -1
- package/dist/chunk-5QCWH6QA.cjs +4 -0
- package/dist/chunk-5QCWH6QA.cjs.map +1 -0
- package/dist/chunk-6O46EMQS.cjs +2 -0
- package/dist/chunk-6O46EMQS.cjs.map +1 -0
- package/dist/chunk-7IJUJUXE.cjs +2 -0
- package/dist/chunk-7IJUJUXE.cjs.map +1 -0
- package/dist/chunk-7UX5CSGZ.cjs +2 -0
- package/dist/chunk-7UX5CSGZ.cjs.map +1 -0
- package/dist/chunk-7VBH4F3P.js +2 -0
- package/dist/chunk-7VBH4F3P.js.map +1 -0
- package/dist/chunk-7ZPSYZHD.cjs +2 -0
- package/dist/chunk-7ZPSYZHD.cjs.map +1 -0
- package/dist/chunk-AOFLE33X.js +5 -0
- package/dist/chunk-AOFLE33X.js.map +1 -0
- package/dist/chunk-AQQQVDBQ.cjs +2 -0
- package/dist/chunk-AQQQVDBQ.cjs.map +1 -0
- package/dist/chunk-AXB5GHGO.js +2 -0
- package/dist/chunk-AXB5GHGO.js.map +1 -0
- package/dist/chunk-AZCELE44.cjs +2 -0
- package/dist/chunk-AZCELE44.cjs.map +1 -0
- package/dist/chunk-BB7P6HTR.js +2 -0
- package/dist/chunk-BB7P6HTR.js.map +1 -0
- package/dist/chunk-BGSF77LF.js +2 -0
- package/dist/chunk-BGSF77LF.js.map +1 -0
- package/dist/chunk-BHP3UTTQ.cjs +3 -0
- package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
- package/dist/chunk-CP6SK2B4.js +2 -0
- package/dist/chunk-CP6SK2B4.js.map +1 -0
- package/dist/chunk-DFYXFKCH.cjs +2 -0
- package/dist/chunk-DFYXFKCH.cjs.map +1 -0
- package/dist/chunk-DHFVVFZF.cjs +2 -0
- package/dist/chunk-DHFVVFZF.cjs.map +1 -0
- package/dist/chunk-DP7G45QM.cjs +13 -0
- package/dist/chunk-DP7G45QM.cjs.map +1 -0
- package/dist/chunk-E6RB7PRO.js +2 -0
- package/dist/chunk-E6RB7PRO.js.map +1 -0
- package/dist/chunk-F4FXIPR3.js +2 -0
- package/dist/chunk-F4FXIPR3.js.map +1 -0
- package/dist/chunk-F6VSSM2P.js +2 -0
- package/dist/chunk-F6VSSM2P.js.map +1 -0
- package/dist/chunk-FUVSCPU4.cjs +2 -0
- package/dist/chunk-FUVSCPU4.cjs.map +1 -0
- package/dist/chunk-FVF3T4JJ.js +2 -0
- package/dist/chunk-FVF3T4JJ.js.map +1 -0
- package/dist/chunk-FVWHMFX6.cjs +5 -0
- package/dist/chunk-FVWHMFX6.cjs.map +1 -0
- package/dist/chunk-IHEW6F2H.js +2 -0
- package/dist/chunk-IHEW6F2H.js.map +1 -0
- package/dist/chunk-IJS2EMSE.js +2 -0
- package/dist/chunk-IJS2EMSE.js.map +1 -0
- package/dist/chunk-IKVHLORY.cjs +11 -0
- package/dist/chunk-IKVHLORY.cjs.map +1 -0
- package/dist/chunk-IQGSDFBI.cjs +2 -0
- package/dist/chunk-IQGSDFBI.cjs.map +1 -0
- package/dist/chunk-J6KDUWX6.cjs +2 -0
- package/dist/chunk-J6KDUWX6.cjs.map +1 -0
- package/dist/chunk-JD3LDHUI.cjs +2 -0
- package/dist/chunk-JD3LDHUI.cjs.map +1 -0
- package/dist/chunk-JEYTB4AG.js +2 -0
- package/dist/chunk-JEYTB4AG.js.map +1 -0
- package/dist/chunk-JFLZJPVN.js +2 -0
- package/dist/chunk-JFLZJPVN.js.map +1 -0
- package/dist/chunk-JLPJ22CE.js +2 -0
- package/dist/chunk-JLPJ22CE.js.map +1 -0
- package/dist/chunk-JQCN42XX.js +2 -0
- package/dist/chunk-JQCN42XX.js.map +1 -0
- package/dist/chunk-K2HB5VFA.cjs +2 -0
- package/dist/chunk-K2HB5VFA.cjs.map +1 -0
- package/dist/chunk-K7TMUF3F.cjs +2 -0
- package/dist/chunk-K7TMUF3F.cjs.map +1 -0
- package/dist/chunk-KE7BJTCD.js +2 -0
- package/dist/chunk-KE7BJTCD.js.map +1 -0
- package/dist/chunk-KMEGUPH2.js +3 -0
- package/dist/chunk-KMEGUPH2.js.map +1 -0
- package/dist/chunk-KUPL3ZVD.js +2 -0
- package/dist/chunk-KUPL3ZVD.js.map +1 -0
- package/dist/chunk-L3ZZX36S.js +2 -0
- package/dist/chunk-L3ZZX36S.js.map +1 -0
- package/dist/chunk-LD4C62JY.cjs +2 -0
- package/dist/chunk-LD4C62JY.cjs.map +1 -0
- package/dist/chunk-LWQPLKL6.cjs +20 -0
- package/dist/chunk-LWQPLKL6.cjs.map +1 -0
- package/dist/chunk-M5IACTFC.cjs +17 -0
- package/dist/chunk-M5IACTFC.cjs.map +1 -0
- package/dist/chunk-MADMPRT2.js +20 -0
- package/dist/chunk-MADMPRT2.js.map +1 -0
- package/dist/chunk-MDHWM3C2.js +2 -0
- package/dist/chunk-MDHWM3C2.js.map +1 -0
- package/dist/chunk-N3ITIHHM.js +5 -0
- package/dist/chunk-N3ITIHHM.js.map +1 -0
- package/dist/chunk-N5APNCPB.js +2 -0
- package/dist/chunk-N5APNCPB.js.map +1 -0
- package/dist/chunk-NBYFHJWB.js +36 -0
- package/dist/chunk-NBYFHJWB.js.map +1 -0
- package/dist/chunk-NCXMNJUN.js +2 -0
- package/dist/chunk-NCXMNJUN.js.map +1 -0
- package/dist/chunk-NEQ5TENE.cjs +2 -0
- package/dist/chunk-NEQ5TENE.cjs.map +1 -0
- package/dist/chunk-NGU2W4PD.cjs +2 -0
- package/dist/chunk-NGU2W4PD.cjs.map +1 -0
- package/dist/chunk-NHDYQTC5.cjs +36 -0
- package/dist/chunk-NHDYQTC5.cjs.map +1 -0
- package/dist/chunk-NJXXC5JB.js +2 -0
- package/dist/chunk-NJXXC5JB.js.map +1 -0
- package/dist/chunk-NQEY7DR5.cjs +2 -0
- package/dist/chunk-NQEY7DR5.cjs.map +1 -0
- package/dist/chunk-OQV3NYDH.js +3 -0
- package/dist/chunk-OQV3NYDH.js.map +1 -0
- package/dist/chunk-OZ4GNBKA.js +2 -0
- package/dist/chunk-OZ4GNBKA.js.map +1 -0
- package/dist/chunk-PPNEAFKE.cjs +5 -0
- package/dist/chunk-PPNEAFKE.cjs.map +1 -0
- package/dist/chunk-PYASLKWF.js +2 -0
- package/dist/chunk-PYASLKWF.js.map +1 -0
- package/dist/chunk-Q6S7SUOM.js +2 -0
- package/dist/chunk-Q6S7SUOM.js.map +1 -0
- package/dist/chunk-QE2TJ6P5.cjs +2 -0
- package/dist/chunk-QE2TJ6P5.cjs.map +1 -0
- package/dist/chunk-QNVMBXVH.js +2 -0
- package/dist/chunk-QNVMBXVH.js.map +1 -0
- package/dist/chunk-QQ725EZL.js +2 -0
- package/dist/chunk-QQ725EZL.js.map +1 -0
- package/dist/chunk-QQTZQ6UX.cjs +2 -0
- package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
- package/dist/chunk-QSPRVXFV.cjs +2 -0
- package/dist/chunk-QSPRVXFV.cjs.map +1 -0
- package/dist/chunk-QTQ6RUX4.cjs +5 -0
- package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
- package/dist/chunk-R65RPMQX.cjs +2 -0
- package/dist/chunk-R65RPMQX.cjs.map +1 -0
- package/dist/chunk-R7NUVVHP.js +2 -0
- package/dist/{chunk-Z5LQV5ND.js.map → chunk-R7NUVVHP.js.map} +1 -1
- package/dist/chunk-SXYPAP4B.js +2 -0
- package/dist/chunk-SXYPAP4B.js.map +1 -0
- package/dist/chunk-T2RVAQEU.js +2 -0
- package/dist/chunk-T2RVAQEU.js.map +1 -0
- package/dist/chunk-T7A5YOEG.cjs +2 -0
- package/dist/chunk-T7A5YOEG.cjs.map +1 -0
- package/dist/chunk-TDKDZ3QJ.cjs +2 -0
- package/dist/chunk-TDKDZ3QJ.cjs.map +1 -0
- package/dist/chunk-TFEHO7SF.cjs +2 -0
- package/dist/chunk-TFEHO7SF.cjs.map +1 -0
- package/dist/chunk-TSFY5HKB.js +17 -0
- package/dist/chunk-TSFY5HKB.js.map +1 -0
- package/dist/chunk-TYTEJYUQ.cjs +2 -0
- package/dist/chunk-TYTEJYUQ.cjs.map +1 -0
- package/dist/chunk-TZHEZW6R.js +11 -0
- package/dist/chunk-TZHEZW6R.js.map +1 -0
- package/dist/chunk-U65WRXZC.js +13 -0
- package/dist/chunk-U65WRXZC.js.map +1 -0
- package/dist/chunk-UT4MWGJ3.js +2 -0
- package/dist/chunk-UT4MWGJ3.js.map +1 -0
- package/dist/chunk-V2JDKH3W.cjs +2 -0
- package/dist/chunk-V2JDKH3W.cjs.map +1 -0
- package/dist/chunk-VNDSKBXQ.cjs +2 -0
- package/dist/chunk-VNDSKBXQ.cjs.map +1 -0
- package/dist/chunk-VO4FCKHM.js +2 -0
- package/dist/chunk-VO4FCKHM.js.map +1 -0
- package/dist/chunk-VUMMC2P5.js +2 -0
- package/dist/chunk-VUMMC2P5.js.map +1 -0
- package/dist/chunk-VUSNUBNI.js +2 -0
- package/dist/chunk-VUSNUBNI.js.map +1 -0
- package/dist/chunk-VWTULWXF.js +2 -0
- package/dist/chunk-VWTULWXF.js.map +1 -0
- package/dist/chunk-VX7PSSOU.js +5 -0
- package/dist/chunk-VX7PSSOU.js.map +1 -0
- package/dist/chunk-WLSXJU2N.js +13 -0
- package/dist/chunk-WLSXJU2N.js.map +1 -0
- package/dist/chunk-WOZWFMOK.cjs +2 -0
- package/dist/chunk-WOZWFMOK.cjs.map +1 -0
- package/dist/chunk-WTDTVWCQ.cjs +2 -0
- package/dist/chunk-WTDTVWCQ.cjs.map +1 -0
- package/dist/chunk-WZ5ULION.js +2 -0
- package/dist/chunk-WZ5ULION.js.map +1 -0
- package/dist/chunk-XPLIEN2G.cjs +13 -0
- package/dist/chunk-XPLIEN2G.cjs.map +1 -0
- package/dist/chunk-XWVNLE2W.cjs +2 -0
- package/dist/chunk-XWVNLE2W.cjs.map +1 -0
- package/dist/chunk-XZR3J626.cjs +2 -0
- package/dist/chunk-XZR3J626.cjs.map +1 -0
- package/dist/chunk-YDO5KARN.js +2 -0
- package/dist/chunk-YDO5KARN.js.map +1 -0
- package/dist/chunk-YURIYBTN.cjs +2 -0
- package/dist/chunk-YURIYBTN.cjs.map +1 -0
- package/dist/chunk-YXKQTEPR.js +2 -0
- package/dist/chunk-YXKQTEPR.js.map +1 -0
- package/dist/chunk-Z6K4FYG6.js +2 -0
- package/dist/chunk-Z6K4FYG6.js.map +1 -0
- package/dist/chunk-ZJULEDLY.js +2 -0
- package/dist/chunk-ZJULEDLY.js.map +1 -0
- package/dist/{component-C1WnFcRp.d.ts → component-CPVtkASo.d.ts} +2 -3
- package/dist/{component-C1WnFcRp.d.cts → component-CxlupKuc.d.cts} +2 -3
- package/dist/composables.cjs +2 -0
- package/dist/composables.cjs.map +1 -0
- package/dist/composables.d.cts +103 -0
- package/dist/composables.d.ts +103 -0
- package/dist/composables.js +2 -0
- package/dist/composables.js.map +1 -0
- package/dist/{context-2uQ6fuxu.d.ts → context-Cwt7QCpk.d.cts} +1 -9
- package/dist/{context-2uQ6fuxu.d.cts → context-Cwt7QCpk.d.ts} +1 -9
- package/dist/core.cjs +1 -1
- package/dist/core.d.cts +5 -4
- package/dist/core.d.ts +5 -4
- package/dist/core.js +1 -1
- package/dist/css.cjs +2 -0
- package/dist/css.cjs.map +1 -0
- package/dist/css.d.cts +42 -0
- package/dist/css.d.ts +42 -0
- package/dist/css.js +2 -0
- package/dist/css.js.map +1 -0
- package/dist/data-table.cjs +2 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +97 -0
- package/dist/data-table.d.ts +97 -0
- package/dist/data-table.js +2 -0
- package/dist/data-table.js.map +1 -0
- package/dist/deep-signal.cjs +2 -0
- package/dist/deep-signal.cjs.map +1 -0
- package/dist/deep-signal.d.cts +48 -0
- package/dist/deep-signal.d.ts +48 -0
- package/dist/deep-signal.js +2 -0
- package/dist/deep-signal.js.map +1 -0
- package/dist/defer.cjs +2 -0
- package/dist/defer.cjs.map +1 -0
- package/dist/defer.d.cts +55 -0
- package/dist/defer.d.ts +55 -0
- package/dist/defer.js +2 -0
- package/dist/defer.js.map +1 -0
- package/dist/deprecation.cjs +2 -0
- package/dist/deprecation.cjs.map +1 -0
- package/dist/deprecation.d.cts +119 -0
- package/dist/deprecation.d.ts +119 -0
- package/dist/deprecation.js +2 -0
- package/dist/deprecation.js.map +1 -0
- package/dist/devtools-overlay-3WRM6GKM.js +57 -0
- package/dist/devtools-overlay-3WRM6GKM.js.map +1 -0
- package/dist/devtools-overlay-WJGSIB4N.cjs +57 -0
- package/dist/devtools-overlay-WJGSIB4N.cjs.map +1 -0
- package/dist/devtools.cjs +2 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +78 -0
- package/dist/devtools.d.ts +78 -0
- package/dist/devtools.js +2 -0
- package/dist/devtools.js.map +1 -0
- package/dist/di.cjs +2 -0
- package/dist/di.cjs.map +1 -0
- package/dist/di.d.cts +93 -0
- package/dist/di.d.ts +93 -0
- package/dist/di.js +2 -0
- package/dist/di.js.map +1 -0
- package/dist/directive.cjs +2 -0
- package/dist/directive.cjs.map +1 -0
- package/dist/directive.d.cts +102 -0
- package/dist/directive.d.ts +102 -0
- package/dist/directive.js +2 -0
- package/dist/directive.js.map +1 -0
- package/dist/error-boundary.cjs +2 -0
- package/dist/error-boundary.cjs.map +1 -0
- package/dist/error-boundary.d.cts +17 -0
- package/dist/error-boundary.d.ts +17 -0
- package/dist/error-boundary.js +2 -0
- package/dist/error-boundary.js.map +1 -0
- package/dist/error-hints.cjs +2 -0
- package/dist/error-hints.cjs.map +1 -0
- package/dist/error-hints.d.cts +17 -0
- package/dist/error-hints.d.ts +17 -0
- package/dist/error-hints.js +2 -0
- package/dist/error-hints.js.map +1 -0
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +35 -0
- package/dist/errors.d.ts +35 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.cjs +2 -0
- package/dist/event-bus.cjs.map +1 -0
- package/dist/event-bus.d.cts +68 -0
- package/dist/event-bus.d.ts +68 -0
- package/dist/event-bus.js +2 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-modifiers.cjs +2 -0
- package/dist/event-modifiers.cjs.map +1 -0
- package/dist/event-modifiers.d.cts +130 -0
- package/dist/event-modifiers.d.ts +130 -0
- package/dist/event-modifiers.js +2 -0
- package/dist/event-modifiers.js.map +1 -0
- package/dist/flip.cjs +2 -0
- package/dist/flip.cjs.map +1 -0
- package/dist/flip.d.cts +66 -0
- package/dist/flip.d.ts +66 -0
- package/dist/flip.js +2 -0
- package/dist/flip.js.map +1 -0
- package/dist/head.cjs +2 -0
- package/dist/head.cjs.map +1 -0
- package/dist/head.d.cts +70 -0
- package/dist/head.d.ts +70 -0
- package/dist/head.js +2 -0
- package/dist/head.js.map +1 -0
- package/dist/hydration.cjs +2 -0
- package/dist/hydration.cjs.map +1 -0
- package/dist/hydration.d.cts +84 -0
- package/dist/hydration.d.ts +84 -0
- package/dist/hydration.js +2 -0
- package/dist/hydration.js.map +1 -0
- package/dist/image.cjs +2 -0
- package/dist/image.cjs.map +1 -0
- package/dist/image.d.cts +54 -0
- package/dist/image.d.ts +54 -0
- package/dist/image.js +2 -0
- package/dist/image.js.map +1 -0
- package/dist/index.cjs +1 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -3152
- package/dist/index.d.ts +51 -3152
- package/dist/index.js +1 -63
- package/dist/index.js.map +1 -1
- package/dist/infinite-scroll.cjs +2 -0
- package/dist/infinite-scroll.cjs.map +1 -0
- package/dist/infinite-scroll.d.cts +49 -0
- package/dist/infinite-scroll.d.ts +49 -0
- package/dist/infinite-scroll.js +2 -0
- package/dist/infinite-scroll.js.map +1 -0
- package/dist/leak-detector.cjs +2 -0
- package/dist/leak-detector.cjs.map +1 -0
- package/dist/leak-detector.d.cts +71 -0
- package/dist/leak-detector.d.ts +71 -0
- package/dist/leak-detector.js +2 -0
- package/dist/leak-detector.js.map +1 -0
- package/dist/machine.cjs +1 -1
- package/dist/machine.d.cts +1 -1
- package/dist/machine.d.ts +1 -1
- package/dist/machine.js +1 -1
- package/dist/offline.cjs +1 -1
- package/dist/offline.d.cts +3 -1
- package/dist/offline.d.ts +3 -1
- package/dist/offline.js +1 -1
- package/dist/perf.cjs +2 -0
- package/dist/perf.cjs.map +1 -0
- package/dist/perf.d.cts +97 -0
- package/dist/perf.d.ts +97 -0
- package/dist/perf.js +2 -0
- package/dist/perf.js.map +1 -0
- package/dist/pipes.cjs +2 -0
- package/dist/pipes.cjs.map +1 -0
- package/dist/pipes.d.cts +130 -0
- package/dist/pipes.d.ts +130 -0
- package/dist/pipes.js +2 -0
- package/dist/pipes.js.map +1 -0
- package/dist/plugin.cjs +2 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +70 -0
- package/dist/plugin.d.ts +70 -0
- package/dist/plugin.js +2 -0
- package/dist/plugin.js.map +1 -0
- package/dist/portal.cjs +2 -0
- package/dist/portal.cjs.map +1 -0
- package/dist/portal.d.cts +30 -0
- package/dist/portal.d.ts +30 -0
- package/dist/portal.js +2 -0
- package/dist/portal.js.map +1 -0
- package/dist/pwa.cjs +1 -1
- package/dist/pwa.d.cts +6 -2
- package/dist/pwa.d.ts +6 -2
- package/dist/pwa.js +1 -1
- package/dist/query-state.cjs +2 -0
- package/dist/query-state.cjs.map +1 -0
- package/dist/query-state.d.cts +82 -0
- package/dist/query-state.d.ts +82 -0
- package/dist/query-state.js +2 -0
- package/dist/query-state.js.map +1 -0
- package/dist/reconcile.cjs +2 -0
- package/dist/reconcile.cjs.map +1 -0
- package/dist/reconcile.d.cts +42 -0
- package/dist/reconcile.d.ts +42 -0
- package/dist/reconcile.js +2 -0
- package/dist/reconcile.js.map +1 -0
- package/dist/scheduler-CKi1esN-.d.cts +9 -0
- package/dist/scheduler-CKi1esN-.d.ts +9 -0
- package/dist/security.cjs +2 -0
- package/dist/security.cjs.map +1 -0
- package/dist/security.d.cts +193 -0
- package/dist/security.d.ts +193 -0
- package/dist/security.js +2 -0
- package/dist/security.js.map +1 -0
- package/dist/seo.cjs +2 -0
- package/dist/seo.cjs.map +1 -0
- package/dist/seo.d.cts +118 -0
- package/dist/seo.d.ts +118 -0
- package/dist/seo.js +2 -0
- package/dist/seo.js.map +1 -0
- package/dist/{signals-C7XfOHHR.d.cts → signals-DionyGGY.d.cts} +7 -0
- package/dist/{signals-C7XfOHHR.d.ts → signals-DionyGGY.d.ts} +7 -0
- package/dist/snippets.cjs +2 -0
- package/dist/snippets.cjs.map +1 -0
- package/dist/snippets.d.cts +109 -0
- package/dist/snippets.d.ts +109 -0
- package/dist/snippets.js +2 -0
- package/dist/snippets.js.map +1 -0
- package/dist/ssg.cjs +2 -0
- package/dist/ssg.cjs.map +1 -0
- package/dist/ssg.d.cts +82 -0
- package/dist/ssg.d.ts +82 -0
- package/dist/ssg.js +2 -0
- package/dist/ssg.js.map +1 -0
- package/dist/ssr.cjs +1 -1
- package/dist/ssr.d.cts +2 -1
- package/dist/ssr.d.ts +2 -1
- package/dist/ssr.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.d.cts +33 -30
- package/dist/store.d.ts +33 -30
- package/dist/store.js +1 -1
- package/dist/suspense.cjs +2 -0
- package/dist/suspense.cjs.map +1 -0
- package/dist/suspense.d.cts +36 -0
- package/dist/suspense.d.ts +36 -0
- package/dist/suspense.js +2 -0
- package/dist/suspense.js.map +1 -0
- package/dist/switch.cjs +2 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.d.cts +48 -0
- package/dist/switch.d.ts +48 -0
- package/dist/switch.js +2 -0
- package/dist/switch.js.map +1 -0
- package/dist/sync.cjs +1 -1
- package/dist/sync.d.cts +60 -5
- package/dist/sync.d.ts +60 -5
- package/dist/sync.js +1 -1
- package/dist/test.cjs +4 -4
- package/dist/test.cjs.map +1 -1
- package/dist/test.d.cts +74 -5
- package/dist/test.d.ts +74 -5
- package/dist/test.js +4 -4
- package/dist/test.js.map +1 -1
- package/dist/theme.cjs +2 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.cts +56 -0
- package/dist/theme.d.ts +56 -0
- package/dist/theme.js +2 -0
- package/dist/theme.js.map +1 -0
- package/dist/toast.cjs +2 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.d.cts +66 -0
- package/dist/toast.d.ts +66 -0
- package/dist/toast.js +2 -0
- package/dist/toast.js.map +1 -0
- package/dist/transition.cjs +2 -0
- package/dist/transition.cjs.map +1 -0
- package/dist/transition.d.cts +90 -0
- package/dist/transition.d.ts +90 -0
- package/dist/transition.js +2 -0
- package/dist/transition.js.map +1 -0
- package/dist/tweened.cjs +2 -0
- package/dist/tweened.cjs.map +1 -0
- package/dist/tweened.d.cts +59 -0
- package/dist/tweened.d.ts +59 -0
- package/dist/tweened.js +2 -0
- package/dist/tweened.js.map +1 -0
- package/dist/types-DjZCk1xT.d.cts +4 -0
- package/dist/types-DjZCk1xT.d.ts +4 -0
- package/dist/view-transition.cjs +2 -0
- package/dist/view-transition.cjs.map +1 -0
- package/dist/view-transition.d.cts +80 -0
- package/dist/view-transition.d.ts +80 -0
- package/dist/view-transition.js +2 -0
- package/dist/view-transition.js.map +1 -0
- package/dist/virtual-list.cjs +2 -0
- package/dist/virtual-list.cjs.map +1 -0
- package/dist/virtual-list.d.cts +67 -0
- package/dist/virtual-list.d.ts +67 -0
- package/dist/virtual-list.js +2 -0
- package/dist/virtual-list.js.map +1 -0
- package/dist/watch.cjs +2 -0
- package/dist/watch.cjs.map +1 -0
- package/dist/watch.d.cts +70 -0
- package/dist/watch.d.ts +70 -0
- package/dist/watch.js +2 -0
- package/dist/watch.js.map +1 -0
- package/dist/web-component.cjs +2 -0
- package/dist/web-component.cjs.map +1 -0
- package/dist/web-component.d.cts +51 -0
- package/dist/web-component.d.ts +51 -0
- package/dist/web-component.js +2 -0
- package/dist/web-component.js.map +1 -0
- package/package.json +249 -11
- package/dist/chunk-3AL2DVPZ.cjs +0 -13
- package/dist/chunk-3AL2DVPZ.cjs.map +0 -1
- package/dist/chunk-6NX6JRSV.cjs +0 -32
- package/dist/chunk-6NX6JRSV.cjs.map +0 -1
- package/dist/chunk-BT6HNBE7.js +0 -5
- package/dist/chunk-BT6HNBE7.js.map +0 -1
- package/dist/chunk-D6QQYZIC.js +0 -2
- package/dist/chunk-D6QQYZIC.js.map +0 -1
- package/dist/chunk-H4SAK7A5.cjs +0 -2
- package/dist/chunk-H4SAK7A5.cjs.map +0 -1
- package/dist/chunk-IKZMC3T6.js +0 -2
- package/dist/chunk-IKZMC3T6.js.map +0 -1
- package/dist/chunk-IM2VW4TK.js +0 -32
- package/dist/chunk-IM2VW4TK.js.map +0 -1
- package/dist/chunk-NQVWTQ2I.cjs +0 -5
- package/dist/chunk-NQVWTQ2I.cjs.map +0 -1
- package/dist/chunk-ODDXU5DO.js +0 -2
- package/dist/chunk-ODDXU5DO.js.map +0 -1
- package/dist/chunk-POLTPHUA.js +0 -13
- package/dist/chunk-POLTPHUA.js.map +0 -1
- package/dist/chunk-YIB4EKVI.cjs +0 -2
- package/dist/chunk-YIB4EKVI.cjs.map +0 -1
- package/dist/chunk-YJQLXUTN.cjs +0 -2
- package/dist/chunk-YJQLXUTN.cjs.map +0 -1
- package/dist/chunk-Z5LQV5ND.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infinite-scroll.ts"],"names":["useInfiniteScroll","options","onLoadMore","hasMore","rootMargin","threshold","loading","signal","done","observer","sentinelEl","disposed","handleIntersect","createObserver","el","entries","sentinel"],"mappings":"oCAqDO,SAASA,EAAkBC,CAAAA,CAAgD,CAChF,GAAM,CAAE,UAAA,CAAAC,EAAY,OAAA,CAAAC,CAAAA,CAAS,UAAA,CAAAC,CAAAA,CAAa,QAAS,SAAA,CAAAC,CAAAA,CAAY,CAAE,CAAA,CAAIJ,CAAAA,CAE/DK,EAAUC,CAAAA,CAAO,KAAK,CAAA,CACtBC,CAAAA,CAAOD,EAAO,KAAK,CAAA,CACrBE,EAAwC,IAAA,CACxCC,CAAAA,CAAiC,KACjCC,CAAAA,CAAW,KAAA,CAEf,eAAeC,CAAAA,EAAiC,CAC9C,GAAI,EAAAN,CAAAA,IAAaE,CAAAA,EAAK,EAAKG,GAC3B,CAAA,GAAI,CAACR,CAAAA,EAAQ,CAAG,CACdK,CAAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CACb,MACF,CAEAF,CAAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAChB,GAAI,CACF,MAAMJ,GAAW,CACZC,CAAAA,IACHK,CAAAA,CAAK,GAAA,CAAI,CAAA,CAAI,EAEjB,QAAE,CACAF,CAAAA,CAAQ,IAAI,KAAK,EACnB,EACF,CAEA,SAASO,IAAeC,CAAAA,CAAuB,CACzC,OAAO,oBAAA,CAAyB,GAAA,GAEpCL,EAAW,IAAI,oBAAA,CACZM,GAAY,CACPA,CAAAA,CAAQ,CAAC,CAAA,EAAG,gBACdH,CAAAA,GAEJ,EACA,CAAE,UAAA,CAAAR,EAAY,SAAA,CAAAC,CAAU,CAC1B,CAAA,CAEAI,EAAS,OAAA,CAAQK,CAAE,GACrB,CAEA,SAASE,GAAwB,CAC/B,OAAIN,CAAAA,GAEJA,CAAAA,CAAa,SAAS,aAAA,CAAc,KAAK,EACzCA,CAAAA,CAAW,YAAA,CAAa,sBAAuB,EAAE,CAAA,CACjDA,EAAW,KAAA,CAAM,MAAA,CAAS,MAC1BA,CAAAA,CAAW,YAAA,CAAa,cAAe,MAAM,CAAA,CAG7C,sBAAsB,IAAM,CACtBA,CAAAA,EAAc,CAACC,GACjBE,GAAAA,CAAeH,CAAU,EAE7B,CAAC,CAAA,CAEMA,EACT,CAEA,OAAO,CACL,QAAA,CAAAM,EACA,OAAA,CAAS,IAAMV,GAAQ,CACvB,IAAA,CAAM,IAAME,CAAAA,EAAK,CACjB,KAAA,EAAQ,CACNA,EAAK,GAAA,CAAI,KAAK,EACdF,CAAAA,CAAQ,GAAA,CAAI,KAAK,EACnB,CAAA,CACA,SAAU,CACRK,CAAAA,CAAW,KACXF,CAAAA,EAAU,UAAA,GACVA,CAAAA,CAAW,KACb,CACF,CACF","file":"chunk-QQ725EZL.js","sourcesContent":["/**\n * Infinite scroll composable.\n *\n * Uses IntersectionObserver to detect when a sentinel element\n * enters the viewport, then triggers loading more data.\n * Pairs with createCursorPagination() from @akashjs/http.\n *\n * ```ts\n * const { sentinel, loading, done } = useInfiniteScroll({\n * onLoadMore: async () => {\n * pager.loadMore();\n * await fetchNextPage();\n * },\n * hasMore: () => pager.hasMore(),\n * });\n * // Append sentinel() element at the end of your list\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface InfiniteScrollOptions {\n /** Callback to load more items */\n onLoadMore: () => Promise<void> | void;\n /** Whether there are more items to load */\n hasMore: () => boolean;\n /** Root margin for the observer (default: '200px') */\n rootMargin?: string;\n /** Threshold for the observer (default: 0) */\n threshold?: number;\n}\n\nexport interface InfiniteScroll {\n /** Sentinel element to place at the end of the list */\n sentinel: () => HTMLElement;\n /** Whether a load is in progress */\n loading: ReadonlySignal<boolean>;\n /** Whether all items have been loaded */\n done: ReadonlySignal<boolean>;\n /** Reset the scroll state */\n reset(): void;\n /** Dispose the observer */\n dispose(): void;\n}\n\n// --- Implementation ---\n\n/**\n * Create an infinite scroll controller.\n */\nexport function useInfiniteScroll(options: InfiniteScrollOptions): InfiniteScroll {\n const { onLoadMore, hasMore, rootMargin = '200px', threshold = 0 } = options;\n\n const loading = signal(false);\n const done = signal(false);\n let observer: IntersectionObserver | null = null;\n let sentinelEl: HTMLElement | null = null;\n let disposed = false;\n\n async function handleIntersect(): Promise<void> {\n if (loading() || done() || disposed) return;\n if (!hasMore()) {\n done.set(true);\n return;\n }\n\n loading.set(true);\n try {\n await onLoadMore();\n if (!hasMore()) {\n done.set(true);\n }\n } finally {\n loading.set(false);\n }\n }\n\n function createObserver(el: HTMLElement): void {\n if (typeof IntersectionObserver === 'undefined') return;\n\n observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n handleIntersect();\n }\n },\n { rootMargin, threshold },\n );\n\n observer.observe(el);\n }\n\n function sentinel(): HTMLElement {\n if (sentinelEl) return sentinelEl;\n\n sentinelEl = document.createElement('div');\n sentinelEl.setAttribute('data-akash-sentinel', '');\n sentinelEl.style.height = '1px';\n sentinelEl.setAttribute('aria-hidden', 'true');\n\n // Start observing\n requestAnimationFrame(() => {\n if (sentinelEl && !disposed) {\n createObserver(sentinelEl);\n }\n });\n\n return sentinelEl;\n }\n\n return {\n sentinel,\n loading: () => loading(),\n done: () => done(),\n reset() {\n done.set(false);\n loading.set(false);\n },\n dispose() {\n disposed = true;\n observer?.disconnect();\n observer = null;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';function s(e){return {_type:"directive",hooks:e}}function c(e){return s({mounted(n,t){let i=e(n,t);typeof i=="function"&&(n.__directiveCleanup=i);},unmounted(n){n.__directiveCleanup?.();}})}var a=Symbol("akash.directives");function d(e,n,t,i){let o={value:t,arg:i?.arg,modifiers:i?.modifiers},r=e[a]??[];r.push({directive:n,binding:o}),e[a]=r,n.hooks.mounted?.(e,o);}function v(e,n,t){let o=(e[a]??[]).find(r=>r.directive===n);if(o){let r=o.binding.value;o.binding={...o.binding,value:t,oldValue:r},n.hooks.updated?.(e,o.binding);}}function u(e){let n=e[a]??[];for(let t of n)t.directive.hooks.unmounted?.(e,t.binding);delete e[a];}var m=s({mounted(e){requestAnimationFrame(()=>e.focus());}}),l=s({mounted(e,{value:n}){let t=i=>{e.contains(i.target)||n();};document.addEventListener("click",t,true),e.__vClickOutside=t;},unmounted(e){document.removeEventListener("click",e.__vClickOutside,true),delete e.__vClickOutside;}}),T=s({mounted(e,{value:n}){let t=null,i=n.duration??500,o=()=>{t=setTimeout(n.handler,i);},r=()=>{t&&(clearTimeout(t),t=null);};e.addEventListener("pointerdown",o),e.addEventListener("pointerup",r),e.addEventListener("pointerleave",r),e.__vLongPress={start:o,cancel:r};},unmounted(e){let n=e.__vLongPress;n&&(e.removeEventListener("pointerdown",n.start),e.removeEventListener("pointerup",n.cancel),e.removeEventListener("pointerleave",n.cancel));}}),p=s({mounted(e,{value:n}){let t=new IntersectionObserver(i=>{n(i[0].isIntersecting);});t.observe(e),e.__vIntersect=t;},unmounted(e){e.__vIntersect?.disconnect();}}),g=s({mounted(e,{value:n}){let t=new ResizeObserver(i=>{n(i[0]);});t.observe(e),e.__vResize=t;},unmounted(e){e.__vResize?.disconnect();}});exports.a=s;exports.b=c;exports.c=d;exports.d=v;exports.e=u;exports.f=m;exports.g=l;exports.h=T;exports.i=p;exports.j=g;//# sourceMappingURL=chunk-QQTZQ6UX.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QQTZQ6UX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/directive.ts"],"names":["defineDirective","hooks","directiveFromFn","fn","el","binding","cleanup","DIRECTIVE_KEY","applyDirective","directive","value","options","states","updateDirective","newValue","state","s","oldValue","removeDirectives","vAutoFocus","vClickOutside","handler","listener","e","vLongPress","timer","duration","start","cancel","fns","vIntersect","callback","observer","entries","vResize"],"mappings":"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","file":"chunk-QQTZQ6UX.cjs","sourcesContent":["/**\n * Custom directive system.\n *\n * Reusable attribute behaviors with lifecycle hooks.\n * Directives attach behavior to elements without components.\n *\n * ```ts\n * const vAutoFocus = defineDirective({\n * mounted(el) { el.focus(); },\n * });\n *\n * const vTooltip = defineDirective<string>({\n * mounted(el, { value }) { addTooltip(el, value); },\n * updated(el, { value }) { updateTooltip(el, value); },\n * unmounted(el) { removeTooltip(el); },\n * });\n *\n * // Usage:\n * applyDirective(el, vAutoFocus);\n * applyDirective(el, vTooltip, 'Hello tooltip');\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface DirectiveBinding<T = any> {\n /** Current value passed to the directive */\n value: T;\n /** Previous value (on update) */\n oldValue?: T;\n /** Argument (e.g., v-on:click → arg = 'click') */\n arg?: string;\n /** Modifiers (e.g., v-on.prevent → modifiers.prevent = true) */\n modifiers?: Record<string, boolean>;\n}\n\nexport interface DirectiveHooks<T = any> {\n /** Called when the element is inserted into the DOM */\n mounted?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n /** Called when the bound value updates */\n updated?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n /** Called before the element is removed from the DOM */\n unmounted?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n}\n\nexport interface Directive<T = any> {\n _type: 'directive';\n hooks: DirectiveHooks<T>;\n}\n\n// =========================================================================\n// defineDirective\n// =========================================================================\n\n/**\n * Define a custom directive.\n *\n * ```ts\n * const vClickOutside = defineDirective<() => void>({\n * mounted(el, { value: handler }) {\n * const listener = (e: Event) => {\n * if (!el.contains(e.target as Node)) handler();\n * };\n * document.addEventListener('click', listener);\n * (el as any).__clickOutside = listener;\n * },\n * unmounted(el) {\n * document.removeEventListener('click', (el as any).__clickOutside);\n * },\n * });\n * ```\n */\nexport function defineDirective<T = any>(hooks: DirectiveHooks<T>): Directive<T> {\n return { _type: 'directive', hooks };\n}\n\n/**\n * Shorthand: directive from a single function (runs on mount).\n */\nexport function directiveFromFn<T = any>(\n fn: (el: HTMLElement, binding: DirectiveBinding<T>) => void | (() => void),\n): Directive<T> {\n return defineDirective<T>({\n mounted(el, binding) {\n const cleanup = fn(el, binding);\n if (typeof cleanup === 'function') {\n (el as any).__directiveCleanup = cleanup;\n }\n },\n unmounted(el) {\n (el as any).__directiveCleanup?.();\n },\n });\n}\n\n// =========================================================================\n// applyDirective — attach a directive to an element\n// =========================================================================\n\nconst DIRECTIVE_KEY = Symbol('akash.directives');\n\ninterface DirectiveState {\n directive: Directive;\n binding: DirectiveBinding;\n}\n\n/**\n * Apply a directive to an element.\n *\n * ```ts\n * applyDirective(el, vAutoFocus);\n * applyDirective(el, vTooltip, 'Hello');\n * ```\n */\nexport function applyDirective<T>(\n el: HTMLElement,\n directive: Directive<T>,\n value?: T,\n options?: { arg?: string; modifiers?: Record<string, boolean> },\n): void {\n const binding: DirectiveBinding<T> = {\n value: value as T,\n arg: options?.arg,\n modifiers: options?.modifiers,\n };\n\n // Store directive state on element\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n states.push({ directive, binding });\n (el as any)[DIRECTIVE_KEY] = states;\n\n // Call mounted hook\n directive.hooks.mounted?.(el, binding);\n}\n\n/**\n * Update a directive's value on an element.\n */\nexport function updateDirective<T>(\n el: HTMLElement,\n directive: Directive<T>,\n newValue: T,\n): void {\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n const state = states.find((s) => s.directive === directive);\n\n if (state) {\n const oldValue = state.binding.value;\n state.binding = { ...state.binding, value: newValue, oldValue };\n directive.hooks.updated?.(el, state.binding);\n }\n}\n\n/**\n * Remove all directives from an element (call on unmount).\n */\nexport function removeDirectives(el: HTMLElement): void {\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n for (const state of states) {\n state.directive.hooks.unmounted?.(el, state.binding);\n }\n delete (el as any)[DIRECTIVE_KEY];\n}\n\n// =========================================================================\n// Built-in directives\n// =========================================================================\n\n/** Auto-focus an element when mounted */\nexport const vAutoFocus = defineDirective({\n mounted(el) {\n requestAnimationFrame(() => el.focus());\n },\n});\n\n/** Click outside handler */\nexport const vClickOutside = defineDirective<() => void>({\n mounted(el, { value: handler }) {\n const listener = (e: Event) => {\n if (!el.contains(e.target as Node)) handler();\n };\n document.addEventListener('click', listener, true);\n (el as any).__vClickOutside = listener;\n },\n unmounted(el) {\n document.removeEventListener('click', (el as any).__vClickOutside, true);\n delete (el as any).__vClickOutside;\n },\n});\n\n/** Long press handler */\nexport const vLongPress = defineDirective<{ handler: () => void; duration?: number }>({\n mounted(el, { value }) {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const duration = value.duration ?? 500;\n\n const start = () => { timer = setTimeout(value.handler, duration); };\n const cancel = () => { if (timer) { clearTimeout(timer); timer = null; } };\n\n el.addEventListener('pointerdown', start);\n el.addEventListener('pointerup', cancel);\n el.addEventListener('pointerleave', cancel);\n\n (el as any).__vLongPress = { start, cancel };\n },\n unmounted(el) {\n const fns = (el as any).__vLongPress;\n if (fns) {\n el.removeEventListener('pointerdown', fns.start);\n el.removeEventListener('pointerup', fns.cancel);\n el.removeEventListener('pointerleave', fns.cancel);\n }\n },\n});\n\n/** Intersection observer — triggers callback when element enters viewport */\nexport const vIntersect = defineDirective<(isIntersecting: boolean) => void>({\n mounted(el, { value: callback }) {\n const observer = new IntersectionObserver((entries) => {\n callback(entries[0].isIntersecting);\n });\n observer.observe(el);\n (el as any).__vIntersect = observer;\n },\n unmounted(el) {\n (el as any).__vIntersect?.disconnect();\n },\n});\n\n/** Resize observer — triggers callback on element resize */\nexport const vResize = defineDirective<(entry: ResizeObserverEntry) => void>({\n mounted(el, { value: callback }) {\n const observer = new ResizeObserver((entries) => {\n callback(entries[0]);\n });\n observer.observe(el);\n (el as any).__vResize = observer;\n },\n unmounted(el) {\n (el as any).__vResize?.disconnect();\n },\n});\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkNEQ5TENE_cjs=require('./chunk-NEQ5TENE.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var K=[];function F(c){K.push(...c.plugins);}var k=new Map;function D(c,f){return ()=>{if(k.has(c))return k.get(c);let o=f.state(),n=$(c,o,f);return k.set(c,n),n}}function $(c,f,o){let n={},p=Object.keys(f);for(let e of p)n[e]=chunkWOZWFMOK_cjs.c(f[e]);let i={$id:c};for(let e of p)i[e]=n[e];let h=[],m=[];if(i.$__meta={stateKeys:p,getterKeys:h,actionKeys:m},o.getters)for(let[e,t]of Object.entries(o.getters))h.push(e),i[e]=chunkWOZWFMOK_cjs.d(()=>t.call(i,n));let R=[...K,...o.plugins??[]];if(o.actions)for(let[e,t]of Object.entries(o.actions))m.push(e),i[e]=(...S)=>{for(let s of R)s.onAction?.(i,e,S);return t.apply(i,S)};i.$reset=()=>{let e=o.state();for(let t of p)n[t].set(e[t]);},i.$patch=e=>{chunkWOZWFMOK_cjs.a(()=>{if(typeof e=="function")e(n);else for(let[t,S]of Object.entries(e))t in n&&n[t].set(S);});},i.$snapshot=()=>{let e={};for(let t of p)e[t]=n[t]();return e};let w=new Set,d=null;if(i.$subscribe=e=>{if(w.add(e),!d){let t=true;d=chunkWOZWFMOK_cjs.e(()=>{for(let s of p)n[s]();if(t){t=false;return}let S=i.$snapshot();for(let s of w)s(S);});}return ()=>{w.delete(e),w.size===0&&d&&(d(),d=null);}},o.persist&&typeof window<"u"){let e=O(c,o.persist);for(let t of e){let S=t.storage==="sessionStorage"?sessionStorage:localStorage,s=t.serialize??JSON.stringify,y=t.deserialize??JSON.parse,g=t.pick??p;try{let r=S.getItem(t.key);if(r){let a=y(r);for(let l of g)l in a&&l in n&&n[l].set(a[l]);}}catch{}let u=false,b=true;chunkWOZWFMOK_cjs.e(()=>{for(let r of g)r in n&&n[r]();if(b){b=false;return}u||(u=true,queueMicrotask(()=>{u=false;let r={};for(let a of g)a in n&&(r[a]=n[a].peek());try{S.setItem(t.key,s(r));}catch{}}));}),t.storage!=="sessionStorage"&&window.addEventListener("storage",r=>{if(!(r.key!==t.key||!r.newValue))try{let a=y(r.newValue);for(let l of g)l in a&&l in n&&n[l].set(a[l]);}catch{}});}}if(o.sync&&o.sync.enabled!==false){let e=o.sync,t=e.pick??p,S={};for(let y of t)S[y]=n[y]?.peek?.()??f[y];let s=chunkNEQ5TENE_cjs.d(S,{transport:e.transport,peerId:e.peerId});for(let y of t){if(!(y in n)||!(y in s.state))continue;let g=n[y],u=s.state[y],b=g.set,r=false;g.set=a=>{b.call(g,a),r||u.set(a);},chunkWOZWFMOK_cjs.e(()=>{let a=u();r=true,g.set(a),r=false;});}i.$sync={peers:s.peers,presence:s.presence,peerPresence:s.peerPresence,peerId:s.peerId,connected:s.connected,connect:s.connect.bind(s),disconnect:s.disconnect.bind(s)};}for(let e of R)e.init?.(i);return i}function O(c,f){return f===true?[{key:`akash-store:${c}`}]:f===false?[]:Array.isArray(f)?f.map((o,n)=>({...o,key:o.key??`akash-store:${c}:${n}`})):[{...f,key:f.key??`akash-store:${c}`}]}function _(){k.clear();}function E(){return Object.fromEntries(k)}exports.a=F;exports.b=D;exports.c=_;exports.d=E;//# sourceMappingURL=chunk-QSPRVXFV.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QSPRVXFV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-QSPRVXFV.cjs","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
'use strict';var o=false,c=new Map,a=0;function f(){o=true;}function u(){o=false,c.clear();}function l(){return o}function d(t){if(!o)return -1;let e=++a;return c.set(e,{id:e,createdAt:Date.now(),stackTrace:i(),componentName:t??null,disposed:false}),e}function p(t){if(!o||t===-1)return;let e=c.get(t);e&&(e.disposed=true,c.delete(t));}function k(){return Array.from(c.values())}function s(t=3e4){if(!o)return [];let e=Date.now(),n=[];for(let r of c.values())!r.disposed&&e-r.createdAt>t&&n.push({effectId:r.id,age:e-r.createdAt,componentName:r.componentName,stackTrace:r.stackTrace});return n}function m(t=3e4){let e=s(t);if(e.length!==0){console.warn(`[AkashJS] ${e.length} potential effect leak(s) detected:`);for(let n of e){let r=n.componentName?` in ${n.componentName}`:"";console.warn(` Effect #${n.effectId}${r} \u2014 active for ${(n.age/1e3).toFixed(1)}s`),n.stackTrace&&console.warn(` Created at:
|
|
2
|
+
${n.stackTrace}`);}}}function g(){return {enabled:o,activeCount:c.size,totalTracked:a}}function i(){try{let e=new Error().stack;return e?e.split(`
|
|
3
|
+
`).slice(3,8).join(`
|
|
4
|
+
`):null}catch{return null}}exports.a=f;exports.b=u;exports.c=l;exports.d=d;exports.e=p;exports.f=k;exports.g=s;exports.h=m;exports.i=g;//# sourceMappingURL=chunk-QTQ6RUX4.cjs.map
|
|
5
|
+
//# sourceMappingURL=chunk-QTQ6RUX4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/leak-detector.ts"],"names":["tracking","activeEffects","effectIdCounter","enableLeakDetection","disableLeakDetection","isLeakDetectionEnabled","trackEffect","componentName","id","captureStack","untrackEffect","record","getActiveEffects","checkForLeaks","thresholdMs","now","warnings","reportLeaks","leaks","leak","component","getLeakDetectionStats","stack"],"mappings":"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","file":"chunk-QTQ6RUX4.cjs","sourcesContent":["/**\n * Effect disposal and leak detection (dev mode).\n *\n * In development, tracks all created effects and verifies they\n * get properly cleaned up when components unmount. Logs warnings\n * for leaked effects that were never disposed.\n */\n\nimport type { ScheduledEffect } from './scheduler.js';\n\n// --- Tracking state ---\n\nlet tracking = false;\nconst activeEffects = new Map<number, EffectRecord>();\nlet effectIdCounter = 0;\n\ninterface EffectRecord {\n id: number;\n createdAt: number;\n stackTrace: string | null;\n componentName: string | null;\n disposed: boolean;\n}\n\n// --- Public API ---\n\n/**\n * Enable leak detection. Call once at app startup in dev mode.\n *\n * ```ts\n * if (import.meta.env.DEV) {\n * enableLeakDetection();\n * }\n * ```\n */\nexport function enableLeakDetection(): void {\n tracking = true;\n}\n\n/**\n * Disable leak detection.\n */\nexport function disableLeakDetection(): void {\n tracking = false;\n activeEffects.clear();\n}\n\n/**\n * Check if leak detection is enabled.\n */\nexport function isLeakDetectionEnabled(): boolean {\n return tracking;\n}\n\n/**\n * Register an effect for tracking. Called internally by effect().\n * Returns an ID for later disposal tracking.\n */\nexport function trackEffect(componentName?: string): number {\n if (!tracking) return -1;\n\n const id = ++effectIdCounter;\n activeEffects.set(id, {\n id,\n createdAt: Date.now(),\n stackTrace: captureStack(),\n componentName: componentName ?? null,\n disposed: false,\n });\n\n return id;\n}\n\n/**\n * Mark an effect as disposed. Called internally by effect dispose function.\n */\nexport function untrackEffect(id: number): void {\n if (!tracking || id === -1) return;\n\n const record = activeEffects.get(id);\n if (record) {\n record.disposed = true;\n activeEffects.delete(id);\n }\n}\n\n/**\n * Get all currently active (undisposed) effects.\n */\nexport function getActiveEffects(): EffectRecord[] {\n return Array.from(activeEffects.values());\n}\n\n/**\n * Check for leaked effects and return warnings.\n * An effect is considered leaked if it's been active for longer\n * than the given threshold without being disposed.\n */\nexport function checkForLeaks(thresholdMs = 30000): LeakWarning[] {\n if (!tracking) return [];\n\n const now = Date.now();\n const warnings: LeakWarning[] = [];\n\n for (const record of activeEffects.values()) {\n if (!record.disposed && now - record.createdAt > thresholdMs) {\n warnings.push({\n effectId: record.id,\n age: now - record.createdAt,\n componentName: record.componentName,\n stackTrace: record.stackTrace,\n });\n }\n }\n\n return warnings;\n}\n\n/**\n * Log leak warnings to the console.\n */\nexport function reportLeaks(thresholdMs = 30000): void {\n const leaks = checkForLeaks(thresholdMs);\n if (leaks.length === 0) return;\n\n console.warn(\n `[AkashJS] ${leaks.length} potential effect leak(s) detected:`,\n );\n for (const leak of leaks) {\n const component = leak.componentName ? ` in ${leak.componentName}` : '';\n console.warn(\n ` Effect #${leak.effectId}${component} — active for ${(leak.age / 1000).toFixed(1)}s`,\n );\n if (leak.stackTrace) {\n console.warn(` Created at:\\n${leak.stackTrace}`);\n }\n }\n}\n\n/**\n * Get a summary of effect tracking state.\n */\nexport function getLeakDetectionStats(): {\n enabled: boolean;\n activeCount: number;\n totalTracked: number;\n} {\n return {\n enabled: tracking,\n activeCount: activeEffects.size,\n totalTracked: effectIdCounter,\n };\n}\n\n// --- Types ---\n\nexport interface LeakWarning {\n effectId: number;\n age: number;\n componentName: string | null;\n stackTrace: string | null;\n}\n\n// --- Internal ---\n\nfunction captureStack(): string | null {\n try {\n const err = new Error();\n const stack = err.stack;\n if (!stack) return null;\n // Remove first 3 lines (Error, captureStack, trackEffect)\n const lines = stack.split('\\n');\n return lines.slice(3, 8).join('\\n');\n } catch {\n return null;\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function v(n){if(typeof window>"u")return(()=>false);let o=window.matchMedia(n),t=chunkWOZWFMOK_cjs.c(o.matches),i=r=>t.set(r.matches);return o.addEventListener("change",i),(()=>t())}var y={sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function S(n=y){let o=Object.entries(n).sort((e,a)=>e[1]-a[1]),t=chunkWOZWFMOK_cjs.c(typeof window<"u"?window.innerWidth:1024);if(typeof window<"u"){let e=()=>t.set(window.innerWidth);window.addEventListener("resize",e,{passive:true});}function i(){let e=t(),a="";for(let[g,f]of o)e>=f&&(a=g);return a||o[0]?.[0]||""}function r(e){let a=n[e];return a!==void 0&&t()>=a}function s(e){let a=n[e];return a!==void 0&&t()<a}return {current:i,gte:r,lt:s,width:(()=>t())}}function b(n,o,t="local"){let i=typeof window<"u"?t==="local"?localStorage:sessionStorage:null,r=o;if(i)try{let e=i.getItem(n);e!==null&&(r=JSON.parse(e));}catch{}let s=chunkWOZWFMOK_cjs.c(r);return i&&(chunkWOZWFMOK_cjs.e(()=>{let e=s();try{i.setItem(n,JSON.stringify(e));}catch{}}),typeof window<"u"&&window.addEventListener("storage",e=>{if(e.key===n&&e.newValue!==null)try{s.set(JSON.parse(e.newValue));}catch{}})),s}function h(n){let o=chunkWOZWFMOK_cjs.c(""),t=chunkWOZWFMOK_cjs.c(false),i=n?.timeout??2e3,r=null;async function s(e){typeof navigator>"u"||!navigator.clipboard||(await navigator.clipboard.writeText(e),o.set(e),t.set(true),r&&clearTimeout(r),r=setTimeout(()=>t.set(false),i));}return {text:(()=>o()),copied:(()=>t()),copy:s}}function E(){if(typeof window>"u")return(()=>true);let n=chunkWOZWFMOK_cjs.c(navigator.onLine);return window.addEventListener("online",()=>n.set(true)),window.addEventListener("offline",()=>n.set(false)),(()=>n())}function T(n){let o=chunkWOZWFMOK_cjs.c({latitude:null,longitude:null,accuracy:null,error:null,loading:true});return typeof navigator<"u"&&navigator.geolocation?navigator.geolocation.watchPosition(t=>{o.set({latitude:t.coords.latitude,longitude:t.coords.longitude,accuracy:t.coords.accuracy,error:null,loading:false});},t=>{o.set({latitude:null,longitude:null,accuracy:null,error:t,loading:false});},n):o.set({...o(),loading:false}),(()=>o())}function L(){let n=chunkWOZWFMOK_cjs.c(typeof window<"u"?window.innerWidth:0),o=chunkWOZWFMOK_cjs.c(typeof window<"u"?window.innerHeight:0);return typeof window<"u"&&window.addEventListener("resize",()=>{n.set(window.innerWidth),o.set(window.innerHeight);},{passive:true}),{width:(()=>n()),height:(()=>o())}}function R(n,o,t={}){if(typeof document>"u")return ()=>{};let{events:i=["pointerdown"],ignore:r=[],active:s=true}=t,e=s;function a(){return typeof n=="function"?n():n}function g(u){let d=u.target;if(!d)return false;for(let c of r)if(typeof c=="string"){if(d.closest(c))return true}else if(c===d||c.contains(d))return true;return false}function f(u){if(!e)return;let d=a();if(!d)return;let c=u.target;d===c||d.contains(c)||g(u)||o(u);}for(let u of i)document.addEventListener(u,f,{passive:true,capture:true});let w=()=>{for(let u of i)document.removeEventListener(u,f,{capture:true});};return w.enable=()=>{e=true;},w.disable=()=>{e=false;},w}exports.a=v;exports.b=S;exports.c=b;exports.d=h;exports.e=E;exports.f=T;exports.g=L;exports.h=R;//# sourceMappingURL=chunk-R65RPMQX.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-R65RPMQX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts"],"names":["useMediaQuery","query","mql","matches","signal","handler","e","DEFAULT_BREAKPOINTS","useBreakpoint","breakpoints","sorted","a","b","width","current","w","result","name","min","gte","bp","lt","useStorage","key","initialValue","storage","store","startValue","raw","state","effect","value","useClipboard","options","text","copied","timeout","timer","copy","useOnline","online","useGeolocation","pos","err","useWindowSize","height","useClickOutside","target","events","ignore","active","isActive","getTarget","shouldIgnore","event","eventTarget","pattern","listener","el","eventName","dispose"],"mappings":"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","file":"chunk-R65RPMQX.cjs","sourcesContent":["/**\n * Browser API composables.\n *\n * Signal-based wrappers for common browser APIs.\n * All composables are SSR-safe — they return fallback values\n * when `window` is not available.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- useMediaQuery ---\n\n/**\n * Reactive media query matcher.\n *\n * ```ts\n * const isMobile = useMediaQuery('(max-width: 768px)');\n * isMobile(); // true/false, updates on resize\n * ```\n */\nexport function useMediaQuery(query: string): ReadonlySignal<boolean> {\n if (typeof window === 'undefined') {\n return (() => false) as ReadonlySignal<boolean>;\n }\n\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n\n const handler = (e: MediaQueryListEvent) => matches.set(e.matches);\n mql.addEventListener('change', handler);\n\n return (() => matches()) as ReadonlySignal<boolean>;\n}\n\n// --- useBreakpoint ---\n\nexport interface Breakpoints {\n [name: string]: number;\n}\n\nconst DEFAULT_BREAKPOINTS: Breakpoints = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n};\n\n/**\n * Reactive breakpoint tracker (Tailwind-style).\n *\n * ```ts\n * const bp = useBreakpoint();\n * bp.current(); // 'md'\n * bp.gte('lg'); // false\n * bp.lt('sm'); // false\n * ```\n */\nexport function useBreakpoint(breakpoints: Breakpoints = DEFAULT_BREAKPOINTS) {\n const sorted = Object.entries(breakpoints).sort((a, b) => a[1] - b[1]);\n const width = signal(typeof window !== 'undefined' ? window.innerWidth : 1024);\n\n if (typeof window !== 'undefined') {\n const handler = () => width.set(window.innerWidth);\n window.addEventListener('resize', handler, { passive: true });\n }\n\n function current(): string {\n const w = width();\n let result = '';\n for (const [name, min] of sorted) {\n if (w >= min) result = name;\n }\n return result || sorted[0]?.[0] || '';\n }\n\n function gte(name: string): boolean {\n const bp = breakpoints[name];\n return bp !== undefined && width() >= bp;\n }\n\n function lt(name: string): boolean {\n const bp = breakpoints[name];\n return bp !== undefined && width() < bp;\n }\n\n return { current, gte, lt, width: (() => width()) as ReadonlySignal<number> };\n}\n\n// --- useStorage ---\n\n/**\n * Signal backed by localStorage or sessionStorage.\n * Persists across page refreshes.\n *\n * ```ts\n * const name = useStorage('user-name', 'Guest');\n * name(); // reads from localStorage or 'Guest'\n * name.set('Alice'); // writes to localStorage\n * ```\n */\nexport function useStorage<T>(\n key: string,\n initialValue: T,\n storage: 'local' | 'session' = 'local',\n): Signal<T> {\n const store = typeof window !== 'undefined'\n ? (storage === 'local' ? localStorage : sessionStorage)\n : null;\n\n // Read existing value\n let startValue = initialValue;\n if (store) {\n try {\n const raw = store.getItem(key);\n if (raw !== null) startValue = JSON.parse(raw);\n } catch { /* use initial */ }\n }\n\n const state = signal<T>(startValue);\n\n // Sync writes to storage\n if (store) {\n effect(() => {\n const value = state();\n try {\n store.setItem(key, JSON.stringify(value));\n } catch { /* storage full */ }\n });\n\n // Listen for changes from other tabs\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', (e) => {\n if (e.key === key && e.newValue !== null) {\n try {\n state.set(JSON.parse(e.newValue));\n } catch { /* ignore */ }\n }\n });\n }\n }\n\n return state;\n}\n\n// --- useClipboard ---\n\n/**\n * Reactive clipboard access.\n *\n * ```ts\n * const { text, copy, copied } = useClipboard();\n * await copy('Hello');\n * copied(); // true for 2 seconds\n * ```\n */\nexport function useClipboard(options?: { timeout?: number }) {\n const text = signal('');\n const copied = signal(false);\n const timeout = options?.timeout ?? 2000;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function copy(value: string): Promise<void> {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return;\n await navigator.clipboard.writeText(value);\n text.set(value);\n copied.set(true);\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => copied.set(false), timeout);\n }\n\n return {\n text: (() => text()) as ReadonlySignal<string>,\n copied: (() => copied()) as ReadonlySignal<boolean>,\n copy,\n };\n}\n\n// --- useOnline ---\n\n/**\n * Reactive online/offline status.\n *\n * ```ts\n * const online = useOnline();\n * online(); // true/false\n * ```\n */\nexport function useOnline(): ReadonlySignal<boolean> {\n if (typeof window === 'undefined') {\n return (() => true) as ReadonlySignal<boolean>;\n }\n\n const online = signal(navigator.onLine);\n window.addEventListener('online', () => online.set(true));\n window.addEventListener('offline', () => online.set(false));\n\n return (() => online()) as ReadonlySignal<boolean>;\n}\n\n// --- useGeolocation ---\n\nexport interface GeolocationState {\n latitude: number | null;\n longitude: number | null;\n accuracy: number | null;\n error: GeolocationPositionError | null;\n loading: boolean;\n}\n\n/**\n * Reactive geolocation.\n *\n * ```ts\n * const geo = useGeolocation();\n * geo().latitude; // number | null\n * geo().loading; // boolean\n * ```\n */\nexport function useGeolocation(\n options?: PositionOptions,\n): ReadonlySignal<GeolocationState> {\n const state = signal<GeolocationState>({\n latitude: null,\n longitude: null,\n accuracy: null,\n error: null,\n loading: true,\n });\n\n if (typeof navigator !== 'undefined' && navigator.geolocation) {\n navigator.geolocation.watchPosition(\n (pos) => {\n state.set({\n latitude: pos.coords.latitude,\n longitude: pos.coords.longitude,\n accuracy: pos.coords.accuracy,\n error: null,\n loading: false,\n });\n },\n (err) => {\n state.set({\n latitude: null,\n longitude: null,\n accuracy: null,\n error: err,\n loading: false,\n });\n },\n options,\n );\n } else {\n state.set({ ...state(), loading: false });\n }\n\n return (() => state()) as ReadonlySignal<GeolocationState>;\n}\n\n// --- useWindowSize ---\n\n/**\n * Reactive window dimensions.\n */\nexport function useWindowSize() {\n const width = signal(typeof window !== 'undefined' ? window.innerWidth : 0);\n const height = signal(typeof window !== 'undefined' ? window.innerHeight : 0);\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', () => {\n width.set(window.innerWidth);\n height.set(window.innerHeight);\n }, { passive: true });\n }\n\n return {\n width: (() => width()) as ReadonlySignal<number>,\n height: (() => height()) as ReadonlySignal<number>,\n };\n}\n\n// --- useClickOutside ---\n\n/**\n * Detect clicks outside an element. Essential for closing\n * dropdowns, modals, popovers, and context menus.\n *\n * ```ts\n * const dropdown = document.querySelector('.dropdown')!;\n * const dispose = useClickOutside(dropdown, () => {\n * closeDropdown();\n * });\n *\n * // With options:\n * useClickOutside(dropdown, onClose, {\n * events: ['mousedown', 'touchstart'],\n * ignore: ['.trigger-button'],\n * });\n * ```\n */\nexport function useClickOutside(\n target: HTMLElement | (() => HTMLElement | null),\n handler: (event: Event) => void,\n options: {\n /** Events to listen for (default: ['pointerdown']) */\n events?: string[];\n /** Selectors or elements to ignore (clicks on these won't trigger) */\n ignore?: (string | HTMLElement)[];\n /** Whether the listener is active (default: true) */\n active?: boolean;\n } = {},\n): () => void {\n if (typeof document === 'undefined') return () => {};\n\n const {\n events = ['pointerdown'],\n ignore = [],\n active = true,\n } = options;\n\n let isActive = active;\n\n function getTarget(): HTMLElement | null {\n return typeof target === 'function' ? target() : target;\n }\n\n function shouldIgnore(event: Event): boolean {\n const eventTarget = event.target as HTMLElement;\n if (!eventTarget) return false;\n\n for (const pattern of ignore) {\n if (typeof pattern === 'string') {\n if (eventTarget.closest(pattern)) return true;\n } else {\n if (pattern === eventTarget || pattern.contains(eventTarget)) return true;\n }\n }\n return false;\n }\n\n function listener(event: Event): void {\n if (!isActive) return;\n const el = getTarget();\n if (!el) return;\n\n const eventTarget = event.target as Node;\n if (el === eventTarget || el.contains(eventTarget)) return;\n if (shouldIgnore(event)) return;\n\n handler(event);\n }\n\n for (const eventName of events) {\n document.addEventListener(eventName, listener, { passive: true, capture: true });\n }\n\n const dispose = () => {\n for (const eventName of events) {\n document.removeEventListener(eventName, listener, { capture: true } as EventListenerOptions);\n }\n };\n\n // Attach enable/disable to dispose function\n (dispose as any).enable = () => { isActive = true; };\n (dispose as any).disable = () => { isActive = false; };\n\n return dispose;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d}from'./chunk-YXKQTEPR.js';function M(t){let n=c(t.initial),a=c(t.context??{}),d$1=c([t.initial]),g=d(()=>t.states[n()]?.type==="final"),y=d(()=>{let e=t.states[n()];return e?.on?Object.keys(e.on):[]}),S=t.states[t.initial];S?.entry&&S.entry({data:a(),event:""});function E(e,i){if(g())return;let s=n(),o=t.states[s];if(!o?.on)return;let x=o.on[e];if(!x)return;let r,l,f;if(typeof x=="string")r=x;else {let T=x;r=T.target,l=T.guard,f=T.action;}let c={data:a(),event:e,payload:i};if(l&&!l(c))return;o.exit&&o.exit(c),f&&f(c,i),a.set(c.data),n.set(r),d$1.update(T=>[...T,r]);let v=t.states[r];v?.entry&&v.entry({data:a(),event:e});}function h(e){let i=t.states[n()];if(!i?.on)return false;let s=i.on[e];if(!s)return false;if(typeof s!="string"){let o=s;if(o.guard)return o.guard({data:a(),event:e})}return true}return {state:()=>n(),context:()=>a(),send:E,matches:e=>n()===e,done:g,reset(){n.set(t.initial),a.set(t.context??{}),d$1.set([t.initial]);},history:()=>d$1(),can:h,nextEvents:y}}export{M as a};//# sourceMappingURL=chunk-R7NUVVHP.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-R7NUVVHP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/machine.ts"],"names":["createMachine","config","currentState","signal","contextData","stateHistory","done","computed","nextEvents","stateCfg","initialStateCfg","send","event","payload","state","transition","target","guard","action","t","ctx","h","targetCfg","can"],"mappings":"sCAkGO,SAASA,CAAAA,CAIdC,CAAAA,CAAoF,CACpF,IAAMC,EAAeC,CAAAA,CAAeF,CAAAA,CAAO,OAAO,CAAA,CAC5CG,EAAcD,CAAAA,CAAkBF,CAAAA,CAAO,OAAA,EAAW,EAAe,CAAA,CACjEI,
|
|
1
|
+
{"version":3,"sources":["../src/machine.ts"],"names":["createMachine","config","currentState","signal","contextData","stateHistory","done","computed","nextEvents","stateCfg","initialStateCfg","send","event","payload","state","transition","target","guard","action","t","ctx","h","targetCfg","can"],"mappings":"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","file":"chunk-R7NUVVHP.js","sourcesContent":["/**\n * State machines for complex UI flows.\n *\n * Finite state machines with typed states, events, guards,\n * actions, and reactive current state signal.\n *\n * ```ts\n * const checkout = createMachine({\n * initial: 'cart',\n * states: {\n * cart: { on: { CHECKOUT: 'shipping' } },\n * shipping: { on: { NEXT: 'payment', BACK: 'cart' } },\n * payment: { on: { PAY: 'processing', BACK: 'shipping' } },\n * processing: { on: { SUCCESS: 'complete', FAIL: 'payment' } },\n * complete: { type: 'final' },\n * },\n * });\n *\n * checkout.state(); // 'cart'\n * checkout.send('CHECKOUT');\n * checkout.state(); // 'shipping'\n * checkout.matches('shipping'); // true\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface MachineConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Initial state */\n initial: TState;\n /** Initial context data */\n context?: TContext;\n /** State definitions */\n states: Record<TState, StateConfig<TState, TEvent, TContext>>;\n}\n\nexport interface StateConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Transitions: event → target state */\n on?: Partial<Record<TEvent, TState | TransitionConfig<TState, TEvent, TContext>>>;\n /** Entry action — runs when entering this state */\n entry?: (ctx: MachineContext<TContext>) => void;\n /** Exit action — runs when leaving this state */\n exit?: (ctx: MachineContext<TContext>) => void;\n /** Final state — machine stops accepting events */\n type?: 'final';\n}\n\nexport interface TransitionConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Target state */\n target: TState;\n /** Guard — transition only if this returns true */\n guard?: (ctx: MachineContext<TContext>) => boolean;\n /** Action — runs during the transition */\n action?: (ctx: MachineContext<TContext>) => void;\n}\n\nexport interface MachineContext<TContext> {\n /** The context data (mutable) */\n data: TContext;\n /** The current event that triggered the transition */\n event: string;\n /** Optional payload passed with the event via send(event, payload) */\n payload?: unknown;\n}\n\nexport interface Machine<TState extends string, TEvent extends string, TContext = unknown> {\n /** Current state (reactive signal) */\n state: ReadonlySignal<TState>;\n /** Context data (reactive signal) */\n context: ReadonlySignal<TContext>;\n /** Send an event to the machine */\n send(event: TEvent, payload?: Record<string, unknown>): void;\n /** Check if currently in a specific state */\n matches(state: TState): boolean;\n /** Whether the machine is in a final state */\n done: ReadonlySignal<boolean>;\n /** Reset to initial state */\n reset(): void;\n /** State history */\n history: ReadonlySignal<TState[]>;\n /** Can a specific event be sent in the current state? */\n can(event: TEvent): boolean;\n /** Get all possible events from current state */\n nextEvents: ReadonlySignal<TEvent[]>;\n}\n\n// =========================================================================\n// createMachine\n// =========================================================================\n\n/**\n * Create a finite state machine.\n */\nexport function createMachine<\n TState extends string,\n TEvent extends string,\n TContext = unknown,\n>(config: MachineConfig<TState, TEvent, TContext>): Machine<TState, TEvent, TContext> {\n const currentState = signal<TState>(config.initial);\n const contextData = signal<TContext>((config.context ?? {}) as TContext);\n const stateHistory = signal<TState[]>([config.initial]);\n\n const done = computed(() => {\n const stateCfg = config.states[currentState()];\n return stateCfg?.type === 'final';\n });\n\n const nextEvents = computed((): TEvent[] => {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return [];\n return Object.keys(stateCfg.on) as TEvent[];\n });\n\n // Run entry action for initial state\n const initialStateCfg = config.states[config.initial];\n if (initialStateCfg?.entry) {\n initialStateCfg.entry({ data: contextData() as TContext, event: '' });\n }\n\n function send(event: TEvent, payload?: unknown): void {\n if (done()) return; // Final state — no more transitions\n\n const state = currentState();\n const stateCfg = config.states[state];\n if (!stateCfg?.on) return;\n\n const transition = stateCfg.on[event];\n if (!transition) return;\n\n let target: TState;\n let guard: ((ctx: MachineContext<TContext>) => boolean) | undefined;\n let action: ((ctx: MachineContext<TContext>) => void) | undefined;\n\n if (typeof transition === 'string') {\n target = transition as TState;\n } else {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n target = t.target;\n guard = t.guard;\n action = t.action;\n }\n\n const ctx: MachineContext<TContext> = {\n data: contextData() as TContext,\n event,\n payload,\n };\n\n // Check guard\n if (guard && !guard(ctx)) return;\n\n // Exit action\n if (stateCfg.exit) {\n stateCfg.exit(ctx);\n }\n\n // Transition action — pass payload as second argument for convenience\n if (action) {\n (action as Function)(ctx, payload);\n }\n\n // Update context if modified\n contextData.set(ctx.data);\n\n // Enter new state\n currentState.set(target);\n stateHistory.update((h) => [...h, target]);\n\n // Entry action for new state\n const targetCfg = config.states[target];\n if (targetCfg?.entry) {\n targetCfg.entry({ data: contextData() as TContext, event });\n }\n }\n\n function can(event: TEvent): boolean {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return false;\n const transition = stateCfg.on[event];\n if (!transition) return false;\n\n if (typeof transition !== 'string') {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n if (t.guard) {\n return t.guard({ data: contextData() as TContext, event });\n }\n }\n return true;\n }\n\n return {\n state: () => currentState(),\n context: () => contextData(),\n send,\n matches: (state: TState) => currentState() === state,\n done,\n reset() {\n currentState.set(config.initial);\n contextData.set((config.context ?? {}) as TContext);\n stateHistory.set([config.initial]);\n },\n history: () => stateHistory(),\n can,\n nextEvents,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {s,l}from'./chunk-KE7BJTCD.js';import {c}from'./chunk-YXKQTEPR.js';function w(i){let P=typeof i=="function"?{loader:i}:i,{loader:C,loading:c$1,error:f,timeout:s$1,delay:y=200}=P,l$1=null,t=null,o=null;function A(){return t||(t=C().then(e=>{l$1=e.default;}).catch(e=>{o=e instanceof Error?e:new Error(String(e));}),t)}return s(e=>{let n=c("loading"),m=c(false);A().then(()=>{o?n.set("error"):n.set("ready");});let a=null;y>0?a=setTimeout(()=>m.set(true),y):m.set(true);let u=null;return s$1&&(u=setTimeout(()=>{n()==="loading"&&(o=new Error(`Async component timed out after ${s$1}ms`),n.set("error"));},s$1)),()=>{let r=n();return r!=="loading"&&(a&&clearTimeout(a),u&&clearTimeout(u)),r==="ready"&&l$1?l$1(e.props):r==="error"&&f&&o?l(f(o)):r==="loading"&&m()&&c$1?l(c$1()):document.createComment("async-loading")}})}export{w as a};//# sourceMappingURL=chunk-SXYPAP4B.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-SXYPAP4B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/async-component.ts"],"names":["defineAsyncComponent","loaderOrOptions","options","loader","loadingFn","errorFn","timeout","delay","resolvedComp","loadPromise","loadError","startLoad","mod","err","defineComponent","ctx","state","signal","showLoading","delayTimer","timeoutTimer","s","nodeToDOM"],"mappings":"0EAiDO,SAASA,EACdC,CAAAA,CACc,CACd,IAAMC,CAAAA,CACJ,OAAOD,GAAoB,UAAA,CACvB,CAAE,OAAQA,CAAgB,CAAA,CAC1BA,EAEA,CACJ,MAAA,CAAAE,EACA,OAAA,CAASC,GAAAA,CACT,MAAOC,CAAAA,CACP,OAAA,CAAAC,IACA,KAAA,CAAAC,CAAAA,CAAQ,GACV,CAAA,CAAIL,CAAAA,CAGAM,IAAoC,IAAA,CACpCC,CAAAA,CAAoC,KACpCC,CAAAA,CAA0B,IAAA,CAE9B,SAASC,CAAAA,EAA2B,CAClC,OAAIF,CAAAA,GAEJA,CAAAA,CAAcN,GAAO,CAClB,IAAA,CAAMS,GAAQ,CACbJ,GAAAA,CAAeI,EAAI,QACrB,CAAC,EACA,KAAA,CAAOC,CAAAA,EAAQ,CACdH,CAAAA,CAAYG,CAAAA,YAAe,MAAQA,CAAAA,CAAM,IAAI,MAAM,MAAA,CAAOA,CAAG,CAAC,EAChE,CAAC,EAEIJ,CAAAA,CACT,CAEA,OAAOK,CAAAA,CAAoBC,CAAAA,EAAQ,CACjC,IAAMC,CAAAA,CAAQC,EAAsC,SAAS,CAAA,CACvDC,EAAcD,CAAAA,CAAO,KAAK,EAGhCN,CAAAA,EAAU,CAAE,KAAK,IAAM,CACjBD,EACFM,CAAAA,CAAM,GAAA,CAAI,OAAO,CAAA,CAEjBA,CAAAA,CAAM,IAAI,OAAO,EAErB,CAAC,CAAA,CAGD,IAAIG,EAAmD,IAAA,CACnDZ,CAAAA,CAAQ,EACVY,CAAAA,CAAa,UAAA,CAAW,IAAMD,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAAGX,CAAK,EAE1DW,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAItB,IAAIE,EAAqD,IAAA,CACzD,OAAId,MACFc,CAAAA,CAAe,UAAA,CAAW,IAAM,CAC1BJ,CAAAA,KAAY,SAAA,GACdN,CAAAA,CAAY,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCJ,GAAO,CAAA,EAAA,CAAI,CAAA,CACpEU,EAAM,GAAA,CAAI,OAAO,GAErB,CAAA,CAAGV,GAAO,GAGL,IAAM,CACX,IAAMe,CAAAA,CAAIL,CAAAA,GAQV,OALIK,CAAAA,GAAM,YACJF,CAAAA,EAAY,YAAA,CAAaA,CAAU,CAAA,CACnCC,CAAAA,EAAc,aAAaA,CAAY,CAAA,CAAA,CAGzCC,IAAM,OAAA,EAAWb,GAAAA,CACZA,IAAaO,CAAAA,CAAI,KAAY,EAGlCM,CAAAA,GAAM,OAAA,EAAWhB,GAAWK,CAAAA,CACvBY,CAAAA,CAAUjB,EAAQK,CAAS,CAAC,EAGjCW,CAAAA,GAAM,SAAA,EAAaH,GAAY,EAAKd,GAAAA,CAC/BkB,EAAUlB,GAAAA,EAAW,EAIvB,QAAA,CAAS,aAAA,CAAc,eAAe,CAC/C,CACF,CAAC,CACH","file":"chunk-SXYPAP4B.js","sourcesContent":["/**\n * defineAsyncComponent — lazy component loading.\n *\n * Wraps a dynamic import() into a component that shows a loading\n * state while the chunk downloads, an error state if it fails,\n * and the real component once resolved.\n *\n * ```ts\n * const LazyChart = defineAsyncComponent(() => import('./Chart.akash'));\n *\n * // With loading/error:\n * const LazyChart = defineAsyncComponent({\n * loader: () => import('./Chart.akash'),\n * loading: () => <Spinner />,\n * error: (err) => <p>Failed: {err.message}</p>,\n * timeout: 10000,\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Types ---\n\nexport type AsyncComponentLoader<P extends Record<string, unknown> = any> =\n () => Promise<{ default: Component<P> }>;\n\nexport interface AsyncComponentOptions<P extends Record<string, unknown> = any> {\n /** The async loader function (dynamic import) */\n loader: AsyncComponentLoader<P>;\n /** Component to show while loading */\n loading?: () => AkashNode;\n /** Component to show on error */\n error?: (error: Error) => AkashNode;\n /** Timeout in ms — show error after this (default: none) */\n timeout?: number;\n /** Delay in ms before showing loading state (default: 200) */\n delay?: number;\n}\n\n// --- defineAsyncComponent ---\n\n/**\n * Define a component that loads asynchronously via dynamic import.\n */\nexport function defineAsyncComponent<P extends Record<string, unknown> = any>(\n loaderOrOptions: AsyncComponentLoader<P> | AsyncComponentOptions<P>,\n): Component<P> {\n const options: AsyncComponentOptions<P> =\n typeof loaderOrOptions === 'function'\n ? { loader: loaderOrOptions }\n : loaderOrOptions;\n\n const {\n loader,\n loading: loadingFn,\n error: errorFn,\n timeout,\n delay = 200,\n } = options;\n\n // Cache the loaded component\n let resolvedComp: Component<P> | null = null;\n let loadPromise: Promise<void> | null = null;\n let loadError: Error | null = null;\n\n function startLoad(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n loadPromise = loader()\n .then((mod) => {\n resolvedComp = mod.default;\n })\n .catch((err) => {\n loadError = err instanceof Error ? err : new Error(String(err));\n });\n\n return loadPromise;\n }\n\n return defineComponent<P>((ctx) => {\n const state = signal<'loading' | 'ready' | 'error'>('loading');\n const showLoading = signal(false);\n\n // Start loading\n startLoad().then(() => {\n if (loadError) {\n state.set('error');\n } else {\n state.set('ready');\n }\n });\n\n // Delay before showing loading indicator\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\n if (delay > 0) {\n delayTimer = setTimeout(() => showLoading.set(true), delay);\n } else {\n showLoading.set(true);\n }\n\n // Timeout\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (timeout) {\n timeoutTimer = setTimeout(() => {\n if (state() === 'loading') {\n loadError = new Error(`Async component timed out after ${timeout}ms`);\n state.set('error');\n }\n }, timeout);\n }\n\n return () => {\n const s = state();\n\n // Clear timers once resolved\n if (s !== 'loading') {\n if (delayTimer) clearTimeout(delayTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n }\n\n if (s === 'ready' && resolvedComp) {\n return resolvedComp(ctx.props as any);\n }\n\n if (s === 'error' && errorFn && loadError) {\n return nodeToDOM(errorFn(loadError));\n }\n\n if (s === 'loading' && showLoading() && loadingFn) {\n return nodeToDOM(loadingFn());\n }\n\n // Nothing to show yet\n return document.createComment('async-loading');\n };\n });\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c}from'./chunk-YXKQTEPR.js';var p=typeof requestAnimationFrame=="function"?requestAnimationFrame:e=>setTimeout(()=>e(Date.now()),16),g=typeof cancelAnimationFrame=="function"?cancelAnimationFrame:e=>clearTimeout(e),S={linear:e=>e,cubicIn:e=>e*e*e,cubicOut:e=>1-Math.pow(1-e,3),cubicInOut:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,quadIn:e=>e*e,quadOut:e=>1-(1-e)*(1-e),quintOut:e=>1-Math.pow(1-e,5),bounceOut:e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,elasticOut:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1};function A(e,r,o){return typeof e=="number"&&typeof r=="number"?e+(r-e)*o:o<.5?e:r}function k(e,r={}){let{duration:o=400,easing:w=S.cubicOut,interpolate:y=A,delay:O=0}=r,a=c(e),m=c(e),i=0,n=false,u=(()=>a());return u.set=(t,s)=>{let f=s?.duration??o,I=s?.easing??w,h=s?.interpolate??y,M=s?.delay??O,P=a();return m.set(t),f===0?(a.set(t),Promise.resolve()):(n&&(g(i),n=false),new Promise(l=>{let x=performance.now()+M;n=true;function c(F){if(!n){l();return}let d=F-x;if(d<0){i=p(c);return}let b=Math.min(d/f,1),q=I(b);a.set(h(P,t,q)),b<1?i=p(c):(n=false,l());}i=p(c);}))},u.setImmediate=t=>{n&&(g(i),n=false),a.set(t),m.set(t);},u.target=()=>m(),u}export{S as a,k as b};//# sourceMappingURL=chunk-T2RVAQEU.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-T2RVAQEU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tweened.ts"],"names":["raf","fn","caf","id","easings","t","defaultInterpolate","from","to","tweened","initialValue","options","duration","easing","interpolate","delay","current","signal","targetValue","rafId","running","read","value","overrides","dur","ease","interp","del","resolve","start","tick","now","elapsed","easedT"],"mappings":"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","file":"chunk-T2RVAQEU.js","sourcesContent":["/**\n * Tweened values — smooth interpolation between states.\n *\n * Unlike signals that update instantly, tweened values animate\n * smoothly from old to new over a duration.\n *\n * ```ts\n * const progress = tweened(0, { duration: 400 });\n * progress.set(100); // smoothly animates 0 → 100 over 400ms\n * progress(); // intermediate values during animation\n *\n * const color = tweened('#ff0000', { duration: 300, interpolate: lerpColor });\n * ```\n */\n\n// Fallback for non-browser environments (Node.js, SSR)\nconst raf = typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (fn: (t: number) => void) => setTimeout(() => fn(Date.now()), 16) as unknown as number;\nconst caf = typeof cancelAnimationFrame === 'function'\n ? cancelAnimationFrame\n : (id: number) => clearTimeout(id);\n\nimport { signal } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type Interpolator<T> = (from: T, to: T, t: number) => T;\n\nexport type EasingFn = (t: number) => number;\n\nexport interface TweenedOptions<T> {\n /** Duration in ms (default: 400) */\n duration?: number;\n /** Easing function (default: cubicOut) */\n easing?: EasingFn;\n /** Custom interpolation function */\n interpolate?: Interpolator<T>;\n /** Delay before animation starts */\n delay?: number;\n}\n\nexport interface TweenedSignal<T> {\n /** Read current (animated) value */\n (): T;\n /** Set new target — animates from current to new */\n set(value: T, opts?: Partial<TweenedOptions<T>>): Promise<void>;\n /** Set immediately without animation */\n setImmediate(value: T): void;\n /** Current target value */\n target: () => T;\n}\n\n// =========================================================================\n// Built-in easing functions\n// =========================================================================\n\nexport const easings = {\n linear: (t: number) => t,\n cubicIn: (t: number) => t * t * t,\n cubicOut: (t: number) => 1 - Math.pow(1 - t, 3),\n cubicInOut: (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,\n quadIn: (t: number) => t * t,\n quadOut: (t: number) => 1 - (1 - t) * (1 - t),\n quintOut: (t: number) => 1 - Math.pow(1 - t, 5),\n bounceOut: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t;\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n },\n elasticOut: (t: number) => {\n if (t === 0 || t === 1) return t;\n return Math.pow(2, -10 * t) * Math.sin((t - 0.1) * 5 * Math.PI) + 1;\n },\n} as const;\n\n// =========================================================================\n// Default interpolators\n// =========================================================================\n\nfunction defaultInterpolate<T>(from: T, to: T, t: number): T {\n if (typeof from === 'number' && typeof to === 'number') {\n return (from + (to - from) * t) as T;\n }\n // For non-numbers, snap at halfway\n return t < 0.5 ? from : to;\n}\n\n// =========================================================================\n// tweened()\n// =========================================================================\n\n/**\n * Create a tweened signal that animates between values.\n *\n * ```ts\n * const count = tweened(0, { duration: 300, easing: easings.cubicOut });\n * count.set(100); // smoothly goes 0 → 100\n * count(); // current interpolated value\n * ```\n */\nexport function tweened<T>(\n initialValue: T,\n options: TweenedOptions<T> = {},\n): TweenedSignal<T> {\n const {\n duration = 400,\n easing = easings.cubicOut,\n interpolate = defaultInterpolate,\n delay = 0,\n } = options;\n\n const current = signal<T>(initialValue);\n const targetValue = signal<T>(initialValue);\n let rafId = 0;\n let running = false;\n\n const read = (() => current()) as TweenedSignal<T>;\n\n read.set = (value: T, overrides?: Partial<TweenedOptions<T>>): Promise<void> => {\n const dur = overrides?.duration ?? duration;\n const ease = overrides?.easing ?? easing;\n const interp = overrides?.interpolate ?? interpolate;\n const del = overrides?.delay ?? delay;\n\n const from = current();\n targetValue.set(value);\n\n if (dur === 0) {\n current.set(value);\n return Promise.resolve();\n }\n\n // Cancel any running animation\n if (running) {\n caf(rafId);\n running = false;\n }\n\n return new Promise<void>((resolve) => {\n const start = performance.now() + del;\n running = true;\n\n function tick(now: number): void {\n if (!running) { resolve(); return; }\n\n const elapsed = now - start;\n if (elapsed < 0) {\n rafId = raf(tick);\n return;\n }\n\n const t = Math.min(elapsed / dur, 1);\n const easedT = ease(t);\n current.set(interp(from, value, easedT));\n\n if (t < 1) {\n rafId = raf(tick);\n } else {\n running = false;\n resolve();\n }\n }\n\n rafId = raf(tick);\n });\n };\n\n read.setImmediate = (value: T): void => {\n if (running) { caf(rafId); running = false; }\n current.set(value);\n targetValue.set(value);\n };\n\n read.target = () => targetValue();\n\n return read;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var I=0;function g(e){return {_type:"provider",factory:e.factory,providedIn:e.providedIn,multi:e.multi,_id:Symbol(`provider-${++I}`)}}var i=new Map;function y(e=[],r){let s=new Map,u=new Map,a=new Map;for(let t of e)a.set(t.provide._id,t);let d={get(t){let n=t._id;if(t.multi){if(u.has(n))return u.get(n);let o=[],c=a.get(n);if(c?.useFactory?o.push(c.useFactory()):c?.useValue!==void 0&&o.push(c.useValue),r?.has(t)){let v=r.get(t);Array.isArray(v)&&o.push(...v);}return u.set(n,o),o}if(s.has(n))return s.get(n);if(t.providedIn==="root"&&i.has(n))return i.get(n);let T=a.get(n);if(T){let o=p(T,d);return s.set(n,o),o}if(r)return r.get(t);let l=t.factory();return t.providedIn==="root"?i.set(n,l):s.set(n,l),l},has(t){return s.has(t._id)||a.has(t._id)||t.providedIn==="root"&&i.has(t._id)?true:r?r.has(t):false},createChild(t){return y(t??[],d)},dispose(){s.clear(),u.clear();}};return d}function p(e,r){return e.useValue!==void 0?e.useValue:e.useFactory?e.useFactory():e.useExisting?r.get(e.useExisting):e.provide.factory()}var f=null;function P(e){let r=f;return f=e,r}function m(e){if(!f){if(e.providedIn==="root"){if(i.has(e._id))return i.get(e._id);let r=e.factory();return i.set(e._id,r),r}return e.factory()}return f.get(e)}function h(){i.clear();}exports.a=g;exports.b=y;exports.c=P;exports.d=m;exports.e=h;//# sourceMappingURL=chunk-T7A5YOEG.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-T7A5YOEG.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/di.ts"],"names":["providerIdCounter","defineProvider","config","rootInstances","createInjector","providers","parent","instances","multiInstances","registrations","reg","injector","provider","id","values","parentValues","instance","resolveRegistration","childProviders","currentInjector","setCurrentInjector","prev","injectProvider","clearProviders"],"mappings":"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","file":"chunk-T7A5YOEG.cjs","sourcesContent":["/**\n * Hierarchical Dependency Injection.\n *\n * Extends the basic provide/inject with multi-level injectors,\n * provider factories, tree-shakable providers, and multi-providers.\n *\n * ```ts\n * // Define a provider with factory\n * const ApiService = defineProvider({\n * factory: () => createHttpClient({ baseUrl: '/api' }),\n * });\n *\n * // Tree-shakable provider (only bundled if injected)\n * const Logger = defineProvider({\n * factory: () => new ConsoleLogger(),\n * providedIn: 'root',\n * });\n *\n * // Use in component\n * const api = injectProvider(ApiService);\n * ```\n */\n\nimport { signal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface ProviderDef<T> {\n _type: 'provider';\n factory: () => T;\n providedIn?: 'root' | 'component';\n multi?: boolean;\n _id: symbol;\n}\n\nexport interface Injector {\n /** Get a provider value */\n get<T>(provider: ProviderDef<T>): T;\n /** Check if a provider is registered */\n has(provider: ProviderDef<unknown>): boolean;\n /** Create a child injector */\n createChild(providers?: ProviderRegistration[]): Injector;\n /** Dispose this injector and all cached instances */\n dispose(): void;\n}\n\nexport interface ProviderRegistration<T = unknown> {\n provide: ProviderDef<T>;\n useFactory?: () => T;\n useValue?: T;\n useExisting?: ProviderDef<T>;\n multi?: boolean;\n}\n\n// =========================================================================\n// defineProvider\n// =========================================================================\n\nlet providerIdCounter = 0;\n\n/**\n * Define a typed provider.\n *\n * ```ts\n * const DatabaseService = defineProvider({\n * factory: () => new Database(config),\n * providedIn: 'root', // singleton, tree-shakable\n * });\n * ```\n */\nexport function defineProvider<T>(config: {\n factory: () => T;\n providedIn?: 'root' | 'component';\n multi?: boolean;\n}): ProviderDef<T> {\n return {\n _type: 'provider',\n factory: config.factory,\n providedIn: config.providedIn,\n multi: config.multi,\n _id: Symbol(`provider-${++providerIdCounter}`),\n };\n}\n\n// =========================================================================\n// Injector implementation\n// =========================================================================\n\nconst rootInstances = new Map<symbol, unknown>();\n\n/**\n * Create an injector with hierarchical resolution.\n *\n * ```ts\n * const injector = createInjector([\n * { provide: ApiService, useFactory: () => new MockApi() },\n * { provide: Logger, useValue: console },\n * ]);\n *\n * const api = injector.get(ApiService);\n * ```\n */\nexport function createInjector(\n providers: ProviderRegistration[] = [],\n parent?: Injector,\n): Injector {\n const instances = new Map<symbol, unknown>();\n const multiInstances = new Map<symbol, unknown[]>();\n const registrations = new Map<symbol, ProviderRegistration>();\n\n // Register providers\n for (const reg of providers) {\n registrations.set(reg.provide._id, reg);\n }\n\n const injector: Injector = {\n get<T>(provider: ProviderDef<T>): T {\n const id = provider._id;\n\n // Multi-provider\n if (provider.multi) {\n if (multiInstances.has(id)) return multiInstances.get(id) as T;\n const values: unknown[] = [];\n const reg = registrations.get(id);\n if (reg?.useFactory) values.push(reg.useFactory());\n else if (reg?.useValue !== undefined) values.push(reg.useValue);\n if (parent?.has(provider)) {\n const parentValues = parent.get(provider);\n if (Array.isArray(parentValues)) values.push(...parentValues);\n }\n multiInstances.set(id, values);\n return values as T;\n }\n\n // Check local cache\n if (instances.has(id)) return instances.get(id) as T;\n\n // Check root singleton\n if (provider.providedIn === 'root' && rootInstances.has(id)) {\n return rootInstances.get(id) as T;\n }\n\n // Check local registrations\n const reg = registrations.get(id);\n if (reg) {\n const instance = resolveRegistration(reg, injector);\n instances.set(id, instance);\n return instance as T;\n }\n\n // Check parent\n if (parent) {\n return parent.get(provider);\n }\n\n // Use default factory\n const instance = provider.factory();\n\n // Cache at appropriate level\n if (provider.providedIn === 'root') {\n rootInstances.set(id, instance);\n } else {\n instances.set(id, instance);\n }\n\n return instance;\n },\n\n has(provider: ProviderDef<unknown>): boolean {\n if (instances.has(provider._id)) return true;\n if (registrations.has(provider._id)) return true;\n if (provider.providedIn === 'root' && rootInstances.has(provider._id)) return true;\n if (parent) return parent.has(provider);\n return false;\n },\n\n createChild(childProviders?: ProviderRegistration[]): Injector {\n return createInjector(childProviders ?? [], injector);\n },\n\n dispose() {\n instances.clear();\n multiInstances.clear();\n },\n };\n\n return injector;\n}\n\nfunction resolveRegistration(reg: ProviderRegistration, injector: Injector): unknown {\n if (reg.useValue !== undefined) return reg.useValue;\n if (reg.useFactory) return reg.useFactory();\n if (reg.useExisting) return injector.get(reg.useExisting);\n return reg.provide.factory();\n}\n\n// =========================================================================\n// Component-level injection helpers\n// =========================================================================\n\nlet currentInjector: Injector | null = null;\n\n/**\n * Set the current injector (called by component setup).\n * @internal\n */\nexport function setCurrentInjector(injector: Injector | null): Injector | null {\n const prev = currentInjector;\n currentInjector = injector;\n return prev;\n}\n\n/**\n * Inject a provider in the current component context.\n *\n * ```ts\n * const api = injectProvider(ApiService);\n * ```\n */\nexport function injectProvider<T>(provider: ProviderDef<T>): T {\n if (!currentInjector) {\n // Fallback to root or create new instance\n if (provider.providedIn === 'root') {\n if (rootInstances.has(provider._id)) {\n return rootInstances.get(provider._id) as T;\n }\n const instance = provider.factory();\n rootInstances.set(provider._id, instance);\n return instance;\n }\n return provider.factory();\n }\n return currentInjector.get(provider);\n}\n\n/**\n * Clear root provider instances (useful for testing).\n */\nexport function clearProviders(): void {\n rootInstances.clear();\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var L=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])',"[contenteditable]"].join(", ");function A(e,r={}){let{initialFocus:t,returnFocus:l=true,escapeDeactivates:d=true,allowOutsideClick:f=false,onDeactivate:n}=r,o=chunkWOZWFMOK_cjs.c(false),c=null;function a(){return typeof e=="function"?e():e}function u(){let i=a();return i?Array.from(i.querySelectorAll(L)):[]}function m(i){if(i.key==="Escape"&&d){i.preventDefault(),b(),n?.();return}if(i.key!=="Tab")return;let s=u();if(s.length===0)return;let p=s[0],v=s[s.length-1];i.shiftKey?document.activeElement===p&&(i.preventDefault(),v.focus()):document.activeElement===v&&(i.preventDefault(),p.focus());}function y(i){if(!o()||f)return;let s=a();if(!s)return;let p=i.relatedTarget;if(p&&!s.contains(p)){let v=u();v.length>0&&v[0].focus();}}function h(){if(o())return;o.set(true),c=document.activeElement,document.addEventListener("keydown",m,true);let i=a();i&&i.addEventListener("focusout",y),requestAnimationFrame(()=>{if(t)(typeof t=="string"?a()?.querySelector(t):t)?.focus();else {let s=u();s.length>0&&s[0].focus();}});}function b(){if(!o())return;o.set(false),document.removeEventListener("keydown",m,true);let i=a();i&&i.removeEventListener("focusout",y),l&&c&&(c.focus(),c=null);}return {activate:h,deactivate:b,active:()=>o()}}var g=null;function K(){if(g&&document.body.contains(g))return g;let e=document.createElement("div");return e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),e.style.cssText=["position: absolute","width: 1px","height: 1px","padding: 0","margin: -1px","overflow: hidden","clip: rect(0,0,0,0)","white-space: nowrap","border: 0"].join("; "),document.body.appendChild(e),g=e,e}function k(){return (e,r="polite")=>{if(typeof document>"u")return;let t=K();t.setAttribute("aria-live",r),t.textContent="",requestAnimationFrame(()=>{t.textContent=e;});}}function w(){let e=[],r=new Set,t=false;function l(n){for(let o of e)if(!(o.scope&&!r.has(o.scope))&&T(n,o.key)){o.preventDefault!==false&&n.preventDefault(),o.handler(n);return}}function d(){t||typeof document>"u"||(document.addEventListener("keydown",l),t=true);}function f(n,o,c){let a={key:n,handler:o,scope:c?.scope,description:c?.description??"",preventDefault:c?.preventDefault};return e.push(a),d(),()=>{let u=e.indexOf(a);u!==-1&&e.splice(u,1);}}return {bind:f,enableScope(n){r.add(n);},disableScope(n){r.delete(n);},getBindings(){return e.map(n=>({key:M(n.key),description:n.description??"",scope:n.scope}))},dispose(){e.length=0,typeof document<"u"&&document.removeEventListener("keydown",l),t=false;}}}function T(e,r){let t=r.toLowerCase().split("+"),l=t.pop(),d=t.includes("mod"),f=t.includes("ctrl"),n=t.includes("shift"),o=t.includes("alt"),a=typeof navigator<"u"&&navigator.platform?.includes("Mac")?e.metaKey:e.ctrlKey;return d&&!a||f&&!e.ctrlKey||n&&!e.shiftKey||o&&!e.altKey?false:e.key.toLowerCase()===l||e.code.toLowerCase()===l}function M(e){let r=typeof navigator<"u"&&navigator.platform?.includes("Mac");return e.replace(/mod/gi,r?"\u2318":"Ctrl").replace(/shift/gi,r?"\u21E7":"Shift").replace(/alt/gi,r?"\u2325":"Alt").replace(/\+/g,r?"":"+")}exports.a=A;exports.b=k;exports.c=w;//# sourceMappingURL=chunk-TDKDZ3QJ.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-TDKDZ3QJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/a11y.ts"],"names":["FOCUSABLE_SELECTOR","useFocusTrap","container","options","initialFocus","returnFocus","escapeDeactivates","allowOutsideClick","onDeactivate","active","signal","previouslyFocused","getContainer","getFocusableElements","el","handleKeyDown","e","deactivate","focusable","first","last","handleFocusOut","relatedTarget","activate","announceRegion","ensureAnnounceRegion","useAnnounce","message","politeness","region","useKeyboard","bindings","activeScopes","listening","binding","matchesKey","startListening","bind","key","handler","idx","scope","b","formatKeyCombo","combo","parts","needsMod","needsCtrl","needsShift","needsAlt","modPressed","isMac"],"mappings":"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","file":"chunk-TDKDZ3QJ.cjs","sourcesContent":["/**\n * Accessibility composables.\n *\n * Built-in a11y primitives that no other framework ships natively.\n * Focus management, screen reader announcements, and keyboard shortcuts.\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// useFocusTrap\n// =========================================================================\n\nexport interface FocusTrapOptions {\n /** CSS selector or element to focus initially (default: first focusable) */\n initialFocus?: string | HTMLElement;\n /** Return focus to the previously focused element on deactivate */\n returnFocus?: boolean;\n /** Escape key deactivates the trap (default: true) */\n escapeDeactivates?: boolean;\n /** Allow clicks outside the trap container (default: false) */\n allowOutsideClick?: boolean;\n /** Callback when Escape deactivates */\n onDeactivate?: () => void;\n}\n\nexport interface FocusTrap {\n /** Activate the focus trap */\n activate(): void;\n /** Deactivate the focus trap */\n deactivate(): void;\n /** Whether the trap is currently active */\n active: ReadonlySignal<boolean>;\n}\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]', 'button:not([disabled])', 'input:not([disabled])',\n 'select:not([disabled])', 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])', '[contenteditable]',\n].join(', ');\n\n/**\n * Trap focus inside a container element.\n *\n * ```ts\n * const trap = useFocusTrap(dialogRef, {\n * initialFocus: '#first-input',\n * returnFocus: true,\n * escapeDeactivates: true,\n * });\n * trap.activate(); // on open\n * trap.deactivate(); // on close\n * ```\n */\nexport function useFocusTrap(\n container: HTMLElement | (() => HTMLElement | null),\n options: FocusTrapOptions = {},\n): FocusTrap {\n const {\n initialFocus,\n returnFocus = true,\n escapeDeactivates = true,\n allowOutsideClick = false,\n onDeactivate,\n } = options;\n\n const active = signal(false);\n let previouslyFocused: HTMLElement | null = null;\n\n function getContainer(): HTMLElement | null {\n return typeof container === 'function' ? container() : container;\n }\n\n function getFocusableElements(): HTMLElement[] {\n const el = getContainer();\n if (!el) return [];\n return Array.from(el.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n }\n\n function handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape' && escapeDeactivates) {\n e.preventDefault();\n deactivate();\n onDeactivate?.();\n return;\n }\n\n if (e.key !== 'Tab') return;\n\n const focusable = getFocusableElements();\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n // Shift+Tab: wrap from first to last\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n // Tab: wrap from last to first\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n function handleFocusOut(e: FocusEvent): void {\n if (!active() || allowOutsideClick) return;\n const el = getContainer();\n if (!el) return;\n\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n if (relatedTarget && !el.contains(relatedTarget)) {\n // Focus escaped — pull it back\n const focusable = getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }\n }\n\n function activate(): void {\n if (active()) return;\n active.set(true);\n\n previouslyFocused = document.activeElement as HTMLElement | null;\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n const el = getContainer();\n if (el) {\n el.addEventListener('focusout', handleFocusOut);\n }\n\n // Focus the initial element\n requestAnimationFrame(() => {\n if (initialFocus) {\n const target = typeof initialFocus === 'string'\n ? getContainer()?.querySelector<HTMLElement>(initialFocus)\n : initialFocus;\n target?.focus();\n } else {\n const focusable = getFocusableElements();\n if (focusable.length > 0) focusable[0].focus();\n }\n });\n }\n\n function deactivate(): void {\n if (!active()) return;\n active.set(false);\n\n document.removeEventListener('keydown', handleKeyDown, true);\n\n const el = getContainer();\n if (el) {\n el.removeEventListener('focusout', handleFocusOut);\n }\n\n if (returnFocus && previouslyFocused) {\n previouslyFocused.focus();\n previouslyFocused = null;\n }\n }\n\n return {\n activate,\n deactivate,\n active: () => active(),\n };\n}\n\n// =========================================================================\n// useAnnounce\n// =========================================================================\n\nexport type AriaLive = 'polite' | 'assertive' | 'off';\n\nlet announceRegion: HTMLElement | null = null;\n\nfunction ensureAnnounceRegion(): HTMLElement {\n if (announceRegion && document.body.contains(announceRegion)) {\n return announceRegion;\n }\n\n const el = document.createElement('div');\n el.setAttribute('role', 'status');\n el.setAttribute('aria-live', 'polite');\n el.setAttribute('aria-atomic', 'true');\n el.style.cssText = [\n 'position: absolute',\n 'width: 1px',\n 'height: 1px',\n 'padding: 0',\n 'margin: -1px',\n 'overflow: hidden',\n 'clip: rect(0,0,0,0)',\n 'white-space: nowrap',\n 'border: 0',\n ].join('; ');\n\n document.body.appendChild(el);\n announceRegion = el;\n return el;\n}\n\n/**\n * Screen reader announcements via ARIA live regions.\n *\n * ```ts\n * const announce = useAnnounce();\n * announce('Page loaded: Dashboard');\n * announce('Error: Invalid email', 'assertive');\n * ```\n */\nexport function useAnnounce(): (message: string, politeness?: AriaLive) => void {\n return (message: string, politeness: AriaLive = 'polite') => {\n if (typeof document === 'undefined') return;\n\n const region = ensureAnnounceRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear then set to trigger announcement\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n };\n}\n\n// =========================================================================\n// useKeyboard\n// =========================================================================\n\nexport interface KeyBinding {\n /** Key combo: 'mod+k', 'Escape', 'ArrowDown', 'shift+Enter' */\n key: string;\n /** Handler function */\n handler: (e: KeyboardEvent) => void;\n /** Optional scope (only active when scope is enabled) */\n scope?: string;\n /** Description for help dialog */\n description?: string;\n /** Prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n}\n\nexport interface KeyboardManager {\n /** Register a binding */\n bind(key: string, handler: (e: KeyboardEvent) => void, options?: {\n scope?: string;\n description?: string;\n preventDefault?: boolean;\n }): () => void;\n /** Enable a scope */\n enableScope(scope: string): void;\n /** Disable a scope */\n disableScope(scope: string): void;\n /** Get all bindings (for help dialog) */\n getBindings(): Array<{ key: string; description: string; scope?: string }>;\n /** Dispose all bindings */\n dispose(): void;\n}\n\n/**\n * Keyboard shortcut manager with scope support.\n *\n * ```ts\n * const kb = useKeyboard();\n * kb.bind('mod+k', () => openSearch(), { description: 'Open search' });\n * kb.bind('Escape', () => close(), { scope: 'modal' });\n * kb.enableScope('modal');\n * ```\n */\nexport function useKeyboard(): KeyboardManager {\n const bindings: KeyBinding[] = [];\n const activeScopes = new Set<string>();\n let listening = false;\n\n function handleKeyDown(e: KeyboardEvent): void {\n for (const binding of bindings) {\n if (binding.scope && !activeScopes.has(binding.scope)) continue;\n if (matchesKey(e, binding.key)) {\n if (binding.preventDefault !== false) {\n e.preventDefault();\n }\n binding.handler(e);\n return;\n }\n }\n }\n\n function startListening(): void {\n if (listening) return;\n if (typeof document === 'undefined') return;\n document.addEventListener('keydown', handleKeyDown);\n listening = true;\n }\n\n function bind(\n key: string,\n handler: (e: KeyboardEvent) => void,\n options?: { scope?: string; description?: string; preventDefault?: boolean },\n ): () => void {\n const binding: KeyBinding = {\n key,\n handler,\n scope: options?.scope,\n description: options?.description ?? '',\n preventDefault: options?.preventDefault,\n };\n bindings.push(binding);\n startListening();\n\n return () => {\n const idx = bindings.indexOf(binding);\n if (idx !== -1) bindings.splice(idx, 1);\n };\n }\n\n return {\n bind,\n enableScope(scope: string) { activeScopes.add(scope); },\n disableScope(scope: string) { activeScopes.delete(scope); },\n getBindings() {\n return bindings.map((b) => ({\n key: formatKeyCombo(b.key),\n description: b.description ?? '',\n scope: b.scope,\n }));\n },\n dispose() {\n bindings.length = 0;\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handleKeyDown);\n }\n listening = false;\n },\n };\n}\n\n// --- Key matching ---\n\nfunction matchesKey(e: KeyboardEvent, combo: string): boolean {\n const parts = combo.toLowerCase().split('+');\n const key = parts.pop()!;\n\n const needsMod = parts.includes('mod');\n const needsCtrl = parts.includes('ctrl');\n const needsShift = parts.includes('shift');\n const needsAlt = parts.includes('alt');\n\n // mod = Cmd on Mac, Ctrl elsewhere\n const isMac = typeof navigator !== 'undefined' && navigator.platform?.includes('Mac');\n const modPressed = isMac ? e.metaKey : e.ctrlKey;\n\n if (needsMod && !modPressed) return false;\n if (needsCtrl && !e.ctrlKey) return false;\n if (needsShift && !e.shiftKey) return false;\n if (needsAlt && !e.altKey) return false;\n\n return e.key.toLowerCase() === key || e.code.toLowerCase() === key;\n}\n\nfunction formatKeyCombo(combo: string): string {\n const isMac = typeof navigator !== 'undefined' && navigator.platform?.includes('Mac');\n return combo\n .replace(/mod/gi, isMac ? '⌘' : 'Ctrl')\n .replace(/shift/gi, isMac ? '⇧' : 'Shift')\n .replace(/alt/gi, isMac ? '⌥' : 'Alt')\n .replace(/\\+/g, isMac ? '' : '+');\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function w(i){let P=typeof i=="function"?{loader:i}:i,{loader:C,loading:c,error:f,timeout:s,delay:y=200}=P,l=null,t=null,o=null;function A(){return t||(t=C().then(e=>{l=e.default;}).catch(e=>{o=e instanceof Error?e:new Error(String(e));}),t)}return chunkXWVNLE2W_cjs.s(e=>{let n=chunkWOZWFMOK_cjs.c("loading"),m=chunkWOZWFMOK_cjs.c(false);A().then(()=>{o?n.set("error"):n.set("ready");});let a=null;y>0?a=setTimeout(()=>m.set(true),y):m.set(true);let u=null;return s&&(u=setTimeout(()=>{n()==="loading"&&(o=new Error(`Async component timed out after ${s}ms`),n.set("error"));},s)),()=>{let r=n();return r!=="loading"&&(a&&clearTimeout(a),u&&clearTimeout(u)),r==="ready"&&l?l(e.props):r==="error"&&f&&o?chunkXWVNLE2W_cjs.l(f(o)):r==="loading"&&m()&&c?chunkXWVNLE2W_cjs.l(c()):document.createComment("async-loading")}})}exports.a=w;//# sourceMappingURL=chunk-TFEHO7SF.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-TFEHO7SF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/async-component.ts"],"names":["defineAsyncComponent","loaderOrOptions","options","loader","loadingFn","errorFn","timeout","delay","resolvedComp","loadPromise","loadError","startLoad","mod","err","defineComponent","ctx","state","signal","showLoading","delayTimer","timeoutTimer","s","nodeToDOM"],"mappings":"qHAiDO,SAASA,EACdC,CAAAA,CACc,CACd,IAAMC,CAAAA,CACJ,OAAOD,GAAoB,UAAA,CACvB,CAAE,OAAQA,CAAgB,CAAA,CAC1BA,EAEA,CACJ,MAAA,CAAAE,EACA,OAAA,CAASC,CAAAA,CACT,MAAOC,CAAAA,CACP,OAAA,CAAAC,EACA,KAAA,CAAAC,CAAAA,CAAQ,GACV,CAAA,CAAIL,CAAAA,CAGAM,EAAoC,IAAA,CACpCC,CAAAA,CAAoC,KACpCC,CAAAA,CAA0B,IAAA,CAE9B,SAASC,CAAAA,EAA2B,CAClC,OAAIF,CAAAA,GAEJA,CAAAA,CAAcN,GAAO,CAClB,IAAA,CAAMS,GAAQ,CACbJ,CAAAA,CAAeI,EAAI,QACrB,CAAC,EACA,KAAA,CAAOC,CAAAA,EAAQ,CACdH,CAAAA,CAAYG,CAAAA,YAAe,MAAQA,CAAAA,CAAM,IAAI,MAAM,MAAA,CAAOA,CAAG,CAAC,EAChE,CAAC,EAEIJ,CAAAA,CACT,CAEA,OAAOK,mBAAAA,CAAoBC,CAAAA,EAAQ,CACjC,IAAMC,CAAAA,CAAQC,oBAAsC,SAAS,CAAA,CACvDC,EAAcD,mBAAAA,CAAO,KAAK,EAGhCN,CAAAA,EAAU,CAAE,KAAK,IAAM,CACjBD,EACFM,CAAAA,CAAM,GAAA,CAAI,OAAO,CAAA,CAEjBA,CAAAA,CAAM,IAAI,OAAO,EAErB,CAAC,CAAA,CAGD,IAAIG,EAAmD,IAAA,CACnDZ,CAAAA,CAAQ,EACVY,CAAAA,CAAa,UAAA,CAAW,IAAMD,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAAGX,CAAK,EAE1DW,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAItB,IAAIE,EAAqD,IAAA,CACzD,OAAId,IACFc,CAAAA,CAAe,UAAA,CAAW,IAAM,CAC1BJ,CAAAA,KAAY,SAAA,GACdN,CAAAA,CAAY,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCJ,CAAO,CAAA,EAAA,CAAI,CAAA,CACpEU,EAAM,GAAA,CAAI,OAAO,GAErB,CAAA,CAAGV,CAAO,GAGL,IAAM,CACX,IAAMe,CAAAA,CAAIL,CAAAA,GAQV,OALIK,CAAAA,GAAM,YACJF,CAAAA,EAAY,YAAA,CAAaA,CAAU,CAAA,CACnCC,CAAAA,EAAc,aAAaA,CAAY,CAAA,CAAA,CAGzCC,IAAM,OAAA,EAAWb,CAAAA,CACZA,EAAaO,CAAAA,CAAI,KAAY,EAGlCM,CAAAA,GAAM,OAAA,EAAWhB,GAAWK,CAAAA,CACvBY,mBAAAA,CAAUjB,EAAQK,CAAS,CAAC,EAGjCW,CAAAA,GAAM,SAAA,EAAaH,GAAY,EAAKd,CAAAA,CAC/BkB,oBAAUlB,CAAAA,EAAW,EAIvB,QAAA,CAAS,aAAA,CAAc,eAAe,CAC/C,CACF,CAAC,CACH","file":"chunk-TFEHO7SF.cjs","sourcesContent":["/**\n * defineAsyncComponent — lazy component loading.\n *\n * Wraps a dynamic import() into a component that shows a loading\n * state while the chunk downloads, an error state if it fails,\n * and the real component once resolved.\n *\n * ```ts\n * const LazyChart = defineAsyncComponent(() => import('./Chart.akash'));\n *\n * // With loading/error:\n * const LazyChart = defineAsyncComponent({\n * loader: () => import('./Chart.akash'),\n * loading: () => <Spinner />,\n * error: (err) => <p>Failed: {err.message}</p>,\n * timeout: 10000,\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Types ---\n\nexport type AsyncComponentLoader<P extends Record<string, unknown> = any> =\n () => Promise<{ default: Component<P> }>;\n\nexport interface AsyncComponentOptions<P extends Record<string, unknown> = any> {\n /** The async loader function (dynamic import) */\n loader: AsyncComponentLoader<P>;\n /** Component to show while loading */\n loading?: () => AkashNode;\n /** Component to show on error */\n error?: (error: Error) => AkashNode;\n /** Timeout in ms — show error after this (default: none) */\n timeout?: number;\n /** Delay in ms before showing loading state (default: 200) */\n delay?: number;\n}\n\n// --- defineAsyncComponent ---\n\n/**\n * Define a component that loads asynchronously via dynamic import.\n */\nexport function defineAsyncComponent<P extends Record<string, unknown> = any>(\n loaderOrOptions: AsyncComponentLoader<P> | AsyncComponentOptions<P>,\n): Component<P> {\n const options: AsyncComponentOptions<P> =\n typeof loaderOrOptions === 'function'\n ? { loader: loaderOrOptions }\n : loaderOrOptions;\n\n const {\n loader,\n loading: loadingFn,\n error: errorFn,\n timeout,\n delay = 200,\n } = options;\n\n // Cache the loaded component\n let resolvedComp: Component<P> | null = null;\n let loadPromise: Promise<void> | null = null;\n let loadError: Error | null = null;\n\n function startLoad(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n loadPromise = loader()\n .then((mod) => {\n resolvedComp = mod.default;\n })\n .catch((err) => {\n loadError = err instanceof Error ? err : new Error(String(err));\n });\n\n return loadPromise;\n }\n\n return defineComponent<P>((ctx) => {\n const state = signal<'loading' | 'ready' | 'error'>('loading');\n const showLoading = signal(false);\n\n // Start loading\n startLoad().then(() => {\n if (loadError) {\n state.set('error');\n } else {\n state.set('ready');\n }\n });\n\n // Delay before showing loading indicator\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\n if (delay > 0) {\n delayTimer = setTimeout(() => showLoading.set(true), delay);\n } else {\n showLoading.set(true);\n }\n\n // Timeout\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (timeout) {\n timeoutTimer = setTimeout(() => {\n if (state() === 'loading') {\n loadError = new Error(`Async component timed out after ${timeout}ms`);\n state.set('error');\n }\n }, timeout);\n }\n\n return () => {\n const s = state();\n\n // Clear timers once resolved\n if (s !== 'loading') {\n if (delayTimer) clearTimeout(delayTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n }\n\n if (s === 'ready' && resolvedComp) {\n return resolvedComp(ctx.props as any);\n }\n\n if (s === 'error' && errorFn && loadError) {\n return nodeToDOM(errorFn(loadError));\n }\n\n if (s === 'loading' && showLoading() && loadingFn) {\n return nodeToDOM(loadingFn());\n }\n\n // Nothing to show yet\n return document.createComment('async-loading');\n };\n });\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {s,l}from'./chunk-KE7BJTCD.js';function a(t){return {enterFrom:`${t}-enter-from`,enterActive:`${t}-enter-active`,enterTo:`${t}-enter-to`,exitFrom:`${t}-exit-from`,exitActive:`${t}-exit-active`,exitTo:`${t}-exit-to`}}function d(t,e,i){return new Promise(r=>{t.classList.add(e.enterFrom,e.enterActive),t.offsetHeight,t.classList.remove(e.enterFrom),t.classList.add(e.enterTo);let n=()=>{t.classList.remove(e.enterActive,e.enterTo),t.removeEventListener("transitionend",n),r();};i!==void 0?setTimeout(n,i):(t.addEventListener("transitionend",n,{once:true}),setTimeout(n,5e3));})}function c(t,e,i){return new Promise(r=>{t.classList.add(e.exitFrom,e.exitActive),t.offsetHeight,t.classList.remove(e.exitFrom),t.classList.add(e.exitTo);let n=()=>{t.classList.remove(e.exitActive,e.exitTo),t.removeEventListener("transitionend",n),r();};i!==void 0?setTimeout(n,i):(t.addEventListener("transitionend",n,{once:true}),setTimeout(n,5e3));})}var f=s(t=>{let e=t.props.name??"akash",i=a(e);return ()=>{let r=document.createElement("div");if(r.style.display="contents",t.props.when){let n=l(t.children());r.appendChild(n),n instanceof HTMLElement&&(t.props.onEnter?.(n),d(n,i,t.props.duration).then(()=>{t.props.onAfterEnter?.(n);}));}return r}});function v(t,e={}){let{property:i="all",duration:r="0.3s",easing:n="ease"}=e;return `
|
|
2
|
+
.${t}-enter-active,
|
|
3
|
+
.${t}-exit-active {
|
|
4
|
+
transition: ${i} ${r} ${n};
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.${t}-enter-from,
|
|
8
|
+
.${t}-exit-to {
|
|
9
|
+
opacity: 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.${t}-enter-to,
|
|
13
|
+
.${t}-exit-from {
|
|
14
|
+
opacity: 1;
|
|
15
|
+
}
|
|
16
|
+
`.trim()}export{a,d as b,c,f as d,v as e};//# sourceMappingURL=chunk-TSFY5HKB.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-TSFY5HKB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transition.ts"],"names":["getTransitionClasses","name","enterTransition","el","classes","duration","resolve","onEnd","exitTransition","Transition","defineComponent","ctx","container","content","nodeToDOM","generateTransitionCSS","options","property","easing"],"mappings":"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","file":"chunk-TSFY5HKB.js","sourcesContent":["/**\n * Transition/Animation system.\n *\n * Provides CSS-based enter/exit transitions for elements.\n * Works with <Transition> component or programmatic API.\n *\n * Class naming convention (matches Vue/Svelte):\n * - `{name}-enter-from` — initial enter state\n * - `{name}-enter-active` — active enter transition\n * - `{name}-enter-to` — final enter state\n * - `{name}-exit-from` — initial exit state\n * - `{name}-exit-active` — active exit transition\n * - `{name}-exit-to` — final exit state\n */\n\nimport { defineComponent } from './component.js';\nimport { signal, effect } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// --- Types ---\n\nexport interface TransitionProps {\n /** Transition name (used as CSS class prefix) */\n name?: string;\n /** Duration in ms (overrides CSS transition duration) */\n duration?: number;\n /** Whether the content is shown */\n when: boolean;\n /** CSS transition mode */\n mode?: 'in-out' | 'out-in';\n /** Callback when enter transition starts */\n onEnter?: (el: HTMLElement) => void;\n /** Callback when enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Callback when exit transition starts */\n onExit?: (el: HTMLElement) => void;\n /** Callback when exit transition completes */\n onAfterExit?: (el: HTMLElement) => void;\n}\n\nexport interface TransitionClasses {\n enterFrom: string;\n enterActive: string;\n enterTo: string;\n exitFrom: string;\n exitActive: string;\n exitTo: string;\n}\n\n// --- CSS class helpers ---\n\n/**\n * Get the transition CSS class names for a given transition name.\n */\nexport function getTransitionClasses(name: string): TransitionClasses {\n return {\n enterFrom: `${name}-enter-from`,\n enterActive: `${name}-enter-active`,\n enterTo: `${name}-enter-to`,\n exitFrom: `${name}-exit-from`,\n exitActive: `${name}-exit-active`,\n exitTo: `${name}-exit-to`,\n };\n}\n\n// --- Programmatic transition API ---\n\n/**\n * Run an enter transition on an element.\n * Returns a promise that resolves when the transition completes.\n */\nexport function enterTransition(\n el: HTMLElement,\n classes: TransitionClasses,\n duration?: number,\n): Promise<void> {\n return new Promise((resolve) => {\n // Apply initial state\n el.classList.add(classes.enterFrom, classes.enterActive);\n\n // Force reflow to ensure the initial state is applied\n void el.offsetHeight;\n\n // Transition to final state\n el.classList.remove(classes.enterFrom);\n el.classList.add(classes.enterTo);\n\n const onEnd = () => {\n el.classList.remove(classes.enterActive, classes.enterTo);\n el.removeEventListener('transitionend', onEnd);\n resolve();\n };\n\n if (duration !== undefined) {\n setTimeout(onEnd, duration);\n } else {\n el.addEventListener('transitionend', onEnd, { once: true });\n // Fallback timeout in case transitionend never fires\n setTimeout(onEnd, 5000);\n }\n });\n}\n\n/**\n * Run an exit transition on an element.\n * Returns a promise that resolves when the transition completes.\n */\nexport function exitTransition(\n el: HTMLElement,\n classes: TransitionClasses,\n duration?: number,\n): Promise<void> {\n return new Promise((resolve) => {\n el.classList.add(classes.exitFrom, classes.exitActive);\n\n void el.offsetHeight;\n\n el.classList.remove(classes.exitFrom);\n el.classList.add(classes.exitTo);\n\n const onEnd = () => {\n el.classList.remove(classes.exitActive, classes.exitTo);\n el.removeEventListener('transitionend', onEnd);\n resolve();\n };\n\n if (duration !== undefined) {\n setTimeout(onEnd, duration);\n } else {\n el.addEventListener('transitionend', onEnd, { once: true });\n setTimeout(onEnd, 5000);\n }\n });\n}\n\n// --- <Transition> component ---\n\n/**\n * <Transition> component.\n *\n * Applies CSS enter/exit transitions when `when` changes.\n *\n * ```html\n * <Transition name=\"fade\" when={isVisible()}>\n * <div>Content</div>\n * </Transition>\n * ```\n *\n * CSS:\n * ```css\n * .fade-enter-active, .fade-exit-active {\n * transition: opacity 0.3s;\n * }\n * .fade-enter-from, .fade-exit-to {\n * opacity: 0;\n * }\n * ```\n */\nexport const Transition = defineComponent<TransitionProps>((ctx) => {\n const name = ctx.props.name ?? 'akash';\n const classes = getTransitionClasses(name);\n\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n if (ctx.props.when) {\n const content = nodeToDOM(ctx.children());\n container.appendChild(content);\n\n // Run enter transition on mount\n if (content instanceof HTMLElement) {\n ctx.props.onEnter?.(content);\n enterTransition(content, classes, ctx.props.duration).then(() => {\n ctx.props.onAfterEnter?.(content);\n });\n }\n }\n\n return container;\n };\n});\n\n// --- Preset transition styles ---\n\n/**\n * Generate CSS for common transition presets.\n * Inject this into your app's styles or use the CLI to generate it.\n */\nexport function generateTransitionCSS(name: string, options: {\n property?: string;\n duration?: string;\n easing?: string;\n} = {}): string {\n const {\n property = 'all',\n duration = '0.3s',\n easing = 'ease',\n } = options;\n\n return `\n.${name}-enter-active,\n.${name}-exit-active {\n transition: ${property} ${duration} ${easing};\n}\n\n.${name}-enter-from,\n.${name}-exit-to {\n opacity: 0;\n}\n\n.${name}-enter-to,\n.${name}-exit-from {\n opacity: 1;\n}\n`.trim();\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkIQGSDFBI_cjs=require('./chunk-IQGSDFBI.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function g(o,e,r,n){let c=[],d=chunkIQGSDFBI_cjs.c(),N=chunkWOZWFMOK_cjs.e(()=>{let s=String(r());for(let t of c)t.parentNode&&t.parentNode.removeChild(t);c=[];let i=n[s]??n._default,a=e.parentNode;if(i&&a){let t=d?chunkIQGSDFBI_cjs.d(d,i):i(),f=t instanceof DocumentFragment?Array.from(t.childNodes):[t];for(let k of f)a.insertBefore(k,e);c=f;}},{render:true});return ()=>{N();for(let s of c)s.parentNode&&s.parentNode.removeChild(s);}}var y=chunkXWVNLE2W_cjs.s(o=>()=>{let e=document.createElement("div");e.style.display="contents";let r=document.createComment("switch");e.appendChild(r);let n={...o.props.cases};return o.props.fallback&&(n._default=()=>chunkXWVNLE2W_cjs.l(o.props.fallback())),g(e,r,()=>o.props.on,Object.fromEntries(Object.entries(n).map(([c,d])=>[c,()=>chunkXWVNLE2W_cjs.l(d())]))),e});function C(o,e){let r=String(o),n=e[r]??e._;return n?n(o):void 0}exports.a=g;exports.b=y;exports.c=C;//# sourceMappingURL=chunk-TYTEJYUQ.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-TYTEJYUQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/switch.ts"],"names":["renderSwitch","parent","anchor","expression","cases","currentNodes","scope","getCurrentScope","dispose","effect","value","node","branch","liveParent","runInScope","nodes","n","Switch","defineComponent","ctx","container","casesMap","nodeToDOM","k","v","match","key"],"mappings":"uKAsCO,SAASA,CAAAA,CACdC,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACY,CACZ,IAAIC,CAAAA,CAAuB,EAAC,CAGtBC,CAAAA,CAAQC,qBAAgB,CAExBC,CAAAA,CAAUC,oBACd,IAAM,CACJ,IAAMC,CAAAA,CAAQ,MAAA,CAAOP,CAAAA,EAAY,CAAA,CAGjC,IAAA,IAAWQ,KAAQN,CAAAA,CACbM,CAAAA,CAAK,YAAYA,CAAAA,CAAK,UAAA,CAAW,YAAYA,CAAI,CAAA,CAEvDN,CAAAA,CAAe,EAAC,CAGhB,IAAMO,EAASR,CAAAA,CAAMM,CAAK,GAAKN,CAAAA,CAAM,QAAA,CAC/BS,EAAaX,CAAAA,CAAO,UAAA,CAC1B,GAAIU,CAAAA,EAAUC,CAAAA,CAAY,CACxB,IAAMF,CAAAA,CAAOL,CAAAA,CAAQQ,oBAAWR,CAAAA,CAAOM,CAAM,EAAIA,CAAAA,EAAO,CAClDG,CAAAA,CAAQJ,CAAAA,YAAgB,gBAAA,CAC1B,KAAA,CAAM,KAAKA,CAAAA,CAAK,UAAU,EAC1B,CAACA,CAAI,EACT,IAAA,IAAWK,CAAAA,IAAKD,CAAAA,CACdF,CAAAA,CAAW,YAAA,CAAaG,CAAAA,CAAGd,CAAM,CAAA,CAEnCG,CAAAA,CAAeU,EACjB,CACF,CAAA,CACA,CAAE,MAAA,CAAQ,IAAK,CACjB,CAAA,CAEA,OAAO,IAAM,CACXP,CAAAA,EAAQ,CACR,QAAWG,CAAAA,IAAQN,CAAAA,CACbM,EAAK,UAAA,EAAYA,CAAAA,CAAK,UAAA,CAAW,WAAA,CAAYA,CAAI,EAEzD,CACF,CA8BO,IAAMM,EAASC,mBAAAA,CAA8BC,CAAAA,EAC3C,IAAM,CACX,IAAMC,CAAAA,CAAY,QAAA,CAAS,aAAA,CAAc,KAAK,EAC9CA,CAAAA,CAAU,KAAA,CAAM,QAAU,UAAA,CAC1B,IAAMlB,EAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CkB,CAAAA,CAAU,WAAA,CAAYlB,CAAM,CAAA,CAE5B,IAAMmB,EAAW,CAAE,GAAGF,EAAI,KAAA,CAAM,KAAM,CAAA,CACtC,OAAIA,CAAAA,CAAI,KAAA,CAAM,WACZE,CAAAA,CAAS,QAAA,CAAW,IAAMC,mBAAAA,CAAUH,CAAAA,CAAI,MAAM,QAAA,EAAW,CAAA,CAAA,CAG3DnB,CAAAA,CACEoB,CAAAA,CACAlB,CAAAA,CACA,IAAMiB,CAAAA,CAAI,KAAA,CAAM,GAChB,MAAA,CAAO,WAAA,CACL,OAAO,OAAA,CAAQE,CAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAACE,EAAGC,CAAC,CAAA,GAAM,CACvCD,CAAAA,CACA,IAAMD,oBAAUE,CAAAA,EAAG,CACrB,CAAC,CACH,CACF,EAEOJ,CACT,CACD,EAkBM,SAASK,CAAAA,CACdf,EACAN,CAAAA,CACe,CACf,IAAMsB,CAAAA,CAAM,MAAA,CAAOhB,CAAK,EAClBE,CAAAA,CAASR,CAAAA,CAAMsB,CAAG,CAAA,EAAKtB,CAAAA,CAAM,CAAA,CACnC,OAAOQ,CAAAA,CAASA,CAAAA,CAAOF,CAAK,CAAA,CAAI,MAClC","file":"chunk-TYTEJYUQ.cjs","sourcesContent":["/**\n * Switch/Case/Default control flow component.\n *\n * Renders one of multiple branches based on a reactive expression.\n *\n * ```html\n * <Switch on={status()}>\n * <Case value=\"loading\"><Spinner /></Case>\n * <Case value=\"error\"><ErrorMessage /></Case>\n * <Case value=\"success\"><Content /></Case>\n * <Default><Fallback /></Default>\n * </Switch>\n * ```\n *\n * Or programmatic:\n * ```ts\n * renderSwitch(container, anchor, () => status(), {\n * loading: () => Spinner({}),\n * error: () => ErrorView({}),\n * success: () => Content({}),\n * _default: () => Fallback({}),\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal, effect } from './signals.js';\nimport { getCurrentScope, runInScope } from './context.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// =========================================================================\n// Programmatic renderSwitch\n// =========================================================================\n\n/**\n * Render a switch block. Swaps DOM based on reactive expression value.\n */\nexport function renderSwitch(\n parent: Node,\n anchor: Node,\n expression: () => unknown,\n cases: Record<string, () => Node>,\n): () => void {\n let currentNodes: Node[] = [];\n\n // Capture scope so children inherit provide/inject context\n const scope = getCurrentScope();\n\n const dispose = effect(\n () => {\n const value = String(expression());\n\n // Remove current nodes\n for (const node of currentNodes) {\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n currentNodes = [];\n\n // Find matching case or default\n const branch = cases[value] ?? cases._default;\n const liveParent = anchor.parentNode;\n if (branch && liveParent) {\n const node = scope ? runInScope(scope, branch) : branch();\n const nodes = node instanceof DocumentFragment\n ? Array.from(node.childNodes)\n : [node];\n for (const n of nodes) {\n liveParent.insertBefore(n, anchor);\n }\n currentNodes = nodes;\n }\n },\n { render: true },\n );\n\n return () => {\n dispose();\n for (const node of currentNodes) {\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n };\n}\n\n// =========================================================================\n// <Switch> component\n// =========================================================================\n\nexport interface SwitchProps {\n /** The value to switch on */\n on: unknown;\n /** Cases map: value → render function */\n cases: Record<string, () => AkashNode>;\n /** Default case */\n fallback?: () => AkashNode;\n}\n\n/**\n * <Switch> component — declarative switch/case.\n *\n * ```ts\n * Switch({\n * on: status(),\n * cases: {\n * loading: () => Spinner({}),\n * error: () => ErrorView({}),\n * success: () => Content({}),\n * },\n * fallback: () => 'Unknown status',\n * });\n * ```\n */\nexport const Switch = defineComponent<SwitchProps>((ctx) => {\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n const anchor = document.createComment('switch');\n container.appendChild(anchor);\n\n const casesMap = { ...ctx.props.cases };\n if (ctx.props.fallback) {\n casesMap._default = () => nodeToDOM(ctx.props.fallback!());\n }\n\n renderSwitch(\n container,\n anchor,\n () => ctx.props.on,\n Object.fromEntries(\n Object.entries(casesMap).map(([k, v]) => [\n k,\n () => nodeToDOM(v()),\n ]),\n ),\n );\n\n return container;\n };\n});\n\n// =========================================================================\n// match() — functional pattern matching for signals\n// =========================================================================\n\n/**\n * Pattern match on a signal value. Returns the result of the matching branch.\n *\n * ```ts\n * const message = match(status(), {\n * loading: () => 'Loading...',\n * error: () => 'Something went wrong',\n * success: () => 'Done!',\n * _: () => 'Unknown',\n * });\n * ```\n */\nexport function match<T, R>(\n value: T,\n cases: Record<string, (value: T) => R> & { _?: (value: T) => R },\n): R | undefined {\n const key = String(value);\n const branch = cases[key] ?? cases._;\n return branch ? branch(value) : undefined;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {c as c$1}from'./chunk-N3ITIHHM.js';function o(t){let r=Array.isArray(t)?t:[t];for(let e of r){let n={"@context":"https://schema.org",...e};c$1({script:[{type:"application/ld+json",innerHTML:JSON.stringify(n)}]});}}function s(t){let r=[{property:"og:title",content:t.title}];t.description&&r.push({property:"og:description",content:t.description}),t.image&&r.push({property:"og:image",content:t.image}),t.url&&r.push({property:"og:url",content:t.url}),t.type&&r.push({property:"og:type",content:t.type}),t.siteName&&r.push({property:"og:site_name",content:t.siteName}),t.locale&&r.push({property:"og:locale",content:t.locale}),c$1({meta:r});}function p(t){let r=[{name:"twitter:title",content:t.title}];t.card&&r.push({name:"twitter:card",content:t.card}),t.description&&r.push({name:"twitter:description",content:t.description}),t.image&&r.push({name:"twitter:image",content:t.image}),t.site&&r.push({name:"twitter:site",content:t.site}),t.creator&&r.push({name:"twitter:creator",content:t.creator}),c$1({meta:r});}function c(t){let r=[];t.description&&r.push({name:"description",content:t.description}),t.robots&&r.push({name:"robots",content:t.robots});let e=[];t.canonical&&e.push({rel:"canonical",href:t.canonical}),c$1({title:t.title,meta:r,link:e}),t.openGraph&&s(t.openGraph),t.twitter&&p(t.twitter),t.structuredData&&o(t.structuredData);}function u(t,r){let e=`<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
`;e+=`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
3
|
+
`;for(let n of r)e+=` <url>
|
|
4
|
+
`,e+=` <loc>${t}${n.url}</loc>
|
|
5
|
+
`,n.lastmod&&(e+=` <lastmod>${n.lastmod}</lastmod>
|
|
6
|
+
`),n.changefreq&&(e+=` <changefreq>${n.changefreq}</changefreq>
|
|
7
|
+
`),n.priority!=null&&(e+=` <priority>${n.priority}</priority>
|
|
8
|
+
`),e+=` </url>
|
|
9
|
+
`;return e+=`</urlset>
|
|
10
|
+
`,e}export{o as a,s as b,p as c,c as d,u as e};//# sourceMappingURL=chunk-TZHEZW6R.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-TZHEZW6R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/seo.ts"],"names":["useStructuredData","data","items","item","ld","useHead","useOpenGraph","meta","useTwitterCard","useSEO","config","link","generateSitemap","baseUrl","entries","xml","entry"],"mappings":"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","file":"chunk-TZHEZW6R.js","sourcesContent":["/**\n * SEO utilities.\n *\n * Structured data (JSON-LD), Open Graph helpers, and canonical URL management.\n * Works with useHead() for SSR-compatible head tag management.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'Article',\n * headline: 'My Post',\n * author: { '@type': 'Person', name: 'Alice' },\n * });\n * ```\n */\n\nimport { useHead } from './head.js';\n\n// --- Types ---\n\nexport interface StructuredData {\n '@context'?: string;\n '@type': string;\n [key: string]: unknown;\n}\n\nexport interface OpenGraphData {\n title: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n}\n\nexport interface TwitterCardData {\n card?: 'summary' | 'summary_large_image' | 'player' | 'app';\n title: string;\n description?: string;\n image?: string;\n site?: string;\n creator?: string;\n}\n\nexport interface SEOConfig {\n title: string;\n description?: string;\n canonical?: string;\n robots?: string;\n openGraph?: OpenGraphData;\n twitter?: TwitterCardData;\n structuredData?: StructuredData | StructuredData[];\n}\n\n// --- useStructuredData ---\n\n/**\n * Inject JSON-LD structured data into the document head.\n * Data is automatically wrapped with @context.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'WebSite',\n * name: 'AkashJS',\n * url: 'https://akashjs.dev',\n * });\n * ```\n */\nexport function useStructuredData(data: StructuredData | StructuredData[]): void {\n const items = Array.isArray(data) ? data : [data];\n\n for (const item of items) {\n const ld = { '@context': 'https://schema.org', ...item };\n useHead({\n script: [\n { type: 'application/ld+json', innerHTML: JSON.stringify(ld) },\n ],\n });\n }\n}\n\n// --- useOpenGraph ---\n\n/**\n * Set Open Graph meta tags.\n *\n * ```ts\n * useOpenGraph({\n * title: 'My Page',\n * description: 'Page description',\n * image: '/og-image.jpg',\n * type: 'article',\n * });\n * ```\n */\nexport function useOpenGraph(data: OpenGraphData): void {\n const meta: Array<{ property: string; content: string }> = [\n { property: 'og:title', content: data.title },\n ];\n\n if (data.description) meta.push({ property: 'og:description', content: data.description });\n if (data.image) meta.push({ property: 'og:image', content: data.image });\n if (data.url) meta.push({ property: 'og:url', content: data.url });\n if (data.type) meta.push({ property: 'og:type', content: data.type });\n if (data.siteName) meta.push({ property: 'og:site_name', content: data.siteName });\n if (data.locale) meta.push({ property: 'og:locale', content: data.locale });\n\n useHead({ meta });\n}\n\n// --- useTwitterCard ---\n\n/**\n * Set Twitter Card meta tags.\n *\n * ```ts\n * useTwitterCard({\n * card: 'summary_large_image',\n * title: 'My Page',\n * image: '/twitter-card.jpg',\n * });\n * ```\n */\nexport function useTwitterCard(data: TwitterCardData): void {\n const meta: Array<{ name: string; content: string }> = [\n { name: 'twitter:title', content: data.title },\n ];\n\n if (data.card) meta.push({ name: 'twitter:card', content: data.card });\n if (data.description) meta.push({ name: 'twitter:description', content: data.description });\n if (data.image) meta.push({ name: 'twitter:image', content: data.image });\n if (data.site) meta.push({ name: 'twitter:site', content: data.site });\n if (data.creator) meta.push({ name: 'twitter:creator', content: data.creator });\n\n useHead({ meta });\n}\n\n// --- useSEO (all-in-one) ---\n\n/**\n * Set all SEO-related head tags at once.\n *\n * ```ts\n * useSEO({\n * title: 'My Page | MySite',\n * description: 'Page description',\n * canonical: 'https://mysite.com/page',\n * openGraph: { title: 'My Page', image: '/og.jpg' },\n * twitter: { card: 'summary_large_image', title: 'My Page' },\n * structuredData: { '@type': 'WebPage', name: 'My Page' },\n * });\n * ```\n */\nexport function useSEO(config: SEOConfig): void {\n const meta: Array<{ name?: string; property?: string; content: string }> = [];\n\n if (config.description) {\n meta.push({ name: 'description', content: config.description });\n }\n if (config.robots) {\n meta.push({ name: 'robots', content: config.robots });\n }\n\n const link: Array<{ rel: string; href: string }> = [];\n if (config.canonical) {\n link.push({ rel: 'canonical', href: config.canonical });\n }\n\n useHead({ title: config.title, meta, link });\n\n if (config.openGraph) useOpenGraph(config.openGraph);\n if (config.twitter) useTwitterCard(config.twitter);\n if (config.structuredData) useStructuredData(config.structuredData);\n}\n\n// --- Sitemap generation (for CLI/build) ---\n\nexport interface SitemapEntry {\n url: string;\n lastmod?: string;\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n priority?: number;\n}\n\n/**\n * Generate a sitemap.xml string from route entries.\n *\n * ```ts\n * const xml = generateSitemap('https://mysite.com', [\n * { url: '/', priority: 1.0 },\n * { url: '/about', changefreq: 'monthly' },\n * { url: '/blog/hello', lastmod: '2026-03-29' },\n * ]);\n * ```\n */\nexport function generateSitemap(baseUrl: string, entries: SitemapEntry[]): string {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n xml += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n';\n\n for (const entry of entries) {\n xml += ' <url>\\n';\n xml += ` <loc>${baseUrl}${entry.url}</loc>\\n`;\n if (entry.lastmod) xml += ` <lastmod>${entry.lastmod}</lastmod>\\n`;\n if (entry.changefreq) xml += ` <changefreq>${entry.changefreq}</changefreq>\\n`;\n if (entry.priority != null) xml += ` <priority>${entry.priority}</priority>\\n`;\n xml += ' </url>\\n';\n }\n\n xml += '</urlset>\\n';\n return xml;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
var f=false,u=[],l=0;function g(){f=true,u=[],l=performance.now();}function P(){f=false;let r=performance.now();return {entries:[...u],totalDuration:r-l,startTime:l,endTime:r}}function E(){return f}function m(r,e,t){f&&u.push({type:r,name:e,duration:t,timestamp:performance.now()});}function p(r){let e=r.entries.filter(n=>n.type==="render"),t=r.entries.filter(n=>n.type==="effect"),s=r.entries.filter(n=>n.type==="signal-update"),o=r.entries.filter(n=>n.type==="computed"),c=n=>n.length>0?n.reduce((a,i)=>a+i.duration,0)/n.length:0,d=n=>n.length>0?n.reduce((a,i)=>i.duration>a.duration?i:a):null;return {totalRenders:e.length,totalEffects:t.length,totalSignalUpdates:s.length,totalComputedEvals:o.length,avgRenderTime:c(e),avgEffectTime:c(t),slowestRender:d(e),slowestEffect:d(t)}}function w(r,e){let t=performance.now(),s=e(),o=performance.now()-t;return m("render",r,o),{result:s,duration:o}}async function y(r,e){let t=performance.now(),s=await e(),o=performance.now()-t;return m("render",r,o),{result:s,duration:o}}function T(r){let e=0,t=0;return {start(){e=performance.now();},stop(){t=performance.now()-e,m("render",r,t);},get duration(){return t}}}function x(r){let e=p(r),t=`
|
|
2
|
+
Performance Profile
|
|
3
|
+
`;return t+=" "+"\u2500".repeat(50)+`
|
|
4
|
+
`,t+=` Duration: ${r.totalDuration.toFixed(1)} ms
|
|
5
|
+
`,t+=` Renders: ${e.totalRenders} (avg ${e.avgRenderTime.toFixed(2)} ms)
|
|
6
|
+
`,t+=` Effects: ${e.totalEffects} (avg ${e.avgEffectTime.toFixed(2)} ms)
|
|
7
|
+
`,t+=` Signal updates: ${e.totalSignalUpdates}
|
|
8
|
+
`,t+=` Computed evals: ${e.totalComputedEvals}
|
|
9
|
+
`,e.slowestRender&&(t+=` Slowest render: ${e.slowestRender.name} (${e.slowestRender.duration.toFixed(2)} ms)
|
|
10
|
+
`),e.slowestEffect&&(t+=` Slowest effect: ${e.slowestEffect.name} (${e.slowestEffect.duration.toFixed(2)} ms)
|
|
11
|
+
`),t+=" "+"\u2500".repeat(50)+`
|
|
12
|
+
`,t}export{g as a,P as b,E as c,m as d,p as e,w as f,y as g,T as h,x as i};//# sourceMappingURL=chunk-U65WRXZC.js.map
|
|
13
|
+
//# sourceMappingURL=chunk-U65WRXZC.js.map
|