@sylwellsoftware/fray 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,7 @@
13
13
  --ui-gradient-2: linear-gradient( to bottom, var(--ui-primary-bg-color) 9px, var(--ui-primary-bg-color) 13px, var(--ui-dark-bg-color) 100% );
14
14
  --shiny-ui-gradient: var(--ui-gradient);
15
15
  --shiny-ui-gradient-2: var(--ui-gradient-2);
16
+ --shiny-background: radial-gradient(140% 75% at 30% 10%, #fff2, #fff3 47%, #fff0 55%, #fff0), linear-gradient(to bottom, var(--palette-primary-900) 0%, var(--palette-primary) 65%, var(--palette-primary) 66%, var(--palette-primary-400) 100%);
16
17
  --text-color: var(--palette-primary-900);
17
18
  --ui-color: var(--text-color);
18
19
 
@@ -24,9 +25,7 @@
24
25
  --island-margin: var(--space-sm);
25
26
  --island-border: 1px solid rgb(255 255 255 / 0.45);
26
27
  --island-shadow: 0px 1px 2.5px 0px #666;
27
- --section-header-background:
28
- radial-gradient(100% 50% at 40% 10%, var(--palette-light-clear), var(--palette-light-clear) 30%, var(--palette-light-faint) 110%, var(--palette-light-clear) 120%, var(--palette-light-clear) calc(120% + 1%)),
29
- linear-gradient(1deg, var(--palette-primary-900) 0%, var(--palette-primary) 65%, var(--palette-primary) 65%, var(--palette-primary-200) 100%);
28
+ --section-header-background: var(--shiny-background);
30
29
  --section-header-color: var(--palette-contrast-light);
31
30
  --section-header-shadow:
32
31
  inset -1px 1px 2px 0px #0003,
@@ -34,6 +33,7 @@
34
33
  inset -1px 1px 1px 0px #0006,
35
34
  inset 1px -1px 1px 0px #fff5,
36
35
  0px 1px 2px 0px #000a;
36
+ --mini-shadow: 0px 1px 1px 0px #000a;
37
37
 
38
38
  --sidebar-background:
39
39
  linear-gradient(135deg, rgb(255 255 255 / 0.4), transparent 55%),
@@ -102,6 +102,14 @@
102
102
  --toggle-inactive-separator-block-inset: 0.35rem;
103
103
 
104
104
  /* Navigation components */
105
+ --navigation-bar-background: var(--ui-gradient-2);
106
+ --navigation-bar-color: var(--text-color);
107
+ --navigation-bar-shadow: var(--panel-shadow);
108
+ --navigation-link-color-current: white;
109
+ --navigation-link-background-hover: var(--section-header-background);
110
+ --navigation-link-color-hover: white;
111
+ --navigation-link-background-current: var(--section-header-background);
112
+ --navigation-link-shadow-current: var(--mini-shadow);
105
113
  --tabline-background: var(--shiny-ui-gradient-2);
106
114
  --tabline-padding-inline-start: 5px;
107
115
  --tab-button-background: var(--shiny-ui-gradient);
@@ -121,7 +129,20 @@
121
129
  inset -1px 1px 1px 1px #0006,
122
130
  inset 1px -1px 1px 1px #fff5,
123
131
  -1px 1px 3px 0 #0006;
132
+
124
133
  --colored-shadow: inset -2px 2px 2px 0px #0006, inset 2px -2px 2px 0px #fff5, -3px 3px 4px 0px #0006;
125
134
  --block-graph-block-border: none;
126
135
  }
127
136
  }
