sigmx 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/README.md +54 -43
  2. package/dist/cli.js +3 -1
  3. package/dist/cli.js.map +2 -2
  4. package/dist/kernel/compile.d.ts +8 -9
  5. package/dist/kernel/compile.js +102 -67
  6. package/dist/kernel/compile.js.map +2 -2
  7. package/dist/kernel/contracts.d.ts +12 -13
  8. package/dist/kernel/index.d.ts +11 -12
  9. package/dist/kernel/index.js +14 -12
  10. package/dist/kernel/index.js.map +3 -3
  11. package/dist/kernel/precompile.d.ts +8 -12
  12. package/dist/kernel/precompile.js +33 -76
  13. package/dist/kernel/precompile.js.map +2 -2
  14. package/dist/kernel/precompiled.d.ts +7 -4
  15. package/dist/kernel/precompiled.js +5 -5
  16. package/dist/kernel/precompiled.js.map +2 -2
  17. package/dist/kernel/reactive.d.ts +13 -11
  18. package/dist/kernel/reactive.js +96 -71
  19. package/dist/kernel/reactive.js.map +3 -3
  20. package/dist/kernel/runtime.js +85 -63
  21. package/dist/kernel/runtime.js.map +3 -3
  22. package/dist/kernel/scan.d.ts +2 -11
  23. package/dist/kernel/scan.js +26 -9
  24. package/dist/kernel/scan.js.map +2 -2
  25. package/dist/kernel/state.d.ts +5 -8
  26. package/dist/kernel/state.js +114 -76
  27. package/dist/kernel/state.js.map +2 -2
  28. package/dist/kernel/strict-csp.d.ts +0 -5
  29. package/dist/kernel/strict-csp.js +2 -2
  30. package/dist/kernel/strict-csp.js.map +2 -2
  31. package/dist/lib/casing.d.ts +4 -1
  32. package/dist/lib/casing.js +8 -1
  33. package/dist/lib/casing.js.map +2 -2
  34. package/dist/lib/objects.d.ts +5 -4
  35. package/dist/lib/objects.js +13 -5
  36. package/dist/lib/objects.js.map +2 -2
  37. package/dist/lib/schedule.d.ts +3 -5
  38. package/dist/lib/schedule.js +12 -10
  39. package/dist/lib/schedule.js.map +2 -2
  40. package/dist/lib/sse.d.ts +10 -1
  41. package/dist/lib/sse.js +32 -28
  42. package/dist/lib/sse.js.map +2 -2
  43. package/dist/plugins/def.d.ts +5 -0
  44. package/dist/plugins/def.js +22 -0
  45. package/dist/plugins/def.js.map +7 -0
  46. package/dist/plugins/directives/attribute-sync.js +8 -12
  47. package/dist/plugins/directives/attribute-sync.js.map +2 -2
  48. package/dist/plugins/directives/boost.d.ts +1 -1
  49. package/dist/plugins/directives/boost.js +34 -30
  50. package/dist/plugins/directives/boost.js.map +2 -2
  51. package/dist/plugins/directives/busy-flag.js +13 -16
  52. package/dist/plugins/directives/busy-flag.js.map +2 -2
  53. package/dist/plugins/directives/class-toggle.js +17 -16
  54. package/dist/plugins/directives/class-toggle.js.map +2 -2
  55. package/dist/plugins/directives/cloak.js +2 -7
  56. package/dist/plugins/directives/cloak.js.map +2 -2
  57. package/dist/plugins/directives/collapse.js +36 -37
  58. package/dist/plugins/directives/collapse.js.map +2 -2
  59. package/dist/plugins/directives/declare.js +5 -8
  60. package/dist/plugins/directives/declare.js.map +2 -2
  61. package/dist/plugins/directives/derive.js +9 -15
  62. package/dist/plugins/directives/derive.js.map +2 -2
  63. package/dist/plugins/directives/element-ref.js +8 -8
  64. package/dist/plugins/directives/element-ref.js.map +2 -2
  65. package/dist/plugins/directives/event-listener.js +18 -23
  66. package/dist/plugins/directives/event-listener.js.map +2 -2
  67. package/dist/plugins/directives/frame-loop.js +9 -14
  68. package/dist/plugins/directives/frame-loop.js.map +2 -2
  69. package/dist/plugins/directives/html.js +6 -7
  70. package/dist/plugins/directives/html.js.map +2 -2
  71. package/dist/plugins/directives/inline-style.js +17 -20
  72. package/dist/plugins/directives/inline-style.js.map +2 -2
  73. package/dist/plugins/directives/mask.js +19 -23
  74. package/dist/plugins/directives/mask.js.map +2 -2
  75. package/dist/plugins/directives/media-query.d.ts +4 -1
  76. package/dist/plugins/directives/media-query.js +13 -12
  77. package/dist/plugins/directives/media-query.js.map +2 -2
  78. package/dist/plugins/directives/on-mount.js +4 -9
  79. package/dist/plugins/directives/on-mount.js.map +2 -2
  80. package/dist/plugins/directives/patch-listener.js +24 -19
  81. package/dist/plugins/directives/patch-listener.js.map +2 -2
  82. package/dist/plugins/directives/remove-me.js +7 -8
  83. package/dist/plugins/directives/remove-me.js.map +2 -2
  84. package/dist/plugins/directives/scroll-to.d.ts +4 -1
  85. package/dist/plugins/directives/scroll-to.js +8 -14
  86. package/dist/plugins/directives/scroll-to.js.map +2 -2
  87. package/dist/plugins/directives/size-watch.js +7 -12
  88. package/dist/plugins/directives/size-watch.js.map +2 -2
  89. package/dist/plugins/directives/state-dump.js +6 -10
  90. package/dist/plugins/directives/state-dump.js.map +2 -2
  91. package/dist/plugins/directives/storage-sync.js +13 -9
  92. package/dist/plugins/directives/storage-sync.js.map +2 -2
  93. package/dist/plugins/directives/teleport.js +8 -14
  94. package/dist/plugins/directives/teleport.js.map +2 -2
  95. package/dist/plugins/directives/text-content.js +6 -7
  96. package/dist/plugins/directives/text-content.js.map +2 -2
  97. package/dist/plugins/directives/timer.js +7 -13
  98. package/dist/plugins/directives/timer.js.map +2 -2
  99. package/dist/plugins/directives/transition.d.ts +1 -2
  100. package/dist/plugins/directives/transition.js +32 -34
  101. package/dist/plugins/directives/transition.js.map +2 -2
  102. package/dist/plugins/directives/tween.d.ts +2 -2
  103. package/dist/plugins/directives/tween.js +34 -50
  104. package/dist/plugins/directives/tween.js.map +2 -2
  105. package/dist/plugins/directives/two-way-bind.d.ts +1 -1
  106. package/dist/plugins/directives/two-way-bind.js +70 -67
  107. package/dist/plugins/directives/two-way-bind.js.map +2 -2
  108. package/dist/plugins/directives/url-params.js +36 -59
  109. package/dist/plugins/directives/url-params.js.map +3 -3
  110. package/dist/plugins/directives/url-replace.js +6 -7
  111. package/dist/plugins/directives/url-replace.js.map +2 -2
  112. package/dist/plugins/directives/validity.js +6 -9
  113. package/dist/plugins/directives/validity.js.map +2 -2
  114. package/dist/plugins/directives/viewport.js +18 -23
  115. package/dist/plugins/directives/viewport.js.map +2 -2
  116. package/dist/plugins/directives/visibility.js +9 -14
  117. package/dist/plugins/directives/visibility.js.map +2 -2
  118. package/dist/plugins/directives/watch.d.ts +0 -1
  119. package/dist/plugins/directives/watch.js +2 -8
  120. package/dist/plugins/directives/watch.js.map +2 -2
  121. package/dist/plugins/functions/bulk-set.js +10 -7
  122. package/dist/plugins/functions/bulk-set.js.map +2 -2
  123. package/dist/plugins/functions/bulk-toggle.js +10 -7
  124. package/dist/plugins/functions/bulk-toggle.js.map +2 -2
  125. package/dist/plugins/functions/confirm.js +2 -2
  126. package/dist/plugins/functions/confirm.js.map +2 -2
  127. package/dist/plugins/functions/copy-text.js +5 -5
  128. package/dist/plugins/functions/copy-text.js.map +2 -2
  129. package/dist/plugins/functions/dispatch.js +5 -5
  130. package/dist/plugins/functions/dispatch.js.map +2 -2
  131. package/dist/plugins/functions/locale-format.d.ts +4 -1
  132. package/dist/plugins/functions/locale-format.js +9 -16
  133. package/dist/plugins/functions/locale-format.js.map +2 -2
  134. package/dist/plugins/functions/range-map.js +6 -6
  135. package/dist/plugins/functions/range-map.js.map +2 -2
  136. package/dist/plugins/functions/request.d.ts +7 -3
  137. package/dist/plugins/functions/request.js +85 -80
  138. package/dist/plugins/functions/request.js.map +2 -2
  139. package/dist/plugins/functions/untracked-read.js +3 -2
  140. package/dist/plugins/functions/untracked-read.js.map +2 -2
  141. package/dist/plugins/functions/websocket.d.ts +3 -3
  142. package/dist/plugins/functions/websocket.js +18 -25
  143. package/dist/plugins/functions/websocket.js.map +2 -2
  144. package/dist/plugins/index.d.ts +34 -36
  145. package/dist/plugins/index.js +31 -35
  146. package/dist/plugins/index.js.map +2 -2
  147. package/dist/plugins/server-events/apply-elements.d.ts +1 -1
  148. package/dist/plugins/server-events/apply-elements.js +41 -40
  149. package/dist/plugins/server-events/apply-elements.js.map +2 -2
  150. package/dist/plugins/server-events/apply-state.js +9 -12
  151. package/dist/plugins/server-events/apply-state.js.map +2 -2
  152. package/dist/plugins/server-events/morph.d.ts +0 -2
  153. package/dist/plugins/server-events/morph.js +58 -55
  154. package/dist/plugins/server-events/morph.js.map +3 -3
  155. package/dist/presets/all.d.ts +0 -1
  156. package/dist/presets/all.js +22 -26
  157. package/dist/presets/all.js.map +2 -2
  158. package/dist/presets/essentials.d.ts +0 -1
  159. package/dist/presets/essentials.js +27 -9
  160. package/dist/presets/essentials.js.map +2 -2
  161. package/dist/presets/minimal.d.ts +0 -1
  162. package/dist/presets/minimal.js +2 -2
  163. package/dist/presets/minimal.js.map +2 -2
  164. package/dist/server.d.ts +108 -0
  165. package/dist/server.js +218 -0
  166. package/dist/server.js.map +7 -0
  167. package/dist/sigmx.standalone.js +1 -1
  168. package/dist/standalone.js.map +2 -2
  169. package/dist/vite.d.ts +2 -2
  170. package/dist/vite.js +48 -15
  171. package/dist/vite.js.map +2 -2
  172. package/package.json +21 -2
  173. package/dist/auto.d.ts +0 -1
  174. package/dist/auto.js +0 -7
  175. package/dist/auto.js.map +0 -7
  176. package/dist/core/csp.d.ts +0 -7
  177. package/dist/core/csp.js +0 -20
  178. package/dist/core/csp.js.map +0 -7
  179. package/dist/core/engine.d.ts +0 -10
  180. package/dist/core/engine.js +0 -200
  181. package/dist/core/engine.js.map +0 -7
  182. package/dist/core/expr.d.ts +0 -12
  183. package/dist/core/expr.js +0 -94
  184. package/dist/core/expr.js.map +0 -7
  185. package/dist/core/index.d.ts +0 -16
  186. package/dist/core/index.js +0 -46
  187. package/dist/core/index.js.map +0 -7
  188. package/dist/core/signals.d.ts +0 -42
  189. package/dist/core/signals.js +0 -195
  190. package/dist/core/signals.js.map +0 -7
  191. package/dist/core/store.d.ts +0 -32
  192. package/dist/core/store.js +0 -185
  193. package/dist/core/store.js.map +0 -7
  194. package/dist/core/types.d.ts +0 -101
  195. package/dist/core/types.js +0 -1
  196. package/dist/core/types.js.map +0 -7
  197. package/dist/plugins/actions/clipboard.d.ts +0 -2
  198. package/dist/plugins/actions/clipboard.js +0 -11
  199. package/dist/plugins/actions/clipboard.js.map +0 -7
  200. package/dist/plugins/actions/fit.d.ts +0 -2
  201. package/dist/plugins/actions/fit.js +0 -14
  202. package/dist/plugins/actions/fit.js.map +0 -7
  203. package/dist/plugins/actions/intl.d.ts +0 -2
  204. package/dist/plugins/actions/intl.js +0 -21
  205. package/dist/plugins/actions/intl.js.map +0 -7
  206. package/dist/plugins/actions/peek.d.ts +0 -2
  207. package/dist/plugins/actions/peek.js +0 -6
  208. package/dist/plugins/actions/peek.js.map +0 -7
  209. package/dist/plugins/actions/setAll.d.ts +0 -2
  210. package/dist/plugins/actions/setAll.js +0 -11
  211. package/dist/plugins/actions/setAll.js.map +0 -7
  212. package/dist/plugins/actions/toggleAll.d.ts +0 -2
  213. package/dist/plugins/actions/toggleAll.js +0 -11
  214. package/dist/plugins/actions/toggleAll.js.map +0 -7
  215. package/dist/plugins/attributes/attr.d.ts +0 -2
  216. package/dist/plugins/attributes/attr.js +0 -20
  217. package/dist/plugins/attributes/attr.js.map +0 -7
  218. package/dist/plugins/attributes/bind.d.ts +0 -6
  219. package/dist/plugins/attributes/bind.js +0 -81
  220. package/dist/plugins/attributes/bind.js.map +0 -7
  221. package/dist/plugins/attributes/class.d.ts +0 -2
  222. package/dist/plugins/attributes/class.js +0 -22
  223. package/dist/plugins/attributes/class.js.map +0 -7
  224. package/dist/plugins/attributes/computed.d.ts +0 -2
  225. package/dist/plugins/attributes/computed.js +0 -20
  226. package/dist/plugins/attributes/computed.js.map +0 -7
  227. package/dist/plugins/attributes/customValidity.d.ts +0 -2
  228. package/dist/plugins/attributes/customValidity.js +0 -14
  229. package/dist/plugins/attributes/customValidity.js.map +0 -7
  230. package/dist/plugins/attributes/effect.d.ts +0 -2
  231. package/dist/plugins/attributes/effect.js +0 -12
  232. package/dist/plugins/attributes/effect.js.map +0 -7
  233. package/dist/plugins/attributes/indicator.d.ts +0 -2
  234. package/dist/plugins/attributes/indicator.js +0 -20
  235. package/dist/plugins/attributes/indicator.js.map +0 -7
  236. package/dist/plugins/attributes/init.d.ts +0 -2
  237. package/dist/plugins/attributes/init.js +0 -14
  238. package/dist/plugins/attributes/init.js.map +0 -7
  239. package/dist/plugins/attributes/jsonSignals.d.ts +0 -2
  240. package/dist/plugins/attributes/jsonSignals.js +0 -15
  241. package/dist/plugins/attributes/jsonSignals.js.map +0 -7
  242. package/dist/plugins/attributes/matchMedia.d.ts +0 -2
  243. package/dist/plugins/attributes/matchMedia.js +0 -19
  244. package/dist/plugins/attributes/matchMedia.js.map +0 -7
  245. package/dist/plugins/attributes/on.d.ts +0 -5
  246. package/dist/plugins/attributes/on.js +0 -28
  247. package/dist/plugins/attributes/on.js.map +0 -7
  248. package/dist/plugins/attributes/onIntersect.d.ts +0 -2
  249. package/dist/plugins/attributes/onIntersect.js +0 -28
  250. package/dist/plugins/attributes/onIntersect.js.map +0 -7
  251. package/dist/plugins/attributes/onInterval.d.ts +0 -2
  252. package/dist/plugins/attributes/onInterval.js +0 -18
  253. package/dist/plugins/attributes/onInterval.js.map +0 -7
  254. package/dist/plugins/attributes/onRaf.d.ts +0 -1
  255. package/dist/plugins/attributes/onRaf.js +0 -19
  256. package/dist/plugins/attributes/onRaf.js.map +0 -7
  257. package/dist/plugins/attributes/onResize.d.ts +0 -1
  258. package/dist/plugins/attributes/onResize.js +0 -17
  259. package/dist/plugins/attributes/onResize.js.map +0 -7
  260. package/dist/plugins/attributes/onSignalPatch.d.ts +0 -5
  261. package/dist/plugins/attributes/onSignalPatch.js +0 -35
  262. package/dist/plugins/attributes/onSignalPatch.js.map +0 -7
  263. package/dist/plugins/attributes/persist.d.ts +0 -6
  264. package/dist/plugins/attributes/persist.js +0 -16
  265. package/dist/plugins/attributes/persist.js.map +0 -7
  266. package/dist/plugins/attributes/queryString.d.ts +0 -5
  267. package/dist/plugins/attributes/queryString.js +0 -54
  268. package/dist/plugins/attributes/queryString.js.map +0 -7
  269. package/dist/plugins/attributes/ref.d.ts +0 -2
  270. package/dist/plugins/attributes/ref.js +0 -13
  271. package/dist/plugins/attributes/ref.js.map +0 -7
  272. package/dist/plugins/attributes/replaceUrl.d.ts +0 -1
  273. package/dist/plugins/attributes/replaceUrl.js +0 -11
  274. package/dist/plugins/attributes/replaceUrl.js.map +0 -7
  275. package/dist/plugins/attributes/scrollIntoView.d.ts +0 -2
  276. package/dist/plugins/attributes/scrollIntoView.js +0 -19
  277. package/dist/plugins/attributes/scrollIntoView.js.map +0 -7
  278. package/dist/plugins/attributes/show.d.ts +0 -2
  279. package/dist/plugins/attributes/show.js +0 -19
  280. package/dist/plugins/attributes/show.js.map +0 -7
  281. package/dist/plugins/attributes/signals.d.ts +0 -2
  282. package/dist/plugins/attributes/signals.js +0 -13
  283. package/dist/plugins/attributes/signals.js.map +0 -7
  284. package/dist/plugins/attributes/style.d.ts +0 -2
  285. package/dist/plugins/attributes/style.js +0 -25
  286. package/dist/plugins/attributes/style.js.map +0 -7
  287. package/dist/plugins/attributes/text.d.ts +0 -1
  288. package/dist/plugins/attributes/text.js +0 -13
  289. package/dist/plugins/attributes/text.js.map +0 -7
  290. package/dist/plugins/attributes/viewTransition.d.ts +0 -1
  291. package/dist/plugins/attributes/viewTransition.js +0 -11
  292. package/dist/plugins/attributes/viewTransition.js.map +0 -7
  293. package/dist/plugins/directives/transition-name.d.ts +0 -1
  294. package/dist/plugins/directives/transition-name.js +0 -11
  295. package/dist/plugins/directives/transition-name.js.map +0 -7
  296. package/dist/plugins/directives/trap.d.ts +0 -5
  297. package/dist/plugins/directives/trap.js +0 -48
  298. package/dist/plugins/directives/trap.js.map +0 -7
  299. package/dist/sigmx.auto.js +0 -5
  300. package/dist/utils/object.d.ts +0 -9
  301. package/dist/utils/object.js +0 -26
  302. package/dist/utils/object.js.map +0 -7
  303. package/dist/utils/text.d.ts +0 -7
  304. package/dist/utils/text.js +0 -15
  305. package/dist/utils/text.js.map +0 -7
  306. package/dist/utils/timing.d.ts +0 -14
  307. package/dist/utils/timing.js +0 -58
  308. package/dist/utils/timing.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/directives/text-content.ts"],
