@akashjs/runtime 0.2.7 → 0.2.8
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 +1 -1
- package/dist/a11y.js +1 -1
- package/dist/async-component.cjs +1 -1
- package/dist/async-component.js +1 -1
- package/dist/await-block.cjs +1 -1
- package/dist/await-block.js +1 -1
- package/dist/browser.cjs +1 -1
- package/dist/browser.js +1 -1
- package/dist/{chunk-SXYPAP4B.js → chunk-2GGCZC4O.js} +2 -2
- package/dist/{chunk-SXYPAP4B.js.map → chunk-2GGCZC4O.js.map} +1 -1
- package/dist/chunk-2UATNCKC.js +2 -0
- package/dist/chunk-2UATNCKC.js.map +1 -0
- package/dist/{chunk-FVF3T4JJ.js → chunk-2XFW6MT7.js} +2 -2
- package/dist/{chunk-FVF3T4JJ.js.map → chunk-2XFW6MT7.js.map} +1 -1
- package/dist/{chunk-ZJULEDLY.js → chunk-3CD6A5YV.js} +2 -2
- package/dist/{chunk-ZJULEDLY.js.map → chunk-3CD6A5YV.js.map} +1 -1
- package/dist/{chunk-N5APNCPB.js → chunk-3PCZFKBH.js} +2 -2
- package/dist/{chunk-N5APNCPB.js.map → chunk-3PCZFKBH.js.map} +1 -1
- package/dist/{chunk-Q6S7SUOM.js → chunk-3PLQPLVA.js} +2 -2
- package/dist/{chunk-Q6S7SUOM.js.map → chunk-3PLQPLVA.js.map} +1 -1
- package/dist/chunk-3RDEFZMT.js +2 -0
- package/dist/{chunk-NCXMNJUN.js.map → chunk-3RDEFZMT.js.map} +1 -1
- package/dist/{chunk-KUPL3ZVD.js → chunk-3VYMJMAU.js} +2 -2
- package/dist/{chunk-KUPL3ZVD.js.map → chunk-3VYMJMAU.js.map} +1 -1
- package/dist/{chunk-QQ725EZL.js → chunk-3Y663FYJ.js} +2 -2
- package/dist/{chunk-QQ725EZL.js.map → chunk-3Y663FYJ.js.map} +1 -1
- package/dist/{chunk-VNDSKBXQ.cjs → chunk-4VLBY2BW.cjs} +2 -2
- package/dist/{chunk-VNDSKBXQ.cjs.map → chunk-4VLBY2BW.cjs.map} +1 -1
- package/dist/{chunk-VUSNUBNI.js → chunk-5GDMAABU.js} +2 -2
- package/dist/{chunk-VUSNUBNI.js.map → chunk-5GDMAABU.js.map} +1 -1
- package/dist/{chunk-QE2TJ6P5.cjs → chunk-5JKXREA2.cjs} +2 -2
- package/dist/{chunk-QE2TJ6P5.cjs.map → chunk-5JKXREA2.cjs.map} +1 -1
- package/dist/{chunk-AZCELE44.cjs → chunk-637ENG3A.cjs} +2 -2
- package/dist/{chunk-AZCELE44.cjs.map → chunk-637ENG3A.cjs.map} +1 -1
- package/dist/{chunk-BB7P6HTR.js → chunk-66PLXQS3.js} +2 -2
- package/dist/{chunk-BB7P6HTR.js.map → chunk-66PLXQS3.js.map} +1 -1
- package/dist/{chunk-TDKDZ3QJ.cjs → chunk-6GY6HC75.cjs} +2 -2
- package/dist/{chunk-TDKDZ3QJ.cjs.map → chunk-6GY6HC75.cjs.map} +1 -1
- package/dist/{chunk-M5IACTFC.cjs → chunk-6I5PPQ34.cjs} +3 -3
- package/dist/{chunk-M5IACTFC.cjs.map → chunk-6I5PPQ34.cjs.map} +1 -1
- package/dist/{chunk-QNVMBXVH.js → chunk-6ZCFPR4O.js} +2 -2
- package/dist/{chunk-QNVMBXVH.js.map → chunk-6ZCFPR4O.js.map} +1 -1
- package/dist/{chunk-R7NUVVHP.js → chunk-7T4HMWUC.js} +2 -2
- package/dist/{chunk-R7NUVVHP.js.map → chunk-7T4HMWUC.js.map} +1 -1
- package/dist/{chunk-36VM3RJW.cjs → chunk-BLT7XOSX.cjs} +2 -2
- package/dist/{chunk-36VM3RJW.cjs.map → chunk-BLT7XOSX.cjs.map} +1 -1
- package/dist/chunk-CDZR6GWB.js +2 -0
- package/dist/chunk-CDZR6GWB.js.map +1 -0
- package/dist/chunk-DWSIR5SL.cjs +2 -0
- package/dist/{chunk-7ZPSYZHD.cjs.map → chunk-DWSIR5SL.cjs.map} +1 -1
- package/dist/{chunk-NJXXC5JB.js → chunk-E7BPGVIS.js} +2 -2
- package/dist/{chunk-NJXXC5JB.js.map → chunk-E7BPGVIS.js.map} +1 -1
- package/dist/chunk-E7GAIKQT.cjs +2 -0
- package/dist/{chunk-FUVSCPU4.cjs.map → chunk-E7GAIKQT.cjs.map} +1 -1
- package/dist/{chunk-VWTULWXF.js → chunk-EEQZFKEG.js} +2 -2
- package/dist/{chunk-VWTULWXF.js.map → chunk-EEQZFKEG.js.map} +1 -1
- package/dist/{chunk-7IJUJUXE.cjs → chunk-EXKQPZ5N.cjs} +2 -2
- package/dist/{chunk-7IJUJUXE.cjs.map → chunk-EXKQPZ5N.cjs.map} +1 -1
- package/dist/{chunk-NHDYQTC5.cjs → chunk-F2F5OXCK.cjs} +3 -3
- package/dist/{chunk-NHDYQTC5.cjs.map → chunk-F2F5OXCK.cjs.map} +1 -1
- package/dist/{chunk-7VBH4F3P.js → chunk-GAAO2KXN.js} +2 -2
- package/dist/{chunk-7VBH4F3P.js.map → chunk-GAAO2KXN.js.map} +1 -1
- package/dist/{chunk-F6VSSM2P.js → chunk-GB7IUC6E.js} +2 -2
- package/dist/{chunk-F6VSSM2P.js.map → chunk-GB7IUC6E.js.map} +1 -1
- package/dist/{chunk-TZHEZW6R.js → chunk-GHSJ4B55.js} +3 -3
- package/dist/{chunk-TZHEZW6R.js.map → chunk-GHSJ4B55.js.map} +1 -1
- package/dist/{chunk-NBYFHJWB.js → chunk-GRXHWCFR.js} +3 -3
- package/dist/{chunk-NBYFHJWB.js.map → chunk-GRXHWCFR.js.map} +1 -1
- package/dist/{chunk-WTDTVWCQ.cjs → chunk-HHPRQMGX.cjs} +2 -2
- package/dist/{chunk-WTDTVWCQ.cjs.map → chunk-HHPRQMGX.cjs.map} +1 -1
- package/dist/chunk-HL2VGVJT.cjs +2 -0
- package/dist/chunk-HL2VGVJT.cjs.map +1 -0
- package/dist/{chunk-Z6K4FYG6.js → chunk-IDTJWCYW.js} +2 -2
- package/dist/{chunk-Z6K4FYG6.js.map → chunk-IDTJWCYW.js.map} +1 -1
- package/dist/{chunk-6O46EMQS.cjs → chunk-JMY6E7VR.cjs} +2 -2
- package/dist/{chunk-6O46EMQS.cjs.map → chunk-JMY6E7VR.cjs.map} +1 -1
- package/dist/{chunk-XZR3J626.cjs → chunk-KFMCMKSC.cjs} +2 -2
- package/dist/{chunk-XZR3J626.cjs.map → chunk-KFMCMKSC.cjs.map} +1 -1
- package/dist/{chunk-IKVHLORY.cjs → chunk-KGV5MKBC.cjs} +3 -3
- package/dist/{chunk-IKVHLORY.cjs.map → chunk-KGV5MKBC.cjs.map} +1 -1
- package/dist/{chunk-R65RPMQX.cjs → chunk-KQAYFPJI.cjs} +2 -2
- package/dist/{chunk-R65RPMQX.cjs.map → chunk-KQAYFPJI.cjs.map} +1 -1
- package/dist/chunk-LSD7DEMV.cjs +2 -0
- package/dist/chunk-LSD7DEMV.cjs.map +1 -0
- package/dist/{chunk-2LKFIID7.cjs → chunk-LTMDSGQ6.cjs} +2 -2
- package/dist/{chunk-2LKFIID7.cjs.map → chunk-LTMDSGQ6.cjs.map} +1 -1
- package/dist/{chunk-4NQEIKH5.cjs → chunk-M2OWSNOM.cjs} +2 -2
- package/dist/{chunk-4NQEIKH5.cjs.map → chunk-M2OWSNOM.cjs.map} +1 -1
- package/dist/{chunk-PYASLKWF.js → chunk-MGFRVOM5.js} +2 -2
- package/dist/{chunk-PYASLKWF.js.map → chunk-MGFRVOM5.js.map} +1 -1
- package/dist/{chunk-JQCN42XX.js → chunk-MNUOIAXS.js} +2 -2
- package/dist/{chunk-JQCN42XX.js.map → chunk-MNUOIAXS.js.map} +1 -1
- package/dist/{chunk-NEQ5TENE.cjs → chunk-ND2HZRMR.cjs} +2 -2
- package/dist/{chunk-NEQ5TENE.cjs.map → chunk-ND2HZRMR.cjs.map} +1 -1
- package/dist/chunk-O5OTZP5M.cjs +2 -0
- package/dist/{chunk-JD3LDHUI.cjs.map → chunk-O5OTZP5M.cjs.map} +1 -1
- package/dist/{chunk-LD4C62JY.cjs → chunk-P4USGNUK.cjs} +2 -2
- package/dist/{chunk-LD4C62JY.cjs.map → chunk-P4USGNUK.cjs.map} +1 -1
- package/dist/{chunk-L3ZZX36S.js → chunk-P55EWYAD.js} +2 -2
- package/dist/{chunk-L3ZZX36S.js.map → chunk-P55EWYAD.js.map} +1 -1
- package/dist/{chunk-OZ4GNBKA.js → chunk-PVIYD25D.js} +2 -2
- package/dist/{chunk-OZ4GNBKA.js.map → chunk-PVIYD25D.js.map} +1 -1
- package/dist/{chunk-2HLDEWRT.cjs → chunk-PWJMCURK.cjs} +2 -2
- package/dist/{chunk-2HLDEWRT.cjs.map → chunk-PWJMCURK.cjs.map} +1 -1
- package/dist/{chunk-7UX5CSGZ.cjs → chunk-SBDFBADL.cjs} +2 -2
- package/dist/{chunk-7UX5CSGZ.cjs.map → chunk-SBDFBADL.cjs.map} +1 -1
- package/dist/{chunk-DHFVVFZF.cjs → chunk-SPS3LM47.cjs} +2 -2
- package/dist/{chunk-DHFVVFZF.cjs.map → chunk-SPS3LM47.cjs.map} +1 -1
- package/dist/{chunk-N3ITIHHM.js → chunk-SVNS64LE.js} +3 -3
- package/dist/{chunk-N3ITIHHM.js.map → chunk-SVNS64LE.js.map} +1 -1
- package/dist/{chunk-TSFY5HKB.js → chunk-SZDKDXRV.js} +3 -3
- package/dist/{chunk-TSFY5HKB.js.map → chunk-SZDKDXRV.js.map} +1 -1
- package/dist/{chunk-T2RVAQEU.js → chunk-UXHQ5OFW.js} +2 -2
- package/dist/{chunk-T2RVAQEU.js.map → chunk-UXHQ5OFW.js.map} +1 -1
- package/dist/{chunk-TFEHO7SF.cjs → chunk-UYJ4BAPL.cjs} +2 -2
- package/dist/{chunk-TFEHO7SF.cjs.map → chunk-UYJ4BAPL.cjs.map} +1 -1
- package/dist/chunk-VDHUPQDK.cjs +2 -0
- package/dist/{chunk-TYTEJYUQ.cjs.map → chunk-VDHUPQDK.cjs.map} +1 -1
- package/dist/{chunk-YDO5KARN.js → chunk-VTD3TI3M.js} +2 -2
- package/dist/{chunk-YDO5KARN.js.map → chunk-VTD3TI3M.js.map} +1 -1
- package/dist/{chunk-CP6SK2B4.js → chunk-WB7QDCEA.js} +2 -2
- package/dist/{chunk-CP6SK2B4.js.map → chunk-WB7QDCEA.js.map} +1 -1
- package/dist/{chunk-WZ5ULION.js → chunk-XAGYLTHV.js} +2 -2
- package/dist/{chunk-WZ5ULION.js.map → chunk-XAGYLTHV.js.map} +1 -1
- package/dist/{chunk-QSPRVXFV.cjs → chunk-XE7JC7Y3.cjs} +2 -2
- package/dist/{chunk-QSPRVXFV.cjs.map → chunk-XE7JC7Y3.cjs.map} +1 -1
- package/dist/{chunk-FVWHMFX6.cjs → chunk-XMNDNTHK.cjs} +3 -3
- package/dist/{chunk-FVWHMFX6.cjs.map → chunk-XMNDNTHK.cjs.map} +1 -1
- package/dist/{chunk-J6KDUWX6.cjs → chunk-XOPRWJCX.cjs} +2 -2
- package/dist/{chunk-J6KDUWX6.cjs.map → chunk-XOPRWJCX.cjs.map} +1 -1
- package/dist/{chunk-VO4FCKHM.js → chunk-XRWOZO67.js} +2 -2
- package/dist/{chunk-VO4FCKHM.js.map → chunk-XRWOZO67.js.map} +1 -1
- package/dist/chunk-XZOP3IWH.cjs +2 -0
- package/dist/{chunk-YURIYBTN.cjs.map → chunk-XZOP3IWH.cjs.map} +1 -1
- package/dist/{chunk-BGSF77LF.js → chunk-YG76TVFL.js} +2 -2
- package/dist/{chunk-BGSF77LF.js.map → chunk-YG76TVFL.js.map} +1 -1
- package/dist/{chunk-V2JDKH3W.cjs → chunk-YQQDRDJ7.cjs} +2 -2
- package/dist/{chunk-V2JDKH3W.cjs.map → chunk-YQQDRDJ7.cjs.map} +1 -1
- package/dist/{chunk-3XREYIJH.cjs → chunk-ZGE46DPV.cjs} +2 -2
- package/dist/{chunk-3XREYIJH.cjs.map → chunk-ZGE46DPV.cjs.map} +1 -1
- package/dist/composables.cjs +1 -1
- package/dist/composables.js +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.js +1 -1
- package/dist/data-table.cjs +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deep-signal.cjs +1 -1
- package/dist/deep-signal.js +1 -1
- package/dist/defer.cjs +1 -1
- package/dist/defer.js +1 -1
- package/dist/{devtools-overlay-3WRM6GKM.js → devtools-overlay-3PHULVP4.js} +3 -3
- package/dist/{devtools-overlay-3WRM6GKM.js.map → devtools-overlay-3PHULVP4.js.map} +1 -1
- package/dist/{devtools-overlay-WJGSIB4N.cjs → devtools-overlay-SJV7WNNS.cjs} +4 -4
- package/dist/{devtools-overlay-WJGSIB4N.cjs.map → devtools-overlay-SJV7WNNS.cjs.map} +1 -1
- package/dist/devtools.cjs +1 -1
- package/dist/devtools.js +1 -1
- package/dist/di.cjs +1 -1
- package/dist/di.js +1 -1
- package/dist/error-boundary.cjs +1 -1
- package/dist/error-boundary.js +1 -1
- package/dist/event-modifiers.cjs +1 -1
- package/dist/event-modifiers.js +1 -1
- package/dist/head.cjs +1 -1
- package/dist/head.js +1 -1
- package/dist/hydration.cjs +1 -1
- package/dist/hydration.js +1 -1
- package/dist/image.cjs +1 -1
- package/dist/image.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/infinite-scroll.cjs +1 -1
- package/dist/infinite-scroll.js +1 -1
- package/dist/machine.cjs +1 -1
- package/dist/machine.js +1 -1
- package/dist/offline.cjs +1 -1
- package/dist/offline.js +1 -1
- package/dist/portal.cjs +1 -1
- package/dist/portal.js +1 -1
- package/dist/pwa.cjs +1 -1
- package/dist/pwa.js +1 -1
- package/dist/query-state.cjs +1 -1
- package/dist/query-state.js +1 -1
- package/dist/seo.cjs +1 -1
- package/dist/seo.js +1 -1
- package/dist/snippets.cjs +1 -1
- package/dist/snippets.js +1 -1
- package/dist/ssr.cjs +1 -1
- package/dist/ssr.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.js +1 -1
- package/dist/suspense.cjs +1 -1
- package/dist/suspense.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +1 -1
- package/dist/sync.cjs +1 -1
- package/dist/sync.js +1 -1
- package/dist/test.cjs +2 -2
- package/dist/test.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +1 -1
- package/dist/toast.cjs +1 -1
- package/dist/toast.js +1 -1
- package/dist/transition.cjs +1 -1
- package/dist/transition.js +1 -1
- package/dist/tweened.cjs +1 -1
- package/dist/tweened.js +1 -1
- package/dist/virtual-list.cjs +1 -1
- package/dist/virtual-list.js +1 -1
- package/dist/watch.cjs +1 -1
- package/dist/watch.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-7ZPSYZHD.cjs +0 -2
- package/dist/chunk-FUVSCPU4.cjs +0 -2
- package/dist/chunk-JD3LDHUI.cjs +0 -2
- package/dist/chunk-KE7BJTCD.js +0 -2
- package/dist/chunk-KE7BJTCD.js.map +0 -1
- package/dist/chunk-NCXMNJUN.js +0 -2
- package/dist/chunk-TYTEJYUQ.cjs +0 -2
- package/dist/chunk-WOZWFMOK.cjs +0 -2
- package/dist/chunk-WOZWFMOK.cjs.map +0 -1
- package/dist/chunk-XWVNLE2W.cjs +0 -2
- package/dist/chunk-XWVNLE2W.cjs.map +0 -1
- package/dist/chunk-YURIYBTN.cjs +0 -2
- package/dist/chunk-YXKQTEPR.js +0 -2
- package/dist/chunk-YXKQTEPR.js.map +0 -1
|
@@ -1 +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"]}
|
|
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-KQAYFPJI.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
|
+
'use strict';var chunkIQGSDFBI_cjs=require('./chunk-IQGSDFBI.cjs'),chunkPPNEAFKE_cjs=require('./chunk-PPNEAFKE.cjs'),chunkHL2VGVJT_cjs=require('./chunk-HL2VGVJT.cjs');function K(e,n){let t=document.createElement(e);if(n)for(let[c,m]of Object.entries(n))I(t,c,m);return t}function q(e){return document.createTextNode(e)}function V(e){let n=document.createElement("template");return n.innerHTML=e,n.content.cloneNode(true)}function I(e,n,t){if(n==="class"||n==="className")e.className=t;else if(n==="style"&&typeof t=="object"&&t!==null)Object.assign(e.style,t);else if(n==="innerHTML")e.innerHTML=t;else if(n!=="ref")if(n.startsWith("on")){let c=n.slice(2).toLowerCase();e.addEventListener(c,t);}else n in e?e[n]=t:t===false||t==null?e.removeAttribute(n):e.setAttribute(n,t===true?"":String(t));}function W(e,n){return chunkHL2VGVJT_cjs.e(()=>{e.textContent=String(n());},{render:true})}function G(e,n,t){return chunkHL2VGVJT_cjs.e(()=>{I(e,n,t());},{render:true})}function U(e,n){return chunkHL2VGVJT_cjs.e(()=>{e.style.display=n()?"":"none";},{render:true})}function R(e=""){return document.createComment(e)}function D(e,n,t,c,m){let s=null,w=chunkIQGSDFBI_cjs.c(),a=chunkHL2VGVJT_cjs.e(()=>{let d=t();if(s){for(let f of s.nodes)try{f.parentNode?.removeChild(f);}catch{}s.dispose?.(),s=null;}let l=d?c:m,i=n.parentNode;if(!i&&s?.nodes[0]?.parentNode&&(i=s.nodes[0].parentNode),l&&i){let f=w?chunkIQGSDFBI_cjs.d(w,l):l(),p=f instanceof DocumentFragment?Array.from(f.childNodes):[f];for(let g of p)i.insertBefore(g,n);s={nodes:p,dispose:null};}},{render:true});return ()=>{if(a(),s){for(let d of s.nodes)try{d.parentNode?.removeChild(d);}catch{}s.dispose?.();}}}function B(e,n,t,c,m){let s=[],w=chunkIQGSDFBI_cjs.c();function a(l,i,f){let p=w?chunkIQGSDFBI_cjs.d(w,()=>m(l,i)):m(l,i),g=p instanceof DocumentFragment?Array.from(p.childNodes):[p];return {key:f,value:l,nodes:g,dispose:null}}let d=chunkHL2VGVJT_cjs.e(()=>{let l=t(),i=s,f=i.length,p=l.length;if(f===0){let o=new Array(p),u=n.parentNode;for(let r=0;r<p;r++){let h=l[r],k=a(h,r,c(h,r));if(o[r]=k,u)for(let L=0;L<k.nodes.length;L++)u.insertBefore(k.nodes[L],n);}s=o;return}if(p===0){for(let o=0;o<f;o++){let u=i[o];for(let r=0;r<u.nodes.length;r++){let h=u.nodes[r];h.parentNode&&h.parentNode.removeChild(h);}u.dispose?.();}s=[];return}let g=new Map;for(let o=0;o<f;o++)g.set(i[o].key,o);let T=new Array(p),N=new Array(p);for(let o=0;o<p;o++){let u=l[o],r=c(u,o),h=g.get(r);if(h!==void 0){g.delete(r);let k=i[h];k.nodes[0]&&!k.nodes[0].parentNode?(T[o]=a(u,o,r),N[o]=-1):(k.value=u,T[o]=k,N[o]=h);}else T[o]=a(u,o,r),N[o]=-1;}for(let o of g.values()){let u=i[o];for(let r=0;r<u.nodes.length;r++){let h=u.nodes[r];h.parentNode&&h.parentNode.removeChild(h);}u.dispose?.();}let C=j(N),S=new Set;for(let o=0;o<C.length;o++)S.add(C[o]);let H=n.parentNode;if(H){let o=n;for(let u=p-1;u>=0;u--){let r=T[u];if(S.has(u))o=r.nodes[0];else {for(let h=0;h<r.nodes.length;h++)H.insertBefore(r.nodes[h],o);o=r.nodes[0];}}}s=T;},{render:true});return ()=>{d();for(let l of s){for(let i=0;i<l.nodes.length;i++){let f=l.nodes[i];f.parentNode&&f.parentNode.removeChild(f);}l.dispose?.();}s=[];}}function j(e){let n=e.length;if(n===0)return [];let t=[],c=new Array(n).fill(-1),m=[];for(let a=0;a<n;a++){if(e[a]===-1)continue;let d=0,l=t.length;for(;d<l;){let i=d+l>>1;t[i]<e[a]?d=i+1:l=i;}t[d]=e[a],m[d]=a,d>0&&(c[a]=m[d-1]);}let s=new Array(t.length),w=m[t.length-1];for(let a=t.length-1;a>=0;a--)s[a]=w,w=c[w];return s}function Y(e){let n=R("show"),t=document.createDocumentFragment();t.appendChild(n);let c=typeof e.when=="function"?e.when:()=>e.when,m;return D(t,n,()=>(m=c(),!!m),()=>y(e.children(m)),e.fallback?()=>y(e.fallback()):void 0),t}function z(e){let n=R("for"),t=document.createDocumentFragment();t.appendChild(n);let c=typeof e.each=="function"?e.each:()=>e.each;return B(t,n,c,e.key,(m,s)=>y(e.children(m,s))),t}function y(e){if(e==null||typeof e=="boolean")return document.createTextNode("");if(typeof e=="string"||typeof e=="number")return document.createTextNode(String(e));if(e instanceof Node)return e;if(Array.isArray(e)){let n=document.createDocumentFragment();for(let t of e)n.appendChild(y(t));return n}return document.createTextNode(String(e))}function J(e,n,t){let c=y(n);t?e.insertBefore(c,t):e.appendChild(c);}function te(e){return e.__reactive=true,e}var x=null;function oe(e){if(!x)throw chunkPPNEAFKE_cjs.b("AK0020");x.mount.push(e);}function re(e){if(!x)throw chunkPPNEAFKE_cjs.b("AK0021");x.unmount.push(e);}function se(e){if(!x)throw chunkPPNEAFKE_cjs.b("AK0022");x.error.push(e);}function ie(e){return {current:e}}function ce(e){let n=t=>{let{children:c,...m}=t??{},a={props:m,children:typeof c=="function"?c:()=>c??null},d={mount:[],unmount:[],error:[]},l=x;x=d;let i=chunkIQGSDFBI_cjs.c(),f=chunkIQGSDFBI_cjs.a(i),p,g;try{g=chunkHL2VGVJT_cjs.f(()=>{if(p=e(a),typeof p!="function")throw chunkPPNEAFKE_cjs.b("AK0040");let T=p();return y(T)});}catch(T){if(chunkIQGSDFBI_cjs.b(f),x=l,d.error.length>0){for(let N of d.error)N(T instanceof Error?T:new Error(String(T)));return document.createComment("error")}throw T}return chunkIQGSDFBI_cjs.b(f),x=l,d.mount.length>0&&queueMicrotask(()=>{for(let T of d.mount)try{let N=T();typeof N=="function"&&d.unmount.push(N);}catch(N){for(let C of d.error)C(N instanceof Error?N:new Error(String(N)));}}),g};return n._akash=true,n}exports.a=K;exports.b=q;exports.c=V;exports.d=I;exports.e=W;exports.f=G;exports.g=U;exports.h=D;exports.i=B;exports.j=Y;exports.k=z;exports.l=y;exports.m=J;exports.n=te;exports.o=oe;exports.p=re;exports.q=se;exports.r=ie;exports.s=ce;//# sourceMappingURL=chunk-LSD7DEMV.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-LSD7DEMV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts","../src/component.ts"],"names":["createElement","tag","attrs","el","key","value","setProperty","createText","cloneTemplate","html","template","event","bindText","node","fn","effect","bindProperty","bindVisible","createAnchor","label","renderConditional","parent","anchor","condition","trueBranch","falseBranch","current","scope","getCurrentScope","dispose","branch","liveParent","fragment","runInScope","nodes","renderList","items","keyFn","renderItem","currentItems","createItem","data","index","newData","oldItems","oldLen","newLen","newItems","i","item","j","n","oldKeyMap","newToOld","oldIdx","existing","lisIndices","longestIncreasingSubsequence","lisSet","nextSibling","arr","tails","predecessors","indices","lo","hi","mid","result","k","Show","props","container","getWhen","whenValue","nodeToDOM","For","getEach","child","insert","domNode","__getter","currentHooks","onMount","akashError","onUnmount","onError","ref","initialValue","defineComponent","setup","component","rawProps","childrenProp","restProps","ctx","hooks","prevHooks","parentScope","pushScope","renderFn","untrack","rendered","err","popScope","handler","mountFn","cleanup"],"mappings":"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","file":"chunk-LSD7DEMV.cjs","sourcesContent":["/**\n * Direct DOM rendering runtime.\n *\n * No virtual DOM. The compiler generates calls to these helpers.\n * Signal reads inside templates become fine-grained effects that\n * update only the specific DOM node that changed.\n */\n\nimport { effect } from './signals.js';\nimport { getCurrentScope, runInScope } from './context.js';\nimport type { AkashNode } from './types.js';\n\n// --- DOM creation helpers (used by compiler output) ---\n\n/** Create an element and optionally set static attributes */\nexport function createElement(\n tag: string,\n attrs?: Record<string, unknown>,\n): HTMLElement {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n setProperty(el, key, value);\n }\n }\n return el;\n}\n\n/** Create a text node */\nexport function createText(value: string): Text {\n return document.createTextNode(value);\n}\n\n/** Clone a template element for static structure */\nexport function cloneTemplate(html: string): DocumentFragment {\n const template = document.createElement('template');\n template.innerHTML = html;\n return template.content.cloneNode(true) as DocumentFragment;\n}\n\n// --- Property/attribute setting ---\n\nexport function setProperty(el: HTMLElement, key: string, value: unknown): void {\n if (key === 'class' || key === 'className') {\n el.className = value as string;\n } else if (key === 'style' && typeof value === 'object' && value !== null) {\n Object.assign(el.style, value);\n } else if (key === 'innerHTML') {\n el.innerHTML = value as string;\n } else if (key === 'ref') {\n // Handled separately by component system\n } else if (key.startsWith('on')) {\n const event = key.slice(2).toLowerCase();\n el.addEventListener(event, value as EventListener);\n } else if (key in el) {\n (el as unknown as Record<string, unknown>)[key] = value;\n } else if (value === false || value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, value === true ? '' : String(value));\n }\n}\n\n// --- Reactive binding (used by compiler for dynamic expressions) ---\n\n/** Bind a reactive expression to a text node's content */\nexport function bindText(node: Text, fn: () => unknown): () => void {\n return effect(\n () => {\n node.textContent = String(fn());\n },\n { render: true },\n );\n}\n\n/** Bind a reactive expression to an element's attribute/property */\nexport function bindProperty(\n el: HTMLElement,\n key: string,\n fn: () => unknown,\n): () => void {\n return effect(\n () => {\n setProperty(el, key, fn());\n },\n { render: true },\n );\n}\n\n/** Bind a reactive expression to an element's visibility (display) */\nexport function bindVisible(el: HTMLElement, fn: () => boolean): () => void {\n return effect(\n () => {\n el.style.display = fn() ? '' : 'none';\n },\n { render: true },\n );\n}\n\n// --- Conditional rendering ---\n\n/** Anchor node — comment for normal DOM, hidden element for table contexts */\ntype Anchor = Comment | HTMLElement;\n\n/** Table elements where comment nodes get relocated by the browser */\nconst TABLE_TAGS = new Set(['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR']);\n\nfunction createAnchor(label = ''): Anchor {\n return document.createComment(label);\n}\n\n/**\n * Create a table-safe anchor. Browsers relocate comment nodes inside\n * table elements, breaking anchor-based insertion. Use a hidden element instead.\n */\nfunction createTableSafeAnchor(parent: Node): Anchor {\n if (parent instanceof HTMLElement && TABLE_TAGS.has(parent.tagName)) {\n const tag = parent.tagName === 'TR' ? 'td' : 'tr';\n const el = document.createElement(tag);\n el.style.display = 'none';\n return el;\n }\n return document.createComment('');\n}\n\ninterface ConditionalBlock {\n nodes: Node[];\n dispose: (() => void) | null;\n}\n\n/**\n * Render a conditional block. Swaps DOM fragments based on a reactive\n * condition. Used by the compiler for :if directives and <Show>.\n */\nexport function renderConditional(\n parent: Node,\n anchor: Node,\n condition: () => boolean,\n trueBranch: () => Node,\n falseBranch?: () => Node,\n): () => void {\n let current: ConditionalBlock | null = null;\n\n // Capture scope so children created in branches inherit provide/inject context\n const scope = getCurrentScope();\n\n const dispose = effect(\n () => {\n const value = condition();\n\n // Remove old nodes\n if (current) {\n for (const node of current.nodes) {\n try { node.parentNode?.removeChild(node); } catch {}\n }\n current.dispose?.();\n current = null;\n }\n\n // Insert new nodes — use anchor.parentNode since the anchor may have\n // moved from the initial DocumentFragment into the real DOM.\n // In table contexts, the browser may relocate comment anchors.\n const branch = value ? trueBranch : falseBranch;\n let liveParent: Node | null = anchor.parentNode;\n if (!liveParent && (current as ConditionalBlock | null)?.nodes[0]?.parentNode) {\n liveParent = (current as ConditionalBlock | null)!.nodes[0].parentNode;\n }\n if (branch && liveParent) {\n const fragment = scope ? runInScope(scope, branch) : branch();\n const nodes = fragment instanceof DocumentFragment\n ? Array.from(fragment.childNodes)\n : [fragment];\n for (const node of nodes) {\n liveParent.insertBefore(node, anchor);\n }\n current = { nodes, dispose: null };\n }\n },\n { render: true },\n );\n\n return () => {\n dispose();\n if (current) {\n for (const node of current.nodes) {\n try { node.parentNode?.removeChild(node); } catch {}\n }\n current.dispose?.();\n }\n };\n}\n\n// --- List rendering ---\n\ninterface ListItem<T> {\n key: unknown;\n value: T;\n nodes: Node[];\n dispose: (() => void) | null;\n}\n\n/**\n * Render a reactive list with keyed reconciliation.\n * Used by the compiler for :for directives and <For>.\n */\nexport function renderList<T>(\n parent: Node,\n anchor: Node,\n items: () => T[],\n keyFn: (item: T, index: number) => unknown,\n renderItem: (item: T, index: number) => Node,\n): () => void {\n let currentItems: ListItem<T>[] = [];\n\n // Capture scope so children created in renderItem inherit provide/inject context\n const scope = getCurrentScope();\n\n function createItem(data: T, index: number, key: unknown): ListItem<T> {\n const fragment = scope ? runInScope(scope, () => renderItem(data, index)) : renderItem(data, index);\n const nodes = fragment instanceof DocumentFragment\n ? Array.from(fragment.childNodes)\n : [fragment];\n return { key, value: data, nodes, dispose: null };\n }\n\n const dispose = effect(\n () => {\n const newData = items();\n const oldItems = currentItems;\n const oldLen = oldItems.length;\n const newLen = newData.length;\n\n // Fast path: first render\n if (oldLen === 0) {\n const newItems: ListItem<T>[] = new Array(newLen);\n const liveParent = anchor.parentNode;\n for (let i = 0; i < newLen; i++) {\n const data = newData[i];\n const item = createItem(data, i, keyFn(data, i));\n newItems[i] = item;\n if (liveParent) {\n for (let j = 0; j < item.nodes.length; j++) {\n liveParent.insertBefore(item.nodes[j], anchor);\n }\n }\n }\n currentItems = newItems;\n return;\n }\n\n // Fast path: clear all\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n const item = oldItems[i];\n for (let j = 0; j < item.nodes.length; j++) {\n const n = item.nodes[j];\n if (n.parentNode) n.parentNode.removeChild(n);\n }\n item.dispose?.();\n }\n currentItems = [];\n return;\n }\n\n // Build old key → index map\n const oldKeyMap = new Map<unknown, number>();\n for (let i = 0; i < oldLen; i++) {\n oldKeyMap.set(oldItems[i].key, i);\n }\n\n // Build new items array, reusing existing ListItems by key\n const newItems: ListItem<T>[] = new Array(newLen);\n // newToOld[i] = index in old array, or -1 if new\n const newToOld: number[] = new Array(newLen);\n\n for (let i = 0; i < newLen; i++) {\n const data = newData[i];\n const key = keyFn(data, i);\n const oldIdx = oldKeyMap.get(key);\n\n if (oldIdx !== undefined) {\n oldKeyMap.delete(key);\n const existing = oldItems[oldIdx];\n // Check if nodes are still attached\n if (existing.nodes[0] && !existing.nodes[0].parentNode) {\n newItems[i] = createItem(data, i, key);\n newToOld[i] = -1;\n } else {\n existing.value = data;\n newItems[i] = existing;\n newToOld[i] = oldIdx;\n }\n } else {\n newItems[i] = createItem(data, i, key);\n newToOld[i] = -1;\n }\n }\n\n // Remove items no longer in list\n for (const oldIdx of oldKeyMap.values()) {\n const item = oldItems[oldIdx];\n for (let j = 0; j < item.nodes.length; j++) {\n const n = item.nodes[j];\n if (n.parentNode) n.parentNode.removeChild(n);\n }\n item.dispose?.();\n }\n\n // LIS-based reconciliation: compute which items are already in order\n const lisIndices = longestIncreasingSubsequence(newToOld);\n const lisSet = new Set<number>();\n for (let i = 0; i < lisIndices.length; i++) lisSet.add(lisIndices[i]);\n\n // Walk backwards through new items. Items in the LIS stay in place.\n // Items NOT in the LIS (moves + inserts) get insertBefore'd.\n const liveParent = anchor.parentNode;\n if (liveParent) {\n let nextSibling: Node = anchor;\n for (let i = newLen - 1; i >= 0; i--) {\n const item = newItems[i];\n if (lisSet.has(i)) {\n // In LIS — already in correct relative order, just update nextSibling\n nextSibling = item.nodes[0];\n } else {\n // Not in LIS — move or insert before nextSibling\n for (let j = 0; j < item.nodes.length; j++) {\n liveParent.insertBefore(item.nodes[j], nextSibling);\n }\n nextSibling = item.nodes[0];\n }\n }\n }\n\n currentItems = newItems;\n },\n { render: true },\n );\n\n return () => {\n dispose();\n for (const item of currentItems) {\n for (let j = 0; j < item.nodes.length; j++) {\n const n = item.nodes[j];\n if (n.parentNode) n.parentNode.removeChild(n);\n }\n item.dispose?.();\n }\n currentItems = [];\n };\n}\n\n/** LIS for renderList — returns indices into arr that form the longest increasing subsequence */\nfunction longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n const tails: number[] = [];\n const predecessors: number[] = new Array(n).fill(-1);\n const indices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n if (arr[i] === -1) continue;\n let lo = 0, hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid] < arr[i]) lo = mid + 1; else hi = mid;\n }\n tails[lo] = arr[i];\n indices[lo] = i;\n if (lo > 0) predecessors[i] = indices[lo - 1];\n }\n\n const result: number[] = new Array(tails.length);\n let k = indices[tails.length - 1];\n for (let i = tails.length - 1; i >= 0; i--) {\n result[i] = k;\n k = predecessors[k];\n }\n return result;\n}\n\n// --- Built-in control flow components ---\n\n/** Props for the <Show> component */\nexport interface ShowProps<T> {\n when: (() => T | null | undefined | false) | T | null | undefined | false;\n fallback?: () => AkashNode;\n children: (value: T) => AkashNode;\n}\n\n/**\n * <Show> component — conditionally renders children with type narrowing.\n * The children callback receives the non-null/undefined value.\n * `when` can be a reactive getter or a static value.\n */\nexport function Show<T>(props: ShowProps<T>): Node {\n const anchor = createAnchor('show');\n const container = document.createDocumentFragment();\n container.appendChild(anchor);\n\n // Resolve when — if it's a function, always call it (supports both\n // compiler-generated __reactive getters and plain programmatic functions)\n const getWhen = typeof props.when === 'function'\n ? props.when as () => T | null | undefined | false\n : () => props.when as T | null | undefined | false;\n\n // Capture the when value once per evaluation so the condition check\n // and the children callback receive the same value (fixes nested For contexts)\n let whenValue: T | null | undefined | false;\n renderConditional(\n container,\n anchor,\n () => { whenValue = getWhen(); return !!whenValue; },\n () => nodeToDOM(props.children(whenValue as T)),\n props.fallback ? () => nodeToDOM(props.fallback!()) : undefined,\n );\n\n return container;\n}\n\n/** Props for the <For> component */\nexport interface ForProps<T> {\n each: (() => T[]) | T[];\n key: (item: T) => unknown;\n children: (item: T, index: number) => AkashNode;\n}\n\n/**\n * <For> component — renders a list with keyed reconciliation.\n * `each` can be a reactive getter or a static array.\n */\nexport function For<T>(props: ForProps<T>): Node {\n const anchor = createAnchor('for');\n const container = document.createDocumentFragment();\n container.appendChild(anchor);\n\n // Resolve each — if it's a function, always call it (supports both\n // compiler-generated __reactive getters and plain programmatic functions)\n const getEach = typeof props.each === 'function'\n ? props.each as () => T[]\n : () => props.each as T[];\n\n renderList(\n container,\n anchor,\n getEach,\n props.key,\n (item, index) => nodeToDOM(props.children(item, index)),\n );\n\n return container;\n}\n\n// --- Helpers ---\n\n/** Convert an AkashNode to a DOM Node */\nexport function nodeToDOM(node: AkashNode): Node {\n if (node == null || typeof node === 'boolean') {\n return document.createTextNode('');\n }\n if (typeof node === 'string' || typeof node === 'number') {\n return document.createTextNode(String(node));\n }\n if (node instanceof Node) {\n return node;\n }\n if (Array.isArray(node)) {\n const fragment = document.createDocumentFragment();\n for (const child of node) {\n fragment.appendChild(nodeToDOM(child));\n }\n return fragment;\n }\n return document.createTextNode(String(node));\n}\n\n/** Insert a node into a parent before an anchor */\nexport function insert(parent: Node, node: AkashNode, anchor?: Node): void {\n const domNode = nodeToDOM(node);\n if (anchor) {\n parent.insertBefore(domNode, anchor);\n } else {\n parent.appendChild(domNode);\n }\n}\n","/**\n * Component system.\n *\n * Components are functions. defineComponent() wraps a setup function\n * that runs once, establishes signals and effects, and returns a\n * render function that produces DOM nodes.\n */\n\nimport { effect, untrack } from './signals.js';\nimport { pushScope, popScope, getCurrentScope } from './context.js';\nimport { nodeToDOM } from './dom.js';\nimport { akashError } from './errors.js';\nimport type { AkashNode } from './types.js';\n\n// --- Reactive getter marker (used by compiler) ---\n\n/** Mark a function as a compiler-generated reactive getter */\nexport function __getter<T>(fn: () => T): (() => T) & { __reactive: true } {\n (fn as any).__reactive = true;\n return fn as any;\n}\n\n// --- Types ---\n\nexport interface Ref<T = HTMLElement> {\n current: T | undefined;\n}\n\nexport interface ComponentContext<P extends Record<string, unknown> = Record<string, unknown>> {\n props: Readonly<P>;\n children: () => AkashNode;\n}\n\nexport type Component<P extends Record<string, unknown> = Record<string, unknown>> = {\n (props: P & { children?: AkashNode | (() => AkashNode) }): Node;\n _akash: true;\n};\n\n// --- Lifecycle hook storage ---\n\ninterface LifecycleHooks {\n mount: Array<() => void | (() => void)>;\n unmount: Array<() => void>;\n error: Array<(error: Error) => void>;\n}\n\nlet currentHooks: LifecycleHooks | null = null;\n\n// --- Public lifecycle hooks ---\n\n/**\n * Register a callback to run after the component is mounted to the DOM.\n * If the callback returns a function, it will be called on unmount (cleanup).\n */\nexport function onMount(fn: () => void | (() => void)): void {\n if (!currentHooks) {\n throw akashError('AK0020');\n }\n currentHooks.mount.push(fn);\n}\n\n/**\n * Register a callback to run before the component is unmounted.\n */\nexport function onUnmount(fn: () => void): void {\n if (!currentHooks) {\n throw akashError('AK0021');\n }\n currentHooks.unmount.push(fn);\n}\n\n/**\n * Register an error handler for this component and its descendants.\n */\nexport function onError(fn: (error: Error) => void): void {\n if (!currentHooks) {\n throw akashError('AK0022');\n }\n currentHooks.error.push(fn);\n}\n\n/**\n * Create a ref for accessing a DOM element or storing a mutable value.\n */\nexport function ref<T = HTMLElement>(initialValue?: T): Ref<T> {\n return { current: initialValue as T | undefined };\n}\n\n// --- defineComponent ---\n\n/**\n * Define a component. The setup function runs once per instance.\n * It receives a context with typed props and must return a render function.\n *\n * ```ts\n * const Counter = defineComponent<{ initial: number }>((ctx) => {\n * const count = signal(ctx.props.initial);\n * return () => <div>{count()}</div>;\n * });\n * ```\n */\nexport function defineComponent<P extends Record<string, any> = Record<string, any>>(\n setup: (ctx: ComponentContext<P>) => () => AkashNode,\n): Component<P> {\n const component = (rawProps: P & { children?: AkashNode | (() => AkashNode) }): Node => {\n // Separate children from props, unwrap getter functions for reactivity\n const { children: childrenProp, ...restProps } = rawProps ?? {};\n // Props are passed through as-is — no auto-unwrapping.\n // Components use readProp() to unwrap reactive getters/signals inside\n // effects, which preserves dependency tracking. Auto-unwrapping in the\n // Proxy broke reactivity because it called the getter once and returned\n // the plain value, so effects never subscribed to the underlying signal.\n const props = restProps as unknown as P;\n\n const childrenFn: () => AkashNode =\n typeof childrenProp === 'function'\n ? childrenProp\n : () => childrenProp ?? null;\n\n const ctx: ComponentContext<P> = {\n props,\n children: childrenFn,\n };\n\n // Set up lifecycle hooks collector\n const hooks: LifecycleHooks = { mount: [], unmount: [], error: [] };\n const prevHooks = currentHooks;\n currentHooks = hooks;\n\n // Push context scope for provide/inject\n const parentScope = getCurrentScope();\n const scope = pushScope(parentScope);\n\n let renderFn: () => AkashNode;\n let domNode: Node;\n\n try {\n // Untrack component creation so that signals created inside the component\n // don't register with a parent render effect. This prevents parent effects\n // from re-running (and re-creating the entire component) when internal\n // component state changes. The component's own effects still track their\n // dependencies because effect() sets its own subscriber during execution.\n domNode = untrack(() => {\n renderFn = setup(ctx);\n if (typeof renderFn !== 'function') { throw akashError('AK0040'); }\n const rendered = renderFn();\n return nodeToDOM(rendered);\n });\n } catch (err) {\n popScope(scope);\n currentHooks = prevHooks;\n if (hooks.error.length > 0) {\n for (const handler of hooks.error) {\n handler(err instanceof Error ? err : new Error(String(err)));\n }\n return document.createComment('error');\n }\n throw err;\n }\n\n // Restore parent state\n popScope(scope);\n currentHooks = prevHooks;\n\n // Run mount callbacks (microtask to ensure DOM is attached)\n if (hooks.mount.length > 0) {\n queueMicrotask(() => {\n for (const mountFn of hooks.mount) {\n try {\n const cleanup = mountFn();\n if (typeof cleanup === 'function') {\n hooks.unmount.push(cleanup);\n }\n } catch (err) {\n for (const handler of hooks.error) {\n handler(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }\n });\n }\n\n return domNode;\n };\n\n component._akash = true as const;\n return component as Component<P>;\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
'use strict';var chunkHL2VGVJT_cjs=require('./chunk-HL2VGVJT.cjs');async function j(a,t=1){return typeof indexedDB>"u"?Promise.reject(new Error("IndexedDB not available")):new Promise((d,r)=>{try{let n=indexedDB.open(a,t);n.onupgradeneeded=()=>{let i=n.result;i.objectStoreNames.contains("items")||i.createObjectStore("items"),i.objectStoreNames.contains("pending")||i.createObjectStore("pending",{autoIncrement:!0});},n.onsuccess=()=>d(n.result),n.onerror=()=>r(n.error??new Error("IndexedDB open failed"));}catch(n){r(n);}})}async function x(a,t){return new Promise((d,r)=>{let i=a.transaction(t,"readonly").objectStore(t).getAll();i.onsuccess=()=>d(i.result),i.onerror=()=>r(i.error);})}async function D(a,t,d,r){return new Promise((n,i)=>{let l=a.transaction(t,"readwrite");l.objectStore(t).put(r,d),l.oncomplete=()=>n(),l.onerror=()=>i(l.error);})}async function B(a,t,d){return new Promise((r,n)=>{let i=a.transaction(t,"readwrite");i.objectStore(t).delete(d),i.oncomplete=()=>r(),i.onerror=()=>n(i.error);})}async function p(a,t){return new Promise((d,r)=>{let n=a.transaction(t,"readwrite");n.objectStore(t).clear(),n.oncomplete=()=>d(),n.onerror=()=>r(n.error);})}function A(a,t={}){let d=t.keyField??"id",r=chunkHL2VGVJT_cjs.c([]),n=chunkHL2VGVJT_cjs.c([]),i=chunkHL2VGVJT_cjs.c(false),l=chunkHL2VGVJT_cjs.c(typeof navigator<"u"&&navigator.onLine!=null?!!navigator.onLine:true),b=chunkHL2VGVJT_cjs.d(()=>n().length),o=null,m=null,T=false;typeof window<"u"&&(window.addEventListener("online",()=>{l.set(true),v();}),window.addEventListener("offline",()=>l.set(false)));async function O(){if(!(typeof indexedDB>"u"))try{o=await j(`akash-offline-${a}`,t.version??1);let e=await x(o,"items");r.set(e);let s=await x(o,"pending");n.set(s);}catch(e){console.error("[AkashJS] Offline store init failed:",e);}}let k=O();if(t.sync){let e=t.sync.interval??3e4;m=setInterval(()=>{l()&&b()>0&&!i()&&v();},e);}function g(e){return String(e[d])}function w(e){let s=g(e);r.update(c=>{let f=c.findIndex(u=>g(u)===s);if(f!==-1){let u=[...c];return u[f]=e,u}return [...c,e]}),S({type:"put",key:s,value:e,timestamp:Date.now()}),o&&D(o,"items",s,e);}function I(e){r.update(s=>s.filter(c=>g(c)!==e)),S({type:"delete",key:e,timestamp:Date.now()}),o&&B(o,"items",e);}function S(e){n.update(s=>[...s,e]),o&&o.transaction("pending","readwrite").objectStore("pending").add(e);}async function v(){if(await k,!t.sync||i()||T)return;let e=n();if(e.length===0)return;i.set(true);let s=t.sync.fetch??globalThis.fetch.bind(globalThis);try{if((await s(t.sync.url,{method:"POST",headers:{"Content-Type":"application/json",...t.sync.headers},body:JSON.stringify({ops:e})})).ok){n.set([]),o&&await p(o,"pending");let f=await s(t.sync.url,{headers:t.sync.headers});if(f.ok){let u=await f.json();if(r.set(u),o){await p(o,"items");for(let P of u)await D(o,"items",g(P),P);}}}}catch(c){console.warn("[AkashJS] Offline sync failed:",c);}finally{i.set(false);}}return {items:()=>r(),data:()=>r(),get(e){return r().find(s=>g(s)===e)},put:w,add:w,update(e,s){let c=r().find(f=>g(f)===e);c&&w({...c,...s});},remove:I,clear(){r.set([]),n.set([]),o&&(p(o,"items"),p(o,"pending"));},pending:b,syncing:()=>i(),online:()=>l(),sync:v,dispose(){T=true,m&&clearInterval(m),o?.close();}}}exports.a=A;//# sourceMappingURL=chunk-LTMDSGQ6.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-LTMDSGQ6.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/offline.ts"],"names":["openDB","name","version","resolve","reject","request","db","err","idbGetAll","store","req","idbPut","key","value","tx","idbDelete","idbClear","createOfflineStore","options","keyField","items","signal","pendingOps","syncing","online","pending","computed","syncTimer","disposed","syncNow","init","stored","ops","initPromise","interval","getKey","item","put","list","idx","i","next","queueOp","remove","op","fetchFn","serverResponse","serverItems","partial","existing"],"mappings":"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","file":"chunk-2LKFIID7.cjs","sourcesContent":["/**\n * Offline-first store with IndexedDB persistence and background sync.\n *\n * Data persists across page reloads. Changes made offline queue up\n * and sync automatically when connection returns. Conflict resolution\n * via configurable strategies (last-write-wins, merge, custom).\n *\n * ```ts\n * const todos = createOfflineStore('todos', {\n * sync: { url: '/api/todos', strategy: 'last-write-wins' },\n * });\n *\n * todos.add({ id: '1', text: 'Buy milk', done: false });\n * todos.items(); // reactive list\n * todos.syncing(); // boolean\n * todos.pending(); // number of unsynced changes\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type ConflictStrategy = 'last-write-wins' | 'client-wins' | 'server-wins' | 'manual';\n\nexport interface OfflineStoreOptions<T> {\n /** Sync configuration */\n sync?: {\n /** Server URL for sync */\n url: string;\n /** Conflict resolution strategy (default: 'last-write-wins') */\n strategy?: ConflictStrategy;\n /** Sync interval in ms (default: 30000) */\n interval?: number;\n /** Custom fetch */\n fetch?: typeof globalThis.fetch;\n /** Auth headers */\n headers?: Record<string, string>;\n };\n /** Key field for items (default: 'id') */\n keyField?: string;\n /** Version for schema migrations */\n version?: number;\n}\n\nexport interface OfflineStore<T extends Record<string, unknown>> {\n /** All items (reactive) */\n items: ReadonlySignal<T[]>;\n /** Alias for items (reactive) */\n data: ReadonlySignal<T[]>;\n /** Get a single item by key */\n get(key: string): T | undefined;\n /** Add or update an item */\n put(item: T): void;\n /** Add a new item */\n add(item: T): void;\n /** Update an existing item */\n update(key: string, partial: Partial<T>): void;\n /** Remove an item by key */\n remove(key: string): void;\n /** Clear all items */\n clear(): void;\n /** Number of unsynced changes */\n pending: ReadonlySignal<number>;\n /** Whether sync is in progress */\n syncing: ReadonlySignal<boolean>;\n /** Whether online */\n online: ReadonlySignal<boolean>;\n /** Force a sync now */\n sync(): Promise<void>;\n /** Dispose the store (stop sync, close DB) */\n dispose(): void;\n}\n\n/** An operation in the change queue */\ninterface PendingOp<T> {\n type: 'put' | 'delete';\n key: string;\n value?: T;\n timestamp: number;\n}\n\n// =========================================================================\n// IndexedDB wrapper\n// =========================================================================\n\nasync function openDB(name: string, version = 1): Promise<IDBDatabase> {\n if (typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('IndexedDB not available'));\n }\n return new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(name, version);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains('items')) {\n db.createObjectStore('items');\n }\n if (!db.objectStoreNames.contains('pending')) {\n db.createObjectStore('pending', { autoIncrement: true });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB open failed'));\n } catch (err) {\n reject(err);\n }\n });\n}\n\nasync function idbGetAll<T>(db: IDBDatabase, store: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readonly');\n const req = tx.objectStore(store).getAll();\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(db: IDBDatabase, store: string, key: string, value: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).put(value, key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbDelete(db: IDBDatabase, store: string, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).delete(key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbClear(db: IDBDatabase, store: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n// =========================================================================\n// createOfflineStore\n// =========================================================================\n\n/**\n * Create an offline-first store backed by IndexedDB.\n */\nexport function createOfflineStore<T extends Record<string, unknown>>(\n name: string,\n options: OfflineStoreOptions<T> = {},\n): OfflineStore<T> {\n const keyField = options.keyField ?? 'id';\n const items = signal<T[]>([]);\n const pendingOps = signal<PendingOp<T>[]>([]);\n const syncing = signal(false);\n const online = signal(typeof navigator !== 'undefined' && navigator.onLine != null ? !!navigator.onLine : true);\n const pending = computed(() => pendingOps().length);\n\n let db: IDBDatabase | null = null;\n let syncTimer: ReturnType<typeof setInterval> | null = null;\n let disposed = false;\n\n // Online/offline tracking\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => {\n online.set(true);\n syncNow();\n });\n window.addEventListener('offline', () => online.set(false));\n }\n\n // Initialize — load from IndexedDB\n async function init(): Promise<void> {\n if (typeof indexedDB === 'undefined') return;\n try {\n db = await openDB(`akash-offline-${name}`, options.version ?? 1);\n const stored = await idbGetAll<T>(db, 'items');\n items.set(stored);\n const ops = await idbGetAll<PendingOp<T>>(db, 'pending');\n pendingOps.set(ops);\n } catch (err) { console.error('[AkashJS] Offline store init failed:', err); }\n }\n\n const initPromise = init();\n\n // Start periodic sync\n if (options.sync) {\n const interval = options.sync.interval ?? 30000;\n syncTimer = setInterval(() => {\n if (online() && pending() > 0 && !syncing()) {\n syncNow();\n }\n }, interval);\n }\n\n function getKey(item: T): string {\n return String((item as any)[keyField]);\n }\n\n function put(item: T): void {\n const key = getKey(item);\n items.update((list) => {\n const idx = list.findIndex((i) => getKey(i) === key);\n if (idx !== -1) {\n const next = [...list];\n next[idx] = item;\n return next;\n }\n return [...list, item];\n });\n\n queueOp({ type: 'put', key, value: item, timestamp: Date.now() });\n if (db) idbPut(db, 'items', key, item);\n }\n\n function remove(key: string): void {\n items.update((list) => list.filter((i) => getKey(i) !== key));\n queueOp({ type: 'delete', key, timestamp: Date.now() });\n if (db) idbDelete(db, 'items', key);\n }\n\n function queueOp(op: PendingOp<T>): void {\n pendingOps.update((ops) => [...ops, op]);\n if (db) {\n const tx = db.transaction('pending', 'readwrite');\n tx.objectStore('pending').add(op);\n }\n }\n\n async function syncNow(): Promise<void> {\n await initPromise;\n if (!options.sync || syncing() || disposed) return;\n const ops = pendingOps();\n if (ops.length === 0) return;\n\n syncing.set(true);\n const fetchFn = options.sync.fetch ?? globalThis.fetch.bind(globalThis);\n\n try {\n const response = await fetchFn(options.sync.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.sync.headers,\n },\n body: JSON.stringify({ ops }),\n });\n\n if (response.ok) {\n pendingOps.set([]);\n if (db) await idbClear(db, 'pending');\n\n // Fetch latest server state\n const serverResponse = await fetchFn(options.sync.url, {\n headers: options.sync.headers,\n });\n if (serverResponse.ok) {\n const serverItems = await serverResponse.json() as T[];\n items.set(serverItems);\n // Update IndexedDB\n if (db) {\n await idbClear(db, 'items');\n for (const item of serverItems) {\n await idbPut(db, 'items', getKey(item), item);\n }\n }\n }\n }\n } catch (err) { console.warn('[AkashJS] Offline sync failed:', err); }\n finally {\n syncing.set(false);\n }\n }\n\n return {\n items: () => items(),\n data: () => items(),\n get(key: string) { return items().find((i) => getKey(i) === key); },\n put,\n add: put,\n update(key: string, partial: Partial<T>) {\n const existing = items().find((i) => getKey(i) === key);\n if (existing) put({ ...existing, ...partial });\n },\n remove,\n clear() {\n items.set([]);\n pendingOps.set([]);\n if (db) {\n idbClear(db, 'items');\n idbClear(db, 'pending');\n }\n },\n pending,\n syncing: () => syncing(),\n online: () => online(),\n sync: syncNow,\n dispose() {\n disposed = true;\n if (syncTimer) clearInterval(syncTimer);\n db?.close();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/offline.ts"],"names":["openDB","name","version","resolve","reject","request","db","err","idbGetAll","store","req","idbPut","key","value","tx","idbDelete","idbClear","createOfflineStore","options","keyField","items","signal","pendingOps","syncing","online","pending","computed","syncTimer","disposed","syncNow","init","stored","ops","initPromise","interval","getKey","item","put","list","idx","i","next","queueOp","remove","op","fetchFn","serverResponse","serverItems","partial","existing"],"mappings":"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","file":"chunk-LTMDSGQ6.cjs","sourcesContent":["/**\n * Offline-first store with IndexedDB persistence and background sync.\n *\n * Data persists across page reloads. Changes made offline queue up\n * and sync automatically when connection returns. Conflict resolution\n * via configurable strategies (last-write-wins, merge, custom).\n *\n * ```ts\n * const todos = createOfflineStore('todos', {\n * sync: { url: '/api/todos', strategy: 'last-write-wins' },\n * });\n *\n * todos.add({ id: '1', text: 'Buy milk', done: false });\n * todos.items(); // reactive list\n * todos.syncing(); // boolean\n * todos.pending(); // number of unsynced changes\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type ConflictStrategy = 'last-write-wins' | 'client-wins' | 'server-wins' | 'manual';\n\nexport interface OfflineStoreOptions<T> {\n /** Sync configuration */\n sync?: {\n /** Server URL for sync */\n url: string;\n /** Conflict resolution strategy (default: 'last-write-wins') */\n strategy?: ConflictStrategy;\n /** Sync interval in ms (default: 30000) */\n interval?: number;\n /** Custom fetch */\n fetch?: typeof globalThis.fetch;\n /** Auth headers */\n headers?: Record<string, string>;\n };\n /** Key field for items (default: 'id') */\n keyField?: string;\n /** Version for schema migrations */\n version?: number;\n}\n\nexport interface OfflineStore<T extends Record<string, unknown>> {\n /** All items (reactive) */\n items: ReadonlySignal<T[]>;\n /** Alias for items (reactive) */\n data: ReadonlySignal<T[]>;\n /** Get a single item by key */\n get(key: string): T | undefined;\n /** Add or update an item */\n put(item: T): void;\n /** Add a new item */\n add(item: T): void;\n /** Update an existing item */\n update(key: string, partial: Partial<T>): void;\n /** Remove an item by key */\n remove(key: string): void;\n /** Clear all items */\n clear(): void;\n /** Number of unsynced changes */\n pending: ReadonlySignal<number>;\n /** Whether sync is in progress */\n syncing: ReadonlySignal<boolean>;\n /** Whether online */\n online: ReadonlySignal<boolean>;\n /** Force a sync now */\n sync(): Promise<void>;\n /** Dispose the store (stop sync, close DB) */\n dispose(): void;\n}\n\n/** An operation in the change queue */\ninterface PendingOp<T> {\n type: 'put' | 'delete';\n key: string;\n value?: T;\n timestamp: number;\n}\n\n// =========================================================================\n// IndexedDB wrapper\n// =========================================================================\n\nasync function openDB(name: string, version = 1): Promise<IDBDatabase> {\n if (typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('IndexedDB not available'));\n }\n return new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(name, version);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains('items')) {\n db.createObjectStore('items');\n }\n if (!db.objectStoreNames.contains('pending')) {\n db.createObjectStore('pending', { autoIncrement: true });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB open failed'));\n } catch (err) {\n reject(err);\n }\n });\n}\n\nasync function idbGetAll<T>(db: IDBDatabase, store: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readonly');\n const req = tx.objectStore(store).getAll();\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(db: IDBDatabase, store: string, key: string, value: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).put(value, key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbDelete(db: IDBDatabase, store: string, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).delete(key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbClear(db: IDBDatabase, store: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n// =========================================================================\n// createOfflineStore\n// =========================================================================\n\n/**\n * Create an offline-first store backed by IndexedDB.\n */\nexport function createOfflineStore<T extends Record<string, unknown>>(\n name: string,\n options: OfflineStoreOptions<T> = {},\n): OfflineStore<T> {\n const keyField = options.keyField ?? 'id';\n const items = signal<T[]>([]);\n const pendingOps = signal<PendingOp<T>[]>([]);\n const syncing = signal(false);\n const online = signal(typeof navigator !== 'undefined' && navigator.onLine != null ? !!navigator.onLine : true);\n const pending = computed(() => pendingOps().length);\n\n let db: IDBDatabase | null = null;\n let syncTimer: ReturnType<typeof setInterval> | null = null;\n let disposed = false;\n\n // Online/offline tracking\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => {\n online.set(true);\n syncNow();\n });\n window.addEventListener('offline', () => online.set(false));\n }\n\n // Initialize — load from IndexedDB\n async function init(): Promise<void> {\n if (typeof indexedDB === 'undefined') return;\n try {\n db = await openDB(`akash-offline-${name}`, options.version ?? 1);\n const stored = await idbGetAll<T>(db, 'items');\n items.set(stored);\n const ops = await idbGetAll<PendingOp<T>>(db, 'pending');\n pendingOps.set(ops);\n } catch (err) { console.error('[AkashJS] Offline store init failed:', err); }\n }\n\n const initPromise = init();\n\n // Start periodic sync\n if (options.sync) {\n const interval = options.sync.interval ?? 30000;\n syncTimer = setInterval(() => {\n if (online() && pending() > 0 && !syncing()) {\n syncNow();\n }\n }, interval);\n }\n\n function getKey(item: T): string {\n return String((item as any)[keyField]);\n }\n\n function put(item: T): void {\n const key = getKey(item);\n items.update((list) => {\n const idx = list.findIndex((i) => getKey(i) === key);\n if (idx !== -1) {\n const next = [...list];\n next[idx] = item;\n return next;\n }\n return [...list, item];\n });\n\n queueOp({ type: 'put', key, value: item, timestamp: Date.now() });\n if (db) idbPut(db, 'items', key, item);\n }\n\n function remove(key: string): void {\n items.update((list) => list.filter((i) => getKey(i) !== key));\n queueOp({ type: 'delete', key, timestamp: Date.now() });\n if (db) idbDelete(db, 'items', key);\n }\n\n function queueOp(op: PendingOp<T>): void {\n pendingOps.update((ops) => [...ops, op]);\n if (db) {\n const tx = db.transaction('pending', 'readwrite');\n tx.objectStore('pending').add(op);\n }\n }\n\n async function syncNow(): Promise<void> {\n await initPromise;\n if (!options.sync || syncing() || disposed) return;\n const ops = pendingOps();\n if (ops.length === 0) return;\n\n syncing.set(true);\n const fetchFn = options.sync.fetch ?? globalThis.fetch.bind(globalThis);\n\n try {\n const response = await fetchFn(options.sync.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.sync.headers,\n },\n body: JSON.stringify({ ops }),\n });\n\n if (response.ok) {\n pendingOps.set([]);\n if (db) await idbClear(db, 'pending');\n\n // Fetch latest server state\n const serverResponse = await fetchFn(options.sync.url, {\n headers: options.sync.headers,\n });\n if (serverResponse.ok) {\n const serverItems = await serverResponse.json() as T[];\n items.set(serverItems);\n // Update IndexedDB\n if (db) {\n await idbClear(db, 'items');\n for (const item of serverItems) {\n await idbPut(db, 'items', getKey(item), item);\n }\n }\n }\n }\n } catch (err) { console.warn('[AkashJS] Offline sync failed:', err); }\n finally {\n syncing.set(false);\n }\n }\n\n return {\n items: () => items(),\n data: () => items(),\n get(key: string) { return items().find((i) => getKey(i) === key); },\n put,\n add: put,\n update(key: string, partial: Partial<T>) {\n const existing = items().find((i) => getKey(i) === key);\n if (existing) put({ ...existing, ...partial });\n },\n remove,\n clear() {\n items.set([]);\n pendingOps.set([]);\n if (db) {\n idbClear(db, 'items');\n idbClear(db, 'pending');\n }\n },\n pending,\n syncing: () => syncing(),\n online: () => online(),\n sync: syncNow,\n dispose() {\n disposed = true;\n if (syncTimer) clearInterval(syncTimer);\n db?.close();\n },\n };\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
'use strict';var chunkHL2VGVJT_cjs=require('./chunk-HL2VGVJT.cjs');function M(t){let n=chunkHL2VGVJT_cjs.c(t.initial),a=chunkHL2VGVJT_cjs.c(t.context??{}),d=chunkHL2VGVJT_cjs.c([t.initial]),g=chunkHL2VGVJT_cjs.d(()=>t.states[n()]?.type==="final"),y=chunkHL2VGVJT_cjs.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.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.set([t.initial]);},history:()=>d(),can:h,nextEvents:y}}exports.a=M;//# sourceMappingURL=chunk-M2OWSNOM.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-M2OWSNOM.cjs.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":"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","file":"chunk-
|
|
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-M2OWSNOM.cjs","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"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {c}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {c}from'./chunk-2UATNCKC.js';var v=0;function h(u={}){let{maxVisible:T=5,defaultDuration:l=3e3,position:f="top-right"}=u,i=c([]),e=new Map;function o(t,s,n){let r=`toast-${++v}`,p=n?.duration??l,y=n?.dismissible??true,x={id:r,type:t,message:s,duration:p,dismissible:y,createdAt:Date.now()};if(i.update(g=>{let d=[...g,x];if(d.length>T){let O=d.shift();a(O.id);}return d}),p>0){let g=setTimeout(()=>c$1(r),p);e.set(r,g);}return r}function c$1(t){a(t),i.update(s=>s.filter(n=>n.id!==t));}function b(){for(let[t]of e)a(t);i.set([]);}function a(t){let s=e.get(t);s&&(clearTimeout(s),e.delete(t));}return {toasts:(()=>i()),position:f,success:(t,s)=>o("success",t,s),error:(t,s)=>o("error",t,s),info:(t,s)=>o("info",t,s),warning:(t,s)=>o("warning",t,s),add:o,dismiss:c$1,dismissAll:b}}export{h as a};//# sourceMappingURL=chunk-MGFRVOM5.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MGFRVOM5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/toast.ts"],"names":["idCounter","createToaster","options","maxVisible","defaultDuration","position","toasts","signal","timers","add","type","message","opts","id","duration","dismissible","toast","list","next","removed","clearTimer","timer","dismiss","t","dismissAll","msg"],"mappings":"oCAyEA,IAAIA,CAAAA,CAAY,CAAA,CAKT,SAASC,CAAAA,CAAcC,CAAAA,CAA0B,EAAC,CAAY,CACnE,GAAM,CACJ,UAAA,CAAAC,CAAAA,CAAa,EACb,eAAA,CAAAC,CAAAA,CAAkB,GAAA,CAClB,QAAA,CAAAC,CAAAA,CAAW,WACb,EAAIH,CAAAA,CAEEI,CAAAA,CAASC,CAAAA,CAAgB,EAAE,CAAA,CAC3BC,EAAS,IAAI,GAAA,CAEnB,SAASC,CAAAA,CAAIC,CAAAA,CAAiBC,CAAAA,CAAiBC,EAA6B,CAC1E,IAAMC,CAAAA,CAAK,CAAA,MAAA,EAAS,EAAEb,CAAS,GACzBc,CAAAA,CAAWF,CAAAA,EAAM,QAAA,EAAYR,CAAAA,CAC7BW,CAAAA,CAAcH,CAAAA,EAAM,aAAe,IAAA,CAEnCI,CAAAA,CAAe,CACnB,EAAA,CAAAH,CAAAA,CACA,IAAA,CAAAH,EACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAA,CAaA,GAXAT,CAAAA,CAAO,OAAQW,CAAAA,EAAS,CACtB,IAAMC,CAAAA,CAAO,CAAC,GAAGD,EAAMD,CAAK,CAAA,CAE5B,GAAIE,CAAAA,CAAK,MAAA,CAASf,CAAAA,CAAY,CAC5B,IAAMgB,CAAAA,CAAUD,CAAAA,CAAK,KAAA,EAAM,CAC3BE,CAAAA,CAAWD,EAAQ,EAAE,EACvB,CACA,OAAOD,CACT,CAAC,EAGGJ,CAAAA,CAAW,CAAA,CAAG,CAChB,IAAMO,CAAAA,CAAQ,UAAA,CAAW,IAAMC,GAAAA,CAAQT,CAAE,CAAA,CAAGC,CAAQ,CAAA,CACpDN,CAAAA,CAAO,GAAA,CAAIK,EAAIQ,CAAK,EACtB,CAEA,OAAOR,CACT,CAEA,SAASS,GAAAA,CAAQT,CAAAA,CAAkB,CACjCO,CAAAA,CAAWP,CAAE,CAAA,CACbP,EAAO,MAAA,CAAQW,CAAAA,EAASA,CAAAA,CAAK,MAAA,CAAQM,CAAAA,EAAMA,CAAAA,CAAE,KAAOV,CAAE,CAAC,EACzD,CAEA,SAASW,CAAAA,EAAmB,CAC1B,IAAA,GAAW,CAACX,CAAE,CAAA,GAAKL,CAAAA,CACjBY,CAAAA,CAAWP,CAAE,CAAA,CAEfP,CAAAA,CAAO,GAAA,CAAI,EAAE,EACf,CAEA,SAASc,CAAAA,CAAWP,CAAAA,CAAkB,CACpC,IAAMQ,CAAAA,CAAQb,CAAAA,CAAO,GAAA,CAAIK,CAAE,CAAA,CACvBQ,CAAAA,GACF,YAAA,CAAaA,CAAK,CAAA,CAClBb,EAAO,MAAA,CAAOK,CAAE,CAAA,EAEpB,CAEA,OAAO,CACL,QAAS,IAAMP,CAAAA,EAAO,CAAA,CACtB,QAAA,CAAAD,CAAAA,CACA,OAAA,CAAS,CAACoB,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,EAChD,KAAA,CAAO,CAACa,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,OAAA,CAASgB,EAAKb,CAAI,CAAA,CAC5C,IAAA,CAAM,CAACa,CAAAA,CAAKb,CAAAA,GAASH,EAAI,MAAA,CAAQgB,CAAAA,CAAKb,CAAI,CAAA,CAC1C,OAAA,CAAS,CAACa,EAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,CAAA,CAChD,GAAA,CAAAH,CAAAA,CACA,OAAA,CAAAa,GAAAA,CACA,UAAA,CAAAE,CACF,CACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/toast.ts"],"names":["idCounter","createToaster","options","maxVisible","defaultDuration","position","toasts","signal","timers","add","type","message","opts","id","duration","dismissible","toast","list","next","removed","clearTimer","timer","dismiss","t","dismissAll","msg"],"mappings":"oCAyEA,IAAIA,CAAAA,CAAY,CAAA,CAKT,SAASC,CAAAA,CAAcC,CAAAA,CAA0B,EAAC,CAAY,CACnE,GAAM,CACJ,UAAA,CAAAC,CAAAA,CAAa,EACb,eAAA,CAAAC,CAAAA,CAAkB,GAAA,CAClB,QAAA,CAAAC,CAAAA,CAAW,WACb,EAAIH,CAAAA,CAEEI,CAAAA,CAASC,CAAAA,CAAgB,EAAE,CAAA,CAC3BC,EAAS,IAAI,GAAA,CAEnB,SAASC,CAAAA,CAAIC,CAAAA,CAAiBC,CAAAA,CAAiBC,EAA6B,CAC1E,IAAMC,CAAAA,CAAK,CAAA,MAAA,EAAS,EAAEb,CAAS,GACzBc,CAAAA,CAAWF,CAAAA,EAAM,QAAA,EAAYR,CAAAA,CAC7BW,CAAAA,CAAcH,CAAAA,EAAM,aAAe,IAAA,CAEnCI,CAAAA,CAAe,CACnB,EAAA,CAAAH,CAAAA,CACA,IAAA,CAAAH,EACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAA,CAaA,GAXAT,CAAAA,CAAO,OAAQW,CAAAA,EAAS,CACtB,IAAMC,CAAAA,CAAO,CAAC,GAAGD,EAAMD,CAAK,CAAA,CAE5B,GAAIE,CAAAA,CAAK,MAAA,CAASf,CAAAA,CAAY,CAC5B,IAAMgB,CAAAA,CAAUD,CAAAA,CAAK,KAAA,EAAM,CAC3BE,CAAAA,CAAWD,EAAQ,EAAE,EACvB,CACA,OAAOD,CACT,CAAC,EAGGJ,CAAAA,CAAW,CAAA,CAAG,CAChB,IAAMO,CAAAA,CAAQ,UAAA,CAAW,IAAMC,GAAAA,CAAQT,CAAE,CAAA,CAAGC,CAAQ,CAAA,CACpDN,CAAAA,CAAO,GAAA,CAAIK,EAAIQ,CAAK,EACtB,CAEA,OAAOR,CACT,CAEA,SAASS,GAAAA,CAAQT,CAAAA,CAAkB,CACjCO,CAAAA,CAAWP,CAAE,CAAA,CACbP,EAAO,MAAA,CAAQW,CAAAA,EAASA,CAAAA,CAAK,MAAA,CAAQM,CAAAA,EAAMA,CAAAA,CAAE,KAAOV,CAAE,CAAC,EACzD,CAEA,SAASW,CAAAA,EAAmB,CAC1B,IAAA,GAAW,CAACX,CAAE,CAAA,GAAKL,CAAAA,CACjBY,CAAAA,CAAWP,CAAE,CAAA,CAEfP,CAAAA,CAAO,GAAA,CAAI,EAAE,EACf,CAEA,SAASc,CAAAA,CAAWP,CAAAA,CAAkB,CACpC,IAAMQ,CAAAA,CAAQb,CAAAA,CAAO,GAAA,CAAIK,CAAE,CAAA,CACvBQ,CAAAA,GACF,YAAA,CAAaA,CAAK,CAAA,CAClBb,EAAO,MAAA,CAAOK,CAAE,CAAA,EAEpB,CAEA,OAAO,CACL,QAAS,IAAMP,CAAAA,EAAO,CAAA,CACtB,QAAA,CAAAD,CAAAA,CACA,OAAA,CAAS,CAACoB,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,EAChD,KAAA,CAAO,CAACa,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,OAAA,CAASgB,EAAKb,CAAI,CAAA,CAC5C,IAAA,CAAM,CAACa,CAAAA,CAAKb,CAAAA,GAASH,EAAI,MAAA,CAAQgB,CAAAA,CAAKb,CAAI,CAAA,CAC1C,OAAA,CAAS,CAACa,EAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,CAAA,CAChD,GAAA,CAAAH,CAAAA,CACA,OAAA,CAAAa,GAAAA,CACA,UAAA,CAAAE,CACF,CACF","file":"chunk-MGFRVOM5.js","sourcesContent":["/**\n * Toast notification system.\n *\n * Signal-based toast queue with auto-dismiss, stacking, and positions.\n *\n * ```ts\n * const toast = createToaster();\n * toast.success('Saved!');\n * toast.error('Something went wrong');\n * toast.info('Tip: try dark mode', { duration: 5000 });\n * toast.toasts(); // reactive list of active toasts\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\nexport type ToastPosition =\n | 'top-right' | 'top-left' | 'top-center'\n | 'bottom-right' | 'bottom-left' | 'bottom-center';\n\nexport interface Toast {\n id: string;\n type: ToastType;\n message: string;\n duration: number;\n dismissible: boolean;\n createdAt: number;\n}\n\nexport interface ToastOptions {\n /** Duration in ms (default: 3000, 0 = no auto-dismiss) */\n duration?: number;\n /** Whether the toast can be manually dismissed (default: true) */\n dismissible?: boolean;\n}\n\nexport interface ToasterOptions {\n /** Max visible toasts (default: 5) */\n maxVisible?: number;\n /** Default duration in ms (default: 3000) */\n defaultDuration?: number;\n /** Position (default: 'top-right') */\n position?: ToastPosition;\n}\n\nexport interface Toaster {\n /** Active toasts (reactive signal) */\n toasts: ReadonlySignal<Toast[]>;\n /** Position setting */\n position: ToastPosition;\n /** Show a success toast */\n success(message: string, options?: ToastOptions): string;\n /** Show an error toast */\n error(message: string, options?: ToastOptions): string;\n /** Show an info toast */\n info(message: string, options?: ToastOptions): string;\n /** Show a warning toast */\n warning(message: string, options?: ToastOptions): string;\n /** Show a toast with custom type */\n add(type: ToastType, message: string, options?: ToastOptions): string;\n /** Dismiss a specific toast */\n dismiss(id: string): void;\n /** Dismiss all toasts */\n dismissAll(): void;\n}\n\n// --- Implementation ---\n\nlet idCounter = 0;\n\n/**\n * Create a toast notification manager.\n */\nexport function createToaster(options: ToasterOptions = {}): Toaster {\n const {\n maxVisible = 5,\n defaultDuration = 3000,\n position = 'top-right',\n } = options;\n\n const toasts = signal<Toast[]>([]);\n const timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n function add(type: ToastType, message: string, opts?: ToastOptions): string {\n const id = `toast-${++idCounter}`;\n const duration = opts?.duration ?? defaultDuration;\n const dismissible = opts?.dismissible ?? true;\n\n const toast: Toast = {\n id,\n type,\n message,\n duration,\n dismissible,\n createdAt: Date.now(),\n };\n\n toasts.update((list) => {\n const next = [...list, toast];\n // Trim to maxVisible\n if (next.length > maxVisible) {\n const removed = next.shift()!;\n clearTimer(removed.id);\n }\n return next;\n });\n\n // Auto-dismiss\n if (duration > 0) {\n const timer = setTimeout(() => dismiss(id), duration);\n timers.set(id, timer);\n }\n\n return id;\n }\n\n function dismiss(id: string): void {\n clearTimer(id);\n toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n function dismissAll(): void {\n for (const [id] of timers) {\n clearTimer(id);\n }\n toasts.set([]);\n }\n\n function clearTimer(id: string): void {\n const timer = timers.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.delete(id);\n }\n }\n\n return {\n toasts: (() => toasts()) as ReadonlySignal<Toast[]>,\n position,\n success: (msg, opts) => add('success', msg, opts),\n error: (msg, opts) => add('error', msg, opts),\n info: (msg, opts) => add('info', msg, opts),\n warning: (msg, opts) => add('warning', msg, opts),\n add,\n dismiss,\n dismissAll,\n };\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {c,e}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {c,e}from'./chunk-2UATNCKC.js';function v(n){if(typeof window>"u")return(()=>false);let o=window.matchMedia(n),t=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=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=c(r);return i&&(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=c(""),t=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=c(navigator.onLine);return window.addEventListener("online",()=>n.set(true)),window.addEventListener("offline",()=>n.set(false)),(()=>n())}function T(n){let o=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=c(typeof window<"u"?window.innerWidth:0),o=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}export{v as a,S as b,b as c,h as d,E as e,T as f,L as g,R as h};//# sourceMappingURL=chunk-MNUOIAXS.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MNUOIAXS.js.map
|
|
@@ -1 +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-JQCN42XX.js","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"]}
|
|
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-MNUOIAXS.js","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"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
'use strict';var chunkHL2VGVJT_cjs=require('./chunk-HL2VGVJT.cjs');var h=class{entry;constructor(s,c){this.entry={value:s,timestamp:Date.now(),peerId:c};}get value(){return this.entry.value}get timestamp(){return this.entry.timestamp}set(s,c){let r=Date.now();return this.entry={value:s,timestamp:Math.max(r,this.entry.timestamp+1),peerId:c},true}merge(s){return s.timestamp>this.entry.timestamp||s.timestamp===this.entry.timestamp&&(!s.peerId||!this.entry.peerId||s.peerId>=this.entry.peerId)?(this.entry=s,true):false}toEntry(){return {...this.entry}}};function L(i){let s=null,c=[],r=[];return {send(n){s?.send(JSON.stringify({...n,type:"op",room:i.room}));},onReceive(n){c.push(n);let t=false;return ()=>{if(t)return;t=true;let o=c.indexOf(n);o!==-1&&c.splice(o,1);}},onPresence(n){return r.push(n),()=>{let t=r.indexOf(n);t!==-1&&r.splice(t,1);}},sendPresence(n){s?.send(JSON.stringify({type:"presence",room:i.room,data:n}));},connect(){s=new WebSocket(i.url,i.protocols),s.onmessage=n=>{try{let t=JSON.parse(n.data);if(t.type==="op")for(let o of c)o(t);else if(t.type==="presence")for(let o of r)o(t.peerId,t.data);}catch{}},s.onopen=()=>{s?.send(JSON.stringify({type:"join",room:i.room}));};},disconnect(){s?.close(),s=null;}}}function W(){let i=[],s=[];return {send(c){for(let r of i)r(c);},onReceive(c){i.push(c);let r=false;return ()=>{if(r)return;r=true;let n=i.indexOf(c);n!==-1&&i.splice(n,1);}},sendPresence(c,r){for(let n of s)n(r??"unknown",c);},onPresence(c){s.push(c);let r=false;return ()=>{if(r)return;r=true;let n=s.indexOf(c);n!==-1&&s.splice(n,1);}},connect(){},disconnect(){}}}var D=0;function _(i,s,c){let r,n;typeof i=="string"?(r=s,n=c??{}):(r=i,n=s??{});let t=n.peerId??`peer-${++D}-${Date.now()}`,o=n.transport??W(),l=new Map,u={};for(let[e,a]of Object.entries(r))l.set(e,new h(a,t)),u[e]=chunkHL2VGVJT_cjs.c(a);let y={};for(let e of Object.keys(r)){let a=u[e],d=l.get(e),p=(()=>a());p.set=k=>{d.set(k,t),a.set(k),o.send({type:"set",key:e,value:k,timestamp:d.timestamp,peerId:t});},p.update=k=>{p.set(k(a()));},p.peek=()=>a.peek(),y[e]=p;}let m=chunkHL2VGVJT_cjs.c([]),g=chunkHL2VGVJT_cjs.c(false),v=chunkHL2VGVJT_cjs.c(n.presence??{}),x=chunkHL2VGVJT_cjs.c(new Map),T=chunkHL2VGVJT_cjs.c([]);function O(e,a){if(e in u){u[e].set(a);let d=l.get(e);d&&d.set(a,t),o.send({type:"set",key:e,value:a,timestamp:Date.now(),peerId:t});}T.update(d=>d.filter(p=>p.key!==e));}let R=o.onReceive(e=>{if(e.peerId!==t&&e.type==="set"&&l.has(e.key)){let a=l.get(e.key),d=a.value,p=a.timestamp;if(n.onConflict&&p>0&&Math.abs(e.timestamp-p)<1e3&&e.peerId!==t){let w={key:e.key,localValue:d,remoteValue:e.value,localTimestamp:p,remoteTimestamp:e.timestamp,remotePeerId:e.peerId},S;try{S=n.onConflict(w);}catch(b){console.warn("[AkashJS Sync] onConflict handler threw, falling back to LWW:",b),a.merge({value:e.value,timestamp:e.timestamp,peerId:e.peerId})&&u[e.key].set(e.value),S="__fallback__";}S==="__fallback__"||(S!==void 0?(a.set(S,t),u[e.key].set(S),o.send({type:"set",key:e.key,value:S,timestamp:Date.now(),peerId:t})):T.update(b=>[...b,w]));}else a.merge({value:e.value,timestamp:e.timestamp,peerId:e.peerId})&&u[e.key].set(e.value);}}),P=v.set;v.set=e=>{P.call(v,e),o.sendPresence?.(e,t);};let C=o.onPresence?.((e,a)=>{e!==t&&x.update(d=>{let p=new Map(d);return a===null?p.delete(e):p.set(e,a),p});});return {state:y,peers:()=>m(),presence:v,peerPresence:()=>x(),conflicts:()=>T(),resolveConflict:O,peerId:t,connected:()=>g(),connect(){o.connect(),g.set(true);let e=v();Object.keys(e).length>0&&o.sendPresence?.(e,t);},disconnect(){o.sendPresence?.(null,t),o.disconnect(),g.set(false);},dispose(){o.sendPresence?.(null,t),R(),C?.(),o.disconnect();}}}function j(i,s){let c=s?.throttle??50,r=s?.target??(typeof document<"u"?document:null),n=chunkHL2VGVJT_cjs.c(0),t=chunkHL2VGVJT_cjs.c(0),o=0,l=null;function u(y){n.set(y.clientX),t.set(y.clientY);let m=Date.now();m-o>=c?(o=m,i.presence.set({...i.presence.peek?.()??{},cursor:{x:y.clientX,y:y.clientY}})):l||(l=setTimeout(()=>{l=null,o=Date.now(),i.presence.set({...i.presence.peek?.()??{},cursor:{x:n.peek(),y:t.peek()}});},c-(m-o)));}return r?.addEventListener?.("mousemove",u),{x:()=>n(),y:()=>t(),dispose(){r?.removeEventListener?.("mousemove",u),l&&clearTimeout(l);}}}function A(i,s){let c=s?.timeout??2e3,r=chunkHL2VGVJT_cjs.c(false),n=null;function t(){r.set(true),i.presence.set({...i.presence.peek?.()??{},typing:true}),n&&clearTimeout(n),n=setTimeout(o,c);}function o(){r.set(false),i.presence.set({...i.presence.peek?.()??{},typing:false}),n&&(clearTimeout(n),n=null);}let l=chunkHL2VGVJT_cjs.d(()=>{let u=i.peerPresence(),y=[];if(u instanceof Map)for(let[m,g]of u)g&&typeof g=="object"&&g.typing&&y.push(m);return y});return {isTyping:()=>r(),othersTyping:l,start:t,stop:o}}exports.a=h;exports.b=L;exports.c=W;exports.d=_;exports.e=j;exports.f=A;//# sourceMappingURL=chunk-ND2HZRMR.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-ND2HZRMR.cjs.map
|