@vielzeug/craftit 2.0.1 → 3.0.1
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 +60 -108
- 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/choice-field-control.cjs +2 -0
- package/dist/controls/choice-field-control.cjs.map +1 -0
- package/dist/controls/choice-field-control.d.ts +3 -0
- package/dist/controls/choice-field-control.d.ts.map +1 -0
- package/dist/controls/choice-field-control.js +2 -0
- package/dist/controls/choice-field-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 +111 -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 +12 -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 +21 -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 +23 -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/overlay-control.cjs +2 -0
- package/dist/controls/overlay-control.cjs.map +1 -0
- package/dist/{labs/overlay.d.ts → controls/overlay-control.d.ts} +19 -14
- 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/popup-list-control.cjs +2 -0
- package/dist/controls/popup-list-control.cjs.map +1 -0
- package/dist/controls/popup-list-control.d.ts +160 -0
- package/dist/controls/popup-list-control.d.ts.map +1 -0
- package/dist/controls/popup-list-control.js +2 -0
- package/dist/controls/popup-list-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/swipe-control.cjs +2 -0
- package/dist/controls/swipe-control.cjs.map +1 -0
- package/dist/controls/swipe-control.d.ts +32 -0
- package/dist/controls/swipe-control.d.ts.map +1 -0
- package/dist/controls/swipe-control.js +2 -0
- package/dist/controls/swipe-control.js.map +1 -0
- package/dist/controls/text-field-control.cjs +2 -0
- package/dist/controls/text-field-control.cjs.map +1 -0
- package/dist/controls/text-field-control.d.ts +3 -0
- package/dist/controls/text-field-control.d.ts.map +1 -0
- package/dist/controls/text-field-control.js +2 -0
- package/dist/controls/text-field-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/classMap.cjs +2 -0
- package/dist/directives/classMap.cjs.map +1 -0
- package/dist/directives/classMap.d.ts +19 -0
- package/dist/directives/classMap.d.ts.map +1 -0
- package/dist/directives/classMap.js +2 -0
- package/dist/directives/classMap.js.map +1 -0
- package/dist/directives/each.cjs +1 -1
- package/dist/directives/each.cjs.map +1 -1
- package/dist/directives/each.d.ts +12 -49
- 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/guard.cjs +2 -0
- package/dist/directives/guard.cjs.map +1 -0
- package/dist/directives/guard.d.ts +10 -0
- package/dist/directives/guard.d.ts.map +1 -0
- package/dist/directives/guard.js +2 -0
- package/dist/directives/guard.js.map +1 -0
- package/dist/directives/live.cjs +2 -0
- package/dist/directives/live.cjs.map +1 -0
- package/dist/directives/live.d.ts +23 -0
- package/dist/directives/live.d.ts.map +1 -0
- package/dist/directives/live.js +2 -0
- package/dist/directives/live.js.map +1 -0
- package/dist/directives/raw.cjs +1 -1
- package/dist/directives/raw.cjs.map +1 -1
- package/dist/directives/raw.d.ts +4 -6
- 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/resource.cjs +2 -0
- package/dist/directives/resource.cjs.map +1 -0
- package/dist/directives/resource.d.ts +32 -0
- package/dist/directives/resource.d.ts.map +1 -0
- package/dist/directives/resource.js +2 -0
- package/dist/directives/resource.js.map +1 -0
- package/dist/directives/styleMap.cjs +2 -0
- package/dist/directives/styleMap.cjs.map +1 -0
- package/dist/directives/styleMap.d.ts +11 -0
- package/dist/directives/styleMap.d.ts.map +1 -0
- package/dist/directives/styleMap.js +2 -0
- package/dist/directives/styleMap.js.map +1 -0
- package/dist/directives/when.cjs +1 -1
- package/dist/directives/when.cjs.map +1 -1
- package/dist/directives/when.d.ts +7 -14
- 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/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/form.cjs +2 -0
- package/dist/form.cjs.map +1 -0
- package/dist/form.d.ts +15 -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 +78 -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 +16 -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 +111 -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 +5 -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/mutation-observe.cjs +2 -0
- package/dist/observers/mutation-observe.cjs.map +1 -0
- package/dist/observers/mutation-observe.d.ts +10 -0
- package/dist/observers/mutation-observe.d.ts.map +1 -0
- package/dist/observers/mutation-observe.js +2 -0
- package/dist/observers/mutation-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 +39 -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 +38 -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.cjs +2 -0
- package/dist/runtime.cjs.map +1 -0
- package/dist/runtime.d.ts +33 -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/template-bindings.d.ts +25 -0
- 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/template-compiler.d.ts +4 -0
- 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/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} +18 -11
- 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 +21 -22
- 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 +0 -6
- 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 +0 -59
- 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 +0 -25
- 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 +0 -13
- package/dist/core/template-dom.d.ts.map +0 -1
- package/dist/core/template-dom.js +0 -2
- package/dist/core/template-dom.js.map +0 -1
- package/dist/core/template-html.cjs +0 -2
- package/dist/core/template-html.cjs.map +0 -1
- package/dist/core/template-html.d.ts +0 -26
- 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 +0 -11
- 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/attr.cjs +0 -2
- package/dist/directives/attr.cjs.map +0 -1
- package/dist/directives/attr.d.ts +0 -14
- package/dist/directives/attr.d.ts.map +0 -1
- package/dist/directives/attr.js +0 -2
- package/dist/directives/attr.js.map +0 -1
- package/dist/directives/bind.cjs +0 -2
- package/dist/directives/bind.cjs.map +0 -1
- package/dist/directives/bind.d.ts +0 -30
- package/dist/directives/bind.d.ts.map +0 -1
- package/dist/directives/bind.js +0 -2
- package/dist/directives/bind.js.map +0 -1
- package/dist/directives/choose.cjs +0 -2
- package/dist/directives/choose.cjs.map +0 -1
- package/dist/directives/choose.d.ts +0 -34
- package/dist/directives/choose.d.ts.map +0 -1
- package/dist/directives/choose.js +0 -2
- package/dist/directives/choose.js.map +0 -1
- package/dist/directives/classes.cjs +0 -2
- package/dist/directives/classes.cjs.map +0 -1
- package/dist/directives/classes.d.ts +0 -20
- package/dist/directives/classes.d.ts.map +0 -1
- package/dist/directives/classes.js +0 -2
- package/dist/directives/classes.js.map +0 -1
- package/dist/directives/index.cjs +0 -1
- package/dist/directives/index.d.ts +0 -14
- package/dist/directives/index.d.ts.map +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/directives/memo.cjs +0 -2
- package/dist/directives/memo.cjs.map +0 -1
- package/dist/directives/memo.d.ts +0 -23
- package/dist/directives/memo.d.ts.map +0 -1
- package/dist/directives/memo.js +0 -2
- package/dist/directives/memo.js.map +0 -1
- package/dist/directives/on.cjs +0 -2
- package/dist/directives/on.cjs.map +0 -1
- package/dist/directives/on.d.ts +0 -25
- package/dist/directives/on.d.ts.map +0 -1
- package/dist/directives/on.js +0 -2
- package/dist/directives/on.js.map +0 -1
- package/dist/directives/spread.cjs +0 -2
- package/dist/directives/spread.cjs.map +0 -1
- package/dist/directives/spread.d.ts +0 -14
- package/dist/directives/spread.d.ts.map +0 -1
- package/dist/directives/spread.js +0 -2
- package/dist/directives/spread.js.map +0 -1
- package/dist/directives/style.cjs +0 -2
- package/dist/directives/style.cjs.map +0 -1
- package/dist/directives/style.d.ts +0 -22
- package/dist/directives/style.d.ts.map +0 -1
- package/dist/directives/style.js +0 -2
- package/dist/directives/style.js.map +0 -1
- package/dist/directives/until.cjs +0 -2
- package/dist/directives/until.cjs.map +0 -1
- package/dist/directives/until.d.ts +0 -26
- package/dist/directives/until.d.ts.map +0 -1
- package/dist/directives/until.js +0 -2
- package/dist/directives/until.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.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/directives/bind.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind.cjs","names":[],"sources":["../../src/directives/bind.ts"],"sourcesContent":["import { type Signal } from '@vielzeug/stateit';\n\nimport { type Directive } from '../core/internal';\nimport { attr } from './attr';\n\n/**\n * Creates a two-way binding between a writable Signal and a form element.\n *\n * - **`Signal<string>`** (`<input>`, `<textarea>`): syncs `.value` via the `input` event.\n * - **`Signal<string>`** (`<select>`): syncs `.value` via the `change` event.\n * - **`Signal<boolean>`** (checkbox/radio): auto-detected from the element's `type` attribute;\n * syncs `.checked` via the `change` event.\n *\n * Internally this reuses craftit's shared property-binding path, so `.value`,\n * `.checked`, `attr(...)`, and `spread({ '.value': ... })` stay in sync.\n *\n * Use in spread position on any form element.\n *\n * @example\n * import { bind } from '@vielzeug/craftit/directives';\n *\n * const name = signal('');\n * html`<input ${bind(name)} />`\n *\n * const accepted = signal(false);\n * html`<input type=\"checkbox\" ${bind(accepted)} />`\n *\n * const size = signal('');\n * html`<select ${bind(size)}><option value=\"sm\">S</option></select>`\n */\nexport function bind(sig: Signal<boolean>): Directive;\nexport function bind(sig: Signal<string>): Directive;\nexport function bind(sig: Signal<boolean> | Signal<string>): Directive {\n return {\n mount(el, context) {\n const input = el as HTMLInputElement;\n const isToggle = input.type === 'checkbox' || input.type === 'radio';\n\n (isToggle ? attr({ checked: sig as Signal<boolean> }) : attr({ value: sig as Signal<string> })).mount!(\n el,\n context,\n );\n },\n };\n}\n"],"mappings":"2FAgCA,SAAgB,EAAK,EAAkD,CACrE,MAAO,CACL,MAAM,EAAI,EAAS,CACjB,IAAM,EAAQ,GACG,EAAM,OAAS,YAAc,EAAM,OAAS,QAEjD,EAAA,KAAK,CAAE,QAAS,EAAwB,CAAC,CAAG,EAAA,KAAK,CAAE,MAAO,EAAuB,CAAC,EAAE,MAC9F,EACA,EACD,EAEJ"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { type Signal } from '@vielzeug/stateit';
|
|
2
|
-
import { type Directive } from '../core/internal';
|
|
3
|
-
/**
|
|
4
|
-
* Creates a two-way binding between a writable Signal and a form element.
|
|
5
|
-
*
|
|
6
|
-
* - **`Signal<string>`** (`<input>`, `<textarea>`): syncs `.value` via the `input` event.
|
|
7
|
-
* - **`Signal<string>`** (`<select>`): syncs `.value` via the `change` event.
|
|
8
|
-
* - **`Signal<boolean>`** (checkbox/radio): auto-detected from the element's `type` attribute;
|
|
9
|
-
* syncs `.checked` via the `change` event.
|
|
10
|
-
*
|
|
11
|
-
* Internally this reuses craftit's shared property-binding path, so `.value`,
|
|
12
|
-
* `.checked`, `attr(...)`, and `spread({ '.value': ... })` stay in sync.
|
|
13
|
-
*
|
|
14
|
-
* Use in spread position on any form element.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* import { bind } from '@vielzeug/craftit/directives';
|
|
18
|
-
*
|
|
19
|
-
* const name = signal('');
|
|
20
|
-
* html`<input ${bind(name)} />`
|
|
21
|
-
*
|
|
22
|
-
* const accepted = signal(false);
|
|
23
|
-
* html`<input type="checkbox" ${bind(accepted)} />`
|
|
24
|
-
*
|
|
25
|
-
* const size = signal('');
|
|
26
|
-
* html`<select ${bind(size)}><option value="sm">S</option></select>`
|
|
27
|
-
*/
|
|
28
|
-
export declare function bind(sig: Signal<boolean>): Directive;
|
|
29
|
-
export declare function bind(sig: Signal<string>): Directive;
|
|
30
|
-
//# sourceMappingURL=bind.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../src/directives/bind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;AACtD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC"}
|
package/dist/directives/bind.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind.js","names":[],"sources":["../../src/directives/bind.ts"],"sourcesContent":["import { type Signal } from '@vielzeug/stateit';\n\nimport { type Directive } from '../core/internal';\nimport { attr } from './attr';\n\n/**\n * Creates a two-way binding between a writable Signal and a form element.\n *\n * - **`Signal<string>`** (`<input>`, `<textarea>`): syncs `.value` via the `input` event.\n * - **`Signal<string>`** (`<select>`): syncs `.value` via the `change` event.\n * - **`Signal<boolean>`** (checkbox/radio): auto-detected from the element's `type` attribute;\n * syncs `.checked` via the `change` event.\n *\n * Internally this reuses craftit's shared property-binding path, so `.value`,\n * `.checked`, `attr(...)`, and `spread({ '.value': ... })` stay in sync.\n *\n * Use in spread position on any form element.\n *\n * @example\n * import { bind } from '@vielzeug/craftit/directives';\n *\n * const name = signal('');\n * html`<input ${bind(name)} />`\n *\n * const accepted = signal(false);\n * html`<input type=\"checkbox\" ${bind(accepted)} />`\n *\n * const size = signal('');\n * html`<select ${bind(size)}><option value=\"sm\">S</option></select>`\n */\nexport function bind(sig: Signal<boolean>): Directive;\nexport function bind(sig: Signal<string>): Directive;\nexport function bind(sig: Signal<boolean> | Signal<string>): Directive {\n return {\n mount(el, context) {\n const input = el as HTMLInputElement;\n const isToggle = input.type === 'checkbox' || input.type === 'radio';\n\n (isToggle ? attr({ checked: sig as Signal<boolean> }) : attr({ value: sig as Signal<string> })).mount!(\n el,\n context,\n );\n },\n };\n}\n"],"mappings":"uFAgCA,SAAgB,EAAK,EAAkD,CACrE,MAAO,CACL,MAAM,EAAI,EAAS,CACjB,IAAM,EAAQ,GACG,EAAM,OAAS,YAAc,EAAM,OAAS,QAEjD,EAAK,CAAE,QAAS,EAAwB,CAAC,CAAG,EAAK,CAAE,MAAO,EAAuB,CAAC,EAAE,MAC9F,EACA,EACD,EAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"choose.cjs","names":[],"sources":["../../src/directives/choose.ts"],"sourcesContent":["import { isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype TemplateFn = () => string | HTMLResult;\ntype CaseEntry<T> = readonly [T, TemplateFn];\n\n/**\n * Renders the template matching the current value — like a type-safe `switch`.\n * Cases are `[value, templateFn]` pairs evaluated with strict equality (`===`).\n *\n * The discriminant can be a static value, a reactive Signal, or a getter function.\n * When reactive, the rendered output updates automatically when the value changes.\n *\n * @example\n * import { choose } from '@vielzeug/craftit/directives';\n *\n * // Static\n * html`${choose(section, [\n * ['home', () => html`<h1>Home</h1>`],\n * ['about', () => html`<h1>About</h1>`],\n * ], () => html`<h1>Not found</h1>`)}`\n *\n * // Reactive signal — updates on change\n * const tab = signal('home');\n * html`${choose(tab, [\n * ['home', () => html`<home-panel>`],\n * ['about', () => html`<about-panel>`],\n * ])}`\n *\n * // Reactive getter\n * html`${choose(() => props.view.value, cases)}`\n */\nexport function choose<T extends PropertyKey>(\n value: ReadonlySignal<T> | (() => T),\n cases: ReadonlyArray<CaseEntry<T>>,\n defaultFn?: TemplateFn,\n): TemplateFn;\nexport function choose<T extends PropertyKey>(\n value: T,\n cases: ReadonlyArray<CaseEntry<T>>,\n defaultFn?: TemplateFn,\n): string | HTMLResult;\nexport function choose<T extends PropertyKey>(\n value: T | ReadonlySignal<T> | (() => T),\n cases: ReadonlyArray<CaseEntry<T>>,\n defaultFn?: TemplateFn,\n): string | HTMLResult | TemplateFn {\n const pick = (v: T): string | HTMLResult => {\n const entry = cases.find(([key]) => key === v);\n\n return entry ? entry[1]() : (defaultFn?.() ?? '');\n };\n\n if (isSignal(value)) {\n return () => pick((value as ReadonlySignal<T>).value);\n }\n\n if (typeof value === 'function') {\n return () => pick((value as () => T)());\n }\n\n return pick(value as T);\n}\n"],"mappings":"mCA2CA,SAAgB,EACd,EACA,EACA,EACkC,CAClC,IAAM,EAAQ,GAA8B,CAC1C,IAAM,EAAQ,EAAM,MAAM,CAAC,KAAS,IAAQ,EAAE,CAE9C,OAAO,EAAQ,EAAM,IAAI,CAAI,KAAa,EAAI,IAWhD,OARA,EAAA,EAAA,UAAa,EAAM,KACJ,EAAM,EAA4B,MAAM,CAGnD,OAAO,GAAU,eACN,EAAM,GAAmB,CAAC,CAGlC,EAAK,EAAW"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { type ReadonlySignal } from '@vielzeug/stateit';
|
|
2
|
-
import type { HTMLResult } from '../core/internal';
|
|
3
|
-
type TemplateFn = () => string | HTMLResult;
|
|
4
|
-
type CaseEntry<T> = readonly [T, TemplateFn];
|
|
5
|
-
/**
|
|
6
|
-
* Renders the template matching the current value — like a type-safe `switch`.
|
|
7
|
-
* Cases are `[value, templateFn]` pairs evaluated with strict equality (`===`).
|
|
8
|
-
*
|
|
9
|
-
* The discriminant can be a static value, a reactive Signal, or a getter function.
|
|
10
|
-
* When reactive, the rendered output updates automatically when the value changes.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* import { choose } from '@vielzeug/craftit/directives';
|
|
14
|
-
*
|
|
15
|
-
* // Static
|
|
16
|
-
* html`${choose(section, [
|
|
17
|
-
* ['home', () => html`<h1>Home</h1>`],
|
|
18
|
-
* ['about', () => html`<h1>About</h1>`],
|
|
19
|
-
* ], () => html`<h1>Not found</h1>`)}`
|
|
20
|
-
*
|
|
21
|
-
* // Reactive signal — updates on change
|
|
22
|
-
* const tab = signal('home');
|
|
23
|
-
* html`${choose(tab, [
|
|
24
|
-
* ['home', () => html`<home-panel>`],
|
|
25
|
-
* ['about', () => html`<about-panel>`],
|
|
26
|
-
* ])}`
|
|
27
|
-
*
|
|
28
|
-
* // Reactive getter
|
|
29
|
-
* html`${choose(() => props.view.value, cases)}`
|
|
30
|
-
*/
|
|
31
|
-
export declare function choose<T extends PropertyKey>(value: ReadonlySignal<T> | (() => T), cases: ReadonlyArray<CaseEntry<T>>, defaultFn?: TemplateFn): TemplateFn;
|
|
32
|
-
export declare function choose<T extends PropertyKey>(value: T, cases: ReadonlyArray<CaseEntry<T>>, defaultFn?: TemplateFn): string | HTMLResult;
|
|
33
|
-
export {};
|
|
34
|
-
//# sourceMappingURL=choose.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"choose.d.ts","sourceRoot":"","sources":["../../src/directives/choose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,KAAK,UAAU,GAAG,MAAM,MAAM,GAAG,UAAU,CAAC;AAC5C,KAAK,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,WAAW,EAC1C,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACpC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAClC,SAAS,CAAC,EAAE,UAAU,GACrB,UAAU,CAAC;AACd,wBAAgB,MAAM,CAAC,CAAC,SAAS,WAAW,EAC1C,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAClC,SAAS,CAAC,EAAE,UAAU,GACrB,MAAM,GAAG,UAAU,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"choose.js","names":[],"sources":["../../src/directives/choose.ts"],"sourcesContent":["import { isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype TemplateFn = () => string | HTMLResult;\ntype CaseEntry<T> = readonly [T, TemplateFn];\n\n/**\n * Renders the template matching the current value — like a type-safe `switch`.\n * Cases are `[value, templateFn]` pairs evaluated with strict equality (`===`).\n *\n * The discriminant can be a static value, a reactive Signal, or a getter function.\n * When reactive, the rendered output updates automatically when the value changes.\n *\n * @example\n * import { choose } from '@vielzeug/craftit/directives';\n *\n * // Static\n * html`${choose(section, [\n * ['home', () => html`<h1>Home</h1>`],\n * ['about', () => html`<h1>About</h1>`],\n * ], () => html`<h1>Not found</h1>`)}`\n *\n * // Reactive signal — updates on change\n * const tab = signal('home');\n * html`${choose(tab, [\n * ['home', () => html`<home-panel>`],\n * ['about', () => html`<about-panel>`],\n * ])}`\n *\n * // Reactive getter\n * html`${choose(() => props.view.value, cases)}`\n */\nexport function choose<T extends PropertyKey>(\n value: ReadonlySignal<T> | (() => T),\n cases: ReadonlyArray<CaseEntry<T>>,\n defaultFn?: TemplateFn,\n): TemplateFn;\nexport function choose<T extends PropertyKey>(\n value: T,\n cases: ReadonlyArray<CaseEntry<T>>,\n defaultFn?: TemplateFn,\n): string | HTMLResult;\nexport function choose<T extends PropertyKey>(\n value: T | ReadonlySignal<T> | (() => T),\n cases: ReadonlyArray<CaseEntry<T>>,\n defaultFn?: TemplateFn,\n): string | HTMLResult | TemplateFn {\n const pick = (v: T): string | HTMLResult => {\n const entry = cases.find(([key]) => key === v);\n\n return entry ? entry[1]() : (defaultFn?.() ?? '');\n };\n\n if (isSignal(value)) {\n return () => pick((value as ReadonlySignal<T>).value);\n }\n\n if (typeof value === 'function') {\n return () => pick((value as () => T)());\n }\n\n return pick(value as T);\n}\n"],"mappings":"6CA2CA,SAAgB,EACd,EACA,EACA,EACkC,CAClC,IAAM,EAAQ,GAA8B,CAC1C,IAAM,EAAQ,EAAM,MAAM,CAAC,KAAS,IAAQ,EAAE,CAE9C,OAAO,EAAQ,EAAM,IAAI,CAAI,KAAa,EAAI,IAWhD,OARI,EAAS,EAAM,KACJ,EAAM,EAA4B,MAAM,CAGnD,OAAO,GAAU,eACN,EAAM,GAAmB,CAAC,CAGlC,EAAK,EAAW"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=require(`@vielzeug/stateit`);function t(t){let n=Object.entries(t),r=n.some(([,t])=>(0,e.isSignal)(t)||typeof t==`function`),i=()=>n.filter(([,t])=>(0,e.isSignal)(t)?t.value:typeof t==`function`?!!t():!!t).map(([e])=>e).join(` `);return r?(0,e.computed)(i):i()}exports.classes=t;
|
|
2
|
-
//# sourceMappingURL=classes.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"classes.cjs","names":[],"sources":["../../src/directives/classes.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\ntype ClassValue = boolean | undefined | null | Signal<boolean> | ReadonlySignal<boolean> | (() => boolean);\n\n/**\n * Build a dynamic class string from an object map of class names to conditions.\n * Conditions can be static booleans, reactive Signals, or getter functions.\n * When any condition is reactive the returned value is a `ReadonlySignal<string>`\n * so it can be bound directly to a `class` attribute.\n *\n * @example\n * import { classes } from '@vielzeug/craftit/directives';\n *\n * // Static — returns a plain string\n * html`<div class=${classes({ foo: true, bar: false })}></div>`\n *\n * // Reactive — returns a signal; no arrow-function wrapper needed\n * html`<div class=${classes({ active: isActive, disabled: isDisabled })}></div>`\n */\nexport function classes(map: Record<string, ClassValue>): string | ReadonlySignal<string> {\n const entries = Object.entries(map);\n const hasReactive = entries.some(([, v]) => isSignal(v) || typeof v === 'function');\n\n const build = (): string =>\n entries\n .filter(([, v]) => {\n if (isSignal(v)) return (v as ReadonlySignal<boolean>).value;\n\n if (typeof v === 'function') return !!(v as () => boolean)();\n\n return !!v;\n })\n .map(([k]) => k)\n .join(' ');\n\n return hasReactive ? computed(build) : build();\n}\n"],"mappings":"mCAmBA,SAAgB,EAAQ,EAAkE,CACxF,IAAM,EAAU,OAAO,QAAQ,EAAI,CAC7B,EAAc,EAAQ,MAAM,EAAG,MAAA,EAAA,EAAA,UAAgB,EAAE,EAAI,OAAO,GAAM,WAAW,CAE7E,MACJ,EACG,QAAQ,EAAG,MACV,EAAA,EAAA,UAAa,EAAE,CAAU,EAA8B,MAEnD,OAAO,GAAM,WAAmB,CAAC,CAAE,GAAqB,CAErD,CAAC,CAAC,EACT,CACD,KAAK,CAAC,KAAO,EAAE,CACf,KAAK,IAAI,CAEd,OAAO,GAAA,EAAA,EAAA,UAAuB,EAAM,CAAG,GAAO"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';
|
|
2
|
-
type ClassValue = boolean | undefined | null | Signal<boolean> | ReadonlySignal<boolean> | (() => boolean);
|
|
3
|
-
/**
|
|
4
|
-
* Build a dynamic class string from an object map of class names to conditions.
|
|
5
|
-
* Conditions can be static booleans, reactive Signals, or getter functions.
|
|
6
|
-
* When any condition is reactive the returned value is a `ReadonlySignal<string>`
|
|
7
|
-
* so it can be bound directly to a `class` attribute.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* import { classes } from '@vielzeug/craftit/directives';
|
|
11
|
-
*
|
|
12
|
-
* // Static — returns a plain string
|
|
13
|
-
* html`<div class=${classes({ foo: true, bar: false })}></div>`
|
|
14
|
-
*
|
|
15
|
-
* // Reactive — returns a signal; no arrow-function wrapper needed
|
|
16
|
-
* html`<div class=${classes({ active: isActive, disabled: isDisabled })}></div>`
|
|
17
|
-
*/
|
|
18
|
-
export declare function classes(map: Record<string, ClassValue>): string | ReadonlySignal<string>;
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=classes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"classes.d.ts","sourceRoot":"","sources":["../../src/directives/classes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEzF,KAAK,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;AAE3G;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAiBxF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{computed as e,isSignal as t}from"@vielzeug/stateit";function n(n){let r=Object.entries(n),i=r.some(([,e])=>t(e)||typeof e==`function`),a=()=>r.filter(([,e])=>t(e)?e.value:typeof e==`function`?!!e():!!e).map(([e])=>e).join(` `);return i?e(a):a()}export{n as classes};
|
|
2
|
-
//# sourceMappingURL=classes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"classes.js","names":[],"sources":["../../src/directives/classes.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\ntype ClassValue = boolean | undefined | null | Signal<boolean> | ReadonlySignal<boolean> | (() => boolean);\n\n/**\n * Build a dynamic class string from an object map of class names to conditions.\n * Conditions can be static booleans, reactive Signals, or getter functions.\n * When any condition is reactive the returned value is a `ReadonlySignal<string>`\n * so it can be bound directly to a `class` attribute.\n *\n * @example\n * import { classes } from '@vielzeug/craftit/directives';\n *\n * // Static — returns a plain string\n * html`<div class=${classes({ foo: true, bar: false })}></div>`\n *\n * // Reactive — returns a signal; no arrow-function wrapper needed\n * html`<div class=${classes({ active: isActive, disabled: isDisabled })}></div>`\n */\nexport function classes(map: Record<string, ClassValue>): string | ReadonlySignal<string> {\n const entries = Object.entries(map);\n const hasReactive = entries.some(([, v]) => isSignal(v) || typeof v === 'function');\n\n const build = (): string =>\n entries\n .filter(([, v]) => {\n if (isSignal(v)) return (v as ReadonlySignal<boolean>).value;\n\n if (typeof v === 'function') return !!(v as () => boolean)();\n\n return !!v;\n })\n .map(([k]) => k)\n .join(' ');\n\n return hasReactive ? computed(build) : build();\n}\n"],"mappings":"2DAmBA,SAAgB,EAAQ,EAAkE,CACxF,IAAM,EAAU,OAAO,QAAQ,EAAI,CAC7B,EAAc,EAAQ,MAAM,EAAG,KAAO,EAAS,EAAE,EAAI,OAAO,GAAM,WAAW,CAE7E,MACJ,EACG,QAAQ,EAAG,KACN,EAAS,EAAE,CAAU,EAA8B,MAEnD,OAAO,GAAM,WAAmB,CAAC,CAAE,GAAqB,CAErD,CAAC,CAAC,EACT,CACD,KAAK,CAAC,KAAO,EAAE,CACf,KAAK,IAAI,CAEd,OAAO,EAAc,EAAS,EAAM,CAAG,GAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./spread.cjs`),t=require(`./attr.cjs`),n=require(`./bind.cjs`),r=require(`./choose.cjs`),i=require(`./classes.cjs`),a=require(`./each.cjs`),o=require(`./match.cjs`),s=require(`./memo.cjs`),c=require(`./on.cjs`),l=require(`./raw.cjs`),u=require(`./style.cjs`),d=require(`./until.cjs`),f=require(`./when.cjs`);exports.attr=t.attr,exports.bind=n.bind,exports.choose=r.choose,exports.classes=i.classes,exports.each=a.each,exports.match=o.match,exports.memo=s.memo,exports.on=c.on,exports.raw=l.raw,exports.spread=e.spread,exports.style=u.style,exports.until=d.until,exports.when=f.when;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export { attr } from './attr';
|
|
2
|
-
export { bind } from './bind';
|
|
3
|
-
export { choose } from './choose';
|
|
4
|
-
export { classes } from './classes';
|
|
5
|
-
export { each } from './each';
|
|
6
|
-
export { match } from './match';
|
|
7
|
-
export { memo } from './memo';
|
|
8
|
-
export { on } from './on';
|
|
9
|
-
export { raw } from './raw';
|
|
10
|
-
export { spread } from './spread';
|
|
11
|
-
export { style } from './style';
|
|
12
|
-
export { until } from './until';
|
|
13
|
-
export { when } from './when';
|
|
14
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/directives/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/directives/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{spread as e}from"./spread.js";import{attr as t}from"./attr.js";import{bind as n}from"./bind.js";import{choose as r}from"./choose.js";import{classes as i}from"./classes.js";import{each as a}from"./each.js";import{match as o}from"./match.js";import{memo as s}from"./memo.js";import{on as c}from"./on.js";import{raw as l}from"./raw.js";import{style as u}from"./style.js";import{until as d}from"./until.js";import{when as f}from"./when.js";export{t as attr,n as bind,r as choose,i as classes,a as each,o as match,s as memo,c as on,l as raw,e as spread,u as style,d as until,f as when};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=require(`@vielzeug/stateit`);function t(...t){let n=t[t.length-1],r=typeof n==`function`&&!Array.isArray(n),i=r?t.slice(0,-1):t,a=r?n:void 0,o=t=>(0,e.isSignal)(t)?!!t.value:typeof t==`function`?!!t():!!t,s=()=>{for(let[e,t]of i)if(o(e))return t();return a?.()??``};return i.some(([t])=>(0,e.isSignal)(t)||typeof t==`function`)?s:s()}exports.match=t;
|
|
2
|
-
//# sourceMappingURL=match.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"match.cjs","names":[],"sources":["../../src/directives/match.ts"],"sourcesContent":["import { isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype TemplateFn = () => string | HTMLResult;\ntype Branch = readonly [unknown, TemplateFn];\n\n/**\n * Multi-branch conditional rendering. Pass branches as individual `[condition, templateFn]`\n * tuples (variadic), with an optional trailing `fallback` function.\n * Renders the first truthy branch, or the fallback when no branch matches.\n *\n * Reactive when any condition is a Signal or getter function — the output updates\n * automatically whenever a reactive condition changes.\n *\n * @example\n * import { match } from '@vielzeug/craftit/directives';\n *\n * // Static — evaluated once\n * html`${match(\n * [isAdmin, () => html`<admin-panel>`],\n * [isModerator, () => html`<mod-panel>`],\n * () => html`<user-panel>`,\n * )}`\n *\n * // Reactive Signal conditions\n * html`${match(\n * [isAdmin, () => html`<admin-panel>`],\n * [isLoggedIn, () => html`<user-panel>`],\n * () => html`<guest-panel>`,\n * )}`\n */\nexport function match(...args: (Branch | TemplateFn)[]): TemplateFn | string | HTMLResult {\n // Separate branches from optional trailing fallback function.\n // A Branch is a tuple [condition, fn] (an array); a TemplateFn is a bare () => ... function.\n const lastArg = args[args.length - 1];\n const hasFallback = typeof lastArg === 'function' && !Array.isArray(lastArg);\n const branches = (hasFallback ? args.slice(0, -1) : args) as Branch[];\n const fallback = hasFallback ? (lastArg as TemplateFn) : undefined;\n\n const resolve = (cond: unknown): boolean => {\n if (isSignal(cond)) return !!(cond as ReadonlySignal<unknown>).value;\n\n if (typeof cond === 'function') return !!(cond as () => unknown)();\n\n return !!cond;\n };\n\n const evaluate = (): string | HTMLResult => {\n for (const [cond, fn] of branches) {\n if (resolve(cond)) return fn();\n }\n\n return fallback?.() ?? '';\n };\n\n const reactive = branches.some(([cond]) => isSignal(cond) || typeof cond === 'function');\n\n return reactive ? evaluate : evaluate();\n}\n"],"mappings":"mCAgCA,SAAgB,EAAM,GAAG,EAAiE,CAGxF,IAAM,EAAU,EAAK,EAAK,OAAS,GAC7B,EAAc,OAAO,GAAY,YAAc,CAAC,MAAM,QAAQ,EAAQ,CACtE,EAAY,EAAc,EAAK,MAAM,EAAG,GAAG,CAAG,EAC9C,EAAW,EAAe,EAAyB,IAAA,GAEnD,EAAW,IACf,EAAA,EAAA,UAAa,EAAK,CAAS,CAAC,CAAE,EAAiC,MAE3D,OAAO,GAAS,WAAmB,CAAC,CAAE,GAAwB,CAE3D,CAAC,CAAC,EAGL,MAAsC,CAC1C,IAAK,GAAM,CAAC,EAAM,KAAO,EACvB,GAAI,EAAQ,EAAK,CAAE,OAAO,GAAI,CAGhC,OAAO,KAAY,EAAI,IAKzB,OAFiB,EAAS,MAAM,CAAC,MAAA,EAAA,EAAA,UAAmB,EAAK,EAAI,OAAO,GAAS,WAAW,CAEtE,EAAW,GAAU"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { HTMLResult } from '../core/internal';
|
|
2
|
-
type TemplateFn = () => string | HTMLResult;
|
|
3
|
-
type Branch = readonly [unknown, TemplateFn];
|
|
4
|
-
/**
|
|
5
|
-
* Multi-branch conditional rendering. Pass branches as individual `[condition, templateFn]`
|
|
6
|
-
* tuples (variadic), with an optional trailing `fallback` function.
|
|
7
|
-
* Renders the first truthy branch, or the fallback when no branch matches.
|
|
8
|
-
*
|
|
9
|
-
* Reactive when any condition is a Signal or getter function — the output updates
|
|
10
|
-
* automatically whenever a reactive condition changes.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* import { match } from '@vielzeug/craftit/directives';
|
|
14
|
-
*
|
|
15
|
-
* // Static — evaluated once
|
|
16
|
-
* html`${match(
|
|
17
|
-
* [isAdmin, () => html`<admin-panel>`],
|
|
18
|
-
* [isModerator, () => html`<mod-panel>`],
|
|
19
|
-
* () => html`<user-panel>`,
|
|
20
|
-
* )}`
|
|
21
|
-
*
|
|
22
|
-
* // Reactive Signal conditions
|
|
23
|
-
* html`${match(
|
|
24
|
-
* [isAdmin, () => html`<admin-panel>`],
|
|
25
|
-
* [isLoggedIn, () => html`<user-panel>`],
|
|
26
|
-
* () => html`<guest-panel>`,
|
|
27
|
-
* )}`
|
|
28
|
-
*/
|
|
29
|
-
export declare function match(...args: (Branch | TemplateFn)[]): TemplateFn | string | HTMLResult;
|
|
30
|
-
export {};
|
|
31
|
-
//# sourceMappingURL=match.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/directives/match.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,KAAK,UAAU,GAAG,MAAM,MAAM,GAAG,UAAU,CAAC;AAC5C,KAAK,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CA2BxF"}
|
package/dist/directives/match.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{isSignal as e}from"@vielzeug/stateit";function t(...t){let n=t[t.length-1],r=typeof n==`function`&&!Array.isArray(n),i=r?t.slice(0,-1):t,a=r?n:void 0,o=t=>e(t)?!!t.value:typeof t==`function`?!!t():!!t,s=()=>{for(let[e,t]of i)if(o(e))return t();return a?.()??``};return i.some(([t])=>e(t)||typeof t==`function`)?s:s()}export{t as match};
|
|
2
|
-
//# sourceMappingURL=match.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"match.js","names":[],"sources":["../../src/directives/match.ts"],"sourcesContent":["import { isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype TemplateFn = () => string | HTMLResult;\ntype Branch = readonly [unknown, TemplateFn];\n\n/**\n * Multi-branch conditional rendering. Pass branches as individual `[condition, templateFn]`\n * tuples (variadic), with an optional trailing `fallback` function.\n * Renders the first truthy branch, or the fallback when no branch matches.\n *\n * Reactive when any condition is a Signal or getter function — the output updates\n * automatically whenever a reactive condition changes.\n *\n * @example\n * import { match } from '@vielzeug/craftit/directives';\n *\n * // Static — evaluated once\n * html`${match(\n * [isAdmin, () => html`<admin-panel>`],\n * [isModerator, () => html`<mod-panel>`],\n * () => html`<user-panel>`,\n * )}`\n *\n * // Reactive Signal conditions\n * html`${match(\n * [isAdmin, () => html`<admin-panel>`],\n * [isLoggedIn, () => html`<user-panel>`],\n * () => html`<guest-panel>`,\n * )}`\n */\nexport function match(...args: (Branch | TemplateFn)[]): TemplateFn | string | HTMLResult {\n // Separate branches from optional trailing fallback function.\n // A Branch is a tuple [condition, fn] (an array); a TemplateFn is a bare () => ... function.\n const lastArg = args[args.length - 1];\n const hasFallback = typeof lastArg === 'function' && !Array.isArray(lastArg);\n const branches = (hasFallback ? args.slice(0, -1) : args) as Branch[];\n const fallback = hasFallback ? (lastArg as TemplateFn) : undefined;\n\n const resolve = (cond: unknown): boolean => {\n if (isSignal(cond)) return !!(cond as ReadonlySignal<unknown>).value;\n\n if (typeof cond === 'function') return !!(cond as () => unknown)();\n\n return !!cond;\n };\n\n const evaluate = (): string | HTMLResult => {\n for (const [cond, fn] of branches) {\n if (resolve(cond)) return fn();\n }\n\n return fallback?.() ?? '';\n };\n\n const reactive = branches.some(([cond]) => isSignal(cond) || typeof cond === 'function');\n\n return reactive ? evaluate : evaluate();\n}\n"],"mappings":"6CAgCA,SAAgB,EAAM,GAAG,EAAiE,CAGxF,IAAM,EAAU,EAAK,EAAK,OAAS,GAC7B,EAAc,OAAO,GAAY,YAAc,CAAC,MAAM,QAAQ,EAAQ,CACtE,EAAY,EAAc,EAAK,MAAM,EAAG,GAAG,CAAG,EAC9C,EAAW,EAAe,EAAyB,IAAA,GAEnD,EAAW,GACX,EAAS,EAAK,CAAS,CAAC,CAAE,EAAiC,MAE3D,OAAO,GAAS,WAAmB,CAAC,CAAE,GAAwB,CAE3D,CAAC,CAAC,EAGL,MAAsC,CAC1C,IAAK,GAAM,CAAC,EAAM,KAAO,EACvB,GAAI,EAAQ,EAAK,CAAE,OAAO,GAAI,CAGhC,OAAO,KAAY,EAAI,IAKzB,OAFiB,EAAS,MAAM,CAAC,KAAU,EAAS,EAAK,EAAI,OAAO,GAAS,WAAW,CAEtE,EAAW,GAAU"}
|
package/dist/directives/memo.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memo.cjs","names":[],"sources":["../../src/directives/memo.ts"],"sourcesContent":["import { isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype Dep = unknown | ReadonlySignal<unknown>;\n\n/**\n * Memoizes a template fragment — `templateFn` is only re-called when at least\n * one entry in `deps` has changed (compared with `Object.is`).\n *\n * Signal values in `deps` are automatically unwrapped and tracked, so changing a\n * dep signal triggers a re-evaluation. This is useful for skipping expensive\n * sub-tree renders when only unrelated state changes.\n *\n * @example\n * import { memo } from '@vielzeug/craftit/directives';\n *\n * // Only re-renders the table when `rows` actually changes\n * html`${memo([rows], () => html`<big-table :data=${rows}></big-table>`)}`\n *\n * // Multiple deps — re-renders when either changes\n * html`${memo([locale, theme], () => html`<themed-chart :locale=${locale}></themed-chart>`)}`\n */\nexport function memo(deps: ReadonlyArray<Dep>, templateFn: () => string | HTMLResult): () => string | HTMLResult {\n let cached: string | HTMLResult = '';\n let lastDeps: unknown[] = [];\n let initialized = false;\n\n return (): string | HTMLResult => {\n const current = deps.map((d) => (isSignal(d) ? (d as ReadonlySignal<unknown>).value : d));\n const changed =\n !initialized || current.length !== lastDeps.length || current.some((v, i) => !Object.is(v, lastDeps[i]));\n\n if (changed) {\n cached = templateFn();\n lastDeps = current;\n initialized = true;\n }\n\n return cached;\n };\n}\n"],"mappings":"mCAuBA,SAAgB,EAAK,EAA0B,EAAkE,CAC/G,IAAI,EAA8B,GAC9B,EAAsB,EAAE,CACxB,EAAc,GAElB,UAAkC,CAChC,IAAM,EAAU,EAAK,IAAK,IAAA,EAAA,EAAA,UAAgB,EAAE,CAAI,EAA8B,MAAQ,EAAG,CAUzF,OARE,CAAC,GAAe,EAAQ,SAAW,EAAS,QAAU,EAAQ,MAAM,EAAG,IAAM,CAAC,OAAO,GAAG,EAAG,EAAS,GAAG,CAAC,IAGxG,EAAS,GAAY,CACrB,EAAW,EACX,EAAc,IAGT"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type ReadonlySignal } from '@vielzeug/stateit';
|
|
2
|
-
import type { HTMLResult } from '../core/internal';
|
|
3
|
-
type Dep = unknown | ReadonlySignal<unknown>;
|
|
4
|
-
/**
|
|
5
|
-
* Memoizes a template fragment — `templateFn` is only re-called when at least
|
|
6
|
-
* one entry in `deps` has changed (compared with `Object.is`).
|
|
7
|
-
*
|
|
8
|
-
* Signal values in `deps` are automatically unwrapped and tracked, so changing a
|
|
9
|
-
* dep signal triggers a re-evaluation. This is useful for skipping expensive
|
|
10
|
-
* sub-tree renders when only unrelated state changes.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* import { memo } from '@vielzeug/craftit/directives';
|
|
14
|
-
*
|
|
15
|
-
* // Only re-renders the table when `rows` actually changes
|
|
16
|
-
* html`${memo([rows], () => html`<big-table :data=${rows}></big-table>`)}`
|
|
17
|
-
*
|
|
18
|
-
* // Multiple deps — re-renders when either changes
|
|
19
|
-
* html`${memo([locale, theme], () => html`<themed-chart :locale=${locale}></themed-chart>`)}`
|
|
20
|
-
*/
|
|
21
|
-
export declare function memo(deps: ReadonlyArray<Dep>, templateFn: () => string | HTMLResult): () => string | HTMLResult;
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=memo.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../../src/directives/memo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,KAAK,GAAG,GAAG,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AAE7C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,MAAM,GAAG,UAAU,GAAG,MAAM,MAAM,GAAG,UAAU,CAkB/G"}
|
package/dist/directives/memo.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memo.js","names":[],"sources":["../../src/directives/memo.ts"],"sourcesContent":["import { isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype Dep = unknown | ReadonlySignal<unknown>;\n\n/**\n * Memoizes a template fragment — `templateFn` is only re-called when at least\n * one entry in `deps` has changed (compared with `Object.is`).\n *\n * Signal values in `deps` are automatically unwrapped and tracked, so changing a\n * dep signal triggers a re-evaluation. This is useful for skipping expensive\n * sub-tree renders when only unrelated state changes.\n *\n * @example\n * import { memo } from '@vielzeug/craftit/directives';\n *\n * // Only re-renders the table when `rows` actually changes\n * html`${memo([rows], () => html`<big-table :data=${rows}></big-table>`)}`\n *\n * // Multiple deps — re-renders when either changes\n * html`${memo([locale, theme], () => html`<themed-chart :locale=${locale}></themed-chart>`)}`\n */\nexport function memo(deps: ReadonlyArray<Dep>, templateFn: () => string | HTMLResult): () => string | HTMLResult {\n let cached: string | HTMLResult = '';\n let lastDeps: unknown[] = [];\n let initialized = false;\n\n return (): string | HTMLResult => {\n const current = deps.map((d) => (isSignal(d) ? (d as ReadonlySignal<unknown>).value : d));\n const changed =\n !initialized || current.length !== lastDeps.length || current.some((v, i) => !Object.is(v, lastDeps[i]));\n\n if (changed) {\n cached = templateFn();\n lastDeps = current;\n initialized = true;\n }\n\n return cached;\n };\n}\n"],"mappings":"6CAuBA,SAAgB,EAAK,EAA0B,EAAkE,CAC/G,IAAI,EAA8B,GAC9B,EAAsB,EAAE,CACxB,EAAc,GAElB,UAAkC,CAChC,IAAM,EAAU,EAAK,IAAK,GAAO,EAAS,EAAE,CAAI,EAA8B,MAAQ,EAAG,CAUzF,OARE,CAAC,GAAe,EAAQ,SAAW,EAAS,QAAU,EAAQ,MAAM,EAAG,IAAM,CAAC,OAAO,GAAG,EAAG,EAAS,GAAG,CAAC,IAGxG,EAAS,GAAY,CACrB,EAAW,EACX,EAAc,IAGT"}
|
package/dist/directives/on.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../core/utilities.cjs`);function t(t,n,r){return{mount(i,{registerCleanup:a}){if(t===`clickOutside`){let t=i.ownerDocument??document;a(e.listen(t,`click`,e=>{e.composedPath().includes(i)||n(e)},r))}else a(e.listen(i,t,n,r))}}}exports.on=t;
|
|
2
|
-
//# sourceMappingURL=on.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"on.cjs","names":[],"sources":["../../src/directives/on.ts"],"sourcesContent":["import type { Directive } from '../core/internal';\n\nimport { listen } from '../core/utilities';\n\n/**\n * Attaches an event listener to an element as a spread directive, supporting\n * full `AddEventListenerOptions` (e.g. `passive`, `once`, `capture`).\n *\n * **Synthetic event: `'clickOutside'`**\n * When the event name is `'clickOutside'`, the listener is attached to `document`\n * and fires whenever a click occurs *outside* the host element — useful for\n * closing dropdowns, modals, and popovers.\n *\n * @example\n * import { on } from '@vielzeug/craftit/directives';\n *\n * // Passive wheel listener (not possible with @wheel= template syntax)\n * html`<div ${on('wheel', onScroll, { passive: true })}></div>`\n *\n * // Typed handler — `e` inferred as `MouseEvent`\n * html`<button ${on('click', (e) => e.clientX)}></button>`\n *\n * // Click-outside (closes a dropdown when the user clicks away)\n * html`<div ${on('clickOutside', () => open.value = false)}></div>`\n */\nexport function on(\n event: 'clickOutside',\n handler: (e: MouseEvent) => void,\n options?: AddEventListenerOptions,\n): Directive;\nexport function on<K extends keyof HTMLElementEventMap>(\n event: K,\n handler: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n): Directive;\nexport function on(event: string, handler: (e: any) => void, options?: AddEventListenerOptions): Directive {\n return {\n mount(el, { registerCleanup }) {\n if (event === 'clickOutside') {\n const doc = el.ownerDocument ?? document;\n const docHandler = (e: Event) => {\n if (!e.composedPath().includes(el)) handler(e as MouseEvent);\n };\n\n registerCleanup(listen(doc, 'click', docHandler, options));\n } else {\n registerCleanup(listen(el, event, handler, options));\n }\n },\n };\n}\n"],"mappings":"yCAmCA,SAAgB,EAAG,EAAe,EAA2B,EAA8C,CACzG,MAAO,CACL,MAAM,EAAI,CAAE,mBAAmB,CAC7B,GAAI,IAAU,eAAgB,CAC5B,IAAM,EAAM,EAAG,eAAiB,SAKhC,EAAgB,EAAA,OAAO,EAAK,QAJR,GAAa,CAC1B,EAAE,cAAc,CAAC,SAAS,EAAG,EAAE,EAAQ,EAAgB,EAGb,EAAQ,CAAC,MAE1D,EAAgB,EAAA,OAAO,EAAI,EAAO,EAAS,EAAQ,CAAC,EAGzD"}
|
package/dist/directives/on.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { Directive } from '../core/internal';
|
|
2
|
-
/**
|
|
3
|
-
* Attaches an event listener to an element as a spread directive, supporting
|
|
4
|
-
* full `AddEventListenerOptions` (e.g. `passive`, `once`, `capture`).
|
|
5
|
-
*
|
|
6
|
-
* **Synthetic event: `'clickOutside'`**
|
|
7
|
-
* When the event name is `'clickOutside'`, the listener is attached to `document`
|
|
8
|
-
* and fires whenever a click occurs *outside* the host element — useful for
|
|
9
|
-
* closing dropdowns, modals, and popovers.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* import { on } from '@vielzeug/craftit/directives';
|
|
13
|
-
*
|
|
14
|
-
* // Passive wheel listener (not possible with @wheel= template syntax)
|
|
15
|
-
* html`<div ${on('wheel', onScroll, { passive: true })}></div>`
|
|
16
|
-
*
|
|
17
|
-
* // Typed handler — `e` inferred as `MouseEvent`
|
|
18
|
-
* html`<button ${on('click', (e) => e.clientX)}></button>`
|
|
19
|
-
*
|
|
20
|
-
* // Click-outside (closes a dropdown when the user clicks away)
|
|
21
|
-
* html`<div ${on('clickOutside', () => open.value = false)}></div>`
|
|
22
|
-
*/
|
|
23
|
-
export declare function on(event: 'clickOutside', handler: (e: MouseEvent) => void, options?: AddEventListenerOptions): Directive;
|
|
24
|
-
export declare function on<K extends keyof HTMLElementEventMap>(event: K, handler: (e: HTMLElementEventMap[K]) => void, options?: AddEventListenerOptions): Directive;
|
|
25
|
-
//# sourceMappingURL=on.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"on.d.ts","sourceRoot":"","sources":["../../src/directives/on.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,EAAE,CAChB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,EAChC,OAAO,CAAC,EAAE,uBAAuB,GAChC,SAAS,CAAC;AACb,wBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EACpD,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC5C,OAAO,CAAC,EAAE,uBAAuB,GAChC,SAAS,CAAC"}
|
package/dist/directives/on.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"on.js","names":[],"sources":["../../src/directives/on.ts"],"sourcesContent":["import type { Directive } from '../core/internal';\n\nimport { listen } from '../core/utilities';\n\n/**\n * Attaches an event listener to an element as a spread directive, supporting\n * full `AddEventListenerOptions` (e.g. `passive`, `once`, `capture`).\n *\n * **Synthetic event: `'clickOutside'`**\n * When the event name is `'clickOutside'`, the listener is attached to `document`\n * and fires whenever a click occurs *outside* the host element — useful for\n * closing dropdowns, modals, and popovers.\n *\n * @example\n * import { on } from '@vielzeug/craftit/directives';\n *\n * // Passive wheel listener (not possible with @wheel= template syntax)\n * html`<div ${on('wheel', onScroll, { passive: true })}></div>`\n *\n * // Typed handler — `e` inferred as `MouseEvent`\n * html`<button ${on('click', (e) => e.clientX)}></button>`\n *\n * // Click-outside (closes a dropdown when the user clicks away)\n * html`<div ${on('clickOutside', () => open.value = false)}></div>`\n */\nexport function on(\n event: 'clickOutside',\n handler: (e: MouseEvent) => void,\n options?: AddEventListenerOptions,\n): Directive;\nexport function on<K extends keyof HTMLElementEventMap>(\n event: K,\n handler: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n): Directive;\nexport function on(event: string, handler: (e: any) => void, options?: AddEventListenerOptions): Directive {\n return {\n mount(el, { registerCleanup }) {\n if (event === 'clickOutside') {\n const doc = el.ownerDocument ?? document;\n const docHandler = (e: Event) => {\n if (!e.composedPath().includes(el)) handler(e as MouseEvent);\n };\n\n registerCleanup(listen(doc, 'click', docHandler, options));\n } else {\n registerCleanup(listen(el, event, handler, options));\n }\n },\n };\n}\n"],"mappings":"8CAmCA,SAAgB,EAAG,EAAe,EAA2B,EAA8C,CACzG,MAAO,CACL,MAAM,EAAI,CAAE,mBAAmB,CAO3B,EANE,IAAU,eAMI,EALJ,EAAG,eAAiB,SAKJ,QAJR,GAAa,CAC1B,EAAE,cAAc,CAAC,SAAS,EAAG,EAAE,EAAQ,EAAgB,EAGb,EAAQ,CAEzC,EAAO,EAAI,EAAO,EAAS,EAAQ,CAAC,EAGzD"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
require(`../core/internal.cjs`);const e=require(`../core/utilities.cjs`),t=require(`../core/runtime-bindings.cjs`);let n=require(`@vielzeug/stateit`);var r=(e,t,r)=>e?(r((0,n.effect)(()=>{t(e.value)})),!0):!1,i=(t,n,r,i)=>n.startsWith(`@`)?(typeof r==`function`&&i(e.listen(t,n.slice(1),r)),!0):!1,a=(e,n,i,a)=>{if(!n.startsWith(`.`))return!1;let o=n.slice(1),s=t.hasWritableValueSetter(i)?i:void 0;return r(t.toReactiveBindingSource(i),t=>e[o]=t,a)||(e[o]=i),t.bindPropertyModel(e,o,s,a),!0},o=(e,n,i,a)=>{if(!n.startsWith(`?`))return!1;let o=n.slice(1);return r(t.toReactiveBindingSource(i),t=>e.toggleAttribute(o,!!t),a)||e.toggleAttribute(o,!!i),!0},s=(n,i,a,o)=>{r(t.toReactiveBindingSource(a),t=>e.setAttr(n,i,t),o)||e.setAttr(n,i,a)},c=(e,t,n,r)=>{n!==void 0&&(i(e,t,n,r)||a(e,t,n,r)||o(e,t,n,r)||s(e,t,n,r))};function l(e){return{mount(t,{registerCleanup:n}){for(let[r,i]of Object.entries(e))c(t,r,i,n)}}}exports.spread=l;
|
|
2
|
-
//# sourceMappingURL=spread.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spread.cjs","names":[],"sources":["../../src/directives/spread.ts"],"sourcesContent":["import { effect, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { type Directive } from '../core/internal';\nimport { bindPropertyModel, hasWritableValueSetter, toReactiveBindingSource } from '../core/runtime-bindings';\nimport { listen, setAttr } from '../core/utilities';\n\nexport type SpreadValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | ReadonlySignal<string | number | boolean | null | undefined>\n | (() => string | number | boolean | null | undefined)\n | ((event: Event) => void);\n\ntype RegisterCleanup = (fn: () => void) => void;\n\nconst applyReactiveValue = (\n source: ReadonlySignal<unknown> | undefined,\n apply: (value: unknown) => void,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!source) return false;\n\n registerCleanup(\n effect(() => {\n apply(source.value);\n }),\n );\n\n return true;\n};\n\nconst applyEventEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!rawKey.startsWith('@')) return false;\n\n if (typeof rawValue === 'function') {\n registerCleanup(listen(el, rawKey.slice(1), rawValue as (event: Event) => void));\n }\n\n return true;\n};\n\nconst applyPropertyEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!rawKey.startsWith('.')) return false;\n\n const key = rawKey.slice(1);\n const writableModel = hasWritableValueSetter(rawValue) ? rawValue : undefined;\n const source = toReactiveBindingSource(rawValue);\n\n if (!applyReactiveValue(source, (value) => ((el as any)[key] = value), registerCleanup)) {\n (el as any)[key] = rawValue;\n }\n\n bindPropertyModel(el, key, writableModel, registerCleanup);\n\n return true;\n};\n\nconst applyBooleanAttributeEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!rawKey.startsWith('?')) return false;\n\n const key = rawKey.slice(1);\n const source = toReactiveBindingSource(rawValue);\n\n if (!applyReactiveValue(source, (value) => el.toggleAttribute(key, Boolean(value)), registerCleanup)) {\n el.toggleAttribute(key, Boolean(rawValue));\n }\n\n return true;\n};\n\nconst applyAttributeEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): void => {\n const source = toReactiveBindingSource(rawValue);\n\n if (!applyReactiveValue(source, (value) => setAttr(el, rawKey, value), registerCleanup)) {\n setAttr(el, rawKey, rawValue);\n }\n};\n\nconst applyEntry = (el: HTMLElement, rawKey: string, rawValue: SpreadValue, registerCleanup: RegisterCleanup): void => {\n if (rawValue === undefined) return;\n\n if (applyEventEntry(el, rawKey, rawValue, registerCleanup)) return;\n\n if (applyPropertyEntry(el, rawKey, rawValue, registerCleanup)) return;\n\n if (applyBooleanAttributeEntry(el, rawKey, rawValue, registerCleanup)) return;\n\n applyAttributeEntry(el, rawKey, rawValue, registerCleanup);\n};\n\n/**\n * Unified spread directive for attributes, properties, and events.\n *\n * Key prefixes:\n * - `name` -> attribute\n * - `?name` -> boolean attribute\n * - `.name` -> DOM property\n * - `@name` -> event listener\n */\nexport function spread(map: Record<string, SpreadValue>): Directive {\n return {\n mount(el, { registerCleanup }) {\n for (const [key, value] of Object.entries(map)) {\n applyEntry(el, key, value, registerCleanup);\n }\n },\n };\n}\n"],"mappings":"sJAkBA,IAAM,GACJ,EACA,EACA,IAEK,GAEL,GAAA,EAAA,EAAA,YACe,CACX,EAAM,EAAO,MAAM,EACnB,CACH,CAEM,IARa,GAWhB,GACJ,EACA,EACA,EACA,IAEK,EAAO,WAAW,IAAI,EAEvB,OAAO,GAAa,YACtB,EAAgB,EAAA,OAAO,EAAI,EAAO,MAAM,EAAE,CAAE,EAAmC,CAAC,CAG3E,IAN6B,GAShC,GACJ,EACA,EACA,EACA,IACY,CACZ,GAAI,CAAC,EAAO,WAAW,IAAI,CAAE,MAAO,GAEpC,IAAM,EAAM,EAAO,MAAM,EAAE,CACrB,EAAgB,EAAA,uBAAuB,EAAS,CAAG,EAAW,IAAA,GASpE,OANK,EAFU,EAAA,wBAAwB,EAAS,CAEf,GAAW,EAAY,GAAO,EAAQ,EAAgB,GACpF,EAAW,GAAO,GAGrB,EAAA,kBAAkB,EAAI,EAAK,EAAe,EAAgB,CAEnD,IAGH,GACJ,EACA,EACA,EACA,IACY,CACZ,GAAI,CAAC,EAAO,WAAW,IAAI,CAAE,MAAO,GAEpC,IAAM,EAAM,EAAO,MAAM,EAAE,CAO3B,OAJK,EAFU,EAAA,wBAAwB,EAAS,CAEf,GAAU,EAAG,gBAAgB,EAAK,EAAQ,EAAO,CAAE,EAAgB,EAClG,EAAG,gBAAgB,EAAK,EAAQ,EAAU,CAGrC,IAGH,GACJ,EACA,EACA,EACA,IACS,CAGJ,EAFU,EAAA,wBAAwB,EAAS,CAEf,GAAU,EAAA,QAAQ,EAAI,EAAQ,EAAM,CAAE,EAAgB,EACrF,EAAA,QAAQ,EAAI,EAAQ,EAAS,EAI3B,GAAc,EAAiB,EAAgB,EAAuB,IAA2C,CACjH,IAAa,IAAA,KAEb,EAAgB,EAAI,EAAQ,EAAU,EAAgB,EAEtD,EAAmB,EAAI,EAAQ,EAAU,EAAgB,EAEzD,EAA2B,EAAI,EAAQ,EAAU,EAAgB,EAErE,EAAoB,EAAI,EAAQ,EAAU,EAAgB,GAY5D,SAAgB,EAAO,EAA6C,CAClE,MAAO,CACL,MAAM,EAAI,CAAE,mBAAmB,CAC7B,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAI,CAC5C,EAAW,EAAI,EAAK,EAAO,EAAgB,EAGhD"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type ReadonlySignal } from '@vielzeug/stateit';
|
|
2
|
-
import { type Directive } from '../core/internal';
|
|
3
|
-
export type SpreadValue = string | number | boolean | null | undefined | ReadonlySignal<string | number | boolean | null | undefined> | (() => string | number | boolean | null | undefined) | ((event: Event) => void);
|
|
4
|
-
/**
|
|
5
|
-
* Unified spread directive for attributes, properties, and events.
|
|
6
|
-
*
|
|
7
|
-
* Key prefixes:
|
|
8
|
-
* - `name` -> attribute
|
|
9
|
-
* - `?name` -> boolean attribute
|
|
10
|
-
* - `.name` -> DOM property
|
|
11
|
-
* - `@name` -> event listener
|
|
12
|
-
*/
|
|
13
|
-
export declare function spread(map: Record<string, SpreadValue>): Directive;
|
|
14
|
-
//# sourceMappingURL=spread.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spread.d.ts","sourceRoot":"","sources":["../../src/directives/spread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,cAAc,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GAC5D,CAAC,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GACpD,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC;AAmG7B;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS,CAQlE"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"../core/internal.js";import{listen as e,setAttr as t}from"../core/utilities.js";import{bindPropertyModel as n,hasWritableValueSetter as r,toReactiveBindingSource as i}from"../core/runtime-bindings.js";import{effect as a}from"@vielzeug/stateit";var o=(e,t,n)=>e?(n(a(()=>{t(e.value)})),!0):!1,s=(t,n,r,i)=>n.startsWith(`@`)?(typeof r==`function`&&i(e(t,n.slice(1),r)),!0):!1,c=(e,t,a,s)=>{if(!t.startsWith(`.`))return!1;let c=t.slice(1),l=r(a)?a:void 0;return o(i(a),t=>e[c]=t,s)||(e[c]=a),n(e,c,l,s),!0},l=(e,t,n,r)=>{if(!t.startsWith(`?`))return!1;let a=t.slice(1);return o(i(n),t=>e.toggleAttribute(a,!!t),r)||e.toggleAttribute(a,!!n),!0},u=(e,n,r,a)=>{o(i(r),r=>t(e,n,r),a)||t(e,n,r)},d=(e,t,n,r)=>{n!==void 0&&(s(e,t,n,r)||c(e,t,n,r)||l(e,t,n,r)||u(e,t,n,r))};function f(e){return{mount(t,{registerCleanup:n}){for(let[r,i]of Object.entries(e))d(t,r,i,n)}}}export{f as spread};
|
|
2
|
-
//# sourceMappingURL=spread.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spread.js","names":[],"sources":["../../src/directives/spread.ts"],"sourcesContent":["import { effect, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { type Directive } from '../core/internal';\nimport { bindPropertyModel, hasWritableValueSetter, toReactiveBindingSource } from '../core/runtime-bindings';\nimport { listen, setAttr } from '../core/utilities';\n\nexport type SpreadValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | ReadonlySignal<string | number | boolean | null | undefined>\n | (() => string | number | boolean | null | undefined)\n | ((event: Event) => void);\n\ntype RegisterCleanup = (fn: () => void) => void;\n\nconst applyReactiveValue = (\n source: ReadonlySignal<unknown> | undefined,\n apply: (value: unknown) => void,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!source) return false;\n\n registerCleanup(\n effect(() => {\n apply(source.value);\n }),\n );\n\n return true;\n};\n\nconst applyEventEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!rawKey.startsWith('@')) return false;\n\n if (typeof rawValue === 'function') {\n registerCleanup(listen(el, rawKey.slice(1), rawValue as (event: Event) => void));\n }\n\n return true;\n};\n\nconst applyPropertyEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!rawKey.startsWith('.')) return false;\n\n const key = rawKey.slice(1);\n const writableModel = hasWritableValueSetter(rawValue) ? rawValue : undefined;\n const source = toReactiveBindingSource(rawValue);\n\n if (!applyReactiveValue(source, (value) => ((el as any)[key] = value), registerCleanup)) {\n (el as any)[key] = rawValue;\n }\n\n bindPropertyModel(el, key, writableModel, registerCleanup);\n\n return true;\n};\n\nconst applyBooleanAttributeEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): boolean => {\n if (!rawKey.startsWith('?')) return false;\n\n const key = rawKey.slice(1);\n const source = toReactiveBindingSource(rawValue);\n\n if (!applyReactiveValue(source, (value) => el.toggleAttribute(key, Boolean(value)), registerCleanup)) {\n el.toggleAttribute(key, Boolean(rawValue));\n }\n\n return true;\n};\n\nconst applyAttributeEntry = (\n el: HTMLElement,\n rawKey: string,\n rawValue: SpreadValue,\n registerCleanup: RegisterCleanup,\n): void => {\n const source = toReactiveBindingSource(rawValue);\n\n if (!applyReactiveValue(source, (value) => setAttr(el, rawKey, value), registerCleanup)) {\n setAttr(el, rawKey, rawValue);\n }\n};\n\nconst applyEntry = (el: HTMLElement, rawKey: string, rawValue: SpreadValue, registerCleanup: RegisterCleanup): void => {\n if (rawValue === undefined) return;\n\n if (applyEventEntry(el, rawKey, rawValue, registerCleanup)) return;\n\n if (applyPropertyEntry(el, rawKey, rawValue, registerCleanup)) return;\n\n if (applyBooleanAttributeEntry(el, rawKey, rawValue, registerCleanup)) return;\n\n applyAttributeEntry(el, rawKey, rawValue, registerCleanup);\n};\n\n/**\n * Unified spread directive for attributes, properties, and events.\n *\n * Key prefixes:\n * - `name` -> attribute\n * - `?name` -> boolean attribute\n * - `.name` -> DOM property\n * - `@name` -> event listener\n */\nexport function spread(map: Record<string, SpreadValue>): Directive {\n return {\n mount(el, { registerCleanup }) {\n for (const [key, value] of Object.entries(map)) {\n applyEntry(el, key, value, registerCleanup);\n }\n },\n };\n}\n"],"mappings":"2PAkBA,IAAM,GACJ,EACA,EACA,IAEK,GAEL,EACE,MAAa,CACX,EAAM,EAAO,MAAM,EACnB,CACH,CAEM,IARa,GAWhB,GACJ,EACA,EACA,EACA,IAEK,EAAO,WAAW,IAAI,EAEvB,OAAO,GAAa,YACtB,EAAgB,EAAO,EAAI,EAAO,MAAM,EAAE,CAAE,EAAmC,CAAC,CAG3E,IAN6B,GAShC,GACJ,EACA,EACA,EACA,IACY,CACZ,GAAI,CAAC,EAAO,WAAW,IAAI,CAAE,MAAO,GAEpC,IAAM,EAAM,EAAO,MAAM,EAAE,CACrB,EAAgB,EAAuB,EAAS,CAAG,EAAW,IAAA,GASpE,OANK,EAFU,EAAwB,EAAS,CAEf,GAAW,EAAY,GAAO,EAAQ,EAAgB,GACpF,EAAW,GAAO,GAGrB,EAAkB,EAAI,EAAK,EAAe,EAAgB,CAEnD,IAGH,GACJ,EACA,EACA,EACA,IACY,CACZ,GAAI,CAAC,EAAO,WAAW,IAAI,CAAE,MAAO,GAEpC,IAAM,EAAM,EAAO,MAAM,EAAE,CAO3B,OAJK,EAFU,EAAwB,EAAS,CAEf,GAAU,EAAG,gBAAgB,EAAK,EAAQ,EAAO,CAAE,EAAgB,EAClG,EAAG,gBAAgB,EAAK,EAAQ,EAAU,CAGrC,IAGH,GACJ,EACA,EACA,EACA,IACS,CAGJ,EAFU,EAAwB,EAAS,CAEf,GAAU,EAAQ,EAAI,EAAQ,EAAM,CAAE,EAAgB,EACrF,EAAQ,EAAI,EAAQ,EAAS,EAI3B,GAAc,EAAiB,EAAgB,EAAuB,IAA2C,CACjH,IAAa,IAAA,KAEb,EAAgB,EAAI,EAAQ,EAAU,EAAgB,EAEtD,EAAmB,EAAI,EAAQ,EAAU,EAAgB,EAEzD,EAA2B,EAAI,EAAQ,EAAU,EAAgB,EAErE,EAAoB,EAAI,EAAQ,EAAU,EAAgB,GAY5D,SAAgB,EAAO,EAA6C,CAClE,MAAO,CACL,MAAM,EAAI,CAAE,mBAAmB,CAC7B,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAI,CAC5C,EAAW,EAAI,EAAK,EAAO,EAAgB,EAGhD"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../core/utilities.cjs`);let t=require(`@vielzeug/stateit`);var n=new Set([`animationIterationCount`,`columnCount`,`flex`,`flexGrow`,`flexShrink`,`fontWeight`,`gridColumn`,`gridRow`,`lineHeight`,`opacity`,`order`,`orphans`,`tabSize`,`widows`,`zIndex`]),r=(e,t)=>typeof t==`number`&&!n.has(e)?`${t}px`:String(t);function i(n){let i=Object.entries(n),a=i.some(([,e])=>(0,t.isSignal)(e)||typeof e==`function`),o=()=>{let n=[];for(let[a,o]of i){let i=(0,t.isSignal)(o)?o.value:typeof o==`function`?o():o;i!=null&&i!==``&&n.push(`${e.toKebab(a)}:${r(a,i)}`)}return n.join(`;`)};return a?(0,t.computed)(o):o()}exports.style=i;
|
|
2
|
-
//# sourceMappingURL=style.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"style.cjs","names":[],"sources":["../../src/directives/style.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { toKebab } from '../core/utilities';\n\ntype StyleValue =\n | string\n | number\n | undefined\n | null\n | Signal<string | number>\n | ReadonlySignal<string | number>\n | (() => string | number | null | undefined);\n\n/** Properties that are unitless — numbers are NOT suffixed with 'px'. */\nconst UNITLESS = new Set([\n 'animationIterationCount',\n 'columnCount',\n 'flex',\n 'flexGrow',\n 'flexShrink',\n 'fontWeight',\n 'gridColumn',\n 'gridRow',\n 'lineHeight',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'widows',\n 'zIndex',\n]);\n\nconst toCssValue = (prop: string, val: string | number): string => {\n if (typeof val === 'number' && !UNITLESS.has(prop)) return `${val}px`;\n\n return String(val);\n};\n\n/**\n * Build a dynamic inline style string from an object map of CSS properties to values.\n * Supports camelCase property names (auto-converted to kebab-case). Number values\n * automatically get a `px` suffix except for unitless properties (opacity, zIndex, etc.).\n *\n * When any value is a reactive Signal or getter function the returned value is a\n * `ReadonlySignal<string>` that updates automatically — no arrow-function wrapper needed.\n *\n * @example\n * import { style } from '@vielzeug/craftit/directives';\n *\n * // Static — returns a plain string\n * html`<div style=${style({ color: 'red', fontSize: 16 })}></div>`\n *\n * // Reactive — returns a signal\n * html`<div style=${style({ fontSize: size, color: theme })}></div>`\n */\nexport function style(map: Record<string, StyleValue>): string | ReadonlySignal<string> {\n const entries = Object.entries(map);\n const hasReactive = entries.some(([, v]) => isSignal(v) || typeof v === 'function');\n\n const build = (): string => {\n const parts: string[] = [];\n\n for (const [k, v] of entries) {\n const raw = isSignal(v)\n ? (v as ReadonlySignal<string | number>).value\n : typeof v === 'function'\n ? (v as () => string | number | null | undefined)()\n : v;\n\n if (raw != null && raw !== '') parts.push(`${toKebab(k)}:${toCssValue(k, raw as string | number)}`);\n }\n\n return parts.join(';');\n };\n\n return hasReactive ? computed(build) : build();\n}\n"],"mappings":"4EAcA,IAAM,EAAW,IAAI,IAAI,CACvB,0BACA,cACA,OACA,WACA,aACA,aACA,aACA,UACA,aACA,UACA,QACA,UACA,UACA,SACA,SACD,CAAC,CAEI,GAAc,EAAc,IAC5B,OAAO,GAAQ,UAAY,CAAC,EAAS,IAAI,EAAK,CAAS,GAAG,EAAI,IAE3D,OAAO,EAAI,CAoBpB,SAAgB,EAAM,EAAkE,CACtF,IAAM,EAAU,OAAO,QAAQ,EAAI,CAC7B,EAAc,EAAQ,MAAM,EAAG,MAAA,EAAA,EAAA,UAAgB,EAAE,EAAI,OAAO,GAAM,WAAW,CAE7E,MAAsB,CAC1B,IAAM,EAAkB,EAAE,CAE1B,IAAK,GAAM,CAAC,EAAG,KAAM,EAAS,CAC5B,IAAM,GAAA,EAAA,EAAA,UAAe,EAAE,CAClB,EAAsC,MACvC,OAAO,GAAM,WACV,GAAgD,CACjD,EAEF,GAAO,MAAQ,IAAQ,IAAI,EAAM,KAAK,GAAG,EAAA,QAAQ,EAAE,CAAC,GAAG,EAAW,EAAG,EAAuB,GAAG,CAGrG,OAAO,EAAM,KAAK,IAAI,EAGxB,OAAO,GAAA,EAAA,EAAA,UAAuB,EAAM,CAAG,GAAO"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';
|
|
2
|
-
type StyleValue = string | number | undefined | null | Signal<string | number> | ReadonlySignal<string | number> | (() => string | number | null | undefined);
|
|
3
|
-
/**
|
|
4
|
-
* Build a dynamic inline style string from an object map of CSS properties to values.
|
|
5
|
-
* Supports camelCase property names (auto-converted to kebab-case). Number values
|
|
6
|
-
* automatically get a `px` suffix except for unitless properties (opacity, zIndex, etc.).
|
|
7
|
-
*
|
|
8
|
-
* When any value is a reactive Signal or getter function the returned value is a
|
|
9
|
-
* `ReadonlySignal<string>` that updates automatically — no arrow-function wrapper needed.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* import { style } from '@vielzeug/craftit/directives';
|
|
13
|
-
*
|
|
14
|
-
* // Static — returns a plain string
|
|
15
|
-
* html`<div style=${style({ color: 'red', fontSize: 16 })}></div>`
|
|
16
|
-
*
|
|
17
|
-
* // Reactive — returns a signal
|
|
18
|
-
* html`<div style=${style({ fontSize: size, color: theme })}></div>`
|
|
19
|
-
*/
|
|
20
|
-
export declare function style(map: Record<string, StyleValue>): string | ReadonlySignal<string>;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=style.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/directives/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIzF,KAAK,UAAU,GACX,MAAM,GACN,MAAM,GACN,SAAS,GACT,IAAI,GACJ,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GACvB,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,GAC/B,CAAC,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AA2B/C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAqBtF"}
|
package/dist/directives/style.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{toKebab as e}from"../core/utilities.js";import{computed as t,isSignal as n}from"@vielzeug/stateit";var r=new Set([`animationIterationCount`,`columnCount`,`flex`,`flexGrow`,`flexShrink`,`fontWeight`,`gridColumn`,`gridRow`,`lineHeight`,`opacity`,`order`,`orphans`,`tabSize`,`widows`,`zIndex`]),i=(e,t)=>typeof t==`number`&&!r.has(e)?`${t}px`:String(t);function a(r){let a=Object.entries(r),o=a.some(([,e])=>n(e)||typeof e==`function`),s=()=>{let t=[];for(let[r,o]of a){let a=n(o)?o.value:typeof o==`function`?o():o;a!=null&&a!==``&&t.push(`${e(r)}:${i(r,a)}`)}return t.join(`;`)};return o?t(s):s()}export{a as style};
|
|
2
|
-
//# sourceMappingURL=style.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","names":[],"sources":["../../src/directives/style.ts"],"sourcesContent":["import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { toKebab } from '../core/utilities';\n\ntype StyleValue =\n | string\n | number\n | undefined\n | null\n | Signal<string | number>\n | ReadonlySignal<string | number>\n | (() => string | number | null | undefined);\n\n/** Properties that are unitless — numbers are NOT suffixed with 'px'. */\nconst UNITLESS = new Set([\n 'animationIterationCount',\n 'columnCount',\n 'flex',\n 'flexGrow',\n 'flexShrink',\n 'fontWeight',\n 'gridColumn',\n 'gridRow',\n 'lineHeight',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'widows',\n 'zIndex',\n]);\n\nconst toCssValue = (prop: string, val: string | number): string => {\n if (typeof val === 'number' && !UNITLESS.has(prop)) return `${val}px`;\n\n return String(val);\n};\n\n/**\n * Build a dynamic inline style string from an object map of CSS properties to values.\n * Supports camelCase property names (auto-converted to kebab-case). Number values\n * automatically get a `px` suffix except for unitless properties (opacity, zIndex, etc.).\n *\n * When any value is a reactive Signal or getter function the returned value is a\n * `ReadonlySignal<string>` that updates automatically — no arrow-function wrapper needed.\n *\n * @example\n * import { style } from '@vielzeug/craftit/directives';\n *\n * // Static — returns a plain string\n * html`<div style=${style({ color: 'red', fontSize: 16 })}></div>`\n *\n * // Reactive — returns a signal\n * html`<div style=${style({ fontSize: size, color: theme })}></div>`\n */\nexport function style(map: Record<string, StyleValue>): string | ReadonlySignal<string> {\n const entries = Object.entries(map);\n const hasReactive = entries.some(([, v]) => isSignal(v) || typeof v === 'function');\n\n const build = (): string => {\n const parts: string[] = [];\n\n for (const [k, v] of entries) {\n const raw = isSignal(v)\n ? (v as ReadonlySignal<string | number>).value\n : typeof v === 'function'\n ? (v as () => string | number | null | undefined)()\n : v;\n\n if (raw != null && raw !== '') parts.push(`${toKebab(k)}:${toCssValue(k, raw as string | number)}`);\n }\n\n return parts.join(';');\n };\n\n return hasReactive ? computed(build) : build();\n}\n"],"mappings":"0GAcA,IAAM,EAAW,IAAI,IAAI,CACvB,0BACA,cACA,OACA,WACA,aACA,aACA,aACA,UACA,aACA,UACA,QACA,UACA,UACA,SACA,SACD,CAAC,CAEI,GAAc,EAAc,IAC5B,OAAO,GAAQ,UAAY,CAAC,EAAS,IAAI,EAAK,CAAS,GAAG,EAAI,IAE3D,OAAO,EAAI,CAoBpB,SAAgB,EAAM,EAAkE,CACtF,IAAM,EAAU,OAAO,QAAQ,EAAI,CAC7B,EAAc,EAAQ,MAAM,EAAG,KAAO,EAAS,EAAE,EAAI,OAAO,GAAM,WAAW,CAE7E,MAAsB,CAC1B,IAAM,EAAkB,EAAE,CAE1B,IAAK,GAAM,CAAC,EAAG,KAAM,EAAS,CAC5B,IAAM,EAAM,EAAS,EAAE,CAClB,EAAsC,MACvC,OAAO,GAAM,WACV,GAAgD,CACjD,EAEF,GAAO,MAAQ,IAAQ,IAAI,EAAM,KAAK,GAAG,EAAQ,EAAE,CAAC,GAAG,EAAW,EAAG,EAAuB,GAAG,CAGrG,OAAO,EAAM,KAAK,IAAI,EAGxB,OAAO,EAAc,EAAS,EAAM,CAAG,GAAO"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
let e=require(`@vielzeug/stateit`);function t(t,n,r){let i=(0,e.signal)({done:!1});return t.then(e=>{i.value={done:!0,value:e}},e=>{r?i.value={done:!0,value:r(e)}:i.value={done:!0,value:`Error: ${String(e)}`}}),()=>i.value.done?i.value.value:n?.()??``}exports.until=t;
|
|
2
|
-
//# sourceMappingURL=until.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"until.cjs","names":[],"sources":["../../src/directives/until.ts"],"sourcesContent":["import { signal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype State = { done: false } | { done: true; value: string | HTMLResult };\n\n/**\n * Renders `pendingFn` while a Promise is pending, then switches to the resolved\n * result. Lighter-weight alternative to `suspense()` for one-shot data loading\n * with no error/retry UI.\n *\n * Returns a reactive getter the engine tracks automatically — no manual signal\n * management needed at the call site.\n *\n * @param promise The promise to await. Should already resolve to a renderable value.\n * @param pendingFn Optional function called while the promise is pending.\n * @param onError Optional function called when the promise rejects. Receives the rejection reason.\n *\n * @example\n * import { until } from '@vielzeug/craftit/directives';\n *\n * const data = fetch('/api/user').then(r => r.json());\n *\n * html`${until(\n * data.then(u => html`<p>Hello, ${u.name}!</p>`),\n * () => html`<p>Loading…</p>`,\n * (err) => html`<p>Error: ${String(err)}</p>`,\n * )}`\n */\nexport function until(\n promise: Promise<string | HTMLResult>,\n pendingFn?: () => string | HTMLResult,\n onError?: (err: unknown) => string | HTMLResult,\n): () => string | HTMLResult {\n const state = signal<State>({ done: false });\n\n promise.then(\n (val) => {\n state.value = { done: true, value: val };\n },\n (err) => {\n if (onError) {\n state.value = { done: true, value: onError(err) };\n } else {\n state.value = { done: true, value: `Error: ${String(err)}` };\n }\n },\n );\n\n return () => (state.value.done ? state.value.value : (pendingFn?.() ?? ''));\n}\n"],"mappings":"mCA6BA,SAAgB,EACd,EACA,EACA,EAC2B,CAC3B,IAAM,GAAA,EAAA,EAAA,QAAsB,CAAE,KAAM,GAAO,CAAC,CAe5C,OAbA,EAAQ,KACL,GAAQ,CACP,EAAM,MAAQ,CAAE,KAAM,GAAM,MAAO,EAAK,EAEzC,GAAQ,CACH,EACF,EAAM,MAAQ,CAAE,KAAM,GAAM,MAAO,EAAQ,EAAI,CAAE,CAEjD,EAAM,MAAQ,CAAE,KAAM,GAAM,MAAO,UAAU,OAAO,EAAI,GAAI,EAGjE,KAEa,EAAM,MAAM,KAAO,EAAM,MAAM,MAAS,KAAa,EAAI"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { HTMLResult } from '../core/internal';
|
|
2
|
-
/**
|
|
3
|
-
* Renders `pendingFn` while a Promise is pending, then switches to the resolved
|
|
4
|
-
* result. Lighter-weight alternative to `suspense()` for one-shot data loading
|
|
5
|
-
* with no error/retry UI.
|
|
6
|
-
*
|
|
7
|
-
* Returns a reactive getter the engine tracks automatically — no manual signal
|
|
8
|
-
* management needed at the call site.
|
|
9
|
-
*
|
|
10
|
-
* @param promise The promise to await. Should already resolve to a renderable value.
|
|
11
|
-
* @param pendingFn Optional function called while the promise is pending.
|
|
12
|
-
* @param onError Optional function called when the promise rejects. Receives the rejection reason.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* import { until } from '@vielzeug/craftit/directives';
|
|
16
|
-
*
|
|
17
|
-
* const data = fetch('/api/user').then(r => r.json());
|
|
18
|
-
*
|
|
19
|
-
* html`${until(
|
|
20
|
-
* data.then(u => html`<p>Hello, ${u.name}!</p>`),
|
|
21
|
-
* () => html`<p>Loading…</p>`,
|
|
22
|
-
* (err) => html`<p>Error: ${String(err)}</p>`,
|
|
23
|
-
* )}`
|
|
24
|
-
*/
|
|
25
|
-
export declare function until(promise: Promise<string | HTMLResult>, pendingFn?: () => string | HTMLResult, onError?: (err: unknown) => string | HTMLResult): () => string | HTMLResult;
|
|
26
|
-
//# sourceMappingURL=until.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"until.d.ts","sourceRoot":"","sources":["../../src/directives/until.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,EACrC,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,UAAU,EACrC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,UAAU,GAC9C,MAAM,MAAM,GAAG,UAAU,CAiB3B"}
|
package/dist/directives/until.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{signal as e}from"@vielzeug/stateit";function t(t,n,r){let i=e({done:!1});return t.then(e=>{i.value={done:!0,value:e}},e=>{r?i.value={done:!0,value:r(e)}:i.value={done:!0,value:`Error: ${String(e)}`}}),()=>i.value.done?i.value.value:n?.()??``}export{t as until};
|
|
2
|
-
//# sourceMappingURL=until.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"until.js","names":[],"sources":["../../src/directives/until.ts"],"sourcesContent":["import { signal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../core/internal';\n\ntype State = { done: false } | { done: true; value: string | HTMLResult };\n\n/**\n * Renders `pendingFn` while a Promise is pending, then switches to the resolved\n * result. Lighter-weight alternative to `suspense()` for one-shot data loading\n * with no error/retry UI.\n *\n * Returns a reactive getter the engine tracks automatically — no manual signal\n * management needed at the call site.\n *\n * @param promise The promise to await. Should already resolve to a renderable value.\n * @param pendingFn Optional function called while the promise is pending.\n * @param onError Optional function called when the promise rejects. Receives the rejection reason.\n *\n * @example\n * import { until } from '@vielzeug/craftit/directives';\n *\n * const data = fetch('/api/user').then(r => r.json());\n *\n * html`${until(\n * data.then(u => html`<p>Hello, ${u.name}!</p>`),\n * () => html`<p>Loading…</p>`,\n * (err) => html`<p>Error: ${String(err)}</p>`,\n * )}`\n */\nexport function until(\n promise: Promise<string | HTMLResult>,\n pendingFn?: () => string | HTMLResult,\n onError?: (err: unknown) => string | HTMLResult,\n): () => string | HTMLResult {\n const state = signal<State>({ done: false });\n\n promise.then(\n (val) => {\n state.value = { done: true, value: val };\n },\n (err) => {\n if (onError) {\n state.value = { done: true, value: onError(err) };\n } else {\n state.value = { done: true, value: `Error: ${String(err)}` };\n }\n },\n );\n\n return () => (state.value.done ? state.value.value : (pendingFn?.() ?? ''));\n}\n"],"mappings":"2CA6BA,SAAgB,EACd,EACA,EACA,EAC2B,CAC3B,IAAM,EAAQ,EAAc,CAAE,KAAM,GAAO,CAAC,CAe5C,OAbA,EAAQ,KACL,GAAQ,CACP,EAAM,MAAQ,CAAE,KAAM,GAAM,MAAO,EAAK,EAEzC,GAAQ,CACH,EACF,EAAM,MAAQ,CAAE,KAAM,GAAM,MAAO,EAAQ,EAAI,CAAE,CAEjD,EAAM,MAAQ,CAAE,KAAM,GAAM,MAAO,UAAU,OAAO,EAAI,GAAI,EAGjE,KAEa,EAAM,MAAM,KAAO,EAAM,MAAM,MAAS,KAAa,EAAI"}
|
package/dist/labs/a11y.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../core/runtime-lifecycle.cjs`),t=require(`../core/utilities.cjs`);require(`../core/runtime.cjs`);function n(n,r){let i=r.labelId||t.createId(`a11y-label`),a=r.helperId||t.createId(`a11y-helper`),o=null;return n.setAttribute(`role`,r.role),e.onMount(()=>{let t=n.shadowRoot;if(t&&(o=t.querySelector(`[data-a11y-helper]`)),t){let e=t.querySelector(`[data-a11y-label]`);if(e){let t=e.querySelector(`slot`);(t?t.assignedNodes().length>0:e.textContent?.trim().length??!1)&&(e.id=i,n.setAttribute(`aria-labelledby`,i))}}e.effect(()=>{if(r.checked){let e=r.checked();e!==void 0&&n.setAttribute(`aria-checked`,e)}if(r.invalid){let e=r.invalid();n.setAttribute(`aria-invalid`,String(e))}if(r.helperText&&o){let e=r.helperText();e?(o.textContent=e,o.hidden=!1,n.setAttribute(`aria-describedby`,a),(r.helperTone?.()??`default`)===`error`?o.setAttribute(`role`,`alert`):o.removeAttribute(`role`)):(o.hidden=!0,n.removeAttribute(`aria-describedby`))}})}),{helperId:a,labelId:i}}exports.useA11yControl=n;
|
|
2
|
-
//# sourceMappingURL=a11y.cjs.map
|
package/dist/labs/a11y.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"a11y.cjs","names":[],"sources":["../../src/labs/a11y.ts"],"sourcesContent":["import { effect, onMount } from '../core/runtime';\nimport { createId } from '../core/utilities';\n\n/**\n * Tone of helper/error text: 'default' for helper, 'error' for error message.\n */\nexport type A11yTone = 'default' | 'error';\n\n/**\n * Configuration for `useA11yControl()`.\n *\n * Label presence is detected via DOM query (not heuristics).\n * All other state getters are reactive and can change over time.\n */\nexport type A11yControlConfig = {\n /** Reactive aria-checked value ('true' | 'false' | 'mixed' | undefined) */\n checked?: () => 'true' | 'false' | 'mixed' | undefined;\n /** Optional: custom helper ID instead of auto-generated */\n helperId?: string;\n /** Helper text content (mutually exclusive with explicit label/helper management) */\n helperText?: () => string | undefined;\n /** Tone of helper text: 'error' to set role=\"alert\", 'default' otherwise */\n helperTone?: () => A11yTone;\n /** Reactive aria-invalid value */\n invalid?: () => boolean;\n /** Optional: custom label ID instead of auto-generated */\n labelId?: string;\n /** ARIA role (e.g., 'checkbox', 'radio', 'switch') */\n role: string;\n};\n\n/**\n * Return value from `useA11yControl()`.\n */\nexport type A11yControlHandle = {\n /** ID for helper text element */\n helperId: string;\n /** ID for label element */\n labelId: string;\n};\n\n/**\n * Manages ARIA attributes, IDs, and helper/error live region for accessible form controls.\n *\n * Encapsulates:\n * - Stable ID generation for labels and helpers\n * - `aria-labelledby` wiring when label is present (detected via DOM query)\n * - `aria-describedby` wiring when helper text is present\n * - `aria-invalid` sync with error state\n * - `aria-checked` for checkable controls\n * - Helper text live region with `aria-live=\"polite\"` or `role=\"alert\"` based on tone\n *\n * @example\n * const a11y = useA11yControl(host, {\n * role: 'checkbox',\n * checked: () => indeterminate.value ? 'mixed' : String(checked.value),\n * invalid: () => !!error.value,\n * helperText: () => error.value || helper.value,\n * helperTone: () => error.value ? 'error' : 'default',\n * });\n *\n * // Later in template:\n * // <span id=${a11y.labelId}>Label</span>\n * // <div id=${a11y.helperId} aria-live=\"polite\">Error or helper text</div>\n */\nexport function useA11yControl(host: HTMLElement, config: A11yControlConfig): A11yControlHandle {\n const labelId = config.labelId || createId('a11y-label');\n const helperId = config.helperId || createId('a11y-helper');\n\n let helperElement: HTMLDivElement | null = null;\n\n // Set role once at setup\n host.setAttribute('role', config.role);\n\n onMount(() => {\n // Find helper element in shadow DOM\n const shadow = host.shadowRoot;\n\n if (shadow) {\n helperElement = shadow.querySelector('[data-a11y-helper]') as HTMLDivElement | null;\n }\n\n // Detect label presence via DOM query: check if label span has slotted content\n if (shadow) {\n const labelSpan = shadow.querySelector('[data-a11y-label]') as HTMLElement | null;\n\n if (labelSpan) {\n // Check if the label slot has any assigned nodes\n const slot = labelSpan.querySelector('slot') as HTMLSlotElement | null;\n const hasLabelContent = slot\n ? slot.assignedNodes().length > 0\n : (labelSpan.textContent?.trim().length ?? 0 > 0);\n\n if (hasLabelContent) {\n labelSpan.id = labelId;\n host.setAttribute('aria-labelledby', labelId);\n }\n }\n }\n\n // Reactive effects for aria attrs that can change\n effect(() => {\n // aria-checked\n if (config.checked) {\n const checked = config.checked();\n\n if (checked !== undefined) {\n host.setAttribute('aria-checked', checked);\n }\n }\n\n // aria-invalid\n if (config.invalid) {\n const invalid = config.invalid();\n\n host.setAttribute('aria-invalid', String(invalid));\n }\n\n // Helper text and describedby\n if (config.helperText && helperElement) {\n const text = config.helperText();\n\n if (text) {\n helperElement.textContent = text;\n helperElement.hidden = false;\n host.setAttribute('aria-describedby', helperId);\n\n // Set role based on explicit tone (no text heuristics)\n const tone = config.helperTone?.() ?? 'default';\n\n if (tone === 'error') {\n helperElement.setAttribute('role', 'alert');\n } else {\n helperElement.removeAttribute('role');\n }\n } else {\n helperElement.hidden = true;\n host.removeAttribute('aria-describedby');\n }\n }\n });\n });\n\n return {\n helperId,\n labelId,\n };\n}\n"],"mappings":"mHAiEA,SAAgB,EAAe,EAAmB,EAA8C,CAC9F,IAAM,EAAU,EAAO,SAAW,EAAA,SAAS,aAAa,CAClD,EAAW,EAAO,UAAY,EAAA,SAAS,cAAc,CAEvD,EAAuC,KA0E3C,OAvEA,EAAK,aAAa,OAAQ,EAAO,KAAK,CAEtC,EAAA,YAAc,CAEZ,IAAM,EAAS,EAAK,WAOpB,GALI,IACF,EAAgB,EAAO,cAAc,qBAAqB,EAIxD,EAAQ,CACV,IAAM,EAAY,EAAO,cAAc,oBAAoB,CAE3D,GAAI,EAAW,CAEb,IAAM,EAAO,EAAU,cAAc,OAAO,EACpB,EACpB,EAAK,eAAe,CAAC,OAAS,EAC7B,EAAU,aAAa,MAAM,CAAC,QAAU,MAG3C,EAAU,GAAK,EACf,EAAK,aAAa,kBAAmB,EAAQ,GAMnD,EAAA,WAAa,CAEX,GAAI,EAAO,QAAS,CAClB,IAAM,EAAU,EAAO,SAAS,CAE5B,IAAY,IAAA,IACd,EAAK,aAAa,eAAgB,EAAQ,CAK9C,GAAI,EAAO,QAAS,CAClB,IAAM,EAAU,EAAO,SAAS,CAEhC,EAAK,aAAa,eAAgB,OAAO,EAAQ,CAAC,CAIpD,GAAI,EAAO,YAAc,EAAe,CACtC,IAAM,EAAO,EAAO,YAAY,CAE5B,GACF,EAAc,YAAc,EAC5B,EAAc,OAAS,GACvB,EAAK,aAAa,mBAAoB,EAAS,EAGlC,EAAO,cAAc,EAAI,aAEzB,QACX,EAAc,aAAa,OAAQ,QAAQ,CAE3C,EAAc,gBAAgB,OAAO,GAGvC,EAAc,OAAS,GACvB,EAAK,gBAAgB,mBAAmB,IAG5C,EACF,CAEK,CACL,WACA,UACD"}
|