4
- "sourcesContent": ["import { attribute } from '../../kernel/index.js'\n\nexport const text = attribute({\n name: 'text',\n key: 'forbidden',\n value: 'required',\n mount: ({ el, evaluate, effect }) =>\n effect(() => {\n el.textContent = String(evaluate() ?? '')\n }),\n})\n"],
5
- "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,OAAO,UAAU;AAAA,EAC5B,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO,CAAC,EAAE,IAAI,UAAU,OAAO,MAC7B,OAAO,MAAM;AACX,OAAG,cAAc,OAAO,SAAS,KAAK,EAAE;AAAA,EAC1C,CAAC;AACL,CAAC;",
4
+ "sourcesContent": ["import { dir } from '../def.js';\n\nexport const text = dir('text', 6, ({ el, evaluate, effect }) =>\n effect(() => {\n el.textContent = String(evaluate() ?? '');\n }),\n);\n"],
5
+ "mappings": "AAAA,SAAS,WAAW;AAEb,MAAM,OAAO;AAAA,EAAI;AAAA,EAAQ;AAAA,EAAG,CAAC,EAAE,IAAI,UAAU,OAAO,MACzD,OAAO,MAAM;AACX,OAAG,cAAc,OAAO,SAAS,KAAK,EAAE;AAAA,EAC1C,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,16 +1,10 @@
1
- import { attribute, toMs, withViewTransition } from "../../kernel/index.js";
2
- const onInterval = attribute({
3
- name: "on-interval",
4
- key: "forbidden",
5
- value: "required",
6
- returns: false,
7
- mount({ mods, evaluate }) {
8
- const d = mods.get("duration");
9
- const run = withViewTransition(() => evaluate(), mods);
10
- if (d?.includes("leading")) run();
11
- const id = setInterval(run, toMs(d, 1e3));
12
- return () => clearInterval(id);
13
- }
1
+ import { toMs } from "../../kernel/index.js";
2
+ import { dir } from "../def.js";
3
+ const onInterval = dir("on-interval", 22, ({ mods, evaluate }) => {
4
+ const d = mods.get("duration");
5
+ const run = () => evaluate();
6
+ const id = setInterval(run, toMs(d, 1e3));
7
+ return () => clearInterval(id);
14
8
  });
15
9
  export {
16
10
  onInterval
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/directives/timer.ts"],
4
- "sourcesContent": ["import { attribute, toMs, withViewTransition } from '../../kernel/index.js'\n\n/** `on-interval__duration.5s.leading=\"expr\"`. Default one second. */\nexport const onInterval = attribute({\n name: 'on-interval',\n key: 'forbidden',\n value: 'required',\n returns: false,\n mount({ mods, evaluate }) {\n const d = mods.get('duration')\n const run = withViewTransition(() => evaluate(), mods)\n if (d?.includes('leading')) run()\n const id = setInterval(run, toMs(d, 1000))\n return () => clearInterval(id)\n },\n})\n"],
5
- "mappings": "AAAA,SAAS,WAAW,MAAM,0BAA0B;AAG7C,MAAM,aAAa,UAAU;AAAA,EAClC,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM,EAAE,MAAM,SAAS,GAAG;AACxB,UAAM,IAAI,KAAK,IAAI,UAAU;AAC7B,UAAM,MAAM,mBAAmB,MAAM,SAAS,GAAG,IAAI;AACrD,QAAI,GAAG,SAAS,SAAS,EAAG,KAAI;AAChC,UAAM,KAAK,YAAY,KAAK,KAAK,GAAG,GAAI,CAAC;AACzC,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B;AACF,CAAC;",
4
+ "sourcesContent": ["import { toMs } from '../../kernel/index.js';\nimport { dir } from '../def.js';\n\n/** `on-interval__duration.5s.leading=\"expr\"`. Default one second. */\nexport const onInterval = dir('on-interval', 22, ({ mods, evaluate }) => {\n const d = mods.get('duration');\n const run = () => evaluate();\n const id = setInterval(run, toMs(d, 1000));\n return () => clearInterval(id);\n});\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,WAAW;AAGb,MAAM,aAAa,IAAI,eAAe,IAAI,CAAC,EAAE,MAAM,SAAS,MAAM;AACvE,QAAM,IAAI,KAAK,IAAI,UAAU;AAC7B,QAAM,MAAM,MAAM,SAAS;AAC3B,QAAM,KAAK,YAAY,KAAK,KAAK,GAAG,GAAI,CAAC;AACzC,SAAO,MAAM,cAAc,EAAE;AAC/B,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,4 @@
1
1
  /**
2
- * Shows and hides with a fade (and optional scale): `transition="$open"`.
3
- * Modifiers: `__duration.200ms`, `__scale` (from 95%) or `__scale.90`, `__origin.top`.
2
+ * Shows and hides with a fade: `transition="$open"`. Modifier: `__duration.200ms`.
4
3
  */
5
4
  export declare const transition: import("../../kernel/contracts.js").AttributePlugin;
@@ -1,38 +1,36 @@
1
- import { attribute, toMs } from "../../kernel/index.js";
2
- const transition = attribute({
3
- name: "transition",
4
- key: "forbidden",
5
- value: "required",
6
- mount({ el, mods, evaluate, effect }) {
7
- const style = el.style;
8
- const duration = matchMedia("(prefers-reduced-motion: reduce)").matches ? 0 : toMs(mods.get("duration"), 200);
9
- const scale = mods.has("scale") ? +(mods.get("scale")?.[0] ?? 95) / 100 : 1;
10
- const origin = mods.get("origin")?.join(" ");
11
- if (origin) style.transformOrigin = origin;
12
- const hidden = { opacity: 0, transform: `scale(${scale})` };
13
- const shown = { opacity: 1, transform: "scale(1)" };
14
- const initial = style.display === "none" ? "" : style.display;
15
- let anim;
16
- let first = true;
17
- let last;
18
- effect(() => {
19
- const open = !!evaluate();
20
- if (open === last) return;
21
- last = open;
1
+ import { toMs } from "../../kernel/index.js";
2
+ import { dir } from "../def.js";
3
+ const transition = dir("transition", 6, ({ el, mods, evaluate, effect, cleanup }) => {
4
+ const style = el.style;
5
+ const duration = matchMedia("(prefers-reduced-motion: reduce)").matches ? 0 : toMs(mods.get("duration"), 200);
6
+ const hidden = { opacity: 0 };
7
+ const shown = { opacity: 1 };
8
+ const own = style.display;
9
+ const initial = own === "none" ? "" : own;
10
+ let anim;
11
+ let first = true;
12
+ let last;
13
+ effect(() => {
14
+ const open = !!evaluate();
15
+ if (open === last) return;
16
+ last = open;
17
+ anim?.cancel();
18
+ if (first || !el.animate) {
19
+ first = false;
20
+ style.display = open ? initial : "none";
21
+ return;
22
+ }
23
+ if (open) style.display = initial;
24
+ anim = el.animate(open ? [hidden, shown] : [shown, hidden], { duration, easing: "ease-out", fill: "forwards" });
25
+ anim.onfinish = () => {
22
26
  anim?.cancel();
23
- if (first) {
24
- first = false;
25
- style.display = open ? initial : "none";
26
- return;
27
- }
28
- if (open) style.display = initial;
29
- anim = el.animate(open ? [hidden, shown] : [shown, hidden], { duration, easing: "ease-out", fill: "forwards" });
30
- anim.onfinish = () => {
31
- anim?.cancel();
32
- if (!open) style.display = "none";
33
- };
34
- });
35
- }
27
+ if (!open) style.display = "none";
28
+ };
29
+ });
30
+ cleanup(() => {
31
+ anim?.cancel();
32
+ style.display = own;
33
+ });
36
34
  });
37
35
  export {
38
36
  transition
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/directives/transition.ts"],
4
- "sourcesContent": ["import { attribute, toMs } from '../../kernel/index.js'\n\n/**\n * Shows and hides with a fade (and optional scale): `transition=\"$open\"`.\n * Modifiers: `__duration.200ms`, `__scale` (from 95%) or `__scale.90`, `__origin.top`.\n */\nexport const transition = attribute({\n name: 'transition',\n key: 'forbidden',\n value: 'required',\n mount({ el, mods, evaluate, effect }) {\n const style = (el as HTMLElement).style\n const duration = matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : toMs(mods.get('duration'), 200)\n const scale = mods.has('scale') ? +(mods.get('scale')?.[0] ?? 95) / 100 : 1\n const origin = mods.get('origin')?.join(' ')\n if (origin) style.transformOrigin = origin\n const hidden = { opacity: 0, transform: `scale(${scale})` }\n const shown = { opacity: 1, transform: 'scale(1)' }\n const initial = style.display === 'none' ? '' : style.display\n let anim: Animation | undefined\n let first = true\n let last: boolean | undefined\n effect(() => {\n const open = !!evaluate()\n if (open === last) return // a dependency changed but the outcome did not: leave the element alone\n last = open\n anim?.cancel()\n if (first) {\n first = false\n style.display = open ? initial : 'none'\n return\n }\n if (open) style.display = initial\n anim = el.animate(open ? [hidden, shown] : [shown, hidden], { duration, easing: 'ease-out', fill: 'forwards' })\n anim.onfinish = () => {\n anim?.cancel()\n if (!open) style.display = 'none'\n }\n })\n },\n})\n"],
5
- "mappings": "AAAA,SAAS,WAAW,YAAY;AAMzB,MAAM,aAAa,UAAU;AAAA,EAClC,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM,EAAE,IAAI,MAAM,UAAU,OAAO,GAAG;AACpC,UAAM,QAAS,GAAmB;AAClC,UAAM,WAAW,WAAW,kCAAkC,EAAE,UAAU,IAAI,KAAK,KAAK,IAAI,UAAU,GAAG,GAAG;AAC5G,UAAM,QAAQ,KAAK,IAAI,OAAO,IAAI,EAAE,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,MAAM,MAAM;AAC1E,UAAM,SAAS,KAAK,IAAI,QAAQ,GAAG,KAAK,GAAG;AAC3C,QAAI,OAAQ,OAAM,kBAAkB;AACpC,UAAM,SAAS,EAAE,SAAS,GAAG,WAAW,SAAS,KAAK,IAAI;AAC1D,UAAM,QAAQ,EAAE,SAAS,GAAG,WAAW,WAAW;AAClD,UAAM,UAAU,MAAM,YAAY,SAAS,KAAK,MAAM;AACtD,QAAI;AACJ,QAAI,QAAQ;AACZ,QAAI;AACJ,WAAO,MAAM;AACX,YAAM,OAAO,CAAC,CAAC,SAAS;AACxB,UAAI,SAAS,KAAM;AACnB,aAAO;AACP,YAAM,OAAO;AACb,UAAI,OAAO;AACT,gBAAQ;AACR,cAAM,UAAU,OAAO,UAAU;AACjC;AAAA,MACF;AACA,UAAI,KAAM,OAAM,UAAU;AAC1B,aAAO,GAAG,QAAQ,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,MAAM,GAAG,EAAE,UAAU,QAAQ,YAAY,MAAM,WAAW,CAAC;AAC9G,WAAK,WAAW,MAAM;AACpB,cAAM,OAAO;AACb,YAAI,CAAC,KAAM,OAAM,UAAU;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;",
4
+ "sourcesContent": ["import { toMs } from '../../kernel/index.js';\nimport { dir } from '../def.js';\n\n/**\n * Shows and hides with a fade: `transition=\"$open\"`. Modifier: `__duration.200ms`.\n */\nexport const transition = dir('transition', 6, ({ el, mods, evaluate, effect, cleanup }) => {\n const style = (el as HTMLElement).style;\n const duration = matchMedia('(prefers-reduced-motion: reduce)').matches ? 0 : toMs(mods.get('duration'), 200);\n const hidden = { opacity: 0 };\n const shown = { opacity: 1 };\n const own = style.display;\n const initial = own === 'none' ? '' : own;\n let anim: Animation | undefined;\n let first = true;\n let last: boolean | undefined;\n effect(() => {\n const open = !!evaluate();\n if (open === last) return; // a dependency changed but the outcome did not: leave the element alone\n last = open;\n anim?.cancel();\n if (first || !el.animate) {\n first = false;\n style.display = open ? initial : 'none';\n return;\n }\n if (open) style.display = initial;\n anim = el.animate(open ? [hidden, shown] : [shown, hidden], { duration, easing: 'ease-out', fill: 'forwards' });\n anim.onfinish = () => {\n anim?.cancel();\n if (!open) style.display = 'none';\n };\n });\n cleanup(() => {\n anim?.cancel();\n style.display = own; // the element's own inline display comes back when the directive goes\n });\n});\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,WAAW;AAKb,MAAM,aAAa,IAAI,cAAc,GAAG,CAAC,EAAE,IAAI,MAAM,UAAU,QAAQ,QAAQ,MAAM;AAC1F,QAAM,QAAS,GAAmB;AAClC,QAAM,WAAW,WAAW,kCAAkC,EAAE,UAAU,IAAI,KAAK,KAAK,IAAI,UAAU,GAAG,GAAG;AAC5G,QAAM,SAAS,EAAE,SAAS,EAAE;AAC5B,QAAM,QAAQ,EAAE,SAAS,EAAE;AAC3B,QAAM,MAAM,MAAM;AAClB,QAAM,UAAU,QAAQ,SAAS,KAAK;AACtC,MAAI;AACJ,MAAI,QAAQ;AACZ,MAAI;AACJ,SAAO,MAAM;AACX,UAAM,OAAO,CAAC,CAAC,SAAS;AACxB,QAAI,SAAS,KAAM;AACnB,WAAO;AACP,UAAM,OAAO;AACb,QAAI,SAAS,CAAC,GAAG,SAAS;AACxB,cAAQ;AACR,YAAM,UAAU,OAAO,UAAU;AACjC;AAAA,IACF;AACA,QAAI,KAAM,OAAM,UAAU;AAC1B,WAAO,GAAG,QAAQ,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,MAAM,GAAG,EAAE,UAAU,QAAQ,YAAY,MAAM,WAAW,CAAC;AAC9G,SAAK,WAAW,MAAM;AACpB,YAAM,OAAO;AACb,UAAI,CAAC,KAAM,OAAM,UAAU;AAAA,IAC7B;AAAA,EACF,CAAC;AACD,UAAQ,MAAM;AACZ,UAAM,OAAO;AACb,UAAM,UAAU;AAAA,EAClB,CAAC;AACH,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
- * `animate:opacity="$open ? 1 : 0"` tweens a numeric CSS property (or attribute, for SVG) from its
2
+ * `animate:opacity="$open ? 1 : 0"` tweens a numeric CSS property from its
3
3
  * current value to the expression's value whenever the expression changes.
4
- * Modifiers: `__duration.300ms`, `__easing.ease-in-out`. Non-numeric values apply immediately.
4
+ * `__duration.300ms` sets the length; the tween eases out. Non-numeric values apply immediately.
5
5
  */
6
6
  export declare const animate: import("../../kernel/contracts.js").AttributePlugin;
@@ -1,56 +1,40 @@
1
- import { attribute, toMs } from "../../kernel/index.js";
2
- const easings = {
3
- linear: (t) => t,
4
- "ease-in": (t) => t * t,
5
- "ease-out": (t) => 1 - (1 - t) * (1 - t),
6
- "ease-in-out": (t) => t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2
7
- };
1
+ import { toMs } from "../../kernel/index.js";
2
+ import { dir } from "../def.js";
8
3
  const num = (s) => {
9
4
  const m = /^\s*(-?\d*\.?\d+)([a-z%]*)\s*$/i.exec(s);
10
- return m ? { n: +m[1], unit: m[2] } : void 0;
5
+ return m ? [+m[1], m[2]] : void 0;
11
6
  };
12
- const animate = attribute({
13
- name: "animate",
14
- key: "required",
15
- value: "required",
16
- mount({ el, mods, cased, evaluate, effect, cleanup }) {
17
- const prop = cased("kebab");
18
- const css = CSS.supports(prop, "inherit");
19
- const duration = toMs(mods.get("duration"), 300);
20
- const ease = easings[mods.get("easing")?.[0] ?? "ease-out"] ?? easings["ease-out"];
21
- const instant = matchMedia("(prefers-reduced-motion: reduce)").matches;
22
- const read = () => css ? el.style.getPropertyValue(prop) || getComputedStyle(el).getPropertyValue(prop) : el.getAttribute(prop) ?? "";
23
- const write = (v) => css ? el.style.setProperty(prop, v) : el.setAttribute(prop, v);
24
- let frame = 0;
25
- let first = true;
26
- let last;
27
- effect(() => {
28
- const to = String(evaluate());
29
- if (to === last) return;
30
- last = to;
31
- cancelAnimationFrame(frame);
32
- let from = num(read());
33
- const target = num(to);
34
- if (from && target && from.unit === "px" && target.unit === "%" && (prop === "width" || prop === "height") && el.parentElement) {
35
- const size = prop === "width" ? el.parentElement.clientWidth : el.parentElement.clientHeight;
36
- if (size) from = { n: from.n / size * 100, unit: "%" };
37
- }
38
- if (first || instant || !from || !target || from.unit !== target.unit) {
39
- first = false;
40
- return write(to);
41
- }
42
- const a = from.n;
43
- const b = target.n;
44
- const start = performance.now();
45
- const tick = (now) => {
46
- const p = Math.min(1, (now - start) / duration);
47
- write(`${a + (b - a) * ease(p)}${target.unit}`);
48
- if (p < 1) frame = requestAnimationFrame(tick);
49
- };
50
- frame = requestAnimationFrame(tick);
51
- });
52
- cleanup(() => cancelAnimationFrame(frame));
53
- }
7
+ const animate = dir("animate", 5, ({ el, mods, cased, evaluate, effect, cleanup }) => {
8
+ const prop = cased("kebab");
9
+ const duration = toMs(mods.get("duration"), 300);
10
+ const instant = matchMedia("(prefers-reduced-motion: reduce)").matches;
11
+ const read = () => el.style.getPropertyValue(prop) || getComputedStyle(el).getPropertyValue(prop);
12
+ const write = (v) => el.style.setProperty(prop, v);
13
+ let frame = 0;
14
+ let first = true;
15
+ let last;
16
+ effect(() => {
17
+ const to = String(evaluate());
18
+ if (to === last) return;
19
+ last = to;
20
+ cancelAnimationFrame(frame);
21
+ const from = num(read());
22
+ const target = num(to);
23
+ if (first || instant || duration <= 0 || !from || !target || from[1] !== target[1]) {
24
+ first = false;
25
+ return write(to);
26
+ }
27
+ const [a, unit] = from;
28
+ const b = target[0];
29
+ const start = performance.now();
30
+ const tick = (now) => {
31
+ const p = Math.min(1, (now - start) / duration);
32
+ write(`${a + (b - a) * (1 - (1 - p) ** 2)}${unit}`);
33
+ if (p < 1) frame = requestAnimationFrame(tick);
34
+ };
35
+ frame = requestAnimationFrame(tick);
36
+ });
37
+ cleanup(() => cancelAnimationFrame(frame));
54
38
  });
55
39
  export {
56
40
  animate
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/directives/tween.ts"],
4
- "sourcesContent": ["import { attribute, toMs } from '../../kernel/index.js'\n\nconst easings: Record<string, (t: number) => number> = {\n linear: (t) => t,\n 'ease-in': (t) => t * t,\n 'ease-out': (t) => 1 - (1 - t) * (1 - t),\n 'ease-in-out': (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n}\nconst num = (s: string): { n: number; unit: string } | undefined => {\n const m = /^\\s*(-?\\d*\\.?\\d+)([a-z%]*)\\s*$/i.exec(s)\n return m ? { n: +m[1], unit: m[2] } : undefined\n}\n\n/**\n * `animate:opacity=\"$open ? 1 : 0\"` tweens a numeric CSS property (or attribute, for SVG) from its\n * current value to the expression's value whenever the expression changes.\n * Modifiers: `__duration.300ms`, `__easing.ease-in-out`. Non-numeric values apply immediately.\n */\nexport const animate = attribute({\n name: 'animate',\n key: 'required',\n value: 'required',\n mount({ el, mods, cased, evaluate, effect, cleanup }) {\n const prop = cased('kebab')\n const css = CSS.supports(prop, 'inherit')\n const duration = toMs(mods.get('duration'), 300)\n const ease = easings[mods.get('easing')?.[0] ?? 'ease-out'] ?? easings['ease-out']\n const instant = matchMedia('(prefers-reduced-motion: reduce)').matches\n // Prefer the inline value (which this directive wrote last time); computed styles report px only.\n const read = () => (css ? el.style.getPropertyValue(prop) || getComputedStyle(el).getPropertyValue(prop) : (el.getAttribute(prop) ?? ''))\n const write = (v: string) => (css ? el.style.setProperty(prop, v) : el.setAttribute(prop, v))\n let frame = 0\n let first = true\n let last: string | undefined\n effect(() => {\n const to = String(evaluate())\n if (to === last) return\n last = to\n cancelAnimationFrame(frame)\n let from = num(read())\n const target = num(to)\n // A px start and a % target are common for width/height: convert against the parent box.\n if (from && target && from.unit === 'px' && target.unit === '%' && (prop === 'width' || prop === 'height') && el.parentElement) {\n const size = prop === 'width' ? el.parentElement.clientWidth : el.parentElement.clientHeight\n if (size) from = { n: (from.n / size) * 100, unit: '%' }\n }\n if (first || instant || !from || !target || from.unit !== target.unit) {\n first = false\n return write(to)\n }\n const a = from.n\n const b = target.n\n const start = performance.now()\n const tick = (now: number) => {\n const p = Math.min(1, (now - start) / duration)\n write(`${a + (b - a) * ease(p)}${target.unit}`)\n if (p < 1) frame = requestAnimationFrame(tick)\n }\n frame = requestAnimationFrame(tick)\n })\n cleanup(() => cancelAnimationFrame(frame))\n },\n})\n"],
5
- "mappings": "AAAA,SAAS,WAAW,YAAY;AAEhC,MAAM,UAAiD;AAAA,EACrD,QAAQ,CAAC,MAAM;AAAA,EACf,WAAW,CAAC,MAAM,IAAI;AAAA,EACtB,YAAY,CAAC,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,EACtC,eAAe,CAAC,MAAO,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI;AACvE;AACA,MAAM,MAAM,CAAC,MAAuD;AAClE,QAAM,IAAI,kCAAkC,KAAK,CAAC;AAClD,SAAO,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI;AACxC;AAOO,MAAM,UAAU,UAAU;AAAA,EAC/B,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM,EAAE,IAAI,MAAM,OAAO,UAAU,QAAQ,QAAQ,GAAG;AACpD,UAAM,OAAO,MAAM,OAAO;AAC1B,UAAM,MAAM,IAAI,SAAS,MAAM,SAAS;AACxC,UAAM,WAAW,KAAK,KAAK,IAAI,UAAU,GAAG,GAAG;AAC/C,UAAM,OAAO,QAAQ,KAAK,IAAI,QAAQ,IAAI,CAAC,KAAK,UAAU,KAAK,QAAQ,UAAU;AACjF,UAAM,UAAU,WAAW,kCAAkC,EAAE;AAE/D,UAAM,OAAO,MAAO,MAAM,GAAG,MAAM,iBAAiB,IAAI,KAAK,iBAAiB,EAAE,EAAE,iBAAiB,IAAI,IAAK,GAAG,aAAa,IAAI,KAAK;AACrI,UAAM,QAAQ,CAAC,MAAe,MAAM,GAAG,MAAM,YAAY,MAAM,CAAC,IAAI,GAAG,aAAa,MAAM,CAAC;AAC3F,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,QAAI;AACJ,WAAO,MAAM;AACX,YAAM,KAAK,OAAO,SAAS,CAAC;AAC5B,UAAI,OAAO,KAAM;AACjB,aAAO;AACP,2BAAqB,KAAK;AAC1B,UAAI,OAAO,IAAI,KAAK,CAAC;AACrB,YAAM,SAAS,IAAI,EAAE;AAErB,UAAI,QAAQ,UAAU,KAAK,SAAS,QAAQ,OAAO,SAAS,QAAQ,SAAS,WAAW,SAAS,aAAa,GAAG,eAAe;AAC9H,cAAM,OAAO,SAAS,UAAU,GAAG,cAAc,cAAc,GAAG,cAAc;AAChF,YAAI,KAAM,QAAO,EAAE,GAAI,KAAK,IAAI,OAAQ,KAAK,MAAM,IAAI;AAAA,MACzD;AACA,UAAI,SAAS,WAAW,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,OAAO,MAAM;AACrE,gBAAQ;AACR,eAAO,MAAM,EAAE;AAAA,MACjB;AACA,YAAM,IAAI,KAAK;AACf,YAAM,IAAI,OAAO;AACjB,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,OAAO,CAAC,QAAgB;AAC5B,cAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,QAAQ;AAC9C,cAAM,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,EAAE;AAC9C,YAAI,IAAI,EAAG,SAAQ,sBAAsB,IAAI;AAAA,MAC/C;AACA,cAAQ,sBAAsB,IAAI;AAAA,IACpC,CAAC;AACD,YAAQ,MAAM,qBAAqB,KAAK,CAAC;AAAA,EAC3C;AACF,CAAC;",
4
+ "sourcesContent": ["import { toMs } from '../../kernel/index.js';\nimport { dir } from '../def.js';\n\n/** '12.5px' \u2192 [12.5, 'px']; undefined when not numeric. */\nconst num = (s: string): [number, string] | undefined => {\n const m = /^\\s*(-?\\d*\\.?\\d+)([a-z%]*)\\s*$/i.exec(s);\n return m ? [+m[1], m[2]] : undefined;\n};\n\n/**\n * `animate:opacity=\"$open ? 1 : 0\"` tweens a numeric CSS property from its\n * current value to the expression's value whenever the expression changes.\n * `__duration.300ms` sets the length; the tween eases out. Non-numeric values apply immediately.\n */\nexport const animate = dir('animate', 5, ({ el, mods, cased, evaluate, effect, cleanup }) => {\n const prop = cased('kebab');\n const duration = toMs(mods.get('duration'), 300);\n const instant = matchMedia('(prefers-reduced-motion: reduce)').matches;\n // Prefer the inline value (which this directive wrote last time); computed styles report px only.\n const read = () => el.style.getPropertyValue(prop) || getComputedStyle(el).getPropertyValue(prop);\n const write = (v: string) => el.style.setProperty(prop, v);\n let frame = 0;\n let first = true;\n let last: string | undefined;\n effect(() => {\n const to = String(evaluate());\n if (to === last) return;\n last = to;\n cancelAnimationFrame(frame);\n const from = num(read());\n const target = num(to);\n if (first || instant || duration <= 0 || !from || !target || from[1] !== target[1]) {\n first = false;\n return write(to);\n }\n const [a, unit] = from;\n const b = target[0];\n const start = performance.now();\n const tick = (now: number) => {\n const p = Math.min(1, (now - start) / duration);\n write(`${a + (b - a) * (1 - (1 - p) ** 2)}${unit}`);\n if (p < 1) frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n });\n cleanup(() => cancelAnimationFrame(frame));\n});\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,WAAW;AAGpB,MAAM,MAAM,CAAC,MAA4C;AACvD,QAAM,IAAI,kCAAkC,KAAK,CAAC;AAClD,SAAO,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI;AAC7B;AAOO,MAAM,UAAU,IAAI,WAAW,GAAG,CAAC,EAAE,IAAI,MAAM,OAAO,UAAU,QAAQ,QAAQ,MAAM;AAC3F,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,WAAW,KAAK,KAAK,IAAI,UAAU,GAAG,GAAG;AAC/C,QAAM,UAAU,WAAW,kCAAkC,EAAE;AAE/D,QAAM,OAAO,MAAM,GAAG,MAAM,iBAAiB,IAAI,KAAK,iBAAiB,EAAE,EAAE,iBAAiB,IAAI;AAChG,QAAM,QAAQ,CAAC,MAAc,GAAG,MAAM,YAAY,MAAM,CAAC;AACzD,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,MAAI;AACJ,SAAO,MAAM;AACX,UAAM,KAAK,OAAO,SAAS,CAAC;AAC5B,QAAI,OAAO,KAAM;AACjB,WAAO;AACP,yBAAqB,KAAK;AAC1B,UAAM,OAAO,IAAI,KAAK,CAAC;AACvB,UAAM,SAAS,IAAI,EAAE;AACrB,QAAI,SAAS,WAAW,YAAY,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,MAAM,OAAO,CAAC,GAAG;AAClF,cAAQ;AACR,aAAO,MAAM,EAAE;AAAA,IACjB;AACA,UAAM,CAAC,GAAG,IAAI,IAAI;AAClB,UAAM,IAAI,OAAO,CAAC;AAClB,UAAM,QAAQ,YAAY,IAAI;AAC9B,UAAM,OAAO,CAAC,QAAgB;AAC5B,YAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,QAAQ;AAC9C,YAAM,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE;AAClD,UAAI,IAAI,EAAG,SAAQ,sBAAsB,IAAI;AAAA,IAC/C;AACA,YAAQ,sBAAsB,IAAI;AAAA,EACpC,CAAC;AACD,UAAQ,MAAM,qBAAqB,KAAK,CAAC;AAC3C,CAAC;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Two-way binding: `bind:name` or `bind="name"`. Creates the signal from the element when missing.
3
3
  * Checkbox groups bind to arrays, radios to the checked value, `select multiple` to arrays.
4
- * `__prop.value` binds a custom element property; `__event.change` picks the events to listen for.
4
+ * `__event.change` picks the events to listen for.
5
5
  */
6
6
  export declare const bind: import("../../kernel/contracts.js").AttributePlugin;
@@ -1,5 +1,5 @@
1
- import { attribute } from "../../kernel/index.js";
2
- const adapter = (_read, _write, ..._events) => ({ a: _read, b: _write, c: _events });
1
+ import { dir } from "../def.js";
2
+ const str = (v) => String(v ?? "");
3
3
  const readFiles = (input) => Promise.all(
4
4
  [...input.files ?? []].map(
5
5
  (f) => new Promise((resolve) => {
@@ -9,72 +9,75 @@ const readFiles = (input) => Promise.all(
9
9
  })
10
10
  )
11
11
  );
12
- const bind = attribute({
13
- name: "bind",
14
- mount({ el, key, value, cased, mods, store, listen, effect }) {
15
- const path = key ? cased() : value.trim();
16
- const current = () => store.get(path);
17
- const asNumber = (s) => typeof current() === "number" ? +s : s;
18
- let a;
19
- const prop = mods.get("prop")?.[0];
20
- if (prop) {
21
- a = adapter(() => el[prop], (v) => el[prop] = v, "input", "change");
22
- } else if (el instanceof HTMLInputElement) {
23
- const t = el.type;
24
- if (t === "checkbox") {
25
- const own = el.hasAttribute("value") && el.value !== "on";
26
- a = {
27
- a: () => {
28
- const cur = current();
29
- if (Array.isArray(cur)) {
30
- const set = new Set(cur);
31
- el.checked ? set.add(el.value) : set.delete(el.value);
32
- return [...set];
33
- }
34
- return own ? el.checked ? el.value : "" : el.checked;
35
- },
36
- b: (v) => {
37
- el.checked = Array.isArray(v) ? v.includes(el.value) : own ? v === el.value : !!v;
38
- },
39
- c: ["input"]
40
- };
41
- } else if (t === "radio") {
42
- if (!el.name) el.name = path;
43
- a = adapter(() => el.checked ? asNumber(el.value) : current(), (v) => el.checked = String(v) === el.value, "input");
44
- } else if (t === "file") {
45
- listen(el, "change", () => readFiles(el).then((files) => store.set(path, files)));
46
- return;
47
- } else if (t === "number" || t === "range") {
48
- a = adapter(() => el.value === "" ? "" : +el.value, (v) => el.value = String(v ?? ""), "input");
49
- } else {
50
- a = adapter(() => el.value, (v) => el.value = String(v ?? ""), "input");
51
- }
52
- } else if (el instanceof HTMLSelectElement) {
53
- a = {
54
- a: () => el.multiple ? [...el.selectedOptions].map((o) => asNumber(o.value)) : asNumber(el.value),
55
- b: (v) => {
56
- if (el.multiple) for (const o of el.options) o.selected = Array.isArray(v) && v.map(String).includes(o.value);
57
- else el.value = String(v ?? "");
58
- },
59
- c: ["change"]
60
- };
61
- } else if (el instanceof HTMLTextAreaElement || "value" in el) {
62
- a = adapter(() => el.value, (v) => el.value = String(v ?? ""), "input", "change");
63
- } else {
64
- a = adapter(() => el.getAttribute("value"), (v) => el.setAttribute("value", String(v ?? "")), "change");
65
- }
66
- if (!store.has(path)) {
67
- const initial = a.a();
68
- if (initial !== void 0 && initial !== "") store.set(path, initial);
69
- }
70
- const sync = () => store.set(path, a.a());
71
- for (const type of mods.get("event") ?? a.c) listen(el, type, sync);
72
- listen(el, "sigmx-prop-change", sync);
73
- effect(() => {
74
- const v = current();
75
- if (v !== void 0) a.b(v);
76
- });
12
+ const bind = dir("bind", 0, ({ el, key, value, cased, mods, store, listen, effect }) => {
13
+ const path = key ? cased() : value.trim();
14
+ const current = () => store.get(path);
15
+ const asNumber = (s) => typeof current() === "number" ? +s : s;
16
+ const input = el;
17
+ const type = el instanceof HTMLInputElement ? input.type : "";
18
+ const valued = (_read, ..._events) => ({
19
+ a: _read,
20
+ b: (v) => {
21
+ if (str(v) !== input.value && !input.validity?.badInput) input.value = str(v);
22
+ },
23
+ c: _events
24
+ });
25
+ let a;
26
+ if (type === "checkbox") {
27
+ const own = el.hasAttribute("value") && input.value !== "on";
28
+ a = {
29
+ a: () => {
30
+ const cur = current();
31
+ if (Array.isArray(cur)) {
32
+ const set = new Set(cur);
33
+ input.checked ? set.add(input.value) : set.delete(input.value);
34
+ return [...set];
35
+ }
36
+ return own ? input.checked ? input.value : "" : input.checked;
37
+ },
38
+ b: (v) => {
39
+ input.checked = Array.isArray(v) ? v.includes(input.value) : own ? v === input.value : !!v;
40
+ },
41
+ c: ["input"]
42
+ };
43
+ } else if (type === "radio") {
44
+ input.name ||= path;
45
+ a = {
46
+ a: () => input.checked ? asNumber(input.value) : current(),
47
+ b: (v) => input.checked = String(v) === input.value,
48
+ c: ["input"]
49
+ };
50
+ } else if (type === "file") {
51
+ listen(el, "change", () => readFiles(input).then((files) => store.set(path, files)));
52
+ return;
53
+ } else if (type) {
54
+ const numeric = type === "number" || type === "range";
55
+ a = valued(() => numeric && input.value !== "" ? +input.value : input.value, "input");
56
+ } else if (el instanceof HTMLSelectElement) {
57
+ a = {
58
+ a: () => el.multiple ? [...el.selectedOptions].map((o) => asNumber(o.value)) : asNumber(el.value),
59
+ b: (v) => {
60
+ if (el.multiple) for (const o of el.options) o.selected = Array.isArray(v) && v.map(String).includes(o.value);
61
+ else el.value = str(v);
62
+ },
63
+ c: ["change"]
64
+ };
65
+ } else if ("value" in el) {
66
+ a = valued(() => input.value, "input", "change");
67
+ } else {
68
+ a = {
69
+ a: () => el.getAttribute("value"),
70
+ b: (v) => el.setAttribute("value", str(v)),
71
+ c: ["change"]
72
+ };
77
73
  }
74
+ if (!store.has(path)) {
75
+ const initial = a.a();
76
+ if (initial !== void 0 && initial !== "") store.set(path, initial);
77
+ }
78
+ const sync = () => store.set(path, a.a());
79
+ for (const t of [...mods.get("event") ?? a.c, "sigmx-prop-change"]) listen(el, t, sync);
80
+ effect(() => a.b(current()));
78
81
  });
79
82
  export {
80
83
  bind
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/directives/two-way-bind.ts"],
4
- "sourcesContent": ["import { attribute } from '../../kernel/index.js'\n\ntype Adapter = { _read(): unknown; _write(v: unknown): void; _events: string[] }\nconst adapter = (_read: () => unknown, _write: (v: any) => void, ..._events: string[]): Adapter => ({ _read, _write, _events })\n\nconst readFiles = (input: HTMLInputElement) =>\n Promise.all(\n [...(input.files ?? [])].map(\n (f) =>\n new Promise<{ name: string; type: string; size: number; contents: string }>((resolve) => {\n const r = new FileReader()\n r.onloadend = () =>\n resolve({ name: f.name, type: f.type, size: f.size, contents: String(r.result).split(',')[1] ?? '' })\n r.readAsDataURL(f)\n }),\n ),\n )\n\n/**\n * Two-way binding: `bind:name` or `bind=\"name\"`. Creates the signal from the element when missing.\n * Checkbox groups bind to arrays, radios to the checked value, `select multiple` to arrays.\n * `__prop.value` binds a custom element property; `__event.change` picks the events to listen for.\n */\nexport const bind = attribute({\n name: 'bind',\n mount({ el, key, value, cased, mods, store, listen, effect }) {\n const path = key ? cased() : value.trim()\n const current = () => store.get(path)\n const asNumber = (s: string) => (typeof current() === 'number' ? +s : s)\n let a: Adapter\n const prop = mods.get('prop')?.[0]\n\n if (prop) {\n a = adapter(() => (el as any)[prop], (v) => ((el as any)[prop] = v), 'input', 'change')\n } else if (el instanceof HTMLInputElement) {\n const t = el.type\n if (t === 'checkbox') {\n const own = el.hasAttribute('value') && el.value !== 'on'\n a = {\n _read: () => {\n const cur = current()\n if (Array.isArray(cur)) {\n const set = new Set(cur)\n el.checked ? set.add(el.value) : set.delete(el.value)\n return [...set]\n }\n return own ? (el.checked ? el.value : '') : el.checked\n },\n _write: (v) => {\n el.checked = Array.isArray(v) ? v.includes(el.value) : own ? v === el.value : !!v\n },\n _events: ['input'],\n }\n } else if (t === 'radio') {\n if (!el.name) el.name = path\n a = adapter(() => (el.checked ? asNumber(el.value) : current()), (v) => (el.checked = String(v) === el.value), 'input')\n } else if (t === 'file') {\n listen(el, 'change', () => readFiles(el).then((files) => store.set(path, files)))\n return\n } else if (t === 'number' || t === 'range') {\n a = adapter(() => (el.value === '' ? '' : +el.value), (v) => (el.value = String(v ?? '')), 'input')\n } else {\n a = adapter(() => el.value, (v) => (el.value = String(v ?? '')), 'input')\n }\n } else if (el instanceof HTMLSelectElement) {\n a = {\n _read: () => (el.multiple ? [...el.selectedOptions].map((o) => asNumber(o.value)) : asNumber(el.value)),\n _write: (v) => {\n if (el.multiple) for (const o of el.options) o.selected = Array.isArray(v) && v.map(String).includes(o.value)\n else el.value = String(v ?? '')\n },\n _events: ['change'],\n }\n } else if (el instanceof HTMLTextAreaElement || 'value' in el) {\n a = adapter(() => (el as any).value, (v) => ((el as any).value = String(v ?? '')), 'input', 'change')\n } else {\n a = adapter(() => el.getAttribute('value'), (v) => el.setAttribute('value', String(v ?? '')), 'change')\n }\n\n if (!store.has(path)) {\n const initial = a._read()\n if (initial !== undefined && initial !== '') store.set(path, initial)\n }\n const sync = () => store.set(path, a._read())\n for (const type of mods.get('event') ?? a._events) listen(el, type, sync)\n listen(el, 'sigmx-prop-change', sync)\n effect(() => {\n const v = current()\n if (v !== undefined) a._write(v)\n })\n },\n})\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { dir } from '../def.js';\n\ntype Adapter = { _read(): unknown; _write(v: unknown): void; _events: string[] };\n\nconst str = (v: unknown) => String(v ?? '');\n\nconst readFiles = (input: HTMLInputElement) =>\n Promise.all(\n [...(input.files ?? [])].map(\n (f) =>\n new Promise<{ name: string; type: string; size: number; contents: string }>((resolve) => {\n const r = new FileReader();\n r.onloadend = () =>\n resolve({ name: f.name, type: f.type, size: f.size, contents: String(r.result).split(',')[1] ?? '' });\n r.readAsDataURL(f);\n }),\n ),\n );\n\n/**\n * Two-way binding: `bind:name` or `bind=\"name\"`. Creates the signal from the element when missing.\n * Checkbox groups bind to arrays, radios to the checked value, `select multiple` to arrays.\n * `__event.change` picks the events to listen for.\n */\nexport const bind = dir('bind', 0, ({ el, key, value, cased, mods, store, listen, effect }) => {\n const path = key ? cased() : value.trim();\n const current = () => store.get(path);\n const asNumber = (s: string) => (typeof current() === 'number' ? +s : s);\n const input = el as HTMLInputElement;\n const type = el instanceof HTMLInputElement ? input.type : '';\n /** Adapter writing `el.value`. */\n const valued = (_read: () => unknown, ..._events: string[]): Adapter => ({\n _read,\n _write: (v) => {\n // A number field mid-entry ('-', '1e') reads as '' with badInput; do not wipe what the user is typing.\n if (str(v) !== input.value && !input.validity?.badInput) input.value = str(v);\n },\n _events,\n });\n let a: Adapter;\n\n if (type === 'checkbox') {\n const own = el.hasAttribute('value') && input.value !== 'on';\n a = {\n _read: () => {\n const cur = current();\n if (Array.isArray(cur)) {\n const set = new Set(cur);\n input.checked ? set.add(input.value) : set.delete(input.value);\n return [...set];\n }\n return own ? (input.checked ? input.value : '') : input.checked;\n },\n _write: (v) => {\n input.checked = Array.isArray(v) ? v.includes(input.value) : own ? v === input.value : !!v;\n },\n _events: ['input'],\n };\n } else if (type === 'radio') {\n input.name ||= path;\n a = {\n _read: () => (input.checked ? asNumber(input.value) : current()),\n _write: (v) => (input.checked = String(v) === input.value),\n _events: ['input'],\n };\n } else if (type === 'file') {\n listen(el, 'change', () => readFiles(input).then((files) => store.set(path, files)));\n return;\n } else if (type) {\n const numeric = type === 'number' || type === 'range';\n a = valued(() => (numeric && input.value !== '' ? +input.value : input.value), 'input');\n } else if (el instanceof HTMLSelectElement) {\n a = {\n _read: () => (el.multiple ? [...el.selectedOptions].map((o) => asNumber(o.value)) : asNumber(el.value)),\n _write: (v) => {\n if (el.multiple) for (const o of el.options) o.selected = Array.isArray(v) && v.map(String).includes(o.value);\n else el.value = str(v);\n },\n _events: ['change'],\n };\n } else if ('value' in el) {\n a = valued(() => input.value, 'input', 'change');\n } else {\n a = {\n _read: () => el.getAttribute('value'),\n _write: (v) => el.setAttribute('value', str(v)),\n _events: ['change'],\n };\n }\n\n if (!store.has(path)) {\n const initial = a._read();\n if (initial !== undefined && initial !== '') store.set(path, initial);\n }\n const sync = () => store.set(path, a._read());\n for (const t of [...(mods.get('event') ?? a._events), 'sigmx-prop-change']) listen(el, t, sync);\n effect(() => a._write(current())); // undefined (removed signal) clears the field\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["_read", "_write", "_events"]
7
7
  }