@omerdlw/base-framework 1.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 (383) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -0
  3. package/dist/atoms/button.d.ts +11 -0
  4. package/dist/atoms/button.d.ts.map +1 -0
  5. package/dist/atoms/icon.d.ts +15 -0
  6. package/dist/atoms/icon.d.ts.map +1 -0
  7. package/dist/atoms/index.d.ts +6 -0
  8. package/dist/atoms/index.d.ts.map +1 -0
  9. package/dist/atoms/index.js +169 -0
  10. package/dist/atoms/index.js.map +1 -0
  11. package/dist/atoms/spinner.d.ts +9 -0
  12. package/dist/atoms/spinner.d.ts.map +1 -0
  13. package/dist/atoms/tooltip.d.ts +18 -0
  14. package/dist/atoms/tooltip.d.ts.map +1 -0
  15. package/dist/error/boundary.d.ts +14 -0
  16. package/dist/error/boundary.d.ts.map +1 -0
  17. package/dist/error/constants.d.ts +18 -0
  18. package/dist/error/constants.d.ts.map +1 -0
  19. package/dist/error/index.d.ts +9 -0
  20. package/dist/error/index.d.ts.map +1 -0
  21. package/dist/error/index.js +688 -0
  22. package/dist/error/index.js.map +1 -0
  23. package/dist/error/listener.d.ts +2 -0
  24. package/dist/error/listener.d.ts.map +1 -0
  25. package/dist/error/reporter.d.ts +32 -0
  26. package/dist/error/reporter.d.ts.map +1 -0
  27. package/dist/error/theme.d.ts +3 -0
  28. package/dist/error/theme.d.ts.map +1 -0
  29. package/dist/error/types.d.ts +91 -0
  30. package/dist/error/types.d.ts.map +1 -0
  31. package/dist/error/utils.d.ts +21 -0
  32. package/dist/error/utils.d.ts.map +1 -0
  33. package/dist/events.d.ts +51 -0
  34. package/dist/events.d.ts.map +1 -0
  35. package/dist/events.js +88 -0
  36. package/dist/events.js.map +1 -0
  37. package/dist/hooks/index.d.ts +17 -0
  38. package/dist/hooks/index.d.ts.map +1 -0
  39. package/dist/hooks/index.js +804 -0
  40. package/dist/hooks/index.js.map +1 -0
  41. package/dist/hooks/types.d.ts +58 -0
  42. package/dist/hooks/types.d.ts.map +1 -0
  43. package/dist/hooks/use-async-action.d.ts +3 -0
  44. package/dist/hooks/use-async-action.d.ts.map +1 -0
  45. package/dist/hooks/use-click-outside.d.ts +3 -0
  46. package/dist/hooks/use-click-outside.d.ts.map +1 -0
  47. package/dist/hooks/use-controllable-state.d.ts +3 -0
  48. package/dist/hooks/use-controllable-state.d.ts.map +1 -0
  49. package/dist/hooks/use-debounce.d.ts +2 -0
  50. package/dist/hooks/use-debounce.d.ts.map +1 -0
  51. package/dist/hooks/use-fullscreen-state.d.ts +4 -0
  52. package/dist/hooks/use-fullscreen-state.d.ts.map +1 -0
  53. package/dist/hooks/use-global-event.d.ts +7 -0
  54. package/dist/hooks/use-global-event.d.ts.map +1 -0
  55. package/dist/hooks/use-hotkey.d.ts +4 -0
  56. package/dist/hooks/use-hotkey.d.ts.map +1 -0
  57. package/dist/hooks/use-intersection-observer.d.ts +4 -0
  58. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  59. package/dist/hooks/use-isomorphic-layout-effect.d.ts +3 -0
  60. package/dist/hooks/use-isomorphic-layout-effect.d.ts.map +1 -0
  61. package/dist/hooks/use-media-query.d.ts +2 -0
  62. package/dist/hooks/use-media-query.d.ts.map +1 -0
  63. package/dist/hooks/use-mounted.d.ts +2 -0
  64. package/dist/hooks/use-mounted.d.ts.map +1 -0
  65. package/dist/hooks/use-required-context.d.ts +3 -0
  66. package/dist/hooks/use-required-context.d.ts.map +1 -0
  67. package/dist/hooks/use-server-action.d.ts +4 -0
  68. package/dist/hooks/use-server-action.d.ts.map +1 -0
  69. package/dist/hooks/use-storage-state.d.ts +5 -0
  70. package/dist/hooks/use-storage-state.d.ts.map +1 -0
  71. package/dist/hooks/use-store.d.ts +3 -0
  72. package/dist/hooks/use-store.d.ts.map +1 -0
  73. package/dist/index.d.ts +12 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +20415 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/kernel/adapters.d.ts +5 -0
  78. package/dist/kernel/adapters.d.ts.map +1 -0
  79. package/dist/kernel/compose.d.ts +15 -0
  80. package/dist/kernel/compose.d.ts.map +1 -0
  81. package/dist/kernel/constants.d.ts +12 -0
  82. package/dist/kernel/constants.d.ts.map +1 -0
  83. package/dist/kernel/context-registry.d.ts +3 -0
  84. package/dist/kernel/context-registry.d.ts.map +1 -0
  85. package/dist/kernel/handlers.d.ts +3 -0
  86. package/dist/kernel/handlers.d.ts.map +1 -0
  87. package/dist/kernel/hooks.d.ts +7 -0
  88. package/dist/kernel/hooks.d.ts.map +1 -0
  89. package/dist/kernel/index.d.ts +14 -0
  90. package/dist/kernel/index.d.ts.map +1 -0
  91. package/dist/kernel/index.js +2109 -0
  92. package/dist/kernel/index.js.map +1 -0
  93. package/dist/kernel/installed.d.ts +21 -0
  94. package/dist/kernel/installed.d.ts.map +1 -0
  95. package/dist/kernel/module.d.ts +32 -0
  96. package/dist/kernel/module.d.ts.map +1 -0
  97. package/dist/kernel/operations.d.ts +21 -0
  98. package/dist/kernel/operations.d.ts.map +1 -0
  99. package/dist/kernel/page-controller.d.ts +8 -0
  100. package/dist/kernel/page-controller.d.ts.map +1 -0
  101. package/dist/kernel/provider.d.ts +18 -0
  102. package/dist/kernel/provider.d.ts.map +1 -0
  103. package/dist/kernel/runtime.d.ts +30 -0
  104. package/dist/kernel/runtime.d.ts.map +1 -0
  105. package/dist/kernel/schema.d.ts +13 -0
  106. package/dist/kernel/schema.d.ts.map +1 -0
  107. package/dist/kernel/store.d.ts +4 -0
  108. package/dist/kernel/store.d.ts.map +1 -0
  109. package/dist/kernel/types.d.ts +233 -0
  110. package/dist/kernel/types.d.ts.map +1 -0
  111. package/dist/kernel/utils.d.ts +20 -0
  112. package/dist/kernel/utils.d.ts.map +1 -0
  113. package/dist/modules/ambient/constants.d.ts +23 -0
  114. package/dist/modules/ambient/constants.d.ts.map +1 -0
  115. package/dist/modules/ambient/context.d.ts +10 -0
  116. package/dist/modules/ambient/context.d.ts.map +1 -0
  117. package/dist/modules/ambient/index.d.ts +6 -0
  118. package/dist/modules/ambient/index.d.ts.map +1 -0
  119. package/dist/modules/ambient/index.js +896 -0
  120. package/dist/modules/ambient/index.js.map +1 -0
  121. package/dist/modules/ambient/module.d.ts +12 -0
  122. package/dist/modules/ambient/module.d.ts.map +1 -0
  123. package/dist/modules/ambient/types.d.ts +84 -0
  124. package/dist/modules/ambient/types.d.ts.map +1 -0
  125. package/dist/modules/ambient/utils.d.ts +18 -0
  126. package/dist/modules/ambient/utils.d.ts.map +1 -0
  127. package/dist/modules/background/constants.d.ts +12 -0
  128. package/dist/modules/background/constants.d.ts.map +1 -0
  129. package/dist/modules/background/context.d.ts +13 -0
  130. package/dist/modules/background/context.d.ts.map +1 -0
  131. package/dist/modules/background/hooks.d.ts +119 -0
  132. package/dist/modules/background/hooks.d.ts.map +1 -0
  133. package/dist/modules/background/index.d.ts +7 -0
  134. package/dist/modules/background/index.d.ts.map +1 -0
  135. package/dist/modules/background/index.js +3195 -0
  136. package/dist/modules/background/index.js.map +1 -0
  137. package/dist/modules/background/module.d.ts +14 -0
  138. package/dist/modules/background/module.d.ts.map +1 -0
  139. package/dist/modules/background/motion.d.ts +13 -0
  140. package/dist/modules/background/motion.d.ts.map +1 -0
  141. package/dist/modules/background/overlay.d.ts +49 -0
  142. package/dist/modules/background/overlay.d.ts.map +1 -0
  143. package/dist/modules/background/types.d.ts +153 -0
  144. package/dist/modules/background/types.d.ts.map +1 -0
  145. package/dist/modules/background/utils.d.ts +56 -0
  146. package/dist/modules/background/utils.d.ts.map +1 -0
  147. package/dist/modules/background/youtube/iframe.d.ts +52 -0
  148. package/dist/modules/background/youtube/iframe.d.ts.map +1 -0
  149. package/dist/modules/background/youtube/parse.d.ts +17 -0
  150. package/dist/modules/background/youtube/parse.d.ts.map +1 -0
  151. package/dist/modules/context-menu/constants.d.ts +8 -0
  152. package/dist/modules/context-menu/constants.d.ts.map +1 -0
  153. package/dist/modules/context-menu/context.d.ts +16 -0
  154. package/dist/modules/context-menu/context.d.ts.map +1 -0
  155. package/dist/modules/context-menu/hooks.d.ts +31 -0
  156. package/dist/modules/context-menu/hooks.d.ts.map +1 -0
  157. package/dist/modules/context-menu/index.d.ts +6 -0
  158. package/dist/modules/context-menu/index.d.ts.map +1 -0
  159. package/dist/modules/context-menu/index.js +2008 -0
  160. package/dist/modules/context-menu/index.js.map +1 -0
  161. package/dist/modules/context-menu/module.d.ts +12 -0
  162. package/dist/modules/context-menu/module.d.ts.map +1 -0
  163. package/dist/modules/context-menu/motion.d.ts +9 -0
  164. package/dist/modules/context-menu/motion.d.ts.map +1 -0
  165. package/dist/modules/context-menu/overlay.d.ts +15 -0
  166. package/dist/modules/context-menu/overlay.d.ts.map +1 -0
  167. package/dist/modules/context-menu/resolver.d.ts +7 -0
  168. package/dist/modules/context-menu/resolver.d.ts.map +1 -0
  169. package/dist/modules/context-menu/state.d.ts +4 -0
  170. package/dist/modules/context-menu/state.d.ts.map +1 -0
  171. package/dist/modules/context-menu/types.d.ts +171 -0
  172. package/dist/modules/context-menu/types.d.ts.map +1 -0
  173. package/dist/modules/context-menu/utils.d.ts +16 -0
  174. package/dist/modules/context-menu/utils.d.ts.map +1 -0
  175. package/dist/modules/controls/constants.d.ts +7 -0
  176. package/dist/modules/controls/constants.d.ts.map +1 -0
  177. package/dist/modules/controls/hooks.d.ts +15 -0
  178. package/dist/modules/controls/hooks.d.ts.map +1 -0
  179. package/dist/modules/controls/index.d.ts +6 -0
  180. package/dist/modules/controls/index.d.ts.map +1 -0
  181. package/dist/modules/controls/index.js +1242 -0
  182. package/dist/modules/controls/index.js.map +1 -0
  183. package/dist/modules/controls/module.d.ts +12 -0
  184. package/dist/modules/controls/module.d.ts.map +1 -0
  185. package/dist/modules/controls/overlay.d.ts +2 -0
  186. package/dist/modules/controls/overlay.d.ts.map +1 -0
  187. package/dist/modules/controls/types.d.ts +86 -0
  188. package/dist/modules/controls/types.d.ts.map +1 -0
  189. package/dist/modules/controls/utils.d.ts +9 -0
  190. package/dist/modules/controls/utils.d.ts.map +1 -0
  191. package/dist/modules/dock/cards.d.ts +1035 -0
  192. package/dist/modules/dock/cards.d.ts.map +1 -0
  193. package/dist/modules/dock/constants.d.ts +157 -0
  194. package/dist/modules/dock/constants.d.ts.map +1 -0
  195. package/dist/modules/dock/context.d.ts +26 -0
  196. package/dist/modules/dock/context.d.ts.map +1 -0
  197. package/dist/modules/dock/hooks.d.ts +957 -0
  198. package/dist/modules/dock/hooks.d.ts.map +1 -0
  199. package/dist/modules/dock/hud.d.ts +43 -0
  200. package/dist/modules/dock/hud.d.ts.map +1 -0
  201. package/dist/modules/dock/index.d.ts +27 -0
  202. package/dist/modules/dock/index.d.ts.map +1 -0
  203. package/dist/modules/dock/index.js +12111 -0
  204. package/dist/modules/dock/index.js.map +1 -0
  205. package/dist/modules/dock/module.d.ts +71 -0
  206. package/dist/modules/dock/module.d.ts.map +1 -0
  207. package/dist/modules/dock/motion.d.ts +986 -0
  208. package/dist/modules/dock/motion.d.ts.map +1 -0
  209. package/dist/modules/dock/overlay.d.ts +79 -0
  210. package/dist/modules/dock/overlay.d.ts.map +1 -0
  211. package/dist/modules/dock/provider.d.ts +3 -0
  212. package/dist/modules/dock/provider.d.ts.map +1 -0
  213. package/dist/modules/dock/routing/breadcrumbs.d.ts +43 -0
  214. package/dist/modules/dock/routing/breadcrumbs.d.ts.map +1 -0
  215. package/dist/modules/dock/routing/continuity.d.ts +19 -0
  216. package/dist/modules/dock/routing/continuity.d.ts.map +1 -0
  217. package/dist/modules/dock/routing/guards.d.ts +21 -0
  218. package/dist/modules/dock/routing/guards.d.ts.map +1 -0
  219. package/dist/modules/dock/routing/navigation.d.ts +37 -0
  220. package/dist/modules/dock/routing/navigation.d.ts.map +1 -0
  221. package/dist/modules/dock/routing/transactions.d.ts +21 -0
  222. package/dist/modules/dock/routing/transactions.d.ts.map +1 -0
  223. package/dist/modules/dock/runtime/commands.d.ts +18 -0
  224. package/dist/modules/dock/runtime/commands.d.ts.map +1 -0
  225. package/dist/modules/dock/runtime/display.d.ts +36 -0
  226. package/dist/modules/dock/runtime/display.d.ts.map +1 -0
  227. package/dist/modules/dock/runtime/dock.d.ts +123 -0
  228. package/dist/modules/dock/runtime/dock.d.ts.map +1 -0
  229. package/dist/modules/dock/state.d.ts +22 -0
  230. package/dist/modules/dock/state.d.ts.map +1 -0
  231. package/dist/modules/dock/status/events.d.ts +37 -0
  232. package/dist/modules/dock/status/events.d.ts.map +1 -0
  233. package/dist/modules/dock/status/hooks.d.ts +6 -0
  234. package/dist/modules/dock/status/hooks.d.ts.map +1 -0
  235. package/dist/modules/dock/status/model.d.ts +65 -0
  236. package/dist/modules/dock/status/model.d.ts.map +1 -0
  237. package/dist/modules/dock/surface/context.d.ts +43 -0
  238. package/dist/modules/dock/surface/context.d.ts.map +1 -0
  239. package/dist/modules/dock/surface/definition.d.ts +38 -0
  240. package/dist/modules/dock/surface/definition.d.ts.map +1 -0
  241. package/dist/modules/dock/surface/hooks.d.ts +123 -0
  242. package/dist/modules/dock/surface/hooks.d.ts.map +1 -0
  243. package/dist/modules/dock/surface/machine.d.ts +75 -0
  244. package/dist/modules/dock/surface/machine.d.ts.map +1 -0
  245. package/dist/modules/dock/surface/stack.d.ts +38 -0
  246. package/dist/modules/dock/surface/stack.d.ts.map +1 -0
  247. package/dist/modules/dock/surface/view-model.d.ts +3 -0
  248. package/dist/modules/dock/surface/view-model.d.ts.map +1 -0
  249. package/dist/modules/dock/types.d.ts +1158 -0
  250. package/dist/modules/dock/types.d.ts.map +1 -0
  251. package/dist/modules/dock/utils.d.ts +93 -0
  252. package/dist/modules/dock/utils.d.ts.map +1 -0
  253. package/dist/modules/index.d.ts +12 -0
  254. package/dist/modules/index.d.ts.map +1 -0
  255. package/dist/modules/index.js +18020 -0
  256. package/dist/modules/index.js.map +1 -0
  257. package/dist/modules/loading/constants.d.ts +5 -0
  258. package/dist/modules/loading/constants.d.ts.map +1 -0
  259. package/dist/modules/loading/context.d.ts +13 -0
  260. package/dist/modules/loading/context.d.ts.map +1 -0
  261. package/dist/modules/loading/hooks.d.ts +6 -0
  262. package/dist/modules/loading/hooks.d.ts.map +1 -0
  263. package/dist/modules/loading/index.d.ts +7 -0
  264. package/dist/modules/loading/index.d.ts.map +1 -0
  265. package/dist/modules/loading/index.js +1256 -0
  266. package/dist/modules/loading/index.js.map +1 -0
  267. package/dist/modules/loading/module.d.ts +14 -0
  268. package/dist/modules/loading/module.d.ts.map +1 -0
  269. package/dist/modules/loading/overlay.d.ts +2 -0
  270. package/dist/modules/loading/overlay.d.ts.map +1 -0
  271. package/dist/modules/loading/types.d.ts +47 -0
  272. package/dist/modules/loading/types.d.ts.map +1 -0
  273. package/dist/modules/loading/utils.d.ts +4 -0
  274. package/dist/modules/loading/utils.d.ts.map +1 -0
  275. package/dist/modules/media/constants.d.ts +7 -0
  276. package/dist/modules/media/constants.d.ts.map +1 -0
  277. package/dist/modules/media/context.d.ts +6 -0
  278. package/dist/modules/media/context.d.ts.map +1 -0
  279. package/dist/modules/media/hooks.d.ts +3 -0
  280. package/dist/modules/media/hooks.d.ts.map +1 -0
  281. package/dist/modules/media/index.d.ts +8 -0
  282. package/dist/modules/media/index.d.ts.map +1 -0
  283. package/dist/modules/media/index.js +728 -0
  284. package/dist/modules/media/index.js.map +1 -0
  285. package/dist/modules/media/module.d.ts +11 -0
  286. package/dist/modules/media/module.d.ts.map +1 -0
  287. package/dist/modules/media/overlay.d.ts +9 -0
  288. package/dist/modules/media/overlay.d.ts.map +1 -0
  289. package/dist/modules/media/types.d.ts +77 -0
  290. package/dist/modules/media/types.d.ts.map +1 -0
  291. package/dist/modules/media/utils.d.ts +17 -0
  292. package/dist/modules/media/utils.d.ts.map +1 -0
  293. package/dist/modules/modal/constants.d.ts +20 -0
  294. package/dist/modules/modal/constants.d.ts.map +1 -0
  295. package/dist/modules/modal/context.d.ts +20 -0
  296. package/dist/modules/modal/context.d.ts.map +1 -0
  297. package/dist/modules/modal/hooks.d.ts +41 -0
  298. package/dist/modules/modal/hooks.d.ts.map +1 -0
  299. package/dist/modules/modal/index.d.ts +7 -0
  300. package/dist/modules/modal/index.d.ts.map +1 -0
  301. package/dist/modules/modal/index.js +2672 -0
  302. package/dist/modules/modal/index.js.map +1 -0
  303. package/dist/modules/modal/module.d.ts +12 -0
  304. package/dist/modules/modal/module.d.ts.map +1 -0
  305. package/dist/modules/modal/motion.d.ts +16 -0
  306. package/dist/modules/modal/motion.d.ts.map +1 -0
  307. package/dist/modules/modal/overlay.d.ts +4 -0
  308. package/dist/modules/modal/overlay.d.ts.map +1 -0
  309. package/dist/modules/modal/state.d.ts +4 -0
  310. package/dist/modules/modal/state.d.ts.map +1 -0
  311. package/dist/modules/modal/types.d.ts +109 -0
  312. package/dist/modules/modal/types.d.ts.map +1 -0
  313. package/dist/modules/modal/utils.d.ts +31 -0
  314. package/dist/modules/modal/utils.d.ts.map +1 -0
  315. package/dist/modules/notification/constants.d.ts +9 -0
  316. package/dist/modules/notification/constants.d.ts.map +1 -0
  317. package/dist/modules/notification/context.d.ts +7 -0
  318. package/dist/modules/notification/context.d.ts.map +1 -0
  319. package/dist/modules/notification/hooks.d.ts +10 -0
  320. package/dist/modules/notification/hooks.d.ts.map +1 -0
  321. package/dist/modules/notification/index.d.ts +7 -0
  322. package/dist/modules/notification/index.d.ts.map +1 -0
  323. package/dist/modules/notification/index.js +905 -0
  324. package/dist/modules/notification/index.js.map +1 -0
  325. package/dist/modules/notification/module.d.ts +11 -0
  326. package/dist/modules/notification/module.d.ts.map +1 -0
  327. package/dist/modules/notification/motion.d.ts +15 -0
  328. package/dist/modules/notification/motion.d.ts.map +1 -0
  329. package/dist/modules/notification/overlay.d.ts +3 -0
  330. package/dist/modules/notification/overlay.d.ts.map +1 -0
  331. package/dist/modules/notification/types.d.ts +57 -0
  332. package/dist/modules/notification/types.d.ts.map +1 -0
  333. package/dist/modules/notification/utils.d.ts +9 -0
  334. package/dist/modules/notification/utils.d.ts.map +1 -0
  335. package/dist/modules/theme.d.ts +3 -0
  336. package/dist/modules/theme.d.ts.map +1 -0
  337. package/dist/provider.d.ts +23 -0
  338. package/dist/provider.d.ts.map +1 -0
  339. package/dist/provider.js +1973 -0
  340. package/dist/provider.js.map +1 -0
  341. package/dist/result.d.ts +50 -0
  342. package/dist/result.d.ts.map +1 -0
  343. package/dist/result.js +163 -0
  344. package/dist/result.js.map +1 -0
  345. package/dist/theme.d.ts +25 -0
  346. package/dist/theme.d.ts.map +1 -0
  347. package/dist/theme.js +44 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens/index.d.ts +3 -0
  350. package/dist/tokens/index.d.ts.map +1 -0
  351. package/dist/tokens/index.js +325 -0
  352. package/dist/tokens/index.js.map +1 -0
  353. package/dist/tokens/motion.d.ts +315 -0
  354. package/dist/tokens/motion.d.ts.map +1 -0
  355. package/dist/tokens/tokens.d.ts +34 -0
  356. package/dist/tokens/tokens.d.ts.map +1 -0
  357. package/dist/utils/cn.d.ts +3 -0
  358. package/dist/utils/cn.d.ts.map +1 -0
  359. package/dist/utils/dom.d.ts +5 -0
  360. package/dist/utils/dom.d.ts.map +1 -0
  361. package/dist/utils/index.d.ts +16 -0
  362. package/dist/utils/index.d.ts.map +1 -0
  363. package/dist/utils/index.js +485 -0
  364. package/dist/utils/index.js.map +1 -0
  365. package/dist/utils/json.d.ts +3 -0
  366. package/dist/utils/json.d.ts.map +1 -0
  367. package/dist/utils/number.d.ts +4 -0
  368. package/dist/utils/number.d.ts.map +1 -0
  369. package/dist/utils/object.d.ts +7 -0
  370. package/dist/utils/object.d.ts.map +1 -0
  371. package/dist/utils/report.d.ts +5 -0
  372. package/dist/utils/report.d.ts.map +1 -0
  373. package/dist/utils/scheduler.d.ts +34 -0
  374. package/dist/utils/scheduler.d.ts.map +1 -0
  375. package/dist/utils/store.d.ts +11 -0
  376. package/dist/utils/store.d.ts.map +1 -0
  377. package/dist/utils/string.d.ts +8 -0
  378. package/dist/utils/string.d.ts.map +1 -0
  379. package/dist/utils/timing.d.ts +8 -0
  380. package/dist/utils/timing.d.ts.map +1 -0
  381. package/dist/utils/user-message.d.ts +20 -0
  382. package/dist/utils/user-message.d.ts.map +1 -0
  383. package/package.json +113 -0
