@vielzeug/craftit 2.1.0 → 3.0.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 (325) hide show
  1. package/README.md +58 -124
  2. package/dist/controls/a11y-control.cjs +1 -1
  3. package/dist/controls/a11y-control.cjs.map +1 -1
  4. package/dist/controls/a11y-control.d.ts +1 -1
  5. package/dist/controls/a11y-control.d.ts.map +1 -1
  6. package/dist/controls/a11y-control.js +1 -1
  7. package/dist/controls/a11y-control.js.map +1 -1
  8. package/dist/controls/checkable-control.cjs +1 -1
  9. package/dist/controls/checkable-control.cjs.map +1 -1
  10. package/dist/controls/checkable-control.d.ts +7 -7
  11. package/dist/controls/checkable-control.d.ts.map +1 -1
  12. package/dist/controls/checkable-control.js +1 -1
  13. package/dist/controls/checkable-control.js.map +1 -1
  14. package/dist/controls/choice-field-control.cjs +2 -0
  15. package/dist/controls/choice-field-control.cjs.map +1 -0
  16. package/dist/controls/choice-field-control.d.ts +3 -0
  17. package/dist/controls/choice-field-control.d.ts.map +1 -0
  18. package/dist/controls/choice-field-control.js +2 -0
  19. package/dist/controls/choice-field-control.js.map +1 -0
  20. package/dist/controls/field-control.cjs +1 -1
  21. package/dist/controls/field-control.cjs.map +1 -1
  22. package/dist/controls/field-control.d.ts +28 -73
  23. package/dist/controls/field-control.d.ts.map +1 -1
  24. package/dist/controls/field-control.js +1 -1
  25. package/dist/controls/field-control.js.map +1 -1
  26. package/dist/controls/index.d.ts +11 -9
  27. package/dist/controls/index.d.ts.map +1 -1
  28. package/dist/controls/internal/control-state.cjs +1 -1
  29. package/dist/controls/internal/control-state.cjs.map +1 -1
  30. package/dist/controls/internal/control-state.d.ts +6 -4
  31. package/dist/controls/internal/control-state.d.ts.map +1 -1
  32. package/dist/controls/internal/control-state.js +1 -1
  33. package/dist/controls/internal/control-state.js.map +1 -1
  34. package/dist/controls/internal/keyboard-utils.cjs.map +1 -1
  35. package/dist/controls/internal/keyboard-utils.js.map +1 -1
  36. package/dist/controls/internal/number-utils.cjs.map +1 -1
  37. package/dist/controls/internal/number-utils.js.map +1 -1
  38. package/dist/controls/internal/validation-utils.cjs.map +1 -1
  39. package/dist/controls/internal/validation-utils.js.map +1 -1
  40. package/dist/controls/list-control.cjs +1 -1
  41. package/dist/controls/list-control.cjs.map +1 -1
  42. package/dist/controls/list-control.d.ts +10 -8
  43. package/dist/controls/list-control.d.ts.map +1 -1
  44. package/dist/controls/list-control.js +1 -1
  45. package/dist/controls/list-control.js.map +1 -1
  46. package/dist/controls/overlay-control.cjs +1 -1
  47. package/dist/controls/overlay-control.cjs.map +1 -1
  48. package/dist/controls/overlay-control.d.ts +17 -14
  49. package/dist/controls/overlay-control.d.ts.map +1 -1
  50. package/dist/controls/overlay-control.js +1 -1
  51. package/dist/controls/overlay-control.js.map +1 -1
  52. package/dist/controls/popup-list-control.cjs +2 -0
  53. package/dist/controls/popup-list-control.cjs.map +1 -0
  54. package/dist/controls/popup-list-control.d.ts +160 -0
  55. package/dist/controls/popup-list-control.d.ts.map +1 -0
  56. package/dist/controls/popup-list-control.js +2 -0
  57. package/dist/controls/popup-list-control.js.map +1 -0
  58. package/dist/controls/press-control.cjs.map +1 -1
  59. package/dist/controls/press-control.js.map +1 -1
  60. package/dist/controls/slider-control.cjs.map +1 -1
  61. package/dist/controls/slider-control.js.map +1 -1
  62. package/dist/controls/spinner-control.cjs.map +1 -1
  63. package/dist/controls/spinner-control.js.map +1 -1
  64. package/dist/controls/swipe-control.cjs +2 -0
  65. package/dist/controls/swipe-control.cjs.map +1 -0
  66. package/dist/controls/swipe-control.d.ts +32 -0
  67. package/dist/controls/swipe-control.d.ts.map +1 -0
  68. package/dist/controls/swipe-control.js +2 -0
  69. package/dist/controls/swipe-control.js.map +1 -0
  70. package/dist/controls/text-field-control.cjs +2 -0
  71. package/dist/controls/text-field-control.cjs.map +1 -0
  72. package/dist/controls/text-field-control.d.ts +3 -0
  73. package/dist/controls/text-field-control.d.ts.map +1 -0
  74. package/dist/controls/text-field-control.js +2 -0
  75. package/dist/controls/text-field-control.js.map +1 -0
  76. package/dist/controls.cjs +1 -1
  77. package/dist/controls.js +1 -1
  78. package/dist/craftit.cjs +1 -1
  79. package/dist/craftit.cjs.map +1 -1
  80. package/dist/craftit.js +1 -1
  81. package/dist/craftit.js.map +1 -1
  82. package/dist/directives/classMap.cjs +2 -0
  83. package/dist/directives/classMap.cjs.map +1 -0
  84. package/dist/directives/classMap.d.ts +19 -0
  85. package/dist/directives/classMap.d.ts.map +1 -0
  86. package/dist/directives/classMap.js +2 -0
  87. package/dist/directives/classMap.js.map +1 -0
  88. package/dist/directives/each.cjs +1 -1
  89. package/dist/directives/each.cjs.map +1 -1
  90. package/dist/directives/each.d.ts +5 -30
  91. package/dist/directives/each.d.ts.map +1 -1
  92. package/dist/directives/each.js +1 -1
  93. package/dist/directives/each.js.map +1 -1
  94. package/dist/directives/guard.cjs +2 -0
  95. package/dist/directives/guard.cjs.map +1 -0
  96. package/dist/directives/guard.d.ts +10 -0
  97. package/dist/directives/guard.d.ts.map +1 -0
  98. package/dist/directives/guard.js +2 -0
  99. package/dist/directives/guard.js.map +1 -0
  100. package/dist/directives/live.cjs +2 -0
  101. package/dist/directives/live.cjs.map +1 -0
  102. package/dist/directives/live.d.ts +23 -0
  103. package/dist/directives/live.d.ts.map +1 -0
  104. package/dist/directives/live.js +2 -0
  105. package/dist/directives/live.js.map +1 -0
  106. package/dist/directives/raw.cjs +1 -1
  107. package/dist/directives/raw.cjs.map +1 -1
  108. package/dist/directives/raw.d.ts +3 -5
  109. package/dist/directives/raw.d.ts.map +1 -1
  110. package/dist/directives/raw.js +1 -1
  111. package/dist/directives/raw.js.map +1 -1
  112. package/dist/directives/resource.cjs +2 -0
  113. package/dist/directives/resource.cjs.map +1 -0
  114. package/dist/directives/resource.d.ts +32 -0
  115. package/dist/directives/resource.d.ts.map +1 -0
  116. package/dist/directives/resource.js +2 -0
  117. package/dist/directives/resource.js.map +1 -0
  118. package/dist/directives/styleMap.cjs +2 -0
  119. package/dist/directives/styleMap.cjs.map +1 -0
  120. package/dist/directives/styleMap.d.ts +11 -0
  121. package/dist/directives/styleMap.d.ts.map +1 -0
  122. package/dist/directives/styleMap.js +2 -0
  123. package/dist/directives/styleMap.js.map +1 -0
  124. package/dist/directives/when.cjs +1 -1
  125. package/dist/directives/when.cjs.map +1 -1
  126. package/dist/directives/when.d.ts +6 -19
  127. package/dist/directives/when.d.ts.map +1 -1
  128. package/dist/directives/when.js +1 -1
  129. package/dist/directives/when.js.map +1 -1
  130. package/dist/errors.cjs +2 -0
  131. package/dist/errors.cjs.map +1 -0
  132. package/dist/errors.d.ts +12 -0
  133. package/dist/errors.d.ts.map +1 -0
  134. package/dist/errors.js +2 -0
  135. package/dist/errors.js.map +1 -0
  136. package/dist/form.cjs +1 -1
  137. package/dist/form.cjs.map +1 -1
  138. package/dist/form.d.ts +3 -17
  139. package/dist/form.d.ts.map +1 -1
  140. package/dist/form.js +1 -1
  141. package/dist/form.js.map +1 -1
  142. package/dist/host.cjs +1 -1
  143. package/dist/host.cjs.map +1 -1
  144. package/dist/host.d.ts +40 -37
  145. package/dist/host.d.ts.map +1 -1
  146. package/dist/host.js +1 -1
  147. package/dist/host.js.map +1 -1
  148. package/dist/index.cjs +1 -1
  149. package/dist/index.d.ts +16 -8
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +1 -1
  152. package/dist/internal.cjs +1 -1
  153. package/dist/internal.cjs.map +1 -1
  154. package/dist/internal.d.ts +60 -120
  155. package/dist/internal.d.ts.map +1 -1
  156. package/dist/internal.js +1 -1
  157. package/dist/internal.js.map +1 -1
  158. package/dist/observers/index.d.ts +1 -0
  159. package/dist/observers/index.d.ts.map +1 -1
  160. package/dist/observers/intersection-observe.cjs +1 -1
  161. package/dist/observers/intersection-observe.cjs.map +1 -1
  162. package/dist/observers/intersection-observe.d.ts +1 -1
  163. package/dist/observers/intersection-observe.js +1 -1
  164. package/dist/observers/intersection-observe.js.map +1 -1
  165. package/dist/observers/media-observe.cjs +1 -1
  166. package/dist/observers/media-observe.cjs.map +1 -1
  167. package/dist/observers/media-observe.d.ts +1 -1
  168. package/dist/observers/media-observe.js +1 -1
  169. package/dist/observers/media-observe.js.map +1 -1
  170. package/dist/observers/mutation-observe.cjs +2 -0
  171. package/dist/observers/mutation-observe.cjs.map +1 -0
  172. package/dist/observers/mutation-observe.d.ts +10 -0
  173. package/dist/observers/mutation-observe.d.ts.map +1 -0
  174. package/dist/observers/mutation-observe.js +2 -0
  175. package/dist/observers/mutation-observe.js.map +1 -0
  176. package/dist/observers/resize-observe.cjs +1 -1
  177. package/dist/observers/resize-observe.cjs.map +1 -1
  178. package/dist/observers/resize-observe.d.ts +1 -1
  179. package/dist/observers/resize-observe.js +1 -1
  180. package/dist/observers/resize-observe.js.map +1 -1
  181. package/dist/observers.cjs +1 -1
  182. package/dist/observers.js +1 -1
  183. package/dist/props.cjs +1 -1
  184. package/dist/props.cjs.map +1 -1
  185. package/dist/props.d.ts +18 -31
  186. package/dist/props.d.ts.map +1 -1
  187. package/dist/props.js +1 -1
  188. package/dist/props.js.map +1 -1
  189. package/dist/registration.cjs +1 -1
  190. package/dist/registration.cjs.map +1 -1
  191. package/dist/registration.d.ts +27 -7
  192. package/dist/registration.d.ts.map +1 -1
  193. package/dist/registration.js +1 -1
  194. package/dist/registration.js.map +1 -1
  195. package/dist/runtime.cjs +1 -1
  196. package/dist/runtime.cjs.map +1 -1
  197. package/dist/runtime.d.ts +29 -17
  198. package/dist/runtime.d.ts.map +1 -1
  199. package/dist/runtime.js +1 -1
  200. package/dist/runtime.js.map +1 -1
  201. package/dist/template-bindings.cjs +1 -1
  202. package/dist/template-bindings.cjs.map +1 -1
  203. package/dist/template-bindings.d.ts +10 -47
  204. package/dist/template-bindings.d.ts.map +1 -1
  205. package/dist/template-bindings.js +1 -1
  206. package/dist/template-bindings.js.map +1 -1
  207. package/dist/template-compiler.cjs +1 -1
  208. package/dist/template-compiler.cjs.map +1 -1
  209. package/dist/template-compiler.d.ts +1 -21
  210. package/dist/template-compiler.d.ts.map +1 -1
  211. package/dist/template-compiler.js +1 -1
  212. package/dist/template-compiler.js.map +1 -1
  213. package/dist/testing/testing.cjs +1 -1
  214. package/dist/testing/testing.cjs.map +1 -1
  215. package/dist/testing/testing.d.ts +12 -5
  216. package/dist/testing/testing.d.ts.map +1 -1
  217. package/dist/testing/testing.js +1 -1
  218. package/dist/testing/testing.js.map +1 -1
  219. package/package.json +6 -12
  220. package/dist/component.cjs +0 -2
  221. package/dist/component.cjs.map +0 -1
  222. package/dist/component.d.ts +0 -39
  223. package/dist/component.d.ts.map +0 -1
  224. package/dist/component.js +0 -2
  225. package/dist/component.js.map +0 -1
  226. package/dist/controls/list-key-control.cjs +0 -2
  227. package/dist/controls/list-key-control.cjs.map +0 -1
  228. package/dist/controls/list-key-control.d.ts +0 -14
  229. package/dist/controls/list-key-control.d.ts.map +0 -1
  230. package/dist/controls/list-key-control.js +0 -2
  231. package/dist/controls/list-key-control.js.map +0 -1
  232. package/dist/directives/attr.cjs +0 -2
  233. package/dist/directives/attr.cjs.map +0 -1
  234. package/dist/directives/attr.d.ts +0 -12
  235. package/dist/directives/attr.d.ts.map +0 -1
  236. package/dist/directives/attr.js +0 -2
  237. package/dist/directives/attr.js.map +0 -1
  238. package/dist/directives/bind.cjs +0 -2
  239. package/dist/directives/bind.cjs.map +0 -1
  240. package/dist/directives/bind.d.ts +0 -38
  241. package/dist/directives/bind.d.ts.map +0 -1
  242. package/dist/directives/bind.js +0 -2
  243. package/dist/directives/bind.js.map +0 -1
  244. package/dist/directives/choose.cjs +0 -2
  245. package/dist/directives/choose.cjs.map +0 -1
  246. package/dist/directives/choose.d.ts +0 -39
  247. package/dist/directives/choose.d.ts.map +0 -1
  248. package/dist/directives/choose.js +0 -2
  249. package/dist/directives/choose.js.map +0 -1
  250. package/dist/directives/classes.cjs +0 -2
  251. package/dist/directives/classes.cjs.map +0 -1
  252. package/dist/directives/classes.d.ts +0 -20
  253. package/dist/directives/classes.d.ts.map +0 -1
  254. package/dist/directives/classes.js +0 -2
  255. package/dist/directives/classes.js.map +0 -1
  256. package/dist/directives/index.d.ts +0 -13
  257. package/dist/directives/index.d.ts.map +0 -1
  258. package/dist/directives/memo.cjs +0 -2
  259. package/dist/directives/memo.cjs.map +0 -1
  260. package/dist/directives/memo.d.ts +0 -27
  261. package/dist/directives/memo.d.ts.map +0 -1
  262. package/dist/directives/memo.js +0 -2
  263. package/dist/directives/memo.js.map +0 -1
  264. package/dist/directives/on.cjs +0 -2
  265. package/dist/directives/on.cjs.map +0 -1
  266. package/dist/directives/on.d.ts +0 -25
  267. package/dist/directives/on.d.ts.map +0 -1
  268. package/dist/directives/on.js +0 -2
  269. package/dist/directives/on.js.map +0 -1
  270. package/dist/directives/spread.cjs +0 -2
  271. package/dist/directives/spread.cjs.map +0 -1
  272. package/dist/directives/spread.d.ts +0 -14
  273. package/dist/directives/spread.d.ts.map +0 -1
  274. package/dist/directives/spread.js +0 -2
  275. package/dist/directives/spread.js.map +0 -1
  276. package/dist/directives/style.cjs +0 -2
  277. package/dist/directives/style.cjs.map +0 -1
  278. package/dist/directives/style.d.ts +0 -22
  279. package/dist/directives/style.d.ts.map +0 -1
  280. package/dist/directives/style.js +0 -2
  281. package/dist/directives/style.js.map +0 -1
  282. package/dist/directives/until.cjs +0 -2
  283. package/dist/directives/until.cjs.map +0 -1
  284. package/dist/directives/until.d.ts +0 -26
  285. package/dist/directives/until.d.ts.map +0 -1
  286. package/dist/directives/until.js +0 -2
  287. package/dist/directives/until.js.map +0 -1
  288. package/dist/directives.cjs +0 -1
  289. package/dist/directives.js +0 -1
  290. package/dist/runtime-bindings.cjs +0 -2
  291. package/dist/runtime-bindings.cjs.map +0 -1
  292. package/dist/runtime-bindings.d.ts +0 -6
  293. package/dist/runtime-bindings.d.ts.map +0 -1
  294. package/dist/runtime-bindings.js +0 -2
  295. package/dist/runtime-bindings.js.map +0 -1
  296. package/dist/runtime-core.cjs +0 -2
  297. package/dist/runtime-core.cjs.map +0 -1
  298. package/dist/runtime-core.d.ts +0 -21
  299. package/dist/runtime-core.d.ts.map +0 -1
  300. package/dist/runtime-core.js +0 -2
  301. package/dist/runtime-core.js.map +0 -1
  302. package/dist/runtime-lifecycle.cjs +0 -2
  303. package/dist/runtime-lifecycle.cjs.map +0 -1
  304. package/dist/runtime-lifecycle.d.ts +0 -24
  305. package/dist/runtime-lifecycle.d.ts.map +0 -1
  306. package/dist/runtime-lifecycle.js +0 -2
  307. package/dist/runtime-lifecycle.js.map +0 -1
  308. package/dist/template-dom.cjs +0 -2
  309. package/dist/template-dom.cjs.map +0 -1
  310. package/dist/template-dom.d.ts +0 -13
  311. package/dist/template-dom.d.ts.map +0 -1
  312. package/dist/template-dom.js +0 -2
  313. package/dist/template-dom.js.map +0 -1
  314. package/dist/template-html.cjs +0 -2
  315. package/dist/template-html.cjs.map +0 -1
  316. package/dist/template-html.d.ts +0 -23
  317. package/dist/template-html.d.ts.map +0 -1
  318. package/dist/template-html.js +0 -2
  319. package/dist/template-html.js.map +0 -1
  320. package/dist/template.cjs +0 -2
  321. package/dist/template.cjs.map +0 -1
  322. package/dist/template.d.ts +0 -10
  323. package/dist/template.d.ts.map +0 -1
  324. package/dist/template.js +0 -2
  325. package/dist/template.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"press-control.js","names":[],"sources":["../../src/controls/press-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\nexport type PressControlOptions = {\n disabled?: () => boolean;\n keys?: string[];\n onPress: (originalEvent: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type PressControl = {\n handleClick: (event: MouseEvent) => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\nexport const createPressControl = (options: PressControlOptions): PressControl => {\n const isDisabled = (): boolean => Boolean(options.disabled?.());\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress(keyboardEvent, 'keyboard')]),\n );\n\n const handleClick = (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress(event, 'pointer');\n\n return true;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isDisabled,\n keymap,\n });\n };\n\n return {\n handleClick,\n handleKeydown,\n };\n};\n"],"mappings":"sEAeA,IAAa,EAAsB,GAA+C,CAChF,IAAM,MAA4B,EAAQ,EAAQ,YAAY,CACxD,EAAe,EAAQ,MAAQ,CAAC,QAAS,IAAI,CAC7C,EAAS,OAAO,YACpB,EAAa,IAAK,GAAQ,CAAC,EAAM,GAAiC,EAAQ,QAAQ,EAAe,WAAW,CAAC,CAAC,CAC/G,CAiBD,MAAO,CACL,YAhBmB,GACf,GAAY,CAAS,IAEzB,EAAQ,QAAQ,EAAO,UAAU,CAE1B,IAYP,cATqB,GACd,EAAuB,EAAO,CACnC,SAAU,EACV,SACD,CAAC,CAMH"}
