foldkit-primitives 0.15.3 → 0.16.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 (422) hide show
  1. package/dist/device/fullscreen.d.ts +28 -0
  2. package/dist/device/fullscreen.d.ts.map +1 -0
  3. package/dist/device/fullscreen.js +69 -0
  4. package/dist/device/fullscreen.js.map +1 -0
  5. package/dist/device/geolocation.d.ts +56 -0
  6. package/dist/device/geolocation.d.ts.map +1 -0
  7. package/dist/device/geolocation.js +87 -0
  8. package/dist/device/geolocation.js.map +1 -0
  9. package/dist/device/index.d.ts +5 -0
  10. package/dist/device/index.js +6 -0
  11. package/dist/device/media-devices.d.ts +88 -0
  12. package/dist/device/media-devices.d.ts.map +1 -0
  13. package/dist/device/media-devices.js +117 -0
  14. package/dist/device/media-devices.js.map +1 -0
  15. package/dist/device/media-stream.d.ts +93 -0
  16. package/dist/device/media-stream.d.ts.map +1 -0
  17. package/dist/device/media-stream.js +106 -0
  18. package/dist/device/media-stream.js.map +1 -0
  19. package/dist/device/permissions.d.ts +106 -0
  20. package/dist/device/permissions.d.ts.map +1 -0
  21. package/dist/device/permissions.js +143 -0
  22. package/dist/device/permissions.js.map +1 -0
  23. package/dist/dom/autofocus.d.ts +15 -0
  24. package/dist/dom/autofocus.d.ts.map +1 -0
  25. package/dist/dom/autofocus.js +22 -0
  26. package/dist/dom/autofocus.js.map +1 -0
  27. package/dist/dom/clipboard.d.ts +30 -0
  28. package/dist/dom/clipboard.d.ts.map +1 -0
  29. package/dist/dom/clipboard.js +50 -0
  30. package/dist/dom/clipboard.js.map +1 -0
  31. package/dist/dom/editable-text.d.ts +72 -0
  32. package/dist/dom/editable-text.d.ts.map +1 -0
  33. package/dist/dom/editable-text.js +232 -0
  34. package/dist/dom/editable-text.js.map +1 -0
  35. package/dist/dom/fluid-hover.d.ts +93 -0
  36. package/dist/dom/fluid-hover.d.ts.map +1 -0
  37. package/dist/dom/fluid-hover.js +294 -0
  38. package/dist/dom/fluid-hover.js.map +1 -0
  39. package/dist/dom/focus-scope.d.ts +21 -0
  40. package/dist/dom/focus-scope.d.ts.map +1 -0
  41. package/dist/dom/focus-scope.js +93 -0
  42. package/dist/dom/focus-scope.js.map +1 -0
  43. package/dist/dom/follow-tab-stop.d.ts +11 -0
  44. package/dist/dom/follow-tab-stop.d.ts.map +1 -0
  45. package/dist/dom/follow-tab-stop.js +54 -0
  46. package/dist/dom/follow-tab-stop.js.map +1 -0
  47. package/dist/dom/image-decode.d.ts +27 -0
  48. package/dist/dom/image-decode.d.ts.map +1 -0
  49. package/dist/dom/image-decode.js +50 -0
  50. package/dist/dom/image-decode.js.map +1 -0
  51. package/dist/dom/index.d.ts +24 -0
  52. package/dist/dom/index.js +25 -0
  53. package/dist/dom/input-mask.d.ts +35 -0
  54. package/dist/dom/input-mask.d.ts.map +1 -0
  55. package/dist/dom/input-mask.js +90 -0
  56. package/dist/dom/input-mask.js.map +1 -0
  57. package/dist/dom/keep-in-view.d.ts +16 -0
  58. package/dist/dom/keep-in-view.d.ts.map +1 -0
  59. package/dist/dom/keep-in-view.js +38 -0
  60. package/dist/dom/keep-in-view.js.map +1 -0
  61. package/dist/dom/keyboard-inset.d.ts +29 -0
  62. package/dist/dom/keyboard-inset.d.ts.map +1 -0
  63. package/dist/dom/keyboard-inset.js +45 -0
  64. package/dist/dom/keyboard-inset.js.map +1 -0
  65. package/dist/dom/layers.d.ts +6 -0
  66. package/dist/dom/layers.d.ts.map +1 -0
  67. package/dist/dom/layers.js +35 -0
  68. package/dist/dom/layers.js.map +1 -0
  69. package/dist/dom/measure.d.ts +42 -0
  70. package/dist/dom/measure.d.ts.map +1 -0
  71. package/dist/dom/measure.js +123 -0
  72. package/dist/dom/measure.js.map +1 -0
  73. package/dist/dom/move.d.ts +45 -0
  74. package/dist/dom/move.d.ts.map +1 -0
  75. package/dist/dom/move.js +96 -0
  76. package/dist/dom/move.js.map +1 -0
  77. package/dist/dom/pointed-links.d.ts +13 -0
  78. package/dist/dom/pointed-links.d.ts.map +1 -0
  79. package/dist/dom/pointed-links.js +59 -0
  80. package/dist/dom/pointed-links.js.map +1 -0
  81. package/dist/dom/pointer-drag.d.ts +132 -0
  82. package/dist/dom/pointer-drag.d.ts.map +1 -0
  83. package/dist/dom/pointer-drag.js +307 -0
  84. package/dist/dom/pointer-drag.js.map +1 -0
  85. package/dist/dom/pointer-position.d.ts +133 -0
  86. package/dist/dom/pointer-position.d.ts.map +1 -0
  87. package/dist/dom/pointer-position.js +173 -0
  88. package/dist/dom/pointer-position.js.map +1 -0
  89. package/dist/dom/script-loader.d.ts +12 -0
  90. package/dist/dom/script-loader.d.ts.map +1 -0
  91. package/dist/dom/script-loader.js +54 -0
  92. package/dist/dom/script-loader.js.map +1 -0
  93. package/dist/dom/scroll-bars.d.ts +52 -0
  94. package/dist/dom/scroll-bars.d.ts.map +1 -0
  95. package/dist/dom/scroll-bars.js +259 -0
  96. package/dist/dom/scroll-bars.js.map +1 -0
  97. package/dist/dom/scroll-settle.d.ts +33 -0
  98. package/dist/dom/scroll-settle.d.ts.map +1 -0
  99. package/dist/dom/scroll-settle.js +84 -0
  100. package/dist/dom/scroll-settle.js.map +1 -0
  101. package/dist/dom/scroll.d.ts +21 -0
  102. package/dist/dom/scroll.d.ts.map +1 -0
  103. package/dist/dom/scroll.js +141 -0
  104. package/dist/dom/scroll.js.map +1 -0
  105. package/dist/dom/share.d.ts +19 -0
  106. package/dist/dom/share.d.ts.map +1 -0
  107. package/dist/dom/share.js +41 -0
  108. package/dist/dom/share.js.map +1 -0
  109. package/dist/dom/swipe.d.ts +121 -0
  110. package/dist/dom/swipe.d.ts.map +1 -0
  111. package/dist/dom/swipe.js +291 -0
  112. package/dist/dom/swipe.js.map +1 -0
  113. package/dist/dom/targets.d.ts +45 -0
  114. package/dist/dom/targets.d.ts.map +1 -0
  115. package/dist/dom/targets.js +70 -0
  116. package/dist/dom/targets.js.map +1 -0
  117. package/dist/dom/track-box.d.ts +61 -0
  118. package/dist/dom/track-box.d.ts.map +1 -0
  119. package/dist/dom/track-box.js +131 -0
  120. package/dist/dom/track-box.js.map +1 -0
  121. package/dist/events/active-element.d.ts +15 -0
  122. package/dist/events/active-element.d.ts.map +1 -0
  123. package/dist/events/active-element.js +33 -0
  124. package/dist/events/active-element.js.map +1 -0
  125. package/dist/events/hotkeys.d.ts +22 -0
  126. package/dist/events/hotkeys.d.ts.map +1 -0
  127. package/dist/events/hotkeys.js +56 -0
  128. package/dist/events/hotkeys.js.map +1 -0
  129. package/dist/events/idle.d.ts +29 -0
  130. package/dist/events/idle.d.ts.map +1 -0
  131. package/dist/events/idle.js +51 -0
  132. package/dist/events/idle.js.map +1 -0
  133. package/dist/events/index.d.ts +9 -0
  134. package/dist/events/index.js +10 -0
  135. package/dist/{input-modality-BY-bSrEc.d.mts → events/input-modality.d.ts} +9 -12
  136. package/dist/events/input-modality.d.ts.map +1 -0
  137. package/dist/{input-modality-BXD383jg.mjs → events/input-modality.js} +3 -4
  138. package/dist/events/input-modality.js.map +1 -0
  139. package/dist/events/keyboard.d.ts +30 -0
  140. package/dist/events/keyboard.d.ts.map +1 -0
  141. package/dist/events/keyboard.js +55 -0
  142. package/dist/events/keyboard.js.map +1 -0
  143. package/dist/events/pointer.d.ts +15 -0
  144. package/dist/events/pointer.d.ts.map +1 -0
  145. package/dist/events/pointer.js +28 -0
  146. package/dist/events/pointer.js.map +1 -0
  147. package/dist/events/scroll.d.ts +16 -0
  148. package/dist/events/scroll.d.ts.map +1 -0
  149. package/dist/events/scroll.js +29 -0
  150. package/dist/events/scroll.js.map +1 -0
  151. package/dist/events/visibility.d.ts +25 -0
  152. package/dist/events/visibility.d.ts.map +1 -0
  153. package/dist/events/visibility.js +28 -0
  154. package/dist/events/visibility.js.map +1 -0
  155. package/dist/events/window-size.d.ts +30 -0
  156. package/dist/events/window-size.d.ts.map +1 -0
  157. package/dist/events/window-size.js +63 -0
  158. package/dist/events/window-size.js.map +1 -0
  159. package/dist/index.d.ts +9 -0
  160. package/dist/index.js +10 -0
  161. package/dist/interaction/bundle-behavior.d.ts +37 -0
  162. package/dist/interaction/bundle-behavior.d.ts.map +1 -0
  163. package/dist/interaction/bundle-behavior.js +34 -0
  164. package/dist/interaction/bundle-behavior.js.map +1 -0
  165. package/dist/interaction/dismiss-layer.d.ts +100 -0
  166. package/dist/interaction/dismiss-layer.d.ts.map +1 -0
  167. package/dist/interaction/dismiss-layer.js +140 -0
  168. package/dist/interaction/dismiss-layer.js.map +1 -0
  169. package/dist/interaction/editable-text.d.ts +13 -0
  170. package/dist/interaction/editable-text.d.ts.map +1 -0
  171. package/dist/interaction/editable-text.js +17 -0
  172. package/dist/interaction/editable-text.js.map +1 -0
  173. package/dist/interaction/focus-scope.d.ts +21 -0
  174. package/dist/interaction/focus-scope.d.ts.map +1 -0
  175. package/dist/interaction/focus-scope.js +25 -0
  176. package/dist/interaction/focus-scope.js.map +1 -0
  177. package/dist/interaction/focus-visible.d.ts +9 -0
  178. package/dist/interaction/focus-visible.d.ts.map +1 -0
  179. package/dist/interaction/focus-visible.js +10 -0
  180. package/dist/interaction/focus-visible.js.map +1 -0
  181. package/dist/interaction/grid-navigation.d.ts +73 -0
  182. package/dist/interaction/grid-navigation.d.ts.map +1 -0
  183. package/dist/interaction/grid-navigation.js +137 -0
  184. package/dist/interaction/grid-navigation.js.map +1 -0
  185. package/dist/interaction/index.d.ts +21 -0
  186. package/dist/interaction/index.js +21 -0
  187. package/dist/interaction/layers.d.ts +12 -0
  188. package/dist/interaction/layers.d.ts.map +1 -0
  189. package/dist/interaction/layers.js +14 -0
  190. package/dist/interaction/layers.js.map +1 -0
  191. package/dist/interaction/list-navigation.d.ts +105 -0
  192. package/dist/interaction/list-navigation.d.ts.map +1 -0
  193. package/dist/interaction/list-navigation.js +168 -0
  194. package/dist/interaction/list-navigation.js.map +1 -0
  195. package/dist/interaction/live-announce.d.ts +70 -0
  196. package/dist/interaction/live-announce.d.ts.map +1 -0
  197. package/dist/interaction/live-announce.js +115 -0
  198. package/dist/interaction/live-announce.js.map +1 -0
  199. package/dist/interaction/long-press.d.ts +102 -0
  200. package/dist/interaction/long-press.d.ts.map +1 -0
  201. package/dist/interaction/long-press.js +115 -0
  202. package/dist/interaction/long-press.js.map +1 -0
  203. package/dist/interaction/move.d.ts +10 -0
  204. package/dist/interaction/move.d.ts.map +1 -0
  205. package/dist/interaction/move.js +17 -0
  206. package/dist/interaction/move.js.map +1 -0
  207. package/dist/interaction/overlay.d.ts +45 -0
  208. package/dist/interaction/overlay.d.ts.map +1 -0
  209. package/dist/interaction/overlay.js +57 -0
  210. package/dist/interaction/overlay.js.map +1 -0
  211. package/dist/interaction/placing.d.ts +86 -0
  212. package/dist/interaction/placing.d.ts.map +1 -0
  213. package/dist/interaction/placing.js +239 -0
  214. package/dist/interaction/placing.js.map +1 -0
  215. package/dist/interaction/pointer-drag.d.ts +23 -0
  216. package/dist/interaction/pointer-drag.d.ts.map +1 -0
  217. package/dist/interaction/pointer-drag.js +21 -0
  218. package/dist/interaction/pointer-drag.js.map +1 -0
  219. package/dist/interaction/press.d.ts +152 -0
  220. package/dist/interaction/press.d.ts.map +1 -0
  221. package/dist/interaction/press.js +229 -0
  222. package/dist/interaction/press.js.map +1 -0
  223. package/dist/interaction/roving-tabindex.d.ts +85 -0
  224. package/dist/interaction/roving-tabindex.d.ts.map +1 -0
  225. package/dist/interaction/roving-tabindex.js +142 -0
  226. package/dist/interaction/roving-tabindex.js.map +1 -0
  227. package/dist/interaction/selection.d.ts +72 -0
  228. package/dist/interaction/selection.d.ts.map +1 -0
  229. package/dist/interaction/selection.js +129 -0
  230. package/dist/interaction/selection.js.map +1 -0
  231. package/dist/interaction/targets.d.ts +15 -0
  232. package/dist/interaction/targets.d.ts.map +1 -0
  233. package/dist/interaction/targets.js +20 -0
  234. package/dist/interaction/targets.js.map +1 -0
  235. package/dist/interaction/tree-navigation.d.ts +111 -0
  236. package/dist/interaction/tree-navigation.d.ts.map +1 -0
  237. package/dist/interaction/tree-navigation.js +207 -0
  238. package/dist/interaction/tree-navigation.js.map +1 -0
  239. package/dist/interaction/typeahead.d.ts +73 -0
  240. package/dist/interaction/typeahead.d.ts.map +1 -0
  241. package/dist/interaction/typeahead.js +113 -0
  242. package/dist/interaction/typeahead.js.map +1 -0
  243. package/dist/internal.d.ts +16 -0
  244. package/dist/internal.d.ts.map +1 -0
  245. package/dist/{internal-DP-xLKbT.mjs → internal.js} +8 -7
  246. package/dist/internal.js.map +1 -0
  247. package/dist/media/breakpoints.d.ts +37 -0
  248. package/dist/media/breakpoints.d.ts.map +1 -0
  249. package/dist/media/breakpoints.js +64 -0
  250. package/dist/media/breakpoints.js.map +1 -0
  251. package/dist/media/index.d.ts +3 -0
  252. package/dist/media/index.js +4 -0
  253. package/dist/media/mediaquery.d.ts +40 -0
  254. package/dist/media/mediaquery.d.ts.map +1 -0
  255. package/dist/media/mediaquery.js +42 -0
  256. package/dist/media/mediaquery.js.map +1 -0
  257. package/dist/media/platform.d.ts +30 -0
  258. package/dist/media/platform.d.ts.map +1 -0
  259. package/dist/media/platform.js +50 -0
  260. package/dist/media/platform.js.map +1 -0
  261. package/dist/motion/index.d.ts +5 -0
  262. package/dist/motion/index.js +5 -0
  263. package/dist/motion/motion.d.ts +16 -0
  264. package/dist/motion/motion.d.ts.map +1 -0
  265. package/dist/motion/motion.js +25 -0
  266. package/dist/motion/motion.js.map +1 -0
  267. package/dist/motion/presence.d.ts +37 -0
  268. package/dist/motion/presence.d.ts.map +1 -0
  269. package/dist/motion/presence.js +65 -0
  270. package/dist/motion/presence.js.map +1 -0
  271. package/dist/motion/spring.d.ts +50 -0
  272. package/dist/motion/spring.d.ts.map +1 -0
  273. package/dist/motion/spring.js +92 -0
  274. package/dist/motion/spring.js.map +1 -0
  275. package/dist/motion/tween.d.ts +44 -0
  276. package/dist/motion/tween.d.ts.map +1 -0
  277. package/dist/motion/tween.js +65 -0
  278. package/dist/motion/tween.js.map +1 -0
  279. package/dist/net/broadcast.d.ts +39 -0
  280. package/dist/net/broadcast.d.ts.map +1 -0
  281. package/dist/net/broadcast.js +73 -0
  282. package/dist/net/broadcast.js.map +1 -0
  283. package/dist/net/index.d.ts +5 -0
  284. package/dist/net/index.js +6 -0
  285. package/dist/net/online.d.ts +24 -0
  286. package/dist/net/online.d.ts.map +1 -0
  287. package/dist/net/online.js +26 -0
  288. package/dist/net/online.js.map +1 -0
  289. package/dist/net/sharedHost.d.ts +64 -0
  290. package/dist/net/sharedHost.d.ts.map +1 -0
  291. package/dist/net/sharedHost.js +124 -0
  292. package/dist/net/sharedHost.js.map +1 -0
  293. package/dist/net/sse.d.ts +115 -0
  294. package/dist/net/sse.d.ts.map +1 -0
  295. package/dist/net/sse.js +138 -0
  296. package/dist/net/sse.js.map +1 -0
  297. package/dist/net/websocket.d.ts +172 -0
  298. package/dist/net/websocket.d.ts.map +1 -0
  299. package/dist/net/websocket.js +199 -0
  300. package/dist/net/websocket.js.map +1 -0
  301. package/dist/observers/bounds.d.ts +24 -0
  302. package/dist/observers/bounds.d.ts.map +1 -0
  303. package/dist/observers/bounds.js +51 -0
  304. package/dist/observers/bounds.js.map +1 -0
  305. package/dist/observers/index.d.ts +4 -0
  306. package/dist/observers/index.js +5 -0
  307. package/dist/observers/intersection.d.ts +18 -0
  308. package/dist/observers/intersection.d.ts.map +1 -0
  309. package/dist/observers/intersection.js +33 -0
  310. package/dist/observers/intersection.js.map +1 -0
  311. package/dist/observers/mutation.d.ts +25 -0
  312. package/dist/observers/mutation.d.ts.map +1 -0
  313. package/dist/observers/mutation.js +53 -0
  314. package/dist/observers/mutation.js.map +1 -0
  315. package/dist/observers/resize.d.ts +18 -0
  316. package/dist/observers/resize.d.ts.map +1 -0
  317. package/dist/observers/resize.js +33 -0
  318. package/dist/observers/resize.js.map +1 -0
  319. package/dist/state/history.d.ts +115 -0
  320. package/dist/state/history.d.ts.map +1 -0
  321. package/dist/state/history.js +167 -0
  322. package/dist/state/history.js.map +1 -0
  323. package/dist/state/index.d.ts +6 -0
  324. package/dist/state/index.js +7 -0
  325. package/dist/state/locale.d.ts +27 -0
  326. package/dist/state/locale.d.ts.map +1 -0
  327. package/dist/state/locale.js +25 -0
  328. package/dist/state/locale.js.map +1 -0
  329. package/dist/state/pagination.d.ts +53 -0
  330. package/dist/state/pagination.d.ts.map +1 -0
  331. package/dist/state/pagination.js +72 -0
  332. package/dist/state/pagination.js.map +1 -0
  333. package/dist/state/range.d.ts +9 -0
  334. package/dist/state/range.d.ts.map +1 -0
  335. package/dist/state/range.js +18 -0
  336. package/dist/state/range.js.map +1 -0
  337. package/dist/state/selection.d.ts +47 -0
  338. package/dist/state/selection.d.ts.map +1 -0
  339. package/dist/state/selection.js +39 -0
  340. package/dist/state/selection.js.map +1 -0
  341. package/dist/state/virtual.d.ts +201 -0
  342. package/dist/state/virtual.d.ts.map +1 -0
  343. package/dist/state/{index.mjs → virtual.js} +11 -313
  344. package/dist/state/virtual.js.map +1 -0
  345. package/dist/time/debounce.d.ts +43 -0
  346. package/dist/time/debounce.d.ts.map +1 -0
  347. package/dist/time/debounce.js +65 -0
  348. package/dist/time/debounce.js.map +1 -0
  349. package/dist/time/index.d.ts +6 -0
  350. package/dist/time/index.js +7 -0
  351. package/dist/time/interval.d.ts +37 -0
  352. package/dist/time/interval.d.ts.map +1 -0
  353. package/dist/time/interval.js +52 -0
  354. package/dist/time/interval.js.map +1 -0
  355. package/dist/time/relative.d.ts +8 -0
  356. package/dist/time/relative.d.ts.map +1 -0
  357. package/dist/time/relative.js +27 -0
  358. package/dist/time/relative.js.map +1 -0
  359. package/dist/time/throttle.d.ts +38 -0
  360. package/dist/time/throttle.d.ts.map +1 -0
  361. package/dist/time/throttle.js +39 -0
  362. package/dist/time/throttle.js.map +1 -0
  363. package/dist/time/ticks.d.ts +21 -0
  364. package/dist/time/ticks.d.ts.map +1 -0
  365. package/dist/time/ticks.js +30 -0
  366. package/dist/time/ticks.js.map +1 -0
  367. package/dist/time/timer.d.ts +32 -0
  368. package/dist/time/timer.d.ts.map +1 -0
  369. package/dist/time/timer.js +50 -0
  370. package/dist/time/timer.js.map +1 -0
  371. package/package.json +31 -31
  372. package/dist/device/index.d.mts +0 -345
  373. package/dist/device/index.d.mts.map +0 -1
  374. package/dist/device/index.mjs +0 -498
  375. package/dist/device/index.mjs.map +0 -1
  376. package/dist/dom/index.d.mts +0 -750
  377. package/dist/dom/index.d.mts.map +0 -1
  378. package/dist/dom/index.mjs +0 -1857
  379. package/dist/dom/index.mjs.map +0 -1
  380. package/dist/editable-text-1D31qthY.d.mts +0 -319
  381. package/dist/editable-text-1D31qthY.d.mts.map +0 -1
  382. package/dist/events/index.d.mts +0 -184
  383. package/dist/events/index.d.mts.map +0 -1
  384. package/dist/events/index.mjs +0 -315
  385. package/dist/events/index.mjs.map +0 -1
  386. package/dist/follow-tab-stop-Caog2qg1.mjs +0 -863
  387. package/dist/follow-tab-stop-Caog2qg1.mjs.map +0 -1
  388. package/dist/index-CmmxqSEi.d.mts +0 -149
  389. package/dist/index-CmmxqSEi.d.mts.map +0 -1
  390. package/dist/index.d.mts +0 -12
  391. package/dist/index.mjs +0 -12
  392. package/dist/input-modality-BXD383jg.mjs.map +0 -1
  393. package/dist/input-modality-BY-bSrEc.d.mts.map +0 -1
  394. package/dist/interaction/index.d.mts +0 -1194
  395. package/dist/interaction/index.d.mts.map +0 -1
  396. package/dist/interaction/index.mjs +0 -2012
  397. package/dist/interaction/index.mjs.map +0 -1
  398. package/dist/internal-DP-xLKbT.mjs.map +0 -1
  399. package/dist/media/index.d.mts +0 -109
  400. package/dist/media/index.d.mts.map +0 -1
  401. package/dist/media/index.mjs +0 -149
  402. package/dist/media/index.mjs.map +0 -1
  403. package/dist/motion/index.d.mts +0 -2
  404. package/dist/motion/index.mjs +0 -1
  405. package/dist/motion-DmFDppRn.mjs +0 -240
  406. package/dist/motion-DmFDppRn.mjs.map +0 -1
  407. package/dist/net/index.d.mts +0 -348
  408. package/dist/net/index.d.mts.map +0 -1
  409. package/dist/net/index.mjs +0 -535
  410. package/dist/net/index.mjs.map +0 -1
  411. package/dist/observers/index.d.mts +0 -84
  412. package/dist/observers/index.d.mts.map +0 -1
  413. package/dist/observers/index.mjs +0 -159
  414. package/dist/observers/index.mjs.map +0 -1
  415. package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
  416. package/dist/state/index.d.mts +0 -444
  417. package/dist/state/index.d.mts.map +0 -1
  418. package/dist/state/index.mjs.map +0 -1
  419. package/dist/time/index.d.mts +0 -179
  420. package/dist/time/index.d.mts.map +0 -1
  421. package/dist/time/index.mjs +0 -242
  422. package/dist/time/index.mjs.map +0 -1