@@ -0,0 +1,896 @@
1
+ "use client";
2
+ import { createContext, useState, useMemo, useEffect, use, useContext, useRef, useCallback, useSyncExternalStore } from 'react';
3
+ import 'clsx';
4
+ import 'tailwind-merge';
5
+ import { jsx } from 'react/jsx-runtime';
6
+ import 'next/navigation';
7
+
8
+ function getOrCreateGlobalContext(name, defaultValue) {
9
+ const sym = /* @__PURE__ */ Symbol.for(`@omerdlw/base-framework/context/${name}`);
10
+ const store = globalThis;
11
+ if (!store[sym]) {
12
+ store[sym] = createContext(defaultValue);
13
+ }
14
+ return store[sym];
15
+ }
16
+
17
+ // src/theme.tsx
18
+ function defineThemeSpec(id) {
19
+ return Object.freeze({ id });
20
+ }
21
+ var EMPTY = /* @__PURE__ */ new Map();
22
+ var ThemeContext = getOrCreateGlobalContext("ThemeContext", EMPTY);
23
+ function useTheme(spec) {
24
+ const config = useContext(ThemeContext).get(spec.id);
25
+ if (!config) {
26
+ throw new Error(
27
+ `Theme "${spec.id}" is missing. Add its theme file to src/config/ and list it in src/config/index.ts.`
28
+ );
29
+ }
30
+ return {
31
+ slots: config.slots,
32
+ styles: config.styles ?? {}
33
+ };
34
+ }
35
+
36
+ // src/modules/ambient/constants.ts
37
+ var AMBIENT_CSS_VARS = Object.freeze({
38
+ ambientGlow: "--color-ambient-glow",
39
+ colorPrimary: "--color-primary",
40
+ primary: "--primary",
41
+ black: "--black",
42
+ white: "--white"
43
+ });
44
+ var AMBIENT_DEFAULTS = Object.freeze({
45
+ primary: "#101010",
46
+ black: "#0b0b0b"
47
+ });
48
+ var COLOR_EXTRACT_CONFIG = Object.freeze({
49
+ blackChromaFactor: 0.35,
50
+ primaryLightness: 0.74,
51
+ maxBlackChroma: 0.055,
52
+ blackLightness: 0.15,
53
+ cacheLimit: 100,
54
+ maxChroma: 0.28,
55
+ minChroma: 0.03,
56
+ sampleSize: 32
57
+ });
58
+ var ambientTheme = defineThemeSpec("ambient");
59
+
60
+ // src/modules/ambient/utils.ts
61
+ function srgbToLinear(c) {
62
+ const v = c / 255;
63
+ return v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
64
+ }
65
+ function rgbToOklch(r, g, b) {
66
+ const lr = srgbToLinear(r);
67
+ const lg = srgbToLinear(g);
68
+ const lb = srgbToLinear(b);
69
+ const l = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;
70
+ const m = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;
71
+ const s = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;
72
+ const l_ = Math.cbrt(l);
73
+ const m_ = Math.cbrt(m);
74
+ const s_ = Math.cbrt(s);
75
+ const L = 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_;
76
+ const a = 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_;
77
+ const bOklab = 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_;
78
+ const C = Math.sqrt(a * a + bOklab * bOklab);
79
+ const H = (Math.atan2(bOklab, a) * (180 / Math.PI) + 360) % 360;
80
+ return {
81
+ c: Math.max(0, Number(C.toFixed(3))),
82
+ h: Math.max(0, Number(H.toFixed(1))),
83
+ l: Math.max(0, Math.min(1, Number(L.toFixed(3))))
84
+ };
85
+ }
86
+ function oklchToString(l, c, h, alpha = 1) {
87
+ const safeL = Math.max(0, Math.min(1, Number(l) || 0)).toFixed(3);
88
+ const safeC = Math.max(0, Number(c) || 0).toFixed(3);
89
+ const safeH = (Number(h) || 0).toFixed(1);
90
+ const numericAlpha = Number(alpha);
91
+ if (Number.isFinite(numericAlpha) && numericAlpha < 1 && numericAlpha >= 0) {
92
+ return `oklch(${safeL} ${safeC} ${safeH} / ${numericAlpha})`;
93
+ }
94
+ return `oklch(${safeL} ${safeC} ${safeH})`;
95
+ }
96
+ function sampleImageData(imageData) {
97
+ const data = imageData.data;
98
+ const len = data.length;
99
+ const numBins = 24;
100
+ const binAngle = 360 / numBins;
101
+ const bins = Array.from({ length: numBins }, () => ({
102
+ count: 0,
103
+ sumC: 0,
104
+ sumCos: 0,
105
+ sumL: 0,
106
+ sumSin: 0
107
+ }));
108
+ let neutralCount = 0;
109
+ let neutralSumL = 0;
110
+ let chromaticCount = 0;
111
+ for (let i = 0; i < len; i += 4) {
112
+ const alpha = data[i + 3];
113
+ if (alpha < 128) continue;
114
+ const r = data[i];
115
+ const g = data[i + 1];
116
+ const b = data[i + 2];
117
+ const oklch = rgbToOklch(r, g, b);
118
+ if (oklch.l < 0.04 || oklch.l > 0.96 || oklch.c < 0.02) {
119
+ neutralCount++;
120
+ neutralSumL += oklch.l;
121
+ continue;
122
+ }
123
+ const binIndex = Math.floor(oklch.h / binAngle) % numBins;
124
+ const rad = oklch.h * (Math.PI / 180);
125
+ const bin = bins[binIndex];
126
+ bin.count++;
127
+ bin.sumL += oklch.l;
128
+ bin.sumC += oklch.c;
129
+ bin.sumCos += Math.cos(rad);
130
+ bin.sumSin += Math.sin(rad);
131
+ chromaticCount++;
132
+ }
133
+ if (chromaticCount === 0) {
134
+ const avgL2 = neutralCount > 0 ? neutralSumL / neutralCount : 0.55;
135
+ return { c: 0.03, h: 252, l: avgL2 };
136
+ }
137
+ let bestIndex = 0;
138
+ let maxWindowCount = -1;
139
+ for (let i = 0; i < numBins; i++) {
140
+ const prev2 = bins[(i - 1 + numBins) % numBins];
141
+ const curr2 = bins[i];
142
+ const next2 = bins[(i + 1) % numBins];
143
+ const windowCount = prev2.count * 0.5 + curr2.count + next2.count * 0.5;
144
+ if (windowCount > maxWindowCount) {
145
+ maxWindowCount = windowCount;
146
+ bestIndex = i;
147
+ }
148
+ }
149
+ const prev = bins[(bestIndex - 1 + numBins) % numBins];
150
+ const curr = bins[bestIndex];
151
+ const next = bins[(bestIndex + 1) % numBins];
152
+ const totalCount = prev.count + curr.count + next.count;
153
+ if (totalCount === 0) {
154
+ return { c: 0.19, h: 252, l: 0.55 };
155
+ }
156
+ const avgL = (prev.sumL + curr.sumL + next.sumL) / totalCount;
157
+ const avgC = (prev.sumC + curr.sumC + next.sumC) / totalCount;
158
+ const avgSin = prev.sumSin + curr.sumSin + next.sumSin;
159
+ const avgCos = prev.sumCos + curr.sumCos + next.sumCos;
160
+ const avgH = (Math.atan2(avgSin, avgCos) * (180 / Math.PI) + 360) % 360;
161
+ return {
162
+ c: Number(avgC.toFixed(3)),
163
+ h: Number(avgH.toFixed(1)),
164
+ l: Number(avgL.toFixed(3))
165
+ };
166
+ }
167
+ function createDefaultPalette(fallback) {
168
+ return {
169
+ black: fallback?.black || AMBIENT_DEFAULTS.black,
170
+ primary: fallback?.primary || AMBIENT_DEFAULTS.primary
171
+ };
172
+ }
173
+ function derivePalette(sampled) {
174
+ const {
175
+ blackChromaFactor,
176
+ blackLightness,
177
+ maxBlackChroma,
178
+ maxChroma,
179
+ minChroma,
180
+ primaryLightness
181
+ } = COLOR_EXTRACT_CONFIG;
182
+ const chroma = Math.max(minChroma, Math.min(maxChroma, sampled.c));
183
+ const blackChroma = Math.min(
184
+ maxBlackChroma,
185
+ Math.max(0.025, chroma * blackChromaFactor)
186
+ );
187
+ const primaryChroma = Math.max(
188
+ 0.15,
189
+ Math.min(0.24, Math.max(chroma * 1.15, 0.18))
190
+ );
191
+ return {
192
+ black: oklchToString(blackLightness, blackChroma, sampled.h),
193
+ primary: oklchToString(primaryLightness, primaryChroma, sampled.h)
194
+ };
195
+ }
196
+ var paletteCache = /* @__PURE__ */ new Map();
197
+ var inFlight = /* @__PURE__ */ new Map();
198
+ async function fetchObjectUrl(src) {
199
+ if (typeof fetch !== "function" || !src.startsWith("http")) return null;
200
+ const corsUrl = src.includes("cors=") ? src : `${src}${src.includes("?") ? "&" : "?"}cors=1`;
201
+ const attempts = [
202
+ [corsUrl, { mode: "cors" }],
203
+ [`/api/ambient/proxy?url=${encodeURIComponent(src)}`]
204
+ ];
205
+ for (const [url, init] of attempts) {
206
+ try {
207
+ const response = await fetch(url, init);
208
+ if (response.ok) return URL.createObjectURL(await response.blob());
209
+ } catch {
210
+ }
211
+ }
212
+ return null;
213
+ }
214
+ function loadImage(url, crossOrigin) {
215
+ return new Promise((resolve) => {
216
+ const image = new Image();
217
+ if (crossOrigin) image.crossOrigin = "anonymous";
218
+ image.onload = () => resolve(image);
219
+ image.onerror = () => resolve(null);
220
+ image.src = url;
221
+ });
222
+ }
223
+ function readPalette(image) {
224
+ const size = COLOR_EXTRACT_CONFIG.sampleSize;
225
+ const canvas = document.createElement("canvas");
226
+ canvas.width = size;
227
+ canvas.height = size;
228
+ const context = canvas.getContext("2d", { willReadFrequently: true });
229
+ if (!context) return null;
230
+ context.drawImage(image, 0, 0, size, size);
231
+ return derivePalette(sampleImageData(context.getImageData(0, 0, size, size)));
232
+ }
233
+ async function extractPalette(src) {
234
+ const objectUrl = await fetchObjectUrl(src);
235
+ try {
236
+ const image = await loadImage(objectUrl ?? src, !objectUrl);
237
+ return image ? readPalette(image) : null;
238
+ } catch {
239
+ return null;
240
+ } finally {
241
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
242
+ }
243
+ }
244
+ function cachePalette(src, palette) {
245
+ if (paletteCache.size >= COLOR_EXTRACT_CONFIG.cacheLimit) {
246
+ const oldest = paletteCache.keys().next().value;
247
+ if (oldest) paletteCache.delete(oldest);
248
+ }
249
+ paletteCache.set(src, palette);
250
+ }
251
+ async function extractPaletteFromImage(imageSource, options = {}) {
252
+ const fallback = createDefaultPalette(
253
+ options.initialPalette || options.fallbackPalette
254
+ );
255
+ const src = typeof imageSource === "string" ? imageSource : imageSource?.src;
256
+ if (!src || typeof window === "undefined") return fallback;
257
+ const cached = paletteCache.get(src);
258
+ if (cached) return cached;
259
+ let pending = inFlight.get(src);
260
+ if (!pending) {
261
+ pending = extractPalette(src).then((palette) => {
262
+ if (palette) cachePalette(src, palette);
263
+ return palette;
264
+ }).finally(() => inFlight.delete(src));
265
+ inFlight.set(src, pending);
266
+ }
267
+ return await pending ?? fallback;
268
+ }
269
+ function resolveTargetElement(target) {
270
+ if (typeof document === "undefined") return null;
271
+ if (!target) return document.documentElement;
272
+ if (typeof target === "string") {
273
+ return document.querySelector(target);
274
+ }
275
+ return "current" in target ? target.current : target;
276
+ }
277
+ function normalizeColorMap(colors) {
278
+ const cssVars = AMBIENT_CSS_VARS;
279
+ const result = {};
280
+ for (const [key, value] of Object.entries(colors)) {
281
+ if (!value) continue;
282
+ const name = cssVars[key] || (key.startsWith("--") ? key : cssVars[key.toLowerCase()] || `--color-${key}`);
283
+ result[name] = value;
284
+ }
285
+ return result;
286
+ }
287
+ function applyScopedCssVariables(element, varMap) {
288
+ const previous = /* @__PURE__ */ new Map();
289
+ for (const [name, value] of Object.entries(varMap)) {
290
+ if (!name || !value) continue;
291
+ previous.set(name, {
292
+ priority: element.style.getPropertyPriority(name),
293
+ value: element.style.getPropertyValue(name)
294
+ });
295
+ element.style.setProperty(name, value);
296
+ }
297
+ return () => {
298
+ for (const [name, { priority, value }] of previous) {
299
+ if (value) element.style.setProperty(name, value, priority);
300
+ else element.style.removeProperty(name);
301
+ }
302
+ };
303
+ }
304
+ function resolveAmbientVarMap({
305
+ colors = null,
306
+ extractedBlack = "",
307
+ extractedPrimary = "",
308
+ image = null,
309
+ tintGlobals = true
310
+ }) {
311
+ const varMap = {};
312
+ if (image) {
313
+ if (extractedPrimary) {
314
+ varMap[AMBIENT_CSS_VARS.primary] = extractedPrimary;
315
+ varMap[AMBIENT_CSS_VARS.ambientGlow] = extractedPrimary;
316
+ if (tintGlobals) varMap[AMBIENT_CSS_VARS.colorPrimary] = extractedPrimary;
317
+ }
318
+ if (extractedBlack) varMap[AMBIENT_CSS_VARS.black] = extractedBlack;
319
+ }
320
+ if (colors) Object.assign(varMap, normalizeColorMap(colors));
321
+ return varMap;
322
+ }
323
+ function resolvePageAmbientTheme(slice, posterUrl) {
324
+ const ambient = slice?.ambient;
325
+ const banner = slice?.banner ?? null;
326
+ const defaultImage = banner ?? posterUrl;
327
+ if (ambient === false) return null;
328
+ if (ambient === true || typeof ambient === "string") {
329
+ return {
330
+ image: typeof ambient === "string" ? ambient : defaultImage,
331
+ tintGlobals: true
332
+ };
333
+ }
334
+ if (ambient && typeof ambient === "object") {
335
+ return { image: ambient.image ?? defaultImage, ...ambient };
336
+ }
337
+ if (banner && !posterUrl) return { image: banner, tintGlobals: true };
338
+ return null;
339
+ }
340
+
341
+ // src/kernel/constants.ts
342
+ var REGISTRY_SOURCES = Object.freeze({
343
+ STATIC: "static",
344
+ DYNAMIC: "dynamic",
345
+ USER: "user"
346
+ });
347
+ var REGISTRY_LIFECYCLES = Object.freeze({
348
+ IMMEDIATE: "immediate",
349
+ GRACEFUL: "graceful",
350
+ PERSISTENT: "persistent",
351
+ ROUTE: "route"
352
+ });
353
+ var REGISTRY_METADATA_KEYS = Object.freeze([
354
+ "cleanup",
355
+ "cleanupDelayMs",
356
+ "instanceId",
357
+ "lifecycle",
358
+ "priority",
359
+ "source",
360
+ "scope",
361
+ "validation"
362
+ ]);
363
+ Object.freeze({
364
+ [REGISTRY_SOURCES.STATIC]: 100,
365
+ [REGISTRY_SOURCES.DYNAMIC]: 200,
366
+ [REGISTRY_SOURCES.USER]: 300
367
+ });
368
+ Object.freeze({
369
+ [REGISTRY_SOURCES.STATIC]: 10,
370
+ [REGISTRY_SOURCES.DYNAMIC]: 20,
371
+ [REGISTRY_SOURCES.USER]: 30
372
+ });
373
+ new Set(
374
+ Object.values(REGISTRY_LIFECYCLES)
375
+ );
376
+ new Set(
377
+ REGISTRY_METADATA_KEYS
378
+ );
379
+ var REGISTRY_SCOPE_KINDS = Object.freeze({
380
+ APP: "app",
381
+ SESSION: "session",
382
+ ROUTE: "route",
383
+ INSTANCE: "instance",
384
+ WORKSPACE: "workspace"
385
+ });
386
+ REGISTRY_SCOPE_KINDS.APP;
387
+
388
+ // src/utils/object.ts
389
+ function shallowEqual(a, b) {
390
+ if (Object.is(a, b)) return true;
391
+ if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
392
+ return false;
393
+ }
394
+ const keysA = Object.keys(a);
395
+ const keysB = Object.keys(b);
396
+ if (keysA.length !== keysB.length) return false;
397
+ for (const key of keysA) {
398
+ if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(
399
+ a[key],
400
+ b[key]
401
+ )) {
402
+ return false;
403
+ }
404
+ }
405
+ return true;
406
+ }
407
+ function report(scope, error, level = "error") {
408
+ if (process.env.NODE_ENV === "production" && typeof window !== "undefined") {
409
+ return;
410
+ }
411
+ console[level](`[${scope}]`, error);
412
+ }
413
+
414
+ // src/utils/store.ts
415
+ function freezeStoreSnapshot(state) {
416
+ if (process.env.NODE_ENV === "production" || !state || typeof state !== "object") {
417
+ return state;
418
+ }
419
+ const seen = /* @__PURE__ */ new WeakSet();
420
+ const freeze = (value) => {
421
+ if (seen.has(value) || Object.isFrozen(value)) return;
422
+ seen.add(value);
423
+ const prototype = Object.getPrototypeOf(value);
424
+ if (Array.isArray(value) || prototype === Object.prototype || prototype === null) {
425
+ for (const key of Reflect.ownKeys(value)) {
426
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
427
+ if (descriptor && "value" in descriptor && descriptor.value !== null) {
428
+ if (typeof descriptor.value === "object") freeze(descriptor.value);
429
+ }
430
+ }
431
+ }
432
+ Object.freeze(value);
433
+ };
434
+ freeze(state);
435
+ return state;
436
+ }
437
+ function createStore(initialState, { freezeSnapshots = true } = {}) {
438
+ const listeners = /* @__PURE__ */ new Set();
439
+ const prepare = freezeSnapshots ? freezeStoreSnapshot : (state) => state;
440
+ let snapshot = prepare(initialState);
441
+ const publish = (nextStateOrUpdater) => {
442
+ const nextState = typeof nextStateOrUpdater === "function" ? nextStateOrUpdater(snapshot) : nextStateOrUpdater;
443
+ if (Object.is(snapshot, nextState)) return false;
444
+ snapshot = prepare(nextState);
445
+ for (const listener of listeners) {
446
+ try {
447
+ listener();
448
+ } catch (error) {
449
+ report("CoreStore subscriber", error, "warn");
450
+ }
451
+ }
452
+ return true;
453
+ };
454
+ const setState = (updater) => {
455
+ if (typeof updater === "function") {
456
+ return publish(updater);
457
+ }
458
+ if (snapshot && typeof snapshot === "object" && updater && typeof updater === "object") {
459
+ return publish({ ...snapshot, ...updater });
460
+ }
461
+ return publish(updater);
462
+ };
463
+ return Object.freeze({
464
+ getSnapshot() {
465
+ return snapshot;
466
+ },
467
+ publish,
468
+ setState,
469
+ subscribe(listener) {
470
+ if (typeof listener !== "function") return () => {
471
+ };
472
+ listeners.add(listener);
473
+ return () => listeners.delete(listener);
474
+ }
475
+ });
476
+ }
477
+ function useRequiredContext(context, hookName, providerName) {
478
+ const value = use(context);
479
+ if (value === null) {
480
+ throw new Error(`${hookName} must be used within ${providerName}`);
481
+ }
482
+ return value;
483
+ }
484
+ function useStore(store, selector = (state) => state, isEqual = Object.is) {
485
+ const cacheRef = useRef({
486
+ isEqual: null,
487
+ selected: void 0,
488
+ selector: null,
489
+ snapshot: null
490
+ });
491
+ const getSelectedSnapshot = useCallback(() => {
492
+ const snapshot = store.getSnapshot();
493
+ const cache = cacheRef.current;
494
+ if (cache.snapshot === snapshot && cache.selector === selector && cache.isEqual === isEqual) {
495
+ return cache.selected;
496
+ }
497
+ const selected = selector(snapshot);
498
+ if (cache.snapshot !== null && cache.isEqual === isEqual && isEqual(cache.selected, selected)) {
499
+ cache.snapshot = snapshot;
500
+ cache.selector = selector;
501
+ return cache.selected;
502
+ }
503
+ cacheRef.current = {
504
+ isEqual,
505
+ selected,
506
+ selector,
507
+ snapshot
508
+ };
509
+ return selected;
510
+ }, [isEqual, selector, store]);
511
+ return useSyncExternalStore(
512
+ store.subscribe,
513
+ getSelectedSnapshot,
514
+ getSelectedSnapshot
515
+ );
516
+ }
517
+ var EventEmitter = class {
518
+ events = /* @__PURE__ */ new Map();
519
+ debounceTimers = /* @__PURE__ */ new Map();
520
+ subscribe(event, callback) {
521
+ if (typeof event !== "string" || !event || typeof callback !== "function") {
522
+ return () => {
523
+ };
524
+ }
525
+ const listeners = this.events.get(event) || /* @__PURE__ */ new Set();
526
+ listeners.add(callback);
527
+ this.events.set(event, listeners);
528
+ return () => {
529
+ listeners.delete(callback);
530
+ if (listeners.size === 0) this.events.delete(event);
531
+ };
532
+ }
533
+ emit(event, payload) {
534
+ const listeners = this.events.get(event);
535
+ if (!listeners || listeners.size === 0) return;
536
+ const snapshot = Array.from(listeners);
537
+ for (const callback of snapshot) {
538
+ try {
539
+ callback(payload);
540
+ } catch (error) {
541
+ report(`Event listener (${String(event)})`, error);
542
+ }
543
+ }
544
+ }
545
+ emitDebounced(event, payload, waitMs = 100) {
546
+ const existing = this.debounceTimers.get(event);
547
+ if (existing) clearTimeout(existing);
548
+ const timer = setTimeout(() => {
549
+ this.debounceTimers.delete(event);
550
+ this.emit(event, payload);
551
+ }, waitMs);
552
+ this.debounceTimers.set(event, timer);
553
+ }
554
+ cancelDebounced(event) {
555
+ if (event) {
556
+ const timer = this.debounceTimers.get(event);
557
+ if (timer) {
558
+ clearTimeout(timer);
559
+ this.debounceTimers.delete(event);
560
+ }
561
+ } else {
562
+ for (const timer of this.debounceTimers.values()) {
563
+ clearTimeout(timer);
564
+ }
565
+ this.debounceTimers.clear();
566
+ }
567
+ }
568
+ unsubscribeAll(event) {
569
+ this.cancelDebounced(event);
570
+ if (event) this.events.delete(event);
571
+ else this.events.clear();
572
+ }
573
+ hasListeners(event) {
574
+ return Boolean(this.events.get(event)?.size);
575
+ }
576
+ getListenerCount(event) {
577
+ return this.events.get(event)?.size || 0;
578
+ }
579
+ getAllEvents() {
580
+ return [...this.events.keys()];
581
+ }
582
+ };
583
+ var GLOBAL_EVENTS_KEY = /* @__PURE__ */ Symbol.for("__base_framework_global_events__");
584
+ var _global = globalThis;
585
+ _global[GLOBAL_EVENTS_KEY] ?? (_global[GLOBAL_EVENTS_KEY] = new EventEmitter());
586
+ function createNoopHandle(status = "rejected", reason = "unknown") {
587
+ const handle = Object.assign(() => false, {
588
+ active: false,
589
+ dispose: () => false,
590
+ instanceId: null,
591
+ key: "",
592
+ priority: 0,
593
+ reason,
594
+ source: "",
595
+ status,
596
+ type: "",
597
+ update: () => handle,
598
+ updatedAt: 0,
599
+ validation: "warn"
600
+ });
601
+ return handle;
602
+ }
603
+ createNoopHandle();
604
+ getOrCreateGlobalContext(
605
+ "RegistryContext",
606
+ null
607
+ );
608
+ var ModuleHostContext = getOrCreateGlobalContext("ModuleHostContext", null);
609
+ function createPageControllerStore() {
610
+ const listeners = /* @__PURE__ */ new Set();
611
+ let stack = [];
612
+ const notify = () => {
613
+ listeners.forEach((listener) => {
614
+ try {
615
+ listener();
616
+ } catch (error) {
617
+ report("Page controller listener", error);
618
+ }
619
+ });
620
+ };
621
+ return {
622
+ getSnapshot() {
623
+ const top = stack[stack.length - 1];
624
+ return top?.controllerRef?.current || null;
625
+ },
626
+ notify,
627
+ register(id, controllerRef) {
628
+ stack = stack.filter((item) => item.id !== id);
629
+ stack.push({ controllerRef, id });
630
+ notify();
631
+ },
632
+ subscribe(listener) {
633
+ listeners.add(listener);
634
+ return () => {
635
+ listeners.delete(listener);
636
+ };
637
+ },
638
+ unregister(id) {
639
+ stack = stack.filter((item) => item.id !== id);
640
+ notify();
641
+ }
642
+ };
643
+ }
644
+ var fallbackStandaloneStore = createPageControllerStore();
645
+ getOrCreateGlobalContext(
646
+ "PageControllerContext",
647
+ null
648
+ );
649
+ getOrCreateGlobalContext(
650
+ "PageControllerStoreContext",
651
+ fallbackStandaloneStore
652
+ );
653
+ function defineModule(coreModule) {
654
+ return Object.freeze({ ...coreModule });
655
+ }
656
+ function useModule(id) {
657
+ const coreModule = use(ModuleHostContext)?.byId.get(id);
658
+ return coreModule?.context ? use(coreModule.context) ?? null : null;
659
+ }
660
+ var NO_MODULE_STORE = createStore(void 0);
661
+ function useModuleState(id, selector, fallback, isEqual = Object.is) {
662
+ const runtime = useModule(id);
663
+ return useStore(
664
+ runtime?.store ?? NO_MODULE_STORE,
665
+ (state) => runtime ? selector(state) : fallback,
666
+ isEqual
667
+ );
668
+ }
669
+ var AmbientContext = getOrCreateGlobalContext("AmbientContext", null);
670
+ function useStableObject(value) {
671
+ const [stable, setStable] = useState(value);
672
+ if (!shallowEqual(stable, value)) {
673
+ setStable(value);
674
+ }
675
+ return stable;
676
+ }
677
+ function AmbientProvider({
678
+ children,
679
+ initialPalette = null
680
+ }) {
681
+ const [store] = useState(
682
+ () => createStore(
683
+ { isExtracting: false, palette: initialPalette || AMBIENT_DEFAULTS },
684
+ { freezeSnapshots: false }
685
+ )
686
+ );
687
+ const value = useMemo(
688
+ () => ({
689
+ actions: {
690
+ setIsExtracting: (next) => store.publish((state) => {
691
+ const isExtracting = typeof next === "function" ? next(state.isExtracting) : next;
692
+ return isExtracting === state.isExtracting ? state : { ...state, isExtracting };
693
+ }),
694
+ setPalette: (next) => store.publish((state) => {
695
+ const palette = typeof next === "function" ? next(state.palette) : next;
696
+ return palette === state.palette ? state : { ...state, palette };
697
+ })
698
+ },
699
+ store
700
+ }),
701
+ [store]
702
+ );
703
+ return /* @__PURE__ */ jsx(AmbientContext, { value, children });
704
+ }
705
+ function useAmbientColor(imageSource, options = null) {
706
+ const stableOptions = useStableObject(options);
707
+ const initialPalette = useStableObject(
708
+ options?.initialPalette || options?.fallbackPalette || null
709
+ );
710
+ const [extractedData, setExtractedData] = useState(
711
+ () => initialPalette
712
+ );
713
+ const srcKey = typeof imageSource === "string" ? imageSource : imageSource?.src;
714
+ const isExtracting = Boolean(
715
+ imageSource && (!extractedData || extractedData.source !== srcKey)
716
+ );
717
+ useEffect(() => {
718
+ if (!imageSource) return;
719
+ let active = true;
720
+ void extractPaletteFromImage(imageSource, {
721
+ fallbackPalette: initialPalette,
722
+ ...stableOptions || {}
723
+ }).then((extracted) => {
724
+ if (active) {
725
+ setExtractedData({ ...extracted, source: srcKey });
726
+ }
727
+ }).catch(() => {
728
+ if (active) {
729
+ setExtractedData({
730
+ black: initialPalette?.black || AMBIENT_DEFAULTS.black,
731
+ primary: initialPalette?.primary || AMBIENT_DEFAULTS.primary,
732
+ source: srcKey
733
+ });
734
+ }
735
+ });
736
+ return () => {
737
+ active = false;
738
+ };
739
+ }, [imageSource, initialPalette, srcKey, stableOptions]);
740
+ const palette = imageSource && extractedData && extractedData.source === srcKey ? extractedData : initialPalette || AMBIENT_DEFAULTS;
741
+ return { isExtracting, palette };
742
+ }
743
+ function useAmbientTheme(config = null) {
744
+ const ambientActions = use(AmbientContext)?.actions ?? null;
745
+ const normalizedConfig = typeof config === "string" ? { image: config } : config || {};
746
+ const {
747
+ colors = null,
748
+ image = null,
749
+ initialPalette = null,
750
+ options = null,
751
+ scope = null,
752
+ tintGlobals = true,
753
+ transition = true
754
+ } = normalizedConfig;
755
+ const stableInitialPalette = useStableObject(initialPalette);
756
+ const stableOptions = useStableObject(options);
757
+ const stableColors = useStableObject(colors);
758
+ const resolvedOptions = useMemo(
759
+ () => ({
760
+ ...stableOptions || {},
761
+ ...stableInitialPalette ? { initialPalette: stableInitialPalette } : {}
762
+ }),
763
+ [stableInitialPalette, stableOptions]
764
+ );
765
+ const { palette: extractedPalette, isExtracting } = useAmbientColor(
766
+ image,
767
+ resolvedOptions
768
+ );
769
+ const hasActiveConfig = Boolean(image || stableColors);
770
+ useEffect(() => {
771
+ if (!hasActiveConfig || !ambientActions) return;
772
+ ambientActions.setIsExtracting(isExtracting);
773
+ ambientActions.setPalette(
774
+ (prev) => shallowEqual(prev, extractedPalette) ? prev : extractedPalette
775
+ );
776
+ }, [ambientActions, extractedPalette, hasActiveConfig, isExtracting]);
777
+ const extractedPrimary = extractedPalette?.primary || "";
778
+ const extractedBlack = extractedPalette?.black || "";
779
+ const transitionClasses = useTheme(ambientTheme).slots.transition.split(/\s+/).filter(Boolean);
780
+ const transitionKey = transitionClasses.join(" ");
781
+ const resolvedVarMap = useMemo(
782
+ () => resolveAmbientVarMap({
783
+ colors: stableColors,
784
+ extractedBlack,
785
+ extractedPrimary,
786
+ image,
787
+ tintGlobals
788
+ }),
789
+ [extractedBlack, extractedPrimary, image, stableColors, tintGlobals]
790
+ );
791
+ useEffect(() => {
792
+ if (Object.keys(resolvedVarMap).length === 0) return;
793
+ const targetEl = resolveTargetElement(scope);
794
+ if (!targetEl) return;
795
+ if (transition) {
796
+ targetEl.classList.add(...transitionKey.split(" ").filter(Boolean));
797
+ }
798
+ const restoreVariables = applyScopedCssVariables(targetEl, resolvedVarMap);
799
+ return () => {
800
+ restoreVariables();
801
+ if (transition && scope) {
802
+ targetEl.classList.remove(...transitionKey.split(" ").filter(Boolean));
803
+ }
804
+ };
805
+ }, [resolvedVarMap, scope, transition, transitionKey]);
806
+ return { isExtracting, palette: extractedPalette };
807
+ }
808
+ function useAmbient(configOrImage) {
809
+ const { actions, store } = useRequiredContext(
810
+ AmbientContext,
811
+ "useAmbient",
812
+ "AmbientProvider"
813
+ );
814
+ const shared = useStore(store);
815
+ const ctx = useMemo(
816
+ () => ({ ...shared, ...actions }),
817
+ [actions, shared]
818
+ );
819
+ const { isExtracting, palette } = useAmbientTheme(configOrImage ?? null);
820
+ const themeState = useMemo(
821
+ () => ({ isExtracting, palette }),
822
+ [isExtracting, palette]
823
+ );
824
+ return useMemo(
825
+ () => configOrImage ? { ...ctx, ...themeState } : ctx,
826
+ [configOrImage, ctx, themeState]
827
+ );
828
+ }
829
+
830
+ // src/modules/ambient/module.tsx
831
+ var firstString = (...values) => values.find((value) => typeof value === "string" && value) ?? null;
832
+ function selectPageAmbient(config) {
833
+ return {
834
+ ambient: config.ambient,
835
+ banner: firstString(config.dock?.banner, config.dock?.bannerUrl)
836
+ };
837
+ }
838
+ function useAmbientPage(slice, page) {
839
+ const posterUrl = useModuleState(
840
+ "background",
841
+ (background) => background.posterUrl,
842
+ null
843
+ );
844
+ const theme = useMemo(
845
+ () => resolvePageAmbientTheme(slice, posterUrl),
846
+ [posterUrl, slice]
847
+ );
848
+ useAmbientTheme(theme);
849
+ return useMemo(
850
+ () => ({ set: (ambient) => page.set({ ambient }) }),
851
+ [page]
852
+ );
853
+ }
854
+ var ambientModule = defineModule({
855
+ id: "ambient",
856
+ context: AmbientContext,
857
+ Provider: AmbientProvider,
858
+ uses: ["background"],
859
+ page: {
860
+ select: selectPageAmbient,
861
+ use: useAmbientPage
862
+ }
863
+ });
864
+ function resolveValue(value, props) {
865
+ return typeof value === "function" ? value(props) : value;
866
+ }
867
+ function defineAmbient(definition = {}) {
868
+ const { defaultProps, id = "ambient-theme", ...config } = definition;
869
+ const create = (props = {}, { id: overrideId, ...overrides } = {}) => {
870
+ const mergedProps = { ...defaultProps, ...props };
871
+ const merged = { ...config, ...overrides };
872
+ return {
873
+ ...merged,
874
+ colors: resolveValue(merged.colors ?? null, mergedProps) ?? null,
875
+ id: overrideId ?? id,
876
+ image: resolveValue(merged.image ?? null, mergedProps),
877
+ initialPalette: merged.initialPalette ?? null,
878
+ options: { ...config.options, ...overrides.options },
879
+ props: mergedProps,
880
+ scope: merged.scope ?? null,
881
+ transition: merged.transition ?? true
882
+ };
883
+ };
884
+ return Object.freeze({
885
+ config: definition,
886
+ create,
887
+ id,
888
+ use: function useDefinedAmbient(props, overrides) {
889
+ return useAmbientTheme(create(props, overrides));
890
+ }
891
+ });
892
+ }
893
+
894
+ export { AMBIENT_CSS_VARS, AMBIENT_DEFAULTS, AmbientContext, AmbientProvider, COLOR_EXTRACT_CONFIG, ambientModule, ambientTheme, defineAmbient, extractPaletteFromImage, oklchToString, resolvePageAmbientTheme, rgbToOklch, useAmbient, useAmbientColor, useAmbientTheme };
895
+ //# sourceMappingURL=index.js.map
896
+ //# sourceMappingURL=index.js.map