@vielzeug/craftit 2.1.0 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -124
- package/dist/controls/a11y-control.cjs +1 -1
- package/dist/controls/a11y-control.cjs.map +1 -1
- package/dist/controls/a11y-control.d.ts +1 -1
- package/dist/controls/a11y-control.d.ts.map +1 -1
- package/dist/controls/a11y-control.js +1 -1
- package/dist/controls/a11y-control.js.map +1 -1
- package/dist/controls/checkable-control.cjs +1 -1
- package/dist/controls/checkable-control.cjs.map +1 -1
- package/dist/controls/checkable-control.d.ts +7 -7
- package/dist/controls/checkable-control.d.ts.map +1 -1
- package/dist/controls/checkable-control.js +1 -1
- package/dist/controls/checkable-control.js.map +1 -1
- 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 +1 -1
- package/dist/controls/field-control.cjs.map +1 -1
- package/dist/controls/field-control.d.ts +28 -73
- package/dist/controls/field-control.d.ts.map +1 -1
- package/dist/controls/field-control.js +1 -1
- package/dist/controls/field-control.js.map +1 -1
- package/dist/controls/index.d.ts +11 -9
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/internal/control-state.cjs +1 -1
- package/dist/controls/internal/control-state.cjs.map +1 -1
- package/dist/controls/internal/control-state.d.ts +6 -4
- package/dist/controls/internal/control-state.d.ts.map +1 -1
- package/dist/controls/internal/control-state.js +1 -1
- package/dist/controls/internal/control-state.js.map +1 -1
- package/dist/controls/internal/keyboard-utils.cjs.map +1 -1
- package/dist/controls/internal/keyboard-utils.js.map +1 -1
- package/dist/controls/internal/number-utils.cjs.map +1 -1
- package/dist/controls/internal/number-utils.js.map +1 -1
- package/dist/controls/internal/validation-utils.cjs.map +1 -1
- package/dist/controls/internal/validation-utils.js.map +1 -1
- package/dist/controls/list-control.cjs +1 -1
- package/dist/controls/list-control.cjs.map +1 -1
- package/dist/controls/list-control.d.ts +10 -8
- package/dist/controls/list-control.d.ts.map +1 -1
- package/dist/controls/list-control.js +1 -1
- package/dist/controls/list-control.js.map +1 -1
- package/dist/controls/overlay-control.cjs +1 -1
- package/dist/controls/overlay-control.cjs.map +1 -1
- package/dist/controls/overlay-control.d.ts +17 -14
- package/dist/controls/overlay-control.d.ts.map +1 -1
- package/dist/controls/overlay-control.js +1 -1
- package/dist/controls/overlay-control.js.map +1 -1
- 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.map +1 -1
- package/dist/controls/press-control.js.map +1 -1
- package/dist/controls/slider-control.cjs.map +1 -1
- package/dist/controls/slider-control.js.map +1 -1
- package/dist/controls/spinner-control.cjs.map +1 -1
- package/dist/controls/spinner-control.js.map +1 -1
- 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 -1
- package/dist/controls.js +1 -1
- 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 +5 -30
- 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 +3 -5
- 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 +6 -19
- 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 +1 -1
- package/dist/form.cjs.map +1 -1
- package/dist/form.d.ts +3 -17
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +1 -1
- package/dist/form.js.map +1 -1
- package/dist/host.cjs +1 -1
- package/dist/host.cjs.map +1 -1
- package/dist/host.d.ts +40 -37
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +1 -1
- package/dist/host.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.cjs +1 -1
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.ts +60 -120
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/observers/index.d.ts +1 -0
- package/dist/observers/index.d.ts.map +1 -1
- package/dist/observers/intersection-observe.cjs +1 -1
- package/dist/observers/intersection-observe.cjs.map +1 -1
- package/dist/observers/intersection-observe.d.ts +1 -1
- package/dist/observers/intersection-observe.js +1 -1
- package/dist/observers/intersection-observe.js.map +1 -1
- package/dist/observers/media-observe.cjs +1 -1
- package/dist/observers/media-observe.cjs.map +1 -1
- package/dist/observers/media-observe.d.ts +1 -1
- package/dist/observers/media-observe.js +1 -1
- package/dist/observers/media-observe.js.map +1 -1
- 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 +1 -1
- package/dist/observers/resize-observe.cjs.map +1 -1
- package/dist/observers/resize-observe.d.ts +1 -1
- package/dist/observers/resize-observe.js +1 -1
- package/dist/observers/resize-observe.js.map +1 -1
- package/dist/observers.cjs +1 -1
- package/dist/observers.js +1 -1
- package/dist/props.cjs +1 -1
- package/dist/props.cjs.map +1 -1
- package/dist/props.d.ts +18 -31
- package/dist/props.d.ts.map +1 -1
- package/dist/props.js +1 -1
- package/dist/props.js.map +1 -1
- package/dist/registration.cjs +1 -1
- package/dist/registration.cjs.map +1 -1
- package/dist/registration.d.ts +27 -7
- package/dist/registration.d.ts.map +1 -1
- package/dist/registration.js +1 -1
- package/dist/registration.js.map +1 -1
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.ts +29 -17
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/template-bindings.cjs +1 -1
- package/dist/template-bindings.cjs.map +1 -1
- package/dist/template-bindings.d.ts +10 -47
- package/dist/template-bindings.d.ts.map +1 -1
- package/dist/template-bindings.js +1 -1
- package/dist/template-bindings.js.map +1 -1
- package/dist/template-compiler.cjs +1 -1
- package/dist/template-compiler.cjs.map +1 -1
- package/dist/template-compiler.d.ts +1 -21
- package/dist/template-compiler.d.ts.map +1 -1
- package/dist/template-compiler.js +1 -1
- package/dist/template-compiler.js.map +1 -1
- package/dist/testing/testing.cjs +1 -1
- package/dist/testing/testing.cjs.map +1 -1
- package/dist/testing/testing.d.ts +12 -5
- package/dist/testing/testing.d.ts.map +1 -1
- package/dist/testing/testing.js +1 -1
- package/dist/testing/testing.js.map +1 -1
- package/package.json +6 -12
- package/dist/component.cjs +0 -2
- package/dist/component.cjs.map +0 -1
- package/dist/component.d.ts +0 -39
- package/dist/component.d.ts.map +0 -1
- package/dist/component.js +0 -2
- package/dist/component.js.map +0 -1
- package/dist/controls/list-key-control.cjs +0 -2
- package/dist/controls/list-key-control.cjs.map +0 -1
- package/dist/controls/list-key-control.d.ts +0 -14
- package/dist/controls/list-key-control.d.ts.map +0 -1
- package/dist/controls/list-key-control.js +0 -2
- package/dist/controls/list-key-control.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 -12
- 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 -38
- 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 -39
- 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.d.ts +0 -13
- package/dist/directives/index.d.ts.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 -27
- 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/directives.cjs +0 -1
- package/dist/directives.js +0 -1
- package/dist/runtime-bindings.cjs +0 -2
- package/dist/runtime-bindings.cjs.map +0 -1
- package/dist/runtime-bindings.d.ts +0 -6
- package/dist/runtime-bindings.d.ts.map +0 -1
- package/dist/runtime-bindings.js +0 -2
- package/dist/runtime-bindings.js.map +0 -1
- package/dist/runtime-core.cjs +0 -2
- package/dist/runtime-core.cjs.map +0 -1
- package/dist/runtime-core.d.ts +0 -21
- package/dist/runtime-core.d.ts.map +0 -1
- package/dist/runtime-core.js +0 -2
- package/dist/runtime-core.js.map +0 -1
- package/dist/runtime-lifecycle.cjs +0 -2
- package/dist/runtime-lifecycle.cjs.map +0 -1
- package/dist/runtime-lifecycle.d.ts +0 -24
- package/dist/runtime-lifecycle.d.ts.map +0 -1
- package/dist/runtime-lifecycle.js +0 -2
- package/dist/runtime-lifecycle.js.map +0 -1
- package/dist/template-dom.cjs +0 -2
- package/dist/template-dom.cjs.map +0 -1
- package/dist/template-dom.d.ts +0 -13
- package/dist/template-dom.d.ts.map +0 -1
- package/dist/template-dom.js +0 -2
- package/dist/template-dom.js.map +0 -1
- package/dist/template-html.cjs +0 -2
- package/dist/template-html.cjs.map +0 -1
- package/dist/template-html.d.ts +0 -23
- package/dist/template-html.d.ts.map +0 -1
- package/dist/template-html.js +0 -2
- package/dist/template-html.js.map +0 -1
- package/dist/template.cjs +0 -2
- package/dist/template.cjs.map +0 -1
- package/dist/template.d.ts +0 -10
- package/dist/template.d.ts.map +0 -1
- package/dist/template.js +0 -2
- package/dist/template.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./runtime
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./runtime.cjs`),t=require(`./internal.cjs`),n=require(`./form.cjs`),r=require(`./host.cjs`),i=require(`./props.cjs`),a=require(`./directives/live.cjs`),o=require(`./registration.cjs`),s=require(`./template-compiler.cjs`),c=require(`./directives/each.cjs`),l=require(`./directives/classMap.cjs`),u=require(`./directives/styleMap.cjs`),d=require(`./directives/when.cjs`),f=require(`./directives/guard.cjs`),p=require(`./directives/resource.cjs`),m=require(`./directives/raw.cjs`);let h=require(`@vielzeug/stateit`);Object.defineProperty(exports,`batch`,{enumerable:!0,get:function(){return h.batch}}),exports.classMap=l.classMap,Object.defineProperty(exports,`computed`,{enumerable:!0,get:function(){return h.computed}}),exports.createContext=r.createContext,exports.createId=t.createId,exports.css=t.css,exports.define=o.define,exports.defineField=n.defineField,exports.each=c.each,exports.effect=e.effect,exports.guard=f.guard,exports.html=s.html,exports.inject=r.inject,exports.injectStrict=r.injectStrict,Object.defineProperty(exports,`isSignal`,{enumerable:!0,get:function(){return h.isSignal}}),exports.listen=e.listen,exports.live=a.live,exports.on=e.on,exports.onCleanup=e.onCleanup,exports.onElement=e.onElement,exports.onMounted=e.onMounted,exports.prop=i.prop,exports.provide=r.provide,exports.raw=m.raw,exports.ref=t.ref,exports.refs=t.refs,exports.resource=p.resource,Object.defineProperty(exports,`scope`,{enumerable:!0,get:function(){return h.scope}}),Object.defineProperty(exports,`signal`,{enumerable:!0,get:function(){return h.signal}}),exports.styleMap=u.styleMap,exports.syncAria=r.syncAria,Object.defineProperty(exports,`untrack`,{enumerable:!0,get:function(){return h.untrack}}),Object.defineProperty(exports,`watch`,{enumerable:!0,get:function(){return h.watch}}),exports.when=d.when;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
export { batch, computed, isSignal,
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export
|
|
5
|
-
export { defineField, type
|
|
6
|
-
export { createContext, inject,
|
|
7
|
-
export { html
|
|
8
|
-
export {
|
|
1
|
+
export { batch, computed, isSignal, scope, signal, untrack, watch, type ReadonlySignal, type Scope, type Signal, type WatchOptions, } from '@vielzeug/stateit';
|
|
2
|
+
export { effect, listen, on, onCleanup, onElement, onMounted } from './runtime';
|
|
3
|
+
export { define, type ComponentDefinition, type InferPropsFromDefs, type InferPropsSignals, prop, type PropDef, type PropInputDefs, type PropsDef, type PropOptions, type SetupContextBag, } from './registration';
|
|
4
|
+
export type { ComponentTemplate } from './registration';
|
|
5
|
+
export { defineField, type FormFieldHandle, type FormFieldOptions } from './form';
|
|
6
|
+
export { createContext, inject, injectStrict, provide, syncAria, type ComponentHost, type ComponentSlots, type HostBindingValue, type HostPropDescriptor, type InjectionKey, type ReflectConfig, } from './host';
|
|
7
|
+
export { html } from './template-compiler';
|
|
8
|
+
export { each } from './directives/each';
|
|
9
|
+
export { classMap } from './directives/classMap';
|
|
10
|
+
export { styleMap } from './directives/styleMap';
|
|
11
|
+
export { when } from './directives/when';
|
|
12
|
+
export { guard } from './directives/guard';
|
|
13
|
+
export { live } from './directives/live';
|
|
14
|
+
export { resource, type ResourceState } from './directives/resource';
|
|
15
|
+
export { raw } from './directives/raw';
|
|
16
|
+
export { css, createId, ref, refs, type CSSResult, type EmitFn, type HTMLResult, type Ref, type RefCallback, type Refs, } from './internal';
|
|
9
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,EACL,MAAM,EACN,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,IAAI,EACJ,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAElF,OAAO,EACL,aAAa,EACb,MAAM,EACN,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EACL,GAAG,EACH,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,KAAK,SAAS,EACd,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,IAAI,GACV,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{effect as e,listen as t,on as n,onCleanup as r,onElement as i,onMounted as a}from"./runtime.js";import{createId as o,css as s,ref as c,refs as l}from"./internal.js";import{defineField as u}from"./form.js";import{createContext as d,inject as f,injectStrict as p,provide as m,syncAria as h}from"./host.js";import{prop as g}from"./props.js";import{live as _}from"./directives/live.js";import{define as v}from"./registration.js";import{html as y}from"./template-compiler.js";import{each as b}from"./directives/each.js";import{classMap as x}from"./directives/classMap.js";import{styleMap as S}from"./directives/styleMap.js";import{when as C}from"./directives/when.js";import{guard as w}from"./directives/guard.js";import{resource as T}from"./directives/resource.js";import{raw as E}from"./directives/raw.js";import{batch as D,computed as O,isSignal as k,scope as A,signal as j,untrack as M,watch as N}from"@vielzeug/stateit";export{D as batch,x as classMap,O as computed,d as createContext,o as createId,s as css,v as define,u as defineField,b as each,e as effect,w as guard,y as html,f as inject,p as injectStrict,k as isSignal,t as listen,_ as live,n as on,r as onCleanup,i as onElement,a as onMounted,g as prop,m as provide,E as raw,c as ref,l as refs,T as resource,A as scope,j as signal,S as styleMap,h as syncAria,M as untrack,N as watch,C as when};
|
package/dist/internal.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./
|
|
1
|
+
const e=require(`./errors.cjs`),t=require(`./runtime.cjs`);let n=require(`@vielzeug/stateit`);function r(){return(0,n.signal)(null)}function i(){return[]}var a=e=>typeof e==`object`&&!!e&&e.__craftitDirective===!0&&typeof e.mount==`function`;function o(e,t=[]){return{__bindings:t,__craftitHtmlResult:!0,__html:e,toString(){return e}}}var s=e=>typeof e==`object`&&!!e&&e.__craftitHtmlResult===!0;function c(e){return typeof e==`string`?{bindings:[],html:e}:{bindings:e.__bindings,html:e.__html}}var l=e=>typeof e==`object`&&!!e&&e.__craftitCssResult===!0,u=t=>{let n=[];for(let e=t.length-1;e>=0;e--)try{t[e]()}catch(e){n.push(e)}if(n.length>0)throw AggregateError(n,e.CRAFTIT_ERRORS.cleanupFailed)},d=e=>{for(let t of e)t.remove()},f=(e,t,n)=>{if(/^on/i.test(t)){e.removeAttribute(t);return}n==null||n===!1?e.removeAttribute(t):e.setAttribute(t,n===!0?`true`:String(n))},p=(e,t,n,r)=>{if(!e)return()=>{};let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},m=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),h={"'":`'`,'"':`"`,"&":`&`,"<":`<`,">":`>`},g=e=>String(e).replace(/[&<>"']/g,e=>h[e]),_=()=>{let e=t.currentElementOrThrow();return((t,...n)=>{y.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)})},v={bubbles:!0,cancelable:!0,composed:!0},y={custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...v,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...v,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...v,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...v,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...v,...n})):e.dispatchEvent(new CustomEvent(t,{...v,...n}))}},b=0,x=()=>{b=0},S=e=>`${e?`${e}-`:`cft-`}${++b}`,C=RegExp(`u="([^"]+)"`,`g`),w=()=>{let e=0;return()=>String(e++)},T=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(C,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},E=function(){return this.content},D=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=l(e)?e.content:e??``}return{__craftitCssResult:!0,content:n.trim(),toString:E}},O=new Map,k=t=>{if(t instanceof CSSStyleSheet)return t;let n=typeof t==`string`?t:t.content,r=O.get(n);if(r)return r;let i=new CSSStyleSheet;try{i.replaceSync(n)}catch(t){console.error(e.CRAFTIT_ERRORS.styleReplaceFailed,t)}return O.set(n,i),i};exports._resetIdCounter=x,exports.createEmitFn=_,exports.createId=S,exports.createMarkerIdFactory=w,exports.css=D,exports.escapeHtml=g,exports.extractResult=c,exports.fire=y,exports.htmlResult=o,exports.isDirectiveResult=a,exports.isHtmlResult=s,exports.listen=p,exports.loadStylesheet=k,exports.ref=r,exports.refs=i,exports.rekeyHtmlResult=T,exports.removeNodes=d,exports.runAll=u,exports.setAttr=f,exports.toKebab=m;
|
|
2
2
|
//# sourceMappingURL=internal.cjs.map
|
package/dist/internal.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.cjs","names":[],"sources":["../src/internal.ts"],"sourcesContent":["/**\n * @internal — Binding type system, compiler/runtime helpers, and engine internals.\n *\n * These types and helpers define the contract between the template compiler, binding engine,\n * and component runtime.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Selected author-facing exports (such as css(), CSSResult, EmitFn, HTMLResult, Directive,\n * ref(), and refs()) are re-exported from the main entry point.\n */\n\nimport { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { fire } from './runtime';\nimport { currentRuntime } from './runtime-core';\n\nconst HTML_RESULT_BRAND: unique symbol = Symbol('craftit.htmlResultBrand');\n\nlet _idCounter = 0;\n\n/** @internal — resets the ID counter. Used by _resetCounters in test/test.ts. */\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\n/**\n * Creates a unique, stable ID string — suitable for `aria-labelledby`, `aria-describedby`,\n * and similar accessibility linkages. Call once per component instance (at setup time or inside `onMount`).\n */\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A reactive reference to a DOM element.\n *\n * Backed by a Signal — reactivity is built-in. Use with onElement()\n * for first-class element lifecycle management.\n *\n * @example\n * const inputRef = ref<HTMLInputElement>();\n *\n * onElement(inputRef, (input) => {\n * input.focus();\n * return () => { }; // cleanup\n * });\n *\n * // In template\n * <input ref=${inputRef} />\n */\nexport type Ref<T extends Element> = Signal<T | null>;\n\n/**\n * Create a reactive element reference.\n *\n * Returns a Signal that tracks the mounted/unmounted state of a DOM element.\n * Automatically reactive — use directly in effects or with onElement().\n *\n * @see onElement for element lifecycle integration\n *\n * @example\n * const ref = ref<HTMLInputElement>();\n * // Type: Signal<HTMLInputElement | null>\n * // Automatically updates when element mounts/unmounts\n */\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(null);\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTML RESULT\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __html: string;\n toString(): string;\n}\n\n/** @internal — construct an HTMLResult from a pre-built html string and bindings. */\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n const result = {\n __bindings: bindings,\n __html: html,\n toString() {\n return html;\n },\n };\n\n Object.defineProperty(result, HTML_RESULT_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return result as HTMLResult;\n}\n\n/** @internal — strict HTMLResult runtime type guard. */\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && !!value && (value as Record<symbol, unknown>)[HTML_RESULT_BRAND] === true;\n\n/** @internal — extract html and bindings from a string or HTMLResult. */\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DIRECTIVES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DirectiveContext {\n /** The cleanup registration function for the component. */\n registerCleanup: (fn: () => void) => void;\n}\n\nexport interface Directive {\n /** Invoked when the element is mounted in the DOM. */\n mount?(el: HTMLElement, context: DirectiveContext): void;\n /** Invoked by the template engine to render content (interpolation directives). */\n render?(): HTMLResult | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BINDING TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type PropBinding = {\n /** Optional writable source used for native two-way bridge (.value/.checked). */\n model?: Signal<unknown>;\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'prop';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n modifiers?: {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n prevent?: boolean;\n self?: boolean;\n stop?: boolean;\n };\n name: string;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type CallbackBinding = {\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;\n type: 'callback';\n uid: string;\n};\n\nexport type HtmlBinding = {\n keyed?: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n type: 'html';\n uid: string;\n};\n\nexport type Binding =\n | TextBinding\n | AttrBinding\n | PropBinding\n | EventBinding\n | RefBinding\n | CallbackBinding\n | HtmlBinding;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL MARKERS & CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — opaque marker for each() reactive results. */\nexport const EACH_SIGNAL: unique symbol = Symbol('craftit.eachSignal');\n\n/** @internal — binding element identifier attribute. */\nexport const CF_ID_ATTR = 'u';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL DOM & EVENT UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — Iterate an iterable and call every function in it. */\nexport const runAll = (fns: Iterable<() => void>): void => {\n const callbacks = [...fns];\n\n for (let index = callbacks.length - 1; index >= 0; index--) {\n callbacks[index]?.();\n }\n};\n\n/** @internal — Set an attribute on an element, handling boolean and null values. */\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n // Avoid inline event-handler attributes (onclick, onerror, ...) to reduce injection risk.\n if (/^on/i.test(name)) {\n el.removeAttribute(name);\n\n return;\n }\n\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else if (val === true) {\n el.setAttribute(name, name.startsWith('aria-') ? 'true' : '');\n } else {\n el.setAttribute(name, String(val));\n }\n};\n\n/** @internal — Attach an event listener with automatic cleanup. */\nexport const listen = (\n el: EventTarget,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL STRING UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": ''', '\"': '"', '&': '&', '<': '<', '>': '>' };\n\n/** @internal — Escape untrusted text for HTML text/attribute contexts. */\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL EMIT TYPES & HELPERS\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\nexport type EmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\n/** @internal — Create a type-safe custom event emitter for the current runtime host. */\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentRuntime().el;\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL CSS & STYLESHEET UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CSSResult = {\n content: string;\n toString(): string;\n};\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\n/** @internal — Compile CSS template strings into a CSSResult. */\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += v && typeof v === 'object' && 'content' in v ? (v as CSSResult).content : (v ?? '');\n }\n }\n\n return { content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\n/** @internal — Load a stylesheet string or CSSResult into an adoptedStyleSheet. */\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n stylesheetStringCache.set(cssText, sheet);\n } catch (err) {\n console.error(`[craftit:E2] style replace failed`, err);\n }\n\n return sheet;\n};\n"],"mappings":"oGAgBA,IAAM,EAAmC,OAAO,0BAA0B,CAEtE,EAAa,EAGJ,MAA8B,CACzC,EAAa,GAOF,EAAY,GAA4B,GAAG,EAAS,GAAG,EAAO,GAAK,SAAS,EAAE,IAsC3F,SAAgB,GAAiC,CAC/C,OAAA,EAAA,EAAA,QAAwB,KAAK,CAK/B,SAAgB,GAAmC,CACjD,MAAO,EAAE,CAgBX,SAAgB,EAAW,EAAc,EAAsB,EAAE,CAAc,CAC7E,IAAM,EAAS,CACb,WAAY,EACZ,OAAQ,EACR,UAAW,CACT,OAAO,GAEV,CASD,OAPA,OAAO,eAAe,EAAQ,EAAmB,CAC/C,aAAc,GACd,WAAY,GACZ,MAAO,GACP,SAAU,GACX,CAAC,CAEK,EAIT,IAAa,EAAgB,GAC3B,OAAO,GAAU,UAAY,CAAC,CAAC,GAAU,EAAkC,KAAuB,GAGpG,SAAgB,EAAc,EAA+D,CAC3F,OAAO,OAAO,GAAM,SAAW,CAAE,SAAU,EAAE,CAAE,KAAM,EAAG,CAAG,CAAE,SAAU,EAAE,WAAY,KAAM,EAAE,OAAQ,CAqGvG,IAAa,EAA6B,OAAO,qBAAqB,CAUzD,EAAU,GAAoC,CACzD,IAAM,EAAY,CAAC,GAAG,EAAI,CAE1B,IAAK,IAAI,EAAQ,EAAU,OAAS,EAAG,GAAS,EAAG,IACjD,EAAU,MAAU,EAKX,GAAW,EAAa,EAAc,IAAuB,CAExE,GAAI,OAAO,KAAK,EAAK,CAAE,CACrB,EAAG,gBAAgB,EAAK,CAExB,OAGE,GAAO,MAAQ,IAAQ,GACzB,EAAG,gBAAgB,EAAK,CACf,IAAQ,GACjB,EAAG,aAAa,EAAM,EAAK,WAAW,QAAQ,CAAG,OAAS,GAAG,CAE7D,EAAG,aAAa,EAAM,OAAO,EAAI,CAAC,EAKzB,GACX,EACA,EACA,EACA,IACiB,CACjB,IAAM,EAA0B,EAIhC,OAFA,EAAG,iBAAiB,EAAM,EAAU,EAAQ,KAE/B,EAAG,oBAAoB,EAAM,EAAU,EAAQ,EAOjD,EAAW,GAAwB,EAAI,QAAQ,SAAW,GAAM,IAAI,EAAE,aAAa,GAAG,CAE7F,EAA8B,CAAE,IAAK,QAAS,IAAK,SAAU,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,CAG9F,EAAc,GAA2B,OAAO,EAAM,CAAC,QAAQ,WAAa,GAAM,EAAI,GAAG,CAiBzF,MAAmE,CAC9E,IAAM,EAAK,EAAA,gBAAgB,CAAC,GAE5B,QAAS,EAAgB,GAAG,IAAoB,CAC9C,EAAA,KAAK,OAAO,EAAI,OAAO,EAAM,CAAE,EAAK,OAAS,EAAI,CAAE,OAAQ,EAAK,GAAI,CAAG,IAAA,GAAU,IAa/E,EAAoB,UAAmC,CAC3D,OAAO,KAAK,SAID,GAAO,EAA+B,GAAG,IAAiC,CACrF,IAAI,EAAU,GAEd,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAGlC,GAFA,GAAW,EAAQ,GAEf,EAAI,EAAO,OAAQ,CACrB,IAAM,EAAI,EAAO,GAEjB,GAAW,GAAK,OAAO,GAAM,UAAY,YAAa,EAAK,EAAgB,QAAW,GAAK,GAI/F,MAAO,CAAE,QAAS,EAAQ,MAAM,CAAE,SAAU,EAAmB,EAG3D,EAAwB,IAAI,IAGrB,EAAkB,GAA6D,CAC1F,GAAI,aAAiB,cAAe,OAAO,EAE3C,IAAM,EAAU,OAAO,GAAU,SAAW,EAAQ,EAAM,QACpD,EAAS,EAAsB,IAAI,EAAQ,CAEjD,GAAI,EAAQ,OAAO,EAEnB,IAAM,EAAQ,IAAI,cAElB,GAAI,CACF,EAAM,YAAY,EAAQ,CAC1B,EAAsB,IAAI,EAAS,EAAM,OAClC,EAAK,CACZ,QAAQ,MAAM,oCAAqC,EAAI,CAGzD,OAAO"}
|
|
1
|
+
{"version":3,"file":"internal.cjs","names":[],"sources":["../src/internal.ts"],"sourcesContent":["import { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { currentElementOrThrow } from './runtime';\n\nexport type Ref<T extends Element> = Signal<T | null>;\n\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(null);\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n /** When true the binding uses live-write semantics: stale app-state writes are\n * skipped if the DOM value has diverged from the last programmatic write. */\n live?: true;\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n name: string;\n options?: AddEventListenerOptions;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type HtmlBindingPayload = {\n bindings: Binding[];\n html: string;\n};\n\nexport type RuntimeDirective = {\n __craftitDirective: true;\n mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;\n};\n\nexport type DirectiveResult = RuntimeDirective;\n\nexport const isDirectiveResult = (value: unknown): value is DirectiveResult =>\n typeof value === 'object' &&\n value !== null &&\n (value as RuntimeDirective).__craftitDirective === true &&\n typeof (value as RuntimeDirective).mount === 'function';\n\nexport type HtmlBinding = {\n signal: ReadonlySignal<HtmlBindingPayload>;\n type: 'html';\n uid: string;\n};\n\nexport type DirectiveBinding = {\n directive: RuntimeDirective;\n type: 'directive';\n uid: string;\n};\n\nexport type Binding = TextBinding | AttrBinding | EventBinding | RefBinding | HtmlBinding | DirectiveBinding;\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __craftitHtmlResult: true;\n __html: string;\n toString(): string;\n}\n\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n return {\n __bindings: bindings,\n __craftitHtmlResult: true,\n __html: html,\n toString() {\n return html;\n },\n };\n}\n\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && value !== null && (value as HTMLResult).__craftitHtmlResult === true;\n\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\nexport type CSSResult = {\n __craftitCssResult: true;\n content: string;\n toString(): string;\n};\n\nexport const isCssResult = (value: unknown): value is CSSResult =>\n typeof value === 'object' && !!value && (value as CSSResult).__craftitCssResult === true;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DOM UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const runAll = (fns: (() => void)[]): void => {\n const errors: unknown[] = [];\n\n for (let i = fns.length - 1; i >= 0; i--) {\n try {\n fns[i]();\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, CRAFTIT_ERRORS.cleanupFailed);\n }\n};\n\nexport const removeNodes = (nodes: Node[]): void => {\n for (const node of nodes) {\n (node as ChildNode).remove();\n }\n};\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n if (/^on/i.test(name)) {\n el.removeAttribute(name);\n\n return;\n }\n\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else {\n el.setAttribute(name, val === true ? 'true' : String(val));\n }\n};\n\nexport const listen = (\n el: EventTarget | null | undefined,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n if (!el) return () => {};\n\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": ''', '\"': '"', '&': '&', '<': '<', '>': '>' };\n\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EMIT UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\ntype StrictEmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\ntype LooseEmitFn = (event: string, detail?: unknown) => void;\n\nexport type EmitFn<T extends Record<string, unknown>> = StrictEmitFn<T> & LooseEmitFn;\n\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentElementOrThrow();\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FIRE UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\nexport const fire: FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ID UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _idCounter = 0;\n\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\nexport const CF_ID_ATTR = 'u';\n\nconst ATTR_ID_RE = new RegExp(`${CF_ID_ATTR}=\"([^\"]+)\"`, 'g');\n\nexport const createMarkerIdFactory = (): (() => string) => {\n let n = 0;\n\n return () => String(n++);\n};\n\nexport const rekeyHtmlResult = (result: HTMLResult, getNextId: () => string): { bindings: Binding[]; html: string } => {\n const idMap = new Map<string, string>();\n const getMappedId = (id: string): string => {\n const mapped = idMap.get(id);\n\n if (mapped) return mapped;\n\n const next = getNextId();\n\n idMap.set(id, next);\n\n return next;\n };\n\n return {\n bindings: result.__bindings.map((binding) => ({ ...binding, uid: getMappedId(binding.uid) }) as Binding),\n html: result.__html\n .replace(ATTR_ID_RE, (_, id: string) => `${CF_ID_ATTR}=\"${getMappedId(id)}\"`)\n .replace(/<!--(\\d+)-->/g, (_, id: string) => `<!--${getMappedId(id)}-->`),\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += isCssResult(v) ? v.content : (v ?? '');\n }\n }\n\n return { __craftitCssResult: true as const, content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n } catch (err) {\n console.error(CRAFTIT_ERRORS.styleReplaceFailed, err);\n }\n\n stylesheetStringCache.set(cssText, sheet);\n\n return sheet;\n};\n"],"mappings":"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"}
|
package/dist/internal.d.ts
CHANGED
|
@@ -1,86 +1,18 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @internal — Binding type system, compiler/runtime helpers, and engine internals.
|
|
3
|
-
*
|
|
4
|
-
* These types and helpers define the contract between the template compiler, binding engine,
|
|
5
|
-
* and component runtime.
|
|
6
|
-
* They are NOT part of the public API and importing directly is an unstable contract.
|
|
7
|
-
*
|
|
8
|
-
* Selected author-facing exports (such as css(), CSSResult, EmitFn, HTMLResult, Directive,
|
|
9
|
-
* ref(), and refs()) are re-exported from the main entry point.
|
|
10
|
-
*/
|
|
11
1
|
import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';
|
|
12
|
-
/** @internal — resets the ID counter. Used by _resetCounters in test/test.ts. */
|
|
13
|
-
export declare const _resetIdCounter: () => void;
|
|
14
|
-
/**
|
|
15
|
-
* Creates a unique, stable ID string — suitable for `aria-labelledby`, `aria-describedby`,
|
|
16
|
-
* and similar accessibility linkages. Call once per component instance (at setup time or inside `onMount`).
|
|
17
|
-
*/
|
|
18
|
-
export declare const createId: (prefix?: string) => string;
|
|
19
|
-
/**
|
|
20
|
-
* A reactive reference to a DOM element.
|
|
21
|
-
*
|
|
22
|
-
* Backed by a Signal — reactivity is built-in. Use with onElement()
|
|
23
|
-
* for first-class element lifecycle management.
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* const inputRef = ref<HTMLInputElement>();
|
|
27
|
-
*
|
|
28
|
-
* onElement(inputRef, (input) => {
|
|
29
|
-
* input.focus();
|
|
30
|
-
* return () => { }; // cleanup
|
|
31
|
-
* });
|
|
32
|
-
*
|
|
33
|
-
* // In template
|
|
34
|
-
* <input ref=${inputRef} />
|
|
35
|
-
*/
|
|
36
2
|
export type Ref<T extends Element> = Signal<T | null>;
|
|
37
|
-
/**
|
|
38
|
-
* Create a reactive element reference.
|
|
39
|
-
*
|
|
40
|
-
* Returns a Signal that tracks the mounted/unmounted state of a DOM element.
|
|
41
|
-
* Automatically reactive — use directly in effects or with onElement().
|
|
42
|
-
*
|
|
43
|
-
* @see onElement for element lifecycle integration
|
|
44
|
-
*
|
|
45
|
-
* @example
|
|
46
|
-
* const ref = ref<HTMLInputElement>();
|
|
47
|
-
* // Type: Signal<HTMLInputElement | null>
|
|
48
|
-
* // Automatically updates when element mounts/unmounts
|
|
49
|
-
*/
|
|
50
3
|
export declare function ref<T extends Element>(): Ref<T>;
|
|
51
4
|
export type Refs<T extends Element> = T[];
|
|
52
5
|
export declare function refs<T extends Element>(): Refs<T>;
|
|
53
6
|
export type RefCallback<T extends Element> = (el: T | null) => void;
|
|
54
|
-
export interface HTMLResult {
|
|
55
|
-
__bindings: Binding[];
|
|
56
|
-
__html: string;
|
|
57
|
-
toString(): string;
|
|
58
|
-
}
|
|
59
|
-
/** @internal — construct an HTMLResult from a pre-built html string and bindings. */
|
|
60
|
-
export declare function htmlResult(html: string, bindings?: Binding[]): HTMLResult;
|
|
61
|
-
/** @internal — strict HTMLResult runtime type guard. */
|
|
62
|
-
export declare const isHtmlResult: (value: unknown) => value is HTMLResult;
|
|
63
|
-
/** @internal — extract html and bindings from a string or HTMLResult. */
|
|
64
|
-
export declare function extractResult(v: string | HTMLResult): {
|
|
65
|
-
bindings: Binding[];
|
|
66
|
-
html: string;
|
|
67
|
-
};
|
|
68
|
-
export interface DirectiveContext {
|
|
69
|
-
/** The cleanup registration function for the component. */
|
|
70
|
-
registerCleanup: (fn: () => void) => void;
|
|
71
|
-
}
|
|
72
|
-
export interface Directive {
|
|
73
|
-
/** Invoked when the element is mounted in the DOM. */
|
|
74
|
-
mount?(el: HTMLElement, context: DirectiveContext): void;
|
|
75
|
-
/** Invoked by the template engine to render content (interpolation directives). */
|
|
76
|
-
render?(): HTMLResult | string;
|
|
77
|
-
}
|
|
78
7
|
export type TextBinding = {
|
|
79
8
|
signal: ReadonlySignal<unknown>;
|
|
80
9
|
type: 'text';
|
|
81
10
|
uid: string;
|
|
82
11
|
};
|
|
83
12
|
export type AttrBinding = {
|
|
13
|
+
/** When true the binding uses live-write semantics: stale app-state writes are
|
|
14
|
+
* skipped if the DOM value has diverged from the last programmatic write. */
|
|
15
|
+
live?: true;
|
|
84
16
|
mode: 'bool' | 'attr';
|
|
85
17
|
name: string;
|
|
86
18
|
signal?: ReadonlySignal<unknown>;
|
|
@@ -88,26 +20,10 @@ export type AttrBinding = {
|
|
|
88
20
|
uid: string;
|
|
89
21
|
value?: unknown;
|
|
90
22
|
};
|
|
91
|
-
export type PropBinding = {
|
|
92
|
-
/** Optional writable source used for native two-way bridge (.value/.checked). */
|
|
93
|
-
model?: Signal<unknown>;
|
|
94
|
-
name: string;
|
|
95
|
-
signal?: ReadonlySignal<unknown>;
|
|
96
|
-
type: 'prop';
|
|
97
|
-
uid: string;
|
|
98
|
-
value?: unknown;
|
|
99
|
-
};
|
|
100
23
|
export type EventBinding = {
|
|
101
24
|
handler: (e: Event) => void;
|
|
102
|
-
modifiers?: {
|
|
103
|
-
capture?: boolean;
|
|
104
|
-
once?: boolean;
|
|
105
|
-
passive?: boolean;
|
|
106
|
-
prevent?: boolean;
|
|
107
|
-
self?: boolean;
|
|
108
|
-
stop?: boolean;
|
|
109
|
-
};
|
|
110
25
|
name: string;
|
|
26
|
+
options?: AddEventListenerOptions;
|
|
111
27
|
type: 'event';
|
|
112
28
|
uid: string;
|
|
113
29
|
};
|
|
@@ -116,56 +32,80 @@ export type RefBinding = {
|
|
|
116
32
|
type: 'ref';
|
|
117
33
|
uid: string;
|
|
118
34
|
};
|
|
119
|
-
export type
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
uid: string;
|
|
35
|
+
export type HtmlBindingPayload = {
|
|
36
|
+
bindings: Binding[];
|
|
37
|
+
html: string;
|
|
123
38
|
};
|
|
39
|
+
export type RuntimeDirective = {
|
|
40
|
+
__craftitDirective: true;
|
|
41
|
+
mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;
|
|
42
|
+
};
|
|
43
|
+
export type DirectiveResult = RuntimeDirective;
|
|
44
|
+
export declare const isDirectiveResult: (value: unknown) => value is DirectiveResult;
|
|
124
45
|
export type HtmlBinding = {
|
|
125
|
-
|
|
126
|
-
signal: ReadonlySignal<{
|
|
127
|
-
bindings: Binding[];
|
|
128
|
-
html: string;
|
|
129
|
-
items?: Array<{
|
|
130
|
-
bindings: Binding[];
|
|
131
|
-
html: string;
|
|
132
|
-
}>;
|
|
133
|
-
keys?: (string | number)[];
|
|
134
|
-
}>;
|
|
46
|
+
signal: ReadonlySignal<HtmlBindingPayload>;
|
|
135
47
|
type: 'html';
|
|
136
48
|
uid: string;
|
|
137
49
|
};
|
|
138
|
-
export type
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
export
|
|
145
|
-
|
|
50
|
+
export type DirectiveBinding = {
|
|
51
|
+
directive: RuntimeDirective;
|
|
52
|
+
type: 'directive';
|
|
53
|
+
uid: string;
|
|
54
|
+
};
|
|
55
|
+
export type Binding = TextBinding | AttrBinding | EventBinding | RefBinding | HtmlBinding | DirectiveBinding;
|
|
56
|
+
export interface HTMLResult {
|
|
57
|
+
__bindings: Binding[];
|
|
58
|
+
__craftitHtmlResult: true;
|
|
59
|
+
__html: string;
|
|
60
|
+
toString(): string;
|
|
61
|
+
}
|
|
62
|
+
export declare function htmlResult(html: string, bindings?: Binding[]): HTMLResult;
|
|
63
|
+
export declare const isHtmlResult: (value: unknown) => value is HTMLResult;
|
|
64
|
+
export declare function extractResult(v: string | HTMLResult): {
|
|
65
|
+
bindings: Binding[];
|
|
66
|
+
html: string;
|
|
67
|
+
};
|
|
68
|
+
export type CSSResult = {
|
|
69
|
+
__craftitCssResult: true;
|
|
70
|
+
content: string;
|
|
71
|
+
toString(): string;
|
|
72
|
+
};
|
|
73
|
+
export declare const isCssResult: (value: unknown) => value is CSSResult;
|
|
74
|
+
export declare const runAll: (fns: (() => void)[]) => void;
|
|
75
|
+
export declare const removeNodes: (nodes: Node[]) => void;
|
|
146
76
|
export declare const setAttr: (el: Element, name: string, val: unknown) => void;
|
|
147
|
-
|
|
148
|
-
export declare const listen: (el: EventTarget, name: string, handler: (e: any) => void, options?: AddEventListenerOptions) => (() => void);
|
|
77
|
+
export declare const listen: (el: EventTarget | null | undefined, name: string, handler: (e: any) => void, options?: AddEventListenerOptions) => (() => void);
|
|
149
78
|
export declare const toKebab: (str: string) => string;
|
|
150
|
-
/** @internal — Escape untrusted text for HTML text/attribute contexts. */
|
|
151
79
|
export declare const escapeHtml: (value: unknown) => string;
|
|
152
80
|
type NoDetail = void | undefined | never;
|
|
153
81
|
type KeysWithoutDetail<T extends Record<string, unknown>> = {
|
|
154
82
|
[P in keyof T]: [T[P]] extends [NoDetail] ? P : never;
|
|
155
83
|
}[keyof T];
|
|
156
|
-
|
|
84
|
+
type StrictEmitFn<T extends Record<string, unknown>> = {
|
|
157
85
|
<K extends KeysWithoutDetail<T>>(event: K): void;
|
|
158
86
|
<K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;
|
|
159
87
|
};
|
|
160
|
-
|
|
88
|
+
type LooseEmitFn = (event: string, detail?: unknown) => void;
|
|
89
|
+
export type EmitFn<T extends Record<string, unknown>> = StrictEmitFn<T> & LooseEmitFn;
|
|
161
90
|
export declare const createEmitFn: <T extends Record<string, unknown>>() => EmitFn<T>;
|
|
162
|
-
export type
|
|
163
|
-
|
|
164
|
-
|
|
91
|
+
export type FireApi = {
|
|
92
|
+
custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;
|
|
93
|
+
event(target: EventTarget, event: Event): boolean;
|
|
94
|
+
focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;
|
|
95
|
+
keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;
|
|
96
|
+
mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;
|
|
97
|
+
touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;
|
|
98
|
+
};
|
|
99
|
+
export declare const fire: FireApi;
|
|
100
|
+
export declare const _resetIdCounter: () => void;
|
|
101
|
+
export declare const createId: (prefix?: string) => string;
|
|
102
|
+
export declare const CF_ID_ATTR = "u";
|
|
103
|
+
export declare const createMarkerIdFactory: () => (() => string);
|
|
104
|
+
export declare const rekeyHtmlResult: (result: HTMLResult, getNextId: () => string) => {
|
|
105
|
+
bindings: Binding[];
|
|
106
|
+
html: string;
|
|
165
107
|
};
|
|
166
|
-
/** @internal — Compile CSS template strings into a CSSResult. */
|
|
167
108
|
export declare const css: (strings: TemplateStringsArray, ...values: unknown[]) => CSSResult;
|
|
168
|
-
/** @internal — Load a stylesheet string or CSSResult into an adoptedStyleSheet. */
|
|
169
109
|
export declare const loadStylesheet: (style: string | CSSStyleSheet | CSSResult) => CSSStyleSheet;
|
|
170
110
|
export {};
|
|
171
111
|
//# sourceMappingURL=internal.d.ts.map
|
package/dist/internal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"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"}
|
package/dist/internal.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{CRAFTIT_ERRORS as e}from"./errors.js";import{currentElementOrThrow as t}from"./runtime.js";import{signal as n}from"@vielzeug/stateit";function r(){return n(null)}function i(){return[]}var a=e=>typeof e==`object`&&!!e&&e.__craftitDirective===!0&&typeof e.mount==`function`;function o(e,t=[]){return{__bindings:t,__craftitHtmlResult:!0,__html:e,toString(){return e}}}var s=e=>typeof e==`object`&&!!e&&e.__craftitHtmlResult===!0;function c(e){return typeof e==`string`?{bindings:[],html:e}:{bindings:e.__bindings,html:e.__html}}var l=e=>typeof e==`object`&&!!e&&e.__craftitCssResult===!0,u=t=>{let n=[];for(let e=t.length-1;e>=0;e--)try{t[e]()}catch(e){n.push(e)}if(n.length>0)throw AggregateError(n,e.cleanupFailed)},d=e=>{for(let t of e)t.remove()},f=(e,t,n)=>{if(/^on/i.test(t)){e.removeAttribute(t);return}n==null||n===!1?e.removeAttribute(t):e.setAttribute(t,n===!0?`true`:String(n))},p=(e,t,n,r)=>{if(!e)return()=>{};let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},m=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),h={"'":`'`,'"':`"`,"&":`&`,"<":`<`,">":`>`},g=e=>String(e).replace(/[&<>"']/g,e=>h[e]),_=()=>{let e=t();return((t,...n)=>{y.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)})},v={bubbles:!0,cancelable:!0,composed:!0},y={custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...v,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...v,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...v,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...v,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...v,...n})):e.dispatchEvent(new CustomEvent(t,{...v,...n}))}},b=0,x=()=>{b=0},S=e=>`${e?`${e}-`:`cft-`}${++b}`,C=RegExp(`u="([^"]+)"`,`g`),w=()=>{let e=0;return()=>String(e++)},T=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(C,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},E=function(){return this.content},D=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=l(e)?e.content:e??``}return{__craftitCssResult:!0,content:n.trim(),toString:E}},O=new Map,k=t=>{if(t instanceof CSSStyleSheet)return t;let n=typeof t==`string`?t:t.content,r=O.get(n);if(r)return r;let i=new CSSStyleSheet;try{i.replaceSync(n)}catch(t){console.error(e.styleReplaceFailed,t)}return O.set(n,i),i};export{x as _resetIdCounter,_ as createEmitFn,S as createId,w as createMarkerIdFactory,D as css,g as escapeHtml,c as extractResult,y as fire,o as htmlResult,a as isDirectiveResult,s as isHtmlResult,p as listen,k as loadStylesheet,r as ref,i as refs,T as rekeyHtmlResult,d as removeNodes,u as runAll,f as setAttr,m as toKebab};
|
|
2
2
|
//# sourceMappingURL=internal.js.map
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","names":[],"sources":["../src/internal.ts"],"sourcesContent":["/**\n * @internal — Binding type system, compiler/runtime helpers, and engine internals.\n *\n * These types and helpers define the contract between the template compiler, binding engine,\n * and component runtime.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Selected author-facing exports (such as css(), CSSResult, EmitFn, HTMLResult, Directive,\n * ref(), and refs()) are re-exported from the main entry point.\n */\n\nimport { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { fire } from './runtime';\nimport { currentRuntime } from './runtime-core';\n\nconst HTML_RESULT_BRAND: unique symbol = Symbol('craftit.htmlResultBrand');\n\nlet _idCounter = 0;\n\n/** @internal — resets the ID counter. Used by _resetCounters in test/test.ts. */\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\n/**\n * Creates a unique, stable ID string — suitable for `aria-labelledby`, `aria-describedby`,\n * and similar accessibility linkages. Call once per component instance (at setup time or inside `onMount`).\n */\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A reactive reference to a DOM element.\n *\n * Backed by a Signal — reactivity is built-in. Use with onElement()\n * for first-class element lifecycle management.\n *\n * @example\n * const inputRef = ref<HTMLInputElement>();\n *\n * onElement(inputRef, (input) => {\n * input.focus();\n * return () => { }; // cleanup\n * });\n *\n * // In template\n * <input ref=${inputRef} />\n */\nexport type Ref<T extends Element> = Signal<T | null>;\n\n/**\n * Create a reactive element reference.\n *\n * Returns a Signal that tracks the mounted/unmounted state of a DOM element.\n * Automatically reactive — use directly in effects or with onElement().\n *\n * @see onElement for element lifecycle integration\n *\n * @example\n * const ref = ref<HTMLInputElement>();\n * // Type: Signal<HTMLInputElement | null>\n * // Automatically updates when element mounts/unmounts\n */\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(null);\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTML RESULT\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __html: string;\n toString(): string;\n}\n\n/** @internal — construct an HTMLResult from a pre-built html string and bindings. */\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n const result = {\n __bindings: bindings,\n __html: html,\n toString() {\n return html;\n },\n };\n\n Object.defineProperty(result, HTML_RESULT_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return result as HTMLResult;\n}\n\n/** @internal — strict HTMLResult runtime type guard. */\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && !!value && (value as Record<symbol, unknown>)[HTML_RESULT_BRAND] === true;\n\n/** @internal — extract html and bindings from a string or HTMLResult. */\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DIRECTIVES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DirectiveContext {\n /** The cleanup registration function for the component. */\n registerCleanup: (fn: () => void) => void;\n}\n\nexport interface Directive {\n /** Invoked when the element is mounted in the DOM. */\n mount?(el: HTMLElement, context: DirectiveContext): void;\n /** Invoked by the template engine to render content (interpolation directives). */\n render?(): HTMLResult | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BINDING TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type PropBinding = {\n /** Optional writable source used for native two-way bridge (.value/.checked). */\n model?: Signal<unknown>;\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'prop';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n modifiers?: {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n prevent?: boolean;\n self?: boolean;\n stop?: boolean;\n };\n name: string;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type CallbackBinding = {\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;\n type: 'callback';\n uid: string;\n};\n\nexport type HtmlBinding = {\n keyed?: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n type: 'html';\n uid: string;\n};\n\nexport type Binding =\n | TextBinding\n | AttrBinding\n | PropBinding\n | EventBinding\n | RefBinding\n | CallbackBinding\n | HtmlBinding;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL MARKERS & CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — opaque marker for each() reactive results. */\nexport const EACH_SIGNAL: unique symbol = Symbol('craftit.eachSignal');\n\n/** @internal — binding element identifier attribute. */\nexport const CF_ID_ATTR = 'u';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL DOM & EVENT UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — Iterate an iterable and call every function in it. */\nexport const runAll = (fns: Iterable<() => void>): void => {\n const callbacks = [...fns];\n\n for (let index = callbacks.length - 1; index >= 0; index--) {\n callbacks[index]?.();\n }\n};\n\n/** @internal — Set an attribute on an element, handling boolean and null values. */\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n // Avoid inline event-handler attributes (onclick, onerror, ...) to reduce injection risk.\n if (/^on/i.test(name)) {\n el.removeAttribute(name);\n\n return;\n }\n\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else if (val === true) {\n el.setAttribute(name, name.startsWith('aria-') ? 'true' : '');\n } else {\n el.setAttribute(name, String(val));\n }\n};\n\n/** @internal — Attach an event listener with automatic cleanup. */\nexport const listen = (\n el: EventTarget,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL STRING UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": ''', '\"': '"', '&': '&', '<': '<', '>': '>' };\n\n/** @internal — Escape untrusted text for HTML text/attribute contexts. */\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL EMIT TYPES & HELPERS\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\nexport type EmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\n/** @internal — Create a type-safe custom event emitter for the current runtime host. */\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentRuntime().el;\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL CSS & STYLESHEET UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CSSResult = {\n content: string;\n toString(): string;\n};\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\n/** @internal — Compile CSS template strings into a CSSResult. */\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += v && typeof v === 'object' && 'content' in v ? (v as CSSResult).content : (v ?? '');\n }\n }\n\n return { content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\n/** @internal — Load a stylesheet string or CSSResult into an adoptedStyleSheet. */\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n stylesheetStringCache.set(cssText, sheet);\n } catch (err) {\n console.error(`[craftit:E2] style replace failed`, err);\n }\n\n return sheet;\n};\n"],"mappings":"kIAgBA,IAAM,EAAmC,OAAO,0BAA0B,CAEtE,EAAa,EAGJ,MAA8B,CACzC,EAAa,GAOF,EAAY,GAA4B,GAAG,EAAS,GAAG,EAAO,GAAK,SAAS,EAAE,IAsC3F,SAAgB,GAAiC,CAC/C,OAAO,EAAiB,KAAK,CAK/B,SAAgB,GAAmC,CACjD,MAAO,EAAE,CAgBX,SAAgB,EAAW,EAAc,EAAsB,EAAE,CAAc,CAC7E,IAAM,EAAS,CACb,WAAY,EACZ,OAAQ,EACR,UAAW,CACT,OAAO,GAEV,CASD,OAPA,OAAO,eAAe,EAAQ,EAAmB,CAC/C,aAAc,GACd,WAAY,GACZ,MAAO,GACP,SAAU,GACX,CAAC,CAEK,EAIT,IAAa,EAAgB,GAC3B,OAAO,GAAU,UAAY,CAAC,CAAC,GAAU,EAAkC,KAAuB,GAGpG,SAAgB,EAAc,EAA+D,CAC3F,OAAO,OAAO,GAAM,SAAW,CAAE,SAAU,EAAE,CAAE,KAAM,EAAG,CAAG,CAAE,SAAU,EAAE,WAAY,KAAM,EAAE,OAAQ,CAqGvG,IAAa,EAA6B,OAAO,qBAAqB,CAUzD,EAAU,GAAoC,CACzD,IAAM,EAAY,CAAC,GAAG,EAAI,CAE1B,IAAK,IAAI,EAAQ,EAAU,OAAS,EAAG,GAAS,EAAG,IACjD,EAAU,MAAU,EAKX,GAAW,EAAa,EAAc,IAAuB,CAExE,GAAI,OAAO,KAAK,EAAK,CAAE,CACrB,EAAG,gBAAgB,EAAK,CAExB,OAGE,GAAO,MAAQ,IAAQ,GACzB,EAAG,gBAAgB,EAAK,CACf,IAAQ,GACjB,EAAG,aAAa,EAAM,EAAK,WAAW,QAAQ,CAAG,OAAS,GAAG,CAE7D,EAAG,aAAa,EAAM,OAAO,EAAI,CAAC,EAKzB,GACX,EACA,EACA,EACA,IACiB,CACjB,IAAM,EAA0B,EAIhC,OAFA,EAAG,iBAAiB,EAAM,EAAU,EAAQ,KAE/B,EAAG,oBAAoB,EAAM,EAAU,EAAQ,EAOjD,EAAW,GAAwB,EAAI,QAAQ,SAAW,GAAM,IAAI,EAAE,aAAa,GAAG,CAE7F,EAA8B,CAAE,IAAK,QAAS,IAAK,SAAU,IAAK,QAAS,IAAK,OAAQ,IAAK,OAAQ,CAG9F,EAAc,GAA2B,OAAO,EAAM,CAAC,QAAQ,WAAa,GAAM,EAAI,GAAG,CAiBzF,MAAmE,CAC9E,IAAM,EAAK,GAAgB,CAAC,GAE5B,QAAS,EAAgB,GAAG,IAAoB,CAC9C,EAAK,OAAO,EAAI,OAAO,EAAM,CAAE,EAAK,OAAS,EAAI,CAAE,OAAQ,EAAK,GAAI,CAAG,IAAA,GAAU,IAa/E,EAAoB,UAAmC,CAC3D,OAAO,KAAK,SAID,GAAO,EAA+B,GAAG,IAAiC,CACrF,IAAI,EAAU,GAEd,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAGlC,GAFA,GAAW,EAAQ,GAEf,EAAI,EAAO,OAAQ,CACrB,IAAM,EAAI,EAAO,GAEjB,GAAW,GAAK,OAAO,GAAM,UAAY,YAAa,EAAK,EAAgB,QAAW,GAAK,GAI/F,MAAO,CAAE,QAAS,EAAQ,MAAM,CAAE,SAAU,EAAmB,EAG3D,EAAwB,IAAI,IAGrB,EAAkB,GAA6D,CAC1F,GAAI,aAAiB,cAAe,OAAO,EAE3C,IAAM,EAAU,OAAO,GAAU,SAAW,EAAQ,EAAM,QACpD,EAAS,EAAsB,IAAI,EAAQ,CAEjD,GAAI,EAAQ,OAAO,EAEnB,IAAM,EAAQ,IAAI,cAElB,GAAI,CACF,EAAM,YAAY,EAAQ,CAC1B,EAAsB,IAAI,EAAS,EAAM,OAClC,EAAK,CACZ,QAAQ,MAAM,oCAAqC,EAAI,CAGzD,OAAO"}
|
|
1
|
+
{"version":3,"file":"internal.js","names":[],"sources":["../src/internal.ts"],"sourcesContent":["import { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { currentElementOrThrow } from './runtime';\n\nexport type Ref<T extends Element> = Signal<T | null>;\n\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(null);\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n /** When true the binding uses live-write semantics: stale app-state writes are\n * skipped if the DOM value has diverged from the last programmatic write. */\n live?: true;\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n name: string;\n options?: AddEventListenerOptions;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type HtmlBindingPayload = {\n bindings: Binding[];\n html: string;\n};\n\nexport type RuntimeDirective = {\n __craftitDirective: true;\n mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;\n};\n\nexport type DirectiveResult = RuntimeDirective;\n\nexport const isDirectiveResult = (value: unknown): value is DirectiveResult =>\n typeof value === 'object' &&\n value !== null &&\n (value as RuntimeDirective).__craftitDirective === true &&\n typeof (value as RuntimeDirective).mount === 'function';\n\nexport type HtmlBinding = {\n signal: ReadonlySignal<HtmlBindingPayload>;\n type: 'html';\n uid: string;\n};\n\nexport type DirectiveBinding = {\n directive: RuntimeDirective;\n type: 'directive';\n uid: string;\n};\n\nexport type Binding = TextBinding | AttrBinding | EventBinding | RefBinding | HtmlBinding | DirectiveBinding;\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __craftitHtmlResult: true;\n __html: string;\n toString(): string;\n}\n\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n return {\n __bindings: bindings,\n __craftitHtmlResult: true,\n __html: html,\n toString() {\n return html;\n },\n };\n}\n\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && value !== null && (value as HTMLResult).__craftitHtmlResult === true;\n\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\nexport type CSSResult = {\n __craftitCssResult: true;\n content: string;\n toString(): string;\n};\n\nexport const isCssResult = (value: unknown): value is CSSResult =>\n typeof value === 'object' && !!value && (value as CSSResult).__craftitCssResult === true;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DOM UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const runAll = (fns: (() => void)[]): void => {\n const errors: unknown[] = [];\n\n for (let i = fns.length - 1; i >= 0; i--) {\n try {\n fns[i]();\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, CRAFTIT_ERRORS.cleanupFailed);\n }\n};\n\nexport const removeNodes = (nodes: Node[]): void => {\n for (const node of nodes) {\n (node as ChildNode).remove();\n }\n};\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n if (/^on/i.test(name)) {\n el.removeAttribute(name);\n\n return;\n }\n\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else {\n el.setAttribute(name, val === true ? 'true' : String(val));\n }\n};\n\nexport const listen = (\n el: EventTarget | null | undefined,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n if (!el) return () => {};\n\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": ''', '\"': '"', '&': '&', '<': '<', '>': '>' };\n\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EMIT UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\ntype StrictEmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\ntype LooseEmitFn = (event: string, detail?: unknown) => void;\n\nexport type EmitFn<T extends Record<string, unknown>> = StrictEmitFn<T> & LooseEmitFn;\n\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentElementOrThrow();\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FIRE UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\nexport const fire: FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ID UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _idCounter = 0;\n\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\nexport const CF_ID_ATTR = 'u';\n\nconst ATTR_ID_RE = new RegExp(`${CF_ID_ATTR}=\"([^\"]+)\"`, 'g');\n\nexport const createMarkerIdFactory = (): (() => string) => {\n let n = 0;\n\n return () => String(n++);\n};\n\nexport const rekeyHtmlResult = (result: HTMLResult, getNextId: () => string): { bindings: Binding[]; html: string } => {\n const idMap = new Map<string, string>();\n const getMappedId = (id: string): string => {\n const mapped = idMap.get(id);\n\n if (mapped) return mapped;\n\n const next = getNextId();\n\n idMap.set(id, next);\n\n return next;\n };\n\n return {\n bindings: result.__bindings.map((binding) => ({ ...binding, uid: getMappedId(binding.uid) }) as Binding),\n html: result.__html\n .replace(ATTR_ID_RE, (_, id: string) => `${CF_ID_ATTR}=\"${getMappedId(id)}\"`)\n .replace(/<!--(\\d+)-->/g, (_, id: string) => `<!--${getMappedId(id)}-->`),\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += isCssResult(v) ? v.content : (v ?? '');\n }\n }\n\n return { __craftitCssResult: true as const, content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n } catch (err) {\n console.error(CRAFTIT_ERRORS.styleReplaceFailed, err);\n }\n\n stylesheetStringCache.set(cssText, sheet);\n\n return sheet;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../runtime
|
|
1
|
+
const e=require(`../runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=(n,r)=>{let i=(0,t.signal)(null),a=new IntersectionObserver(([e])=>{e&&(i.value=e)},r);return a.observe(n),e.onCleanup(()=>a.disconnect()),i};exports.intersectionObserver=n;
|
|
2
2
|
//# sourceMappingURL=intersection-observe.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersection-observe.cjs","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime
|
|
1
|
+
{"version":3,"file":"intersection-observe.cjs","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside a `mount()` callback.\n */\nexport const intersectionObserver = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([nextEntry]) => {\n if (nextEntry) entry.value = nextEntry;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n"],"mappings":"qEAUA,IAAa,GACX,EACA,IACqD,CACrD,IAAM,GAAA,EAAA,EAAA,QAAiD,IAAI,EACrD,EAAK,IAAI,sBAAsB,CAAC,KAAe,CAC/C,IAAW,EAAM,MAAQ,EAC/B,EAAG,CAAO,EAKV,OAHA,EAAG,QAAQ,CAAE,EACb,EAAA,cAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
|
|
@@ -3,7 +3,7 @@ import { type ReadonlySignal } from '@vielzeug/stateit';
|
|
|
3
3
|
* Observes an element's intersection with the viewport (or a given root) via
|
|
4
4
|
* `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the
|
|
5
5
|
* intersection ratio changes.
|
|
6
|
-
* Must be called inside
|
|
6
|
+
* Must be called inside a `mount()` callback.
|
|
7
7
|
*/
|
|
8
8
|
export declare const intersectionObserver: (el: Element, options?: IntersectionObserverInit) => ReadonlySignal<IntersectionObserverEntry | null>;
|
|
9
9
|
//# sourceMappingURL=intersection-observe.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{onCleanup as e}from"../runtime
|
|
1
|
+
import{onCleanup as e}from"../runtime.js";import{signal as t}from"@vielzeug/stateit";var n=(n,r)=>{let i=t(null),a=new IntersectionObserver(([e])=>{e&&(i.value=e)},r);return a.observe(n),e(()=>a.disconnect()),i};export{n as intersectionObserver};
|
|
2
2
|
//# sourceMappingURL=intersection-observe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intersection-observe.js","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime
|
|
1
|
+
{"version":3,"file":"intersection-observe.js","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside a `mount()` callback.\n */\nexport const intersectionObserver = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([nextEntry]) => {\n if (nextEntry) entry.value = nextEntry;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n"],"mappings":"qFAUA,IAAa,GACX,EACA,IACqD,CACrD,IAAM,EAAQ,EAAyC,IAAI,EACrD,EAAK,IAAI,sBAAsB,CAAC,KAAe,CAC/C,IAAW,EAAM,MAAQ,EAC/B,EAAG,CAAO,EAKV,OAHA,EAAG,QAAQ,CAAE,EACb,MAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../runtime
|
|
1
|
+
const e=require(`../runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=n=>{let r=window.matchMedia(n),i=(0,t.signal)(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e.onCleanup(()=>r.removeEventListener(`change`,a)),i};exports.mediaObserver=n;
|
|
2
2
|
//# sourceMappingURL=media-observe.cjs.map
|