@omerdlw/base-framework 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5240 -5165
- package/dist/index.js.map +1 -1
- package/dist/kernel/compose.d.ts.map +1 -1
- package/dist/kernel/handlers.d.ts.map +1 -1
- package/dist/kernel/hooks.d.ts.map +1 -1
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/operations.d.ts.map +1 -1
- package/dist/kernel/schema.d.ts +0 -2
- package/dist/kernel/schema.d.ts.map +1 -1
- package/dist/kernel/store.d.ts.map +1 -1
- package/dist/kernel/types.d.ts.map +1 -1
- package/dist/kernel/utils.d.ts +0 -2
- package/dist/kernel/utils.d.ts.map +1 -1
- package/dist/modules/ambient/color.d.ts +16 -0
- package/dist/modules/ambient/color.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +0 -17
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/context.d.ts +1 -7
- package/dist/modules/ambient/context.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +19 -0
- package/dist/modules/ambient/dom.d.ts.map +1 -0
- package/dist/modules/ambient/extractor.d.ts +5 -0
- package/dist/modules/ambient/extractor.d.ts.map +1 -0
- package/dist/modules/ambient/hooks.d.ts +9 -0
- package/dist/modules/ambient/hooks.d.ts.map +1 -0
- package/dist/modules/ambient/index.d.ts +7 -4
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +66 -60
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts +5 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/background/constants.d.ts +1 -10
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/context.d.ts +1 -13
- package/dist/modules/background/context.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +13 -118
- package/dist/modules/background/hooks.d.ts.map +1 -1
- package/dist/modules/background/index.d.ts +8 -3
- package/dist/modules/background/index.d.ts.map +1 -1
- package/dist/modules/background/index.js +975 -991
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/module.d.ts +1 -0
- package/dist/modules/background/module.d.ts.map +1 -1
- package/dist/modules/background/overlay.d.ts +93 -2
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/playback.d.ts +10 -0
- package/dist/modules/background/playback.d.ts.map +1 -0
- package/dist/modules/background/state.d.ts +9 -0
- package/dist/modules/background/state.d.ts.map +1 -0
- package/dist/modules/background/{utils.d.ts → visual.d.ts} +6 -14
- package/dist/modules/background/visual.d.ts.map +1 -0
- package/dist/modules/background/youtube/player.d.ts +28 -0
- package/dist/modules/background/youtube/player.d.ts.map +1 -0
- package/dist/modules/context-menu/context.d.ts +1 -10
- package/dist/modules/context-menu/context.d.ts.map +1 -1
- package/dist/modules/context-menu/dom.d.ts +8 -0
- package/dist/modules/context-menu/dom.d.ts.map +1 -0
- package/dist/modules/context-menu/hooks.d.ts +11 -11
- package/dist/modules/context-menu/hooks.d.ts.map +1 -1
- package/dist/modules/context-menu/index.d.ts +8 -3
- package/dist/modules/context-menu/index.d.ts.map +1 -1
- package/dist/modules/context-menu/index.js +97 -101
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/context-menu/{utils.d.ts → items.d.ts} +2 -9
- package/dist/modules/context-menu/items.d.ts.map +1 -0
- package/dist/modules/context-menu/module.d.ts.map +1 -1
- package/dist/modules/context-menu/overlay.d.ts +13 -1
- package/dist/modules/context-menu/overlay.d.ts.map +1 -1
- package/dist/modules/context-menu/state.d.ts +1 -0
- package/dist/modules/context-menu/state.d.ts.map +1 -1
- package/dist/modules/controls/{utils.d.ts → entries.d.ts} +6 -5
- package/dist/modules/controls/entries.d.ts.map +1 -0
- package/dist/modules/controls/hooks.d.ts +0 -7
- package/dist/modules/controls/hooks.d.ts.map +1 -1
- package/dist/modules/controls/index.d.ts +5 -3
- package/dist/modules/controls/index.d.ts.map +1 -1
- package/dist/modules/controls/index.js +66 -61
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/layout.d.ts +7 -0
- package/dist/modules/controls/layout.d.ts.map +1 -0
- package/dist/modules/controls/overlay.d.ts +9 -0
- package/dist/modules/controls/overlay.d.ts.map +1 -1
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/dom.d.ts +24 -0
- package/dist/modules/dock/dom.d.ts.map +1 -0
- package/dist/modules/dock/helpers.d.ts +25 -0
- package/dist/modules/dock/helpers.d.ts.map +1 -0
- package/dist/modules/dock/hooks.d.ts +3 -918
- package/dist/modules/dock/hooks.d.ts.map +1 -1
- package/dist/modules/dock/index.d.ts +3 -2
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +3091 -3079
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/layout.d.ts +26 -0
- package/dist/modules/dock/layout.d.ts.map +1 -0
- package/dist/modules/dock/module.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/paths.d.ts +10 -0
- package/dist/modules/dock/paths.d.ts.map +1 -0
- package/dist/modules/dock/provider.d.ts.map +1 -1
- package/dist/modules/dock/runtime/display.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/runtime/pipeline.d.ts +32 -0
- package/dist/modules/dock/runtime/pipeline.d.ts.map +1 -0
- package/dist/modules/dock/status/events.d.ts.map +1 -1
- package/dist/modules/dock/styles.d.ts +900 -0
- package/dist/modules/dock/styles.d.ts.map +1 -0
- package/dist/modules/dock/surface/context.d.ts +1 -2
- package/dist/modules/dock/surface/context.d.ts.map +1 -1
- package/dist/modules/dock/surface/definition.d.ts.map +1 -1
- package/dist/modules/dock/surface/helpers.d.ts +7 -0
- package/dist/modules/dock/surface/helpers.d.ts.map +1 -0
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
- package/dist/modules/dock/surface/machine.d.ts.map +1 -1
- package/dist/modules/dock/surface/stack.d.ts.map +1 -1
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +4861 -4788
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/context.d.ts +2 -13
- package/dist/modules/loading/context.d.ts.map +1 -1
- package/dist/modules/loading/hooks.d.ts +15 -2
- package/dist/modules/loading/hooks.d.ts.map +1 -1
- package/dist/modules/loading/index.d.ts +3 -2
- package/dist/modules/loading/index.d.ts.map +1 -1
- package/dist/modules/loading/index.js +38 -34
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/module.d.ts.map +1 -1
- package/dist/modules/loading/state.d.ts +6 -0
- package/dist/modules/loading/state.d.ts.map +1 -0
- package/dist/modules/media/constants.d.ts +0 -1
- package/dist/modules/media/constants.d.ts.map +1 -1
- package/dist/modules/media/context.d.ts +2 -6
- package/dist/modules/media/context.d.ts.map +1 -1
- package/dist/modules/media/hooks.d.ts +6 -1
- package/dist/modules/media/hooks.d.ts.map +1 -1
- package/dist/modules/media/index.d.ts +4 -3
- package/dist/modules/media/index.d.ts.map +1 -1
- package/dist/modules/media/index.js +100 -98
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/media/module.d.ts.map +1 -1
- package/dist/modules/media/overlay.d.ts +0 -5
- package/dist/modules/media/overlay.d.ts.map +1 -1
- package/dist/modules/media/playback.d.ts +5 -0
- package/dist/modules/media/playback.d.ts.map +1 -0
- package/dist/modules/media/session.d.ts +8 -0
- package/dist/modules/media/session.d.ts.map +1 -0
- package/dist/modules/media/types.d.ts +0 -1
- package/dist/modules/media/types.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts +1 -12
- package/dist/modules/modal/context.d.ts.map +1 -1
- package/dist/modules/modal/dom.d.ts +4 -0
- package/dist/modules/modal/dom.d.ts.map +1 -0
- package/dist/modules/modal/header.d.ts +7 -0
- package/dist/modules/modal/header.d.ts.map +1 -0
- package/dist/modules/modal/hooks.d.ts +12 -1
- package/dist/modules/modal/hooks.d.ts.map +1 -1
- package/dist/modules/modal/identity.d.ts +7 -0
- package/dist/modules/modal/identity.d.ts.map +1 -0
- package/dist/modules/modal/index.d.ts +9 -4
- package/dist/modules/modal/index.d.ts.map +1 -1
- package/dist/modules/modal/index.js +118 -86
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/modal/layout.d.ts +13 -0
- package/dist/modules/modal/layout.d.ts.map +1 -0
- package/dist/modules/modal/module.d.ts.map +1 -1
- package/dist/modules/modal/overlay.d.ts.map +1 -1
- package/dist/modules/modal/types.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +2 -8
- package/dist/modules/notification/context.d.ts.map +1 -1
- package/dist/modules/notification/hooks.d.ts +8 -1
- package/dist/modules/notification/hooks.d.ts.map +1 -1
- package/dist/modules/notification/index.d.ts +4 -3
- package/dist/modules/notification/index.d.ts.map +1 -1
- package/dist/modules/notification/index.js +56 -46
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/state.d.ts +17 -0
- package/dist/modules/notification/state.d.ts.map +1 -0
- package/dist/provider.js.map +1 -1
- package/docs/modules/ambient.md +12 -8
- package/docs/modules/background.md +15 -13
- package/docs/modules/context-menu.md +13 -13
- package/docs/modules/controls.md +4 -3
- package/docs/modules/dock.md +8 -2
- package/docs/modules/loading.md +11 -11
- package/docs/modules/media.md +8 -7
- package/docs/modules/modal.md +4 -1
- package/docs/modules/notification.md +4 -4
- package/package.json +1 -1
- package/dist/modules/ambient/utils.d.ts +0 -18
- package/dist/modules/ambient/utils.d.ts.map +0 -1
- package/dist/modules/background/utils.d.ts.map +0 -1
- package/dist/modules/context-menu/utils.d.ts.map +0 -1
- package/dist/modules/controls/utils.d.ts.map +0 -1
- package/dist/modules/dock/utils.d.ts +0 -93
- package/dist/modules/dock/utils.d.ts.map +0 -1
- package/dist/modules/loading/utils.d.ts +0 -4
- package/dist/modules/loading/utils.d.ts.map +0 -1
- package/dist/modules/media/utils.d.ts +0 -17
- package/dist/modules/media/utils.d.ts.map +0 -1
- package/dist/modules/modal/utils.d.ts +0 -31
- package/dist/modules/modal/utils.d.ts.map +0 -1
- package/dist/modules/notification/utils.d.ts +0 -9
- package/dist/modules/notification/utils.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/utils/dom.ts","../../../src/utils/object.ts","../../../src/utils/report.ts","../../../src/utils/user-message.ts","../../../src/utils/store.ts","../../../src/kernel/context-registry.ts","../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/events.ts","../../../src/hooks/use-global-event.ts","../../../src/kernel/module.tsx","../../../src/theme.tsx","../../../src/modules/notification/constants.ts","../../../src/modules/notification/utils.ts","../../../src/modules/notification/context.tsx","../../../src/result.ts","../../../src/modules/notification/hooks.ts","../../../src/tokens/motion.ts","../../../src/modules/notification/motion.ts","../../../src/modules/notification/overlay.tsx","../../../src/modules/notification/module.tsx"],"names":["useRef","useEffect","useState","useCallback","jsx","useContext","useMemo","useSyncExternalStore","jsxs","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","\"use client\";\n\nimport { use, type Context } from \"react\";\n\nexport function useRequiredContext<T>(\n context: Context<T | null>,\n hookName: string,\n providerName: string,\n): T {\n const value = use(context);\n if (value === null) {\n throw new Error(`${hookName} must be used within ${providerName}`);\n }\n return value;\n}\n","\"use client\";\n\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { type ExternalStore } from \"../utils\";\n\nexport function useStore<TState, TSlice = TState>(\n store: ExternalStore<TState>,\n selector: (state: TState) => TSlice = (state: TState) =>\n state as unknown as TSlice,\n isEqual: (a: TSlice, b: TSlice) => boolean = Object.is,\n): TSlice {\n const cacheRef = useRef<{\n isEqual: ((a: TSlice, b: TSlice) => boolean) | null;\n selected: TSlice | undefined;\n selector: ((state: TState) => TSlice) | null;\n snapshot: TState | null;\n }>({\n isEqual: null,\n selected: undefined,\n selector: null,\n snapshot: null,\n });\n\n const getSelectedSnapshot = useCallback(() => {\n const snapshot = store.getSnapshot();\n const cache = cacheRef.current;\n if (\n cache.snapshot === snapshot &&\n cache.selector === selector &&\n cache.isEqual === isEqual\n ) {\n return cache.selected as TSlice;\n }\n\n const selected = selector(snapshot);\n if (\n cache.snapshot !== null &&\n cache.isEqual === isEqual &&\n isEqual(cache.selected as TSlice, selected)\n ) {\n cache.snapshot = snapshot;\n cache.selector = selector;\n return cache.selected as TSlice;\n }\n\n cacheRef.current = {\n isEqual,\n selected,\n selector,\n snapshot,\n };\n return selected;\n }, [isEqual, selector, store]);\n\n return useSyncExternalStore(\n store.subscribe,\n getSelectedSnapshot,\n getSelectedSnapshot,\n );\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n","import { report } from \"./utils/report\";\nexport type EventListener<T = unknown> = (payload: T) => void;\n\nexport const EVENT_TYPES = Object.freeze({\n API_UNAUTHORIZED: \"API_UNAUTHORIZED\",\n STATE_CHANGE: \"STATE_CHANGE\",\n API_ERROR: \"API_ERROR\",\n APP_ERROR: \"APP_ERROR\",\n} as const);\n\nexport interface FrameworkEventMap {\n [EVENT_TYPES.API_UNAUTHORIZED]: {\n error?: unknown;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.API_ERROR]: {\n error: unknown;\n isCritical?: boolean;\n message?: string;\n retry?: () => void;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.APP_ERROR]: {\n error?: unknown;\n message?: string;\n resetError?: () => void;\n source?: string;\n [key: string]: unknown;\n };\n [EVENT_TYPES.STATE_CHANGE]: {\n message?: string;\n status?: \"success\" | \"warning\" | \"info\" | \"error\" | string;\n [key: string]: unknown;\n };\n}\n\nexport class EventEmitter<TEvents extends object = FrameworkEventMap> {\n private events: Map<string, Set<EventListener<never>>> = new Map();\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n subscribe<K extends keyof TEvents>(\n event: K,\n callback: EventListener<TEvents[K]>,\n ): () => void;\n subscribe<T = unknown>(event: string, callback: EventListener<T>): () => void;\n subscribe(event: string, callback: EventListener<never>): () => void {\n if (typeof event !== \"string\" || !event || typeof callback !== \"function\") {\n return () => {};\n }\n const listeners = this.events.get(event) || new Set<EventListener<never>>();\n listeners.add(callback);\n this.events.set(event, listeners);\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) this.events.delete(event);\n };\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void | undefined\n ? [payload?: TEvents[K]]\n : [payload: TEvents[K]]\n ): void;\n emit<T = unknown>(event: string, payload?: T): void;\n emit(event: string, payload?: unknown): void {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) return;\n const snapshot = Array.from(listeners);\n for (const callback of snapshot) {\n try {\n (callback as EventListener<unknown>)(payload);\n } catch (error) {\n report(`Event listener (${String(event)})`, error);\n }\n }\n }\n\n emitDebounced<K extends keyof TEvents>(\n event: K,\n payload: TEvents[K],\n waitMs?: number,\n ): void;\n emitDebounced<T = unknown>(event: string, payload?: T, waitMs?: number): void;\n emitDebounced(event: string, payload?: unknown, waitMs: number = 100): void {\n const existing = this.debounceTimers.get(event);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(event);\n this.emit(event, payload);\n }, waitMs);\n\n this.debounceTimers.set(event, timer);\n }\n\n cancelDebounced(event?: string): void {\n if (event) {\n const timer = this.debounceTimers.get(event);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(event);\n }\n } else {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n }\n\n unsubscribeAll(event?: string): void {\n this.cancelDebounced(event);\n if (event) this.events.delete(event);\n else this.events.clear();\n }\n\n hasListeners(event: string): boolean {\n return Boolean(this.events.get(event)?.size);\n }\n\n getListenerCount(event: string): number {\n return this.events.get(event)?.size || 0;\n }\n\n getAllEvents(): string[] {\n return [...this.events.keys()];\n }\n}\n\nconst GLOBAL_EVENTS_KEY = Symbol.for(\"__base_framework_global_events__\");\ntype GlobalWithEvents = typeof globalThis & {\n [GLOBAL_EVENTS_KEY]?: EventEmitter<FrameworkEventMap>;\n};\n\nconst _global = globalThis as GlobalWithEvents;\nexport const globalEvents: EventEmitter<FrameworkEventMap> =\n _global[GLOBAL_EVENTS_KEY] ??\n (_global[GLOBAL_EVENTS_KEY] = new EventEmitter<FrameworkEventMap>());\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { globalEvents, type FrameworkEventMap } from \"@/events\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseGlobalEventOptions } from \"./types\";\n\nexport function useGlobalEvent<K extends keyof FrameworkEventMap>(\n event: K | K[] | null | undefined,\n callback: (payload: FrameworkEventMap[K]) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent<T = unknown>(\n event: string | string[] | null | undefined,\n callback: (payload: T) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent(\n event: string | string[] | null | undefined,\n callback: (payload: never) => void,\n options?: UseGlobalEventOptions,\n): void {\n const callbackRef = useRef(callback);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastThrottleTimeRef = useRef<number>(0);\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const debounceMs = options?.debounceMs;\n const throttleMs = options?.throttleMs;\n\n useEffect(() => {\n if (!event) return;\n const events = Array.isArray(event) ? event.filter(Boolean) : [event];\n if (events.length === 0) return;\n\n const handler = (payload: never) => {\n if (debounceMs != null && debounceMs > 0) {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n callbackRef.current?.(payload);\n }, debounceMs);\n return;\n }\n\n if (throttleMs != null && throttleMs > 0) {\n const now = Date.now();\n const remaining = throttleMs - (now - lastThrottleTimeRef.current);\n if (remaining <= 0) {\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n lastThrottleTimeRef.current = now;\n callbackRef.current?.(payload);\n } else if (throttleTimerRef.current === null) {\n throttleTimerRef.current = setTimeout(() => {\n lastThrottleTimeRef.current = Date.now();\n throttleTimerRef.current = null;\n callbackRef.current?.(payload);\n }, remaining);\n }\n return;\n }\n\n callbackRef.current?.(payload);\n };\n\n const unsubs = events.map((ev) => globalEvents.subscribe(ev, handler));\n\n return () => {\n unsubs.forEach((unsub) => unsub());\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n };\n }, [event, debounceMs, throttleMs]);\n}\n","\"use client\";\n\nimport { createElement, use, useState, type ReactNode } from \"react\";\nimport { useStore } from \"@/hooks\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport {\n EMPTY_MODULES,\n ModuleHostContext,\n PassthroughBoundary,\n createModuleRegistryDefinitions,\n sortModules,\n type BoundaryComponent,\n type ModuleHostValue,\n} from \"./installed\";\nimport { PageControllerProvider } from \"./page-controller\";\nimport { RegistryProvider } from \"./provider\";\nimport type {\n AnyCoreModule,\n AppRegistryEntry,\n CoreModule,\n CoreModules,\n ModuleId,\n ModuleRuntimeOf,\n ModuleStateOf,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport function defineModule<\n TId extends string,\n TRuntime = never,\n TSlice = never,\n TController = never,\n>(\n coreModule: CoreModule<TId, TRuntime, TSlice, TController>,\n): CoreModule<TId, TRuntime, TSlice, TController> {\n return Object.freeze({ ...coreModule });\n}\n\nfunction warnMissingPeers(modules: readonly AnyCoreModule[]): void {\n const installed = new Set(modules.map((coreModule) => coreModule.id));\n for (const { id, uses } of modules) {\n const missing = (uses ?? []).filter((peer) => !installed.has(peer));\n if (missing.length > 0) {\n report(\n `Module \"${id}\" runs without its optional peers`,\n missing.join(\", \"),\n \"warn\",\n );\n }\n }\n}\n\nfunction createModuleHost(\n modules: readonly AnyCoreModule[],\n Boundary: BoundaryComponent,\n): ModuleHostValue {\n const sorted = sortModules(modules);\n if (process.env.NODE_ENV !== \"production\") warnMissingPeers(sorted);\n return {\n Boundary,\n byId: new Map(sorted.map((coreModule) => [coreModule.id, coreModule])),\n definitions: createModuleRegistryDefinitions(sorted),\n modules: Object.freeze(sorted),\n };\n}\n\nexport interface ModuleHostProps {\n boundary?: BoundaryComponent;\n children?: ReactNode;\n modules?: readonly AnyCoreModule[];\n registryEntries?: readonly AppRegistryEntry[];\n}\n\nexport function ModuleHost({\n boundary = PassthroughBoundary,\n children,\n modules = EMPTY_MODULES,\n registryEntries,\n}: ModuleHostProps) {\n const [host] = useState(() => createModuleHost(modules, boundary));\n const { Boundary } = host;\n\n const content = (\n <>\n {host.modules.map(({ Backdrop, id }) =>\n Backdrop ? (\n <Boundary key={id} name={id}>\n <Backdrop />\n </Boundary>\n ) : null,\n )}\n {children}\n {host.modules.map(({ Overlay, id }) =>\n Overlay ? (\n <Boundary key={id} name={id}>\n <Overlay />\n </Boundary>\n ) : null,\n )}\n </>\n );\n\n const tree = host.modules.reduceRight<ReactNode>(\n (inner, { Provider }) => (Provider ? <Provider>{inner}</Provider> : inner),\n content,\n );\n\n return (\n <RegistryProvider\n definitions={host.definitions}\n initialEntries={registryEntries}\n >\n <ModuleHostContext value={host}>\n <PageControllerProvider>{tree}</PageControllerProvider>\n </ModuleHostContext>\n </RegistryProvider>\n );\n}\n\nexport function useModule<K extends ModuleId>(\n id: K,\n): ModuleRuntimeOf<CoreModules[K]> | null {\n const coreModule = use(ModuleHostContext)?.byId.get(id);\n return coreModule?.context ? (use(coreModule.context) ?? null) : null;\n}\n\ntype ModuleActionsOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends { actions: infer TActions }\n ? TActions\n : never;\n\nexport interface ModulePeer<K extends ModuleId> {\n useActions(): ModuleActionsOf<K>;\n useRuntime(): ModuleRuntimeOf<CoreModules[K]>;\n useState<T>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ): T;\n}\n\nexport function definePeer<K extends ModuleId>(\n id: K,\n inert: ModuleRuntimeOf<CoreModules[K]>,\n): ModulePeer<K> {\n const useRuntime = (): ModuleRuntimeOf<CoreModules[K]> =>\n useModule(id) ?? inert;\n return {\n useRuntime,\n useActions: () => useRuntime().actions as ModuleActionsOf<K>,\n useState: <T,>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ) =>\n useStore<ModuleStateOf<K>, T>(\n (useRuntime() as { store: ExternalStore<ModuleStateOf<K>> }).store,\n selector,\n isEqual,\n ),\n };\n}\n\nconst NO_MODULE_STORE: ExternalStore<unknown> = createStore<unknown>(undefined);\n\nexport function useModuleState<K extends ModuleId, T>(\n id: K,\n selector: (state: ModuleStateOf<K>) => T,\n fallback: T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const runtime = useModule(id) as { store: ExternalStore<unknown> } | null;\n return useStore<unknown, T>(\n runtime?.store ?? NO_MODULE_STORE,\n (state) => (runtime ? selector(state as ModuleStateOf<K>) : fallback),\n isEqual,\n );\n}\n\nexport function ModuleBoundary({\n children,\n name,\n}: {\n children?: ReactNode;\n name?: string;\n}) {\n const Boundary = use(ModuleHostContext)?.Boundary ?? PassthroughBoundary;\n return createElement(Boundary, { name }, children);\n}\n\nexport function useIsModuleInstalled(id: ModuleId): boolean {\n return use(ModuleHostContext)?.byId.has(id) ?? false;\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n","import { USER_MESSAGES } from \"@/utils\";\nimport { defineThemeSpec } from \"@/theme\";\nimport {\n type NotificationActions,\n type NotificationState,\n type NotificationThemeSlot,\n} from \"./types\";\n\nexport const TOAST_DURATIONS = Object.freeze({\n DEFAULT: 2000,\n SHORT: 1500,\n} as const);\n\nexport const SESSION_EXPIRED_MESSAGE = USER_MESSAGES.unauthorized;\n\nexport const DOCK_STACK_ELEMENT_ID = \"dock-card-stack\";\n\nexport const notificationTheme =\n defineThemeSpec<NotificationThemeSlot>(\"notification\");\n\nexport const INITIAL_NOTIFICATION_STATE: NotificationState = Object.freeze({\n notifications: {},\n});\n\nexport const INERT_NOTIFICATION_ACTIONS: NotificationActions = Object.freeze({\n dismissAllNotifications: () => {},\n dismissNotification: () => {},\n showNotification: () => null,\n});\n\n","import { isObject } from \"@/utils\";\nimport {\n type NotificationData,\n type NotificationEntry,\n type NotificationOptions,\n type ToastOptionsInput,\n} from \"./types\";\n\nexport function normalizeFeedbackText<T = unknown>(value: T): T {\n if (typeof value !== \"string\") return value;\n return value.trim().replace(/[.\\s]+$/, \"\") as T;\n}\n\nexport function getActiveNotification(\n notifications: Record<string, NotificationEntry>,\n): NotificationEntry | null {\n let active: NotificationEntry | null = null;\n for (const entry of Object.values(notifications)) {\n if (!active || entry.timestamp >= active.timestamp) active = entry;\n }\n return active;\n}\n\nexport function normalizeToastOptions(\n options?: ToastOptionsInput,\n): NotificationOptions {\n return typeof options === \"number\" ? { duration: options } : options || {};\n}\n\nexport function withDefaultDuration(\n duration: number,\n options?: ToastOptionsInput,\n): NotificationOptions & { duration: number | null } {\n const normalized = normalizeToastOptions(options);\n return {\n ...normalized,\n duration:\n normalized.duration !== undefined ? normalized.duration : duration,\n };\n}\n\nexport function isNotificationDataObject(\n value: unknown,\n): value is NotificationData {\n return isObject(value) && \"message\" in value;\n}\n","\"use client\";\n\nimport {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore } from \"@/utils\";\n\nimport {\n INITIAL_NOTIFICATION_STATE,\n INERT_NOTIFICATION_ACTIONS,\n TOAST_DURATIONS,\n} from \"./constants\";\nimport {\n type NotificationActions,\n type NotificationContextValue,\n type NotificationData,\n type NotificationEntry,\n type NotificationProviderProps,\n type NotificationState,\n type ToastOptionsInput,\n} from \"./types\";\nimport {\n isNotificationDataObject,\n normalizeFeedbackText,\n normalizeToastOptions,\n} from \"./utils\";\n\nexport const NotificationContext =\n\n getOrCreateGlobalContext<NotificationContextValue | null>(\n \"NotificationContext\",\n null,\n );\n\nlet notificationIdCounter = 0;\n\nfunction normalizeDuration(value: unknown): number | null {\n if (value === null) return null;\n if (value === undefined) return TOAST_DURATIONS.DEFAULT;\n const duration = Number(value);\n return Number.isFinite(duration) && duration > 0 ? duration : null;\n}\n\nexport const NotificationProvider = ({\n children,\n}: NotificationProviderProps) => {\n const [store] = useState(() =>\n createStore<NotificationState>(INITIAL_NOTIFICATION_STATE, {\n freezeSnapshots: false,\n }),\n );\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const clearTimers = useCallback(() => {\n timersRef.current.forEach(clearTimeout);\n timersRef.current.clear();\n }, []);\n\n useEffect(() => clearTimers, [clearTimers]);\n\n const dismissNotification = useCallback(\n (id: string) => {\n clearTimeout(timersRef.current.get(id));\n timersRef.current.delete(id);\n\n store.publish((prev) => {\n if (!Object.hasOwn(prev.notifications, id)) return prev;\n const notifications = { ...prev.notifications };\n delete notifications[id];\n return { notifications };\n });\n },\n [store],\n );\n\n const dismissAllNotifications = useCallback(() => {\n clearTimers();\n store.publish((prev) =>\n Object.keys(prev.notifications).length === 0\n ? prev\n : { notifications: {} },\n );\n }, [clearTimers, store]);\n\n const showNotification = useCallback(\n (\n messageOrData: ReactNode | NotificationData,\n options?: ToastOptionsInput,\n ): string | null => {\n const normalizedOptions = normalizeToastOptions(options);\n const payload: NotificationData = isNotificationDataObject(messageOrData)\n ? { ...normalizedOptions, ...messageOrData }\n : { ...normalizedOptions, message: messageOrData };\n\n const normalizedMessage = normalizeFeedbackText(payload.message);\n if (\n normalizedMessage === null ||\n normalizedMessage === undefined ||\n normalizedMessage === \"\"\n ) {\n return null;\n }\n\n const id =\n payload.dedupeKey ||\n payload.id ||\n (typeof normalizedMessage === \"string\"\n ? normalizedMessage.slice(0, 64)\n : `notification-${++notificationIdCounter}`);\n\n clearTimers();\n\n const entry: NotificationEntry = {\n dedupeKey: payload.dedupeKey,\n duration: payload.duration,\n id,\n message: normalizedMessage,\n timestamp: Date.now(),\n };\n\n store.publish({ notifications: { [id]: entry } });\n\n const duration = normalizeDuration(payload.duration);\n if (duration) {\n timersRef.current.set(\n id,\n setTimeout(() => dismissNotification(id), duration),\n );\n }\n\n return id;\n },\n [clearTimers, dismissNotification, store],\n );\n\n const actions = useMemo<NotificationActions>(\n () => ({\n dismissAllNotifications,\n dismissNotification,\n showNotification,\n }),\n [dismissAllNotifications, dismissNotification, showNotification],\n );\n\n const value = useMemo<NotificationContextValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n return <NotificationContext value={value}>{children}</NotificationContext>;\n};\n\nexport function useNotificationActions(): NotificationActions {\n return useRequiredContext(\n NotificationContext,\n \"useNotificationActions\",\n \"NotificationProvider\",\n ).actions;\n}\n\nexport function useNotificationState(): NotificationState {\n const { store } = useRequiredContext(\n NotificationContext,\n \"useNotificationState\",\n \"NotificationProvider\",\n );\n return useStore(store);\n}\n\nexport function useNotification(): NotificationState & NotificationActions {\n const actions = useNotificationActions();\n const state = useNotificationState();\n return useMemo(() => ({ ...actions, ...state }), [actions, state]);\n}\n\nconst NOOP_NOTIFICATION_STORE = createStore<NotificationState>(\n INITIAL_NOTIFICATION_STATE,\n);\n\nexport function useOptionalNotificationState(): NotificationState;\nexport function useOptionalNotificationState<T>(\n selector: (state: NotificationState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalNotificationState<T = NotificationState>(\n selector?: (state: NotificationState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(NotificationContext);\n return useStore(\n ctx?.store ?? NOOP_NOTIFICATION_STORE,\n selector as (state: NotificationState) => T,\n isEqual,\n );\n}\n\nexport function useOptionalNotificationActions(): NotificationActions {\n const ctx = useContext(NotificationContext);\n return ctx?.actions ?? INERT_NOTIFICATION_ACTIONS;\n}\n\nexport function useNotificationVisible(): boolean {\n return useOptionalNotificationState(\n ({ notifications }) => Object.keys(notifications).length > 0,\n );\n}\n\n","import { UserError, toUserMessage } from \"./utils/user-message\";\nimport { report } from \"./utils/report\";\n\nexport interface SuccessResult<T> {\n readonly code?: string;\n readonly data: T;\n readonly error?: never;\n readonly success: true;\n}\n\nexport interface ErrorResult<E = string> {\n readonly code?: string;\n readonly data?: never;\n readonly error: E;\n readonly success: false;\n}\n\nexport type Result<T, E = string> = SuccessResult<T> | ErrorResult<E>;\n\nexport function ok<T>(data: T, code?: string): SuccessResult<T> {\n return { data, success: true, ...(code ? { code } : {}) };\n}\n\nexport function err<E = string>(error: E, code?: string): ErrorResult<E> {\n return { error, success: false, ...(code ? { code } : {}) };\n}\n\nexport function isResult(value: unknown): value is Result<unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"success\" in value &&\n typeof (value as { success: unknown }).success === \"boolean\" &&\n ((\"data\" in value && (value as { success: boolean }).success === true) ||\n (\"error\" in value && (value as { success: boolean }).success === false))\n );\n}\n\nexport function isOk<T, E = string>(\n result: Result<T, E>,\n): result is SuccessResult<T> {\n return result.success === true;\n}\n\nexport function isErr<T, E = string>(\n result: Result<T, E>,\n): result is ErrorResult<E> {\n return result.success === false;\n}\n\nexport function unwrap<T, E = string>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n if (result.error instanceof Error) {\n throw result.error;\n }\n throw new Error(\n typeof result.error === \"string\" ? result.error : String(result.error),\n );\n}\n\nexport function unwrapOr<T, E = string>(result: Result<T, E>, fallback: T): T {\n return result.success ? result.data : fallback;\n}\n\nexport function map<T, U, E = string>(\n result: Result<T, E>,\n fn: (data: T) => U,\n): Result<U, E> {\n return result.success ? ok(fn(result.data), result.code) : result;\n}\n\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F,\n): Result<T, F> {\n return result.success ? result : err(fn(result.error), result.code);\n}\n\nexport function match<T, E, R>(\n result: Result<T, E>,\n branches: { ok: (data: T) => R; err: (error: E) => R },\n): R {\n return result.success ? branches.ok(result.data) : branches.err(result.error);\n}\n\nfunction mapCaught<E>(error: unknown, mapError?: (error: unknown) => E): E {\n if (!(error instanceof UserError)) report(\"Result\", error);\n return mapError ? mapError(error) : (toUserMessage(error) as unknown as E);\n}\n\nexport async function tryCatch<T, E = string>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n mapError?: (error: unknown) => E,\n): Promise<Result<T, E>> {\n try {\n const data =\n typeof promiseOrFn === \"function\"\n ? await promiseOrFn()\n : await promiseOrFn;\n return ok(data);\n } catch (error) {\n return err(mapCaught(error, mapError));\n }\n}\n\ninterface SafeActionSchema<TParsed> {\n safeParse: (input: unknown) =>\n | { data: TParsed; success: true }\n | {\n error?: {\n issues?: Array<{ message?: string }>;\n message?: string;\n };\n success: false;\n };\n}\n\nexport interface SafeActionOptions<TArgs extends unknown[], E = string> {\n errorCode?: string;\n mapError?: (error: unknown) => E;\n schema?: SafeActionSchema<TArgs[0]>;\n validate?: (\n ...args: TArgs\n ) => Result<unknown, E> | string | boolean | null | undefined;\n}\n\nexport function createSafeAction<TArgs extends unknown[], TOutput, E = string>(\n handler: (\n ...args: TArgs\n ) => Promise<Result<TOutput, E> | TOutput> | Result<TOutput, E> | TOutput,\n options: SafeActionOptions<TArgs, E> = {},\n): (...args: TArgs) => Promise<Result<TOutput, E>> {\n const { errorCode, mapError, schema, validate } = options;\n\n return async (...args: TArgs): Promise<Result<TOutput, E>> => {\n try {\n let effectiveArgs = args;\n\n if (schema) {\n const parsed = schema.safeParse(args[0]);\n if (!parsed.success) {\n const issueMessage =\n parsed.error?.issues?.[0]?.message ||\n parsed.error?.message ||\n \"Invalid input\";\n return err(\n mapError ? mapError(issueMessage) : (issueMessage as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n }\n effectiveArgs = [parsed.data, ...args.slice(1)] as TArgs;\n }\n\n if (validate) {\n const validationResult = validate(...effectiveArgs);\n if (isResult(validationResult)) {\n if (isErr(validationResult)) {\n return validationResult as ErrorResult<E>;\n }\n } else if (validationResult === false) {\n return err(\n mapError\n ? mapError(\"Validation failed\")\n : (\"Validation failed\" as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n } else if (\n typeof validationResult === \"string\" &&\n validationResult.length > 0\n ) {\n return err(\n mapError\n ? mapError(validationResult)\n : (validationResult as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n }\n }\n\n const output = await handler(...effectiveArgs);\n if (isResult(output)) {\n return output as Result<TOutput, E>;\n }\n return ok(output as TOutput);\n } catch (error) {\n return err(mapCaught(error, mapError), errorCode);\n }\n };\n}\n","\"use client\";\n\nimport {\n useCallback,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { isResult } from \"@/result\";\nimport { toUserMessage } from \"@/utils\";\nimport { EVENT_TYPES } from \"@/events\";\nimport { useGlobalEvent } from \"@/hooks\";\nimport { useModuleTheme } from \"@/theme\";\nimport {\n TOAST_DURATIONS,\n SESSION_EXPIRED_MESSAGE,\n notificationTheme,\n} from \"./constants\";\nimport { useNotificationActions, useNotificationState } from \"./context\";\nimport {\n type ToastController,\n type ToastOptionsInput,\n type ToastPromiseMessages,\n} from \"./types\";\nimport {\n normalizeToastOptions,\n withDefaultDuration,\n getActiveNotification,\n} from \"./utils\";\n\nlet toastPromiseIdCounter = 0;\n\nfunction resolveMessage<A>(\n message: ReactNode | ((arg: A) => ReactNode),\n arg: A,\n): ReactNode {\n return typeof message === \"function\" ? message(arg) : message;\n}\n\nfunction getOutcomeMessage<T, E>(\n value: unknown,\n messages: ToastPromiseMessages<T, E>,\n): ReactNode {\n if (!isResult(value)) return resolveMessage(messages.success, value as T);\n return value.success\n ? resolveMessage(messages.success, value.data as T)\n : resolveMessage(messages.error, value.error as E) ||\n toUserMessage(value.error);\n}\n\nexport function useToast(defaultDuration?: number | null): ToastController {\n const { dismissAllNotifications, dismissNotification, showNotification } =\n useNotificationActions();\n\n const resolvedDefaultDuration = defaultDuration ?? TOAST_DURATIONS.DEFAULT;\n\n const triggerToast = useCallback(\n (message: ReactNode, options?: ToastOptionsInput): string | null =>\n showNotification(\n message,\n withDefaultDuration(resolvedDefaultDuration, options),\n ),\n [resolvedDefaultDuration, showNotification],\n );\n\n const dismiss = useCallback(\n (id?: string) => {\n if (id) dismissNotification(id);\n else dismissAllNotifications();\n },\n [dismissAllNotifications, dismissNotification],\n );\n\n const fromResult = useCallback(\n <T = unknown, E = unknown, R = unknown>(\n result: R,\n messages: ToastPromiseMessages<T, E> = {},\n options?: ToastOptionsInput,\n ) => {\n if (isResult(result)) {\n const message = getOutcomeMessage(result, messages);\n if (message) triggerToast(message, options);\n }\n return result;\n },\n [triggerToast],\n );\n\n const promise = useCallback(\n async <T = unknown, E = unknown>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n messages: ToastPromiseMessages<T, E> = {},\n options?: ToastOptionsInput,\n ): Promise<T> => {\n const normalized = normalizeToastOptions(options);\n const id =\n normalized.id ||\n normalized.dedupeKey ||\n `toast-promise-${++toastPromiseIdCounter}`;\n const sharedOptions = { ...normalized, id };\n\n if (messages.loading) {\n showNotification(messages.loading, {\n ...sharedOptions,\n duration: null,\n });\n }\n\n try {\n const resolved = await (typeof promiseOrFn === \"function\"\n ? promiseOrFn()\n : promiseOrFn);\n const message = getOutcomeMessage(resolved, messages);\n if (message) triggerToast(message, sharedOptions);\n else if (messages.loading) dismiss(id);\n return resolved;\n } catch (error) {\n triggerToast(\n resolveMessage(messages.error, error as E) || toUserMessage(error),\n sharedOptions,\n );\n throw error;\n }\n },\n [dismiss, showNotification, triggerToast],\n );\n\n return useMemo<ToastController>(\n () =>\n Object.assign(\n (message: ReactNode, options?: ToastOptionsInput) =>\n triggerToast(message, options),\n { dismiss, dismissAll: dismissAllNotifications, fromResult, promise },\n ),\n [dismiss, dismissAllNotifications, fromResult, promise, triggerToast],\n );\n}\n\nconst emptySubscribe = () => () => {};\n\nexport function NotificationListener(): null {\n const { showNotification } = useNotificationActions();\n\n useGlobalEvent(EVENT_TYPES.API_UNAUTHORIZED, (data?: { source?: string }) => {\n if (data?.source && data.source !== \"app\") return;\n showNotification(SESSION_EXPIRED_MESSAGE);\n });\n\n useGlobalEvent(\n EVENT_TYPES.APP_ERROR,\n (data?: { message?: string; notify?: boolean }) => {\n if (!data?.notify || !data.message) return;\n showNotification(data.message);\n },\n );\n\n useGlobalEvent(\n EVENT_TYPES.STATE_CHANGE,\n (data?: { message?: string; notify?: boolean }) => {\n if (!data?.notify || !data.message) return;\n showNotification(data.message);\n },\n );\n\n return null;\n}\n\nexport function useNotificationContainerModel() {\n const { notifications } = useNotificationState();\n const { dismissNotification } = useNotificationActions();\n const isHydrated = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n const activeEntry = useMemo(\n () => getActiveNotification(notifications),\n [notifications],\n );\n\n const theme = useModuleTheme(notificationTheme);\n\n return { dismissNotification, isHydrated, activeEntry, theme };\n}\n","export const DURATION_TOKENS = Object.freeze({\n INSTANT: 0.08,\n MICRO: 0.18,\n FAST: 0.28,\n BASE: 0.36,\n MODERATE: 0.44,\n SLOW: 0.58,\n CINEMATIC: 0.86,\n} as const);\n\nexport const EASING_CURVES = Object.freeze({\n OUT_EXPO: [0.16, 1, 0.3, 1] as const,\n OUT_QUART: [0.25, 1, 0.5, 1] as const,\n OUT_QUINT: [0.22, 1, 0.36, 1] as const,\n IN_OUT_CUBIC: [0.65, 0, 0.35, 1] as const,\n IN_CUBIC: [0.5, 0, 1, 1] as const,\n OUT_BACK: [0.34, 1.56, 0.64, 1] as const,\n} as const);\n\nexport const MOTION_EASINGS = Object.freeze({\n ENTER: EASING_CURVES.OUT_QUART,\n ENTER_EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nexport const MOTION_TIERS = Object.freeze({\n MICRO: Object.freeze({\n distance: 4,\n duration: DURATION_TOKENS.MICRO,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.008,\n }),\n FAST: Object.freeze({\n distance: 9,\n duration: DURATION_TOKENS.FAST,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.012,\n }),\n STANDARD: Object.freeze({\n distance: 18,\n duration: DURATION_TOKENS.MODERATE,\n ease: MOTION_EASINGS.ENTER,\n scaleDelta: 0.018,\n }),\n SURFACE: Object.freeze({\n distance: 28,\n duration: DURATION_TOKENS.SLOW,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.024,\n }),\n} as const);\n\nexport const SPRING_PRESETS = Object.freeze({\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.6,\n stiffness: 520,\n type: \"spring\",\n } as const),\n SNAPPY: Object.freeze({\n damping: 28,\n mass: 0.8,\n stiffness: 380,\n type: \"spring\",\n } as const),\n GENTLE: Object.freeze({\n damping: 30,\n mass: 1,\n stiffness: 260,\n type: \"spring\",\n } as const),\n BOUNCY: Object.freeze({\n damping: 20,\n mass: 0.85,\n stiffness: 340,\n type: \"spring\",\n } as const),\n} as const);\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.INSTANT,\n ease: \"linear\",\n} as const);\n\nexport const COMPOSITOR_GPU_STYLE = Object.freeze({\n backfaceVisibility: \"hidden\",\n transform: \"translate3d(0, 0, 0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nexport const TAP_SCALE_SUBTLE = 0.97;\n\ntype Ease = readonly [number, number, number, number];\n\ntype TweenOptions = {\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n};\n\ntype Spring = {\n type?: \"spring\";\n stiffness: number;\n damping: number;\n mass: number;\n};\n\nfunction tween(duration: number, ease: Ease) {\n return Object.freeze({ type: \"tween\" as const, duration, ease });\n}\n\nfunction safeNumber(value: unknown, fallback: number): number {\n const source =\n value &&\n typeof value === \"object\" &&\n \"get\" in value &&\n typeof value.get === \"function\"\n ? value.get()\n : value;\n const number = Number.parseFloat(String(source));\n return Number.isFinite(number) ? number : fallback;\n}\n\nexport function gpuTransform(\n y: unknown = 0,\n scale: unknown = 1,\n x: unknown = 0,\n): string {\n const translateY = Math.round(safeNumber(y, 0));\n const translateX = Math.round(safeNumber(x, 0));\n const scaleValue = Math.round(safeNumber(scale, 1) * 1000) / 1000;\n return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;\n}\n\nexport function durationForDistance(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n } = {},\n): number {\n const distance = Math.abs(Number(distancePx) || 0);\n const safeMin = Math.max(0, min);\n const safeMax = Math.max(safeMin, max);\n const safeReference = Math.max(1, reference);\n const duration = base + Math.sqrt(distance / safeReference) * gain;\n return Math.min(safeMax, Math.max(safeMin, duration));\n}\n\nexport function surfaceResizeTransition(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n ease = EASING_CURVES.IN_OUT_CUBIC,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n ease?: Ease;\n } = {},\n) {\n return tween(\n durationForDistance(distancePx, { base, min, max, reference, gain }),\n ease,\n );\n}\n\nexport function contentSwapTransitions({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n return Object.freeze({\n enter: tween(duration, enterEase),\n exit: tween(exitDuration, exitEase),\n });\n}\n\nexport function contentSwap({\n travel = 6,\n exitTravel = travel * 0.7,\n enterScale = 0.99,\n exitScale = 0.99,\n ...transitionOptions\n}: TweenOptions & {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n} = {}) {\n const transitions = contentSwapTransitions(transitionOptions);\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function overlaySurface({\n travel = 16,\n exitTravel = travel * 0.5,\n enterScale = 0.97,\n exitScale = 0.985,\n distance,\n duration,\n exitDuration,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n distance?: number;\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n} = {}) {\n const enterDuration =\n duration ??\n (distance === undefined\n ? DURATION_TOKENS.BASE\n : durationForDistance(distance));\n const transitions = contentSwapTransitions({\n duration: enterDuration,\n exitDuration: exitDuration ?? enterDuration * 0.68,\n enterEase,\n exitEase,\n });\n\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function staggerDelay(\n index: number,\n { base = 0.028, cap = 0.16, exponent = 0.82 } = {},\n): number {\n const safeIndex = Math.max(0, Number(index) || 0);\n return Math.min(cap, base * Math.pow(safeIndex, exponent));\n}\n\nexport function staggerItem({\n base = 0.028,\n cap = 0.16,\n duration = DURATION_TOKENS.BASE,\n travel = 10,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitDuration = DURATION_TOKENS.MICRO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n base?: number;\n cap?: number;\n duration?: number;\n travel?: number;\n enterEase?: Ease;\n exitDuration?: number;\n exitEase?: Ease;\n} = {}) {\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, 0.985),\n }),\n visible: (index: number = 0) => ({\n opacity: 1,\n transform: gpuTransform(0),\n transition: Object.freeze({\n ...tween(duration, enterEase),\n delay: staggerDelay(index, { base, cap }),\n }),\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-travel * 0.6, 0.99),\n transition: tween(exitDuration, exitEase),\n }),\n });\n}\n\nexport function chip({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.IN_OUT_CUBIC,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n return Object.freeze({\n hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(0, 0.96),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function press({\n tapScale = TAP_SCALE_SUBTLE,\n spring = SPRING_PRESETS.MICRO,\n}: { tapScale?: number; spring?: Spring } = {}) {\n return Object.freeze({\n variants: Object.freeze({\n idle: Object.freeze({ transform: gpuTransform(0, 1) }),\n hover: Object.freeze({ transform: gpuTransform(0, 1) }),\n tap: Object.freeze({ transform: gpuTransform(0, tapScale) }),\n }),\n transition: Object.freeze({ type: \"spring\" as const, ...spring }),\n });\n}\n\nexport function dragDismiss({\n constraints = { top: 0, bottom: 0 },\n elastic = { top: 0.05, bottom: 0.5 },\n thresholds = { offsetY: 65, velocityY: 400 },\n interpolation = {\n range: [0, 180] as const,\n opacity: [1, 0.75] as const,\n scale: [1, 0.96] as const,\n },\n} = {}) {\n return Object.freeze({\n constraints: Object.freeze(constraints),\n elastic: Object.freeze(elastic),\n thresholds: Object.freeze(thresholds),\n interpolation: Object.freeze(interpolation),\n });\n}\n","import { type Variants } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES } from \"@/tokens\";\n\nfunction toGpuTransform(y = 0, scale = 1): string {\n return `translate3d(0, ${Math.round(y)}px, 0) scale(${Math.round(scale * 1000) / 1000})`;\n}\n\nexport const NOTIFICATION_COMPOSITOR_STYLE = Object.freeze({\n WebkitBackfaceVisibility: \"hidden\" as const,\n WebkitFontSmoothing: \"antialiased\" as const,\n backfaceVisibility: \"hidden\" as const,\n transform: \"translateZ(0)\",\n willChange: \"transform, opacity, filter\",\n});\n\nexport const NOTIFICATION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.MODERATE,\n ease: EASING_CURVES.OUT_EXPO,\n type: \"tween\" as const,\n});\n\nconst NOTIFICATION_EXIT_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.FAST,\n ease: EASING_CURVES.IN_CUBIC,\n type: \"tween\" as const,\n});\n\nexport const toastVariants: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform(-6, 0.98),\n transition: NOTIFICATION_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform(-10, 0.96),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(0, 1),\n transition: NOTIFICATION_TRANSITION,\n },\n});\n","\"use client\";\n\nimport { type KeyboardEvent, type MouseEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { type CSSProperties } from \"react\";\nimport { cn } from \"@/utils\";\nimport { DOCK_STACK_ELEMENT_ID } from \"./constants\";\nimport { type NotificationEntry } from \"./types\";\nimport {\n NOTIFICATION_COMPOSITOR_STYLE,\n NOTIFICATION_TRANSITION,\n toastVariants,\n} from \"./motion\";\nimport { useNotificationContainerModel, NotificationListener } from \"./hooks\";\n\nfunction Toast({\n className,\n entry,\n messageClassName,\n onDismiss,\n polite,\n style,\n}: {\n className: string;\n entry: NotificationEntry;\n messageClassName: string;\n onDismiss: () => void;\n polite?: boolean;\n style?: CSSProperties;\n}) {\n return (\n <motion.div\n role=\"alert\"\n aria-atomic=\"true\"\n aria-live={polite ? \"polite\" : undefined}\n aria-keyshortcuts=\"Escape\"\n tabIndex={0}\n variants={toastVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n transition={NOTIFICATION_TRANSITION}\n style={{ ...NOTIFICATION_COMPOSITOR_STYLE, ...style }}\n className={className}\n onClick={(event: MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n onDismiss();\n }}\n onKeyDown={(event: KeyboardEvent<HTMLElement>) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n onDismiss();\n }}\n >\n <div className={messageClassName}>{entry.message}</div>\n </motion.div>\n );\n}\n\nexport function NotificationContainer() {\n const { dismissNotification, isHydrated, activeEntry, theme } =\n useNotificationContainerModel();\n if (!isHydrated) return null;\n const dockElement = document.getElementById(DOCK_STACK_ELEMENT_ID);\n const toast = (className: string, polite?: boolean) => (\n <AnimatePresence mode=\"wait\">\n {activeEntry && (\n <Toast\n key={activeEntry.id}\n className={className}\n entry={activeEntry}\n messageClassName={theme.slots.toastMessage}\n polite={polite}\n style={theme.styles.toast}\n onDismiss={() => dismissNotification(activeEntry.id)}\n />\n )}\n </AnimatePresence>\n );\n if (dockElement) {\n return createPortal(\n toast(cn(theme.slots.toast, theme.slots.toastDocked), true),\n dockElement,\n );\n }\n return createPortal(\n <div\n aria-atomic=\"true\"\n aria-live=\"polite\"\n className={theme.slots.layer}\n style={theme.styles.layer}\n >\n {toast(theme.slots.toast)}\n </div>,\n document.body,\n );\n}\n\nexport function NotificationLayer() {\n return (\n <>\n <NotificationListener />\n <NotificationContainer />\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport { NotificationContext, NotificationProvider } from \"./context\";\nimport { useToast } from \"./hooks\";\nimport { NotificationLayer } from \"./overlay\";\nimport { type NotificationPageApi, type NotificationPageConfig } from \"./types\";\n\nfunction selectToastDuration(config: PageConfig): number | null {\n const notification = config.notification;\n if (typeof notification === \"number\") return notification;\n return notification?.duration ?? null;\n}\n\nfunction useNotificationPage(\n duration: number | null,\n page: PageModuleApi,\n): NotificationPageApi {\n const toast = useToast(duration);\n return useMemo(\n () => ({\n set: (notification: NotificationPageConfig) => page.set({ notification }),\n toast,\n }),\n [page, toast],\n );\n}\n\nexport const notificationModule = defineModule({\n id: \"notification\",\n context: NotificationContext,\n Provider: NotificationProvider,\n Overlay: NotificationLayer,\n page: {\n select: selectToastDuration,\n use: useNotificationPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n notification: typeof notificationModule;\n }\n interface PageConfig {\n notification?: NotificationPageConfig;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/utils/dom.ts","../../../src/utils/object.ts","../../../src/utils/report.ts","../../../src/utils/user-message.ts","../../../src/utils/store.ts","../../../src/kernel/context-registry.ts","../../../src/hooks/use-required-context.ts","../../../src/hooks/use-store.ts","../../../src/hooks/use-isomorphic-layout-effect.ts","../../../src/events.ts","../../../src/hooks/use-global-event.ts","../../../src/kernel/module.tsx","../../../src/theme.tsx","../../../src/modules/notification/constants.ts","../../../src/result.ts","../../../src/modules/notification/state.ts","../../../src/modules/notification/context.tsx","../../../src/modules/notification/hooks.ts","../../../src/tokens/motion.ts","../../../src/modules/notification/motion.ts","../../../src/modules/notification/overlay.tsx","../../../src/modules/notification/module.tsx"],"names":["useRef","useEffect","useState","useCallback","jsx","useMemo","useContext","useSyncExternalStore","jsxs","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","import { createContext, type Context } from \"react\";\n\nexport function getOrCreateGlobalContext<T>(\n name: string,\n defaultValue: T,\n): Context<T> {\n const sym = Symbol.for(`@omerdlw/base-framework/context/${name}`);\n const store = globalThis as unknown as Record<symbol, Context<T>>;\n if (!store[sym]) {\n store[sym] = createContext<T>(defaultValue);\n }\n return store[sym];\n}\n","\"use client\";\n\nimport { use, type Context } from \"react\";\n\nexport function useRequiredContext<T>(\n context: Context<T | null>,\n hookName: string,\n providerName: string,\n): T {\n const value = use(context);\n if (value === null) {\n throw new Error(`${hookName} must be used within ${providerName}`);\n }\n return value;\n}\n","\"use client\";\n\nimport { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport { type ExternalStore } from \"../utils\";\n\nexport function useStore<TState, TSlice = TState>(\n store: ExternalStore<TState>,\n selector: (state: TState) => TSlice = (state: TState) =>\n state as unknown as TSlice,\n isEqual: (a: TSlice, b: TSlice) => boolean = Object.is,\n): TSlice {\n const cacheRef = useRef<{\n isEqual: ((a: TSlice, b: TSlice) => boolean) | null;\n selected: TSlice | undefined;\n selector: ((state: TState) => TSlice) | null;\n snapshot: TState | null;\n }>({\n isEqual: null,\n selected: undefined,\n selector: null,\n snapshot: null,\n });\n\n const getSelectedSnapshot = useCallback(() => {\n const snapshot = store.getSnapshot();\n const cache = cacheRef.current;\n if (\n cache.snapshot === snapshot &&\n cache.selector === selector &&\n cache.isEqual === isEqual\n ) {\n return cache.selected as TSlice;\n }\n\n const selected = selector(snapshot);\n if (\n cache.snapshot !== null &&\n cache.isEqual === isEqual &&\n isEqual(cache.selected as TSlice, selected)\n ) {\n cache.snapshot = snapshot;\n cache.selector = selector;\n return cache.selected as TSlice;\n }\n\n cacheRef.current = {\n isEqual,\n selected,\n selector,\n snapshot,\n };\n return selected;\n }, [isEqual, selector, store]);\n\n return useSyncExternalStore(\n store.subscribe,\n getSelectedSnapshot,\n getSelectedSnapshot,\n );\n}\n","\"use client\";\n\nimport { useEffect, useLayoutEffect } from \"react\";\nimport { isBrowser } from \"../utils\";\n\nexport const useIsomorphicLayoutEffect = isBrowser\n ? useLayoutEffect\n : useEffect;\n","import { report } from \"./utils/report\";\nexport type EventListener<T = unknown> = (payload: T) => void;\n\nexport const EVENT_TYPES = Object.freeze({\n API_UNAUTHORIZED: \"API_UNAUTHORIZED\",\n STATE_CHANGE: \"STATE_CHANGE\",\n API_ERROR: \"API_ERROR\",\n APP_ERROR: \"APP_ERROR\",\n} as const);\n\nexport interface FrameworkEventMap {\n [EVENT_TYPES.API_UNAUTHORIZED]: {\n error?: unknown;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.API_ERROR]: {\n error: unknown;\n isCritical?: boolean;\n message?: string;\n retry?: () => void;\n status?: number;\n [key: string]: unknown;\n };\n [EVENT_TYPES.APP_ERROR]: {\n error?: unknown;\n message?: string;\n resetError?: () => void;\n source?: string;\n [key: string]: unknown;\n };\n [EVENT_TYPES.STATE_CHANGE]: {\n message?: string;\n status?: \"success\" | \"warning\" | \"info\" | \"error\" | string;\n [key: string]: unknown;\n };\n}\n\nexport class EventEmitter<TEvents extends object = FrameworkEventMap> {\n private events: Map<string, Set<EventListener<never>>> = new Map();\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> =\n new Map();\n\n subscribe<K extends keyof TEvents>(\n event: K,\n callback: EventListener<TEvents[K]>,\n ): () => void;\n subscribe<T = unknown>(event: string, callback: EventListener<T>): () => void;\n subscribe(event: string, callback: EventListener<never>): () => void {\n if (typeof event !== \"string\" || !event || typeof callback !== \"function\") {\n return () => {};\n }\n const listeners = this.events.get(event) || new Set<EventListener<never>>();\n listeners.add(callback);\n this.events.set(event, listeners);\n\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) this.events.delete(event);\n };\n }\n\n emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void | undefined\n ? [payload?: TEvents[K]]\n : [payload: TEvents[K]]\n ): void;\n emit<T = unknown>(event: string, payload?: T): void;\n emit(event: string, payload?: unknown): void {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) return;\n const snapshot = Array.from(listeners);\n for (const callback of snapshot) {\n try {\n (callback as EventListener<unknown>)(payload);\n } catch (error) {\n report(`Event listener (${String(event)})`, error);\n }\n }\n }\n\n emitDebounced<K extends keyof TEvents>(\n event: K,\n payload: TEvents[K],\n waitMs?: number,\n ): void;\n emitDebounced<T = unknown>(event: string, payload?: T, waitMs?: number): void;\n emitDebounced(event: string, payload?: unknown, waitMs: number = 100): void {\n const existing = this.debounceTimers.get(event);\n if (existing) clearTimeout(existing);\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(event);\n this.emit(event, payload);\n }, waitMs);\n\n this.debounceTimers.set(event, timer);\n }\n\n cancelDebounced(event?: string): void {\n if (event) {\n const timer = this.debounceTimers.get(event);\n if (timer) {\n clearTimeout(timer);\n this.debounceTimers.delete(event);\n }\n } else {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n }\n\n unsubscribeAll(event?: string): void {\n this.cancelDebounced(event);\n if (event) this.events.delete(event);\n else this.events.clear();\n }\n\n hasListeners(event: string): boolean {\n return Boolean(this.events.get(event)?.size);\n }\n\n getListenerCount(event: string): number {\n return this.events.get(event)?.size || 0;\n }\n\n getAllEvents(): string[] {\n return [...this.events.keys()];\n }\n}\n\nconst GLOBAL_EVENTS_KEY = Symbol.for(\"__base_framework_global_events__\");\ntype GlobalWithEvents = typeof globalThis & {\n [GLOBAL_EVENTS_KEY]?: EventEmitter<FrameworkEventMap>;\n};\n\nconst _global = globalThis as GlobalWithEvents;\nexport const globalEvents: EventEmitter<FrameworkEventMap> =\n _global[GLOBAL_EVENTS_KEY] ??\n (_global[GLOBAL_EVENTS_KEY] = new EventEmitter<FrameworkEventMap>());\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { globalEvents, type FrameworkEventMap } from \"@/events\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\nimport { UseGlobalEventOptions } from \"./types\";\n\nexport function useGlobalEvent<K extends keyof FrameworkEventMap>(\n event: K | K[] | null | undefined,\n callback: (payload: FrameworkEventMap[K]) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent<T = unknown>(\n event: string | string[] | null | undefined,\n callback: (payload: T) => void,\n options?: UseGlobalEventOptions,\n): void;\n\nexport function useGlobalEvent(\n event: string | string[] | null | undefined,\n callback: (payload: never) => void,\n options?: UseGlobalEventOptions,\n): void {\n const callbackRef = useRef(callback);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastThrottleTimeRef = useRef<number>(0);\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n\n const debounceMs = options?.debounceMs;\n const throttleMs = options?.throttleMs;\n\n useEffect(() => {\n if (!event) return;\n const events = Array.isArray(event) ? event.filter(Boolean) : [event];\n if (events.length === 0) return;\n\n const handler = (payload: never) => {\n if (debounceMs != null && debounceMs > 0) {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n callbackRef.current?.(payload);\n }, debounceMs);\n return;\n }\n\n if (throttleMs != null && throttleMs > 0) {\n const now = Date.now();\n const remaining = throttleMs - (now - lastThrottleTimeRef.current);\n if (remaining <= 0) {\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n lastThrottleTimeRef.current = now;\n callbackRef.current?.(payload);\n } else if (throttleTimerRef.current === null) {\n throttleTimerRef.current = setTimeout(() => {\n lastThrottleTimeRef.current = Date.now();\n throttleTimerRef.current = null;\n callbackRef.current?.(payload);\n }, remaining);\n }\n return;\n }\n\n callbackRef.current?.(payload);\n };\n\n const unsubs = events.map((ev) => globalEvents.subscribe(ev, handler));\n\n return () => {\n unsubs.forEach((unsub) => unsub());\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n if (throttleTimerRef.current !== null) {\n clearTimeout(throttleTimerRef.current);\n throttleTimerRef.current = null;\n }\n };\n }, [event, debounceMs, throttleMs]);\n}\n","\"use client\";\n\nimport { createElement, use, useState, type ReactNode } from \"react\";\nimport { useStore } from \"@/hooks\";\nimport { createStore, type ExternalStore } from \"@/utils\";\nimport {\n EMPTY_MODULES,\n ModuleHostContext,\n PassthroughBoundary,\n createModuleRegistryDefinitions,\n sortModules,\n type BoundaryComponent,\n type ModuleHostValue,\n} from \"./installed\";\nimport { PageControllerProvider } from \"./page-controller\";\nimport { RegistryProvider } from \"./provider\";\nimport type {\n AnyCoreModule,\n AppRegistryEntry,\n CoreModule,\n CoreModules,\n ModuleId,\n ModuleRuntimeOf,\n ModuleStateOf,\n} from \"./types\";\nimport { report } from \"@/utils\";\n\nexport function defineModule<\n TId extends string,\n TRuntime = never,\n TSlice = never,\n TController = never,\n>(\n coreModule: CoreModule<TId, TRuntime, TSlice, TController>,\n): CoreModule<TId, TRuntime, TSlice, TController> {\n return Object.freeze({ ...coreModule });\n}\n\nfunction warnMissingPeers(modules: readonly AnyCoreModule[]): void {\n const installed = new Set(modules.map((coreModule) => coreModule.id));\n for (const { id, uses } of modules) {\n const missing = (uses ?? []).filter((peer) => !installed.has(peer));\n if (missing.length > 0) {\n report(\n `Module \"${id}\" runs without its optional peers`,\n missing.join(\", \"),\n \"warn\",\n );\n }\n }\n}\n\nfunction createModuleHost(\n modules: readonly AnyCoreModule[],\n Boundary: BoundaryComponent,\n): ModuleHostValue {\n const sorted = sortModules(modules);\n if (process.env.NODE_ENV !== \"production\") warnMissingPeers(sorted);\n return {\n Boundary,\n byId: new Map(sorted.map((coreModule) => [coreModule.id, coreModule])),\n definitions: createModuleRegistryDefinitions(sorted),\n modules: Object.freeze(sorted),\n };\n}\n\nexport interface ModuleHostProps {\n boundary?: BoundaryComponent;\n children?: ReactNode;\n modules?: readonly AnyCoreModule[];\n registryEntries?: readonly AppRegistryEntry[];\n}\n\nexport function ModuleHost({\n boundary = PassthroughBoundary,\n children,\n modules = EMPTY_MODULES,\n registryEntries,\n}: ModuleHostProps) {\n const [host] = useState(() => createModuleHost(modules, boundary));\n const { Boundary } = host;\n\n const content = (\n <>\n {host.modules.map(({ Backdrop, id }) =>\n Backdrop ? (\n <Boundary key={id} name={id}>\n <Backdrop />\n </Boundary>\n ) : null,\n )}\n {children}\n {host.modules.map(({ Overlay, id }) =>\n Overlay ? (\n <Boundary key={id} name={id}>\n <Overlay />\n </Boundary>\n ) : null,\n )}\n </>\n );\n\n const tree = host.modules.reduceRight<ReactNode>(\n (inner, { Provider }) => (Provider ? <Provider>{inner}</Provider> : inner),\n content,\n );\n\n return (\n <RegistryProvider\n definitions={host.definitions}\n initialEntries={registryEntries}\n >\n <ModuleHostContext value={host}>\n <PageControllerProvider>{tree}</PageControllerProvider>\n </ModuleHostContext>\n </RegistryProvider>\n );\n}\n\nexport function useModule<K extends ModuleId>(\n id: K,\n): ModuleRuntimeOf<CoreModules[K]> | null {\n const coreModule = use(ModuleHostContext)?.byId.get(id);\n return coreModule?.context ? (use(coreModule.context) ?? null) : null;\n}\n\ntype ModuleActionsOf<K extends ModuleId> =\n ModuleRuntimeOf<CoreModules[K]> extends { actions: infer TActions }\n ? TActions\n : never;\n\nexport interface ModulePeer<K extends ModuleId> {\n useActions(): ModuleActionsOf<K>;\n useRuntime(): ModuleRuntimeOf<CoreModules[K]>;\n useState<T>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ): T;\n}\n\nexport function definePeer<K extends ModuleId>(\n id: K,\n inert: ModuleRuntimeOf<CoreModules[K]>,\n): ModulePeer<K> {\n const useRuntime = (): ModuleRuntimeOf<CoreModules[K]> =>\n useModule(id) ?? inert;\n return {\n useRuntime,\n useActions: () => useRuntime().actions as ModuleActionsOf<K>,\n useState: <T,>(\n selector: (state: ModuleStateOf<K>) => T,\n isEqual?: (a: T, b: T) => boolean,\n ) =>\n useStore<ModuleStateOf<K>, T>(\n (useRuntime() as { store: ExternalStore<ModuleStateOf<K>> }).store,\n selector,\n isEqual,\n ),\n };\n}\n\nconst NO_MODULE_STORE: ExternalStore<unknown> = createStore<unknown>(undefined);\n\nexport function useModuleState<K extends ModuleId, T>(\n id: K,\n selector: (state: ModuleStateOf<K>) => T,\n fallback: T,\n isEqual: (a: T, b: T) => boolean = Object.is,\n): T {\n const runtime = useModule(id) as { store: ExternalStore<unknown> } | null;\n return useStore<unknown, T>(\n runtime?.store ?? NO_MODULE_STORE,\n (state) => (runtime ? selector(state as ModuleStateOf<K>) : fallback),\n isEqual,\n );\n}\n\nexport function ModuleBoundary({\n children,\n name,\n}: {\n children?: ReactNode;\n name?: string;\n}) {\n const Boundary = use(ModuleHostContext)?.Boundary ?? PassthroughBoundary;\n return createElement(Boundary, { name }, children);\n}\n\nexport function useIsModuleInstalled(id: ModuleId): boolean {\n return use(ModuleHostContext)?.byId.has(id) ?? false;\n}\n","\"use client\";\n\nimport {\n createElement,\n useContext,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\n\nexport interface ThemeSpec<S extends string = string> {\n readonly id: string;\n readonly _slots?: S;\n}\n\nexport interface ThemeConfig<S extends string> {\n slots: Readonly<Record<S, string>>;\n styles?: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ResolvedTheme<S extends string> {\n readonly slots: Readonly<Record<S, string>>;\n readonly styles: Readonly<Partial<Record<S, CSSProperties>>>;\n}\n\nexport interface ThemeEntry {\n readonly id: string;\n readonly config: ThemeConfig<string>;\n}\n\nexport function defineThemeSpec<S extends string>(id: string): ThemeSpec<S> {\n return Object.freeze({ id });\n}\n\nexport function defineTheme<S extends string>(\n spec: ThemeSpec<S>,\n config: ThemeConfig<NoInfer<S>>,\n): ThemeEntry {\n return { id: spec.id, config: config as ThemeEntry[\"config\"] };\n}\n\nconst EMPTY: ReadonlyMap<string, ThemeEntry[\"config\"]> = new Map();\nconst ThemeContext = getOrCreateGlobalContext<\n ReadonlyMap<string, ThemeEntry[\"config\"]>\n>(\"ThemeContext\", EMPTY);\n\n\nexport function ThemeProvider({\n children,\n themes,\n}: {\n children?: ReactNode;\n themes: readonly ThemeEntry[];\n}) {\n const configs = new Map(themes.map((entry) => [entry.id, entry.config]));\n return createElement(ThemeContext.Provider, { value: configs }, children);\n}\n\nexport function useTheme<S extends string>(\n spec: ThemeSpec<S>,\n): ResolvedTheme<S> {\n const config = useContext(ThemeContext).get(spec.id);\n if (!config) {\n throw new Error(\n `Theme \"${spec.id}\" is missing. Ensure its theme configuration is provided to <ThemeProvider themes={[...]}> (e.g. in src/config/ or your theme setup).`,\n );\n }\n return {\n slots: config.slots,\n styles: config.styles ?? {},\n } as ResolvedTheme<S>;\n}\n\nexport { useTheme as useModuleTheme };\n\n","import { USER_MESSAGES } from \"@/utils\";\nimport { defineThemeSpec } from \"@/theme\";\nimport {\n type NotificationActions,\n type NotificationState,\n type NotificationThemeSlot,\n} from \"./types\";\n\nexport const TOAST_DURATIONS = Object.freeze({\n DEFAULT: 2000,\n SHORT: 1500,\n} as const);\n\nexport const SESSION_EXPIRED_MESSAGE = USER_MESSAGES.unauthorized;\n\nexport const DOCK_STACK_ELEMENT_ID = \"dock-card-stack\";\n\nexport const notificationTheme =\n defineThemeSpec<NotificationThemeSlot>(\"notification\");\n\nexport const INITIAL_NOTIFICATION_STATE: NotificationState = Object.freeze({\n notifications: {},\n});\n\nexport const INERT_NOTIFICATION_ACTIONS: NotificationActions = Object.freeze({\n dismissAllNotifications: () => {},\n dismissNotification: () => {},\n showNotification: () => null,\n});\n\n","import { UserError, toUserMessage } from \"./utils/user-message\";\nimport { report } from \"./utils/report\";\n\nexport interface SuccessResult<T> {\n readonly code?: string;\n readonly data: T;\n readonly error?: never;\n readonly success: true;\n}\n\nexport interface ErrorResult<E = string> {\n readonly code?: string;\n readonly data?: never;\n readonly error: E;\n readonly success: false;\n}\n\nexport type Result<T, E = string> = SuccessResult<T> | ErrorResult<E>;\n\nexport function ok<T>(data: T, code?: string): SuccessResult<T> {\n return { data, success: true, ...(code ? { code } : {}) };\n}\n\nexport function err<E = string>(error: E, code?: string): ErrorResult<E> {\n return { error, success: false, ...(code ? { code } : {}) };\n}\n\nexport function isResult(value: unknown): value is Result<unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"success\" in value &&\n typeof (value as { success: unknown }).success === \"boolean\" &&\n ((\"data\" in value && (value as { success: boolean }).success === true) ||\n (\"error\" in value && (value as { success: boolean }).success === false))\n );\n}\n\nexport function isOk<T, E = string>(\n result: Result<T, E>,\n): result is SuccessResult<T> {\n return result.success === true;\n}\n\nexport function isErr<T, E = string>(\n result: Result<T, E>,\n): result is ErrorResult<E> {\n return result.success === false;\n}\n\nexport function unwrap<T, E = string>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n if (result.error instanceof Error) {\n throw result.error;\n }\n throw new Error(\n typeof result.error === \"string\" ? result.error : String(result.error),\n );\n}\n\nexport function unwrapOr<T, E = string>(result: Result<T, E>, fallback: T): T {\n return result.success ? result.data : fallback;\n}\n\nexport function map<T, U, E = string>(\n result: Result<T, E>,\n fn: (data: T) => U,\n): Result<U, E> {\n return result.success ? ok(fn(result.data), result.code) : result;\n}\n\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F,\n): Result<T, F> {\n return result.success ? result : err(fn(result.error), result.code);\n}\n\nexport function match<T, E, R>(\n result: Result<T, E>,\n branches: { ok: (data: T) => R; err: (error: E) => R },\n): R {\n return result.success ? branches.ok(result.data) : branches.err(result.error);\n}\n\nfunction mapCaught<E>(error: unknown, mapError?: (error: unknown) => E): E {\n if (!(error instanceof UserError)) report(\"Result\", error);\n return mapError ? mapError(error) : (toUserMessage(error) as unknown as E);\n}\n\nexport async function tryCatch<T, E = string>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n mapError?: (error: unknown) => E,\n): Promise<Result<T, E>> {\n try {\n const data =\n typeof promiseOrFn === \"function\"\n ? await promiseOrFn()\n : await promiseOrFn;\n return ok(data);\n } catch (error) {\n return err(mapCaught(error, mapError));\n }\n}\n\ninterface SafeActionSchema<TParsed> {\n safeParse: (input: unknown) =>\n | { data: TParsed; success: true }\n | {\n error?: {\n issues?: Array<{ message?: string }>;\n message?: string;\n };\n success: false;\n };\n}\n\nexport interface SafeActionOptions<TArgs extends unknown[], E = string> {\n errorCode?: string;\n mapError?: (error: unknown) => E;\n schema?: SafeActionSchema<TArgs[0]>;\n validate?: (\n ...args: TArgs\n ) => Result<unknown, E> | string | boolean | null | undefined;\n}\n\nexport function createSafeAction<TArgs extends unknown[], TOutput, E = string>(\n handler: (\n ...args: TArgs\n ) => Promise<Result<TOutput, E> | TOutput> | Result<TOutput, E> | TOutput,\n options: SafeActionOptions<TArgs, E> = {},\n): (...args: TArgs) => Promise<Result<TOutput, E>> {\n const { errorCode, mapError, schema, validate } = options;\n\n return async (...args: TArgs): Promise<Result<TOutput, E>> => {\n try {\n let effectiveArgs = args;\n\n if (schema) {\n const parsed = schema.safeParse(args[0]);\n if (!parsed.success) {\n const issueMessage =\n parsed.error?.issues?.[0]?.message ||\n parsed.error?.message ||\n \"Invalid input\";\n return err(\n mapError ? mapError(issueMessage) : (issueMessage as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n }\n effectiveArgs = [parsed.data, ...args.slice(1)] as TArgs;\n }\n\n if (validate) {\n const validationResult = validate(...effectiveArgs);\n if (isResult(validationResult)) {\n if (isErr(validationResult)) {\n return validationResult as ErrorResult<E>;\n }\n } else if (validationResult === false) {\n return err(\n mapError\n ? mapError(\"Validation failed\")\n : (\"Validation failed\" as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n } else if (\n typeof validationResult === \"string\" &&\n validationResult.length > 0\n ) {\n return err(\n mapError\n ? mapError(validationResult)\n : (validationResult as unknown as E),\n errorCode ?? \"VALIDATION_ERROR\",\n );\n }\n }\n\n const output = await handler(...effectiveArgs);\n if (isResult(output)) {\n return output as Result<TOutput, E>;\n }\n return ok(output as TOutput);\n } catch (error) {\n return err(mapCaught(error, mapError), errorCode);\n }\n };\n}\n","import { type ReactNode } from \"react\";\nimport { isObject, toUserMessage } from \"@/utils\";\nimport { isResult } from \"@/result\";\nimport { TOAST_DURATIONS } from \"./constants\";\nimport {\n type NotificationData,\n type NotificationEntry,\n type NotificationOptions,\n type ToastOptionsInput,\n type ToastPromiseMessages,\n} from \"./types\";\n\nexport function normalizeFeedbackText<T = unknown>(value: T): T {\n if (typeof value !== \"string\") return value;\n return value.trim().replace(/[.\\s]+$/, \"\") as T;\n}\n\nexport function getActiveNotification(\n notifications: Record<string, NotificationEntry>,\n): NotificationEntry | null {\n let active: NotificationEntry | null = null;\n for (const entry of Object.values(notifications)) {\n if (!active || entry.timestamp >= active.timestamp) active = entry;\n }\n return active;\n}\n\nexport function normalizeToastOptions(\n options?: ToastOptionsInput,\n): NotificationOptions {\n return typeof options === \"number\" ? { duration: options } : options || {};\n}\n\nexport function normalizeDuration(value: unknown): number | null {\n if (value === null) return null;\n if (value === undefined) return TOAST_DURATIONS.DEFAULT;\n const duration = Number(value);\n return Number.isFinite(duration) && duration > 0 ? duration : null;\n}\n\nexport function withDefaultDuration(\n duration: number,\n options?: ToastOptionsInput,\n): NotificationOptions & { duration: number | null } {\n const normalized = normalizeToastOptions(options);\n return {\n ...normalized,\n duration:\n normalized.duration !== undefined ? normalized.duration : duration,\n };\n}\n\nexport function isNotificationDataObject(\n value: unknown,\n): value is NotificationData {\n return isObject(value) && \"message\" in value;\n}\n\nexport function resolveMessage<A>(\n message: ReactNode | ((arg: A) => ReactNode),\n arg: A,\n): ReactNode {\n return typeof message === \"function\" ? message(arg) : message;\n}\n\nexport function getOutcomeMessage<T, E>(\n value: unknown,\n messages: ToastPromiseMessages<T, E>,\n): ReactNode {\n if (!isResult(value)) return resolveMessage(messages.success, value as T);\n return value.success\n ? resolveMessage(messages.success, value.data as T)\n : resolveMessage(messages.error, value.error as E) ||\n toUserMessage(value.error);\n}\n\nexport function createNotificationEntry(\n messageOrData: ReactNode | NotificationData,\n options?: ToastOptionsInput,\n fallbackId?: string,\n): { entry: NotificationEntry; duration: number | null } | null {\n const normalizedOptions = normalizeToastOptions(options);\n const payload: NotificationData = isNotificationDataObject(messageOrData)\n ? { ...normalizedOptions, ...messageOrData }\n : { ...normalizedOptions, message: messageOrData };\n\n const normalizedMessage = normalizeFeedbackText(payload.message);\n if (\n normalizedMessage === null ||\n normalizedMessage === undefined ||\n normalizedMessage === \"\"\n ) {\n return null;\n }\n\n const id =\n payload.dedupeKey ||\n payload.id ||\n (typeof normalizedMessage === \"string\"\n ? normalizedMessage.slice(0, 64)\n : fallbackId || `notification-${Date.now()}`);\n\n const entry: NotificationEntry = {\n dedupeKey: payload.dedupeKey,\n duration: payload.duration,\n id,\n message: normalizedMessage,\n timestamp: Date.now(),\n };\n\n return {\n duration: normalizeDuration(payload.duration),\n entry,\n };\n}\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport {\n INITIAL_NOTIFICATION_STATE,\n} from \"./constants\";\nimport { createNotificationEntry } from \"./state\";\nimport {\n type NotificationActions,\n type NotificationContextValue,\n type NotificationData,\n type NotificationProviderProps,\n type NotificationState,\n type ToastOptionsInput,\n} from \"./types\";\n\nexport const NotificationContext =\n getOrCreateGlobalContext<NotificationContextValue | null>(\n \"NotificationContext\",\n null,\n );\n\nexport const NOOP_NOTIFICATION_STORE = createStore<NotificationState>(\n INITIAL_NOTIFICATION_STATE,\n);\n\nlet notificationIdCounter = 0;\n\nexport const NotificationProvider = ({\n children,\n}: NotificationProviderProps) => {\n const [store] = useState(() =>\n createStore<NotificationState>(INITIAL_NOTIFICATION_STATE, {\n freezeSnapshots: false,\n }),\n );\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const clearTimers = useCallback(() => {\n timersRef.current.forEach(clearTimeout);\n timersRef.current.clear();\n }, []);\n\n useEffect(() => clearTimers, [clearTimers]);\n\n const dismissNotification = useCallback(\n (id: string) => {\n clearTimeout(timersRef.current.get(id));\n timersRef.current.delete(id);\n\n store.publish((prev) => {\n if (!Object.hasOwn(prev.notifications, id)) return prev;\n const notifications = { ...prev.notifications };\n delete notifications[id];\n return { notifications };\n });\n },\n [store],\n );\n\n const dismissAllNotifications = useCallback(() => {\n clearTimers();\n store.publish((prev) =>\n Object.keys(prev.notifications).length === 0\n ? prev\n : { notifications: {} },\n );\n }, [clearTimers, store]);\n\n const showNotification = useCallback(\n (\n messageOrData: ReactNode | NotificationData,\n options?: ToastOptionsInput,\n ): string | null => {\n const fallbackId = `notification-${++notificationIdCounter}`;\n const result = createNotificationEntry(\n messageOrData,\n options,\n fallbackId,\n );\n if (!result) return null;\n\n const { entry, duration } = result;\n const { id } = entry;\n\n clearTimers();\n store.publish({ notifications: { [id]: entry } });\n\n if (duration) {\n timersRef.current.set(\n id,\n setTimeout(() => dismissNotification(id), duration),\n );\n }\n\n return id;\n },\n [clearTimers, dismissNotification, store],\n );\n\n const actions = useMemo<NotificationActions>(\n () => ({\n dismissAllNotifications,\n dismissNotification,\n showNotification,\n }),\n [dismissAllNotifications, dismissNotification, showNotification],\n );\n\n const value = useMemo<NotificationContextValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n return <NotificationContext value={value}>{children}</NotificationContext>;\n};\n","\"use client\";\n\nimport {\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { EVENT_TYPES } from \"@/events\";\nimport { useGlobalEvent, useRequiredContext, useStore } from \"@/hooks\";\nimport { useModuleTheme } from \"@/theme\";\nimport { toUserMessage } from \"@/utils\";\nimport {\n INERT_NOTIFICATION_ACTIONS,\n SESSION_EXPIRED_MESSAGE,\n TOAST_DURATIONS,\n notificationTheme,\n} from \"./constants\";\nimport {\n NotificationContext,\n NOOP_NOTIFICATION_STORE,\n} from \"./context\";\nimport {\n getActiveNotification,\n getOutcomeMessage,\n normalizeToastOptions,\n resolveMessage,\n withDefaultDuration,\n} from \"./state\";\nimport {\n type NotificationActions,\n type NotificationState,\n type ToastController,\n type ToastOptionsInput,\n type ToastPromiseMessages,\n} from \"./types\";\n\nlet toastPromiseIdCounter = 0;\n\nexport function useNotificationActions(): NotificationActions {\n return useRequiredContext(\n NotificationContext,\n \"useNotificationActions\",\n \"NotificationProvider\",\n ).actions;\n}\n\nexport function useNotificationState(): NotificationState {\n const { store } = useRequiredContext(\n NotificationContext,\n \"useNotificationState\",\n \"NotificationProvider\",\n );\n return useStore(store);\n}\n\nexport function useNotification(): NotificationState & NotificationActions {\n const actions = useNotificationActions();\n const state = useNotificationState();\n return useMemo(() => ({ ...actions, ...state }), [actions, state]);\n}\n\nexport function useOptionalNotificationState(): NotificationState;\nexport function useOptionalNotificationState<T>(\n selector: (state: NotificationState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalNotificationState<T = NotificationState>(\n selector?: (state: NotificationState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(NotificationContext);\n return useStore(\n ctx?.store ?? NOOP_NOTIFICATION_STORE,\n selector as (state: NotificationState) => T,\n isEqual,\n );\n}\n\nexport function useOptionalNotificationActions(): NotificationActions {\n const ctx = useContext(NotificationContext);\n return ctx?.actions ?? INERT_NOTIFICATION_ACTIONS;\n}\n\nexport function useNotificationVisible(): boolean {\n return useOptionalNotificationState(\n ({ notifications }) => Object.keys(notifications).length > 0,\n );\n}\n\nexport function useToast(defaultDuration?: number | null): ToastController {\n const { dismissAllNotifications, dismissNotification, showNotification } =\n useNotificationActions();\n\n const resolvedDefaultDuration = defaultDuration ?? TOAST_DURATIONS.DEFAULT;\n\n const triggerToast = useCallback(\n (message: ReactNode, options?: ToastOptionsInput): string | null =>\n showNotification(\n message,\n withDefaultDuration(resolvedDefaultDuration, options),\n ),\n [resolvedDefaultDuration, showNotification],\n );\n\n const dismiss = useCallback(\n (id?: string) => {\n if (id) dismissNotification(id);\n else dismissAllNotifications();\n },\n [dismissAllNotifications, dismissNotification],\n );\n\n const fromResult = useCallback(\n <T = unknown, E = unknown, R = unknown>(\n result: R,\n messages: ToastPromiseMessages<T, E> = {},\n options?: ToastOptionsInput,\n ) => {\n const message = getOutcomeMessage(result, messages);\n if (message) triggerToast(message, options);\n return result;\n },\n [triggerToast],\n );\n\n const promise = useCallback(\n async <T = unknown, E = unknown>(\n promiseOrFn: Promise<T> | (() => Promise<T>),\n messages: ToastPromiseMessages<T, E> = {},\n options?: ToastOptionsInput,\n ): Promise<T> => {\n const normalized = normalizeToastOptions(options);\n const id =\n normalized.id ||\n normalized.dedupeKey ||\n `toast-promise-${++toastPromiseIdCounter}`;\n const sharedOptions = { ...normalized, id };\n\n if (messages.loading) {\n showNotification(messages.loading, {\n ...sharedOptions,\n duration: null,\n });\n }\n\n try {\n const resolved = await (typeof promiseOrFn === \"function\"\n ? promiseOrFn()\n : promiseOrFn);\n const message = getOutcomeMessage(resolved, messages);\n if (message) triggerToast(message, sharedOptions);\n else if (messages.loading) dismiss(id);\n return resolved;\n } catch (error) {\n triggerToast(\n resolveMessage(messages.error, error as E) || toUserMessage(error),\n sharedOptions,\n );\n throw error;\n }\n },\n [dismiss, showNotification, triggerToast],\n );\n\n return useMemo<ToastController>(\n () =>\n Object.assign(\n (message: ReactNode, options?: ToastOptionsInput) =>\n triggerToast(message, options),\n { dismiss, dismissAll: dismissAllNotifications, fromResult, promise },\n ),\n [dismiss, dismissAllNotifications, fromResult, promise, triggerToast],\n );\n}\n\nconst emptySubscribe = () => () => {};\n\nexport function NotificationListener(): null {\n const { showNotification } = useNotificationActions();\n\n useGlobalEvent(EVENT_TYPES.API_UNAUTHORIZED, (data?: { source?: string }) => {\n if (data?.source && data.source !== \"app\") return;\n showNotification(SESSION_EXPIRED_MESSAGE);\n });\n\n useGlobalEvent(\n EVENT_TYPES.APP_ERROR,\n (data?: { message?: string; notify?: boolean }) => {\n if (!data?.notify || !data.message) return;\n showNotification(data.message);\n },\n );\n\n useGlobalEvent(\n EVENT_TYPES.STATE_CHANGE,\n (data?: { message?: string; notify?: boolean }) => {\n if (!data?.notify || !data.message) return;\n showNotification(data.message);\n },\n );\n\n return null;\n}\n\nexport function useNotificationContainerModel() {\n const { notifications } = useNotificationState();\n const { dismissNotification } = useNotificationActions();\n const isHydrated = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n const activeEntry = useMemo(\n () => getActiveNotification(notifications),\n [notifications],\n );\n\n const theme = useModuleTheme(notificationTheme);\n\n return { dismissNotification, isHydrated, activeEntry, theme };\n}\n","export const DURATION_TOKENS = Object.freeze({\n INSTANT: 0.08,\n MICRO: 0.18,\n FAST: 0.28,\n BASE: 0.36,\n MODERATE: 0.44,\n SLOW: 0.58,\n CINEMATIC: 0.86,\n} as const);\n\nexport const EASING_CURVES = Object.freeze({\n OUT_EXPO: [0.16, 1, 0.3, 1] as const,\n OUT_QUART: [0.25, 1, 0.5, 1] as const,\n OUT_QUINT: [0.22, 1, 0.36, 1] as const,\n IN_OUT_CUBIC: [0.65, 0, 0.35, 1] as const,\n IN_CUBIC: [0.5, 0, 1, 1] as const,\n OUT_BACK: [0.34, 1.56, 0.64, 1] as const,\n} as const);\n\nexport const MOTION_EASINGS = Object.freeze({\n ENTER: EASING_CURVES.OUT_QUART,\n ENTER_EMPHASIZED: EASING_CURVES.OUT_EXPO,\n EXIT: EASING_CURVES.IN_CUBIC,\n} as const);\n\nexport const MOTION_TIERS = Object.freeze({\n MICRO: Object.freeze({\n distance: 4,\n duration: DURATION_TOKENS.MICRO,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.008,\n }),\n FAST: Object.freeze({\n distance: 9,\n duration: DURATION_TOKENS.FAST,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.012,\n }),\n STANDARD: Object.freeze({\n distance: 18,\n duration: DURATION_TOKENS.MODERATE,\n ease: MOTION_EASINGS.ENTER,\n scaleDelta: 0.018,\n }),\n SURFACE: Object.freeze({\n distance: 28,\n duration: DURATION_TOKENS.SLOW,\n ease: MOTION_EASINGS.ENTER_EMPHASIZED,\n scaleDelta: 0.024,\n }),\n} as const);\n\nexport const SPRING_PRESETS = Object.freeze({\n MICRO: Object.freeze({\n damping: 32,\n mass: 0.6,\n stiffness: 520,\n type: \"spring\",\n } as const),\n SNAPPY: Object.freeze({\n damping: 28,\n mass: 0.8,\n stiffness: 380,\n type: \"spring\",\n } as const),\n GENTLE: Object.freeze({\n damping: 30,\n mass: 1,\n stiffness: 260,\n type: \"spring\",\n } as const),\n BOUNCY: Object.freeze({\n damping: 20,\n mass: 0.85,\n stiffness: 340,\n type: \"spring\",\n } as const),\n} as const);\n\nexport const REDUCED_MOTION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.INSTANT,\n ease: \"linear\",\n} as const);\n\nexport const COMPOSITOR_GPU_STYLE = Object.freeze({\n backfaceVisibility: \"hidden\",\n transform: \"translate3d(0, 0, 0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nexport const TAP_SCALE_SUBTLE = 0.97;\n\ntype Ease = readonly [number, number, number, number];\n\ntype TweenOptions = {\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n};\n\ntype Spring = {\n type?: \"spring\";\n stiffness: number;\n damping: number;\n mass: number;\n};\n\nfunction tween(duration: number, ease: Ease) {\n return Object.freeze({ type: \"tween\" as const, duration, ease });\n}\n\nfunction safeNumber(value: unknown, fallback: number): number {\n const source =\n value &&\n typeof value === \"object\" &&\n \"get\" in value &&\n typeof value.get === \"function\"\n ? value.get()\n : value;\n const number = Number.parseFloat(String(source));\n return Number.isFinite(number) ? number : fallback;\n}\n\nexport function gpuTransform(\n y: unknown = 0,\n scale: unknown = 1,\n x: unknown = 0,\n): string {\n const translateY = Math.round(safeNumber(y, 0));\n const translateX = Math.round(safeNumber(x, 0));\n const scaleValue = Math.round(safeNumber(scale, 1) * 1000) / 1000;\n return `translate3d(${translateX}px, ${translateY}px, 0) scale(${scaleValue})`;\n}\n\nexport function durationForDistance(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n } = {},\n): number {\n const distance = Math.abs(Number(distancePx) || 0);\n const safeMin = Math.max(0, min);\n const safeMax = Math.max(safeMin, max);\n const safeReference = Math.max(1, reference);\n const duration = base + Math.sqrt(distance / safeReference) * gain;\n return Math.min(safeMax, Math.max(safeMin, duration));\n}\n\nexport function surfaceResizeTransition(\n distancePx: number,\n {\n base = DURATION_TOKENS.FAST,\n min = DURATION_TOKENS.MICRO,\n max = DURATION_TOKENS.SLOW,\n reference = 320,\n gain = 0.22,\n ease = EASING_CURVES.IN_OUT_CUBIC,\n }: {\n base?: number;\n min?: number;\n max?: number;\n reference?: number;\n gain?: number;\n ease?: Ease;\n } = {},\n) {\n return tween(\n durationForDistance(distancePx, { base, min, max, reference, gain }),\n ease,\n );\n}\n\nexport function contentSwapTransitions({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n return Object.freeze({\n enter: tween(duration, enterEase),\n exit: tween(exitDuration, exitEase),\n });\n}\n\nexport function contentSwap({\n travel = 6,\n exitTravel = travel * 0.7,\n enterScale = 0.99,\n exitScale = 0.99,\n ...transitionOptions\n}: TweenOptions & {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n} = {}) {\n const transitions = contentSwapTransitions(transitionOptions);\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function overlaySurface({\n travel = 16,\n exitTravel = travel * 0.5,\n enterScale = 0.97,\n exitScale = 0.985,\n distance,\n duration,\n exitDuration,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n travel?: number;\n exitTravel?: number;\n enterScale?: number;\n exitScale?: number;\n distance?: number;\n duration?: number;\n exitDuration?: number;\n enterEase?: Ease;\n exitEase?: Ease;\n} = {}) {\n const enterDuration =\n duration ??\n (distance === undefined\n ? DURATION_TOKENS.BASE\n : durationForDistance(distance));\n const transitions = contentSwapTransitions({\n duration: enterDuration,\n exitDuration: exitDuration ?? enterDuration * 0.68,\n enterEase,\n exitEase,\n });\n\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, enterScale),\n }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(exitTravel, exitScale),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function staggerDelay(\n index: number,\n { base = 0.028, cap = 0.16, exponent = 0.82 } = {},\n): number {\n const safeIndex = Math.max(0, Number(index) || 0);\n return Math.min(cap, base * Math.pow(safeIndex, exponent));\n}\n\nexport function staggerItem({\n base = 0.028,\n cap = 0.16,\n duration = DURATION_TOKENS.BASE,\n travel = 10,\n enterEase = EASING_CURVES.OUT_EXPO,\n exitDuration = DURATION_TOKENS.MICRO,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: {\n base?: number;\n cap?: number;\n duration?: number;\n travel?: number;\n enterEase?: Ease;\n exitDuration?: number;\n exitEase?: Ease;\n} = {}) {\n return Object.freeze({\n hidden: Object.freeze({\n opacity: 0,\n transform: gpuTransform(travel, 0.985),\n }),\n visible: (index: number = 0) => ({\n opacity: 1,\n transform: gpuTransform(0),\n transition: Object.freeze({\n ...tween(duration, enterEase),\n delay: staggerDelay(index, { base, cap }),\n }),\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(-travel * 0.6, 0.99),\n transition: tween(exitDuration, exitEase),\n }),\n });\n}\n\nexport function chip({\n duration = DURATION_TOKENS.FAST,\n exitDuration = DURATION_TOKENS.MICRO,\n enterEase = EASING_CURVES.IN_OUT_CUBIC,\n exitEase = EASING_CURVES.IN_CUBIC,\n}: TweenOptions = {}) {\n const transitions = contentSwapTransitions({\n duration,\n exitDuration,\n enterEase,\n exitEase,\n });\n return Object.freeze({\n hidden: Object.freeze({ opacity: 0, transform: gpuTransform(0, 0.96) }),\n visible: Object.freeze({\n opacity: 1,\n transform: gpuTransform(0),\n transition: transitions.enter,\n }),\n exit: Object.freeze({\n opacity: 0,\n transform: gpuTransform(0, 0.96),\n transition: transitions.exit,\n }),\n });\n}\n\nexport function press({\n tapScale = TAP_SCALE_SUBTLE,\n spring = SPRING_PRESETS.MICRO,\n}: { tapScale?: number; spring?: Spring } = {}) {\n return Object.freeze({\n variants: Object.freeze({\n idle: Object.freeze({ transform: gpuTransform(0, 1) }),\n hover: Object.freeze({ transform: gpuTransform(0, 1) }),\n tap: Object.freeze({ transform: gpuTransform(0, tapScale) }),\n }),\n transition: Object.freeze({ type: \"spring\" as const, ...spring }),\n });\n}\n\nexport function dragDismiss({\n constraints = { top: 0, bottom: 0 },\n elastic = { top: 0.05, bottom: 0.5 },\n thresholds = { offsetY: 65, velocityY: 400 },\n interpolation = {\n range: [0, 180] as const,\n opacity: [1, 0.75] as const,\n scale: [1, 0.96] as const,\n },\n} = {}) {\n return Object.freeze({\n constraints: Object.freeze(constraints),\n elastic: Object.freeze(elastic),\n thresholds: Object.freeze(thresholds),\n interpolation: Object.freeze(interpolation),\n });\n}\n","import { type Variants } from \"motion/react\";\nimport { DURATION_TOKENS, EASING_CURVES } from \"@/tokens\";\n\nfunction toGpuTransform(y = 0, scale = 1): string {\n return `translate3d(0, ${Math.round(y)}px, 0) scale(${Math.round(scale * 1000) / 1000})`;\n}\n\nexport const NOTIFICATION_COMPOSITOR_STYLE = Object.freeze({\n WebkitBackfaceVisibility: \"hidden\" as const,\n WebkitFontSmoothing: \"antialiased\" as const,\n backfaceVisibility: \"hidden\" as const,\n transform: \"translateZ(0)\",\n willChange: \"transform, opacity, filter\",\n});\n\nexport const NOTIFICATION_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.MODERATE,\n ease: EASING_CURVES.OUT_EXPO,\n type: \"tween\" as const,\n});\n\nconst NOTIFICATION_EXIT_TRANSITION = Object.freeze({\n duration: DURATION_TOKENS.FAST,\n ease: EASING_CURVES.IN_CUBIC,\n type: \"tween\" as const,\n});\n\nexport const toastVariants: Variants = Object.freeze({\n exit: {\n opacity: 0,\n transform: toGpuTransform(-6, 0.98),\n transition: NOTIFICATION_EXIT_TRANSITION,\n },\n hidden: {\n opacity: 0,\n transform: toGpuTransform(-10, 0.96),\n },\n visible: {\n opacity: 1,\n transform: toGpuTransform(0, 1),\n transition: NOTIFICATION_TRANSITION,\n },\n});\n","\"use client\";\n\nimport { type KeyboardEvent, type MouseEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { type CSSProperties } from \"react\";\nimport { cn } from \"@/utils\";\nimport { DOCK_STACK_ELEMENT_ID } from \"./constants\";\nimport { type NotificationEntry } from \"./types\";\nimport {\n NOTIFICATION_COMPOSITOR_STYLE,\n NOTIFICATION_TRANSITION,\n toastVariants,\n} from \"./motion\";\nimport { useNotificationContainerModel, NotificationListener } from \"./hooks\";\n\nfunction Toast({\n className,\n entry,\n messageClassName,\n onDismiss,\n polite,\n style,\n}: {\n className: string;\n entry: NotificationEntry;\n messageClassName: string;\n onDismiss: () => void;\n polite?: boolean;\n style?: CSSProperties;\n}) {\n return (\n <motion.div\n role=\"alert\"\n aria-atomic=\"true\"\n aria-live={polite ? \"polite\" : undefined}\n aria-keyshortcuts=\"Escape\"\n tabIndex={0}\n variants={toastVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n transition={NOTIFICATION_TRANSITION}\n style={{ ...NOTIFICATION_COMPOSITOR_STYLE, ...style }}\n className={className}\n onClick={(event: MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n onDismiss();\n }}\n onKeyDown={(event: KeyboardEvent<HTMLElement>) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n onDismiss();\n }}\n >\n <div className={messageClassName}>{entry.message}</div>\n </motion.div>\n );\n}\n\nexport function NotificationContainer() {\n const { dismissNotification, isHydrated, activeEntry, theme } =\n useNotificationContainerModel();\n if (!isHydrated) return null;\n const dockElement = document.getElementById(DOCK_STACK_ELEMENT_ID);\n const toast = (className: string, polite?: boolean) => (\n <AnimatePresence mode=\"wait\">\n {activeEntry && (\n <Toast\n key={activeEntry.id}\n className={className}\n entry={activeEntry}\n messageClassName={theme.slots.toastMessage}\n polite={polite}\n style={theme.styles.toast}\n onDismiss={() => dismissNotification(activeEntry.id)}\n />\n )}\n </AnimatePresence>\n );\n if (dockElement) {\n return createPortal(\n toast(cn(theme.slots.toast, theme.slots.toastDocked), true),\n dockElement,\n );\n }\n return createPortal(\n <div\n aria-atomic=\"true\"\n aria-live=\"polite\"\n className={theme.slots.layer}\n style={theme.styles.layer}\n >\n {toast(theme.slots.toast)}\n </div>,\n document.body,\n );\n}\n\nexport function NotificationLayer() {\n return (\n <>\n <NotificationListener />\n <NotificationContainer />\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport { NotificationContext, NotificationProvider } from \"./context\";\nimport { useToast } from \"./hooks\";\nimport { NotificationLayer } from \"./overlay\";\nimport { type NotificationPageApi, type NotificationPageConfig } from \"./types\";\n\nfunction selectToastDuration(config: PageConfig): number | null {\n const notification = config.notification;\n if (typeof notification === \"number\") return notification;\n return notification?.duration ?? null;\n}\n\nfunction useNotificationPage(\n duration: number | null,\n page: PageModuleApi,\n): NotificationPageApi {\n const toast = useToast(duration);\n return useMemo(\n () => ({\n set: (notification: NotificationPageConfig) => page.set({ notification }),\n toast,\n }),\n [page, toast],\n );\n}\n\nexport const notificationModule = defineModule({\n id: \"notification\",\n context: NotificationContext,\n Provider: NotificationProvider,\n Overlay: NotificationLayer,\n page: {\n select: selectToastDuration,\n use: useNotificationPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n notification: typeof notificationModule;\n }\n interface PageConfig {\n notification?: NotificationPageConfig;\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type NotificationData, type NotificationEntry, type NotificationOptions, type ToastOptionsInput, type ToastPromiseMessages } from "./types";
|
|
3
|
+
export declare function normalizeFeedbackText<T = unknown>(value: T): T;
|
|
4
|
+
export declare function getActiveNotification(notifications: Record<string, NotificationEntry>): NotificationEntry | null;
|
|
5
|
+
export declare function normalizeToastOptions(options?: ToastOptionsInput): NotificationOptions;
|
|
6
|
+
export declare function normalizeDuration(value: unknown): number | null;
|
|
7
|
+
export declare function withDefaultDuration(duration: number, options?: ToastOptionsInput): NotificationOptions & {
|
|
8
|
+
duration: number | null;
|
|
9
|
+
};
|
|
10
|
+
export declare function isNotificationDataObject(value: unknown): value is NotificationData;
|
|
11
|
+
export declare function resolveMessage<A>(message: ReactNode | ((arg: A) => ReactNode), arg: A): ReactNode;
|
|
12
|
+
export declare function getOutcomeMessage<T, E>(value: unknown, messages: ToastPromiseMessages<T, E>): ReactNode;
|
|
13
|
+
export declare function createNotificationEntry(messageOrData: ReactNode | NotificationData, options?: ToastOptionsInput, fallbackId?: string): {
|
|
14
|
+
entry: NotificationEntry;
|
|
15
|
+
duration: number | null;
|
|
16
|
+
} | null;
|
|
17
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/modules/notification/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAG9D;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC/C,iBAAiB,GAAG,IAAI,CAM1B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,mBAAmB,CAErB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAK/D;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,mBAAmB,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAOnD;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,gBAAgB,CAE3B;AAED,wBAAgB,cAAc,CAAC,CAAC,EAC9B,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,EAC5C,GAAG,EAAE,CAAC,GACL,SAAS,CAEX;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EACpC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GACnC,SAAS,CAMX;AAED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,SAAS,GAAG,gBAAgB,EAC3C,OAAO,CAAC,EAAE,iBAAiB,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAkC9D"}
|