@@ -1,863 +0,0 @@
1
- import { Effect, Queue, Schema, Stream } from "effect";
2
- import * as Mount from "foldkit/mount";
3
- import * as Dom from "foldkit/dom";
4
- //#region src/dom/focus-scope.ts
5
- const FOCUSABLE = [
6
- "a[href]",
7
- "button:not([disabled])",
8
- "input:not([disabled]):not([type=\"hidden\"])",
9
- "select:not([disabled])",
10
- "textarea:not([disabled])",
11
- "[tabindex]",
12
- "[contenteditable=\"true\"]"
13
- ].join(", ");
14
- const isVisible = (element) => {
15
- const probe = element;
16
- return element.closest("[hidden], [inert]") === null && (probe.checkVisibility?.() ?? true);
17
- };
18
- /** Tabbable descendants in DOM order: focusable, visible, and not `tabindex="-1"`. */
19
- const tabbableWithin = (root) => Array.from(root.querySelectorAll(FOCUSABLE)).filter((element) => element.tabIndex >= 0 && isVisible(element));
20
- const focusFirst = (elements) => {
21
- const first = elements[0];
22
- if (first === void 0) return false;
23
- first.focus();
24
- return true;
25
- };
26
- /**
27
- * A focus scope as a Mount: on insert it remembers what was focused, focuses
28
- * an initial element inside, and with `contain` keeps Tab and Shift+Tab
29
- * cycling inside; on unmount it gives focus back. Nothing crosses to the
30
- * Model: which element had focus is a DOM fact, so this is element lifecycle,
31
- * not state. It emits no Messages.
32
- */
33
- const FocusScope = Mount.defineStream("FocusScope", {
34
- messages: [Schema.Never],
35
- args: {
36
- /** Keep Tab, Shift+Tab, and a stray focus inside. */
37
- contain: Schema.Boolean,
38
- /** Give focus back to what had it, on unmount. */
39
- restore: Schema.Boolean,
40
- /** A selector inside the element to focus first; else the first tabbable
41
- * descendant, else the element itself when it is focusable. */
42
- initialFocus: Schema.NullOr(Schema.String)
43
- },
44
- execute: ({ element, contain, restore, initialFocus }) => Stream.callback(() => Effect.acquireRelease(Effect.sync(() => {
45
- const ownerDocument = element.ownerDocument;
46
- const previous = ownerDocument.activeElement;
47
- const initial = initialFocus === null ? null : element.querySelector(initialFocus);
48
- if (initial !== null) initial.focus();
49
- else if (!focusFirst(tabbableWithin(element)) && element instanceof HTMLElement) element.focus();
50
- const onKeyDown = (event) => {
51
- const key = event;
52
- if (key.key !== "Tab") return;
53
- const tabbable = tabbableWithin(element);
54
- const first = tabbable[0];
55
- const last = tabbable[tabbable.length - 1];
56
- if (first === void 0 || last === void 0) {
57
- key.preventDefault();
58
- return;
59
- }
60
- const active = ownerDocument.activeElement;
61
- if (key.shiftKey && (active === first || !element.contains(active))) {
62
- key.preventDefault();
63
- last.focus();
64
- } else if (!key.shiftKey && (active === last || !element.contains(active))) {
65
- key.preventDefault();
66
- first.focus();
67
- }
68
- };
69
- const onFocusIn = (event) => {
70
- const target = event.target;
71
- if (target instanceof Node && element.contains(target)) return;
72
- focusFirst(tabbableWithin(element));
73
- };
74
- if (contain) {
75
- element.addEventListener("keydown", onKeyDown);
76
- ownerDocument.addEventListener("focusin", onFocusIn);
77
- }
78
- return {
79
- previous,
80
- onKeyDown,
81
- onFocusIn,
82
- ownerDocument
83
- };
84
- }), ({ previous, onKeyDown, onFocusIn, ownerDocument }) => Effect.sync(() => {
85
- if (contain) {
86
- element.removeEventListener("keydown", onKeyDown);
87
- ownerDocument.removeEventListener("focusin", onFocusIn);
88
- }
89
- if (restore && previous instanceof HTMLElement && ownerDocument.contains(previous)) previous.focus();
90
- })))
91
- });
92
- //#endregion
93
- //#region src/dom/layers.ts
94
- /**
95
- * Two Mounts over Foldkit's own DOM helpers, for an overlay that is not a
96
- * native `<dialog>` or `popover`:
97
- *
98
- * - `ScrollLock` locks the document's scroll while mounted. Foldkit's lock is
99
- * refcounted, so nested overlays release it only when the last one goes.
100
- * - `HideOutside` marks everything outside the element inert while mounted,
101
- * through `Dom.inertOthers`, keyed by an id this Mount mints.
102
- *
103
- * Both emit no Messages; they are element lifecycle.
104
- */
105
- /** Locks the document's scroll while the element is mounted; nested locks release with the last. */
106
- const ScrollLock = Mount.defineStream("ScrollLock", {
107
- messages: [Schema.Never],
108
- execute: () => Stream.callback(() => Effect.acquireRelease(Dom.lockScroll, () => Dom.unlockScroll))
109
- });
110
- const HIDE_OUTSIDE_ATTRIBUTE = "data-foldkit-plus-hide-outside";
111
- let minted = 0;
112
- /** Makes everything outside the element inert while it is mounted, and restores it after. */
113
- const HideOutside = Mount.defineStream("HideOutside", {
114
- messages: [Schema.Never],
115
- execute: ({ element }) => Stream.callback(() => Effect.acquireRelease(Effect.gen(function* () {
116
- const id = `hide-outside-${minted += 1}`;
117
- element.setAttribute(HIDE_OUTSIDE_ATTRIBUTE, id);
118
- yield* Dom.inertOthers(id, [`[${HIDE_OUTSIDE_ATTRIBUTE}="${id}"]`]);
119
- return id;
120
- }), (id) => Effect.andThen(Dom.restoreInert(id), () => Effect.sync(() => element.removeAttribute(HIDE_OUTSIDE_ATTRIBUTE)))))
121
- });
122
- //#endregion
123
- //#region src/dom/move.ts
124
- const MoveStarted = Schema.TaggedStruct("MoveStarted", {
125
- pointerId: Schema.Number,
126
- pointerType: Schema.String
127
- });
128
- const Moved = Schema.TaggedStruct("Moved", {
129
- pointerId: Schema.Number,
130
- /** From where the pointer went down, in CSS pixels. */
131
- deltaX: Schema.Number,
132
- deltaY: Schema.Number,
133
- pointerType: Schema.String
134
- });
135
- const MoveEnded = Schema.TaggedStruct("MoveEnded", {
136
- pointerId: Schema.Number,
137
- /** `false` when the pointer was cancelled or capture was lost. */
138
- completed: Schema.Boolean
139
- });
140
- /**
141
- * Pointer movement on an element as a Mount: a primary-button pointer down
142
- * captures the pointer, each move reports the delta from where it started,
143
- * and up, cancel, or lost capture ends it. Nothing is decided here: a drag
144
- * threshold, a snap, or a constraint is the parent's `update`. Capture is
145
- * released with the Mount.
146
- */
147
- const Move = Mount.defineStream("Move", {
148
- messages: [
149
- MoveStarted,
150
- Moved,
151
- MoveEnded
152
- ],
153
- execute: ({ element }) => Stream.callback((queue) => Effect.acquireRelease(Effect.sync(() => {
154
- const target = element;
155
- let active = null;
156
- const offer = (fact) => Queue.offerUnsafe(queue, fact);
157
- const end = (pointerId, completed) => {
158
- if (active === null || active.pointerId !== pointerId) return;
159
- active = null;
160
- try {
161
- target.releasePointerCapture?.(pointerId);
162
- } catch {}
163
- offer(MoveEnded.make({
164
- pointerId,
165
- completed
166
- }));
167
- };
168
- const listeners = [
169
- ["pointerdown", (event) => {
170
- const pointer = event;
171
- if ((pointer.button ?? 0) !== 0 || active !== null) return;
172
- const pointerId = pointer.pointerId ?? 0;
173
- active = {
174
- pointerId,
175
- x: pointer.clientX ?? 0,
176
- y: pointer.clientY ?? 0
177
- };
178
- try {
179
- target.setPointerCapture?.(pointerId);
180
- } catch {}
181
- offer(MoveStarted.make({
182
- pointerId,
183
- pointerType: pointer.pointerType ?? "mouse"
184
- }));
185
- }],
186
- ["pointermove", (event) => {
187
- const pointer = event;
188
- const pointerId = pointer.pointerId ?? 0;
189
- if (active === null || active.pointerId !== pointerId) return;
190
- offer(Moved.make({
191
- pointerId,
192
- deltaX: (pointer.clientX ?? 0) - active.x,
193
- deltaY: (pointer.clientY ?? 0) - active.y,
194
- pointerType: pointer.pointerType ?? "mouse"
195
- }));
196
- }],
197
- ["pointerup", (event) => end(event.pointerId ?? 0, true)],
198
- ["pointercancel", (event) => end(event.pointerId ?? 0, false)],
199
- ["lostpointercapture", (event) => end(event.pointerId ?? 0, false)]
200
- ];
201
- for (const [type, listener] of listeners) element.addEventListener(type, listener);
202
- return {
203
- listeners,
204
- current: () => active
205
- };
206
- }), ({ listeners, current }) => Effect.sync(() => {
207
- for (const [type, listener] of listeners) element.removeEventListener(type, listener);
208
- const pointer = current();
209
- if (pointer !== null) try {
210
- element.releasePointerCapture?.(pointer.pointerId);
211
- } catch {}
212
- })))
213
- });
214
- //#endregion
215
- //#region src/dom/targets.ts
216
- const TargetHovered = Schema.TaggedStruct("TargetHovered", {
217
- /** The marked descendant under the pointer, or `null` when there is none. */
218
- id: Schema.NullOr(Schema.String) });
219
- const TargetPressed = Schema.TaggedStruct("TargetPressed", {
220
- id: Schema.String,
221
- shiftKey: Schema.Boolean,
222
- altKey: Schema.Boolean,
223
- ctrlKey: Schema.Boolean,
224
- metaKey: Schema.Boolean
225
- });
226
- /** The id of the nearest marked element at or above `from`, inside `container`. */
227
- const targetOf = (container, from, attribute) => {
228
- if (!(from instanceof Element)) return null;
229
- const marked = from.closest(`[${attribute}]`);
230
- return marked !== null && container.contains(marked) ? marked.getAttribute(attribute) : null;
231
- };
232
- /**
233
- * Which marked descendant of an element the pointer is over, and which one was
234
- * pressed, as a Mount: one set of listeners on the container, not one per item.
235
- * A descendant is marked by an attribute whose value is its id, such as a
236
- * canvas's `data-composition-node` or a table's `data-row`. The nearest marked
237
- * ancestor of the event's target, inside the container, is the one reported.
238
- *
239
- * What hovering or pressing means (a selection, an outline, a menu) is the
240
- * parent's `update`.
241
- */
242
- const Targets = Mount.defineStream("Targets", {
243
- messages: [TargetHovered, TargetPressed],
244
- args: {
245
- /** The attribute that marks a descendant, holding its id. */
246
- attribute: Schema.String,
247
- /** Prevent a press's default, such as a link navigating inside an editor's canvas. */
248
- preventDefault: Schema.Boolean
249
- },
250
- execute: ({ element, attribute, preventDefault }) => Stream.callback((queue) => Effect.acquireRelease(Effect.sync(() => {
251
- let hovered = null;
252
- const hover = (id) => {
253
- if (id === hovered) return;
254
- hovered = id;
255
- Queue.offerUnsafe(queue, TargetHovered.make({ id }));
256
- };
257
- const listeners = [
258
- ["pointerover", (event) => hover(targetOf(element, event.target, attribute))],
259
- ["pointerleave", () => hover(null)],
260
- ["click", (event) => {
261
- const id = targetOf(element, event.target, attribute);
262
- if (id === null) return;
263
- if (preventDefault) event.preventDefault();
264
- const modified = event;
265
- Queue.offerUnsafe(queue, TargetPressed.make({
266
- id,
267
- shiftKey: modified.shiftKey === true,
268
- altKey: modified.altKey === true,
269
- ctrlKey: modified.ctrlKey === true,
270
- metaKey: modified.metaKey === true
271
- }));
272
- }]
273
- ];
274
- for (const [type, listener] of listeners) element.addEventListener(type, listener);
275
- return listeners;
276
- }), (listeners) => Effect.sync(() => {
277
- for (const [type, listener] of listeners) element.removeEventListener(type, listener);
278
- })))
279
- });
280
- //#endregion
281
- //#region src/dom/pointer-drag.ts
282
- const DragZone = Schema.Literals([
283
- "before",
284
- "inside",
285
- "after"
286
- ]);
287
- /**
288
- * A marked descendant under the pointer, and the zone of it the pointer is in.
289
- * `part` is the value of the `part` attribute on the element found, such as
290
- * the empty Region of a node a drop goes into; a place with one is `inside`.
291
- */
292
- const DragPlace = Schema.Struct({
293
- id: Schema.String,
294
- zone: DragZone,
295
- part: Schema.optionalKey(Schema.String)
296
- });
297
- const DragStarted = Schema.TaggedStruct("DragStarted", {
298
- /** The marked descendant being dragged. */
299
- id: Schema.String });
300
- const DraggedOver = Schema.TaggedStruct("DraggedOver", {
301
- /** Where the pointer is, or `null` over nothing marked, or over what is dragged. */
302
- over: Schema.NullOr(DragPlace),
303
- /**
304
- * For a drag onto `targets`: whether the pointer is inside the region they
305
- * are in, so `over: null` with `region: true` is its empty space (an empty
306
- * page, the space below the last node). Absent for a drag among its own.
307
- */
308
- region: Schema.optionalKey(Schema.Boolean)
309
- });
310
- const DragDropped = Schema.TaggedStruct("DragDropped", {
311
- id: Schema.String,
312
- over: Schema.NullOr(DragPlace),
313
- /** As `DraggedOver`'s: released inside the `targets` region. */
314
- region: Schema.optionalKey(Schema.Boolean)
315
- });
316
- const DragCancelled = Schema.TaggedStruct("DragCancelled", { id: Schema.String });
317
- /** How far, in CSS pixels, a press moves before it is a drag rather than a click. */
318
- const DRAG_THRESHOLD = 4;
319
- /**
320
- * How long a finger is held still before its press is a drag. A touch that moves first is a
321
- * scroll, so a list of draggable rows still scrolls under a finger.
322
- */
323
- const HOLD_TO_DRAG_MS = 400;
324
- /** How far, in CSS pixels, a held finger may wander before the hold is a scroll. */
325
- const HOLD_SLOP = 8;
326
- /** The zone of a box a vertical position falls in, by thirds. */
327
- const zoneOf = (box, y) => {
328
- if (box.height <= 0) return "inside";
329
- const at = (y - box.top) / box.height;
330
- return at < 1 / 3 ? "before" : at > 2 / 3 ? "after" : "inside";
331
- };
332
- /**
333
- * An element's box. An element drawn as `display: contents` has none, so its
334
- * first child's stands for it, as an editor's node wrapper's does.
335
- */
336
- const boxOf = (element) => {
337
- const own = element.getBoundingClientRect();
338
- if (own.width > 0 || own.height > 0) return own;
339
- const child = element.firstElementChild;
340
- return child === null ? own : boxOf(child);
341
- };
342
- /**
343
- * Dragging one marked descendant of an element onto another, as a Mount. A
344
- * descendant is marked by an attribute whose value is its id, as `Targets`
345
- * marks them; a press on one that then moves past a threshold starts a drag (a
346
- * finger's, held still for `HOLD_TO_DRAG_MS`, as a touch that moves first scrolls), and
347
- * the pointer's place over another marked descendant is reported with the
348
- * zone of it the pointer is in: its first third (`before`), its middle
349
- * (`inside`), or its last third (`after`). Releasing drops, and Escape or a
350
- * cancelled pointer ends the drag with nothing dropped.
351
- *
352
- * It writes no roles, no `tabindex` and no key handling, so the marked
353
- * elements can be anything: a tree's rows, a canvas's nodes. The keyboard's way
354
- * to do what a drag does is the parent's to give. Geometry is measured when the
355
- * pointer moves and never kept; what a drop means is the parent's `update`.
356
- */
357
- const PointerDrag = Mount.defineStream("PointerDrag", {
358
- messages: [
359
- DragStarted,
360
- DraggedOver,
361
- DragDropped,
362
- DragCancelled
363
- ],
364
- args: {
365
- /** The attribute that marks a descendant, holding its id. */
366
- attribute: Schema.String,
367
- /**
368
- * Where a drag may land, when not on the element's own marked descendants:
369
- * the elements marked by `attribute` inside the one `within` selects, such
370
- * as a palette's Blocks dragged onto a page. A drop's `over` is then one of
371
- * those; what is dragged is still one of the element's own. `within` is
372
- * looked for nearest first, under the element's closest ancestor that holds
373
- * a match, so two editors on one page each drop onto their own.
374
- */
375
- targets: Schema.optionalKey(Schema.Struct({
376
- attribute: Schema.String,
377
- within: Schema.String
378
- })),
379
- /**
380
- * An attribute that names a part of what a drop lands on, on an element
381
- * also marked as one: a place over it carries the part and is `inside`.
382
- */
383
- part: Schema.optionalKey(Schema.String)
384
- },
385
- execute: ({ element, attribute, targets, part }) => Stream.callback((queue) => Effect.acquireRelease(Effect.sync(() => {
386
- const owner = element.ownerDocument;
387
- const landsOn = targets?.attribute ?? attribute;
388
- const regionOf = (within) => {
389
- for (let at = element.parentElement; at !== null; at = at.parentElement) {
390
- const found = at.querySelector(within);
391
- if (found !== null) return found;
392
- }
393
- return null;
394
- };
395
- const find = (from) => {
396
- if (!(from instanceof Element)) return {
397
- marked: null,
398
- inRegion: false
399
- };
400
- const region = targets === void 0 ? element : regionOf(targets.within);
401
- const marked = from.closest(`[${landsOn}]`);
402
- return {
403
- marked: marked !== null && region !== null && region.contains(marked) ? marked : null,
404
- inRegion: targets !== void 0 && region !== null && region.contains(from)
405
- };
406
- };
407
- let pressed = null;
408
- let holding;
409
- const begin = (id) => {
410
- dragging = id;
411
- owner.getSelection()?.removeAllRanges();
412
- Queue.offerUnsafe(queue, DragStarted.make({ id }));
413
- };
414
- let dragging = null;
415
- let over = null;
416
- let inRegion = false;
417
- let swallowClick = false;
418
- const placeAt = (event) => {
419
- const under = typeof owner.elementFromPoint === "function" && event.clientX !== void 0 ? owner.elementFromPoint(event.clientX, event.clientY ?? 0) : null;
420
- const { marked, inRegion: region } = find(under ?? event.target);
421
- const id = marked?.getAttribute(landsOn) ?? null;
422
- const named = part === void 0 ? null : marked?.getAttribute(part) ?? null;
423
- return {
424
- place: marked === null || id === null || targets === void 0 && id === dragging ? null : named === null ? {
425
- id,
426
- zone: zoneOf(boxOf(marked), event.clientY ?? 0)
427
- } : {
428
- id,
429
- zone: "inside",
430
- part: named
431
- },
432
- region
433
- };
434
- };
435
- /** The region flag a fact carries: only for a drag onto `targets`. */
436
- const withRegion = (region) => targets === void 0 ? {} : { region };
437
- const ours = (event) => pressed !== null && (pressed.pointer === void 0 || event.pointerId === pressed.pointer);
438
- const end = (dropped, at, inside = false) => {
439
- clearTimeout(holding);
440
- holding = void 0;
441
- const id = dragging;
442
- if (id !== null && at?.clientX !== void 0 && at.clientY !== void 0) {
443
- const { place, region } = placeAt(at);
444
- over = place;
445
- inRegion = region;
446
- }
447
- pressed = null;
448
- dragging = null;
449
- const last = over;
450
- const lastRegion = inRegion;
451
- over = null;
452
- inRegion = false;
453
- release();
454
- if (id === null) return;
455
- swallowClick = dropped && inside;
456
- Queue.offerUnsafe(queue, dropped ? DragDropped.make({
457
- id,
458
- over: last,
459
- ...withRegion(lastRegion)
460
- }) : DragCancelled.make({ id }));
461
- };
462
- const onDocument = [
463
- ["pointermove", (event) => {
464
- const positioned = event;
465
- if (!ours(positioned) || pressed === null) return;
466
- if (positioned.buttons !== void 0 && (positioned.buttons & 1) === 0) return end(false);
467
- if (dragging === null) {
468
- const moved = Math.hypot((positioned.clientX ?? 0) - pressed.x, (positioned.clientY ?? 0) - pressed.y);
469
- if (pressed.touch) return moved < 8 ? void 0 : end(false);
470
- if (moved < 4) return;
471
- begin(pressed.id);
472
- }
473
- const { place, region } = placeAt(positioned);
474
- if (place?.id === over?.id && place?.zone === over?.zone && place?.part === over?.part && region === inRegion) return;
475
- over = place;
476
- inRegion = region;
477
- Queue.offerUnsafe(queue, DraggedOver.make({
478
- over: place,
479
- ...withRegion(region)
480
- }));
481
- }],
482
- ["pointerup", (event) => {
483
- if (!ours(event)) return;
484
- if (dragging === null) end(false);
485
- else end(true, event, event.target instanceof Node && element.contains(event.target));
486
- }],
487
- ["pointercancel", (event) => {
488
- if (ours(event)) end(false);
489
- }]
490
- ];
491
- const onEscape = (event) => {
492
- if (pressed === null || event.key !== "Escape") return;
493
- event.preventDefault();
494
- event.stopPropagation();
495
- end(false);
496
- };
497
- const heldStill = (event) => {
498
- if (dragging !== null) event.preventDefault();
499
- };
500
- const noMenu = (event) => {
501
- if (pressed?.touch === true) event.preventDefault();
502
- };
503
- let listening = false;
504
- const listen = () => {
505
- if (listening) return;
506
- listening = true;
507
- for (const [type, listener] of onDocument) owner.addEventListener(type, listener);
508
- owner.addEventListener("keydown", onEscape, true);
509
- owner.addEventListener("touchmove", heldStill, { passive: false });
510
- owner.addEventListener("contextmenu", noMenu);
511
- };
512
- const release = () => {
513
- if (!listening) return;
514
- listening = false;
515
- for (const [type, listener] of onDocument) owner.removeEventListener(type, listener);
516
- owner.removeEventListener("keydown", onEscape, true);
517
- owner.removeEventListener("touchmove", heldStill);
518
- owner.removeEventListener("contextmenu", noMenu);
519
- };
520
- const onElement = [
521
- [
522
- "pointerdown",
523
- (event) => {
524
- const positioned = event;
525
- swallowClick = false;
526
- if (pressed !== null) return;
527
- if ((positioned.button ?? 0) !== 0) return;
528
- if (event.target instanceof Element && event.target.closest("[contenteditable]:not([contenteditable=\"false\"])") !== null) return;
529
- const id = targetOf(element, event.target, attribute);
530
- if (id === null) return;
531
- const touch = positioned.pointerType === "touch";
532
- pressed = {
533
- id,
534
- pointer: positioned.pointerId,
535
- x: positioned.clientX ?? 0,
536
- y: positioned.clientY ?? 0,
537
- touch
538
- };
539
- listen();
540
- if (touch) holding = setTimeout(() => {
541
- holding = void 0;
542
- if (pressed !== null && dragging === null) begin(pressed.id);
543
- }, 400);
544
- },
545
- false
546
- ],
547
- [
548
- "click",
549
- (event) => {
550
- if (!swallowClick) return;
551
- swallowClick = false;
552
- event.preventDefault();
553
- event.stopImmediatePropagation();
554
- },
555
- true
556
- ],
557
- [
558
- "dragstart",
559
- (event) => event.preventDefault(),
560
- false
561
- ]
562
- ];
563
- for (const [type, listener, capture] of onElement) element.addEventListener(type, listener, capture);
564
- const callout = element instanceof HTMLElement ? element.style.getPropertyValue("-webkit-touch-callout") : void 0;
565
- if (element instanceof HTMLElement) element.style.setProperty("-webkit-touch-callout", "none");
566
- const stop = () => {
567
- clearTimeout(holding);
568
- release();
569
- if (!(element instanceof HTMLElement)) return;
570
- if (callout === void 0 || callout === "") element.style.removeProperty("-webkit-touch-callout");
571
- else element.style.setProperty("-webkit-touch-callout", callout);
572
- };
573
- return {
574
- onElement,
575
- stop
576
- };
577
- }), ({ onElement, stop }) => Effect.sync(() => {
578
- for (const [type, listener, capture] of onElement) element.removeEventListener(type, listener, capture);
579
- stop();
580
- })))
581
- });
582
- //#endregion
583
- //#region src/dom/editable-text.ts
584
- const TextEdited = Schema.TaggedStruct("TextEdited", {
585
- /** The field, by its marking attribute's value. */
586
- field: Schema.String,
587
- text: Schema.String
588
- });
589
- const TextCommitted = Schema.TaggedStruct("TextCommitted", {
590
- field: Schema.String,
591
- text: Schema.String
592
- });
593
- const TextCancelled = Schema.TaggedStruct("TextCancelled", {
594
- field: Schema.String,
595
- /** The text the field had when editing began, which the DOM shows again. */
596
- initial: Schema.String
597
- });
598
- const EditAsked = Schema.TaggedStruct("EditAsked", {
599
- /** A marked field, not editable yet, that was double-clicked. */
600
- field: Schema.String });
601
- /** Whether a field takes more than one line. */
602
- const multiline = (element) => element.getAttribute("aria-multiline") === "true";
603
- /**
604
- * A field's text. A browser ends an edited element with a line break it adds
605
- * itself, which is not the author's; in one line, the author's breaks are spaces.
606
- */
607
- const textOf = (element) => {
608
- const text = element.innerText.replace(/\r\n?/g, "\n").replace(/\n$/, "");
609
- return multiline(element) ? text : text.replace(/\n+/g, " ");
610
- };
611
- /** Puts the caret at the end of a field, which focuses it too. */
612
- const caretAtEnd = (field) => {
613
- field.focus();
614
- const caret = document.createRange();
615
- caret.selectNodeContents(field);
616
- caret.collapse(false);
617
- const selection = window.getSelection();
618
- selection?.removeAllRanges();
619
- selection?.addRange(caret);
620
- };
621
- /** Whether a key press belongs to an input method still composing, not to the field. */
622
- const composing = (event) => event.isComposing || event.keyCode === 229;
623
- /**
624
- * Text typed into an editable descendant of an element, as a Mount: one set of
625
- * listeners on the container, like `Targets`. A field is a descendant marked
626
- * by an attribute whose value names it, while it is `contenteditable`. The
627
- * view decides which one is; the Mount focuses it as it becomes so (made
628
- * editable, or drawn editable), with the caret at its end, and at no other
629
- * time. When Enter or Escape ends an edit and the view then removes the field
630
- * or makes it no longer editable, focus, left on nothing, comes back to the
631
- * container, so the next key reaches it; give the container a `tabindex`. A double-click on a marked field that is not editable yet asks for it
632
- * to be (`EditAsked`).
633
- *
634
- * It reads `innerText`, never `innerHTML`, so what arrives is text. A field is
635
- * one line unless it carries `aria-multiline="true"`: in one line, a line
636
- * break becomes a space. Nothing is reported while an input method composes;
637
- * the composed text arrives once, when it is done.
638
- *
639
- * Enter commits (Shift+Enter breaks a line in a multiline field), and so does
640
- * leaving the field. Escape cancels, and puts the text the field had when
641
- * editing began back in the DOM, since a view that stopped redrawing the field
642
- * while it was edited will not. Where the browser lacks `plaintext-only`, a
643
- * paste is inserted as text. What an edit means is the parent's `update`.
644
- */
645
- const EditableText = Mount.defineStream("EditableText", {
646
- messages: [
647
- TextEdited,
648
- TextCommitted,
649
- TextCancelled,
650
- EditAsked
651
- ],
652
- args: {
653
- /** The attribute that marks a field, holding its name. */
654
- attribute: Schema.String },
655
- execute: ({ element, attribute }) => Stream.callback((queue) => Effect.acquireRelease(Effect.sync(() => {
656
- /** The field being edited: its name, its text when editing began, and the last reported. */
657
- let current;
658
- let composingText = false;
659
- let ending;
660
- /** The marked field at or above an event's target, inside the container. */
661
- const markedOf = (target) => {
662
- if (!(target instanceof Element)) return void 0;
663
- const field = target.closest(`[${attribute}]`);
664
- return field instanceof HTMLElement && element.contains(field) ? field : void 0;
665
- };
666
- /** The same, while it is editable. */
667
- const fieldOf = (target) => {
668
- const field = markedOf(target);
669
- return field?.isContentEditable === true ? field : void 0;
670
- };
671
- /** Begins an edit of `field`, unless one of it is under way: on focus, or typing. */
672
- const begin = (field) => {
673
- if (current?.field === field && !current.ended) return current;
674
- const text = textOf(field);
675
- current = {
676
- field,
677
- name: field.getAttribute(attribute) ?? "",
678
- initial: text,
679
- reported: text,
680
- ended: false
681
- };
682
- return current;
683
- };
684
- /**
685
- * The edit of `field`: the one under way or just ended, else one begun
686
- * now, for a field focused before these listeners came. An ended edit
687
- * reports nothing more, so the blur that follows a commit or a cancel
688
- * does not commit again.
689
- */
690
- const editOf = (field) => current?.field === field ? current : begin(field);
691
- const report = (field) => {
692
- const edit = editOf(field);
693
- if (edit.ended) return;
694
- const text = textOf(field);
695
- if (text === edit.reported) return;
696
- edit.reported = text;
697
- Queue.offerUnsafe(queue, TextEdited.make({
698
- field: edit.name,
699
- text
700
- }));
701
- };
702
- const commit = (field) => {
703
- const edit = editOf(field);
704
- if (edit.ended) return;
705
- edit.ended = true;
706
- Queue.offerUnsafe(queue, TextCommitted.make({
707
- field: edit.name,
708
- text: textOf(field)
709
- }));
710
- };
711
- const cancel = (field) => {
712
- const edit = editOf(field);
713
- if (edit.ended) return;
714
- edit.ended = true;
715
- field.innerText = edit.initial;
716
- caretAtEnd(field);
717
- Queue.offerUnsafe(queue, TextCancelled.make({
718
- field: edit.name,
719
- initial: edit.initial
720
- }));
721
- };
722
- const listeners = [
723
- ["dblclick", (event) => {
724
- const field = markedOf(event.target);
725
- if (field === void 0 || field.isContentEditable) return;
726
- Queue.offerUnsafe(queue, EditAsked.make({ field: field.getAttribute(attribute) ?? "" }));
727
- }],
728
- ["focusin", (event) => {
729
- composingText = false;
730
- const field = fieldOf(event.target);
731
- if (field !== void 0) begin(field);
732
- }],
733
- ["beforeinput", (event) => {
734
- const field = fieldOf(event.target);
735
- if (field !== void 0) begin(field);
736
- }],
737
- ["compositionstart", () => composingText = true],
738
- ["compositionend", (event) => {
739
- composingText = false;
740
- const field = fieldOf(event.target);
741
- if (field !== void 0) report(field);
742
- }],
743
- ["input", (event) => {
744
- const field = fieldOf(event.target);
745
- if (field !== void 0 && !composingText) report(field);
746
- }],
747
- ["keydown", (event) => {
748
- const field = fieldOf(event.target);
749
- const key = event;
750
- if (field === void 0 || composing(key)) return;
751
- if (key.key === "Escape") {
752
- event.preventDefault();
753
- ending = field;
754
- cancel(field);
755
- } else if (key.key === "Enter" && !(key.shiftKey && multiline(field))) {
756
- event.preventDefault();
757
- ending = field;
758
- commit(field);
759
- }
760
- }],
761
- ["focusout", (event) => {
762
- const field = fieldOf(event.target);
763
- if (field === void 0) return;
764
- queueMicrotask(() => {
765
- if (field === ending && field.isConnected && field.isContentEditable) ending = void 0;
766
- });
767
- commit(field);
768
- }],
769
- ["paste", (event) => {
770
- const field = fieldOf(event.target);
771
- if (field === void 0 || field.contentEditable === "plaintext-only") return;
772
- const pasted = event.clipboardData?.getData("text/plain") ?? "";
773
- event.preventDefault();
774
- begin(field);
775
- document.execCommand("insertText", false, pasted);
776
- }]
777
- ];
778
- const editable = `[${attribute}][contenteditable]:not([contenteditable="false"])`;
779
- const becoming = new MutationObserver((records) => {
780
- if (ending !== void 0 && !(ending.isConnected && ending.isContentEditable)) {
781
- ending = void 0;
782
- const focused = document.activeElement;
783
- if ((focused === null || focused === document.body) && element instanceof HTMLElement) element.focus({ preventScroll: true });
784
- }
785
- for (const record of records) {
786
- const changed = record.type === "attributes" ? [record.target] : Array.from(record.addedNodes);
787
- for (const node of changed) {
788
- if (!(node instanceof HTMLElement)) continue;
789
- const field = node.matches(editable) ? node : node.querySelector(editable);
790
- if (field instanceof HTMLElement) return caretAtEnd(field);
791
- }
792
- }
793
- });
794
- for (const [type, listener] of listeners) element.addEventListener(type, listener);
795
- becoming.observe(element, {
796
- subtree: true,
797
- childList: true,
798
- attributes: true,
799
- attributeFilter: ["contenteditable"]
800
- });
801
- return {
802
- listeners,
803
- becoming
804
- };
805
- }), ({ listeners, becoming }) => Effect.sync(() => {
806
- becoming.disconnect();
807
- for (const [type, listener] of listeners) element.removeEventListener(type, listener);
808
- })))
809
- });
810
- //#endregion
811
- //#region src/dom/follow-tab-stop.ts
812
- /**
813
- * Keeps focus that is inside a container of roving tab stops on its stop, as a
814
- * Mount: when a transition moves the stop (a row made current by a command the
815
- * container did not see, such as a duplicate) or removes the focused
816
- * descendant (a deleted row), focus goes to the descendant with
817
- * `tabindex="0"`. It sends no Message. Focus outside the container is never
818
- * taken, and focus the user moved away stays where it went.
819
- */
820
- const FollowTabStop = Mount.defineStream("FollowTabStop", {
821
- messages: [Schema.Never],
822
- execute: ({ element }) => Stream.callback(() => Effect.acquireRelease(Effect.sync(() => {
823
- let within = element.contains(document.activeElement);
824
- const entered = () => {
825
- within = true;
826
- };
827
- const left = (event) => {
828
- const next = event.relatedTarget;
829
- if (next instanceof Node && element.contains(next)) return;
830
- const from = event.target;
831
- queueMicrotask(() => {
832
- if (!(from instanceof Node) || from.isConnected) within = false;
833
- });
834
- };
835
- const follow = () => {
836
- if (!within) return;
837
- const stop = element.querySelector("[tabindex=\"0\"]");
838
- const focused = document.activeElement;
839
- if (!(stop instanceof HTMLElement) || stop === focused) return;
840
- const lost = focused === null || focused === document.body;
841
- const passed = focused !== null && element.contains(focused) && focused.getAttribute("tabindex") === "-1";
842
- if (lost || passed) stop.focus();
843
- };
844
- const changes = new MutationObserver(follow);
845
- element.addEventListener("focusin", entered);
846
- element.addEventListener("focusout", left);
847
- changes.observe(element, {
848
- subtree: true,
849
- childList: true,
850
- attributes: true,
851
- attributeFilter: ["tabindex"]
852
- });
853
- return () => {
854
- changes.disconnect();
855
- element.removeEventListener("focusin", entered);
856
- element.removeEventListener("focusout", left);
857
- };
858
- }), (stop) => Effect.sync(stop)))
859
- });
860
- //#endregion
861
- export { FocusScope as A, targetOf as C, Moved as D, MoveStarted as E, HideOutside as O, Targets as S, MoveEnded as T, PointerDrag as _, TextCommitted as a, TargetHovered as b, DRAG_THRESHOLD as c, DragPlace as d, DragStarted as f, HOLD_TO_DRAG_MS as g, HOLD_SLOP as h, TextCancelled as i, tabbableWithin as j, ScrollLock as k, DragCancelled as l, DraggedOver as m, EditAsked as n, TextEdited as o, DragZone as p, EditableText as r, textOf as s, FollowTabStop as t, DragDropped as u, boxOf as v, Move as w, TargetPressed as x, zoneOf as y };
862
-
863
- //# sourceMappingURL=follow-tab-stop-Caog2qg1.mjs.map