UNPKG

woby

Version:

A high-performance framework with fine-grained observable/signal-based reactivity for building rich applications.

1,119 lines (1,117 loc) 37 kB
"use strict"; const setters = require("./setters-CyO2VUT6.cjs"); const root = require("./root-D1a_tPqg.cjs"); let counter = 0; let resolve$1 = setters.noop$1; const batch = async (fn, stack) => { if (!counter) { setters.setBatch(new Promise((r) => resolve$1 = r)); } try { counter += 1; return await fn(); } finally { counter -= 1; if (!counter) { setters.setBatch(void 0); resolve$1(stack); } } }; const isObservableBoolean = (value) => { return setters.isFunction$1(value) && setters.SYMBOL_OBSERVABLE_BOOLEAN in value; }; const isObservableFrozen = (value) => { var _a, _b; return setters.isFunction$1(value) && (setters.SYMBOL_OBSERVABLE_FROZEN in value || !!((_b = (_a = value[setters.SYMBOL_OBSERVABLE_READABLE]) == null ? void 0 : _a.parent) == null ? void 0 : _b.disposed)); }; const isUntracked = (value) => { return setters.isFunction$1(value) && (setters.SYMBOL_UNTRACKED in value || setters.SYMBOL_UNTRACKED_UNWRAPPED in value); }; class Memo extends setters.Observer { /* CONSTRUCTOR */ constructor(fn, options) { super(); this.fn = fn; this.observable = new setters.Observable(setters.UNINITIALIZED, options, this); const { stack } = options ?? { stack: setters.callStack("Memo init") }; if ((options == null ? void 0 : options.sync) === true) { this.sync = true; this.update(stack); } } /* API */ run(stack) { const result = super.refresh(this.fn, stack); if (!this.disposed && this.observables.empty()) { this.disposed = true; } if (result !== setters.UNAVAILABLE) { this.observable.set(result); } } stale(status, stack) { const statusPrev = this.status; if (statusPrev >= status) return; this.status = status; if (statusPrev === setters.DIRTY_MAYBE_YES) return; this.observable.stale(setters.DIRTY_MAYBE_YES, stack); } } const memo = (fn, options) => { const stack = (options == null ? void 0 : options.stack) ?? setters.callStack(); if (isObservableFrozen(fn)) { return fn; } else if (isUntracked(fn)) { return setters.frozen(fn(stack)); } else { const memo2 = new Memo(fn, options); const observable2 = setters.readable(memo2.observable, stack); return observable2; } }; const boolean = (value) => { if (setters.isFunction$1(value)) { if (isObservableFrozen(value) || isUntracked(value)) { return !!value(); } else if (isObservableBoolean(value)) { return value; } else { const boolean2 = memo(() => !!value()); boolean2[setters.SYMBOL_OBSERVABLE_BOOLEAN] = true; return boolean2; } } else { return !!value; } }; const disposed = (stack) => { const observable2 = new setters.Observable(false); const toggle = () => observable2.set(true); setters.cleanup(toggle); return setters.readable(observable2); }; function resolve(value) { if (setters.isFunction$1(value)) { if (setters.SYMBOL_UNTRACKED_UNWRAPPED in value) { return resolve(value()); } else if (setters.SYMBOL_UNTRACKED in value) { return setters.frozen(resolve(value())); } else if (setters.SYMBOL_OBSERVABLE in value) { return value; } else { return memo(() => resolve(value())); } } if (value instanceof Array) { const resolved = new Array(value.length); for (let i = 0, l = resolved.length; i < l; i++) { resolved[i] = resolve(value[i]); } return resolved; } else { return value; } } const DUMMY_INDEX$1 = setters.frozen(-1); let MappedRoot$1 = class MappedRoot extends root.Root { }; class CacheKeyed { /* CONSTRUCTOR */ constructor(fn) { this.parent = setters.OWNER; this.suspense = setters.OWNER.get(setters.SYMBOL_SUSPENSE); this.cache = /* @__PURE__ */ new Map(); this.bool = false; this.prevCount = 0; this.reuseCount = 0; this.nextCount = 0; this.cleanup = () => { if (!this.prevCount) return; if (this.prevCount === this.reuseCount) return; const { cache, bool } = this; if (!cache.size) return; if (this.nextCount) { cache.forEach((mapped, value) => { if (mapped.bool === bool) return; mapped.dispose(true); cache.delete(value); }); } else { this.cache.forEach((mapped) => { mapped.dispose(true); }); this.cache = /* @__PURE__ */ new Map(); } }; this.dispose = () => { if (this.suspense) { setters.lazySetDelete(this.parent, "roots", this.roots); } this.prevCount = this.cache.size; this.reuseCount = 0; this.nextCount = 0; this.cleanup(); }; this.before = () => { this.bool = !this.bool; this.reuseCount = 0; this.nextCount = 0; }; this.after = (values) => { this.nextCount = values.length; this.cleanup(); this.prevCount = this.nextCount; this.reuseCount = 0; }; this.map = (values) => { var _a; this.before(); const { cache, bool, fn: fn2, fnWithIndex } = this; const results = new Array(values.length); let resultsCached = true; let resultsUncached = true; let reuseCount = 0; const stack = setters.callStack(); for (let i = 0, l = values.length; i < l; i++) { const value = values[i]; const cached = cache.get(value); if (cached && cached.bool !== bool) { resultsUncached = false; reuseCount += 1; cached.bool = bool; (_a = cached.index) == null ? void 0 : _a.set(i); results[i] = cached.result; } else { resultsCached = false; const mapped = new MappedRoot$1(false); if (cached) { setters.cleanup(() => mapped.dispose(true)); } mapped.wrap(() => { let index = DUMMY_INDEX$1; if (fnWithIndex) { mapped.index = new setters.Observable(i); index = setters.readable(mapped.index, stack); } const result = results[i] = resolve(fn2(value, index)); mapped.bool = bool; mapped.result = result; if (!cached) { cache.set(value, mapped); } }, void 0, void 0, stack); } } this.reuseCount = reuseCount; this.after(values); if (resultsCached) { results[setters.SYMBOL_CACHED] = true; } if (resultsUncached) { results[setters.SYMBOL_UNCACHED] = true; } return results; }; this.roots = () => { return Array.from(this.cache.values()); }; this.fn = fn; this.fnWithIndex = fn.length > 1; if (this.suspense) { setters.lazySetAdd(this.parent, "roots", this.roots); } } } let Suspense$1 = class Suspense extends setters.Owner { /* CONSTRUCTOR */ constructor() { var _a; super(); this.parent = setters.OWNER; this.context = { ...setters.OWNER.context, [setters.SYMBOL_SUSPENSE]: this }; setters.lazyArrayPush(this.parent, "suspenses", this); this.suspended = ((_a = setters.OWNER.get(setters.SYMBOL_SUSPENSE)) == null ? void 0 : _a.suspended) || 0; } /* API */ toggle(force) { var _a; if (!this.suspended && !force) return; const suspendedPrev = this.suspended; const suspendedNext = suspendedPrev + (force ? 1 : -1); this.suspended = suspendedNext; if (!!suspendedPrev === !!suspendedNext) return; const stack = setters.callStack(); (_a = this.observable) == null ? void 0 : _a.set(!!suspendedNext); const notifyOwner = (owner) => { setters.lazyArrayEach(owner.contexts, notifyOwner); setters.lazyArrayEach(owner.observers, notifyObserver); setters.lazyArrayEach(owner.suspenses, notifySuspense); setters.lazySetEach(owner.roots, notifyRoot); }; const notifyObserver = (observer) => { if (observer instanceof setters.Effect) { if (observer.status === setters.DIRTY_MAYBE_YES || observer.status === setters.DIRTY_YES) { if (observer.init) { observer.update(stack); } else { observer.schedule(stack); } } } notifyOwner(observer); }; const notifyRoot = (root2) => { if (setters.isFunction$1(root2)) { root2().forEach(notifyOwner); } else { notifyOwner(root2); } }; const notifySuspense = (suspense2) => { suspense2.toggle(force); }; notifyOwner(this); } wrap(fn, owner, observer, stack) { return super.wrap(fn, this, void 0, stack); } }; const suspense = (when, fn, stack) => { const suspense2 = new Suspense$1(); const condition = boolean(when); const toggle = () => suspense2.toggle(setters.get(condition)); setters.effect(toggle, { sync: true, stack }); return suspense2.wrap(fn, void 0, void 0, stack); }; const DUMMY_INDEX = setters.frozen(-1); class MappedRoot2 extends root.Root { } class CacheUnkeyed { /* CONSTRUCTOR */ constructor(fn, pooled) { this.parent = setters.OWNER; this.suspense = setters.OWNER.get(setters.SYMBOL_SUSPENSE); this.cache = /* @__PURE__ */ new Map(); this.pool = []; this.poolMaxSize = 0; this.cleanup = () => { let pooled2 = 0; let poolable = Math.max(0, this.pooled ? this.poolMaxSize - this.pool.length : 0); this.cache.forEach((mapped) => { var _a; if (poolable > 0 && pooled2++ < poolable) { (_a = mapped.suspended) == null ? void 0 : _a.set(true); this.pool.push(mapped); } else { mapped.dispose(true); } }); }; this.dispose = () => { if (this.suspense) { setters.lazySetDelete(this.parent, "roots", this.roots); } this.cache.forEach((mapped) => { mapped.dispose(true); }); this.pool.forEach((mapped) => { mapped.dispose(true); }); }; this.map = (values) => { var _a, _b, _c, _d, _e, _f; const { cache, fn: fn2, fnWithIndex } = this; const cacheNext = /* @__PURE__ */ new Map(); const results = new Array(values.length); const pool = this.pool; const pooled2 = this.pooled; let resultsCached = true; let resultsUncached = true; let leftovers = []; const stack = setters.callStack(); if (cache.size) { for (let i = 0, l = values.length; i < l; i++) { const value = values[i]; const cached = cache.get(value); if (cached) { resultsUncached = false; cache.delete(value); cacheNext.set(value, cached); (_a = cached.index) == null ? void 0 : _a.set(i); results[i] = cached.result; } else { leftovers.push(i); } } } else { leftovers = new Array(results.length); } outer: for (let i = 0, l = leftovers.length; i < l; i++) { const index = leftovers[i] || i; const value = values[index]; const isDuplicate = cacheNext.has(value); if (!isDuplicate) { for (const [key, mapped2] of cache.entries()) { cache.delete(key); cacheNext.set(value, mapped2); (_b = mapped2.index) == null ? void 0 : _b.set(index); (_c = mapped2.value) == null ? void 0 : _c.set(value); results[index] = mapped2.result; continue outer; } } resultsCached = false; let mapped; if (pooled2 && pool.length) { mapped = pool.pop(); (_d = mapped.index) == null ? void 0 : _d.set(index); (_e = mapped.value) == null ? void 0 : _e.set(value); (_f = mapped.suspended) == null ? void 0 : _f.set(false); results[index] = mapped.result; } else { mapped = new MappedRoot2(false); mapped.wrap(() => { let $index = DUMMY_INDEX; if (fnWithIndex) { mapped.index = new setters.Observable(index); $index = setters.readable(mapped.index, stack); } const observable2 = mapped.value = new setters.Observable(value); const suspended2 = pooled2 ? new setters.Observable(false) : void 0; if (suspended2) suspended2.stack = stack; const $value = memo(() => setters.get(observable2.get())); const result = results[index] = suspended2 ? suspense(() => suspended2.get(), () => resolve(fn2($value, $index)), stack) : resolve(fn2($value, $index)); mapped.value = observable2; mapped.result = result; mapped.suspended = suspended2; }, void 0, void 0, stack); } if (isDuplicate) { setters.cleanup(() => mapped.dispose(true)); } else { cacheNext.set(value, mapped); } } this.poolMaxSize = Math.max(this.poolMaxSize, results.length); this.cleanup(); this.cache = cacheNext; if (resultsCached) { results[setters.SYMBOL_CACHED] = true; } if (resultsUncached) { results[setters.SYMBOL_UNCACHED] = true; } return results; }; this.roots = () => { return [...this.cache.values(), ...this.pool.values()]; }; this.fn = fn; this.fnWithIndex = fn.length > 1; this.pooled = pooled; if (this.suspense) { setters.lazySetAdd(this.parent, "roots", this.roots); } } } function _for(values, fn, fallback = [], options) { const stack = setters.callStack(); if (setters.isArray$1(values) && !setters.isStore(values)) { const isUnkeyed = !!(options == null ? void 0 : options.unkeyed); return setters.frozen(setters.untrack(() => { if (values.length) { return values.map((value, index) => { return resolve(fn(isUnkeyed && !setters.isObservable(value) ? setters.frozen(value) : value, index)); }); } else { return resolve(fallback); } })); } else { const { dispose, map } = (options == null ? void 0 : options.unkeyed) ? new CacheUnkeyed(fn, !!options.pooled) : new CacheKeyed(fn); setters.cleanup(dispose); const value = memo(() => { return setters.get(values) ?? []; }, { equals: (next, prev) => { return !!next && !!prev && !next.length && !prev.length && !setters.isStore(next) && !setters.isStore(prev); }, stack }); return memo(() => { const array = value(); if (setters.isStore(array)) { array[setters.SYMBOL_STORE_VALUES]; } return setters.untrack(() => { const results = map(array); return (results == null ? void 0 : results.length) ? results : resolve(fallback); }); }, { equals: (next, prev) => { return setters.isArray$1(next) && !!next[setters.SYMBOL_CACHED] && setters.isArray$1(prev) && setters.isEqual(next, prev); }, stack }); } } const warmup = (value) => { setters.untrack(value); return value; }; const match = (condition, values, fallback) => { for (let i = 0, l = values.length; i < l; i++) { const value = values[i]; if (value.length === 1) return value[0]; if (setters.is(value[0], condition)) return value[1]; } return fallback; }; function _switch(when, values, fallback) { const isDynamic = setters.isFunction$1(when) && !isObservableFrozen(when) && !isUntracked(when); if (isDynamic) { if (isObservableBoolean(when)) { return memo(() => resolve(match(when(), values, fallback))); } const value = warmup(memo(() => match(when(), values, fallback))); if (isObservableFrozen(value)) { return setters.frozen(resolve(value())); } else { return memo(() => resolve(setters.get(value))); } } else { const value = match(setters.get(when), values, fallback); return setters.frozen(resolve(value)); } } const ternary = (when, valueTrue, valueFalse) => { const condition = boolean(when); return _switch(condition, [[true, valueTrue], [valueFalse]]); }; function observable(value, options) { const stack = setters.callStack(); return setters.writable(new setters.Observable(value, options), stack); } const isObservableWritable = (value) => { return setters.isFunction$1(value) && setters.SYMBOL_OBSERVABLE_WRITABLE in value; }; const target = (observable2) => { if (setters.isFunction$1(observable2)) { return observable2[setters.SYMBOL_OBSERVABLE_READABLE] || observable2[setters.SYMBOL_OBSERVABLE_WRITABLE] || setters.UNAVAILABLE; } else { return observable2; } }; const readonly = (observable2, stack) => { if (isObservableWritable(observable2)) { return setters.readable(target(observable2), stack); } else { return observable2; } }; class DisposableMap extends Map { constructor() { super(...arguments); this.disposed = false; } } class SelectedObservable extends setters.Observable { constructor() { super(...arguments); this.count = 1; } /* API */ call() { if (this.selecteds.disposed) return; this.count -= 1; if (this.count) return; this.selecteds.delete(this.source); } } const selector = (source) => { source = warmup(memo(source)); if (isObservableFrozen(source)) { const sourceValue = setters.untrack(source); return (value) => { return value === sourceValue ? setters.OBSERVABLE_TRUE : setters.OBSERVABLE_FALSE; }; } let selecteds = new DisposableMap(); let selectedValue = setters.untrack(source); const stack = setters.callStack(); setters.effect((stack2) => { var _a, _b; const valuePrev = selectedValue; const valueNext = source(); if (setters.is(valuePrev, valueNext)) return; selectedValue = valueNext; (_a = selecteds.get(valuePrev)) == null ? void 0 : _a.set(false); (_b = selecteds.get(valueNext)) == null ? void 0 : _b.set(true); }, { suspense: false, sync: true, stack }); const cleanupAll = () => { selecteds.disposed = true; }; setters.cleanup(cleanupAll); return (value) => { let selected = selecteds.get(value); if (selected) { selected.count += 1; } else { selected = new SelectedObservable(value === selectedValue); selected.selecteds = selecteds; selected.source = value; selecteds.set(value, selected); } setters.cleanup(selected); return setters.readable(selected); }; }; const suspended = (stack) => { const suspense2 = setters.OWNER.get(setters.SYMBOL_SUSPENSE); if (!suspense2) return setters.OBSERVABLE_FALSE; const observable2 = suspense2.observable || (suspense2.observable = new setters.Observable(!!suspense2.suspended)); return setters.readable(observable2, stack); }; const tick = (stack) => { setters.Scheduler.flush(stack); }; const tryCatch = (value, fn) => { const observable$1 = observable(); return memo((stack) => { const error = observable$1(); if (error) { const reset = () => observable$1(void 0); const options = { error, reset }; return resolve(fn(options)); } else { setters.OWNER.errorHandler = observable$1; return resolve(value); } }); }; function untracked(fn) { const untracked2 = setters.isFunction$1(fn) ? (...args) => setters.untrack(() => fn(...args)) : () => fn; untracked2[setters.SYMBOL_UNTRACKED] = true; return untracked2; } function useResolved(values, callback, resolveFunction) { const isResolvable = resolveFunction !== false && callback !== false ? setters.isFunction : setters.isObservable; const resolve2 = (value) => isResolvable(value) ? value() : value; if (setters.isArray(values)) { const resolved = values.map(resolve2); if (setters.isFunction(callback)) { return callback.apply(void 0, resolved); } else { return resolved; } } else { const resolved = resolve2(values); if (setters.isFunction(callback)) { return callback(resolved); } else { return resolved; } } } function useEventListener(target2, event, handler, options) { const stack = new Error(); return setters.effect((stack2) => { const fn = setters.get(handler, false); return useResolved([target2, event, options], (target22, event2, options2) => { const targets = setters.castArray(target22); targets.forEach((target3) => { target3 == null ? void 0 : target3.addEventListener(event2, fn, options2); }); return (stack3) => { targets.forEach((target3) => { target3 == null ? void 0 : target3.removeEventListener(event2, fn, options2); }); }; }); }, { sync: "init", stack }); } const useAbortController = (signals = []) => { signals = setters.castArray(signals); const controller = new AbortController(); const abort = controller.abort.bind(controller); const aborted = signals.some((signal) => signal.aborted); if (aborted) { abort(); } else { signals.forEach((signal) => useEventListener(signal, "abort", abort)); setters.cleanup(abort); } return controller; }; const useAbortSignal = (signals = []) => { return useAbortController(signals).signal; }; const useScheduler = ({ loop, once, callback, cancel, schedule, stack }) => { let executed = false; let suspended$1 = suspended(stack); let tickId; const work = (value) => { executed = true; if (setters.get(loop)) tick2(); setters.get(callback, false)(value); }; const tick2 = () => { tickId = setters.untrack(() => schedule(work)); }; const dispose = () => { setters.untrack(() => cancel(tickId)); }; setters.effect(() => { if (once && executed) return; if (suspended$1()) return; tick2(); return dispose; }, { suspense: false, stack }); return dispose; }; const useAnimationFrame = (callback) => { const stack = new Error(); return useScheduler({ callback, once: true, cancel: cancelAnimationFrame, schedule: requestAnimationFrame, stack }); }; const useAnimationLoop = (callback) => { const stack = new Error(); return useScheduler({ callback, loop: true, cancel: cancelAnimationFrame, schedule: requestAnimationFrame, stack }); }; function useContext(Context) { const { symbol, defaultValue } = setters.CONTEXTS_DATA.get(Context) || { symbol: Symbol() }; const valueContext = setters.context(symbol); const value = setters.isNil(valueContext) ? defaultValue : valueContext; return value; } const SuspenseContext = { create: () => { const count = observable(0); const active = memo(() => !!count()); const increment = (nr = 1) => count((prev) => prev + nr); const decrement = (nr = -1) => queueMicrotask(() => count((prev) => prev + nr)); const data = { active, increment, decrement }; const collector = setters.context(setters.SYMBOL_SUSPENSE_COLLECTOR); if (collector) { collector == null ? void 0 : collector.register(data); setters.cleanup(() => collector.unregister(data)); } return data; }, get: () => { return setters.context(setters.SYMBOL_SUSPENSE$1); }, wrap: (fn) => { const data = SuspenseContext.create(); return setters.context({ [setters.SYMBOL_SUSPENSE$1]: data }, () => { return resolve(() => fn(data)); }); } }; class SuspenseManager { constructor() { this.suspenses = /* @__PURE__ */ new Map(); this.change = (suspense2, nr) => { const counter2 = this.suspenses.get(suspense2) || 0; const counterNext = Math.max(0, counter2 + nr); if (counter2 === counterNext) return; if (counterNext) { this.suspenses.set(suspense2, counterNext); } else { this.suspenses.delete(suspense2); } if (nr > 0) { suspense2.increment(nr); } else { suspense2.decrement(nr); } }; this.suspend = () => { const suspense2 = SuspenseContext.get(); if (!suspense2) return; this.change(suspense2, 1); setters.cleanup(() => { this.change(suspense2, -1); }); }; this.unsuspend = () => { this.suspenses.forEach((counter2, suspense2) => { this.change(suspense2, -counter2); }); }; } } const useResource = (fetcher) => { const pending = observable(true); const error = observable(); const value = observable(); const latest = observable(); const { suspend, unsuspend } = new SuspenseManager(); const resourcePending = { pending: true, get value() { return void suspend(); }, get latest() { return latest() ?? void suspend(); } }; const resourceRejected = { pending: false, get error() { return error(); }, get value() { throw error(); }, get latest() { throw error(); } }; const resourceResolved = { pending: false, get value() { return value(); }, get latest() { return value(); } }; const resourceFunction = { pending: () => pending(), error: () => error(), value: () => resource().value, latest: () => resource().latest }; const resource = observable(resourcePending); const stack = new Error(); setters.useRenderEffect(() => { const disposed2 = setters.useCheapDisposed(); const onPending = () => { pending(true); error(void 0); value(void 0); resource(resourcePending); }; const onResolve = (result) => { if (disposed2()) return; pending(false); error(void 0); value(() => result); latest(() => result); resource(resourceResolved); }; const onReject = (exception) => { if (disposed2()) return; pending(false); error(setters.castError(exception)); value(void 0); latest(void 0); resource(resourceRejected); }; const fetch2 = () => { try { const value2 = setters.get(fetcher()); if (setters.isPromise(value2)) { onPending(); value2.then(onResolve, onReject); value2.then(unsuspend, unsuspend); } else { onResolve(value2); } } catch (error2) { onReject(error2); } }; fetch2(); }, stack); return setters.assign(readonly(resource, stack), resourceFunction); }; const useFetch = (request, init) => { return useResource(() => { return useResolved([request, init], (request2, init2 = {}) => { const signal = useAbortSignal(init2.signal || []); init2.signal = signal; return fetch(request2, init2); }); }); }; const useIdleCallback = (callback, options) => { const stack = new Error(); return useScheduler({ callback, once: true, cancel: cancelIdleCallback, schedule: (callback2) => requestIdleCallback(callback2, setters.get(options)), stack }); }; const useIdleLoop = (callback, options) => { const stack = new Error(); return useScheduler({ callback, loop: true, cancel: cancelIdleCallback, schedule: (callback2) => requestIdleCallback(callback2, setters.get(options)), stack }); }; const useInterval = (callback, ms) => { const stack = new Error(); return useScheduler({ callback, cancel: clearInterval, schedule: (callback2) => setInterval(callback2, setters.get(ms)), stack }); }; const usePromise = (promise) => { return useResource(() => setters.get(promise)); }; const useTimeout = (callback, ms) => { const stack = new Error(); return useScheduler({ callback, once: true, cancel: clearTimeout, schedule: (callback2) => setTimeout(callback2, setters.get(ms)), stack }); }; const ErrorBoundary = ({ fallback, children }) => { return tryCatch(children, (props) => { const error = props.error instanceof Error ? props.error : new Error(String(props.error ?? "Unknown error")); const newProps = { error, reset: props.reset }; return setters.untrack(() => setters.isFunction(fallback) ? fallback(newProps) : fallback); }); }; function For({ values, fallback, unkeyed, children }) { return _for(values, children, fallback, { unkeyed }); } const useGuarded = (value, guard) => { let valueLast; const guarded = memo(() => { const current = setters.get(value); if (!guard(current)) return valueLast; return valueLast = current; }); return () => { const current = guarded(); if (setters.isNil(current)) throw new Error("The value never passed the type guard"); return current; }; }; const If = ({ when, fallback, children }) => { if (setters.isFunction(children) && !setters.isObservable(children) && !setters.isComponent(children)) { const truthy = useGuarded(when, setters.isTruthy); return ternary(when, untracked(() => children(truthy)), fallback); } else { return ternary(when, children, fallback); } }; const Suspense2 = ({ when, fallback, children }) => { return SuspenseContext.wrap((suspense$1) => { const condition = memo(() => !!setters.get(when) || suspense$1.active()); const stack = new Error(); const childrenSuspended = suspense(condition, () => resolve(children), stack); return ternary(condition, fallback, childrenSuspended); }); }; const Switch = ({ when, fallback, children }) => { const childrenWithValues = setters.castArray(children); const values = childrenWithValues.map((child) => child().metadata); return _switch(when, values, fallback); }; Switch.Case = ({ when, children }) => { const metadata = { metadata: [when, children] }; return setters.assign(() => children, metadata); }; Switch.Default = ({ children }) => { const metadata = { metadata: [children] }; return setters.assign(() => children, metadata); }; const Ternary = ({ when, children }) => { return ternary(when, children[0], children[1]); }; function createContext(defaultValue) { const symbol = Symbol(); const Provider = ({ value, children }) => { return setters.context({ [symbol]: value }, () => { return resolve(children); }); }; const Context = { Provider, symbol }; setters.CONTEXTS_DATA.set(Context, { symbol, defaultValue }); return Context; } const createDirective = (name, fn, options) => { var _a; const immediate = !!(options == null ? void 0 : options.immediate); const data = { fn, immediate }; const symbol = (_a = setters.SYMBOLS_DIRECTIVES)[name] || (_a[name] = Symbol()); const Provider = ({ children }) => { return setters.context({ [symbol]: data }, () => { return resolve(children); }); }; const ref = (...args) => { return (element) => { fn(element, ...args); }; }; const register = () => { if (symbol in setters.DIRECTIVES) throw new Error('Directive "name" is already registered'); setters.DIRECTIVES[symbol] = data; }; return { Provider, ref, register }; }; const COMPONENT_RE = /^_?[A-Z][a-zA-Z0-9$_-]*$/; const SYMBOL_AS = "__hmr_as__"; const SYMBOL_COLD_COMPONENT = Symbol("HMR.Cold"); const SYMBOL_HOT_COMPONENT = Symbol("HMR.Hot"); const SYMBOL_HOT_ID = Symbol("HMR.ID"); const SOURCES = /* @__PURE__ */ new WeakMap(); const hmr = (accept, component) => { if (accept) { const cached = component[SYMBOL_HOT_COMPONENT]; if (cached) return cached; const isProvider = !setters.isFunction(component) && "Provider" in component; if (isProvider) return component; const createHotComponent = (path) => { return (...args) => { return memo((stack2) => { var _a; const component2 = path.reduce((component3, key) => component3[key], ((_a = SOURCES.get(id(stack2))) == null ? void 0 : _a()) || source()); const result = resolve(setters.untrack(() => component2(...args))); return result; }); }; }; const createHotComponentDeep = (component2, path) => { const cached2 = component2[SYMBOL_HOT_COMPONENT]; if (cached2) return cached2; const hot2 = component2[SYMBOL_HOT_COMPONENT] = createHotComponent(path); for (const key in component2) { const value = component2[key]; if (setters.isFunction(value) && COMPONENT_RE.test(key)) { hot2[key] = createHotComponentDeep(value, [...path, key]); } else { hot2[key] = value; } } return hot2; }; const onAccept = (module2) => { var _a, _b; const hot2 = module2[component[SYMBOL_AS]] || module2[component.name] || module2.default; if (!hot2) return console.error(`[hmr] Failed to handle update for "${component.name}" component: `, component); const cold2 = hot2[SYMBOL_COLD_COMPONENT] || hot2; (_a = hot2[SYMBOL_HOT_ID]) == null ? void 0 : _a.call(hot2, id()); (_b = SOURCES.get(id())) == null ? void 0 : _b(() => cold2); }; const id = observable({}); const source = observable(component); const stack = new Error(); SOURCES.set(id(stack), source); const cold = component[SYMBOL_COLD_COMPONENT] || component; const hot = createHotComponentDeep(component, []); cold[SYMBOL_HOT_COMPONENT] = hot; hot[SYMBOL_COLD_COMPONENT] = cold; hot[SYMBOL_HOT_COMPONENT] = hot; hot[SYMBOL_HOT_ID] = id; accept(onAccept); return hot; } else { return component; } }; var n = function(t2, s, r, e) { var u; s[0] = 0; for (var h = 1; h < s.length; h++) { var p = s[h++], a = s[h] ? (s[0] |= p ? 1 : 2, r[s[h++]]) : s[++h]; 3 === p ? e[0] = a : 4 === p ? e[1] = Object.assign(e[1] || {}, a) : 5 === p ? (e[1] = e[1] || {})[s[++h]] = a : 6 === p ? e[1][s[++h]] += a + "" : p ? (u = t2.apply(a, n(t2, a, r, ["", null])), e.push(u), a[0] ? s[0] |= 2 : (s[h - 2] = 0, s[h] = u)) : e.push(a); } return e; }, t = /* @__PURE__ */ new Map(); function htm(s) { var r = t.get(this); return r || (r = /* @__PURE__ */ new Map(), t.set(this, r)), (r = n(this, r.get(s) || (r.set(s, r = function(n2) { for (var t2, s2, r2 = 1, e = "", u = "", h = [0], p = function(n3) { 1 === r2 && (n3 || (e = e.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h.push(0, n3, e) : 3 === r2 && (n3 || e) ? (h.push(3, n3, e), r2 = 2) : 2 === r2 && "..." === e && n3 ? h.push(4, n3, 0) : 2 === r2 && e && !n3 ? h.push(5, 0, true, e) : r2 >= 5 && ((e || !n3 && 5 === r2) && (h.push(r2, 0, e, s2), r2 = 6), n3 && (h.push(r2, n3, 0, s2), r2 = 6)), e = ""; }, a = 0; a < n2.length; a++) { a && (1 === r2 && p(), p(a)); for (var l = 0; l < n2[a].length; l++) t2 = n2[a][l], 1 === r2 ? "<" === t2 ? (p(), h = [h], r2 = 3) : e += t2 : 4 === r2 ? "--" === e && ">" === t2 ? (r2 = 1, e = "") : e = t2 + e[0] : u ? t2 === u ? u = "" : e += t2 : '"' === t2 || "'" === t2 ? u = t2 : ">" === t2 ? (p(), r2 = 1) : r2 && ("=" === t2 ? (r2 = 5, s2 = e, e = "") : "/" === t2 && (r2 < 5 || ">" === n2[a][l + 1]) ? (p(), 3 === r2 && (h = h[0]), r2 = h, (h = h[0]).push(2, 0, r2), r2 = 0) : " " === t2 || " " === t2 || "\n" === t2 || "\r" === t2 ? (p(), r2 = 2) : e += t2), 3 === r2 && "!--" === e && (r2 = 4, h = h[0]); } return p(), h; }(s)), r), arguments, [])).length > 1 ? r : r[0]; } function mergeStyles(style = {}, css = "") { const re = /([^:;]+)\s*:\s*([^;(]+(?:\(.*?\))?);?/igm; const genObj = (css2 = "") => { let match2; if (setters.isObject(css2)) return css2; else { const style2 = {}; while (match2 = re.exec(css2)) { const [, property, value] = match2; const trimmedProperty = property.trim(); const trimmedValue = value.trim(); style2[trimmedProperty] = trimmedValue; } return style2; } }; const sty = genObj(style); return Object.assign(sty, genObj(css)); } exports.ErrorBoundary = ErrorBoundary; exports.For = For; exports.If = If; exports.Suspense = Suspense2; exports.Switch = Switch; exports.Ternary = Ternary; exports.batch = batch; exports.boolean = boolean; exports.createContext = createContext; exports.createDirective = createDirective; exports.disposed = disposed; exports.hmr = hmr; exports.htm = htm; exports.isObservableWritable = isObservableWritable; exports.memo = memo; exports.mergeStyles = mergeStyles; exports.observable = observable; exports.readonly = readonly; exports.resolve = resolve; exports.selector = selector; exports.suspended = suspended; exports.suspense = suspense; exports.tick = tick; exports.untracked = untracked; exports.useAbortController = useAbortController; exports.useAbortSignal = useAbortSignal; exports.useAnimationFrame = useAnimationFrame; exports.useAnimationLoop = useAnimationLoop; exports.useContext = useContext; exports.useEventListener = useEventListener; exports.useFetch = useFetch; exports.useIdleCallback = useIdleCallback; exports.useIdleLoop = useIdleLoop; exports.useInterval = useInterval; exports.usePromise = usePromise; exports.useResolved = useResolved; exports.useResource = useResource; exports.useTimeout = useTimeout; //# sourceMappingURL=merge_style-DkxC2kon.cjs.map