@vielzeug/ore 1.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 +73 -0
- package/dist/_dev.cjs +2 -0
- package/dist/_dev.cjs.map +1 -0
- package/dist/_dev.d.ts +2 -0
- package/dist/_dev.d.ts.map +1 -0
- package/dist/_dev.js +2 -0
- package/dist/_dev.js.map +1 -0
- package/dist/aria.cjs +2 -0
- package/dist/aria.cjs.map +1 -0
- package/dist/aria.d.ts +12 -0
- package/dist/aria.d.ts.map +1 -0
- package/dist/aria.js +2 -0
- package/dist/aria.js.map +1 -0
- package/dist/base-element.cjs +2 -0
- package/dist/base-element.cjs.map +1 -0
- package/dist/base-element.d.ts +22 -0
- package/dist/base-element.d.ts.map +1 -0
- package/dist/base-element.js +2 -0
- package/dist/base-element.js.map +1 -0
- package/dist/component-types.d.ts +104 -0
- package/dist/component-types.d.ts.map +1 -0
- package/dist/context-bag.cjs +2 -0
- package/dist/context-bag.cjs.map +1 -0
- package/dist/context-bag.d.ts +12 -0
- package/dist/context-bag.d.ts.map +1 -0
- package/dist/context-bag.js +2 -0
- package/dist/context-bag.js.map +1 -0
- package/dist/context.cjs +2 -0
- package/dist/context.cjs.map +1 -0
- package/dist/context.d.ts +15 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/define.cjs +2 -0
- package/dist/define.cjs.map +1 -0
- package/dist/define.d.ts +33 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +2 -0
- package/dist/define.js.map +1 -0
- package/dist/devtools.cjs +2 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.ts +32 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +2 -0
- package/dist/devtools.js.map +1 -0
- 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 +2 -0
- package/dist/directives/each.cjs.map +1 -0
- package/dist/directives/each.d.ts +25 -0
- package/dist/directives/each.d.ts.map +1 -0
- package/dist/directives/each.js +2 -0
- package/dist/directives/each.js.map +1 -0
- package/dist/directives/index.d.ts +8 -0
- package/dist/directives/index.d.ts.map +1 -0
- package/dist/directives/live.cjs +2 -0
- package/dist/directives/live.cjs.map +1 -0
- package/dist/directives/live.d.ts +25 -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/model.cjs +2 -0
- package/dist/directives/model.cjs.map +1 -0
- package/dist/directives/model.d.ts +28 -0
- package/dist/directives/model.d.ts.map +1 -0
- package/dist/directives/model.js +2 -0
- package/dist/directives/model.js.map +1 -0
- package/dist/directives/raw.cjs +2 -0
- package/dist/directives/raw.cjs.map +1 -0
- package/dist/directives/raw.d.ts +16 -0
- package/dist/directives/raw.d.ts.map +1 -0
- package/dist/directives/raw.js +2 -0
- package/dist/directives/raw.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 +25 -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 +2 -0
- package/dist/directives/when.cjs.map +1 -0
- package/dist/directives/when.d.ts +19 -0
- package/dist/directives/when.d.ts.map +1 -0
- package/dist/directives/when.js +2 -0
- package/dist/directives/when.js.map +1 -0
- package/dist/directives.cjs +1 -0
- package/dist/directives.js +1 -0
- package/dist/errors.cjs +3 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.ts +47 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +3 -0
- package/dist/errors.js.map +1 -0
- package/dist/form-context.cjs +2 -0
- package/dist/form-context.cjs.map +1 -0
- package/dist/form-context.d.ts +56 -0
- package/dist/form-context.d.ts.map +1 -0
- package/dist/form-context.js +2 -0
- package/dist/form-context.js.map +1 -0
- package/dist/form-field.cjs +2 -0
- package/dist/form-field.cjs.map +1 -0
- package/dist/form-field.d.ts +31 -0
- package/dist/form-field.d.ts.map +1 -0
- package/dist/form-field.js +2 -0
- package/dist/form-field.js.map +1 -0
- package/dist/host-bind.cjs +2 -0
- package/dist/host-bind.cjs.map +1 -0
- package/dist/host-bind.d.ts +37 -0
- package/dist/host-bind.d.ts.map +1 -0
- package/dist/host-bind.js +2 -0
- package/dist/host-bind.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +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/ore.cjs +3 -0
- package/dist/ore.cjs.map +1 -0
- package/dist/ore.iife.js +3 -0
- package/dist/ore.iife.js.map +1 -0
- package/dist/ore.js +3 -0
- package/dist/ore.js.map +1 -0
- package/dist/props.cjs +2 -0
- package/dist/props.cjs.map +1 -0
- package/dist/props.d.ts +76 -0
- package/dist/props.d.ts.map +1 -0
- package/dist/props.js +2 -0
- package/dist/props.js.map +1 -0
- package/dist/runtime.cjs +2 -0
- package/dist/runtime.cjs.map +1 -0
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2 -0
- package/dist/runtime.js.map +1 -0
- package/dist/slots.cjs +2 -0
- package/dist/slots.cjs.map +1 -0
- package/dist/slots.d.ts +13 -0
- package/dist/slots.d.ts.map +1 -0
- package/dist/slots.js +2 -0
- package/dist/slots.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 +17 -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 +27 -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/template/instantiator.cjs +2 -0
- package/dist/template/instantiator.cjs.map +1 -0
- package/dist/template/instantiator.d.ts +16 -0
- package/dist/template/instantiator.d.ts.map +1 -0
- package/dist/template/instantiator.js +2 -0
- package/dist/template/instantiator.js.map +1 -0
- package/dist/template.cjs +1 -0
- package/dist/template.d.ts +4 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +1 -0
- package/dist/testing/events.cjs +2 -0
- package/dist/testing/events.cjs.map +1 -0
- package/dist/testing/events.d.ts +37 -0
- package/dist/testing/events.d.ts.map +1 -0
- package/dist/testing/events.js +2 -0
- package/dist/testing/events.js.map +1 -0
- package/dist/testing/flush.cjs +2 -0
- package/dist/testing/flush.cjs.map +1 -0
- package/dist/testing/flush.d.ts +55 -0
- package/dist/testing/flush.d.ts.map +1 -0
- package/dist/testing/flush.js +2 -0
- package/dist/testing/flush.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/interactions.cjs +2 -0
- package/dist/testing/interactions.cjs.map +1 -0
- package/dist/testing/interactions.d.ts +27 -0
- package/dist/testing/interactions.d.ts.map +1 -0
- package/dist/testing/interactions.js +2 -0
- package/dist/testing/interactions.js.map +1 -0
- package/dist/testing/mount.cjs +2 -0
- package/dist/testing/mount.cjs.map +1 -0
- package/dist/testing/mount.d.ts +107 -0
- package/dist/testing/mount.d.ts.map +1 -0
- package/dist/testing/mount.js +2 -0
- package/dist/testing/mount.js.map +1 -0
- package/dist/testing/query.cjs +2 -0
- package/dist/testing/query.cjs.map +1 -0
- package/dist/testing/query.d.ts +24 -0
- package/dist/testing/query.d.ts.map +1 -0
- package/dist/testing/query.js +2 -0
- package/dist/testing/query.js.map +1 -0
- package/dist/testing/render-hook.cjs +2 -0
- package/dist/testing/render-hook.cjs.map +1 -0
- package/dist/testing/render-hook.d.ts +44 -0
- package/dist/testing/render-hook.d.ts.map +1 -0
- package/dist/testing/render-hook.js +2 -0
- package/dist/testing/render-hook.js.map +1 -0
- package/dist/testing/testing.cjs +2 -0
- package/dist/testing/testing.cjs.map +1 -0
- package/dist/testing/testing.d.ts +26 -0
- 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/wait.cjs +2 -0
- package/dist/testing/wait.cjs.map +1 -0
- package/dist/testing/wait.d.ts +35 -0
- package/dist/testing/wait.d.ts.map +1 -0
- package/dist/testing/wait.js +2 -0
- package/dist/testing/wait.js.map +1 -0
- package/dist/testing.cjs +1 -0
- package/dist/testing.js +1 -0
- package/dist/types/bindings.cjs +2 -0
- package/dist/types/bindings.cjs.map +1 -0
- package/dist/types/bindings.d.ts +125 -0
- package/dist/types/bindings.d.ts.map +1 -0
- package/dist/types/bindings.js +2 -0
- package/dist/types/bindings.js.map +1 -0
- package/dist/types.cjs +2 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/aria.cjs +2 -0
- package/dist/utils/aria.cjs.map +1 -0
- package/dist/utils/aria.d.ts +16 -0
- package/dist/utils/aria.d.ts.map +1 -0
- package/dist/utils/aria.js +2 -0
- package/dist/utils/aria.js.map +1 -0
- package/dist/utils/css.cjs +2 -0
- package/dist/utils/css.cjs.map +1 -0
- package/dist/utils/css.d.ts +11 -0
- package/dist/utils/css.d.ts.map +1 -0
- package/dist/utils/css.js +2 -0
- package/dist/utils/css.js.map +1 -0
- package/dist/utils/dom.cjs +2 -0
- package/dist/utils/dom.cjs.map +1 -0
- package/dist/utils/dom.d.ts +10 -0
- package/dist/utils/dom.d.ts.map +1 -0
- package/dist/utils/dom.js +2 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/emit.cjs +2 -0
- package/dist/utils/emit.cjs.map +1 -0
- package/dist/utils/emit.d.ts +16 -0
- package/dist/utils/emit.d.ts.map +1 -0
- package/dist/utils/emit.js +2 -0
- package/dist/utils/emit.js.map +1 -0
- package/dist/utils/event-modifiers.cjs +2 -0
- package/dist/utils/event-modifiers.cjs.map +1 -0
- package/dist/utils/event-modifiers.d.ts +11 -0
- package/dist/utils/event-modifiers.d.ts.map +1 -0
- package/dist/utils/event-modifiers.js +2 -0
- package/dist/utils/event-modifiers.js.map +1 -0
- package/dist/utils/id.cjs +2 -0
- package/dist/utils/id.cjs.map +1 -0
- package/dist/utils/id.d.ts +18 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +2 -0
- package/dist/utils/id.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAIA,kGAAkG;AAClG,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY;IAMhD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,QAAQ;CAGzC;AAED,sGAAsG;AACtG,qBAAa,WAAY,SAAQ,QAAQ;gBAC3B,OAAO,EAAE,MAAM;CAG5B;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;AAEhE;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE;CAKhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAUvF;AAID,qHAAqH;AACrH,qBAAa,eAAgB,SAAQ,QAAQ;CAAG;AAEhD,eAAO,MAAM,UAAU;oCACE,MAAM,KAAG,MAAM;sDACG,MAAM,KAAG,MAAM;;qCAGhC,MAAM,SAAS,MAAM,KAAG,MAAM;uCAC5B,MAAM,OAAO,MAAM,KAAG,MAAM;;;qCAG9B,MAAM,UAAU,MAAM,EAAE,KAAG,MAAM;CACjD,CAAC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{error as e}from"./_dev.js";var t=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},n=class extends t{constructor(e){super(e)}},r=class extends t{component;phase;constructor(e,t){super(e,{cause:t.cause}),this.component=t.component,this.phase=t.phase}};function i(t,n){e(`<${t.component}> setup error (phase: ${t.phase}):`,t.cause),n.dispatchEvent(new CustomEvent(`ore:error`,{bubbles:!0,composed:!0,detail:t}))}var a=class extends t{},o={defineDuplicate:e=>`define('${e}') called twice — custom element already registered`,defineFieldRequiresFormAssociated:e=>`useField() requires define('${e}', { formAssociated: true })`,defineRequiresTag:`define() requires a tag name`,eachDuplicateKey:(e,t)=>`each() received duplicate key "${e}" at index ${t}`,injectStrictFailed:(e,t)=>`injectStrict() could not resolve key "${e}" in <${t}>`,lifecycleOutsideSetup:`Lifecycle hooks must be called during component setup`,propInvalidReflect:`Structured props cannot use reflect:true — use prop.json() with reflect:false`,validationFailed:(e,t)=>`Validation failed for <${e}>:\n${t.join(`
|
|
2
|
+
`)}`};export{o as ORE_ERRORS,n as OreApiError,t as OreError,r as OreLifecycleError,a as OreTimeoutError,i as reportRuntimeError};
|
|
3
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { error as logError } from './_dev';\n\n// ─── Structured error types ───────────────────────────────────────────────────\n\n/** Base class for all Ore errors. Use `instanceof OreError` to catch any Ore-originated error. */\nexport class OreError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(err: unknown): err is OreError {\n return err instanceof OreError;\n }\n}\n\n/** Thrown when Ore API is called incorrectly (e.g. outside setup, duplicate define, invalid prop). */\nexport class OreApiError extends OreError {\n constructor(message: string) {\n super(message);\n }\n}\n\n/**\n * The phase in which a component error occurred.\n * - `'setup'` — synchronous setup() threw\n * - `'async-setup'` — async setup() promise rejected\n * - `'mounted'` — an onMounted callback threw\n */\nexport type OreErrorPhase = 'async-setup' | 'mounted' | 'setup';\n\n/**\n * Structured error thrown by the Ore runtime when component setup fails.\n * Provides component name and original cause for debugging.\n */\nexport class OreLifecycleError extends OreError {\n readonly component: string;\n readonly phase: OreErrorPhase;\n\n constructor(message: string, options: { cause: Error; component: string; phase: OreErrorPhase }) {\n super(message, { cause: options.cause });\n this.component = options.component;\n this.phase = options.phase;\n }\n}\n\n/**\n * Report a runtime error via the ore:error event and console.\n */\nexport function reportRuntimeError(error: OreLifecycleError, element: HTMLElement): void {\n logError(`<${error.component}> setup error (phase: ${error.phase}):`, error.cause);\n\n element.dispatchEvent(\n new CustomEvent('ore:error', {\n bubbles: true,\n composed: true,\n detail: error,\n }),\n );\n}\n\n// ─── Error message constants ─────────────────────────────────────────────────\n\n/** Thrown by `waitFor` and `waitForEvent` in the testing sub-path when a condition is not met within the timeout. */\nexport class OreTimeoutError extends OreError {}\n\nexport const ORE_ERRORS = {\n defineDuplicate: (tag: string): string => `define('${tag}') called twice — custom element already registered`,\n defineFieldRequiresFormAssociated: (tag: string): string =>\n `useField() requires define('${tag}', { formAssociated: true })`,\n defineRequiresTag: 'define() requires a tag name',\n eachDuplicateKey: (key: string, index: number): string => `each() received duplicate key \"${key}\" at index ${index}`,\n injectStrictFailed: (key: string, tag: string): string => `injectStrict() could not resolve key \"${key}\" in <${tag}>`,\n lifecycleOutsideSetup: 'Lifecycle hooks must be called during component setup',\n propInvalidReflect: 'Structured props cannot use reflect:true — use prop.json() with reflect:false',\n validationFailed: (tag: string, errors: string[]): string => `Validation failed for <${tag}>:\\n${errors.join('\\n')}`,\n} as const;\n"],"mappings":"kCAKA,IAAa,EAAb,MAAa,UAAiB,KAAM,CAClC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,IAAI,OAAO,KACvB,OAAO,eAAe,KAAM,IAAI,OAAO,SAAS,CAClD,CAEA,OAAO,GAAG,EAA+B,CACvC,OAAO,aAAe,CACxB,CACF,EAGa,EAAb,cAAiC,CAAS,CACxC,YAAY,EAAiB,CAC3B,MAAM,CAAO,CACf,CACF,EAca,EAAb,cAAuC,CAAS,CAC9C,UACA,MAEA,YAAY,EAAiB,EAAoE,CAC/F,MAAM,EAAS,CAAE,MAAO,EAAQ,KAAM,CAAC,EACvC,KAAK,UAAY,EAAQ,UACzB,KAAK,MAAQ,EAAQ,KACvB,CACF,EAKA,SAAgB,EAAmB,EAA0B,EAA4B,CACvF,EAAS,IAAI,EAAM,UAAU,wBAAwB,EAAM,MAAM,IAAK,EAAM,KAAK,EAEjF,EAAQ,cACN,IAAI,YAAY,YAAa,CAC3B,QAAS,GACT,SAAU,GACV,OAAQ,CACV,CAAC,CACH,CACF,CAKA,IAAa,EAAb,cAAqC,CAAS,CAAC,EAElC,EAAa,CACxB,gBAAkB,GAAwB,WAAW,EAAI,qDACzD,kCAAoC,GAClC,+BAA+B,EAAI,8BACrC,kBAAmB,+BACnB,kBAAmB,EAAa,IAA0B,kCAAkC,EAAI,aAAa,IAC7G,oBAAqB,EAAa,IAAwB,yCAAyC,EAAI,QAAQ,EAAI,GACnH,sBAAuB,wDACvB,mBAAoB,gFACpB,kBAAmB,EAAa,IAA6B,0BAA0B,EAAI,MAAM,EAAO,KAAK;CAAI,GACnH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./context.cjs");let t=require("@vielzeug/ripple");var n=e.createContext(`ore:form-context`);function r(e={}){let n=(0,t.signal)([]),r=(0,t.signal)(!1),i=(0,t.signal)(!1),a=(0,t.signal)(null);return{clearStatus:()=>{i.value=!1,a.value=null,e.onReset?.()},dirty:i,error:a,markDirty:()=>{i.value=!0},registerField:e=>(n.value=[...n.value,e],()=>{n.value=n.value.filter(t=>t!==e)}),submit:async t=>{if(t?.preventDefault(),!r.value){r.value=!0,a.value=null;try{await e.onSubmit?.(t),i.value=!1}catch(e){a.value=e}finally{r.value=!1}}},submitting:r,valid:(0,t.computed)(()=>n.value.every(e=>e.value))}}exports.FORM_CONTEXT_KEY=n,exports.createFormContext=r;
|
|
2
|
+
//# sourceMappingURL=form-context.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-context.cjs","names":[],"sources":["../src/form-context.ts"],"sourcesContent":["import { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { createContext } from './context';\n\n/**\n * Context shape injected by child field components.\n * Contains only what a field needs — not submit/error/status APIs.\n */\nexport type FormFieldContext = {\n /** Whether any field has been touched (interacted with). Set via markDirty(). */\n readonly dirty: Readable<boolean>;\n markDirty(): void;\n /**\n * Register a field's validity signal with the form context.\n * Returns a cleanup function.\n */\n registerField(validity: Readable<boolean>): () => void;\n};\n\n/**\n * Full form controller returned by `createFormContext`.\n * Extends `FormFieldContext` with submission and status APIs.\n */\nexport type FormController = FormFieldContext & {\n /**\n * Clear `dirty` and `error` status signals and invoke `onReset` if provided.\n * Note: this does not reset individual field values — pass an `onReset` callback\n * to handle value restoration.\n */\n clearStatus(): void;\n /** The last submit error, or null if the last submit succeeded. */\n readonly error: Readable<unknown>;\n /** Submit the form programmatically. */\n submit(e?: Event): Promise<void>;\n /** Whether the form is currently submitting. */\n readonly submitting: Readable<boolean>;\n /** Whether all fields in the form are valid. */\n readonly valid: Readable<boolean>;\n};\n\nexport const FORM_CONTEXT_KEY = createContext<FormFieldContext>('ore:form-context');\n\n/**\n * Create a `FormController` for coordinating form state across child field components.\n * Call `ctx.provide(FORM_CONTEXT_KEY, form)` to make it available to descendants.\n *\n * @example\n * ```ts\n * define('my-form', {\n * setup(_props, ctx) {\n * const form = createFormContext({ onSubmit: async (e) => { ... } });\n * ctx.provide(FORM_CONTEXT_KEY, form);\n * return html`<form @submit=${form.submit}><slot></slot></form>`;\n * }\n * });\n * ```\n */\nexport function createFormContext(\n options: {\n onReset?: () => void;\n onSubmit?: (e?: Event) => void | Promise<void>;\n } = {},\n): FormController {\n const fieldValiditySignals = signal<Array<Readable<boolean>>>([]);\n const submitting = signal(false);\n const dirty = signal(false);\n const error = signal<unknown>(null);\n\n // Note: [].every() is vacuously true, so valid is true when no fields are registered.\n // This is intentional — a form with no fields is considered valid (nothing to invalidate it).\n const valid = computed(() => fieldValiditySignals.value.every((s) => s.value));\n\n const submit = async (e?: Event): Promise<void> => {\n e?.preventDefault();\n\n if (submitting.value) return;\n\n submitting.value = true;\n error.value = null;\n\n try {\n await options.onSubmit?.(e);\n dirty.value = false;\n } catch (err) {\n error.value = err;\n } finally {\n submitting.value = false;\n }\n };\n\n const clearStatus = (): void => {\n dirty.value = false;\n error.value = null;\n options.onReset?.();\n };\n\n const markDirty = (): void => {\n dirty.value = true;\n };\n\n const registerField = (validity: Readable<boolean>): (() => void) => {\n fieldValiditySignals.value = [...fieldValiditySignals.value, validity];\n\n return () => {\n fieldValiditySignals.value = fieldValiditySignals.value.filter((s) => s !== validity);\n };\n };\n\n return { clearStatus, dirty, error, markDirty, registerField, submit, submitting, valid };\n}\n"],"mappings":"mEAwCA,IAAa,EAAmB,EAAA,cAAgC,kBAAkB,EAiBlF,SAAgB,EACd,EAGI,CAAC,EACW,CAChB,IAAM,GAAA,EAAA,EAAA,OAAA,CAAwD,CAAC,CAAC,EAC1D,GAAA,EAAA,EAAA,OAAA,CAAoB,EAAK,EACzB,GAAA,EAAA,EAAA,OAAA,CAAe,EAAK,EACpB,GAAA,EAAA,EAAA,OAAA,CAAwB,IAAI,EA0ClC,MAAO,CAAE,gBAlBuB,CAC9B,EAAM,MAAQ,GACd,EAAM,MAAQ,KACd,EAAQ,UAAU,CACpB,EAcsB,QAAO,QAAO,cAZN,CAC5B,EAAM,MAAQ,EAChB,EAU+C,cARxB,IACrB,EAAqB,MAAQ,CAAC,GAAG,EAAqB,MAAO,CAAQ,MAExD,CACX,EAAqB,MAAQ,EAAqB,MAAM,OAAQ,GAAM,IAAM,CAAQ,CACtF,GAG4D,YApCxC,IAA6B,CACjD,MAAG,eAAe,EAEd,GAAW,MAGf,CADA,EAAW,MAAQ,GACnB,EAAM,MAAQ,KAEd,GAAI,CACF,MAAM,EAAQ,WAAW,CAAC,EAC1B,EAAM,MAAQ,EAChB,OAAS,EAAK,CACZ,EAAM,MAAQ,CAChB,QAAU,CACR,EAAW,MAAQ,EACrB,CATc,CAUhB,EAoBsE,aAAY,OAtC5E,EAAA,EAAA,SAAA,KAAuB,EAAqB,MAAM,MAAO,GAAM,EAAE,KAAK,CAsCM,CAAM,CAC1F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
/**
|
|
3
|
+
* Context shape injected by child field components.
|
|
4
|
+
* Contains only what a field needs — not submit/error/status APIs.
|
|
5
|
+
*/
|
|
6
|
+
export type FormFieldContext = {
|
|
7
|
+
/** Whether any field has been touched (interacted with). Set via markDirty(). */
|
|
8
|
+
readonly dirty: Readable<boolean>;
|
|
9
|
+
markDirty(): void;
|
|
10
|
+
/**
|
|
11
|
+
* Register a field's validity signal with the form context.
|
|
12
|
+
* Returns a cleanup function.
|
|
13
|
+
*/
|
|
14
|
+
registerField(validity: Readable<boolean>): () => void;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Full form controller returned by `createFormContext`.
|
|
18
|
+
* Extends `FormFieldContext` with submission and status APIs.
|
|
19
|
+
*/
|
|
20
|
+
export type FormController = FormFieldContext & {
|
|
21
|
+
/**
|
|
22
|
+
* Clear `dirty` and `error` status signals and invoke `onReset` if provided.
|
|
23
|
+
* Note: this does not reset individual field values — pass an `onReset` callback
|
|
24
|
+
* to handle value restoration.
|
|
25
|
+
*/
|
|
26
|
+
clearStatus(): void;
|
|
27
|
+
/** The last submit error, or null if the last submit succeeded. */
|
|
28
|
+
readonly error: Readable<unknown>;
|
|
29
|
+
/** Submit the form programmatically. */
|
|
30
|
+
submit(e?: Event): Promise<void>;
|
|
31
|
+
/** Whether the form is currently submitting. */
|
|
32
|
+
readonly submitting: Readable<boolean>;
|
|
33
|
+
/** Whether all fields in the form are valid. */
|
|
34
|
+
readonly valid: Readable<boolean>;
|
|
35
|
+
};
|
|
36
|
+
export declare const FORM_CONTEXT_KEY: import("./context").InjectionKey<FormFieldContext>;
|
|
37
|
+
/**
|
|
38
|
+
* Create a `FormController` for coordinating form state across child field components.
|
|
39
|
+
* Call `ctx.provide(FORM_CONTEXT_KEY, form)` to make it available to descendants.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* define('my-form', {
|
|
44
|
+
* setup(_props, ctx) {
|
|
45
|
+
* const form = createFormContext({ onSubmit: async (e) => { ... } });
|
|
46
|
+
* ctx.provide(FORM_CONTEXT_KEY, form);
|
|
47
|
+
* return html`<form @submit=${form.submit}><slot></slot></form>`;
|
|
48
|
+
* }
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function createFormContext(options?: {
|
|
53
|
+
onReset?: () => void;
|
|
54
|
+
onSubmit?: (e?: Event) => void | Promise<void>;
|
|
55
|
+
}): FormController;
|
|
56
|
+
//# sourceMappingURL=form-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-context.d.ts","sourceRoot":"","sources":["../src/form-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAU,MAAM,kBAAkB,CAAC;AAInE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,SAAS,IAAI,IAAI,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC;CACxD,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG;IAC9C;;;;OAIG;IACH,WAAW,IAAI,IAAI,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,oDAAsD,CAAC;AAEpF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,GACL,cAAc,CA+ChB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createContext as e}from"./context.js";import{computed as t,signal as n}from"@vielzeug/ripple";var r=e(`ore:form-context`);function i(e={}){let r=n([]),i=n(!1),a=n(!1),o=n(null);return{clearStatus:()=>{a.value=!1,o.value=null,e.onReset?.()},dirty:a,error:o,markDirty:()=>{a.value=!0},registerField:e=>(r.value=[...r.value,e],()=>{r.value=r.value.filter(t=>t!==e)}),submit:async t=>{if(t?.preventDefault(),!i.value){i.value=!0,o.value=null;try{await e.onSubmit?.(t),a.value=!1}catch(e){o.value=e}finally{i.value=!1}}},submitting:i,valid:t(()=>r.value.every(e=>e.value))}}export{r as FORM_CONTEXT_KEY,i as createFormContext};
|
|
2
|
+
//# sourceMappingURL=form-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-context.js","names":[],"sources":["../src/form-context.ts"],"sourcesContent":["import { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { createContext } from './context';\n\n/**\n * Context shape injected by child field components.\n * Contains only what a field needs — not submit/error/status APIs.\n */\nexport type FormFieldContext = {\n /** Whether any field has been touched (interacted with). Set via markDirty(). */\n readonly dirty: Readable<boolean>;\n markDirty(): void;\n /**\n * Register a field's validity signal with the form context.\n * Returns a cleanup function.\n */\n registerField(validity: Readable<boolean>): () => void;\n};\n\n/**\n * Full form controller returned by `createFormContext`.\n * Extends `FormFieldContext` with submission and status APIs.\n */\nexport type FormController = FormFieldContext & {\n /**\n * Clear `dirty` and `error` status signals and invoke `onReset` if provided.\n * Note: this does not reset individual field values — pass an `onReset` callback\n * to handle value restoration.\n */\n clearStatus(): void;\n /** The last submit error, or null if the last submit succeeded. */\n readonly error: Readable<unknown>;\n /** Submit the form programmatically. */\n submit(e?: Event): Promise<void>;\n /** Whether the form is currently submitting. */\n readonly submitting: Readable<boolean>;\n /** Whether all fields in the form are valid. */\n readonly valid: Readable<boolean>;\n};\n\nexport const FORM_CONTEXT_KEY = createContext<FormFieldContext>('ore:form-context');\n\n/**\n * Create a `FormController` for coordinating form state across child field components.\n * Call `ctx.provide(FORM_CONTEXT_KEY, form)` to make it available to descendants.\n *\n * @example\n * ```ts\n * define('my-form', {\n * setup(_props, ctx) {\n * const form = createFormContext({ onSubmit: async (e) => { ... } });\n * ctx.provide(FORM_CONTEXT_KEY, form);\n * return html`<form @submit=${form.submit}><slot></slot></form>`;\n * }\n * });\n * ```\n */\nexport function createFormContext(\n options: {\n onReset?: () => void;\n onSubmit?: (e?: Event) => void | Promise<void>;\n } = {},\n): FormController {\n const fieldValiditySignals = signal<Array<Readable<boolean>>>([]);\n const submitting = signal(false);\n const dirty = signal(false);\n const error = signal<unknown>(null);\n\n // Note: [].every() is vacuously true, so valid is true when no fields are registered.\n // This is intentional — a form with no fields is considered valid (nothing to invalidate it).\n const valid = computed(() => fieldValiditySignals.value.every((s) => s.value));\n\n const submit = async (e?: Event): Promise<void> => {\n e?.preventDefault();\n\n if (submitting.value) return;\n\n submitting.value = true;\n error.value = null;\n\n try {\n await options.onSubmit?.(e);\n dirty.value = false;\n } catch (err) {\n error.value = err;\n } finally {\n submitting.value = false;\n }\n };\n\n const clearStatus = (): void => {\n dirty.value = false;\n error.value = null;\n options.onReset?.();\n };\n\n const markDirty = (): void => {\n dirty.value = true;\n };\n\n const registerField = (validity: Readable<boolean>): (() => void) => {\n fieldValiditySignals.value = [...fieldValiditySignals.value, validity];\n\n return () => {\n fieldValiditySignals.value = fieldValiditySignals.value.filter((s) => s !== validity);\n };\n };\n\n return { clearStatus, dirty, error, markDirty, registerField, submit, submitting, valid };\n}\n"],"mappings":"qGAwCA,IAAa,EAAmB,EAAgC,kBAAkB,EAiBlF,SAAgB,EACd,EAGI,CAAC,EACW,CAChB,IAAM,EAAuB,EAAiC,CAAC,CAAC,EAC1D,EAAa,EAAO,EAAK,EACzB,EAAQ,EAAO,EAAK,EACpB,EAAQ,EAAgB,IAAI,EA0ClC,MAAO,CAAE,gBAlBuB,CAC9B,EAAM,MAAQ,GACd,EAAM,MAAQ,KACd,EAAQ,UAAU,CACpB,EAcsB,QAAO,QAAO,cAZN,CAC5B,EAAM,MAAQ,EAChB,EAU+C,cARxB,IACrB,EAAqB,MAAQ,CAAC,GAAG,EAAqB,MAAO,CAAQ,MAExD,CACX,EAAqB,MAAQ,EAAqB,MAAM,OAAQ,GAAM,IAAM,CAAQ,CACtF,GAG4D,YApCxC,IAA6B,CACjD,MAAG,eAAe,EAEd,GAAW,MAGf,CADA,EAAW,MAAQ,GACnB,EAAM,MAAQ,KAEd,GAAI,CACF,MAAM,EAAQ,WAAW,CAAC,EAC1B,EAAM,MAAQ,EAChB,OAAS,EAAK,CACZ,EAAM,MAAQ,CAChB,QAAU,CACR,EAAW,MAAQ,EACrB,CATc,CAUhB,EAoBsE,aAAY,MAtCpE,MAAe,EAAqB,MAAM,MAAO,GAAM,EAAE,KAAK,CAsCM,CAAM,CAC1F"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./_dev.cjs"),t=require("./errors.cjs"),n=require("./runtime.cjs");require("@vielzeug/ripple");var r=new WeakMap,i=i=>{let a=i.el??n.getCurrentElement();if(!a.constructor.formAssociated)throw new t.OreApiError(t.ORE_ERRORS.defineFieldRequiresFormAssociated(a.localName));if(r.has(a))throw new t.OreApiError(`useField() was already called on <${a.localName}>. Call it only once per component.`);let o=a.attachInternals();r.set(a,o),n.onCleanup(()=>r.delete(a));let s=i.toFormValue??(e=>e==null?i.emptyStringForNull?``:null:e instanceof File||e instanceof FormData?e:String(e));n.effect(()=>{o.setFormValue(s(i.value.value))});let c=i.disabled;if(c)if(!(`states`in o))e.warn(`useField(): ElementInternals.states (CustomStateSet) is not available in this environment — disabled state tracking skipped.`);else{let e=o.states;n.effect(()=>{c.value?e.add(`disabled`):e.delete(`disabled`)})}return{checkValidity:()=>o.checkValidity(),internals:o,reportValidity:()=>o.reportValidity(),setCustomValidity:e=>e?o.setValidity({customError:!0},e):o.setValidity({}),setValidity:o.setValidity.bind(o)}};exports.useField=i;
|
|
2
|
+
//# sourceMappingURL=form-field.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-field.cjs","names":[],"sources":["../src/form-field.ts"],"sourcesContent":["import { type Readable, type Signal } from '@vielzeug/ripple';\n\nimport { warn } from './_dev';\nimport { OreApiError, ORE_ERRORS } from './errors';\nimport { effect, getCurrentElement, onCleanup } from './runtime';\n\n/** @internal */\nconst internalsRegistry = new WeakMap<HTMLElement, ElementInternals>();\n\nexport type FormFieldOptions<T = unknown> = {\n disabled?: Readable<boolean>;\n /**\n * The host element to attach `ElementInternals` to.\n * Defaults to the element currently being set up via `getCurrentElement()`.\n * Pass this explicitly when calling `useField` from a composable that is\n * not called directly during `setup()` (e.g. a helper factory function).\n */\n el?: HTMLElement;\n /**\n * When `true`, a `null` or `undefined` value is submitted as an empty string\n * (`''`) instead of `null`. This keeps the field's key present in `FormData`\n * even when the value is absent — useful when the server expects the field to\n * always be included.\n *\n * @default false\n */\n emptyStringForNull?: boolean;\n toFormValue?: (value: T) => File | FormData | string | null;\n value: Signal<T> | Readable<T>;\n};\n\nexport type FormFieldHandle = {\n checkValidity: () => boolean;\n readonly internals: ElementInternals;\n reportValidity: () => boolean;\n setCustomValidity: (message: string) => void;\n setValidity: ElementInternals['setValidity'];\n};\n\nexport const useField = <T = unknown>(options: FormFieldOptions<T>): FormFieldHandle => {\n const host = options.el ?? getCurrentElement();\n const ctor = host.constructor as typeof HTMLElement & { formAssociated?: boolean };\n\n if (!ctor.formAssociated) {\n throw new OreApiError(ORE_ERRORS.defineFieldRequiresFormAssociated(host.localName));\n }\n\n if (internalsRegistry.has(host)) {\n throw new OreApiError(`useField() was already called on <${host.localName}>. Call it only once per component.`);\n }\n\n const internals = host.attachInternals();\n\n internalsRegistry.set(host, internals);\n onCleanup(() => internalsRegistry.delete(host));\n\n const toFormValue =\n options.toFormValue ??\n ((v: T): File | FormData | string | null => {\n if (v == null) return options.emptyStringForNull ? '' : null;\n\n if (v instanceof File || v instanceof FormData) return v;\n\n return String(v);\n });\n\n effect(() => {\n internals.setFormValue(toFormValue(options.value.value));\n });\n\n const disabled = options.disabled;\n\n if (disabled) {\n if (!('states' in internals)) {\n warn(\n 'useField(): ElementInternals.states (CustomStateSet) is not available in this environment — disabled state tracking skipped.',\n );\n } else {\n const states = internals.states as CustomStateSet;\n\n effect(() => {\n if (disabled.value) states.add('disabled');\n else states.delete('disabled');\n });\n }\n }\n\n const checkValidity = () => internals.checkValidity();\n const reportValidity = () => internals.reportValidity();\n const setCustomValidity = (message: string) =>\n message ? internals.setValidity({ customError: true }, message) : internals.setValidity({});\n\n return {\n checkValidity,\n internals,\n reportValidity,\n setCustomValidity,\n setValidity: internals.setValidity.bind(internals),\n };\n};\n"],"mappings":"+GAOA,IAAM,EAAoB,IAAI,QAgCjB,EAAyB,GAAkD,CACtF,IAAM,EAAO,EAAQ,IAAM,EAAA,kBAAkB,EAG7C,GAAI,CAFS,EAAK,YAER,eACR,MAAM,IAAI,EAAA,YAAY,EAAA,WAAW,kCAAkC,EAAK,SAAS,CAAC,EAGpF,GAAI,EAAkB,IAAI,CAAI,EAC5B,MAAM,IAAI,EAAA,YAAY,qCAAqC,EAAK,UAAU,oCAAoC,EAGhH,IAAM,EAAY,EAAK,gBAAgB,EAEvC,EAAkB,IAAI,EAAM,CAAS,EACrC,EAAA,cAAgB,EAAkB,OAAO,CAAI,CAAC,EAE9C,IAAM,EACJ,EAAQ,cACN,GACI,GAAK,KAAa,EAAQ,mBAAqB,GAAK,KAEpD,aAAa,MAAQ,aAAa,SAAiB,EAEhD,OAAO,CAAC,GAGnB,EAAA,WAAa,CACX,EAAU,aAAa,EAAY,EAAQ,MAAM,KAAK,CAAC,CACzD,CAAC,EAED,IAAM,EAAW,EAAQ,SAEzB,GAAI,EACF,GAAI,EAAE,WAAY,GAChB,EAAA,KACE,8HACF,MACK,CACL,IAAM,EAAS,EAAU,OAEzB,EAAA,WAAa,CACP,EAAS,MAAO,EAAO,IAAI,UAAU,EACpC,EAAO,OAAO,UAAU,CAC/B,CAAC,CACH,CAQF,MAAO,CACL,kBAN0B,EAAU,cAAc,EAOlD,YACA,mBAP2B,EAAU,eAAe,EAQpD,kBAPyB,GACzB,EAAU,EAAU,YAAY,CAAE,YAAa,EAAK,EAAG,CAAO,EAAI,EAAU,YAAY,CAAC,CAAC,EAO1F,YAAa,EAAU,YAAY,KAAK,CAAS,CACnD,CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Readable, type Signal } from '@vielzeug/ripple';
|
|
2
|
+
export type FormFieldOptions<T = unknown> = {
|
|
3
|
+
disabled?: Readable<boolean>;
|
|
4
|
+
/**
|
|
5
|
+
* The host element to attach `ElementInternals` to.
|
|
6
|
+
* Defaults to the element currently being set up via `getCurrentElement()`.
|
|
7
|
+
* Pass this explicitly when calling `useField` from a composable that is
|
|
8
|
+
* not called directly during `setup()` (e.g. a helper factory function).
|
|
9
|
+
*/
|
|
10
|
+
el?: HTMLElement;
|
|
11
|
+
/**
|
|
12
|
+
* When `true`, a `null` or `undefined` value is submitted as an empty string
|
|
13
|
+
* (`''`) instead of `null`. This keeps the field's key present in `FormData`
|
|
14
|
+
* even when the value is absent — useful when the server expects the field to
|
|
15
|
+
* always be included.
|
|
16
|
+
*
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
emptyStringForNull?: boolean;
|
|
20
|
+
toFormValue?: (value: T) => File | FormData | string | null;
|
|
21
|
+
value: Signal<T> | Readable<T>;
|
|
22
|
+
};
|
|
23
|
+
export type FormFieldHandle = {
|
|
24
|
+
checkValidity: () => boolean;
|
|
25
|
+
readonly internals: ElementInternals;
|
|
26
|
+
reportValidity: () => boolean;
|
|
27
|
+
setCustomValidity: (message: string) => void;
|
|
28
|
+
setValidity: ElementInternals['setValidity'];
|
|
29
|
+
};
|
|
30
|
+
export declare const useField: <T = unknown>(options: FormFieldOptions<T>) => FormFieldHandle;
|
|
31
|
+
//# sourceMappingURL=form-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-field.d.ts","sourceRoot":"","sources":["../src/form-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAS9D,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC1C,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7B;;;;;OAKG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5D,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;CAC9C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,GAAG,OAAO,EAAE,SAAS,gBAAgB,CAAC,CAAC,CAAC,KAAG,eA4DpE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{warn as e}from"./_dev.js";import{ORE_ERRORS as t,OreApiError as n}from"./errors.js";import{effect as r,getCurrentElement as i,onCleanup as a}from"./runtime.js";import"@vielzeug/ripple";var o=new WeakMap,s=s=>{let c=s.el??i();if(!c.constructor.formAssociated)throw new n(t.defineFieldRequiresFormAssociated(c.localName));if(o.has(c))throw new n(`useField() was already called on <${c.localName}>. Call it only once per component.`);let l=c.attachInternals();o.set(c,l),a(()=>o.delete(c));let u=s.toFormValue??(e=>e==null?s.emptyStringForNull?``:null:e instanceof File||e instanceof FormData?e:String(e));r(()=>{l.setFormValue(u(s.value.value))});let d=s.disabled;if(d)if(!(`states`in l))e(`useField(): ElementInternals.states (CustomStateSet) is not available in this environment — disabled state tracking skipped.`);else{let e=l.states;r(()=>{d.value?e.add(`disabled`):e.delete(`disabled`)})}return{checkValidity:()=>l.checkValidity(),internals:l,reportValidity:()=>l.reportValidity(),setCustomValidity:e=>e?l.setValidity({customError:!0},e):l.setValidity({}),setValidity:l.setValidity.bind(l)}};export{s as useField};
|
|
2
|
+
//# sourceMappingURL=form-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-field.js","names":[],"sources":["../src/form-field.ts"],"sourcesContent":["import { type Readable, type Signal } from '@vielzeug/ripple';\n\nimport { warn } from './_dev';\nimport { OreApiError, ORE_ERRORS } from './errors';\nimport { effect, getCurrentElement, onCleanup } from './runtime';\n\n/** @internal */\nconst internalsRegistry = new WeakMap<HTMLElement, ElementInternals>();\n\nexport type FormFieldOptions<T = unknown> = {\n disabled?: Readable<boolean>;\n /**\n * The host element to attach `ElementInternals` to.\n * Defaults to the element currently being set up via `getCurrentElement()`.\n * Pass this explicitly when calling `useField` from a composable that is\n * not called directly during `setup()` (e.g. a helper factory function).\n */\n el?: HTMLElement;\n /**\n * When `true`, a `null` or `undefined` value is submitted as an empty string\n * (`''`) instead of `null`. This keeps the field's key present in `FormData`\n * even when the value is absent — useful when the server expects the field to\n * always be included.\n *\n * @default false\n */\n emptyStringForNull?: boolean;\n toFormValue?: (value: T) => File | FormData | string | null;\n value: Signal<T> | Readable<T>;\n};\n\nexport type FormFieldHandle = {\n checkValidity: () => boolean;\n readonly internals: ElementInternals;\n reportValidity: () => boolean;\n setCustomValidity: (message: string) => void;\n setValidity: ElementInternals['setValidity'];\n};\n\nexport const useField = <T = unknown>(options: FormFieldOptions<T>): FormFieldHandle => {\n const host = options.el ?? getCurrentElement();\n const ctor = host.constructor as typeof HTMLElement & { formAssociated?: boolean };\n\n if (!ctor.formAssociated) {\n throw new OreApiError(ORE_ERRORS.defineFieldRequiresFormAssociated(host.localName));\n }\n\n if (internalsRegistry.has(host)) {\n throw new OreApiError(`useField() was already called on <${host.localName}>. Call it only once per component.`);\n }\n\n const internals = host.attachInternals();\n\n internalsRegistry.set(host, internals);\n onCleanup(() => internalsRegistry.delete(host));\n\n const toFormValue =\n options.toFormValue ??\n ((v: T): File | FormData | string | null => {\n if (v == null) return options.emptyStringForNull ? '' : null;\n\n if (v instanceof File || v instanceof FormData) return v;\n\n return String(v);\n });\n\n effect(() => {\n internals.setFormValue(toFormValue(options.value.value));\n });\n\n const disabled = options.disabled;\n\n if (disabled) {\n if (!('states' in internals)) {\n warn(\n 'useField(): ElementInternals.states (CustomStateSet) is not available in this environment — disabled state tracking skipped.',\n );\n } else {\n const states = internals.states as CustomStateSet;\n\n effect(() => {\n if (disabled.value) states.add('disabled');\n else states.delete('disabled');\n });\n }\n }\n\n const checkValidity = () => internals.checkValidity();\n const reportValidity = () => internals.reportValidity();\n const setCustomValidity = (message: string) =>\n message ? internals.setValidity({ customError: true }, message) : internals.setValidity({});\n\n return {\n checkValidity,\n internals,\n reportValidity,\n setCustomValidity,\n setValidity: internals.setValidity.bind(internals),\n };\n};\n"],"mappings":"gMAOA,IAAM,EAAoB,IAAI,QAgCjB,EAAyB,GAAkD,CACtF,IAAM,EAAO,EAAQ,IAAM,EAAkB,EAG7C,GAAI,CAFS,EAAK,YAER,eACR,MAAM,IAAI,EAAY,EAAW,kCAAkC,EAAK,SAAS,CAAC,EAGpF,GAAI,EAAkB,IAAI,CAAI,EAC5B,MAAM,IAAI,EAAY,qCAAqC,EAAK,UAAU,oCAAoC,EAGhH,IAAM,EAAY,EAAK,gBAAgB,EAEvC,EAAkB,IAAI,EAAM,CAAS,EACrC,MAAgB,EAAkB,OAAO,CAAI,CAAC,EAE9C,IAAM,EACJ,EAAQ,cACN,GACI,GAAK,KAAa,EAAQ,mBAAqB,GAAK,KAEpD,aAAa,MAAQ,aAAa,SAAiB,EAEhD,OAAO,CAAC,GAGnB,MAAa,CACX,EAAU,aAAa,EAAY,EAAQ,MAAM,KAAK,CAAC,CACzD,CAAC,EAED,IAAM,EAAW,EAAQ,SAEzB,GAAI,EACF,GAAI,EAAE,WAAY,GAChB,EACE,8HACF,MACK,CACL,IAAM,EAAS,EAAU,OAEzB,MAAa,CACP,EAAS,MAAO,EAAO,IAAI,UAAU,EACpC,EAAO,OAAO,UAAU,CAC/B,CAAC,CACH,CAQF,MAAO,CACL,kBAN0B,EAAU,cAAc,EAOlD,YACA,mBAP2B,EAAU,eAAe,EAQpD,kBAPyB,GACzB,EAAU,EAAU,YAAY,CAAE,YAAa,EAAK,EAAG,CAAO,EAAI,EAAU,YAAY,CAAC,CAAC,EAO1F,YAAa,EAAU,YAAY,KAAK,CAAS,CACnD,CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./utils/dom.cjs"),t=require("./runtime.cjs"),n=require("./utils/aria.cjs");let r=require("@vielzeug/ripple");var i=n=>(r,i)=>{let o=i?.target??n,c=[];if(r.attr)for(let[e,t]of Object.entries(r.attr)){let n=s(o,a(e),t);n&&c.push(n)}if(r.class&&c.push(u(o,r.class)),r.style)for(let[e,t]of Object.entries(r.style)){let n=l(o,e,t);n&&c.push(n)}if(r.on){let{target:t,...n}=i??{};for(let t of Object.keys(r.on)){let i=r.on[t];i&&c.push(e.listen(o,t,i,n))}}let d=()=>{for(let e of c)e()};return t.tryRegisterCleanup(d),d},a=n.normalizeHostAttrKey,o=(e,n)=>{if(typeof e==`function`)return t.effect(()=>n(e()));if((0,r.isReactive)(e))return t.effect(()=>n(e.value));n(e)};function s(t,n,r){return o(r,r=>e.setAttr(t,n,r))}var c=/[;{}]/g;function l(t,n,r){let i=(n.startsWith(`--`)?n:e.toKebab(n)).replace(c,``);if(!i)return;let a=!1;return o(r,e=>{e!=null&&e!==``?(a=!0,t.style.setProperty(i,String(e).replace(c,``))):a&&t.style.removeProperty(i)})}function u(e,n){let i=typeof n==`function`?n:()=>{let e={};for(let[t,i]of Object.entries(n))e[t]=typeof i==`function`?i():(0,r.isReactive)(i)?i.value:!!i;return e},a=new Set;return t.effect(()=>{let t=new Set;for(let[n,r]of Object.entries(i()))r&&(t.add(n),a.has(n)||e.classList.add(n));for(let n of a)t.has(n)||e.classList.remove(n);a=t})}exports.createBind=i;
|
|
2
|
+
//# sourceMappingURL=host-bind.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-bind.cjs","names":[],"sources":["../src/host-bind.ts"],"sourcesContent":["/**\n * Host element binding API — reactive attr, class, style, and event bindings\n * applied directly to the component's host element or any target element.\n */\n\nimport { isReactive, type Readable } from '@vielzeug/ripple';\n\nimport { effect, tryRegisterCleanup } from './runtime';\nimport { normalizeHostAttrKey } from './utils/aria';\nimport { listen, setAttr, toKebab } from './utils/dom';\n\n/**\n * Describes a reactive or static host binding value.\n */\nexport type HostBindingValue =\n | (() => string | number | boolean | null | undefined)\n | Readable<string | number | boolean | null | undefined>\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for host attribute bindings.\n */\nexport type ReflectConfig = Record<string, HostBindingValue>;\n\ntype HostClassBindingValue = Readable<boolean> | (() => boolean) | boolean;\n// Bivariant callback allows consumers to use narrower event types.\ntype HostEventListener = { bivarianceHack(event: Event): void }['bivarianceHack'];\n\nexport type HostBindConfig = {\n attr?: ReflectConfig;\n class?: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>;\n on?: Record<string, HostEventListener | undefined>;\n style?: Record<string, HostBindingValue>;\n};\n\nexport type BindOptions = AddEventListenerOptions & {\n /**\n * Target element to bind to. Defaults to the host element when called\n * via `ctx.bind()`. Pass an explicit element to bind to any other element\n * (e.g. a slotted trigger or an internally-referenced child element).\n * When a target is provided, cleanup is always auto-registered with the\n * component scope if one is active.\n */\n target?: Element;\n};\n\nexport type HostBindFn = (config: HostBindConfig, options?: BindOptions) => () => void;\n\nexport const createBind = (host: HTMLElement): HostBindFn => {\n const bind: HostBindFn = (config: HostBindConfig, options?: BindOptions): (() => void) => {\n const el = (options?.target as HTMLElement | undefined) ?? host;\n const disposers: Array<() => void> = [];\n\n if (config.attr) {\n for (const [key, value] of Object.entries(config.attr)) {\n const name = toHostAttr(key);\n const dispose = applyAttribute(el, name, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n if (config.class) {\n disposers.push(applyClassMap(el, config.class));\n }\n\n if (config.style) {\n for (const [key, value] of Object.entries(config.style)) {\n const dispose = applyStyle(el, key, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n if (config.on) {\n const { target: _t, ...listenerOptions } = options ?? {};\n\n for (const event of Object.keys(config.on) as Array<keyof typeof config.on>) {\n const listener = config.on[event];\n\n if (!listener) continue;\n\n disposers.push(listen(el, event as string, listener as EventListener, listenerOptions));\n }\n }\n\n const cleanup = (): void => {\n for (const dispose of disposers) dispose();\n };\n\n tryRegisterCleanup(cleanup);\n\n return cleanup;\n };\n\n return bind;\n};\n\nconst toHostAttr = normalizeHostAttrKey;\n\nconst applyReactiveBinding = (\n value: HostBindingValue,\n updater: (next: string | number | boolean | null | undefined) => void,\n): (() => void) | void => {\n if (typeof value === 'function') {\n return effect(() => updater(value()));\n }\n\n if (isReactive(value)) {\n return effect(() => updater(value.value));\n }\n\n updater(value);\n};\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n return applyReactiveBinding(value, (next) => setAttr(host, name, next));\n}\n\nconst UNSAFE_CSS_CHARS = /[;{}]/g;\n\nfunction applyStyle(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n const cssName = (name.startsWith('--') ? name : toKebab(name)).replace(UNSAFE_CSS_CHARS, '');\n\n if (!cssName) return;\n\n let owned = false;\n const setStyle = (v: string | number | boolean | null | undefined): void => {\n if (v != null && v !== '') {\n owned = true;\n host.style.setProperty(cssName, String(v).replace(UNSAFE_CSS_CHARS, ''));\n } else if (owned) host.style.removeProperty(cssName);\n };\n\n return applyReactiveBinding(value, setStyle);\n}\n\nfunction applyClassMap(\n host: HTMLElement,\n value: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>,\n): () => void {\n const getMap =\n typeof value === 'function'\n ? value\n : (): Record<string, boolean> => {\n const result: Record<string, boolean> = {};\n\n for (const [cls, entry] of Object.entries(value)) {\n result[cls] = typeof entry === 'function' ? entry() : isReactive(entry) ? entry.value : Boolean(entry);\n }\n\n return result;\n };\n\n let prev = new Set<string>();\n\n const sub = effect(() => {\n const next = new Set<string>();\n\n for (const [cls, active] of Object.entries(getMap())) {\n if (!active) continue;\n\n next.add(cls);\n\n if (!prev.has(cls)) host.classList.add(cls);\n }\n for (const cls of prev) {\n if (!next.has(cls)) host.classList.remove(cls);\n }\n prev = next;\n });\n\n return sub;\n}\n"],"mappings":"8HAoDA,IAAa,EAAc,IACC,EAAwB,IAAwC,CACxF,IAAM,EAAM,GAAS,QAAsC,EACrD,EAA+B,CAAC,EAEtC,GAAI,EAAO,KACT,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAO,IAAI,EAAG,CAEtD,IAAM,EAAU,EAAe,EADlB,EAAW,CACW,EAAM,CAAK,EAE1C,GAAS,EAAU,KAAK,CAAO,CACrC,CAOF,GAJI,EAAO,OACT,EAAU,KAAK,EAAc,EAAI,EAAO,KAAK,CAAC,EAG5C,EAAO,MACT,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAO,KAAK,EAAG,CACvD,IAAM,EAAU,EAAW,EAAI,EAAK,CAAK,EAErC,GAAS,EAAU,KAAK,CAAO,CACrC,CAGF,GAAI,EAAO,GAAI,CACb,GAAM,CAAE,OAAQ,EAAI,GAAG,GAAoB,GAAW,CAAC,EAEvD,IAAK,IAAM,KAAS,OAAO,KAAK,EAAO,EAAE,EAAoC,CAC3E,IAAM,EAAW,EAAO,GAAG,GAEtB,GAEL,EAAU,KAAK,EAAA,OAAO,EAAI,EAAiB,EAA2B,CAAe,CAAC,CACxF,CACF,CAEA,IAAM,MAAsB,CAC1B,IAAK,IAAM,KAAW,EAAW,EAAQ,CAC3C,EAIA,OAFA,EAAA,mBAAmB,CAAO,EAEnB,CACT,EAKI,EAAa,EAAA,qBAEb,GACJ,EACA,IACwB,CACxB,GAAI,OAAO,GAAU,WACnB,OAAO,EAAA,WAAa,EAAQ,EAAM,CAAC,CAAC,EAGtC,IAAA,EAAA,EAAA,WAAA,CAAe,CAAK,EAClB,OAAO,EAAA,WAAa,EAAQ,EAAM,KAAK,CAAC,EAG1C,EAAQ,CAAK,CACf,EAEA,SAAS,EAAe,EAAmB,EAAc,EAA8C,CACrG,OAAO,EAAqB,EAAQ,GAAS,EAAA,QAAQ,EAAM,EAAM,CAAI,CAAC,CACxE,CAEA,IAAM,EAAmB,SAEzB,SAAS,EAAW,EAAmB,EAAc,EAA8C,CACjG,IAAM,GAAW,EAAK,WAAW,IAAI,EAAI,EAAO,EAAA,QAAQ,CAAI,EAAA,CAAG,QAAQ,EAAkB,EAAE,EAE3F,GAAI,CAAC,EAAS,OAEd,IAAI,EAAQ,GAQZ,OAAO,EAAqB,EAPV,GAA0D,CACtE,GAAK,MAAQ,IAAM,IACrB,EAAQ,GACR,EAAK,MAAM,YAAY,EAAS,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAkB,EAAE,CAAC,GAC9D,GAAO,EAAK,MAAM,eAAe,CAAO,CACrD,CAE2C,CAC7C,CAEA,SAAS,EACP,EACA,EACY,CACZ,IAAM,EACJ,OAAO,GAAU,WACb,MAC+B,CAC7B,IAAM,EAAkC,CAAC,EAEzC,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAK,EAC7C,EAAO,GAAO,OAAO,GAAU,WAAa,EAAM,GAAA,EAAA,EAAA,WAAA,CAAe,CAAK,EAAI,EAAM,MAAQ,EAAQ,EAGlG,OAAO,CACT,EAEF,EAAO,IAAI,IAkBf,OAhBY,EAAA,WAAa,CACvB,IAAM,EAAO,IAAI,IAEjB,IAAK,GAAM,CAAC,EAAK,KAAW,OAAO,QAAQ,EAAO,CAAC,EAC5C,IAEL,EAAK,IAAI,CAAG,EAEP,EAAK,IAAI,CAAG,GAAG,EAAK,UAAU,IAAI,CAAG,GAE5C,IAAK,IAAM,KAAO,EACX,EAAK,IAAI,CAAG,GAAG,EAAK,UAAU,OAAO,CAAG,EAE/C,EAAO,CACT,CAEO,CACT"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host element binding API — reactive attr, class, style, and event bindings
|
|
3
|
+
* applied directly to the component's host element or any target element.
|
|
4
|
+
*/
|
|
5
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
6
|
+
/**
|
|
7
|
+
* Describes a reactive or static host binding value.
|
|
8
|
+
*/
|
|
9
|
+
export type HostBindingValue = (() => string | number | boolean | null | undefined) | Readable<string | number | boolean | null | undefined> | string | number | boolean | null | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for host attribute bindings.
|
|
12
|
+
*/
|
|
13
|
+
export type ReflectConfig = Record<string, HostBindingValue>;
|
|
14
|
+
type HostClassBindingValue = Readable<boolean> | (() => boolean) | boolean;
|
|
15
|
+
type HostEventListener = {
|
|
16
|
+
bivarianceHack(event: Event): void;
|
|
17
|
+
}['bivarianceHack'];
|
|
18
|
+
export type HostBindConfig = {
|
|
19
|
+
attr?: ReflectConfig;
|
|
20
|
+
class?: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>;
|
|
21
|
+
on?: Record<string, HostEventListener | undefined>;
|
|
22
|
+
style?: Record<string, HostBindingValue>;
|
|
23
|
+
};
|
|
24
|
+
export type BindOptions = AddEventListenerOptions & {
|
|
25
|
+
/**
|
|
26
|
+
* Target element to bind to. Defaults to the host element when called
|
|
27
|
+
* via `ctx.bind()`. Pass an explicit element to bind to any other element
|
|
28
|
+
* (e.g. a slotted trigger or an internally-referenced child element).
|
|
29
|
+
* When a target is provided, cleanup is always auto-registered with the
|
|
30
|
+
* component scope if one is active.
|
|
31
|
+
*/
|
|
32
|
+
target?: Element;
|
|
33
|
+
};
|
|
34
|
+
export type HostBindFn = (config: HostBindConfig, options?: BindOptions) => () => void;
|
|
35
|
+
export declare const createBind: (host: HTMLElement) => HostBindFn;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=host-bind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-bind.d.ts","sourceRoot":"","sources":["../src/host-bind.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM7D;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GACpD,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GACtD,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAE7D,KAAK,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC;AAE3E,KAAK,iBAAiB,GAAG;IAAE,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CAAC,gBAAgB,CAAC,CAAC;AAElF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAChF,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,uBAAuB,GAAG;IAClD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;AAEvF,eAAO,MAAM,UAAU,GAAI,MAAM,WAAW,KAAG,UAgD9C,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{listen as e,setAttr as t,toKebab as n}from"./utils/dom.js";import{effect as r,tryRegisterCleanup as i}from"./runtime.js";import{normalizeHostAttrKey as a}from"./utils/aria.js";import{isReactive as o}from"@vielzeug/ripple";var s=t=>(n,r)=>{let a=r?.target??t,o=[];if(n.attr)for(let[e,t]of Object.entries(n.attr)){let n=u(a,c(e),t);n&&o.push(n)}if(n.class&&o.push(p(a,n.class)),n.style)for(let[e,t]of Object.entries(n.style)){let n=f(a,e,t);n&&o.push(n)}if(n.on){let{target:t,...i}=r??{};for(let t of Object.keys(n.on)){let r=n.on[t];r&&o.push(e(a,t,r,i))}}let s=()=>{for(let e of o)e()};return i(s),s},c=a,l=(e,t)=>{if(typeof e==`function`)return r(()=>t(e()));if(o(e))return r(()=>t(e.value));t(e)};function u(e,n,r){return l(r,r=>t(e,n,r))}var d=/[;{}]/g;function f(e,t,r){let i=(t.startsWith(`--`)?t:n(t)).replace(d,``);if(!i)return;let a=!1;return l(r,t=>{t!=null&&t!==``?(a=!0,e.style.setProperty(i,String(t).replace(d,``))):a&&e.style.removeProperty(i)})}function p(e,t){let n=typeof t==`function`?t:()=>{let e={};for(let[n,r]of Object.entries(t))e[n]=typeof r==`function`?r():o(r)?r.value:!!r;return e},i=new Set;return r(()=>{let t=new Set;for(let[r,a]of Object.entries(n()))a&&(t.add(r),i.has(r)||e.classList.add(r));for(let n of i)t.has(n)||e.classList.remove(n);i=t})}export{s as createBind};
|
|
2
|
+
//# sourceMappingURL=host-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-bind.js","names":[],"sources":["../src/host-bind.ts"],"sourcesContent":["/**\n * Host element binding API — reactive attr, class, style, and event bindings\n * applied directly to the component's host element or any target element.\n */\n\nimport { isReactive, type Readable } from '@vielzeug/ripple';\n\nimport { effect, tryRegisterCleanup } from './runtime';\nimport { normalizeHostAttrKey } from './utils/aria';\nimport { listen, setAttr, toKebab } from './utils/dom';\n\n/**\n * Describes a reactive or static host binding value.\n */\nexport type HostBindingValue =\n | (() => string | number | boolean | null | undefined)\n | Readable<string | number | boolean | null | undefined>\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for host attribute bindings.\n */\nexport type ReflectConfig = Record<string, HostBindingValue>;\n\ntype HostClassBindingValue = Readable<boolean> | (() => boolean) | boolean;\n// Bivariant callback allows consumers to use narrower event types.\ntype HostEventListener = { bivarianceHack(event: Event): void }['bivarianceHack'];\n\nexport type HostBindConfig = {\n attr?: ReflectConfig;\n class?: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>;\n on?: Record<string, HostEventListener | undefined>;\n style?: Record<string, HostBindingValue>;\n};\n\nexport type BindOptions = AddEventListenerOptions & {\n /**\n * Target element to bind to. Defaults to the host element when called\n * via `ctx.bind()`. Pass an explicit element to bind to any other element\n * (e.g. a slotted trigger or an internally-referenced child element).\n * When a target is provided, cleanup is always auto-registered with the\n * component scope if one is active.\n */\n target?: Element;\n};\n\nexport type HostBindFn = (config: HostBindConfig, options?: BindOptions) => () => void;\n\nexport const createBind = (host: HTMLElement): HostBindFn => {\n const bind: HostBindFn = (config: HostBindConfig, options?: BindOptions): (() => void) => {\n const el = (options?.target as HTMLElement | undefined) ?? host;\n const disposers: Array<() => void> = [];\n\n if (config.attr) {\n for (const [key, value] of Object.entries(config.attr)) {\n const name = toHostAttr(key);\n const dispose = applyAttribute(el, name, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n if (config.class) {\n disposers.push(applyClassMap(el, config.class));\n }\n\n if (config.style) {\n for (const [key, value] of Object.entries(config.style)) {\n const dispose = applyStyle(el, key, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n if (config.on) {\n const { target: _t, ...listenerOptions } = options ?? {};\n\n for (const event of Object.keys(config.on) as Array<keyof typeof config.on>) {\n const listener = config.on[event];\n\n if (!listener) continue;\n\n disposers.push(listen(el, event as string, listener as EventListener, listenerOptions));\n }\n }\n\n const cleanup = (): void => {\n for (const dispose of disposers) dispose();\n };\n\n tryRegisterCleanup(cleanup);\n\n return cleanup;\n };\n\n return bind;\n};\n\nconst toHostAttr = normalizeHostAttrKey;\n\nconst applyReactiveBinding = (\n value: HostBindingValue,\n updater: (next: string | number | boolean | null | undefined) => void,\n): (() => void) | void => {\n if (typeof value === 'function') {\n return effect(() => updater(value()));\n }\n\n if (isReactive(value)) {\n return effect(() => updater(value.value));\n }\n\n updater(value);\n};\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n return applyReactiveBinding(value, (next) => setAttr(host, name, next));\n}\n\nconst UNSAFE_CSS_CHARS = /[;{}]/g;\n\nfunction applyStyle(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n const cssName = (name.startsWith('--') ? name : toKebab(name)).replace(UNSAFE_CSS_CHARS, '');\n\n if (!cssName) return;\n\n let owned = false;\n const setStyle = (v: string | number | boolean | null | undefined): void => {\n if (v != null && v !== '') {\n owned = true;\n host.style.setProperty(cssName, String(v).replace(UNSAFE_CSS_CHARS, ''));\n } else if (owned) host.style.removeProperty(cssName);\n };\n\n return applyReactiveBinding(value, setStyle);\n}\n\nfunction applyClassMap(\n host: HTMLElement,\n value: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>,\n): () => void {\n const getMap =\n typeof value === 'function'\n ? value\n : (): Record<string, boolean> => {\n const result: Record<string, boolean> = {};\n\n for (const [cls, entry] of Object.entries(value)) {\n result[cls] = typeof entry === 'function' ? entry() : isReactive(entry) ? entry.value : Boolean(entry);\n }\n\n return result;\n };\n\n let prev = new Set<string>();\n\n const sub = effect(() => {\n const next = new Set<string>();\n\n for (const [cls, active] of Object.entries(getMap())) {\n if (!active) continue;\n\n next.add(cls);\n\n if (!prev.has(cls)) host.classList.add(cls);\n }\n for (const cls of prev) {\n if (!next.has(cls)) host.classList.remove(cls);\n }\n prev = next;\n });\n\n return sub;\n}\n"],"mappings":"qOAoDA,IAAa,EAAc,IACC,EAAwB,IAAwC,CACxF,IAAM,EAAM,GAAS,QAAsC,EACrD,EAA+B,CAAC,EAEtC,GAAI,EAAO,KACT,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAO,IAAI,EAAG,CAEtD,IAAM,EAAU,EAAe,EADlB,EAAW,CACW,EAAM,CAAK,EAE1C,GAAS,EAAU,KAAK,CAAO,CACrC,CAOF,GAJI,EAAO,OACT,EAAU,KAAK,EAAc,EAAI,EAAO,KAAK,CAAC,EAG5C,EAAO,MACT,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAO,KAAK,EAAG,CACvD,IAAM,EAAU,EAAW,EAAI,EAAK,CAAK,EAErC,GAAS,EAAU,KAAK,CAAO,CACrC,CAGF,GAAI,EAAO,GAAI,CACb,GAAM,CAAE,OAAQ,EAAI,GAAG,GAAoB,GAAW,CAAC,EAEvD,IAAK,IAAM,KAAS,OAAO,KAAK,EAAO,EAAE,EAAoC,CAC3E,IAAM,EAAW,EAAO,GAAG,GAEtB,GAEL,EAAU,KAAK,EAAO,EAAI,EAAiB,EAA2B,CAAe,CAAC,CACxF,CACF,CAEA,IAAM,MAAsB,CAC1B,IAAK,IAAM,KAAW,EAAW,EAAQ,CAC3C,EAIA,OAFA,EAAmB,CAAO,EAEnB,CACT,EAKI,EAAa,EAEb,GACJ,EACA,IACwB,CACxB,GAAI,OAAO,GAAU,WACnB,OAAO,MAAa,EAAQ,EAAM,CAAC,CAAC,EAGtC,GAAI,EAAW,CAAK,EAClB,OAAO,MAAa,EAAQ,EAAM,KAAK,CAAC,EAG1C,EAAQ,CAAK,CACf,EAEA,SAAS,EAAe,EAAmB,EAAc,EAA8C,CACrG,OAAO,EAAqB,EAAQ,GAAS,EAAQ,EAAM,EAAM,CAAI,CAAC,CACxE,CAEA,IAAM,EAAmB,SAEzB,SAAS,EAAW,EAAmB,EAAc,EAA8C,CACjG,IAAM,GAAW,EAAK,WAAW,IAAI,EAAI,EAAO,EAAQ,CAAI,EAAA,CAAG,QAAQ,EAAkB,EAAE,EAE3F,GAAI,CAAC,EAAS,OAEd,IAAI,EAAQ,GAQZ,OAAO,EAAqB,EAPV,GAA0D,CACtE,GAAK,MAAQ,IAAM,IACrB,EAAQ,GACR,EAAK,MAAM,YAAY,EAAS,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAkB,EAAE,CAAC,GAC9D,GAAO,EAAK,MAAM,eAAe,CAAO,CACrD,CAE2C,CAC7C,CAEA,SAAS,EACP,EACA,EACY,CACZ,IAAM,EACJ,OAAO,GAAU,WACb,MAC+B,CAC7B,IAAM,EAAkC,CAAC,EAEzC,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAK,EAC7C,EAAO,GAAO,OAAO,GAAU,WAAa,EAAM,EAAI,EAAW,CAAK,EAAI,EAAM,MAAQ,EAAQ,EAGlG,OAAO,CACT,EAEF,EAAO,IAAI,IAkBf,OAhBY,MAAa,CACvB,IAAM,EAAO,IAAI,IAEjB,IAAK,GAAM,CAAC,EAAK,KAAW,OAAO,QAAQ,EAAO,CAAC,EAC5C,IAEL,EAAK,IAAI,CAAG,EAEP,EAAK,IAAI,CAAG,GAAG,EAAK,UAAU,IAAI,CAAG,GAE5C,IAAK,IAAM,KAAO,EACX,EAAK,IAAI,CAAG,GAAG,EAAK,UAAU,OAAO,CAAG,EAE/C,EAAO,CACT,CAEO,CACT"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./types/bindings.cjs"),n=require("./context.cjs"),r=require("./props.cjs"),i=require("./utils/css.cjs"),a=require("./define.cjs"),o=require("./template/instantiator.cjs");require("./template.cjs");const s=require("./form-field.cjs"),c=require("./form-context.cjs"),l=require("./utils/id.cjs");exports.FORM_CONTEXT_KEY=c.FORM_CONTEXT_KEY,exports.OreApiError=e.OreApiError,exports.OreError=e.OreError,exports.OreLifecycleError=e.OreLifecycleError,exports.OreTimeoutError=e.OreTimeoutError,exports.createContext=n.createContext,exports.createFormContext=c.createFormContext,exports.createId=l.createId,exports.createStableId=l.createStableId,exports.css=i.css,exports.define=a.define,exports.html=o.html,exports.inject=n.inject,exports.injectStrict=n.injectStrict,exports.prop=r.prop,exports.ref=t.ref,exports.resetIdCounter=l.resetIdCounter,exports.useField=s.useField;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { OreApiError, OreError, type OreErrorPhase, OreLifecycleError, OreTimeoutError } from './errors';
|
|
2
|
+
export { define, prop } from './define';
|
|
3
|
+
export type { ComponentDefinition, SetupContextBag } from './component-types';
|
|
4
|
+
export type { InferProps, PropDef, PropInputDefs, PropsDef } from './props';
|
|
5
|
+
export { createContext, inject, injectStrict, type InjectionKey } from './context';
|
|
6
|
+
export { type ComponentSlots } from './slots';
|
|
7
|
+
export { type BindOptions, type HostBindConfig, type HostBindFn, type HostBindingValue, type ReflectConfig, } from './host-bind';
|
|
8
|
+
export { html } from './template';
|
|
9
|
+
export { css, type CSSResult } from './utils/css';
|
|
10
|
+
export { useField } from './form-field';
|
|
11
|
+
export { createFormContext, FORM_CONTEXT_KEY, type FormController, type FormFieldContext } from './form-context';
|
|
12
|
+
export type { AriaConfig } from './aria';
|
|
13
|
+
export { createId, createStableId, resetIdCounter } from './utils/id';
|
|
14
|
+
export { ref, type DirectiveResult, type HTMLResult, type Ref, type RefCallback } from './types/bindings';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEzG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9E,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAEnF,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjH,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAAE,GAAG,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{OreApiError as e,OreError as t,OreLifecycleError as n,OreTimeoutError as r}from"./errors.js";import{ref as i}from"./types/bindings.js";import{createContext as a,inject as o,injectStrict as s}from"./context.js";import{prop as c}from"./props.js";import{css as l}from"./utils/css.js";import{define as u}from"./define.js";import{html as d}from"./template/instantiator.js";import"./template.js";import{useField as f}from"./form-field.js";import{FORM_CONTEXT_KEY as p,createFormContext as m}from"./form-context.js";import{createId as h,createStableId as g,resetIdCounter as _}from"./utils/id.js";export{p as FORM_CONTEXT_KEY,e as OreApiError,t as OreError,n as OreLifecycleError,r as OreTimeoutError,a as createContext,m as createFormContext,h as createId,g as createStableId,l as css,u as define,d as html,o as inject,s as injectStrict,c as prop,i as ref,_ as resetIdCounter,f as useField};
|
|
@@ -0,0 +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,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intersection-observe.cjs","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `Reactive` 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): Readable<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":"kCAQA,IAAa,GACX,EACA,IAC+C,CAC/C,IAAM,GAAA,EAAA,EAAA,OAAA,CAAiD,IAAI,EACrD,EAAK,IAAI,sBAAsB,CAAC,KAAe,CAC/C,IAAW,EAAM,MAAQ,EAC/B,EAAG,CAAO,EAKV,OAHA,EAAG,QAAQ,CAAE,GACb,EAAA,EAAA,UAAA,KAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
/**
|
|
3
|
+
* Observes an element's intersection with the viewport (or a given root) via
|
|
4
|
+
* `IntersectionObserver`. Returns a `Reactive` that updates whenever the
|
|
5
|
+
* intersection ratio changes.
|
|
6
|
+
* Must be called inside a `mount()` callback.
|
|
7
|
+
*/
|
|
8
|
+
export declare const intersectionObserver: (el: Element, options?: IntersectionObserverInit) => Readable<IntersectionObserverEntry | null>;
|
|
9
|
+
//# sourceMappingURL=intersection-observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intersection-observe.d.ts","sourceRoot":"","sources":["../../src/observers/intersection-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,IAAI,OAAO,EACX,UAAU,wBAAwB,KACjC,QAAQ,CAAC,yBAAyB,GAAG,IAAI,CAU3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intersection-observe.js","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `Reactive` 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): Readable<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":"yDAQA,IAAa,GACX,EACA,IAC+C,CAC/C,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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("@vielzeug/ripple");var t=t=>{let n=window.matchMedia(t),r=(0,e.signal)(n.matches),i=e=>{r.value=e.matches};return n.addEventListener(`change`,i),(0,e.onCleanup)(()=>n.removeEventListener(`change`,i)),r};exports.mediaObserver=t;
|
|
2
|
+
//# sourceMappingURL=media-observe.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-observe.cjs","names":[],"sources":["../../src/observers/media-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `Reactive`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside a `mount()` callback.\n */\nexport const mediaObserver = (query: string): Readable<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"kCAOA,IAAa,EAAiB,GAAqC,CACjE,IAAM,EAAM,OAAO,WAAW,CAAK,EAC7B,GAAA,EAAA,EAAA,OAAA,CAAiB,EAAI,OAAO,EAC5B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,OACpB,EAKA,OAHA,EAAI,iBAAiB,SAAU,CAAO,GACtC,EAAA,EAAA,UAAA,KAAgB,EAAI,oBAAoB,SAAU,CAAO,CAAC,EAEnD,CACT"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
/**
|
|
3
|
+
* Observes a CSS media query via `window.matchMedia`. Returns a `Reactive`
|
|
4
|
+
* that is `true` when the query matches and `false` when it does not.
|
|
5
|
+
* Must be called inside a `mount()` callback.
|
|
6
|
+
*/
|
|
7
|
+
export declare const mediaObserver: (query: string) => Readable<boolean>;
|
|
8
|
+
//# sourceMappingURL=media-observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-observe.d.ts","sourceRoot":"","sources":["../../src/observers/media-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,QAAQ,CAAC,OAAO,CAW7D,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onCleanup as e,signal as t}from"@vielzeug/ripple";var n=n=>{let r=window.matchMedia(n),i=t(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e(()=>r.removeEventListener(`change`,a)),i};export{n as mediaObserver};
|
|
2
|
+
//# sourceMappingURL=media-observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-observe.js","names":[],"sources":["../../src/observers/media-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `Reactive`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside a `mount()` callback.\n */\nexport const mediaObserver = (query: string): Readable<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"yDAOA,IAAa,EAAiB,GAAqC,CACjE,IAAM,EAAM,OAAO,WAAW,CAAK,EAC7B,EAAU,EAAO,EAAI,OAAO,EAC5B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,OACpB,EAKA,OAHA,EAAI,iBAAiB,SAAU,CAAO,EACtC,MAAgB,EAAI,oBAAoB,SAAU,CAAO,CAAC,EAEnD,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("@vielzeug/ripple");var t=(t,n={attributes:!0,characterData:!0,childList:!0,subtree:!0})=>{let r=(0,e.signal)({entries:[],latest:null}),i=new MutationObserver(e=>{r.value={entries:e,latest:e.length>0?e[e.length-1]:null}});return i.observe(t,n),(0,e.onCleanup)(()=>i.disconnect()),r};exports.mutationObserver=t;
|
|
2
|
+
//# sourceMappingURL=mutation-observe.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-observe.cjs","names":[],"sources":["../../src/observers/mutation-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\nexport type MutationObserverValue = {\n entries: MutationRecord[];\n latest: MutationRecord | null;\n};\n\n/**\n * Observes DOM mutations on an element and exposes the latest mutation batch.\n */\nexport const mutationObserver = (\n el: Element,\n options: MutationObserverInit = {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n },\n): Readable<MutationObserverValue> => {\n const value = signal<MutationObserverValue>({ entries: [], latest: null });\n const observer = new MutationObserver((entries) => {\n value.value = {\n entries,\n latest: entries.length > 0 ? entries[entries.length - 1] : null,\n };\n });\n\n observer.observe(el, options);\n onCleanup(() => observer.disconnect());\n\n return value;\n};\n"],"mappings":"kCAUA,IAAa,GACX,EACA,EAAgC,CAC9B,WAAY,GACZ,cAAe,GACf,UAAW,GACX,QAAS,EACX,IACoC,CACpC,IAAM,GAAA,EAAA,EAAA,OAAA,CAAsC,CAAE,QAAS,CAAC,EAAG,OAAQ,IAAK,CAAC,EACnE,EAAW,IAAI,iBAAkB,GAAY,CACjD,EAAM,MAAQ,CACZ,UACA,OAAQ,EAAQ,OAAS,EAAI,EAAQ,EAAQ,OAAS,GAAK,IAC7D,CACF,CAAC,EAKD,OAHA,EAAS,QAAQ,EAAI,CAAO,GAC5B,EAAA,EAAA,UAAA,KAAgB,EAAS,WAAW,CAAC,EAE9B,CACT"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
export type MutationObserverValue = {
|
|
3
|
+
entries: MutationRecord[];
|
|
4
|
+
latest: MutationRecord | null;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Observes DOM mutations on an element and exposes the latest mutation batch.
|
|
8
|
+
*/
|
|
9
|
+
export declare const mutationObserver: (el: Element, options?: MutationObserverInit) => Readable<MutationObserverValue>;
|
|
10
|
+
//# sourceMappingURL=mutation-observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-observe.d.ts","sourceRoot":"","sources":["../../src/observers/mutation-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAEpE,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,IAAI,OAAO,EACX,UAAS,oBAKR,KACA,QAAQ,CAAC,qBAAqB,CAahC,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onCleanup as e,signal as t}from"@vielzeug/ripple";var n=(n,r={attributes:!0,characterData:!0,childList:!0,subtree:!0})=>{let i=t({entries:[],latest:null}),a=new MutationObserver(e=>{i.value={entries:e,latest:e.length>0?e[e.length-1]:null}});return a.observe(n,r),e(()=>a.disconnect()),i};export{n as mutationObserver};
|
|
2
|
+
//# sourceMappingURL=mutation-observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-observe.js","names":[],"sources":["../../src/observers/mutation-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\nexport type MutationObserverValue = {\n entries: MutationRecord[];\n latest: MutationRecord | null;\n};\n\n/**\n * Observes DOM mutations on an element and exposes the latest mutation batch.\n */\nexport const mutationObserver = (\n el: Element,\n options: MutationObserverInit = {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n },\n): Readable<MutationObserverValue> => {\n const value = signal<MutationObserverValue>({ entries: [], latest: null });\n const observer = new MutationObserver((entries) => {\n value.value = {\n entries,\n latest: entries.length > 0 ? entries[entries.length - 1] : null,\n };\n });\n\n observer.observe(el, options);\n onCleanup(() => observer.disconnect());\n\n return value;\n};\n"],"mappings":"yDAUA,IAAa,GACX,EACA,EAAgC,CAC9B,WAAY,GACZ,cAAe,GACf,UAAW,GACX,QAAS,EACX,IACoC,CACpC,IAAM,EAAQ,EAA8B,CAAE,QAAS,CAAC,EAAG,OAAQ,IAAK,CAAC,EACnE,EAAW,IAAI,iBAAkB,GAAY,CACjD,EAAM,MAAQ,CACZ,UACA,OAAQ,EAAQ,OAAS,EAAI,EAAQ,EAAQ,OAAS,GAAK,IAC7D,CACF,CAAC,EAKD,OAHA,EAAS,QAAQ,EAAI,CAAO,EAC5B,MAAgB,EAAS,WAAW,CAAC,EAE9B,CACT"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
let e=require("@vielzeug/ripple");var t=t=>{let n=(0,e.signal)({height:0,width:0}),r=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(n.value={height:t.blockSize,width:t.inlineSize})});return r.observe(t),(0,e.onCleanup)(()=>r.disconnect()),n};exports.resizeObserver=t;
|
|
2
|
+
//# sourceMappingURL=resize-observe.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observe.cjs","names":[],"sources":["../../src/observers/resize-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `Reactive` that updates whenever the dimensions change.\n * Must be called inside a `mount()` callback.\n */\nexport const resizeObserver = (el: Element): Readable<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n"],"mappings":"kCAOA,IAAa,EAAkB,GAA6D,CAC1F,IAAM,GAAA,EAAA,EAAA,OAAA,CAAc,CAAE,OAAQ,EAAG,MAAO,CAAE,CAAC,EACrC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,UAAW,EACvE,CAAC,EAKD,OAHA,EAAG,QAAQ,CAAE,GACb,EAAA,EAAA,UAAA,KAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Readable } from '@vielzeug/ripple';
|
|
2
|
+
/**
|
|
3
|
+
* Observes an element's content-box size via `ResizeObserver`.
|
|
4
|
+
* Returns a `Reactive` that updates whenever the dimensions change.
|
|
5
|
+
* Must be called inside a `mount()` callback.
|
|
6
|
+
*/
|
|
7
|
+
export declare const resizeObserver: (el: Element) => Readable<{
|
|
8
|
+
height: number;
|
|
9
|
+
width: number;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=resize-observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observe.d.ts","sourceRoot":"","sources":["../../src/observers/resize-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,MAAM,kBAAkB,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,OAAO,KAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CActF,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{onCleanup as e,signal as t}from"@vielzeug/ripple";var n=n=>{let r=t({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e(()=>i.disconnect()),r};export{n as resizeObserver};
|
|
2
|
+
//# sourceMappingURL=resize-observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resize-observe.js","names":[],"sources":["../../src/observers/resize-observe.ts"],"sourcesContent":["import { type Readable, signal, onCleanup } from '@vielzeug/ripple';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `Reactive` that updates whenever the dimensions change.\n * Must be called inside a `mount()` callback.\n */\nexport const resizeObserver = (el: Element): Readable<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n"],"mappings":"yDAOA,IAAa,EAAkB,GAA6D,CAC1F,IAAM,EAAO,EAAO,CAAE,OAAQ,EAAG,MAAO,CAAE,CAAC,EACrC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,UAAW,EACvE,CAAC,EAKD,OAHA,EAAG,QAAQ,CAAE,EACb,MAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./observers/intersection-observe.cjs"),t=require("./observers/media-observe.cjs"),n=require("./observers/mutation-observe.cjs"),r=require("./observers/resize-observe.cjs");exports.intersectionObserver=e.intersectionObserver,exports.mediaObserver=t.mediaObserver,exports.mutationObserver=n.mutationObserver,exports.resizeObserver=r.resizeObserver;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{intersectionObserver as e}from"./observers/intersection-observe.js";import{mediaObserver as t}from"./observers/media-observe.js";import{mutationObserver as n}from"./observers/mutation-observe.js";import{resizeObserver as r}from"./observers/resize-observe.js";export{e as intersectionObserver,t as mediaObserver,n as mutationObserver,r as resizeObserver};
|
package/dist/ore.cjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@vielzeug/ripple");var t=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},n=class extends t{constructor(e){super(e)}},r=class extends t{component;phase;constructor(e,t){super(e,{cause:t.cause}),this.component=t.component,this.phase=t.phase}};function i(e,t){`${e.component}${e.phase}`,e.cause,t.dispatchEvent(new CustomEvent(`ore:error`,{bubbles:!0,composed:!0,detail:e}))}var a=class extends t{},o={defineDuplicate:e=>`define('${e}') called twice — custom element already registered`,defineFieldRequiresFormAssociated:e=>`useField() requires define('${e}', { formAssociated: true })`,defineRequiresTag:`define() requires a tag name`,eachDuplicateKey:(e,t)=>`each() received duplicate key "${e}" at index ${t}`,injectStrictFailed:(e,t)=>`injectStrict() could not resolve key "${e}" in <${t}>`,lifecycleOutsideSetup:`Lifecycle hooks must be called during component setup`,propInvalidReflect:`Structured props cannot use reflect:true — use prop.json() with reflect:false`,validationFailed:(e,t)=>`Validation failed for <${e}>:\n${t.join(`
|
|
2
|
+
`)}`},s=e=>{for(let t=e.length-1;t>=0;t--)e[t]()},c=e=>{for(let t of e)t.remove()},l=new Set([`action`,`cite`,`codebase`,`data`,`formaction`,`href`,`manifest`,`ping`,`poster`,`src`,`xlink:href`]),u=/^\s*(?:(?:javascript|vbscript|blob):|data:(?:[^,]*\/(?:html|svg\+xml)|application\/(?:xhtml|xml)))/i,d=(e,t,n)=>{let r=t.toLowerCase();if(/^on[a-z]/i.test(t)){`${t}${t.slice(2)}`,e.removeAttribute(t);return}if(r===`srcdoc`){e.removeAttribute(t);return}if(n==null||n===!1){e.removeAttribute(t);return}let i=n===!0?`true`:String(n);if(l.has(r)&&u.test(i)){`${t}`,e.removeAttribute(t);return}e.setAttribute(t,i)},f=(e,t,n,r)=>{if(!e)return()=>{};let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},p=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),m=e=>Array.isArray(e)||typeof e==`object`&&!!e,h=null,g=(e,t)=>{let n=h;h=e;try{return t()}finally{h=n}},ee=()=>h,_=()=>{if(h)return h.element;throw new n(o.lifecycleOutsideSetup)},v=t=>h?((0,e.onCleanup)(t),!0):!1,y=e.onCleanup,b=e=>{if(!h)throw new n(o.lifecycleOutsideSetup);h.mountCallbacks.push(e)},x=t=>{let n=(0,e.effect)(t),r=()=>n.dispose();return v(r),r};function te(e,t,r,i){if(!h)throw new n(o.lifecycleOutsideSetup);if(!e)return;let a=f(e,t,r,i);v(a)||a()}var ne=(e,t)=>x(()=>{let n=e.value;if(n)return t(n)}),re=e=>e===`role`||e.startsWith(`aria-`)?e:e.startsWith(`aria`)?`aria-${e.slice(4).toLowerCase()}`:`aria-${e}`,ie=e=>e===`role`||e.startsWith(`aria-`)?e:e.startsWith(`aria`)?`aria-${e.slice(4).toLowerCase()}`:e,S=(e,t,n)=>{if(n==null||n===!1){e.removeAttribute(t);return}e.setAttribute(t,n===!0?`true`:String(n))},ae=(t,n)=>{let r=[];for(let[i,a]of Object.entries(n)){let n=re(i);if(typeof a==`function`){let i=(0,e.effect)(()=>S(t,n,a()));r.push(()=>i.dispose());continue}if((0,e.isReactive)(a)){let i=(0,e.effect)(()=>S(t,n,a.value));r.push(()=>i.dispose());continue}S(t,n,a)}return()=>{for(;r.length>0;)r.pop()?.()}},C=()=>(e,t)=>{let n=ae(e,t);return v(n),n},w=new WeakMap,oe=e=>{let t=[],n=e;for(;n;){n instanceof HTMLElement&&t.push(n);let e=n.getRootNode();n=n.parentElement??(e instanceof ShadowRoot?e.host:null)}return t},se=(e,t,n)=>{w.has(e)||w.set(e,new Map),w.get(e).set(t,n)},T=Symbol(`inject.not_found`),E=new WeakMap,ce=(e,t)=>{let n=oe(e);for(let e of n){let n=w.get(e);if(n?.has(t))return n.get(t)}return T};function D(e,...t){let r=ee();if(!r)throw new n(o.lifecycleOutsideSetup);let i=E.get(r);i||(i=new Map,E.set(r,i));let a=e;if(i.has(a)){let e=i.get(a);return e===T?t.length>0?t[0]:void 0:e}let s=ce(r.element,e);return i.set(a,s),s===T?t.length>0?t[0]:void 0:s}var le=e=>{let t=D(e,T);if(t!==T)return t;let r=_();throw new n(o.injectStrictFailed(String(e),r.localName))};function O(e){return Symbol(e)}var ue=e=>(t,n)=>{let r=n?.target??e,i=[];if(t.attr)for(let[e,n]of Object.entries(t.attr)){let t=fe(r,de(e),n);t&&i.push(t)}if(t.class&&i.push(me(r,t.class)),t.style)for(let[e,n]of Object.entries(t.style)){let t=pe(r,e,n);t&&i.push(t)}if(t.on){let{target:e,...a}=n??{};for(let e of Object.keys(t.on)){let n=t.on[e];n&&i.push(f(r,e,n,a))}}let a=()=>{for(let e of i)e()};return v(a),a},de=ie,k=(t,n)=>{if(typeof t==`function`)return x(()=>n(t()));if((0,e.isReactive)(t))return x(()=>n(t.value));n(t)};function fe(e,t,n){return k(n,n=>d(e,t,n))}var A=/[;{}]/g;function pe(e,t,n){let r=(t.startsWith(`--`)?t:p(t)).replace(A,``);if(!r)return;let i=!1;return k(n,t=>{t!=null&&t!==``?(i=!0,e.style.setProperty(r,String(t).replace(A,``))):i&&e.style.removeProperty(r)})}function me(t,n){let r=typeof n==`function`?n:()=>{let t={};for(let[r,i]of Object.entries(n))t[r]=typeof i==`function`?i():(0,e.isReactive)(i)?i.value:!!i;return t},i=new Set;return x(()=>{let e=new Set;for(let[n,a]of Object.entries(r()))a&&(e.add(n),i.has(n)||t.classList.add(n));for(let n of i)e.has(n)||t.classList.remove(n);i=e})}var he=`default`,j=e=>e||he,ge=t=>{let n=new Map,r=new Map,i=new Map,a=t=>{let r=n.get(t);return r||(r={elements:(0,e.signal)([]),presence:(0,e.signal)(!1)},n.set(t,r)),r},o=(e,t)=>{if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0},s=e=>{let t=j(e),n=r.get(t),i=[];if(n)for(let e of n)i.push(...e.assignedElements({flatten:!0}));let s=a(t);o(s.elements.value,i)||(s.elements.value=i);let c=i.length>0;s.presence.value!==c&&(s.presence.value=c)},c=e=>{if(i.has(e))return;let t=j(e.getAttribute(`name`)),n=r.get(t)??new Set;n.add(e),r.set(t,n);let a=()=>s(t);e.addEventListener(`slotchange`,a),i.set(e,()=>{e.removeEventListener(`slotchange`,a)}),s(t)},l=e=>{let t=i.get(e);if(!t)return;t(),i.delete(e);let n=j(e.getAttribute(`name`)),a=r.get(n);a&&(a.delete(e),a.size===0&&r.delete(n)),s(n)},u=()=>{t.shadowRoot?.querySelectorAll(`slot`).forEach(e=>c(e))},d=()=>{for(let e of r.keys())s(e)},f=null;return t.shadowRoot&&(f=new MutationObserver(e=>{for(let t of e)for(let e of t.removedNodes)e instanceof HTMLSlotElement&&l(e);u(),d()}),f.observe(t.shadowRoot,{childList:!0,subtree:!0})),u(),b(()=>{u(),d()}),y(()=>{f?.disconnect(),f=null;for(let e of i.values())e();i.clear(),r.clear(),n.clear()}),{elements:e=>a(j(e)).elements,has:e=>a(j(e)).presence}},M={bubbles:!0,cancelable:!0,composed:!1},_e=e=>((t,...n)=>{let r=n.length>0?{...M,detail:n[0]}:M;e.dispatchEvent(new CustomEvent(String(t),r))}),ve=e=>{let t=ge(e),n=ue(e);return{aria:C(),bind:n,el:e,emit:_e(e),inject:D,onCleanup:y,onElement:ne,onEvent:te,onMounted:b,provide:(t,n)=>se(e,t,n),slots:t,watch:x}};function N(e){return{default:e,parse:()=>e,reflect:!1}}var P={bool(e){return{default:e??!1,parse:e=>e!==null&&e!==`false`,reflect:!0}},data(e){return N(e)},json(e){return{default:e,parse:t=>{if(t==null||t===``)return e;try{return JSON.parse(t)}catch{return e}},reflect:!1}},number(e){let t=e===void 0?void 0:e;return{default:t,parse:e=>{if(e==null)return t;let n=Number(e);return Number.isNaN(n)?(`${e}${String(t)}`,t):n},reflect:!0}},oneOf(e,t){return{default:t,parse:n=>n!=null&&e.includes(n)?n:t,reflect:!0}},string(e){let t=e===void 0?void 0:e;return{default:t,parse:e=>e??t,reflect:!0}}},F=e=>typeof e==`object`&&!!e&&`default`in e&&`parse`in e;function I(e,t){if(!F(e))throw new n(`Prop "${t}" must use a prop.* helper (string/number/bool/json/oneOf). Received: ${typeof e}`);let r=e;if(!r.parse)throw new n(`Prop "${t}" must have a parse function. Use prop.* helpers.`);let i=r.reflect??!1;if(i&&m(r.default))throw new n(`Prop "${t}": ${o.propInvalidReflect}`);return{...r,reflect:i}}function ye(e){let t=[];for(let[n,r]of Object.entries(e))try{I(r,n)}catch(e){t.push(e instanceof Error?e.message:String(e))}return t}var L=new WeakMap,R=(e,t)=>L.get(e)?.get(t),be=(t,n,r,i)=>{L.has(t)||L.set(t,new Map);let{default:a,parse:o,reflect:s=!1}=i,c=(0,e.signal)(a),l=Object.hasOwn(t,n),u=l?t[n]:void 0,f={parse:o,reflect:s,signal:c};return l?(delete t[n],c.value=u):t.hasAttribute(r)&&(c.value=o(t.getAttribute(r))),L.get(t).set(r,f),Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:()=>c.value,set:e=>{c.value=e}}),s&&x(()=>{let e=c.value;e==null?t.removeAttribute(r):typeof e==`boolean`?t.toggleAttribute(r,e):d(t,r,e)}),c};function xe(e,t){let n={};for(let[r,i]of Object.entries(t))n[r]=be(e,r,p(r),i);return n}var z={LOADING:`loading`,SETUP_DONE:`setup_done`,SETUP_RUNNING:`setup_running`,UNINITIALIZED:`uninitialized`,UNMOUNTED:`unmounted`},B={CONNECT:`ore:connect`,DISCONNECT:`ore:disconnect`};function Se(){return(0,e.signal)(null)}var V=e=>{let t=Symbol.for(e);return{is:e=>typeof e==`object`&&!!e&&t in e,stamp:e=>Object.assign(e,{[t]:!0})}},Ce=V(`ore:directive`).is,we=V(`ore:spread`).is,H=V(`ore:html-result`),U=H.is;function Te(e,t){return H.stamp({apply:t,fragment:e,mount:(n,r,i)=>{let a=Array.from(e.childNodes);return n.insertBefore(e,r),t(i),a}})}var W=new WeakSet,Ee=e=>typeof e==`object`&&!!e&&W.has(e),De=function(){return this.content},Oe=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=Ee(e)?e.content:String(e)}let r={content:n.trim(),toString:De};return W.add(r),r},G=new Map,ke=e=>{if(e instanceof CSSStyleSheet)return e;let t=typeof e==`string`?e:e.content,n=G.get(t);if(n)return n;let r=new CSSStyleSheet;try{r.replaceSync(t)}catch{}return G.set(t,r),r},Ae=()=>({generation:0,mountCallbacks:[],phase:z.UNINITIALIZED,scope:(0,e.scope)(),templateResult:null}),je=class extends HTMLElement{static _definition;static _normalizedPropDefs;static formAssociated=!1;static observedAttributes=[];_component;constructor(){super();let e=this.constructor._definition;e?.shadow!==!1&&this.attachShadow({mode:`open`,...e?.shadow}),this._component=Ae()}connectedCallback(){(0,e.untrack)(()=>{this._component.phase===z.UNINITIALIZED&&this._runSetup(),this._init()}),this.dispatchEvent(new CustomEvent(B.CONNECT,{bubbles:!1,composed:!1}))}attributeChangedCallback(t,n,r){if(n===r)return;let i=R(this,t);if(!i)return;let a=i.parse(r);Object.is((0,e.untrack)(()=>i.signal.value),a)||(i.signal.value=a)}disconnectedCallback(){this._component.generation++,this._component.phase=z.UNMOUNTED,this.dispatchEvent(new CustomEvent(B.DISCONNECT,{bubbles:!1,composed:!1})),this._component.scope.dispose(),this._component.mountCallbacks=[],this._component.phase=z.UNINITIALIZED,this._component.scope=(0,e.scope)(),this._component.templateResult=null}_handleSetupError(e,t=`setup`){let n=e instanceof Error?e:Error(String(e)),a=new r(`<${this.localName}> failed during ${this._component.phase} (${t})`,{cause:n,component:this.localName,phase:t}),o=this.constructor._definition;if(o?.onError)try{return o.onError(a,this)}catch{}i(a,this)}_runSetup(){this._component.phase=z.SETUP_RUNNING;let e=this.constructor._definition,t=this.constructor._normalizedPropDefs,n={element:this,mountCallbacks:[]};try{let r;if(this._component.scope.run(()=>{r=g(n,()=>{let n=t?xe(this,t):{},r=ve(this);return e.setup(n,r)})}),this._component.mountCallbacks.push(...n.mountCallbacks),r!=null&&typeof r.then==`function`){let t=this._component.mountCallbacks.splice(0);this._component.phase=z.LOADING,e.loading&&(this._component.templateResult=e.loading()),this._runSetupAsync(r,t,this._component.generation)}else this._component.templateResult=r??null,this._component.phase=z.SETUP_DONE}catch(e){let t=this._handleSetupError(e);if(t)this._component.templateResult=t,this._component.phase=z.SETUP_DONE;else throw this._component.phase=z.UNINITIALIZED,e}}async _runSetupAsync(e,t,n){try{let r=await e;if(this._component.generation!==n||!this.isConnected){`${this.localName}`;return}this._component.templateResult=r??null,this._component.phase=z.SETUP_DONE,this._component.mountCallbacks.push(...t),r&&this._applyResult(r),this._scheduleMountCallbacks()}catch(e){if(this._component.generation!==n||!this.isConnected){`${this.localName}`;return}let t=this._handleSetupError(e,`async-setup`);t?(this._component.templateResult=t,this._component.phase=z.SETUP_DONE,this._applyResult(t)):this._component.phase=z.UNINITIALIZED}}_applyResult(e){e&&((this.shadowRoot??this).replaceChildren(e.fragment),this._component.scope.run(()=>{e.apply(y)}))}_init(){this._applyStyles(),this._mountTemplate(),this._component.phase===z.SETUP_DONE&&this._scheduleMountCallbacks()}_applyStyles(){let e=this.constructor._definition;this.shadowRoot&&e?.styles?.length&&(this.shadowRoot.adoptedStyleSheets=e.styles.map(ke))}_mountTemplate(){let e=this._component.templateResult;e&&this._applyResult(e)}_scheduleMountCallbacks(){if(this._component.mountCallbacks.length===0)return;let e=this._component.generation;queueMicrotask(()=>{if(!this.isConnected||e!==this._component.generation)return;let t=this._component.mountCallbacks.splice(0);for(let e of t)try{let t={element:this,mountCallbacks:[]};this._component.scope.run(()=>{g(t,()=>{let t=e();typeof t==`function`&&y(t)})}),t.mountCallbacks.length>0&&this._component.mountCallbacks.push(...t.mountCallbacks)}catch(e){this._handleSetupError(e,`mounted`)}this._component.mountCallbacks.length>0&&this._scheduleMountCallbacks()})}};function Me(e,t){if(!e)throw new n(o.defineRequiresTag);if(customElements.get(e))throw new n(o.defineDuplicate(e));let{props:r}=t,i=(()=>{if(!r)return;let t=ye(r);if(t.length>0)throw new n(o.validationFailed(e,t));let i={};for(let[e,t]of Object.entries(r))i[e]=I(t,e);return i})(),a=i?Object.keys(i).map(p):[],s=class extends je{static _definition=t;static _normalizedPropDefs=i;static formAssociated=t.formAssociated??!1;static observedAttributes=a};Object.defineProperty(s,"name",{value:e}),customElements.define(e,s)}var Ne=new WeakSet,Pe=e=>typeof e==`object`&&!!e&&Ne.has(e),K=(t,n,r)=>{let i=(0,e.effect)(()=>n(t.value));r(()=>i.dispose())},Fe=e=>e.value,Ie=(e,t)=>{K(e.signal,t=>{e.node.textContent=String(t??``)},t)},Le=e=>e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement,Re=(e,t,n,r)=>{let i=t==null?``:String(t);n&&r.last!==void 0&&!Object.is(e.value,r.last)&&!Object.is(e.value,i)||(e.value=i,n&&(r.last=i))},ze=(e,t,n,r)=>{let i=!!t;n&&r.last!==void 0&&e.checked!==!!r.last&&e.checked!==i||(e.checked=i,n&&(r.last=i))},Be=(t,n,r,i)=>{let a=m(i)?i:n.parse(r.mode===`bool`?i?``:null:i==null||i===!1?null:String(i));if(Object.is((0,e.untrack)(()=>n.signal.value),a)||(n.signal.value=a),!n.reflect){if(m(i))return;r.mode===`bool`?t.toggleAttribute(r.name,!!i):d(t,r.name,i)}},Ve=(t,n)=>{let{el:r,mode:i,name:a,propMeta:o}=t,s={last:void 0},c=n=>{if(o){Be(r,o,t,n);return}if(!(0,e.isReactive)(n)&&m(n)){a!==`__proto__`&&a!==`constructor`&&a!==`prototype`&&(r[a]=n);return}if(a===`value`&&Le(r)){Re(r,n,t.live,s);return}if(a===`checked`&&r instanceof HTMLInputElement){ze(r,n,t.live,s);return}i===`bool`?r.toggleAttribute(a,!!n):d(r,a,n)};`signal`in t?K(t.signal,c,n):c(t.value)},He=(e,t)=>{t(f(e.el,e.name,e.handler,e.options))},Ue=(e,t)=>{let{el:n,ref:r}=e;if(typeof r==`function`){r(n),t(()=>r(null));return}r.value=n,t(()=>{r.value=null})},We=(e,t,n)=>{let r=[],i=t.parentNode;for(let a of e)if(U(a)){let e=Array.from(a.fragment.childNodes);i.insertBefore(a.fragment,t),a.apply(n),r.push(...e)}else if(a!=null&&a!==!1){let e=document.createTextNode(String(a));i.insertBefore(e,t),r.push(e)}return r},Ge=(t,n)=>{let{anchor:r,signal:i}=t,a=[],o=()=>{s(a),a=[]},l=[],u=(0,e.effect)(()=>{let t=Fe(i);o(),c(l),l=[],!(t==null||t.length===0)&&(0,e.untrack)(()=>{l=We(t,r,e=>a.push(e))})});n(()=>{u.dispose(),o(),c(l)})},Ke=(e,t)=>{e.directive.mount(e.anchor,t)},qe=(e,t)=>{e.spread.apply(e.el,t)},Je=(e,t)=>{switch(e.type){case`attr`:Ve(e,t);break;case`directive`:Ke(e,t);break;case`event`:He(e,t);break;case`html`:Ge(e,t);break;case`ref`:Ue(e,t);break;case`spread`:qe(e,t);break;case`text`:Ie(e,t);break}},Ye=(t,n,r,i)=>{let a=R(t,r);return Pe(i)?{el:t,live:!0,mode:n,name:r,propMeta:a,signal:i,type:`attr`}:typeof i==`function`?{el:t,mode:n,name:r,propMeta:a,signal:(0,e.computed)(i),type:`attr`}:(0,e.isReactive)(i)?{el:t,mode:n,name:r,propMeta:a,signal:i,type:`attr`}:{el:t,mode:n,name:r,propMeta:a,type:`attr`,value:i}},q=e=>e==null?``:String(e),Xe={prevent:e=>t=>{t.preventDefault(),e(t)},self:e=>t=>{t.target===t.currentTarget&&e(t)},stop:e=>t=>{t.stopPropagation(),e(t)}},J=(e,t)=>{let n=e;for(let e of t){let t=Xe[e];t&&(n=t(n))}let r={};return t.includes(`capture`)&&(r.capture=!0),t.includes(`once`)&&(r.once=!0),t.includes(`passive`)&&(r.passive=!0),{handler:n,...Object.keys(r).length?{options:r}:{}}},Ze=/\s+@([a-zA-Z_][-a-zA-Z0-9_.-]*)\s*=\s*["']?$/,Qe=/\s+ref\s*=\s*["']?$/,$e=/\s+\?([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/,et=/\s+:?([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/,tt=e=>{let t=e.lastIndexOf(`<`);return t<=e.lastIndexOf(`>`)?!1:e[t+1]!==`/`},nt=e=>{let t,n=e.trimEnd();if(n.endsWith(`</`))return{kind:`closeTag`,prefix:e};if(n.endsWith(`<`))return{kind:`tagname`,prefix:e};if(t=Ze.exec(e)){let n=e.slice(0,-t[0].length),r=t[1].split(`.`);return{kind:`event`,modifiers:r.slice(1),name:r[0],prefix:n}}return(t=Qe.exec(e))?{kind:`ref`,prefix:e.slice(0,-t[0].length)}:(t=$e.exec(e))?{kind:`boolAttr`,name:t[1],prefix:e.slice(0,-t[0].length)}:(t=et.exec(e))?{kind:`attr`,name:t[1],prefix:e.slice(0,-t[0].length)}:tt(e)?{kind:`spread`,prefix:e.trimEnd()}:{kind:`node`,prefix:e}},Y=new WeakMap,rt=e=>{let t=Array.from(e);for(let e=0;e<t.length-1;e++){let n=t[e],r=n[n.length-1];if(r===`"`||r===`'`){t[e]=n.slice(0,-1);let i=t[e+1];i.startsWith(r)&&(t[e+1]=i.slice(1))}if(t[e].trimEnd().endsWith(`</`)){let n=t[e+1];n.startsWith(`>`)&&(t[e+1]=n.slice(1))}}return t},X=(e,t,n,r)=>{if(e.nodeType===Node.ELEMENT_NODE){let r=e,i=r.getAttribute(`u`);i!==null&&(n.set(Number(i),[...t]),r.removeAttribute(`u`))}else if(e.nodeType===Node.COMMENT_NODE){let n=e.nodeValue;n!==null&&/^\d+$/.test(n)&&r.set(Number(n),[...t])}let i=e.childNodes;for(let e=0;e<i.length;e++)X(i[e],[...t,e],n,r)},it=e=>{let t=rt(e),n=``,r,i=0,a=0,o=[],s=[];for(let e=0;e<t.length-1;e++){let c=t[e],l=nt(c);if(l.kind===`tagname`){let e=i++;r=e,s.push(e);let t=c.replace(/<\s*$/,``);n+=t+`<ore-dyn-${e} u="${e}"`,o.push({elementId:e,kind:`tagname`})}else if(l.kind===`closeTag`){let e=s.pop()??0,t=c.replace(/<\/\s*$/,``);n+=t+`</ore-dyn-${e}>`,o.push({kind:`closeTag`}),r=void 0}else if(l.kind===`node`)n+=l.prefix+`<!--${a}-->`,o.push({commentId:a,kind:`node`}),a++,r=void 0;else{r===void 0||l.prefix.lastIndexOf(`<`)>l.prefix.lastIndexOf(`>`)?(r=i++,n+=`${l.prefix} u="${r}"`):n+=l.prefix;let e=l.kind===`boolAttr`?`bool`:l.kind===`attr`?`attr`:void 0;o.push({elementId:r,kind:l.kind,mode:e,modifiers:l.modifiers,name:l.name})}}n+=t[t.length-1]??``;let c=document.createElement(`template`);c.innerHTML=n;let l=new Map,u=new Map,d=c.content.childNodes;for(let e=0;e<d.length;e++)X(d[e],[e],l,u);return{commentPaths:u,element:c,elementPaths:l,slots:o}},at=e=>{let t=Y.get(e);return t||(t=it(e),Y.set(e,t)),t},Z=(e,t)=>{let n=e;for(let e of t)n=n.childNodes[e];return n},ot=(t,n)=>{let r=at(t),i=r.element.content.cloneNode(!0),a=[],o=[],s=r.slots.map((e,t)=>{let a=n[t];return e.kind===`closeTag`?{slot:e,value:a}:e.kind===`node`?{comment:Z(i,r.commentPaths.get(e.commentId)),slot:e,value:a}:{el:Z(i,r.elementPaths.get(e.elementId)),slot:e,value:a}}),c=new Map;for(let{el:e,slot:t,value:n}of s){if(t.kind!==`tagname`)continue;let r=String(n);if(!/^[a-z][a-z0-9._-]*$/i.test(r)){`${r}`;continue}let i=document.createElement(r);for(let t of Array.from(e.attributes))i.setAttribute(t.name,t.value);for(;e.firstChild;)i.appendChild(e.firstChild);e.replaceWith(i),c.set(e,i)}for(let{comment:t,el:n,slot:r,value:i}of s){if(r.kind===`tagname`||r.kind===`closeTag`)continue;let s=n&&(c.get(n)??n);if(r.kind===`node`){let n=t;if(Ce(i)){a.push({anchor:n,directive:i,type:`directive`});continue}if(U(i)){let e=n.parentNode;for(;i.fragment.firstChild;)e.insertBefore(i.fragment.firstChild,n);n.remove(),o.push(i.apply.bind(i));continue}if(typeof i==`function`){let t=(0,e.computed)(()=>{let e=i();return Array.isArray(e)?e:[e]});a.push({anchor:n,signal:t,type:`html`});continue}if((0,e.isReactive)(i)){let t=(0,e.computed)(()=>{let e=i.value;return Array.isArray(e)?e:[e]});a.push({anchor:n,signal:t,type:`html`});continue}if(Array.isArray(i)){let e=n.parentNode;for(let t of i)if(U(t)){for(;t.fragment.firstChild;)e.insertBefore(t.fragment.firstChild,n);o.push(t.apply.bind(t))}else e.insertBefore(document.createTextNode(q(t)),n);n.remove();continue}n.replaceWith(document.createTextNode(q(i)));continue}let l=s;if(r.kind===`event`){if(typeof i==`function`){let{handler:e,options:t}=J(i,r.modifiers??[]);a.push({el:l,handler:e,name:r.name,options:t,type:`event`})}else if((0,e.isReactive)(i)){let e=i,{handler:t,options:n}=J(t=>{let n=e.value;typeof n==`function`&&n(t)},r.modifiers??[]);a.push({el:l,handler:t,name:r.name,options:n,type:`event`})}continue}if(r.kind===`ref`){i&&a.push({el:l,ref:i,type:`ref`});continue}if(r.kind===`spread`){we(i)&&a.push({el:l,spread:i,type:`spread`});continue}a.push(Ye(l,r.mode??`attr`,r.name,i))}return Te(i,e=>{for(let t of a)Je(t,e);for(let t of o)t(e)})},st=(e,...t)=>ot(e,t),Q=new WeakMap,ct=e=>{let t=e.el??_();if(!t.constructor.formAssociated)throw new n(o.defineFieldRequiresFormAssociated(t.localName));if(Q.has(t))throw new n(`useField() was already called on <${t.localName}>. Call it only once per component.`);let r=t.attachInternals();Q.set(t,r),y(()=>Q.delete(t));let i=e.toFormValue??(t=>t==null?e.emptyStringForNull?``:null:t instanceof File||t instanceof FormData?t:String(t));x(()=>{r.setFormValue(i(e.value.value))});let a=e.disabled;if(a&&`states`in r){let e=r.states;x(()=>{a.value?e.add(`disabled`):e.delete(`disabled`)})}return{checkValidity:()=>r.checkValidity(),internals:r,reportValidity:()=>r.reportValidity(),setCustomValidity:e=>e?r.setValidity({customError:!0},e):r.setValidity({}),setValidity:r.setValidity.bind(r)}},lt=O(`ore:form-context`);function ut(t={}){let n=(0,e.signal)([]),r=(0,e.signal)(!1),i=(0,e.signal)(!1),a=(0,e.signal)(null);return{clearStatus:()=>{i.value=!1,a.value=null,t.onReset?.()},dirty:i,error:a,markDirty:()=>{i.value=!0},registerField:e=>(n.value=[...n.value,e],()=>{n.value=n.value.filter(t=>t!==e)}),submit:async e=>{if(e?.preventDefault(),!r.value){r.value=!0,a.value=null;try{await t.onSubmit?.(e),i.value=!1}catch(e){a.value=e}finally{r.value=!1}}},submitting:r,valid:(0,e.computed)(()=>n.value.every(e=>e.value))}}var dt=0,$=0,ft=Math.random().toString(36).slice(2,6),pt=(e=`id`)=>`${e}-${++dt}`,mt=(e=`id`)=>`${e}-${ft}${++$}`,ht=()=>{$=0};exports.FORM_CONTEXT_KEY=lt,exports.OreApiError=n,exports.OreError=t,exports.OreLifecycleError=r,exports.OreTimeoutError=a,exports.createContext=O,exports.createFormContext=ut,exports.createId=pt,exports.createStableId=mt,exports.css=Oe,exports.define=Me,exports.html=st,exports.inject=D,exports.injectStrict=le,exports.prop=P,exports.ref=Se,exports.resetIdCounter=ht,exports.useField=ct;
|
|
3
|
+
//# sourceMappingURL=ore.cjs.map
|