frosty 0.0.111 → 0.0.113

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.
Files changed (73) hide show
  1. package/dist/_native.d.mts +19 -0
  2. package/dist/_native.d.mts.map +1 -0
  3. package/dist/_native.js +3 -3
  4. package/dist/_native.mjs +4 -4
  5. package/dist/dom.d.mts +15 -0
  6. package/dist/dom.d.mts.map +1 -0
  7. package/dist/dom.js +4 -4
  8. package/dist/dom.mjs +4 -4
  9. package/dist/index.d.mts +551 -0
  10. package/dist/index.d.mts.map +1 -0
  11. package/dist/index.d.ts +8 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -3
  14. package/dist/index.mjs +4 -4
  15. package/dist/internals/common-CpEB3ieX.d.mts +3451 -0
  16. package/dist/internals/common-CpEB3ieX.d.mts.map +1 -0
  17. package/dist/internals/fragment-BlS4iF_x.d.mts +9 -0
  18. package/dist/internals/fragment-BlS4iF_x.d.mts.map +1 -0
  19. package/dist/internals/{fragment-CaAgTjMI.d.ts → fragment-Dch7YNeZ.d.ts} +4 -1
  20. package/dist/internals/{fragment-CaAgTjMI.d.ts.map → fragment-Dch7YNeZ.d.ts.map} +1 -1
  21. package/dist/internals/renderer-BQawOCgo.d.mts +38 -0
  22. package/dist/internals/renderer-BQawOCgo.d.mts.map +1 -0
  23. package/dist/internals/renderer-BelBgEvy.d.mts +47 -0
  24. package/dist/internals/renderer-BelBgEvy.d.mts.map +1 -0
  25. package/dist/internals/{renderer-D042jXUg.mjs → renderer-CA9aKFMW.mjs} +3 -3
  26. package/dist/internals/{renderer-D042jXUg.mjs.map → renderer-CA9aKFMW.mjs.map} +1 -1
  27. package/dist/internals/{renderer-mim3fEAf.js → renderer-CNz1Y3a_.js} +3 -3
  28. package/dist/internals/{renderer-mim3fEAf.js.map → renderer-CNz1Y3a_.js.map} +1 -1
  29. package/dist/internals/{renderer-DUavelz2.mjs → renderer-DowEJaeR.mjs} +4 -4
  30. package/dist/internals/{renderer-DUavelz2.mjs.map → renderer-DowEJaeR.mjs.map} +1 -1
  31. package/dist/internals/{renderer-B04DCuHt.js → renderer-I-1wuWMB.js} +4 -4
  32. package/dist/internals/{renderer-B04DCuHt.js.map → renderer-I-1wuWMB.js.map} +1 -1
  33. package/dist/internals/{runtime-BFi9M0jE.js → runtime-57ivQprw.js} +4 -1
  34. package/dist/internals/runtime-57ivQprw.js.map +1 -0
  35. package/dist/internals/{runtime-BB51vIJ7.mjs → runtime-Dp4_akLf.mjs} +4 -1
  36. package/dist/internals/runtime-Dp4_akLf.mjs.map +1 -0
  37. package/dist/internals/{state-DFlnc6I0.js → state-C9_fGuhZ.js} +9 -2
  38. package/dist/internals/state-C9_fGuhZ.js.map +1 -0
  39. package/dist/internals/{state-YzaxTA1n.mjs → state-DgSrjGGU.mjs} +9 -2
  40. package/dist/internals/state-DgSrjGGU.mjs.map +1 -0
  41. package/dist/internals/{sync-OyR_m41B.js → sync-B7gLfyQK.js} +2 -2
  42. package/dist/internals/{sync-OyR_m41B.js.map → sync-B7gLfyQK.js.map} +1 -1
  43. package/dist/internals/{sync-CxgNMmpR.mjs → sync-CeJllG9M.mjs} +2 -2
  44. package/dist/internals/{sync-CxgNMmpR.mjs.map → sync-CeJllG9M.mjs.map} +1 -1
  45. package/dist/internals/utils-CWsh4Zpu.d.mts +7 -0
  46. package/dist/internals/utils-CWsh4Zpu.d.mts.map +1 -0
  47. package/dist/jsx-dev-runtime.d.mts +11 -0
  48. package/dist/jsx-dev-runtime.d.mts.map +1 -0
  49. package/dist/jsx-dev-runtime.d.ts +1 -1
  50. package/dist/jsx-dev-runtime.js +1 -1
  51. package/dist/jsx-dev-runtime.mjs +1 -1
  52. package/dist/jsx-runtime.d.mts +23 -0
  53. package/dist/jsx-runtime.d.mts.map +1 -0
  54. package/dist/jsx-runtime.d.ts +1 -1
  55. package/dist/jsx-runtime.js +1 -1
  56. package/dist/jsx-runtime.mjs +2 -2
  57. package/dist/server-dom.d.mts +15 -0
  58. package/dist/server-dom.d.mts.map +1 -0
  59. package/dist/server-dom.js +4 -4
  60. package/dist/server-dom.mjs +4 -4
  61. package/dist/web.d.mts +211 -0
  62. package/dist/web.d.mts.map +1 -0
  63. package/dist/web.d.ts +99 -0
  64. package/dist/web.d.ts.map +1 -1
  65. package/dist/web.js +104 -5
  66. package/dist/web.js.map +1 -1
  67. package/dist/web.mjs +105 -6
  68. package/dist/web.mjs.map +1 -1
  69. package/package.json +5 -17
  70. package/dist/internals/runtime-BB51vIJ7.mjs.map +0 -1
  71. package/dist/internals/runtime-BFi9M0jE.js.map +0 -1
  72. package/dist/internals/state-DFlnc6I0.js.map +0 -1
  73. package/dist/internals/state-YzaxTA1n.mjs.map +0 -1