137
+
138
+ .colored {
139
+ background: radial-gradient(140% 75% at 30% 10%, #fff0, #fff1 47%, #fff0 55%, #fff0), var(--colored-base-bg);
140
+ }
141
+
142
+ nav > ul > li {
143
+ border-radius: var(--ui-border-radius);
144
+ }
145
+
146
+ fray-navigationbar nav > ul > li > a {
147
+ line-height: 1.7em;
148
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsx-dev-runtime-C7dc8ZyF.js","sources":["../src/styling/styleRegistry.ts","../src/services.ts","../src/runtime.ts","../src/Components/component.ts","../src/jsx-runtime.ts"],"sourcesContent":["const STYLE_ATTRIBUTE = 'data-fray-structural-styles'\nlet nextRegistryId = 1\n\ntype CSSFragment = RawCSSFragment | HostCSSFragment\n\ninterface RawCSSFragment {\n readonly kind: 'raw'\n readonly css: string\n}\n\ninterface HostCSSFragment {\n readonly kind: 'host'\n readonly css: string\n readonly hosts: Set<string>\n}\n\n/** Application-scoped structural-style collection and injection. */\nexport class StyleRegistry {\n readonly id: string\n private readonly cssFragments = new Map<string, CSSFragment>()\n\n constructor(id: string = `runtime-${nextRegistryId++}`) {\n if (typeof id !== 'string') throw new TypeError('StyleRegistry id must be a string')\n this.id = id\n }\n\n registerCSS(css: string): this {\n if (typeof css !== 'string') throw new TypeError('Component CSS must be a string')\n const normalized = css.trim()\n if (normalized.length > 0) {\n this.cssFragments.set(`raw:${normalized}`, {kind: 'raw', css: normalized})\n }\n return this\n }\n\n /** @internal Collect a host-relative component template without resolving it yet. */\n registerHostCSS(css: string, host: string): this {\n if (typeof css !== 'string') throw new TypeError('Component CSS must be a string')\n if (typeof host !== 'string' || host.trim().length === 0) {\n throw new TypeError('Component CSS host must be a non-empty selector')\n }\n const normalized = css.trim()\n if (normalized.length === 0) return this\n if (!normalized.includes('&')) return this.registerCSS(normalized)\n\n const key = `host:${normalized}`\n const existing = this.cssFragments.get(key)\n if (existing == null) {\n this.cssFragments.set(key, {\n kind: 'host',\n css: normalized,\n hosts: new Set([host.trim()]),\n })\n } else if (existing.kind === 'host') {\n existing.hosts.add(host.trim())\n }\n return this\n }\n\n generateCSS(): string {\n return [...this.cssFragments.values()]\n .map(fragment => fragment.kind === 'raw'\n ? fragment.css\n : resolveHostCSS(fragment.css, [...fragment.hosts]))\n .join('\\n\\n')\n }\n\n injectAll(targetDocument: Document = globalThis.document): HTMLStyleElement {\n if (targetDocument?.head == null) {\n throw new TypeError('StyleRegistry.injectAll requires a document with a head')\n }\n const selector = `style[${STYLE_ATTRIBUTE}=\"${escapeAttributeValue(this.id)}\"]`\n let style = targetDocument.head.querySelector<HTMLStyleElement>(selector)\n if (style == null) {\n style = targetDocument.createElement('style')\n style.setAttribute(STYLE_ATTRIBUTE, this.id)\n targetDocument.head.prepend(style)\n }\n const css = this.generateCSS()\n if (style.textContent !== css) style.textContent = css\n return style\n }\n\n reset(): void {\n this.cssFragments.clear()\n }\n}\n\n/** Create an isolated registry for a configured Fray application runtime. */\nexport function createStyleRegistry(): StyleRegistry {\n return new StyleRegistry()\n}\n\n/** Backward-compatible structural styles for the default Fray runtime. */\nexport const styleRegistry = new StyleRegistry('')\n\nfunction escapeAttributeValue(value: string): string {\n return value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')\n}\n\nfunction resolveHostCSS(css: string, hosts: readonly string[]): string {\n let output = ''\n let cursor = 0\n while (cursor < css.length) {\n const openBrace = findBrace(css, cursor)\n if (openBrace < 0) return output + css.slice(cursor)\n const closeBrace = findMatchingBrace(css, openBrace)\n if (closeBrace < 0) return output + css.slice(cursor)\n\n const header = css.slice(cursor, openBrace)\n const body = css.slice(openBrace + 1, closeBrace)\n const rule = header.trim()\n output += rule.startsWith('@')\n ? `${header}{${resolveHostCSS(body, hosts)}}`\n : `${expandHostSelectors(header, hosts)}{${body}}`\n cursor = closeBrace + 1\n }\n return output\n}\n\nfunction expandHostSelectors(header: string, hosts: readonly string[]): string {\n if (hosts.length === 1 || !header.includes('&')) {\n return hosts.length === 1 ? header.replaceAll('&', hosts[0]!) : header\n }\n const leading = header.match(/^\\s*/)?.[0] ?? ''\n const trailing = header.match(/\\s*$/)?.[0] ?? ''\n const selectors = splitSelectors(header.trim())\n const continuationIndent = leading.match(/(?:^|\\n)([ \\t]*)$/)?.[1] ?? ''\n return leading + selectors.flatMap(selector => selector.includes('&')\n ? hosts.map(host => selector.replaceAll('&', host))\n : [selector]).join(`,\\n${continuationIndent}`) + trailing\n}\n\nfunction splitSelectors(selectors: string): string[] {\n const result: string[] = []\n let start = 0\n let parentheses = 0\n let brackets = 0\n let quote: '\"' | \"'\" | null = null\n for (let index = 0; index < selectors.length; index += 1) {\n const character = selectors[index]!\n if (quote != null) {\n if (character === '\\\\') index += 1\n else if (character === quote) quote = null\n continue\n }\n if (character === '\"' || character === \"'\") {\n quote = character\n } else if (character === '(') {\n parentheses += 1\n } else if (character === ')') {\n parentheses -= 1\n } else if (character === '[') {\n brackets += 1\n } else if (character === ']') {\n brackets -= 1\n } else if (character === ',' && parentheses === 0 && brackets === 0) {\n result.push(selectors.slice(start, index).trim())\n start = index + 1\n }\n }\n result.push(selectors.slice(start).trim())\n return result.filter(Boolean)\n}\n\nfunction findBrace(css: string, from: number): number {\n for (let index = from; index < css.length; index += 1) {\n const character = css[index]!\n if (character === '\"' || character === \"'\") {\n index = skipQuote(css, index)\n } else if (character === '/' && css[index + 1] === '*') {\n index = skipComment(css, index)\n } else if (character === '{') {\n return index\n }\n }\n return -1\n}\n\nfunction findMatchingBrace(css: string, openBrace: number): number {\n let depth = 1\n for (let index = openBrace + 1; index < css.length; index += 1) {\n const character = css[index]!\n if (character === '\"' || character === \"'\") {\n index = skipQuote(css, index)\n } else if (character === '/' && css[index + 1] === '*') {\n index = skipComment(css, index)\n } else if (character === '{') {\n depth += 1\n } else if (character === '}' && --depth === 0) {\n return index\n }\n }\n return -1\n}\n\nfunction skipQuote(css: string, openQuote: number): number {\n const quote = css[openQuote]!\n for (let index = openQuote + 1; index < css.length; index += 1) {\n if (css[index] === '\\\\') index += 1\n else if (css[index] === quote) return index\n }\n return css.length\n}\n\nfunction skipComment(css: string, openComment: number): number {\n const closeComment = css.indexOf('*/', openComment + 2)\n return closeComment < 0 ? css.length : closeComment + 1\n}\n","declare const serviceType: unique symbol\ndeclare const serviceProviderType: unique symbol\n\n/** Typed identity for one application service contract. */\nexport interface ServiceKey<TService> {\n readonly name: string\n readonly [serviceType]: TService\n}\n\n/** Read-only service access exposed to service factories. */\nexport interface ServiceResolver {\n has(key: ServiceKey<unknown>): boolean\n require<TService>(key: ServiceKey<TService>): TService\n}\n\nexport type ServiceFactory<TService> = (services: ServiceResolver) => TService\n\n/** Immutable registration for a lazily created, scope-shared service. */\nexport interface ServiceProvider<TService> {\n readonly key: ServiceKey<TService>\n readonly create: ServiceFactory<TService>\n readonly [serviceProviderType]: true\n}\n\nconst serviceKeys = new WeakSet<object>()\nconst serviceProviders = new WeakSet<object>()\n\n/** Declare a typed service identity without selecting an implementation. */\nexport function defineService<TService>(name: string): ServiceKey<TService> {\n if (typeof name !== 'string' || name.trim() === '') {\n throw new TypeError('Service name must be a non-empty string')\n }\n const key = Object.freeze({name: name.trim()}) as ServiceKey<TService>\n serviceKeys.add(key)\n return key\n}\n\n/** Select the factory for a service in one application composition root. */\nexport function provideService<TService>(\n key: ServiceKey<TService>,\n create: ServiceFactory<TService>,\n): ServiceProvider<TService> {\n assertServiceKey(key)\n if (typeof create !== 'function') {\n throw new TypeError(`Service provider \"${key.name}\" requires a factory function`)\n }\n const provider = Object.freeze({key, create}) as ServiceProvider<TService>\n serviceProviders.add(provider)\n return provider\n}\n\n/**\n * Explicit application service scope.\n *\n * Providers are fixed at construction. Each service is created lazily at most\n * once, shared inside this scope, and disposed in reverse creation order.\n */\nexport class ServiceScope implements ServiceResolver {\n private readonly providers = new Map<ServiceKey<unknown>, ServiceProvider<unknown>>()\n private readonly instances = new Map<ServiceKey<unknown>, unknown>()\n private readonly creationOrder: ServiceKey<unknown>[] = []\n private readonly resolving: ServiceKey<unknown>[] = []\n private disposed = false\n\n constructor(providers: readonly ServiceProvider<unknown>[] = []) {\n if (!Array.isArray(providers)) {\n throw new TypeError('ServiceScope providers must be an array')\n }\n for (const provider of providers) {\n assertServiceProvider(provider)\n if (this.providers.has(provider.key)) {\n throw new Error(`Service \"${provider.key.name}\" is registered more than once`)\n }\n this.providers.set(provider.key, provider)\n }\n }\n\n get isDisposed(): boolean {\n return this.disposed\n }\n\n has(key: ServiceKey<unknown>): boolean {\n this.assertActive()\n assertServiceKey(key)\n return this.providers.has(key)\n }\n\n require<TService>(key: ServiceKey<TService>): TService {\n this.assertActive()\n assertServiceKey(key)\n if (this.instances.has(key)) return this.instances.get(key) as TService\n\n const provider = this.providers.get(key) as ServiceProvider<TService> | undefined\n if (provider == null) throw new Error(`Service \"${key.name}\" is not registered`)\n\n const cycleStart = this.resolving.indexOf(key)\n if (cycleStart >= 0) {\n const cycle = [...this.resolving.slice(cycleStart), key]\n .map((entry) => entry.name)\n .join(' -> ')\n throw new Error(`Circular service dependency: ${cycle}`)\n }\n\n this.resolving.push(key)\n try {\n const instance = provider.create(this)\n this.instances.set(key, instance)\n this.creationOrder.push(key)\n return instance\n } finally {\n this.resolving.pop()\n }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n const errors: unknown[] = []\n for (const key of [...this.creationOrder].reverse()) {\n const instance = this.instances.get(key)\n try {\n const dispose = readDispose(instance)\n if (dispose != null) dispose.call(instance)\n } catch (error) {\n errors.push(error)\n }\n }\n this.instances.clear()\n this.creationOrder.length = 0\n this.resolving.length = 0\n if (errors.length === 1) throw errors[0]\n if (errors.length > 1) {\n throw new AggregateError(errors, 'Several services failed during disposal')\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('ServiceScope has been disposed')\n }\n}\n\nexport function createServiceScope(\n providers: readonly ServiceProvider<unknown>[] = [],\n): ServiceScope {\n return new ServiceScope(providers)\n}\n\nfunction isServiceKey(value: unknown): value is ServiceKey<unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && serviceKeys.has(value as object)\n}\n\nfunction assertServiceKey(value: unknown): asserts value is ServiceKey<unknown> {\n if (!isServiceKey(value)) throw new TypeError('Expected a service key created by defineService()')\n}\n\nfunction assertServiceProvider(\n value: unknown,\n): asserts value is ServiceProvider<unknown> {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || !serviceProviders.has(value as object)) {\n throw new TypeError('Expected a service provider created by provideService()')\n }\n}\n\nfunction readDispose(value: unknown): (() => void) | null {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) return null\n const dispose = Reflect.get(value, 'dispose')\n return typeof dispose === 'function' ? dispose as () => void : null\n}\n","import type {\n Component,\n ComponentDependency,\n} from './Components/component.js'\nimport {\n createStyleRegistry,\n styleRegistry,\n} from './styling/styleRegistry.js'\nimport type {StyleRegistry} from './styling/styleRegistry.js'\nimport {ServiceScope, createServiceScope} from './services.js'\nimport type {BrowserRouter} from './routing/router.js'\n\nconst RESERVED_CUSTOM_ELEMENT_NAMES = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n])\n\nexport interface FrayRuntimeOptions {\n /** Service scope inherited by every component created or mounted here. */\n services?: ServiceScope\n /** Optional caller-owned browser router inherited by routed components. */\n router?: BrowserRouter\n}\n\n/** Immutable application scope for structural styles and browser services. */\nexport class FrayRuntime {\n readonly styleRegistry: StyleRegistry\n readonly services: ServiceScope\n readonly router: BrowserRouter | null\n private readonly routedRoots = new WeakSet<Component>()\n\n constructor(\n options: FrayRuntimeOptions = {},\n registry: StyleRegistry = createStyleRegistry(),\n ) {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('FrayRuntime options must be an object')\n }\n if (Object.hasOwn(options, 'elementNames')) {\n throw new TypeError('FrayRuntime no longer supports configurable element names')\n }\n this.styleRegistry = registry\n this.services = options.services ?? createServiceScope()\n if (!(this.services instanceof ServiceScope)) {\n throw new TypeError('Fray services must be a ServiceScope')\n }\n this.router = options.router ?? null\n if (this.router != null\n && (typeof this.router !== 'object'\n || typeof this.router.openScope !== 'function'\n || typeof this.router.completeScope !== 'function')) {\n throw new TypeError('Fray router must be a BrowserRouter')\n }\n }\n\n /** Resolve a fixed one-hyphen public host name for a built-in component. */\n resolveElementName(hostName: string): string {\n assertNamePart(hostName, 'Fray component host name')\n const resolved = `fray-${hostName.replaceAll('-', '')}`\n assertCustomElementName(resolved)\n return resolved\n }\n\n resolveHostSelector(\n selector: string,\n hostName: string,\n ): string {\n if (typeof selector !== 'string') throw new TypeError('Host selector must be a string')\n return selector.replaceAll('&', this.resolveElementName(hostName))\n }\n\n resolveHostCSS(\n cssText: string,\n hostName: string,\n ): string {\n if (typeof cssText !== 'string') throw new TypeError('Host CSS must be a string')\n return cssText.replaceAll('&', this.resolveElementName(hostName))\n }\n\n create<TArgs extends unknown[], TComponent extends Component>(\n componentType: new(...args: TArgs) => TComponent,\n ...args: TArgs\n ): TComponent {\n const component = new componentType(...args)\n component._setRuntime(this)\n return component\n }\n\n mount<TComponent extends Component>(\n component: TComponent,\n parent: ParentNode,\n before: Node | null = null,\n ): TComponent {\n component._setRuntime(this)\n let closeRouteScope: (() => void) | null = null\n if (this.router != null && !this.routedRoots.has(component)) {\n this.routedRoots.add(component)\n closeRouteScope = this.router.openScope(this.router.root, component)\n component.onCleanup(closeRouteScope)\n }\n try {\n component.mount(parent, before)\n if (this.router != null && closeRouteScope != null) {\n this.router.completeScope(this.router.root, component)\n }\n } catch (error) {\n closeRouteScope?.()\n throw error\n }\n return component\n }\n\n registerStyles(dependency: ComponentDependency): this {\n if (dependency == null || typeof dependency.registerStyles !== 'function') {\n throw new TypeError('registerStyles requires a Fray component dependency')\n }\n dependency.registerStyles(this)\n return this\n }\n\n injectStyles(targetDocument: Document = globalThis.document): HTMLStyleElement {\n return this.styleRegistry.injectAll(targetDocument)\n }\n}\n\nexport function createFrayRuntime(options: FrayRuntimeOptions = {}): FrayRuntime {\n return new FrayRuntime(options)\n}\n\n/** Runtime used by Component.new(), direct mount(), and the legacy styleRegistry export. */\nexport const defaultFrayRuntime = new FrayRuntime({}, styleRegistry)\n\nfunction assertNamePart(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(value)) {\n throw new TypeError(`${label} must be a lowercase kebab-case name`)\n }\n}\n\nfunction assertCustomElementName(value: unknown): asserts value is string {\n assertNamePart(value, 'Fray element name')\n if (!value.includes('-') || RESERVED_CUSTOM_ELEMENT_NAMES.has(value)) {\n throw new TypeError(`Fray element name must be a non-reserved name containing a hyphen: ${value}`)\n }\n}\n","import type {\n EventBubble,\n FetchStateValue,\n ReadableEmitter,\n} from '@sylwellsoftware/glue'\n\nimport {FrayRuntime, defaultFrayRuntime} from '../runtime.js'\nimport type {ServiceKey} from '../services.js'\nimport type {ResolvedRoute} from '../routing/router.js'\n\nexport const Fragment = Symbol.for('@sylwellsoftware/fray.Fragment')\n\nexport type Key = string | number\n\nexport interface ComponentProps {\n key?: Key | null\n children?: FrayChild | readonly FrayChild[]\n class?: string | null\n className?: string | null\n /** Opt this host into the theme-defined, non-nestable island treatment. */\n island?: boolean\n [name: string]: unknown\n}\n\nexport type Ref<TNode extends Node = Node> =\n | ((value: TNode | null) => void)\n | {current: TNode | null}\n\nexport type FunctionComponent<TProps extends ComponentProps = ComponentProps> = (\n props: TProps,\n) => FrayChild\n\nexport type ComponentConstructor<\n TProps extends ComponentProps = ComponentProps,\n TInstance extends Component<TProps> = Component<TProps>,\n> = new(props: TProps) => TInstance\n\ntype AnyComponentConstructor = new(props?: never) => Component\ntype ConcreteComponentConstructor = new(...args: never[]) => Component\n\nexport type VNodeType<TProps extends ComponentProps = ComponentProps> =\n | string\n | typeof Fragment\n | ComponentConstructor<TProps>\n | FunctionComponent<TProps>\n\nexport interface VNode<TProps extends ComponentProps = ComponentProps> {\n readonly type: string | typeof Fragment | Function\n readonly key: Key | null\n readonly props: TProps & {children: NormalizedChild[]}\n}\n\nexport type FrayChild =\n | string\n | number\n | boolean\n | null\n | undefined\n | VNode\n | Component\n | ReadableEmitter<FrayChild, unknown>\n | readonly FrayChild[]\n\ntype NormalizedChild = string | number | VNode | Component | ReadableEmitter<FrayChild, unknown>\n\ndeclare const liveBindingBrand: unique symbol\n\n/** Explicitly subscribe a DOM or component property to an emitter's current value. */\nexport interface LiveBinding<TValue> {\n readonly emitter: ReadableEmitter<TValue, unknown>\n readonly [liveBindingBrand]: true\n}\n\n/** Minimal writable Glue contract used by native `bind:value` and `bind:checked`. */\nexport interface WritableEmitter<TValue, TError = unknown>\nextends ReadableEmitter<TValue, TError> {\n set(value: TValue, eventOrCause?: unknown): unknown\n}\n\nexport interface EmitterSnapshot<TValue, TError = unknown> {\n readonly value: TValue\n readonly fetchState: FetchStateValue\n readonly error: TError | null\n}\n\ndeclare const livePropContract: unique symbol\n\n/** Type-only declaration of the component props that accept `live()` bindings. */\nexport interface LivePropContract<TName extends string> {\n readonly [livePropContract]?: TName\n}\n\n/** Components opt in to every supported `live()` prop through LivePropContract. */\ntype DefaultLivePropName<_TProps extends ComponentProps> = never\n\ntype DeclaredLivePropName<TProps extends ComponentProps> =\n typeof livePropContract extends keyof TProps\n ? Extract<Exclude<TProps[typeof livePropContract], undefined>, keyof TProps>\n : DefaultLivePropName<TProps>\n\nexport type TemplateProps<TProps extends ComponentProps> = {\n [TName in keyof TProps as TName extends typeof livePropContract ? never : TName]:\n TName extends 'key' | 'children'\n ? TProps[TName]\n : TName extends DeclaredLivePropName<TProps>\n ? TProps[TName] | LiveBinding<Exclude<TProps[TName], undefined>>\n : TProps[TName]\n}\n\nexport interface ComponentDependency {\n registerStyles(runtime?: FrayRuntime, seen?: Set<ComponentDependency>): void\n}\n\ninterface Watchable {\n subscribe(\n listener: (notification: {event: EventBubble<unknown> | null}) => void,\n options?: {emitCurrent?: boolean},\n ): () => void\n}\n\nconst liveBindingValues = new WeakSet<object>()\n\nconst BOOLEAN_ATTRIBUTES = new Set([\n 'allowFullScreen',\n 'async',\n 'autoFocus',\n 'autoPlay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formNoValidate',\n 'hidden',\n 'inert',\n 'loop',\n 'multiple',\n 'muted',\n 'noModule',\n 'noValidate',\n 'open',\n 'playsInline',\n 'readOnly',\n 'required',\n 'reversed',\n 'selected',\n])\n\nconst PROPERTY_PROPS = new Set([\n 'checked',\n 'defaultChecked',\n 'defaultValue',\n 'disabled',\n 'indeterminate',\n 'multiple',\n 'muted',\n 'readOnly',\n 'required',\n 'selected',\n 'selectedIndex',\n 'tabIndex',\n 'value',\n])\n\nconst FRAY_RENDERER_ATTRIBUTE = 'data-fray'\n\n/** Mark an emitter as a one-way live value for a DOM or component property. */\nexport function live<TValue>(emitter: ReadableEmitter<TValue, unknown>): LiveBinding<TValue> {\n assertReadableEmitter(emitter, 'live')\n const binding = Object.freeze({emitter}) as LiveBinding<TValue>\n liveBindingValues.add(binding)\n return binding\n}\n\n/** Build a Fray virtual node. */\nexport function h<TProps extends ComponentProps = ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null = null,\n ...children: FrayChild[]\n): VNode<TProps> {\n const suppliedProps = props ?? {} as TemplateProps<TProps>\n if (typeof suppliedProps !== 'object' || Array.isArray(suppliedProps)) {\n throw new TypeError('VNode props must be an object or null')\n }\n const {\n children: propChildren,\n key = null,\n ...restProps\n } = suppliedProps\n return {\n type,\n key,\n props: {\n ...restProps,\n children: normalizeChildren([propChildren, children]),\n } as TProps & {children: NormalizedChild[]},\n }\n}\n\ntype LiveValue<TValue> = TValue | LiveBinding<Exclude<TValue, undefined>>\n\ntype AriaAttributes = {\n [TName in `aria-${string}`]?: LiveValue<string | number | boolean | null | undefined>\n}\n\ntype DataAttributes = {\n [TName in `data-${string}`]?: LiveValue<string | number | boolean | null | undefined>\n}\n\ninterface DOMEvents<TElement extends HTMLElement> {\n onClick?: ((event: MouseEvent & {currentTarget: TElement}) => void) | undefined\n onInput?: ((event: InputEvent & {currentTarget: TElement}) => void) | undefined\n onChange?: ((event: Event & {currentTarget: TElement}) => void) | undefined\n onKeyDown?: ((event: KeyboardEvent & {currentTarget: TElement}) => void) | undefined\n onKeyUp?: ((event: KeyboardEvent & {currentTarget: TElement}) => void) | undefined\n onFocus?: ((event: FocusEvent & {currentTarget: TElement}) => void) | undefined\n onBlur?: ((event: FocusEvent & {currentTarget: TElement}) => void) | undefined\n}\n\ntype FrayDOMProps<TElement extends HTMLElement> =\nOmit<ComponentProps, 'class' | 'className'>\n& DOMEvents<TElement>\n& AriaAttributes\n& DataAttributes\n& {\n class?: LiveValue<string | undefined>\n className?: LiveValue<string | undefined>\n for?: string | undefined\n htmlFor?: string | undefined\n ref?: Ref<TElement> | undefined\n style?: LiveValue<string | Record<string, string | number | null | undefined> | undefined>\n}\n\ntype LiveDOMProperties<TElement extends HTMLElement> = {\n [TName in keyof Omit<TElement, keyof ComponentProps | 'style' | 'children'>]?:\n LiveValue<TElement[TName] | undefined>\n}\n\ntype NativeValueBinding<TElement extends HTMLElement> =\n TElement extends HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n ? {'bind:value'?: WritableEmitter<string> | undefined}\n : {}\n\ntype NativeCheckedBinding<TElement extends HTMLElement> =\n TElement extends HTMLInputElement\n ? {'bind:checked'?: WritableEmitter<boolean> | undefined}\n : {}\n\nexport interface FrayHostElementTagNameMap {\n 'fray-content': HTMLElement\n 'fray-checkshell': HTMLElement\n 'fray-selectshell': HTMLElement\n 'fray-expander': HTMLElement\n 'fray-label': HTMLElement\n 'fray-options': HTMLElement\n 'fray-error': HTMLElement\n 'fray-toolbarcontent': HTMLElement\n 'fray-primary': HTMLElement\n 'fray-secondary': HTMLElement\n 'fray-progress': HTMLElement\n 'fray-inverse': HTMLElement\n 'fray-presets': HTMLElement\n 'fray-draghandle': HTMLElement\n 'fray-chart': HTMLElement\n 'fray-readout': HTMLElement\n 'fray-swatch': HTMLElement\n 'fray-summary': HTMLElement\n 'fray-scroller': HTMLElement\n 'fray-blocks': HTMLElement\n 'fray-blocklabel': HTMLElement\n 'fray-blockname': HTMLElement\n 'fray-blockgroup': HTMLElement\n 'fray-categoryhidecontent': HTMLElement\n 'fray-criteriongroups': HTMLElement\n 'fray-categorygroupcontent': HTMLElement\n 'fray-categories': HTMLElement\n 'fray-categoryoption': HTMLElement\n 'fray-categoryswatch': HTMLElement\n}\n\nexport type FrayElementTagNameMap = HTMLElementTagNameMap & FrayHostElementTagNameMap\n\nexport type FrayIntrinsicElements = {\n [TTag in keyof FrayElementTagNameMap]: FrayDOMProps<FrayElementTagNameMap[TTag]>\n & LiveDOMProperties<FrayElementTagNameMap[TTag]>\n & NativeValueBinding<FrayElementTagNameMap[TTag]>\n & NativeCheckedBinding<FrayElementTagNameMap[TTag]>\n}\n\n/** Classic JSX type namespace for consumers configured with `jsxFactory: \"h\"`. */\nexport namespace h {\n export namespace JSX {\n export type Element = VNode | Component\n export interface ElementClass extends Component {}\n export interface ElementAttributesProperty {\n props: {}\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n export interface IntrinsicAttributes {\n key?: Key\n }\n export type LibraryManagedAttributes<_TComponent, TProps extends ComponentProps> =\n TemplateProps<TProps>\n export type IntrinsicElements = FrayIntrinsicElements\n }\n}\n\nexport function css(strings: TemplateStringsArray, ...values: unknown[]): string {\n return strings.reduce((result, string, index) =>\n result + string + String(values[index] ?? ''), '')\n}\n\nexport class Component<TProps extends ComponentProps = ComponentProps> {\n static dependencies: ComponentDependency[] = []\n static requiredServices: readonly ServiceKey<unknown>[] = []\n /** Component `live()` bindings are opt-in; subclasses declare their allowlist. */\n static liveProps: readonly string[] | null = []\n static css = css`\n .fray-fill-horizontal,\n .fray-fill-vertical {\n box-sizing: border-box;\n background: var(--application-background);\n color: var(--ui-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n line-height: var(--line-height);\n }\n\n .fray-fill-horizontal {\n width: 100vw;\n max-width: 100vw;\n min-width: 0;\n overflow-x: auto;\n }\n\n .fray-fill-vertical {\n height: 100vh;\n max-height: 100vh;\n min-height: 0;\n overflow-y: auto;\n }\n\n .colored {\n background: linear-gradient(15deg, var(--c1) 0%, var(--c2) 65%, var(--c2) 65%, var(--c3) 100%);\n box-shadow: var(--colored-shadow);\n border-radius: var(--ui-border-radius);\n }\n\n .island {\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n margin: var(--island-margin);\n padding: var(--island-padding);\n background: var(--island-background);\n border: var(--island-border);\n border-radius: var(--island-radius);\n box-shadow: var(--island-shadow);\n }\n\n .fray-fill-horizontal.island,\n .fray-fill-horizontal .island {\n max-width: calc(100% - (2 * var(--island-margin)));\n overflow-x: auto;\n }\n\n .fray-fill-vertical.island,\n .fray-fill-vertical .island {\n max-height: calc(100% - (2 * var(--island-margin)));\n overflow-y: auto;\n }\n `\n static hostName: string | null = null\n\n static new<TConstructor extends ConcreteComponentConstructor>(\n this: TConstructor,\n ...args: ConstructorParameters<TConstructor>\n ): InstanceType<TConstructor> {\n const instance = new this(...args)\n if (!(instance instanceof Component)) {\n throw new TypeError('Component.new() requires a Component constructor')\n }\n return instance.mount() as InstanceType<TConstructor>\n }\n\n static registerStyles(\n this: ComponentDependency & {\n css?: string\n dependencies?: ComponentDependency[]\n hostName?: string | null\n },\n runtime: FrayRuntime = defaultFrayRuntime,\n seen: Set<ComponentDependency> = new Set(),\n ): void {\n if (seen.has(this)) return\n seen.add(this)\n\n const concreteHostName = this.hostName ?? null\n const styleChain = componentStyleChain(this)\n for (const owner of styleChain) {\n if (Object.hasOwn(owner, 'css') && owner.css) {\n if (concreteHostName == null) {\n runtime.styleRegistry.registerCSS(owner.css)\n } else {\n runtime.styleRegistry.registerHostCSS(\n owner.css,\n runtime.resolveElementName(concreteHostName),\n )\n }\n }\n }\n for (const owner of styleChain) {\n if (!Object.hasOwn(owner, 'dependencies')) continue\n for (const dependency of owner.dependencies ?? []) {\n dependency.registerStyles(runtime, seen)\n }\n }\n }\n\n props: TProps\n dom: ChildNode | null = null\n /** @internal */\n _rendered: RenderRecord | null = null\n /** @internal */\n readonly _childComponents = new Set<Component>()\n /** @internal Component ancestry used to enforce structural invariants. */\n _parentComponent: Component | null = null\n private initialized = false\n private mounted = false\n private destroyed = false\n private updating = false\n private updateRequested = false\n private readonly cleanupFunctions = new Set<() => void>()\n private readonly watched = new Map<Watchable, () => void>()\n private readonly renderReadSubscriptions = new Map<Watchable, () => void>()\n private collectingRenderReads: Set<Watchable> | null = null\n /** @internal */\n _runtime: FrayRuntime = defaultFrayRuntime\n /** @internal Route lineage inherited by nested routed components. */\n _routeContext: ResolvedRoute | null = null\n\n constructor(props: TProps = {} as TProps) {\n if (props == null || typeof props !== 'object' || Array.isArray(props)) {\n throw new TypeError(`${this.constructor.name} props must be an object`)\n }\n this.props = props\n }\n\n /** One-time setup hook. Constructors must not subscribe or render. */\n initialize(): void {}\n\n render(): FrayChild {\n throw new Error(`${this.constructor.name} must implement render()`)\n }\n\n /** Render this component's configured custom host element. */\n protected host(props: ComponentProps | null = null, ...children: FrayChild[]): VNode {\n const componentType = this.constructor as typeof Component\n const hostName = componentType.hostName\n if (hostName == null) {\n throw new Error(`${this.constructor.name} does not declare a custom host name`)\n }\n const {\n class: classAlias,\n className: suppliedClassName,\n ...hostProps\n } = props ?? {}\n const componentClassName = suppliedClassName ?? classAlias\n const className = this.props.island === true\n ? mergeClassNames(componentClassName, 'island')\n : componentClassName\n return h(this._runtime.resolveElementName(hostName), {\n ...hostProps,\n ...(className == null ? {} : {className}),\n 'data-fray-component': hostName,\n }, ...children)\n }\n\n /** JSX component for this instance's runtime-configured custom host. */\n protected readonly Host: (props: ComponentProps) => VNode = ({\n children = [],\n ...props\n }) => this.host(props, children)\n\n /** @internal Assign an immutable application runtime before initialization or mounting. */\n _setRuntime(runtime: FrayRuntime): this {\n if (!(runtime instanceof FrayRuntime)) {\n throw new TypeError('Component runtime must be a FrayRuntime')\n }\n if (runtime === this._runtime) return this\n if (this.initialized || this.mounted || this._rendered != null) {\n throw new Error('Cannot change a component runtime after initialization')\n }\n this._runtime = runtime\n if (this._routeContext == null) this._routeContext = runtime.router?.root ?? null\n return this\n }\n\n /** @internal Assign contextual route lineage before initialization. */\n _setRouteContext(context: ResolvedRoute | null): this {\n if (this.initialized || this.mounted || this._rendered != null) {\n throw new Error('Cannot change a component route context after initialization')\n }\n this._routeContext = context\n return this\n }\n\n /** @internal Route lineage inherited by component children. */\n _routeContextForChildren(): ResolvedRoute | null {\n return this._routeContext\n }\n\n /** @internal Assign the renderer-owned component ancestry. */\n _setParentComponent(parent: Component): this {\n if (this._parentComponent != null && this._parentComponent !== parent) {\n throw new Error('A component instance cannot move between component owners')\n }\n this._parentComponent = parent\n this.validateIslandAncestry(this.props)\n return this\n }\n\n mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (this.destroyed) throw new Error('Cannot mount a destroyed component')\n this.validateIslandAncestry(this.props)\n let mountedNow = false\n if (!this.initialized) {\n this.validateRequiredServices()\n this.initialized = true\n this.initialize()\n }\n if (!this.mounted) {\n this.mounted = true\n this.update()\n mountedNow = true\n }\n if (parent != null) {\n assertParentNode(parent)\n insertRecord(parent, this._rendered, before)\n }\n if (mountedNow) this.afterMount(this.dom)\n return this\n }\n\n attachTo(parent: ParentNode): this {\n this.mount(parent)\n return this\n }\n\n update(_event?: unknown): this {\n if (this.destroyed) return this\n if (!this.mounted) return this.mount()\n if (this.updating) {\n this.updateRequested = true\n return this\n }\n\n this.updating = true\n try {\n do {\n this.updateRequested = false\n const nextReads = new Set<Watchable>()\n this.collectingRenderReads = nextReads\n let nextVNode: NormalizedChild\n try {\n nextVNode = normalizeRoot(this.render())\n } finally {\n this.collectingRenderReads = null\n }\n this._rendered = patchRoot(this._rendered, nextVNode, this)\n this.dom = firstNode(this._rendered)\n this.reconcileRenderReads(nextReads)\n this.afterUpdate(this.dom)\n } while (this.updateRequested && !this.destroyed)\n } finally {\n this.updating = false\n }\n return this\n }\n\n setProps(nextProps: TProps): this {\n if (nextProps == null || typeof nextProps !== 'object' || Array.isArray(nextProps)) {\n throw new TypeError(`${this.constructor.name} props must be an object`)\n }\n this.validateIslandAncestry(nextProps)\n this.props = nextProps\n if (this.mounted) this.update()\n return this\n }\n\n afterMount(_dom: ChildNode | null): void {}\n afterUpdate(_dom: ChildNode | null): void {}\n\n watch(...observables: Watchable[]): this {\n for (const observable of observables) {\n if (observable == null || typeof observable.subscribe !== 'function') {\n throw new TypeError('watch requires emitter-like values')\n }\n if (this.watched.has(observable)) continue\n const unsubscribe = observable.subscribe(({event}) => {\n if (this.mounted && !this.destroyed) this.update(event)\n }, {emitCurrent: false})\n this.watched.set(observable, unsubscribe)\n this.onCleanup(() => {\n unsubscribe()\n this.watched.delete(observable)\n })\n }\n return this\n }\n\n watchFutureValues(...observables: Watchable[]): this {\n return this.watch(...observables)\n }\n\n /** Read an emitter during render and rerender when that dependency changes. */\n read<TValue, TError>(emitter: ReadableEmitter<TValue, TError>): TValue {\n this.trackRenderRead(emitter)\n return emitter.get()\n }\n\n /** Read a Glue value, fetch state, and error as one tracked render dependency. */\n snapshot<TValue, TError>(\n emitter: ReadableEmitter<TValue, TError>,\n ): EmitterSnapshot<TValue, TError> {\n this.trackRenderRead(emitter)\n return Object.freeze({\n value: emitter.get(),\n fetchState: emitter.getFetchState(),\n error: emitter.getError(),\n })\n }\n\n onCleanup(cleanup: () => void): () => void {\n if (typeof cleanup !== 'function') throw new TypeError('cleanup must be a function')\n if (this.destroyed) {\n cleanup()\n return () => {}\n }\n this.cleanupFunctions.add(cleanup)\n let active = true\n return () => {\n if (!active) return\n active = false\n this.cleanupFunctions.delete(cleanup)\n cleanup()\n }\n }\n\n /** Resolve one explicitly declared application service from this component's runtime. */\n protected requireService<TService>(key: ServiceKey<TService>): TService {\n if (!this.initialized) {\n throw new Error('Components may resolve services during initialize() or later')\n }\n const componentType = this.constructor as typeof Component\n if (!componentType.requiredServices.includes(key)) {\n throw new Error(\n `${componentType.name} must declare service \"${key.name}\" in requiredServices`,\n )\n }\n return this._runtime.services.require(key)\n }\n\n listen<TEvent extends Event = Event>(\n target: EventTarget,\n type: string,\n listener: (event: TEvent) => void,\n options?: boolean | AddEventListenerOptions,\n ): this {\n if (target == null || typeof target.addEventListener !== 'function') {\n throw new TypeError('listen target must be an EventTarget')\n }\n const eventListener = listener as EventListener\n target.addEventListener(type, eventListener, options)\n this.onCleanup(() => target.removeEventListener(type, eventListener, options))\n return this\n }\n\n registerChild<TComponent extends Component>(component: TComponent): TComponent {\n if (!(component instanceof Component)) {\n throw new TypeError('registerChild requires a Component')\n }\n this._childComponents.add(component)\n return component\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.mounted = false\n\n for (const cleanup of [...this.cleanupFunctions]) cleanup()\n this.cleanupFunctions.clear()\n this.watched.clear()\n for (const unsubscribe of this.renderReadSubscriptions.values()) unsubscribe()\n this.renderReadSubscriptions.clear()\n this.collectingRenderReads = null\n\n if (this._rendered) disposeRecord(this._rendered, true)\n this._rendered = null\n this.dom = null\n this._childComponents.clear()\n this.onDestroy()\n }\n\n private validateRequiredServices(): void {\n const componentType = this.constructor as typeof Component\n for (const key of componentType.requiredServices) {\n if (!this._runtime.services.has(key)) {\n throw new Error(`${componentType.name} requires unregistered service \"${key.name}\"`)\n }\n }\n }\n\n private validateIslandAncestry(props: ComponentProps): void {\n if (!hasIslandTrait(props)) return\n if (this.hasIslandDescendant()) {\n throw new Error('An island component cannot contain another island')\n }\n let ancestor = this._parentComponent\n while (ancestor != null) {\n if (hasIslandTrait(ancestor.props)) {\n throw new Error('An island component cannot be nested inside another island')\n }\n ancestor = ancestor._parentComponent\n }\n }\n\n private hasIslandDescendant(): boolean {\n for (const child of this._childComponents) {\n if (hasIslandTrait(child.props) || child.hasIslandDescendant()) return true\n }\n return false\n }\n\n onDestroy(): void {}\n\n private trackRenderRead(emitter: ReadableEmitter<unknown, unknown>): void {\n assertReadableEmitter(emitter, 'Component.read')\n if (this.collectingRenderReads == null) {\n throw new Error('Component.read() and snapshot() may only be called during render()')\n }\n this.collectingRenderReads.add(emitter)\n }\n\n private reconcileRenderReads(nextReads: Set<Watchable>): void {\n for (const [emitter, unsubscribe] of this.renderReadSubscriptions) {\n if (nextReads.has(emitter)) continue\n unsubscribe()\n this.renderReadSubscriptions.delete(emitter)\n }\n for (const emitter of nextReads) {\n if (this.watched.has(emitter) || this.renderReadSubscriptions.has(emitter)) continue\n const unsubscribe = emitter.subscribe(({event}) => {\n if (this.mounted && !this.destroyed) this.update(event)\n }, {emitCurrent: false})\n this.renderReadSubscriptions.set(emitter, unsubscribe)\n }\n }\n}\n\ninterface RecordBase {\n readonly kind: string\n key: Key | null\n owner: Component\n}\n\ninterface TextRecord extends RecordBase {\n readonly kind: 'text'\n value: string | number\n node: Text\n}\n\ninterface EmitterRecord extends RecordBase {\n readonly kind: 'emitter'\n source: ReadableEmitter<FrayChild, unknown>\n start: Comment\n end: Comment\n child: RenderRecord\n unsubscribe: () => void\n}\n\ninterface LivePropRecord {\n source: ReadableEmitter<unknown, unknown>\n value: unknown\n unsubscribe: () => void\n}\n\ninterface NativeBindingRecord extends LivePropRecord {\n eventName: 'input' | 'change'\n listener: EventListener\n}\n\ninterface ElementRecord extends RecordBase {\n readonly kind: 'element'\n type: string\n node: HTMLElement\n props: ComponentProps\n listeners: Map<string, EventListener>\n liveProps: Map<string, LivePropRecord>\n nativeBindings: Map<string, NativeBindingRecord>\n ref: Ref<HTMLElement> | null\n children: RenderRecord[]\n}\n\ninterface FragmentRecord extends RecordBase {\n readonly kind: 'fragment'\n type: typeof Fragment\n start: Comment\n end: Comment\n children: RenderRecord[]\n}\n\ninterface ComponentRecord extends RecordBase {\n readonly kind: 'component'\n type: Function\n instance: Component\n prebuilt: boolean\n props: ComponentProps\n liveProps: Map<string, LivePropRecord>\n}\n\ninterface FunctionRecord extends RecordBase {\n readonly kind: 'function'\n type: FunctionComponent\n props: ComponentProps\n sourceProps: ComponentProps\n liveProps: Map<string, LivePropRecord>\n child: RenderRecord\n}\n\ntype RenderRecord =\n | TextRecord\n | EmitterRecord\n | ElementRecord\n | FragmentRecord\n | ComponentRecord\n | FunctionRecord\n\nfunction normalizeRoot(value: FrayChild): NormalizedChild {\n if (Array.isArray(value)) return h(Fragment, null, value)\n if (value == null || typeof value === 'boolean') return h(Fragment)\n return value as NormalizedChild\n}\n\nfunction normalizeChildren(values: FrayChild | readonly FrayChild[]): NormalizedChild[] {\n const normalized: NormalizedChild[] = []\n const visit = (value: FrayChild): void => {\n if (Array.isArray(value)) {\n for (const child of value) visit(child)\n } else if (value != null && typeof value !== 'boolean') {\n normalized.push(value as NormalizedChild)\n }\n }\n visit(values)\n return normalized\n}\n\nfunction createRecord(value: NormalizedChild, owner: Component): RenderRecord {\n if (typeof value === 'string' || typeof value === 'number') {\n return {\n kind: 'text',\n key: null,\n value,\n node: document.createTextNode(String(value)),\n owner,\n }\n }\n\n if (isReadableEmitter(value)) {\n const start = document.createComment('fray-emitter-start')\n const end = document.createComment('fray-emitter-end')\n const current = value.get()\n if (Object.is(current, value)) {\n throw new TypeError('A Fray emitter child cannot render itself')\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\n const child = createRecord(normalizeRoot(current), owner)\n insertRecord(fragment, child, end)\n const record: EmitterRecord = {\n kind: 'emitter',\n key: null,\n source: value,\n start,\n end,\n child,\n unsubscribe: () => {},\n owner,\n }\n record.unsubscribe = value.subscribe(({value: nextValue}) => {\n if (Object.is(nextValue, value)) {\n throw new TypeError('A Fray emitter child cannot render itself')\n }\n record.child = patchRoot(record.child, normalizeRoot(nextValue), owner)\n }, {emitCurrent: false})\n return record\n }\n\n if (value instanceof Component) {\n value._setRuntime(owner._runtime)\n value._setRouteContext(owner._routeContextForChildren())\n value._setParentComponent(owner)\n value.mount()\n owner.registerChild(value)\n return {\n kind: 'component',\n key: readKey(value.props),\n type: value.constructor,\n instance: value,\n prebuilt: true,\n props: value.props,\n liveProps: new Map(),\n owner,\n }\n }\n\n if (!isVNode(value)) {\n throw new TypeError(`Invalid Fray child: ${describeValue(value)}`)\n }\n\n const {type, key = null, props} = value\n if (type === Fragment) {\n const start = document.createComment('fray-fragment-start')\n const end = document.createComment('fray-fragment-end')\n const record: FragmentRecord = {\n kind: 'fragment',\n key,\n type,\n start,\n end,\n children: [],\n owner,\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\n record.children = patchChildren(\n fragment,\n [],\n props.children,\n owner,\n end,\n start,\n )\n return record\n }\n\n if (typeof type === 'string') {\n const node = document.createElement(type)\n const record: ElementRecord = {\n kind: 'element',\n key,\n type,\n node,\n props: {},\n listeners: new Map(),\n liveProps: new Map(),\n nativeBindings: new Map(),\n ref: null,\n children: [],\n owner,\n }\n patchElementProps(record, props)\n record.children = patchChildren(node, [], props.children, owner)\n return record\n }\n\n if (isComponentClass(type)) {\n const sourceProps = props as ComponentProps\n assertSupportedComponentLiveProps(type, sourceProps)\n const resolvedProps = resolveLivePropValues(sourceProps)\n const instance = new type(resolvedProps as never)\n instance._setRuntime(owner._runtime)\n instance._setRouteContext(owner._routeContextForChildren())\n instance._setParentComponent(owner)\n const record: ComponentRecord = {\n kind: 'component',\n key,\n type,\n instance,\n prebuilt: false,\n props: resolvedProps,\n liveProps: new Map(),\n owner,\n }\n subscribeComponentLiveProps(record, sourceProps)\n instance.mount()\n owner.registerChild(instance)\n return record\n }\n\n if (typeof type === 'function') {\n const functionType = type as FunctionComponent\n const sourceProps = props as ComponentProps\n const functionProps = resolveLivePropValues(sourceProps)\n const rendered = normalizeRoot(functionType(functionProps))\n const record: FunctionRecord = {\n kind: 'function',\n key,\n type: functionType,\n props: functionProps,\n sourceProps,\n liveProps: new Map(),\n child: createRecord(rendered, owner),\n owner,\n }\n subscribeFunctionLiveProps(record)\n return record\n }\n\n throw new TypeError(`Unsupported vnode type: ${describeValue(type)}`)\n}\n\nfunction patchRoot(\n previous: RenderRecord | null,\n value: NormalizedChild,\n owner: Component,\n): RenderRecord {\n if (previous == null) return createRecord(value, owner)\n if (isCompatible(previous, value)) return patchCompatible(previous, value, owner)\n\n const next = createRecord(value, owner)\n const anchor = firstNode(previous)\n const parent = anchor?.parentNode ?? null\n if (parent) insertRecord(parent, next, anchor)\n disposeRecord(previous, true)\n return next\n}\n\nfunction patchCompatible(\n record: RenderRecord,\n value: NormalizedChild,\n owner: Component,\n): RenderRecord {\n if (record.kind === 'text') {\n if (typeof value !== 'string' && typeof value !== 'number') return record\n if (!Object.is(record.value, value)) {\n record.value = value\n record.node.data = String(value)\n }\n return record\n }\n\n if (record.kind === 'emitter') {\n if (!isReadableEmitter(value) || record.source !== value) return record\n return record\n }\n\n if (record.kind === 'component') {\n if (value instanceof Component) return record\n if (isVNode(value)) patchComponentLiveProps(record, value.props)\n return record\n }\n\n if (!isVNode(value)) return record\n\n if (record.kind === 'function') {\n patchFunctionLiveProps(record, value.props)\n return record\n }\n\n if (record.kind === 'fragment') {\n record.children = patchChildren(\n record.start.parentNode,\n record.children,\n value.props.children,\n owner,\n record.end,\n record.start,\n )\n return record\n }\n\n patchElementProps(record, value.props)\n record.children = patchChildren(\n record.node,\n record.children,\n value.props.children,\n owner,\n )\n return record\n}\n\nfunction resolveLivePropValues(sourceProps: ComponentProps): ComponentProps {\n return Object.fromEntries(Object.entries(sourceProps).map(([key, value]) => [\n key,\n isLiveBinding(value) ? value.emitter.get() : value,\n ]))\n}\n\nfunction subscribeComponentLiveProps(\n record: ComponentRecord,\n sourceProps: ComponentProps,\n): void {\n reconcileLiveProps(record.liveProps, sourceProps, (key, value) => {\n record.props = {...record.props, [key]: value}\n record.instance.setProps(record.props)\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n record.instance.setProps(record.props)\n}\n\nfunction patchComponentLiveProps(record: ComponentRecord, sourceProps: ComponentProps): void {\n assertSupportedComponentLiveProps(record.type, sourceProps)\n subscribeComponentLiveProps(record, sourceProps)\n}\n\nfunction assertSupportedComponentLiveProps(\n componentType: Function,\n sourceProps: ComponentProps,\n): void {\n const declared = Reflect.get(componentType, 'liveProps') as unknown\n if (declared == null) return\n if (!Array.isArray(declared) || declared.some((name) => typeof name !== 'string')) {\n throw new TypeError(`${componentType.name || 'Component'}.liveProps must be an array`)\n }\n const supported = new Set<string>(declared)\n for (const [name, value] of Object.entries(sourceProps)) {\n if (isLiveBinding(value) && !supported.has(name)) {\n throw new TypeError(\n `${componentType.name || 'Component'} prop \"${name}\" does not support live()`,\n )\n }\n }\n}\n\nfunction subscribeFunctionLiveProps(record: FunctionRecord): void {\n reconcileLiveProps(record.liveProps, record.sourceProps, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record)\n })\n record.props = resolvedLiveProps(record.liveProps, record.sourceProps)\n}\n\nfunction patchFunctionLiveProps(record: FunctionRecord, sourceProps: ComponentProps): void {\n record.sourceProps = sourceProps\n reconcileLiveProps(record.liveProps, sourceProps, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record)\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n rerenderFunctionRecord(record)\n}\n\nfunction rerenderFunctionRecord(record: FunctionRecord): void {\n const rendered = normalizeRoot(record.type(record.props))\n record.child = patchRoot(record.child, rendered, record.owner)\n}\n\nfunction reconcileLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\n onValue: (key: string, value: unknown) => void,\n): void {\n for (const [key, existing] of subscriptions) {\n const next = sourceProps[key]\n if (isLiveBinding(next) && next.emitter === existing.source) continue\n existing.unsubscribe()\n subscriptions.delete(key)\n }\n\n for (const [key, value] of Object.entries(sourceProps)) {\n if (!isLiveBinding(value) || subscriptions.has(key)) continue\n const liveProp: LivePropRecord = {\n source: value.emitter,\n value: value.emitter.get(),\n unsubscribe: () => {},\n }\n liveProp.unsubscribe = value.emitter.subscribe(({value: nextValue}) => {\n if (subscriptions.get(key) !== liveProp) return\n liveProp.value = nextValue\n onValue(key, nextValue)\n }, {emitCurrent: false})\n subscriptions.set(key, liveProp)\n }\n}\n\nfunction resolvedLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\n): ComponentProps {\n return Object.fromEntries(Object.entries(sourceProps).map(([key, value]) => [\n key,\n isLiveBinding(value) ? subscriptions.get(key)?.value ?? value.emitter.get() : value,\n ]))\n}\n\nfunction patchChildren(\n parent: ParentNode | null,\n previous: RenderRecord[],\n values: FrayChild | readonly FrayChild[],\n owner: Component,\n end: Node | null = null,\n start: Node | null = null,\n): RenderRecord[] {\n if (parent == null) throw new Error('Cannot patch a detached fragment range')\n const nextValues = normalizeChildren(values)\n const keyed = new Map<Key, RenderRecord>()\n const unkeyed: RenderRecord[] = []\n for (const record of previous) {\n if (record.key == null) unkeyed.push(record)\n else if (!keyed.has(record.key)) keyed.set(record.key, record)\n }\n\n const seenKeys = new Set<Key>()\n const retained = new Set<RenderRecord>()\n const nextRecords: RenderRecord[] = []\n let unkeyedIndex = 0\n\n for (const value of nextValues) {\n const key = valueKey(value)\n if (key != null) {\n if (seenKeys.has(key)) throw new Error(`Duplicate sibling key: ${String(key)}`)\n seenKeys.add(key)\n }\n const candidate = key == null\n ? unkeyed[unkeyedIndex++]\n : keyed.get(key)\n if (candidate && isCompatible(candidate, value)) {\n retained.add(candidate)\n nextRecords.push(patchCompatible(candidate, value, owner))\n } else {\n nextRecords.push(createRecord(value, owner))\n }\n }\n\n for (const record of previous) {\n if (!retained.has(record)) disposeRecord(record, true)\n }\n\n let cursor = start ? start.nextSibling : parent.firstChild\n for (const record of nextRecords) {\n for (const node of recordNodes(record)) {\n if (node === cursor) {\n cursor = cursor.nextSibling\n } else {\n parent.insertBefore(node, cursor ?? end)\n cursor = node.nextSibling\n }\n }\n }\n\n return nextRecords\n}\n\nfunction patchElementProps(record: ElementRecord, nextProps: ComponentProps): void {\n const next = Object.fromEntries(Object.entries(nextProps).filter(([key]) =>\n key !== 'children' && normalizeAttributeName(key) !== FRAY_RENDERER_ATTRIBUTE,\n )) as ComponentProps\n const previous = record.props\n const keys = new Set([...Object.keys(previous), ...Object.keys(next)])\n\n for (const property of ['value', 'checked'] as const) {\n if (Object.hasOwn(next, property) && Object.hasOwn(next, `bind:${property}`)) {\n throw new Error(`${property} and bind:${property} cannot be used together`)\n }\n }\n\n for (const key of keys) {\n const previousValue = previous[key]\n const nextValue = next[key]\n if (isNativeBindingProp(key)) {\n patchNativeBinding(record, key, nextValue)\n } else if (key === 'ref') {\n if (previousValue !== nextValue) patchRef(record, nextValue)\n } else if (isEventProp(key)) {\n patchEvent(record, key, nextValue)\n } else if (isLiveBinding(nextValue)) {\n patchLiveElementProp(record, key, nextValue)\n } else {\n const previousLive = record.liveProps.get(key)\n if (previousLive) {\n previousLive.unsubscribe()\n record.liveProps.delete(key)\n }\n const previousResolved = previousLive?.value ?? previousValue\n if (!Object.is(previousResolved, nextValue)) {\n patchDOMProp(record.node, key, previousResolved, nextValue)\n }\n }\n }\n record.node.setAttribute(FRAY_RENDERER_ATTRIBUTE, '')\n record.props = {...next}\n}\n\nfunction patchLiveElementProp(\n record: ElementRecord,\n key: string,\n binding: LiveBinding<unknown>,\n): void {\n const existing = record.liveProps.get(key)\n if (existing?.source === binding.emitter) return\n\n existing?.unsubscribe()\n const value = binding.emitter.get()\n patchDOMProp(record.node, key, existing?.value ?? record.props[key], value)\n const liveProp: LivePropRecord = {\n source: binding.emitter,\n value,\n unsubscribe: () => {},\n }\n liveProp.unsubscribe = binding.emitter.subscribe(({value: nextValue}) => {\n const previousValue = liveProp.value\n liveProp.value = nextValue\n if (!Object.is(previousValue, nextValue)) {\n patchDOMProp(record.node, key, previousValue, nextValue)\n }\n }, {emitCurrent: false})\n record.liveProps.set(key, liveProp)\n}\n\nfunction patchNativeBinding(\n record: ElementRecord,\n key: 'bind:value' | 'bind:checked',\n next: unknown,\n): void {\n const property = key.slice(5) as 'value' | 'checked'\n const existing = record.nativeBindings.get(key)\n if (next == null) {\n if (existing) {\n existing.unsubscribe()\n record.node.removeEventListener(existing.eventName, existing.listener)\n record.nativeBindings.delete(key)\n patchDOMProp(record.node, property, existing.value, undefined)\n }\n return\n }\n assertWritableEmitter(next, key)\n if (existing?.source === next) return\n\n if (existing) {\n existing.unsubscribe()\n record.node.removeEventListener(existing.eventName, existing.listener)\n }\n assertNativeBindingTarget(record.node, property)\n const eventName = nativeBindingEvent(record.node, property)\n const value = next.get()\n patchDOMProp(record.node, property, existing?.value, value)\n const listener: EventListener = () => {\n next.set(Reflect.get(record.node, property), `${key} changed`)\n }\n const binding: NativeBindingRecord = {\n source: next,\n value,\n eventName,\n listener,\n unsubscribe: () => {},\n }\n binding.unsubscribe = next.subscribe(({value: nextValue}) => {\n const previousValue = binding.value\n binding.value = nextValue\n if (!Object.is(previousValue, nextValue)) {\n patchDOMProp(record.node, property, previousValue, nextValue)\n }\n }, {emitCurrent: false})\n record.node.addEventListener(eventName, listener)\n record.nativeBindings.set(key, binding)\n}\n\nfunction patchEvent(record: ElementRecord, key: string, next: unknown): void {\n const eventName = key.slice(2).toLowerCase()\n const registered = record.listeners.get(key)\n if (registered && registered !== next) {\n record.node.removeEventListener(eventName, registered)\n record.listeners.delete(key)\n }\n if (next != null && typeof next !== 'function') {\n throw new TypeError(`${key} must be a function or null`)\n }\n if (typeof next === 'function' && registered !== next) {\n const listener = next as EventListener\n record.node.addEventListener(eventName, listener)\n record.listeners.set(key, listener)\n }\n}\n\nfunction patchRef(record: ElementRecord, next: unknown): void {\n applyRef(record.ref, null)\n if (next != null && typeof next !== 'function' && typeof next !== 'object') {\n throw new TypeError('ref must be a function, object, or null')\n }\n record.ref = next as Ref<HTMLElement> | null\n applyRef(record.ref, record.node)\n}\n\nfunction patchDOMProp(\n node: HTMLElement,\n key: string,\n previous: unknown,\n next: unknown,\n): void {\n if (key === 'class' || key === 'className') {\n setAttribute(node, 'class', next)\n return\n }\n if (key === 'for' || key === 'htmlFor') {\n setAttribute(node, 'for', next)\n return\n }\n if (key === 'dataset') {\n patchDataset(node, previous, next)\n return\n }\n if (key === 'style') {\n patchStyle(node, previous, next)\n return\n }\n if (key === 'dangerouslySetInnerHTML') {\n throw new Error('dangerouslySetInnerHTML is not supported')\n }\n\n const property = normalizePropertyName(key)\n if (BOOLEAN_ATTRIBUTES.has(property)) {\n const enabled = Boolean(next)\n if (property in node) Reflect.set(node, property, enabled)\n node.toggleAttribute(normalizeAttributeName(key), enabled)\n return\n }\n if (PROPERTY_PROPS.has(property) && property in node) {\n const value = next ?? (property === 'value' ? '' : false)\n if (!Object.is(Reflect.get(node, property), value)) Reflect.set(node, property, value)\n if (next == null) node.removeAttribute(normalizeAttributeName(key))\n return\n }\n\n setAttribute(node, normalizeAttributeName(key), next)\n}\n\nfunction patchDataset(node: HTMLElement, previous: unknown, next: unknown): void {\n const oldValues = toPropertyRecord(previous, 'dataset')\n const newValues = toPropertyRecord(next, 'dataset')\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (value == null) delete node.dataset[key]\n else node.dataset[key] = String(value)\n }\n}\n\nfunction patchStyle(node: HTMLElement, previous: unknown, next: unknown): void {\n if (typeof next === 'string') {\n node.style.cssText = next\n return\n }\n const oldValues = typeof previous === 'string'\n ? {}\n : toPropertyRecord(previous, 'style')\n const newValues = toPropertyRecord(next, 'style')\n if (typeof previous === 'string') node.style.cssText = ''\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (key.startsWith('--')) {\n if (value == null) node.style.removeProperty(key)\n else node.style.setProperty(key, String(value))\n } else {\n Reflect.set(node.style, key, value == null ? '' : String(value))\n }\n }\n}\n\nfunction toPropertyRecord(value: unknown, label: string): Record<string, unknown> {\n if (value == null) return {}\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object or null`)\n }\n return value as Record<string, unknown>\n}\n\nfunction setAttribute(node: HTMLElement, name: string, value: unknown): void {\n if (value == null || value === false) node.removeAttribute(name)\n else if (value === true) node.setAttribute(name, '')\n else node.setAttribute(name, String(value))\n}\n\nfunction normalizePropertyName(key: string): string {\n if (key === 'readonly') return 'readOnly'\n if (key === 'autofocus') return 'autoFocus'\n return key\n}\n\nfunction normalizeAttributeName(key: string): string {\n if (key === 'className') return 'class'\n if (key === 'htmlFor') return 'for'\n if (key === 'minLength') return 'minlength'\n if (key === 'maxLength') return 'maxlength'\n if (key === 'autoComplete') return 'autocomplete'\n if (key === 'inputMode') return 'inputmode'\n if (/^aria[A-Z]/.test(key)) return camelToKebab(key)\n if (/^data[A-Z]/.test(key)) return camelToKebab(key)\n return key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n}\n\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n}\n\nfunction applyRef<TNode extends Node>(ref: Ref<TNode> | null, value: TNode | null): void {\n if (ref == null) return\n if (typeof ref === 'function') ref(value)\n else ref.current = value\n}\n\nfunction disposeRecord(record: RenderRecord, removeNodes: boolean): void {\n if (record.kind === 'emitter') {\n record.unsubscribe()\n disposeRecord(record.child, false)\n if (removeNodes) {\n for (const node of recordNodes(record)) node.remove()\n }\n return\n }\n if (record.kind === 'component') {\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n record.owner._childComponents.delete(record.instance)\n record.instance.destroy()\n return\n }\n if (record.kind === 'function') {\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n disposeRecord(record.child, removeNodes)\n return\n }\n if (record.kind === 'element') {\n applyRef(record.ref, null)\n for (const [key, listener] of record.listeners) {\n record.node.removeEventListener(key.slice(2).toLowerCase(), listener)\n }\n record.listeners.clear()\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n for (const binding of record.nativeBindings.values()) {\n binding.unsubscribe()\n record.node.removeEventListener(binding.eventName, binding.listener)\n }\n record.nativeBindings.clear()\n for (const child of record.children) disposeRecord(child, false)\n if (removeNodes) record.node.remove()\n return\n }\n if (record.kind === 'fragment') {\n for (const child of record.children) disposeRecord(child, false)\n if (removeNodes) {\n for (const node of recordNodes(record)) node.remove()\n }\n return\n }\n if (removeNodes) record.node.remove()\n}\n\nfunction insertRecord(parent: ParentNode, record: RenderRecord | null, before: Node | null = null): void {\n if (record == null) return\n for (const node of recordNodes(record)) parent.insertBefore(node, before)\n}\n\nfunction recordNodes(record: RenderRecord | null): ChildNode[] {\n if (record == null) return []\n if (record.kind === 'text' || record.kind === 'element') return [record.node]\n if (record.kind === 'component') return recordNodes(record.instance._rendered)\n if (record.kind === 'function') return recordNodes(record.child)\n\n const nodes: ChildNode[] = []\n let node: ChildNode | null = record.start\n while (node) {\n nodes.push(node)\n if (node === record.end) break\n node = node.nextSibling\n }\n return nodes\n}\n\nfunction firstNode(record: RenderRecord | null): ChildNode | null {\n return recordNodes(record)[0] ?? null\n}\n\nfunction valueKey(value: NormalizedChild): Key | null {\n if (value instanceof Component) return readKey(value.props)\n return isVNode(value) ? value.key : null\n}\n\nfunction readKey(props: ComponentProps): Key | null {\n const key = props.key\n return typeof key === 'string' || typeof key === 'number' ? key : null\n}\n\nfunction isCompatible(record: RenderRecord, value: NormalizedChild): boolean {\n if (record.kind === 'text') {\n return typeof value === 'string' || typeof value === 'number'\n }\n if (record.kind === 'emitter') {\n return isReadableEmitter(value) && record.source === value\n }\n if (record.kind === 'component') {\n if (value instanceof Component) return record.instance === value\n return isVNode(value)\n && isComponentClass(value.type)\n && record.type === value.type\n && record.key === valueKey(value)\n }\n if (record.kind === 'function') {\n return isVNode(value)\n && record.type === value.type\n && record.key === valueKey(value)\n }\n if (record.kind === 'fragment') {\n return isVNode(value)\n && value.type === Fragment\n && record.key === valueKey(value)\n }\n return isVNode(value)\n && typeof value.type === 'string'\n && record.type === value.type\n && record.key === valueKey(value)\n}\n\nexport function isVNode(value: unknown): value is VNode {\n return value != null\n && typeof value === 'object'\n && Object.hasOwn(value, 'type')\n}\n\nfunction isComponentClass(value: unknown): value is AnyComponentConstructor {\n return typeof value === 'function'\n && (value === Component || value.prototype instanceof Component)\n}\n\nfunction isEventProp(key: string): boolean {\n return /^on[A-Z]/.test(key)\n}\n\nfunction isNativeBindingProp(key: string): key is 'bind:value' | 'bind:checked' {\n return key === 'bind:value' || key === 'bind:checked'\n}\n\nfunction isLiveBinding(value: unknown): value is LiveBinding<unknown> {\n return value != null\n && typeof value === 'object'\n && liveBindingValues.has(value)\n}\n\nfunction isReadableEmitter(value: unknown): value is ReadableEmitter<FrayChild, unknown> {\n if ((typeof value !== 'object' || value == null) && typeof value !== 'function') return false\n return typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction assertReadableEmitter(\n value: unknown,\n label: string,\n): asserts value is ReadableEmitter<unknown, unknown> {\n if (!isReadableEmitter(value)) throw new TypeError(`${label} requires a readable emitter`)\n}\n\nfunction assertWritableEmitter(\n value: unknown,\n label: string,\n): asserts value is WritableEmitter<unknown, unknown> {\n assertReadableEmitter(value, label)\n if (typeof Reflect.get(value, 'set') !== 'function') {\n throw new TypeError(`${label} requires a writable emitter`)\n }\n}\n\nfunction assertNativeBindingTarget(\n node: HTMLElement,\n property: 'value' | 'checked',\n): void {\n const tagName = node.localName\n const valid = property === 'checked'\n ? tagName === 'input'\n : tagName === 'input' || tagName === 'textarea' || tagName === 'select'\n if (!valid) throw new TypeError(`bind:${property} is not supported on ${tagName}`)\n}\n\nfunction nativeBindingEvent(\n node: HTMLElement,\n property: 'value' | 'checked',\n): 'input' | 'change' {\n return property === 'value' && node.localName !== 'select' ? 'input' : 'change'\n}\n\nfunction assertParentNode(value: unknown): asserts value is ParentNode {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'insertBefore') !== 'function') {\n throw new TypeError('Component parent must be a DOM ParentNode')\n }\n}\n\nfunction describeValue(value: unknown): string {\n try {\n return String(value)\n } catch {\n return Object.prototype.toString.call(value)\n }\n}\n\ninterface StyleOwner {\n css?: string\n dependencies?: ComponentDependency[]\n}\n\nfunction componentStyleChain(concrete: StyleOwner): StyleOwner[] {\n const chain: StyleOwner[] = []\n let owner: object | null = concrete\n while (owner != null && typeof owner === 'function') {\n chain.unshift(owner as unknown as StyleOwner)\n if (owner === Component) break\n owner = Object.getPrototypeOf(owner)\n }\n return chain\n}\n\nfunction mergeClassNames(...values: unknown[]): string {\n return [...new Set(values\n .flatMap((value) => typeof value === 'string' ? value.split(/\\s+/) : [])\n .filter(Boolean))]\n .join(' ')\n}\n\nfunction hasIslandTrait(props: ComponentProps): boolean {\n if (props.island === true) return true\n const className = props.className ?? props.class\n return typeof className === 'string' && className.split(/\\s+/).includes('island')\n}\n","import {\n Component,\n Fragment,\n h,\n} from './Components/component.js'\nimport type {\n ComponentProps,\n FrayIntrinsicElements,\n FrayChild,\n Key,\n TemplateProps,\n VNode,\n VNodeType,\n} from './Components/component.js'\n\nexport {Fragment}\n\nexport function jsx<TProps extends ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null,\n key?: Key,\n): VNode<TProps> {\n const nextProps: TemplateProps<TProps> = props == null\n ? {} as TemplateProps<TProps>\n : {...props}\n if (key !== undefined) nextProps.key = key\n return h(type, nextProps)\n}\n\nexport const jsxs = jsx\nexport const jsxDEV = jsx\n\n/** Preserve an explicitly constructed component instance in a vnode tree. */\nexport function createPrebuiltElement<TComponent extends Component>(\n component: TComponent,\n): TComponent {\n if (!(component instanceof Component)) {\n throw new TypeError('createPrebuiltElement requires a Component instance')\n }\n return component\n}\n\nexport namespace JSX {\n export type Element = VNode | Component\n export interface ElementClass extends Component {}\n export interface ElementAttributesProperty {\n props: {}\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n export interface IntrinsicAttributes {\n key?: Key\n }\n export type LibraryManagedAttributes<_TComponent, TProps extends ComponentProps> =\n TemplateProps<TProps>\n export type IntrinsicElements = FrayIntrinsicElements\n}\n\n// Used by declaration consumers that construct children without JSX.\nexport type JSXChild = FrayChild\n"],"names":["STYLE_ATTRIBUTE","nextRegistryId","StyleRegistry","id","__publicField","css","normalized","host","key","existing","fragment","resolveHostCSS","targetDocument","selector","escapeAttributeValue","style","createStyleRegistry","styleRegistry","value","hosts","output","cursor","openBrace","findBrace","closeBrace","findMatchingBrace","header","body","rule","expandHostSelectors","_a","_b","_c","leading","trailing","selectors","splitSelectors","continuationIndent","result","start","parentheses","brackets","quote","index","character","from","skipQuote","skipComment","depth","openQuote","openComment","closeComment","serviceKeys","serviceProviders","defineService","name","provideService","create","assertServiceKey","provider","ServiceScope","providers","assertServiceProvider","cycleStart","cycle","entry","instance","errors","dispose","readDispose","error","createServiceScope","isServiceKey","RESERVED_CUSTOM_ELEMENT_NAMES","FrayRuntime","options","registry","hostName","assertNamePart","resolved","assertCustomElementName","cssText","componentType","args","component","parent","before","closeRouteScope","dependency","createFrayRuntime","defaultFrayRuntime","label","Fragment","liveBindingValues","BOOLEAN_ATTRIBUTES","PROPERTY_PROPS","FRAY_RENDERER_ATTRIBUTE","live","emitter","assertReadableEmitter","binding","h","type","props","children","suppliedProps","propChildren","restProps","normalizeChildren","strings","values","string","_Component","runtime","seen","concreteHostName","styleChain","componentStyleChain","owner","classAlias","suppliedClassName","hostProps","componentClassName","className","mergeClassNames","context","mountedNow","assertParentNode","insertRecord","_event","nextReads","nextVNode","normalizeRoot","patchRoot","firstNode","nextProps","_dom","observables","observable","unsubscribe","event","cleanup","active","target","listener","eventListener","disposeRecord","hasIslandTrait","ancestor","child","Component","visit","createRecord","isReadableEmitter","end","current","record","nextValue","readKey","isVNode","describeValue","patchChildren","node","patchElementProps","isComponentClass","sourceProps","assertSupportedComponentLiveProps","resolvedProps","resolveLivePropValues","subscribeComponentLiveProps","functionType","functionProps","rendered","subscribeFunctionLiveProps","previous","isCompatible","patchCompatible","next","anchor","patchComponentLiveProps","patchFunctionLiveProps","isLiveBinding","reconcileLiveProps","resolvedLiveProps","declared","supported","rerenderFunctionRecord","subscriptions","onValue","liveProp","nextValues","keyed","unkeyed","seenKeys","retained","nextRecords","unkeyedIndex","valueKey","candidate","recordNodes","normalizeAttributeName","keys","property","previousValue","isNativeBindingProp","patchNativeBinding","patchRef","isEventProp","patchEvent","patchLiveElementProp","previousLive","previousResolved","patchDOMProp","assertWritableEmitter","assertNativeBindingTarget","eventName","nativeBindingEvent","registered","applyRef","setAttribute","patchDataset","patchStyle","normalizePropertyName","enabled","oldValues","toPropertyRecord","newValues","camelToKebab","letter","ref","removeNodes","nodes","tagName","concrete","chain","jsx","jsxs","jsxDEV","createPrebuiltElement"],"mappings":"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"}