1
+ {"version":3,"file":"press-control.js","names":[],"sources":["../../src/controls/press-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\nexport type PressControlOptions = {\n disabled?: () => boolean;\n keys?: string[];\n onPress: (originalEvent: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type PressControl = {\n handleClick: (event: MouseEvent) => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\nexport const createPressControl = (options: PressControlOptions): PressControl => {\n const isDisabled = (): boolean => Boolean(options.disabled?.());\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress(keyboardEvent, 'keyboard')]),\n );\n\n const handleClick = (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress(event, 'pointer');\n\n return true;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isDisabled,\n keymap,\n });\n };\n\n return {\n handleClick,\n handleKeydown,\n };\n};\n"],"mappings":"sEAeA,IAAa,EAAsB,GAA+C,CAChF,IAAM,MAA4B,EAAQ,EAAQ,WAAW,EACvD,EAAe,EAAQ,MAAQ,CAAC,QAAS,GAAG,EAC5C,EAAS,OAAO,YACpB,EAAa,IAAK,GAAQ,CAAC,EAAM,GAAiC,EAAQ,QAAQ,EAAe,UAAU,CAAC,CAAC,CAC/G,EAiBA,MAAO,CACL,YAhBmB,GACf,EAAW,EAAU,IAEzB,EAAQ,QAAQ,EAAO,SAAS,EAEzB,IAYP,cATqB,GACd,EAAuB,EAAO,CACnC,SAAU,EACV,QACF,CAAC,CAMH,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"slider-control.cjs","names":[],"sources":["../../src/controls/slider-control.ts"],"sourcesContent":["import { clampNumber, normalizeFinite, toFiniteNumberOr, toPositiveStep } from './internal/number-utils';\n\nexport type SliderControlOptions = {\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n step?: () => number | string | undefined;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.(), 0);\n const max = (): number => toFiniteNumberOr(options.max?.(), 100);\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n return clampNumber(normalized, minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n const normalized = normalizeFinite(value, minValue);\n\n return clamp(Math.round(normalized / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = normalizeFinite(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n return {\n clamp,\n fromClientX,\n max,\n min,\n nextFromKey,\n snap,\n toPercent,\n };\n};\n"],"mappings":"+CAkBA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAA,iBAAiB,EAAQ,OAAO,CAAE,EAAE,CACxD,MAAoB,EAAA,iBAAiB,EAAQ,OAAO,CAAE,IAAI,CAC1D,MAAqB,EAAA,eAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,EAAS,GAA0B,CACvC,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAGtB,OAAO,EAAA,YAFY,EAAA,gBAAgB,EAAO,EAAS,CAEpB,EAAU,EAAS,EAG9C,EAAQ,GAA0B,CAEtC,IAAM,EAAa,EAAA,gBAAgB,EADlB,GAAK,CAC6B,CAEnD,OAAO,EAAM,KAAK,MAAM,EAAa,GAAM,CAAC,CAAG,GAAM,CAAC,EAqCxD,MAAO,CACL,QACA,aA1BmB,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,GAAK,CAAC,CAEvC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,MAAM,CAAC,CAClE,EAAW,GAAK,CAGtB,OAAO,EAAK,EAAW,GAFN,GAAK,CAEmB,GAAU,EAoBnD,MACA,MACA,aAnBmB,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAA,gBAAgB,EAAS,GAAK,CAAC,CAUlD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,GAAM,CAAC,CAE5E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,GAAM,CAAC,CAE7E,IAAQ,OAAe,GAAK,CAE5B,IAAQ,MAAc,GAAK,CAExB,MASP,OACA,UAzCiB,GAA0B,CAC3C,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAChB,EAAa,EAAA,gBAAgB,EAAO,EAAS,CAInD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,KAmC5D"}
1
+ {"version":3,"file":"slider-control.cjs","names":[],"sources":["../../src/controls/slider-control.ts"],"sourcesContent":["import { clampNumber, normalizeFinite, toFiniteNumberOr, toPositiveStep } from './internal/number-utils';\n\nexport type SliderControlOptions = {\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n step?: () => number | string | undefined;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.(), 0);\n const max = (): number => toFiniteNumberOr(options.max?.(), 100);\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n return clampNumber(normalized, minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n const normalized = normalizeFinite(value, minValue);\n\n return clamp(Math.round(normalized / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = normalizeFinite(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n return {\n clamp,\n fromClientX,\n max,\n min,\n nextFromKey,\n snap,\n toPercent,\n };\n};\n"],"mappings":"+CAkBA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAA,iBAAiB,EAAQ,MAAM,EAAG,CAAC,EACvD,MAAoB,EAAA,iBAAiB,EAAQ,MAAM,EAAG,GAAG,EACzD,MAAqB,EAAA,eAAe,EAAQ,OAAO,EAAG,CAAC,EAEvD,EAAS,GAA0B,CACvC,IAAM,EAAW,EAAI,EACf,EAAW,EAAI,EAGrB,OAAO,EAAA,YAFY,EAAA,gBAAgB,EAAO,CAEvB,EAAY,EAAU,CAAQ,CACnD,EAEM,EAAQ,GAA0B,CAEtC,IAAM,EAAa,EAAA,gBAAgB,EADlB,EACyB,CAAQ,EAElD,OAAO,EAAM,KAAK,MAAM,EAAa,EAAK,CAAC,EAAI,EAAK,CAAC,CACvD,EAoCA,MAAO,CACL,QACA,aA1BmB,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,EAAI,CAAC,EAEtC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,KAAK,CAAC,EACjE,EAAW,EAAI,EAGrB,OAAO,EAAK,EAAW,GAFN,EAEa,EAAW,EAAS,CACpD,EAmBE,MACA,MACA,aAnBmB,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAA,gBAAgB,EAAS,EAAI,CAAC,EAUjD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,EAAK,CAAC,EAE3E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,EAAK,CAAC,EAE5E,IAAQ,OAAe,EAAI,EAE3B,IAAQ,MAAc,EAAI,EAEvB,IACT,EAQE,OACA,UAzCiB,GAA0B,CAC3C,IAAM,EAAW,EAAI,EACf,EAAW,EAAI,EACf,EAAa,EAAA,gBAAgB,EAAO,CAAQ,EAIlD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,GAC7D,CAkCA,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"slider-control.js","names":[],"sources":["../../src/controls/slider-control.ts"],"sourcesContent":["import { clampNumber, normalizeFinite, toFiniteNumberOr, toPositiveStep } from './internal/number-utils';\n\nexport type SliderControlOptions = {\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n step?: () => number | string | undefined;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.(), 0);\n const max = (): number => toFiniteNumberOr(options.max?.(), 100);\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n return clampNumber(normalized, minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n const normalized = normalizeFinite(value, minValue);\n\n return clamp(Math.round(normalized / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = normalizeFinite(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n return {\n clamp,\n fromClientX,\n max,\n min,\n nextFromKey,\n snap,\n toPercent,\n };\n};\n"],"mappings":"wHAkBA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAiB,EAAQ,OAAO,CAAE,EAAE,CACxD,MAAoB,EAAiB,EAAQ,OAAO,CAAE,IAAI,CAC1D,MAAqB,EAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,EAAS,GAA0B,CACvC,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAGtB,OAAO,EAFY,EAAgB,EAAO,EAAS,CAEpB,EAAU,EAAS,EAG9C,EAAQ,GAA0B,CAEtC,IAAM,EAAa,EAAgB,EADlB,GAAK,CAC6B,CAEnD,OAAO,EAAM,KAAK,MAAM,EAAa,GAAM,CAAC,CAAG,GAAM,CAAC,EAqCxD,MAAO,CACL,QACA,aA1BmB,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,GAAK,CAAC,CAEvC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,MAAM,CAAC,CAClE,EAAW,GAAK,CAGtB,OAAO,EAAK,EAAW,GAFN,GAAK,CAEmB,GAAU,EAoBnD,MACA,MACA,aAnBmB,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAgB,EAAS,GAAK,CAAC,CAUlD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,GAAM,CAAC,CAE5E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,GAAM,CAAC,CAE7E,IAAQ,OAAe,GAAK,CAE5B,IAAQ,MAAc,GAAK,CAExB,MASP,OACA,UAzCiB,GAA0B,CAC3C,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAChB,EAAa,EAAgB,EAAO,EAAS,CAInD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,KAmC5D"}
1
+ {"version":3,"file":"slider-control.js","names":[],"sources":["../../src/controls/slider-control.ts"],"sourcesContent":["import { clampNumber, normalizeFinite, toFiniteNumberOr, toPositiveStep } from './internal/number-utils';\n\nexport type SliderControlOptions = {\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n step?: () => number | string | undefined;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.(), 0);\n const max = (): number => toFiniteNumberOr(options.max?.(), 100);\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n return clampNumber(normalized, minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n const normalized = normalizeFinite(value, minValue);\n\n return clamp(Math.round(normalized / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = normalizeFinite(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n return {\n clamp,\n fromClientX,\n max,\n min,\n nextFromKey,\n snap,\n toPercent,\n };\n};\n"],"mappings":"wHAkBA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAiB,EAAQ,MAAM,EAAG,CAAC,EACvD,MAAoB,EAAiB,EAAQ,MAAM,EAAG,GAAG,EACzD,MAAqB,EAAe,EAAQ,OAAO,EAAG,CAAC,EAEvD,EAAS,GAA0B,CACvC,IAAM,EAAW,EAAI,EACf,EAAW,EAAI,EAGrB,OAAO,EAFY,EAAgB,EAAO,CAEvB,EAAY,EAAU,CAAQ,CACnD,EAEM,EAAQ,GAA0B,CAEtC,IAAM,EAAa,EAAgB,EADlB,EACyB,CAAQ,EAElD,OAAO,EAAM,KAAK,MAAM,EAAa,EAAK,CAAC,EAAI,EAAK,CAAC,CACvD,EAoCA,MAAO,CACL,QACA,aA1BmB,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,EAAI,CAAC,EAEtC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,KAAK,CAAC,EACjE,EAAW,EAAI,EAGrB,OAAO,EAAK,EAAW,GAFN,EAEa,EAAW,EAAS,CACpD,EAmBE,MACA,MACA,aAnBmB,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAgB,EAAS,EAAI,CAAC,EAUjD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,EAAK,CAAC,EAE3E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,EAAK,CAAC,EAE5E,IAAQ,OAAe,EAAI,EAE3B,IAAQ,MAAc,EAAI,EAEvB,IACT,EAQE,OACA,UAzCiB,GAA0B,CAC3C,IAAM,EAAW,EAAI,EACf,EAAW,EAAI,EACf,EAAa,EAAgB,EAAO,CAAQ,EAIlD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,GAC7D,CAkCA,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-control.cjs","names":[],"sources":["../../src/controls/spinner-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\nimport { clampNumber, toFiniteNumber, toPositiveStep } from './internal/number-utils';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: () => boolean;\n largeStep?: () => number | string | undefined;\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n parse: () => number | null;\n readonly?: () => boolean;\n step?: () => number | string | undefined;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.()) || Boolean(options.readonly?.());\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.());\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.());\n };\n\n const clamp = (value: number): number => {\n return clampNumber(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.(), s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isBlocked,\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"0FAqBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,YAAY,EAAK,EAAQ,EAAQ,YAAY,CAExF,MACG,EAAA,eAAe,EAAQ,OAAO,CAAC,CAGlC,MACG,EAAA,eAAe,EAAQ,OAAO,CAAC,CAGlC,EAAS,GACN,EAAA,YAAY,EAAO,GAAK,CAAE,GAAK,CAAC,CAGnC,MAAqB,EAAA,eAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,MAA0B,CAC9B,IAAM,EAAI,GAAM,CAEhB,OAAO,EAAA,eAAe,EAAQ,aAAa,CAAE,EAAI,GAAG,EAGhD,MACW,EAAQ,OAAO,EAIb,GAAK,EAIf,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,EAAc,CAEnC,OAGF,EAAQ,OAAO,EAAM,EAAM,CAAE,EAAc,EAGvC,GAAe,EAAe,IAAgC,CAC9D,GAAW,EAEf,EAAO,GAAmB,CAAG,EAAO,EAAc,EA4CpD,MAAO,CACL,UAnC2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAgCvD,UA3C2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAwCvD,cA9BqB,GACd,EAAA,uBAAuB,EAAO,CACnC,SAAU,EACV,OAAQ,CACN,cAAiB,EAAY,CAAC,GAAM,CAAE,EAAM,CAC5C,YAAe,EAAY,GAAM,CAAE,EAAM,CACzC,QAAW,CACT,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,SAAY,CACV,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,aAAgB,EAAY,CAAC,GAAW,CAAE,EAAM,CAChD,WAAc,EAAY,GAAW,CAAE,EAAM,CAC9C,CACD,eAAgB,QACjB,CAAC,CAOF,cACD"}
1
+ {"version":3,"file":"spinner-control.cjs","names":[],"sources":["../../src/controls/spinner-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\nimport { clampNumber, toFiniteNumber, toPositiveStep } from './internal/number-utils';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: () => boolean;\n largeStep?: () => number | string | undefined;\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n parse: () => number | null;\n readonly?: () => boolean;\n step?: () => number | string | undefined;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.()) || Boolean(options.readonly?.());\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.());\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.());\n };\n\n const clamp = (value: number): number => {\n return clampNumber(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.(), s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isBlocked,\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"0FAqBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,WAAW,GAAM,EAAQ,EAAQ,WAAW,EAEvF,MACG,EAAA,eAAe,EAAQ,MAAM,CAAC,EAGjC,MACG,EAAA,eAAe,EAAQ,MAAM,CAAC,EAGjC,EAAS,GACN,EAAA,YAAY,EAAO,EAAI,EAAG,EAAI,CAAC,EAGlC,MAAqB,EAAA,eAAe,EAAQ,OAAO,EAAG,CAAC,EAEvD,MAA0B,CAC9B,IAAM,EAAI,EAAK,EAEf,OAAO,EAAA,eAAe,EAAQ,YAAY,EAAG,EAAI,EAAE,CACrD,EAEM,MACW,EAAQ,MAEnB,GAEa,EAEb,GAEG,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,CAAa,EAElC,MACF,CAEA,EAAQ,OAAO,EAAM,CAAK,EAAG,CAAa,CAC5C,EAEM,GAAe,EAAe,IAAgC,CAC9D,EAAU,GAEd,EAAO,EAAkB,EAAI,EAAO,CAAa,CACnD,EA2CA,MAAO,CACL,UAnC2B,CAC3B,IAAM,EAAS,EAAQ,MAAM,EACvB,EAAW,EAAI,EAErB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,CACzD,EA+BE,UA3C2B,CAC3B,IAAM,EAAS,EAAQ,MAAM,EACvB,EAAW,EAAI,EAErB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,CACzD,EAuCE,cA9BqB,GACd,EAAA,uBAAuB,EAAO,CACnC,SAAU,EACV,OAAQ,CACN,cAAiB,EAAY,CAAC,EAAK,EAAG,CAAK,EAC3C,YAAe,EAAY,EAAK,EAAG,CAAK,EACxC,QAAW,CACT,IAAM,EAAW,EAAI,EAErB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,CAAK,CACxB,EACA,SAAY,CACV,IAAM,EAAW,EAAI,EAErB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,CAAK,CACxB,EACA,aAAgB,EAAY,CAAC,EAAU,EAAG,CAAK,EAC/C,WAAc,EAAY,EAAU,EAAG,CAAK,CAC9C,EACA,eAAgB,OAClB,CAAC,EAOD,aACF,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-control.js","names":[],"sources":["../../src/controls/spinner-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\nimport { clampNumber, toFiniteNumber, toPositiveStep } from './internal/number-utils';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: () => boolean;\n largeStep?: () => number | string | undefined;\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n parse: () => number | null;\n readonly?: () => boolean;\n step?: () => number | string | undefined;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.()) || Boolean(options.readonly?.());\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.());\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.());\n };\n\n const clamp = (value: number): number => {\n return clampNumber(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.(), s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isBlocked,\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"uKAqBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,YAAY,EAAK,EAAQ,EAAQ,YAAY,CAExF,MACG,EAAe,EAAQ,OAAO,CAAC,CAGlC,MACG,EAAe,EAAQ,OAAO,CAAC,CAGlC,EAAS,GACN,EAAY,EAAO,GAAK,CAAE,GAAK,CAAC,CAGnC,MAAqB,EAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,MAA0B,CAC9B,IAAM,EAAI,GAAM,CAEhB,OAAO,EAAe,EAAQ,aAAa,CAAE,EAAI,GAAG,EAGhD,MACW,EAAQ,OAAO,EAIb,GAAK,EAIf,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,EAAc,CAEnC,OAGF,EAAQ,OAAO,EAAM,EAAM,CAAE,EAAc,EAGvC,GAAe,EAAe,IAAgC,CAC9D,GAAW,EAEf,EAAO,GAAmB,CAAG,EAAO,EAAc,EA4CpD,MAAO,CACL,UAnC2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAgCvD,UA3C2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAwCvD,cA9BqB,GACd,EAAuB,EAAO,CACnC,SAAU,EACV,OAAQ,CACN,cAAiB,EAAY,CAAC,GAAM,CAAE,EAAM,CAC5C,YAAe,EAAY,GAAM,CAAE,EAAM,CACzC,QAAW,CACT,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,SAAY,CACV,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,aAAgB,EAAY,CAAC,GAAW,CAAE,EAAM,CAChD,WAAc,EAAY,GAAW,CAAE,EAAM,CAC9C,CACD,eAAgB,QACjB,CAAC,CAOF,cACD"}
1
+ {"version":3,"file":"spinner-control.js","names":[],"sources":["../../src/controls/spinner-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\nimport { clampNumber, toFiniteNumber, toPositiveStep } from './internal/number-utils';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: () => boolean;\n largeStep?: () => number | string | undefined;\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n parse: () => number | null;\n readonly?: () => boolean;\n step?: () => number | string | undefined;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.()) || Boolean(options.readonly?.());\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.());\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.());\n };\n\n const clamp = (value: number): number => {\n return clampNumber(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.(), s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isBlocked,\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"uKAqBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,WAAW,GAAM,EAAQ,EAAQ,WAAW,EAEvF,MACG,EAAe,EAAQ,MAAM,CAAC,EAGjC,MACG,EAAe,EAAQ,MAAM,CAAC,EAGjC,EAAS,GACN,EAAY,EAAO,EAAI,EAAG,EAAI,CAAC,EAGlC,MAAqB,EAAe,EAAQ,OAAO,EAAG,CAAC,EAEvD,MAA0B,CAC9B,IAAM,EAAI,EAAK,EAEf,OAAO,EAAe,EAAQ,YAAY,EAAG,EAAI,EAAE,CACrD,EAEM,MACW,EAAQ,MAEnB,GAEa,EAEb,GAEG,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,CAAa,EAElC,MACF,CAEA,EAAQ,OAAO,EAAM,CAAK,EAAG,CAAa,CAC5C,EAEM,GAAe,EAAe,IAAgC,CAC9D,EAAU,GAEd,EAAO,EAAkB,EAAI,EAAO,CAAa,CACnD,EA2CA,MAAO,CACL,UAnC2B,CAC3B,IAAM,EAAS,EAAQ,MAAM,EACvB,EAAW,EAAI,EAErB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,CACzD,EA+BE,UA3C2B,CAC3B,IAAM,EAAS,EAAQ,MAAM,EACvB,EAAW,EAAI,EAErB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,CACzD,EAuCE,cA9BqB,GACd,EAAuB,EAAO,CACnC,SAAU,EACV,OAAQ,CACN,cAAiB,EAAY,CAAC,EAAK,EAAG,CAAK,EAC3C,YAAe,EAAY,EAAK,EAAG,CAAK,EACxC,QAAW,CACT,IAAM,EAAW,EAAI,EAErB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,CAAK,CACxB,EACA,SAAY,CACV,IAAM,EAAW,EAAI,EAErB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,CAAK,CACxB,EACA,aAAgB,EAAY,CAAC,EAAU,EAAG,CAAK,EAC/C,WAAc,EAAY,EAAU,EAAG,CAAK,CAC9C,EACA,eAAgB,OAClB,CAAC,EAOD,aACF,CACF"}
@@ -0,0 +1,2 @@
1
+ var e=e=>e.axis?.()??`x`,t=e=>{let t=e.threshold?.()??48;return Number.isFinite(t)&&t>0?t:1},n=(e,t)=>t===`x`?e.clientX:e.clientY,r=e=>e.currentTarget instanceof HTMLElement?e.currentTarget:e.target instanceof HTMLElement?e.target:null,i=i=>{let a=null,o=()=>!!i.disabled?.(),s=()=>{a=null},c=e=>a?.pointerId===e.pointerId,l=e=>{if(!a)return null;let t=n(e,a.axis),r=t-a.start;return{axis:a.axis,current:t,distance:r,event:e,pointerId:a.pointerId,progress:Math.min(Math.abs(r)/a.threshold,1),start:a.start,threshold:a.threshold}};return{handlePointerCancel:e=>{if(!a||!c(e))return!1;let t=l(e);return s(),t&&i.onCancel?.(t),!0},handlePointerDown:s=>{if(a||o())return!1;let c=e(i);a={axis:c,pointerId:s.pointerId,start:n(s,c),threshold:t(i)},(typeof i.captureTarget==`function`?i.captureTarget(s):r(s))?.setPointerCapture?.(s.pointerId);let u=l(s);return u&&i.onStart?.(u),!0},handlePointerMove:e=>{if(!a||!c(e))return!1;let t=l(e);return t?(i.onMove?.(t),i.shouldCommit?.(t)??Math.abs(t.distance)>=t.threshold?(s(),i.onCommit?.(t),!0):!0):!1},handlePointerUp:e=>{if(!a||!c(e))return!1;let t=l(e);return s(),t&&i.onCancel?.(t),!0},isActive:()=>a!=null,reset:s}};exports.createSwipeControl=i;
2
+ //# sourceMappingURL=swipe-control.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipe-control.cjs","names":[],"sources":["../../src/controls/swipe-control.ts"],"sourcesContent":["export type SwipeAxis = 'x' | 'y';\n\nexport type SwipeControlDetail = {\n axis: SwipeAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n progress: number;\n start: number;\n threshold: number;\n};\n\nexport type SwipeControlOptions = {\n axis?: () => SwipeAxis;\n captureTarget?: (event: PointerEvent) => HTMLElement | null;\n disabled?: () => boolean;\n onCancel?: (detail: SwipeControlDetail) => void;\n onCommit?: (detail: SwipeControlDetail) => void;\n onMove?: (detail: SwipeControlDetail) => void;\n onStart?: (detail: SwipeControlDetail) => void;\n shouldCommit?: (detail: SwipeControlDetail) => boolean;\n threshold?: () => number;\n};\n\nexport type SwipeControl = {\n handlePointerCancel: (event: PointerEvent) => boolean;\n handlePointerDown: (event: PointerEvent) => boolean;\n handlePointerMove: (event: PointerEvent) => boolean;\n handlePointerUp: (event: PointerEvent) => boolean;\n isActive: () => boolean;\n reset: () => void;\n};\n\ntype ActiveSwipe = {\n axis: SwipeAxis;\n pointerId: number;\n start: number;\n threshold: number;\n};\n\nconst resolveAxis = (options: SwipeControlOptions): SwipeAxis => options.axis?.() ?? 'x';\n\nconst resolveThreshold = (options: SwipeControlOptions): number => {\n const threshold = options.threshold?.() ?? 48;\n\n return Number.isFinite(threshold) && threshold > 0 ? threshold : 1;\n};\n\nconst getCoordinate = (event: PointerEvent, axis: SwipeAxis): number => {\n return axis === 'x' ? event.clientX : event.clientY;\n};\n\nconst defaultCaptureTarget = (event: PointerEvent): HTMLElement | null => {\n if (event.currentTarget instanceof HTMLElement) return event.currentTarget;\n\n if (event.target instanceof HTMLElement) return event.target;\n\n return null;\n};\n\nexport const createSwipeControl = (options: SwipeControlOptions): SwipeControl => {\n let active: ActiveSwipe | null = null;\n\n const isDisabled = (): boolean => Boolean(options.disabled?.());\n\n const reset = (): void => {\n active = null;\n };\n\n const matchesPointer = (event: PointerEvent): boolean => {\n return active?.pointerId === event.pointerId;\n };\n\n const createDetail = (event: PointerEvent): SwipeControlDetail | null => {\n if (!active) return null;\n\n const current = getCoordinate(event, active.axis);\n const distance = current - active.start;\n\n return {\n axis: active.axis,\n current,\n distance,\n event,\n pointerId: active.pointerId,\n progress: Math.min(Math.abs(distance) / active.threshold, 1),\n start: active.start,\n threshold: active.threshold,\n };\n };\n\n const handlePointerDown = (event: PointerEvent): boolean => {\n if (active || isDisabled()) return false;\n\n const axis = resolveAxis(options);\n\n active = {\n axis,\n pointerId: event.pointerId,\n start: getCoordinate(event, axis),\n threshold: resolveThreshold(options),\n };\n\n const captureTarget =\n typeof options.captureTarget === 'function' ? options.captureTarget(event) : defaultCaptureTarget(event);\n\n captureTarget?.setPointerCapture?.(event.pointerId);\n\n const detail = createDetail(event);\n\n if (detail) options.onStart?.(detail);\n\n return true;\n };\n\n const handlePointerMove = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n if (!detail) return false;\n\n options.onMove?.(detail);\n\n const shouldCommit = options.shouldCommit?.(detail) ?? Math.abs(detail.distance) >= detail.threshold;\n\n if (!shouldCommit) return true;\n\n reset();\n options.onCommit?.(detail);\n\n return true;\n };\n\n const handlePointerUp = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n reset();\n\n if (detail) options.onCancel?.(detail);\n\n return true;\n };\n\n const handlePointerCancel = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n reset();\n\n if (detail) options.onCancel?.(detail);\n\n return true;\n };\n\n return {\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n isActive: () => active != null,\n reset,\n };\n};\n"],"mappings":"AAyCA,IAAM,EAAe,GAA4C,EAAQ,OAAO,GAAK,IAE/E,EAAoB,GAAyC,CACjE,IAAM,EAAY,EAAQ,YAAY,GAAK,GAE3C,OAAO,OAAO,SAAS,CAAS,GAAK,EAAY,EAAI,EAAY,CACnE,EAEM,GAAiB,EAAqB,IACnC,IAAS,IAAM,EAAM,QAAU,EAAM,QAGxC,EAAwB,GACxB,EAAM,yBAAyB,YAAoB,EAAM,cAEzD,EAAM,kBAAkB,YAAoB,EAAM,OAE/C,KAGI,EAAsB,GAA+C,CAChF,IAAI,EAA6B,KAE3B,MAA4B,EAAQ,EAAQ,WAAW,EAEvD,MAAoB,CACxB,EAAS,IACX,EAEM,EAAkB,GACf,GAAQ,YAAc,EAAM,UAG/B,EAAgB,GAAmD,CACvE,GAAI,CAAC,EAAQ,OAAO,KAEpB,IAAM,EAAU,EAAc,EAAO,EAAO,IAAI,EAC1C,EAAW,EAAU,EAAO,MAElC,MAAO,CACL,KAAM,EAAO,KACb,UACA,WACA,QACA,UAAW,EAAO,UAClB,SAAU,KAAK,IAAI,KAAK,IAAI,CAAQ,EAAI,EAAO,UAAW,CAAC,EAC3D,MAAO,EAAO,MACd,UAAW,EAAO,SACpB,CACF,EAqEA,MAAO,CACL,oBAb2B,GAAiC,CAC5D,GAAI,CAAC,GAAU,CAAC,EAAe,CAAK,EAAG,MAAO,GAE9C,IAAM,EAAS,EAAa,CAAK,EAMjC,OAJA,EAAM,EAEF,GAAQ,EAAQ,WAAW,CAAM,EAE9B,EACT,EAIE,kBArEyB,GAAiC,CAC1D,GAAI,GAAU,EAAW,EAAG,MAAO,GAEnC,IAAM,EAAO,EAAY,CAAO,EAEhC,EAAS,CACP,OACA,UAAW,EAAM,UACjB,MAAO,EAAc,EAAO,CAAI,EAChC,UAAW,EAAiB,CAAO,CACrC,GAGE,OAAO,EAAQ,eAAkB,WAAa,EAAQ,cAAc,CAAK,EAAI,EAAqB,CAAK,IAE1F,oBAAoB,EAAM,SAAS,EAElD,IAAM,EAAS,EAAa,CAAK,EAIjC,OAFI,GAAQ,EAAQ,UAAU,CAAM,EAE7B,EACT,EAgDE,kBA9CyB,GAAiC,CAC1D,GAAI,CAAC,GAAU,CAAC,EAAe,CAAK,EAAG,MAAO,GAE9C,IAAM,EAAS,EAAa,CAAK,EAajC,OAXK,GAEL,EAAQ,SAAS,CAAM,EAEF,EAAQ,eAAe,CAAM,GAAK,KAAK,IAAI,EAAO,QAAQ,GAAK,EAAO,WAI3F,EAAM,EACN,EAAQ,WAAW,CAAM,EAElB,IALmB,IANN,EAYtB,EA8BE,gBA5BuB,GAAiC,CACxD,GAAI,CAAC,GAAU,CAAC,EAAe,CAAK,EAAG,MAAO,GAE9C,IAAM,EAAS,EAAa,CAAK,EAMjC,OAJA,EAAM,EAEF,GAAQ,EAAQ,WAAW,CAAM,EAE9B,EACT,EAmBE,aAAgB,GAAU,KAC1B,OACF,CACF"}
@@ -0,0 +1,32 @@
1
+ export type SwipeAxis = 'x' | 'y';
2
+ export type SwipeControlDetail = {
3
+ axis: SwipeAxis;
4
+ current: number;
5
+ distance: number;
6
+ event: PointerEvent;
7
+ pointerId: number;
8
+ progress: number;
9
+ start: number;
10
+ threshold: number;
11
+ };
12
+ export type SwipeControlOptions = {
13
+ axis?: () => SwipeAxis;
14
+ captureTarget?: (event: PointerEvent) => HTMLElement | null;
15
+ disabled?: () => boolean;
16
+ onCancel?: (detail: SwipeControlDetail) => void;
17
+ onCommit?: (detail: SwipeControlDetail) => void;
18
+ onMove?: (detail: SwipeControlDetail) => void;
19
+ onStart?: (detail: SwipeControlDetail) => void;
20
+ shouldCommit?: (detail: SwipeControlDetail) => boolean;
21
+ threshold?: () => number;
22
+ };
23
+ export type SwipeControl = {
24
+ handlePointerCancel: (event: PointerEvent) => boolean;
25
+ handlePointerDown: (event: PointerEvent) => boolean;
26
+ handlePointerMove: (event: PointerEvent) => boolean;
27
+ handlePointerUp: (event: PointerEvent) => boolean;
28
+ isActive: () => boolean;
29
+ reset: () => void;
30
+ };
31
+ export declare const createSwipeControl: (options: SwipeControlOptions) => SwipeControl;
32
+ //# sourceMappingURL=swipe-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipe-control.d.ts","sourceRoot":"","sources":["../../src/controls/swipe-control.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC;AAElC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,EAAE,MAAM,SAAS,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,WAAW,GAAG,IAAI,CAAC;IAC5D,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,mBAAmB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IACtD,iBAAiB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IACpD,iBAAiB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IACpD,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;IAClD,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AA6BF,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,YA0GjE,CAAC"}
@@ -0,0 +1,2 @@
1
+ var e=e=>e.axis?.()??`x`,t=e=>{let t=e.threshold?.()??48;return Number.isFinite(t)&&t>0?t:1},n=(e,t)=>t===`x`?e.clientX:e.clientY,r=e=>e.currentTarget instanceof HTMLElement?e.currentTarget:e.target instanceof HTMLElement?e.target:null,i=i=>{let a=null,o=()=>!!i.disabled?.(),s=()=>{a=null},c=e=>a?.pointerId===e.pointerId,l=e=>{if(!a)return null;let t=n(e,a.axis),r=t-a.start;return{axis:a.axis,current:t,distance:r,event:e,pointerId:a.pointerId,progress:Math.min(Math.abs(r)/a.threshold,1),start:a.start,threshold:a.threshold}};return{handlePointerCancel:e=>{if(!a||!c(e))return!1;let t=l(e);return s(),t&&i.onCancel?.(t),!0},handlePointerDown:s=>{if(a||o())return!1;let c=e(i);a={axis:c,pointerId:s.pointerId,start:n(s,c),threshold:t(i)},(typeof i.captureTarget==`function`?i.captureTarget(s):r(s))?.setPointerCapture?.(s.pointerId);let u=l(s);return u&&i.onStart?.(u),!0},handlePointerMove:e=>{if(!a||!c(e))return!1;let t=l(e);return t?(i.onMove?.(t),i.shouldCommit?.(t)??Math.abs(t.distance)>=t.threshold?(s(),i.onCommit?.(t),!0):!0):!1},handlePointerUp:e=>{if(!a||!c(e))return!1;let t=l(e);return s(),t&&i.onCancel?.(t),!0},isActive:()=>a!=null,reset:s}};export{i as createSwipeControl};
2
+ //# sourceMappingURL=swipe-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swipe-control.js","names":[],"sources":["../../src/controls/swipe-control.ts"],"sourcesContent":["export type SwipeAxis = 'x' | 'y';\n\nexport type SwipeControlDetail = {\n axis: SwipeAxis;\n current: number;\n distance: number;\n event: PointerEvent;\n pointerId: number;\n progress: number;\n start: number;\n threshold: number;\n};\n\nexport type SwipeControlOptions = {\n axis?: () => SwipeAxis;\n captureTarget?: (event: PointerEvent) => HTMLElement | null;\n disabled?: () => boolean;\n onCancel?: (detail: SwipeControlDetail) => void;\n onCommit?: (detail: SwipeControlDetail) => void;\n onMove?: (detail: SwipeControlDetail) => void;\n onStart?: (detail: SwipeControlDetail) => void;\n shouldCommit?: (detail: SwipeControlDetail) => boolean;\n threshold?: () => number;\n};\n\nexport type SwipeControl = {\n handlePointerCancel: (event: PointerEvent) => boolean;\n handlePointerDown: (event: PointerEvent) => boolean;\n handlePointerMove: (event: PointerEvent) => boolean;\n handlePointerUp: (event: PointerEvent) => boolean;\n isActive: () => boolean;\n reset: () => void;\n};\n\ntype ActiveSwipe = {\n axis: SwipeAxis;\n pointerId: number;\n start: number;\n threshold: number;\n};\n\nconst resolveAxis = (options: SwipeControlOptions): SwipeAxis => options.axis?.() ?? 'x';\n\nconst resolveThreshold = (options: SwipeControlOptions): number => {\n const threshold = options.threshold?.() ?? 48;\n\n return Number.isFinite(threshold) && threshold > 0 ? threshold : 1;\n};\n\nconst getCoordinate = (event: PointerEvent, axis: SwipeAxis): number => {\n return axis === 'x' ? event.clientX : event.clientY;\n};\n\nconst defaultCaptureTarget = (event: PointerEvent): HTMLElement | null => {\n if (event.currentTarget instanceof HTMLElement) return event.currentTarget;\n\n if (event.target instanceof HTMLElement) return event.target;\n\n return null;\n};\n\nexport const createSwipeControl = (options: SwipeControlOptions): SwipeControl => {\n let active: ActiveSwipe | null = null;\n\n const isDisabled = (): boolean => Boolean(options.disabled?.());\n\n const reset = (): void => {\n active = null;\n };\n\n const matchesPointer = (event: PointerEvent): boolean => {\n return active?.pointerId === event.pointerId;\n };\n\n const createDetail = (event: PointerEvent): SwipeControlDetail | null => {\n if (!active) return null;\n\n const current = getCoordinate(event, active.axis);\n const distance = current - active.start;\n\n return {\n axis: active.axis,\n current,\n distance,\n event,\n pointerId: active.pointerId,\n progress: Math.min(Math.abs(distance) / active.threshold, 1),\n start: active.start,\n threshold: active.threshold,\n };\n };\n\n const handlePointerDown = (event: PointerEvent): boolean => {\n if (active || isDisabled()) return false;\n\n const axis = resolveAxis(options);\n\n active = {\n axis,\n pointerId: event.pointerId,\n start: getCoordinate(event, axis),\n threshold: resolveThreshold(options),\n };\n\n const captureTarget =\n typeof options.captureTarget === 'function' ? options.captureTarget(event) : defaultCaptureTarget(event);\n\n captureTarget?.setPointerCapture?.(event.pointerId);\n\n const detail = createDetail(event);\n\n if (detail) options.onStart?.(detail);\n\n return true;\n };\n\n const handlePointerMove = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n if (!detail) return false;\n\n options.onMove?.(detail);\n\n const shouldCommit = options.shouldCommit?.(detail) ?? Math.abs(detail.distance) >= detail.threshold;\n\n if (!shouldCommit) return true;\n\n reset();\n options.onCommit?.(detail);\n\n return true;\n };\n\n const handlePointerUp = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n reset();\n\n if (detail) options.onCancel?.(detail);\n\n return true;\n };\n\n const handlePointerCancel = (event: PointerEvent): boolean => {\n if (!active || !matchesPointer(event)) return false;\n\n const detail = createDetail(event);\n\n reset();\n\n if (detail) options.onCancel?.(detail);\n\n return true;\n };\n\n return {\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n isActive: () => active != null,\n reset,\n };\n};\n"],"mappings":"AAyCA,IAAM,EAAe,GAA4C,EAAQ,OAAO,GAAK,IAE/E,EAAoB,GAAyC,CACjE,IAAM,EAAY,EAAQ,YAAY,GAAK,GAE3C,OAAO,OAAO,SAAS,CAAS,GAAK,EAAY,EAAI,EAAY,CACnE,EAEM,GAAiB,EAAqB,IACnC,IAAS,IAAM,EAAM,QAAU,EAAM,QAGxC,EAAwB,GACxB,EAAM,yBAAyB,YAAoB,EAAM,cAEzD,EAAM,kBAAkB,YAAoB,EAAM,OAE/C,KAGI,EAAsB,GAA+C,CAChF,IAAI,EAA6B,KAE3B,MAA4B,EAAQ,EAAQ,WAAW,EAEvD,MAAoB,CACxB,EAAS,IACX,EAEM,EAAkB,GACf,GAAQ,YAAc,EAAM,UAG/B,EAAgB,GAAmD,CACvE,GAAI,CAAC,EAAQ,OAAO,KAEpB,IAAM,EAAU,EAAc,EAAO,EAAO,IAAI,EAC1C,EAAW,EAAU,EAAO,MAElC,MAAO,CACL,KAAM,EAAO,KACb,UACA,WACA,QACA,UAAW,EAAO,UAClB,SAAU,KAAK,IAAI,KAAK,IAAI,CAAQ,EAAI,EAAO,UAAW,CAAC,EAC3D,MAAO,EAAO,MACd,UAAW,EAAO,SACpB,CACF,EAqEA,MAAO,CACL,oBAb2B,GAAiC,CAC5D,GAAI,CAAC,GAAU,CAAC,EAAe,CAAK,EAAG,MAAO,GAE9C,IAAM,EAAS,EAAa,CAAK,EAMjC,OAJA,EAAM,EAEF,GAAQ,EAAQ,WAAW,CAAM,EAE9B,EACT,EAIE,kBArEyB,GAAiC,CAC1D,GAAI,GAAU,EAAW,EAAG,MAAO,GAEnC,IAAM,EAAO,EAAY,CAAO,EAEhC,EAAS,CACP,OACA,UAAW,EAAM,UACjB,MAAO,EAAc,EAAO,CAAI,EAChC,UAAW,EAAiB,CAAO,CACrC,GAGE,OAAO,EAAQ,eAAkB,WAAa,EAAQ,cAAc,CAAK,EAAI,EAAqB,CAAK,IAE1F,oBAAoB,EAAM,SAAS,EAElD,IAAM,EAAS,EAAa,CAAK,EAIjC,OAFI,GAAQ,EAAQ,UAAU,CAAM,EAE7B,EACT,EAgDE,kBA9CyB,GAAiC,CAC1D,GAAI,CAAC,GAAU,CAAC,EAAe,CAAK,EAAG,MAAO,GAE9C,IAAM,EAAS,EAAa,CAAK,EAajC,OAXK,GAEL,EAAQ,SAAS,CAAM,EAEF,EAAQ,eAAe,CAAM,GAAK,KAAK,IAAI,EAAO,QAAQ,GAAK,EAAO,WAI3F,EAAM,EACN,EAAQ,WAAW,CAAM,EAElB,IALmB,IANN,EAYtB,EA8BE,gBA5BuB,GAAiC,CACxD,GAAI,CAAC,GAAU,CAAC,EAAe,CAAK,EAAG,MAAO,GAE9C,IAAM,EAAS,EAAa,CAAK,EAMjC,OAJA,EAAM,EAEF,GAAQ,EAAQ,WAAW,CAAM,EAE9B,EACT,EAmBE,aAAgB,GAAU,KAC1B,OACF,CACF"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./field-control.cjs`);let t=require(`@vielzeug/stateit`);var n=n=>{let r=(0,t.signal)(``);(0,t.watch)(n.value,e=>{r.value=String(e??``)},{immediate:!0});let{base:i,triggerValidation:a}=e.createFieldControlBase(n,{value:r}),o=e.createAssistiveState({error:n.error,helper:n.helper,maxLength:n.maxLength,value:r}),s=e=>{e?.preventDefault?.(),r.value=``,n.onInput?.(e??new Event(`input`),``),n.onChange?.(e??new Event(`change`),``),a(`change`),n.elementRef?.value?.focus()};return n.elementRef&&(0,t.watch)(()=>n.elementRef?.value,t=>{if(t)return e.mountTextFieldLifecycle({element:t,onBlur:n.onBlur,onChange:(e,t)=>{r.value=t,n.onChange?.(e,t)},onInput:(e,t)=>{r.value=t,n.onInputExtra?.(e),n.onInput?.(e,t)},triggerValidation:a})}),{assistive:o,...i,clear:s,triggerValidation:a,value:r}};exports.createTextField=n;
2
+ //# sourceMappingURL=text-field-control.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-field-control.cjs","names":[],"sources":["../../src/controls/text-field-control.ts"],"sourcesContent":["import { signal, watch } from '@vielzeug/stateit';\n\nimport {\n createAssistiveState,\n createFieldControlBase,\n mountTextFieldLifecycle,\n type TextFieldHandle,\n type TextFieldOptions,\n} from './field-control';\n\nexport const createTextField = (options: TextFieldOptions): TextFieldHandle => {\n const value = signal('');\n\n watch(\n options.value,\n (next) => {\n value.value = String(next ?? '');\n },\n { immediate: true },\n );\n\n const { base, triggerValidation } = createFieldControlBase(options, { value });\n\n const assistive = createAssistiveState({\n error: options.error,\n helper: options.helper,\n maxLength: options.maxLength,\n value,\n });\n\n const clear = (event?: Event): void => {\n event?.preventDefault?.();\n\n value.value = '';\n options.onInput?.(event ?? new Event('input'), '');\n options.onChange?.(event ?? new Event('change'), '');\n triggerValidation('change');\n options.elementRef?.value?.focus();\n };\n\n if (options.elementRef) {\n watch(\n () => options.elementRef?.value,\n (element) => {\n if (!element) return;\n\n return mountTextFieldLifecycle({\n element,\n onBlur: options.onBlur,\n onChange: (event, nextValue) => {\n value.value = nextValue;\n options.onChange?.(event, nextValue);\n },\n onInput: (event, nextValue) => {\n value.value = nextValue;\n options.onInputExtra?.(event);\n options.onInput?.(event, nextValue);\n },\n triggerValidation,\n });\n },\n );\n }\n\n return {\n assistive,\n ...base,\n clear,\n triggerValidation,\n value,\n };\n};\n"],"mappings":"0EAUA,IAAa,EAAmB,GAA+C,CAC7E,IAAM,GAAA,EAAA,EAAA,QAAe,EAAE,GAEvB,EAAA,EAAA,OACE,EAAQ,MACP,GAAS,CACR,EAAM,MAAQ,OAAO,GAAQ,EAAE,CACjC,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,GAAM,CAAE,OAAM,qBAAsB,EAAA,uBAAuB,EAAS,CAAE,OAAM,CAAC,EAEvE,EAAY,EAAA,qBAAqB,CACrC,MAAO,EAAQ,MACf,OAAQ,EAAQ,OAChB,UAAW,EAAQ,UACnB,OACF,CAAC,EAEK,EAAS,GAAwB,CACrC,GAAO,iBAAiB,EAExB,EAAM,MAAQ,GACd,EAAQ,UAAU,GAAS,IAAI,MAAM,OAAO,EAAG,EAAE,EACjD,EAAQ,WAAW,GAAS,IAAI,MAAM,QAAQ,EAAG,EAAE,EACnD,EAAkB,QAAQ,EAC1B,EAAQ,YAAY,OAAO,MAAM,CACnC,EA0BA,OAxBI,EAAQ,aACV,EAAA,EAAA,WACQ,EAAQ,YAAY,MACzB,GAAY,CACN,KAEL,OAAO,EAAA,wBAAwB,CAC7B,UACA,OAAQ,EAAQ,OAChB,UAAW,EAAO,IAAc,CAC9B,EAAM,MAAQ,EACd,EAAQ,WAAW,EAAO,CAAS,CACrC,EACA,SAAU,EAAO,IAAc,CAC7B,EAAM,MAAQ,EACd,EAAQ,eAAe,CAAK,EAC5B,EAAQ,UAAU,EAAO,CAAS,CACpC,EACA,mBACF,CAAC,CACH,CACF,EAGK,CACL,YACA,GAAG,EACH,QACA,oBACA,OACF,CACF"}
@@ -0,0 +1,3 @@
1
+ import { type TextFieldHandle, type TextFieldOptions } from './field-control';
2
+ export declare const createTextField: (options: TextFieldOptions) => TextFieldHandle;
3
+ //# sourceMappingURL=text-field-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-field-control.d.ts","sourceRoot":"","sources":["../../src/controls/text-field-control.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,eA6D3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{createAssistiveState as e,createFieldControlBase as t,mountTextFieldLifecycle as n}from"./field-control.js";import{signal as r,watch as i}from"@vielzeug/stateit";var a=a=>{let o=r(``);i(a.value,e=>{o.value=String(e??``)},{immediate:!0});let{base:s,triggerValidation:c}=t(a,{value:o}),l=e({error:a.error,helper:a.helper,maxLength:a.maxLength,value:o}),u=e=>{e?.preventDefault?.(),o.value=``,a.onInput?.(e??new Event(`input`),``),a.onChange?.(e??new Event(`change`),``),c(`change`),a.elementRef?.value?.focus()};return a.elementRef&&i(()=>a.elementRef?.value,e=>{if(e)return n({element:e,onBlur:a.onBlur,onChange:(e,t)=>{o.value=t,a.onChange?.(e,t)},onInput:(e,t)=>{o.value=t,a.onInputExtra?.(e),a.onInput?.(e,t)},triggerValidation:c})}),{assistive:l,...s,clear:u,triggerValidation:c,value:o}};export{a as createTextField};
2
+ //# sourceMappingURL=text-field-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-field-control.js","names":[],"sources":["../../src/controls/text-field-control.ts"],"sourcesContent":["import { signal, watch } from '@vielzeug/stateit';\n\nimport {\n createAssistiveState,\n createFieldControlBase,\n mountTextFieldLifecycle,\n type TextFieldHandle,\n type TextFieldOptions,\n} from './field-control';\n\nexport const createTextField = (options: TextFieldOptions): TextFieldHandle => {\n const value = signal('');\n\n watch(\n options.value,\n (next) => {\n value.value = String(next ?? '');\n },\n { immediate: true },\n );\n\n const { base, triggerValidation } = createFieldControlBase(options, { value });\n\n const assistive = createAssistiveState({\n error: options.error,\n helper: options.helper,\n maxLength: options.maxLength,\n value,\n });\n\n const clear = (event?: Event): void => {\n event?.preventDefault?.();\n\n value.value = '';\n options.onInput?.(event ?? new Event('input'), '');\n options.onChange?.(event ?? new Event('change'), '');\n triggerValidation('change');\n options.elementRef?.value?.focus();\n };\n\n if (options.elementRef) {\n watch(\n () => options.elementRef?.value,\n (element) => {\n if (!element) return;\n\n return mountTextFieldLifecycle({\n element,\n onBlur: options.onBlur,\n onChange: (event, nextValue) => {\n value.value = nextValue;\n options.onChange?.(event, nextValue);\n },\n onInput: (event, nextValue) => {\n value.value = nextValue;\n options.onInputExtra?.(event);\n options.onInput?.(event, nextValue);\n },\n triggerValidation,\n });\n },\n );\n }\n\n return {\n assistive,\n ...base,\n clear,\n triggerValidation,\n value,\n };\n};\n"],"mappings":"yKAUA,IAAa,EAAmB,GAA+C,CAC7E,IAAM,EAAQ,EAAO,EAAE,EAEvB,EACE,EAAQ,MACP,GAAS,CACR,EAAM,MAAQ,OAAO,GAAQ,EAAE,CACjC,EACA,CAAE,UAAW,EAAK,CACpB,EAEA,GAAM,CAAE,OAAM,qBAAsB,EAAuB,EAAS,CAAE,OAAM,CAAC,EAEvE,EAAY,EAAqB,CACrC,MAAO,EAAQ,MACf,OAAQ,EAAQ,OAChB,UAAW,EAAQ,UACnB,OACF,CAAC,EAEK,EAAS,GAAwB,CACrC,GAAO,iBAAiB,EAExB,EAAM,MAAQ,GACd,EAAQ,UAAU,GAAS,IAAI,MAAM,OAAO,EAAG,EAAE,EACjD,EAAQ,WAAW,GAAS,IAAI,MAAM,QAAQ,EAAG,EAAE,EACnD,EAAkB,QAAQ,EAC1B,EAAQ,YAAY,OAAO,MAAM,CACnC,EA0BA,OAxBI,EAAQ,YACV,MACQ,EAAQ,YAAY,MACzB,GAAY,CACN,KAEL,OAAO,EAAwB,CAC7B,UACA,OAAQ,EAAQ,OAChB,UAAW,EAAO,IAAc,CAC9B,EAAM,MAAQ,EACd,EAAQ,WAAW,EAAO,CAAS,CACrC,EACA,SAAU,EAAO,IAAc,CAC7B,EAAM,MAAQ,EACd,EAAQ,eAAe,CAAK,EAC5B,EAAQ,UAAU,EAAO,CAAS,CACpC,EACA,mBACF,CAAC,CACH,CACF,EAGK,CACL,YACA,GAAG,EACH,QACA,oBACA,OACF,CACF"}
package/dist/controls.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./controls/a11y-control.cjs`),t=require(`./controls/internal/control-state.cjs`),n=require(`./controls/field-control.cjs`),r=require(`./controls/press-control.cjs`),i=require(`./controls/checkable-control.cjs`),a=require(`./controls/list-control.cjs`),o=require(`./controls/list-key-control.cjs`),s=require(`./controls/overlay-control.cjs`),c=require(`./controls/spinner-control.cjs`),l=require(`./controls/slider-control.cjs`);exports.createA11yControl=e.createA11yControl,exports.createCheckableFieldControl=i.createCheckableFieldControl,exports.createChoiceFieldControl=n.createChoiceFieldControl,exports.createListControl=a.createListControl,exports.createListKeyControl=o.createListKeyControl,exports.createOverlayControl=s.createOverlayControl,exports.createPressControl=r.createPressControl,exports.createSliderControl=l.createSliderControl,exports.createSpinnerControl=c.createSpinnerControl,exports.createTextFieldControl=n.createTextFieldControl,exports.createValidationControl=t.createValidationControl,exports.mountTextFieldLifecycle=n.mountTextFieldLifecycle;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./controls/press-control.cjs`),t=require(`./controls/checkable-control.cjs`),n=require(`./controls/text-field-control.cjs`),r=require(`./controls/choice-field-control.cjs`),i=require(`./controls/list-control.cjs`),a=require(`./controls/overlay-control.cjs`),o=require(`./controls/spinner-control.cjs`),s=require(`./controls/slider-control.cjs`),c=require(`./controls/swipe-control.cjs`),l=require(`./controls/popup-list-control.cjs`);exports.createCheckableFieldControl=t.createCheckableFieldControl,exports.createChoiceField=r.createChoiceField,exports.createListControl=i.createListControl,exports.createOverlayControl=a.createOverlayControl,exports.createPopupListControl=l.createPopupListControl,exports.createPressControl=e.createPressControl,exports.createSliderControl=s.createSliderControl,exports.createSpinnerControl=o.createSpinnerControl,exports.createSwipeControl=c.createSwipeControl,exports.createTextField=n.createTextField;
package/dist/controls.js CHANGED
@@ -1 +1 @@
1
- import{createA11yControl as e}from"./controls/a11y-control.js";import{createValidationControl as t}from"./controls/internal/control-state.js";import{createChoiceFieldControl as n,createTextFieldControl as r,mountTextFieldLifecycle as i}from"./controls/field-control.js";import{createPressControl as a}from"./controls/press-control.js";import{createCheckableFieldControl as o}from"./controls/checkable-control.js";import{createListControl as s}from"./controls/list-control.js";import{createListKeyControl as c}from"./controls/list-key-control.js";import{createOverlayControl as l}from"./controls/overlay-control.js";import{createSpinnerControl as u}from"./controls/spinner-control.js";import{createSliderControl as d}from"./controls/slider-control.js";export{e as createA11yControl,o as createCheckableFieldControl,n as createChoiceFieldControl,s as createListControl,c as createListKeyControl,l as createOverlayControl,a as createPressControl,d as createSliderControl,u as createSpinnerControl,r as createTextFieldControl,t as createValidationControl,i as mountTextFieldLifecycle};
1
+ import{createPressControl as e}from"./controls/press-control.js";import{createCheckableFieldControl as t}from"./controls/checkable-control.js";import{createTextField as n}from"./controls/text-field-control.js";import{createChoiceField as r}from"./controls/choice-field-control.js";import{createListControl as i}from"./controls/list-control.js";import{createOverlayControl as a}from"./controls/overlay-control.js";import{createSpinnerControl as o}from"./controls/spinner-control.js";import{createSliderControl as s}from"./controls/slider-control.js";import{createSwipeControl as c}from"./controls/swipe-control.js";import{createPopupListControl as l}from"./controls/popup-list-control.js";export{t as createCheckableFieldControl,r as createChoiceField,i as createListControl,a as createOverlayControl,l as createPopupListControl,e as createPressControl,s as createSliderControl,o as createSpinnerControl,c as createSwipeControl,n as createTextField};
package/dist/craftit.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@vielzeug/stateit`);var t=Symbol(`craftit.htmlResultBrand`),n=0,r=e=>`${e?`${e}-`:`cft-`}${++n}`;function i(){return(0,e.signal)(null)}function a(){return[]}function o(e,n=[]){let r={__bindings:n,__html:e,toString(){return e}};return Object.defineProperty(r,t,{configurable:!1,enumerable:!1,value:!0,writable:!1}),r}var s=e=>typeof e==`object`&&!!e&&e[t]===!0,c=Symbol(`craftit.eachSignal`),l=e=>{let t=[...e];for(let e=t.length-1;e>=0;e--)t[e]?.()},u=(e,t,n)=>{if(/^on/i.test(t)){e.removeAttribute(t);return}n==null||n===!1?e.removeAttribute(t):n===!0?e.setAttribute(t,t.startsWith(`aria-`)?`true`:``):e.setAttribute(t,String(n))},d=(e,t,n,r)=>{let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},f=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),p={"'":`&#39;`,'"':`&quot;`,"&":`&amp;`,"<":`&lt;`,">":`&gt;`},m=e=>String(e).replace(/[&<>"']/g,e=>p[e]),h=()=>{let e=y().el;return((t,...n)=>{T.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)})},g=function(){return this.content},ee=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=e&&typeof e==`object`&&`content`in e?e.content:e??``}return{content:n.trim(),toString:g}},_=new Map,te=e=>{if(e instanceof CSSStyleSheet)return e;let t=typeof e==`string`?e:e.content,n=_.get(t);if(n)return n;let r=new CSSStyleSheet;try{r.replaceSync(t),_.set(t,r)}catch(e){console.error(`[craftit:E2] style replace failed`,e)}return r},v=[],y=()=>{let e=v[v.length-1];if(!e)throw Error(`[craftit:E1] lifecycle outside setup`);return e},b=e=>{y().onMount.push(e)},x=t=>{v.length>0?y().cleanups.push(t):(0,e.onCleanup)(t)},S=e=>{v.length>0&&x(e)},ne=e=>{y().errorHandlers.push(e)},C=(t,n)=>{let r=(0,e.effect)(t,n);return S(r),r};function re(t,n,r){let i=(0,e.watch)(t,n,r);return S(i),i}function ie(e,t,n,r){e&&(e.addEventListener(t,n,r),x(()=>e.removeEventListener(t,n,r)))}var ae=()=>{let t=(0,e.signal)(null),n=()=>{t.value?.(),t.value=null};return x(n),{clear:n,set:e=>{t.value!==e&&(n(),t.value=e??null)},value:t}},oe=(e,t,n)=>C(()=>{let n=e.value;if(n)return t(n)},n),w={bubbles:!0,cancelable:!0,composed:!0},T={custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...w,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...w,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...w,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...w,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...w,...n})):e.dispatchEvent(new CustomEvent(t,{...w,...n}))}},E=new WeakMap,se=(e,t)=>{let n=y().el;E.has(n)||E.set(n,new Map),E.get(n).set(e,t)};function ce(e,...t){let n=y().el;for(;n;){if(n instanceof HTMLElement){let t=E.get(n)?.get(e);if(t!==void 0)return t}let t=n.getRootNode();n=n.parentElement??(t instanceof ShadowRoot?t.host:null)}return t.length>0?t[0]:void 0}function le(e){return Symbol(e)}var ue=(e,t,n)=>{e&&b(()=>{C(()=>{let r=t;for(let t of n){let n=e[t]?.value;n!==void 0&&(r[t].value=n)}})})},de=(e,t)=>{let n=!1;C(()=>{let r=!!t.contextDisabled?.value;r&&!n?(e.setAttribute(`disabled`,``),n=!0):!r&&n&&!t.ownDisabled?.value&&(e.removeAttribute(`disabled`),n=!1);let i=t.contextSize?.value,a=!!t.ownSize?.value;i&&!a?e.setAttribute(`size`,i):a||e.removeAttribute(`size`);let o=t.contextVariant?.value,s=!!t.ownVariant?.value;o&&!s?e.setAttribute(`variant`,o):s||e.removeAttribute(`variant`)})},D=`default`,O=e=>!e||e===D?D:e,k=new WeakMap,A=()=>{let t=y().el,n=k.get(t);if(n)return n;let r=new Map,i=new Map,a=new Map,o=new Map,s=!1,c=t=>{let n=O(t),i=r.get(n);return i||(i=(0,e.signal)(!1),r.set(n,i)),i},l=t=>{let n=O(t),r=i.get(n);return r||(r=(0,e.signal)([]),i.set(n,r)),r},u=e=>{let t=O(e),n=a.get(t),r=[];if(n)for(let e of n)r.push(...e.assignedElements({flatten:!0}));l(t).value=r,c(t).value=r.length>0},d=e=>{if(o.has(e))return;let t=O(e.getAttribute(`name`)),n=a.get(t)??new Set;n.add(e),a.set(t,n);let r=()=>u(t);e.addEventListener(`slotchange`,r),o.set(e,()=>{if(e.removeEventListener(`slotchange`,r),o.delete(e),s)return;let n=a.get(t);n&&(n.delete(e),n.size===0&&a.delete(t),u(t))}),u(t)},f=e=>{o.get(e)?.()};c(D),l(D),t.shadowRoot?.querySelectorAll(`slot`).forEach(e=>d(e));let p=new MutationObserver(e=>{for(let t of e)t.addedNodes.forEach(e=>{if(e instanceof HTMLSlotElement){d(e);return}e instanceof Element&&e.querySelectorAll(`slot`).forEach(e=>d(e))}),t.removedNodes.forEach(e=>{if(e instanceof HTMLSlotElement){f(e);return}e instanceof Element&&e.querySelectorAll(`slot`).forEach(e=>f(e))})});t.shadowRoot&&p.observe(t.shadowRoot,{childList:!0,subtree:!0}),x(()=>{s=!0,p.disconnect();for(let e of[...o.values()])e();o.clear(),a.clear()});let m={elements:e=>l(O(e)),has:e=>c(O(e))};return k.set(t,m),m},fe=()=>{let e=y().el;return{bind:(t,n,r)=>{let i=[],a=typeof t==`string`?{[t]:n}:t,o=typeof t==`string`&&t===`on`?r:n;if(`attr`in a)for(let[t,n]of Object.entries(a.attr)){let r=pe(e,t.startsWith(`aria-`)||t===`role`?t:t.startsWith(`aria`)?`aria-${t.slice(4).toLowerCase()}`:t,n);r&&i.push(r)}if(`class`in a&&i.push(me(e,a.class)),`on`in a)for(let t of Object.keys(a.on)){let n=a.on[t];n&&i.push(d(e,t,n,o))}let s=()=>{for(;i.length>0;)i.pop()?.()};return x(s),s},el:e,shadowRoot:e.shadowRoot}};function pe(e,t,n){if(typeof n==`function`)return C(()=>u(e,t,n()));u(e,t,n)}function me(e,t){let n=new Set;return C(()=>{let r=new Set(Object.entries(t()).filter(([,e])=>e).map(([e])=>e));for(let t of n)r.has(t)||e.classList.remove(t);for(let t of r)n.has(t)||e.classList.add(t);n=r})}var he=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),j=new Set,ge=e=>typeof e!=`object`||!e||!(`default`in e)?!1:Object.keys(e).every(e=>he.has(e)),M=new WeakMap,_e=(t,n,r)=>{let i=y().el;M.has(i)||M.set(i,new Map);let a=r?.parse??(e=>r?.type===Boolean?e===``||e===`true`:typeof n==`boolean`?e!==null&&e!==`false`:e==null?n:r?.type===Number||typeof n==`number`?Number(e):e),o=(0,e.signal)(n),s=Object.prototype.hasOwnProperty.call(i,t),c=s?i[t]:void 0,l={parse:a,reflect:r?.reflect??!0,signal:o};if(s?(delete i[t],o.value=c):i.hasAttribute(t)&&(o.value=a(i.getAttribute(t))),M.get(i).set(t,l),Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>o.value,set:e=>{o.value=e}}),r?.reflect??!0){let e=r?.omit??!1;C(()=>{let n=o.value;n==null||n===!1||e&&n===``?i.removeAttribute(t):u(i,t,n)})}return o};function ve(e){let t={},n=y().el.localName;for(let[r,i]of Object.entries(e)){let e=ge(i)?i:{default:i},a=typeof e.default==`object`&&e.default!==null||Array.isArray(e.default);if(e.reflect===!0&&a){let e=`${n}:${String(r)}`;j.has(e)||(j.add(e),console.warn(`[craftit] props.${e} requested reflect: true for a structured default; reflection is disabled.`))}let o={reflect:!a,...e};t[r]=_e(f(r),e.default,o)}return t}var N=new WeakMap,P=new WeakMap,ye=(t,n)=>{let r=y().el;if(!r.constructor.formAssociated)throw Error(`[craftit:E8] defineField() requires define(..., { formAssociated: true, ... })`);let i=P.get(r)??r.attachInternals();P.set(r,i);let a=t.toFormValue??(e=>e==null?``:String(e));(0,e.effect)(()=>{i.setFormValue(a(t.value.value))});let o=t.disabled;return o&&(0,e.effect)(()=>{o.value?i.states.add(`disabled`):i.states.delete(`disabled`)}),n&&N.set(r,{...N.get(r),...n}),{checkValidity:()=>i.checkValidity(),internals:i,reportValidity:()=>i.reportValidity(),setCustomValidity:e=>e?i.setValidity({customError:!0},e):i.setValidity({}),setValidity:i.setValidity.bind(i)}},F=t=>{if((0,e.isSignal)(t))return t;if(typeof t==`function`)return(0,e.computed)(t)},be=t=>{if(!(0,e.isSignal)(t))return!1;let n=Object.getPrototypeOf(t);for(;n;){let e=Object.getOwnPropertyDescriptor(n,`value`);if(e)return typeof e.set==`function`;n=Object.getPrototypeOf(n)}return!1},I=(e,t)=>{if(!Object.is(e.value,t))try{e.value=t}catch{}},xe=(e,t,n,r)=>{if(n){if(t===`value`){(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)&&r(d(e,e instanceof HTMLSelectElement?`change`:`input`,()=>{I(n,e.value)}));return}t===`checked`&&e instanceof HTMLInputElement&&r(d(e,`change`,()=>{I(n,e.checked)}))}},L=new Map,Se=e=>{let t=L.get(e);return t||(t=document.createElement(`template`),t.innerHTML=e,L.set(e,t)),t},R=e=>Se(e).content.cloneNode(!0),z=(e,t)=>{if(e.nodeType===Node.COMMENT_NODE){let n=e.nodeValue;n&&t.comments.set(n,e);return}if(e.nodeType!==Node.ELEMENT_NODE)return;let n=e.getAttribute(`u`);n&&t.elements.set(n,e)},Ce=e=>{let t={comments:new Map,elements:new Map},n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(z(e,t);n.nextNode();)z(n.currentNode,t);return t},B=e=>{let t={comments:new Map,elements:new Map};for(let n of e){let e=document.createTreeWalker(n,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(z(n,t);e.nextNode();)z(e.currentNode,t)}return t},we=(e,t)=>{let n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT);for(;n.nextNode();){let e=n.currentNode;if(e.nodeValue===t)return e}return null},V=e=>Array.from(R(e).childNodes),H=(e,t,n)=>{if(e.parentNode)for(let r of t)e.parentNode.insertBefore(r,n)},U=e=>Array.isArray(e)||typeof e==`object`&&!!e,W=(t,n,r)=>{r((0,e.effect)(()=>n(t.value)))},Te=(t,n,r)=>{let i=r=>{let i=M.get(t)?.get(n.name);if(!i&&U(r)){t[n.name]=r;return}if((!i||i.reflect)&&(n.mode===`bool`?t.toggleAttribute(n.name,!!r):u(t,n.name,r)),!i)return;let a=U(r)?r:i.parse(n.mode===`bool`?r?``:null:r==null||r===!1?null:String(r));Object.is((0,e.untrack)(()=>i.signal.value),a)||(i.signal.value=a)};n.signal?W(n.signal,i,r):i(n.value)},Ee=(e,t,n)=>{let r=n=>{e[t.name]=n};t.signal?W(t.signal,r,n):r(t.value),xe(e,t.name,t.model,n)},De=(e,t,n)=>{let{modifiers:r}=t,i=r?{capture:!!r.capture,once:!!r.once,passive:!!r.passive}:void 0;n(d(e,t.name,e=>{r?.self&&e.target!==e.currentTarget||(r?.stop&&e.stopPropagation(),r?.prevent&&!r?.passive&&e.preventDefault(),t.handler(e))},i))},Oe=(e,t,n)=>{let{ref:r}=t;if(typeof r==`function`){r(e),n(()=>r(null));return}if(Array.isArray(r)){r.push(e),n(()=>{let t=r.indexOf(e);t!==-1&&r.splice(t,1)});return}r.value=e,n(()=>{r.value=null})},G=(e,t,n,r)=>{let i=new Map;for(let a of e){let e=a.uid;if(a.type===`text`){let r=n.comments.get(e);if(r){let i=document.createTextNode(``);r.replaceWith(i),n.comments.delete(e),W(a.signal,e=>{i.textContent=String(e)},t)}}else a.type===`html`?r?.onHtml?.(a):(i.has(e)||i.set(e,[]),i.get(e).push(a))}for(let[e,r]of i){let i=n.elements.get(e);if(i){i.removeAttribute(`u`),n.elements.delete(e);for(let e of r)switch(e.type){case`attr`:Te(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:De(i,e,t);break;case`prop`:Ee(i,e,t);break;case`ref`:Oe(i,e,t);break}}}},K=(e,t,n,r)=>{G(t,n,Ce(e),r)},q=(e,t,n,r)=>{let i=F(r);return i?{mode:e,name:t,signal:i,type:`attr`,uid:n}:{mode:e,name:t,type:`attr`,uid:n,value:r}},ke=(e,t,n)=>{let r=F(n);return r?{model:be(n)?n:void 0,name:e,signal:r,type:`prop`,uid:t}:{name:e,type:`prop`,uid:t,value:n}},Ae=RegExp(`u="([^"]+)"`,`g`),je=e=>e.replace(/>\s+</g,`><`).trim(),Me=[{kind:`event`,regex:/\s+@([a-zA-Z_][-a-zA-Z0-9_.]*)\s*=\s*["']?$/},{kind:`ref`,regex:/\s+ref\s*=\s*["']?$/},{kind:`specialAttr`,regex:/\s+([:?])([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`prop`,regex:/\.([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`plainAttr`,regex:/\s+([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/}],J=new WeakMap,Ne=e=>{let[t,...n]=e.split(`.`),r={};for(let e of n)e===`capture`?r.capture=!0:e===`once`?r.once=!0:e===`passive`?r.passive=!0:e===`prevent`?r.prevent=!0:e===`self`?r.self=!0:e===`stop`&&(r.stop=!0);return{modifiers:Object.keys(r).length?r:void 0,name:t}},Pe=e=>{let t=[];for(let n=0;n<e.length-1;n++){let r=e[n],i=!1;for(let e of Me){let n=e.regex.exec(r);if(!n)continue;let a=r.slice(0,-n[0].length);if(i=!0,e.kind===`event`){let e=Ne(n[1]);t.push({kind:`event`,modifiers:e.modifiers,name:e.name,prefix:a,raw:r})}else e.kind===`ref`?t.push({kind:`ref`,prefix:a,raw:r}):e.kind===`specialAttr`?t.push({kind:`specialAttr`,mode:n[1]===`?`?`bool`:`attr`,name:n[2],prefix:a,raw:r}):e.kind===`prop`?t.push({kind:`prop`,name:n[1],prefix:a,raw:r}):e.kind===`plainAttr`&&t.push({kind:`plainAttr`,name:n[1],prefix:a,raw:r});break}i||t.push({kind:`node`,prefix:r,raw:r})}return{slots:t,tail:e[e.length-1]??``}},Fe=e=>{let t=J.get(e);return t||(t=Pe(e),J.set(e,t)),t},Y=()=>{let e=0;return()=>String(e++)},X=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(Ae,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},Ie=e=>typeof e!=`object`||!e||!(c in e)?null:e[c],Z=e=>typeof e==`string`?m(e):e==null?``:s(e)?e.__html:m(String(e)),Le=t=>{let n={bindings:[],html:``};return{bindings:[],signal:(0,e.computed)(()=>{let e=t(),r=Array.isArray(e)?e:[e],i=Y(),a=``,o=[];for(let e of r)if(s(e)){let t=X(e,i);a+=t.html,o.push(...t.bindings)}else a+=Z(e);let c=o.length!==n.bindings.length||o.some((e,t)=>e!==n.bindings[t]);return(a!==n.html||c)&&(n={bindings:o,html:a}),n})}},Re=t=>{let n=Ie(t);if(n)return{keyed:!0,signal:n};if(typeof t==`function`&&!(0,e.isSignal)(t)){let{signal:e}=Le(t);return{keyed:!1,signal:e}}return(0,e.isSignal)(t)&&s(t.value)?{keyed:!1,signal:(0,e.computed)(()=>{let e=t.value;if(!s(e))return{bindings:[],html:Z(e)};let n=X(e,Y());return{bindings:n.bindings,html:n.html}})}:null},ze=(t,n)=>{let r=Fe(t),i=``,a=[],c=null,l=Y(),u=e=>e.lastIndexOf(`<`)>e.lastIndexOf(`>`),d=e=>((!c||u(e))&&(c=l()),c),f=()=>{c=null};for(let t=0;t<r.slots.length;t++){let o=r.slots[t],c=n[t];if(o.kind===`event`){if(typeof c==`function`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push({handler:c,modifiers:o.modifiers,name:o.name,type:`event`,uid:e})}else i+=o.raw;continue}if(o.kind===`ref`){if(c){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push({ref:c,type:`ref`,uid:e})}else i+=o.raw;continue}if(o.kind===`specialAttr`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push(q(o.mode,o.name,e,c));continue}if(o.kind===`prop`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push(ke(o.name,e,c));continue}if(o.kind===`plainAttr`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push(q(`attr`,o.name,e,c));continue}if(typeof c==`object`&&c&&(`mount`in c||`render`in c)){let t=`render`in c,n=t?l():d(o.raw);t?i+=`${o.raw}<!--${n}-->`:i+=`${o.raw} u="${n}"`;let r=c.mount?.bind(c);if(r&&a.push({apply:(e,t)=>{r(e,{registerCleanup:t})},type:`callback`,uid:n}),t){let t=c.render.bind(c),r={bindings:[],html:``},i=(0,e.computed)(()=>{let e=t(),n=Array.isArray(e)?e:[e],i=Y(),a=``,o=[];for(let e of n)if(s(e)){let t=X(e,i);a+=t.html,o.push(...t.bindings)}else a+=Z(e);let c=o.length!==r.bindings.length||o.some((e,t)=>e!==r.bindings[t]);return(a!==r.html||c)&&(r={bindings:o,html:a}),r});a.push({keyed:!1,signal:i,type:`html`,uid:n})}continue}f();let u=Re(c);if(u){let e=l();i+=`${o.raw}<!--${e}-->`,a.push({keyed:u.keyed,signal:u.signal,type:`html`,uid:e});continue}if(Array.isArray(c)){let e=``;for(let t of c)if(s(t)){let n=X(t,l);e+=n.html,a.push(...n.bindings)}else e+=Z(t);i+=o.raw+e;continue}if((0,e.isSignal)(c)){let e=l();i+=`${o.raw}<!--${e}-->`,a.push({signal:c,type:`text`,uid:e})}else if(s(c)){let e=X(c,l);i+=o.raw+e.html,a.push(...e.bindings)}else i+=o.raw+Z(c)}return i+=r.tail,o(je(i),a)},Be=e=>{l(e.cleanups);for(let t of e.nodes)t.remove()},Q=(e,t,n=B(e))=>{let r=[];return G(t,e=>r.push(e),n),r},$=(t,n,r,i)=>{let a=we(t,n.uid);if(!a)return;let o=document.createComment(`html-binding`);a.replaceWith(o);let s=[],c=e=>s.push(e),u=()=>{l(s),s=[]},d=null,f=[];r((0,e.effect)(()=>{(0,e.batch)(()=>{let r=n.signal.value;if(!n.keyed&&r.html===d)return;d=r.html,u();let{bindings:a,html:s,keys:p}=r;n.keyed&&!i.has(n.uid)&&i.set(n.uid,new Map);let m=n.keyed?i.get(n.uid):null,h=o.parentElement||t,g=!1;(0,e.untrack)(()=>{(0,e.batch)(()=>{if(m&&p?.length&&r.items?.length===p.length){if(g=!0,m.size===0&&f.length>0){for(let e of f)e.remove();f=[]}let e=new Map;for(let t=0;t<p.length;t++){let n=p[t],i=r.items[t],a=m.get(n),s=t>0?e.get(p[t-1])?.nodes:null,c=s?.length?s[s.length-1].nextSibling:o.nextSibling;if(a&&a.html===i.html){a.nodes[0]&&H(o,a.nodes,c),l(a.cleanups);let t=B(a.nodes),r=Q(a.nodes,i.bindings,t);e.set(n,{...a,bindings:i.bindings,cleanups:r,targets:t})}else if(a){l(a.cleanups);let t=V(i.html),r=B(t);H(o,t,c);let s=Q(t,i.bindings,r);e.set(n,{bindings:i.bindings,cleanups:s,html:i.html,nodes:t,targets:r});for(let e of a.nodes)e.remove()}else{let t=V(i.html),r=B(t);H(o,t,c);let a=Q(t,i.bindings,r);e.set(n,{bindings:i.bindings,cleanups:a,html:i.html,nodes:t,targets:r})}}for(let[t,n]of m)e.has(t)||Be(n);i.set(n.uid,e)}else{if(n.keyed&&m&&m.size>0)for(let[,e]of m)Be(e);else for(let e of f)e.remove();let e=R(s);f=Array.from(e.childNodes),o.after(e),n.keyed&&i.set(n.uid,new Map)}}),g||K(h,a,c,{onHtml:e=>$(h,e,c,i)})})})})),r(u),n.keyed&&r(()=>i.delete(n.uid))},Ve=K,He=(e,...t)=>ze(e,t),Ue=(e,t,n,r)=>{$(e,t,n,r)},We=class extends HTMLElement{static _options;static _setup;static formAssociated=!1;static observedAttributes=[];shadow;_appliedHtmlBindings=new Set;_keyedStates=new Map;_mountFns=[];_runtime;_rendered=!1;_setupDone=!1;_template=null;constructor(){super();let e=this.constructor._options;this.shadow=this.attachShadow({mode:`open`,...e?.shadow}),this._runtime={cleanups:[],el:this,errorHandlers:[],onMount:[],styles:e?.styles}}connectedCallback(){(0,e.untrack)(()=>{this._setupDone||this._runSetup(),this._init()})}attributeChangedCallback(t,n,r){if(n===r)return;let i=M.get(this)?.get(t);if(!i)return;let a=i.parse(r);Object.is((0,e.untrack)(()=>i.signal.value),a)||(i.signal.value=a)}disconnectedCallback(){l(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear(),this._rendered=!1}formAssociatedCallback(e){N.get(this)?.onAssociated?.(e)}formDisabledCallback(e){N.get(this)?.onDisabled?.(e)}formResetCallback(){N.get(this)?.onReset?.()}formStateRestoreCallback(e,t){N.get(this)?.onStateRestore?.(e,t)}_handleError(e){if(this._runtime.errorHandlers.length>0)for(let t of this._runtime.errorHandlers)t(e);else throw console.error(`[craftit:E3] <${this.localName}>`,e),e instanceof Error?e:Error(String(e))}_runSetup(){this._setupDone=!0,v.push(this._runtime);try{let{host:e}=this.constructor._options??{};if(e)for(let[t,n]of Object.entries(e))typeof n==`boolean`?n?this.setAttribute(t,``):this.removeAttribute(t):this.setAttribute(t,String(n));let t=this.constructor._setup();(typeof t==`string`||typeof t==`object`&&t&&`__html`in t)&&(this._template=t)}catch(e){this._handleError(e)}finally{v.pop()}}_init(){let{styles:e}=this._runtime;if(e?.length&&(this.shadow.adoptedStyleSheets=e.map(te)),this._template){let e=typeof this._template==`string`?o(this._template):this._template;if(this._rendered||=(this.shadow.replaceChildren(R(e.__html)),!0),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);Ve(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),Ue(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{v.push(this._runtime);try{let e=this._runtime.onMount;this._mountFns=e.slice();for(let t of e){let e=t();typeof e==`function`&&this._runtime.cleanups.push(e)}}catch(e){this._handleError(e)}finally{v.pop(),this._runtime.onMount=[]}})}};function Ge(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))return e;class r extends We{static _options=n;static _setup=t;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}var Ke=(e,t)=>{let{formAssociated:n,host:r,props:i,setup:a,shadow:o,styles:s}=t;return Ge(e,()=>{let e=i?ve(i):{},t=h(),n=fe(),r;return a({emit:t,host:n,props:e,shadowRoot:n.shadowRoot,slots:{elements:e=>(r||=A(),r.elements(e)),has:e=>(r||=A(),r.has(e))}})},{formAssociated:n,host:r,observedAttrs:i?Object.keys(i).map(f):[],shadow:o,styles:s})};function qe(e,t){return Ke(e,t)}Object.defineProperty(exports,`batch`,{enumerable:!0,get:function(){return e.batch}}),exports.bridgeContextAttributes=de,Object.defineProperty(exports,`computed`,{enumerable:!0,get:function(){return e.computed}}),exports.createCleanupSignal=ae,exports.createContext=le,exports.createId=r,exports.css=ee,exports.currentRuntime=y,exports.define=qe,exports.defineField=ye,exports.effect=C,exports.fire=T,exports.handle=ie,exports.html=He,exports.inject=ce,Object.defineProperty(exports,`isSignal`,{enumerable:!0,get:function(){return e.isSignal}}),exports.onCleanup=x,exports.onElement=oe,exports.onError=ne,exports.onMount=b,Object.defineProperty(exports,`peekValue`,{enumerable:!0,get:function(){return e.peekValue}}),exports.provide=se,Object.defineProperty(exports,`readonly`,{enumerable:!0,get:function(){return e.readonly}}),exports.ref=i,exports.refs=a,Object.defineProperty(exports,`signal`,{enumerable:!0,get:function(){return e.signal}}),exports.syncContextProps=ue,Object.defineProperty(exports,`toValue`,{enumerable:!0,get:function(){return e.toValue}}),Object.defineProperty(exports,`untrack`,{enumerable:!0,get:function(){return e.untrack}}),exports.watch=re,Object.defineProperty(exports,`writable`,{enumerable:!0,get:function(){return e.writable}});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@vielzeug/stateit`);var t={cleanupFailed:`One or more cleanup callbacks failed during dispose`,defineDuplicate:e=>`define('${e}') was called more than once`,defineFieldRequiresFormAssociated:e=>`defineField() requires define('${e}', { formAssociated: true })`,defineRequiresTag:`define() requires a non-empty tag name`,eachDuplicateKey:(e,t)=>`each() received duplicate key "${e}" at index ${t}`,injectStrictFailed:(e,t)=>`injectStrict() could not resolve key "${e}" in <${t}>`,lifecycleOutsideSetup:`Lifecycle hooks must be called synchronously during component setup`,styleReplaceFailed:`Style sheet replace failed`,unhandledComponentError:e=>`<${e}> threw an unhandled error during setup`};function n(){return(0,e.signal)(null)}function r(){return[]}var i=e=>typeof e==`object`&&!!e&&e.__craftitDirective===!0&&typeof e.mount==`function`;function a(e,t=[]){return{__bindings:t,__craftitHtmlResult:!0,__html:e,toString(){return e}}}var o=e=>typeof e==`object`&&!!e&&e.__craftitHtmlResult===!0;function s(e){return typeof e==`string`?{bindings:[],html:e}:{bindings:e.__bindings,html:e.__html}}var c=e=>typeof e==`object`&&!!e&&e.__craftitCssResult===!0,l=e=>{let n=[];for(let t=e.length-1;t>=0;t--)try{e[t]()}catch(e){n.push(e)}if(n.length>0)throw AggregateError(n,t.cleanupFailed)},u=e=>{for(let t of e)t.remove()},d=(e,t,n)=>{if(/^on/i.test(t)){e.removeAttribute(t);return}n==null||n===!1?e.removeAttribute(t):e.setAttribute(t,n===!0?`true`:String(n))},f=(e,t,n,r)=>{if(!e)return()=>{};let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},p=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),m={"'":`&#39;`,'"':`&quot;`,"&":`&amp;`,"<":`&lt;`,">":`&gt;`},h=e=>String(e).replace(/[&<>"']/g,e=>m[e]),g=()=>{let e=D();return((t,...n)=>{v.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)})},_={bubbles:!0,cancelable:!0,composed:!0},v={custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{..._,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{..._,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{..._,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{..._,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{..._,...n})):e.dispatchEvent(new CustomEvent(t,{..._,...n}))}},y=0,b=e=>`${e?`${e}-`:`cft-`}${++y}`,ee=RegExp(`u="([^"]+)"`,`g`),x=()=>{let e=0;return()=>String(e++)},S=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(ee,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},te=function(){return this.content},ne=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=c(e)?e.content:e??``}return{__craftitCssResult:!0,content:n.trim(),toString:te}},C=new Map,re=e=>{if(e instanceof CSSStyleSheet)return e;let n=typeof e==`string`?e:e.content,r=C.get(n);if(r)return r;let i=new CSSStyleSheet;try{i.replaceSync(n)}catch(e){console.error(t.styleReplaceFailed,e)}return C.set(n,i),i},w=null,T=null,E=(e,t)=>{let n=w;w=e;try{return t()}finally{w=n}},D=()=>{if(w)return w;throw Error(t.lifecycleOutsideSetup)},O=(e,t)=>{let n=T;T=e;try{return t()}finally{T=n}},k=t=>T?((0,e.onCleanup)(t),!0):!1,A=e.onCleanup,j=e=>{if(!T)throw Error(t.lifecycleOutsideSetup);T.mountCallbacks.push(e)},M=t=>{let n=(0,e.effect)(()=>t());return k(n),n};function ie(e,n,r,i){if(!T)throw Error(t.lifecycleOutsideSetup);e&&k(f(e,n,r,i))}function ae(e,t,n,r){return f(e,t,n,r)}var oe=(e,t)=>M(()=>{let n=e.value;if(n)return t(n)}),N=new WeakMap,se=(e,t)=>{let n=D();N.has(n)||N.set(n,new Map),N.get(n).set(e,t)};function P(e,...t){let n=D();for(;n;){if(n instanceof HTMLElement){let t=N.get(n)?.get(e);if(t!==void 0)return t}let t=n.getRootNode();n=n.parentElement??(t instanceof ShadowRoot?t.host:null)}return t.length>0?t[0]:void 0}var ce=e=>{let n=P(e);if(n!==void 0)return n;let r=D();throw Error(t.injectStrictFailed(String(e),r.localName))};function le(e){return Symbol(e)}var ue=e=>e===`role`||e.startsWith(`aria-`)?e:e.startsWith(`aria`)?`aria-${e.slice(4).toLowerCase()}`:`aria-${e}`,de=e=>e===`role`||e.startsWith(`aria-`)?e:e.startsWith(`aria`)?`aria-${e.slice(4).toLowerCase()}`:e,F=(e,t,n)=>{if(n==null||n===!1){e.removeAttribute(t);return}e.setAttribute(t,n===!0?`true`:String(n))},fe=(t,n,r={})=>{let{autoCleanup:i=!0}=r,a=[];for(let[r,i]of Object.entries(n)){let n=ue(r);if(typeof i==`function`){let r=i;a.push((0,e.effect)(()=>{F(t,n,r())}));continue}F(t,n,i)}let o=()=>{for(;a.length>0;)a.pop()?.()};return i&&k(o),o},pe=`default`,I=e=>e||pe,me=()=>{let t=D(),n=new Map,r=new Map,i=new Map,a=t=>{let r=n.get(t);return r||(r={elements:(0,e.signal)([]),presence:(0,e.signal)(!1)},n.set(t,r)),r},o=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0},s=e=>{let t=I(e),n=r.get(t),i=[];if(n)for(let e of n)i.push(...e.assignedElements({flatten:!0}));let s=a(t);o(s.elements.value,i)||(s.elements.value=i);let c=i.length>0;s.presence.value!==c&&(s.presence.value=c)},c=e=>{if(i.has(e))return;let t=I(e.getAttribute(`name`)),n=r.get(t)??new Set;n.add(e),r.set(t,n);let a=()=>s(t);e.addEventListener(`slotchange`,a),i.set(e,()=>{e.removeEventListener(`slotchange`,a)}),s(t)},l=()=>{t.shadowRoot?.querySelectorAll(`slot`).forEach(e=>c(e))},u=()=>{for(let e of r.keys())s(e)};return l(),j(()=>{l(),u()}),A(()=>{for(let e of i.values())e();i.clear(),r.clear()}),{elements:e=>a(I(e)).elements,has:e=>a(I(e)).presence}},he=()=>{let e=D();return{bind:(t,n)=>{let r=[];if(t.attr)for(let[n,i]of Object.entries(t.attr)){let t=ge(e,de(n),i);t&&r.push(t)}if(t.class&&r.push(ve(e,t.class)),t.prop)for(let[n,i]of Object.entries(t.prop)){let{get:t,set:a}=i;Object.defineProperty(e,n,{configurable:!0,enumerable:!0,get:t,...a?{set:a}:{}}),r.push(()=>{let r=Object.getOwnPropertyDescriptor(e,n);!r||r.get!==t||r.set!==a||delete e[n]})}if(t.on)for(let i of Object.keys(t.on)){let a=t.on[i];a&&r.push(f(e,i,a,n))}if(t.style)for(let[n,i]of Object.entries(t.style)){let t=_e(e,n,i);t&&r.push(t)}let i=()=>{for(;r.length>0;)r.pop()?.()};return A(i),i},el:e}},L=(t,n)=>{if(typeof t==`function`)return M(()=>n(t()));if((0,e.isSignal)(t))return M(()=>n(t.value));n(t)};function ge(e,t,n){return L(n,n=>d(e,t,n))}function _e(e,t,n){let r=t.startsWith(`--`)?t:p(t),i=!1;return L(n,t=>{t!=null&&t!==``?(i=!0,e.style.setProperty(r,String(t))):i&&e.style.removeProperty(r)})}function ve(t,n){let r=typeof n==`function`?n:()=>{let t={};for(let[r,i]of Object.entries(n))t[r]=typeof i==`function`?i():(0,e.isSignal)(i)?i.value:!!i;return t},i=new Set;return M(()=>{let e=new Set;for(let[n,a]of Object.entries(r()))a&&(e.add(n),i.has(n)||t.classList.add(n));for(let n of i)e.has(n)||t.classList.remove(n);i=e})}var ye={bool(e=!1){return{default:e,parse:e=>e===``||e===`true`,reflect:!0}},json(e){return{default:e,parse:t=>{if(t==null||t===``)return e;try{return JSON.parse(t)}catch{return e}},reflect:!1}},number(e=0){return{default:e,parse:t=>t==null?e:Number(t),reflect:!0}},oneOf(e,t){return{default:t,parse:n=>n!=null&&e.includes(n)?n:t,reflect:!0}},string(e){return{default:e,parse:t=>t??e,reflect:!0}}},be=e=>typeof e==`object`&&!!e&&`default`in e,R=e=>Array.isArray(e)||typeof e==`object`&&!!e;function z(e){if(be(e)){let t=e,n=t.reflect??!0;if(n&&R(t.default))throw Error(`Structured prop defaults cannot use reflect:true. Set reflect:false and sync explicitly.`);return{...t,reflect:n}}return R(e)?{default:e,reflect:!1}:{default:e,reflect:!0}}var B=new WeakMap,V=new WeakMap,xe=(e,t)=>{let n=V.get(e);n||(n=new Set,V.set(e,n)),n.add(t)},Se=(e,t)=>{let n=V.get(e);n&&(n.delete(t),n.size===0&&V.delete(e))},Ce=(e,t)=>V.get(e)?.has(t)??!1,we={boolean:e=>e===``||e===`true`,number:e=>Number(e),string:e=>e},Te=e=>t=>{if(t==null)return e;let n=we[typeof e];return n?n(t):t},Ee=(t,n,r,i)=>{let a=D();B.has(a)||B.set(a,new Map);let o=i?.parse??Te(r),s=(0,e.signal)(r),c=Object.prototype.hasOwnProperty.call(a,t),l=c?a[t]:void 0,u={parse:o,reflect:i?.reflect??!0,signal:s};return c?(delete a[t],s.value=l):a.hasAttribute(n)&&(s.value=o(a.getAttribute(n))),B.get(a).set(n,u),Object.defineProperty(a,t,{configurable:!0,enumerable:!0,get:()=>s.value,set:e=>{s.value=e}}),(i?.reflect??!0)&&M(()=>{let e=s.value;xe(a,n);try{e==null?a.removeAttribute(n):typeof e==`boolean`?a.toggleAttribute(n,e):d(a,n,e)}finally{Se(a,n)}}),s};function De(e){let t={};for(let[n,r]of Object.entries(e)){let e=typeof r==`object`&&r&&`default`in r?r:z(r);t[n]=Ee(n,p(n),e.default,e)}return t}var Oe=e=>({__live:!0,get value(){return e.value}}),ke=e=>typeof e==`object`&&!!e&&e.__live===!0,H=e=>{let t=document.createElement(`template`);return t.innerHTML=e,t.content.cloneNode(!0)},Ae=(e,t)=>{if(e.nodeType===Node.COMMENT_NODE){let n=e.nodeValue;n&&t.comments.set(n,e);return}if(e.nodeType!==Node.ELEMENT_NODE)return;let n=e.getAttribute(`u`);n&&t.elements.set(n,e)},je=(e,t)=>{let n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(t(e);n.nextNode();)t(n.currentNode)},U=e=>{let t={comments:new Map,elements:new Map};for(let n of e)je(n,e=>Ae(e,t));return t},Me=(e,t)=>{let n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT);for(;n.nextNode();){let e=n.currentNode;if(e.nodeValue===t)return e}return null},W=e=>Array.isArray(e)||typeof e==`object`&&!!e,Ne=e=>e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement,Pe=(e,t,n,r)=>{let i=t==null?``:String(t);n&&r.last!==void 0&&!Object.is(e.value,r.last)&&!Object.is(e.value,i)||(e.value=i,n&&(r.last=i))},Fe=(e,t,n,r)=>{let i=!!t;n&&r.last!==void 0&&e.checked!==!!r.last&&e.checked!==i||(e.checked=i,n&&(r.last=i))},Ie=(t,n,r,i)=>{let a=W(i)?i:n.parse(r.mode===`bool`?i?``:null:i==null||i===!1?null:String(i));if(Object.is((0,e.untrack)(()=>n.signal.value),a)||(n.signal.value=a),!n.reflect){if(W(i))return;r.mode===`bool`?t.toggleAttribute(r.name,!!i):d(t,r.name,i)}},G=(t,n,r)=>{r((0,e.effect)(()=>n(t.value)))},Le=(e,t,n)=>{let r=B.get(e)?.get(t.name),i={last:void 0},a=n=>{if(!r&&W(n)){e[t.name]=n;return}if(!r&&t.name===`value`&&Ne(e)){Pe(e,n,t.live,i);return}if(!r&&t.name===`checked`&&e instanceof HTMLInputElement){Fe(e,n,t.live,i);return}if(!r){t.mode===`bool`?e.toggleAttribute(t.name,!!n):d(e,t.name,n);return}Ie(e,r,t,n)};t.signal?G(t.signal,a,n):a(t.value)},Re=(e,t,n)=>{n(f(e,t.name,t.handler,t.options))},ze=(e,t,n)=>{let{ref:r}=t;if(typeof r==`function`){r(e),n(()=>r(null));return}if(Array.isArray(r)){r.push(e),n(()=>{let t=r.indexOf(e);t!==-1&&r.splice(t,1)});return}r.value=e,n(()=>{r.value=null})},K=(e,t,n,r)=>{let i=new Map;for(let a of e){let e=a.uid;if(a.type===`text`){let r=n.comments.get(e);if(r){let i=document.createTextNode(``);r.replaceWith(i),n.comments.delete(e),G(a.signal,e=>{i.textContent=String(e)},t)}}else if(a.type===`directive`){let r=n.comments.get(e);r&&(a.directive.mount(r,t),n.comments.delete(e))}else if(a.type===`html`)r?.onHtml?.(a);else{let t=i.get(e);t?t.push(a):i.set(e,[a])}}for(let[e,r]of i){let i=n.elements.get(e);if(i){i.removeAttribute(`u`),n.elements.delete(e);for(let e of r)e.type===`attr`?Le(i,e,t):e.type===`event`?Re(i,e,t):e.type===`ref`&&ze(i,e,t)}}},q=(e,t,n,r)=>{K(t,n,U([e]),r)},Be=(t,n,r,i)=>ke(i)?{live:!0,mode:t,name:n,signal:i,type:`attr`,uid:r}:typeof i==`function`?{mode:t,name:n,signal:(0,e.computed)(i),type:`attr`,uid:r}:(0,e.isSignal)(i)?{mode:t,name:n,signal:i,type:`attr`,uid:r}:{mode:t,name:n,type:`attr`,uid:r,value:i},J=(t,n,r)=>{let i=Me(t,n.uid);if(!i)return;let a=document.createComment(`html-binding`);i.replaceWith(a);let o=[],s=e=>o.push(e),c=()=>{l(o),o=[]},d=null,f=[];r((0,e.effect)(()=>{(0,e.batch)(()=>{let r;try{r=n.signal.value}catch(e){if(e instanceof Error&&e.message.includes(`[stateit] Cannot read disposed computed signal`))return;throw e}if(r.html===d)return;d=r.html,c();let{bindings:i,html:o}=r,l=a.parentElement||t;(0,e.untrack)(()=>{(0,e.batch)(()=>{u(f);let e=H(o);f=Array.from(e.childNodes),a.after(e)}),q(l,i,s,{onHtml:e=>J(l,e,s)})})})})),r(c)},Ve=class extends HTMLElement{static _options;static _setup;static formAssociated=!1;static observedAttributes=[];shadow;_component;constructor(){super();let t=this.constructor._options;this.shadow=this.attachShadow({mode:`open`,...t?.shadow}),this._component={mountCallbacks:[],mountedCallbacksRan:!1,mountToken:0,scope:(0,e.scope)(),setupDone:!1,styles:t?.styles,templateMounted:!1,templateResult:null}}connectedCallback(){(0,e.untrack)(()=>{this._component.setupDone||this._runSetup(),this._init()})}attributeChangedCallback(t,n,r){if(n===r||Ce(this,t))return;let i=B.get(this)?.get(t);if(!i)return;let a=i.parse(r);Object.is((0,e.untrack)(()=>i.signal.value),a)||(i.signal.value=a)}disconnectedCallback(){this._component.mountToken++,this._component.scope.dispose(),this._component.scope=(0,e.scope)(),this._component.mountCallbacks=[],this._component.mountedCallbacksRan=!1,this._component.templateMounted=!1,this._component.templateResult=null,this._component.setupDone=!1}_handleError(e){throw console.error(t.unhandledComponentError(this.localName),e),e instanceof Error?e:Error(String(e))}_runSetup(){let e={element:this,mountCallbacks:[]};try{this._component.scope.run(()=>{let t=O(e,()=>E(this,()=>this.constructor._setup()));this._component.templateResult=O(e,()=>E(this,()=>t()))}),this._component.mountCallbacks.push(...e.mountCallbacks),this._component.setupDone=!0}catch(e){this._handleError(e)}}_init(){let{styles:t}=this._component;if(t?.length&&(this.shadow.adoptedStyleSheets=t.map(re)),!this._component.templateMounted&&this._component.templateResult!=null){let{bindings:t,html:n}=s(this._component.templateResult);this.shadow.replaceChildren(H(n)),this._component.templateMounted=!0,t.length&&this._component.scope.run(()=>{q(this.shadow,t,e.onCleanup,{onHtml:t=>J(this.shadow,t,e.onCleanup)})})}if(!this._component.mountedCallbacksRan&&this._component.mountCallbacks.length>0){this._component.mountedCallbacksRan=!0;let t=++this._component.mountToken;queueMicrotask(()=>{if(!(!this.isConnected||t!==this._component.mountToken))try{for(let t of this._component.mountCallbacks)this._component.scope.run(()=>{O({element:this,mountCallbacks:[]},()=>E(this,()=>{let n=t();typeof n==`function`&&(0,e.onCleanup)(n)}))})}catch(e){this._handleError(e)}})}}},He=(e,n,r={})=>{if(!e)throw Error(t.defineRequiresTag);if(customElements.get(e))throw Error(t.defineDuplicate(e));class i extends Ve{static _options=r;static _setup=n;static formAssociated=r.formAssociated??!1;static observedAttributes=r.observedAttrs??[]}return customElements.define(e,i),e},Ue=e=>e?De(e):{};function We(e,t){let{formAssociated:n,props:r,setup:i,shadow:a,styles:o}=t,s=(()=>{if(!r)return;let e={};for(let[t,n]of Object.entries(r))e[t]=z(n);return e})();return He(e,()=>{let e=Ue(s),t=he();return i(e,{emit:g(),host:t,slots:me()})},{formAssociated:n,observedAttrs:s?Object.keys(s).map(p):[],shadow:a,styles:o})}var Y=new WeakMap,Ge=e=>{let n=D();if(!n.constructor.formAssociated)throw Error(t.defineFieldRequiresFormAssociated(n.localName));let r=Y.get(n)??n.attachInternals();Y.set(n,r);let i=e.toFormValue??(e=>e==null?null:e instanceof File||e instanceof FormData?e:String(e));M(()=>{r.setFormValue(i(e.value.value))});let a=e.disabled;if(a){let e=r.states;M(()=>{a.value?e.add(`disabled`):e.delete(`disabled`)})}return{checkValidity:()=>r.checkValidity(),internals:r,reportValidity:()=>r.reportValidity(),setCustomValidity:e=>e?r.setValidity({customError:!0},e):r.setValidity({}),setValidity:r.setValidity.bind(r)}},Ke=[{kind:`event`,regex:/\s+@([a-zA-Z_][-a-zA-Z0-9_.-]*)\s*=\s*["']?$/},{kind:`ref`,regex:/\s+ref\s*=\s*["']?$/},{kind:`boolAttr`,regex:/\s+\?([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`attr`,regex:/\s+:?([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/}],X=new WeakMap,Z=new WeakMap,Q=new WeakMap,qe={prevent:e=>t=>{t.preventDefault(),e(t)},self:e=>t=>{t.target===t.currentTarget&&e(t)},stop:e=>t=>{t.stopPropagation(),e(t)}},Je=(e,t)=>{let n=t.reduce((e,t)=>qe[t]?.(e)??e,e),r={};return t.includes(`capture`)&&(r.capture=!0),t.includes(`once`)&&(r.once=!0),t.includes(`passive`)&&(r.passive=!0),{handler:n,...Object.keys(r).length?{options:r}:{}}},$=e=>typeof e==`string`?h(e):e==null?``:o(e)?e.__html:h(String(e)),Ye=t=>{let n={bindings:[],html:``};return{bindings:[],signal:(0,e.computed)(()=>{let e=t(),r=Array.isArray(e)?e:[e],i=x(),a=``,s=[];for(let e of r)if(o(e)){let t=S(e,i);a+=t.html,s.push(...t.bindings)}else a+=$(e);let c=s.length!==n.bindings.length||s.some((e,t)=>e!==n.bindings[t]);return(a!==n.html||c)&&(n={bindings:s,html:a}),n})}},Xe=t=>{if(typeof t==`function`){let e=t,n=Z.get(e);if(n)return{signal:n};let{signal:r}=Ye(e);return Z.set(e,r),{signal:r}}if((0,e.isSignal)(t)&&o(t.value)){let n=t,r=Q.get(n);if(r)return{signal:r};let i=(0,e.computed)(()=>{let e=n.value;if(!o(e))return{bindings:[],html:$(e)};let t=S(e,x());return{bindings:t.bindings,html:t.html}});return Q.set(n,i),{signal:i}}return null},Ze=e=>{let t=[];for(let n=0;n<e.length-1;n++){let r=e[n],i=!1;for(let e of Ke){let n=e.regex.exec(r);if(!n)continue;let a=r.slice(0,-n[0].length);if(i=!0,e.kind===`event`){let e=n[1].split(`.`),i=e[0],o=e.slice(1);t.push({kind:`event`,modifiers:o,name:i,prefix:a,raw:r})}else e.kind===`ref`?t.push({kind:`ref`,prefix:a,raw:r}):e.kind===`boolAttr`?t.push({kind:`boolAttr`,mode:`bool`,name:n[1],prefix:a,raw:r}):e.kind===`attr`&&t.push({kind:`attr`,mode:`attr`,name:n[1],prefix:a,raw:r});break}i||t.push({kind:`node`,prefix:r,raw:r})}return{slots:t,tail:e[e.length-1]??``}},Qe=e=>{let t=X.get(e);return t||(t=Ze(e),X.set(e,t)),t},$e=(t,n)=>{let r=Qe(t),s=``,c=[],l=null,u=x(),d=e=>e.lastIndexOf(`<`)>e.lastIndexOf(`>`),f=e=>((!l||d(e))&&(l=u()),l),p=()=>{l=null};for(let t=0;t<r.slots.length;t++){let a=r.slots[t],l=n[t];if(a.kind===`event`){if(typeof l==`function`){let e=f(a.prefix),{handler:t,options:n}=Je(l,a.modifiers??[]);s+=`${a.prefix} u="${e}"`,c.push({handler:t,name:a.name,options:n,type:`event`,uid:e})}else if((0,e.isSignal)(l)){let e=f(a.prefix),{handler:t,options:n}=Je(e=>{let t=l.value;typeof t==`function`&&t(e)},a.modifiers??[]);s+=`${a.prefix} u="${e}"`,c.push({handler:t,name:a.name,options:n,type:`event`,uid:e})}else s+=a.raw;continue}if(a.kind===`ref`){if(l){let e=f(a.prefix);s+=`${a.prefix} u="${e}"`,c.push({ref:l,type:`ref`,uid:e})}else s+=a.raw;continue}if(a.kind===`boolAttr`||a.kind===`attr`){let e=f(a.prefix);s+=`${a.prefix} u="${e}"`,c.push(Be(a.mode,a.name,e,l));continue}if(a.kind===`node`){if(p(),i(l)){let e=u();s+=`${a.raw}<!--${e}-->`,c.push({directive:l,type:`directive`,uid:e});continue}let t=Xe(l);if(t){let e=u();s+=`${a.raw}<!--${e}-->`,c.push({signal:t.signal,type:`html`,uid:e});continue}if(Array.isArray(l)){let e=``;for(let t of l)if(o(t)){let n=S(t,u);e+=n.html,c.push(...n.bindings)}else e+=$(t);s+=a.raw+e;continue}if((0,e.isSignal)(l)){let e=u();s+=`${a.raw}<!--${e}-->`,c.push({signal:l,type:`text`,uid:e})}else if(o(l)){let e=S(l,u);s+=a.raw+e.html,c.push(...e.bindings)}else s+=a.raw+$(l);continue}}return s+=r.tail,a(s,c)},et=(e,...t)=>$e(e,t),tt=(e,t)=>o(e)?S(e,t):{bindings:[],html:h(e)},nt=e=>o(e)?e:a(h(e));function rt(e,n,r){let i=``,a=[],o=[],s=new Set,c=[],l=x();for(let u=0;u<e.length;u++){let d=r(e[u],u);if(s.has(d))throw Error(t.eachDuplicateKey(String(d),u));s.add(d),o.push(d);let f=tt(n(e[u],u),l);i+=f.html,a.push(...f.bindings),c.push(f)}return{bindings:a,html:i,keys:o,rendered:c}}function it(t,n){let{fallback:r,key:i,render:a}=n;return{__craftitDirective:!0,mount:(n,o)=>{let c=new Map,d=[],f=[],p=()=>{u(d),d=[],l(f),f=[]},m=()=>{for(let[,e]of c)u(e.nodes),l(e.cleanups);c.clear()};o((0,e.effect)(()=>{let o=n.parentNode;o&&(0,e.batch)(()=>{let h=t.value;if(!h.length){if(m(),p(),!r)return;let e=s(nt(r())),t=H(e.html);d=Array.from(t.childNodes),n.after(t);let i=e=>f.push(e);K(e.bindings,i,U(d),{onHtml:e=>J(o,e,i)});return}p();let{keys:g,rendered:_}=rt(h,a,i),v=new Map,y=[];for(let e=0;e<g.length;e++){let t=g[e],n=_[e],r=c.get(t),i,a=[];if(r&&r.html===n.html)i=r.nodes,l(r.cleanups);else{r&&(u(r.nodes),l(r.cleanups));let e=H(n.html);i=Array.from(e.childNodes)}y.push({item:n,key:t,nodes:i}),v.set(t,{cleanups:a,html:n.html,nodes:i})}for(let[e,t]of c)v.has(e)||(u(t.nodes),l(t.cleanups));let b=n;for(let t of y){for(let e of t.nodes)o.insertBefore(e,b.nextSibling),b=e;let n=v.get(t.key);if(!n)continue;let r=e=>n.cleanups.push(e);(0,e.untrack)(()=>{K(t.item.bindings,r,U(t.nodes),{onHtml:e=>J(o,e,r)})})}c=v})})),o(()=>{p(),m()})}}}var at=t=>(0,e.computed)(()=>Object.entries(t).filter(([,t])=>typeof t==`function`?t():(0,e.isSignal)(t)?t.value:t).map(([e])=>e).join(` `)),ot=t=>{let n=typeof t==`function`?t():(0,e.isSignal)(t)?t.value:t;return n==null||n===!1?``:String(n)},st=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),ct=t=>(0,e.computed)(()=>{let e=[];for(let[n,r]of Object.entries(t)){let t=ot(r);t&&e.push(`${st(n)}:${t}`)}return e.join(`;`)}),lt=t=>typeof t==`function`?t():(0,e.isSignal)(t)?t.value:t;function ut(t,n,r){return(0,e.computed)(()=>lt(t)?n():r?r():``)}var dt=t=>typeof t==`function`?t():(0,e.isSignal)(t)?t.value:t,ft=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!Object.is(e[n],t[n]))return!1;return!0};function pt(t,n){let r=!1,i=[],a=``;return(0,e.computed)(()=>{let o=(Array.isArray(t)?t:[t]).map(e=>dt(e));return(!r||!ft(i,o))&&(a=(0,e.untrack)(n),i=o,r=!0),a})}function mt(n,r){let i=(0,e.signal)({data:void 0,error:void 0,pending:!0}),a;if(!k((0,e.effect)(()=>{let e=n(),t=new AbortController;return i.value={data:a,error:void 0,pending:!0},r(e,t.signal).then(e=>{t.signal.aborted||(a=e,i.value={data:e,error:void 0,pending:!1})}).catch(e=>{t.signal.aborted||(i.value={data:a,error:e,pending:!1})}),()=>t.abort()})))throw Error(t.lifecycleOutsideSetup);return i}function ht(t){return(0,e.isSignal)(t)?(0,e.computed)(()=>a(t.value)):a(t)}Object.defineProperty(exports,`batch`,{enumerable:!0,get:function(){return e.batch}}),exports.classMap=at,Object.defineProperty(exports,`computed`,{enumerable:!0,get:function(){return e.computed}}),exports.createContext=le,exports.createId=b,exports.css=ne,exports.define=We,exports.defineField=Ge,exports.each=it,exports.effect=M,exports.guard=pt,exports.html=et,exports.inject=P,exports.injectStrict=ce,Object.defineProperty(exports,`isSignal`,{enumerable:!0,get:function(){return e.isSignal}}),exports.listen=ae,exports.live=Oe,exports.on=ie,exports.onCleanup=A,exports.onElement=oe,exports.onMounted=j,exports.prop=ye,exports.provide=se,exports.raw=ht,exports.ref=n,exports.refs=r,exports.resource=mt,Object.defineProperty(exports,`scope`,{enumerable:!0,get:function(){return e.scope}}),Object.defineProperty(exports,`signal`,{enumerable:!0,get:function(){return e.signal}}),exports.styleMap=ct,exports.syncAria=fe,Object.defineProperty(exports,`untrack`,{enumerable:!0,get:function(){return e.untrack}}),Object.defineProperty(exports,`watch`,{enumerable:!0,get:function(){return e.watch}}),exports.when=ut;
2
2
  //# sourceMappingURL=craftit.cjs.map