package/dist/web.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.d.ts","sources":["../src/web/document.ts","../src/web/location.ts","../src/web/observer.ts","../src/web/online.ts","../src/web/server.ts","../src/web/storage.ts","../src/web/visibility.ts","../src/web/window.ts"],"sourcesContent":["//\n// document.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\nexport const useDocument = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useDocument must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.document;\n } else {\n throw Error('Unsupported renderer.');\n }\n}","//\n// location.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useMemo } from '../core/hooks/memo';\nimport { useCallback } from '../core/hooks/callback';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { EventEmitter } from '../core/reconciler/events';\nimport { SetStateAction } from '../core/types/common';\nimport { useWindow } from './window';\n\nconst emitters = new WeakMap<Document, EventEmitter>();\nconst emitterFor = (document: Document) => {\n if (!emitters.has(document)) emitters.set(document, new EventEmitter());\n return emitters.get(document)!;\n}\n\n/**\n * A hook that provides the current browser location and methods to manipulate the browser history.\n *\n * @returns An object with the following properties and methods:\n * - `hash`: The fragment identifier of the URL.\n * - `host`: The hostname and port number.\n * - `hostname`: The domain name.\n * - `href`: The full URL.\n * - `origin`: The protocol, hostname, and port.\n * - `pathname`: The path of the URL.\n * - `port`: The port number.\n * - `protocol`: The protocol scheme.\n * - `search`: The query string.\n * - `state`: The current state object associated with the history entry.\n * - `back()`: Navigates to the previous entry in the history stack.\n * - `forward()`: Navigates to the next entry in the history stack.\n * - `pushState(data, url)`: Pushes a new entry onto the history stack.\n * - `replaceState(data, url)`: Replaces the current history entry.\n *\n * The hook subscribes to changes in the browser's history and location, causing components to re-render when navigation occurs.\n *\n * @example\n * const location = useLocation();\n * console.log(location.pathname); // e.g., \"/about\"\n * location.pushState({ some: 'state' }, '/new-path');\n */\nexport const useLocation = () => {\n const window = useWindow();\n const emitter = emitterFor(window.document);\n const result = (history?: History) => ({\n ..._.pick(window.document.location, 'hash', 'host', 'hostname', 'href', 'origin', 'pathname', 'port', 'protocol', 'search'),\n state: history?.state ?? null,\n back: () => {\n history?.back();\n },\n forward: () => {\n history?.forward();\n emitter.emit('change');\n },\n pushState: (data: any, url?: string | URL | null) => {\n history?.pushState(data, '', url);\n emitter.emit('change');\n },\n replaceState: (data: any, url?: string | URL | null) => {\n history?.replaceState(data, '', url);\n emitter.emit('change');\n },\n });\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('popstate', onStoreChange);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('popstate', onStoreChange);\n event.remove();\n }\n }, () => result(window.history));\n}\n\n/**\n * A hook for reading and updating the URL's query string (search parameters).\n *\n * @returns A tuple:\n * - The first element is a `URLSearchParams` instance representing the current query string.\n * - The second element is a function to update the search parameters, which accepts any valid\n * `URLSearchParams` initializer (string, array, or object).\n *\n * Updating the search parameters will push a new history entry and update the URL in the address bar.\n *\n * @example\n * const [searchParams, setSearchParams] = useSearchParams();\n * const page = searchParams.get('page');\n * setSearchParams({ page: '2', filter: 'active' });\n */\nexport const useSearchParams = () => {\n const location = useLocation();\n const searchParams = useMemo(() => new URLSearchParams(location.search), [location.search]);\n type URLSearchParamsInit = ConstructorParameters<typeof URLSearchParams>[0];\n const setSearchParams = useCallback((\n dispatch: SetStateAction<URLSearchParamsInit, URLSearchParams>,\n config?: {\n replace?: boolean;\n },\n ) => {\n const params = _.isFunction(dispatch) ? dispatch(new URLSearchParams(location.search)) : dispatch;\n const newParams = new URLSearchParams(params);\n if (config?.replace === false) {\n location.pushState(location.state, `?${newParams.toString()}`);\n } else {\n location.replaceState(location.state, `?${newParams.toString()}`);\n }\n });\n return [searchParams, setSearchParams] as const;\n}\n","//\n// observer.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useEffect } from '../core/hooks/effect';\nimport { useCallback } from '../core/hooks/callback';\nimport { RefObject } from '../core/types/common';\n\ninterface _Observer<T> {\n observe(target: Element, options?: T): void;\n unobserve(target: Element): void;\n}\n\nconst createObserver = <E extends { target: Element; }, T>(\n constructor: new (callback: (entries: E[]) => void) => _Observer<T>\n) => {\n const listeners = new WeakMap<Element, ((entry: E) => void)[]>();\n const observer = new constructor((entries) => {\n for (const entry of entries) {\n for (const listener of listeners.get(entry.target) ?? []) {\n (async () => {\n try {\n await listener(entry);\n } catch (e) {\n console.error(e);\n }\n })();\n }\n }\n });\n return {\n observe: (target: Element, callback: (entry: E) => void, options?: T) => {\n observer.observe(target, options);\n listeners.set(target, [...listeners.get(target) ?? [], callback]);\n },\n unobserve: (target: Element, callback: (entry: E) => void) => {\n const list = _.filter(listeners.get(target), x => x !== callback);\n listeners.set(target, list);\n if (_.isEmpty(list)) observer.unobserve?.(target);\n },\n };\n};\n\nconst observer = typeof window === 'undefined' ? undefined : {\n resize: createObserver(ResizeObserver),\n intersection: createObserver(IntersectionObserver),\n};\n\nexport const useResizeObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: ResizeObserverEntry) => void,\n options?: ResizeObserverOptions,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.resize.observe(_target, _callback, options);\n return () => observer.resize.unobserve(_target, _callback);\n }, [target]);\n}\n\nexport const useIntersectionObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: IntersectionObserverEntry) => void,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.intersection.observe(_target, _callback);\n return () => observer.intersection.unobserve(_target, _callback);\n }, [target]);\n}\n\nexport const useMutationObserver = (\n target: RefObject<Node | null | undefined> | Node | null | undefined,\n callback: MutationCallback,\n options?: MutationObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (typeof window === 'undefined' || !_target) return;\n const observer = new MutationObserver(_callback);\n observer.observe(_target, options);\n return () => observer.disconnect();\n }, [target]);\n}\n\nexport const usePerformanceObserver = (\n callback: PerformanceObserverCallback,\n options?: PerformanceObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const observer = new PerformanceObserver(_callback);\n observer.observe(options);\n return () => observer.disconnect();\n }, []);\n}\n","//\n// online.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\n\nexport const useOnline = () => useSyncExternalStore((onStoreChange) => {\n window.addEventListener('offline', onStoreChange);\n window.addEventListener('online', onStoreChange);\n return () => {\n window.removeEventListener('offline', onStoreChange);\n window.removeEventListener('online', onStoreChange);\n };\n}, () => navigator.onLine, () => false);","//\n// server.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\nimport { decompress } from '../renderer/minify/decompress';\n\nconst decodedSsrData = new WeakMap<Document, any>();\n\nexport const useServerResource = (key: string, resource?: () => string): string | undefined => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useServerResource must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n if (state.renderer._server) {\n const data = resource?.();\n if (!_.isString(data)) throw Error('Invalid return type of resource');\n state.renderer._tracked_server_resource.set(key, data);\n return data;\n } else {\n const cached = decodedSsrData.get(state.renderer.document);\n if (!_.isNil(cached)) return cached[key];\n const ssrData = state.renderer.document.querySelector('script[data-frosty-ssr-data]');\n if (ssrData instanceof HTMLElement) {\n try {\n const decoded = JSON.parse(decompress(ssrData.innerText.trim()));\n decodedSsrData.set(state.renderer.document, decoded);\n return decoded[key];\n } catch (e) {\n console.error(e);\n decodedSsrData.set(state.renderer.document, {});\n }\n ssrData.remove();\n } else {\n decodedSsrData.set(state.renderer.document, {});\n }\n }\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n","//\n// storage.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useCallback } from '../core/hooks/callback';\nimport { SetStateAction } from '../core/types/common';\nimport { EventEmitter } from '../core/reconciler/events';\n\nconst emitters = new WeakMap<Storage, EventEmitter>();\nconst emitterFor = (storage: Storage) => {\n if (!emitters.has(storage)) emitters.set(storage, new EventEmitter());\n return emitters.get(storage)!;\n}\n\nconst _useStorage = (\n storage: () => Storage,\n key: string,\n initialValue?: string | null\n) => {\n const state = useSyncExternalStore((onStoreChange) => {\n const _storage = storage();\n const emitter = emitterFor(_storage);\n const callback = (ev: StorageEvent) => { \n if (!ev.storageArea || ev.storageArea === _storage) onStoreChange();\n };\n window.addEventListener('storage', callback);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('storage', callback);\n event.remove();\n }\n }, () => storage().getItem(key), () => undefined);\n const setState = useCallback((v: SetStateAction<string | null | undefined>) => {\n try {\n const _storage = storage();\n const newValue = _.isFunction(v) ? v(state) : v;\n if (_.isNil(newValue)) {\n _storage.removeItem(key);\n } else {\n _storage.setItem(key, newValue);\n }\n const emitter = emitterFor(_storage);\n emitter.emit('change');\n } catch (e) {\n console.error(e);\n }\n }, [key]);\n return [state ?? initialValue ?? null, setState] as const;\n}\n\nexport const useLocalStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.localStorage, key, initialValue);\n\nexport const useSessionStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.sessionStorage, key, initialValue);\n","//\n// visibility.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useDocument } from './document';\n\nexport const useVisibility = () => {\n const document = useDocument();\n return useSyncExternalStore((onStoreChange) => {\n document.addEventListener('visibilitychange', onStoreChange);\n return () => {\n document.removeEventListener('visibilitychange', onStoreChange);\n }\n }, () => {\n if (document.hasFocus()) {\n return 'active' as const;\n } else if (document.visibilityState === 'visible') {\n return 'inactive' as const;\n } else {\n return 'background' as const;\n }\n }, () => 'unknown' as const);\n}\n","//\n// window.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { uniqueId } from '../core/utils';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\nexport const useWindow = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useWindow must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.window;\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n\nconst emptyInsets = { top: 0, left: 0, right: 0, bottom: 0 };\nconst safeAreaInsets = (window: ReturnType<typeof useWindow>) => {\n let support;\n if (!('CSS' in window) || !_.isFunction(window.CSS.supports)) {\n return emptyInsets;\n }\n if (window.CSS.supports('top: env(safe-area-inset-top)')) {\n support = 'env'\n } else if (window.CSS.supports('top: constant(safe-area-inset-top)')) {\n support = 'constant'\n } else {\n return emptyInsets;\n }\n const id = uniqueId();\n const style = document.createElement('style');\n style.textContent = `:root {\n --${id}-top: ${support}(safe-area-inset-top);\n --${id}-left: ${support}(safe-area-inset-left);\n --${id}-right: ${support}(safe-area-inset-right);\n --${id}-bottom: ${support}(safe-area-inset-bottom);\n }`;\n document.head.appendChild(style);\n const computedStyle = getComputedStyle(document.documentElement);\n const insets = {\n top: computedStyle.getPropertyValue(`--${id}-top`),\n left: computedStyle.getPropertyValue(`--${id}-left`),\n right: computedStyle.getPropertyValue(`--${id}-right`),\n bottom: computedStyle.getPropertyValue(`--${id}-bottom`),\n };\n style.remove();\n return _.mapValues(insets, v => parseFloat(v));\n}\n\nexport const useWindowMetrics = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('resize', onStoreChange);\n return () => {\n window.removeEventListener('resize', onStoreChange);\n };\n }, () => ({\n safeAreaInsets: safeAreaInsets(window),\n devicePixelRatio: window.devicePixelRatio,\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n }));\n}\n\nexport const useVisualViewportMetrics = () => {\n const { visualViewport } = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n visualViewport?.addEventListener('resize', onStoreChange);\n return () => {\n visualViewport?.removeEventListener('resize', onStoreChange);\n };\n }, () => visualViewport && ({\n width: visualViewport.width,\n height: visualViewport.height,\n scale: visualViewport.scale,\n }));\n}\n\nexport const useWindowScroll = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('scroll', onStoreChange);\n return () => {\n window.removeEventListener('scroll', onStoreChange);\n };\n }, () => ({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n }));\n}\n\nconst colorSchemeDarkCache = new WeakMap<ReturnType<typeof useWindow>, MediaQueryList | undefined>();\n\nexport const useColorScheme = () => {\n const window = useWindow();\n if (!colorSchemeDarkCache.has(window)) colorSchemeDarkCache.set(window, window.matchMedia?.('(prefers-color-scheme: dark)'));\n const colorSchemeDark = colorSchemeDarkCache.get(window);\n return useSyncExternalStore((onStoreChange) => {\n colorSchemeDark?.addEventListener('change', onStoreChange);\n return () => {\n colorSchemeDark?.removeEventListener('change', onStoreChange);\n };\n }, () => colorSchemeDark?.matches ? 'dark' : 'light');\n}\n"],"names":[],"mappings":";;;;;;;;AAAO,cAAA,WAAA,QAAA,QAAA;;ACCP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,WAAA;AACP;AACA;AACA;AACA,0CAAA,GAAA;AACA,6CAAA,GAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,eAAA,kBAAA,eAAA,aAAA,cAAA,uBAAA,MAAA,mBAAA,eAAA,cAAA,eAAA;AACP;AACA;;AC3DO,cAAA,iBAAA,WAAA,SAAA,CAAA,OAAA,uBAAA,OAAA,uCAAA,mBAAA,qBAAA,qBAAA;AACA,cAAA,uBAAA,WAAA,SAAA,CAAA,OAAA,uBAAA,OAAA,uCAAA,yBAAA;AACA,cAAA,mBAAA,WAAA,SAAA,CAAA,IAAA,uBAAA,IAAA,+BAAA,gBAAA,YAAA,oBAAA;AACA,cAAA,sBAAA,aAAA,2BAAA,YAAA,uBAAA;;ACJA,cAAA,SAAA;;ACAA,cAAA,iBAAA;;ACCA,cAAA,eAAA,8EAAA,cAAA;AACA,cAAA,iBAAA,8EAAA,cAAA;;ACFA,cAAA,aAAA;;ACAA,cAAA,SAAA,QAAA,MAAA,GAAwC,KAAe,CAAA,SAAA;AACvD,cAAA,gBAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,wBAAA;AACP;AACA;AACA;AACA;AACO,cAAA,eAAA;AACP;AACA;AACA;AACO,cAAA,cAAA;;;;"}
1
+ {"version":3,"file":"web.d.ts","sources":["../src/web/document.ts","../src/web/location.ts","../src/web/observer.ts","../src/web/online.ts","../src/web/server.ts","../src/web/storage.ts","../src/web/visibility.ts","../src/web/window.ts"],"sourcesContent":["//\n// document.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\n/**\n * Hook to access the current document object in a web renderer.\n * \n * @returns The current document object.\n * @throws Error if used outside of a render function or with an unsupported renderer.\n */\nexport const useDocument = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useDocument must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.document;\n } else {\n throw Error('Unsupported renderer.');\n }\n}","//\n// location.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useMemo } from '../core/hooks/memo';\nimport { useCallback } from '../core/hooks/callback';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { EventEmitter } from '../core/reconciler/events';\nimport { SetStateAction } from '../core/types/common';\nimport { useWindow } from './window';\n\nconst emitters = new WeakMap<Document, EventEmitter>();\nconst emitterFor = (document: Document) => {\n if (!emitters.has(document)) emitters.set(document, new EventEmitter());\n return emitters.get(document)!;\n}\n\n/**\n * A hook that provides the current browser location and methods to manipulate the browser history.\n *\n * @returns An object with the following properties and methods:\n * - `hash`: The fragment identifier of the URL.\n * - `host`: The hostname and port number.\n * - `hostname`: The domain name.\n * - `href`: The full URL.\n * - `origin`: The protocol, hostname, and port.\n * - `pathname`: The path of the URL.\n * - `port`: The port number.\n * - `protocol`: The protocol scheme.\n * - `search`: The query string.\n * - `state`: The current state object associated with the history entry.\n * - `back()`: Navigates to the previous entry in the history stack.\n * - `forward()`: Navigates to the next entry in the history stack.\n * - `pushState(data, url)`: Pushes a new entry onto the history stack.\n * - `replaceState(data, url)`: Replaces the current history entry.\n *\n * The hook subscribes to changes in the browser's history and location, causing components to re-render when navigation occurs.\n *\n * @example\n * const location = useLocation();\n * console.log(location.pathname); // e.g., \"/about\"\n * location.pushState({ some: 'state' }, '/new-path');\n */\nexport const useLocation = () => {\n const window = useWindow();\n const emitter = emitterFor(window.document);\n const result = (history?: History) => ({\n ..._.pick(window.document.location, 'hash', 'host', 'hostname', 'href', 'origin', 'pathname', 'port', 'protocol', 'search'),\n state: history?.state ?? null,\n back: () => {\n history?.back();\n },\n forward: () => {\n history?.forward();\n emitter.emit('change');\n },\n pushState: (data: any, url?: string | URL | null) => {\n history?.pushState(data, '', url);\n emitter.emit('change');\n },\n replaceState: (data: any, url?: string | URL | null) => {\n history?.replaceState(data, '', url);\n emitter.emit('change');\n },\n });\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('popstate', onStoreChange);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('popstate', onStoreChange);\n event.remove();\n }\n }, () => result(window.history));\n}\n\n/**\n * A hook for reading and updating the URL's query string (search parameters).\n *\n * @returns A tuple:\n * - The first element is a `URLSearchParams` instance representing the current query string.\n * - The second element is a function to update the search parameters, which accepts any valid\n * `URLSearchParams` initializer (string, array, or object).\n *\n * Updating the search parameters will push a new history entry and update the URL in the address bar.\n *\n * @example\n * const [searchParams, setSearchParams] = useSearchParams();\n * const page = searchParams.get('page');\n * setSearchParams({ page: '2', filter: 'active' });\n */\nexport const useSearchParams = () => {\n const location = useLocation();\n const searchParams = useMemo(() => new URLSearchParams(location.search), [location.search]);\n type URLSearchParamsInit = ConstructorParameters<typeof URLSearchParams>[0];\n const setSearchParams = useCallback((\n dispatch: SetStateAction<URLSearchParamsInit, URLSearchParams>,\n config?: {\n replace?: boolean;\n },\n ) => {\n const params = _.isFunction(dispatch) ? dispatch(new URLSearchParams(location.search)) : dispatch;\n const newParams = new URLSearchParams(params);\n if (config?.replace === false) {\n location.pushState(location.state, `?${newParams.toString()}`);\n } else {\n location.replaceState(location.state, `?${newParams.toString()}`);\n }\n });\n return [searchParams, setSearchParams] as const;\n}\n","//\n// observer.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useEffect } from '../core/hooks/effect';\nimport { useCallback } from '../core/hooks/callback';\nimport { RefObject } from '../core/types/common';\n\ninterface _Observer<T> {\n observe(target: Element, options?: T): void;\n unobserve(target: Element): void;\n}\n\nconst createObserver = <E extends { target: Element; }, T>(\n constructor: new (callback: (entries: E[]) => void) => _Observer<T>\n) => {\n const listeners = new WeakMap<Element, ((entry: E) => void)[]>();\n const observer = new constructor((entries) => {\n for (const entry of entries) {\n for (const listener of listeners.get(entry.target) ?? []) {\n (async () => {\n try {\n await listener(entry);\n } catch (e) {\n console.error(e);\n }\n })();\n }\n }\n });\n return {\n observe: (target: Element, callback: (entry: E) => void, options?: T) => {\n observer.observe(target, options);\n listeners.set(target, [...listeners.get(target) ?? [], callback]);\n },\n unobserve: (target: Element, callback: (entry: E) => void) => {\n const list = _.filter(listeners.get(target), x => x !== callback);\n listeners.set(target, list);\n if (_.isEmpty(list)) observer.unobserve?.(target);\n },\n };\n};\n\nconst observer = typeof window === 'undefined' ? undefined : {\n resize: createObserver(ResizeObserver),\n intersection: createObserver(IntersectionObserver),\n};\n\n/**\n * A hook that sets up a ResizeObserver on the given target element.\n * \n * @param target - The target element or a ref object containing the target element.\n * @param callback - The callback function to be called when the target element is resized.\n * @param options - Optional ResizeObserverOptions to configure the observer.\n */\nexport const useResizeObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: ResizeObserverEntry) => void,\n options?: ResizeObserverOptions,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.resize.observe(_target, _callback, options);\n return () => observer.resize.unobserve(_target, _callback);\n }, [target]);\n}\n\n/**\n * A hook that sets up an IntersectionObserver on the given target element.\n * \n * @param target - The target element or a ref object containing the target element.\n * @param callback - The callback function to be called when the target element's intersection changes.\n */\nexport const useIntersectionObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: IntersectionObserverEntry) => void,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.intersection.observe(_target, _callback);\n return () => observer.intersection.unobserve(_target, _callback);\n }, [target]);\n}\n\n/**\n * A hook that sets up a MutationObserver on the given target node.\n * \n * @param target - The target node or a ref object containing the target node.\n * @param callback - The callback function to be called when mutations are observed.\n * @param options - Optional MutationObserverInit to configure the observer.\n */\nexport const useMutationObserver = (\n target: RefObject<Node | null | undefined> | Node | null | undefined,\n callback: MutationCallback,\n options?: MutationObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (typeof window === 'undefined' || !_target) return;\n const observer = new MutationObserver(_callback);\n observer.observe(_target, options);\n return () => observer.disconnect();\n }, [target]);\n}\n\n/**\n * A hook that sets up a PerformanceObserver with the given callback and options.\n * \n * @param callback - The callback function to be called when performance entries are observed.\n * @param options - Optional PerformanceObserverInit to configure the observer.\n */\nexport const usePerformanceObserver = (\n callback: PerformanceObserverCallback,\n options?: PerformanceObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const observer = new PerformanceObserver(_callback);\n observer.observe(options);\n return () => observer.disconnect();\n }, []);\n}\n","//\n// online.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\n\n/**\n * A hook that returns the current online status of the browser.\n * It listens to the 'online' and 'offline' events to update the status.\n * \n * @returns A boolean indicating whether the browser is online.\n */\nexport const useOnline = () => useSyncExternalStore((onStoreChange) => {\n window.addEventListener('offline', onStoreChange);\n window.addEventListener('online', onStoreChange);\n return () => {\n window.removeEventListener('offline', onStoreChange);\n window.removeEventListener('online', onStoreChange);\n };\n}, () => navigator.onLine, () => false);","//\n// server.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\nimport { decompress } from '../renderer/minify/decompress';\n\nconst decodedSsrData = new WeakMap<Document, any>();\n\n/**\n * A hook to manage server-side resources in a web renderer.\n * It allows tracking and retrieving resources identified by a key.\n * \n * @param key - The unique key for the resource.\n * @param resource - An optional function that returns the resource string when called on the server side.\n * @returns The resource string if available, otherwise undefined.\n * @throws Error if used outside of a render function or with an unsupported renderer.\n */\nexport const useServerResource = (key: string, resource?: () => string): string | undefined => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useServerResource must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n if (state.renderer._server) {\n const data = resource?.();\n if (!_.isString(data)) throw Error('Invalid return type of resource');\n state.renderer._tracked_server_resource.set(key, data);\n return data;\n } else {\n const cached = decodedSsrData.get(state.renderer.document);\n if (!_.isNil(cached)) return cached[key];\n const ssrData = state.renderer.document.querySelector('script[data-frosty-ssr-data]');\n if (ssrData instanceof HTMLElement) {\n try {\n const decoded = JSON.parse(decompress(ssrData.innerText.trim()));\n decodedSsrData.set(state.renderer.document, decoded);\n return decoded[key];\n } catch (e) {\n console.error(e);\n decodedSsrData.set(state.renderer.document, {});\n }\n ssrData.remove();\n } else {\n decodedSsrData.set(state.renderer.document, {});\n }\n }\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n","//\n// storage.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useCallback } from '../core/hooks/callback';\nimport { SetStateAction } from '../core/types/common';\nimport { EventEmitter } from '../core/reconciler/events';\n\nconst emitters = new WeakMap<Storage, EventEmitter>();\nconst emitterFor = (storage: Storage) => {\n if (!emitters.has(storage)) emitters.set(storage, new EventEmitter());\n return emitters.get(storage)!;\n}\n\nconst _useStorage = (\n storage: () => Storage,\n key: string,\n initialValue?: string | null\n) => {\n const state = useSyncExternalStore((onStoreChange) => {\n const _storage = storage();\n const emitter = emitterFor(_storage);\n const callback = (ev: StorageEvent) => { \n if (!ev.storageArea || ev.storageArea === _storage) onStoreChange();\n };\n window.addEventListener('storage', callback);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('storage', callback);\n event.remove();\n }\n }, () => storage().getItem(key), () => undefined);\n const setState = useCallback((v: SetStateAction<string | null | undefined>) => {\n try {\n const _storage = storage();\n const newValue = _.isFunction(v) ? v(state) : v;\n if (_.isNil(newValue)) {\n _storage.removeItem(key);\n } else {\n _storage.setItem(key, newValue);\n }\n const emitter = emitterFor(_storage);\n emitter.emit('change');\n } catch (e) {\n console.error(e);\n }\n }, [key]);\n return [state ?? initialValue ?? null, setState] as const;\n}\n\n/**\n * A hook to manage a value in localStorage.\n * It provides a stateful value and a function to update it.\n * \n * @param key - The key in localStorage to manage.\n * @param initialValue - An optional initial value if the key does not exist in localStorage.\n * @returns A tuple containing the current value and a function to update it.\n */\nexport const useLocalStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.localStorage, key, initialValue);\n\n/** \n * A hook to manage a value in sessionStorage.\n * It provides a stateful value and a function to update it.\n * \n * @param key - The key in sessionStorage to manage.\n * @param initialValue - An optional initial value if the key does not exist in sessionStorage.\n * @returns A tuple containing the current value and a function to update it.\n */\nexport const useSessionStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.sessionStorage, key, initialValue);\n","//\n// visibility.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useDocument } from './document';\n\n/**\n * A hook to get the current visibility state of the document.\n * It listens to the 'visibilitychange' event to update the state.\n * \n * @returns A string indicating the current visibility state: 'active', 'inactive', 'background', or 'unknown'.\n */\nexport const useVisibility = () => {\n const document = useDocument();\n return useSyncExternalStore((onStoreChange) => {\n document.addEventListener('visibilitychange', onStoreChange);\n return () => {\n document.removeEventListener('visibilitychange', onStoreChange);\n }\n }, () => {\n if (document.hasFocus()) {\n return 'active' as const;\n } else if (document.visibilityState === 'visible') {\n return 'inactive' as const;\n } else {\n return 'background' as const;\n }\n }, () => 'unknown' as const);\n}\n","//\n// window.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { uniqueId } from '../core/utils';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\n/**\n * Hook to access the current window object in a web renderer.\n * \n * @returns The current window object.\n * @throws Error if used outside of a render function or with an unsupported renderer.\n */\nexport const useWindow = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useWindow must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.window;\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n\nconst emptyInsets = { top: 0, left: 0, right: 0, bottom: 0 };\nconst safeAreaInsets = (window: ReturnType<typeof useWindow>) => {\n let support;\n if (!('CSS' in window) || !_.isFunction(window.CSS.supports)) {\n return emptyInsets;\n }\n if (window.CSS.supports('top: env(safe-area-inset-top)')) {\n support = 'env'\n } else if (window.CSS.supports('top: constant(safe-area-inset-top)')) {\n support = 'constant'\n } else {\n return emptyInsets;\n }\n const id = uniqueId();\n const style = document.createElement('style');\n style.textContent = `:root {\n --${id}-top: ${support}(safe-area-inset-top);\n --${id}-left: ${support}(safe-area-inset-left);\n --${id}-right: ${support}(safe-area-inset-right);\n --${id}-bottom: ${support}(safe-area-inset-bottom);\n }`;\n document.head.appendChild(style);\n const computedStyle = getComputedStyle(document.documentElement);\n const insets = {\n top: computedStyle.getPropertyValue(`--${id}-top`),\n left: computedStyle.getPropertyValue(`--${id}-left`),\n right: computedStyle.getPropertyValue(`--${id}-right`),\n bottom: computedStyle.getPropertyValue(`--${id}-bottom`),\n };\n style.remove();\n return _.mapValues(insets, v => parseFloat(v));\n}\n\n/**\n * A hook that provides various metrics of the window object.\n * It listens to the 'resize' event to update the metrics.\n * \n * @returns An object containing safe area insets, device pixel ratio, outer and inner dimensions of the window.\n */\nexport const useWindowMetrics = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('resize', onStoreChange);\n return () => {\n window.removeEventListener('resize', onStoreChange);\n };\n }, () => ({\n safeAreaInsets: safeAreaInsets(window),\n devicePixelRatio: window.devicePixelRatio,\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n }));\n}\n\n/** \n * A hook that provides metrics of the visual viewport.\n * It listens to the 'resize' event of the visual viewport to update the metrics.\n * \n * @returns An object containing width, height, and scale of the visual viewport.\n */\nexport const useVisualViewportMetrics = () => {\n const { visualViewport } = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n visualViewport?.addEventListener('resize', onStoreChange);\n return () => {\n visualViewport?.removeEventListener('resize', onStoreChange);\n };\n }, () => visualViewport && ({\n width: visualViewport.width,\n height: visualViewport.height,\n scale: visualViewport.scale,\n }));\n}\n\n/**\n * A hook that provides the current scroll position of the window.\n * It listens to the 'scroll' event to update the position.\n * \n * @returns An object containing scrollX and scrollY values.\n */\nexport const useWindowScroll = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('scroll', onStoreChange);\n return () => {\n window.removeEventListener('scroll', onStoreChange);\n };\n }, () => ({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n }));\n}\n\nconst colorSchemeDarkCache = new WeakMap<ReturnType<typeof useWindow>, MediaQueryList | undefined>();\n\n/**\n * A hook that detects the user's preferred color scheme (light or dark).\n * It listens to changes in the '(prefers-color-scheme: dark)' media query.\n * \n * @returns A string indicating the current color scheme: 'light' or 'dark'.\n */\nexport const useColorScheme = () => {\n const window = useWindow();\n if (!colorSchemeDarkCache.has(window)) colorSchemeDarkCache.set(window, window.matchMedia?.('(prefers-color-scheme: dark)'));\n const colorSchemeDark = colorSchemeDarkCache.get(window);\n return useSyncExternalStore((onStoreChange) => {\n colorSchemeDark?.addEventListener('change', onStoreChange);\n return () => {\n colorSchemeDark?.removeEventListener('change', onStoreChange);\n };\n }, () => colorSchemeDark?.matches ? 'dark' : 'light');\n}\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,WAAA,QAAA,QAAA;;ACLP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,WAAA;AACP;AACA;AACA;AACA,0CAAA,GAAA;AACA,6CAAA,GAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,eAAA,kBAAA,eAAA,aAAA,cAAA,uBAAA,MAAA,mBAAA,eAAA,cAAA,eAAA;AACP;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,iBAAA,WAAA,SAAA,CAAA,OAAA,uBAAA,OAAA,uCAAA,mBAAA,qBAAA,qBAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,uBAAA,WAAA,SAAA,CAAA,OAAA,uBAAA,OAAA,uCAAA,yBAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,mBAAA,WAAA,SAAA,CAAA,IAAA,uBAAA,IAAA,+BAAA,gBAAA,YAAA,oBAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,sBAAA,aAAA,2BAAA,YAAA,uBAAA;;AC9BP;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,SAAA;;ACNP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,iBAAA;;ACRP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,eAAA,8EAAA,cAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,iBAAA,8EAAA,cAAA;;AClBP;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,aAAA;;ACNP;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,SAAA,QAAA,MAAA,GAAwC,KAAe,CAAA,SAAA;AAC9D;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,gBAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,wBAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,eAAA;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,cAAA,cAAA;;;;"}
package/dist/web.js CHANGED
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var state = require('./internals/state-DFlnc6I0.js');
4
- var renderer = require('./internals/renderer-B04DCuHt.js');
3
+ var state = require('./internals/state-C9_fGuhZ.js');
4
+ var renderer = require('./internals/renderer-I-1wuWMB.js');
5
5
  var _ = require('lodash');
6
6
  require('myers.js');
7
- var sync = require('./internals/sync-OyR_m41B.js');
7
+ var sync = require('./internals/sync-B7gLfyQK.js');
8
8
  require('nextick');
9
9
  require('postcss');
10
10
  require('postcss-js');
11
11
  require('postcss-nested');
12
- require('./internals/runtime-BFi9M0jE.js');
13
- require('./internals/renderer-mim3fEAf.js');
12
+ require('./internals/runtime-57ivQprw.js');
13
+ require('./internals/renderer-CNz1Y3a_.js');
14
14
 
15
15
  //
16
16
  // document.ts
@@ -36,6 +36,12 @@ require('./internals/renderer-mim3fEAf.js');
36
36
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
37
37
  // THE SOFTWARE.
38
38
  //
39
+ /**
40
+ * Hook to access the current document object in a web renderer.
41
+ *
42
+ * @returns The current document object.
43
+ * @throws Error if used outside of a render function or with an unsupported renderer.
44
+ */
39
45
  const useDocument = () => {
40
46
  const state$1 = state.reconciler.currentHookState;
41
47
  if (!state$1)
@@ -72,6 +78,12 @@ const useDocument = () => {
72
78
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
73
79
  // THE SOFTWARE.
74
80
  //
81
+ /**
82
+ * Hook to access the current window object in a web renderer.
83
+ *
84
+ * @returns The current window object.
85
+ * @throws Error if used outside of a render function or with an unsupported renderer.
86
+ */
75
87
  const useWindow = () => {
76
88
  const state$1 = state.reconciler.currentHookState;
77
89
  if (!state$1)
@@ -117,6 +129,12 @@ const safeAreaInsets = (window) => {
117
129
  style.remove();
118
130
  return _.mapValues(insets, v => parseFloat(v));
119
131
  };
132
+ /**
133
+ * A hook that provides various metrics of the window object.
134
+ * It listens to the 'resize' event to update the metrics.
135
+ *
136
+ * @returns An object containing safe area insets, device pixel ratio, outer and inner dimensions of the window.
137
+ */
120
138
  const useWindowMetrics = () => {
121
139
  const window = useWindow();
122
140
  return sync.useSyncExternalStore((onStoreChange) => {
@@ -133,6 +151,12 @@ const useWindowMetrics = () => {
133
151
  innerHeight: window.innerHeight,
134
152
  }));
135
153
  };
154
+ /**
155
+ * A hook that provides metrics of the visual viewport.
156
+ * It listens to the 'resize' event of the visual viewport to update the metrics.
157
+ *
158
+ * @returns An object containing width, height, and scale of the visual viewport.
159
+ */
136
160
  const useVisualViewportMetrics = () => {
137
161
  const { visualViewport } = useWindow();
138
162
  return sync.useSyncExternalStore((onStoreChange) => {
@@ -146,6 +170,12 @@ const useVisualViewportMetrics = () => {
146
170
  scale: visualViewport.scale,
147
171
  }));
148
172
  };
173
+ /**
174
+ * A hook that provides the current scroll position of the window.
175
+ * It listens to the 'scroll' event to update the position.
176
+ *
177
+ * @returns An object containing scrollX and scrollY values.
178
+ */
149
179
  const useWindowScroll = () => {
150
180
  const window = useWindow();
151
181
  return sync.useSyncExternalStore((onStoreChange) => {
@@ -159,6 +189,12 @@ const useWindowScroll = () => {
159
189
  }));
160
190
  };
161
191
  const colorSchemeDarkCache = new WeakMap();
192
+ /**
193
+ * A hook that detects the user's preferred color scheme (light or dark).
194
+ * It listens to changes in the '(prefers-color-scheme: dark)' media query.
195
+ *
196
+ * @returns A string indicating the current color scheme: 'light' or 'dark'.
197
+ */
162
198
  const useColorScheme = () => {
163
199
  const window = useWindow();
164
200
  if (!colorSchemeDarkCache.has(window))
@@ -347,6 +383,13 @@ const observer = typeof window === 'undefined' ? undefined : {
347
383
  resize: createObserver(ResizeObserver),
348
384
  intersection: createObserver(IntersectionObserver),
349
385
  };
386
+ /**
387
+ * A hook that sets up a ResizeObserver on the given target element.
388
+ *
389
+ * @param target - The target element or a ref object containing the target element.
390
+ * @param callback - The callback function to be called when the target element is resized.
391
+ * @param options - Optional ResizeObserverOptions to configure the observer.
392
+ */
350
393
  const useResizeObserver = (target, callback, options) => {
351
394
  const _callback = sync.useCallback(callback);
352
395
  sync.useEffect(() => {
@@ -357,6 +400,12 @@ const useResizeObserver = (target, callback, options) => {
357
400
  return () => observer.resize.unobserve(_target, _callback);
358
401
  }, [target]);
359
402
  };
403
+ /**
404
+ * A hook that sets up an IntersectionObserver on the given target element.
405
+ *
406
+ * @param target - The target element or a ref object containing the target element.
407
+ * @param callback - The callback function to be called when the target element's intersection changes.
408
+ */
360
409
  const useIntersectionObserver = (target, callback) => {
361
410
  const _callback = sync.useCallback(callback);
362
411
  sync.useEffect(() => {
@@ -367,6 +416,13 @@ const useIntersectionObserver = (target, callback) => {
367
416
  return () => observer.intersection.unobserve(_target, _callback);
368
417
  }, [target]);
369
418
  };
419
+ /**
420
+ * A hook that sets up a MutationObserver on the given target node.
421
+ *
422
+ * @param target - The target node or a ref object containing the target node.
423
+ * @param callback - The callback function to be called when mutations are observed.
424
+ * @param options - Optional MutationObserverInit to configure the observer.
425
+ */
370
426
  const useMutationObserver = (target, callback, options) => {
371
427
  const _callback = sync.useCallback(callback);
372
428
  sync.useEffect(() => {
@@ -378,6 +434,12 @@ const useMutationObserver = (target, callback, options) => {
378
434
  return () => observer.disconnect();
379
435
  }, [target]);
380
436
  };
437
+ /**
438
+ * A hook that sets up a PerformanceObserver with the given callback and options.
439
+ *
440
+ * @param callback - The callback function to be called when performance entries are observed.
441
+ * @param options - Optional PerformanceObserverInit to configure the observer.
442
+ */
381
443
  const usePerformanceObserver = (callback, options) => {
382
444
  const _callback = sync.useCallback(callback);
383
445
  sync.useEffect(() => {
@@ -413,6 +475,12 @@ const usePerformanceObserver = (callback, options) => {
413
475
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
414
476
  // THE SOFTWARE.
415
477
  //
478
+ /**
479
+ * A hook that returns the current online status of the browser.
480
+ * It listens to the 'online' and 'offline' events to update the status.
481
+ *
482
+ * @returns A boolean indicating whether the browser is online.
483
+ */
416
484
  const useOnline = () => sync.useSyncExternalStore((onStoreChange) => {
417
485
  window.addEventListener('offline', onStoreChange);
418
486
  window.addEventListener('online', onStoreChange);
@@ -552,6 +620,15 @@ const decompress = (compressedInput) => {
552
620
  // THE SOFTWARE.
553
621
  //
554
622
  const decodedSsrData = new WeakMap();
623
+ /**
624
+ * A hook to manage server-side resources in a web renderer.
625
+ * It allows tracking and retrieving resources identified by a key.
626
+ *
627
+ * @param key - The unique key for the resource.
628
+ * @param resource - An optional function that returns the resource string when called on the server side.
629
+ * @returns The resource string if available, otherwise undefined.
630
+ * @throws Error if used outside of a render function or with an unsupported renderer.
631
+ */
555
632
  const useServerResource = (key, resource) => {
556
633
  const state$1 = state.reconciler.currentHookState;
557
634
  if (!state$1)
@@ -655,7 +732,23 @@ const _useStorage = (storage, key, initialValue) => {
655
732
  }, [key]);
656
733
  return [state ?? initialValue ?? null, setState];
657
734
  };
735
+ /**
736
+ * A hook to manage a value in localStorage.
737
+ * It provides a stateful value and a function to update it.
738
+ *
739
+ * @param key - The key in localStorage to manage.
740
+ * @param initialValue - An optional initial value if the key does not exist in localStorage.
741
+ * @returns A tuple containing the current value and a function to update it.
742
+ */
658
743
  const useLocalStorage = (key, initialValue) => _useStorage(() => window.localStorage, key, initialValue);
744
+ /**
745
+ * A hook to manage a value in sessionStorage.
746
+ * It provides a stateful value and a function to update it.
747
+ *
748
+ * @param key - The key in sessionStorage to manage.
749
+ * @param initialValue - An optional initial value if the key does not exist in sessionStorage.
750
+ * @returns A tuple containing the current value and a function to update it.
751
+ */
659
752
  const useSessionStorage = (key, initialValue) => _useStorage(() => window.sessionStorage, key, initialValue);
660
753
 
661
754
  //
@@ -682,6 +775,12 @@ const useSessionStorage = (key, initialValue) => _useStorage(() => window.sessio
682
775
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
683
776
  // THE SOFTWARE.
684
777
  //
778
+ /**
779
+ * A hook to get the current visibility state of the document.
780
+ * It listens to the 'visibilitychange' event to update the state.
781
+ *
782
+ * @returns A string indicating the current visibility state: 'active', 'inactive', 'background', or 'unknown'.
783
+ */
685
784
  const useVisibility = () => {
686
785
  const document = useDocument();
687
786
  return sync.useSyncExternalStore((onStoreChange) => {
package/dist/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sources":["../../src/web/document.ts","../../src/web/window.ts","../../src/web/location.ts","../../src/web/observer.ts","../../src/web/online.ts","../../src/renderer/minify/decompress.ts","../../src/web/server.ts","../../src/web/storage.ts","../../src/web/visibility.ts"],"sourcesContent":["//\n// document.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\nexport const useDocument = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useDocument must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.document;\n } else {\n throw Error('Unsupported renderer.');\n }\n}","//\n// window.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { uniqueId } from '../core/utils';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\nexport const useWindow = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useWindow must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.window;\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n\nconst emptyInsets = { top: 0, left: 0, right: 0, bottom: 0 };\nconst safeAreaInsets = (window: ReturnType<typeof useWindow>) => {\n let support;\n if (!('CSS' in window) || !_.isFunction(window.CSS.supports)) {\n return emptyInsets;\n }\n if (window.CSS.supports('top: env(safe-area-inset-top)')) {\n support = 'env'\n } else if (window.CSS.supports('top: constant(safe-area-inset-top)')) {\n support = 'constant'\n } else {\n return emptyInsets;\n }\n const id = uniqueId();\n const style = document.createElement('style');\n style.textContent = `:root {\n --${id}-top: ${support}(safe-area-inset-top);\n --${id}-left: ${support}(safe-area-inset-left);\n --${id}-right: ${support}(safe-area-inset-right);\n --${id}-bottom: ${support}(safe-area-inset-bottom);\n }`;\n document.head.appendChild(style);\n const computedStyle = getComputedStyle(document.documentElement);\n const insets = {\n top: computedStyle.getPropertyValue(`--${id}-top`),\n left: computedStyle.getPropertyValue(`--${id}-left`),\n right: computedStyle.getPropertyValue(`--${id}-right`),\n bottom: computedStyle.getPropertyValue(`--${id}-bottom`),\n };\n style.remove();\n return _.mapValues(insets, v => parseFloat(v));\n}\n\nexport const useWindowMetrics = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('resize', onStoreChange);\n return () => {\n window.removeEventListener('resize', onStoreChange);\n };\n }, () => ({\n safeAreaInsets: safeAreaInsets(window),\n devicePixelRatio: window.devicePixelRatio,\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n }));\n}\n\nexport const useVisualViewportMetrics = () => {\n const { visualViewport } = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n visualViewport?.addEventListener('resize', onStoreChange);\n return () => {\n visualViewport?.removeEventListener('resize', onStoreChange);\n };\n }, () => visualViewport && ({\n width: visualViewport.width,\n height: visualViewport.height,\n scale: visualViewport.scale,\n }));\n}\n\nexport const useWindowScroll = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('scroll', onStoreChange);\n return () => {\n window.removeEventListener('scroll', onStoreChange);\n };\n }, () => ({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n }));\n}\n\nconst colorSchemeDarkCache = new WeakMap<ReturnType<typeof useWindow>, MediaQueryList | undefined>();\n\nexport const useColorScheme = () => {\n const window = useWindow();\n if (!colorSchemeDarkCache.has(window)) colorSchemeDarkCache.set(window, window.matchMedia?.('(prefers-color-scheme: dark)'));\n const colorSchemeDark = colorSchemeDarkCache.get(window);\n return useSyncExternalStore((onStoreChange) => {\n colorSchemeDark?.addEventListener('change', onStoreChange);\n return () => {\n colorSchemeDark?.removeEventListener('change', onStoreChange);\n };\n }, () => colorSchemeDark?.matches ? 'dark' : 'light');\n}\n","//\n// location.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useMemo } from '../core/hooks/memo';\nimport { useCallback } from '../core/hooks/callback';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { EventEmitter } from '../core/reconciler/events';\nimport { SetStateAction } from '../core/types/common';\nimport { useWindow } from './window';\n\nconst emitters = new WeakMap<Document, EventEmitter>();\nconst emitterFor = (document: Document) => {\n if (!emitters.has(document)) emitters.set(document, new EventEmitter());\n return emitters.get(document)!;\n}\n\n/**\n * A hook that provides the current browser location and methods to manipulate the browser history.\n *\n * @returns An object with the following properties and methods:\n * - `hash`: The fragment identifier of the URL.\n * - `host`: The hostname and port number.\n * - `hostname`: The domain name.\n * - `href`: The full URL.\n * - `origin`: The protocol, hostname, and port.\n * - `pathname`: The path of the URL.\n * - `port`: The port number.\n * - `protocol`: The protocol scheme.\n * - `search`: The query string.\n * - `state`: The current state object associated with the history entry.\n * - `back()`: Navigates to the previous entry in the history stack.\n * - `forward()`: Navigates to the next entry in the history stack.\n * - `pushState(data, url)`: Pushes a new entry onto the history stack.\n * - `replaceState(data, url)`: Replaces the current history entry.\n *\n * The hook subscribes to changes in the browser's history and location, causing components to re-render when navigation occurs.\n *\n * @example\n * const location = useLocation();\n * console.log(location.pathname); // e.g., \"/about\"\n * location.pushState({ some: 'state' }, '/new-path');\n */\nexport const useLocation = () => {\n const window = useWindow();\n const emitter = emitterFor(window.document);\n const result = (history?: History) => ({\n ..._.pick(window.document.location, 'hash', 'host', 'hostname', 'href', 'origin', 'pathname', 'port', 'protocol', 'search'),\n state: history?.state ?? null,\n back: () => {\n history?.back();\n },\n forward: () => {\n history?.forward();\n emitter.emit('change');\n },\n pushState: (data: any, url?: string | URL | null) => {\n history?.pushState(data, '', url);\n emitter.emit('change');\n },\n replaceState: (data: any, url?: string | URL | null) => {\n history?.replaceState(data, '', url);\n emitter.emit('change');\n },\n });\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('popstate', onStoreChange);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('popstate', onStoreChange);\n event.remove();\n }\n }, () => result(window.history));\n}\n\n/**\n * A hook for reading and updating the URL's query string (search parameters).\n *\n * @returns A tuple:\n * - The first element is a `URLSearchParams` instance representing the current query string.\n * - The second element is a function to update the search parameters, which accepts any valid\n * `URLSearchParams` initializer (string, array, or object).\n *\n * Updating the search parameters will push a new history entry and update the URL in the address bar.\n *\n * @example\n * const [searchParams, setSearchParams] = useSearchParams();\n * const page = searchParams.get('page');\n * setSearchParams({ page: '2', filter: 'active' });\n */\nexport const useSearchParams = () => {\n const location = useLocation();\n const searchParams = useMemo(() => new URLSearchParams(location.search), [location.search]);\n type URLSearchParamsInit = ConstructorParameters<typeof URLSearchParams>[0];\n const setSearchParams = useCallback((\n dispatch: SetStateAction<URLSearchParamsInit, URLSearchParams>,\n config?: {\n replace?: boolean;\n },\n ) => {\n const params = _.isFunction(dispatch) ? dispatch(new URLSearchParams(location.search)) : dispatch;\n const newParams = new URLSearchParams(params);\n if (config?.replace === false) {\n location.pushState(location.state, `?${newParams.toString()}`);\n } else {\n location.replaceState(location.state, `?${newParams.toString()}`);\n }\n });\n return [searchParams, setSearchParams] as const;\n}\n","//\n// observer.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useEffect } from '../core/hooks/effect';\nimport { useCallback } from '../core/hooks/callback';\nimport { RefObject } from '../core/types/common';\n\ninterface _Observer<T> {\n observe(target: Element, options?: T): void;\n unobserve(target: Element): void;\n}\n\nconst createObserver = <E extends { target: Element; }, T>(\n constructor: new (callback: (entries: E[]) => void) => _Observer<T>\n) => {\n const listeners = new WeakMap<Element, ((entry: E) => void)[]>();\n const observer = new constructor((entries) => {\n for (const entry of entries) {\n for (const listener of listeners.get(entry.target) ?? []) {\n (async () => {\n try {\n await listener(entry);\n } catch (e) {\n console.error(e);\n }\n })();\n }\n }\n });\n return {\n observe: (target: Element, callback: (entry: E) => void, options?: T) => {\n observer.observe(target, options);\n listeners.set(target, [...listeners.get(target) ?? [], callback]);\n },\n unobserve: (target: Element, callback: (entry: E) => void) => {\n const list = _.filter(listeners.get(target), x => x !== callback);\n listeners.set(target, list);\n if (_.isEmpty(list)) observer.unobserve?.(target);\n },\n };\n};\n\nconst observer = typeof window === 'undefined' ? undefined : {\n resize: createObserver(ResizeObserver),\n intersection: createObserver(IntersectionObserver),\n};\n\nexport const useResizeObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: ResizeObserverEntry) => void,\n options?: ResizeObserverOptions,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.resize.observe(_target, _callback, options);\n return () => observer.resize.unobserve(_target, _callback);\n }, [target]);\n}\n\nexport const useIntersectionObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: IntersectionObserverEntry) => void,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.intersection.observe(_target, _callback);\n return () => observer.intersection.unobserve(_target, _callback);\n }, [target]);\n}\n\nexport const useMutationObserver = (\n target: RefObject<Node | null | undefined> | Node | null | undefined,\n callback: MutationCallback,\n options?: MutationObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (typeof window === 'undefined' || !_target) return;\n const observer = new MutationObserver(_callback);\n observer.observe(_target, options);\n return () => observer.disconnect();\n }, [target]);\n}\n\nexport const usePerformanceObserver = (\n callback: PerformanceObserverCallback,\n options?: PerformanceObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const observer = new PerformanceObserver(_callback);\n observer.observe(options);\n return () => observer.disconnect();\n }, []);\n}\n","//\n// online.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\n\nexport const useOnline = () => useSyncExternalStore((onStoreChange) => {\n window.addEventListener('offline', onStoreChange);\n window.addEventListener('online', onStoreChange);\n return () => {\n window.removeEventListener('offline', onStoreChange);\n window.removeEventListener('online', onStoreChange);\n };\n}, () => navigator.onLine, () => false);","//\n// decompress.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n/**\n * Decompresses a string that was compressed using the compress function\n * @param compressedInput - The compressed string to decompress\n * @returns The original uncompressed string\n */\nexport const decompress = (compressedInput: string): string => {\n // Algorithm state variables\n let previousEntry: string | undefined;\n let bitValue = 0;\n let bitIndex = 0;\n let currentEntry: string | number;\n let charCode = 0;\n\n // Dictionary for storing code->string mappings during decompression\n const dictionary: string[] = [];\n\n // Decompression parameters\n let resetCounter = 1;\n let nextCode = 3;\n let bitsPerCode = 1;\n\n // Output buffer - memory optimized with mutable string\n let result = \"\";\n\n // Bit reading state\n let bitBuffer = 0;\n let inputPosition = 0;\n\n /**\n * Reads the specified number of bits from the compressed input\n * @param numBits - Number of bits to read\n */\n function readBits(numBits: number): void {\n bitIndex = bitValue = 0;\n\n while (bitIndex < numBits) {\n // Refill bit buffer when needed\n if (bitBuffer < 2) {\n bitBuffer = 64;\n charCode = compressedInput.charCodeAt(inputPosition++);\n // Convert from custom alphabet back to numeric value\n charCode = charCode > 92 ? charCode - 59 : charCode - 58;\n }\n\n // Extract bits and build the value\n bitValue |= ((charCode & (bitBuffer /= 2)) > 0 ? 1 : 0) << bitIndex;\n ++bitIndex;\n }\n }\n\n // Main decompression loop\n while (true) {\n // Read the next code from input\n readBits(bitsPerCode + 1);\n\n // Check for end-of-stream marker\n if (bitValue === 2) {\n return result;\n }\n\n // Handle the current code\n currentEntry = bitValue;\n\n // Check if this is a character code (bit pattern check)\n if ((-2 & (currentEntry as number)) === 0) {\n // This is a raw character code, read the character value\n readBits(8 * bitValue + 8);\n\n // Create dictionary entry for this character\n currentEntry = nextCode++;\n dictionary[currentEntry] = String.fromCharCode(bitValue);\n\n // Update compression parameters\n if (--resetCounter === 0) {\n resetCounter = 2 << bitsPerCode++;\n }\n }\n\n // Get the string for this code (from dictionary or construct it)\n const entryString = dictionary[currentEntry as number] || (previousEntry ? previousEntry + previousEntry[0] : \"\");\n\n // Add to output using string concatenation\n result += entryString;\n\n // Update dictionary with new combination if we have a previous entry\n if (previousEntry) {\n dictionary[nextCode++] = previousEntry + entryString[0];\n\n // Update compression parameters\n if (--resetCounter === 0) {\n resetCounter = 2 << bitsPerCode++;\n }\n }\n\n // Remember this entry for next iteration\n previousEntry = entryString;\n }\n};\n","//\n// server.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\nimport { decompress } from '../renderer/minify/decompress';\n\nconst decodedSsrData = new WeakMap<Document, any>();\n\nexport const useServerResource = (key: string, resource?: () => string): string | undefined => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useServerResource must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n if (state.renderer._server) {\n const data = resource?.();\n if (!_.isString(data)) throw Error('Invalid return type of resource');\n state.renderer._tracked_server_resource.set(key, data);\n return data;\n } else {\n const cached = decodedSsrData.get(state.renderer.document);\n if (!_.isNil(cached)) return cached[key];\n const ssrData = state.renderer.document.querySelector('script[data-frosty-ssr-data]');\n if (ssrData instanceof HTMLElement) {\n try {\n const decoded = JSON.parse(decompress(ssrData.innerText.trim()));\n decodedSsrData.set(state.renderer.document, decoded);\n return decoded[key];\n } catch (e) {\n console.error(e);\n decodedSsrData.set(state.renderer.document, {});\n }\n ssrData.remove();\n } else {\n decodedSsrData.set(state.renderer.document, {});\n }\n }\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n","//\n// storage.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useCallback } from '../core/hooks/callback';\nimport { SetStateAction } from '../core/types/common';\nimport { EventEmitter } from '../core/reconciler/events';\n\nconst emitters = new WeakMap<Storage, EventEmitter>();\nconst emitterFor = (storage: Storage) => {\n if (!emitters.has(storage)) emitters.set(storage, new EventEmitter());\n return emitters.get(storage)!;\n}\n\nconst _useStorage = (\n storage: () => Storage,\n key: string,\n initialValue?: string | null\n) => {\n const state = useSyncExternalStore((onStoreChange) => {\n const _storage = storage();\n const emitter = emitterFor(_storage);\n const callback = (ev: StorageEvent) => { \n if (!ev.storageArea || ev.storageArea === _storage) onStoreChange();\n };\n window.addEventListener('storage', callback);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('storage', callback);\n event.remove();\n }\n }, () => storage().getItem(key), () => undefined);\n const setState = useCallback((v: SetStateAction<string | null | undefined>) => {\n try {\n const _storage = storage();\n const newValue = _.isFunction(v) ? v(state) : v;\n if (_.isNil(newValue)) {\n _storage.removeItem(key);\n } else {\n _storage.setItem(key, newValue);\n }\n const emitter = emitterFor(_storage);\n emitter.emit('change');\n } catch (e) {\n console.error(e);\n }\n }, [key]);\n return [state ?? initialValue ?? null, setState] as const;\n}\n\nexport const useLocalStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.localStorage, key, initialValue);\n\nexport const useSessionStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.sessionStorage, key, initialValue);\n","//\n// visibility.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useDocument } from './document';\n\nexport const useVisibility = () => {\n const document = useDocument();\n return useSyncExternalStore((onStoreChange) => {\n document.addEventListener('visibilitychange', onStoreChange);\n return () => {\n document.removeEventListener('visibilitychange', onStoreChange);\n }\n }, () => {\n if (document.hasFocus()) {\n return 'active' as const;\n } else if (document.visibilityState === 'visible') {\n return 'inactive' as const;\n } else {\n return 'background' as const;\n }\n }, () => 'unknown' as const);\n}\n"],"names":["state","reconciler","_DOMRenderer","uniqueId","useSyncExternalStore","emitters","emitterFor","EventEmitter","useMemo","useCallback","useEffect"],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sources":["../../src/web/document.ts","../../src/web/window.ts","../../src/web/location.ts","../../src/web/observer.ts","../../src/web/online.ts","../../src/renderer/minify/decompress.ts","../../src/web/server.ts","../../src/web/storage.ts","../../src/web/visibility.ts"],"sourcesContent":["//\n// document.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\n/**\n * Hook to access the current document object in a web renderer.\n * \n * @returns The current document object.\n * @throws Error if used outside of a render function or with an unsupported renderer.\n */\nexport const useDocument = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useDocument must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.document;\n } else {\n throw Error('Unsupported renderer.');\n }\n}","//\n// window.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { uniqueId } from '../core/utils';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\n\n/**\n * Hook to access the current window object in a web renderer.\n * \n * @returns The current window object.\n * @throws Error if used outside of a render function or with an unsupported renderer.\n */\nexport const useWindow = () => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useWindow must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n return state.renderer.window;\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n\nconst emptyInsets = { top: 0, left: 0, right: 0, bottom: 0 };\nconst safeAreaInsets = (window: ReturnType<typeof useWindow>) => {\n let support;\n if (!('CSS' in window) || !_.isFunction(window.CSS.supports)) {\n return emptyInsets;\n }\n if (window.CSS.supports('top: env(safe-area-inset-top)')) {\n support = 'env'\n } else if (window.CSS.supports('top: constant(safe-area-inset-top)')) {\n support = 'constant'\n } else {\n return emptyInsets;\n }\n const id = uniqueId();\n const style = document.createElement('style');\n style.textContent = `:root {\n --${id}-top: ${support}(safe-area-inset-top);\n --${id}-left: ${support}(safe-area-inset-left);\n --${id}-right: ${support}(safe-area-inset-right);\n --${id}-bottom: ${support}(safe-area-inset-bottom);\n }`;\n document.head.appendChild(style);\n const computedStyle = getComputedStyle(document.documentElement);\n const insets = {\n top: computedStyle.getPropertyValue(`--${id}-top`),\n left: computedStyle.getPropertyValue(`--${id}-left`),\n right: computedStyle.getPropertyValue(`--${id}-right`),\n bottom: computedStyle.getPropertyValue(`--${id}-bottom`),\n };\n style.remove();\n return _.mapValues(insets, v => parseFloat(v));\n}\n\n/**\n * A hook that provides various metrics of the window object.\n * It listens to the 'resize' event to update the metrics.\n * \n * @returns An object containing safe area insets, device pixel ratio, outer and inner dimensions of the window.\n */\nexport const useWindowMetrics = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('resize', onStoreChange);\n return () => {\n window.removeEventListener('resize', onStoreChange);\n };\n }, () => ({\n safeAreaInsets: safeAreaInsets(window),\n devicePixelRatio: window.devicePixelRatio,\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n }));\n}\n\n/** \n * A hook that provides metrics of the visual viewport.\n * It listens to the 'resize' event of the visual viewport to update the metrics.\n * \n * @returns An object containing width, height, and scale of the visual viewport.\n */\nexport const useVisualViewportMetrics = () => {\n const { visualViewport } = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n visualViewport?.addEventListener('resize', onStoreChange);\n return () => {\n visualViewport?.removeEventListener('resize', onStoreChange);\n };\n }, () => visualViewport && ({\n width: visualViewport.width,\n height: visualViewport.height,\n scale: visualViewport.scale,\n }));\n}\n\n/**\n * A hook that provides the current scroll position of the window.\n * It listens to the 'scroll' event to update the position.\n * \n * @returns An object containing scrollX and scrollY values.\n */\nexport const useWindowScroll = () => {\n const window = useWindow();\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('scroll', onStoreChange);\n return () => {\n window.removeEventListener('scroll', onStoreChange);\n };\n }, () => ({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n }));\n}\n\nconst colorSchemeDarkCache = new WeakMap<ReturnType<typeof useWindow>, MediaQueryList | undefined>();\n\n/**\n * A hook that detects the user's preferred color scheme (light or dark).\n * It listens to changes in the '(prefers-color-scheme: dark)' media query.\n * \n * @returns A string indicating the current color scheme: 'light' or 'dark'.\n */\nexport const useColorScheme = () => {\n const window = useWindow();\n if (!colorSchemeDarkCache.has(window)) colorSchemeDarkCache.set(window, window.matchMedia?.('(prefers-color-scheme: dark)'));\n const colorSchemeDark = colorSchemeDarkCache.get(window);\n return useSyncExternalStore((onStoreChange) => {\n colorSchemeDark?.addEventListener('change', onStoreChange);\n return () => {\n colorSchemeDark?.removeEventListener('change', onStoreChange);\n };\n }, () => colorSchemeDark?.matches ? 'dark' : 'light');\n}\n","//\n// location.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useMemo } from '../core/hooks/memo';\nimport { useCallback } from '../core/hooks/callback';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { EventEmitter } from '../core/reconciler/events';\nimport { SetStateAction } from '../core/types/common';\nimport { useWindow } from './window';\n\nconst emitters = new WeakMap<Document, EventEmitter>();\nconst emitterFor = (document: Document) => {\n if (!emitters.has(document)) emitters.set(document, new EventEmitter());\n return emitters.get(document)!;\n}\n\n/**\n * A hook that provides the current browser location and methods to manipulate the browser history.\n *\n * @returns An object with the following properties and methods:\n * - `hash`: The fragment identifier of the URL.\n * - `host`: The hostname and port number.\n * - `hostname`: The domain name.\n * - `href`: The full URL.\n * - `origin`: The protocol, hostname, and port.\n * - `pathname`: The path of the URL.\n * - `port`: The port number.\n * - `protocol`: The protocol scheme.\n * - `search`: The query string.\n * - `state`: The current state object associated with the history entry.\n * - `back()`: Navigates to the previous entry in the history stack.\n * - `forward()`: Navigates to the next entry in the history stack.\n * - `pushState(data, url)`: Pushes a new entry onto the history stack.\n * - `replaceState(data, url)`: Replaces the current history entry.\n *\n * The hook subscribes to changes in the browser's history and location, causing components to re-render when navigation occurs.\n *\n * @example\n * const location = useLocation();\n * console.log(location.pathname); // e.g., \"/about\"\n * location.pushState({ some: 'state' }, '/new-path');\n */\nexport const useLocation = () => {\n const window = useWindow();\n const emitter = emitterFor(window.document);\n const result = (history?: History) => ({\n ..._.pick(window.document.location, 'hash', 'host', 'hostname', 'href', 'origin', 'pathname', 'port', 'protocol', 'search'),\n state: history?.state ?? null,\n back: () => {\n history?.back();\n },\n forward: () => {\n history?.forward();\n emitter.emit('change');\n },\n pushState: (data: any, url?: string | URL | null) => {\n history?.pushState(data, '', url);\n emitter.emit('change');\n },\n replaceState: (data: any, url?: string | URL | null) => {\n history?.replaceState(data, '', url);\n emitter.emit('change');\n },\n });\n return useSyncExternalStore((onStoreChange) => {\n window.addEventListener('popstate', onStoreChange);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('popstate', onStoreChange);\n event.remove();\n }\n }, () => result(window.history));\n}\n\n/**\n * A hook for reading and updating the URL's query string (search parameters).\n *\n * @returns A tuple:\n * - The first element is a `URLSearchParams` instance representing the current query string.\n * - The second element is a function to update the search parameters, which accepts any valid\n * `URLSearchParams` initializer (string, array, or object).\n *\n * Updating the search parameters will push a new history entry and update the URL in the address bar.\n *\n * @example\n * const [searchParams, setSearchParams] = useSearchParams();\n * const page = searchParams.get('page');\n * setSearchParams({ page: '2', filter: 'active' });\n */\nexport const useSearchParams = () => {\n const location = useLocation();\n const searchParams = useMemo(() => new URLSearchParams(location.search), [location.search]);\n type URLSearchParamsInit = ConstructorParameters<typeof URLSearchParams>[0];\n const setSearchParams = useCallback((\n dispatch: SetStateAction<URLSearchParamsInit, URLSearchParams>,\n config?: {\n replace?: boolean;\n },\n ) => {\n const params = _.isFunction(dispatch) ? dispatch(new URLSearchParams(location.search)) : dispatch;\n const newParams = new URLSearchParams(params);\n if (config?.replace === false) {\n location.pushState(location.state, `?${newParams.toString()}`);\n } else {\n location.replaceState(location.state, `?${newParams.toString()}`);\n }\n });\n return [searchParams, setSearchParams] as const;\n}\n","//\n// observer.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useEffect } from '../core/hooks/effect';\nimport { useCallback } from '../core/hooks/callback';\nimport { RefObject } from '../core/types/common';\n\ninterface _Observer<T> {\n observe(target: Element, options?: T): void;\n unobserve(target: Element): void;\n}\n\nconst createObserver = <E extends { target: Element; }, T>(\n constructor: new (callback: (entries: E[]) => void) => _Observer<T>\n) => {\n const listeners = new WeakMap<Element, ((entry: E) => void)[]>();\n const observer = new constructor((entries) => {\n for (const entry of entries) {\n for (const listener of listeners.get(entry.target) ?? []) {\n (async () => {\n try {\n await listener(entry);\n } catch (e) {\n console.error(e);\n }\n })();\n }\n }\n });\n return {\n observe: (target: Element, callback: (entry: E) => void, options?: T) => {\n observer.observe(target, options);\n listeners.set(target, [...listeners.get(target) ?? [], callback]);\n },\n unobserve: (target: Element, callback: (entry: E) => void) => {\n const list = _.filter(listeners.get(target), x => x !== callback);\n listeners.set(target, list);\n if (_.isEmpty(list)) observer.unobserve?.(target);\n },\n };\n};\n\nconst observer = typeof window === 'undefined' ? undefined : {\n resize: createObserver(ResizeObserver),\n intersection: createObserver(IntersectionObserver),\n};\n\n/**\n * A hook that sets up a ResizeObserver on the given target element.\n * \n * @param target - The target element or a ref object containing the target element.\n * @param callback - The callback function to be called when the target element is resized.\n * @param options - Optional ResizeObserverOptions to configure the observer.\n */\nexport const useResizeObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: ResizeObserverEntry) => void,\n options?: ResizeObserverOptions,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.resize.observe(_target, _callback, options);\n return () => observer.resize.unobserve(_target, _callback);\n }, [target]);\n}\n\n/**\n * A hook that sets up an IntersectionObserver on the given target element.\n * \n * @param target - The target element or a ref object containing the target element.\n * @param callback - The callback function to be called when the target element's intersection changes.\n */\nexport const useIntersectionObserver = (\n target: RefObject<Element | null | undefined> | Element | null | undefined,\n callback: (entry: IntersectionObserverEntry) => void,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (!observer || !_target) return;\n observer.intersection.observe(_target, _callback);\n return () => observer.intersection.unobserve(_target, _callback);\n }, [target]);\n}\n\n/**\n * A hook that sets up a MutationObserver on the given target node.\n * \n * @param target - The target node or a ref object containing the target node.\n * @param callback - The callback function to be called when mutations are observed.\n * @param options - Optional MutationObserverInit to configure the observer.\n */\nexport const useMutationObserver = (\n target: RefObject<Node | null | undefined> | Node | null | undefined,\n callback: MutationCallback,\n options?: MutationObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n const _target = target && 'current' in target ? target.current : target;\n if (typeof window === 'undefined' || !_target) return;\n const observer = new MutationObserver(_callback);\n observer.observe(_target, options);\n return () => observer.disconnect();\n }, [target]);\n}\n\n/**\n * A hook that sets up a PerformanceObserver with the given callback and options.\n * \n * @param callback - The callback function to be called when performance entries are observed.\n * @param options - Optional PerformanceObserverInit to configure the observer.\n */\nexport const usePerformanceObserver = (\n callback: PerformanceObserverCallback,\n options?: PerformanceObserverInit,\n) => {\n const _callback = useCallback(callback);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const observer = new PerformanceObserver(_callback);\n observer.observe(options);\n return () => observer.disconnect();\n }, []);\n}\n","//\n// online.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\n\n/**\n * A hook that returns the current online status of the browser.\n * It listens to the 'online' and 'offline' events to update the status.\n * \n * @returns A boolean indicating whether the browser is online.\n */\nexport const useOnline = () => useSyncExternalStore((onStoreChange) => {\n window.addEventListener('offline', onStoreChange);\n window.addEventListener('online', onStoreChange);\n return () => {\n window.removeEventListener('offline', onStoreChange);\n window.removeEventListener('online', onStoreChange);\n };\n}, () => navigator.onLine, () => false);","//\n// decompress.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n/**\n * Decompresses a string that was compressed using the compress function\n * @param compressedInput - The compressed string to decompress\n * @returns The original uncompressed string\n */\nexport const decompress = (compressedInput: string): string => {\n // Algorithm state variables\n let previousEntry: string | undefined;\n let bitValue = 0;\n let bitIndex = 0;\n let currentEntry: string | number;\n let charCode = 0;\n\n // Dictionary for storing code->string mappings during decompression\n const dictionary: string[] = [];\n\n // Decompression parameters\n let resetCounter = 1;\n let nextCode = 3;\n let bitsPerCode = 1;\n\n // Output buffer - memory optimized with mutable string\n let result = \"\";\n\n // Bit reading state\n let bitBuffer = 0;\n let inputPosition = 0;\n\n /**\n * Reads the specified number of bits from the compressed input\n * @param numBits - Number of bits to read\n */\n function readBits(numBits: number): void {\n bitIndex = bitValue = 0;\n\n while (bitIndex < numBits) {\n // Refill bit buffer when needed\n if (bitBuffer < 2) {\n bitBuffer = 64;\n charCode = compressedInput.charCodeAt(inputPosition++);\n // Convert from custom alphabet back to numeric value\n charCode = charCode > 92 ? charCode - 59 : charCode - 58;\n }\n\n // Extract bits and build the value\n bitValue |= ((charCode & (bitBuffer /= 2)) > 0 ? 1 : 0) << bitIndex;\n ++bitIndex;\n }\n }\n\n // Main decompression loop\n while (true) {\n // Read the next code from input\n readBits(bitsPerCode + 1);\n\n // Check for end-of-stream marker\n if (bitValue === 2) {\n return result;\n }\n\n // Handle the current code\n currentEntry = bitValue;\n\n // Check if this is a character code (bit pattern check)\n if ((-2 & (currentEntry as number)) === 0) {\n // This is a raw character code, read the character value\n readBits(8 * bitValue + 8);\n\n // Create dictionary entry for this character\n currentEntry = nextCode++;\n dictionary[currentEntry] = String.fromCharCode(bitValue);\n\n // Update compression parameters\n if (--resetCounter === 0) {\n resetCounter = 2 << bitsPerCode++;\n }\n }\n\n // Get the string for this code (from dictionary or construct it)\n const entryString = dictionary[currentEntry as number] || (previousEntry ? previousEntry + previousEntry[0] : \"\");\n\n // Add to output using string concatenation\n result += entryString;\n\n // Update dictionary with new combination if we have a previous entry\n if (previousEntry) {\n dictionary[nextCode++] = previousEntry + entryString[0];\n\n // Update compression parameters\n if (--resetCounter === 0) {\n resetCounter = 2 << bitsPerCode++;\n }\n }\n\n // Remember this entry for next iteration\n previousEntry = entryString;\n }\n};\n","//\n// server.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { reconciler } from '../core/reconciler/state';\nimport { _DOMRenderer } from '../renderer/common';\nimport { decompress } from '../renderer/minify/decompress';\n\nconst decodedSsrData = new WeakMap<Document, any>();\n\n/**\n * A hook to manage server-side resources in a web renderer.\n * It allows tracking and retrieving resources identified by a key.\n * \n * @param key - The unique key for the resource.\n * @param resource - An optional function that returns the resource string when called on the server side.\n * @returns The resource string if available, otherwise undefined.\n * @throws Error if used outside of a render function or with an unsupported renderer.\n */\nexport const useServerResource = (key: string, resource?: () => string): string | undefined => {\n const state = reconciler.currentHookState;\n if (!state) throw Error('useServerResource must be used within a render function.');\n if (state.renderer instanceof _DOMRenderer) {\n if (state.renderer._server) {\n const data = resource?.();\n if (!_.isString(data)) throw Error('Invalid return type of resource');\n state.renderer._tracked_server_resource.set(key, data);\n return data;\n } else {\n const cached = decodedSsrData.get(state.renderer.document);\n if (!_.isNil(cached)) return cached[key];\n const ssrData = state.renderer.document.querySelector('script[data-frosty-ssr-data]');\n if (ssrData instanceof HTMLElement) {\n try {\n const decoded = JSON.parse(decompress(ssrData.innerText.trim()));\n decodedSsrData.set(state.renderer.document, decoded);\n return decoded[key];\n } catch (e) {\n console.error(e);\n decodedSsrData.set(state.renderer.document, {});\n }\n ssrData.remove();\n } else {\n decodedSsrData.set(state.renderer.document, {});\n }\n }\n } else {\n throw Error('Unsupported renderer.');\n }\n}\n","//\n// storage.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useCallback } from '../core/hooks/callback';\nimport { SetStateAction } from '../core/types/common';\nimport { EventEmitter } from '../core/reconciler/events';\n\nconst emitters = new WeakMap<Storage, EventEmitter>();\nconst emitterFor = (storage: Storage) => {\n if (!emitters.has(storage)) emitters.set(storage, new EventEmitter());\n return emitters.get(storage)!;\n}\n\nconst _useStorage = (\n storage: () => Storage,\n key: string,\n initialValue?: string | null\n) => {\n const state = useSyncExternalStore((onStoreChange) => {\n const _storage = storage();\n const emitter = emitterFor(_storage);\n const callback = (ev: StorageEvent) => { \n if (!ev.storageArea || ev.storageArea === _storage) onStoreChange();\n };\n window.addEventListener('storage', callback);\n const event = emitter.register('change', onStoreChange);\n return () => {\n window.removeEventListener('storage', callback);\n event.remove();\n }\n }, () => storage().getItem(key), () => undefined);\n const setState = useCallback((v: SetStateAction<string | null | undefined>) => {\n try {\n const _storage = storage();\n const newValue = _.isFunction(v) ? v(state) : v;\n if (_.isNil(newValue)) {\n _storage.removeItem(key);\n } else {\n _storage.setItem(key, newValue);\n }\n const emitter = emitterFor(_storage);\n emitter.emit('change');\n } catch (e) {\n console.error(e);\n }\n }, [key]);\n return [state ?? initialValue ?? null, setState] as const;\n}\n\n/**\n * A hook to manage a value in localStorage.\n * It provides a stateful value and a function to update it.\n * \n * @param key - The key in localStorage to manage.\n * @param initialValue - An optional initial value if the key does not exist in localStorage.\n * @returns A tuple containing the current value and a function to update it.\n */\nexport const useLocalStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.localStorage, key, initialValue);\n\n/** \n * A hook to manage a value in sessionStorage.\n * It provides a stateful value and a function to update it.\n * \n * @param key - The key in sessionStorage to manage.\n * @param initialValue - An optional initial value if the key does not exist in sessionStorage.\n * @returns A tuple containing the current value and a function to update it.\n */\nexport const useSessionStorage = (\n key: string,\n initialValue?: string | null\n) => _useStorage(() => window.sessionStorage, key, initialValue);\n","//\n// visibility.ts\n//\n// The MIT License\n// Copyright (c) 2021 - 2025 O2ter Limited. All rights reserved.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\nimport _ from 'lodash';\nimport { useSyncExternalStore } from '../core/hooks/sync';\nimport { useDocument } from './document';\n\n/**\n * A hook to get the current visibility state of the document.\n * It listens to the 'visibilitychange' event to update the state.\n * \n * @returns A string indicating the current visibility state: 'active', 'inactive', 'background', or 'unknown'.\n */\nexport const useVisibility = () => {\n const document = useDocument();\n return useSyncExternalStore((onStoreChange) => {\n document.addEventListener('visibilitychange', onStoreChange);\n return () => {\n document.removeEventListener('visibilitychange', onStoreChange);\n }\n }, () => {\n if (document.hasFocus()) {\n return 'active' as const;\n } else if (document.visibilityState === 'visible') {\n return 'inactive' as const;\n } else {\n return 'background' as const;\n }\n }, () => 'unknown' as const);\n}\n"],"names":["state","reconciler","_DOMRenderer","uniqueId","useSyncExternalStore","emitters","emitterFor","EventEmitter","useMemo","useCallback","useEffect"],"mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;;;;;AAKG;AACI,MAAM,WAAW,GAAG,MAAK;AAC9B,IAAA,MAAMA,OAAK,GAAGC,gBAAU,CAAC,gBAAgB;AACzC,IAAA,IAAI,CAACD,OAAK;AAAE,QAAA,MAAM,KAAK,CAAC,oDAAoD,CAAC;AAC7E,IAAA,IAAIA,OAAK,CAAC,QAAQ,YAAYE,qBAAY,EAAE;AAC1C,QAAA,OAAOF,OAAK,CAAC,QAAQ,CAAC,QAAQ;IAChC;SAAO;AACL,QAAA,MAAM,KAAK,CAAC,uBAAuB,CAAC;IACtC;AACF;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;;;;;AAKG;AACI,MAAM,SAAS,GAAG,MAAK;AAC5B,IAAA,MAAMA,OAAK,GAAGC,gBAAU,CAAC,gBAAgB;AACzC,IAAA,IAAI,CAACD,OAAK;AAAE,QAAA,MAAM,KAAK,CAAC,kDAAkD,CAAC;AAC3E,IAAA,IAAIA,OAAK,CAAC,QAAQ,YAAYE,qBAAY,EAAE;AAC1C,QAAA,OAAOF,OAAK,CAAC,QAAQ,CAAC,MAAM;IAC9B;SAAO;AACL,QAAA,MAAM,KAAK,CAAC,uBAAuB,CAAC;IACtC;AACF;AAEA,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;AAC5D,MAAM,cAAc,GAAG,CAAC,MAAoC,KAAI;AAC9D,IAAA,IAAI,OAAO;AACX,IAAA,IAAI,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC5D,QAAA,OAAO,WAAW;IACpB;IACA,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE;QACxD,OAAO,GAAG,KAAK;IACjB;SAAO,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE;QACpE,OAAO,GAAG,UAAU;IACtB;SAAO;AACL,QAAA,OAAO,WAAW;IACpB;AACA,IAAA,MAAM,EAAE,GAAGG,cAAQ,EAAE;IACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IAC7C,KAAK,CAAC,WAAW,GAAG,CAAA;AACd,MAAA,EAAA,EAAE,SAAS,OAAO,CAAA;AAClB,MAAA,EAAA,EAAE,UAAU,OAAO,CAAA;AACnB,MAAA,EAAA,EAAE,WAAW,OAAO,CAAA;AACpB,MAAA,EAAA,EAAE,YAAY,OAAO,CAAA;IACzB;AACF,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IAChC,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC;AAChE,IAAA,MAAM,MAAM,GAAG;QACb,GAAG,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA,EAAA,EAAK,EAAE,MAAM,CAAC;QAClD,IAAI,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA,EAAA,EAAK,EAAE,OAAO,CAAC;QACpD,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA,EAAA,EAAK,EAAE,QAAQ,CAAC;QACtD,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA,EAAA,EAAK,EAAE,SAAS,CAAC;KACzD;IACD,KAAK,CAAC,MAAM,EAAE;AACd,IAAA,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;;AAKG;AACI,MAAM,gBAAgB,GAAG,MAAK;AACnC,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE;AAC1B,IAAA,OAAOC,yBAAoB,CAAC,CAAC,aAAa,KAAI;AAC5C,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAChD,QAAA,OAAO,MAAK;AACV,YAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACrD,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,OAAO;AACR,QAAA,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC;QACtC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;AAChC,KAAA,CAAC,CAAC;AACL;AAEA;;;;;AAKG;AACI,MAAM,wBAAwB,GAAG,MAAK;AAC3C,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,SAAS,EAAE;AACtC,IAAA,OAAOA,yBAAoB,CAAC,CAAC,aAAa,KAAI;AAC5C,QAAA,cAAc,EAAE,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACzD,QAAA,OAAO,MAAK;AACV,YAAA,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC9D,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,MAAM,cAAc,KAAK;QAC1B,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;AAC5B,KAAA,CAAC,CAAC;AACL;AAEA;;;;;AAKG;AACI,MAAM,eAAe,GAAG,MAAK;AAClC,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE;AAC1B,IAAA,OAAOA,yBAAoB,CAAC,CAAC,aAAa,KAAI;AAC5C,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAChD,QAAA,OAAO,MAAK;AACV,YAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACrD,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,OAAO;QACR,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;AACxB,KAAA,CAAC,CAAC;AACL;AAEA,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAA4D;AAEpG;;;;;AAKG;AACI,MAAM,cAAc,GAAG,MAAK;AACjC,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE;AAC1B,IAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,QAAA,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,8BAA8B,CAAC,CAAC;IAC5H,MAAM,eAAe,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC;AACxD,IAAA,OAAOA,yBAAoB,CAAC,CAAC,aAAa,KAAI;AAC5C,QAAA,eAAe,EAAE,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC1D,QAAA,OAAO,MAAK;AACV,YAAA,eAAe,EAAE,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC/D,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,MAAM,eAAe,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AACvD;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAUA,MAAMC,UAAQ,GAAG,IAAI,OAAO,EAA0B;AACtD,MAAMC,YAAU,GAAG,CAAC,QAAkB,KAAI;AACxC,IAAA,IAAI,CAACD,UAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAEA,UAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAIE,kBAAY,EAAE,CAAC;AACvE,IAAA,OAAOF,UAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE;AAChC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACI,MAAM,WAAW,GAAG,MAAK;AAC9B,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE;IAC1B,MAAM,OAAO,GAAGC,YAAU,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3C,IAAA,MAAM,MAAM,GAAG,CAAC,OAAiB,MAAM;QACrC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;AAC3H,QAAA,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;QAC7B,IAAI,EAAE,MAAK;YACT,OAAO,EAAE,IAAI,EAAE;QACjB,CAAC;QACD,OAAO,EAAE,MAAK;YACZ,OAAO,EAAE,OAAO,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB,CAAC;AACD,QAAA,SAAS,EAAE,CAAC,IAAS,EAAE,GAAyB,KAAI;YAClD,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC;AACjC,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB,CAAC;AACD,QAAA,YAAY,EAAE,CAAC,IAAS,EAAE,GAAyB,KAAI;YACrD,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC;AACpC,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB,CAAC;AACF,KAAA,CAAC;AACF,IAAA,OAAOF,yBAAoB,CAAC,CAAC,aAAa,KAAI;AAC5C,QAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;AACvD,QAAA,OAAO,MAAK;AACV,YAAA,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC;YACrD,KAAK,CAAC,MAAM,EAAE;AAChB,QAAA,CAAC;IACH,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC;AAEA;;;;;;;;;;;;;;AAcG;AACI,MAAM,eAAe,GAAG,MAAK;AAClC,IAAA,MAAM,QAAQ,GAAG,WAAW,EAAE;IAC9B,MAAM,YAAY,GAAGI,YAAO,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE3F,MAAM,eAAe,GAAGC,gBAAW,CAAC,CAClC,QAA8D,EAC9D,MAEC,KACC;QACF,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ;AACjG,QAAA,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC;AAC7C,QAAA,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK,EAAE;AAC7B,YAAA,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA,CAAA,EAAI,SAAS,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;QAChE;aAAO;AACL,YAAA,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA,CAAA,EAAI,SAAS,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;QACnE;AACF,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,CAAC,YAAY,EAAE,eAAe,CAAU;AACjD;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAYA,MAAM,cAAc,GAAG,CACrB,WAAmE,KACjE;AACF,IAAA,MAAM,SAAS,GAAG,IAAI,OAAO,EAAmC;IAChE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,CAAC,OAAO,KAAI;AAC3C,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,YAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;gBACxD,CAAC,YAAW;AACV,oBAAA,IAAI;AACF,wBAAA,MAAM,QAAQ,CAAC,KAAK,CAAC;oBACvB;oBAAE,OAAO,CAAC,EAAE;AACV,wBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClB;gBACF,CAAC,GAAG;YACN;QACF;AACF,IAAA,CAAC,CAAC;IACF,OAAO;QACL,OAAO,EAAE,CAAC,MAAe,EAAE,QAA4B,EAAE,OAAW,KAAI;AACtE,YAAA,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;AACjC,YAAA,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;AACD,QAAA,SAAS,EAAE,CAAC,MAAe,EAAE,QAA4B,KAAI;YAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;AACjE,YAAA,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;AAAE,gBAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC;QACnD,CAAC;KACF;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG;AAC3D,IAAA,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC;AACtC,IAAA,YAAY,EAAE,cAAc,CAAC,oBAAoB,CAAC;CACnD;AAED;;;;;;AAMG;AACI,MAAM,iBAAiB,GAAG,CAC/B,MAA0E,EAC1E,QAA8C,EAC9C,OAA+B,KAC7B;AACF,IAAA,MAAM,SAAS,GAAGA,gBAAW,CAAC,QAAQ,CAAC;IACvCC,cAAS,CAAC,MAAK;AACb,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM;AACvE,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE;QAC3B,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;AACpD,QAAA,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC;AAC5D,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACd;AAEA;;;;;AAKG;MACU,uBAAuB,GAAG,CACrC,MAA0E,EAC1E,QAAoD,KAClD;AACF,IAAA,MAAM,SAAS,GAAGD,gBAAW,CAAC,QAAQ,CAAC;IACvCC,cAAS,CAAC,MAAK;AACb,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM;AACvE,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE;QAC3B,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;AACjD,QAAA,OAAO,MAAM,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC;AAClE,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACd;AAEA;;;;;;AAMG;AACI,MAAM,mBAAmB,GAAG,CACjC,MAAoE,EACpE,QAA0B,EAC1B,OAA8B,KAC5B;AACF,IAAA,MAAM,SAAS,GAAGD,gBAAW,CAAC,QAAQ,CAAC;IACvCC,cAAS,CAAC,MAAK;AACb,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM;AACvE,QAAA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,OAAO;YAAE;AAC/C,QAAA,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC;AAChD,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;AAClC,QAAA,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE;AACpC,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;AACd;AAEA;;;;;AAKG;MACU,sBAAsB,GAAG,CACpC,QAAqC,EACrC,OAAiC,KAC/B;AACF,IAAA,MAAM,SAAS,GAAGD,gBAAW,CAAC,QAAQ,CAAC;IACvCC,cAAS,CAAC,MAAK;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,SAAS,CAAC;AACnD,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzB,QAAA,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE;IACpC,CAAC,EAAE,EAAE,CAAC;AACR;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;;;;;AAKG;AACI,MAAM,SAAS,GAAG,MAAMN,yBAAoB,CAAC,CAAC,aAAa,KAAI;AACpE,IAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC;AACjD,IAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;AAChD,IAAA,OAAO,MAAK;AACV,QAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC;AACpD,QAAA,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;AACrD,IAAA,CAAC;AACH,CAAC,EAAE,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,KAAK;;ACzCtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;AAIG;AACI,MAAM,UAAU,GAAG,CAAC,eAAuB,KAAY;;AAE5D,IAAA,IAAI,aAAiC;IACrC,IAAI,QAAQ,GAAG,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC;AAChB,IAAA,IAAI,YAA6B;IACjC,IAAI,QAAQ,GAAG,CAAC;;IAGhB,MAAM,UAAU,GAAa,EAAE;;IAG/B,IAAI,YAAY,GAAG,CAAC;IACpB,IAAI,QAAQ,GAAG,CAAC;IAChB,IAAI,WAAW,GAAG,CAAC;;IAGnB,IAAI,MAAM,GAAG,EAAE;;IAGf,IAAI,SAAS,GAAG,CAAC;IACjB,IAAI,aAAa,GAAG,CAAC;AAErB;;;AAGG;IACH,SAAS,QAAQ,CAAC,OAAe,EAAA;AAC/B,QAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC;AAEvB,QAAA,OAAO,QAAQ,GAAG,OAAO,EAAE;;AAEzB,YAAA,IAAI,SAAS,GAAG,CAAC,EAAE;gBACjB,SAAS,GAAG,EAAE;gBACd,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;;AAEtD,gBAAA,QAAQ,GAAG,QAAQ,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE;YAC1D;;YAGA,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ;AACnE,YAAA,EAAE,QAAQ;QACZ;IACF;;IAGA,OAAO,IAAI,EAAE;;AAEX,QAAA,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC;;AAGzB,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,MAAM;QACf;;QAGA,YAAY,GAAG,QAAQ;;QAGvB,IAAI,CAAC,EAAE,GAAI,YAAuB,MAAM,CAAC,EAAE;;AAEzC,YAAA,QAAQ,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;;YAG1B,YAAY,GAAG,QAAQ,EAAE;YACzB,UAAU,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC;;AAGxD,YAAA,IAAI,EAAE,YAAY,KAAK,CAAC,EAAE;AACxB,gBAAA,YAAY,GAAG,CAAC,IAAI,WAAW,EAAE;YACnC;QACF;;QAGA,MAAM,WAAW,GAAG,UAAU,CAAC,YAAsB,CAAC,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;;QAGjH,MAAM,IAAI,WAAW;;QAGrB,IAAI,aAAa,EAAE;YACjB,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC;;AAGvD,YAAA,IAAI,EAAE,YAAY,KAAK,CAAC,EAAE;AACxB,gBAAA,YAAY,GAAG,CAAC,IAAI,WAAW,EAAE;YACnC;QACF;;QAGA,aAAa,GAAG,WAAW;IAC7B;AACF,CAAC;;AC1HD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOA,MAAM,cAAc,GAAG,IAAI,OAAO,EAAiB;AAEnD;;;;;;;;AAQG;MACU,iBAAiB,GAAG,CAAC,GAAW,EAAE,QAAuB,KAAwB;AAC5F,IAAA,MAAMJ,OAAK,GAAGC,gBAAU,CAAC,gBAAgB;AACzC,IAAA,IAAI,CAACD,OAAK;AAAE,QAAA,MAAM,KAAK,CAAC,0DAA0D,CAAC;AACnF,IAAA,IAAIA,OAAK,CAAC,QAAQ,YAAYE,qBAAY,EAAE;AAC1C,QAAA,IAAIF,OAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,QAAQ,IAAI;AACzB,YAAA,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,gBAAA,MAAM,KAAK,CAAC,iCAAiC,CAAC;YACrEA,OAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;AACtD,YAAA,OAAO,IAAI;QACb;aAAO;AACL,YAAA,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAACA,OAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC1D,YAAA,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AAAE,gBAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AACxC,YAAA,MAAM,OAAO,GAAGA,OAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,8BAA8B,CAAC;AACrF,YAAA,IAAI,OAAO,YAAY,WAAW,EAAE;AAClC,gBAAA,IAAI;AACF,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChE,cAAc,CAAC,GAAG,CAACA,OAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;AACpD,oBAAA,OAAO,OAAO,CAAC,GAAG,CAAC;gBACrB;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBAChB,cAAc,CAAC,GAAG,CAACA,OAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACjD;gBACA,OAAO,CAAC,MAAM,EAAE;YAClB;iBAAO;gBACL,cAAc,CAAC,GAAG,CAACA,OAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjD;QACF;IACF;SAAO;AACL,QAAA,MAAM,KAAK,CAAC,uBAAuB,CAAC;IACtC;AACF;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAyB;AACrD,MAAM,UAAU,GAAG,CAAC,OAAgB,KAAI;AACtC,IAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAIO,kBAAY,EAAE,CAAC;AACrE,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE;AAC/B,CAAC;AAED,MAAM,WAAW,GAAG,CAClB,OAAsB,EACtB,GAAW,EACX,YAA4B,KAC1B;AACF,IAAA,MAAM,KAAK,GAAGH,yBAAoB,CAAC,CAAC,aAAa,KAAI;AACnD,QAAA,MAAM,QAAQ,GAAG,OAAO,EAAE;AAC1B,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,QAAA,MAAM,QAAQ,GAAG,CAAC,EAAgB,KAAI;YACpC,IAAI,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,WAAW,KAAK,QAAQ;AAAE,gBAAA,aAAa,EAAE;AACrE,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;AACvD,QAAA,OAAO,MAAK;AACV,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC;YAC/C,KAAK,CAAC,MAAM,EAAE;AAChB,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,SAAS,CAAC;AACjD,IAAA,MAAM,QAAQ,GAAGK,gBAAW,CAAC,CAAC,CAA4C,KAAI;AAC5E,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,OAAO,EAAE;AAC1B,YAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC/C,YAAA,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACrB,gBAAA,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;YAC1B;iBAAO;AACL,gBAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;YACjC;AACA,YAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC;AACpC,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB;AACF,IAAA,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACT,OAAO,CAAC,KAAK,IAAI,YAAY,IAAI,IAAI,EAAE,QAAQ,CAAU;AAC3D,CAAC;AAED;;;;;;;AAOG;AACI,MAAM,eAAe,GAAG,CAC7B,GAAW,EACX,YAA4B,KACzB,WAAW,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,YAAY;AAE7D;;;;;;;AAOG;AACI,MAAM,iBAAiB,GAAG,CAC/B,GAAW,EACX,YAA4B,KACzB,WAAW,CAAC,MAAM,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,YAAY;;ACjG/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;;;;;AAKG;AACI,MAAM,aAAa,GAAG,MAAK;AAChC,IAAA,MAAM,QAAQ,GAAG,WAAW,EAAE;AAC9B,IAAA,OAAOL,yBAAoB,CAAC,CAAC,aAAa,KAAI;AAC5C,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,aAAa,CAAC;AAC5D,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,aAAa,CAAC;AACjE,QAAA,CAAC;IACH,CAAC,EAAE,MAAK;AACN,QAAA,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE;AACvB,YAAA,OAAO,QAAiB;QAC1B;AAAO,aAAA,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE;AACjD,YAAA,OAAO,UAAmB;QAC5B;aAAO;AACL,YAAA,OAAO,YAAqB;QAC9B;AACF,IAAA,CAAC,EAAE,MAAM,SAAkB,CAAC;AAC9B;;;;;;;;;;;;;;;;;;;;;"}