{"version":3,"sources":["../src/hooks.ts","../src/helpers.ts","../src/writable.ts","../src/dom.ts","../src/debug.ts"],"names":["useState","useRef","useEffect","writable","hotkeys","node","locate","getID","env"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useState, useRef } from \"react\";\nimport { hotkeys } from \"@svar-ui/lib-dom\";\nimport { Writable } from \"./writable\";\n\nexport type Store<T> = {\n\tgetState: () => Record<string, T>;\n\tgetReactiveState: () => Record<string, Writable<T>>;\n};\n\nexport function useWritableProp<T>(propValue: T): [T, (value: T) => void] {\n\tconst [value, setValue] = useState<T>(propValue);\n\tconst prevPropRef = useRef(propValue);\n\n\t// Use useEffect to handle prop changes\n\tuseEffect(() => {\n\t\t// Only update if the prop has actually changed\n\t\tif (prevPropRef.current !== propValue) {\n\t\t\tif (\n\t\t\t\tArray.isArray(prevPropRef.current) &&\n\t\t\t\tArray.isArray(propValue) &&\n\t\t\t\tprevPropRef.current.length === 0 &&\n\t\t\t\tpropValue.length === 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tprevPropRef.current = propValue;\n\t\t\tsetValue(propValue);\n\t\t}\n\t}, [propValue]);\n\n\treturn [value, setValue];\n}\n\nexport function useWritable<T>(\n\twritable: Writable<T>,\n\tinitialValue: T,\n\tname: string\n): T {\n\tconst [state, setState] = useState(() => initialValue);\n\t// FIXME - `dynamic` property not set, so use ?.\n\tif (!writable) console.warn(`Writable ${name} is not defined`);\n\tuseEffect(() => {\n\t\tif (!writable) return;\n\n\t\tconst unsubscribe = writable.subscribe(newValue => {\n\t\t\t// console.log(\"useWritable\", name, newValue);\n\t\t\tsetState(() => newValue);\n\t\t});\n\n\t\treturn unsubscribe;\n\t}, [writable]);\n\treturn state;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useStore<T>(store: Store<any>, name: string): T {\n\tconst s = store.getState();\n\tconst r = store.getReactiveState();\n\treturn useWritable(r[name] as Writable<T>, s[name] as T, name);\n}\n\nexport function useStoreLater<T>(\n\tstore: Store<any> | undefined,\n\tname: string\n): T {\n\tconst [state, setState] = useState((): T | null => null);\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tconst r = store.getReactiveState();\n\t\tconst wr = r ? r[name] : null;\n\t\tif (!wr) return;\n\n\t\tconst unsubscribe = wr.subscribe((newValue: T) => setState(() => newValue));\n\t\treturn unsubscribe;\n\t}, [store, name]);\n\treturn state;\n}\n\nexport function useWritableWithCounter<T>(\n\twritable: Writable<T>,\n\tinitialValue: T\n): [T, number] {\n\tconst state = useRef<T>(initialValue);\n\tstate.current = initialValue;\n\tconst [counter, setCounter] = useState(1);\n\n\tuseEffect(() => {\n\t\tconst unsubscribe = writable.subscribe(newValue => {\n\t\t\tstate.current = newValue;\n\t\t\tsetCounter(v => v + 1);\n\t\t});\n\n\t\treturn unsubscribe;\n\t}, [writable]);\n\treturn [state.current, counter];\n}\n\nexport function useStoreWithCounter<T>(\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tstore: Store<any>,\n\tname: string\n): [T, number] {\n\tconst s = store.getState();\n\tconst r = store.getReactiveState();\n\n\treturn useWritableWithCounter(r[name] as Writable<T>, s[name] as T);\n}\n\ntype Handler = (\n\tev?: KeyboardEvent,\n\tkeys?: { key: string; evKey: string }\n) => void;\ntype HotkeysMap = Record<string, Handler | false>;\ntype HotkeysManager = {\n\tconfigure: (keys: HotkeysMap, node: Node) => void;\n};\n\nexport function useHotkeys(keys: HotkeysMap, nodeRef: React.RefObject<Node>) {\n\tuseEffect(() => {\n\t\tconst node = nodeRef.current;\n\t\tif (!node) return;\n\t\treturn hotkeys.subscribe((sk: HotkeysManager) => {\n\t\t\tsk.configure(keys, node);\n\t\t});\n\t}, [hotkeys, nodeRef]);\n}\n","type DirectiveResult = {\n\tdestroy: () => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function snippet(name: any, arg: any): any {\n\tif (typeof name === \"function\") {\n\t\tif (typeof arg === \"object\") {\n\t\t\treturn name(arg);\n\t\t} else {\n\t\t\treturn name();\n\t\t}\n\t}\n\treturn name;\n}\n\nexport function directive(\n\tresult: DirectiveResult | undefined\n): () => void | undefined {\n\tif (\n\t\tresult &&\n\t\ttypeof result === \"object\" &&\n\t\ttypeof result.destroy === \"function\"\n\t) {\n\t\treturn result.destroy;\n\t}\n}\n\nexport function styleObject(text: string): Record<string, string> {\n\tconst out: Record<string, string> = {};\n\ttext.split(\";\").forEach(x => {\n\t\tconst [k, v] = x.split(\":\");\n\t\tif (v) {\n\t\t\tlet n = k.trim();\n\t\t\tif (n.indexOf(\"-\")) n = n.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\t\t\tout[n] = v.trim();\n\t\t}\n\t});\n\treturn out;\n}\n\nexport function tick(): Promise<void> {\n\treturn new Promise(resolve => {\n\t\trequestAnimationFrame(() => {\n\t\t\tsetTimeout(resolve, 0);\n\t\t});\n\t});\n}\n","export type Writable<T> = {\n\tsubscribe: (cb: (value: T) => void) => void;\n\tunsubscribe: (cb: (value: T) => void) => void;\n\tset: (value: T) => void;\n\tupdate: (cb: (value: T) => T) => void;\n};\n\nexport type Subscribe<T> = (value: T) => void;\nexport type Update<T> = (value: T) => T;\n\nexport function writable<T>(value: T): Writable<T> {\n\tlet _value = value;\n\tlet listeners: Subscribe<T>[] = [];\n\n\tconst subscribe = (cb: Subscribe<T>) => {\n\t\tlisteners.push(cb);\n\t\tcb(_value);\n\t};\n\n\tconst unsubscribe = (cb: Subscribe<T>) => {\n\t\tlisteners = listeners.filter(l => l !== cb);\n\t};\n\n\tconst update = (cb: Update<T>) => {\n\t\t_value = cb(_value);\n\t\tlisteners.forEach(l => l(_value));\n\t};\n\n\tconst set = (v: T) => {\n\t\t_value = v;\n\t\tlisteners.forEach(l => l(_value));\n\t};\n\n\treturn {\n\t\tsubscribe,\n\t\tunsubscribe,\n\t\tset,\n\t\tupdate,\n\t};\n}\n","import { locate, getID, env } from \"@svar-ui/lib-dom\";\n\ntype Unsubscribe = () => void;\ntype EventHandler = (id: string | number, ev: Event) => void;\n\nexport function delegateEvent(\n\tnode: HTMLElement,\n\thandlers: Record<string, EventHandler> | EventHandler,\n\tevent: string\n): Unsubscribe {\n\tfunction handleEvent(ev: Event) {\n\t\tconst node = locate(ev);\n\t\tif (!node) return;\n\n\t\tconst id = getID(node);\n\n\t\tif (typeof handlers === \"function\") return handlers(id, ev);\n\n\t\tlet action;\n\t\tlet test = ev.target as HTMLElement;\n\t\twhile (test != node) {\n\t\t\taction = test.dataset ? test.dataset.action : null;\n\t\t\tif (action) {\n\t\t\t\tif (handlers[action]) {\n\t\t\t\t\thandlers[action](id, ev);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = test.parentNode as HTMLElement;\n\t\t}\n\t\tif (handlers[event]) handlers[event](id, ev);\n\t}\n\n\treturn env.addEvent(node, event, handleEvent);\n}\n\nexport function delegateClick(\n\tnode: HTMLElement,\n\thandlers: Record<string, EventHandler>\n) {\n\tconst result = [delegateEvent(node, handlers, \"click\")];\n\tif (handlers.dblclick)\n\t\tresult.push(delegateEvent(node, handlers.dblclick, \"dblclick\"));\n\n\treturn (): void => {\n\t\tresult.forEach(r => r());\n\t};\n}\n","import { useRef } from \"react\";\n\nexport function useWhatChanged(\n\tname: string,\n\tprops?: Record<string, unknown>,\n\tstate?: Record<string, unknown>,\n\tstore?: Record<string, unknown>\n) {\n\tconst count = useRef(0);\n\tcount.current += 1;\n\n\tconst propsRef = useRef({ ...props });\n\tconst stateRef = useRef({ ...state });\n\tconst storeRef = useRef({ ...store });\n\n\tconsole.log(`[${name}] Render #${count.current}`);\n\tif (props) {\n\t\tcompare(\"props\", props, propsRef.current);\n\t\tpropsRef.current = { ...props };\n\t}\n\n\tif (state) {\n\t\tcompare(\"state\", state, stateRef.current);\n\t\tstateRef.current = { ...state };\n\t}\n\n\tif (store) {\n\t\tcompare(\"store\", store, storeRef.current);\n\t\tstoreRef.current = { ...store };\n\t}\n}\n\nfunction compare(\n\tprops: string,\n\tdeps: Record<string, unknown>,\n\tprev: Record<string, unknown>\n) {\n\tconst changes = Object.entries(deps).filter(\n\t\t([key, val]) => prev[key] !== val\n\t);\n\n\tif (changes.length) {\n\t\tchanges.forEach(([key, val]) => {\n\t\t\tconsole.log(`  ${props}.${key}:`, prev[key], \"→\", val);\n\t\t});\n\t}\n}\n"]}