@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
package/dist/core/host.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{currentRuntime as e,effect as t,handle as n,onCleanup as r,onMount as i}from"./runtime-lifecycle.js";import{setAttr as a}from"./utilities.js";import{signal as o}from"@vielzeug/stateit";var s=new WeakMap,c=(t,n)=>{let r=e().el;s.has(r)||s.set(r,new Map),s.get(r).set(t,n)};function l(t,...n){let r=e().el;for(;r;){if(r instanceof HTMLElement){let e=s.get(r)?.get(t);if(e!==void 0)return e}let e=r.getRootNode();r=r.parentElement??(e instanceof ShadowRoot?e.host:null)}return n.length>0?n[0]:void 0}function u(e){return Symbol(e)}var d=(e,n,r)=>{e&&i(()=>{t(()=>{for(let t of r){let r=e[t]?.value;r!==void 0&&(n[t].value=r)}})})},f=new Set,p=(e,t,n)=>{let r=`${n}:${e.localName}:${t||`default`}`;f.has(r)||(f.add(r),console.warn(`[craftit:E10] ${n} could not find a matching <slot${t?` name="${t}"`:``}> in <${e.localName}>. Render the slot before using ${n}.`))},m=(t,n)=>{let i=e().el,a=t===`default`?``:t,o=a?`slot[name="${a}"]`:`slot:not([name])`,s=i.shadowRoot?.querySelector(o);if(!s){p(i,a,`onSlotChange()`);return}let c=()=>n(s.assignedElements({flatten:!0}));c(),s.addEventListener(`slotchange`,c),r(()=>s.removeEventListener(`slotchange`,c))},h=()=>{let t=e().el,n=new Map,r=e=>{if(n.has(e))return n.get(e);let r=o(!1);return n.set(e,r),i(()=>{let n=e?`slot[name="${e}"]`:`slot:not([name])`,i=t.shadowRoot?.querySelector(n);if(!i){p(t,e,`slots.has()`);return}let a=()=>{r.value=i.assignedNodes().length>0};return a(),i.addEventListener(`slotchange`,a),()=>i.removeEventListener(`slotchange`,a)}),r};return{has(e){return r(e===`default`?``:String(e))}}};function g(e,t){for(let[r,i]of Object.entries(t))if(r===`classMap`)v(e,i);else if(r.startsWith(`on`)&&r.length>2&&typeof i==`function`){let t=r.slice(2);n(e,t[0].toLowerCase()+t.slice(1),i)}else _(e,r,i)}function _(e,n,r){typeof r==`function`?t(()=>a(e,n,r())):a(e,n,r)}function v(e,n){let r=new Set;t(()=>{let t=new Set(Object.entries(n()).filter(([,e])=>e).map(([e])=>e));for(let n of r)t.has(n)||e.classList.remove(n);for(let n of t)r.has(n)||e.classList.add(n);r=t})}export{u as createContext,h as createSlots,l as inject,m as onSlotChange,c as provide,g as reflect,d as syncContextProps};
|
|
2
|
-
//# sourceMappingURL=host.js.map
|
package/dist/core/host.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","names":[],"sources":["../../src/core/host.ts"],"sourcesContent":["/**\n * Host utilities — component context injection, slot observation, and attribute/class reflection.\n *\n * - Context API (provide, inject, createContext, syncContextProps)\n * - Slot observation and detection (Slots type, createSlots, onSlotChange)\n * - Host element binding (reflect) for attributes, events, and classes\n */\n\nimport { type ReadonlySignal, type Signal, signal } from '@vielzeug/stateit';\n\n// Use the wrapped effect from runtime-lifecycle so reactive bindings are\n// automatically cleaned up on unmount — raw stateit effect has no lifecycle awareness.\nimport { currentRuntime, effect, handle, onCleanup, onMount } from './runtime-lifecycle';\nimport { setAttr } from './utilities';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONTEXT API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst contextRegistry = new WeakMap<HTMLElement, Map<InjectionKey<unknown> | string | symbol, unknown>>();\n\nexport type InjectionKey<T> = symbol & {\n readonly __craftit_injection_key?: T;\n};\n\nexport const provide = <T>(key: InjectionKey<T> | string | symbol, value: T): void => {\n const el = currentRuntime().el;\n\n if (!contextRegistry.has(el)) contextRegistry.set(el, new Map());\n\n contextRegistry.get(el)!.set(key, value);\n};\n\nexport function inject<T>(key: InjectionKey<T> | string | symbol): T | undefined;\nexport function inject<T>(key: InjectionKey<T> | string | symbol, fallback: T): T;\nexport function inject<T>(key: InjectionKey<T> | string | symbol, ...rest: [T?]): T | undefined {\n let node: Node | null = currentRuntime().el;\n\n while (node) {\n if (node instanceof HTMLElement) {\n const v = contextRegistry.get(node)?.get(key);\n\n if (v !== undefined) return v as T;\n }\n\n const root = node.getRootNode() as Node;\n\n node = (node as HTMLElement).parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n return rest.length > 0 ? rest[0] : undefined;\n}\n\nexport function createContext<T>(description?: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>;\n}\n\n/**\n * Reactively inherits prop values from a context object provided by an ancestor component.\n * For each key, when the context value is not `undefined`, it is written into the matching prop signal.\n * The effect is automatically cleaned up when the component unmounts.\n *\n * Deferred to `onMount` so context values win over HTML attribute values set on the child.\n *\n * @example\n * syncContextProps(inject(BUTTON_GROUP_CTX), props, ['color', 'size', 'variant']);\n */\nexport const syncContextProps = <\n K extends string,\n Ctx extends Partial<Record<K, ReadonlySignal<unknown>>>,\n Props extends Record<K, Signal<unknown>>,\n>(\n ctx: Ctx | undefined,\n props: Props,\n keys: K[],\n): void => {\n if (!ctx) return;\n\n onMount(() => {\n effect(() => {\n for (const k of keys) {\n const v = ctx[k]?.value;\n\n if (v !== undefined) props[k].value = v;\n }\n });\n });\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SLOTS API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst missingSlotWarnings = new Set<string>();\n\nconst warnMissingSlot = (el: HTMLElement, slotName: string, source: 'onSlotChange()' | 'slots.has()'): void => {\n const key = `${source}:${el.localName}:${slotName || 'default'}`;\n\n if (missingSlotWarnings.has(key)) return;\n\n missingSlotWarnings.add(key);\n console.warn(\n `[craftit:E10] ${source} could not find a matching <slot${slotName ? ` name=\"${slotName}\"` : ''}> in <${el.localName}>. Render the slot before using ${source}.`,\n );\n};\n\nexport type Slots<T extends Record<string, unknown> = Record<string, unknown>> = {\n /**\n * Returns a `ReadonlySignal<boolean>` that is `true` when the slot has assigned content.\n * Reactive — use the signal directly in templates, computed(), or effects.\n * @example const hasIcon = slots.has('icon'); // ReadonlySignal<boolean>\n */\n has(name: keyof T): ReadonlySignal<boolean>;\n};\n\n/**\n * Observes a slot and calls `callback` with assigned elements whenever they change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * onSlotChange('icon', (nodes) => setHasIcon(nodes.length > 0));\n * });\n */\nexport const onSlotChange = (slotName: string, callback: (elements: Element[]) => void): void => {\n const el = currentRuntime().el;\n const name = slotName === 'default' ? '' : slotName;\n const selector = name ? `slot[name=\"${name}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n\n if (!slot) {\n warnMissingSlot(el, name, 'onSlotChange()');\n\n return;\n }\n\n const handler = () => callback(slot.assignedElements({ flatten: true }));\n\n handler();\n slot.addEventListener('slotchange', handler);\n onCleanup(() => slot.removeEventListener('slotchange', handler));\n};\n\nexport const createSlots = <T extends Record<string, unknown> = Record<string, unknown>>(): Slots<T> => {\n const el = currentRuntime().el;\n const sigs = new Map<string, Signal<boolean>>();\n\n const get = (slotName: string): Signal<boolean> => {\n if (sigs.has(slotName)) return sigs.get(slotName)!;\n\n const s = signal(false);\n\n sigs.set(slotName, s);\n\n onMount(() => {\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n\n if (!slot) {\n warnMissingSlot(el, slotName, 'slots.has()');\n\n return;\n }\n\n const update = () => {\n s.value = slot.assignedNodes().length > 0;\n };\n\n update();\n slot.addEventListener('slotchange', update);\n\n return () => slot.removeEventListener('slotchange', update);\n });\n\n return s;\n };\n\n return {\n has(name: keyof T): ReadonlySignal<boolean> {\n return get(name === 'default' ? '' : String(name));\n },\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REFLECT API (HOST ATTRIBUTE/EVENT/CLASS BINDING)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Describes a reactive or static host binding (attribute, event, class).\n */\nexport type HostBindingValue =\n | (() => string | number | boolean | null | undefined)\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for `reflect()`.\n */\nexport type ReflectConfig = {\n [key: string]: HostBindingValue | ((e: Event) => void);\n classMap?: () => Record<string, boolean>;\n};\n\n/**\n * Reflect reactive attributes, events, and classes to a host element.\n * Must be called within a component setup context.\n *\n * - `on*` keys map to event listeners: `onClick` → `'click'`, `onValueChanged` → `'valueChanged'`\n * - `classMap` maps to a reactive class object\n * - all other keys map to attributes (static or reactive getter)\n *\n * @example\n * setup({ reflect }) {\n * reflect({\n * role: 'checkbox',\n * tabindex: () => props.disabled.value ? undefined : 0,\n * checked: () => props.checked.value,\n * classMap: () => ({ checked: props.checked.value }),\n * onClick: handleToggle,\n * });\n * }\n */\nexport function reflect(host: HTMLElement, config: ReflectConfig): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === 'classMap') {\n applyClassMap(host, value as () => Record<string, boolean>);\n } else if (key.startsWith('on') && key.length > 2 && typeof value === 'function') {\n // onClick → 'click', onValueChanged → 'valueChanged', onKeydown → 'keydown'\n const raw = key.slice(2);\n\n handle(host, raw[0].toLowerCase() + raw.slice(1), value as (e: Event) => void);\n } else {\n applyAttribute(host, key, value as HostBindingValue);\n }\n }\n}\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): void {\n if (typeof value === 'function') {\n effect(() => setAttr(host, name, (value as () => HostBindingValue)()));\n } else {\n setAttr(host, name, value);\n }\n}\n\nfunction applyClassMap(host: HTMLElement, getter: () => Record<string, boolean>): void {\n let prev = new Set<string>();\n\n effect(() => {\n const next = new Set(\n Object.entries(getter())\n .filter(([, active]) => active)\n .map(([cls]) => cls),\n );\n\n for (const cls of prev) if (!next.has(cls)) host.classList.remove(cls);\n for (const cls of next) if (!prev.has(cls)) host.classList.add(cls);\n\n prev = next;\n });\n}\n"],"mappings":"gMAmBA,IAAM,EAAkB,IAAI,QAMf,GAAc,EAAwC,IAAmB,CACpF,IAAM,EAAK,GAAgB,CAAC,GAEvB,EAAgB,IAAI,EAAG,EAAE,EAAgB,IAAI,EAAI,IAAI,IAAM,CAEhE,EAAgB,IAAI,EAAG,CAAE,IAAI,EAAK,EAAM,EAK1C,SAAgB,EAAU,EAAwC,GAAG,EAA2B,CAC9F,IAAI,EAAoB,GAAgB,CAAC,GAEzC,KAAO,GAAM,CACX,GAAI,aAAgB,YAAa,CAC/B,IAAM,EAAI,EAAgB,IAAI,EAAK,EAAE,IAAI,EAAI,CAE7C,GAAI,IAAM,IAAA,GAAW,OAAO,EAG9B,IAAM,EAAO,EAAK,aAAa,CAE/B,EAAQ,EAAqB,gBAAkB,aAAgB,WAAa,EAAK,KAAO,MAG1F,OAAO,EAAK,OAAS,EAAI,EAAK,GAAK,IAAA,GAGrC,SAAgB,EAAiB,EAAuC,CACtE,OAAO,OAAO,EAAY,CAa5B,IAAa,GAKX,EACA,EACA,IACS,CACJ,GAEL,MAAc,CACZ,MAAa,CACX,IAAK,IAAM,KAAK,EAAM,CACpB,IAAM,EAAI,EAAI,IAAI,MAEd,IAAM,IAAA,KAAW,EAAM,GAAG,MAAQ,KAExC,EACF,EAOE,EAAsB,IAAI,IAE1B,GAAmB,EAAiB,EAAkB,IAAmD,CAC7G,IAAM,EAAM,GAAG,EAAO,GAAG,EAAG,UAAU,GAAG,GAAY,YAEjD,EAAoB,IAAI,EAAI,GAEhC,EAAoB,IAAI,EAAI,CAC5B,QAAQ,KACN,iBAAiB,EAAO,kCAAkC,EAAW,UAAU,EAAS,GAAK,GAAG,QAAQ,EAAG,UAAU,kCAAkC,EAAO,GAC/J,GAqBU,GAAgB,EAAkB,IAAkD,CAC/F,IAAM,EAAK,GAAgB,CAAC,GACtB,EAAO,IAAa,UAAY,GAAK,EACrC,EAAW,EAAO,cAAc,EAAK,IAAM,mBAC3C,EAAO,EAAG,YAAY,cAA+B,EAAS,CAEpE,GAAI,CAAC,EAAM,CACT,EAAgB,EAAI,EAAM,iBAAiB,CAE3C,OAGF,IAAM,MAAgB,EAAS,EAAK,iBAAiB,CAAE,QAAS,GAAM,CAAC,CAAC,CAExE,GAAS,CACT,EAAK,iBAAiB,aAAc,EAAQ,CAC5C,MAAgB,EAAK,oBAAoB,aAAc,EAAQ,CAAC,EAGrD,MAA2F,CACtG,IAAM,EAAK,GAAgB,CAAC,GACtB,EAAO,IAAI,IAEX,EAAO,GAAsC,CACjD,GAAI,EAAK,IAAI,EAAS,CAAE,OAAO,EAAK,IAAI,EAAS,CAEjD,IAAM,EAAI,EAAO,GAAM,CAwBvB,OAtBA,EAAK,IAAI,EAAU,EAAE,CAErB,MAAc,CACZ,IAAM,EAAW,EAAW,cAAc,EAAS,IAAM,mBACnD,EAAO,EAAG,YAAY,cAA+B,EAAS,CAEpE,GAAI,CAAC,EAAM,CACT,EAAgB,EAAI,EAAU,cAAc,CAE5C,OAGF,IAAM,MAAe,CACnB,EAAE,MAAQ,EAAK,eAAe,CAAC,OAAS,GAM1C,OAHA,GAAQ,CACR,EAAK,iBAAiB,aAAc,EAAO,KAE9B,EAAK,oBAAoB,aAAc,EAAO,EAC3D,CAEK,GAGT,MAAO,CACL,IAAI,EAAwC,CAC1C,OAAO,EAAI,IAAS,UAAY,GAAK,OAAO,EAAK,CAAC,EAErD,EA6CH,SAAgB,EAAQ,EAAmB,EAA6B,CACtE,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAO,CAC/C,GAAI,IAAQ,WACV,EAAc,EAAM,EAAuC,SAClD,EAAI,WAAW,KAAK,EAAI,EAAI,OAAS,GAAK,OAAO,GAAU,WAAY,CAEhF,IAAM,EAAM,EAAI,MAAM,EAAE,CAExB,EAAO,EAAM,EAAI,GAAG,aAAa,CAAG,EAAI,MAAM,EAAE,CAAE,EAA4B,MAE9E,EAAe,EAAM,EAAK,EAA0B,CAK1D,SAAS,EAAe,EAAmB,EAAc,EAA+B,CAClF,OAAO,GAAU,WACnB,MAAa,EAAQ,EAAM,EAAO,GAAkC,CAAC,CAAC,CAEtE,EAAQ,EAAM,EAAM,EAAM,CAI9B,SAAS,EAAc,EAAmB,EAA6C,CACrF,IAAI,EAAO,IAAI,IAEf,MAAa,CACX,IAAM,EAAO,IAAI,IACf,OAAO,QAAQ,GAAQ,CAAC,CACrB,QAAQ,EAAG,KAAY,EAAO,CAC9B,KAAK,CAAC,KAAS,EAAI,CACvB,CAED,IAAK,IAAM,KAAO,EAAW,EAAK,IAAI,EAAI,EAAE,EAAK,UAAU,OAAO,EAAI,CACtE,IAAK,IAAM,KAAO,EAAW,EAAK,IAAI,EAAI,EAAE,EAAK,UAAU,IAAI,EAAI,CAEnE,EAAO,GACP"}
|
package/dist/core/internal.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
require(`@vielzeug/stateit`);var e=Symbol(`craftit.htmlResultBrand`);function t(){return{value:null}}function n(){return[]}function r(t,n=[]){let r={__bindings:n,__html:t,toString(){return t}};return Object.defineProperty(r,e,{configurable:!1,enumerable:!1,value:!0,writable:!1}),r}var i=t=>typeof t==`object`&&!!t&&t[e]===!0;function a(e){return typeof e==`string`?{bindings:[],html:e}:{bindings:e.__bindings,html:e.__html}}var o=Symbol(`craftit.eachSignal`);exports.EACH_SIGNAL=o,exports.extractResult=a,exports.htmlResult=r,exports.isHtmlResult=i,exports.ref=t,exports.refs=n;
|
|
2
|
-
//# sourceMappingURL=internal.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal.cjs","names":[],"sources":["../../src/core/internal.ts"],"sourcesContent":["/**\n * @internal — Binding type system and engine internals.\n *\n * These types define the contract between the template compiler and binding engine.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Public-facing types (HTMLResult, Directive, Ref, RefCallback, Refs) are\n * re-exported from the main entry point.\n */\n\nimport { type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nconst HTML_RESULT_BRAND: unique symbol = Symbol('craftit.htmlResultBrand');\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Ref<T extends Element> {\n value: T | null;\n}\n\nexport function ref<T extends Element>(): Ref<T> {\n return { value: null };\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTML RESULT\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __html: string;\n toString(): string;\n}\n\n/** @internal — construct an HTMLResult from a pre-built html string and bindings. */\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n const result = {\n __bindings: bindings,\n __html: html,\n toString() {\n return html;\n },\n };\n\n Object.defineProperty(result, HTML_RESULT_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return result as HTMLResult;\n}\n\n/** @internal — strict HTMLResult runtime type guard. */\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && !!value && (value as Record<symbol, unknown>)[HTML_RESULT_BRAND] === true;\n\n/** @internal — extract html and bindings from a string or HTMLResult. */\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DIRECTIVES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DirectiveContext {\n /** The cleanup registration function for the component. */\n registerCleanup: (fn: () => void) => void;\n}\n\nexport interface Directive {\n /** Invoked when the element is mounted in the DOM. */\n mount?(el: HTMLElement, context: DirectiveContext): void;\n /** Invoked by the template engine to render content (interpolation directives). */\n render?(): HTMLResult | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BINDING TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type PropBinding = {\n /** Optional writable source used for native two-way bridge (.value/.checked). */\n model?: Signal<unknown>;\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'prop';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n modifiers?: {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n prevent?: boolean;\n self?: boolean;\n stop?: boolean;\n };\n name: string;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type CallbackBinding = {\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;\n type: 'callback';\n uid: string;\n};\n\nexport type HtmlBinding = {\n keyed?: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n type: 'html';\n uid: string;\n};\n\nexport type Binding =\n | TextBinding\n | AttrBinding\n | PropBinding\n | EventBinding\n | RefBinding\n | CallbackBinding\n | HtmlBinding;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL MARKERS & CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — opaque marker for each() reactive results. */\nexport const EACH_SIGNAL: unique symbol = Symbol('craftit.eachSignal');\n\n/** @internal — binding element identifier attribute. */\nexport const CF_ID_ATTR = 'u';\n"],"mappings":"6BAYA,IAAM,EAAmC,OAAO,0BAA0B,CAU1E,SAAgB,GAAiC,CAC/C,MAAO,CAAE,MAAO,KAAM,CAKxB,SAAgB,GAAmC,CACjD,MAAO,EAAE,CAgBX,SAAgB,EAAW,EAAc,EAAsB,EAAE,CAAc,CAC7E,IAAM,EAAS,CACb,WAAY,EACZ,OAAQ,EACR,UAAW,CACT,OAAO,GAEV,CASD,OAPA,OAAO,eAAe,EAAQ,EAAmB,CAC/C,aAAc,GACd,WAAY,GACZ,MAAO,GACP,SAAU,GACX,CAAC,CAEK,EAIT,IAAa,EAAgB,GAC3B,OAAO,GAAU,UAAY,CAAC,CAAC,GAAU,EAAkC,KAAuB,GAGpG,SAAgB,EAAc,EAA+D,CAC3F,OAAO,OAAO,GAAM,SAAW,CAAE,SAAU,EAAE,CAAE,KAAM,EAAG,CAAG,CAAE,SAAU,EAAE,WAAY,KAAM,EAAE,OAAQ,CAqGvG,IAAa,EAA6B,OAAO,qBAAqB"}
|
package/dist/core/internal.d.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @internal — Binding type system and engine internals.
|
|
3
|
-
*
|
|
4
|
-
* These types define the contract between the template compiler and binding engine.
|
|
5
|
-
* They are NOT part of the public API and importing directly is an unstable contract.
|
|
6
|
-
*
|
|
7
|
-
* Public-facing types (HTMLResult, Directive, Ref, RefCallback, Refs) are
|
|
8
|
-
* re-exported from the main entry point.
|
|
9
|
-
*/
|
|
10
|
-
import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';
|
|
11
|
-
export interface Ref<T extends Element> {
|
|
12
|
-
value: T | null;
|
|
13
|
-
}
|
|
14
|
-
export declare function ref<T extends Element>(): Ref<T>;
|
|
15
|
-
export type Refs<T extends Element> = T[];
|
|
16
|
-
export declare function refs<T extends Element>(): Refs<T>;
|
|
17
|
-
export type RefCallback<T extends Element> = (el: T | null) => void;
|
|
18
|
-
export interface HTMLResult {
|
|
19
|
-
__bindings: Binding[];
|
|
20
|
-
__html: string;
|
|
21
|
-
toString(): string;
|
|
22
|
-
}
|
|
23
|
-
/** @internal — construct an HTMLResult from a pre-built html string and bindings. */
|
|
24
|
-
export declare function htmlResult(html: string, bindings?: Binding[]): HTMLResult;
|
|
25
|
-
/** @internal — strict HTMLResult runtime type guard. */
|
|
26
|
-
export declare const isHtmlResult: (value: unknown) => value is HTMLResult;
|
|
27
|
-
/** @internal — extract html and bindings from a string or HTMLResult. */
|
|
28
|
-
export declare function extractResult(v: string | HTMLResult): {
|
|
29
|
-
bindings: Binding[];
|
|
30
|
-
html: string;
|
|
31
|
-
};
|
|
32
|
-
export interface DirectiveContext {
|
|
33
|
-
/** The cleanup registration function for the component. */
|
|
34
|
-
registerCleanup: (fn: () => void) => void;
|
|
35
|
-
}
|
|
36
|
-
export interface Directive {
|
|
37
|
-
/** Invoked when the element is mounted in the DOM. */
|
|
38
|
-
mount?(el: HTMLElement, context: DirectiveContext): void;
|
|
39
|
-
/** Invoked by the template engine to render content (interpolation directives). */
|
|
40
|
-
render?(): HTMLResult | string;
|
|
41
|
-
}
|
|
42
|
-
export type TextBinding = {
|
|
43
|
-
signal: ReadonlySignal<unknown>;
|
|
44
|
-
type: 'text';
|
|
45
|
-
uid: string;
|
|
46
|
-
};
|
|
47
|
-
export type AttrBinding = {
|
|
48
|
-
mode: 'bool' | 'attr';
|
|
49
|
-
name: string;
|
|
50
|
-
signal?: ReadonlySignal<unknown>;
|
|
51
|
-
type: 'attr';
|
|
52
|
-
uid: string;
|
|
53
|
-
value?: unknown;
|
|
54
|
-
};
|
|
55
|
-
export type PropBinding = {
|
|
56
|
-
/** Optional writable source used for native two-way bridge (.value/.checked). */
|
|
57
|
-
model?: Signal<unknown>;
|
|
58
|
-
name: string;
|
|
59
|
-
signal?: ReadonlySignal<unknown>;
|
|
60
|
-
type: 'prop';
|
|
61
|
-
uid: string;
|
|
62
|
-
value?: unknown;
|
|
63
|
-
};
|
|
64
|
-
export type EventBinding = {
|
|
65
|
-
handler: (e: Event) => void;
|
|
66
|
-
modifiers?: {
|
|
67
|
-
capture?: boolean;
|
|
68
|
-
once?: boolean;
|
|
69
|
-
passive?: boolean;
|
|
70
|
-
prevent?: boolean;
|
|
71
|
-
self?: boolean;
|
|
72
|
-
stop?: boolean;
|
|
73
|
-
};
|
|
74
|
-
name: string;
|
|
75
|
-
type: 'event';
|
|
76
|
-
uid: string;
|
|
77
|
-
};
|
|
78
|
-
export type RefBinding = {
|
|
79
|
-
ref: Ref<Element> | Refs<Element> | RefCallback<Element>;
|
|
80
|
-
type: 'ref';
|
|
81
|
-
uid: string;
|
|
82
|
-
};
|
|
83
|
-
export type CallbackBinding = {
|
|
84
|
-
apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;
|
|
85
|
-
type: 'callback';
|
|
86
|
-
uid: string;
|
|
87
|
-
};
|
|
88
|
-
export type HtmlBinding = {
|
|
89
|
-
keyed?: boolean;
|
|
90
|
-
signal: ReadonlySignal<{
|
|
91
|
-
bindings: Binding[];
|
|
92
|
-
html: string;
|
|
93
|
-
items?: Array<{
|
|
94
|
-
bindings: Binding[];
|
|
95
|
-
html: string;
|
|
96
|
-
}>;
|
|
97
|
-
keys?: (string | number)[];
|
|
98
|
-
}>;
|
|
99
|
-
type: 'html';
|
|
100
|
-
uid: string;
|
|
101
|
-
};
|
|
102
|
-
export type Binding = TextBinding | AttrBinding | PropBinding | EventBinding | RefBinding | CallbackBinding | HtmlBinding;
|
|
103
|
-
/** @internal — opaque marker for each() reactive results. */
|
|
104
|
-
export declare const EACH_SIGNAL: unique symbol;
|
|
105
|
-
/** @internal — binding element identifier attribute. */
|
|
106
|
-
export declare const CF_ID_ATTR = "u";
|
|
107
|
-
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/core/internal.ts"],"names":[],"mappings":"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"}
|
package/dist/core/internal.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"@vielzeug/stateit";var e=Symbol(`craftit.htmlResultBrand`);function t(){return{value:null}}function n(){return[]}function r(t,n=[]){let r={__bindings:n,__html:t,toString(){return t}};return Object.defineProperty(r,e,{configurable:!1,enumerable:!1,value:!0,writable:!1}),r}var i=t=>typeof t==`object`&&!!t&&t[e]===!0;function a(e){return typeof e==`string`?{bindings:[],html:e}:{bindings:e.__bindings,html:e.__html}}var o=Symbol(`craftit.eachSignal`);export{o as EACH_SIGNAL,a as extractResult,r as htmlResult,i as isHtmlResult,t as ref,n as refs};
|
|
2
|
-
//# sourceMappingURL=internal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","names":[],"sources":["../../src/core/internal.ts"],"sourcesContent":["/**\n * @internal — Binding type system and engine internals.\n *\n * These types define the contract between the template compiler and binding engine.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Public-facing types (HTMLResult, Directive, Ref, RefCallback, Refs) are\n * re-exported from the main entry point.\n */\n\nimport { type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nconst HTML_RESULT_BRAND: unique symbol = Symbol('craftit.htmlResultBrand');\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Ref<T extends Element> {\n value: T | null;\n}\n\nexport function ref<T extends Element>(): Ref<T> {\n return { value: null };\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTML RESULT\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __html: string;\n toString(): string;\n}\n\n/** @internal — construct an HTMLResult from a pre-built html string and bindings. */\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n const result = {\n __bindings: bindings,\n __html: html,\n toString() {\n return html;\n },\n };\n\n Object.defineProperty(result, HTML_RESULT_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return result as HTMLResult;\n}\n\n/** @internal — strict HTMLResult runtime type guard. */\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && !!value && (value as Record<symbol, unknown>)[HTML_RESULT_BRAND] === true;\n\n/** @internal — extract html and bindings from a string or HTMLResult. */\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DIRECTIVES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DirectiveContext {\n /** The cleanup registration function for the component. */\n registerCleanup: (fn: () => void) => void;\n}\n\nexport interface Directive {\n /** Invoked when the element is mounted in the DOM. */\n mount?(el: HTMLElement, context: DirectiveContext): void;\n /** Invoked by the template engine to render content (interpolation directives). */\n render?(): HTMLResult | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BINDING TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type PropBinding = {\n /** Optional writable source used for native two-way bridge (.value/.checked). */\n model?: Signal<unknown>;\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'prop';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n modifiers?: {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n prevent?: boolean;\n self?: boolean;\n stop?: boolean;\n };\n name: string;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type CallbackBinding = {\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;\n type: 'callback';\n uid: string;\n};\n\nexport type HtmlBinding = {\n keyed?: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n type: 'html';\n uid: string;\n};\n\nexport type Binding =\n | TextBinding\n | AttrBinding\n | PropBinding\n | EventBinding\n | RefBinding\n | CallbackBinding\n | HtmlBinding;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL MARKERS & CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — opaque marker for each() reactive results. */\nexport const EACH_SIGNAL: unique symbol = Symbol('craftit.eachSignal');\n\n/** @internal — binding element identifier attribute. */\nexport const CF_ID_ATTR = 'u';\n"],"mappings":"0BAYA,IAAM,EAAmC,OAAO,0BAA0B,CAU1E,SAAgB,GAAiC,CAC/C,MAAO,CAAE,MAAO,KAAM,CAKxB,SAAgB,GAAmC,CACjD,MAAO,EAAE,CAgBX,SAAgB,EAAW,EAAc,EAAsB,EAAE,CAAc,CAC7E,IAAM,EAAS,CACb,WAAY,EACZ,OAAQ,EACR,UAAW,CACT,OAAO,GAEV,CASD,OAPA,OAAO,eAAe,EAAQ,EAAmB,CAC/C,aAAc,GACd,WAAY,GACZ,MAAO,GACP,SAAU,GACX,CAAC,CAEK,EAIT,IAAa,EAAgB,GAC3B,OAAO,GAAU,UAAY,CAAC,CAAC,GAAU,EAAkC,KAAuB,GAGpG,SAAgB,EAAc,EAA+D,CAC3F,OAAO,OAAO,GAAM,SAAW,CAAE,SAAU,EAAE,CAAE,KAAM,EAAG,CAAG,CAAE,SAAU,EAAE,WAAY,KAAM,EAAE,OAAQ,CAqGvG,IAAa,EAA6B,OAAO,qBAAqB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./utilities.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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-bindings.cjs","names":[],"sources":["../../src/core/runtime-bindings.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './utilities';\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":"sEAMA,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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-bindings.d.ts","sourceRoot":"","sources":["../../src/core/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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{listen as e}from"./utilities.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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-bindings.js","names":[],"sources":["../../src/core/runtime-bindings.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './utilities';\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":"mGAMA,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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
require(`./utilities.cjs`);let e=require(`@vielzeug/stateit`);var t=[],n=()=>{let e=t[t.length-1];if(!e)throw Error(`[craftit:E1] lifecycle outside setup`);return e},r=e=>{n().onMount.push(e)},i=r=>{t.length>0?n().cleanups.push(r):(0,e.onCleanup)(r)},a=e=>{n().errorHandlers.push(e)},o=e=>{t.length>0&&i(e)},s=(t,n)=>{let r=(0,e.effect)(t,n);return o(r),r};function c(t,n,r){if(Array.isArray(t)){let i=r,a=!1,s=!1,c=(0,e.effect)(()=>{for(let e of t)e.value;if(a)(0,e.untrack)(n),i?.once&&c();else if(a=!0,i?.immediate&&((0,e.untrack)(n),i.once)){s=!0;return}});return o(c),s&&c(),c}let i=(0,e.watch)(t,n,r);return o(i),i}function l(e,t,n,r){e&&(e.addEventListener(t,n,r),i(()=>e.removeEventListener(t,n,r)))}var u={bubbles:!0,cancelable:!0,composed:!0},d={basic(e,t,n={}){return e.dispatchEvent(new Event(t,{...u,...n}))},custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...u,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...u,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...u,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...u,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...u,...n})):e.dispatchEvent(new CustomEvent(t,{...u,...n}))}};function f(e,t){let r=t===void 0?n().el:e,i=t===void 0?e:t,a=(e,t)=>{let n=`aria-${e}`,i=typeof t==`function`?t():t;i==null||i===!1?r.removeAttribute(n):r.setAttribute(n,String(i))},o=Object.entries(i).map(([e,t])=>s(()=>a(e,t)));if(t!==void 0)return()=>{for(let e of o)e()}}exports.aria=f,exports.autoCleanup=o,exports.currentRuntime=n,exports.effect=s,exports.fire=d,exports.handle=l,exports.onCleanup=i,exports.onError=a,exports.onMount=r,exports.runtimeStack=t,exports.watch=c;
|
|
2
|
-
//# sourceMappingURL=runtime-lifecycle.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-lifecycle.cjs","names":[],"sources":["../../src/core/runtime-lifecycle.ts"],"sourcesContent":["import {\n effect as _effect,\n onCleanup as _onCleanup,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n untrack,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { type CSSResult } from './utilities';\n\n// ─── Component runtime ────────────────────────────────────────────────────────\nexport type ComponentRuntime = {\n cleanups: CleanupFn[];\n el: HTMLElement;\n errorHandlers: ((err: unknown) => void)[];\n onMount: (() => CleanupFn | undefined | void)[];\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\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\n// ─── Lifecycle hooks ──────────────────────────────────────────────────────────\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\n\n/**\n * Registers a cleanup function.\n * - Inside a component setup or `onMount` callback: runs when the component\n * unmounts. Prefer {@link onCleanup} for explicit lifecycle cleanup.\n * - Outside a component context (e.g. inside a plain `effect()`): delegates to\n * stateit's `onCleanup`, which runs before each effect re-run.\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\n/**\n * Registers a scoped error handler for this component.\n * Called when an unhandled error is thrown during setup, `onMount` callbacks,\n * or rendering. If no handler is registered, errors are logged to the console.\n *\n * @example\n * defineComponent({\n * setup() {\n * onError((err) => console.error('Component error:', err));\n * // ... rest of setup\n * return html``;\n * },\n * tag: 'my-component',\n * });\n */\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\n\n/** @internal — Cleanup only when inside a component context. */\nexport const autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\n/**\n * Creates a reactive effect that re-runs whenever its signal dependencies change.\n * When called inside a component setup function or `onMount` callback, the effect is\n * automatically cleaned up when the component unmounts — no manual `onCleanup` needed.\n * Outside a component context, behaves identically to stateit's `effect`.\n *\n * @example\n * // Inside setup — auto-cleaned on unmount:\n * effect(() => { document.title = props.title.value; });\n *\n * // Inside onMount — also auto-cleaned:\n * onMount(() => { effect(() => syncExternal(data.value)); });\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\n// ─── Watch ────────────────────────────────────────────────────────────────────\n/**\n * Watch a signal or array of signals for changes and call a callback.\n * Auto-cleaned on unmount when called during setup.\n *\n * Single signal: callback receives (next, prev) values.\n * Multiple signals: callback receives no args, fires when any signal changes.\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 sources: ReadonlyArray<ReadonlySignal<unknown>>,\n cb: () => void,\n options?: WatchOptions<unknown>,\n): Subscription;\nexport function watch(\n source: ReadonlySignal<unknown> | ReadonlyArray<ReadonlySignal<unknown>>,\n cb: ((value: unknown, prev: unknown) => void) | (() => void),\n options?: WatchOptions<unknown>,\n): Subscription {\n if (Array.isArray(source)) {\n const opts = options;\n let initialized = false;\n let pendingDispose = false;\n const dispose = _effect(() => {\n for (const s of source) void s.value; // register all listed deps\n\n if (!initialized) {\n initialized = true;\n\n if (opts?.immediate) {\n untrack(cb as () => void);\n\n if (opts.once) {\n pendingDispose = true;\n\n return;\n }\n }\n } else {\n untrack(cb as () => void);\n\n if (opts?.once) dispose();\n }\n });\n\n autoCleanup(dispose);\n\n if (pendingDispose) dispose();\n\n return dispose;\n }\n\n const stop = _watch(source as ReadonlySignal<unknown>, cb as (value: unknown, prev: unknown) => void, options);\n\n autoCleanup(stop);\n\n return stop;\n}\n\n// ─── Event helpers ────────────────────────────────────────────────────────────\n/**\n * Register an event listener with automatic cleanup on unmount.\n * Use inside onMount() for auto-cleanup, or handle() return value manually.\n *\n * @example\n * onMount(() => {\n * handle(host, 'click', onClick);\n * handle(window, 'resize', onResize);\n * // auto-cleanup\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\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n basic(target: EventTarget, type: string, options?: EventInit): boolean;\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 basic(target, type, options = {}) {\n return target.dispatchEvent(new Event(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\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\n// ─── ARIA helpers ────────────────────────────────────────────────────────────\ntype AriaAttrValue =\n | (() => string | boolean | number | null | undefined)\n | string\n | boolean\n | number\n | null\n | undefined;\n\n/**\n * Reactively set ARIA attributes on an element.\n *\n * - `aria(attrs)` — targets the component host (call during setup)\n * - `aria(target, attrs)` — targets any element; returns a cleanup function\n *\n * Pass getter functions for reactive values. Plain values are set once.\n * `null`, `undefined`, or `false` remove the attribute.\n *\n * @example\n * // Host (during setup):\n * aria({ role: 'checkbox', checked: () => checked.value });\n *\n * // Inner element (inside onMount):\n * onMount(() => {\n * return aria(inputEl, { invalid: () => !!error.value });\n * });\n */\nexport function aria(attrs: Record<string, AriaAttrValue>): void;\nexport function aria(target: Element, attrs: Record<string, AriaAttrValue>): CleanupFn;\nexport function aria(\n targetOrAttrs: Element | Record<string, AriaAttrValue>,\n maybeAttrs?: Record<string, AriaAttrValue>,\n): CleanupFn | undefined {\n const target = maybeAttrs !== undefined ? (targetOrAttrs as Element) : currentRuntime().el;\n const attrs = maybeAttrs !== undefined ? maybeAttrs : (targetOrAttrs as Record<string, AriaAttrValue>);\n\n const applyAttr = (name: string, val: AriaAttrValue) => {\n const attrName = `aria-${name}`;\n const value = typeof val === 'function' ? (val as () => AriaAttrValue)() : val;\n\n if (value === null || value === undefined || value === false) {\n target.removeAttribute(attrName);\n } else {\n target.setAttribute(attrName, String(value));\n }\n };\n\n // Each key gets its own effect so changes to one attr don't re-apply all others.\n const stops = Object.entries(attrs).map(([name, val]) => effect(() => applyAttr(name, val)));\n\n if (maybeAttrs !== undefined) {\n return () => {\n for (const stop of stops) stop();\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { type CleanupFn, type EffectCallback, type EffectOptions, type ReadonlySignal, type Subscription, type WatchOptions } from '@vielzeug/stateit';
|
|
2
|
-
import { type CSSResult } from './utilities';
|
|
3
|
-
export type ComponentRuntime = {
|
|
4
|
-
cleanups: CleanupFn[];
|
|
5
|
-
el: HTMLElement;
|
|
6
|
-
errorHandlers: ((err: unknown) => void)[];
|
|
7
|
-
onMount: (() => CleanupFn | undefined | void)[];
|
|
8
|
-
styles?: (string | CSSStyleSheet | CSSResult)[];
|
|
9
|
-
};
|
|
10
|
-
export declare const runtimeStack: ComponentRuntime[];
|
|
11
|
-
export declare const currentRuntime: () => ComponentRuntime;
|
|
12
|
-
export declare const onMount: (fn: () => CleanupFn | undefined | void) => void;
|
|
13
|
-
/**
|
|
14
|
-
* Registers a cleanup function.
|
|
15
|
-
* - Inside a component setup or `onMount` callback: runs when the component
|
|
16
|
-
* unmounts. Prefer {@link onCleanup} for explicit lifecycle cleanup.
|
|
17
|
-
* - Outside a component context (e.g. inside a plain `effect()`): delegates to
|
|
18
|
-
* stateit's `onCleanup`, which runs before each effect re-run.
|
|
19
|
-
*/
|
|
20
|
-
export declare const onCleanup: (fn: CleanupFn) => void;
|
|
21
|
-
/**
|
|
22
|
-
* Registers a scoped error handler for this component.
|
|
23
|
-
* Called when an unhandled error is thrown during setup, `onMount` callbacks,
|
|
24
|
-
* or rendering. If no handler is registered, errors are logged to the console.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* defineComponent({
|
|
28
|
-
* setup() {
|
|
29
|
-
* onError((err) => console.error('Component error:', err));
|
|
30
|
-
* // ... rest of setup
|
|
31
|
-
* return html``;
|
|
32
|
-
* },
|
|
33
|
-
* tag: 'my-component',
|
|
34
|
-
* });
|
|
35
|
-
*/
|
|
36
|
-
export declare const onError: (fn: (err: unknown) => void) => void;
|
|
37
|
-
/** @internal — Cleanup only when inside a component context. */
|
|
38
|
-
export declare const autoCleanup: (dispose: Subscription | CleanupFn) => void;
|
|
39
|
-
/**
|
|
40
|
-
* Creates a reactive effect that re-runs whenever its signal dependencies change.
|
|
41
|
-
* When called inside a component setup function or `onMount` callback, the effect is
|
|
42
|
-
* automatically cleaned up when the component unmounts — no manual `onCleanup` needed.
|
|
43
|
-
* Outside a component context, behaves identically to stateit's `effect`.
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* // Inside setup — auto-cleaned on unmount:
|
|
47
|
-
* effect(() => { document.title = props.title.value; });
|
|
48
|
-
*
|
|
49
|
-
* // Inside onMount — also auto-cleaned:
|
|
50
|
-
* onMount(() => { effect(() => syncExternal(data.value)); });
|
|
51
|
-
*/
|
|
52
|
-
export declare const effect: (fn: EffectCallback, options?: EffectOptions) => Subscription;
|
|
53
|
-
/**
|
|
54
|
-
* Watch a signal or array of signals for changes and call a callback.
|
|
55
|
-
* Auto-cleaned on unmount when called during setup.
|
|
56
|
-
*
|
|
57
|
-
* Single signal: callback receives (next, prev) values.
|
|
58
|
-
* Multiple signals: callback receives no args, fires when any signal changes.
|
|
59
|
-
*/
|
|
60
|
-
export declare function watch<T>(source: ReadonlySignal<T>, cb: (value: T, prev: T) => void, options?: WatchOptions<T>): Subscription;
|
|
61
|
-
export declare function watch(sources: ReadonlyArray<ReadonlySignal<unknown>>, cb: () => void, options?: WatchOptions<unknown>): Subscription;
|
|
62
|
-
/**
|
|
63
|
-
* Register an event listener with automatic cleanup on unmount.
|
|
64
|
-
* Use inside onMount() for auto-cleanup, or handle() return value manually.
|
|
65
|
-
*
|
|
66
|
-
* @example
|
|
67
|
-
* onMount(() => {
|
|
68
|
-
* handle(host, 'click', onClick);
|
|
69
|
-
* handle(window, 'resize', onResize);
|
|
70
|
-
* // auto-cleanup
|
|
71
|
-
* });
|
|
72
|
-
*/
|
|
73
|
-
export declare function handle<K extends keyof HTMLElementEventMap>(target: EventTarget | null | undefined, event: K, listener: (e: HTMLElementEventMap[K]) => void, options?: AddEventListenerOptions): void;
|
|
74
|
-
export declare function handle(target: EventTarget | null | undefined, event: string, listener: EventListener, options?: AddEventListenerOptions): void;
|
|
75
|
-
export type FireApi = {
|
|
76
|
-
basic(target: EventTarget, type: string, options?: EventInit): boolean;
|
|
77
|
-
custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;
|
|
78
|
-
event(target: EventTarget, event: Event): boolean;
|
|
79
|
-
focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;
|
|
80
|
-
keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;
|
|
81
|
-
mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;
|
|
82
|
-
touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;
|
|
83
|
-
};
|
|
84
|
-
/**
|
|
85
|
-
* Dispatch DOM events explicitly without guessing constructors from the event name.
|
|
86
|
-
*
|
|
87
|
-
* @example
|
|
88
|
-
* fire.mouse(el, 'click');
|
|
89
|
-
* fire.keyboard(el, 'keydown', { key: 'Enter' });
|
|
90
|
-
* fire.custom(el, 'change', { detail: { value: 42 } });
|
|
91
|
-
* fire.event(el, new PointerEvent('pointerdown'));
|
|
92
|
-
*/
|
|
93
|
-
export declare const fire: FireApi;
|
|
94
|
-
type AriaAttrValue = (() => string | boolean | number | null | undefined) | string | boolean | number | null | undefined;
|
|
95
|
-
/**
|
|
96
|
-
* Reactively set ARIA attributes on an element.
|
|
97
|
-
*
|
|
98
|
-
* - `aria(attrs)` — targets the component host (call during setup)
|
|
99
|
-
* - `aria(target, attrs)` — targets any element; returns a cleanup function
|
|
100
|
-
*
|
|
101
|
-
* Pass getter functions for reactive values. Plain values are set once.
|
|
102
|
-
* `null`, `undefined`, or `false` remove the attribute.
|
|
103
|
-
*
|
|
104
|
-
* @example
|
|
105
|
-
* // Host (during setup):
|
|
106
|
-
* aria({ role: 'checkbox', checked: () => checked.value });
|
|
107
|
-
*
|
|
108
|
-
* // Inner element (inside onMount):
|
|
109
|
-
* onMount(() => {
|
|
110
|
-
* return aria(inputEl, { invalid: () => !!error.value });
|
|
111
|
-
* });
|
|
112
|
-
*/
|
|
113
|
-
export declare function aria(attrs: Record<string, AriaAttrValue>): void;
|
|
114
|
-
export declare function aria(target: Element, attrs: Record<string, AriaAttrValue>): CleanupFn;
|
|
115
|
-
export {};
|
|
116
|
-
//# sourceMappingURL=runtime-lifecycle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/runtime-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"./utilities.js";import{effect as e,onCleanup as t,untrack as n,watch as r}from"@vielzeug/stateit";var i=[],a=()=>{let e=i[i.length-1];if(!e)throw Error(`[craftit:E1] lifecycle outside setup`);return e},o=e=>{a().onMount.push(e)},s=e=>{i.length>0?a().cleanups.push(e):t(e)},c=e=>{a().errorHandlers.push(e)},l=e=>{i.length>0&&s(e)},u=(t,n)=>{let r=e(t,n);return l(r),r};function d(t,i,a){if(Array.isArray(t)){let r=a,o=!1,s=!1,c=e(()=>{for(let e of t)e.value;if(o)n(i),r?.once&&c();else if(o=!0,r?.immediate&&(n(i),r.once)){s=!0;return}});return l(c),s&&c(),c}let o=r(t,i,a);return l(o),o}function f(e,t,n,r){e&&(e.addEventListener(t,n,r),s(()=>e.removeEventListener(t,n,r)))}var p={bubbles:!0,cancelable:!0,composed:!0},m={basic(e,t,n={}){return e.dispatchEvent(new Event(t,{...p,...n}))},custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...p,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...p,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...p,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...p,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...p,...n})):e.dispatchEvent(new CustomEvent(t,{...p,...n}))}};function h(e,t){let n=t===void 0?a().el:e,r=t===void 0?e:t,i=(e,t)=>{let r=`aria-${e}`,i=typeof t==`function`?t():t;i==null||i===!1?n.removeAttribute(r):n.setAttribute(r,String(i))},o=Object.entries(r).map(([e,t])=>u(()=>i(e,t)));if(t!==void 0)return()=>{for(let e of o)e()}}export{h as aria,l as autoCleanup,a as currentRuntime,u as effect,m as fire,f as handle,s as onCleanup,c as onError,o as onMount,i as runtimeStack,d as watch};
|
|
2
|
-
//# sourceMappingURL=runtime-lifecycle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-lifecycle.js","names":[],"sources":["../../src/core/runtime-lifecycle.ts"],"sourcesContent":["import {\n effect as _effect,\n onCleanup as _onCleanup,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n untrack,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { type CSSResult } from './utilities';\n\n// ─── Component runtime ────────────────────────────────────────────────────────\nexport type ComponentRuntime = {\n cleanups: CleanupFn[];\n el: HTMLElement;\n errorHandlers: ((err: unknown) => void)[];\n onMount: (() => CleanupFn | undefined | void)[];\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\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\n// ─── Lifecycle hooks ──────────────────────────────────────────────────────────\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\n\n/**\n * Registers a cleanup function.\n * - Inside a component setup or `onMount` callback: runs when the component\n * unmounts. Prefer {@link onCleanup} for explicit lifecycle cleanup.\n * - Outside a component context (e.g. inside a plain `effect()`): delegates to\n * stateit's `onCleanup`, which runs before each effect re-run.\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\n/**\n * Registers a scoped error handler for this component.\n * Called when an unhandled error is thrown during setup, `onMount` callbacks,\n * or rendering. If no handler is registered, errors are logged to the console.\n *\n * @example\n * defineComponent({\n * setup() {\n * onError((err) => console.error('Component error:', err));\n * // ... rest of setup\n * return html``;\n * },\n * tag: 'my-component',\n * });\n */\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\n\n/** @internal — Cleanup only when inside a component context. */\nexport const autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\n/**\n * Creates a reactive effect that re-runs whenever its signal dependencies change.\n * When called inside a component setup function or `onMount` callback, the effect is\n * automatically cleaned up when the component unmounts — no manual `onCleanup` needed.\n * Outside a component context, behaves identically to stateit's `effect`.\n *\n * @example\n * // Inside setup — auto-cleaned on unmount:\n * effect(() => { document.title = props.title.value; });\n *\n * // Inside onMount — also auto-cleaned:\n * onMount(() => { effect(() => syncExternal(data.value)); });\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\n// ─── Watch ────────────────────────────────────────────────────────────────────\n/**\n * Watch a signal or array of signals for changes and call a callback.\n * Auto-cleaned on unmount when called during setup.\n *\n * Single signal: callback receives (next, prev) values.\n * Multiple signals: callback receives no args, fires when any signal changes.\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 sources: ReadonlyArray<ReadonlySignal<unknown>>,\n cb: () => void,\n options?: WatchOptions<unknown>,\n): Subscription;\nexport function watch(\n source: ReadonlySignal<unknown> | ReadonlyArray<ReadonlySignal<unknown>>,\n cb: ((value: unknown, prev: unknown) => void) | (() => void),\n options?: WatchOptions<unknown>,\n): Subscription {\n if (Array.isArray(source)) {\n const opts = options;\n let initialized = false;\n let pendingDispose = false;\n const dispose = _effect(() => {\n for (const s of source) void s.value; // register all listed deps\n\n if (!initialized) {\n initialized = true;\n\n if (opts?.immediate) {\n untrack(cb as () => void);\n\n if (opts.once) {\n pendingDispose = true;\n\n return;\n }\n }\n } else {\n untrack(cb as () => void);\n\n if (opts?.once) dispose();\n }\n });\n\n autoCleanup(dispose);\n\n if (pendingDispose) dispose();\n\n return dispose;\n }\n\n const stop = _watch(source as ReadonlySignal<unknown>, cb as (value: unknown, prev: unknown) => void, options);\n\n autoCleanup(stop);\n\n return stop;\n}\n\n// ─── Event helpers ────────────────────────────────────────────────────────────\n/**\n * Register an event listener with automatic cleanup on unmount.\n * Use inside onMount() for auto-cleanup, or handle() return value manually.\n *\n * @example\n * onMount(() => {\n * handle(host, 'click', onClick);\n * handle(window, 'resize', onResize);\n * // auto-cleanup\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\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n basic(target: EventTarget, type: string, options?: EventInit): boolean;\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 basic(target, type, options = {}) {\n return target.dispatchEvent(new Event(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\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\n// ─── ARIA helpers ────────────────────────────────────────────────────────────\ntype AriaAttrValue =\n | (() => string | boolean | number | null | undefined)\n | string\n | boolean\n | number\n | null\n | undefined;\n\n/**\n * Reactively set ARIA attributes on an element.\n *\n * - `aria(attrs)` — targets the component host (call during setup)\n * - `aria(target, attrs)` — targets any element; returns a cleanup function\n *\n * Pass getter functions for reactive values. Plain values are set once.\n * `null`, `undefined`, or `false` remove the attribute.\n *\n * @example\n * // Host (during setup):\n * aria({ role: 'checkbox', checked: () => checked.value });\n *\n * // Inner element (inside onMount):\n * onMount(() => {\n * return aria(inputEl, { invalid: () => !!error.value });\n * });\n */\nexport function aria(attrs: Record<string, AriaAttrValue>): void;\nexport function aria(target: Element, attrs: Record<string, AriaAttrValue>): CleanupFn;\nexport function aria(\n targetOrAttrs: Element | Record<string, AriaAttrValue>,\n maybeAttrs?: Record<string, AriaAttrValue>,\n): CleanupFn | undefined {\n const target = maybeAttrs !== undefined ? (targetOrAttrs as Element) : currentRuntime().el;\n const attrs = maybeAttrs !== undefined ? maybeAttrs : (targetOrAttrs as Record<string, AriaAttrValue>);\n\n const applyAttr = (name: string, val: AriaAttrValue) => {\n const attrName = `aria-${name}`;\n const value = typeof val === 'function' ? (val as () => AriaAttrValue)() : val;\n\n if (value === null || value === undefined || value === false) {\n target.removeAttribute(attrName);\n } else {\n target.setAttribute(attrName, String(value));\n }\n };\n\n // Each key gets its own effect so changes to one attr don't re-apply all others.\n const stops = Object.entries(attrs).map(([name, val]) => effect(() => applyAttr(name, val)));\n\n if (maybeAttrs !== undefined) {\n return () => {\n for (const stop of stops) stop();\n };\n }\n}\n"],"mappings":"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"}
|
package/dist/core/runtime.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require(`./runtime-lifecycle.cjs`),require(`./runtime-bindings.cjs`);
|
package/dist/core/runtime.d.ts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export { aria, effect, fire, handle, onCleanup, onError, onMount, watch, autoCleanup, currentRuntime, runtimeStack, type ComponentRuntime, } from './runtime-lifecycle';
|
|
2
|
-
export { bindPropertyModel, hasWritableValueSetter, toReactiveBindingSource, type RegisterPropertyCleanup, } from './runtime-bindings';
|
|
3
|
-
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,oBAAoB,CAAC"}
|
package/dist/core/runtime.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./runtime-lifecycle.js";import"./runtime-bindings.js";
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
require(`./internal.cjs`);const e=require(`./runtime-lifecycle.cjs`),t=require(`./utilities.cjs`),n=require(`./runtime-bindings.cjs`);require(`./template-dom.cjs`);const r=require(`./component.cjs`);require(`@vielzeug/stateit`);var i=e=>Array.isArray(e)||typeof e==`object`&&!!e,a=(t,n,r)=>{r(e.effect(()=>n(t.value)))},o=(e,n,o)=>{let s=a=>{let o=r.propRegistry.get(e)?.get(n.name);if(!o&&i(a)){e[n.name]=a;return}if((!o||o.reflect)&&(n.mode===`bool`?e.toggleAttribute(n.name,!!a):t.setAttr(e,n.name,a)),!o)return;let s=i(a)?a:o.parse(n.mode===`bool`?a?``:null:a==null||a===!1?null:String(a));Object.is(o.signal.peek(),s)||(o.signal.value=s)};n.signal?a(n.signal,s,o):s(n.value)},s=(e,t,r)=>{let i=n=>{e[t.name]=n};t.signal?a(t.signal,i,r):i(t.value),n.bindPropertyModel(e,t.name,t.model,r)},c=(e,n,r)=>{let{modifiers:i}=n,a=i?{capture:!!i.capture,once:!!i.once,passive:!!i.passive}:void 0;r(t.listen(e,n.name,e=>{i?.self&&e.target!==e.currentTarget||(i?.stop&&e.stopPropagation(),i?.prevent&&!i?.passive&&e.preventDefault(),n.handler(e))},a))},l=(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})},u=(e,t,n,r)=>{let i=new Map;for(let o of e){let e=o.uid;if(o.type===`text`){let r=n.comments.get(e);if(r){let i=document.createTextNode(``);r.replaceWith(i),n.comments.delete(e),a(o.signal,e=>{i.textContent=String(e)},t)}}else o.type===`html`?r?.onHtml?.(o):(i.has(e)||i.set(e,[]),i.get(e).push(o))}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`:o(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:c(i,e,t);break;case`prop`:s(i,e,t);break;case`ref`:l(i,e,t);break}}}},d=(e,t,r,i)=>{let a=n.toReactiveBindingSource(i);return a?{mode:e,name:t,signal:a,type:`attr`,uid:r}:{mode:e,name:t,type:`attr`,uid:r,value:i}},f=(e,t,r)=>{let i=n.toReactiveBindingSource(r);return i?{model:n.hasWritableValueSetter(r)?r:void 0,name:e,signal:i,type:`prop`,uid:t}:{name:e,type:`prop`,uid:t,value:r}};exports.applyBindingsWithTargets=u,exports.createAttrBinding=d,exports.createPropBinding=f;
|
|
2
|
-
//# sourceMappingURL=template-bindings.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-bindings.cjs","names":[],"sources":["../../src/core/template-bindings.ts"],"sourcesContent":["import { type CleanupFn, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { propRegistry } from './component';\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 { bindPropertyModel } from './runtime-bindings';\nimport { effect } from './runtime-lifecycle';\nimport { listen, setAttr } from './utilities';\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(effect(() => 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 (!Object.is(meta.signal.peek(), parsedValue)) {\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\nimport { type BindingTargets } from './template-dom';\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\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-bindings.d.ts","sourceRoot":"","sources":["../../src/core/template-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,mBAAmB,CAAC;AAGxE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAKpB,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,SAqCvG,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,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;;;;;;;;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;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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"./internal.js";import{effect as e}from"./runtime-lifecycle.js";import{listen as t,setAttr as n}from"./utilities.js";import{bindPropertyModel as r,hasWritableValueSetter as i,toReactiveBindingSource as a}from"./runtime-bindings.js";import"./template-dom.js";import{propRegistry as o}from"./component.js";import"@vielzeug/stateit";var s=e=>Array.isArray(e)||typeof e==`object`&&!!e,c=(t,n,r)=>{r(e(()=>n(t.value)))},l=(e,t,r)=>{let i=r=>{let i=o.get(e)?.get(t.name);if(!i&&s(r)){e[t.name]=r;return}if((!i||i.reflect)&&(t.mode===`bool`?e.toggleAttribute(t.name,!!r):n(e,t.name,r)),!i)return;let a=s(r)?r:i.parse(t.mode===`bool`?r?``:null:r==null||r===!1?null:String(r));Object.is(i.signal.peek(),a)||(i.signal.value=a)};t.signal?c(t.signal,i,r):i(t.value)},u=(e,t,n)=>{let i=n=>{e[t.name]=n};t.signal?c(t.signal,i,n):i(t.value),r(e,t.name,t.model,n)},d=(e,n,r)=>{let{modifiers:i}=n,a=i?{capture:!!i.capture,once:!!i.once,passive:!!i.passive}:void 0;r(t(e,n.name,e=>{i?.self&&e.target!==e.currentTarget||(i?.stop&&e.stopPropagation(),i?.prevent&&!i?.passive&&e.preventDefault(),n.handler(e))},a))},f=(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})},p=(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),c(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`:l(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:d(i,e,t);break;case`prop`:u(i,e,t);break;case`ref`:f(i,e,t);break}}}},m=(e,t,n,r)=>{let i=a(r);return i?{mode:e,name:t,signal:i,type:`attr`,uid:n}:{mode:e,name:t,type:`attr`,uid:n,value:r}},h=(e,t,n)=>{let r=a(n);return r?{model:i(n)?n:void 0,name:e,signal:r,type:`prop`,uid:t}:{name:e,type:`prop`,uid:t,value:n}};export{p as applyBindingsWithTargets,m as createAttrBinding,h as createPropBinding};
|
|
2
|
-
//# sourceMappingURL=template-bindings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-bindings.js","names":[],"sources":["../../src/core/template-bindings.ts"],"sourcesContent":["import { type CleanupFn, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { propRegistry } from './component';\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 { bindPropertyModel } from './runtime-bindings';\nimport { effect } from './runtime-lifecycle';\nimport { listen, setAttr } from './utilities';\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(effect(() => 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 (!Object.is(meta.signal.peek(), parsedValue)) {\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\nimport { type BindingTargets } from './template-dom';\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\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,2 +0,0 @@
|
|
|
1
|
-
const e=require(`./internal.cjs`),t=require(`./utilities.cjs`),n=require(`./template-bindings.cjs`);let r=require(`@vielzeug/stateit`);var i=RegExp(`u="([^"]+)"`,`g`),a=e=>e.replace(/>\s+</g,`><`).trim(),o=[{kind:`event`,regex:/\s+@([a-zA-Z_][-a-zA-Z0-9_.]*)\s*=\s*["']?$/},{kind:`ref`,regex:/\s+ref\s*=\s*["']?$/},{kind:`specialAttr`,regex:/\s+([:?])([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`prop`,regex:/\.([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`plainAttr`,regex:/\s+([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/}],s=new WeakMap,c=e=>{let[t,...n]=e.split(`.`),r={};for(let e of n)e===`capture`?r.capture=!0:e===`once`?r.once=!0:e===`passive`?r.passive=!0:e===`prevent`?r.prevent=!0:e===`self`?r.self=!0:e===`stop`&&(r.stop=!0);return{modifiers:Object.keys(r).length?r:void 0,name:t}},l=e=>{let t=[];for(let n=0;n<e.length-1;n++){let r=e[n],i=!1;for(let e of o){let n=e.regex.exec(r);if(!n)continue;let a=r.slice(0,-n[0].length);if(i=!0,e.kind===`event`){let e=c(n[1]);t.push({kind:`event`,modifiers:e.modifiers,name:e.name,prefix:a,raw:r})}else e.kind===`ref`?t.push({kind:`ref`,prefix:a,raw:r}):e.kind===`specialAttr`?t.push({kind:`specialAttr`,mode:n[1]===`?`?`bool`:`attr`,name:n[2],prefix:a,raw:r}):e.kind===`prop`?t.push({kind:`prop`,name:n[1],prefix:a,raw:r}):e.kind===`plainAttr`&&t.push({kind:`plainAttr`,name:n[1],prefix:a,raw:r});break}i||t.push({kind:`node`,prefix:r,raw:r})}return{slots:t,tail:e[e.length-1]??``}},u=e=>{let t=s.get(e);return t||(t=l(e),s.set(e,t)),t},d=()=>{let e=0;return()=>String(e++)},f=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(i,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},p=t=>typeof t!=`object`||!t||!(e.EACH_SIGNAL in t)?null:t[e.EACH_SIGNAL],m=n=>typeof n==`string`?t.escapeHtml(n):n==null?``:e.isHtmlResult(n)?n.__html:t.escapeHtml(String(n)),h=(t,n)=>{let i={bindings:[],html:``},a=(0,r.signal)(i);return n(()=>{let n=t(),r=Array.isArray(n)?n:[n],o=d(),s=``,c=[];for(let t of r)if(e.isHtmlResult(t)){let e=f(t,o);s+=e.html,c.push(...e.bindings)}else s+=m(t);let l=c.length!==i.bindings.length||c.some((e,t)=>e!==i.bindings[t]);(s!==i.html||l)&&(i={bindings:c,html:s},a.value=i)}),{bindings:[],signal:a}},g=(t,n)=>{let i=p(t);if(i)return{keyed:!0,signal:i};if(typeof t==`function`&&!(0,r.isSignal)(t)){let{signal:e}=h(t,n);return{keyed:!1,signal:e}}return(0,r.isSignal)(t)&&e.isHtmlResult(t.value)?{keyed:!1,signal:(0,r.computed)(()=>{let n=t.value;if(!e.isHtmlResult(n))return{bindings:[],html:m(n)};let r=f(n,d());return{bindings:r.bindings,html:r.html}})}:null},_=()=>{},v=(t,i,o)=>{let s=u(t),c=``,l=[],p=null,h=d(),_=e=>e.lastIndexOf(`<`)>e.lastIndexOf(`>`),v=e=>((!p||_(e))&&(p=h()),p),y=()=>{p=null};for(let t=0;t<s.slots.length;t++){let a=s.slots[t],u=i[t];if(a.kind===`event`){if(typeof u==`function`){let e=v(a.prefix);c+=`${a.prefix} u="${e}"`,l.push({handler:u,modifiers:a.modifiers,name:a.name,type:`event`,uid:e})}else c+=a.raw;continue}if(a.kind===`ref`){if(u){let e=v(a.prefix);c+=`${a.prefix} u="${e}"`,l.push({ref:u,type:`ref`,uid:e})}else c+=a.raw;continue}if(a.kind===`specialAttr`){let e=v(a.prefix);c+=`${a.prefix} u="${e}"`,l.push(n.createAttrBinding(a.mode,a.name,e,u));continue}if(a.kind===`prop`){let e=v(a.prefix);c+=`${a.prefix} u="${e}"`,l.push(n.createPropBinding(a.name,e,u));continue}if(a.kind===`plainAttr`){let e=v(a.prefix);c+=`${a.prefix} u="${e}"`,l.push(n.createAttrBinding(`attr`,a.name,e,u));continue}if(typeof u==`object`&&u&&(`mount`in u||`render`in u)){let t=`render`in u,n=t?h():v(a.raw);t?c+=`${a.raw}<!--${n}-->`:c+=`${a.raw} u="${n}"`;let i=u.mount?.bind(u);if(i&&l.push({apply:(e,t)=>{i(e,{registerCleanup:t})},type:`callback`,uid:n}),t){let t=u.render.bind(u),i={bindings:[],html:``},a=(0,r.signal)(i);o(()=>{let n=t(),r=Array.isArray(n)?n:[n],o=d(),s=``,c=[];for(let t of r)if(e.isHtmlResult(t)){let e=f(t,o);s+=e.html,c.push(...e.bindings)}else s+=m(t);let l=c.length!==i.bindings.length||c.some((e,t)=>e!==i.bindings[t]);(s!==i.html||l)&&(i={bindings:c,html:s},a.value=i)}),l.push({keyed:!1,signal:a,type:`html`,uid:n})}continue}y();let p=g(u,o);if(p){let e=h();c+=`${a.raw}<!--${e}-->`,l.push({keyed:p.keyed,signal:p.signal,type:`html`,uid:e});continue}if(Array.isArray(u)){let t=``;for(let n of u)if(e.isHtmlResult(n)){let e=f(n,h);t+=e.html,l.push(...e.bindings)}else t+=m(n);c+=a.raw+t;continue}if((0,r.isSignal)(u)){let e=h();c+=`${a.raw}<!--${e}-->`,l.push({signal:u,type:`text`,uid:e})}else if(e.isHtmlResult(u)){let e=f(u,h);c+=a.raw+e.html,l.push(...e.bindings)}else c+=a.raw+m(u)}return c+=s.tail,e.htmlResult(a(c),l)};exports.compileTemplate=v,exports.resetTemplateCompilerState=_;
|
|
2
|
-
//# sourceMappingURL=template-compiler.cjs.map
|