@omerdlw/base-framework 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/atoms/index.js +1 -103
  2. package/dist/atoms/index.js.map +1 -1
  3. package/dist/chunk-3BUP64Q6.js +105 -0
  4. package/dist/chunk-3BUP64Q6.js.map +1 -0
  5. package/dist/chunk-3MSK4XGK.js +9888 -0
  6. package/dist/chunk-3MSK4XGK.js.map +1 -0
  7. package/dist/chunk-4GMQKD6F.js +353 -0
  8. package/dist/chunk-4GMQKD6F.js.map +1 -0
  9. package/dist/chunk-65ZB4QTQ.js +888 -0
  10. package/dist/chunk-65ZB4QTQ.js.map +1 -0
  11. package/dist/chunk-6SG7V77J.js +577 -0
  12. package/dist/chunk-6SG7V77J.js.map +1 -0
  13. package/dist/chunk-7HQMXTNP.js +419 -0
  14. package/dist/chunk-7HQMXTNP.js.map +1 -0
  15. package/dist/chunk-7TAVYJ3A.js +371 -0
  16. package/dist/chunk-7TAVYJ3A.js.map +1 -0
  17. package/dist/chunk-AQ4BNXA2.js +349 -0
  18. package/dist/chunk-AQ4BNXA2.js.map +1 -0
  19. package/dist/chunk-CGHZSSFR.js +2166 -0
  20. package/dist/chunk-CGHZSSFR.js.map +1 -0
  21. package/dist/chunk-DGCQWQLZ.js +61 -0
  22. package/dist/chunk-DGCQWQLZ.js.map +1 -0
  23. package/dist/chunk-FIMPHODX.js +67 -0
  24. package/dist/chunk-FIMPHODX.js.map +1 -0
  25. package/dist/chunk-GF7TUX5I.js +1889 -0
  26. package/dist/chunk-GF7TUX5I.js.map +1 -0
  27. package/dist/chunk-JELG4JLT.js +454 -0
  28. package/dist/chunk-JELG4JLT.js.map +1 -0
  29. package/dist/chunk-K676GL7Z.js +51 -0
  30. package/dist/chunk-K676GL7Z.js.map +1 -0
  31. package/dist/chunk-KKQT46TP.js +26 -0
  32. package/dist/chunk-KKQT46TP.js.map +1 -0
  33. package/dist/chunk-QI3ALLIB.js +38 -0
  34. package/dist/chunk-QI3ALLIB.js.map +1 -0
  35. package/dist/chunk-QXR55VVS.js +1139 -0
  36. package/dist/chunk-QXR55VVS.js.map +1 -0
  37. package/dist/chunk-R2YGFJDJ.js +408 -0
  38. package/dist/chunk-R2YGFJDJ.js.map +1 -0
  39. package/dist/chunk-RFZQWLC5.js +27 -0
  40. package/dist/chunk-RFZQWLC5.js.map +1 -0
  41. package/dist/chunk-SYAVGTOX.js +521 -0
  42. package/dist/chunk-SYAVGTOX.js.map +1 -0
  43. package/dist/chunk-TV3WEF5G.js +784 -0
  44. package/dist/chunk-TV3WEF5G.js.map +1 -0
  45. package/dist/chunk-XASQT4CQ.js +280 -0
  46. package/dist/chunk-XASQT4CQ.js.map +1 -0
  47. package/dist/error/index.js +5 -682
  48. package/dist/error/index.js.map +1 -1
  49. package/dist/error/reporter.d.ts.map +1 -1
  50. package/dist/error/theme.d.ts +1 -1
  51. package/dist/error/theme.d.ts.map +1 -1
  52. package/dist/events.js +1 -7
  53. package/dist/events.js.map +1 -1
  54. package/dist/hooks/index.js +1 -358
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/use-global-event.d.ts +1 -1
  57. package/dist/index.js +18 -20029
  58. package/dist/index.js.map +1 -1
  59. package/dist/kernel/index.js +2 -2035
  60. package/dist/kernel/index.js.map +1 -1
  61. package/dist/kernel/types.d.ts +1 -1
  62. package/dist/modules/ambient/analyze.d.ts +46 -0
  63. package/dist/modules/ambient/analyze.d.ts.map +1 -0
  64. package/dist/modules/ambient/constants.d.ts +1 -5
  65. package/dist/modules/ambient/constants.d.ts.map +1 -1
  66. package/dist/modules/ambient/context.d.ts.map +1 -1
  67. package/dist/modules/ambient/dom.d.ts +11 -12
  68. package/dist/modules/ambient/dom.d.ts.map +1 -1
  69. package/dist/modules/ambient/extractor.d.ts +10 -10
  70. package/dist/modules/ambient/extractor.d.ts.map +1 -1
  71. package/dist/modules/ambient/hooks.d.ts +1 -1
  72. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  73. package/dist/modules/ambient/index.d.ts +6 -4
  74. package/dist/modules/ambient/index.d.ts.map +1 -1
  75. package/dist/modules/ambient/index.js +7 -762
  76. package/dist/modules/ambient/index.js.map +1 -1
  77. package/dist/modules/ambient/module.d.ts +1 -1
  78. package/dist/modules/ambient/module.d.ts.map +1 -1
  79. package/dist/modules/ambient/oklab.d.ts +36 -0
  80. package/dist/modules/ambient/oklab.d.ts.map +1 -0
  81. package/dist/modules/ambient/pipeline.d.ts +28 -0
  82. package/dist/modules/ambient/pipeline.d.ts.map +1 -0
  83. package/dist/modules/ambient/quantize.d.ts +22 -0
  84. package/dist/modules/ambient/quantize.d.ts.map +1 -0
  85. package/dist/modules/ambient/server/address.d.ts +8 -0
  86. package/dist/modules/ambient/server/address.d.ts.map +1 -0
  87. package/dist/modules/ambient/server/index.d.ts +53 -0
  88. package/dist/modules/ambient/server/index.d.ts.map +1 -0
  89. package/dist/modules/ambient/server/index.js +221 -0
  90. package/dist/modules/ambient/server/index.js.map +1 -0
  91. package/dist/modules/ambient/settings.d.ts +19 -0
  92. package/dist/modules/ambient/settings.d.ts.map +1 -0
  93. package/dist/modules/ambient/types.d.ts +105 -9
  94. package/dist/modules/ambient/types.d.ts.map +1 -1
  95. package/dist/modules/ambient/worker/index.d.ts +15 -0
  96. package/dist/modules/ambient/worker/index.d.ts.map +1 -0
  97. package/dist/modules/ambient/worker/index.js +114 -0
  98. package/dist/modules/ambient/worker/index.js.map +1 -0
  99. package/dist/modules/background/constants.d.ts +2 -2
  100. package/dist/modules/background/constants.d.ts.map +1 -1
  101. package/dist/modules/background/hooks.d.ts +1 -1
  102. package/dist/modules/background/index.js +6 -3078
  103. package/dist/modules/background/index.js.map +1 -1
  104. package/dist/modules/background/motion.d.ts +9 -7
  105. package/dist/modules/background/motion.d.ts.map +1 -1
  106. package/dist/modules/background/overlay.d.ts +3 -8
  107. package/dist/modules/background/overlay.d.ts.map +1 -1
  108. package/dist/modules/background/types.d.ts +16 -2
  109. package/dist/modules/background/types.d.ts.map +1 -1
  110. package/dist/modules/context-menu/constants.d.ts +2 -2
  111. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  112. package/dist/modules/context-menu/hooks.d.ts +1 -1
  113. package/dist/modules/context-menu/index.js +10 -1896
  114. package/dist/modules/context-menu/index.js.map +1 -1
  115. package/dist/modules/context-menu/motion.d.ts +1 -8
  116. package/dist/modules/context-menu/motion.d.ts.map +1 -1
  117. package/dist/modules/context-menu/overlay.d.ts.map +1 -1
  118. package/dist/modules/context-menu/types.d.ts +16 -2
  119. package/dist/modules/context-menu/types.d.ts.map +1 -1
  120. package/dist/modules/controls/constants.d.ts +1 -1
  121. package/dist/modules/controls/constants.d.ts.map +1 -1
  122. package/dist/modules/controls/entries.d.ts +1 -1
  123. package/dist/modules/controls/hooks.d.ts +1 -1
  124. package/dist/modules/controls/index.js +4 -1110
  125. package/dist/modules/controls/index.js.map +1 -1
  126. package/dist/modules/controls/overlay.d.ts +1 -1
  127. package/dist/modules/controls/types.d.ts +2 -2
  128. package/dist/modules/dock/cards.d.ts +708 -24
  129. package/dist/modules/dock/cards.d.ts.map +1 -1
  130. package/dist/modules/dock/constants.d.ts +2 -2
  131. package/dist/modules/dock/constants.d.ts.map +1 -1
  132. package/dist/modules/dock/helpers.d.ts +2 -2
  133. package/dist/modules/dock/hooks.d.ts +2 -2
  134. package/dist/modules/dock/index.d.ts +1 -1
  135. package/dist/modules/dock/index.d.ts.map +1 -1
  136. package/dist/modules/dock/index.js +9 -12132
  137. package/dist/modules/dock/index.js.map +1 -1
  138. package/dist/modules/dock/module.d.ts +1 -1
  139. package/dist/modules/dock/motion.d.ts +41 -915
  140. package/dist/modules/dock/motion.d.ts.map +1 -1
  141. package/dist/modules/dock/overlay.d.ts.map +1 -1
  142. package/dist/modules/dock/runtime/dock.d.ts +1 -23
  143. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  144. package/dist/modules/dock/styles.d.ts +4 -4
  145. package/dist/modules/dock/surface/hooks.d.ts +5 -20
  146. package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
  147. package/dist/modules/dock/surface/machine.d.ts +4 -3
  148. package/dist/modules/dock/surface/machine.d.ts.map +1 -1
  149. package/dist/modules/dock/surface/stack.d.ts.map +1 -1
  150. package/dist/modules/dock/types.d.ts +158 -3
  151. package/dist/modules/dock/types.d.ts.map +1 -1
  152. package/dist/modules/index.js +16 -17883
  153. package/dist/modules/index.js.map +1 -1
  154. package/dist/modules/loading/constants.d.ts +1 -1
  155. package/dist/modules/loading/constants.d.ts.map +1 -1
  156. package/dist/modules/loading/context.d.ts +1 -1
  157. package/dist/modules/loading/hooks.d.ts +1 -1
  158. package/dist/modules/loading/index.js +5 -1153
  159. package/dist/modules/loading/index.js.map +1 -1
  160. package/dist/modules/loading/types.d.ts +2 -2
  161. package/dist/modules/media/context.d.ts +1 -1
  162. package/dist/modules/media/index.js +3 -570
  163. package/dist/modules/media/index.js.map +1 -1
  164. package/dist/modules/media/types.d.ts +2 -2
  165. package/dist/modules/modal/constants.d.ts +2 -2
  166. package/dist/modules/modal/constants.d.ts.map +1 -1
  167. package/dist/modules/modal/context.d.ts +1 -1
  168. package/dist/modules/modal/hooks.d.ts +3 -3
  169. package/dist/modules/modal/index.js +8 -2355
  170. package/dist/modules/modal/index.js.map +1 -1
  171. package/dist/modules/modal/motion.d.ts +3 -8
  172. package/dist/modules/modal/motion.d.ts.map +1 -1
  173. package/dist/modules/modal/overlay.d.ts.map +1 -1
  174. package/dist/modules/modal/types.d.ts +21 -0
  175. package/dist/modules/modal/types.d.ts.map +1 -1
  176. package/dist/modules/notification/constants.d.ts +2 -2
  177. package/dist/modules/notification/constants.d.ts.map +1 -1
  178. package/dist/modules/notification/context.d.ts +1 -1
  179. package/dist/modules/notification/hooks.d.ts +1 -1
  180. package/dist/modules/notification/index.js +4 -828
  181. package/dist/modules/notification/index.js.map +1 -1
  182. package/dist/modules/notification/motion.d.ts +1 -7
  183. package/dist/modules/notification/motion.d.ts.map +1 -1
  184. package/dist/modules/notification/overlay.d.ts.map +1 -1
  185. package/dist/modules/notification/types.d.ts +9 -1
  186. package/dist/modules/notification/types.d.ts.map +1 -1
  187. package/dist/overlay-TZ6L52A5.js +9 -0
  188. package/dist/overlay-TZ6L52A5.js.map +1 -0
  189. package/dist/provider.d.ts +1 -1
  190. package/dist/provider.d.ts.map +1 -1
  191. package/dist/provider.js +6 -1968
  192. package/dist/provider.js.map +1 -1
  193. package/dist/result.js +2 -63
  194. package/dist/result.js.map +1 -1
  195. package/dist/theme.d.ts +45 -8
  196. package/dist/theme.d.ts.map +1 -1
  197. package/dist/theme.js +3 -41
  198. package/dist/theme.js.map +1 -1
  199. package/dist/tokens/index.d.ts +1 -0
  200. package/dist/tokens/index.d.ts.map +1 -1
  201. package/dist/tokens/index.js +126 -155
  202. package/dist/tokens/index.js.map +1 -1
  203. package/dist/tokens/motion-config.d.ts +44 -0
  204. package/dist/tokens/motion-config.d.ts.map +1 -0
  205. package/dist/tokens/motion.d.ts +23 -174
  206. package/dist/tokens/motion.d.ts.map +1 -1
  207. package/dist/utils/index.js +4 -82
  208. package/dist/utils/index.js.map +1 -1
  209. package/dist/utils/report.d.ts.map +1 -1
  210. package/docs/README.md +1 -0
  211. package/docs/architecture-and-rules.md +4 -3
  212. package/docs/core-engine.md +7 -10
  213. package/docs/getting-started.md +4 -2
  214. package/docs/modules/ambient.md +194 -80
  215. package/docs/modules/background.md +3 -3
  216. package/docs/modules/context-menu.md +2 -2
  217. package/docs/modules/dock.md +8 -5
  218. package/docs/modules/modal.md +2 -2
  219. package/docs/modules/notification.md +2 -2
  220. package/docs/theming.md +81 -9
  221. package/package.json +22 -5
  222. package/templates/AGENTS.md +1 -1
  223. package/templates/motion/background.ts +17 -0
  224. package/templates/motion/context-menu.ts +63 -0
  225. package/templates/motion/dock.ts +327 -0
  226. package/templates/motion/modal.ts +79 -0
  227. package/templates/motion/notification.ts +27 -0
  228. package/templates/motion/tokens.ts +47 -0
  229. package/templates/tsconfig.json +7 -0
  230. package/dist/modules/ambient/color.d.ts +0 -21
  231. package/dist/modules/ambient/color.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/media/constants.ts","../src/modules/media/playback.ts","../src/modules/media/session.ts","../src/modules/media/context.tsx","../src/modules/media/hooks.ts","../src/modules/media/overlay.tsx","../src/modules/media/module.tsx"],"names":["useRef","useEffect","useMemo"],"mappings":"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","file":"chunk-R2YGFJDJ.js","sourcesContent":["import { type MediaActions, type MediaState } from \"./types\";\n\nexport const DEFAULT_MEDIA_STATE: MediaState = Object.freeze({\n audibleElement: null,\n element: null,\n hasMedia: false,\n isPlaying: false,\n kind: null,\n loop: false,\n sourceId: null,\n});\n\nexport const INERT_MEDIA_ACTIONS: MediaActions = Object.freeze({\n removeSource: () => {},\n setMuted: () => {},\n toggle: () => {},\n toggleLoop: () => {},\n upsertSource: () => {},\n});\n\n\nexport const MEDIA_SYNC_DRIFT_SECONDS = 0.3;\n\nexport const MEDIA_REGISTRY_KEY = \"page-media\";\n\nexport const PAGE_MEDIA_ID = \"page\";\n","import { MEDIA_SYNC_DRIFT_SECONDS } from \"./constants\";\n\nconst noop = () => {};\n\nexport function toggleElement(element: HTMLMediaElement | null): void {\n if (!element) return;\n if (element.paused || element.ended) {\n void Promise.resolve(element.play()).catch(noop);\n } else {\n element.pause();\n }\n}\n\nexport function safePlay(element: HTMLMediaElement): void {\n try {\n void Promise.resolve(element.play()).catch(noop);\n } catch {}\n}\n\nexport function sameElements(\n a: readonly (HTMLMediaElement | null)[],\n b: readonly (HTMLMediaElement | null)[],\n): boolean {\n return (\n a.length === b.length && a.every((element, index) => element === b[index])\n );\n}\n\nexport function bindFollowers(\n transport: HTMLMediaElement,\n followers: readonly HTMLMediaElement[],\n): () => void {\n const ownLoops = followers.map((follower) => follower.loop);\n\n const align = (hard: boolean) => {\n const time = Number(transport.currentTime) || 0;\n for (const follower of followers) {\n follower.loop = false;\n if (follower.playbackRate !== transport.playbackRate) {\n follower.playbackRate = transport.playbackRate;\n }\n const drift = Math.abs((Number(follower.currentTime) || 0) - time);\n if (hard || drift > MEDIA_SYNC_DRIFT_SECONDS) follower.currentTime = time;\n }\n };\n const play = () => {\n align(false);\n followers.forEach(safePlay);\n };\n const pause = () => followers.forEach((follower) => follower.pause());\n const hardAlign = () => align(true);\n const softAlign = () => align(false);\n\n const listeners: [string, () => void][] = [\n [\"play\", play],\n [\"playing\", play],\n [\"pause\", pause],\n [\"waiting\", pause],\n [\"ended\", pause],\n [\"seeking\", hardAlign],\n [\"seeked\", hardAlign],\n [\"ratechange\", softAlign],\n [\"timeupdate\", softAlign],\n ];\n for (const [type, listener] of listeners) {\n transport.addEventListener(type, listener);\n }\n\n hardAlign();\n if (!transport.paused && !transport.ended) play();\n\n return () => {\n for (const [type, listener] of listeners) {\n transport.removeEventListener(type, listener);\n }\n followers.forEach((follower, index) => {\n follower.loop = ownLoops[index];\n });\n };\n}\n","import { shallowEqual } from \"@/utils\";\nimport { DEFAULT_MEDIA_STATE } from \"./constants\";\nimport {\n type MediaEntry,\n type MediaEntryInput,\n type MediaPageConfig,\n type MediaPageOptions,\n type MediaSession,\n type MediaState,\n} from \"./types\";\n\nfunction newest(sources: readonly MediaEntry[]): MediaEntry {\n return sources.reduce((a, b) => (b.order > a.order ? b : a));\n}\n\nexport function resolveMediaSession(\n sources: readonly MediaEntry[],\n): MediaSession | null {\n if (sources.length === 0) return null;\n\n const ids = new Set(sources.map((source) => source.id));\n const wantsFollow = (source: MediaEntry) =>\n Boolean(source.follow) &&\n source.follow !== source.id &&\n ids.has(source.follow!);\n const rootIds = new Set(\n sources.filter((source) => !wantsFollow(source)).map((source) => source.id),\n );\n const isFollower = (source: MediaEntry) =>\n wantsFollow(source) && rootIds.has(source.follow!);\n\n const transport = newest(sources.filter((source) => !isFollower(source)));\n const followers = sources\n .filter((source) => isFollower(source) && source.follow === transport.id)\n .sort((a, b) => a.order - b.order);\n const audioFollowers = followers.filter((source) => source.kind === \"audio\");\n\n return {\n audible: audioFollowers.length > 0 ? newest(audioFollowers) : transport,\n followers,\n transport,\n };\n}\n\nexport function createMediaState(session: MediaSession | null): MediaState {\n if (!session) return DEFAULT_MEDIA_STATE;\n const { audible, transport } = session;\n return {\n audibleElement: audible.element,\n element: transport.element,\n hasMedia: true,\n isPlaying: transport.isPlaying,\n kind: transport.kind,\n loop: transport.loop,\n sourceId: transport.id,\n };\n}\n\nexport function mediaStatesEqual(a: MediaState, b: MediaState): boolean {\n return shallowEqual(a, b);\n}\n\nexport function mergeMediaSource(\n current: MediaEntry | undefined,\n input: MediaEntryInput,\n order: number,\n): MediaEntry {\n return {\n controls: undefined,\n element: null,\n follow: null,\n isPlaying: false,\n kind: \"audio\",\n loop: false,\n ...current,\n ...input,\n order: current?.order ?? order,\n };\n}\n\nexport function selectPageMedia(\n media: MediaPageConfig | null | undefined,\n): MediaPageOptions | null {\n if (!media) return null;\n if (typeof media === \"string\") return { src: media };\n return media.src ? media : null;\n}\nexport function findDisplacedAudio(\n entries: readonly MediaEntry[],\n session: MediaSession | null,\n newId: string,\n): MediaEntry[] {\n if (!session || session.transport.id !== newId) return [];\n const followerIds = new Set(session.followers.map((entry) => entry.id));\n return entries.filter(\n (entry) =>\n entry.id !== newId &&\n !followerIds.has(entry.id) &&\n entry.kind === \"audio\" &&\n entry.element !== null &&\n !entry.element.paused,\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport { DEFAULT_MEDIA_STATE } from \"./constants\";\nimport {\n bindFollowers,\n sameElements,\n toggleElement,\n} from \"./playback\";\nimport {\n createMediaState,\n findDisplacedAudio,\n mediaStatesEqual,\n mergeMediaSource,\n resolveMediaSession,\n} from \"./session\";\nimport {\n type MediaActions,\n type MediaContextValue,\n type MediaEntry,\n type MediaProviderProps,\n type MediaSession,\n type MediaState,\n} from \"./types\";\n\nexport const MediaContext = getOrCreateGlobalContext<MediaContextValue | null>(\n \"MediaContext\",\n null,\n);\n\nexport const NOOP_MEDIA_STORE = createStore<MediaState>(DEFAULT_MEDIA_STATE);\n\ninterface Binding {\n cleanup: () => void;\n followers: readonly (HTMLMediaElement | null)[];\n transport: HTMLMediaElement;\n}\n\nexport function MediaProvider({ children }: MediaProviderProps) {\n const [store] = useState(() =>\n createStore<MediaState>(DEFAULT_MEDIA_STATE, { freezeSnapshots: false }),\n );\n const sourcesRef = useRef(new Map<string, MediaEntry>());\n const sessionRef = useRef<MediaSession | null>(null);\n const orderRef = useRef(0);\n const bindingRef = useRef<Binding | null>(null);\n\n const actions = useMemo<MediaActions>(() => {\n const unbind = () => {\n bindingRef.current?.cleanup();\n bindingRef.current = null;\n };\n\n const rebind = (session: MediaSession | null) => {\n const transport = session?.transport.element ?? null;\n const followers = (session?.followers ?? []).map(\n (source) => source.element,\n );\n const current = bindingRef.current;\n if (\n current &&\n current.transport === transport &&\n sameElements(current.followers, followers)\n ) {\n return;\n }\n unbind();\n const live = followers.filter(\n (element): element is HTMLMediaElement => element !== null,\n );\n if (!transport || live.length === 0) return;\n bindingRef.current = {\n cleanup: bindFollowers(transport, live),\n followers,\n transport,\n };\n };\n\n const commit = () => {\n const session = resolveMediaSession([...sourcesRef.current.values()]);\n sessionRef.current = session;\n rebind(session);\n const next = createMediaState(session);\n store.publish((prev) => (mediaStatesEqual(prev, next) ? prev : next));\n };\n\n const patch = (id: string, changes: Partial<MediaEntry>) => {\n const current = sourcesRef.current.get(id);\n if (!current) return;\n sourcesRef.current.set(id, { ...current, ...changes });\n commit();\n };\n\n return {\n removeSource: (id) => {\n if (sourcesRef.current.delete(id)) commit();\n },\n setMuted: (muted) => {\n const audible = sessionRef.current?.audible;\n if (!audible) return;\n if (audible.controls?.setMuted) audible.controls.setMuted(muted);\n else if (audible.element) audible.element.muted = muted;\n },\n toggle: () => {\n const transport = sessionRef.current?.transport;\n if (!transport) return;\n if (transport.controls?.toggle) transport.controls.toggle();\n else toggleElement(transport.element);\n },\n toggleLoop: () => {\n const transport = sessionRef.current?.transport;\n if (!transport) return;\n if (transport.controls?.toggleLoop) {\n transport.controls.toggleLoop();\n return;\n }\n const loop = !transport.loop;\n if (transport.element) transport.element.loop = loop;\n patch(transport.id, { loop });\n },\n upsertSource: (input) => {\n const current = sourcesRef.current.get(input.id);\n if (!current) orderRef.current += 1;\n sourcesRef.current.set(\n input.id,\n mergeMediaSource(current, input, orderRef.current),\n );\n commit();\n if (!current) {\n findDisplacedAudio(\n [...sourcesRef.current.values()],\n sessionRef.current,\n input.id,\n ).forEach((entry) => entry.element?.pause());\n }\n },\n };\n }, [store]);\n\n useEffect(\n () => () => {\n bindingRef.current?.cleanup();\n bindingRef.current = null;\n },\n [],\n );\n\n const value = useMemo<MediaContextValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n return <MediaContext value={value}>{children}</MediaContext>;\n}\n","\"use client\";\n\nimport {\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { INERT_MEDIA_ACTIONS } from \"./constants\";\nimport { MediaContext, NOOP_MEDIA_STORE } from \"./context\";\nimport { toggleElement } from \"./playback\";\nimport {\n type MediaActions,\n type MediaHandle,\n type MediaOptions,\n type MediaState,\n} from \"./types\";\n\nexport function useMediaState(): MediaState {\n const { store } = useRequiredContext(\n MediaContext,\n \"useMediaState\",\n \"MediaProvider\",\n );\n return useStore(store);\n}\n\nexport function useMediaActions(): MediaActions {\n return useRequiredContext(MediaContext, \"useMediaActions\", \"MediaProvider\")\n .actions;\n}\n\nexport function useOptionalMediaState(): MediaState;\nexport function useOptionalMediaState<T>(\n selector: (state: MediaState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalMediaState<T = MediaState>(\n selector?: (state: MediaState) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(MediaContext);\n return useStore(\n ctx?.store ?? NOOP_MEDIA_STORE,\n selector as (state: MediaState) => T,\n isEqual,\n );\n}\n\nexport function useOptionalMediaActions(): MediaActions {\n const ctx = useContext(MediaContext);\n return ctx?.actions ?? INERT_MEDIA_ACTIONS;\n}\n\nexport function useMedia(options: MediaOptions): MediaHandle {\n const generatedId = useId();\n const id = options.id ?? `media-${generatedId}`;\n const { removeSource, upsertSource } = useMediaActions();\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const optionsRef = useRef(options);\n const { src, enabled = true } = options;\n const isEnabled = enabled && Boolean(src);\n\n useEffect(() => {\n optionsRef.current = options;\n });\n\n useEffect(() => {\n if (!isEnabled || !src) return undefined;\n const audio = new Audio();\n audio.preload = \"auto\";\n audio.src = src;\n audioRef.current = audio;\n\n const initial = optionsRef.current;\n audio.loop = Boolean(initial.loop);\n audio.muted = Boolean(initial.muted);\n if (typeof initial.volume === \"number\") {\n audio.volume = Math.min(1, Math.max(0, initial.volume));\n }\n\n upsertSource({\n element: audio,\n follow: initial.follow ?? null,\n id,\n isPlaying: false,\n kind: \"audio\",\n loop: audio.loop,\n });\n\n const syncPlaying = () =>\n upsertSource({ id, isPlaying: !audio.paused && !audio.ended });\n const events = [\"play\", \"playing\", \"pause\", \"ended\"] as const;\n events.forEach((type) => audio.addEventListener(type, syncPlaying));\n\n if (!initial.follow && initial.autoplay !== false) {\n void Promise.resolve(audio.play()).catch(() => {});\n }\n\n return () => {\n events.forEach((type) => audio.removeEventListener(type, syncPlaying));\n audio.pause();\n audio.removeAttribute(\"src\");\n audio.load();\n audioRef.current = null;\n removeSource(id);\n };\n }, [id, isEnabled, removeSource, src, upsertSource]);\n\n const { follow = null, loop, muted, volume } = options;\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n if (loop !== undefined && !follow) audio.loop = loop;\n if (muted !== undefined) audio.muted = muted;\n if (volume !== undefined) audio.volume = Math.min(1, Math.max(0, volume));\n upsertSource({ follow, id, ...(follow ? {} : { loop: audio.loop }) });\n }, [follow, id, isEnabled, loop, muted, src, upsertSource, volume]);\n\n const play = useCallback(() => {\n const audio = audioRef.current;\n if (audio) void Promise.resolve(audio.play()).catch(() => {});\n }, []);\n const pause = useCallback(() => audioRef.current?.pause(), []);\n const toggle = useCallback(() => toggleElement(audioRef.current), []);\n\n return useMemo(\n () => ({ id, pause, play, toggle }),\n [id, pause, play, toggle],\n );\n}\n","\"use client\";\n\nimport { useRegistryValue } from \"@/kernel\";\nimport { MEDIA_REGISTRY_KEY, PAGE_MEDIA_ID } from \"./constants\";\nimport { useMedia } from \"./hooks\";\nimport { type MediaPageOptions, type MediaSourceProps } from \"./types\";\n\nexport function MediaSource(props: MediaSourceProps) {\n useMedia(props);\n return null;\n}\n\nexport function MediaOverlay() {\n const page = useRegistryValue<\"media\", MediaPageOptions>(\n \"media\",\n MEDIA_REGISTRY_KEY,\n );\n useMedia({ ...page, id: PAGE_MEDIA_ID, src: page?.src });\n return null;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { defineModule, type PageModuleApi } from \"@/kernel\";\nimport { MEDIA_REGISTRY_KEY } from \"./constants\";\nimport { MediaContext, MediaProvider } from \"./context\";\nimport { useMediaActions } from \"./hooks\";\nimport { MediaOverlay } from \"./overlay\";\nimport { selectPageMedia } from \"./session\";\nimport {\n type MediaPageApi,\n type MediaPageConfig,\n type MediaPageOptions,\n} from \"./types\";\n\nfunction useMediaPage(\n _slice: MediaPageOptions | null,\n page: PageModuleApi,\n): MediaPageApi {\n const actions = useMediaActions();\n return useMemo(\n () => ({\n ...actions,\n set: (media: MediaPageConfig) => page.set({ media }),\n }),\n [actions, page],\n );\n}\n\nexport const mediaModule = defineModule({\n id: \"media\",\n context: MediaContext,\n Provider: MediaProvider,\n Overlay: MediaOverlay,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"singleton\",\n lifecycle: \"immediate\",\n singletonKey: MEDIA_REGISTRY_KEY,\n },\n page: {\n select: (config) => selectPageMedia(config.media),\n entries: (slice: MediaPageOptions) => [\n { key: MEDIA_REGISTRY_KEY, value: slice },\n ],\n use: useMediaPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n media: typeof mediaModule;\n }\n interface PageConfig {\n media?: MediaPageConfig;\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ // src/utils/report.ts
