@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,804 @@
1
+ "use client";
2
+ import { useLayoutEffect, useEffect, use, useRef, useCallback, useSyncExternalStore, useState, useTransition } from 'react';
3
+ import 'clsx';
4
+ import 'tailwind-merge';
5
+
6
+ function useRequiredContext(context, hookName, providerName) {
7
+ const value = use(context);
8
+ if (value === null) {
9
+ throw new Error(`${hookName} must be used within ${providerName}`);
10
+ }
11
+ return value;
12
+ }
13
+ function useStore(store, selector = (state) => state, isEqual = Object.is) {
14
+ const cacheRef = useRef({
15
+ isEqual: null,
16
+ selected: void 0,
17
+ selector: null,
18
+ snapshot: null
19
+ });
20
+ const getSelectedSnapshot = useCallback(() => {
21
+ const snapshot = store.getSnapshot();
22
+ const cache = cacheRef.current;
23
+ if (cache.snapshot === snapshot && cache.selector === selector && cache.isEqual === isEqual) {
24
+ return cache.selected;
25
+ }
26
+ const selected = selector(snapshot);
27
+ if (cache.snapshot !== null && cache.isEqual === isEqual && isEqual(cache.selected, selected)) {
28
+ cache.snapshot = snapshot;
29
+ cache.selector = selector;
30
+ return cache.selected;
31
+ }
32
+ cacheRef.current = {
33
+ isEqual,
34
+ selected,
35
+ selector,
36
+ snapshot
37
+ };
38
+ return selected;
39
+ }, [isEqual, selector, store]);
40
+ return useSyncExternalStore(
41
+ store.subscribe,
42
+ getSelectedSnapshot,
43
+ getSelectedSnapshot
44
+ );
45
+ }
46
+ function useClickOutside(ref, callback) {
47
+ const handlePointer = useCallback(
48
+ (event) => {
49
+ if (ref?.current && !ref.current.contains(event.target)) {
50
+ callback?.(event);
51
+ }
52
+ },
53
+ [callback, ref]
54
+ );
55
+ useEffect(() => {
56
+ document.addEventListener("pointerdown", handlePointer);
57
+ return () => document.removeEventListener("pointerdown", handlePointer);
58
+ }, [handlePointer]);
59
+ }
60
+
61
+ // src/utils/dom.ts
62
+ var isBrowser = typeof window !== "undefined";
63
+ function report(scope, error, level = "error") {
64
+ if (process.env.NODE_ENV === "production" && typeof window !== "undefined") {
65
+ return;
66
+ }
67
+ console[level](`[${scope}]`, error);
68
+ }
69
+
70
+ // src/utils/user-message.ts
71
+ var USER_MESSAGES = Object.freeze({
72
+ generic: "Something went wrong. Please try again",
73
+ network: "You appear to be offline. Check your connection and try again",
74
+ timeout: "That took too long. Please try again",
75
+ unauthorized: "Your session has expired. Please sign in again",
76
+ forbidden: "You don't have permission to do that",
77
+ notFound: "We couldn't find what you were looking for",
78
+ rateLimited: "Too many attempts. Please wait a moment and try again",
79
+ server: "We're having trouble on our end. Please try again in a moment"
80
+ });
81
+ var UserError = class extends Error {
82
+ status;
83
+ constructor(message, status) {
84
+ super(message);
85
+ this.name = "UserError";
86
+ this.status = status;
87
+ }
88
+ };
89
+ var NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;
90
+ function readField(source, field, type) {
91
+ const value = source?.[field];
92
+ return typeof value === type ? value : void 0;
93
+ }
94
+ function readPayloadMessage(error) {
95
+ const payload = error?.payload;
96
+ const message = readField(payload, "error", "string")?.trim();
97
+ return message || void 0;
98
+ }
99
+ function toUserMessage(error, { codes, fallback = USER_MESSAGES.generic } = {}) {
100
+ if (typeof error === "string") return error.trim() || fallback;
101
+ if (!error || typeof error !== "object") return fallback;
102
+ if (error instanceof UserError) {
103
+ if (error.status === 401) return USER_MESSAGES.unauthorized;
104
+ return error.message || fallback;
105
+ }
106
+ if (error.name === "AbortError") return fallback;
107
+ const code = readField(error, "code", "string");
108
+ if (code && codes?.[code]) return codes[code];
109
+ const status = readField(error, "status", "number");
110
+ if (status === 401) return USER_MESSAGES.unauthorized;
111
+ if (status === 429) return USER_MESSAGES.rateLimited;
112
+ if (status === 408 || status === 504) return USER_MESSAGES.timeout;
113
+ if (status !== void 0 && status >= 500) return USER_MESSAGES.server;
114
+ if (status !== void 0 && status >= 400) {
115
+ const authored = readPayloadMessage(error);
116
+ if (authored) return authored;
117
+ if (status === 403) return USER_MESSAGES.forbidden;
118
+ if (status === 404) return USER_MESSAGES.notFound;
119
+ return fallback;
120
+ }
121
+ const isOffline = typeof navigator !== "undefined" && navigator.onLine === false;
122
+ if (isOffline || NETWORK_FAILURE.test(error.message ?? "") && (error instanceof TypeError || /fetch/i.test(error.name))) {
123
+ return USER_MESSAGES.network;
124
+ }
125
+ return fallback;
126
+ }
127
+
128
+ // src/hooks/use-isomorphic-layout-effect.ts
129
+ var useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;
130
+ function useDebounce(value, delay = 300) {
131
+ const [debouncedValue, setDebouncedValue] = useState(value);
132
+ useEffect(() => {
133
+ const timer = setTimeout(() => setDebouncedValue(value), delay);
134
+ return () => clearTimeout(timer);
135
+ }, [value, delay]);
136
+ return debouncedValue;
137
+ }
138
+ var emptySubscribe = () => () => {
139
+ };
140
+ function useMounted() {
141
+ return useSyncExternalStore(
142
+ emptySubscribe,
143
+ () => true,
144
+ () => false
145
+ );
146
+ }
147
+ function useMediaQuery(query, serverFallback = false) {
148
+ const subscribe2 = useCallback(
149
+ (onStoreChange) => {
150
+ if (!isBrowser || !query || typeof window.matchMedia !== "function") {
151
+ return () => {
152
+ };
153
+ }
154
+ const mediaQueryList = window.matchMedia(query);
155
+ mediaQueryList.addEventListener("change", onStoreChange);
156
+ return () => mediaQueryList.removeEventListener("change", onStoreChange);
157
+ },
158
+ [query]
159
+ );
160
+ const getSnapshot2 = useCallback(() => {
161
+ if (!isBrowser || !query || typeof window.matchMedia !== "function") {
162
+ return serverFallback;
163
+ }
164
+ return window.matchMedia(query).matches;
165
+ }, [query, serverFallback]);
166
+ const getServerSnapshot = useCallback(() => serverFallback, [serverFallback]);
167
+ return useSyncExternalStore(subscribe2, getSnapshot2, getServerSnapshot);
168
+ }
169
+ function useControllableState({
170
+ defaultValue,
171
+ onChange,
172
+ value
173
+ }) {
174
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
175
+ const isControlled = value !== void 0;
176
+ const currentValue = isControlled ? value : uncontrolledValue;
177
+ const valueRef = useRef(currentValue);
178
+ const onChangeRef = useRef(onChange);
179
+ useIsomorphicLayoutEffect(() => {
180
+ valueRef.current = currentValue;
181
+ onChangeRef.current = onChange;
182
+ });
183
+ const setValue = useCallback(
184
+ (next) => {
185
+ const resolvedNext = typeof next === "function" ? next(valueRef.current) : next;
186
+ if (!Object.is(valueRef.current, resolvedNext)) {
187
+ if (!isControlled) {
188
+ setUncontrolledValue(resolvedNext);
189
+ }
190
+ onChangeRef.current?.(resolvedNext);
191
+ }
192
+ },
193
+ [isControlled]
194
+ );
195
+ return [currentValue, setValue];
196
+ }
197
+ function isEditableElement(target) {
198
+ if (!target || typeof target.tagName !== "string") {
199
+ return false;
200
+ }
201
+ const element = target;
202
+ const tagName = element.tagName.toLowerCase();
203
+ if (tagName === "input" || tagName === "textarea" || tagName === "select") {
204
+ return true;
205
+ }
206
+ return Boolean(element.isContentEditable);
207
+ }
208
+ function matchesKeyCombo(event, combo) {
209
+ const parts = combo.toLowerCase().split("+").map((p) => p.trim()).filter(Boolean);
210
+ if (parts.length === 0) return false;
211
+ const keyPart = parts[parts.length - 1];
212
+ const modifiers = new Set(parts.slice(0, -1));
213
+ const wantsMod = modifiers.has("mod") || modifiers.has("cmd") || modifiers.has("meta");
214
+ const wantsCtrl = modifiers.has("ctrl") || modifiers.has("control");
215
+ const wantsAlt = modifiers.has("alt") || modifiers.has("option");
216
+ const wantsShift = modifiers.has("shift");
217
+ const isModPressed = event.metaKey || event.ctrlKey;
218
+ if (wantsMod && !isModPressed) return false;
219
+ if (!wantsMod && !wantsCtrl && (event.metaKey || event.ctrlKey)) return false;
220
+ if (wantsCtrl && !event.ctrlKey) return false;
221
+ if (wantsAlt !== event.altKey) return false;
222
+ if (wantsShift !== event.shiftKey) return false;
223
+ const pressedKey = event.key.toLowerCase();
224
+ if (keyPart === "esc" || keyPart === "escape") {
225
+ return pressedKey === "escape" || pressedKey === "esc";
226
+ }
227
+ if (keyPart === "space") {
228
+ return pressedKey === " " || pressedKey === "spacebar";
229
+ }
230
+ return pressedKey === keyPart;
231
+ }
232
+ function useHotkey(combo, callback, options) {
233
+ const callbackRef = useRef(callback);
234
+ useIsomorphicLayoutEffect(() => {
235
+ callbackRef.current = callback;
236
+ });
237
+ const enabled = options?.enabled ?? true;
238
+ const enableOnFormTags = options?.enableOnFormTags ?? false;
239
+ const preventDefault = options?.preventDefault ?? true;
240
+ const stopPropagation = options?.stopPropagation ?? false;
241
+ useEffect(() => {
242
+ if (!isBrowser || !enabled || !combo) return;
243
+ const combos = (Array.isArray(combo) ? combo : [combo]).filter(Boolean);
244
+ if (combos.length === 0) return;
245
+ const handleKeyDown = (event) => {
246
+ if (!enableOnFormTags && isEditableElement(event.target)) return;
247
+ const matched = combos.some((c) => matchesKeyCombo(event, c));
248
+ if (!matched) return;
249
+ if (preventDefault) event.preventDefault();
250
+ if (stopPropagation) event.stopPropagation();
251
+ callbackRef.current?.(event);
252
+ };
253
+ window.addEventListener("keydown", handleKeyDown);
254
+ return () => window.removeEventListener("keydown", handleKeyDown);
255
+ }, [combo, enabled, enableOnFormTags, preventDefault, stopPropagation]);
256
+ }
257
+ function useEscapeKey(callback, enabled = true) {
258
+ useHotkey("escape", callback, {
259
+ enabled,
260
+ enableOnFormTags: true,
261
+ preventDefault: false
262
+ });
263
+ }
264
+
265
+ // src/events.ts
266
+ var EVENT_TYPES = Object.freeze({
267
+ API_UNAUTHORIZED: "API_UNAUTHORIZED",
268
+ STATE_CHANGE: "STATE_CHANGE",
269
+ API_ERROR: "API_ERROR",
270
+ APP_ERROR: "APP_ERROR"
271
+ });
272
+ var EventEmitter = class {
273
+ events = /* @__PURE__ */ new Map();
274
+ debounceTimers = /* @__PURE__ */ new Map();
275
+ subscribe(event, callback) {
276
+ if (typeof event !== "string" || !event || typeof callback !== "function") {
277
+ return () => {
278
+ };
279
+ }
280
+ const listeners2 = this.events.get(event) || /* @__PURE__ */ new Set();
281
+ listeners2.add(callback);
282
+ this.events.set(event, listeners2);
283
+ return () => {
284
+ listeners2.delete(callback);
285
+ if (listeners2.size === 0) this.events.delete(event);
286
+ };
287
+ }
288
+ emit(event, payload) {
289
+ const listeners2 = this.events.get(event);
290
+ if (!listeners2 || listeners2.size === 0) return;
291
+ const snapshot = Array.from(listeners2);
292
+ for (const callback of snapshot) {
293
+ try {
294
+ callback(payload);
295
+ } catch (error) {
296
+ report(`Event listener (${String(event)})`, error);
297
+ }
298
+ }
299
+ }
300
+ emitDebounced(event, payload, waitMs = 100) {
301
+ const existing = this.debounceTimers.get(event);
302
+ if (existing) clearTimeout(existing);
303
+ const timer = setTimeout(() => {
304
+ this.debounceTimers.delete(event);
305
+ this.emit(event, payload);
306
+ }, waitMs);
307
+ this.debounceTimers.set(event, timer);
308
+ }
309
+ cancelDebounced(event) {
310
+ if (event) {
311
+ const timer = this.debounceTimers.get(event);
312
+ if (timer) {
313
+ clearTimeout(timer);
314
+ this.debounceTimers.delete(event);
315
+ }
316
+ } else {
317
+ for (const timer of this.debounceTimers.values()) {
318
+ clearTimeout(timer);
319
+ }
320
+ this.debounceTimers.clear();
321
+ }
322
+ }
323
+ unsubscribeAll(event) {
324
+ this.cancelDebounced(event);
325
+ if (event) this.events.delete(event);
326
+ else this.events.clear();
327
+ }
328
+ hasListeners(event) {
329
+ return Boolean(this.events.get(event)?.size);
330
+ }
331
+ getListenerCount(event) {
332
+ return this.events.get(event)?.size || 0;
333
+ }
334
+ getAllEvents() {
335
+ return [...this.events.keys()];
336
+ }
337
+ };
338
+ var GLOBAL_EVENTS_KEY = /* @__PURE__ */ Symbol.for("__base_framework_global_events__");
339
+ var _global = globalThis;
340
+ var globalEvents = _global[GLOBAL_EVENTS_KEY] ?? (_global[GLOBAL_EVENTS_KEY] = new EventEmitter());
341
+
342
+ // src/hooks/use-global-event.ts
343
+ function useGlobalEvent(event, callback, options) {
344
+ const callbackRef = useRef(callback);
345
+ const debounceTimerRef = useRef(null);
346
+ const lastThrottleTimeRef = useRef(0);
347
+ const throttleTimerRef = useRef(null);
348
+ useIsomorphicLayoutEffect(() => {
349
+ callbackRef.current = callback;
350
+ });
351
+ const debounceMs = options?.debounceMs;
352
+ const throttleMs = options?.throttleMs;
353
+ useEffect(() => {
354
+ if (!event) return;
355
+ const events = Array.isArray(event) ? event.filter(Boolean) : [event];
356
+ if (events.length === 0) return;
357
+ const handler = (payload) => {
358
+ if (debounceMs != null && debounceMs > 0) {
359
+ if (debounceTimerRef.current !== null) {
360
+ clearTimeout(debounceTimerRef.current);
361
+ }
362
+ debounceTimerRef.current = setTimeout(() => {
363
+ debounceTimerRef.current = null;
364
+ callbackRef.current?.(payload);
365
+ }, debounceMs);
366
+ return;
367
+ }
368
+ if (throttleMs != null && throttleMs > 0) {
369
+ const now = Date.now();
370
+ const remaining = throttleMs - (now - lastThrottleTimeRef.current);
371
+ if (remaining <= 0) {
372
+ if (throttleTimerRef.current !== null) {
373
+ clearTimeout(throttleTimerRef.current);
374
+ throttleTimerRef.current = null;
375
+ }
376
+ lastThrottleTimeRef.current = now;
377
+ callbackRef.current?.(payload);
378
+ } else if (throttleTimerRef.current === null) {
379
+ throttleTimerRef.current = setTimeout(() => {
380
+ lastThrottleTimeRef.current = Date.now();
381
+ throttleTimerRef.current = null;
382
+ callbackRef.current?.(payload);
383
+ }, remaining);
384
+ }
385
+ return;
386
+ }
387
+ callbackRef.current?.(payload);
388
+ };
389
+ const unsubs = events.map((ev) => globalEvents.subscribe(ev, handler));
390
+ return () => {
391
+ unsubs.forEach((unsub) => unsub());
392
+ if (debounceTimerRef.current !== null) {
393
+ clearTimeout(debounceTimerRef.current);
394
+ debounceTimerRef.current = null;
395
+ }
396
+ if (throttleTimerRef.current !== null) {
397
+ clearTimeout(throttleTimerRef.current);
398
+ throttleTimerRef.current = null;
399
+ }
400
+ };
401
+ }, [event, debounceMs, throttleMs]);
402
+ }
403
+ function useEventState(event, initialValue, reducer) {
404
+ const storeRef = useRef(null);
405
+ if (storeRef.current == null) {
406
+ storeRef.current = {
407
+ value: initialValue,
408
+ listeners: /* @__PURE__ */ new Set(),
409
+ reducer
410
+ };
411
+ }
412
+ useIsomorphicLayoutEffect(() => {
413
+ if (storeRef.current != null) {
414
+ storeRef.current.reducer = reducer;
415
+ }
416
+ });
417
+ const subscribe2 = useCallback(
418
+ (onStoreChange) => {
419
+ if (!event || !storeRef.current) return () => {
420
+ };
421
+ storeRef.current.listeners.add(onStoreChange);
422
+ const unsub = globalEvents.subscribe(event, (payload) => {
423
+ if (!storeRef.current) return;
424
+ const next = storeRef.current.reducer(storeRef.current.value, payload);
425
+ if (!Object.is(storeRef.current.value, next)) {
426
+ storeRef.current.value = next;
427
+ storeRef.current.listeners.forEach((listener) => listener());
428
+ }
429
+ });
430
+ return () => {
431
+ storeRef.current?.listeners.delete(onStoreChange);
432
+ unsub();
433
+ };
434
+ },
435
+ [event]
436
+ );
437
+ const getSnapshot2 = useCallback(() => {
438
+ return storeRef.current?.value ?? initialValue;
439
+ }, [initialValue]);
440
+ const getServerSnapshot = useCallback(() => {
441
+ return initialValue;
442
+ }, [initialValue]);
443
+ return useSyncExternalStore(subscribe2, getSnapshot2, getServerSnapshot);
444
+ }
445
+
446
+ // src/result.ts
447
+ function err(error, code) {
448
+ return { error, success: false, ...{} };
449
+ }
450
+ function isResult(value) {
451
+ 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);
452
+ }
453
+ function isErr(result) {
454
+ return result.success === false;
455
+ }
456
+
457
+ // src/hooks/use-async-action.ts
458
+ function useAsyncAction(actionFn, options = {}) {
459
+ const {
460
+ errorMessage = null,
461
+ onError = null,
462
+ onSuccess = null,
463
+ successMessage = null,
464
+ toast = null
465
+ } = options;
466
+ const [isPending, setIsPending] = useState(false);
467
+ const [error, setError] = useState(null);
468
+ const execute = useCallback(
469
+ async (...args) => {
470
+ setIsPending(true);
471
+ setError(null);
472
+ try {
473
+ const result = await actionFn(...args);
474
+ if (isResult(result) && isErr(result)) {
475
+ setError(result.error);
476
+ const resolvedMessage = errorMessage || toUserMessage(result.error);
477
+ if (typeof toast === "function") {
478
+ toast(resolvedMessage);
479
+ }
480
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
481
+ error: result.error,
482
+ message: resolvedMessage,
483
+ notify: toast === true
484
+ });
485
+ await onError?.(result.error);
486
+ return result;
487
+ }
488
+ if (successMessage) {
489
+ if (typeof toast === "function") {
490
+ toast(successMessage);
491
+ }
492
+ globalEvents.emit(EVENT_TYPES.STATE_CHANGE, {
493
+ message: successMessage,
494
+ notify: toast === true,
495
+ status: "success"
496
+ });
497
+ }
498
+ await onSuccess?.(result);
499
+ return result;
500
+ } catch (err2) {
501
+ setError(err2);
502
+ const resolvedMessage = errorMessage || toUserMessage(err2);
503
+ if (typeof toast === "function") {
504
+ toast(resolvedMessage);
505
+ }
506
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
507
+ error: err2,
508
+ message: resolvedMessage,
509
+ notify: toast === true
510
+ });
511
+ await onError?.(err2);
512
+ throw err2;
513
+ } finally {
514
+ setIsPending(false);
515
+ }
516
+ },
517
+ [actionFn, errorMessage, onError, onSuccess, successMessage, toast]
518
+ );
519
+ return { error, execute, isPending };
520
+ }
521
+ function useServerAction(actionFn, options = {}) {
522
+ const {
523
+ errorMessage = null,
524
+ onError = null,
525
+ onSuccess = null,
526
+ successMessage = null,
527
+ toast = null
528
+ } = options;
529
+ const [isPending, startTransition] = useTransition();
530
+ const [data, setData] = useState(null);
531
+ const [error, setError] = useState(null);
532
+ const reset = useCallback(() => {
533
+ setData(null);
534
+ setError(null);
535
+ }, []);
536
+ const execute = useCallback(
537
+ (...args) => {
538
+ return new Promise((resolve) => {
539
+ startTransition(async () => {
540
+ setError(null);
541
+ try {
542
+ const result = await actionFn(...args);
543
+ if (isErr(result)) {
544
+ setError(result.error);
545
+ const resolvedMessage = errorMessage || toUserMessage(result.error);
546
+ if (typeof toast === "function") {
547
+ toast(resolvedMessage);
548
+ }
549
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
550
+ error: result.error,
551
+ message: resolvedMessage,
552
+ notify: toast === true
553
+ });
554
+ await onError?.(result.error);
555
+ resolve(result);
556
+ return;
557
+ }
558
+ setData(result.data);
559
+ if (successMessage) {
560
+ if (typeof toast === "function") {
561
+ toast(successMessage);
562
+ }
563
+ globalEvents.emit(EVENT_TYPES.STATE_CHANGE, {
564
+ message: successMessage,
565
+ notify: toast === true,
566
+ status: "success"
567
+ });
568
+ }
569
+ await onSuccess?.(result.data);
570
+ resolve(result);
571
+ } catch (err2) {
572
+ const mappedError = toUserMessage(err2);
573
+ setError(mappedError);
574
+ const resolvedMessage = errorMessage || mappedError;
575
+ if (typeof toast === "function") {
576
+ toast(resolvedMessage);
577
+ }
578
+ globalEvents.emit(EVENT_TYPES.APP_ERROR, {
579
+ error: err2,
580
+ message: resolvedMessage,
581
+ notify: toast === true
582
+ });
583
+ await onError?.(mappedError);
584
+ resolve(err(mappedError));
585
+ }
586
+ });
587
+ });
588
+ },
589
+ [actionFn, errorMessage, onError, onSuccess, successMessage, toast]
590
+ );
591
+ return { data, error, execute, isPending, reset };
592
+ }
593
+ function getStorageInstance(type) {
594
+ if (!isBrowser) return null;
595
+ try {
596
+ return type === "session" ? window.sessionStorage : window.localStorage;
597
+ } catch {
598
+ return null;
599
+ }
600
+ }
601
+ var STORAGE_SYNC_EVENT = "base-framework:storage-sync";
602
+ function useStorageState(key, initialValue, options = {}) {
603
+ const storageType = options.storage ?? "local";
604
+ const serialize = options.serialize ?? JSON.stringify;
605
+ const deserialize = options.deserialize ?? JSON.parse;
606
+ const cacheRef = useRef({
607
+ parsed: initialValue,
608
+ raw: null
609
+ });
610
+ const getSnapshot2 = useCallback(() => {
611
+ const storage = getStorageInstance(storageType);
612
+ if (!storage) return initialValue;
613
+ try {
614
+ const raw = storage.getItem(key);
615
+ if (raw === null) {
616
+ cacheRef.current = { parsed: initialValue, raw: null };
617
+ return initialValue;
618
+ }
619
+ if (cacheRef.current.raw === raw) {
620
+ return cacheRef.current.parsed;
621
+ }
622
+ const parsed = deserialize(raw);
623
+ cacheRef.current = { parsed, raw };
624
+ return parsed;
625
+ } catch {
626
+ return initialValue;
627
+ }
628
+ }, [deserialize, initialValue, key, storageType]);
629
+ const getServerSnapshot = useCallback(() => initialValue, [initialValue]);
630
+ const subscribe2 = useCallback(
631
+ (onStoreChange) => {
632
+ if (!isBrowser) return () => {
633
+ };
634
+ const handleStorage = (event) => {
635
+ if (event.key === key && event.storageArea === getStorageInstance(storageType)) {
636
+ onStoreChange();
637
+ }
638
+ };
639
+ const handleCustomSync = (event) => {
640
+ const detail = event.detail;
641
+ if (detail?.key === key && detail?.storageType === storageType) {
642
+ onStoreChange();
643
+ }
644
+ };
645
+ window.addEventListener("storage", handleStorage);
646
+ window.addEventListener(STORAGE_SYNC_EVENT, handleCustomSync);
647
+ return () => {
648
+ window.removeEventListener("storage", handleStorage);
649
+ window.removeEventListener(STORAGE_SYNC_EVENT, handleCustomSync);
650
+ };
651
+ },
652
+ [key, storageType]
653
+ );
654
+ const state = useSyncExternalStore(subscribe2, getSnapshot2, getServerSnapshot);
655
+ const stateRef = useRef(state);
656
+ useIsomorphicLayoutEffect(() => {
657
+ stateRef.current = state;
658
+ });
659
+ const setValue = useCallback(
660
+ (next) => {
661
+ const resolvedNext = typeof next === "function" ? next(stateRef.current) : next;
662
+ stateRef.current = resolvedNext;
663
+ const storage = getStorageInstance(storageType);
664
+ if (!storage) return;
665
+ try {
666
+ const raw = serialize(resolvedNext);
667
+ cacheRef.current = { parsed: resolvedNext, raw };
668
+ storage.setItem(key, raw);
669
+ window.dispatchEvent(
670
+ new CustomEvent(STORAGE_SYNC_EVENT, {
671
+ detail: { key, storageType }
672
+ })
673
+ );
674
+ } catch {
675
+ }
676
+ },
677
+ [key, serialize, storageType]
678
+ );
679
+ const removeValue = useCallback(() => {
680
+ stateRef.current = initialValue;
681
+ cacheRef.current = { parsed: initialValue, raw: null };
682
+ const storage = getStorageInstance(storageType);
683
+ if (!storage) return;
684
+ try {
685
+ storage.removeItem(key);
686
+ window.dispatchEvent(
687
+ new CustomEvent(STORAGE_SYNC_EVENT, {
688
+ detail: { key, storageType }
689
+ })
690
+ );
691
+ } catch {
692
+ }
693
+ }, [initialValue, key, storageType]);
694
+ return [state, setValue, removeValue];
695
+ }
696
+ function useLocalStorage(key, initialValue, options) {
697
+ return useStorageState(key, initialValue, { ...options, storage: "local" });
698
+ }
699
+ function useSessionStorage(key, initialValue, options) {
700
+ return useStorageState(key, initialValue, { ...options, storage: "session" });
701
+ }
702
+ function useIntersectionObserver(targetRef, options = {}) {
703
+ const {
704
+ enabled = true,
705
+ freezeOnceVisible = false,
706
+ onChange,
707
+ root = null,
708
+ rootMargin = "0px",
709
+ threshold = 0
710
+ } = options;
711
+ const [entry, setEntry] = useState(null);
712
+ const onChangeRef = useRef(onChange);
713
+ useIsomorphicLayoutEffect(() => {
714
+ onChangeRef.current = onChange;
715
+ });
716
+ const frozen = Boolean(entry?.isIntersecting && freezeOnceVisible);
717
+ useEffect(() => {
718
+ if (!isBrowser || !enabled || frozen || typeof IntersectionObserver === "undefined") {
719
+ return;
720
+ }
721
+ const node = targetRef?.current;
722
+ if (!node) return;
723
+ const observer = new IntersectionObserver(
724
+ ([nextEntry]) => {
725
+ if (!nextEntry) return;
726
+ setEntry(nextEntry);
727
+ onChangeRef.current?.(nextEntry);
728
+ },
729
+ { root, rootMargin, threshold }
730
+ );
731
+ observer.observe(node);
732
+ return () => observer.disconnect();
733
+ }, [enabled, frozen, root, rootMargin, targetRef, threshold]);
734
+ return {
735
+ entry,
736
+ isIntersecting: Boolean(entry?.isIntersecting)
737
+ };
738
+ }
739
+ var listeners = /* @__PURE__ */ new Set();
740
+ var activeFullscreenStateIds = /* @__PURE__ */ new Set();
741
+ var ACTIVE_FULLSCREEN_ROOT_SELECTOR = '[data-fullscreen-state-root="true"][data-affect-global-state="true"]';
742
+ var domObserver = null;
743
+ var lastSnapshot = false;
744
+ function getDomSnapshot() {
745
+ if (typeof document === "undefined") {
746
+ return activeFullscreenStateIds.size > 0;
747
+ }
748
+ return document.querySelector(ACTIVE_FULLSCREEN_ROOT_SELECTOR) !== null;
749
+ }
750
+ function emitChange() {
751
+ listeners.forEach((listener) => listener());
752
+ }
753
+ function emitIfSnapshotChanged() {
754
+ const nextSnapshot = getDomSnapshot();
755
+ if (nextSnapshot === lastSnapshot) {
756
+ return;
757
+ }
758
+ lastSnapshot = nextSnapshot;
759
+ emitChange();
760
+ }
761
+ function ensureDomObserver() {
762
+ if (typeof document === "undefined" || domObserver || listeners.size === 0) {
763
+ return;
764
+ }
765
+ domObserver = new MutationObserver(() => {
766
+ emitIfSnapshotChanged();
767
+ });
768
+ domObserver.observe(document.documentElement, {
769
+ attributes: true,
770
+ childList: true,
771
+ subtree: true,
772
+ attributeFilter: [
773
+ "data-fullscreen-state",
774
+ "data-fullscreen-state-root",
775
+ "data-affect-global-state"
776
+ ]
777
+ });
778
+ }
779
+ function releaseDomObserver() {
780
+ if (listeners.size > 0 || !domObserver) {
781
+ return;
782
+ }
783
+ domObserver.disconnect();
784
+ domObserver = null;
785
+ }
786
+ function subscribe(listener) {
787
+ listeners.add(listener);
788
+ ensureDomObserver();
789
+ emitIfSnapshotChanged();
790
+ return () => {
791
+ listeners.delete(listener);
792
+ releaseDomObserver();
793
+ };
794
+ }
795
+ function getSnapshot() {
796
+ return getDomSnapshot();
797
+ }
798
+ function useIsFullscreenStateActive() {
799
+ return useSyncExternalStore(subscribe, getSnapshot, () => false);
800
+ }
801
+
802
+ export { useAsyncAction, useClickOutside, useControllableState, useDebounce, useEscapeKey, useEventState, useGlobalEvent, useHotkey, useIntersectionObserver, useIsFullscreenStateActive, useIsomorphicLayoutEffect, useLocalStorage, useMediaQuery, useMounted, useRequiredContext, useServerAction, useSessionStorage, useStorageState, useStore };
803
+ //# sourceMappingURL=index.js.map
804
+ //# sourceMappingURL=index.js.map