@usels/core 0.0.1-beta.3

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 (341) hide show
  1. package/README.md +21 -0
  2. package/dist/browser/useEventListener/index.d.mts +56 -0
  3. package/dist/browser/useEventListener/index.d.ts +56 -0
  4. package/dist/browser/useEventListener/index.js +112 -0
  5. package/dist/browser/useEventListener/index.js.map +1 -0
  6. package/dist/browser/useEventListener/index.mjs +88 -0
  7. package/dist/browser/useEventListener/index.mjs.map +1 -0
  8. package/dist/browser/useMediaQuery/demo.d.mts +5 -0
  9. package/dist/browser/useMediaQuery/demo.d.ts +5 -0
  10. package/dist/browser/useMediaQuery/demo.js +82 -0
  11. package/dist/browser/useMediaQuery/demo.js.map +1 -0
  12. package/dist/browser/useMediaQuery/demo.mjs +62 -0
  13. package/dist/browser/useMediaQuery/demo.mjs.map +1 -0
  14. package/dist/browser/useMediaQuery/index.d.mts +11 -0
  15. package/dist/browser/useMediaQuery/index.d.ts +11 -0
  16. package/dist/browser/useMediaQuery/index.js +89 -0
  17. package/dist/browser/useMediaQuery/index.js.map +1 -0
  18. package/dist/browser/useMediaQuery/index.mjs +64 -0
  19. package/dist/browser/useMediaQuery/index.mjs.map +1 -0
  20. package/dist/components/Auto/index.d.mts +33 -0
  21. package/dist/components/Auto/index.d.ts +33 -0
  22. package/dist/components/Auto/index.js +66 -0
  23. package/dist/components/Auto/index.js.map +1 -0
  24. package/dist/components/Auto/index.mjs +34 -0
  25. package/dist/components/Auto/index.mjs.map +1 -0
  26. package/dist/elements/useDocumentVisibility/demo.d.mts +5 -0
  27. package/dist/elements/useDocumentVisibility/demo.d.ts +5 -0
  28. package/dist/elements/useDocumentVisibility/demo.js +130 -0
  29. package/dist/elements/useDocumentVisibility/demo.js.map +1 -0
  30. package/dist/elements/useDocumentVisibility/demo.mjs +114 -0
  31. package/dist/elements/useDocumentVisibility/demo.mjs.map +1 -0
  32. package/dist/elements/useDocumentVisibility/index.d.mts +5 -0
  33. package/dist/elements/useDocumentVisibility/index.d.ts +5 -0
  34. package/dist/elements/useDocumentVisibility/index.js +45 -0
  35. package/dist/elements/useDocumentVisibility/index.js.map +1 -0
  36. package/dist/elements/useDocumentVisibility/index.mjs +21 -0
  37. package/dist/elements/useDocumentVisibility/index.mjs.map +1 -0
  38. package/dist/elements/useElementBounding/demo.d.mts +5 -0
  39. package/dist/elements/useElementBounding/demo.d.ts +5 -0
  40. package/dist/elements/useElementBounding/demo.js +86 -0
  41. package/dist/elements/useElementBounding/demo.js.map +1 -0
  42. package/dist/elements/useElementBounding/demo.mjs +66 -0
  43. package/dist/elements/useElementBounding/demo.mjs.map +1 -0
  44. package/dist/elements/useElementBounding/index.d.mts +46 -0
  45. package/dist/elements/useElementBounding/index.d.ts +46 -0
  46. package/dist/elements/useElementBounding/index.js +122 -0
  47. package/dist/elements/useElementBounding/index.js.map +1 -0
  48. package/dist/elements/useElementBounding/index.mjs +98 -0
  49. package/dist/elements/useElementBounding/index.mjs.map +1 -0
  50. package/dist/elements/useElementSize/demo.d.mts +5 -0
  51. package/dist/elements/useElementSize/demo.d.ts +5 -0
  52. package/dist/elements/useElementSize/demo.js +82 -0
  53. package/dist/elements/useElementSize/demo.js.map +1 -0
  54. package/dist/elements/useElementSize/demo.mjs +62 -0
  55. package/dist/elements/useElementSize/demo.mjs.map +1 -0
  56. package/dist/elements/useElementSize/index.d.mts +34 -0
  57. package/dist/elements/useElementSize/index.d.ts +34 -0
  58. package/dist/elements/useElementSize/index.js +85 -0
  59. package/dist/elements/useElementSize/index.js.map +1 -0
  60. package/dist/elements/useElementSize/index.mjs +61 -0
  61. package/dist/elements/useElementSize/index.mjs.map +1 -0
  62. package/dist/elements/useElementVisibility/demo.d.mts +5 -0
  63. package/dist/elements/useElementVisibility/demo.d.ts +5 -0
  64. package/dist/elements/useElementVisibility/demo.js +110 -0
  65. package/dist/elements/useElementVisibility/demo.js.map +1 -0
  66. package/dist/elements/useElementVisibility/demo.mjs +90 -0
  67. package/dist/elements/useElementVisibility/demo.mjs.map +1 -0
  68. package/dist/elements/useElementVisibility/index.d.mts +43 -0
  69. package/dist/elements/useElementVisibility/index.d.ts +43 -0
  70. package/dist/elements/useElementVisibility/index.js +58 -0
  71. package/dist/elements/useElementVisibility/index.js.map +1 -0
  72. package/dist/elements/useElementVisibility/index.mjs +34 -0
  73. package/dist/elements/useElementVisibility/index.mjs.map +1 -0
  74. package/dist/elements/useIntersectionObserver/demo.d.mts +5 -0
  75. package/dist/elements/useIntersectionObserver/demo.d.ts +5 -0
  76. package/dist/elements/useIntersectionObserver/demo.js +173 -0
  77. package/dist/elements/useIntersectionObserver/demo.js.map +1 -0
  78. package/dist/elements/useIntersectionObserver/demo.mjs +153 -0
  79. package/dist/elements/useIntersectionObserver/demo.mjs.map +1 -0
  80. package/dist/elements/useIntersectionObserver/index.d.mts +47 -0
  81. package/dist/elements/useIntersectionObserver/index.d.ts +47 -0
  82. package/dist/elements/useIntersectionObserver/index.js +111 -0
  83. package/dist/elements/useIntersectionObserver/index.js.map +1 -0
  84. package/dist/elements/useIntersectionObserver/index.mjs +87 -0
  85. package/dist/elements/useIntersectionObserver/index.mjs.map +1 -0
  86. package/dist/elements/useMouseInElement/demo.d.mts +5 -0
  87. package/dist/elements/useMouseInElement/demo.d.ts +5 -0
  88. package/dist/elements/useMouseInElement/demo.js +103 -0
  89. package/dist/elements/useMouseInElement/demo.js.map +1 -0
  90. package/dist/elements/useMouseInElement/demo.mjs +83 -0
  91. package/dist/elements/useMouseInElement/demo.mjs.map +1 -0
  92. package/dist/elements/useMouseInElement/index.d.mts +56 -0
  93. package/dist/elements/useMouseInElement/index.d.ts +56 -0
  94. package/dist/elements/useMouseInElement/index.js +148 -0
  95. package/dist/elements/useMouseInElement/index.js.map +1 -0
  96. package/dist/elements/useMouseInElement/index.mjs +124 -0
  97. package/dist/elements/useMouseInElement/index.mjs.map +1 -0
  98. package/dist/elements/useMutationObserver/demo.d.mts +5 -0
  99. package/dist/elements/useMutationObserver/demo.d.ts +5 -0
  100. package/dist/elements/useMutationObserver/demo.js +240 -0
  101. package/dist/elements/useMutationObserver/demo.js.map +1 -0
  102. package/dist/elements/useMutationObserver/demo.mjs +220 -0
  103. package/dist/elements/useMutationObserver/demo.mjs.map +1 -0
  104. package/dist/elements/useMutationObserver/index.d.mts +15 -0
  105. package/dist/elements/useMutationObserver/index.d.ts +15 -0
  106. package/dist/elements/useMutationObserver/index.js +69 -0
  107. package/dist/elements/useMutationObserver/index.js.map +1 -0
  108. package/dist/elements/useMutationObserver/index.mjs +45 -0
  109. package/dist/elements/useMutationObserver/index.mjs.map +1 -0
  110. package/dist/elements/useParentElement/demo.d.mts +5 -0
  111. package/dist/elements/useParentElement/demo.d.ts +5 -0
  112. package/dist/elements/useParentElement/demo.js +132 -0
  113. package/dist/elements/useParentElement/demo.js.map +1 -0
  114. package/dist/elements/useParentElement/demo.mjs +112 -0
  115. package/dist/elements/useParentElement/demo.mjs.map +1 -0
  116. package/dist/elements/useParentElement/index.d.mts +7 -0
  117. package/dist/elements/useParentElement/index.d.ts +7 -0
  118. package/dist/elements/useParentElement/index.js +47 -0
  119. package/dist/elements/useParentElement/index.js.map +1 -0
  120. package/dist/elements/useParentElement/index.mjs +23 -0
  121. package/dist/elements/useParentElement/index.mjs.map +1 -0
  122. package/dist/elements/useRef$/index.js +89 -0
  123. package/dist/elements/useRef$/index.js.map +1 -0
  124. package/dist/elements/useRef$/index.mjs +62 -0
  125. package/dist/elements/useRef$/index.mjs.map +1 -0
  126. package/dist/elements/useRef_/index.d.mts +60 -0
  127. package/dist/elements/useRef_/index.d.ts +60 -0
  128. package/dist/elements/useResizeObserver/demo.d.mts +5 -0
  129. package/dist/elements/useResizeObserver/demo.d.ts +5 -0
  130. package/dist/elements/useResizeObserver/demo.js +90 -0
  131. package/dist/elements/useResizeObserver/demo.js.map +1 -0
  132. package/dist/elements/useResizeObserver/demo.mjs +70 -0
  133. package/dist/elements/useResizeObserver/demo.mjs.map +1 -0
  134. package/dist/elements/useResizeObserver/index.d.mts +36 -0
  135. package/dist/elements/useResizeObserver/index.d.ts +36 -0
  136. package/dist/elements/useResizeObserver/index.js +74 -0
  137. package/dist/elements/useResizeObserver/index.js.map +1 -0
  138. package/dist/elements/useResizeObserver/index.mjs +49 -0
  139. package/dist/elements/useResizeObserver/index.mjs.map +1 -0
  140. package/dist/elements/useWindowFocus/demo.d.mts +5 -0
  141. package/dist/elements/useWindowFocus/demo.d.ts +5 -0
  142. package/dist/elements/useWindowFocus/demo.js +100 -0
  143. package/dist/elements/useWindowFocus/demo.js.map +1 -0
  144. package/dist/elements/useWindowFocus/demo.mjs +80 -0
  145. package/dist/elements/useWindowFocus/demo.mjs.map +1 -0
  146. package/dist/elements/useWindowFocus/index.d.mts +5 -0
  147. package/dist/elements/useWindowFocus/index.d.ts +5 -0
  148. package/dist/elements/useWindowFocus/index.js +42 -0
  149. package/dist/elements/useWindowFocus/index.js.map +1 -0
  150. package/dist/elements/useWindowFocus/index.mjs +18 -0
  151. package/dist/elements/useWindowFocus/index.mjs.map +1 -0
  152. package/dist/elements/useWindowSize/demo.d.mts +5 -0
  153. package/dist/elements/useWindowSize/demo.d.ts +5 -0
  154. package/dist/elements/useWindowSize/demo.js +78 -0
  155. package/dist/elements/useWindowSize/demo.js.map +1 -0
  156. package/dist/elements/useWindowSize/demo.mjs +58 -0
  157. package/dist/elements/useWindowSize/demo.mjs.map +1 -0
  158. package/dist/elements/useWindowSize/index.d.mts +17 -0
  159. package/dist/elements/useWindowSize/index.d.ts +17 -0
  160. package/dist/elements/useWindowSize/index.js +96 -0
  161. package/dist/elements/useWindowSize/index.js.map +1 -0
  162. package/dist/elements/useWindowSize/index.mjs +76 -0
  163. package/dist/elements/useWindowSize/index.mjs.map +1 -0
  164. package/dist/function/get/index.d.mts +45 -0
  165. package/dist/function/get/index.d.ts +45 -0
  166. package/dist/function/get/index.js +39 -0
  167. package/dist/function/get/index.js.map +1 -0
  168. package/dist/function/get/index.mjs +15 -0
  169. package/dist/function/get/index.mjs.map +1 -0
  170. package/dist/function/peek/index.d.mts +46 -0
  171. package/dist/function/peek/index.d.ts +46 -0
  172. package/dist/function/peek/index.js +39 -0
  173. package/dist/function/peek/index.js.map +1 -0
  174. package/dist/function/peek/index.mjs +15 -0
  175. package/dist/function/peek/index.mjs.map +1 -0
  176. package/dist/function/useMayObservableOptions/index.d.mts +59 -0
  177. package/dist/function/useMayObservableOptions/index.d.ts +59 -0
  178. package/dist/function/useMayObservableOptions/index.js +109 -0
  179. package/dist/function/useMayObservableOptions/index.js.map +1 -0
  180. package/dist/function/useMayObservableOptions/index.mjs +88 -0
  181. package/dist/function/useMayObservableOptions/index.mjs.map +1 -0
  182. package/dist/function/useSupported/index.d.mts +6 -0
  183. package/dist/function/useSupported/index.d.ts +6 -0
  184. package/dist/function/useSupported/index.js +37 -0
  185. package/dist/function/useSupported/index.js.map +1 -0
  186. package/dist/function/useSupported/index.mjs +13 -0
  187. package/dist/function/useSupported/index.mjs.map +1 -0
  188. package/dist/function/useWhenMounted/index.d.mts +6 -0
  189. package/dist/function/useWhenMounted/index.d.ts +6 -0
  190. package/dist/function/useWhenMounted/index.js +37 -0
  191. package/dist/function/useWhenMounted/index.js.map +1 -0
  192. package/dist/function/useWhenMounted/index.mjs +13 -0
  193. package/dist/function/useWhenMounted/index.mjs.map +1 -0
  194. package/dist/index.d.mts +24 -0
  195. package/dist/index.d.ts +24 -0
  196. package/dist/index.js +63 -0
  197. package/dist/index.js.map +1 -0
  198. package/dist/index.mjs +22 -0
  199. package/dist/index.mjs.map +1 -0
  200. package/dist/sensors/useScroll/demo.d.mts +5 -0
  201. package/dist/sensors/useScroll/demo.d.ts +5 -0
  202. package/dist/sensors/useScroll/demo.js +121 -0
  203. package/dist/sensors/useScroll/demo.js.map +1 -0
  204. package/dist/sensors/useScroll/demo.mjs +101 -0
  205. package/dist/sensors/useScroll/demo.mjs.map +1 -0
  206. package/dist/sensors/useScroll/index.d.mts +42 -0
  207. package/dist/sensors/useScroll/index.d.ts +42 -0
  208. package/dist/sensors/useScroll/index.js +149 -0
  209. package/dist/sensors/useScroll/index.js.map +1 -0
  210. package/dist/sensors/useScroll/index.mjs +125 -0
  211. package/dist/sensors/useScroll/index.mjs.map +1 -0
  212. package/dist/sensors/useWindowScroll/demo.d.mts +5 -0
  213. package/dist/sensors/useWindowScroll/demo.d.ts +5 -0
  214. package/dist/sensors/useWindowScroll/demo.js +84 -0
  215. package/dist/sensors/useWindowScroll/demo.js.map +1 -0
  216. package/dist/sensors/useWindowScroll/demo.mjs +64 -0
  217. package/dist/sensors/useWindowScroll/demo.mjs.map +1 -0
  218. package/dist/sensors/useWindowScroll/index.d.mts +9 -0
  219. package/dist/sensors/useWindowScroll/index.d.ts +9 -0
  220. package/dist/sensors/useWindowScroll/index.js +36 -0
  221. package/dist/sensors/useWindowScroll/index.js.map +1 -0
  222. package/dist/sensors/useWindowScroll/index.mjs +12 -0
  223. package/dist/sensors/useWindowScroll/index.mjs.map +1 -0
  224. package/dist/shared/configurable.d.mts +21 -0
  225. package/dist/shared/configurable.d.ts +21 -0
  226. package/dist/shared/configurable.js +39 -0
  227. package/dist/shared/configurable.js.map +1 -0
  228. package/dist/shared/configurable.mjs +12 -0
  229. package/dist/shared/configurable.mjs.map +1 -0
  230. package/dist/shared/index.d.mts +4 -0
  231. package/dist/shared/index.d.ts +4 -0
  232. package/dist/shared/index.js +31 -0
  233. package/dist/shared/index.js.map +1 -0
  234. package/dist/shared/index.mjs +7 -0
  235. package/dist/shared/index.mjs.map +1 -0
  236. package/dist/shared/normalizeTargets/index.d.mts +21 -0
  237. package/dist/shared/normalizeTargets/index.d.ts +21 -0
  238. package/dist/shared/normalizeTargets/index.js +36 -0
  239. package/dist/shared/normalizeTargets/index.js.map +1 -0
  240. package/dist/shared/normalizeTargets/index.mjs +12 -0
  241. package/dist/shared/normalizeTargets/index.mjs.map +1 -0
  242. package/dist/shared/utils.d.mts +15 -0
  243. package/dist/shared/utils.d.ts +15 -0
  244. package/dist/shared/utils.js +87 -0
  245. package/dist/shared/utils.js.map +1 -0
  246. package/dist/shared/utils.mjs +52 -0
  247. package/dist/shared/utils.mjs.map +1 -0
  248. package/dist/types.d.mts +52 -0
  249. package/dist/types.d.ts +52 -0
  250. package/dist/types.js +17 -0
  251. package/dist/types.js.map +1 -0
  252. package/dist/types.mjs +1 -0
  253. package/dist/types.mjs.map +1 -0
  254. package/package.json +54 -0
  255. package/src/browser/useEventListener/index.md +109 -0
  256. package/src/browser/useEventListener/index.spec.ts +611 -0
  257. package/src/browser/useEventListener/index.ts +242 -0
  258. package/src/browser/useMediaQuery/demo.tsx +58 -0
  259. package/src/browser/useMediaQuery/index.md +40 -0
  260. package/src/browser/useMediaQuery/index.spec.ts +267 -0
  261. package/src/browser/useMediaQuery/index.ts +96 -0
  262. package/src/components/Auto/index.tsx +65 -0
  263. package/src/elements/useDocumentVisibility/demo.tsx +111 -0
  264. package/src/elements/useDocumentVisibility/index.md +51 -0
  265. package/src/elements/useDocumentVisibility/index.spec.ts +114 -0
  266. package/src/elements/useDocumentVisibility/index.ts +26 -0
  267. package/src/elements/useElementBounding/demo.tsx +63 -0
  268. package/src/elements/useElementBounding/index.md +59 -0
  269. package/src/elements/useElementBounding/index.ts +159 -0
  270. package/src/elements/useElementSize/demo.tsx +48 -0
  271. package/src/elements/useElementSize/index.md +60 -0
  272. package/src/elements/useElementSize/index.spec.ts +295 -0
  273. package/src/elements/useElementSize/index.ts +100 -0
  274. package/src/elements/useElementVisibility/deep-observable-pattern.spec.ts +453 -0
  275. package/src/elements/useElementVisibility/demo.tsx +97 -0
  276. package/src/elements/useElementVisibility/index.md +98 -0
  277. package/src/elements/useElementVisibility/index.spec.ts +227 -0
  278. package/src/elements/useElementVisibility/index.ts +78 -0
  279. package/src/elements/useIntersectionObserver/demo.tsx +180 -0
  280. package/src/elements/useIntersectionObserver/index.md +99 -0
  281. package/src/elements/useIntersectionObserver/index.spec.ts +482 -0
  282. package/src/elements/useIntersectionObserver/index.ts +149 -0
  283. package/src/elements/useMouseInElement/demo.tsx +79 -0
  284. package/src/elements/useMouseInElement/index.md +71 -0
  285. package/src/elements/useMouseInElement/index.spec.ts +398 -0
  286. package/src/elements/useMouseInElement/index.ts +209 -0
  287. package/src/elements/useMutationObserver/demo.tsx +270 -0
  288. package/src/elements/useMutationObserver/index.md +99 -0
  289. package/src/elements/useMutationObserver/index.spec.ts +421 -0
  290. package/src/elements/useMutationObserver/index.ts +66 -0
  291. package/src/elements/useParentElement/demo.tsx +120 -0
  292. package/src/elements/useParentElement/index.md +67 -0
  293. package/src/elements/useParentElement/index.spec.ts +208 -0
  294. package/src/elements/useParentElement/index.ts +35 -0
  295. package/src/elements/useRef$/index.md +62 -0
  296. package/src/elements/useRef$/index.spec.ts +205 -0
  297. package/src/elements/useRef$/index.ts +137 -0
  298. package/src/elements/useRef$/useImperativeHandle.spec.ts +339 -0
  299. package/src/elements/useResizeObserver/demo.tsx +56 -0
  300. package/src/elements/useResizeObserver/index.md +51 -0
  301. package/src/elements/useResizeObserver/index.spec.ts +312 -0
  302. package/src/elements/useResizeObserver/index.ts +106 -0
  303. package/src/elements/useWindowFocus/demo.tsx +71 -0
  304. package/src/elements/useWindowFocus/index.md +35 -0
  305. package/src/elements/useWindowFocus/index.spec.ts +103 -0
  306. package/src/elements/useWindowFocus/index.ts +21 -0
  307. package/src/elements/useWindowSize/demo.tsx +46 -0
  308. package/src/elements/useWindowSize/index.md +50 -0
  309. package/src/elements/useWindowSize/index.spec.ts +310 -0
  310. package/src/elements/useWindowSize/index.ts +107 -0
  311. package/src/function/get/index.md +25 -0
  312. package/src/function/get/index.spec.ts +87 -0
  313. package/src/function/get/index.ts +70 -0
  314. package/src/function/peek/index.spec.ts +97 -0
  315. package/src/function/peek/index.ts +69 -0
  316. package/src/function/useMayObservableOptions/index.spec.ts +521 -0
  317. package/src/function/useMayObservableOptions/index.ts +173 -0
  318. package/src/function/useSupported/index.md +38 -0
  319. package/src/function/useSupported/index.spec.ts +116 -0
  320. package/src/function/useSupported/index.ts +14 -0
  321. package/src/function/useWhenMounted/index.md +25 -0
  322. package/src/function/useWhenMounted/index.spec.ts +120 -0
  323. package/src/function/useWhenMounted/index.ts +16 -0
  324. package/src/index.ts +25 -0
  325. package/src/sensors/useScroll/demo.tsx +98 -0
  326. package/src/sensors/useScroll/index.md +112 -0
  327. package/src/sensors/useScroll/index.spec.ts +678 -0
  328. package/src/sensors/useScroll/index.ts +201 -0
  329. package/src/sensors/useWindowScroll/demo.tsx +69 -0
  330. package/src/sensors/useWindowScroll/index.md +88 -0
  331. package/src/sensors/useWindowScroll/index.spec.ts +69 -0
  332. package/src/sensors/useWindowScroll/index.ts +11 -0
  333. package/src/shared/configurable.ts +35 -0
  334. package/src/shared/index.ts +4 -0
  335. package/src/shared/normalizeTargets/index.spec.ts +76 -0
  336. package/src/shared/normalizeTargets/index.ts +27 -0
  337. package/src/shared/utils.ts +67 -0
  338. package/src/types.ts +56 -0
  339. package/tsconfig.json +9 -0
  340. package/tsup.config.ts +10 -0
  341. package/vitest.config.ts +22 -0