2
+ var GLOBAL_SINK_KEY = /* @__PURE__ */ Symbol.for("__base_framework_report_sink__");
3
+ var _global = globalThis;
4
+ function report(scope, error, level = "error") {
5
+ const sink = _global[GLOBAL_SINK_KEY];
6
+ if (sink) {
7
+ try {
8
+ sink(scope, error, level);
9
+ return;
10
+ } catch {
11
+ }
12
+ }
13
+ if (process.env.NODE_ENV === "production" && typeof window !== "undefined") {
14
+ return;
15
+ }
16
+ console[level](`[${scope}]`, error);
17
+ }
18
+ function setReportSink(next) {
19
+ _global[GLOBAL_SINK_KEY] = next;
20
+ return () => {
21
+ if (_global[GLOBAL_SINK_KEY] === next) _global[GLOBAL_SINK_KEY] = null;
22
+ };
23
+ }
24
+
25
+ export { report, setReportSink };
26
+ //# sourceMappingURL=chunk-RFZQWLC5.js.map
27
+ //# sourceMappingURL=chunk-RFZQWLC5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/report.ts"],"names":[],"mappings":";AAWA,IAAM,eAAA,mBAAkB,MAAA,CAAO,GAAA,CAAI,gCAAgC,CAAA;AAKnE,IAAM,OAAA,GAAU,UAAA;AAET,SAAS,MAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,GAAqB,OAAA,EACf;AACN,EAAA,MAAM,IAAA,GAAO,QAAQ,eAAe,CAAA;AACpC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,KAAA,EAAO,OAAO,KAAK,CAAA;AACxB,MAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,IAAgB,OAAO,WAAW,WAAA,EAAa;AAC1E,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,CAAA,EAAI,KAAK,KAAK,KAAK,CAAA;AACpC;AAEO,SAAS,cAAc,IAAA,EAA8B;AAC1D,EAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,IAAA;AAC3B,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,QAAQ,eAAe,CAAA,KAAM,IAAA,EAAM,OAAA,CAAQ,eAAe,CAAA,GAAI,IAAA;AAAA,EACpE,CAAA;AACF","file":"chunk-RFZQWLC5.js","sourcesContent":["export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\n// The sink lives on globalThis so every bundled copy of this module (the\n// server-safe and client builds each carry one) reads the sink that\n// GlobalErrorListener installs.\nconst GLOBAL_SINK_KEY = Symbol.for(\"__base_framework_report_sink__\");\ntype GlobalWithSink = typeof globalThis & {\n [GLOBAL_SINK_KEY]?: ReportSink | null;\n};\n\nconst _global = globalThis as GlobalWithSink;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n const sink = _global[GLOBAL_SINK_KEY];\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 _global[GLOBAL_SINK_KEY] = next;\n return () => {\n if (_global[GLOBAL_SINK_KEY] === next) _global[GLOBAL_SINK_KEY] = null;\n };\n}\n"]}
@@ -0,0 +1,521 @@
1
+ import { defineThemeSpec, useTheme, useModuleMotion } from './chunk-7TAVYJ3A.js';
2
+ import { getOrCreateGlobalContext, defineModule } from './chunk-GF7TUX5I.js';
3
+ import { USER_MESSAGES, createStore, toUserMessage, useGlobalEvent, EVENT_TYPES, cn, useRequiredContext, isObject, useStore, UserError, report } from './chunk-TV3WEF5G.js';
4
+ import { useMemo, useState, useRef, useCallback, useEffect, useSyncExternalStore, useContext } from 'react';
5
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
+ import { createPortal } from 'react-dom';
7
+ import { AnimatePresence, motion } from 'motion/react';
8
+
9
+ // src/modules/notification/constants.ts
10
+ var TOAST_DURATIONS = Object.freeze({
11
+ DEFAULT: 2e3,
12
+ SHORT: 1500
13
+ });
14
+ var SESSION_EXPIRED_MESSAGE = USER_MESSAGES.unauthorized;
15
+ var DOCK_STACK_ELEMENT_ID = "dock-card-stack";
16
+ var notificationTheme = defineThemeSpec("notification");
17
+ var INITIAL_NOTIFICATION_STATE = Object.freeze({
18
+ notifications: {}
19
+ });
20
+ var INERT_NOTIFICATION_ACTIONS = Object.freeze({
21
+ dismissAllNotifications: () => {
22
+ },
23
+ dismissNotification: () => {
24
+ },
25
+ showNotification: () => null
26
+ });
27
+
28
+ // src/result.ts
29
+ function ok(data, code) {
30
+ return { data, success: true, ...code ? { code } : {} };
31
+ }
32
+ function err(error, code) {
33
+ return { error, success: false, ...code ? { code } : {} };
34
+ }
35
+ function isResult(value) {
36
+ return typeof value === "object" && value !== null && "success" in value && typeof value.success === "boolean" && ("data" in value && value.success === true || "error" in value && value.success === false);
37
+ }
38
+ function isOk(result) {
39
+ return result.success === true;
40
+ }
41
+ function isErr(result) {
42
+ return result.success === false;
43
+ }
44
+ function unwrap(result) {
45
+ if (result.success) {
46
+ return result.data;
47
+ }
48
+ if (result.error instanceof Error) {
49
+ throw result.error;
50
+ }
51
+ throw new Error(
52
+ typeof result.error === "string" ? result.error : String(result.error)
53
+ );
54
+ }
55
+ function unwrapOr(result, fallback) {
56
+ return result.success ? result.data : fallback;
57
+ }
58
+ function map(result, fn) {
59
+ return result.success ? ok(fn(result.data), result.code) : result;
60
+ }
61
+ function mapErr(result, fn) {
62
+ return result.success ? result : err(fn(result.error), result.code);
63
+ }
64
+ function match(result, branches) {
65
+ return result.success ? branches.ok(result.data) : branches.err(result.error);
66
+ }
67
+ function mapCaught(error, mapError) {
68
+ if (!(error instanceof UserError)) report("Result", error);
69
+ return mapError ? mapError(error) : toUserMessage(error);
70
+ }
71
+ async function tryCatch(promiseOrFn, mapError) {
72
+ try {
73
+ const data = typeof promiseOrFn === "function" ? await promiseOrFn() : await promiseOrFn;
74
+ return ok(data);
75
+ } catch (error) {
76
+ return err(mapCaught(error, mapError));
77
+ }
78
+ }
79
+ function createSafeAction(handler, options = {}) {
80
+ const { errorCode, mapError, schema, validate } = options;
81
+ return async (...args) => {
82
+ try {
83
+ let effectiveArgs = args;
84
+ if (schema) {
85
+ const parsed = schema.safeParse(args[0]);
86
+ if (!parsed.success) {
87
+ const issueMessage = parsed.error?.issues?.[0]?.message || parsed.error?.message || "Invalid input";
88
+ return err(
89
+ mapError ? mapError(issueMessage) : issueMessage,
90
+ errorCode ?? "VALIDATION_ERROR"
91
+ );
92
+ }
93
+ effectiveArgs = [parsed.data, ...args.slice(1)];
94
+ }
95
+ if (validate) {
96
+ const validationResult = validate(...effectiveArgs);
97
+ if (isResult(validationResult)) {
98
+ if (isErr(validationResult)) {
99
+ return validationResult;
100
+ }
101
+ } else if (validationResult === false) {
102
+ return err(
103
+ mapError ? mapError("Validation failed") : "Validation failed",
104
+ errorCode ?? "VALIDATION_ERROR"
105
+ );
106
+ } else if (typeof validationResult === "string" && validationResult.length > 0) {
107
+ return err(
108
+ mapError ? mapError(validationResult) : validationResult,
109
+ errorCode ?? "VALIDATION_ERROR"
110
+ );
111
+ }
112
+ }
113
+ const output = await handler(...effectiveArgs);
114
+ if (isResult(output)) {
115
+ return output;
116
+ }
117
+ return ok(output);
118
+ } catch (error) {
119
+ return err(mapCaught(error, mapError), errorCode);
120
+ }
121
+ };
122
+ }
123
+
124
+ // src/modules/notification/state.ts
125
+ function normalizeFeedbackText(value) {
126
+ if (typeof value !== "string") return value;
127
+ return value.trim().replace(/[.\s]+$/, "");
128
+ }
129
+ function getActiveNotification(notifications) {
130
+ let active = null;
131
+ for (const entry of Object.values(notifications)) {
132
+ if (!active || entry.timestamp >= active.timestamp) active = entry;
133
+ }
134
+ return active;
135
+ }
136
+ function normalizeToastOptions(options) {
137
+ return typeof options === "number" ? { duration: options } : options || {};
138
+ }
139
+ function normalizeDuration(value) {
140
+ if (value === null) return null;
141
+ if (value === void 0) return TOAST_DURATIONS.DEFAULT;
142
+ const duration = Number(value);
143
+ return Number.isFinite(duration) && duration > 0 ? duration : null;
144
+ }
145
+ function withDefaultDuration(duration, options) {
146
+ const normalized = normalizeToastOptions(options);
147
+ return {
148
+ ...normalized,
149
+ duration: normalized.duration !== void 0 ? normalized.duration : duration
150
+ };
151
+ }
152
+ function isNotificationDataObject(value) {
153
+ return isObject(value) && "message" in value;
154
+ }
155
+ function resolveMessage(message, arg) {
156
+ return typeof message === "function" ? message(arg) : message;
157
+ }
158
+ function getOutcomeMessage(value, messages) {
159
+ if (!isResult(value)) return resolveMessage(messages.success, value);
160
+ return value.success ? resolveMessage(messages.success, value.data) : resolveMessage(messages.error, value.error) || toUserMessage(value.error);
161
+ }
162
+ function createNotificationEntry(messageOrData, options, fallbackId) {
163
+ const normalizedOptions = normalizeToastOptions(options);
164
+ const payload = isNotificationDataObject(messageOrData) ? { ...normalizedOptions, ...messageOrData } : { ...normalizedOptions, message: messageOrData };
165
+ const normalizedMessage = normalizeFeedbackText(payload.message);
166
+ if (normalizedMessage === null || normalizedMessage === void 0 || normalizedMessage === "") {
167
+ return null;
168
+ }
169
+ const id = payload.dedupeKey || payload.id || (typeof normalizedMessage === "string" ? normalizedMessage.slice(0, 64) : fallbackId || `notification-${Date.now()}`);
170
+ const entry = {
171
+ dedupeKey: payload.dedupeKey,
172
+ duration: payload.duration,
173
+ id,
174
+ message: normalizedMessage,
175
+ timestamp: Date.now()
176
+ };
177
+ return {
178
+ duration: normalizeDuration(payload.duration),
179
+ entry
180
+ };
181
+ }
182
+ var NotificationContext = getOrCreateGlobalContext(
183
+ "NotificationContext",
184
+ null
185
+ );
186
+ var NOOP_NOTIFICATION_STORE = createStore(
187
+ INITIAL_NOTIFICATION_STATE
188
+ );
189
+ var notificationIdCounter = 0;
190
+ var NotificationProvider = ({
191
+ children
192
+ }) => {
193
+ const [store] = useState(
194
+ () => createStore(INITIAL_NOTIFICATION_STATE, {
195
+ freezeSnapshots: false
196
+ })
197
+ );
198
+ const timersRef = useRef(
199
+ /* @__PURE__ */ new Map()
200
+ );
201
+ const clearTimers = useCallback(() => {
202
+ timersRef.current.forEach(clearTimeout);
203
+ timersRef.current.clear();
204
+ }, []);
205
+ useEffect(() => clearTimers, [clearTimers]);
206
+ const dismissNotification = useCallback(
207
+ (id) => {
208
+ clearTimeout(timersRef.current.get(id));
209
+ timersRef.current.delete(id);
210
+ store.publish((prev) => {
211
+ if (!Object.hasOwn(prev.notifications, id)) return prev;
212
+ const notifications = { ...prev.notifications };
213
+ delete notifications[id];
214
+ return { notifications };
215
+ });
216
+ },
217
+ [store]
218
+ );
219
+ const dismissAllNotifications = useCallback(() => {
220
+ clearTimers();
221
+ store.publish(
222
+ (prev) => Object.keys(prev.notifications).length === 0 ? prev : { notifications: {} }
223
+ );
224
+ }, [clearTimers, store]);
225
+ const showNotification = useCallback(
226
+ (messageOrData, options) => {
227
+ const fallbackId = `notification-${++notificationIdCounter}`;
228
+ const result = createNotificationEntry(
229
+ messageOrData,
230
+ options,
231
+ fallbackId
232
+ );
233
+ if (!result) return null;
234
+ const { entry, duration } = result;
235
+ const { id } = entry;
236
+ clearTimers();
237
+ store.publish({ notifications: { [id]: entry } });
238
+ if (duration) {
239
+ timersRef.current.set(
240
+ id,
241
+ setTimeout(() => dismissNotification(id), duration)
242
+ );
243
+ }
244
+ return id;
245
+ },
246
+ [clearTimers, dismissNotification, store]
247
+ );
248
+ const actions = useMemo(
249
+ () => ({
250
+ dismissAllNotifications,
251
+ dismissNotification,
252
+ showNotification
253
+ }),
254
+ [dismissAllNotifications, dismissNotification, showNotification]
255
+ );
256
+ const value = useMemo(
257
+ () => ({ actions, store }),
258
+ [actions, store]
259
+ );
260
+ return /* @__PURE__ */ jsx(NotificationContext, { value, children });
261
+ };
262
+ var toastPromiseIdCounter = 0;
263
+ function useNotificationActions() {
264
+ return useRequiredContext(
265
+ NotificationContext,
266
+ "useNotificationActions",
267
+ "NotificationProvider"
268
+ ).actions;
269
+ }
270
+ function useNotificationState() {
271
+ const { store } = useRequiredContext(
272
+ NotificationContext,
273
+ "useNotificationState",
274
+ "NotificationProvider"
275
+ );
276
+ return useStore(store);
277
+ }
278
+ function useNotification() {
279
+ const actions = useNotificationActions();
280
+ const state = useNotificationState();
281
+ return useMemo(() => ({ ...actions, ...state }), [actions, state]);
282
+ }
283
+ function useOptionalNotificationState(selector, isEqual) {
284
+ const ctx = useContext(NotificationContext);
285
+ return useStore(
286
+ ctx?.store ?? NOOP_NOTIFICATION_STORE,
287
+ selector,
288
+ isEqual
289
+ );
290
+ }
291
+ function useOptionalNotificationActions() {
292
+ const ctx = useContext(NotificationContext);
293
+ return ctx?.actions ?? INERT_NOTIFICATION_ACTIONS;
294
+ }
295
+ function useNotificationVisible() {
296
+ return useOptionalNotificationState(
297
+ ({ notifications }) => Object.keys(notifications).length > 0
298
+ );
299
+ }
300
+ function useToast(defaultDuration) {
301
+ const { dismissAllNotifications, dismissNotification, showNotification } = useNotificationActions();
302
+ const resolvedDefaultDuration = defaultDuration ?? TOAST_DURATIONS.DEFAULT;
303
+ const triggerToast = useCallback(
304
+ (message, options) => showNotification(
305
+ message,
306
+ withDefaultDuration(resolvedDefaultDuration, options)
307
+ ),
308
+ [resolvedDefaultDuration, showNotification]
309
+ );
310
+ const dismiss = useCallback(
311
+ (id) => {
312
+ if (id) dismissNotification(id);
313
+ else dismissAllNotifications();
314
+ },
315
+ [dismissAllNotifications, dismissNotification]
316
+ );
317
+ const fromResult = useCallback(
318
+ (result, messages = {}, options) => {
319
+ const message = getOutcomeMessage(result, messages);
320
+ if (message) triggerToast(message, options);
321
+ return result;
322
+ },
323
+ [triggerToast]
324
+ );
325
+ const promise = useCallback(
326
+ async (promiseOrFn, messages = {}, options) => {
327
+ const normalized = normalizeToastOptions(options);
328
+ const id = normalized.id || normalized.dedupeKey || `toast-promise-${++toastPromiseIdCounter}`;
329
+ const sharedOptions = { ...normalized, id };
330
+ if (messages.loading) {
331
+ showNotification(messages.loading, {
332
+ ...sharedOptions,
333
+ duration: null
334
+ });
335
+ }
336
+ try {
337
+ const resolved = await (typeof promiseOrFn === "function" ? promiseOrFn() : promiseOrFn);
338
+ const message = getOutcomeMessage(resolved, messages);
339
+ if (message) triggerToast(message, sharedOptions);
340
+ else if (messages.loading) dismiss(id);
341
+ return resolved;
342
+ } catch (error) {
343
+ triggerToast(
344
+ resolveMessage(messages.error, error) || toUserMessage(error),
345
+ sharedOptions
346
+ );
347
+ throw error;
348
+ }
349
+ },
350
+ [dismiss, showNotification, triggerToast]
351
+ );
352
+ return useMemo(
353
+ () => Object.assign(
354
+ (message, options) => triggerToast(message, options),
355
+ { dismiss, dismissAll: dismissAllNotifications, fromResult, promise }
356
+ ),
357
+ [dismiss, dismissAllNotifications, fromResult, promise, triggerToast]
358
+ );
359
+ }
360
+ var emptySubscribe = () => () => {
361
+ };
362
+ function NotificationListener() {
363
+ const { showNotification } = useNotificationActions();
364
+ useGlobalEvent(EVENT_TYPES.API_UNAUTHORIZED, (data) => {
365
+ if (data?.source && data.source !== "app") return;
366
+ showNotification(SESSION_EXPIRED_MESSAGE);
367
+ });
368
+ useGlobalEvent(
369
+ EVENT_TYPES.APP_ERROR,
370
+ (data) => {
371
+ if (!data?.notify || !data.message) return;
372
+ showNotification(data.message);
373
+ }
374
+ );
375
+ useGlobalEvent(
376
+ EVENT_TYPES.STATE_CHANGE,
377
+ (data) => {
378
+ if (!data?.notify || !data.message) return;
379
+ showNotification(data.message);
380
+ }
381
+ );
382
+ return null;
383
+ }
384
+ function useNotificationContainerModel() {
385
+ const { notifications } = useNotificationState();
386
+ const { dismissNotification } = useNotificationActions();
387
+ const isHydrated = useSyncExternalStore(
388
+ emptySubscribe,
389
+ () => true,
390
+ () => false
391
+ );
392
+ const activeEntry = useMemo(
393
+ () => getActiveNotification(notifications),
394
+ [notifications]
395
+ );
396
+ const theme = useTheme(notificationTheme);
397
+ return { dismissNotification, isHydrated, activeEntry, theme };
398
+ }
399
+
400
+ // src/modules/notification/motion.ts
401
+ var NOTIFICATION_COMPOSITOR_STYLE = Object.freeze({
402
+ WebkitBackfaceVisibility: "hidden",
403
+ WebkitFontSmoothing: "antialiased",
404
+ backfaceVisibility: "hidden",
405
+ transform: "translateZ(0)",
406
+ willChange: "transform, opacity, filter"
407
+ });
408
+ function useNotificationMotion() {
409
+ return useModuleMotion(notificationTheme);
410
+ }
411
+ function Toast({
412
+ className,
413
+ entry,
414
+ messageClassName,
415
+ onDismiss,
416
+ polite,
417
+ style
418
+ }) {
419
+ const toastMotion = useNotificationMotion();
420
+ return /* @__PURE__ */ jsx(
421
+ motion.div,
422
+ {
423
+ role: "alert",
424
+ "aria-atomic": "true",
425
+ "aria-live": polite ? "polite" : void 0,
426
+ "aria-keyshortcuts": "Escape",
427
+ tabIndex: 0,
428
+ variants: toastMotion.toast,
429
+ initial: "hidden",
430
+ animate: "visible",
431
+ exit: "exit",
432
+ transition: toastMotion.transition,
433
+ style: { ...NOTIFICATION_COMPOSITOR_STYLE, ...style },
434
+ className,
435
+ onClick: (event) => {
436
+ event.stopPropagation();
437
+ onDismiss();
438
+ },
439
+ onKeyDown: (event) => {
440
+ if (event.key !== "Escape") return;
441
+ event.preventDefault();
442
+ event.stopPropagation();
443
+ onDismiss();
444
+ },
445
+ children: /* @__PURE__ */ jsx("div", { className: messageClassName, children: entry.message })
446
+ }
447
+ );
448
+ }
449
+ function NotificationContainer() {
450
+ const { dismissNotification, isHydrated, activeEntry, theme } = useNotificationContainerModel();
451
+ if (!isHydrated) return null;
452
+ const dockElement = document.getElementById(DOCK_STACK_ELEMENT_ID);
453
+ const toast = (className, polite) => /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: activeEntry && /* @__PURE__ */ jsx(
454
+ Toast,
455
+ {
456
+ className,
457
+ entry: activeEntry,
458
+ messageClassName: theme.slots.toastMessage,
459
+ polite,
460
+ style: theme.styles.toast,
461
+ onDismiss: () => dismissNotification(activeEntry.id)
462
+ },
463
+ activeEntry.id
464
+ ) });
465
+ if (dockElement) {
466
+ return createPortal(
467
+ toast(cn(theme.slots.toast, theme.slots.toastDocked), true),
468
+ dockElement
469
+ );
470
+ }
471
+ return createPortal(
472
+ /* @__PURE__ */ jsx(
473
+ "div",
474
+ {
475
+ "aria-atomic": "true",
476
+ "aria-live": "polite",
477
+ className: theme.slots.layer,
478
+ style: theme.styles.layer,
479
+ children: toast(theme.slots.toast)
480
+ }
481
+ ),
482
+ document.body
483
+ );
484
+ }
485
+ function NotificationLayer() {
486
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
487
+ /* @__PURE__ */ jsx(NotificationListener, {}),
488
+ /* @__PURE__ */ jsx(NotificationContainer, {})
489
+ ] });
490
+ }
491
+
492
+ // src/modules/notification/module.tsx
493
+ function selectToastDuration(config) {
494
+ const notification = config.notification;
495
+ if (typeof notification === "number") return notification;
496
+ return notification?.duration ?? null;
497
+ }
498
+ function useNotificationPage(duration, page) {
499
+ const toast = useToast(duration);
500
+ return useMemo(
501
+ () => ({
502
+ set: (notification) => page.set({ notification }),
503
+ toast
504
+ }),
505
+ [page, toast]
506
+ );
507
+ }
508
+ var notificationModule = defineModule({
509
+ id: "notification",
510
+ context: NotificationContext,
511
+ Provider: NotificationProvider,
512
+ Overlay: NotificationLayer,
513
+ page: {
514
+ select: selectToastDuration,
515
+ use: useNotificationPage
516
+ }
517
+ });
518
+
519
+ export { DOCK_STACK_ELEMENT_ID, INERT_NOTIFICATION_ACTIONS, INITIAL_NOTIFICATION_STATE, NOOP_NOTIFICATION_STORE, NotificationContext, NotificationListener, NotificationProvider, SESSION_EXPIRED_MESSAGE, TOAST_DURATIONS, createNotificationEntry, createSafeAction, err, getActiveNotification, getOutcomeMessage, isErr, isNotificationDataObject, isOk, isResult, map, mapErr, match, normalizeDuration, normalizeFeedbackText, normalizeToastOptions, notificationModule, notificationTheme, ok, tryCatch, unwrap, unwrapOr, useNotification, useNotificationActions, useNotificationContainerModel, useNotificationState, useNotificationVisible, useOptionalNotificationActions, useOptionalNotificationState, useToast, withDefaultDuration };
520
+ //# sourceMappingURL=chunk-SYAVGTOX.js.map
521
+ //# sourceMappingURL=chunk-SYAVGTOX.js.map