@vielzeug/craftit 2.0.1 → 2.1.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.
- package/README.md +71 -53
- package/dist/component.cjs +2 -0
- package/dist/component.cjs.map +1 -0
- package/dist/component.d.ts +39 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +2 -0
- package/dist/component.js.map +1 -0
- package/dist/controls/a11y-control.cjs +2 -0
- package/dist/controls/a11y-control.cjs.map +1 -0
- package/dist/controls/a11y-control.d.ts +16 -0
- package/dist/controls/a11y-control.d.ts.map +1 -0
- package/dist/controls/a11y-control.js +2 -0
- package/dist/controls/a11y-control.js.map +1 -0
- package/dist/controls/checkable-control.cjs +2 -0
- package/dist/controls/checkable-control.cjs.map +1 -0
- package/dist/controls/checkable-control.d.ts +15 -0
- package/dist/controls/checkable-control.d.ts.map +1 -0
- package/dist/controls/checkable-control.js +2 -0
- package/dist/controls/checkable-control.js.map +1 -0
- package/dist/controls/field-control.cjs +2 -0
- package/dist/controls/field-control.cjs.map +1 -0
- package/dist/controls/field-control.d.ts +156 -0
- package/dist/controls/field-control.d.ts.map +1 -0
- package/dist/controls/field-control.js +2 -0
- package/dist/controls/field-control.js.map +1 -0
- package/dist/controls/index.d.ts +10 -0
- package/dist/controls/index.d.ts.map +1 -0
- package/dist/controls/internal/control-state.cjs +2 -0
- package/dist/controls/internal/control-state.cjs.map +1 -0
- package/dist/controls/internal/control-state.d.ts +19 -0
- package/dist/controls/internal/control-state.d.ts.map +1 -0
- package/dist/controls/internal/control-state.js +2 -0
- package/dist/controls/internal/control-state.js.map +1 -0
- package/dist/controls/internal/keyboard-utils.cjs +2 -0
- package/dist/controls/internal/keyboard-utils.cjs.map +1 -0
- package/dist/controls/internal/keyboard-utils.d.ts +7 -0
- package/dist/controls/internal/keyboard-utils.d.ts.map +1 -0
- package/dist/controls/internal/keyboard-utils.js +2 -0
- package/dist/controls/internal/keyboard-utils.js.map +1 -0
- package/dist/controls/internal/number-utils.cjs +2 -0
- package/dist/controls/internal/number-utils.cjs.map +1 -0
- package/dist/controls/internal/number-utils.d.ts +6 -0
- package/dist/controls/internal/number-utils.d.ts.map +1 -0
- package/dist/controls/internal/number-utils.js +2 -0
- package/dist/controls/internal/number-utils.js.map +1 -0
- package/dist/controls/internal/validation-utils.cjs +2 -0
- package/dist/controls/internal/validation-utils.cjs.map +1 -0
- package/dist/controls/internal/validation-utils.d.ts +13 -0
- package/dist/controls/internal/validation-utils.d.ts.map +1 -0
- package/dist/controls/internal/validation-utils.js +2 -0
- package/dist/controls/internal/validation-utils.js.map +1 -0
- package/dist/controls/list-control.cjs +2 -0
- package/dist/controls/list-control.cjs.map +1 -0
- package/dist/controls/list-control.d.ts +21 -0
- package/dist/controls/list-control.d.ts.map +1 -0
- package/dist/controls/list-control.js +2 -0
- package/dist/controls/list-control.js.map +1 -0
- package/dist/controls/list-key-control.cjs +2 -0
- package/dist/controls/list-key-control.cjs.map +1 -0
- package/dist/controls/list-key-control.d.ts +14 -0
- package/dist/controls/list-key-control.d.ts.map +1 -0
- package/dist/controls/list-key-control.js +2 -0
- package/dist/controls/list-key-control.js.map +1 -0
- package/dist/controls/overlay-control.cjs +2 -0
- package/dist/controls/overlay-control.cjs.map +1 -0
- package/dist/controls/overlay-control.d.ts +37 -0
- package/dist/controls/overlay-control.d.ts.map +1 -0
- package/dist/controls/overlay-control.js +2 -0
- package/dist/controls/overlay-control.js.map +1 -0
- package/dist/controls/press-control.cjs +2 -0
- package/dist/controls/press-control.cjs.map +1 -0
- package/dist/controls/press-control.d.ts +12 -0
- package/dist/controls/press-control.d.ts.map +1 -0
- package/dist/controls/press-control.js +2 -0
- package/dist/controls/press-control.js.map +1 -0
- package/dist/controls/slider-control.cjs +2 -0
- package/dist/controls/slider-control.cjs.map +1 -0
- package/dist/controls/slider-control.d.ts +19 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +2 -0
- package/dist/controls/slider-control.js.map +1 -0
- package/dist/controls/spinner-control.cjs +2 -0
- package/dist/controls/spinner-control.cjs.map +1 -0
- package/dist/controls/spinner-control.d.ts +18 -0
- package/dist/controls/spinner-control.d.ts.map +1 -0
- package/dist/controls/spinner-control.js +2 -0
- package/dist/controls/spinner-control.js.map +1 -0
- package/dist/controls.cjs +1 -0
- package/dist/controls.js +1 -0
- package/dist/craftit.cjs +1 -1
- package/dist/craftit.cjs.map +1 -1
- package/dist/craftit.js +1 -1
- package/dist/craftit.js.map +1 -1
- package/dist/directives/attr.cjs +1 -1
- package/dist/directives/attr.cjs.map +1 -1
- package/dist/directives/attr.d.ts +4 -6
- package/dist/directives/attr.d.ts.map +1 -1
- package/dist/directives/attr.js +1 -1
- package/dist/directives/attr.js.map +1 -1
- package/dist/directives/bind.cjs +1 -1
- package/dist/directives/bind.cjs.map +1 -1
- package/dist/directives/bind.d.ts +20 -12
- package/dist/directives/bind.d.ts.map +1 -1
- package/dist/directives/bind.js +1 -1
- package/dist/directives/bind.js.map +1 -1
- package/dist/directives/choose.cjs +1 -1
- package/dist/directives/choose.cjs.map +1 -1
- package/dist/directives/choose.d.ts +17 -12
- package/dist/directives/choose.d.ts.map +1 -1
- package/dist/directives/choose.js +1 -1
- package/dist/directives/choose.js.map +1 -1
- package/dist/directives/each.cjs +1 -1
- package/dist/directives/each.cjs.map +1 -1
- package/dist/directives/each.d.ts +19 -31
- package/dist/directives/each.d.ts.map +1 -1
- package/dist/directives/each.js +1 -1
- package/dist/directives/each.js.map +1 -1
- package/dist/directives/index.d.ts +1 -2
- package/dist/directives/index.d.ts.map +1 -1
- package/dist/directives/memo.cjs +1 -1
- package/dist/directives/memo.cjs.map +1 -1
- package/dist/directives/memo.d.ts +8 -4
- package/dist/directives/memo.d.ts.map +1 -1
- package/dist/directives/memo.js +1 -1
- package/dist/directives/memo.js.map +1 -1
- package/dist/directives/on.cjs +1 -1
- package/dist/directives/on.cjs.map +1 -1
- package/dist/directives/on.d.ts +1 -1
- package/dist/directives/on.d.ts.map +1 -1
- package/dist/directives/on.js +1 -1
- package/dist/directives/on.js.map +1 -1
- package/dist/directives/raw.cjs +1 -1
- package/dist/directives/raw.cjs.map +1 -1
- package/dist/directives/raw.d.ts +1 -1
- package/dist/directives/raw.d.ts.map +1 -1
- package/dist/directives/raw.js +1 -1
- package/dist/directives/raw.js.map +1 -1
- package/dist/directives/spread.cjs +1 -1
- package/dist/directives/spread.cjs.map +1 -1
- package/dist/directives/spread.d.ts +1 -1
- package/dist/directives/spread.d.ts.map +1 -1
- package/dist/directives/spread.js +1 -1
- package/dist/directives/spread.js.map +1 -1
- package/dist/directives/style.cjs +1 -1
- package/dist/directives/style.cjs.map +1 -1
- package/dist/directives/style.js +1 -1
- package/dist/directives/style.js.map +1 -1
- package/dist/directives/until.cjs.map +1 -1
- package/dist/directives/until.d.ts +1 -1
- package/dist/directives/until.d.ts.map +1 -1
- package/dist/directives/until.js.map +1 -1
- package/dist/directives/when.cjs +1 -1
- package/dist/directives/when.cjs.map +1 -1
- package/dist/directives/when.d.ts +11 -5
- package/dist/directives/when.d.ts.map +1 -1
- package/dist/directives/when.js +1 -1
- package/dist/directives/when.js.map +1 -1
- package/dist/directives.cjs +1 -0
- package/dist/directives.js +1 -0
- package/dist/form.cjs +2 -0
- package/dist/form.cjs.map +1 -0
- package/dist/form.d.ts +29 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.js +2 -0
- package/dist/form.js.map +1 -0
- package/dist/host.cjs +2 -0
- package/dist/host.cjs.map +1 -0
- package/dist/host.d.ts +75 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +2 -0
- package/dist/host.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +8 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.cjs +2 -0
- package/dist/internal.cjs.map +1 -0
- package/dist/internal.d.ts +171 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -0
- package/dist/observers/index.d.ts +4 -0
- package/dist/observers/index.d.ts.map +1 -0
- package/dist/observers/intersection-observe.cjs +2 -0
- package/dist/observers/intersection-observe.cjs.map +1 -0
- package/dist/observers/intersection-observe.d.ts +9 -0
- package/dist/observers/intersection-observe.d.ts.map +1 -0
- package/dist/observers/intersection-observe.js +2 -0
- package/dist/observers/intersection-observe.js.map +1 -0
- package/dist/observers/media-observe.cjs +2 -0
- package/dist/observers/media-observe.cjs.map +1 -0
- package/dist/observers/media-observe.d.ts +8 -0
- package/dist/observers/media-observe.d.ts.map +1 -0
- package/dist/observers/media-observe.js +2 -0
- package/dist/observers/media-observe.js.map +1 -0
- package/dist/observers/resize-observe.cjs +2 -0
- package/dist/observers/resize-observe.cjs.map +1 -0
- package/dist/observers/resize-observe.d.ts +11 -0
- package/dist/observers/resize-observe.d.ts.map +1 -0
- package/dist/observers/resize-observe.js +2 -0
- package/dist/observers/resize-observe.js.map +1 -0
- package/dist/observers.cjs +1 -0
- package/dist/observers.js +1 -0
- package/dist/props.cjs +2 -0
- package/dist/props.cjs.map +1 -0
- package/dist/props.d.ts +52 -0
- package/dist/props.d.ts.map +1 -0
- package/dist/props.js +2 -0
- package/dist/props.js.map +1 -0
- package/dist/registration.cjs +2 -0
- package/dist/registration.cjs.map +1 -0
- package/dist/registration.d.ts +18 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +2 -0
- package/dist/registration.js.map +1 -0
- package/dist/runtime-bindings.cjs +2 -0
- package/dist/runtime-bindings.cjs.map +1 -0
- package/dist/runtime-bindings.d.ts.map +1 -0
- package/dist/runtime-bindings.js +2 -0
- package/dist/runtime-bindings.js.map +1 -0
- package/dist/runtime-core.cjs +2 -0
- package/dist/runtime-core.cjs.map +1 -0
- package/dist/runtime-core.d.ts +21 -0
- package/dist/runtime-core.d.ts.map +1 -0
- package/dist/runtime-core.js +2 -0
- package/dist/runtime-core.js.map +1 -0
- package/dist/runtime-lifecycle.cjs +2 -0
- package/dist/runtime-lifecycle.cjs.map +1 -0
- package/dist/runtime-lifecycle.d.ts +24 -0
- package/dist/runtime-lifecycle.d.ts.map +1 -0
- package/dist/runtime-lifecycle.js +2 -0
- package/dist/runtime-lifecycle.js.map +1 -0
- package/dist/runtime.cjs +2 -0
- package/dist/runtime.cjs.map +1 -0
- package/dist/runtime.d.ts +21 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2 -0
- package/dist/runtime.js.map +1 -0
- package/dist/template-bindings.cjs +2 -0
- package/dist/template-bindings.cjs.map +1 -0
- package/dist/{core/template-bindings.d.ts → template-bindings.d.ts} +4 -1
- package/dist/template-bindings.d.ts.map +1 -0
- package/dist/template-bindings.js +2 -0
- package/dist/template-bindings.js.map +1 -0
- package/dist/template-compiler.cjs +2 -0
- package/dist/template-compiler.cjs.map +1 -0
- package/dist/{core/template-compiler.d.ts → template-compiler.d.ts} +1 -2
- package/dist/template-compiler.d.ts.map +1 -0
- package/dist/template-compiler.js +2 -0
- package/dist/template-compiler.js.map +1 -0
- package/dist/template-dom.cjs +2 -0
- package/dist/{core/template-dom.js.map → template-dom.cjs.map} +1 -1
- package/dist/template-dom.d.ts.map +1 -0
- package/dist/template-dom.js +2 -0
- package/dist/template-dom.js.map +1 -0
- package/dist/template-html.cjs +2 -0
- package/dist/template-html.cjs.map +1 -0
- package/dist/{core/template-html.d.ts → template-html.d.ts} +1 -4
- package/dist/template-html.d.ts.map +1 -0
- package/dist/template-html.js +2 -0
- package/dist/template-html.js.map +1 -0
- package/dist/template.cjs +2 -0
- package/dist/template.cjs.map +1 -0
- package/dist/{core/template.d.ts → template.d.ts} +2 -3
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +2 -0
- package/dist/template.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/testing.cjs +2 -0
- package/dist/testing/testing.cjs.map +1 -0
- package/dist/{test/test.d.ts → testing/testing.d.ts} +8 -8
- package/dist/testing/testing.d.ts.map +1 -0
- package/dist/testing/testing.js +2 -0
- package/dist/testing/testing.js.map +1 -0
- package/dist/testing.cjs +1 -0
- package/dist/testing.js +1 -0
- package/package.json +19 -14
- package/dist/core/component.cjs +0 -2
- package/dist/core/component.cjs.map +0 -1
- package/dist/core/component.d.ts +0 -172
- package/dist/core/component.d.ts.map +0 -1
- package/dist/core/component.js +0 -2
- package/dist/core/component.js.map +0 -1
- package/dist/core/host.cjs +0 -2
- package/dist/core/host.cjs.map +0 -1
- package/dist/core/host.d.ts +0 -77
- package/dist/core/host.d.ts.map +0 -1
- package/dist/core/host.js +0 -2
- package/dist/core/host.js.map +0 -1
- package/dist/core/internal.cjs +0 -2
- package/dist/core/internal.cjs.map +0 -1
- package/dist/core/internal.d.ts +0 -107
- package/dist/core/internal.d.ts.map +0 -1
- package/dist/core/internal.js +0 -2
- package/dist/core/internal.js.map +0 -1
- package/dist/core/runtime-bindings.cjs +0 -2
- package/dist/core/runtime-bindings.cjs.map +0 -1
- package/dist/core/runtime-bindings.d.ts.map +0 -1
- package/dist/core/runtime-bindings.js +0 -2
- package/dist/core/runtime-bindings.js.map +0 -1
- package/dist/core/runtime-lifecycle.cjs +0 -2
- package/dist/core/runtime-lifecycle.cjs.map +0 -1
- package/dist/core/runtime-lifecycle.d.ts +0 -116
- package/dist/core/runtime-lifecycle.d.ts.map +0 -1
- package/dist/core/runtime-lifecycle.js +0 -2
- package/dist/core/runtime-lifecycle.js.map +0 -1
- package/dist/core/runtime.cjs +0 -1
- package/dist/core/runtime.d.ts +0 -3
- package/dist/core/runtime.d.ts.map +0 -1
- package/dist/core/runtime.js +0 -1
- package/dist/core/template-bindings.cjs +0 -2
- package/dist/core/template-bindings.cjs.map +0 -1
- package/dist/core/template-bindings.d.ts.map +0 -1
- package/dist/core/template-bindings.js +0 -2
- package/dist/core/template-bindings.js.map +0 -1
- package/dist/core/template-compiler.cjs +0 -2
- package/dist/core/template-compiler.cjs.map +0 -1
- package/dist/core/template-compiler.d.ts.map +0 -1
- package/dist/core/template-compiler.js +0 -2
- package/dist/core/template-compiler.js.map +0 -1
- package/dist/core/template-dom.cjs +0 -2
- package/dist/core/template-dom.cjs.map +0 -1
- package/dist/core/template-dom.d.ts.map +0 -1
- package/dist/core/template-dom.js +0 -2
- package/dist/core/template-html.cjs +0 -2
- package/dist/core/template-html.cjs.map +0 -1
- package/dist/core/template-html.d.ts.map +0 -1
- package/dist/core/template-html.js +0 -2
- package/dist/core/template-html.js.map +0 -1
- package/dist/core/template.cjs +0 -2
- package/dist/core/template.cjs.map +0 -1
- package/dist/core/template.d.ts.map +0 -1
- package/dist/core/template.js +0 -2
- package/dist/core/template.js.map +0 -1
- package/dist/core/utilities.cjs +0 -2
- package/dist/core/utilities.cjs.map +0 -1
- package/dist/core/utilities.d.ts +0 -68
- package/dist/core/utilities.d.ts.map +0 -1
- package/dist/core/utilities.js +0 -2
- package/dist/core/utilities.js.map +0 -1
- package/dist/directives/index.cjs +0 -1
- package/dist/directives/index.js +0 -1
- package/dist/directives/match.cjs +0 -2
- package/dist/directives/match.cjs.map +0 -1
- package/dist/directives/match.d.ts +0 -31
- package/dist/directives/match.d.ts.map +0 -1
- package/dist/directives/match.js +0 -2
- package/dist/directives/match.js.map +0 -1
- package/dist/labs/a11y.cjs +0 -2
- package/dist/labs/a11y.cjs.map +0 -1
- package/dist/labs/a11y.d.ts +0 -61
- package/dist/labs/a11y.d.ts.map +0 -1
- package/dist/labs/a11y.js +0 -2
- package/dist/labs/a11y.js.map +0 -1
- package/dist/labs/index.d.ts +0 -8
- package/dist/labs/index.d.ts.map +0 -1
- package/dist/labs/list.cjs +0 -2
- package/dist/labs/list.cjs.map +0 -1
- package/dist/labs/list.d.ts +0 -26
- package/dist/labs/list.d.ts.map +0 -1
- package/dist/labs/list.js +0 -2
- package/dist/labs/list.js.map +0 -1
- package/dist/labs/observers.cjs +0 -2
- package/dist/labs/observers.cjs.map +0 -1
- package/dist/labs/observers.d.ts +0 -42
- package/dist/labs/observers.d.ts.map +0 -1
- package/dist/labs/observers.js +0 -2
- package/dist/labs/observers.js.map +0 -1
- package/dist/labs/overlay.cjs +0 -2
- package/dist/labs/overlay.cjs.map +0 -1
- package/dist/labs/overlay.d.ts +0 -35
- package/dist/labs/overlay.d.ts.map +0 -1
- package/dist/labs/overlay.js +0 -2
- package/dist/labs/overlay.js.map +0 -1
- package/dist/labs/selectable.cjs +0 -2
- package/dist/labs/selectable.cjs.map +0 -1
- package/dist/labs/selectable.d.ts +0 -70
- package/dist/labs/selectable.d.ts.map +0 -1
- package/dist/labs/selectable.js +0 -2
- package/dist/labs/selectable.js.map +0 -1
- package/dist/labs/selection.cjs +0 -2
- package/dist/labs/selection.cjs.map +0 -1
- package/dist/labs/selection.d.ts +0 -68
- package/dist/labs/selection.d.ts.map +0 -1
- package/dist/labs/selection.js +0 -2
- package/dist/labs/selection.js.map +0 -1
- package/dist/labs.cjs +0 -1
- package/dist/labs.js +0 -1
- package/dist/test/index.d.ts +0 -2
- package/dist/test/index.d.ts.map +0 -1
- package/dist/test/test.cjs +0 -2
- package/dist/test/test.cjs.map +0 -1
- package/dist/test/test.d.ts.map +0 -1
- package/dist/test/test.js +0 -2
- package/dist/test/test.js.map +0 -1
- package/dist/test.cjs +0 -1
- package/dist/test.js +0 -1
- /package/dist/{core/runtime-bindings.d.ts → runtime-bindings.d.ts} +0 -0
- /package/dist/{core/template-dom.d.ts → template-dom.d.ts} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onCleanup as e}from"../runtime-lifecycle.js";import{signal as t}from"@vielzeug/stateit";var n=n=>{let r=window.matchMedia(n),i=t(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e(()=>r.removeEventListener(`change`,a)),i};export{n as mediaObserver};
|
|
2
|
+
//# sourceMappingURL=media-observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-observe.js","names":[],"sources":["../../src/observers/media-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime-lifecycle';\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside an {@link onMount} callback.\n */\nexport const mediaObserver = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"+FASA,IAAa,EAAiB,GAA2C,CACvE,IAAM,EAAM,OAAO,WAAW,EAAM,CAC9B,EAAU,EAAO,EAAI,QAAQ,CAC7B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,SAMpB,OAHA,EAAI,iBAAiB,SAAU,EAAQ,CACvC,MAAgB,EAAI,oBAAoB,SAAU,EAAQ,CAAC,CAEpD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../runtime-lifecycle.cjs`);let t=require(`@vielzeug/stateit`);var n=n=>{let r=(0,t.signal)({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e.onCleanup(()=>i.disconnect()),r};exports.resizeObserver=n;
|
|
2
|
+
//# sourceMappingURL=resize-observe.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observe.cjs","names":[],"sources":["../../src/observers/resize-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime-lifecycle';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside an {@link onMount} callback.\n */\nexport const resizeObserver = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n"],"mappings":"+EASA,IAAa,EAAkB,GAAmE,CAChG,IAAM,GAAA,EAAA,EAAA,QAAc,CAAE,OAAQ,EAAG,MAAO,EAAG,CAAC,CACtC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,WAAY,GACtE,CAKF,OAHA,EAAG,QAAQ,EAAG,CACd,EAAA,cAAgB,EAAG,YAAY,CAAC,CAEzB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ReadonlySignal } from '@vielzeug/stateit';
|
|
2
|
+
/**
|
|
3
|
+
* Observes an element's content-box size via `ResizeObserver`.
|
|
4
|
+
* Returns a `ReadonlySignal` that updates whenever the dimensions change.
|
|
5
|
+
* Must be called inside an {@link onMount} callback.
|
|
6
|
+
*/
|
|
7
|
+
export declare const resizeObserver: (el: Element) => ReadonlySignal<{
|
|
8
|
+
height: number;
|
|
9
|
+
width: number;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=resize-observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observe.d.ts","sourceRoot":"","sources":["../../src/observers/resize-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,OAAO,KAAG,cAAc,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAc5F,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onCleanup as e}from"../runtime-lifecycle.js";import{signal as t}from"@vielzeug/stateit";var n=n=>{let r=t({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e(()=>i.disconnect()),r};export{n as resizeObserver};
|
|
2
|
+
//# sourceMappingURL=resize-observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observe.js","names":[],"sources":["../../src/observers/resize-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime-lifecycle';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside an {@link onMount} callback.\n */\nexport const resizeObserver = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n"],"mappings":"+FASA,IAAa,EAAkB,GAAmE,CAChG,IAAM,EAAO,EAAO,CAAE,OAAQ,EAAG,MAAO,EAAG,CAAC,CACtC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,WAAY,GACtE,CAKF,OAHA,EAAG,QAAQ,EAAG,CACd,MAAgB,EAAG,YAAY,CAAC,CAEzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./observers/intersection-observe.cjs`),t=require(`./observers/media-observe.cjs`),n=require(`./observers/resize-observe.cjs`);exports.intersectionObserver=e.intersectionObserver,exports.mediaObserver=t.mediaObserver,exports.resizeObserver=n.resizeObserver;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{intersectionObserver as e}from"./observers/intersection-observe.js";import{mediaObserver as t}from"./observers/media-observe.js";import{resizeObserver as n}from"./observers/resize-observe.js";export{e as intersectionObserver,t as mediaObserver,n as resizeObserver};
|
package/dist/props.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./runtime-core.cjs`),t=require(`./runtime-lifecycle.cjs`),n=require(`./internal.cjs`);let r=require(`@vielzeug/stateit`);var i=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),a=new Set,o=e=>typeof e!=`object`||!e||!(`default`in e)?!1:Object.keys(e).every(e=>i.has(e)),s=new WeakMap,c=(i,a,o)=>{let c=e.currentRuntime().el;s.has(c)||s.set(c,new Map);let l=o?.parse??(e=>o?.type===Boolean?e===``||e===`true`:typeof a==`boolean`?e!==null&&e!==`false`:e==null?a:o?.type===Number||typeof a==`number`?Number(e):e),u=(0,r.signal)(a),d=Object.prototype.hasOwnProperty.call(c,i),f=d?c[i]:void 0,p={parse:l,reflect:o?.reflect??!0,signal:u};if(d?(delete c[i],u.value=f):c.hasAttribute(i)&&(u.value=l(c.getAttribute(i))),s.get(c).set(i,p),Object.defineProperty(c,i,{configurable:!0,enumerable:!0,get:()=>u.value,set:e=>{u.value=e}}),o?.reflect??!0){let e=o?.omit??!1;t.effect(()=>{let t=u.value;t==null||t===!1||e&&t===``?c.removeAttribute(i):n.setAttr(c,i,t)})}return u};function l(t){let r={},i=e.currentRuntime().el.localName;for(let[e,s]of Object.entries(t)){let t=o(s)?s:{default:s},l=typeof t.default==`object`&&t.default!==null||Array.isArray(t.default);if(t.reflect===!0&&l){let t=`${i}:${String(e)}`;a.has(t)||(a.add(t),console.warn(`[craftit] props.${t} requested reflect: true for a structured default; reflection is disabled.`))}let u={reflect:!l,...t};r[e]=c(n.toKebab(e),t.default,u)}return r}exports.createProps=l,exports.propRegistry=s;
|
|
2
|
+
//# sourceMappingURL=props.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.cjs","names":[],"sources":["../src/props.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/stateit';\n\nimport { setAttr, toKebab } from './internal';\nimport { currentRuntime } from './runtime-core';\nimport { effect } from './runtime-lifecycle';\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when value is an empty string. */\n omit?: boolean;\n parse?: (value: string | null) => T;\n reflect?: boolean;\n type?: PropType<T>;\n};\n\nexport type OptionalKeys<T extends Record<string, unknown>> = {\n [K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;\n}[keyof T];\n\nexport type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;\n\nexport type PropsInput<T extends Record<string, unknown>> = {\n [K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;\n} & {\n [K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\ntype PropType<T> = T extends string\n ? StringConstructor\n : T extends number\n ? NumberConstructor\n : T extends boolean\n ? BooleanConstructor\n : T extends unknown[]\n ? ArrayConstructor\n : ObjectConstructor;\n\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst warnedStructuredReflectProps = new Set<string>();\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> => {\n if (typeof value !== 'object' || value === null || !('default' in value)) return false;\n\n return Object.keys(value).every((key) => PROP_DEF_KEYS.has(key));\n};\n\nexport const propRegistry = new WeakMap<object, Map<string, PropMeta<unknown>>>();\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nexport const prop = <T>(name: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const rt = currentRuntime();\n const el = rt.el;\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n const parse =\n options?.parse ??\n ((v: string | null): T => {\n if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, name);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[name] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[name];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(name)) {\n s.value = parse(el.getAttribute(name)) as T;\n }\n\n propRegistry.get(el)!.set(name, meta);\n\n Object.defineProperty(el, name, {\n configurable: true,\n enumerable: true,\n get: () => s.value,\n set: (value: T) => {\n s.value = value;\n },\n });\n\n if (options?.reflect ?? true) {\n const omit = options?.omit ?? false;\n\n effect(() => {\n const v = s.value;\n\n if (v == null || v === false || (omit && v === '')) {\n el.removeAttribute(name);\n } else {\n setAttr(el, name, v);\n }\n });\n }\n\n return s;\n};\n\ntype InferPropValue<T> = T extends object\n ? Exclude<keyof T, keyof PropDef<unknown>> extends never\n ? T extends PropDef<infer U>\n ? U\n : T\n : T\n : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\ntype RefineOptionalPropFromDefault<Value, Def> = undefined extends Value\n ? undefined extends InferDefaultFromDef<Def>\n ? Value\n : Exclude<Value, undefined>\n : Value;\n\ntype InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props\n ? RefineOptionalPropFromDefault<Props[Key], Def>\n : InferDefaultFromDef<Def>;\n\ntype ResolvePropValue<\n Props extends Record<string, unknown>,\n PropDefs extends Record<string, unknown>,\n Key extends PropertyKey,\n> = Key extends keyof PropDefs\n ? InferPropSignalValue<Props, Key, PropDefs[Key]>\n : Key extends keyof Props\n ? Props[Key]\n : never;\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n [K in keyof T]: Signal<T[K]>;\n};\n\nexport type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;\n\nexport function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n const tag = currentRuntime().el.localName;\n\n for (const [name, def] of Object.entries(defs)) {\n const descriptor = isPropDef(def) ? (def as PropDef<unknown>) : { default: def };\n const hasStructuredDefault =\n (typeof descriptor.default === 'object' && descriptor.default !== null) || Array.isArray(descriptor.default);\n\n if (descriptor.reflect === true && hasStructuredDefault) {\n const warningKey = `${tag}:${String(name)}`;\n\n if (!warnedStructuredReflectProps.has(warningKey)) {\n warnedStructuredReflectProps.add(warningKey);\n console.warn(\n `[craftit] props.${warningKey} requested reflect: true for a structured default; reflection is disabled.`,\n );\n }\n }\n\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n const signalRef = prop(toKebab(name), descriptor.default, propDef);\n\n props[name] = signalRef;\n }\n\n return props as ComponentProps<InferPropsFromDefs<D>>;\n}\n\ntype InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;\n\nexport type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {\n [K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;\n};\n\nexport type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [\n keyof Props,\n] extends [never]\n ? InferPropsFromDefs<PropDefs>\n : {\n [K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;\n };\n"],"mappings":"0IAuCA,IAAM,EAAgB,IAAI,IAAI,CAAC,UAAW,OAAQ,QAAS,UAAW,OAAO,CAAC,CACxE,EAA+B,IAAI,IAEnC,EAAa,GACb,OAAO,GAAU,WAAY,GAAkB,EAAE,YAAa,GAAe,GAE1E,OAAO,KAAK,EAAM,CAAC,MAAO,GAAQ,EAAc,IAAI,EAAI,CAAC,CAGrD,EAAe,IAAI,QAQnB,GAAW,EAAc,EAAiB,IAAwC,CAE7F,IAAM,EADK,EAAA,gBAAgB,CACb,GAET,EAAa,IAAI,EAAG,EAAE,EAAa,IAAI,EAAI,IAAI,IAAM,CAE1D,IAAM,EACJ,GAAS,QACP,GACI,GAAS,OAAS,QAAiB,IAAM,IAAM,IAAM,OAErD,OAAO,GAAiB,UAAmB,IAAM,MAAQ,IAAM,QAE/D,GAAK,KAAa,EAElB,GAAS,OAAS,QAAU,OAAO,GAAiB,SAAiB,OAAO,EAAE,CAE3E,GAGL,GAAA,EAAA,EAAA,QAAc,EAAa,CAC3B,EAAwB,OAAO,UAAU,eAAe,KAAK,EAAI,EAAK,CACtE,EAAkB,EAAyB,EAA0C,GAAQ,IAAA,GAE7F,EAAO,CACX,QACA,QAAS,GAAS,SAAW,GAC7B,OAAQ,EACT,CAoBD,GAlBI,GACF,OAAQ,EAA0C,GAClD,EAAE,MAAQ,GACD,EAAG,aAAa,EAAK,GAC9B,EAAE,MAAQ,EAAM,EAAG,aAAa,EAAK,CAAC,EAGxC,EAAa,IAAI,EAAG,CAAE,IAAI,EAAM,EAAK,CAErC,OAAO,eAAe,EAAI,EAAM,CAC9B,aAAc,GACd,WAAY,GACZ,QAAW,EAAE,MACb,IAAM,GAAa,CACjB,EAAE,MAAQ,GAEb,CAAC,CAEE,GAAS,SAAW,GAAM,CAC5B,IAAM,EAAO,GAAS,MAAQ,GAE9B,EAAA,WAAa,CACX,IAAM,EAAI,EAAE,MAER,GAAK,MAAQ,IAAM,IAAU,GAAQ,IAAM,GAC7C,EAAG,gBAAgB,EAAK,CAExB,EAAA,QAAQ,EAAI,EAAM,EAAE,EAEtB,CAGJ,OAAO,GAyCT,SAAgB,EAAqC,EAAgD,CACnG,IAAM,EAAQ,EAAE,CACV,EAAM,EAAA,gBAAgB,CAAC,GAAG,UAEhC,IAAK,GAAM,CAAC,EAAM,KAAQ,OAAO,QAAQ,EAAK,CAAE,CAC9C,IAAM,EAAa,EAAU,EAAI,CAAI,EAA2B,CAAE,QAAS,EAAK,CAC1E,EACH,OAAO,EAAW,SAAY,UAAY,EAAW,UAAY,MAAS,MAAM,QAAQ,EAAW,QAAQ,CAE9G,GAAI,EAAW,UAAY,IAAQ,EAAsB,CACvD,IAAM,EAAa,GAAG,EAAI,GAAG,OAAO,EAAK,GAEpC,EAA6B,IAAI,EAAW,GAC/C,EAA6B,IAAI,EAAW,CAC5C,QAAQ,KACN,mBAAmB,EAAW,4EAC/B,EAIL,IAAM,EAAgC,CAAE,QAAS,CAAC,EAAsB,GAAG,EAAY,CAIvF,EAAM,GAFY,EAAK,EAAA,QAAQ,EAAK,CAAE,EAAW,QAAS,EAAQ,CAKpE,OAAO"}
|
package/dist/props.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Signal } from '@vielzeug/stateit';
|
|
2
|
+
export type PropOptions<T> = {
|
|
3
|
+
/** When `true`, removes the host attribute instead of setting it to `""` when value is an empty string. */
|
|
4
|
+
omit?: boolean;
|
|
5
|
+
parse?: (value: string | null) => T;
|
|
6
|
+
reflect?: boolean;
|
|
7
|
+
type?: PropType<T>;
|
|
8
|
+
};
|
|
9
|
+
export type OptionalKeys<T extends Record<string, unknown>> = {
|
|
10
|
+
[K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;
|
|
11
|
+
}[keyof T];
|
|
12
|
+
export type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;
|
|
13
|
+
export type PropsInput<T extends Record<string, unknown>> = {
|
|
14
|
+
[K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;
|
|
15
|
+
} & {
|
|
16
|
+
[K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;
|
|
17
|
+
};
|
|
18
|
+
export type PropDef<T> = PropOptions<T> & {
|
|
19
|
+
default: T;
|
|
20
|
+
};
|
|
21
|
+
export type PropInputDefs = Record<string, unknown | PropDef<unknown>>;
|
|
22
|
+
type PropType<T> = T extends string ? StringConstructor : T extends number ? NumberConstructor : T extends boolean ? BooleanConstructor : T extends unknown[] ? ArrayConstructor : ObjectConstructor;
|
|
23
|
+
export declare const propRegistry: WeakMap<object, Map<string, PropMeta<unknown>>>;
|
|
24
|
+
type PropMeta<T = unknown> = {
|
|
25
|
+
parse: (value: string | null) => T;
|
|
26
|
+
reflect: boolean;
|
|
27
|
+
signal: Signal<T>;
|
|
28
|
+
};
|
|
29
|
+
export declare const prop: <T>(name: string, defaultValue: T, options?: PropOptions<T>) => Signal<T>;
|
|
30
|
+
type InferPropValue<T> = T extends object ? Exclude<keyof T, keyof PropDef<unknown>> extends never ? T extends PropDef<infer U> ? U : T : T : T;
|
|
31
|
+
export type InferPropsFromDefs<T extends PropInputDefs> = {
|
|
32
|
+
[K in keyof T]: InferPropValue<T[K]>;
|
|
33
|
+
};
|
|
34
|
+
type RefineOptionalPropFromDefault<Value, Def> = undefined extends Value ? undefined extends InferDefaultFromDef<Def> ? Value : Exclude<Value, undefined> : Value;
|
|
35
|
+
type InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props ? RefineOptionalPropFromDefault<Props[Key], Def> : InferDefaultFromDef<Def>;
|
|
36
|
+
type ResolvePropValue<Props extends Record<string, unknown>, PropDefs extends Record<string, unknown>, Key extends PropertyKey> = Key extends keyof PropDefs ? InferPropSignalValue<Props, Key, PropDefs[Key]> : Key extends keyof Props ? Props[Key] : never;
|
|
37
|
+
export type InferPropsSignals<T extends Record<string, unknown>> = {
|
|
38
|
+
[K in keyof T]: Signal<T[K]>;
|
|
39
|
+
};
|
|
40
|
+
export type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;
|
|
41
|
+
export declare function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>>;
|
|
42
|
+
type InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;
|
|
43
|
+
export type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {
|
|
44
|
+
[K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;
|
|
45
|
+
};
|
|
46
|
+
export type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [
|
|
47
|
+
keyof Props
|
|
48
|
+
] extends [never] ? InferPropsFromDefs<PropDefs> : {
|
|
49
|
+
[K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;
|
|
50
|
+
};
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../src/props.ts"],"names":[],"mappings":"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"}
|
package/dist/props.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{currentRuntime as e}from"./runtime-core.js";import{effect as t}from"./runtime-lifecycle.js";import{setAttr as n,toKebab as r}from"./internal.js";import{signal as i}from"@vielzeug/stateit";var a=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),o=new Set,s=e=>typeof e!=`object`||!e||!(`default`in e)?!1:Object.keys(e).every(e=>a.has(e)),c=new WeakMap,l=(r,a,o)=>{let s=e().el;c.has(s)||c.set(s,new Map);let l=o?.parse??(e=>o?.type===Boolean?e===``||e===`true`:typeof a==`boolean`?e!==null&&e!==`false`:e==null?a:o?.type===Number||typeof a==`number`?Number(e):e),u=i(a),d=Object.prototype.hasOwnProperty.call(s,r),f=d?s[r]:void 0,p={parse:l,reflect:o?.reflect??!0,signal:u};if(d?(delete s[r],u.value=f):s.hasAttribute(r)&&(u.value=l(s.getAttribute(r))),c.get(s).set(r,p),Object.defineProperty(s,r,{configurable:!0,enumerable:!0,get:()=>u.value,set:e=>{u.value=e}}),o?.reflect??!0){let e=o?.omit??!1;t(()=>{let t=u.value;t==null||t===!1||e&&t===``?s.removeAttribute(r):n(s,r,t)})}return u};function u(t){let n={},i=e().el.localName;for(let[e,a]of Object.entries(t)){let t=s(a)?a:{default:a},c=typeof t.default==`object`&&t.default!==null||Array.isArray(t.default);if(t.reflect===!0&&c){let t=`${i}:${String(e)}`;o.has(t)||(o.add(t),console.warn(`[craftit] props.${t} requested reflect: true for a structured default; reflection is disabled.`))}let u={reflect:!c,...t};n[e]=l(r(e),t.default,u)}return n}export{u as createProps,c as propRegistry};
|
|
2
|
+
//# sourceMappingURL=props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.js","names":[],"sources":["../src/props.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/stateit';\n\nimport { setAttr, toKebab } from './internal';\nimport { currentRuntime } from './runtime-core';\nimport { effect } from './runtime-lifecycle';\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when value is an empty string. */\n omit?: boolean;\n parse?: (value: string | null) => T;\n reflect?: boolean;\n type?: PropType<T>;\n};\n\nexport type OptionalKeys<T extends Record<string, unknown>> = {\n [K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;\n}[keyof T];\n\nexport type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;\n\nexport type PropsInput<T extends Record<string, unknown>> = {\n [K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;\n} & {\n [K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\ntype PropType<T> = T extends string\n ? StringConstructor\n : T extends number\n ? NumberConstructor\n : T extends boolean\n ? BooleanConstructor\n : T extends unknown[]\n ? ArrayConstructor\n : ObjectConstructor;\n\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst warnedStructuredReflectProps = new Set<string>();\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> => {\n if (typeof value !== 'object' || value === null || !('default' in value)) return false;\n\n return Object.keys(value).every((key) => PROP_DEF_KEYS.has(key));\n};\n\nexport const propRegistry = new WeakMap<object, Map<string, PropMeta<unknown>>>();\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nexport const prop = <T>(name: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const rt = currentRuntime();\n const el = rt.el;\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n const parse =\n options?.parse ??\n ((v: string | null): T => {\n if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, name);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[name] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[name];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(name)) {\n s.value = parse(el.getAttribute(name)) as T;\n }\n\n propRegistry.get(el)!.set(name, meta);\n\n Object.defineProperty(el, name, {\n configurable: true,\n enumerable: true,\n get: () => s.value,\n set: (value: T) => {\n s.value = value;\n },\n });\n\n if (options?.reflect ?? true) {\n const omit = options?.omit ?? false;\n\n effect(() => {\n const v = s.value;\n\n if (v == null || v === false || (omit && v === '')) {\n el.removeAttribute(name);\n } else {\n setAttr(el, name, v);\n }\n });\n }\n\n return s;\n};\n\ntype InferPropValue<T> = T extends object\n ? Exclude<keyof T, keyof PropDef<unknown>> extends never\n ? T extends PropDef<infer U>\n ? U\n : T\n : T\n : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\ntype RefineOptionalPropFromDefault<Value, Def> = undefined extends Value\n ? undefined extends InferDefaultFromDef<Def>\n ? Value\n : Exclude<Value, undefined>\n : Value;\n\ntype InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props\n ? RefineOptionalPropFromDefault<Props[Key], Def>\n : InferDefaultFromDef<Def>;\n\ntype ResolvePropValue<\n Props extends Record<string, unknown>,\n PropDefs extends Record<string, unknown>,\n Key extends PropertyKey,\n> = Key extends keyof PropDefs\n ? InferPropSignalValue<Props, Key, PropDefs[Key]>\n : Key extends keyof Props\n ? Props[Key]\n : never;\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n [K in keyof T]: Signal<T[K]>;\n};\n\nexport type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;\n\nexport function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n const tag = currentRuntime().el.localName;\n\n for (const [name, def] of Object.entries(defs)) {\n const descriptor = isPropDef(def) ? (def as PropDef<unknown>) : { default: def };\n const hasStructuredDefault =\n (typeof descriptor.default === 'object' && descriptor.default !== null) || Array.isArray(descriptor.default);\n\n if (descriptor.reflect === true && hasStructuredDefault) {\n const warningKey = `${tag}:${String(name)}`;\n\n if (!warnedStructuredReflectProps.has(warningKey)) {\n warnedStructuredReflectProps.add(warningKey);\n console.warn(\n `[craftit] props.${warningKey} requested reflect: true for a structured default; reflection is disabled.`,\n );\n }\n }\n\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n const signalRef = prop(toKebab(name), descriptor.default, propDef);\n\n props[name] = signalRef;\n }\n\n return props as ComponentProps<InferPropsFromDefs<D>>;\n}\n\ntype InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;\n\nexport type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {\n [K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;\n};\n\nexport type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [\n keyof Props,\n] extends [never]\n ? InferPropsFromDefs<PropDefs>\n : {\n [K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;\n };\n"],"mappings":"mMAuCA,IAAM,EAAgB,IAAI,IAAI,CAAC,UAAW,OAAQ,QAAS,UAAW,OAAO,CAAC,CACxE,EAA+B,IAAI,IAEnC,EAAa,GACb,OAAO,GAAU,WAAY,GAAkB,EAAE,YAAa,GAAe,GAE1E,OAAO,KAAK,EAAM,CAAC,MAAO,GAAQ,EAAc,IAAI,EAAI,CAAC,CAGrD,EAAe,IAAI,QAQnB,GAAW,EAAc,EAAiB,IAAwC,CAE7F,IAAM,EADK,GAAgB,CACb,GAET,EAAa,IAAI,EAAG,EAAE,EAAa,IAAI,EAAI,IAAI,IAAM,CAE1D,IAAM,EACJ,GAAS,QACP,GACI,GAAS,OAAS,QAAiB,IAAM,IAAM,IAAM,OAErD,OAAO,GAAiB,UAAmB,IAAM,MAAQ,IAAM,QAE/D,GAAK,KAAa,EAElB,GAAS,OAAS,QAAU,OAAO,GAAiB,SAAiB,OAAO,EAAE,CAE3E,GAGL,EAAI,EAAU,EAAa,CAC3B,EAAwB,OAAO,UAAU,eAAe,KAAK,EAAI,EAAK,CACtE,EAAkB,EAAyB,EAA0C,GAAQ,IAAA,GAE7F,EAAO,CACX,QACA,QAAS,GAAS,SAAW,GAC7B,OAAQ,EACT,CAoBD,GAlBI,GACF,OAAQ,EAA0C,GAClD,EAAE,MAAQ,GACD,EAAG,aAAa,EAAK,GAC9B,EAAE,MAAQ,EAAM,EAAG,aAAa,EAAK,CAAC,EAGxC,EAAa,IAAI,EAAG,CAAE,IAAI,EAAM,EAAK,CAErC,OAAO,eAAe,EAAI,EAAM,CAC9B,aAAc,GACd,WAAY,GACZ,QAAW,EAAE,MACb,IAAM,GAAa,CACjB,EAAE,MAAQ,GAEb,CAAC,CAEE,GAAS,SAAW,GAAM,CAC5B,IAAM,EAAO,GAAS,MAAQ,GAE9B,MAAa,CACX,IAAM,EAAI,EAAE,MAER,GAAK,MAAQ,IAAM,IAAU,GAAQ,IAAM,GAC7C,EAAG,gBAAgB,EAAK,CAExB,EAAQ,EAAI,EAAM,EAAE,EAEtB,CAGJ,OAAO,GAyCT,SAAgB,EAAqC,EAAgD,CACnG,IAAM,EAAQ,EAAE,CACV,EAAM,GAAgB,CAAC,GAAG,UAEhC,IAAK,GAAM,CAAC,EAAM,KAAQ,OAAO,QAAQ,EAAK,CAAE,CAC9C,IAAM,EAAa,EAAU,EAAI,CAAI,EAA2B,CAAE,QAAS,EAAK,CAC1E,EACH,OAAO,EAAW,SAAY,UAAY,EAAW,UAAY,MAAS,MAAM,QAAQ,EAAW,QAAQ,CAE9G,GAAI,EAAW,UAAY,IAAQ,EAAsB,CACvD,IAAM,EAAa,GAAG,EAAI,GAAG,OAAO,EAAK,GAEpC,EAA6B,IAAI,EAAW,GAC/C,EAA6B,IAAI,EAAW,CAC5C,QAAQ,KACN,mBAAmB,EAAW,4EAC/B,EAIL,IAAM,EAAgC,CAAE,QAAS,CAAC,EAAsB,GAAG,EAAY,CAIvF,EAAM,GAFY,EAAK,EAAQ,EAAK,CAAE,EAAW,QAAS,EAAQ,CAKpE,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./runtime-core.cjs`),t=require(`./internal.cjs`),n=require(`./form.cjs`),r=require(`./props.cjs`),i=require(`./template-dom.cjs`);require(`./template-bindings.cjs`),require(`./template-html.cjs`);const a=require(`./template.cjs`);let o=require(`@vielzeug/stateit`);var s=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,o.untrack)(()=>{this._setupDone||this._runSetup(),this._init()})}attributeChangedCallback(e,t,n){if(t===n)return;let i=r.propRegistry.get(this)?.get(e);if(!i)return;let a=i.parse(n);Object.is((0,o.untrack)(()=>i.signal.value),a)||(i.signal.value=a)}disconnectedCallback(){t.runAll(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear(),this._rendered=!1}formAssociatedCallback(e){n.formCallbackRegistry.get(this)?.onAssociated?.(e)}formDisabledCallback(e){n.formCallbackRegistry.get(this)?.onDisabled?.(e)}formResetCallback(){n.formCallbackRegistry.get(this)?.onReset?.()}formStateRestoreCallback(e,t){n.formCallbackRegistry.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,e.runtimeStack.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{e.runtimeStack.pop()}}_init(){let{styles:n}=this._runtime;if(n?.length&&(this.shadow.adoptedStyleSheets=n.map(t.loadStylesheet)),this._template){let e=typeof this._template==`string`?t.htmlResult(this._template):this._template;if(this._rendered||=(this.shadow.replaceChildren(i.parseHTML(e.__html)),!0),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);a.applyBindingsInContainer(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),a.applyHtmlBinding(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{e.runtimeStack.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{e.runtimeStack.pop(),this._runtime.onMount=[]}})}};function c(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))return e;class r extends s{static _options=n;static _setup=t;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}exports.registerComponent=c;
|
|
2
|
+
//# sourceMappingURL=registration.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration.cjs","names":[],"sources":["../src/registration.ts"],"sourcesContent":["import { type CleanupFn, untrack } from '@vielzeug/stateit';\n\nimport { formCallbackRegistry } from './form';\nimport { type CSSResult, type HTMLResult, htmlResult, loadStylesheet, runAll } from './internal';\nimport { propRegistry } from './props';\nimport { runtimeStack, type ComponentRuntime } from './runtime-core';\nimport { applyBindingsInContainer, applyHtmlBinding } from './template';\nimport { type RegisterCleanup } from './template-bindings';\nimport { parseHTML } from './template-dom';\nimport { type KeyedNode } from './template-html';\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** Custom options for a host element (e.g. for aria-*) */\n host?: Record<string, string | boolean | number>;\n /** @internal — list of attribute names to observe via attributeChangedCallback */\n observedAttrs?: string[];\n /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\ntype ComponentSetupResult = string | HTMLResult;\n\nclass BaseElement extends HTMLElement {\n static _options?: ComponentRegistrationOptions;\n static _setup: () => ComponentSetupResult;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _appliedHtmlBindings = new Set<string>();\n private _keyedStates = new Map<string, Map<string | number, KeyedNode>>();\n private _mountFns: (() => CleanupFn | undefined | void)[] = [];\n private _runtime: ComponentRuntime;\n private _rendered = false;\n private _setupDone = false;\n private _template: ComponentSetupResult | null = null;\n\n constructor() {\n super();\n\n const options = (this.constructor as typeof BaseElement)._options;\n\n this.shadow = this.attachShadow({ mode: 'open', ...options?.shadow });\n this._runtime = {\n cleanups: [],\n el: this,\n errorHandlers: [],\n onMount: [],\n styles: options?.styles,\n };\n }\n\n connectedCallback(): void {\n untrack(() => {\n if (!this._setupDone) this._runSetup();\n\n this._init();\n });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n const propMeta = propRegistry.get(this)?.get(name);\n\n if (!propMeta) return;\n\n const parsed = propMeta.parse(newValue);\n\n if (\n !Object.is(\n untrack(() => propMeta.signal.value),\n parsed,\n )\n ) {\n propMeta.signal.value = parsed as never;\n }\n }\n\n disconnectedCallback(): void {\n runAll(this._runtime.cleanups);\n this._runtime.cleanups = [];\n this._runtime.onMount = this._mountFns.slice();\n this._appliedHtmlBindings.clear();\n this._keyedStates.clear();\n this._rendered = false;\n }\n\n formAssociatedCallback(form: HTMLFormElement | null): void {\n formCallbackRegistry.get(this)?.onAssociated?.(form);\n }\n\n formDisabledCallback(disabled: boolean): void {\n formCallbackRegistry.get(this)?.onDisabled?.(disabled);\n }\n\n formResetCallback(): void {\n formCallbackRegistry.get(this)?.onReset?.();\n }\n\n formStateRestoreCallback(state: unknown, mode: 'autocomplete' | 'restore'): void {\n formCallbackRegistry.get(this)?.onStateRestore?.(state, mode);\n }\n\n private _handleError(err: unknown): void {\n if (this._runtime.errorHandlers.length > 0) {\n for (const fn of this._runtime.errorHandlers) fn(err);\n } else {\n console.error(`[craftit:E3] <${this.localName}>`, err);\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n private _runSetup(): void {\n this._setupDone = true;\n runtimeStack.push(this._runtime as any);\n\n try {\n const options = (this.constructor as typeof BaseElement)._options;\n const { host: hostOptions } = options ?? {};\n\n if (hostOptions) {\n for (const [name, value] of Object.entries(hostOptions)) {\n if (typeof value === 'boolean') {\n if (value) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n } else {\n this.setAttribute(name, String(value));\n }\n }\n }\n\n const result = (this.constructor as typeof BaseElement)._setup();\n\n if (typeof result === 'string' || (typeof result === 'object' && result !== null && '__html' in result)) {\n this._template = result as ComponentSetupResult;\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n }\n }\n\n private _init(): void {\n const { styles } = this._runtime;\n\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (this._template) {\n const result: HTMLResult = typeof this._template === 'string' ? htmlResult(this._template) : this._template;\n\n if (!this._rendered) {\n this.shadow.replaceChildren(parseHTML(result.__html));\n this._rendered = true;\n }\n\n if (result.__bindings.length) {\n const registerCleanup: RegisterCleanup = (fn) => this._runtime.cleanups.push(fn);\n\n applyBindingsInContainer(this.shadow, result.__bindings, registerCleanup, {\n onHtml: (binding) => {\n if (!this._appliedHtmlBindings.has(binding.uid)) {\n this._appliedHtmlBindings.add(binding.uid);\n applyHtmlBinding(this.shadow, binding, registerCleanup, this._keyedStates);\n }\n },\n });\n }\n }\n\n queueMicrotask(() => {\n runtimeStack.push(this._runtime as any);\n\n try {\n const mountFns = this._runtime.onMount;\n\n this._mountFns = mountFns.slice();\n\n for (const mountFn of mountFns) {\n const cleanup = mountFn();\n\n if (typeof cleanup === 'function') this._runtime.cleanups.push(cleanup);\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n this._runtime.onMount = [];\n }\n });\n }\n}\n\n/** @internal — use define() instead. */\nexport function registerComponent(\n tag: string,\n setup: () => ComponentSetupResult,\n options: ComponentRegistrationOptions = {},\n): string {\n if (!tag) throw new Error('[craftit:E4] registerComponent(tag, ...) requires a tag name');\n\n if (customElements.get(tag)) {\n return tag;\n }\n\n class Element extends BaseElement {\n static override _options = options;\n static override _setup = setup;\n static override formAssociated = options.formAssociated ?? false;\n static override observedAttributes = options.observedAttrs ?? [];\n }\n\n customElements.define(tag, Element);\n\n return tag;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type CSSResult, type HTMLResult } from './internal';
|
|
2
|
+
export type ComponentRegistrationOptions = {
|
|
3
|
+
/** Indicates if this should be a form-associated element */
|
|
4
|
+
formAssociated?: boolean;
|
|
5
|
+
/** Custom options for a host element (e.g. for aria-*) */
|
|
6
|
+
host?: Record<string, string | boolean | number>;
|
|
7
|
+
/** @internal — list of attribute names to observe via attributeChangedCallback */
|
|
8
|
+
observedAttrs?: string[];
|
|
9
|
+
/** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */
|
|
10
|
+
shadow?: Omit<ShadowRootInit, 'mode'>;
|
|
11
|
+
/** Component styles applied to the shadow root. Static — set at definition time, not per-render. */
|
|
12
|
+
styles?: (string | CSSStyleSheet | CSSResult)[];
|
|
13
|
+
};
|
|
14
|
+
type ComponentSetupResult = string | HTMLResult;
|
|
15
|
+
/** @internal — use define() instead. */
|
|
16
|
+
export declare function registerComponent(tag: string, setup: () => ComponentSetupResult, options?: ComponentRegistrationOptions): string;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../src/registration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAsC,MAAM,YAAY,CAAC;AAQjG,MAAM,MAAM,4BAA4B,GAAG;IACzC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;IACjD,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,+GAA+G;IAC/G,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtC,oGAAoG;IACpG,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC;CACjD,CAAC;AAEF,KAAK,oBAAoB,GAAG,MAAM,GAAG,UAAU,CAAC;AAkLhD,wCAAwC;AACxC,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,oBAAoB,EACjC,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAiBR"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{runtimeStack as e}from"./runtime-core.js";import{htmlResult as t,loadStylesheet as n,runAll as r}from"./internal.js";import{formCallbackRegistry as i}from"./form.js";import{propRegistry as a}from"./props.js";import{parseHTML as o}from"./template-dom.js";import"./template-bindings.js";import"./template-html.js";import{applyBindingsInContainer as s,applyHtmlBinding as c}from"./template.js";import{untrack as l}from"@vielzeug/stateit";var u=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(){l(()=>{this._setupDone||this._runSetup(),this._init()})}attributeChangedCallback(e,t,n){if(t===n)return;let r=a.get(this)?.get(e);if(!r)return;let i=r.parse(n);Object.is(l(()=>r.signal.value),i)||(r.signal.value=i)}disconnectedCallback(){r(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear(),this._rendered=!1}formAssociatedCallback(e){i.get(this)?.onAssociated?.(e)}formDisabledCallback(e){i.get(this)?.onDisabled?.(e)}formResetCallback(){i.get(this)?.onReset?.()}formStateRestoreCallback(e,t){i.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,e.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{e.pop()}}_init(){let{styles:r}=this._runtime;if(r?.length&&(this.shadow.adoptedStyleSheets=r.map(n)),this._template){let e=typeof this._template==`string`?t(this._template):this._template;if(this._rendered||=(this.shadow.replaceChildren(o(e.__html)),!0),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);s(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),c(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{e.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{e.pop(),this._runtime.onMount=[]}})}};function d(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))return e;class r extends u{static _options=n;static _setup=t;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}export{d as registerComponent};
|
|
2
|
+
//# sourceMappingURL=registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration.js","names":[],"sources":["../src/registration.ts"],"sourcesContent":["import { type CleanupFn, untrack } from '@vielzeug/stateit';\n\nimport { formCallbackRegistry } from './form';\nimport { type CSSResult, type HTMLResult, htmlResult, loadStylesheet, runAll } from './internal';\nimport { propRegistry } from './props';\nimport { runtimeStack, type ComponentRuntime } from './runtime-core';\nimport { applyBindingsInContainer, applyHtmlBinding } from './template';\nimport { type RegisterCleanup } from './template-bindings';\nimport { parseHTML } from './template-dom';\nimport { type KeyedNode } from './template-html';\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** Custom options for a host element (e.g. for aria-*) */\n host?: Record<string, string | boolean | number>;\n /** @internal — list of attribute names to observe via attributeChangedCallback */\n observedAttrs?: string[];\n /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\ntype ComponentSetupResult = string | HTMLResult;\n\nclass BaseElement extends HTMLElement {\n static _options?: ComponentRegistrationOptions;\n static _setup: () => ComponentSetupResult;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _appliedHtmlBindings = new Set<string>();\n private _keyedStates = new Map<string, Map<string | number, KeyedNode>>();\n private _mountFns: (() => CleanupFn | undefined | void)[] = [];\n private _runtime: ComponentRuntime;\n private _rendered = false;\n private _setupDone = false;\n private _template: ComponentSetupResult | null = null;\n\n constructor() {\n super();\n\n const options = (this.constructor as typeof BaseElement)._options;\n\n this.shadow = this.attachShadow({ mode: 'open', ...options?.shadow });\n this._runtime = {\n cleanups: [],\n el: this,\n errorHandlers: [],\n onMount: [],\n styles: options?.styles,\n };\n }\n\n connectedCallback(): void {\n untrack(() => {\n if (!this._setupDone) this._runSetup();\n\n this._init();\n });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n const propMeta = propRegistry.get(this)?.get(name);\n\n if (!propMeta) return;\n\n const parsed = propMeta.parse(newValue);\n\n if (\n !Object.is(\n untrack(() => propMeta.signal.value),\n parsed,\n )\n ) {\n propMeta.signal.value = parsed as never;\n }\n }\n\n disconnectedCallback(): void {\n runAll(this._runtime.cleanups);\n this._runtime.cleanups = [];\n this._runtime.onMount = this._mountFns.slice();\n this._appliedHtmlBindings.clear();\n this._keyedStates.clear();\n this._rendered = false;\n }\n\n formAssociatedCallback(form: HTMLFormElement | null): void {\n formCallbackRegistry.get(this)?.onAssociated?.(form);\n }\n\n formDisabledCallback(disabled: boolean): void {\n formCallbackRegistry.get(this)?.onDisabled?.(disabled);\n }\n\n formResetCallback(): void {\n formCallbackRegistry.get(this)?.onReset?.();\n }\n\n formStateRestoreCallback(state: unknown, mode: 'autocomplete' | 'restore'): void {\n formCallbackRegistry.get(this)?.onStateRestore?.(state, mode);\n }\n\n private _handleError(err: unknown): void {\n if (this._runtime.errorHandlers.length > 0) {\n for (const fn of this._runtime.errorHandlers) fn(err);\n } else {\n console.error(`[craftit:E3] <${this.localName}>`, err);\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n private _runSetup(): void {\n this._setupDone = true;\n runtimeStack.push(this._runtime as any);\n\n try {\n const options = (this.constructor as typeof BaseElement)._options;\n const { host: hostOptions } = options ?? {};\n\n if (hostOptions) {\n for (const [name, value] of Object.entries(hostOptions)) {\n if (typeof value === 'boolean') {\n if (value) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n } else {\n this.setAttribute(name, String(value));\n }\n }\n }\n\n const result = (this.constructor as typeof BaseElement)._setup();\n\n if (typeof result === 'string' || (typeof result === 'object' && result !== null && '__html' in result)) {\n this._template = result as ComponentSetupResult;\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n }\n }\n\n private _init(): void {\n const { styles } = this._runtime;\n\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (this._template) {\n const result: HTMLResult = typeof this._template === 'string' ? htmlResult(this._template) : this._template;\n\n if (!this._rendered) {\n this.shadow.replaceChildren(parseHTML(result.__html));\n this._rendered = true;\n }\n\n if (result.__bindings.length) {\n const registerCleanup: RegisterCleanup = (fn) => this._runtime.cleanups.push(fn);\n\n applyBindingsInContainer(this.shadow, result.__bindings, registerCleanup, {\n onHtml: (binding) => {\n if (!this._appliedHtmlBindings.has(binding.uid)) {\n this._appliedHtmlBindings.add(binding.uid);\n applyHtmlBinding(this.shadow, binding, registerCleanup, this._keyedStates);\n }\n },\n });\n }\n }\n\n queueMicrotask(() => {\n runtimeStack.push(this._runtime as any);\n\n try {\n const mountFns = this._runtime.onMount;\n\n this._mountFns = mountFns.slice();\n\n for (const mountFn of mountFns) {\n const cleanup = mountFn();\n\n if (typeof cleanup === 'function') this._runtime.cleanups.push(cleanup);\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n this._runtime.onMount = [];\n }\n });\n }\n}\n\n/** @internal — use define() instead. */\nexport function registerComponent(\n tag: string,\n setup: () => ComponentSetupResult,\n options: ComponentRegistrationOptions = {},\n): string {\n if (!tag) throw new Error('[craftit:E4] registerComponent(tag, ...) requires a tag name');\n\n if (customElements.get(tag)) {\n return tag;\n }\n\n class Element extends BaseElement {\n static override _options = options;\n static override _setup = setup;\n static override formAssociated = options.formAssociated ?? false;\n static override observedAttributes = options.observedAttrs ?? [];\n }\n\n customElements.define(tag, Element);\n\n return tag;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./internal.cjs`);let t=require(`@vielzeug/stateit`);var n=e=>{if((0,t.isSignal)(e))return e;if(typeof e==`function`)return(0,t.computed)(e)},r=e=>{if(!(0,t.isSignal)(e))return!1;let n=Object.getPrototypeOf(e);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{}},a=(t,n,r,a)=>{if(r){if(n===`value`){(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement)&&a(e.listen(t,t instanceof HTMLSelectElement?`change`:`input`,()=>{i(r,t.value)}));return}n===`checked`&&t instanceof HTMLInputElement&&a(e.listen(t,`change`,()=>{i(r,t.checked)}))}};exports.bindPropertyModel=a,exports.hasWritableValueSetter=r,exports.toReactiveBindingSource=n;
|
|
2
|
+
//# sourceMappingURL=runtime-bindings.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-bindings.cjs","names":[],"sources":["../src/runtime-bindings.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './internal';\n\nexport type RegisterPropertyCleanup = (fn: () => void) => void;\n\nexport const toReactiveBindingSource = (value: unknown): ReadonlySignal<unknown> | undefined => {\n if (isSignal(value)) return value as ReadonlySignal<unknown>;\n\n if (typeof value === 'function') return computed(value as () => unknown);\n\n return undefined;\n};\n\nexport const hasWritableValueSetter = (value: unknown): value is Signal<unknown> => {\n if (!isSignal(value)) return false;\n\n let proto: object | null = Object.getPrototypeOf(value);\n\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'value');\n\n if (descriptor) return typeof descriptor.set === 'function';\n\n proto = Object.getPrototypeOf(proto);\n }\n\n return false;\n};\n\nconst updateModelValue = (model: Signal<unknown>, next: unknown): void => {\n if (Object.is(model.value, next)) return;\n\n try {\n model.value = next;\n } catch {\n // Readonly signal/computed source: keep one-way behavior.\n }\n};\n\nexport const bindPropertyModel = (\n el: HTMLElement,\n name: string,\n model: Signal<unknown> | undefined,\n registerCleanup: RegisterPropertyCleanup,\n): void => {\n if (!model) return;\n\n if (name === 'value') {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n const eventName = el instanceof HTMLSelectElement ? 'change' : 'input';\n\n registerCleanup(\n listen(el, eventName, () => {\n updateModelValue(model, el.value);\n }),\n );\n }\n\n return;\n }\n\n if (name === 'checked' && el instanceof HTMLInputElement) {\n registerCleanup(\n listen(el, 'change', () => {\n updateModelValue(model, el.checked);\n }),\n );\n }\n};\n"],"mappings":"qEAMA,IAAa,EAA2B,GAAwD,CAC9F,IAAA,EAAA,EAAA,UAAa,EAAM,CAAE,OAAO,EAE5B,GAAI,OAAO,GAAU,WAAY,OAAA,EAAA,EAAA,UAAgB,EAAuB,EAK7D,EAA0B,GAA6C,CAClF,GAAI,EAAA,EAAA,EAAA,UAAU,EAAM,CAAE,MAAO,GAE7B,IAAI,EAAuB,OAAO,eAAe,EAAM,CAEvD,KAAO,GAAO,CACZ,IAAM,EAAa,OAAO,yBAAyB,EAAO,QAAQ,CAElE,GAAI,EAAY,OAAO,OAAO,EAAW,KAAQ,WAEjD,EAAQ,OAAO,eAAe,EAAM,CAGtC,MAAO,IAGH,GAAoB,EAAwB,IAAwB,CACpE,WAAO,GAAG,EAAM,MAAO,EAAK,CAEhC,GAAI,CACF,EAAM,MAAQ,OACR,IAKG,GACX,EACA,EACA,EACA,IACS,CACJ,KAEL,IAAI,IAAS,QAAS,EAChB,aAAc,kBAAoB,aAAc,qBAAuB,aAAc,oBAGvF,EACE,EAAA,OAAO,EAHS,aAAc,kBAAoB,SAAW,YAGjC,CAC1B,EAAiB,EAAO,EAAG,MAAM,EACjC,CACH,CAGH,OAGE,IAAS,WAAa,aAAc,kBACtC,EACE,EAAA,OAAO,EAAI,aAAgB,CACzB,EAAiB,EAAO,EAAG,QAAQ,EACnC,CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-bindings.d.ts","sourceRoot":"","sources":["../src/runtime-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIzF,MAAM,MAAM,uBAAuB,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAE/D,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,cAAc,CAAC,OAAO,CAAC,GAAG,SAMlF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,OAAO,CAc9E,CAAC;AAYF,eAAO,MAAM,iBAAiB,GAC5B,IAAI,WAAW,EACf,MAAM,MAAM,EACZ,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,EAClC,iBAAiB,uBAAuB,KACvC,IAwBF,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{listen as e}from"./internal.js";import{computed as t,isSignal as n}from"@vielzeug/stateit";var r=e=>{if(n(e))return e;if(typeof e==`function`)return t(e)},i=e=>{if(!n(e))return!1;let t=Object.getPrototypeOf(e);for(;t;){let e=Object.getOwnPropertyDescriptor(t,`value`);if(e)return typeof e.set==`function`;t=Object.getPrototypeOf(t)}return!1},a=(e,t)=>{if(!Object.is(e.value,t))try{e.value=t}catch{}},o=(t,n,r,i)=>{if(r){if(n===`value`){(t instanceof HTMLInputElement||t instanceof HTMLTextAreaElement||t instanceof HTMLSelectElement)&&i(e(t,t instanceof HTMLSelectElement?`change`:`input`,()=>{a(r,t.value)}));return}n===`checked`&&t instanceof HTMLInputElement&&i(e(t,`change`,()=>{a(r,t.checked)}))}};export{o as bindPropertyModel,i as hasWritableValueSetter,r as toReactiveBindingSource};
|
|
2
|
+
//# sourceMappingURL=runtime-bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-bindings.js","names":[],"sources":["../src/runtime-bindings.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './internal';\n\nexport type RegisterPropertyCleanup = (fn: () => void) => void;\n\nexport const toReactiveBindingSource = (value: unknown): ReadonlySignal<unknown> | undefined => {\n if (isSignal(value)) return value as ReadonlySignal<unknown>;\n\n if (typeof value === 'function') return computed(value as () => unknown);\n\n return undefined;\n};\n\nexport const hasWritableValueSetter = (value: unknown): value is Signal<unknown> => {\n if (!isSignal(value)) return false;\n\n let proto: object | null = Object.getPrototypeOf(value);\n\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'value');\n\n if (descriptor) return typeof descriptor.set === 'function';\n\n proto = Object.getPrototypeOf(proto);\n }\n\n return false;\n};\n\nconst updateModelValue = (model: Signal<unknown>, next: unknown): void => {\n if (Object.is(model.value, next)) return;\n\n try {\n model.value = next;\n } catch {\n // Readonly signal/computed source: keep one-way behavior.\n }\n};\n\nexport const bindPropertyModel = (\n el: HTMLElement,\n name: string,\n model: Signal<unknown> | undefined,\n registerCleanup: RegisterPropertyCleanup,\n): void => {\n if (!model) return;\n\n if (name === 'value') {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n const eventName = el instanceof HTMLSelectElement ? 'change' : 'input';\n\n registerCleanup(\n listen(el, eventName, () => {\n updateModelValue(model, el.value);\n }),\n );\n }\n\n return;\n }\n\n if (name === 'checked' && el instanceof HTMLInputElement) {\n registerCleanup(\n listen(el, 'change', () => {\n updateModelValue(model, el.checked);\n }),\n );\n }\n};\n"],"mappings":"kGAMA,IAAa,EAA2B,GAAwD,CAC9F,GAAI,EAAS,EAAM,CAAE,OAAO,EAE5B,GAAI,OAAO,GAAU,WAAY,OAAO,EAAS,EAAuB,EAK7D,EAA0B,GAA6C,CAClF,GAAI,CAAC,EAAS,EAAM,CAAE,MAAO,GAE7B,IAAI,EAAuB,OAAO,eAAe,EAAM,CAEvD,KAAO,GAAO,CACZ,IAAM,EAAa,OAAO,yBAAyB,EAAO,QAAQ,CAElE,GAAI,EAAY,OAAO,OAAO,EAAW,KAAQ,WAEjD,EAAQ,OAAO,eAAe,EAAM,CAGtC,MAAO,IAGH,GAAoB,EAAwB,IAAwB,CACpE,WAAO,GAAG,EAAM,MAAO,EAAK,CAEhC,GAAI,CACF,EAAM,MAAQ,OACR,IAKG,GACX,EACA,EACA,EACA,IACS,CACJ,KAEL,IAAI,IAAS,QAAS,EAChB,aAAc,kBAAoB,aAAc,qBAAuB,aAAc,oBAGvF,EACE,EAAO,EAHS,aAAc,kBAAoB,SAAW,YAGjC,CAC1B,EAAiB,EAAO,EAAG,MAAM,EACjC,CACH,CAGH,OAGE,IAAS,WAAa,aAAc,kBACtC,EACE,EAAO,EAAI,aAAgB,CACzB,EAAiB,EAAO,EAAG,QAAQ,EACnC,CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-core.cjs","names":[],"sources":["../src/runtime-core.ts"],"sourcesContent":["import { type CleanupFn } from '@vielzeug/stateit';\n\nimport { type CSSResult } from './internal';\n\nexport type ComponentRuntime = {\n /** Cleanup functions to run when the component is disconnected. */\n cleanups: CleanupFn[];\n /** The host element instance. */\n el: HTMLElement;\n /** Custom error handlers registered via `onError`. */\n errorHandlers: ((err: unknown) => void)[];\n /** Callbacks to run when the component is connected for the first time or re-connected. */\n onMount: (() => CleanupFn | undefined | void)[];\n /** Stylesheets to apply to the shadow root. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\n\n/**\n * Returns the current component runtime.\n * Throws if called outside of a component's setup or lifecycle.\n */\nexport const currentRuntime = (): ComponentRuntime => {\n const rt = runtimeStack[runtimeStack.length - 1];\n\n if (!rt) throw new Error('[craftit:E1] lifecycle outside setup');\n\n return rt;\n};\n"],"mappings":"uDAiBA,IAAa,EAAmC,EAAE,CAMrC,MAAyC,CACpD,IAAM,EAAK,EAAa,EAAa,OAAS,GAE9C,GAAI,CAAC,EAAI,MAAU,MAAM,uCAAuC,CAEhE,OAAO"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type CleanupFn } from '@vielzeug/stateit';
|
|
2
|
+
import { type CSSResult } from './internal';
|
|
3
|
+
export type ComponentRuntime = {
|
|
4
|
+
/** Cleanup functions to run when the component is disconnected. */
|
|
5
|
+
cleanups: CleanupFn[];
|
|
6
|
+
/** The host element instance. */
|
|
7
|
+
el: HTMLElement;
|
|
8
|
+
/** Custom error handlers registered via `onError`. */
|
|
9
|
+
errorHandlers: ((err: unknown) => void)[];
|
|
10
|
+
/** Callbacks to run when the component is connected for the first time or re-connected. */
|
|
11
|
+
onMount: (() => CleanupFn | undefined | void)[];
|
|
12
|
+
/** Stylesheets to apply to the shadow root. */
|
|
13
|
+
styles?: (string | CSSStyleSheet | CSSResult)[];
|
|
14
|
+
};
|
|
15
|
+
export declare const runtimeStack: ComponentRuntime[];
|
|
16
|
+
/**
|
|
17
|
+
* Returns the current component runtime.
|
|
18
|
+
* Throws if called outside of a component's setup or lifecycle.
|
|
19
|
+
*/
|
|
20
|
+
export declare const currentRuntime: () => ComponentRuntime;
|
|
21
|
+
//# sourceMappingURL=runtime-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-core.d.ts","sourceRoot":"","sources":["../src/runtime-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mEAAmE;IACnE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,iCAAiC;IACjC,EAAE,EAAE,WAAW,CAAC;IAChB,sDAAsD;IACtD,aAAa,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;IAC1C,2FAA2F;IAC3F,OAAO,EAAE,CAAC,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;IAChD,+CAA+C;IAC/C,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAAO,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,gBAMjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-core.js","names":[],"sources":["../src/runtime-core.ts"],"sourcesContent":["import { type CleanupFn } from '@vielzeug/stateit';\n\nimport { type CSSResult } from './internal';\n\nexport type ComponentRuntime = {\n /** Cleanup functions to run when the component is disconnected. */\n cleanups: CleanupFn[];\n /** The host element instance. */\n el: HTMLElement;\n /** Custom error handlers registered via `onError`. */\n errorHandlers: ((err: unknown) => void)[];\n /** Callbacks to run when the component is connected for the first time or re-connected. */\n onMount: (() => CleanupFn | undefined | void)[];\n /** Stylesheets to apply to the shadow root. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\n\n/**\n * Returns the current component runtime.\n * Throws if called outside of a component's setup or lifecycle.\n */\nexport const currentRuntime = (): ComponentRuntime => {\n const rt = runtimeStack[runtimeStack.length - 1];\n\n if (!rt) throw new Error('[craftit:E1] lifecycle outside setup');\n\n return rt;\n};\n"],"mappings":"gDAiBA,IAAa,EAAmC,EAAE,CAMrC,MAAyC,CACpD,IAAM,EAAK,EAAa,EAAa,OAAS,GAE9C,GAAI,CAAC,EAAI,MAAU,MAAM,uCAAuC,CAEhE,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./runtime-core.cjs`);let t=require(`@vielzeug/stateit`);var n=t=>{e.currentRuntime().onMount.push(t)},r=n=>{e.runtimeStack.length>0?e.currentRuntime().cleanups.push(n):(0,t.onCleanup)(n)},i=t=>{e.runtimeStack.length>0&&r(t)},a=t=>{e.currentRuntime().errorHandlers.push(t)},o=(e,n)=>{let r=(0,t.effect)(e,n);return i(r),r};function s(e,n,r){let a=(0,t.watch)(e,n,r);return i(a),a}function c(e,t,n,i){e&&(e.addEventListener(t,n,i),r(()=>e.removeEventListener(t,n,i)))}var l=()=>{let e=(0,t.signal)(null),n=()=>{e.value?.(),e.value=null};return r(n),{clear:n,set:t=>{e.value!==t&&(n(),e.value=t??null)},value:e}},u=(e,t,n)=>o(()=>{let n=e.value;if(n)return t(n)},n);exports.createCleanupSignal=l,exports.effect=o,exports.handle=c,exports.onCleanup=r,exports.onElement=u,exports.onError=a,exports.onMount=n,exports.watch=s;
|
|
2
|
+
//# sourceMappingURL=runtime-lifecycle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-lifecycle.cjs","names":[],"sources":["../src/runtime-lifecycle.ts"],"sourcesContent":["import {\n effect as _effect,\n onCleanup as _onCleanup,\n signal,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { currentRuntime, runtimeStack } from './runtime-core';\n\ntype NoDetail = void | undefined | never;\ntype HostCustomEventMap<CustomEvents extends Record<string, unknown>> = {\n [K in keyof CustomEvents & string]: [CustomEvents[K]] extends [Event]\n ? CustomEvents[K]\n : [CustomEvents[K]] extends [NoDetail]\n ? CustomEvent<undefined>\n : CustomEvent<CustomEvents[K]>;\n};\n\nexport type HostEventMap<CustomEvents extends Record<string, unknown> = Record<string, never>> = HTMLElementEventMap &\n HostCustomEventMap<CustomEvents>;\n\nexport type HostEventListeners<CustomEvents extends Record<string, unknown> = Record<string, never>> = {\n [K in keyof HostEventMap<CustomEvents>]?: (e: HostEventMap<CustomEvents>[K]) => void;\n};\n\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\n\nexport const onCleanup = (fn: CleanupFn): void => {\n if (runtimeStack.length > 0) {\n currentRuntime().cleanups.push(fn);\n } else {\n _onCleanup(fn);\n }\n};\n\nconst autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\n\nexport const effect = (fn: EffectCallback, options?: EffectOptions): Subscription => {\n const dispose = _effect(fn, options);\n\n autoCleanup(dispose);\n\n return dispose;\n};\n\nexport function watch<T>(\n source: ReadonlySignal<T>,\n cb: (value: T, prev: T) => void,\n options?: WatchOptions<T>,\n): Subscription;\nexport function watch(\n source: ReadonlySignal<unknown>,\n cb: (value: unknown, prev: unknown) => void,\n options?: WatchOptions<unknown>,\n): Subscription {\n const stop = _watch(source, cb, options);\n\n autoCleanup(stop);\n\n return stop;\n}\n\nexport function handle<K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void {\n if (!target) return;\n\n target.addEventListener(event, listener, options);\n onCleanup(() => target.removeEventListener(event, listener, options));\n}\n\nexport const createCleanupSignal = () => {\n const cleanup = signal<CleanupFn | null>(null);\n\n const clear = () => {\n cleanup.value?.();\n cleanup.value = null;\n };\n\n const set = (next: CleanupFn | null | undefined) => {\n if (cleanup.value === next) return;\n\n clear();\n cleanup.value = next ?? null;\n };\n\n onCleanup(clear);\n\n return { clear, set, value: cleanup as ReadonlySignal<CleanupFn | null> };\n};\n\nexport const onElement = <T extends HTMLElement>(\n ref: ReadonlySignal<T | null>,\n callback: (el: T) => CleanupFn | undefined | void,\n options?: EffectOptions,\n): Subscription => {\n return effect(() => {\n const el = ref.value;\n\n if (el) return callback(el);\n }, options);\n};\n"],"mappings":"yEA+BA,IAAa,EAAW,GAAiD,CACvE,EAAA,gBAAgB,CAAC,QAAQ,KAAK,EAAG,EAGtB,EAAa,GAAwB,CAC5C,EAAA,aAAa,OAAS,EACxB,EAAA,gBAAgB,CAAC,SAAS,KAAK,EAAG,EAElC,EAAA,EAAA,WAAW,EAAG,EAIZ,EAAe,GAA4C,CAC3D,EAAA,aAAa,OAAS,GAAG,EAAU,EAAQ,EAGpC,EAAW,GAAqC,CAC3D,EAAA,gBAAgB,CAAC,cAAc,KAAK,EAAG,EAG5B,GAAU,EAAoB,IAA0C,CACnF,IAAM,GAAA,EAAA,EAAA,QAAkB,EAAI,EAAQ,CAIpC,OAFA,EAAY,EAAQ,CAEb,GAQT,SAAgB,EACd,EACA,EACA,EACc,CACd,IAAM,GAAA,EAAA,EAAA,OAAc,EAAQ,EAAI,EAAQ,CAIxC,OAFA,EAAY,EAAK,CAEV,EAeT,SAAgB,EACd,EACA,EACA,EACA,EACM,CACD,IAEL,EAAO,iBAAiB,EAAO,EAAU,EAAQ,CACjD,MAAgB,EAAO,oBAAoB,EAAO,EAAU,EAAQ,CAAC,EAGvE,IAAa,MAA4B,CACvC,IAAM,GAAA,EAAA,EAAA,QAAmC,KAAK,CAExC,MAAc,CAClB,EAAQ,SAAS,CACjB,EAAQ,MAAQ,MAYlB,OAFA,EAAU,EAAM,CAET,CAAE,QAAO,IATH,GAAuC,CAC9C,EAAQ,QAAU,IAEtB,GAAO,CACP,EAAQ,MAAQ,GAAQ,OAKL,MAAO,EAA6C,EAG9D,GACX,EACA,EACA,IAEO,MAAa,CAClB,IAAM,EAAK,EAAI,MAEf,GAAI,EAAI,OAAO,EAAS,EAAG,EAC1B,EAAQ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type CleanupFn, type EffectCallback, type EffectOptions, type ReadonlySignal, type Subscription, type WatchOptions } from '@vielzeug/stateit';
|
|
2
|
+
type NoDetail = void | undefined | never;
|
|
3
|
+
type HostCustomEventMap<CustomEvents extends Record<string, unknown>> = {
|
|
4
|
+
[K in keyof CustomEvents & string]: [CustomEvents[K]] extends [Event] ? CustomEvents[K] : [CustomEvents[K]] extends [NoDetail] ? CustomEvent<undefined> : CustomEvent<CustomEvents[K]>;
|
|
5
|
+
};
|
|
6
|
+
export type HostEventMap<CustomEvents extends Record<string, unknown> = Record<string, never>> = HTMLElementEventMap & HostCustomEventMap<CustomEvents>;
|
|
7
|
+
export type HostEventListeners<CustomEvents extends Record<string, unknown> = Record<string, never>> = {
|
|
8
|
+
[K in keyof HostEventMap<CustomEvents>]?: (e: HostEventMap<CustomEvents>[K]) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare const onMount: (fn: () => CleanupFn | undefined | void) => void;
|
|
11
|
+
export declare const onCleanup: (fn: CleanupFn) => void;
|
|
12
|
+
export declare const onError: (fn: (err: unknown) => void) => void;
|
|
13
|
+
export declare const effect: (fn: EffectCallback, options?: EffectOptions) => Subscription;
|
|
14
|
+
export declare function watch<T>(source: ReadonlySignal<T>, cb: (value: T, prev: T) => void, options?: WatchOptions<T>): Subscription;
|
|
15
|
+
export declare function handle<K extends keyof HTMLElementEventMap>(target: EventTarget | null | undefined, event: K, listener: (e: HTMLElementEventMap[K]) => void, options?: AddEventListenerOptions): void;
|
|
16
|
+
export declare function handle(target: EventTarget | null | undefined, event: string, listener: EventListener, options?: AddEventListenerOptions): void;
|
|
17
|
+
export declare const createCleanupSignal: () => {
|
|
18
|
+
clear: () => void;
|
|
19
|
+
set: (next: CleanupFn | null | undefined) => void;
|
|
20
|
+
value: ReadonlySignal<CleanupFn | null>;
|
|
21
|
+
};
|
|
22
|
+
export declare const onElement: <T extends HTMLElement>(ref: ReadonlySignal<T | null>, callback: (el: T) => CleanupFn | undefined | void, options?: EffectOptions) => Subscription;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=runtime-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-lifecycle.d.ts","sourceRoot":"","sources":["../src/runtime-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAI3B,KAAK,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC;AACzC,KAAK,kBAAkB,CAAC,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;KACrE,CAAC,IAAI,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACjE,YAAY,CAAC,CAAC,CAAC,GACf,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,GAClC,WAAW,CAAC,SAAS,CAAC,GACtB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,mBAAmB,GAClH,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAEnC,MAAM,MAAM,kBAAkB,CAAC,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;KACpG,CAAC,IAAI,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;CACrF,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,KAAG,IAEhE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,IAAI,SAAS,KAAG,IAMzC,CAAC;AAMF,eAAO,MAAM,OAAO,GAAI,IAAI,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,KAAG,IAEpD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,IAAI,cAAc,EAAE,UAAU,aAAa,KAAG,YAMpE,CAAC;AAEF,wBAAgB,KAAK,CAAC,CAAC,EACrB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC;AAahB,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,mBAAmB,EACxD,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC7C,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CAAC;AACR,wBAAgB,MAAM,CACpB,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,EACtC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CAAC;AAaR,eAAO,MAAM,mBAAmB;;gBAQX,SAAS,GAAG,IAAI,GAAG,SAAS;WASR,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC;CACxE,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,WAAW,EAC7C,KAAK,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,EAC7B,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,EACjD,UAAU,aAAa,KACtB,YAMF,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{currentRuntime as e,runtimeStack as t}from"./runtime-core.js";import{effect as n,onCleanup as r,signal as i,watch as a}from"@vielzeug/stateit";var o=t=>{e().onMount.push(t)},s=n=>{t.length>0?e().cleanups.push(n):r(n)},c=e=>{t.length>0&&s(e)},l=t=>{e().errorHandlers.push(t)},u=(e,t)=>{let r=n(e,t);return c(r),r};function d(e,t,n){let r=a(e,t,n);return c(r),r}function f(e,t,n,r){e&&(e.addEventListener(t,n,r),s(()=>e.removeEventListener(t,n,r)))}var p=()=>{let e=i(null),t=()=>{e.value?.(),e.value=null};return s(t),{clear:t,set:n=>{e.value!==n&&(t(),e.value=n??null)},value:e}},m=(e,t,n)=>u(()=>{let n=e.value;if(n)return t(n)},n);export{p as createCleanupSignal,u as effect,f as handle,s as onCleanup,m as onElement,l as onError,o as onMount,d as watch};
|
|
2
|
+
//# sourceMappingURL=runtime-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-lifecycle.js","names":[],"sources":["../src/runtime-lifecycle.ts"],"sourcesContent":["import {\n effect as _effect,\n onCleanup as _onCleanup,\n signal,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { currentRuntime, runtimeStack } from './runtime-core';\n\ntype NoDetail = void | undefined | never;\ntype HostCustomEventMap<CustomEvents extends Record<string, unknown>> = {\n [K in keyof CustomEvents & string]: [CustomEvents[K]] extends [Event]\n ? CustomEvents[K]\n : [CustomEvents[K]] extends [NoDetail]\n ? CustomEvent<undefined>\n : CustomEvent<CustomEvents[K]>;\n};\n\nexport type HostEventMap<CustomEvents extends Record<string, unknown> = Record<string, never>> = HTMLElementEventMap &\n HostCustomEventMap<CustomEvents>;\n\nexport type HostEventListeners<CustomEvents extends Record<string, unknown> = Record<string, never>> = {\n [K in keyof HostEventMap<CustomEvents>]?: (e: HostEventMap<CustomEvents>[K]) => void;\n};\n\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\n\nexport const onCleanup = (fn: CleanupFn): void => {\n if (runtimeStack.length > 0) {\n currentRuntime().cleanups.push(fn);\n } else {\n _onCleanup(fn);\n }\n};\n\nconst autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\n\nexport const effect = (fn: EffectCallback, options?: EffectOptions): Subscription => {\n const dispose = _effect(fn, options);\n\n autoCleanup(dispose);\n\n return dispose;\n};\n\nexport function watch<T>(\n source: ReadonlySignal<T>,\n cb: (value: T, prev: T) => void,\n options?: WatchOptions<T>,\n): Subscription;\nexport function watch(\n source: ReadonlySignal<unknown>,\n cb: (value: unknown, prev: unknown) => void,\n options?: WatchOptions<unknown>,\n): Subscription {\n const stop = _watch(source, cb, options);\n\n autoCleanup(stop);\n\n return stop;\n}\n\nexport function handle<K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void {\n if (!target) return;\n\n target.addEventListener(event, listener, options);\n onCleanup(() => target.removeEventListener(event, listener, options));\n}\n\nexport const createCleanupSignal = () => {\n const cleanup = signal<CleanupFn | null>(null);\n\n const clear = () => {\n cleanup.value?.();\n cleanup.value = null;\n };\n\n const set = (next: CleanupFn | null | undefined) => {\n if (cleanup.value === next) return;\n\n clear();\n cleanup.value = next ?? null;\n };\n\n onCleanup(clear);\n\n return { clear, set, value: cleanup as ReadonlySignal<CleanupFn | null> };\n};\n\nexport const onElement = <T extends HTMLElement>(\n ref: ReadonlySignal<T | null>,\n callback: (el: T) => CleanupFn | undefined | void,\n options?: EffectOptions,\n): Subscription => {\n return effect(() => {\n const el = ref.value;\n\n if (el) return callback(el);\n }, options);\n};\n"],"mappings":"sJA+BA,IAAa,EAAW,GAAiD,CACvE,GAAgB,CAAC,QAAQ,KAAK,EAAG,EAGtB,EAAa,GAAwB,CAC5C,EAAa,OAAS,EACxB,GAAgB,CAAC,SAAS,KAAK,EAAG,CAElC,EAAW,EAAG,EAIZ,EAAe,GAA4C,CAC3D,EAAa,OAAS,GAAG,EAAU,EAAQ,EAGpC,EAAW,GAAqC,CAC3D,GAAgB,CAAC,cAAc,KAAK,EAAG,EAG5B,GAAU,EAAoB,IAA0C,CACnF,IAAM,EAAU,EAAQ,EAAI,EAAQ,CAIpC,OAFA,EAAY,EAAQ,CAEb,GAQT,SAAgB,EACd,EACA,EACA,EACc,CACd,IAAM,EAAO,EAAO,EAAQ,EAAI,EAAQ,CAIxC,OAFA,EAAY,EAAK,CAEV,EAeT,SAAgB,EACd,EACA,EACA,EACA,EACM,CACD,IAEL,EAAO,iBAAiB,EAAO,EAAU,EAAQ,CACjD,MAAgB,EAAO,oBAAoB,EAAO,EAAU,EAAQ,CAAC,EAGvE,IAAa,MAA4B,CACvC,IAAM,EAAU,EAAyB,KAAK,CAExC,MAAc,CAClB,EAAQ,SAAS,CACjB,EAAQ,MAAQ,MAYlB,OAFA,EAAU,EAAM,CAET,CAAE,QAAO,IATH,GAAuC,CAC9C,EAAQ,QAAU,IAEtB,GAAO,CACP,EAAQ,MAAQ,GAAQ,OAKL,MAAO,EAA6C,EAG9D,GACX,EACA,EACA,IAEO,MAAa,CAClB,IAAM,EAAK,EAAI,MAEf,GAAI,EAAI,OAAO,EAAS,EAAG,EAC1B,EAAQ"}
|
package/dist/runtime.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`./runtime-lifecycle.cjs`);var e={bubbles:!0,cancelable:!0,composed:!0},t={custom(t,n,r={}){return t.dispatchEvent(new CustomEvent(n,{...e,...r}))},event(e,t){return e.dispatchEvent(t)},focus(t,n,r={}){return t.dispatchEvent(new FocusEvent(n,{...e,...r}))},keyboard(t,n,r={}){return t.dispatchEvent(new KeyboardEvent(n,{...e,...r}))},mouse(t,n,r={}){return t.dispatchEvent(new MouseEvent(n,{...e,...r}))},touch(t,n,r={}){return typeof TouchEvent<`u`?t.dispatchEvent(new TouchEvent(n,{...e,...r})):t.dispatchEvent(new CustomEvent(n,{...e,...r}))}};exports.fire=t;
|
|
2
|
+
//# sourceMappingURL=runtime.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.cjs","names":[],"sources":["../src/runtime.ts"],"sourcesContent":["export {\n createCleanupSignal,\n effect,\n handle,\n onCleanup,\n onElement,\n onError,\n onMount,\n watch,\n} from './runtime-lifecycle';\nexport type { HostEventListeners, HostEventMap } from './runtime-lifecycle';\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\n/**\n * Dispatch DOM events explicitly without guessing constructors from the event name.\n *\n * @example\n * fire.mouse(el, 'click');\n * fire.keyboard(el, 'keydown', { key: 'Enter' });\n * fire.custom(el, 'change', { detail: { value: 42 } });\n * fire.event(el, new PointerEvent('pointerdown'));\n */\nexport const fire: FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n"],"mappings":"mCAuBA,IAAM,EAAqC,CAAE,QAAS,GAAM,WAAY,GAAM,SAAU,GAAM,CAWjF,EAAgB,CAC3B,OAAyB,EAAqB,EAAc,EAAmC,EAAE,CAAE,CACjG,OAAO,EAAO,cAAc,IAAI,YAAoB,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAErG,MAAM,EAAQ,EAAO,CACnB,OAAO,EAAO,cAAc,EAAM,EAEpC,MAAM,EAAQ,EAAM,EAAU,EAAE,CAAE,CAChC,OAAO,EAAO,cAAc,IAAI,WAAW,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE5F,SAAS,EAAQ,EAAM,EAAU,EAAE,CAAE,CACnC,OAAO,EAAO,cAAc,IAAI,cAAc,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE/F,MAAM,EAAQ,EAAM,EAAU,EAAE,CAAE,CAChC,OAAO,EAAO,cAAc,IAAI,WAAW,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE5F,MAAM,EAAQ,EAAM,EAAU,EAAE,CAAE,CAKhC,OAJI,OAAO,WAAe,IACjB,EAAO,cAAc,IAAI,WAAW,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,CAGrF,EAAO,cAAc,IAAI,YAAY,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE9F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { createCleanupSignal, effect, handle, onCleanup, onElement, onError, onMount, watch, } from './runtime-lifecycle';
|
|
2
|
+
export type { HostEventListeners, HostEventMap } from './runtime-lifecycle';
|
|
3
|
+
export type FireApi = {
|
|
4
|
+
custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;
|
|
5
|
+
event(target: EventTarget, event: Event): boolean;
|
|
6
|
+
focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;
|
|
7
|
+
keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;
|
|
8
|
+
mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;
|
|
9
|
+
touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Dispatch DOM events explicitly without guessing constructors from the event name.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* fire.mouse(el, 'click');
|
|
16
|
+
* fire.keyboard(el, 'keydown', { key: 'Enter' });
|
|
17
|
+
* fire.custom(el, 'change', { detail: { value: 42 } });
|
|
18
|
+
* fire.event(el, new PointerEvent('pointerdown'));
|
|
19
|
+
*/
|
|
20
|
+
export declare const fire: FireApi;
|
|
21
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,GACN,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAI5E,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IACxG,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IAClD,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAClF,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAC5E,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;CAC7E,CAAC;AAIF;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI,EAAE,OAuBlB,CAAC"}
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./runtime-lifecycle.js";var e={bubbles:!0,cancelable:!0,composed:!0},t={custom(t,n,r={}){return t.dispatchEvent(new CustomEvent(n,{...e,...r}))},event(e,t){return e.dispatchEvent(t)},focus(t,n,r={}){return t.dispatchEvent(new FocusEvent(n,{...e,...r}))},keyboard(t,n,r={}){return t.dispatchEvent(new KeyboardEvent(n,{...e,...r}))},mouse(t,n,r={}){return t.dispatchEvent(new MouseEvent(n,{...e,...r}))},touch(t,n,r={}){return typeof TouchEvent<`u`?t.dispatchEvent(new TouchEvent(n,{...e,...r})):t.dispatchEvent(new CustomEvent(n,{...e,...r}))}};export{t as fire};
|
|
2
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","names":[],"sources":["../src/runtime.ts"],"sourcesContent":["export {\n createCleanupSignal,\n effect,\n handle,\n onCleanup,\n onElement,\n onError,\n onMount,\n watch,\n} from './runtime-lifecycle';\nexport type { HostEventListeners, HostEventMap } from './runtime-lifecycle';\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\n/**\n * Dispatch DOM events explicitly without guessing constructors from the event name.\n *\n * @example\n * fire.mouse(el, 'click');\n * fire.keyboard(el, 'keydown', { key: 'Enter' });\n * fire.custom(el, 'change', { detail: { value: 42 } });\n * fire.event(el, new PointerEvent('pointerdown'));\n */\nexport const fire: FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n"],"mappings":"+BAuBA,IAAM,EAAqC,CAAE,QAAS,GAAM,WAAY,GAAM,SAAU,GAAM,CAWjF,EAAgB,CAC3B,OAAyB,EAAqB,EAAc,EAAmC,EAAE,CAAE,CACjG,OAAO,EAAO,cAAc,IAAI,YAAoB,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAErG,MAAM,EAAQ,EAAO,CACnB,OAAO,EAAO,cAAc,EAAM,EAEpC,MAAM,EAAQ,EAAM,EAAU,EAAE,CAAE,CAChC,OAAO,EAAO,cAAc,IAAI,WAAW,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE5F,SAAS,EAAQ,EAAM,EAAU,EAAE,CAAE,CACnC,OAAO,EAAO,cAAc,IAAI,cAAc,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE/F,MAAM,EAAQ,EAAM,EAAU,EAAE,CAAE,CAChC,OAAO,EAAO,cAAc,IAAI,WAAW,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE5F,MAAM,EAAQ,EAAM,EAAU,EAAE,CAAE,CAKhC,OAJI,OAAO,WAAe,IACjB,EAAO,cAAc,IAAI,WAAW,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,CAGrF,EAAO,cAAc,IAAI,YAAY,EAAM,CAAE,GAAG,EAAsB,GAAG,EAAS,CAAC,CAAC,EAE9F"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./internal.cjs`),t=require(`./runtime-bindings.cjs`),n=require(`./props.cjs`),r=require(`./template-dom.cjs`);let i=require(`@vielzeug/stateit`);var a=e=>Array.isArray(e)||typeof e==`object`&&!!e,o=(e,t,n)=>{n((0,i.effect)(()=>t(e.value)))},s=(t,r,s)=>{let c=o=>{let s=n.propRegistry.get(t)?.get(r.name);if(!s&&a(o)){t[r.name]=o;return}if((!s||s.reflect)&&(r.mode===`bool`?t.toggleAttribute(r.name,!!o):e.setAttr(t,r.name,o)),!s)return;let c=a(o)?o:s.parse(r.mode===`bool`?o?``:null:o==null||o===!1?null:String(o));Object.is((0,i.untrack)(()=>s.signal.value),c)||(s.signal.value=c)};r.signal?o(r.signal,c,s):c(r.value)},c=(e,n,r)=>{let i=t=>{e[n.name]=t};n.signal?o(n.signal,i,r):i(n.value),t.bindPropertyModel(e,n.name,n.model,r)},l=(t,n,r)=>{let{modifiers:i}=n,a=i?{capture:!!i.capture,once:!!i.once,passive:!!i.passive}:void 0;r(e.listen(t,n.name,e=>{i?.self&&e.target!==e.currentTarget||(i?.stop&&e.stopPropagation(),i?.prevent&&!i?.passive&&e.preventDefault(),n.handler(e))},a))},u=(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})},d=(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),o(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`:s(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:l(i,e,t);break;case`prop`:c(i,e,t);break;case`ref`:u(i,e,t);break}}}},f=(e,t,n,i)=>{d(t,n,r.indexBindings(e),i)},p=(e,n,r,i)=>{let a=t.toReactiveBindingSource(i);return a?{mode:e,name:n,signal:a,type:`attr`,uid:r}:{mode:e,name:n,type:`attr`,uid:r,value:i}},m=(e,n,r)=>{let i=t.toReactiveBindingSource(r);return i?{model:t.hasWritableValueSetter(r)?r:void 0,name:e,signal:i,type:`prop`,uid:n}:{name:e,type:`prop`,uid:n,value:r}};exports.applyBindingsInContainer=f,exports.applyBindingsWithTargets=d,exports.createAttrBinding=p,exports.createPropBinding=m;
|
|
2
|
+
//# sourceMappingURL=template-bindings.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-bindings.cjs","names":[],"sources":["../src/template-bindings.ts"],"sourcesContent":["import { effect as rawEffect, type CleanupFn, type ReadonlySignal, untrack } from '@vielzeug/stateit';\n\nimport {\n type AttrBinding,\n type EventBinding,\n type PropBinding,\n type RefBinding,\n type Binding,\n type HtmlBinding,\n CF_ID_ATTR,\n} from './internal';\nimport { listen, setAttr } from './internal';\nimport { propRegistry } from './props';\nimport { bindPropertyModel } from './runtime-bindings';\nimport { indexBindings, type BindingTargets } from './template-dom';\n\nexport type RegisterCleanup = (fn: CleanupFn) => void;\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/** Check if a value is a structured type (object or array), not a primitive. */\nconst isStructuredValue = (value: unknown): value is object =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\n/**\n * Register a reactive effect that updates when a signal changes.\n * Common pattern: `if (signal) registerCleanup(effect(() => update(signal.value)))`\n */\nconst signalEffect = (\n signal: ReadonlySignal<unknown>,\n update: (v: unknown) => void,\n registerCleanup: RegisterCleanup,\n): void => {\n registerCleanup(rawEffect(() => update(signal.value)));\n};\n\n// ─── Individual binding application functions ─────────────────────────────────\n\n/**\n * Apply an attribute binding to an element.\n * Handles bool/attr modes, prop pre-upgrade, and reactive updates.\n */\nexport const applyAttrBinding = (el: HTMLElement, binding: AttrBinding, registerCleanup: RegisterCleanup) => {\n const update = (value: unknown) => {\n const meta = propRegistry.get(el)?.get(binding.name);\n\n // Preserve structured values as pre-upgrade properties\n if (!meta && isStructuredValue(value)) {\n (el as any)[binding.name] = value;\n\n return;\n }\n\n if (!meta || meta.reflect) {\n if (binding.mode === 'bool') {\n el.toggleAttribute(binding.name, Boolean(value));\n } else {\n setAttr(el, binding.name, value);\n }\n }\n\n if (!meta) return;\n\n const parsedValue = isStructuredValue(value)\n ? value\n : meta.parse(\n binding.mode === 'bool' ? (value ? '' : null) : value == null || value === false ? null : String(value),\n );\n\n if (\n !Object.is(\n untrack(() => meta.signal.value),\n parsedValue,\n )\n ) {\n meta.signal.value = parsedValue as never;\n }\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n};\n\n/**\n * Apply a property binding to an element.\n * Handles reactive updates and two-way binding via property models.\n */\nexport const applyPropBinding = (el: HTMLElement, binding: PropBinding, registerCleanup: RegisterCleanup) => {\n const update = (value: unknown) => {\n (el as any)[binding.name] = value;\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n\n bindPropertyModel(el, binding.name, binding.model, registerCleanup);\n};\n\n/**\n * Apply an event listener binding to an element.\n * Handles event modifiers (stop, prevent, self, capture, once, passive).\n */\nexport const applyEventBinding = (el: HTMLElement, binding: EventBinding, registerCleanup: RegisterCleanup) => {\n const { modifiers } = binding;\n const listenerOptions = modifiers\n ? { capture: !!modifiers.capture, once: !!modifiers.once, passive: !!modifiers.passive }\n : undefined;\n\n const wrappedHandler = (event: Event) => {\n if (modifiers?.self && event.target !== event.currentTarget) return;\n\n if (modifiers?.stop) event.stopPropagation();\n\n if (modifiers?.prevent && !modifiers?.passive) event.preventDefault();\n\n binding.handler(event);\n };\n\n registerCleanup(listen(el, binding.name, wrappedHandler, listenerOptions));\n};\n\n/**\n * Apply a ref binding to an element.\n * Supports function refs, ref arrays, and signal refs with cleanup.\n */\nexport const applyRefBinding = (el: HTMLElement, binding: RefBinding, registerCleanup: RegisterCleanup) => {\n const { ref } = binding;\n\n if (typeof ref === 'function') {\n ref(el as never);\n registerCleanup(() => ref(null));\n\n return;\n }\n\n if (Array.isArray(ref)) {\n ref.push(el);\n registerCleanup(() => {\n const idx = ref.indexOf(el);\n\n if (idx !== -1) ref.splice(idx, 1);\n });\n\n return;\n }\n\n ref.value = el as never;\n registerCleanup(() => {\n ref.value = null;\n });\n};\n\n// ─── Binding orchestration ────────────────────────────────────────────────────\n\n/**\n * Apply all bindings to target elements.\n *\n * - Text bindings: Create text nodes, register reactive effects\n * - HTML bindings: Notify caller for keyed reconciliation\n * - Element bindings: Group by ID, apply attr/prop/event/ref in one pass per element\n *\n * @param bindings Array of compiled bindings to apply\n * @param registerCleanup Function to register cleanup callbacks\n * @param targets Indexed comment/element targets from DOM\n * @param opts Optional callbacks (e.g., onHtml for keyed reconciliation)\n */\nexport const applyBindingsWithTargets = (\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n targets: BindingTargets,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n const bindingMap = new Map<string, Binding[]>();\n\n for (const b of bindings) {\n const id = b.uid;\n\n if (b.type === 'text') {\n const found = targets.comments.get(id);\n\n if (found) {\n const textNode = document.createTextNode('');\n\n found.replaceWith(textNode);\n targets.comments.delete(id);\n signalEffect(\n b.signal,\n (v) => {\n textNode.textContent = String(v);\n },\n registerCleanup,\n );\n }\n } else if (b.type === 'html') {\n opts?.onHtml?.(b);\n } else {\n if (!bindingMap.has(id)) bindingMap.set(id, []);\n\n bindingMap.get(id)!.push(b);\n }\n }\n\n for (const [id, elBindings] of bindingMap) {\n const el = targets.elements.get(id);\n\n if (!el) continue;\n\n el.removeAttribute(CF_ID_ATTR);\n targets.elements.delete(id);\n\n for (const b of elBindings) {\n switch (b.type) {\n case 'attr':\n applyAttrBinding(el, b, registerCleanup);\n break;\n case 'callback':\n b.apply(el, registerCleanup);\n break;\n case 'event':\n applyEventBinding(el, b, registerCleanup);\n break;\n case 'prop':\n applyPropBinding(el, b, registerCleanup);\n break;\n case 'ref':\n applyRefBinding(el, b, registerCleanup);\n break;\n }\n }\n }\n};\n\nexport const applyBindingsInContainer = (\n container: ParentNode,\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n applyBindingsWithTargets(bindings, registerCleanup, indexBindings(container), opts);\n};\n\n// ─── Binding factories ────────────────────────────────────────────────────────\n\nimport { type Signal } from '@vielzeug/stateit';\n\nimport { hasWritableValueSetter, toReactiveBindingSource } from './runtime-bindings';\n\n/**\n * Create an attribute binding descriptor.\n * Called during template compilation for each attribute interpolation.\n *\n * @param mode 'bool' for boolean attributes (presence = true), 'attr' for string values\n * @param name Attribute name (e.g., 'disabled', 'aria-label')\n * @param uid Unique binding ID\n * @param value Attribute value (signal or static)\n */\nexport const createAttrBinding = (mode: 'bool' | 'attr', name: string, uid: string, value: unknown): AttrBinding => {\n const source = toReactiveBindingSource(value);\n\n return source ? { mode, name, signal: source, type: 'attr', uid } : { mode, name, type: 'attr', uid, value };\n};\n\n/**\n * Create a property binding descriptor.\n * Called during template compilation for each `.property` interpolation.\n *\n * @param name Property name (e.g., 'value', 'checked')\n * @param uid Unique binding ID\n * @param value Property value (signal, function, or static)\n */\nexport const createPropBinding = (name: string, uid: string, value: unknown): PropBinding => {\n const source = toReactiveBindingSource(value);\n\n if (source) {\n return {\n model: hasWritableValueSetter(value) ? (value as Signal<unknown>) : undefined,\n name,\n signal: source,\n type: 'prop',\n uid,\n };\n }\n\n return { name, type: 'prop', uid, value };\n};\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type CleanupFn } from '@vielzeug/stateit';
|
|
2
2
|
import { type AttrBinding, type EventBinding, type PropBinding, type RefBinding, type Binding, type HtmlBinding } from './internal';
|
|
3
|
+
import { type BindingTargets } from './template-dom';
|
|
3
4
|
export type RegisterCleanup = (fn: CleanupFn) => void;
|
|
4
5
|
/**
|
|
5
6
|
* Apply an attribute binding to an element.
|
|
@@ -21,7 +22,6 @@ export declare const applyEventBinding: (el: HTMLElement, binding: EventBinding,
|
|
|
21
22
|
* Supports function refs, ref arrays, and signal refs with cleanup.
|
|
22
23
|
*/
|
|
23
24
|
export declare const applyRefBinding: (el: HTMLElement, binding: RefBinding, registerCleanup: RegisterCleanup) => void;
|
|
24
|
-
import { type BindingTargets } from './template-dom';
|
|
25
25
|
/**
|
|
26
26
|
* Apply all bindings to target elements.
|
|
27
27
|
*
|
|
@@ -37,6 +37,9 @@ import { type BindingTargets } from './template-dom';
|
|
|
37
37
|
export declare const applyBindingsWithTargets: (bindings: Binding[], registerCleanup: RegisterCleanup, targets: BindingTargets, opts?: {
|
|
38
38
|
onHtml?: (b: HtmlBinding) => void;
|
|
39
39
|
}) => void;
|
|
40
|
+
export declare const applyBindingsInContainer: (container: ParentNode, bindings: Binding[], registerCleanup: RegisterCleanup, opts?: {
|
|
41
|
+
onHtml?: (b: HtmlBinding) => void;
|
|
42
|
+
}) => void;
|
|
40
43
|
/**
|
|
41
44
|
* Create an attribute binding descriptor.
|
|
42
45
|
* Called during template compilation for each attribute interpolation.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-bindings.d.ts","sourceRoot":"","sources":["../src/template-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,SAAS,EAAgC,MAAM,mBAAmB,CAAC;AAEtG,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAC;AAsBtD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,IAAI,WAAW,EAAE,SAAS,WAAW,EAAE,iBAAiB,eAAe,SA0CvG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,IAAI,WAAW,EAAE,SAAS,WAAW,EAAE,iBAAiB,eAAe,SAYvG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,IAAI,WAAW,EAAE,SAAS,YAAY,EAAE,iBAAiB,eAAe,SAiBzG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,IAAI,WAAW,EAAE,SAAS,UAAU,EAAE,iBAAiB,eAAe,SAyBrG,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,OAAO,EAAE,EACnB,iBAAiB,eAAe,EAChC,SAAS,cAAc,EACvB,OAAO;IAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;CAAE,SA4D7C,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,WAAW,UAAU,EACrB,UAAU,OAAO,EAAE,EACnB,iBAAiB,eAAe,EAChC,OAAO;IAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;CAAE,SAG7C,CAAC;AAQF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,MAAM,EAAE,OAAO,OAAO,KAAG,WAIpG,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,EAAE,OAAO,OAAO,KAAG,WAc7E,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{listen as e,setAttr as t}from"./internal.js";import{bindPropertyModel as n,hasWritableValueSetter as r,toReactiveBindingSource as i}from"./runtime-bindings.js";import{propRegistry as a}from"./props.js";import{indexBindings as o}from"./template-dom.js";import{effect as s,untrack as c}from"@vielzeug/stateit";var l=e=>Array.isArray(e)||typeof e==`object`&&!!e,u=(e,t,n)=>{n(s(()=>t(e.value)))},d=(e,n,r)=>{let i=r=>{let i=a.get(e)?.get(n.name);if(!i&&l(r)){e[n.name]=r;return}if((!i||i.reflect)&&(n.mode===`bool`?e.toggleAttribute(n.name,!!r):t(e,n.name,r)),!i)return;let o=l(r)?r:i.parse(n.mode===`bool`?r?``:null:r==null||r===!1?null:String(r));Object.is(c(()=>i.signal.value),o)||(i.signal.value=o)};n.signal?u(n.signal,i,r):i(n.value)},f=(e,t,r)=>{let i=n=>{e[t.name]=n};t.signal?u(t.signal,i,r):i(t.value),n(e,t.name,t.model,r)},p=(t,n,r)=>{let{modifiers:i}=n,a=i?{capture:!!i.capture,once:!!i.once,passive:!!i.passive}:void 0;r(e(t,n.name,e=>{i?.self&&e.target!==e.currentTarget||(i?.stop&&e.stopPropagation(),i?.prevent&&!i?.passive&&e.preventDefault(),n.handler(e))},a))},m=(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})},h=(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),u(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`:d(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:p(i,e,t);break;case`prop`:f(i,e,t);break;case`ref`:m(i,e,t);break}}}},g=(e,t,n,r)=>{h(t,n,o(e),r)},_=(e,t,n,r)=>{let a=i(r);return a?{mode:e,name:t,signal:a,type:`attr`,uid:n}:{mode:e,name:t,type:`attr`,uid:n,value:r}},v=(e,t,n)=>{let a=i(n);return a?{model:r(n)?n:void 0,name:e,signal:a,type:`prop`,uid:t}:{name:e,type:`prop`,uid:t,value:n}};export{g as applyBindingsInContainer,h as applyBindingsWithTargets,_ as createAttrBinding,v as createPropBinding};
|
|
2
|
+
//# sourceMappingURL=template-bindings.js.map
|