@@ -0,0 +1,112 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { ObservableHint } from "@legendapp/state";
3
+ import { Computed, useObservable } from "@legendapp/state/react";
4
+ import { useEventListener } from "../../browser/useEventListener";
5
+ import { useParentElement } from ".";
6
+ const OFFSET_Y = -15;
7
+ function overlayStyle(rect, color) {
8
+ if (!rect || rect.width === 0) return { display: "none" };
9
+ return {
10
+ position: "fixed",
11
+ pointerEvents: "none",
12
+ zIndex: 9999,
13
+ width: `${rect.width}px`,
14
+ height: `${rect.height}px`,
15
+ left: `${rect.left}px`,
16
+ top: `${rect.top + OFFSET_Y}px`,
17
+ backgroundColor: color,
18
+ outline: `1px solid ${color.replace("28", "99")}`,
19
+ transition: "all 0.05s linear"
20
+ };
21
+ }
22
+ function UseParentElementDemo() {
23
+ const element$ = useObservable(null);
24
+ const parent$ = useParentElement(element$);
25
+ useEventListener(
26
+ "mousemove",
27
+ (e) => {
28
+ const el = document.elementFromPoint(e.clientX, e.clientY);
29
+ element$.set(el ? ObservableHint.opaque(el) : null);
30
+ },
31
+ { passive: true }
32
+ );
33
+ useEventListener(
34
+ "scroll",
35
+ () => {
36
+ const el = element$.peek();
37
+ element$.set(null);
38
+ element$.set(el);
39
+ },
40
+ { passive: true, capture: true }
41
+ );
42
+ return /* @__PURE__ */ jsxs(
43
+ "div",
44
+ {
45
+ style: {
46
+ fontFamily: "monospace",
47
+ fontSize: "13px",
48
+ display: "flex",
49
+ flexDirection: "column",
50
+ gap: "4px",
51
+ padding: "4px 0"
52
+ },
53
+ children: [
54
+ /* @__PURE__ */ jsx(
55
+ "p",
56
+ {
57
+ style: {
58
+ margin: 0,
59
+ color: "var(--sl-color-gray-3, #94a3b8)",
60
+ fontSize: "12px"
61
+ },
62
+ children: "Move your mouse over the page to highlight elements."
63
+ }
64
+ ),
65
+ /* @__PURE__ */ jsx(Computed, { children: () => {
66
+ const el = element$.get();
67
+ const parent = parent$.get();
68
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "24px" }, children: [
69
+ /* @__PURE__ */ jsxs("span", { children: [
70
+ "current:",
71
+ " ",
72
+ /* @__PURE__ */ jsx("strong", { style: { color: "#a5a5a5" }, children: el ? `<${el.tagName.toLowerCase()}>` : "\u2014" })
73
+ ] }),
74
+ /* @__PURE__ */ jsxs("span", { children: [
75
+ "parent:",
76
+ " ",
77
+ /* @__PURE__ */ jsx("strong", { style: { color: "#3eaf7c" }, children: parent ? `<${parent.tagName.toLowerCase()}>` : "\u2014" })
78
+ ] })
79
+ ] });
80
+ } }),
81
+ /* @__PURE__ */ jsx(Computed, { children: () => {
82
+ const el = element$.get();
83
+ const parent = parent$.get();
84
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
85
+ /* @__PURE__ */ jsx(
86
+ "div",
87
+ {
88
+ style: overlayStyle(
89
+ el?.getBoundingClientRect() ?? null,
90
+ "#a5a5a528"
91
+ )
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsx(
95
+ "div",
96
+ {
97
+ style: overlayStyle(
98
+ parent?.getBoundingClientRect() ?? null,
99
+ "#3eaf7c28"
100
+ )
101
+ }
102
+ )
103
+ ] });
104
+ } })
105
+ ]
106
+ }
107
+ );
108
+ }
109
+ export {
110
+ UseParentElementDemo as default
111
+ };
112
+ //# sourceMappingURL=demo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useParentElement/demo.tsx"],"sourcesContent":["import { ObservableHint } from \"@legendapp/state\";\nimport type { OpaqueObject } from \"@legendapp/state\";\nimport { Computed, useObservable } from \"@legendapp/state/react\";\nimport { useEventListener } from \"../../browser/useEventListener\";\nimport { useParentElement } from \".\";\n\n// HARD CODE OFFSET\nconst OFFSET_Y = -15;\n\nfunction overlayStyle(\n rect: DOMRect | null,\n color: string,\n): React.CSSProperties {\n if (!rect || rect.width === 0) return { display: \"none\" };\n return {\n position: \"fixed\",\n pointerEvents: \"none\",\n zIndex: 9999,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n left: `${rect.left}px`,\n top: `${rect.top + OFFSET_Y}px`,\n backgroundColor: color,\n outline: `1px solid ${color.replace(\"28\", \"99\")}`,\n transition: \"all 0.05s linear\",\n };\n}\n\nexport default function UseParentElementDemo() {\n const element$ = useObservable<OpaqueObject<Element> | null>(null);\n const parent$ = useParentElement(element$ as any);\n\n useEventListener(\n \"mousemove\",\n (e: MouseEvent) => {\n const el = document.elementFromPoint(e.clientX, e.clientY);\n element$.set(el ? ObservableHint.opaque(el) : null);\n },\n { passive: true },\n );\n\n useEventListener(\n \"scroll\",\n () => {\n const el = element$.peek();\n element$.set(null);\n element$.set(el);\n },\n { passive: true, capture: true },\n );\n\n return (\n <div\n style={{\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"4px 0\",\n }}\n >\n <p\n style={{\n margin: 0,\n color: \"var(--sl-color-gray-3, #94a3b8)\",\n fontSize: \"12px\",\n }}\n >\n Move your mouse over the page to highlight elements.\n </p>\n\n <Computed>\n {() => {\n const el = element$.get() as HTMLElement | null;\n const parent = parent$.get() as HTMLElement | null;\n return (\n <div style={{ display: \"flex\", gap: \"24px\" }}>\n <span>\n current:{\" \"}\n <strong style={{ color: \"#a5a5a5\" }}>\n {el ? `<${el.tagName.toLowerCase()}>` : \"—\"}\n </strong>\n </span>\n <span>\n parent:{\" \"}\n <strong style={{ color: \"#3eaf7c\" }}>\n {parent ? `<${parent.tagName.toLowerCase()}>` : \"—\"}\n </strong>\n </span>\n </div>\n );\n }}\n </Computed>\n\n <Computed>\n {() => {\n const el = element$.get() as HTMLElement | null;\n const parent = parent$.get() as HTMLElement | null;\n return (\n <>\n <div\n style={overlayStyle(\n el?.getBoundingClientRect() ?? null,\n \"#a5a5a528\",\n )}\n />\n <div\n style={overlayStyle(\n parent?.getBoundingClientRect() ?? null,\n \"#3eaf7c28\",\n )}\n />\n </>\n );\n }}\n </Computed>\n </div>\n );\n}\n"],"mappings":"AA8DM,SAsCM,UAtCN,KAgBQ,YAhBR;AA9DN,SAAS,sBAAsB;AAE/B,SAAS,UAAU,qBAAqB;AACxC,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAGjC,MAAM,WAAW;AAEjB,SAAS,aACP,MACA,OACqB;AACrB,MAAI,CAAC,QAAQ,KAAK,UAAU,EAAG,QAAO,EAAE,SAAS,OAAO;AACxD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO,GAAG,KAAK,KAAK;AAAA,IACpB,QAAQ,GAAG,KAAK,MAAM;AAAA,IACtB,MAAM,GAAG,KAAK,IAAI;AAAA,IAClB,KAAK,GAAG,KAAK,MAAM,QAAQ;AAAA,IAC3B,iBAAiB;AAAA,IACjB,SAAS,aAAa,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC/C,YAAY;AAAA,EACd;AACF;AAEe,SAAR,uBAAwC;AAC7C,QAAM,WAAW,cAA4C,IAAI;AACjE,QAAM,UAAU,iBAAiB,QAAe;AAEhD;AAAA,IACE;AAAA,IACA,CAAC,MAAkB;AACjB,YAAM,KAAK,SAAS,iBAAiB,EAAE,SAAS,EAAE,OAAO;AACzD,eAAS,IAAI,KAAK,eAAe,OAAO,EAAE,IAAI,IAAI;AAAA,IACpD;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AAEA;AAAA,IACE;AAAA,IACA,MAAM;AACJ,YAAM,KAAK,SAAS,KAAK;AACzB,eAAS,IAAI,IAAI;AACjB,eAAS,IAAI,EAAE;AAAA,IACjB;AAAA,IACA,EAAE,SAAS,MAAM,SAAS,KAAK;AAAA,EACjC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,UAAU;AAAA,YACZ;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QAEA,oBAAC,YACE,gBAAM;AACL,gBAAM,KAAK,SAAS,IAAI;AACxB,gBAAM,SAAS,QAAQ,IAAI;AAC3B,iBACE,qBAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,GACzC;AAAA,iCAAC,UAAK;AAAA;AAAA,cACK;AAAA,cACT,oBAAC,YAAO,OAAO,EAAE,OAAO,UAAU,GAC/B,eAAK,IAAI,GAAG,QAAQ,YAAY,CAAC,MAAM,UAC1C;AAAA,eACF;AAAA,YACA,qBAAC,UAAK;AAAA;AAAA,cACI;AAAA,cACR,oBAAC,YAAO,OAAO,EAAE,OAAO,UAAU,GAC/B,mBAAS,IAAI,OAAO,QAAQ,YAAY,CAAC,MAAM,UAClD;AAAA,eACF;AAAA,aACF;AAAA,QAEJ,GACF;AAAA,QAEA,oBAAC,YACE,gBAAM;AACL,gBAAM,KAAK,SAAS,IAAI;AACxB,gBAAM,SAAS,QAAQ,IAAI;AAC3B,iBACE,iCACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,IAAI,sBAAsB,KAAK;AAAA,kBAC/B;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ,sBAAsB,KAAK;AAAA,kBACnC;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,aACF;AAAA,QAEJ,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,7 @@
1
+ import { Observable, OpaqueObject } from '@legendapp/state';
2
+ import { MaybeElement } from '../useRef_/index.mjs';
3
+ import 'react';
4
+
5
+ declare function useParentElement(element?: MaybeElement): Observable<OpaqueObject<HTMLElement | SVGElement> | null>;
6
+
7
+ export { useParentElement };
@@ -0,0 +1,7 @@
1
+ import { Observable, OpaqueObject } from '@legendapp/state';
2
+ import { MaybeElement } from '../useRef_/index.js';
3
+ import 'react';
4
+
5
+ declare function useParentElement(element?: MaybeElement): Observable<OpaqueObject<HTMLElement | SVGElement> | null>;
6
+
7
+ export { useParentElement };
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var useParentElement_exports = {};
20
+ __export(useParentElement_exports, {
21
+ useParentElement: () => useParentElement
22
+ });
23
+ module.exports = __toCommonJS(useParentElement_exports);
24
+ var import_state = require("@legendapp/state");
25
+ var import_react = require("@legendapp/state/react");
26
+ var import_useRef = require("../useRef$");
27
+ function useParentElement(element) {
28
+ const parent$ = (0, import_react.useObservable)(
29
+ null
30
+ );
31
+ const update = () => {
32
+ if (!element) return;
33
+ const el = (0, import_useRef.getElement)(element);
34
+ const parent = el?.parentElement ?? null;
35
+ parent$.set(
36
+ parent ? import_state.ObservableHint.opaque(parent) : null
37
+ );
38
+ };
39
+ (0, import_react.useMount)(update);
40
+ (0, import_react.useObserve)(update, { immediate: false });
41
+ return parent$;
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ useParentElement
46
+ });
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useParentElement/index.ts"],"sourcesContent":["import type { Observable, OpaqueObject } from \"@legendapp/state\";\nimport { ObservableHint } from \"@legendapp/state\";\nimport { useMount, useObservable, useObserve } from \"@legendapp/state/react\";\nimport { getElement } from \"../useRef$\";\nimport type { MaybeElement } from \"../useRef$\";\n\nexport function useParentElement(\n element?: MaybeElement,\n): Observable<OpaqueObject<HTMLElement | SVGElement> | null> {\n const parent$ = useObservable<OpaqueObject<HTMLElement | SVGElement> | null>(\n null,\n );\n\n /**\n * NOTE: plain element (non-Observable, non-Ref$)을 전달한 경우,\n * 해당 요소가 DOM 내에서 다른 부모로 이동하더라도 자동으로 갱신되지 않습니다.\n * 동적 감지가 필요하면 Ref$ 또는 Observable<Element>를 사용하세요.\n */\n const update = () => {\n if (!element) return;\n const el = getElement(element as MaybeElement);\n // Document / Window 는 parentElement 프로퍼티가 없으므로 null → SSR-safe\n const parent = (el as HTMLElement | null)?.parentElement ?? null;\n parent$.set(\n parent\n ? ObservableHint.opaque(parent as unknown as HTMLElement | SVGElement)\n : null,\n );\n };\n\n useMount(update);\n useObserve(update, { immediate: false });\n\n return parent$;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA+B;AAC/B,mBAAoD;AACpD,oBAA2B;AAGpB,SAAS,iBACd,SAC2D;AAC3D,QAAM,cAAU;AAAA,IACd;AAAA,EACF;AAOA,QAAM,SAAS,MAAM;AACnB,QAAI,CAAC,QAAS;AACd,UAAM,SAAK,0BAAW,OAAuB;AAE7C,UAAM,SAAU,IAA2B,iBAAiB;AAC5D,YAAQ;AAAA,MACN,SACI,4BAAe,OAAO,MAA6C,IACnE;AAAA,IACN;AAAA,EACF;AAEA,6BAAS,MAAM;AACf,+BAAW,QAAQ,EAAE,WAAW,MAAM,CAAC;AAEvC,SAAO;AACT;","names":[]}
@@ -0,0 +1,23 @@
1
+ import { ObservableHint } from "@legendapp/state";
2
+ import { useMount, useObservable, useObserve } from "@legendapp/state/react";
3
+ import { getElement } from "../useRef$";
4
+ function useParentElement(element) {
5
+ const parent$ = useObservable(
6
+ null
7
+ );
8
+ const update = () => {
9
+ if (!element) return;
10
+ const el = getElement(element);
11
+ const parent = el?.parentElement ?? null;
12
+ parent$.set(
13
+ parent ? ObservableHint.opaque(parent) : null
14
+ );
15
+ };
16
+ useMount(update);
17
+ useObserve(update, { immediate: false });
18
+ return parent$;
19
+ }
20
+ export {
21
+ useParentElement
22
+ };
23
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useParentElement/index.ts"],"sourcesContent":["import type { Observable, OpaqueObject } from \"@legendapp/state\";\nimport { ObservableHint } from \"@legendapp/state\";\nimport { useMount, useObservable, useObserve } from \"@legendapp/state/react\";\nimport { getElement } from \"../useRef$\";\nimport type { MaybeElement } from \"../useRef$\";\n\nexport function useParentElement(\n element?: MaybeElement,\n): Observable<OpaqueObject<HTMLElement | SVGElement> | null> {\n const parent$ = useObservable<OpaqueObject<HTMLElement | SVGElement> | null>(\n null,\n );\n\n /**\n * NOTE: plain element (non-Observable, non-Ref$)을 전달한 경우,\n * 해당 요소가 DOM 내에서 다른 부모로 이동하더라도 자동으로 갱신되지 않습니다.\n * 동적 감지가 필요하면 Ref$ 또는 Observable<Element>를 사용하세요.\n */\n const update = () => {\n if (!element) return;\n const el = getElement(element as MaybeElement);\n // Document / Window 는 parentElement 프로퍼티가 없으므로 null → SSR-safe\n const parent = (el as HTMLElement | null)?.parentElement ?? null;\n parent$.set(\n parent\n ? ObservableHint.opaque(parent as unknown as HTMLElement | SVGElement)\n : null,\n );\n };\n\n useMount(update);\n useObserve(update, { immediate: false });\n\n return parent$;\n}\n"],"mappings":"AACA,SAAS,sBAAsB;AAC/B,SAAS,UAAU,eAAe,kBAAkB;AACpD,SAAS,kBAAkB;AAGpB,SAAS,iBACd,SAC2D;AAC3D,QAAM,UAAU;AAAA,IACd;AAAA,EACF;AAOA,QAAM,SAAS,MAAM;AACnB,QAAI,CAAC,QAAS;AACd,UAAM,KAAK,WAAW,OAAuB;AAE7C,UAAM,SAAU,IAA2B,iBAAiB;AAC5D,YAAQ;AAAA,MACN,SACI,eAAe,OAAO,MAA6C,IACnE;AAAA,IACN;AAAA,EACF;AAEA,WAAS,MAAM;AACf,aAAW,QAAQ,EAAE,WAAW,MAAM,CAAC;AAEvC,SAAO;AACT;","names":[]}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var useRef_exports = {};
20
+ __export(useRef_exports, {
21
+ getElement: () => getElement,
22
+ isRef$: () => isRef$,
23
+ peekElement: () => peekElement,
24
+ useRef$: () => useRef$
25
+ });
26
+ module.exports = __toCommonJS(useRef_exports);
27
+ var import_state = require("@legendapp/state");
28
+ var import_react = require("@legendapp/state/react");
29
+ var import_react2 = require("react");
30
+ var import_shared = require("../../shared");
31
+ function useRef$(externalRef) {
32
+ const el$ = (0, import_react.useObservable)(null);
33
+ const extRef = (0, import_react2.useRef)(externalRef);
34
+ extRef.current = externalRef;
35
+ return (0, import_react2.useMemo)(
36
+ () => Object.assign(
37
+ (node) => {
38
+ const ext = extRef.current;
39
+ if (typeof ext === "function") {
40
+ ext(node);
41
+ } else if (ext != null && "current" in ext) {
42
+ ext.current = node;
43
+ }
44
+ el$.set(node ? import_state.ObservableHint.opaque(node) : null);
45
+ },
46
+ {
47
+ get: () => el$.get(),
48
+ peek: () => el$.peek()
49
+ }
50
+ ),
51
+ []
52
+ // eslint-disable-line react-hooks/exhaustive-deps
53
+ );
54
+ }
55
+ function isRef$(v) {
56
+ return typeof v === "function" && !(0, import_state.isObservable)(v) && "get" in v && "peek" in v;
57
+ }
58
+ function getElement(v) {
59
+ if (isRef$(v)) {
60
+ const raw = v.get();
61
+ return raw ? raw.valueOf() : null;
62
+ }
63
+ if ((0, import_shared.isWindow)(v)) return v;
64
+ if ((0, import_state.isObservable)(v)) {
65
+ const val = v.get();
66
+ return val ? val.valueOf() : null;
67
+ }
68
+ return v;
69
+ }
70
+ function peekElement(v) {
71
+ if (isRef$(v)) {
72
+ const raw = v.peek();
73
+ return raw ? raw.valueOf() : null;
74
+ }
75
+ if ((0, import_shared.isWindow)(v)) return v;
76
+ if ((0, import_state.isObservable)(v)) {
77
+ const val = v.peek();
78
+ return val ? val.valueOf() : null;
79
+ }
80
+ return v;
81
+ }
82
+ // Annotate the CommonJS export names for ESM import in node:
83
+ 0 && (module.exports = {
84
+ getElement,
85
+ isRef$,
86
+ peekElement,
87
+ useRef$
88
+ });
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useRef$/index.ts"],"sourcesContent":["import { isObservable, ObservableHint } from \"@legendapp/state\";\nimport type { Observable, OpaqueObject } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport { type Ref, type RefObject, useMemo, useRef } from \"react\";\nimport { isWindow } from \"../../shared\";\n\nexport type Ref$<T> = ((node: T | null) => void) & {\n /** returns element, registers tracking when called inside useObserve */\n get(): OpaqueObject<T> | null;\n /** returns element without registering tracking */\n peek(): OpaqueObject<T> | null;\n};\n\n/**\n * A value that resolves to an Element, Document, Window, or null.\n *\n * - `Ref$<T>` — React-managed element ref (created via `useRef$()`). Primary choice.\n * - `Document` / `Window` — stable global singletons, always safe to pass raw.\n * - `Observable<OpaqueObject<Element> | null>` — for imperatively obtained elements.\n * Use `ObservableHint.opaque(el)` when storing: `observable(ObservableHint.opaque(el))`.\n *\n * Raw `HTMLElement` is intentionally excluded: in React's render model, elements\n * don't exist at hook call time, making raw element references inherently stale.\n */\nexport type MaybeElement =\n | Ref$<any>\n | Document\n | Window\n | null\n | Observable<OpaqueObject<Element> | null>;\n\n/**\n * Creates an observable element ref. Can be used as a drop-in replacement for\n * `useRef`, composed with callback refs, or used with `forwardRef`.\n *\n * The element is wrapped with `opaqueObject` to prevent legendapp/state\n * from making DOM properties reactive (deep observation).\n *\n * @param externalRef - Optional. Accepts callback ref, RefObject, or null (forwardRef compatible).\n * @returns A callable ref that is also observable via `get`/`peek`\n *\n * @example\n * ```tsx\n * // standalone — useRef replacement\n * const el$ = useRef$<HTMLDivElement>();\n * return <div ref={el$} />;\n *\n * // forwardRef compatible\n * const Component = forwardRef<HTMLDivElement>((props, ref) => {\n * const el$ = useRef$(ref);\n * return <div ref={el$} />;\n * });\n *\n * // callback ref composition\n * const myRef = useCallback((node: HTMLDivElement | null) => {\n * node?.focus();\n * }, []);\n * const el$ = useRef$(myRef);\n * return <div ref={el$} />;\n * ```\n */\nexport function useRef$<T extends Element = Element>(\n externalRef?: Ref<T> | null,\n): Ref$<T> {\n const el$ = useObservable<OpaqueObject<T> | null>(null);\n\n // store externalRef — simple assignment each render, no new closure\n const extRef = useRef(externalRef);\n extRef.current = externalRef;\n\n return useMemo(\n () =>\n Object.assign(\n (node: T | null) => {\n const ext = extRef.current;\n if (typeof ext === \"function\") {\n ext(node);\n } else if (ext != null && \"current\" in ext) {\n (ext as RefObject<T | null>).current = node;\n }\n (el$ as any).set(node ? ObservableHint.opaque(node) : null);\n },\n {\n get: () => el$.get(),\n peek: () => el$.peek(),\n },\n ) as Ref$<T>,\n [], // eslint-disable-line react-hooks/exhaustive-deps\n );\n}\n\n/** Type guard for Ref$ — distinguishes it from Observable and raw values */\nexport function isRef$(v: unknown): v is Ref$<Element> {\n return (\n typeof v === \"function\" && !isObservable(v) && \"get\" in v && \"peek\" in v\n );\n}\n\n/** Unwraps MaybeElement with tracking (use inside useObserve) */\nexport function getElement(\n v: MaybeElement,\n): HTMLElement | Document | Window | null {\n if (isRef$(v)) {\n const raw = v.get();\n return raw\n ? ((raw as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n if (isWindow(v)) return v;\n if (isObservable(v)) {\n const val = (v as Observable<OpaqueObject<Element> | null>).get();\n return val\n ? ((val as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n return v as Document | null;\n}\n\n/** Unwraps MaybeElement without tracking (use inside setup/peek) */\nexport function peekElement(\n v: MaybeElement,\n): HTMLElement | Document | Window | null {\n if (isRef$(v)) {\n const raw = v.peek();\n return raw\n ? ((raw as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n if (isWindow(v)) return v;\n if (isObservable(v)) {\n const val = (v as Observable<OpaqueObject<Element> | null>).peek();\n return val\n ? ((val as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n return v as Document | null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6C;AAE7C,mBAA8B;AAC9B,IAAAA,gBAA0D;AAC1D,oBAAyB;AAyDlB,SAAS,QACd,aACS;AACT,QAAM,UAAM,4BAAsC,IAAI;AAGtD,QAAM,aAAS,sBAAO,WAAW;AACjC,SAAO,UAAU;AAEjB,aAAO;AAAA,IACL,MACE,OAAO;AAAA,MACL,CAAC,SAAmB;AAClB,cAAM,MAAM,OAAO;AACnB,YAAI,OAAO,QAAQ,YAAY;AAC7B,cAAI,IAAI;AAAA,QACV,WAAW,OAAO,QAAQ,aAAa,KAAK;AAC1C,UAAC,IAA4B,UAAU;AAAA,QACzC;AACA,QAAC,IAAY,IAAI,OAAO,4BAAe,OAAO,IAAI,IAAI,IAAI;AAAA,MAC5D;AAAA,MACA;AAAA,QACE,KAAK,MAAM,IAAI,IAAI;AAAA,QACnB,MAAM,MAAM,IAAI,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACF,CAAC;AAAA;AAAA,EACH;AACF;AAGO,SAAS,OAAO,GAAgC;AACrD,SACE,OAAO,MAAM,cAAc,KAAC,2BAAa,CAAC,KAAK,SAAS,KAAK,UAAU;AAE3E;AAGO,SAAS,WACd,GACwC;AACxC,MAAI,OAAO,CAAC,GAAG;AACb,UAAM,MAAM,EAAE,IAAI;AAClB,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,UAAI,wBAAS,CAAC,EAAG,QAAO;AACxB,UAAI,2BAAa,CAAC,GAAG;AACnB,UAAM,MAAO,EAA+C,IAAI;AAChE,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,SAAO;AACT;AAGO,SAAS,YACd,GACwC;AACxC,MAAI,OAAO,CAAC,GAAG;AACb,UAAM,MAAM,EAAE,KAAK;AACnB,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,UAAI,wBAAS,CAAC,EAAG,QAAO;AACxB,UAAI,2BAAa,CAAC,GAAG;AACnB,UAAM,MAAO,EAA+C,KAAK;AACjE,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,SAAO;AACT;","names":["import_react"]}
@@ -0,0 +1,62 @@
1
+ import { isObservable, ObservableHint } from "@legendapp/state";
2
+ import { useObservable } from "@legendapp/state/react";
3
+ import { useMemo, useRef } from "react";
4
+ import { isWindow } from "../../shared";
5
+ function useRef$(externalRef) {
6
+ const el$ = useObservable(null);
7
+ const extRef = useRef(externalRef);
8
+ extRef.current = externalRef;
9
+ return useMemo(
10
+ () => Object.assign(
11
+ (node) => {
12
+ const ext = extRef.current;
13
+ if (typeof ext === "function") {
14
+ ext(node);
15
+ } else if (ext != null && "current" in ext) {
16
+ ext.current = node;
17
+ }
18
+ el$.set(node ? ObservableHint.opaque(node) : null);
19
+ },
20
+ {
21
+ get: () => el$.get(),
22
+ peek: () => el$.peek()
23
+ }
24
+ ),
25
+ []
26
+ // eslint-disable-line react-hooks/exhaustive-deps
27
+ );
28
+ }
29
+ function isRef$(v) {
30
+ return typeof v === "function" && !isObservable(v) && "get" in v && "peek" in v;
31
+ }
32
+ function getElement(v) {
33
+ if (isRef$(v)) {
34
+ const raw = v.get();
35
+ return raw ? raw.valueOf() : null;
36
+ }
37
+ if (isWindow(v)) return v;
38
+ if (isObservable(v)) {
39
+ const val = v.get();
40
+ return val ? val.valueOf() : null;
41
+ }
42
+ return v;
43
+ }
44
+ function peekElement(v) {
45
+ if (isRef$(v)) {
46
+ const raw = v.peek();
47
+ return raw ? raw.valueOf() : null;
48
+ }
49
+ if (isWindow(v)) return v;
50
+ if (isObservable(v)) {
51
+ const val = v.peek();
52
+ return val ? val.valueOf() : null;
53
+ }
54
+ return v;
55
+ }
56
+ export {
57
+ getElement,
58
+ isRef$,
59
+ peekElement,
60
+ useRef$
61
+ };
62
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useRef$/index.ts"],"sourcesContent":["import { isObservable, ObservableHint } from \"@legendapp/state\";\nimport type { Observable, OpaqueObject } from \"@legendapp/state\";\nimport { useObservable } from \"@legendapp/state/react\";\nimport { type Ref, type RefObject, useMemo, useRef } from \"react\";\nimport { isWindow } from \"../../shared\";\n\nexport type Ref$<T> = ((node: T | null) => void) & {\n /** returns element, registers tracking when called inside useObserve */\n get(): OpaqueObject<T> | null;\n /** returns element without registering tracking */\n peek(): OpaqueObject<T> | null;\n};\n\n/**\n * A value that resolves to an Element, Document, Window, or null.\n *\n * - `Ref$<T>` — React-managed element ref (created via `useRef$()`). Primary choice.\n * - `Document` / `Window` — stable global singletons, always safe to pass raw.\n * - `Observable<OpaqueObject<Element> | null>` — for imperatively obtained elements.\n * Use `ObservableHint.opaque(el)` when storing: `observable(ObservableHint.opaque(el))`.\n *\n * Raw `HTMLElement` is intentionally excluded: in React's render model, elements\n * don't exist at hook call time, making raw element references inherently stale.\n */\nexport type MaybeElement =\n | Ref$<any>\n | Document\n | Window\n | null\n | Observable<OpaqueObject<Element> | null>;\n\n/**\n * Creates an observable element ref. Can be used as a drop-in replacement for\n * `useRef`, composed with callback refs, or used with `forwardRef`.\n *\n * The element is wrapped with `opaqueObject` to prevent legendapp/state\n * from making DOM properties reactive (deep observation).\n *\n * @param externalRef - Optional. Accepts callback ref, RefObject, or null (forwardRef compatible).\n * @returns A callable ref that is also observable via `get`/`peek`\n *\n * @example\n * ```tsx\n * // standalone — useRef replacement\n * const el$ = useRef$<HTMLDivElement>();\n * return <div ref={el$} />;\n *\n * // forwardRef compatible\n * const Component = forwardRef<HTMLDivElement>((props, ref) => {\n * const el$ = useRef$(ref);\n * return <div ref={el$} />;\n * });\n *\n * // callback ref composition\n * const myRef = useCallback((node: HTMLDivElement | null) => {\n * node?.focus();\n * }, []);\n * const el$ = useRef$(myRef);\n * return <div ref={el$} />;\n * ```\n */\nexport function useRef$<T extends Element = Element>(\n externalRef?: Ref<T> | null,\n): Ref$<T> {\n const el$ = useObservable<OpaqueObject<T> | null>(null);\n\n // store externalRef — simple assignment each render, no new closure\n const extRef = useRef(externalRef);\n extRef.current = externalRef;\n\n return useMemo(\n () =>\n Object.assign(\n (node: T | null) => {\n const ext = extRef.current;\n if (typeof ext === \"function\") {\n ext(node);\n } else if (ext != null && \"current\" in ext) {\n (ext as RefObject<T | null>).current = node;\n }\n (el$ as any).set(node ? ObservableHint.opaque(node) : null);\n },\n {\n get: () => el$.get(),\n peek: () => el$.peek(),\n },\n ) as Ref$<T>,\n [], // eslint-disable-line react-hooks/exhaustive-deps\n );\n}\n\n/** Type guard for Ref$ — distinguishes it from Observable and raw values */\nexport function isRef$(v: unknown): v is Ref$<Element> {\n return (\n typeof v === \"function\" && !isObservable(v) && \"get\" in v && \"peek\" in v\n );\n}\n\n/** Unwraps MaybeElement with tracking (use inside useObserve) */\nexport function getElement(\n v: MaybeElement,\n): HTMLElement | Document | Window | null {\n if (isRef$(v)) {\n const raw = v.get();\n return raw\n ? ((raw as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n if (isWindow(v)) return v;\n if (isObservable(v)) {\n const val = (v as Observable<OpaqueObject<Element> | null>).get();\n return val\n ? ((val as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n return v as Document | null;\n}\n\n/** Unwraps MaybeElement without tracking (use inside setup/peek) */\nexport function peekElement(\n v: MaybeElement,\n): HTMLElement | Document | Window | null {\n if (isRef$(v)) {\n const raw = v.peek();\n return raw\n ? ((raw as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n if (isWindow(v)) return v;\n if (isObservable(v)) {\n const val = (v as Observable<OpaqueObject<Element> | null>).peek();\n return val\n ? ((val as OpaqueObject<Element>).valueOf() as HTMLElement)\n : null;\n }\n return v as Document | null;\n}\n"],"mappings":"AAAA,SAAS,cAAc,sBAAsB;AAE7C,SAAS,qBAAqB;AAC9B,SAAmC,SAAS,cAAc;AAC1D,SAAS,gBAAgB;AAyDlB,SAAS,QACd,aACS;AACT,QAAM,MAAM,cAAsC,IAAI;AAGtD,QAAM,SAAS,OAAO,WAAW;AACjC,SAAO,UAAU;AAEjB,SAAO;AAAA,IACL,MACE,OAAO;AAAA,MACL,CAAC,SAAmB;AAClB,cAAM,MAAM,OAAO;AACnB,YAAI,OAAO,QAAQ,YAAY;AAC7B,cAAI,IAAI;AAAA,QACV,WAAW,OAAO,QAAQ,aAAa,KAAK;AAC1C,UAAC,IAA4B,UAAU;AAAA,QACzC;AACA,QAAC,IAAY,IAAI,OAAO,eAAe,OAAO,IAAI,IAAI,IAAI;AAAA,MAC5D;AAAA,MACA;AAAA,QACE,KAAK,MAAM,IAAI,IAAI;AAAA,QACnB,MAAM,MAAM,IAAI,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACF,CAAC;AAAA;AAAA,EACH;AACF;AAGO,SAAS,OAAO,GAAgC;AACrD,SACE,OAAO,MAAM,cAAc,CAAC,aAAa,CAAC,KAAK,SAAS,KAAK,UAAU;AAE3E;AAGO,SAAS,WACd,GACwC;AACxC,MAAI,OAAO,CAAC,GAAG;AACb,UAAM,MAAM,EAAE,IAAI;AAClB,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,MAAI,SAAS,CAAC,EAAG,QAAO;AACxB,MAAI,aAAa,CAAC,GAAG;AACnB,UAAM,MAAO,EAA+C,IAAI;AAChE,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,SAAO;AACT;AAGO,SAAS,YACd,GACwC;AACxC,MAAI,OAAO,CAAC,GAAG;AACb,UAAM,MAAM,EAAE,KAAK;AACnB,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,MAAI,SAAS,CAAC,EAAG,QAAO;AACxB,MAAI,aAAa,CAAC,GAAG;AACnB,UAAM,MAAO,EAA+C,KAAK;AACjE,WAAO,MACD,IAA8B,QAAQ,IACxC;AAAA,EACN;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,60 @@
1
+ import { OpaqueObject, Observable } from '@legendapp/state';
2
+ import { Ref } from 'react';
3
+
4
+ type Ref$<T> = ((node: T | null) => void) & {
5
+ /** returns element, registers tracking when called inside useObserve */
6
+ get(): OpaqueObject<T> | null;
7
+ /** returns element without registering tracking */
8
+ peek(): OpaqueObject<T> | null;
9
+ };
10
+ /**
11
+ * A value that resolves to an Element, Document, Window, or null.
12
+ *
13
+ * - `Ref$<T>` — React-managed element ref (created via `useRef$()`). Primary choice.
14
+ * - `Document` / `Window` — stable global singletons, always safe to pass raw.
15
+ * - `Observable<OpaqueObject<Element> | null>` — for imperatively obtained elements.
16
+ * Use `ObservableHint.opaque(el)` when storing: `observable(ObservableHint.opaque(el))`.
17
+ *
18
+ * Raw `HTMLElement` is intentionally excluded: in React's render model, elements
19
+ * don't exist at hook call time, making raw element references inherently stale.
20
+ */
21
+ type MaybeElement = Ref$<any> | Document | Window | null | Observable<OpaqueObject<Element> | null>;
22
+ /**
23
+ * Creates an observable element ref. Can be used as a drop-in replacement for
24
+ * `useRef`, composed with callback refs, or used with `forwardRef`.
25
+ *
26
+ * The element is wrapped with `opaqueObject` to prevent legendapp/state
27
+ * from making DOM properties reactive (deep observation).
28
+ *
29
+ * @param externalRef - Optional. Accepts callback ref, RefObject, or null (forwardRef compatible).
30
+ * @returns A callable ref that is also observable via `get`/`peek`
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * // standalone — useRef replacement
35
+ * const el$ = useRef$<HTMLDivElement>();
36
+ * return <div ref={el$} />;
37
+ *
38
+ * // forwardRef compatible
39
+ * const Component = forwardRef<HTMLDivElement>((props, ref) => {
40
+ * const el$ = useRef$(ref);
41
+ * return <div ref={el$} />;
42
+ * });
43
+ *
44
+ * // callback ref composition
45
+ * const myRef = useCallback((node: HTMLDivElement | null) => {
46
+ * node?.focus();
47
+ * }, []);
48
+ * const el$ = useRef$(myRef);
49
+ * return <div ref={el$} />;
50
+ * ```
51
+ */
52
+ declare function useRef$<T extends Element = Element>(externalRef?: Ref<T> | null): Ref$<T>;
53
+ /** Type guard for Ref$ — distinguishes it from Observable and raw values */
54
+ declare function isRef$(v: unknown): v is Ref$<Element>;
55
+ /** Unwraps MaybeElement with tracking (use inside useObserve) */
56
+ declare function getElement(v: MaybeElement): HTMLElement | Document | Window | null;
57
+ /** Unwraps MaybeElement without tracking (use inside setup/peek) */
58
+ declare function peekElement(v: MaybeElement): HTMLElement | Document | Window | null;
59
+
60
+ export { type MaybeElement, type Ref$, getElement, isRef$, peekElement, useRef$ };
@@ -0,0 +1,60 @@
1
+ import { OpaqueObject, Observable } from '@legendapp/state';
2
+ import { Ref } from 'react';
3
+
4
+ type Ref$<T> = ((node: T | null) => void) & {
5
+ /** returns element, registers tracking when called inside useObserve */
6
+ get(): OpaqueObject<T> | null;
7
+ /** returns element without registering tracking */
8
+ peek(): OpaqueObject<T> | null;
9
+ };
10
+ /**
11
+ * A value that resolves to an Element, Document, Window, or null.
12
+ *
13
+ * - `Ref$<T>` — React-managed element ref (created via `useRef$()`). Primary choice.
14
+ * - `Document` / `Window` — stable global singletons, always safe to pass raw.
15
+ * - `Observable<OpaqueObject<Element> | null>` — for imperatively obtained elements.
16
+ * Use `ObservableHint.opaque(el)` when storing: `observable(ObservableHint.opaque(el))`.
17
+ *
18
+ * Raw `HTMLElement` is intentionally excluded: in React's render model, elements
19
+ * don't exist at hook call time, making raw element references inherently stale.
20
+ */
21
+ type MaybeElement = Ref$<any> | Document | Window | null | Observable<OpaqueObject<Element> | null>;
22
+ /**
23
+ * Creates an observable element ref. Can be used as a drop-in replacement for
24
+ * `useRef`, composed with callback refs, or used with `forwardRef`.
25
+ *
26
+ * The element is wrapped with `opaqueObject` to prevent legendapp/state
27
+ * from making DOM properties reactive (deep observation).
28
+ *
29
+ * @param externalRef - Optional. Accepts callback ref, RefObject, or null (forwardRef compatible).
30
+ * @returns A callable ref that is also observable via `get`/`peek`
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * // standalone — useRef replacement
35
+ * const el$ = useRef$<HTMLDivElement>();
36
+ * return <div ref={el$} />;
37
+ *
38
+ * // forwardRef compatible
39
+ * const Component = forwardRef<HTMLDivElement>((props, ref) => {
40
+ * const el$ = useRef$(ref);
41
+ * return <div ref={el$} />;
42
+ * });
43
+ *
44
+ * // callback ref composition
45
+ * const myRef = useCallback((node: HTMLDivElement | null) => {
46
+ * node?.focus();
47
+ * }, []);
48
+ * const el$ = useRef$(myRef);
49
+ * return <div ref={el$} />;
50
+ * ```
51
+ */
52
+ declare function useRef$<T extends Element = Element>(externalRef?: Ref<T> | null): Ref$<T>;
53
+ /** Type guard for Ref$ — distinguishes it from Observable and raw values */
54
+ declare function isRef$(v: unknown): v is Ref$<Element>;
55
+ /** Unwraps MaybeElement with tracking (use inside useObserve) */
56
+ declare function getElement(v: MaybeElement): HTMLElement | Document | Window | null;
57
+ /** Unwraps MaybeElement without tracking (use inside setup/peek) */
58
+ declare function peekElement(v: MaybeElement): HTMLElement | Document | Window | null;
59
+
60
+ export { type MaybeElement, type Ref$, getElement, isRef$, peekElement, useRef$ };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseResizeObserverDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseResizeObserverDemo as default };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseResizeObserverDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseResizeObserverDemo as default };
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var demo_exports = {};
20
+ __export(demo_exports, {
21
+ default: () => UseResizeObserverDemo
22
+ });
23
+ module.exports = __toCommonJS(demo_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import_useRef = require("../useRef$");
26
+ var import__ = require(".");
27
+ var import_react = require("@legendapp/state/react");
28
+ function UseResizeObserverDemo() {
29
+ const el$ = (0, import_useRef.useRef$)();
30
+ const size$ = (0, import_react.useObservable)({ width: 0, height: 0 });
31
+ (0, import__.useResizeObserver)(el$, (entries) => {
32
+ const { width, height } = entries[0].contentRect;
33
+ size$.assign({
34
+ width: Math.round(width),
35
+ height: Math.round(height)
36
+ });
37
+ });
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "12px" }, children: [
39
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
40
+ "div",
41
+ {
42
+ style: {
43
+ display: "flex",
44
+ gap: "24px",
45
+ fontFamily: "monospace",
46
+ fontSize: "14px",
47
+ padding: "8px 12px",
48
+ background: "var(--sl-color-gray-6, #f1f5f9)",
49
+ borderRadius: "6px"
50
+ },
51
+ children: [
52
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
53
+ "width: ",
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
55
+ size$.width.get(),
56
+ "px"
57
+ ] })
58
+ ] }),
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
60
+ "height: ",
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("strong", { children: [
62
+ size$.height.get(),
63
+ "px"
64
+ ] })
65
+ ] })
66
+ ]
67
+ }
68
+ ),
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
70
+ "textarea",
71
+ {
72
+ ref: el$,
73
+ defaultValue: "resize this textarea",
74
+ style: {
75
+ resize: "both",
76
+ overflow: "auto",
77
+ width: "300px",
78
+ height: "120px",
79
+ padding: "10px",
80
+ border: "1px solid var(--sl-color-gray-5, #cbd5e1)",
81
+ borderRadius: "6px",
82
+ fontFamily: "inherit",
83
+ fontSize: "14px",
84
+ lineHeight: "1.5"
85
+ }
86
+ }
87
+ )
88
+ ] });
89
+ }
90
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/elements/useResizeObserver/demo.tsx"],"sourcesContent":["import { useRef$ } from \"../useRef$\";\nimport { useResizeObserver } from \".\";\nimport { useObservable } from \"@legendapp/state/react\";\n\nexport default function UseResizeObserverDemo() {\n const el$ = useRef$<HTMLTextAreaElement>();\n const size$ = useObservable({ width: 0, height: 0 });\n\n useResizeObserver(el$, (entries) => {\n const { width, height } = entries[0].contentRect;\n\n size$.assign({\n width: Math.round(width),\n height: Math.round(height),\n });\n });\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: \"12px\" }}>\n <div\n style={{\n display: \"flex\",\n gap: \"24px\",\n fontFamily: \"monospace\",\n fontSize: \"14px\",\n padding: \"8px 12px\",\n background: \"var(--sl-color-gray-6, #f1f5f9)\",\n borderRadius: \"6px\",\n }}\n >\n <span>\n width: <strong>{size$.width.get()}px</strong>\n </span>\n <span>\n height: <strong>{size$.height.get()}px</strong>\n </span>\n </div>\n <textarea\n ref={el$}\n defaultValue=\"resize this textarea\"\n style={{\n resize: \"both\",\n overflow: \"auto\",\n width: \"300px\",\n height: \"120px\",\n padding: \"10px\",\n border: \"1px solid var(--sl-color-gray-5, #cbd5e1)\",\n borderRadius: \"6px\",\n fontFamily: \"inherit\",\n fontSize: \"14px\",\n lineHeight: \"1.5\",\n }}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BiB;AA/BjB,oBAAwB;AACxB,eAAkC;AAClC,mBAA8B;AAEf,SAAR,wBAAyC;AAC9C,QAAM,UAAM,uBAA6B;AACzC,QAAM,YAAQ,4BAAc,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAEnD,kCAAkB,KAAK,CAAC,YAAY;AAClC,UAAM,EAAE,OAAO,OAAO,IAAI,QAAQ,CAAC,EAAE;AAErC,UAAM,OAAO;AAAA,MACX,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB,QAAQ,KAAK,MAAM,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH,CAAC;AAED,SACE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAClE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,QAEA;AAAA,uDAAC,UAAK;AAAA;AAAA,YACG,6CAAC,YAAQ;AAAA,oBAAM,MAAM,IAAI;AAAA,cAAE;AAAA,eAAE;AAAA,aACtC;AAAA,UACA,6CAAC,UAAK;AAAA;AAAA,YACI,6CAAC,YAAQ;AAAA,oBAAM,OAAO,IAAI;AAAA,cAAE;AAAA,eAAE;AAAA,aACxC;AAAA;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,cAAa;AAAA,QACb,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}