@ecopages/radiant 0.3.0-beta.0 → 0.3.0-beta.2
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 +5 -5
- package/client/app-bootstrap.js +3 -0
- package/{dist/client → client}/app-bootstrap.js.map +2 -2
- package/client/hydrator.js +3 -0
- package/{dist/client → client}/hydrator.js.map +2 -2
- package/client/install-hydrator.js +3 -0
- package/{dist/client → client}/install-hydrator.js.map +2 -2
- package/context/context-consumer-bootstrap.js +3 -0
- package/{dist/context → context}/context-consumer-bootstrap.js.map +4 -4
- package/context/context-consumer-runtime.js +3 -0
- package/context/context-consumer-runtime.js.map +12 -0
- package/context/context-host.js +3 -0
- package/{dist/context → context}/context-host.js.map +2 -2
- package/context/context-provider.js +3 -0
- package/{dist/context → context}/context-provider.js.map +3 -3
- package/context/context-ssr-bridge.js +3 -0
- package/{dist/context → context}/context-ssr-bridge.js.map +2 -2
- package/context/create-context.js +3 -0
- package/{dist/context → context}/create-context.js.map +2 -2
- package/context/decorators/consume-context.js +3 -0
- package/{dist/context → context}/decorators/consume-context.js.map +5 -5
- package/context/decorators/context-selection-delivery.js +3 -0
- package/{dist/context → context}/decorators/context-selection-delivery.js.map +2 -2
- package/context/decorators/context-selector.js +3 -0
- package/{dist/context → context}/decorators/context-selector.js.map +6 -6
- package/context/decorators/legacy/consume-context.js +3 -0
- package/context/decorators/legacy/consume-context.js.map +16 -0
- package/context/decorators/legacy/context-selector-field.js +3 -0
- package/context/decorators/legacy/context-selector-field.js.map +17 -0
- package/context/decorators/legacy/context-selector.js +3 -0
- package/context/decorators/legacy/context-selector.js.map +17 -0
- package/context/decorators/legacy/provide-context.js +3 -0
- package/{dist/context → context}/decorators/legacy/provide-context.js.map +4 -4
- package/context/decorators/on-context-update.js +3 -0
- package/{dist/context → context}/decorators/on-context-update.js.map +5 -5
- package/context/decorators/provide-context.js +3 -0
- package/{dist/context → context}/decorators/provide-context.js.map +4 -4
- package/context/decorators/standard/consume-context.js +3 -0
- package/{dist/context → context}/decorators/standard/consume-context.js.map +4 -4
- package/context/decorators/standard/context-selector-field.js +3 -0
- package/{dist/context → context}/decorators/standard/context-selector-field.js.map +4 -4
- package/context/decorators/standard/context-selector.js +3 -0
- package/{dist/context → context}/decorators/standard/context-selector.js.map +4 -4
- package/context/decorators/standard/provide-context.js +3 -0
- package/{dist/context → context}/decorators/standard/provide-context.js.map +3 -3
- package/context/decorators/standard-legacy-dispatch.js +3 -0
- package/context/decorators/standard-legacy-dispatch.js.map +10 -0
- package/context/events.js +3 -0
- package/context/events.js.map +10 -0
- package/context/hydration-script.js +3 -0
- package/{dist/context → context}/hydration-script.js.map +2 -2
- package/context/index.js +3 -0
- package/{dist/context → context}/index.js.map +6 -6
- package/controller-registry.js +3 -0
- package/{dist/controller-registry.js.map → controller-registry.js.map} +3 -3
- package/core/controller-metadata.js +3 -0
- package/{dist/core → core}/controller-metadata.js.map +2 -2
- package/core/custom-element-metadata.js +3 -0
- package/{dist/core → core}/custom-element-metadata.js.map +2 -2
- package/core/event-subscription-registry.js +3 -0
- package/{dist/core → core}/event-subscription-registry.js.map +2 -2
- package/core/host-ssr-registry.js +3 -0
- package/{dist/core → core}/host-ssr-registry.js.map +2 -2
- package/core/hydration-capable-host.js +3 -0
- package/{dist/core → core}/hydration-capable-host.js.map +2 -2
- package/core/hydration-codec.js +3 -0
- package/{dist/core → core}/hydration-codec.js.map +2 -2
- package/{dist/core → core}/radiant-controller.d.ts +7 -5
- package/core/radiant-controller.js +3 -0
- package/core/radiant-controller.js.map +21 -0
- package/core/radiant-element-ssr-host.js +3 -0
- package/{dist/core → core}/radiant-element-ssr-host.js.map +2 -2
- package/{dist/core → core}/radiant-element-ssr-registry.d.ts +4 -2
- package/core/radiant-element-ssr-registry.js +3 -0
- package/core/radiant-element-ssr-registry.js.map +10 -0
- package/{dist/core → core}/radiant-element.d.ts +18 -15
- package/core/radiant-element.js +3 -0
- package/core/radiant-element.js.map +31 -0
- package/core/radiant-hydrator-state.js +3 -0
- package/{dist/core → core}/radiant-hydrator-state.js.map +2 -2
- package/core/reactive-binding-adapter.d.ts +10 -0
- package/core/reactive-binding-adapter.js +3 -0
- package/core/reactive-binding-adapter.js.map +10 -0
- package/core/reactive-host.d.ts +138 -0
- package/core/reactive-host.js +3 -0
- package/core/reactive-host.js.map +13 -0
- package/{dist/core → core}/reactive-jsx-value.d.ts +2 -2
- package/core/reactive-jsx-value.js +3 -0
- package/core/reactive-jsx-value.js.map +10 -0
- package/{dist/core → core}/reactive-prop-core.d.ts +6 -11
- package/core/reactive-prop-core.js +3 -0
- package/{dist/core → core}/reactive-prop-core.js.map +3 -3
- package/core/reactive-prop-metadata.js +3 -0
- package/{dist/core → core}/reactive-prop-metadata.js.map +2 -2
- package/{dist/core → core}/reactive-property-state.d.ts +5 -2
- package/core/reactive-property-state.js +3 -0
- package/core/reactive-property-state.js.map +12 -0
- package/core/reactivity-adapter.js +3 -0
- package/core/reactivity-adapter.js.map +12 -0
- package/{dist/core → core}/reactivity-contract.d.ts +14 -0
- package/core/reactivity-runtime.js +3 -0
- package/core/reactivity-runtime.js.map +11 -0
- package/core/reactivity-signals.js +3 -0
- package/core/reactivity-signals.js.map +10 -0
- package/core/render-runtime.js +3 -0
- package/{dist/core → core}/render-runtime.js.map +3 -3
- package/core/render-scheduler.js +3 -0
- package/{dist/core → core}/render-scheduler.js.map +2 -2
- package/core/slot-projection-runtime.js +3 -0
- package/{dist/core → core}/slot-projection-runtime.js.map +2 -2
- package/core/ssr-preparation.js +3 -0
- package/{dist/core → core}/ssr-preparation.js.map +2 -2
- package/decorators/attr.js +3 -0
- package/decorators/attr.js.map +18 -0
- package/decorators/bound.js +3 -0
- package/{dist/decorators → decorators}/bound.js.map +2 -2
- package/decorators/bridge.js +3 -0
- package/{dist/decorators → decorators}/bridge.js.map +2 -2
- package/decorators/controller.js +3 -0
- package/{dist/decorators → decorators}/controller.js.map +3 -3
- package/decorators/custom-element.js +3 -0
- package/{dist/decorators → decorators}/custom-element.js.map +2 -2
- package/decorators/debounce.js +3 -0
- package/{dist/decorators → decorators}/debounce.js.map +2 -2
- package/decorators/event.js +3 -0
- package/{dist/decorators → decorators}/event.js.map +3 -3
- package/decorators/legacy/attr.js +3 -0
- package/decorators/legacy/attr.js.map +15 -0
- package/decorators/legacy/bound.js +3 -0
- package/{dist/decorators → decorators}/legacy/bound.js.map +2 -2
- package/decorators/legacy/custom-element.js +3 -0
- package/{dist/decorators → decorators}/legacy/custom-element.js.map +2 -2
- package/decorators/legacy/debounce.js +3 -0
- package/{dist/decorators → decorators}/legacy/debounce.js.map +2 -2
- package/decorators/legacy/event.js +3 -0
- package/decorators/legacy/event.js.map +13 -0
- package/decorators/legacy/host-readiness.js +3 -0
- package/decorators/legacy/host-readiness.js.map +11 -0
- package/{dist/decorators → decorators}/legacy/instance-initializers.d.ts +4 -2
- package/decorators/legacy/instance-initializers.js +3 -0
- package/decorators/legacy/instance-initializers.js.map +10 -0
- package/decorators/legacy/member-bootstrap.d.ts +10 -0
- package/decorators/legacy/member-bootstrap.js +3 -0
- package/decorators/legacy/member-bootstrap.js.map +10 -0
- package/decorators/legacy/on-event.js +3 -0
- package/{dist/decorators → decorators}/legacy/on-event.js.map +3 -3
- package/decorators/legacy/on-updated.js +3 -0
- package/decorators/legacy/on-updated.js.map +11 -0
- package/decorators/legacy/query-slot.js +3 -0
- package/decorators/legacy/query-slot.js.map +13 -0
- package/decorators/legacy/query.js +3 -0
- package/decorators/legacy/query.js.map +12 -0
- package/decorators/legacy/reactive-field.js +3 -0
- package/decorators/legacy/reactive-field.js.map +13 -0
- package/{dist/decorators → decorators}/legacy/reactive-prop.d.ts +0 -1
- package/decorators/legacy/reactive-prop.js +3 -0
- package/decorators/legacy/reactive-prop.js.map +15 -0
- package/decorators/legacy/signal.js +3 -0
- package/decorators/legacy/signal.js.map +17 -0
- package/decorators/on-event.js +3 -0
- package/{dist/decorators → decorators}/on-event.js.map +3 -3
- package/decorators/on-updated.js +3 -0
- package/{dist/decorators → decorators}/on-updated.js.map +3 -3
- package/{dist/decorators → decorators}/prop.d.ts +4 -5
- package/decorators/prop.js +3 -0
- package/decorators/prop.js.map +18 -0
- package/decorators/query-slot.js +3 -0
- package/{dist/decorators → decorators}/query-slot.js.map +3 -3
- package/decorators/query.js +3 -0
- package/{dist/decorators → decorators}/query.js.map +3 -3
- package/decorators/shared/auto-bind.d.ts +7 -0
- package/decorators/shared/auto-bind.js +3 -0
- package/decorators/shared/auto-bind.js.map +10 -0
- package/decorators/shared/reactive-attr.js +3 -0
- package/decorators/shared/reactive-attr.js.map +13 -0
- package/decorators/signal.js +3 -0
- package/decorators/signal.js.map +19 -0
- package/decorators/standard/attr.js +3 -0
- package/decorators/standard/attr.js.map +14 -0
- package/decorators/standard/bound.js +3 -0
- package/{dist/decorators → decorators}/standard/bound.js.map +2 -2
- package/decorators/standard/custom-element.js +3 -0
- package/{dist/decorators → decorators}/standard/custom-element.js.map +2 -2
- package/decorators/standard/debounce.js +3 -0
- package/{dist/decorators → decorators}/standard/debounce.js.map +2 -2
- package/decorators/standard/event.js +3 -0
- package/{dist/decorators → decorators}/standard/event.js.map +2 -2
- package/decorators/standard/on-event.js +3 -0
- package/{dist/decorators → decorators}/standard/on-event.js.map +2 -2
- package/decorators/standard/on-updated.js +3 -0
- package/{dist/decorators → decorators}/standard/on-updated.js.map +2 -2
- package/decorators/standard/query-slot.js +3 -0
- package/{dist/decorators → decorators}/standard/query-slot.js.map +2 -2
- package/decorators/standard/query.js +3 -0
- package/{dist/decorators → decorators}/standard/query.js.map +2 -2
- package/decorators/standard/reactive-field.js +3 -0
- package/decorators/standard/reactive-field.js.map +11 -0
- package/decorators/standard/reactive-prop.js +3 -0
- package/{dist/decorators → decorators}/standard/reactive-prop.js.map +4 -4
- package/decorators/standard/signal.js +3 -0
- package/decorators/standard/signal.js.map +16 -0
- package/{dist/decorators → decorators}/state.d.ts +3 -2
- package/decorators/state.js +3 -0
- package/decorators/state.js.map +16 -0
- package/helpers/create-event-listener.js +3 -0
- package/{dist/helpers → helpers}/create-event-listener.js.map +2 -2
- package/helpers/create-event.js +3 -0
- package/{dist/helpers → helpers}/create-event.js.map +2 -2
- package/helpers/create-query-slot.js +3 -0
- package/{dist/helpers → helpers}/create-query-slot.js.map +2 -2
- package/helpers/create-query.js +3 -0
- package/{dist/helpers → helpers}/create-query.js.map +2 -2
- package/helpers/debounce.js +3 -0
- package/{dist/helpers → helpers}/debounce.js.map +2 -2
- package/helpers/index.js +3 -0
- package/{dist/helpers → helpers}/index.js.map +2 -2
- package/index.js +3 -0
- package/index.js.map +86 -0
- package/package.json +99 -129
- package/server/context-ssr.js +3 -0
- package/{dist/server → server}/context-ssr.js.map +2 -2
- package/server/host-attribute-serialization.js +3 -0
- package/{dist/server → server}/host-attribute-serialization.js.map +5 -5
- package/server/host-script-composition.js +3 -0
- package/{dist/server → server}/host-script-composition.js.map +2 -2
- package/server/html-parser.js +3 -0
- package/{dist/server → server}/html-parser.js.map +2 -2
- package/server/install-light-dom-shim.js +3 -0
- package/server/install-light-dom-shim.js.map +17 -0
- package/server/internal-radiant-host.js +3 -0
- package/{dist/server → server}/internal-radiant-host.js.map +1 -1
- package/server/light-dom-shim.d.ts +2 -0
- package/server/light-dom-shim.js +3 -0
- package/server/light-dom-shim.js.map +16 -0
- package/server/minimal-dom/document.d.ts +17 -0
- package/server/minimal-dom/document.js +3 -0
- package/server/minimal-dom/document.js.map +14 -0
- package/server/minimal-dom/html.d.ts +7 -0
- package/server/minimal-dom/html.js +3 -0
- package/server/minimal-dom/html.js.map +13 -0
- package/{dist/server/light-dom-shim.d.ts → server/minimal-dom/install.d.ts} +1 -4
- package/server/minimal-dom/install.js +3 -0
- package/server/minimal-dom/install.js.map +16 -0
- package/server/minimal-dom/nodes.d.ts +78 -0
- package/server/project-root.js +3 -0
- package/{dist/server → server}/project-root.js.map +2 -2
- package/server/radiant-element-ssr-bridge.js +3 -0
- package/{dist/server → server}/radiant-element-ssr-bridge.js.map +9 -9
- package/server/radiant-element-ssr-extractor.js +3 -0
- package/{dist/server → server}/radiant-element-ssr-extractor.js.map +3 -3
- package/server/radiant-element-ssr-service.js +3 -0
- package/{dist/server → server}/radiant-element-ssr-service.js.map +8 -8
- package/server/radiant-element-ssr.js +3 -0
- package/{dist/server → server}/radiant-element-ssr.js.map +9 -9
- package/{dist/server → server}/render-component.d.ts +1 -1
- package/server/render-component.js +3 -0
- package/server/render-component.js.map +32 -0
- package/server/render-controller.js +3 -0
- package/server/render-controller.js.map +35 -0
- package/server/render-fragment.js +3 -0
- package/server/render-fragment.js.map +10 -0
- package/server/slot-projection-html.js +3 -0
- package/{dist/server → server}/slot-projection-html.js.map +4 -4
- package/signals/host-resource.js +3 -0
- package/{dist/signals → signals}/host-resource.js.map +2 -2
- package/{dist/signals → signals}/host-signal.d.ts +2 -1
- package/signals/host-signal.js +3 -0
- package/signals/host-signal.js.map +13 -0
- package/signals/hydration-script.js +3 -0
- package/{dist/signals → signals}/hydration-script.js.map +2 -2
- package/tools/escape-css-identifier.js +3 -0
- package/{dist/tools → tools}/escape-css-identifier.js.map +2 -2
- package/tools/escape-script-json.js +3 -0
- package/{dist/tools → tools}/escape-script-json.js.map +2 -2
- package/tools/event-emitter.js +3 -0
- package/{dist/tools → tools}/event-emitter.js.map +2 -2
- package/tools/index.js +3 -0
- package/{dist/tools → tools}/index.js.map +2 -2
- package/tools/render-jsx-template.js +3 -0
- package/{dist/tools → tools}/render-jsx-template.js.map +2 -2
- package/types.js +3 -0
- package/{dist/types.js.map → types.js.map} +2 -2
- package/utils/attribute-utils.js +3 -0
- package/{dist/utils → utils}/attribute-utils.js.map +2 -2
- package/utils/escape-html-attribute.js +3 -0
- package/{dist/utils → utils}/escape-html-attribute.js.map +2 -2
- package/utils/index.js +3 -0
- package/{dist/utils → utils}/index.js.map +2 -2
- package/dist/LICENSE +0 -21
- package/dist/README.md +0 -315
- package/dist/client/app-bootstrap.js +0 -3
- package/dist/client/hydrator.js +0 -3
- package/dist/client/install-hydrator.js +0 -3
- package/dist/context/context-consumer-bootstrap.js +0 -3
- package/dist/context/context-consumer-runtime.js +0 -3
- package/dist/context/context-consumer-runtime.js.map +0 -12
- package/dist/context/context-host.js +0 -3
- package/dist/context/context-provider.js +0 -3
- package/dist/context/context-ssr-bridge.js +0 -3
- package/dist/context/create-context.js +0 -3
- package/dist/context/decorators/consume-context.js +0 -3
- package/dist/context/decorators/context-selection-delivery.js +0 -3
- package/dist/context/decorators/context-selector.js +0 -3
- package/dist/context/decorators/legacy/consume-context.js +0 -3
- package/dist/context/decorators/legacy/consume-context.js.map +0 -16
- package/dist/context/decorators/legacy/context-selector-field.js +0 -3
- package/dist/context/decorators/legacy/context-selector-field.js.map +0 -17
- package/dist/context/decorators/legacy/context-selector.js +0 -3
- package/dist/context/decorators/legacy/context-selector.js.map +0 -17
- package/dist/context/decorators/legacy/provide-context.js +0 -3
- package/dist/context/decorators/on-context-update.js +0 -3
- package/dist/context/decorators/provide-context.js +0 -3
- package/dist/context/decorators/standard/consume-context.js +0 -3
- package/dist/context/decorators/standard/context-selector-field.js +0 -3
- package/dist/context/decorators/standard/context-selector.js +0 -3
- package/dist/context/decorators/standard/provide-context.js +0 -3
- package/dist/context/decorators/standard-legacy-dispatch.js +0 -3
- package/dist/context/decorators/standard-legacy-dispatch.js.map +0 -10
- package/dist/context/events.js +0 -3
- package/dist/context/events.js.map +0 -10
- package/dist/context/hydration-script.js +0 -3
- package/dist/context/index.js +0 -3
- package/dist/controller-registry.js +0 -3
- package/dist/core/controller-metadata.js +0 -3
- package/dist/core/custom-element-metadata.js +0 -3
- package/dist/core/event-subscription-registry.js +0 -3
- package/dist/core/host-ssr-registry.js +0 -3
- package/dist/core/hydration-capable-host.js +0 -3
- package/dist/core/hydration-codec.js +0 -3
- package/dist/core/radiant-controller.js +0 -3
- package/dist/core/radiant-controller.js.map +0 -20
- package/dist/core/radiant-element-ssr-host.js +0 -3
- package/dist/core/radiant-element-ssr-registry.js +0 -3
- package/dist/core/radiant-element-ssr-registry.js.map +0 -10
- package/dist/core/radiant-element.js +0 -3
- package/dist/core/radiant-element.js.map +0 -30
- package/dist/core/radiant-hydrator-state.js +0 -3
- package/dist/core/reactive-host.d.ts +0 -124
- package/dist/core/reactive-host.js +0 -3
- package/dist/core/reactive-host.js.map +0 -13
- package/dist/core/reactive-jsx-value.js +0 -3
- package/dist/core/reactive-jsx-value.js.map +0 -10
- package/dist/core/reactive-prop-core.js +0 -3
- package/dist/core/reactive-prop-metadata.js +0 -3
- package/dist/core/reactive-property-state.js +0 -3
- package/dist/core/reactive-property-state.js.map +0 -12
- package/dist/core/reactivity-adapter.js +0 -3
- package/dist/core/reactivity-adapter.js.map +0 -12
- package/dist/core/reactivity-runtime.js +0 -3
- package/dist/core/reactivity-runtime.js.map +0 -11
- package/dist/core/reactivity-signals.js +0 -3
- package/dist/core/reactivity-signals.js.map +0 -10
- package/dist/core/render-runtime.js +0 -3
- package/dist/core/render-scheduler.js +0 -3
- package/dist/core/slot-projection-runtime.js +0 -3
- package/dist/core/ssr-preparation.js +0 -3
- package/dist/decorators/attr.js +0 -3
- package/dist/decorators/attr.js.map +0 -17
- package/dist/decorators/bound.js +0 -3
- package/dist/decorators/bridge.js +0 -3
- package/dist/decorators/controller.js +0 -3
- package/dist/decorators/custom-element.js +0 -3
- package/dist/decorators/debounce.js +0 -3
- package/dist/decorators/event.js +0 -3
- package/dist/decorators/legacy/attr.js +0 -3
- package/dist/decorators/legacy/attr.js.map +0 -14
- package/dist/decorators/legacy/bound.js +0 -3
- package/dist/decorators/legacy/custom-element.js +0 -3
- package/dist/decorators/legacy/debounce.js +0 -3
- package/dist/decorators/legacy/event.js +0 -3
- package/dist/decorators/legacy/event.js.map +0 -13
- package/dist/decorators/legacy/host-readiness.js +0 -3
- package/dist/decorators/legacy/host-readiness.js.map +0 -11
- package/dist/decorators/legacy/instance-initializers.js +0 -3
- package/dist/decorators/legacy/instance-initializers.js.map +0 -10
- package/dist/decorators/legacy/on-event.js +0 -3
- package/dist/decorators/legacy/on-updated.js +0 -3
- package/dist/decorators/legacy/on-updated.js.map +0 -11
- package/dist/decorators/legacy/query-slot.js +0 -3
- package/dist/decorators/legacy/query-slot.js.map +0 -13
- package/dist/decorators/legacy/query.js +0 -3
- package/dist/decorators/legacy/query.js.map +0 -12
- package/dist/decorators/legacy/reactive-field.js +0 -3
- package/dist/decorators/legacy/reactive-field.js.map +0 -11
- package/dist/decorators/legacy/reactive-prop.js +0 -3
- package/dist/decorators/legacy/reactive-prop.js.map +0 -14
- package/dist/decorators/legacy/signal.js +0 -3
- package/dist/decorators/legacy/signal.js.map +0 -16
- package/dist/decorators/on-event.js +0 -3
- package/dist/decorators/on-updated.js +0 -3
- package/dist/decorators/prop.js +0 -3
- package/dist/decorators/prop.js.map +0 -17
- package/dist/decorators/query-slot.js +0 -3
- package/dist/decorators/query.js +0 -3
- package/dist/decorators/shared/reactive-attr.js +0 -3
- package/dist/decorators/shared/reactive-attr.js.map +0 -12
- package/dist/decorators/signal.js +0 -3
- package/dist/decorators/signal.js.map +0 -18
- package/dist/decorators/standard/attr.js +0 -3
- package/dist/decorators/standard/attr.js.map +0 -13
- package/dist/decorators/standard/bound.js +0 -3
- package/dist/decorators/standard/custom-element.js +0 -3
- package/dist/decorators/standard/debounce.js +0 -3
- package/dist/decorators/standard/event.js +0 -3
- package/dist/decorators/standard/on-event.js +0 -3
- package/dist/decorators/standard/on-updated.js +0 -3
- package/dist/decorators/standard/query-slot.js +0 -3
- package/dist/decorators/standard/query.js +0 -3
- package/dist/decorators/standard/reactive-field.js +0 -3
- package/dist/decorators/standard/reactive-field.js.map +0 -10
- package/dist/decorators/standard/reactive-prop.js +0 -3
- package/dist/decorators/standard/signal.js +0 -3
- package/dist/decorators/standard/signal.js.map +0 -15
- package/dist/decorators/state.js +0 -3
- package/dist/decorators/state.js.map +0 -14
- package/dist/helpers/create-event-listener.js +0 -3
- package/dist/helpers/create-event.js +0 -3
- package/dist/helpers/create-query-slot.js +0 -3
- package/dist/helpers/create-query.js +0 -3
- package/dist/helpers/debounce.js +0 -3
- package/dist/helpers/index.js +0 -3
- package/dist/index.js +0 -3
- package/dist/index.js.map +0 -83
- package/dist/package.json +0 -209
- package/dist/server/context-ssr.js +0 -3
- package/dist/server/host-attribute-serialization.js +0 -3
- package/dist/server/host-script-composition.js +0 -3
- package/dist/server/html-parser.js +0 -3
- package/dist/server/install-light-dom-shim.js +0 -3
- package/dist/server/install-light-dom-shim.js.map +0 -12
- package/dist/server/internal-radiant-host.js +0 -3
- package/dist/server/light-dom-shim.js +0 -3
- package/dist/server/light-dom-shim.js.map +0 -11
- package/dist/server/project-root.js +0 -3
- package/dist/server/radiant-element-ssr-bridge.js +0 -3
- package/dist/server/radiant-element-ssr-extractor.js +0 -3
- package/dist/server/radiant-element-ssr-service.js +0 -3
- package/dist/server/radiant-element-ssr.js +0 -3
- package/dist/server/render-component.js +0 -3
- package/dist/server/render-component.js.map +0 -28
- package/dist/server/render-controller.js +0 -3
- package/dist/server/render-controller.js.map +0 -31
- package/dist/server/render-fragment.js +0 -3
- package/dist/server/render-fragment.js.map +0 -10
- package/dist/server/slot-projection-html.js +0 -3
- package/dist/signals/host-resource.js +0 -3
- package/dist/signals/host-signal.js +0 -3
- package/dist/signals/host-signal.js.map +0 -13
- package/dist/signals/hydration-script.js +0 -3
- package/dist/tools/escape-css-identifier.js +0 -3
- package/dist/tools/escape-script-json.js +0 -3
- package/dist/tools/event-emitter.js +0 -3
- package/dist/tools/index.js +0 -3
- package/dist/tools/render-jsx-template.js +0 -3
- package/dist/types.js +0 -3
- package/dist/utils/attribute-utils.js +0 -3
- package/dist/utils/escape-html-attribute.js +0 -3
- package/dist/utils/index.js +0 -3
- /package/{dist/client → client}/app-bootstrap.d.ts +0 -0
- /package/{dist/client → client}/hydrator.d.ts +0 -0
- /package/{dist/client → client}/install-hydrator.d.ts +0 -0
- /package/{dist/context → context}/context-consumer-bootstrap.d.ts +0 -0
- /package/{dist/context → context}/context-consumer-runtime.d.ts +0 -0
- /package/{dist/context → context}/context-host.d.ts +0 -0
- /package/{dist/context → context}/context-provider.d.ts +0 -0
- /package/{dist/context → context}/context-ssr-bridge.d.ts +0 -0
- /package/{dist/context → context}/create-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/consume-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/context-selection-delivery.d.ts +0 -0
- /package/{dist/context → context}/decorators/context-selector.d.ts +0 -0
- /package/{dist/context → context}/decorators/legacy/consume-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/legacy/context-selector-field.d.ts +0 -0
- /package/{dist/context → context}/decorators/legacy/context-selector.d.ts +0 -0
- /package/{dist/context → context}/decorators/legacy/provide-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/on-context-update.d.ts +0 -0
- /package/{dist/context → context}/decorators/provide-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/standard/consume-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/standard/context-selector-field.d.ts +0 -0
- /package/{dist/context → context}/decorators/standard/context-selector.d.ts +0 -0
- /package/{dist/context → context}/decorators/standard/provide-context.d.ts +0 -0
- /package/{dist/context → context}/decorators/standard-legacy-dispatch.d.ts +0 -0
- /package/{dist/context → context}/events.d.ts +0 -0
- /package/{dist/context → context}/hydration-script.d.ts +0 -0
- /package/{dist/context → context}/index.d.ts +0 -0
- /package/{dist/context → context}/types.d.ts +0 -0
- /package/{dist/context → context}/types.js +0 -0
- /package/{dist/context → context}/types.js.map +0 -0
- /package/{dist/controller-registry.d.ts → controller-registry.d.ts} +0 -0
- /package/{dist/core → core}/controller-metadata.d.ts +0 -0
- /package/{dist/core → core}/custom-element-metadata.d.ts +0 -0
- /package/{dist/core → core}/event-subscription-registry.d.ts +0 -0
- /package/{dist/core → core}/host-ssr-registry.d.ts +0 -0
- /package/{dist/core → core}/hydration-capable-host.d.ts +0 -0
- /package/{dist/core → core}/hydration-codec.d.ts +0 -0
- /package/{dist/core → core}/radiant-element-ssr-host.d.ts +0 -0
- /package/{dist/core → core}/radiant-hydrator-state.d.ts +0 -0
- /package/{dist/core → core}/reactive-prop-metadata.d.ts +0 -0
- /package/{dist/core → core}/reactivity-adapter.d.ts +0 -0
- /package/{dist/core → core}/reactivity-contract.js +0 -0
- /package/{dist/core → core}/reactivity-contract.js.map +0 -0
- /package/{dist/core → core}/reactivity-runtime.d.ts +0 -0
- /package/{dist/core → core}/reactivity-signals.d.ts +0 -0
- /package/{dist/core → core}/render-runtime.d.ts +0 -0
- /package/{dist/core → core}/render-scheduler.d.ts +0 -0
- /package/{dist/core → core}/slot-projection-runtime.d.ts +0 -0
- /package/{dist/core → core}/ssr-hydration-binding.d.ts +0 -0
- /package/{dist/core → core}/ssr-hydration-binding.js +0 -0
- /package/{dist/core → core}/ssr-hydration-binding.js.map +0 -0
- /package/{dist/core → core}/ssr-preparation.d.ts +0 -0
- /package/{dist/decorators → decorators}/attr.d.ts +0 -0
- /package/{dist/decorators → decorators}/bound.d.ts +0 -0
- /package/{dist/decorators → decorators}/bridge.d.ts +0 -0
- /package/{dist/decorators → decorators}/controller.d.ts +0 -0
- /package/{dist/decorators → decorators}/custom-element.d.ts +0 -0
- /package/{dist/decorators → decorators}/debounce.d.ts +0 -0
- /package/{dist/decorators → decorators}/event.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/attr.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/bound.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/custom-element.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/debounce.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/event.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/host-readiness.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/on-event.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/on-updated.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/query-slot.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/query.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/reactive-field.d.ts +0 -0
- /package/{dist/decorators → decorators}/legacy/signal.d.ts +0 -0
- /package/{dist/decorators → decorators}/on-event.d.ts +0 -0
- /package/{dist/decorators → decorators}/on-updated.d.ts +0 -0
- /package/{dist/decorators → decorators}/query-slot.d.ts +0 -0
- /package/{dist/decorators → decorators}/query.d.ts +0 -0
- /package/{dist/decorators → decorators}/shared/reactive-attr.d.ts +0 -0
- /package/{dist/decorators → decorators}/signal.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/attr.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/bound.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/custom-element.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/debounce.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/event.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/on-event.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/on-updated.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/query-slot.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/query.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/reactive-field.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/reactive-prop.d.ts +0 -0
- /package/{dist/decorators → decorators}/standard/signal.d.ts +0 -0
- /package/{dist/helpers → helpers}/create-event-listener.d.ts +0 -0
- /package/{dist/helpers → helpers}/create-event.d.ts +0 -0
- /package/{dist/helpers → helpers}/create-query-slot.d.ts +0 -0
- /package/{dist/helpers → helpers}/create-query.d.ts +0 -0
- /package/{dist/helpers → helpers}/debounce.d.ts +0 -0
- /package/{dist/helpers → helpers}/index.d.ts +0 -0
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/server → server}/context-ssr.d.ts +0 -0
- /package/{dist/server → server}/host-attribute-serialization.d.ts +0 -0
- /package/{dist/server → server}/host-script-composition.d.ts +0 -0
- /package/{dist/server → server}/html-parser.d.ts +0 -0
- /package/{dist/server → server}/install-light-dom-shim.d.ts +0 -0
- /package/{dist/server → server}/internal-radiant-host.d.ts +0 -0
- /package/{dist/server → server}/project-root.d.ts +0 -0
- /package/{dist/server → server}/radiant-element-ssr-bridge.d.ts +0 -0
- /package/{dist/server → server}/radiant-element-ssr-extractor.d.ts +0 -0
- /package/{dist/server → server}/radiant-element-ssr-service.d.ts +0 -0
- /package/{dist/server → server}/radiant-element-ssr.d.ts +0 -0
- /package/{dist/server → server}/render-controller.d.ts +0 -0
- /package/{dist/server → server}/render-fragment.d.ts +0 -0
- /package/{dist/server → server}/slot-projection-html.d.ts +0 -0
- /package/{dist/signals → signals}/host-resource.d.ts +0 -0
- /package/{dist/signals → signals}/hydration-script.d.ts +0 -0
- /package/{dist/tools → tools}/escape-css-identifier.d.ts +0 -0
- /package/{dist/tools → tools}/escape-script-json.d.ts +0 -0
- /package/{dist/tools → tools}/event-emitter.d.ts +0 -0
- /package/{dist/tools → tools}/index.d.ts +0 -0
- /package/{dist/tools → tools}/render-jsx-template.d.ts +0 -0
- /package/{dist/types.d.ts → types.d.ts} +0 -0
- /package/{dist/utils → utils}/attribute-utils.d.ts +0 -0
- /package/{dist/utils → utils}/escape-html-attribute.d.ts +0 -0
- /package/{dist/utils → utils}/index.d.ts +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { EventEmitter } from '../tools';
|
|
2
|
-
import { type JsxRenderable, type
|
|
2
|
+
import { type JsxRenderable, type SubscribableJsxValueWithAccess } from '@ecopages/jsx';
|
|
3
3
|
import type { RenderToStringOptions } from '@ecopages/jsx/server';
|
|
4
4
|
import { type ReactivePropDefinition } from './reactive-prop-metadata';
|
|
5
5
|
import type { SsrSerializableContextProvider } from '../context/context-provider';
|
|
6
6
|
import type { UnknownContext } from '../context/types';
|
|
7
7
|
import { type ReactiveBindingOption, type ReactiveBindingValue, type ReactiveBindings, type ReactiveFieldOptions, type ReactiveProperty, type ReactivePropertyOptions } from './reactive-prop-core';
|
|
8
8
|
import type { SsrSerializableHydrationBinding } from './ssr-hydration-binding';
|
|
9
|
-
|
|
9
|
+
import type { ReactiveState } from './reactivity-contract';
|
|
10
|
+
export type { ReactiveBindingOption, ReactiveBindingValue, ReactiveBindings, ReactiveFieldOptions, ReactiveProperty, ReactivePropertyOptions, } from './reactive-prop-core';
|
|
10
11
|
declare const RadiantElementBase: {
|
|
11
12
|
new (): HTMLElement;
|
|
12
13
|
prototype: HTMLElement;
|
|
@@ -67,13 +68,13 @@ export interface IRadiantElement<Bindings extends object = {}> {
|
|
|
67
68
|
* Prefer `this.bindings.key` or `this.$.key` in JSX render code when you want
|
|
68
69
|
* property access syntax without string literals.
|
|
69
70
|
*/
|
|
70
|
-
bind<Property extends StringPropertyKey<Bindings>>(property: Property):
|
|
71
|
+
bind<Property extends StringPropertyKey<Bindings>>(property: Property): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;
|
|
71
72
|
/**
|
|
72
73
|
* Returns a subscribable JSX child binding for a reactive property or field.
|
|
73
74
|
*
|
|
74
75
|
* This is the primitive lookup used by `bind()`, `bindings.key`, and `$.key`.
|
|
75
76
|
*/
|
|
76
|
-
getReactiveBinding<Property extends StringPropertyKey<Bindings>>(property: Property):
|
|
77
|
+
getReactiveBinding<Property extends StringPropertyKey<Bindings>>(property: Property): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;
|
|
77
78
|
/**
|
|
78
79
|
* Defines a stable JSX binding companion accessor for a reactive member.
|
|
79
80
|
*
|
|
@@ -99,16 +100,17 @@ export interface IRadiantElement<Bindings extends object = {}> {
|
|
|
99
100
|
*/
|
|
100
101
|
registerConnectedCallback(callback: () => void): void;
|
|
101
102
|
/**
|
|
102
|
-
*
|
|
103
|
-
* dependencies can read the underlying value without triggering the public
|
|
104
|
-
* getter's dependency tracking.
|
|
103
|
+
* Creates a new reactive member state and registers it under `propertyName`.
|
|
105
104
|
*/
|
|
106
|
-
|
|
105
|
+
createReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T>;
|
|
107
106
|
/**
|
|
108
|
-
*
|
|
109
|
-
* allowing the signals runtime to re-render only the affected parts.
|
|
107
|
+
* Registers an externally-owned reactive member state (used by `signal()`).
|
|
110
108
|
*/
|
|
111
|
-
|
|
109
|
+
registerReactiveMember<T>(propertyName: string, signal: ReactiveState<T>): void;
|
|
110
|
+
/**
|
|
111
|
+
* Returns the member state registered under `propertyName`, if any.
|
|
112
|
+
*/
|
|
113
|
+
getReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined;
|
|
112
114
|
/**
|
|
113
115
|
* Renders a trusted HTML template string into the specified target element.
|
|
114
116
|
*
|
|
@@ -214,7 +216,6 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
214
216
|
update(): void;
|
|
215
217
|
registerReactiveProperty(config: ReactiveProperty): void;
|
|
216
218
|
getReactiveProperties(): ReactiveProperty[];
|
|
217
|
-
registerReactiveDependencyReader(property: string, read: () => unknown): void;
|
|
218
219
|
registerContextProvider(name: string, provider: SsrSerializableContextProvider): void;
|
|
219
220
|
registerHydrationBinding(name: string, binding: SsrSerializableHydrationBinding): void;
|
|
220
221
|
getContextProviders(): SsrSerializableContextProvider[];
|
|
@@ -242,10 +243,12 @@ export declare class RadiantElement<Bindings extends object = {}> extends Radian
|
|
|
242
243
|
/** Returns the DOM root used by client-side render and hydrate work. */
|
|
243
244
|
protected getRenderTarget(): RadiantRenderTarget;
|
|
244
245
|
registerUpdateCallback(property: string, update: () => void): () => void;
|
|
245
|
-
getReactiveBinding<Property extends StringPropertyKey<Bindings>>(property: Property):
|
|
246
|
-
bind<Property extends StringPropertyKey<Bindings>>(property: Property):
|
|
246
|
+
getReactiveBinding<Property extends StringPropertyKey<Bindings>>(property: Property): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;
|
|
247
|
+
bind<Property extends StringPropertyKey<Bindings>>(property: Property): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;
|
|
247
248
|
defineReactiveBinding(property: string, bind?: ReactiveBindingOption): void;
|
|
248
|
-
|
|
249
|
+
createReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T>;
|
|
250
|
+
registerReactiveMember<T>(propertyName: string, signal: ReactiveState<T>): void;
|
|
251
|
+
getReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined;
|
|
249
252
|
subscribeEvents(events: RadiantElementEventListener[]): Array<() => void>;
|
|
250
253
|
hasEventSubscription(subscriptionId: string): boolean;
|
|
251
254
|
subscribeEvent(eventConfig: RadiantElementEventListener): () => void;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var{defineProperty:K,getOwnPropertyNames:R0,getOwnPropertyDescriptor:I0}=Object,j0=Object.prototype.hasOwnProperty;function A0($){return this[$]}var L2=($)=>{var M=(g??=new WeakMap).get($),Q;if(M)return M;if(M=K({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var Z of R0($))if(!j0.call(M,Z))K(M,Z,{get:A0.bind($,Z),enumerable:!(Q=I0($,Z))||Q.enumerable})}return g.set($,M),M},g;var C0=($)=>$;function k0($,M){this[$]=C0.bind(null,M)}var B2=($,M)=>{for(var Q in M)K($,Q,{get:M[Q],enumerable:!0,configurable:!0,set:k0.bind(M,Q)})};var x2=($,M)=>()=>($&&(M=$($=0)),M);var Y2=(($)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy($,{get:(M,Q)=>(typeof require<"u"?require:M)[Q]}):$)(function($){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+$+'" is not supported')});class f{contextProviders=new Map;hydrationBindings=new Map;registerContextProvider($,M){this.contextProviders.set($,M),this.hydrationBindings.set($,M)}registerHydrationBinding($,M){this.hydrationBindings.set($,M)}getContextProviders(){return[...this.contextProviders.values()]}getHydrationBindings(){return[...this.hydrationBindings.values()]}}var z=Symbol.for("@ecopages/radiant.reactivePropDefinitions");function f2($,M,Q){let Z=$.constructor,q=Z[z]??[];if(q.some((X)=>X.name===M))return;q.push({name:M,options:Q}),Z[z]=q}function N($){return($.constructor[z]??[]).slice()}var b=Symbol.for("@ecopages/radiant.legacy-instance-initializers"),m=Symbol.for("@ecopages/radiant.legacy-post-construction-initializers"),T0=Symbol.for("@ecopages/radiant.legacy-executed-post-construction-initializers");function _2($,M){s($,b,M)}function R2($,M){s($,m,M)}function c($){v0($,b)}function _($,M){let Q=$;S0($,M,Q[T0]??=new Set)}function s($,M,Q){let Z=$,q=Object.prototype.hasOwnProperty.call(Z,M)?Z[M]:void 0;if(Array.isArray(q)){q.push(Q);return}Object.defineProperty(Z,M,{value:[Q]})}function v0($,M){h0($,(Q)=>{let Z=Q[M];if(!Array.isArray(Z))return;for(let q of Z)q($)})}function S0($,M,Q){for(let Z of y($)){let q=Z[m];if(!Array.isArray(q))continue;for(let X of q){if(Q.has(X))continue;X($,M),Q.add(X)}}}function y($){let M=[],Q=Object.getPrototypeOf($);while(Q&&Q!==Object.prototype)M.unshift(Q),Q=Object.getPrototypeOf(Q);return M}function h0($,M){for(let Q of y($))M(Q)}function D($,M){switch(M){case"construct":c($);break;case"connect":_($,"connect");break;case"ssr":_($,"ssr");break}}class R{getInteractionTarget;getListenerContext;subscriptions=new Map;constructor($,M){this.getInteractionTarget=$;this.getListenerContext=M}subscribe($){let M=this.getInteractionTarget(),Q=this.getListenerContext(),Z=(X)=>{if(X.target&&X.target.matches($.selector))$.listener.call(Q,X)},q=`${$.type}:${$.selector}`;return M.addEventListener($.type,Z,$.options),this.subscriptions.set(q,{...$,listener:Z,target:M}),()=>{this.unsubscribe(q)}}hasEventSubscription($){return this.subscriptions.has($)}removeAll(){for(let $ of this.subscriptions.values())$.target.removeEventListener($.type,$.listener,$.options);this.subscriptions.clear()}unsubscribe($){let M=this.subscriptions.get($);if(M)M.target.removeEventListener(M.type,M.listener,M.options),this.subscriptions.delete($)}}function i($){switch($){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function V0($){switch(typeof $){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}if(Array.isArray($))return"array";if(Object.prototype.toString.call($)==="[object Object]")return"object"}function g0($){switch($){case Number:return 0;case String:return"";case Boolean:return!1;default:return null}}function N0($){try{return JSON.parse($)}catch{throw TypeError("Invalid JSON string")}}var b0={array($){let M=N0($);if(!Array.isArray(M))throw TypeError(`Expected an array but got a value of type "${typeof M}"`);return M},boolean($){return!($==="0"||String($).toLowerCase()==="false")},number($){return Number($.replace(/_/g,""))},object($){let M=JSON.parse($);if(M===null||typeof M!=="object"||Array.isArray(M))throw TypeError(`expected value of type "object" but instead got value "${$}" of type "${V0(M)}"`);return M},string($){return $}},u={default:d,array:p,object:p};function p($){return JSON.stringify($)}function d($){return`${$}`}function H($,M){let Q=i(M);if(!Q)throw TypeError(`[radiant-element] Unknown type "${M}"`);return b0[Q]($)}function o($,M){let Q=i(M);if(!Q)throw TypeError(`[radiant-element] Unknown type "${M}"`);return(u[Q]??u.default??d)($)}function m0($){return typeof $==="boolean"}function c0($){return typeof $==="number"}function s0($){return typeof $==="string"}function y0($){return Array.isArray($)}function u0($){return typeof $==="object"&&!Array.isArray($)&&$!==null}function n($,M){switch($){case Boolean:return m0(M);case Number:return c0(M);case String:return s0(M);case Array:return y0(M);case Object:return u0(M);default:return!1}}var l=($,M,Q,Z)=>{if(M===Boolean){let X=$.getAttribute(Q);if(X===null)return Z;return X===""?!0:H(X,M)}let q=$.getAttribute(Q);return q!==null?H(q,M):Z??g0(M)};function r($,M){if(M!==void 0&&!n($,M))throw Error(`defaultValue does not match the expected type for ${$.name}`)}function t($,M,Q,Z){return{type:Q,name:$,initialValue:Z,attribute:M,converter:{fromAttribute:(q)=>H(q,Q),toAttribute:(q)=>o(q,Q)}}}class I{host;properties=new Map;preUpgradePropertyValues=new Map;constructor($){this.host=$;for(let M of Object.getOwnPropertyNames($))this.preUpgradePropertyValues.set(M,Reflect.get($,M))}register($){this.properties.set($.name,$)}getAll(){return Array.from(this.properties.values())}applyAttributeChange($,M,Q){let Z=this.properties.get($);if(!Z)return;let q=this.transformAttributeValue(Q,Z);Reflect.set(this.host,Z.name,q)}create($,M,Q,Z,q){let{type:X,attribute:G,reflect:E,defaultValue:h}=M,F=G??$,x=this.preUpgradePropertyValues.has($),_0=x?this.preUpgradePropertyValues.get($):void 0;r(X,h);let W=x?_0:Q(X,F,h);if(this.host.hasAttribute(F)&&(!E||W==null||W===""))this.host.removeAttribute(F);if(x&&Object.prototype.hasOwnProperty.call(this.host,$))Reflect.deleteProperty(this.host,$);let Y=t($,F,X,W);this.register(Y);let O=this.host.getReactiveMember($),V=O??q($,W);if(O&&W!==void 0)O.set(W);if(Z($,{bind:M.bind,signal:V,onSet:(w)=>this.reflectValue(F,E,Y,w)}),W!==void 0)queueMicrotask(()=>{let w=V.get();if(w===void 0)return;this.reflectValue(F,E,Y,w),this.host.notifyUpdate($,void 0,w)})}transformAttributeValue($,M){return $!==null?M.converter.fromAttribute($):$}reflectValue($,M,Q,Z){if(!M)return;if(Z==null||Z===""||Z===!1){this.host.removeAttribute($);return}let q=Q.converter.toAttribute(Z);this.host.setAttribute($,q)}}import{Computed as p0,state as i0,subtle as d0,trackDependency as o0}from"@ecopages/signals";function n0($){return $}function a($){return $}var e={trackDependency($){o0(n0($))},createComputed($){return new p0($)},createWatcher($){let M=new d0.Watcher($);return{watch(Q){M.watch(a(Q))},unwatch(Q){M.unwatch(a(Q))}}},createState($){return i0($)}};var $0=e;function J(){return $0}function l0($){$0=$}function c2($){J().trackDependency($)}function M0($){return J().createComputed($)}function Q0($){return J().createWatcher($)}function Z0($){return $.replace(/&/g,"\\u0026").replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}var U="data-hydration",X0="data-hydration-type",j="data-hydration-key";function i2($){let M=$.hydrationKey?` ${j}="${r0($.hydrationKey)}"`:"";return`<script type="application/json" ${U} ${X0}="${$.type}"${M}>${$.serializedValue}</script>`}function d2($){return Z0($)}function o2($,M){let Q=$.textContent;if(!Q)return M;try{return JSON.parse(Q)}catch{if(typeof console<"u")console.warn(`[@ecopages/radiant] Failed to parse hydration payload from <script ${U}>:`,Q.slice(0,120));return M}}function n2($,M,Q){let Z=$.children;if(!Z||Z.length===0){let q=$.childNodes;if(!q||q.length===0)return null;for(let X=0;X<q.length;X+=1){let G=q[X];if(G.nodeType!==1)continue;let E=G;if(q0(E,M,Q))return E}return null}for(let q=0;q<Z.length;q+=1)if(q0(Z[q],M,Q))return Z[q];return null}function q0($,M,Q){if($.tagName!=="SCRIPT"||!$.hasAttribute(U)||$.getAttribute(X0)!==M)return!1;if(Q!==void 0)return $.getAttribute(j)===Q;return!$.hasAttribute(j)}function r0($){return $.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")}import{createMarkupNodeLike as t0,isKeyedJsxValue as G0,isSlotJsxValue as a0}from"@ecopages/jsx";var P="",B="data-radiant-slot-projection";function W0($){let M=new Map;for(let Q of Array.from($.childNodes)){if(Q2(Q))continue;e0(M,M2(Q),Q)}return M}function U0($){let M;try{M=JSON.parse($)}catch{if(typeof console<"u")console.warn("[@ecopages/radiant] Failed to parse slot projection payload:",$.slice(0,120));return new Map}let Q=new Map;for(let[Z,q]of Object.entries(M)){if(!Array.isArray(q)||q.length===0)continue;Q.set(A(Z),q.map((X)=>t0(X)))}return Q}function E0($){let M=Array.from($.childNodes).filter((Q)=>H0(Q)).map((Q)=>L(Q)??"").filter((Q)=>Q!=="");return M.length>0?M.join(""):void 0}function F0($){let M={};for(let[Q,Z]of $.entries()){let q=Z.map((X)=>L(X)).filter((X)=>X!==void 0&&X!=="");if(q.length>0)M[Q]=q}return Object.keys(M).length>0?JSON.stringify(M):void 0}function J0($,M){let Q=!1,Z=(X)=>{if(a0(X))return Q=!0,q2(X,M,Z);if(G0(X))return $2(X,Z(X.value));if(Z2(X))return{_$rType$:1,rootLocalName:X.rootLocalName,ssrIntrinsicProps:X.ssrIntrinsicProps,strings:X.strings,values:X.values.map((G)=>Z(G))};if(w0(X))return Array.from(X,(G)=>Z(G));return X},q=Z($);return{containsSlots:Q,value:q}}function P0($){for(let M of Array.from($.childNodes)){if(!D0(M))continue;let Q=M.textContent??void 0;return M.parentNode?.removeChild(M),Q}return}function e0($,M,Q){let Z=$.get(M);if(Z){Z.push(Q);return}$.set(M,[Q])}function $2($,M){return{...$,value:M}}function M2($){if($ instanceof Element)return A($.getAttribute("slot"));return P}function w0($){return typeof $!=="string"&&typeof $==="object"&&$!==null&&Symbol.iterator in $}function D0($){return $ instanceof HTMLScriptElement&&$.hasAttribute(B)}function H0($){return $ instanceof HTMLScriptElement&&$.hasAttribute(U)}function Q2($){return D0($)||H0($)}function Z2($){return typeof $==="object"&&$!==null&&$._$rType$===1&&Array.isArray($.strings)&&Array.isArray($.values)}function A($){return $??P}function L($){if($===void 0||$===null||$===!1||$===!0)return;if(typeof Node<"u"&&$ instanceof Node){if($.nodeType===Node.TEXT_NODE)return $.textContent??"";return $.outerHTML??$.textContent??void 0}if(G0($))return L($.value);if(typeof $==="string"||typeof $==="number"||typeof $==="bigint")return String($);if(typeof $==="object"&&$!==null&&"outerHTML"in $)return typeof $.outerHTML==="string"?$.outerHTML:$.textContent??void 0;if(w0($))return Array.from($,(M)=>L(M)??"").join("");return}function q2($,M,Q){let Z=M.get(A($.name));if(Z&&Z.length>0)return Z.length===1?Z[0]:Z;if($.fallback===void 0)return"";return Q($.fallback)}import{hydrate as X2,render as G2}from"@ecopages/jsx";class C{#$;#M=new Map;#Q;#q;#Z;#X=0;constructor($){this.#$=$,this.#q=Q0(()=>{this.#$.requestUpdate()})}get slotProjectionVersion(){return this.#X}getSlotElements($){return this.ensureSlotProjectionState(),(this.#M.get($??P)??[]).filter((M)=>typeof Node<"u"&&M instanceof Element)}getSlotProjectionScriptTag(){this.ensureSlotProjectionState();let $=F0(this.#M);if(!$)return;return`<script type="application/json" ${B}>${W2($)}</script>`}getAuthoredHydrationScriptMarkup(){return E0(this.#$)??void 0}hydrate($){this.disconnectSlotProjectionObserver();try{X2(this.resolveTrackedRenderOutput().value,$)}finally{this.observeSlotProjection()}}render($){this.disconnectSlotProjectionObserver();try{G2(this.resolveTrackedRenderOutput().value,$)}finally{this.observeSlotProjection()}}observeSlotProjection(){if(typeof MutationObserver>"u"||this.#Z||!this.#$.isConnected)return;this.#Z=new MutationObserver(($)=>this.handleSlotProjectionMutations($)),this.#Z.observe(this.#$,{childList:!0})}disconnectSlotProjectionObserver(){this.#Z?.disconnect(),this.#Z=void 0}disconnectRenderWatcher(){if(!this.#Q)return;this.#q.unwatch(this.#Q),this.#Q=void 0}resolveTrackedRenderOutput(){let $=M0(()=>this.resolveRenderOutput()),M=$.get();if(!this.#$.isConnected)return M;if(this.#Q)this.#q.unwatch(this.#Q);return this.#Q=$,this.#q.watch($),M}dispose(){this.disconnectSlotProjectionObserver(),this.disconnectRenderWatcher()}ensureSlotProjectionState(){if(this.#M.size>0)return;let $=this.#$.isConnected?P0(this.#$):void 0;if(typeof $==="string"&&$!==""){this.#M=U0($),this.#X+=1;return}if(this.#$.childNodes.length>0)this.#M=W0(this.#$),this.#X+=1}handleSlotProjectionMutations($){let M=!1;for(let Q of $){for(let Z of Array.from(Q.removedNodes))if(this.removeProjectedSlotNode(Z))M=!0;for(let Z of Array.from(Q.addedNodes)){if(Z.parentNode!==this.#$)continue;if(this.addProjectedSlotNode(Z))M=!0}}if(M)this.#X+=1,this.#$.requestUpdate()}addProjectedSlotNode($){if($ instanceof HTMLScriptElement&&($.hasAttribute(B)||$.hasAttribute(U)))return!1;let M=$ instanceof Element?$.getAttribute("slot")??P:P,Q=this.#M.get(M);if(Q){if(Q.includes($))return!1;return Q.push($),!0}return this.#M.set(M,[$]),!0}removeProjectedSlotNode($){for(let[M,Q]of this.#M.entries()){let Z=Q.indexOf($);if(Z===-1)continue;if(Q.splice(Z,1),Q.length===0)this.#M.delete(M);return!0}return!1}resolveRenderOutput(){return this.ensureSlotProjectionState(),J0(this.#$.render(),this.#M)}}function W2($){return $.replace(/</g,"\\u003c")}class k{options;needsRender=!1;isRendering=!1;isRenderScheduled=!1;constructor($){this.options=$}get rendering(){return this.isRendering}get pending(){return this.needsRender}markPending(){this.needsRender=!0}clearPending(){this.needsRender=!1}requestUpdate(){if(this.needsRender=!0,this.isRenderScheduled)return;this.isRenderScheduled=!0,queueMicrotask(()=>{if(this.isRenderScheduled=!1,!this.needsRender)return;this.flush()})}flush(){if(!this.options.canFlush())return;while(this.needsRender&&this.options.canFlush())this.needsRender=!1,this.runCommit()}runExclusive($){this.isRendering=!0;try{return $()}finally{this.isRendering=!1}}runCommit(){this.isRendering=!0;try{this.options.commit()}finally{this.isRendering=!1}}}import{createSubscribableJsxValue as U2}from"@ecopages/jsx";function L0($){return U2({getValue:()=>$.get(),subscribe:(M)=>$.subscribe(M)})}class T{host;access;shouldAutoBind;bindings;$;reactiveMembers=new Map;jsxBindings=new Map;updateCallbacks=new Map;onConnectedCallbacks=[];onDisconnectedCallback=[];constructor($,M,Q){this.host=$;this.access=M;this.shouldAutoBind=Q;let Z=this.createReactiveBindingNamespace();this.bindings=Z,this.$=Z}connectHost(){for(let $ of this.onConnectedCallbacks)$()}disconnectHost(){for(let $ of this.onDisconnectedCallback)$()}registerCleanupCallback($){this.onDisconnectedCallback.push($)}registerConnectedCallback($){this.onConnectedCallbacks.push($)}notifyUpdate($,M,Q){let Z=this.updateCallbacks.get($);if(!Z)return;for(let q of[...Z.keys()])q()}getReactiveMember($){return this.reactiveMembers.get($)}createReactiveMember($,M){let Q=J().createState(M);return this.registerMember($,Q),Q}registerReactiveMember($,M){this.registerMember($,M)}registerMember($,M){this.reactiveMembers.set($,M),this.jsxBindings.delete($);let Q=this.updateCallbacks.get($);if(Q)for(let Z of Q.keys())this.subscribeCallback($,Z)}subscribeCallback($,M){let Q=this.updateCallbacks.get($),Z=this.reactiveMembers.get($);if(!Q||!Z||Q.get(M))return;let q=Z.subscribe(()=>M());Q.set(M,q)}getReactiveBinding($){let M=$,Q=this.jsxBindings.get(M);if(Q)return Q;let Z=this.reactiveMembers.get(M);if(!Z)throw Error(`No reactive binding registered for "${String($)}".`);let q=L0(Z);return this.jsxBindings.set(M,q),q}registerUpdateCallback($,M){let Q=this.updateCallbacks.get($);if(!Q)Q=new Map,this.updateCallbacks.set($,Q);return Q.set(M,void 0),this.subscribeCallback($,M),()=>{let Z=this.updateCallbacks.get($);if(Z?.get(M)?.(),Z?.delete(M),Z&&Z.size===0)this.updateCallbacks.delete($)}}defineReactiveBinding($,M=!0){let Q=typeof M==="string"?M:M?`$${$}`:void 0,Z=this.access.getBindingTarget?.(this.host)??this.host;if(!Q||this.access.hasProperty(this.host,Q))return;this.access.defineProperty(Z,Q,{get:()=>this.getReactiveBinding($),enumerable:!1,configurable:!0})}defineReactiveAccessor($,M){let Q=M.bind??this.shouldAutoBind();this.defineReactiveBinding($,Q),this.access.defineProperty(this.host,$,{get:()=>M.signal.get(),set:(Z)=>{M.signal.set(Z),M.onSet?.(Z)},enumerable:!0,configurable:!0})}createReactiveField($,M,Q={}){let Z=this.reactiveMembers.get($),q=Z??this.createReactiveMember($,M);if(Z&&M!==void 0)q.set(M);if(this.defineReactiveAccessor($,{bind:Q.bind,signal:q}),!Q.suppressInitialNotify)this.notifyUpdate($,void 0,q.get())}createReactiveBindingNamespace(){return new Proxy(Object.create(null),{get:($,M)=>{if(typeof M!=="string")return;return this.getReactiveBinding(M)}})}}var v=Symbol.for("@ecopages/radiant.ssr-preparation-callbacks"),B0=Symbol.for("@ecopages/radiant.ssr-preparation-running");function F3($,M){let Z=$[v];if(Array.isArray(Z)){Z.push(M);return}Object.defineProperty($,v,{value:[M],configurable:!0})}function x0($){let M=$,Q=M[v];if(!Array.isArray(Q))return;M[B0]=!0;try{for(let Z of Q)Z()}finally{delete M[B0]}}var S=Symbol.for("@ecopages/radiant.hydrator-installed");function P3(){globalThis[S]=!0}function w3(){delete globalThis[S]}function Y0(){return globalThis[S]===!0}import{getActiveSsrScopeValue as E2,withActiveSsrScopeValue as F2}from"@ecopages/jsx/server";var O0=Symbol.for("@ecopages/radiant.element-ssr-runtime");function K0(){return E2(O0)}function L3($,M){return F2(O0,$,M)}import{hasHydrationMarkers as J2,jsx as P2}from"@ecopages/jsx";var w2=D2();function D2(){if(typeof HTMLElement<"u")return HTMLElement;throw Error("RadiantElement requires HTMLElement. Install '@ecopages/radiant/server/light-dom-shim' before SSR imports.")}class z0 extends w2{renderRootMode="light";bindings;$;reactiveHost;reactivePropertyState;eventSubscriptionRegistry;hostSsrRegistry=new f;eventEmitters=new Map;elementReady=!1;isFirstConnectPending=!1;renderScheduler;renderRuntime;constructor(){super();this.reactivePropertyState=new I(this),this.eventSubscriptionRegistry=new R(()=>this.resolveRenderSurface().interactionTarget,()=>this),this.renderScheduler=new k({canFlush:()=>this.isConnected&&!this.renderScheduler.rendering&&!(this.isFirstConnectPending&&f0(this)),commit:()=>{let{renderTarget:$}=this.resolveRenderSurface();this.getOrCreateRenderRuntime().render($)}}),this.reactiveHost=new T(this,{defineProperty:($,M,Q)=>Object.defineProperty($,M,Q),getBindingTarget:($)=>Object.getPrototypeOf($)??$,hasProperty:($,M)=>(M in $),readProperty:($,M)=>$[M]},()=>this.shouldAutoBindReactiveMembers()),this.bindings=this.reactiveHost.bindings,this.$=this.reactiveHost.$,D(this,"construct")}get slotProjectionVersion(){return this.renderRuntime?.slotProjectionVersion??0}connectedCallback(){D(this,"connect");let $=this.isFirstConnectPending;if(this.elementReady=!0,this.reactiveHost.connectHost(),$)return;this.isFirstConnectPending=!0,queueMicrotask(()=>{if(this.isFirstConnectPending=!1,!this.isConnected)return;if(!this.shouldRunRenderLifecycle())return;if(this.getOrCreateRenderRuntime().observeSlotProjection(),f0(this)){if(this.renderScheduler.clearPending(),this.hydrate(),this.renderScheduler.pending)this.update();return}this.update()})}connectedContextCallback($){}disconnectedCallback(){this.renderRuntime?.dispose(),this.renderRuntime=void 0,this.eventSubscriptionRegistry.removeAll(),this.reactiveHost.disconnectHost()}notifyUpdate($,M,Q){this.reactiveHost.notifyUpdate($,M,Q)}attributeChangedCallback($,M,Q){if(M===Q||!this.elementReady)return;this.reactivePropertyState.applyAttributeChange($,M,Q)}renderTemplate({target:$=this,template:M,insert:Q="replace",sanitize:Z}){let q=Z?Z(M):M;switch(Q){case"replace":$.innerHTML=q;break;case"beforeend":$.insertAdjacentHTML("beforeend",q);break;case"afterbegin":$.insertAdjacentHTML("afterbegin",q);break;case"beforebegin":$.insertAdjacentHTML("beforebegin",q);break;case"afterend":$.insertAdjacentHTML("afterend",q);break}}render(){return P2("slot",{})}getReactivePropDefinitions(){return N(this)}getPropertyValue($){return Reflect.get(this,$)}renderViewToString($={}){if(!this.shouldRunRenderLifecycle())return this.innerHTML;return D(this,"ssr"),this.prepareForSsr(),H2().renderView(this,$)}hydrate(){if(!this.shouldRunRenderLifecycle()||!this.isConnected||this.renderScheduler.rendering)return;let{renderTarget:$}=this.resolveRenderSurface(),M=this.getOrCreateRenderRuntime();this.renderScheduler.runExclusive(()=>{M.hydrate($)})}requestUpdate(){if(!this.shouldRunRenderLifecycle())return;this.renderScheduler.requestUpdate()}update(){if(!this.shouldRunRenderLifecycle())return;this.renderScheduler.markPending(),this.renderScheduler.flush()}registerReactiveProperty($){this.reactivePropertyState.register($)}getReactiveProperties(){return this.reactivePropertyState.getAll()}registerContextProvider($,M){this.hostSsrRegistry.registerContextProvider($,M)}registerHydrationBinding($,M){this.hostSsrRegistry.registerHydrationBinding($,M)}getContextProviders(){return this.hostSsrRegistry.getContextProviders()}getHydrationBindings(){return this.hostSsrRegistry.getHydrationBindings()}prepareForSsr(){x0(this)}shouldAutoBindReactiveMembers(){return!0}shouldRunRenderLifecycle(){return this.render!==z0.prototype.render}getRenderTarget(){if(this.renderRootMode!=="shadow")return this;if(this.shadowRoot)return this.shadowRoot;if(typeof this.attachShadow!=="function")throw Error("RadiantElement shadow render mode requires attachShadow().");return this.attachShadow({mode:"open"})}registerUpdateCallback($,M){return this.reactiveHost.registerUpdateCallback($,M)}getReactiveBinding($){return this.reactiveHost.getReactiveBinding($)}bind($){return this.reactiveHost.getReactiveBinding($)}defineReactiveBinding($,M=!0){this.reactiveHost.defineReactiveBinding($,M)}createReactiveMember($,M){return this.reactiveHost.createReactiveMember($,M)}registerReactiveMember($,M){this.reactiveHost.registerReactiveMember($,M)}getReactiveMember($){return this.reactiveHost.getReactiveMember($)}subscribeEvents($){let M=[];for(let Q of $)M.push(this.subscribeEvent(Q));return M}hasEventSubscription($){return this.eventSubscriptionRegistry.hasEventSubscription($)}subscribeEvent($){return this.eventSubscriptionRegistry.subscribe($)}registerCleanupCallback($){this.reactiveHost.registerCleanupCallback($)}registerConnectedCallback($){this.reactiveHost.registerConnectedCallback($)}registerEventEmitter($,M){this.eventEmitters.set($,M)}getRef($,M=!1){let Q=`[data-ref="${$}"]`,{queryRoot:Z}=this.resolveRenderSurface();if(M)return Array.from(Z.querySelectorAll(Q));return Z.querySelector(Q)??null}getSlotElement($){return this.getSlotElements($)[0]??null}getSlotElements($){return this.getOrCreateRenderRuntime().getSlotElements($)}createReactiveField($,M,Q={}){this.reactiveHost.createReactiveField($,M,Q)}createReactiveProp($,M){this.reactivePropertyState.create($,M,(Q,Z,q)=>l(this,Q,Z,q),(Q,Z)=>{this.reactiveHost.defineReactiveAccessor(Q,Z)},(Q,Z)=>this.createReactiveMember(Q,Z))}getSlotProjectionScriptTag(){return this.getOrCreateRenderRuntime().getSlotProjectionScriptTag()}getAuthoredHydrationScriptMarkup(){return this.getOrCreateRenderRuntime().getAuthoredHydrationScriptMarkup()}resolveTrackedRenderOutput(){return this.getOrCreateRenderRuntime().resolveTrackedRenderOutput()}getOrCreateRenderRuntime(){if(this.renderRuntime)return this.renderRuntime;return this.renderRuntime=new C(this),this.renderRuntime}resolveRenderSurface(){let $=this.getRenderTarget(),M=typeof ShadowRoot<"u"&&$ instanceof ShadowRoot?$:this;return{interactionTarget:M,queryRoot:M,renderTarget:$}}}function H2(){let $=K0();if(!$)throw Error("Radiant SSR runtime unavailable. Import `@ecopages/radiant/server/render-component` first.");return $}function f0($){return Y0()&&J2($)}export{z0 as RadiantElement};
|
|
2
|
+
|
|
3
|
+
//# debugId=4F27A0624E24367F64756E2164756E21
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/host-ssr-registry.ts", "../src/core/reactive-prop-metadata.ts", "../src/decorators/legacy/instance-initializers.ts", "../src/decorators/legacy/host-readiness.ts", "../src/core/event-subscription-registry.ts", "../src/utils/attribute-utils.ts", "../src/core/reactive-prop-core.ts", "../src/core/reactive-property-state.ts", "../src/core/reactivity-signals.ts", "../src/core/reactivity-runtime.ts", "../src/core/reactivity-adapter.ts", "../src/tools/escape-script-json.ts", "../src/core/hydration-codec.ts", "../src/core/slot-projection-runtime.ts", "../src/core/render-runtime.ts", "../src/core/render-scheduler.ts", "../src/core/reactive-binding-adapter.ts", "../src/core/reactive-host.ts", "../src/core/ssr-preparation.ts", "../src/core/radiant-hydrator-state.ts", "../src/core/radiant-element-ssr-registry.ts", "../src/core/radiant-element.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { SsrSerializableContextProvider } from '../context/context-provider';\nimport type { SsrSerializableHydrationBinding } from './ssr-hydration-binding';\n\n/**\n * Shared SSR provider and hydration binding storage for Radiant hosts.\n */\nexport class HostSsrRegistry {\n\tprivate readonly contextProviders = new Map<string, SsrSerializableContextProvider>();\n\tprivate readonly hydrationBindings = new Map<string, SsrSerializableHydrationBinding>();\n\n\tpublic registerContextProvider(name: string, provider: SsrSerializableContextProvider): void {\n\t\tthis.contextProviders.set(name, provider);\n\t\tthis.hydrationBindings.set(name, provider);\n\t}\n\n\tpublic registerHydrationBinding(name: string, binding: SsrSerializableHydrationBinding): void {\n\t\tthis.hydrationBindings.set(name, binding);\n\t}\n\n\tpublic getContextProviders(): SsrSerializableContextProvider[] {\n\t\treturn [...this.contextProviders.values()];\n\t}\n\n\tpublic getHydrationBindings(): SsrSerializableHydrationBinding[] {\n\t\treturn [...this.hydrationBindings.values()];\n\t}\n}\n",
|
|
6
|
+
"import type { ReactivePropertyOptions } from './reactive-prop-core';\n\nconst REACTIVE_PROP_DEFINITIONS = Symbol.for('@ecopages/radiant.reactivePropDefinitions');\n\nexport type ReactivePropDefinition = {\n\tname: string;\n\toptions: ReactivePropertyOptions<unknown>;\n};\n\ntype RadiantConstructorWithReactiveProps = CustomElementConstructor & {\n\t[REACTIVE_PROP_DEFINITIONS]?: ReactivePropDefinition[];\n};\n\nexport function registerReactivePropDefinition(\n\ttarget: object,\n\tpropertyName: string,\n\toptions: ReactivePropertyOptions<unknown>,\n): void {\n\tconst constructor = target.constructor as RadiantConstructorWithReactiveProps;\n\tconst definitions = constructor[REACTIVE_PROP_DEFINITIONS] ?? [];\n\n\tif (definitions.some((definition) => definition.name === propertyName)) {\n\t\treturn;\n\t}\n\n\tdefinitions.push({ name: propertyName, options });\n\tconstructor[REACTIVE_PROP_DEFINITIONS] = definitions;\n}\n\nexport function getReactivePropDefinitions(target: object): ReactivePropDefinition[] {\n\treturn ((target.constructor as RadiantConstructorWithReactiveProps)[REACTIVE_PROP_DEFINITIONS] ?? []).slice();\n}\n",
|
|
7
|
+
"export type LegacyPostConstructionPhase = 'connect' | 'ssr';\n\ntype LegacyInstanceInitializer<T extends object = object> = (instance: T) => void;\ntype LegacyPostConstructionInitializer<T extends object = object> = (\n\tinstance: T,\n\tphase: LegacyPostConstructionPhase,\n) => void;\n\nconst LEGACY_INSTANCE_INITIALIZERS = Symbol.for('@ecopages/radiant.legacy-instance-initializers');\nconst LEGACY_POST_CONSTRUCTION_INITIALIZERS = Symbol.for('@ecopages/radiant.legacy-post-construction-initializers');\nconst LEGACY_EXECUTED_POST_CONSTRUCTION_INITIALIZERS = Symbol.for(\n\t'@ecopages/radiant.legacy-executed-post-construction-initializers',\n);\n\n/**\n * Registers per-instance initialization work for a legacy decorator.\n *\n * Legacy decorators execute against the prototype, so any initialization that\n * needs the concrete element instance must be deferred until construction time.\n */\nexport function registerLegacyInstanceInitializer<T extends object>(\n\tproto: T,\n\tinitializer: LegacyInstanceInitializer<T>,\n): void {\n\tregisterInitializer(proto, LEGACY_INSTANCE_INITIALIZERS, initializer);\n}\n\n/**\n * Registers post-construction work for a legacy decorator.\n *\n * This phase exists for decorators that eagerly write instance fields. With\n * legacy decorators plus `useDefineForClassFields`, subclass field definition\n * can overwrite values written during the base-class constructor.\n */\nexport function registerLegacyPostConstructionInitializer<T extends object>(\n\tproto: T,\n\tinitializer: LegacyPostConstructionInitializer<T>,\n): void {\n\tregisterInitializer(proto, LEGACY_POST_CONSTRUCTION_INITIALIZERS, initializer);\n}\n\n/**\n * Runs all legacy decorator initializers for a newly constructed element.\n *\n * Initializers are collected from the prototype chain and executed from base to\n * derived class so inherited setup remains stable.\n */\nexport function runLegacyInstanceInitializers<T extends object>(instance: T): void {\n\trunLegacyInitializers(instance, LEGACY_INSTANCE_INITIALIZERS);\n}\n\n/**\n * Runs legacy decorator setup that must happen after subclass field\n * initialization has completed.\n *\n * Each initializer runs at most once per instance even if multiple lifecycle\n * entrypoints call this helper.\n */\nexport function runLegacyPostConstructionInitializers<T extends object>(\n\tinstance: T,\n\tphase: LegacyPostConstructionPhase,\n): void {\n\tconst target = instance as Record<PropertyKey, unknown>;\n\n\trunLegacyPostConstructionInitializersOnPrototypeChain(\n\t\tinstance,\n\t\tphase,\n\t\t(target[LEGACY_EXECUTED_POST_CONSTRUCTION_INITIALIZERS] ??= new Set()) as Set<\n\t\t\tLegacyPostConstructionInitializer<T>\n\t\t>,\n\t);\n}\n\nfunction registerInitializer<T extends object>(\n\tproto: T,\n\tkey: symbol,\n\tinitializer: LegacyInstanceInitializer<T> | LegacyPostConstructionInitializer<T>,\n): void {\n\tconst target = proto as Record<PropertyKey, unknown>;\n\tconst ownInitializers = Object.prototype.hasOwnProperty.call(target, key) ? target[key] : undefined;\n\n\tif (Array.isArray(ownInitializers)) {\n\t\townInitializers.push(initializer);\n\t\treturn;\n\t}\n\n\tObject.defineProperty(target, key, {\n\t\tvalue: [initializer],\n\t});\n}\n\nfunction runLegacyInitializers<T extends object>(instance: T, key: symbol): void {\n\twalkPrototypeChain(instance, (prototype) => {\n\t\tconst initializers = (prototype as Record<PropertyKey, unknown>)[key] as\n\t\t\tLegacyInstanceInitializer<T>[] | undefined;\n\n\t\tif (!Array.isArray(initializers)) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const initializer of initializers) {\n\t\t\tinitializer(instance);\n\t\t}\n\t});\n}\n\nfunction runLegacyPostConstructionInitializersOnPrototypeChain<T extends object>(\n\tinstance: T,\n\tphase: LegacyPostConstructionPhase,\n\texecutedInitializers: Set<LegacyPostConstructionInitializer<T>>,\n): void {\n\tfor (const prototype of collectPrototypeChain(instance)) {\n\t\tconst initializers = (prototype as Record<PropertyKey, unknown>)[LEGACY_POST_CONSTRUCTION_INITIALIZERS] as\n\t\t\tLegacyPostConstructionInitializer<T>[] | undefined;\n\n\t\tif (!Array.isArray(initializers)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const initializer of initializers) {\n\t\t\tif (executedInitializers.has(initializer)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tinitializer(instance, phase);\n\t\t\texecutedInitializers.add(initializer);\n\t\t}\n\t}\n}\n\nfunction collectPrototypeChain<T extends object>(instance: T): object[] {\n\tconst prototypes: object[] = [];\n\tlet prototype: object | null = Object.getPrototypeOf(instance);\n\n\twhile (prototype && prototype !== Object.prototype) {\n\t\tprototypes.unshift(prototype);\n\t\tprototype = Object.getPrototypeOf(prototype);\n\t}\n\n\treturn prototypes;\n}\n\nfunction walkPrototypeChain<T extends object>(instance: T, visit: (prototype: object) => void): void {\n\tfor (const prototype of collectPrototypeChain(instance)) {\n\t\tvisit(prototype);\n\t}\n}\n",
|
|
8
|
+
"import { runLegacyInstanceInitializers, runLegacyPostConstructionInitializers } from './instance-initializers';\n\nexport type LegacyHostReadinessPhase = 'construct' | 'connect' | 'ssr';\n\n/**\n * Runs legacy decorator initialization for the requested lifecycle phase.\n *\n * Post-construction work is idempotent — multiple calls with `connect` or `ssr`\n * only execute each registered initializer once per instance.\n */\nexport function ensureLegacyHostReady<T extends object>(host: T, phase: LegacyHostReadinessPhase): void {\n\tswitch (phase) {\n\t\tcase 'construct':\n\t\t\trunLegacyInstanceInitializers(host);\n\t\t\tbreak;\n\t\tcase 'connect':\n\t\t\trunLegacyPostConstructionInitializers(host, 'connect');\n\t\t\tbreak;\n\t\tcase 'ssr':\n\t\t\trunLegacyPostConstructionInitializers(host, 'ssr');\n\t\t\tbreak;\n\t}\n}\n",
|
|
9
|
+
"export type ElementEventListenerConfig = {\n\tselector: string;\n\ttype: string;\n\tlistener: EventListener;\n\toptions?: AddEventListenerOptions;\n};\n\ntype RadiantElementEventSubscription = ElementEventListenerConfig & {\n\ttarget: EventTarget;\n};\n\nexport class EventSubscriptionRegistry {\n\tprivate readonly subscriptions = new Map<string, RadiantElementEventSubscription>();\n\n\tconstructor(\n\t\tprivate readonly getInteractionTarget: () => EventTarget,\n\t\tprivate readonly getListenerContext: () => object,\n\t) {}\n\n\tpublic subscribe(eventConfig: ElementEventListenerConfig): () => void {\n\t\tconst interactionTarget = this.getInteractionTarget();\n\t\tconst listenerContext = this.getListenerContext();\n\t\tconst delegatedListener = (delegatedEvent: Event) => {\n\t\t\tif (delegatedEvent.target && (delegatedEvent.target as Element).matches(eventConfig.selector)) {\n\t\t\t\teventConfig.listener.call(listenerContext, delegatedEvent);\n\t\t\t}\n\t\t};\n\t\tconst subscriptionId = `${eventConfig.type}:${eventConfig.selector}`;\n\t\tinteractionTarget.addEventListener(eventConfig.type, delegatedListener, eventConfig.options);\n\t\tthis.subscriptions.set(subscriptionId, {\n\t\t\t...eventConfig,\n\t\t\tlistener: delegatedListener,\n\t\t\ttarget: interactionTarget,\n\t\t});\n\n\t\treturn () => {\n\t\t\tthis.unsubscribe(subscriptionId);\n\t\t};\n\t}\n\n\tpublic hasEventSubscription(subscriptionId: string): boolean {\n\t\treturn this.subscriptions.has(subscriptionId);\n\t}\n\n\tpublic removeAll(): void {\n\t\tfor (const eventSubscription of this.subscriptions.values()) {\n\t\t\teventSubscription.target.removeEventListener(\n\t\t\t\teventSubscription.type,\n\t\t\t\teventSubscription.listener,\n\t\t\t\teventSubscription.options,\n\t\t\t);\n\t\t}\n\t\tthis.subscriptions.clear();\n\t}\n\n\tprivate unsubscribe(id: string): void {\n\t\tconst eventSubscription = this.subscriptions.get(id);\n\t\tif (eventSubscription) {\n\t\t\teventSubscription.target.removeEventListener(\n\t\t\t\teventSubscription.type,\n\t\t\t\teventSubscription.listener,\n\t\t\t\teventSubscription.options,\n\t\t\t);\n\t\t\tthis.subscriptions.delete(id);\n\t\t}\n\t}\n}\n",
|
|
10
|
+
"import type { RadiantElement } from '../core/radiant-element';\n\nexport type AttributeTypeConstant = typeof Array | typeof Boolean | typeof Number | typeof Object | typeof String;\n\nexport type AttributeTypeDefault = Array<unknown> | boolean | number | Record<string, unknown> | string;\n\n/**\n * Parses the given attribute type constant and returns its corresponding string representation.\n *\n * @param constant - The attribute type constant to parse.\n * @returns The string representation of the attribute type constant.\n */\nexport function parseAttributeTypeConstant(constant?: AttributeTypeConstant) {\n\tswitch (constant) {\n\t\tcase Array:\n\t\t\treturn 'array';\n\t\tcase Boolean:\n\t\t\treturn 'boolean';\n\t\tcase Number:\n\t\t\treturn 'number';\n\t\tcase Object:\n\t\t\treturn 'object';\n\t\tcase String:\n\t\t\treturn 'string';\n\t}\n}\n\n/**\n * Parses the attribute type default value and returns its type as a string.\n *\n * @param defaultValue - The default value of the attribute type.\n * @returns The type of the default value as a string.\n */\nexport function parseAttributeTypeDefault(defaultValue?: AttributeTypeDefault) {\n\tswitch (typeof defaultValue) {\n\t\tcase 'boolean':\n\t\t\treturn 'boolean';\n\t\tcase 'number':\n\t\t\treturn 'number';\n\t\tcase 'string':\n\t\t\treturn 'string';\n\t}\n\n\tif (Array.isArray(defaultValue)) return 'array';\n\tif (Object.prototype.toString.call(defaultValue) === '[object Object]') return 'object';\n}\n\n/**\n * Returns the default value for a given attribute type.\n *\n * @param type - The attribute type constant.\n * @returns The default value for the specified attribute type.\n */\nexport function defaultValueForType(type: AttributeTypeConstant): unknown {\n\tswitch (type) {\n\t\tcase Number:\n\t\t\treturn 0;\n\t\tcase String:\n\t\t\treturn '';\n\t\tcase Boolean:\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\ntype Reader = (value: string) => number | string | boolean | object | unknown[];\n\n/**\n * Utility function to parse a JSON string safely\n */\nfunction parseJSON<T>(value: string): T {\n\ttry {\n\t\treturn JSON.parse(value);\n\t} catch {\n\t\tthrow new TypeError('Invalid JSON string');\n\t}\n}\n\n/**\n * Object that maps attribute types to reader functions.\n * @type {Object.<string, Reader>}\n */\nconst readers: { [type: string]: Reader } = {\n\tarray(value: string): unknown[] {\n\t\tconst array = parseJSON<unknown[]>(value);\n\t\tif (!Array.isArray(array)) {\n\t\t\tthrow new TypeError(`Expected an array but got a value of type \"${typeof array}\"`);\n\t\t}\n\t\treturn array;\n\t},\n\n\tboolean(value: string): boolean {\n\t\treturn !(value === '0' || String(value).toLowerCase() === 'false');\n\t},\n\n\tnumber(value: string): number {\n\t\tconst number = Number(value.replace(/_/g, ''));\n\t\treturn number;\n\t},\n\n\tobject(value: string): object {\n\t\tconst object = JSON.parse(value);\n\t\tif (object === null || typeof object !== 'object' || Array.isArray(object)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseAttributeTypeDefault(\n\t\t\t\t\tobject,\n\t\t\t\t)}\"`,\n\t\t\t);\n\t\t}\n\t\treturn object;\n\t},\n\n\tstring(value: string): string {\n\t\treturn value;\n\t},\n};\n\ntype Writer = (value: unknown) => string;\n\n/**\n * Object that maps attribute types to writer functions.\n * @type {Object.<string, Writer>}\n */\nconst writers: { [type: string]: Writer } = {\n\tdefault: writeString,\n\tarray: writeJSON,\n\tobject: writeJSON,\n};\n\nfunction writeJSON(value: unknown) {\n\treturn JSON.stringify(value);\n}\n\nfunction writeString(value: unknown) {\n\treturn `${value}`;\n}\n\n/**\n * Reads the attribute value based on the provided type.\n * @param value - The attribute value to be read.\n * @param type - The type of the attribute.\n * @returns The parsed attribute value.\n * @throws {TypeError} If the provided type is unknown.\n */\nexport function readAttributeValue(value: string, type: AttributeTypeConstant) {\n\tconst readerType = parseAttributeTypeConstant(type);\n\tif (!readerType) throw new TypeError(`[radiant-element] Unknown type \"${type}\"`);\n\treturn readers[readerType]!(value);\n}\n\nexport type ReadAttributeValueReturnType = ReturnType<typeof readAttributeValue>;\n\n/**\n * Writes the attribute value based on the provided type.\n *\n * @param value - The value to be written.\n * @param type - The type of the attribute.\n * @returns The written attribute value.\n * @throws {TypeError} If the provided type is unknown.\n */\nexport function writeAttributeValue(value: unknown, type: AttributeTypeConstant) {\n\tconst writerType = parseAttributeTypeConstant(type);\n\tif (!writerType) throw new TypeError(`[radiant-element] Unknown type \"${type}\"`);\n\tconst writer: Writer = writers[writerType] ?? writers.default ?? writeString;\n\treturn writer(value);\n}\n\nexport type WriteAttributeValueReturnType = ReturnType<typeof writeAttributeValue>;\n\n/*\n * Type guard functions for each type in AttributeTypeConstant\n */\nfunction isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean';\n}\n\nfunction isNumber(value: unknown): value is number {\n\treturn typeof value === 'number';\n}\n\nfunction isString(value: unknown): value is string {\n\treturn typeof value === 'string';\n}\n\nfunction isArray(value: unknown): value is Array<unknown> {\n\treturn Array.isArray(value);\n}\n\nfunction isObject(value: unknown): value is object {\n\treturn typeof value === 'object' && !Array.isArray(value) && value !== null;\n}\n\n/*\n * Check function to ensure defaultValue matches the type\n */\nexport function isValueOfType(type: AttributeTypeConstant, defaultValue: unknown): boolean {\n\tswitch (type) {\n\t\tcase Boolean:\n\t\t\treturn isBoolean(defaultValue);\n\t\tcase Number:\n\t\t\treturn isNumber(defaultValue);\n\t\tcase String:\n\t\t\treturn isString(defaultValue);\n\t\tcase Array:\n\t\t\treturn isArray(defaultValue);\n\t\tcase Object:\n\t\t\treturn isObject(defaultValue);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\nexport const getInitialValue = (\n\ttarget: RadiantElement,\n\ttype: AttributeTypeConstant,\n\tattributeKey: string,\n\tdefaultValue: unknown,\n) => {\n\tif (type === Boolean) {\n\t\tconst attributeValue = target.getAttribute(attributeKey);\n\t\tif (attributeValue === null) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\treturn attributeValue === '' ? true : readAttributeValue(attributeValue, type);\n\t}\n\n\tconst attributeValue = target.getAttribute(attributeKey);\n\treturn attributeValue !== null\n\t\t? readAttributeValue(attributeValue, type)\n\t\t: (defaultValue ?? (defaultValueForType(type) as typeof defaultValue));\n};\n",
|
|
11
|
+
"import type { JsxBindingSourceValue, JsxRenderable, SubscribableJsxValueWithAccess } from '@ecopages/jsx';\nimport type { ReactiveState } from './reactivity-contract';\nimport {\n\ttype AttributeTypeConstant,\n\ttype ReadAttributeValueReturnType,\n\ttype WriteAttributeValueReturnType,\n\tisValueOfType,\n\treadAttributeValue,\n\twriteAttributeValue,\n} from '../utils/attribute-utils';\n\ntype StringPropertyKey<Value> = Extract<keyof Value, string>;\n\nexport interface ReactiveProperty<T = unknown> {\n\ttype: AttributeTypeConstant;\n\tinitialValue?: T;\n\tname: string;\n\tattribute: string;\n\tconverter: {\n\t\tfromAttribute: (value: string) => ReadAttributeValueReturnType;\n\t\ttoAttribute: (value: any) => WriteAttributeValueReturnType;\n\t};\n}\n\nexport type ReactivePropertyOptions<T> = {\n\ttype: AttributeTypeConstant;\n\treflect?: boolean;\n\tattribute?: string;\n\tdefaultValue?: T;\n\tbind?: boolean | string;\n};\n\nexport type ReactiveBindingOption = boolean | string;\n\nexport type ReactiveFieldOptions = {\n\tbind?: ReactiveBindingOption;\n\t/** When true, skip the initial notifyUpdate emitted while defining the field. */\n\tsuppressInitialNotify?: boolean;\n};\n\nexport type ReactiveBindingValue<\n\tHost extends object,\n\tProperty extends StringPropertyKey<Host>,\n> = Host[Property] extends JsxBindingSourceValue ? Host[Property] : JsxRenderable;\n\nexport type ReactiveBindings<Bindings extends object> = {\n\treadonly [Property in StringPropertyKey<Bindings>]: SubscribableJsxValueWithAccess<\n\t\tReactiveBindingValue<Bindings, Property>\n\t>;\n};\n\nexport type ReactiveAccessorDefinition<T> = {\n\tbind?: ReactiveBindingOption;\n\tsignal: ReactiveState<T>;\n\tonSet?: (value: T) => void;\n};\n\nexport function validateReactivePropertyDefault(type: AttributeTypeConstant, defaultValue: unknown): void {\n\tif (defaultValue !== undefined && !isValueOfType(type, defaultValue)) {\n\t\tthrow new Error(`defaultValue does not match the expected type for ${type.name}`);\n\t}\n}\n\nexport function createReactivePropertyMapping<T>(\n\tpropertyName: string,\n\tattributeKey: string,\n\ttype: AttributeTypeConstant,\n\tinitialValue: T | undefined,\n): ReactiveProperty<T> {\n\treturn {\n\t\ttype,\n\t\tname: propertyName,\n\t\tinitialValue,\n\t\tattribute: attributeKey,\n\t\tconverter: {\n\t\t\tfromAttribute: (value) => readAttributeValue(value, type),\n\t\t\ttoAttribute: (value) => writeAttributeValue(value, type),\n\t\t},\n\t};\n}\n",
|
|
12
|
+
"import {\n\tcreateReactivePropertyMapping,\n\ttype ReactiveAccessorDefinition,\n\ttype ReactiveProperty,\n\ttype ReactivePropertyOptions,\n\tvalidateReactivePropertyDefault,\n} from './reactive-prop-core';\nimport type { ReactiveState } from './reactivity-contract';\nimport type { AttributeTypeConstant } from '../utils/attribute-utils';\n\nexport type ReactivePropertyStateHost = HTMLElement & {\n\tnotifyUpdate(changedProperty: string, oldValue: unknown, value: unknown): void;\n\tcreateReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T>;\n\tgetReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined;\n};\n\nexport class ReactivePropertyState {\n\tprivate readonly properties = new Map<string, ReactiveProperty>();\n\tprivate readonly preUpgradePropertyValues = new Map<string, unknown>();\n\n\tconstructor(private readonly host: ReactivePropertyStateHost) {\n\t\tfor (const propertyName of Object.getOwnPropertyNames(host)) {\n\t\t\tthis.preUpgradePropertyValues.set(propertyName, Reflect.get(host, propertyName));\n\t\t}\n\t}\n\n\tpublic register(config: ReactiveProperty): void {\n\t\tthis.properties.set(config.name, config);\n\t}\n\n\tpublic getAll(): ReactiveProperty[] {\n\t\treturn Array.from(this.properties.values());\n\t}\n\n\tpublic applyAttributeChange(name: string, oldValue: string | null, newValue: string | null): void {\n\t\tconst config = this.properties.get(name);\n\n\t\tif (!config) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transformedValue = this.transformAttributeValue(newValue, config);\n\n\t\tReflect.set(this.host, config.name, transformedValue);\n\t}\n\n\tpublic create<T>(\n\t\tpropertyName: string,\n\t\toptions: ReactivePropertyOptions<T>,\n\t\tresolveInitialValue: (type: AttributeTypeConstant, attributeKey: string, defaultValue: unknown) => T,\n\t\tdefineReactiveAccessor: (propertyName: string, config: ReactiveAccessorDefinition<T>) => void,\n\t\tcreateReactiveMember: <U>(propertyName: string, initialValue: U) => ReactiveState<U>,\n\t): void {\n\t\tconst { type, attribute, reflect, defaultValue } = options;\n\t\tconst attributeKey = attribute ?? propertyName;\n\t\tconst hasPreUpgradeValue = this.preUpgradePropertyValues.has(propertyName);\n\t\tconst preUpgradeValue = hasPreUpgradeValue ? (this.preUpgradePropertyValues.get(propertyName) as T) : undefined;\n\n\t\tvalidateReactivePropertyDefault(type, defaultValue);\n\n\t\tconst initialValue: T | undefined = hasPreUpgradeValue\n\t\t\t? preUpgradeValue\n\t\t\t: resolveInitialValue(type, attributeKey, defaultValue);\n\n\t\tif (this.host.hasAttribute(attributeKey) && (!reflect || initialValue == null || initialValue === '')) {\n\t\t\tthis.host.removeAttribute(attributeKey);\n\t\t}\n\n\t\tif (hasPreUpgradeValue && Object.prototype.hasOwnProperty.call(this.host, propertyName)) {\n\t\t\tReflect.deleteProperty(this.host, propertyName);\n\t\t}\n\n\t\tconst propertyMapping = createReactivePropertyMapping(propertyName, attributeKey, type, initialValue);\n\n\t\tthis.register(propertyMapping);\n\n\t\tconst existingMember = this.host.getReactiveMember<T>(propertyName);\n\t\tconst signal = existingMember ?? createReactiveMember(propertyName, initialValue as T);\n\n\t\tif (existingMember && initialValue !== undefined) {\n\t\t\texistingMember.set(initialValue as T);\n\t\t}\n\n\t\tdefineReactiveAccessor(propertyName, {\n\t\t\tbind: options.bind,\n\t\t\tsignal,\n\t\t\tonSet: (value) => this.reflectValue(attributeKey, reflect, propertyMapping, value),\n\t\t});\n\n\t\tif (initialValue !== undefined) {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tconst currentValue = signal.get();\n\t\t\t\tif (currentValue === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.reflectValue(attributeKey, reflect, propertyMapping, currentValue);\n\t\t\t\tthis.host.notifyUpdate(propertyName, undefined, currentValue);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate transformAttributeValue(value: string | null, config: ReactiveProperty): unknown {\n\t\treturn value !== null ? config.converter.fromAttribute(value) : value;\n\t}\n\n\tprivate reflectValue<T>(\n\t\tattributeKey: string,\n\t\treflect: boolean | undefined,\n\t\tproperty: ReactiveProperty<T>,\n\t\tvalue: T,\n\t): void {\n\t\tif (!reflect) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (value == null || value === '' || value === false) {\n\t\t\tthis.host.removeAttribute(attributeKey);\n\t\t\treturn;\n\t\t}\n\n\t\tconst attributeValue = property.converter.toAttribute(value);\n\t\tthis.host.setAttribute(attributeKey, attributeValue);\n\t}\n}\n",
|
|
13
|
+
"import {\n\tComputed as SignalsComputed,\n\tstate as signalsState,\n\tsubtle,\n\ttrackDependency,\n\ttype DependencyNode as SignalsDependencyNode,\n} from '@ecopages/signals';\nimport type {\n\tReactiveComputed,\n\tReactiveDependencyNode,\n\tReactiveRuntime,\n\tReactiveState,\n\tReactiveWatcher,\n} from './reactivity-contract';\n\nfunction asSignalsDependencyNode(node: ReactiveDependencyNode): SignalsDependencyNode {\n\treturn node as SignalsDependencyNode;\n}\n\nfunction asSignalsComputed(signal: ReactiveComputed<unknown>): SignalsComputed<unknown> {\n\treturn signal as SignalsComputed<unknown>;\n}\n\n/**\n * Default Signals-backed implementation of Radiant's internal reactivity\n * runtime contract.\n *\n * This is the only core module that imports `@ecopages/signals` directly. The\n * rest of core consumes the narrower runtime contract through the adapter and\n * runtime holder modules.\n */\nexport const signalsReactiveRuntime: ReactiveRuntime = {\n\ttrackDependency(node) {\n\t\ttrackDependency(asSignalsDependencyNode(node));\n\t},\n\tcreateComputed<T>(read: () => T): ReactiveComputed<T> {\n\t\treturn new SignalsComputed(read);\n\t},\n\tcreateWatcher(notify: () => void): ReactiveWatcher {\n\t\tconst watcher = new subtle.Watcher(notify);\n\n\t\treturn {\n\t\t\twatch(signal) {\n\t\t\t\twatcher.watch(asSignalsComputed(signal));\n\t\t\t},\n\t\t\tunwatch(signal) {\n\t\t\t\twatcher.unwatch(asSignalsComputed(signal));\n\t\t\t},\n\t\t};\n\t},\n\tcreateState<T>(initial: T): ReactiveState<T> {\n\t\treturn signalsState(initial) as unknown as ReactiveState<T>;\n\t},\n};\n",
|
|
14
|
+
"import type { ReactiveRuntime } from './reactivity-contract';\nimport { signalsReactiveRuntime } from './reactivity-signals';\n\nlet activeReactiveRuntime: ReactiveRuntime = signalsReactiveRuntime;\n\n/**\n * Returns the currently active internal reactivity runtime.\n *\n * The current implementation still defaults to the Signals-backed runtime, so\n * importing this module preserves today's behavior. A stricter optional-runtime\n * architecture would move that default installation into an explicit bootstrap\n * step instead of this eager default.\n */\nexport function getReactiveRuntime(): ReactiveRuntime {\n\treturn activeReactiveRuntime;\n}\n\n/**\n * Replaces the active internal reactivity runtime used by Radiant core.\n *\n * This is an internal seam for alternate runtime experiments and tests. It does\n * not yet make Signals optional at module-load time because this module still\n * imports the default Signals-backed runtime eagerly.\n */\nexport function setReactiveRuntime(runtime: ReactiveRuntime): void {\n\tactiveReactiveRuntime = runtime;\n}\n",
|
|
15
|
+
"import { getReactiveRuntime } from './reactivity-runtime';\nexport type {\n\tReactiveComputed,\n\tReactiveDependencyNode,\n\tReactiveRuntime,\n\tReactiveSubscriber,\n\tReactiveWatcher,\n} from './reactivity-contract';\nexport { setReactiveRuntime } from './reactivity-runtime';\n\n/** Tracks one dependency-node read against the active internal reactivity runtime. */\nexport function trackReactiveDependency(node: import('./reactivity-contract').ReactiveDependencyNode): void {\n\tgetReactiveRuntime().trackDependency(node);\n}\n\n/** Creates a computed value using the currently selected internal reactivity runtime. */\nexport function createReactiveComputed<T>(read: () => T): import('./reactivity-contract').ReactiveComputed<T> {\n\treturn getReactiveRuntime().createComputed(read);\n}\n\n/** Creates a watcher using the currently selected internal reactivity runtime. */\nexport function createReactiveWatcher(notify: () => void): import('./reactivity-contract').ReactiveWatcher {\n\treturn getReactiveRuntime().createWatcher(notify);\n}\n",
|
|
16
|
+
"/**\n * Escapes serialized JSON so it remains safe when embedded inside an HTML\n * `<script>` tag.\n */\nexport function escapeScriptJson(value: string): string {\n\treturn value\n\t\t.replace(/&/g, '\\\\u0026')\n\t\t.replace(/</g, '\\\\u003c')\n\t\t.replace(/>/g, '\\\\u003e')\n\t\t.replace(/\\u2028/g, '\\\\u2028')\n\t\t.replace(/\\u2029/g, '\\\\u2029');\n}\n",
|
|
17
|
+
"import { escapeScriptJson } from '../tools/escape-script-json';\n\n/** Attribute marker used to identify hydration payloads inside a host. */\nexport const HYDRATION_ATTRIBUTE = 'data-hydration';\n/** Discriminator that scopes a hydration payload to a specific feature. */\nexport const HYDRATION_TYPE_ATTRIBUTE = 'data-hydration-type';\n/** Optional key that scopes a hydration payload to a specific decorated field. */\nexport const HYDRATION_KEY_ATTRIBUTE = 'data-hydration-key';\n\nexport type HydrationPayloadType = 'signal' | 'context';\n\ntype HydrationScriptHost = {\n\tchildren?: ArrayLike<Element> | undefined;\n\tchildNodes?: ArrayLike<{ nodeType: number }> | undefined;\n};\n\n/** Creates a `<script type=\"application/json\">` tag for a hydration payload. */\nexport function createHydrationScriptTag(options: {\n\ttype: HydrationPayloadType;\n\thydrationKey?: string;\n\tserializedValue: string;\n}): string {\n\tconst keyAttribute = options.hydrationKey\n\t\t? ` ${HYDRATION_KEY_ATTRIBUTE}=\"${escapeHtmlAttribute(options.hydrationKey)}\"`\n\t\t: '';\n\n\treturn `<script type=\"application/json\" ${HYDRATION_ATTRIBUTE} ${HYDRATION_TYPE_ATTRIBUTE}=\"${options.type}\"${keyAttribute}>${options.serializedValue}</script>`;\n}\n\n/** Escapes serialized JSON so it remains safe inside an HTML script tag. */\nexport function escapeHydrationJson(value: string): string {\n\treturn escapeScriptJson(value);\n}\n\n/** Parses JSON from a hydration script element, returning the fallback on failure. */\nexport function parseHydrationPayload<T>(element: Element, fallback: T): T {\n\tconst textContent = element.textContent;\n\n\tif (!textContent) {\n\t\treturn fallback;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(textContent) as T;\n\t} catch {\n\t\tif (typeof console !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t`[@ecopages/radiant] Failed to parse hydration payload from <script ${HYDRATION_ATTRIBUTE}>:`,\n\t\t\t\ttextContent.slice(0, 120),\n\t\t\t);\n\t\t}\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Finds a hydration script element inside a host by type and optional key.\n *\n * When a key is provided, looks for an exact `data-hydration-key` match.\n * Otherwise, returns the first unkeyed script matching the type.\n */\nexport function findHydrationScript(\n\thost: HydrationScriptHost,\n\ttype: HydrationPayloadType,\n\thydrationKey?: string,\n): Element | null {\n\tconst children = host.children;\n\n\tif (!children || children.length === 0) {\n\t\tconst childNodes = (host as Partial<{ childNodes: ArrayLike<{ nodeType: number }> }>).childNodes;\n\n\t\tif (!childNodes || childNodes.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (let i = 0; i < childNodes.length; i += 1) {\n\t\t\tconst node = childNodes[i]!;\n\n\t\t\tif (node.nodeType !== 1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst element = node as unknown as Element;\n\n\t\t\tif (matchesHydrationScript(element, type, hydrationKey)) {\n\t\t\t\treturn element;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfor (let i = 0; i < children.length; i += 1) {\n\t\tif (matchesHydrationScript(children[i]!, type, hydrationKey)) {\n\t\t\treturn children[i]!;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction matchesHydrationScript(element: Element, type: HydrationPayloadType, hydrationKey?: string): boolean {\n\tif (\n\t\telement.tagName !== 'SCRIPT' ||\n\t\t!element.hasAttribute(HYDRATION_ATTRIBUTE) ||\n\t\telement.getAttribute(HYDRATION_TYPE_ATTRIBUTE) !== type\n\t) {\n\t\treturn false;\n\t}\n\n\tif (hydrationKey !== undefined) {\n\t\treturn element.getAttribute(HYDRATION_KEY_ATTRIBUTE) === hydrationKey;\n\t}\n\n\treturn !element.hasAttribute(HYDRATION_KEY_ATTRIBUTE);\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n\treturn value.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n",
|
|
18
|
+
"import {\n\tcreateMarkupNodeLike,\n\tisKeyedJsxValue,\n\tisSlotJsxValue,\n\ttype JsxRenderable,\n\ttype KeyedJsxValue,\n\ttype SlotJsxValue,\n\ttype TemplateResultLike,\n} from '@ecopages/jsx';\n\nimport { HYDRATION_ATTRIBUTE } from './hydration-codec';\n\nexport const DEFAULT_SLOT_NAME = '';\nexport const SLOT_PROJECTION_SCRIPT_ATTRIBUTE = 'data-radiant-slot-projection';\n\ntype ResolvedSlotProjection = {\n\tcontainsSlots: boolean;\n\tvalue: JsxRenderable;\n};\n\nexport function captureProjectedSlotRenderables(host: HTMLElement): Map<string, JsxRenderable[]> {\n\tconst projectedContent = new Map<string, JsxRenderable[]>();\n\n\tfor (const node of Array.from(host.childNodes)) {\n\t\tif (isIgnoredProjectedNode(node)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tappendProjectedRenderable(projectedContent, getNodeSlotName(node), node);\n\t}\n\n\treturn projectedContent;\n}\n\nexport function deserializeProjectedSlotRenderables(payload: string): Map<string, JsxRenderable[]> {\n\tlet parsedPayload: Record<string, string[]>;\n\n\ttry {\n\t\tparsedPayload = JSON.parse(payload) as Record<string, string[]>;\n\t} catch {\n\t\tif (typeof console !== 'undefined') {\n\t\t\tconsole.warn('[@ecopages/radiant] Failed to parse slot projection payload:', payload.slice(0, 120));\n\t\t}\n\t\treturn new Map();\n\t}\n\n\tconst projectedContent = new Map<string, JsxRenderable[]>();\n\n\tfor (const [slotName, fragments] of Object.entries(parsedPayload)) {\n\t\tif (!Array.isArray(fragments) || fragments.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tprojectedContent.set(\n\t\t\tnormalizeSlotName(slotName),\n\t\t\tfragments.map((fragment) => createMarkupNodeLike(fragment)),\n\t\t);\n\t}\n\n\treturn projectedContent;\n}\n\nexport function collectAuthoredHydrationScriptMarkup(host: HTMLElement): string | undefined {\n\tconst fragments = Array.from(host.childNodes)\n\t\t.filter((node): node is HTMLScriptElement => isHydrationScriptNode(node))\n\t\t.map((node) => renderableToHtmlFragment(node) ?? '')\n\t\t.filter((fragment) => fragment !== '');\n\n\treturn fragments.length > 0 ? fragments.join('') : undefined;\n}\n\nexport function serializeProjectedSlotRenderables(\n\tprojectedContent: ReadonlyMap<string, readonly JsxRenderable[]>,\n): string | undefined {\n\tconst payload: Record<string, string[]> = {};\n\n\tfor (const [slotName, renderables] of projectedContent.entries()) {\n\t\tconst fragments = renderables\n\t\t\t.map((renderable) => renderableToHtmlFragment(renderable))\n\t\t\t.filter((fragment): fragment is string => fragment !== undefined && fragment !== '');\n\n\t\tif (fragments.length > 0) {\n\t\t\tpayload[slotName] = fragments;\n\t\t}\n\t}\n\n\treturn Object.keys(payload).length > 0 ? JSON.stringify(payload) : undefined;\n}\n\nexport function resolveSlotProjection(\n\tvalue: JsxRenderable,\n\tprojectedContent: ReadonlyMap<string, readonly JsxRenderable[]>,\n): ResolvedSlotProjection {\n\tlet containsSlots = false;\n\n\tconst resolveValue = (currentValue: JsxRenderable): JsxRenderable => {\n\t\tif (isSlotJsxValue(currentValue)) {\n\t\t\tcontainsSlots = true;\n\t\t\treturn resolveSlotValue(currentValue, projectedContent, resolveValue);\n\t\t}\n\n\t\tif (isKeyedJsxValue(currentValue)) {\n\t\t\treturn cloneKeyedJsxValue(currentValue, resolveValue(currentValue.value));\n\t\t}\n\n\t\tif (isTemplateResultLike(currentValue)) {\n\t\t\treturn {\n\t\t\t\t_$rType$: 1,\n\t\t\t\trootLocalName: currentValue.rootLocalName,\n\t\t\t\tssrIntrinsicProps: currentValue.ssrIntrinsicProps,\n\t\t\t\tstrings: currentValue.strings,\n\t\t\t\tvalues: currentValue.values.map((entry) => resolveValue(entry as JsxRenderable)),\n\t\t\t} satisfies TemplateResultLike;\n\t\t}\n\n\t\tif (isIterableRenderable(currentValue)) {\n\t\t\treturn Array.from(currentValue, (entry) => resolveValue(entry as JsxRenderable));\n\t\t}\n\n\t\treturn currentValue;\n\t};\n\n\tconst resolvedValue = resolveValue(value);\n\n\treturn {\n\t\tcontainsSlots,\n\t\tvalue: resolvedValue,\n\t};\n}\n\nexport function takeSlotProjectionScriptPayload(host: HTMLElement): string | undefined {\n\tfor (const node of Array.from(host.childNodes)) {\n\t\tif (!isSlotProjectionScriptNode(node)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst payload = node.textContent ?? undefined;\n\t\tnode.parentNode?.removeChild(node);\n\t\treturn payload;\n\t}\n\n\treturn undefined;\n}\n\nfunction appendProjectedRenderable(\n\tprojectedContent: Map<string, JsxRenderable[]>,\n\tslotName: string,\n\trenderable: JsxRenderable,\n): void {\n\tconst existingRenderables = projectedContent.get(slotName);\n\n\tif (existingRenderables) {\n\t\texistingRenderables.push(renderable);\n\t\treturn;\n\t}\n\n\tprojectedContent.set(slotName, [renderable]);\n}\n\nfunction cloneKeyedJsxValue(value: KeyedJsxValue, nextValue: JsxRenderable): KeyedJsxValue {\n\treturn {\n\t\t...value,\n\t\tvalue: nextValue,\n\t};\n}\n\nfunction getNodeSlotName(node: Node): string {\n\tif (node instanceof Element) {\n\t\treturn normalizeSlotName(node.getAttribute('slot'));\n\t}\n\n\treturn DEFAULT_SLOT_NAME;\n}\n\nfunction isIterableRenderable(value: JsxRenderable): value is Iterable<JsxRenderable> {\n\treturn typeof value !== 'string' && typeof value === 'object' && value !== null && Symbol.iterator in value;\n}\n\nfunction isSlotProjectionScriptNode(node: Node): node is HTMLScriptElement {\n\treturn node instanceof HTMLScriptElement && node.hasAttribute(SLOT_PROJECTION_SCRIPT_ATTRIBUTE);\n}\n\nfunction isHydrationScriptNode(node: Node): node is HTMLScriptElement {\n\treturn node instanceof HTMLScriptElement && node.hasAttribute(HYDRATION_ATTRIBUTE);\n}\n\nfunction isIgnoredProjectedNode(node: Node): boolean {\n\treturn isSlotProjectionScriptNode(node) || isHydrationScriptNode(node);\n}\n\nfunction isTemplateResultLike(value: JsxRenderable): value is TemplateResultLike {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t(value as Partial<TemplateResultLike>)['_$rType$'] === 1 &&\n\t\tArray.isArray((value as Partial<TemplateResultLike>).strings) &&\n\t\tArray.isArray((value as Partial<TemplateResultLike>).values)\n\t);\n}\n\nfunction normalizeSlotName(name: string | undefined | null): string {\n\treturn name ?? DEFAULT_SLOT_NAME;\n}\n\nfunction renderableToHtmlFragment(renderable: JsxRenderable): string | undefined {\n\tif (renderable === undefined || renderable === null || renderable === false || renderable === true) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof Node !== 'undefined' && renderable instanceof Node) {\n\t\tif (renderable.nodeType === Node.TEXT_NODE) {\n\t\t\treturn renderable.textContent ?? '';\n\t\t}\n\n\t\treturn (renderable as Element).outerHTML ?? renderable.textContent ?? undefined;\n\t}\n\n\tif (isKeyedJsxValue(renderable)) {\n\t\treturn renderableToHtmlFragment(renderable.value);\n\t}\n\n\tif (typeof renderable === 'string' || typeof renderable === 'number' || typeof renderable === 'bigint') {\n\t\treturn String(renderable);\n\t}\n\n\tif (typeof renderable === 'object' && renderable !== null && 'outerHTML' in renderable) {\n\t\treturn typeof renderable.outerHTML === 'string' ? renderable.outerHTML : (renderable.textContent ?? undefined);\n\t}\n\n\tif (isIterableRenderable(renderable)) {\n\t\treturn Array.from(renderable, (entry) => renderableToHtmlFragment(entry as JsxRenderable) ?? '').join('');\n\t}\n\n\treturn undefined;\n}\n\nfunction resolveSlotValue(\n\tvalue: SlotJsxValue,\n\tprojectedContent: ReadonlyMap<string, readonly JsxRenderable[]>,\n\tresolveValue: (value: JsxRenderable) => JsxRenderable,\n): JsxRenderable {\n\tconst assignedContent = projectedContent.get(normalizeSlotName(value.name));\n\n\tif (assignedContent && assignedContent.length > 0) {\n\t\treturn assignedContent.length === 1 ? assignedContent[0] : (assignedContent as JsxRenderable);\n\t}\n\n\tif (value.fallback === undefined) {\n\t\treturn '';\n\t}\n\n\treturn resolveValue(value.fallback);\n}\n",
|
|
19
|
+
"import { hydrate as hydrateJsx, render as renderJsx, type JsxRenderable } from '@ecopages/jsx';\nimport {\n\tcreateReactiveComputed,\n\tcreateReactiveWatcher,\n\ttype ReactiveComputed,\n\ttype ReactiveWatcher,\n} from './reactivity-adapter';\n\nimport { HYDRATION_ATTRIBUTE } from './hydration-codec';\nimport {\n\tDEFAULT_SLOT_NAME,\n\tSLOT_PROJECTION_SCRIPT_ATTRIBUTE,\n\tcollectAuthoredHydrationScriptMarkup,\n\tcaptureProjectedSlotRenderables,\n\tdeserializeProjectedSlotRenderables,\n\tresolveSlotProjection,\n\tserializeProjectedSlotRenderables,\n\ttakeSlotProjectionScriptPayload,\n} from './slot-projection-runtime';\n\nexport type RenderRuntimeHost = HTMLElement & {\n\trender(): JsxRenderable;\n\trequestUpdate(): void;\n};\n\nexport class RenderRuntime {\n\t#host: RenderRuntimeHost;\n\t#projectedSlotContent = new Map<string, JsxRenderable[]>();\n\t#renderSignal?: ReactiveComputed<{ containsSlots: boolean; value: JsxRenderable }>;\n\treadonly #renderWatcher: ReactiveWatcher;\n\t#slotProjectionObserver?: MutationObserver;\n\t#slotProjectionVersion = 0;\n\n\tconstructor(host: RenderRuntimeHost) {\n\t\tthis.#host = host;\n\t\tthis.#renderWatcher = createReactiveWatcher(() => {\n\t\t\tthis.#host.requestUpdate();\n\t\t});\n\t}\n\n\tget slotProjectionVersion(): number {\n\t\treturn this.#slotProjectionVersion;\n\t}\n\n\tgetSlotElements<T extends Element = Element>(name?: string): T[] {\n\t\tthis.ensureSlotProjectionState();\n\n\t\treturn (this.#projectedSlotContent.get(name ?? DEFAULT_SLOT_NAME) ?? []).filter(\n\t\t\t(renderable): renderable is T => typeof Node !== 'undefined' && renderable instanceof Element,\n\t\t);\n\t}\n\n\tgetSlotProjectionScriptTag(): string | undefined {\n\t\tthis.ensureSlotProjectionState();\n\t\tconst payload = serializeProjectedSlotRenderables(this.#projectedSlotContent);\n\n\t\tif (!payload) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn `<script type=\"application/json\" ${SLOT_PROJECTION_SCRIPT_ATTRIBUTE}>${escapeScriptText(payload)}</script>`;\n\t}\n\n\tgetAuthoredHydrationScriptMarkup(): string | undefined {\n\t\treturn collectAuthoredHydrationScriptMarkup(this.#host) ?? undefined;\n\t}\n\n\thydrate(renderTarget: HTMLElement): void {\n\t\tthis.disconnectSlotProjectionObserver();\n\n\t\ttry {\n\t\t\thydrateJsx(this.resolveTrackedRenderOutput().value, renderTarget);\n\t\t} finally {\n\t\t\tthis.observeSlotProjection();\n\t\t}\n\t}\n\n\trender(renderTarget: HTMLElement): void {\n\t\tthis.disconnectSlotProjectionObserver();\n\n\t\ttry {\n\t\t\trenderJsx(this.resolveTrackedRenderOutput().value, renderTarget);\n\t\t} finally {\n\t\t\tthis.observeSlotProjection();\n\t\t}\n\t}\n\n\tobserveSlotProjection(): void {\n\t\tif (typeof MutationObserver === 'undefined' || this.#slotProjectionObserver || !this.#host.isConnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#slotProjectionObserver = new MutationObserver((records) => this.handleSlotProjectionMutations(records));\n\t\tthis.#slotProjectionObserver.observe(this.#host, { childList: true });\n\t}\n\n\tdisconnectSlotProjectionObserver(): void {\n\t\tthis.#slotProjectionObserver?.disconnect();\n\t\tthis.#slotProjectionObserver = undefined;\n\t}\n\n\tdisconnectRenderWatcher(): void {\n\t\tif (!this.#renderSignal) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#renderWatcher.unwatch(this.#renderSignal);\n\t\tthis.#renderSignal = undefined;\n\t}\n\n\tresolveTrackedRenderOutput(): { containsSlots: boolean; value: JsxRenderable } {\n\t\tconst nextRenderSignal = createReactiveComputed(() => this.resolveRenderOutput());\n\t\tconst output = nextRenderSignal.get();\n\n\t\tif (!this.#host.isConnected) {\n\t\t\treturn output;\n\t\t}\n\n\t\tif (this.#renderSignal) {\n\t\t\tthis.#renderWatcher.unwatch(this.#renderSignal);\n\t\t}\n\n\t\tthis.#renderSignal = nextRenderSignal;\n\t\tthis.#renderWatcher.watch(nextRenderSignal);\n\t\treturn output;\n\t}\n\n\tdispose(): void {\n\t\tthis.disconnectSlotProjectionObserver();\n\t\tthis.disconnectRenderWatcher();\n\t}\n\n\tprivate ensureSlotProjectionState(): void {\n\t\tif (this.#projectedSlotContent.size > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scriptPayload = this.#host.isConnected ? takeSlotProjectionScriptPayload(this.#host) : undefined;\n\n\t\tif (typeof scriptPayload === 'string' && scriptPayload !== '') {\n\t\t\tthis.#projectedSlotContent = deserializeProjectedSlotRenderables(scriptPayload);\n\t\t\tthis.#slotProjectionVersion += 1;\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#host.childNodes.length > 0) {\n\t\t\tthis.#projectedSlotContent = captureProjectedSlotRenderables(this.#host);\n\t\t\tthis.#slotProjectionVersion += 1;\n\t\t}\n\t}\n\n\tprivate handleSlotProjectionMutations(records: MutationRecord[]): void {\n\t\tlet hasProjectionChanges = false;\n\n\t\tfor (const record of records) {\n\t\t\tfor (const removedNode of Array.from(record.removedNodes)) {\n\t\t\t\tif (this.removeProjectedSlotNode(removedNode)) {\n\t\t\t\t\thasProjectionChanges = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const addedNode of Array.from(record.addedNodes)) {\n\t\t\t\tif (addedNode.parentNode !== this.#host) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (this.addProjectedSlotNode(addedNode)) {\n\t\t\t\t\thasProjectionChanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (hasProjectionChanges) {\n\t\t\tthis.#slotProjectionVersion += 1;\n\t\t\tthis.#host.requestUpdate();\n\t\t}\n\t}\n\n\tprivate addProjectedSlotNode(node: Node): boolean {\n\t\tif (\n\t\t\tnode instanceof HTMLScriptElement &&\n\t\t\t(node.hasAttribute(SLOT_PROJECTION_SCRIPT_ATTRIBUTE) || node.hasAttribute(HYDRATION_ATTRIBUTE))\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst slotName = node instanceof Element ? (node.getAttribute('slot') ?? DEFAULT_SLOT_NAME) : DEFAULT_SLOT_NAME;\n\t\tconst bucket = this.#projectedSlotContent.get(slotName);\n\n\t\tif (bucket) {\n\t\t\tif (bucket.includes(node)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tbucket.push(node);\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.#projectedSlotContent.set(slotName, [node]);\n\t\treturn true;\n\t}\n\n\tprivate removeProjectedSlotNode(node: Node): boolean {\n\t\tfor (const [slotName, bucket] of this.#projectedSlotContent.entries()) {\n\t\t\tconst nodeIndex = bucket.indexOf(node);\n\n\t\t\tif (nodeIndex === -1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbucket.splice(nodeIndex, 1);\n\n\t\t\tif (bucket.length === 0) {\n\t\t\t\tthis.#projectedSlotContent.delete(slotName);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate resolveRenderOutput(): { containsSlots: boolean; value: JsxRenderable } {\n\t\tthis.ensureSlotProjectionState();\n\t\treturn resolveSlotProjection(this.#host.render(), this.#projectedSlotContent);\n\t}\n}\n\nfunction escapeScriptText(value: string): string {\n\treturn value.replace(/</g, '\\\\u003c');\n}\n",
|
|
20
|
+
"export type RenderSchedulerOptions = {\n\tcanFlush: () => boolean;\n\tcommit: () => void;\n};\n\n/**\n * Coalesces microtask-scheduled render commits for reactive hosts.\n */\nexport class RenderScheduler {\n\tprivate needsRender = false;\n\tprivate isRendering = false;\n\tprivate isRenderScheduled = false;\n\n\tconstructor(private readonly options: RenderSchedulerOptions) {}\n\n\tpublic get rendering(): boolean {\n\t\treturn this.isRendering;\n\t}\n\n\tpublic get pending(): boolean {\n\t\treturn this.needsRender;\n\t}\n\n\tpublic markPending(): void {\n\t\tthis.needsRender = true;\n\t}\n\n\tpublic clearPending(): void {\n\t\tthis.needsRender = false;\n\t}\n\n\tpublic requestUpdate(): void {\n\t\tthis.needsRender = true;\n\n\t\tif (this.isRenderScheduled) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isRenderScheduled = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.isRenderScheduled = false;\n\n\t\t\tif (!this.needsRender) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.flush();\n\t\t});\n\t}\n\n\tpublic flush(): void {\n\t\tif (!this.options.canFlush()) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this.needsRender && this.options.canFlush()) {\n\t\t\tthis.needsRender = false;\n\t\t\tthis.runCommit();\n\t\t}\n\t}\n\n\tpublic runExclusive<T>(work: () => T): T {\n\t\tthis.isRendering = true;\n\n\t\ttry {\n\t\t\treturn work();\n\t\t} finally {\n\t\t\tthis.isRendering = false;\n\t\t}\n\t}\n\n\tprivate runCommit(): void {\n\t\tthis.isRendering = true;\n\n\t\ttry {\n\t\t\tthis.options.commit();\n\t\t} finally {\n\t\t\tthis.isRendering = false;\n\t\t}\n\t}\n}\n",
|
|
21
|
+
"import {\n\tcreateSubscribableJsxValue,\n\ttype JsxBindingSourceValue,\n\ttype SubscribableJsxValueWithAccess,\n} from '@ecopages/jsx';\nimport type { ReactiveState } from './reactivity-contract';\n\n/**\n * Adapts a host member {@link ReactiveState} into the jsx binding shape.\n *\n * Kept in a dedicated module so `reactive-host.ts` stays free of direct\n * `@ecopages/jsx` imports while bindings still expose `getValue`, `subscribe`,\n * and `map` for derived child updates.\n */\nexport function adaptReactiveStateToJsxBinding<Value extends JsxBindingSourceValue>(\n\tstate: ReactiveState<Value>,\n): SubscribableJsxValueWithAccess<Value> {\n\treturn createSubscribableJsxValue({\n\t\tgetValue: () => state.get(),\n\t\tsubscribe: (notify) => state.subscribe(notify),\n\t});\n}\n",
|
|
22
|
+
"import type { JsxBindingSourceValue, SubscribableJsxValueWithAccess } from '@ecopages/jsx';\nimport { adaptReactiveStateToJsxBinding } from './reactive-binding-adapter';\nimport { getReactiveRuntime } from './reactivity-runtime';\nimport type { ReactiveState } from './reactivity-contract';\nimport type {\n\tReactiveAccessorDefinition,\n\tReactiveBindingOption,\n\tReactiveBindingValue,\n\tReactiveBindings,\n\tReactiveFieldOptions,\n} from './reactive-prop-core';\n\ntype StringPropertyKey<Value> = Extract<keyof Value, string>;\n\n/**\n * Shared reactive-host contract consumed by decorators and host adapters.\n *\n * `RadiantElement` and `RadiantController` both implement this surface so the\n * decorator layer can define fields, bindings, and context reactions without\n * depending on a specific host class.\n */\nexport interface ReactiveHostLike<Bindings extends object = {}> {\n\treadonly bindings: ReactiveBindings<Bindings>;\n\treadonly $: ReactiveBindings<Bindings>;\n\tbind<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;\n\tgetReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;\n\tgetReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined;\n\tcreateReactiveField<T>(propertyName: string, initialValue: T, options?: ReactiveFieldOptions): void;\n\tcreateReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T>;\n\tregisterReactiveMember<T>(propertyName: string, signal: ReactiveState<T>): void;\n\tdefineReactiveBinding(property: string, bind?: ReactiveBindingOption): void;\n\tnotifyUpdate(changedProperty: string, oldValue: unknown, value: unknown): void;\n\tregisterCleanupCallback(callback: () => void): void;\n\tregisterConnectedCallback(callback: () => void): void;\n\tregisterUpdateCallback(property: string, update: () => void): () => void;\n}\n\n/**\n * Shared reactivity engine used by both `RadiantElement` and\n * `RadiantController`.\n *\n * Every reactive host member owns a single signals-backed `ReactiveState`\n * (a `State` for fields/props/attributes, or a user `signal()` for the signal\n * decorator). The jsx binding, `onUpdated` callbacks, and `ReactiveComputed`\n * tracking all read that one state directly, so there is no parallel\n * notification bus or dependency shim.\n *\n * Host-specific concerns such as attribute reflection, render lifecycles, and\n * custom-element APIs stay in the outer host classes.\n */\nexport class ReactiveHost<Host extends object, Bindings extends object = {}> {\n\tpublic readonly bindings: ReactiveBindings<Bindings>;\n\tpublic readonly $: ReactiveBindings<Bindings>;\n\n\tprivate reactiveMembers = new Map<string, ReactiveState<unknown>>();\n\tprivate jsxBindings = new Map<string, SubscribableJsxValueWithAccess<JsxBindingSourceValue>>();\n\t/** `onUpdated` callbacks keyed by property; values are signal unsubscribe disposers when subscribed. */\n\tprivate updateCallbacks = new Map<string, Map<() => void, (() => void) | undefined>>();\n\tprivate onConnectedCallbacks: (() => void)[] = [];\n\tprivate onDisconnectedCallback: (() => void)[] = [];\n\n\tconstructor(\n\t\tprivate readonly host: Host,\n\t\tprivate readonly access: ReactiveHostAccess<Host>,\n\t\tprivate readonly shouldAutoBind: () => boolean,\n\t) {\n\t\tconst bindingNamespace = this.createReactiveBindingNamespace();\n\t\tthis.bindings = bindingNamespace;\n\t\tthis.$ = bindingNamespace;\n\t}\n\n\t/**\n\t * Runs all connection callbacks registered by decorators or host adapters.\n\t */\n\tpublic connectHost(): void {\n\t\tfor (const callback of this.onConnectedCallbacks) {\n\t\t\tcallback();\n\t\t}\n\t}\n\n\t/**\n\t * Runs all cleanup callbacks registered for host disconnect.\n\t */\n\tpublic disconnectHost(): void {\n\t\tfor (const cleanup of this.onDisconnectedCallback) {\n\t\t\tcleanup();\n\t\t}\n\t}\n\n\t/**\n\t * Registers a callback that should run on host disconnect.\n\t */\n\tpublic registerCleanupCallback(callback: () => void): void {\n\t\tthis.onDisconnectedCallback.push(callback);\n\t}\n\n\t/**\n\t * Registers a callback that should run whenever the host connects.\n\t */\n\tpublic registerConnectedCallback(callback: () => void): void {\n\t\tthis.onConnectedCallbacks.push(callback);\n\t}\n\n\t/**\n\t * Fires the `onUpdated` callbacks registered for a member.\n\t *\n\t * This is the only remaining use of the update-callback bus: an initial\n\t * emit for members that want one (currently `@prop`). Change notifications\n\t * flow through the member `State`'s own subscription, not through here.\n\t */\n\tpublic notifyUpdate(changedProperty: string, _oldValue: unknown, _value: unknown): void {\n\t\tconst callbacks = this.updateCallbacks.get(changedProperty);\n\n\t\tif (!callbacks) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const update of [...callbacks.keys()]) {\n\t\t\tupdate();\n\t\t}\n\t}\n\n\t/**\n\t * Returns the member state registered under `propertyName`, if any.\n\t */\n\tpublic getReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined {\n\t\treturn this.reactiveMembers.get(propertyName) as ReactiveState<T> | undefined;\n\t}\n\n\t/**\n\t * Creates a new reactive member state and registers it under `propertyName`.\n\t */\n\tpublic createReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T> {\n\t\tconst signal = getReactiveRuntime().createState(initialValue) as ReactiveState<T>;\n\t\tthis.registerMember(propertyName, signal as ReactiveState<unknown>);\n\t\treturn signal;\n\t}\n\n\t/**\n\t * Registers an externally-owned reactive member state (used by the\n\t * `signal()` decorator, whose state is a user-provided signals `Signal`).\n\t */\n\tpublic registerReactiveMember<T>(propertyName: string, signal: ReactiveState<T>): void {\n\t\tthis.registerMember(propertyName, signal as ReactiveState<unknown>);\n\t}\n\n\t/**\n\t * Stores the member state and subscribes any `onUpdated` callbacks that were\n\t * registered before the member existed (decorator initializer ordering).\n\t */\n\tprivate registerMember(propertyName: string, signal: ReactiveState<unknown>): void {\n\t\tthis.reactiveMembers.set(propertyName, signal);\n\t\tthis.jsxBindings.delete(propertyName);\n\n\t\tconst callbacks = this.updateCallbacks.get(propertyName);\n\n\t\tif (callbacks) {\n\t\t\tfor (const update of callbacks.keys()) {\n\t\t\t\tthis.subscribeCallback(propertyName, update);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Subscribes an `onUpdated` callback to the member state if the member is\n\t * already registered and not yet subscribed.\n\t */\n\tprivate subscribeCallback(propertyName: string, update: () => void): void {\n\t\tconst callbacks = this.updateCallbacks.get(propertyName);\n\t\tconst signal = this.reactiveMembers.get(propertyName);\n\n\t\tif (!callbacks || !signal || callbacks.get(update)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst unsubscribe = signal.subscribe(() => update());\n\t\tcallbacks.set(update, unsubscribe);\n\t}\n\n\t/**\n\t * Returns the jsx binding for a named reactive member.\n\t *\n\t * The binding is adapted from the member `State` once and cached so derived\n\t * transforms (`map`, member access) share a stable source identity.\n\t */\n\tpublic getReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>> {\n\t\tconst key = property as string;\n\t\tconst cached = this.jsxBindings.get(key);\n\n\t\tif (cached) {\n\t\t\treturn cached as SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;\n\t\t}\n\n\t\tconst signal = this.reactiveMembers.get(key);\n\n\t\tif (!signal) {\n\t\t\tthrow new Error(`No reactive binding registered for \"${String(property)}\".`);\n\t\t}\n\n\t\tconst binding = adaptReactiveStateToJsxBinding(\n\t\t\tsignal as ReactiveState<ReactiveBindingValue<Bindings, Property>>,\n\t\t);\n\n\t\tthis.jsxBindings.set(key, binding);\n\t\treturn binding;\n\t}\n\n\t/**\n\t * Registers an `onUpdated`-style callback for a named reactive member.\n\t *\n\t * Change notifications flow through the member `State`'s own subscription\n\t * (D1). The callback is also kept in the update-callback bus so an initial\n\t * emit (currently `@prop`) can still reach it once after definition.\n\t */\n\tpublic registerUpdateCallback(property: string, update: () => void): () => void {\n\t\tlet callbacks = this.updateCallbacks.get(property);\n\n\t\tif (!callbacks) {\n\t\t\tcallbacks = new Map();\n\t\t\tthis.updateCallbacks.set(property, callbacks);\n\t\t}\n\n\t\tcallbacks.set(update, undefined);\n\t\tthis.subscribeCallback(property, update);\n\n\t\treturn () => {\n\t\t\tconst perProperty = this.updateCallbacks.get(property);\n\t\t\tperProperty?.get(update)?.();\n\t\t\tperProperty?.delete(update);\n\n\t\t\tif (perProperty && perProperty.size === 0) {\n\t\t\t\tthis.updateCallbacks.delete(property);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Defines a stable binding companion property such as `$count` on the host or\n\t * its chosen binding target.\n\t */\n\tpublic defineReactiveBinding(property: string, bind: ReactiveBindingOption = true): void {\n\t\tconst bindingPropertyName = typeof bind === 'string' ? bind : bind ? `$${property}` : undefined;\n\t\tconst bindingTarget = this.access.getBindingTarget?.(this.host) ?? this.host;\n\n\t\tif (!bindingPropertyName || this.access.hasProperty(this.host, bindingPropertyName)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.access.defineProperty(bindingTarget, bindingPropertyName, {\n\t\t\tget: () => this.getReactiveBinding(property as StringPropertyKey<Bindings>),\n\t\t\tenumerable: false,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\n\t/**\n\t * Defines a reactive getter/setter pair on the host backed by a member\n\t * `State`, and wires it into the jsx binding namespace.\n\t */\n\tpublic defineReactiveAccessor<T>(propertyName: string, options: ReactiveAccessorDefinition<T>): void {\n\t\tconst bind = options.bind ?? this.shouldAutoBind();\n\n\t\tthis.defineReactiveBinding(propertyName, bind);\n\n\t\tthis.access.defineProperty(this.host, propertyName, {\n\t\t\tget: () => options.signal.get(),\n\t\t\tset: (newValue: T) => {\n\t\t\t\toptions.signal.set(newValue);\n\t\t\t\toptions.onSet?.(newValue);\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t});\n\t}\n\n\t/**\n\t * Defines a controller- or element-local reactive field with optional JSX\n\t * binding exposure.\n\t */\n\tpublic createReactiveField<T>(propertyName: string, initialValue: T, options: ReactiveFieldOptions = {}): void {\n\t\tconst existing = this.reactiveMembers.get(propertyName) as ReactiveState<T> | undefined;\n\t\tconst signal = existing ?? this.createReactiveMember(propertyName, initialValue);\n\n\t\tif (existing && initialValue !== undefined) {\n\t\t\tsignal.set(initialValue);\n\t\t}\n\n\t\tthis.defineReactiveAccessor(propertyName, { bind: options.bind, signal });\n\n\t\tif (!options.suppressInitialNotify) {\n\t\t\tthis.notifyUpdate(propertyName, undefined, signal.get());\n\t\t}\n\t}\n\n\tprivate createReactiveBindingNamespace(): ReactiveBindings<Bindings> {\n\t\treturn new Proxy(Object.create(null) as ReactiveBindings<Bindings>, {\n\t\t\tget: (_target, property) => {\n\t\t\t\tif (typeof property !== 'string') {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn this.getReactiveBinding(property as StringPropertyKey<Bindings>);\n\t\t\t},\n\t\t}) as ReactiveBindings<Bindings>;\n\t}\n}\n\ntype ReactiveHostAccess<Host extends object> = {\n\tdefineProperty(target: object, property: string, descriptor: PropertyDescriptor): void;\n\tgetBindingTarget?(host: Host): object;\n\thasProperty(host: Host, property: string): boolean;\n\treadProperty(host: Host, property: string): unknown;\n};\n",
|
|
23
|
+
"type SsrPreparationCallback = () => void;\n\nconst SSR_PREPARATION_CALLBACKS = Symbol.for('@ecopages/radiant.ssr-preparation-callbacks');\nexport const SSR_PREPARATION_RUNNING = Symbol.for('@ecopages/radiant.ssr-preparation-running');\n\n/**\n * Registers instance-local SSR preparation work that should run immediately\n * before a Radiant host serializes its first server render.\n *\n * Decorators use this to defer SSR-only setup until after class fields,\n * reactive props, and authored host content have all been applied.\n */\nexport function registerSsrPreparationCallback(host: object, callback: SsrPreparationCallback): void {\n\tconst target = host as Record<PropertyKey, unknown>;\n\tconst existingCallbacks = target[SSR_PREPARATION_CALLBACKS];\n\n\tif (Array.isArray(existingCallbacks)) {\n\t\texistingCallbacks.push(callback);\n\t\treturn;\n\t}\n\n\tObject.defineProperty(host, SSR_PREPARATION_CALLBACKS, {\n\t\tvalue: [callback],\n\t\tconfigurable: true,\n\t});\n}\n\n/**\n * Runs all registered SSR preparation callbacks for the provided host.\n *\n * The callbacks are intentionally retained so repeated SSR serializations stay\n * deterministic after later host mutations.\n */\nexport function runSsrPreparationCallbacks(host: object): void {\n\tconst target = host as Record<PropertyKey, unknown>;\n\tconst callbacks = target[SSR_PREPARATION_CALLBACKS];\n\n\tif (!Array.isArray(callbacks)) {\n\t\treturn;\n\t}\n\n\ttarget[SSR_PREPARATION_RUNNING] = true;\n\n\ttry {\n\t\tfor (const callback of callbacks as SsrPreparationCallback[]) {\n\t\t\tcallback();\n\t\t}\n\t} finally {\n\t\tdelete target[SSR_PREPARATION_RUNNING];\n\t}\n}\n",
|
|
24
|
+
"const RADIANT_HYDRATOR_INSTALLED_SYMBOL = Symbol.for('@ecopages/radiant.hydrator-installed');\n\ntype GlobalHydratorState = typeof globalThis & Record<PropertyKey, unknown>;\n\n/**\n * Marks the current JavaScript environment as hydration-enabled for first\n * custom-element connect.\n *\n * `RadiantElement` reads this flag before deciding whether SSR markup should\n * hydrate in place or be replaced by a fresh client render.\n */\nexport function installRadiantHydratorState(): void {\n\t(globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] = true;\n}\n\n/**\n * Clears the explicit hydration-enabled flag from `globalThis`.\n *\n * This is mainly used by tests so they can assert both hydrated and non-\n * hydrated first-connect behavior deterministically.\n */\nexport function uninstallRadiantHydratorState(): void {\n\tdelete (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL];\n}\n\n/**\n * Returns whether first-connect hydration is currently enabled for this\n * JavaScript environment.\n */\nexport function isRadiantHydratorInstalled(): boolean {\n\treturn (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] === true;\n}\n",
|
|
25
|
+
"import type { JsxRenderable } from '@ecopages/jsx';\nimport { getActiveSsrScopeValue, type RenderToStringOptions, withActiveSsrScopeValue } from '@ecopages/jsx/server';\nimport type { InternalRadiantSsrHost } from './radiant-element-ssr-host';\n\nexport type RadiantElementRenderBridge = {\n\trenderHost?: () => JsxRenderable;\n\trenderHostToString?: (options?: RenderToStringOptions) => string;\n};\n\nexport type RadiantElementServerRenderSsrCapable = Omit<InternalRadiantSsrHost, 'constructor'> & {\n\tconstructor: Function;\n};\n\nexport type RadiantElementTrackedRenderSsrCapable = RadiantElementServerRenderSsrCapable;\n\nexport type RadiantElementSsrRuntime = {\n\tgetHostAttributes(component: InternalRadiantSsrHost): Record<string, string>;\n\trenderHost(component: InternalRadiantSsrHost): JsxRenderable;\n\trenderHostToString(component: InternalRadiantSsrHost, options?: RenderToStringOptions): string;\n\tresolveRenderBridge(component: object): RadiantElementRenderBridge | undefined;\n\trenderView(component: InternalRadiantSsrHost, options?: RenderToStringOptions): string;\n};\n\nconst RADIANT_ELEMENT_SSR_RUNTIME_SYMBOL = Symbol.for('@ecopages/radiant.element-ssr-runtime');\n\nexport function getRadiantElementSsrRuntime(): RadiantElementSsrRuntime | undefined {\n\treturn getActiveSsrScopeValue<RadiantElementSsrRuntime>(RADIANT_ELEMENT_SSR_RUNTIME_SYMBOL);\n}\n\nexport function withRadiantElementSsrRuntime<T>(runtime: RadiantElementSsrRuntime, render: () => T): T {\n\treturn withActiveSsrScopeValue(RADIANT_ELEMENT_SSR_RUNTIME_SYMBOL, runtime, render);\n}\n",
|
|
26
|
+
"import type { EventEmitter } from '../tools';\nimport { hasHydrationMarkers, jsx, type JsxRenderable, type SubscribableJsxValueWithAccess } from '@ecopages/jsx';\nimport type { RenderToStringOptions } from '@ecopages/jsx/server';\nimport { HostSsrRegistry } from './host-ssr-registry';\nimport { getReactivePropDefinitions, type ReactivePropDefinition } from './reactive-prop-metadata';\nimport { ensureLegacyHostReady } from '../decorators/legacy/host-readiness';\nimport type { SsrSerializableContextProvider } from '../context/context-provider';\nimport type { UnknownContext } from '../context/types';\nimport {\n\ttype ReactiveBindingOption,\n\ttype ReactiveBindingValue,\n\ttype ReactiveBindings,\n\ttype ReactiveFieldOptions,\n\ttype ReactiveProperty,\n\ttype ReactivePropertyOptions,\n} from './reactive-prop-core';\nimport { EventSubscriptionRegistry } from './event-subscription-registry';\nimport { ReactivePropertyState } from './reactive-property-state';\nimport { RenderRuntime, type RenderRuntimeHost } from './render-runtime';\nimport { RenderScheduler } from './render-scheduler';\nimport type { SsrSerializableHydrationBinding } from './ssr-hydration-binding';\nimport { ReactiveHost } from './reactive-host';\nimport type { ReactiveState } from './reactivity-contract';\nimport { runSsrPreparationCallbacks } from './ssr-preparation';\nimport { isRadiantHydratorInstalled } from './radiant-hydrator-state';\nimport { getRadiantElementSsrRuntime } from './radiant-element-ssr-registry';\nimport type { InternalRadiantSsrHost } from './radiant-element-ssr-host';\nimport { getInitialValue } from '../utils/attribute-utils';\n\nexport type {\n\tReactiveBindingOption,\n\tReactiveBindingValue,\n\tReactiveBindings,\n\tReactiveFieldOptions,\n\tReactiveProperty,\n\tReactivePropertyOptions,\n} from './reactive-prop-core';\n\nconst RadiantElementBase = resolveRadiantElementBase();\n\ntype RadiantRenderTarget = HTMLElement | ShadowRoot;\ntype RadiantInteractionTarget = HTMLElement | ShadowRoot;\ntype RadiantRenderSurface = {\n\trenderTarget: RadiantRenderTarget;\n\tinteractionTarget: RadiantInteractionTarget;\n\tqueryRoot: ParentNode;\n};\n\nfunction resolveRadiantElementBase(): typeof HTMLElement {\n\tif (typeof HTMLElement !== 'undefined') {\n\t\treturn HTMLElement;\n\t}\n\n\tthrow new Error(\n\t\t\"RadiantElement requires HTMLElement. Install '@ecopages/radiant/server/light-dom-shim' before SSR imports.\",\n\t);\n}\n\n/**\n * Possible positions to insert a rendered template.\n */\nexport type RenderInsertPosition = 'replace' | 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend';\n\n/**\n * Represents a Radiant element event listener.\n */\nexport type RadiantElementEventListener = {\n\tselector: string;\n\ttype: string;\n\tlistener: EventListener;\n\toptions?: AddEventListenerOptions;\n};\n\ntype StringPropertyKey<Value> = Extract<keyof Value, string>;\n\n/**\n * Represents an interface for a Radiant element.\n * @typeParam Bindings - Explicit internal bindable shape used to type `bind()` and `getReactiveBinding()`.\n *\n * This shape describes which reactive members are exposed through `bindings`,\n * `$`, and `bind(...)`. It does not automatically define the public JSX\n * attribute contract for the custom element.\n */\nexport interface IRadiantElement<Bindings extends object = {}> {\n\t/**\n\t * Namespace of cached JSX bindings keyed by the explicit bindable shape.\n\t */\n\treadonly bindings: ReactiveBindings<Bindings>;\n\n\t/**\n\t * Short alias for {@link bindings}.\n\t */\n\treadonly $: ReactiveBindings<Bindings>;\n\n\t/**\n\t * Called when a property of the element is updated.\n\t * @param changedProperty - The name of the changed property.\n\t * @param oldValue - The old value of the property.\n\t * @param newValue - The new value of the property.\n\t */\n\tnotifyUpdate(changedProperty: string, oldValue: unknown, newValue: unknown): void;\n\n\t/**\n\t * Subscribes to a Radiant element event.\n\t * @param event - The event listener to subscribe to.\n\t */\n\tsubscribeEvent(event: RadiantElementEventListener): void;\n\n\t/**\n\t * Registers a callback to be invoked when a reactive property or field changes.\n\t *\n\t * @returns A cleanup function that unregisters the callback.\n\t */\n\tregisterUpdateCallback(property: string, update: () => void): () => void;\n\n\t/**\n\t * Returns a subscribable JSX child binding for a reactive property or field.\n\t *\n\t * Prefer `this.bindings.key` or `this.$.key` in JSX render code when you want\n\t * property access syntax without string literals.\n\t */\n\tbind<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;\n\n\t/**\n\t * Returns a subscribable JSX child binding for a reactive property or field.\n\t *\n\t * This is the primitive lookup used by `bind()`, `bindings.key`, and `$.key`.\n\t */\n\tgetReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>>;\n\n\t/**\n\t * Defines a stable JSX binding companion accessor for a reactive member.\n\t *\n\t * Companion bindings create properties such as `$count` directly on the host.\n\t * Prefer the `bindings` or `$` namespace for new code when you want typed,\n\t * explicit access to the configured bindable shape.\n\t */\n\tdefineReactiveBinding(property: string, bind?: ReactiveBindingOption): void;\n\n\t/**\n\t * Subscribes to multiple Radiant element events.\n\t * @param events - The array of event listeners to subscribe to.\n\t */\n\tsubscribeEvents(events: RadiantElementEventListener[]): void;\n\n\t/**\n\t * It adds a callback to be executed when the Radiant element is disconnected from the DOM.\n\t */\n\tregisterCleanupCallback(callback: () => void): void;\n\n\t/**\n\t * Registers a callback to run on each future host connection.\n\t *\n\t * The callback is only invoked from `connectedCallback()`. Registering it\n\t * after the host is already connected does not invoke it immediately.\n\t */\n\tregisterConnectedCallback(callback: () => void): void;\n\n\t/**\n\t * Creates a new reactive member state and registers it under `propertyName`.\n\t */\n\tcreateReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T>;\n\n\t/**\n\t * Registers an externally-owned reactive member state (used by `signal()`).\n\t */\n\tregisterReactiveMember<T>(propertyName: string, signal: ReactiveState<T>): void;\n\n\t/**\n\t * Returns the member state registered under `propertyName`, if any.\n\t */\n\tgetReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined;\n\n\t/**\n\t * Renders a trusted HTML template string into the specified target element.\n\t *\n\t * **Security:** The `template` string is written to the DOM via `innerHTML`\n\t * or `insertAdjacentHTML` without built-in sanitization. Callers are\n\t * responsible for ensuring the input is trusted. Supply a `sanitize`\n\t * function to transform the template before insertion.\n\t *\n\t * @param options - The rendering options.\n\t * @param options.target - The target element to render the template into.\n\t * @param options.template - The template string to render.\n\t * @param options.insert - The position to insert the rendered template. (optional)\n\t * @param options.sanitize - An optional function that transforms the template string before insertion.\n\t */\n\trenderTemplate(options: {\n\t\ttarget: HTMLElement;\n\t\ttemplate: string;\n\t\tinsert?: RenderInsertPosition;\n\t\tsanitize?: (html: string) => string;\n\t}): void;\n\n\t/**\n\t * Called when the Radiant element is connected to a context.\n\t * @param context - The connected context.\n\t */\n\tconnectedContextCallback(context: UnknownContext): void;\n\n\t/**\n\t * Gets a reference to a child element by its data-ref attribute.\n\t * @param ref - The data-ref attribute value of the element to get.\n\t * @param all - Whether to get all elements with the specified data-ref attribute value.\n\t * @returns The element with the specified data-ref attribute value, an array of elements or null if no element was found.\n\t */\n\tgetRef<T extends Element = Element>(ref: string, all: true): T[];\n\tgetRef<T extends Element = Element>(ref: string, all?: false): T | null;\n}\n\n/**\n * A base class for creating custom elements with reactive properties and event subscriptions.\n * @typeParam Bindings - Explicit internal bindable shape. Include only the\n * prop/state keys that JSX bindings should accept.\n *\n * Prefer a separate public props type for custom-element JSX declarations when\n * the external attribute contract differs from the component's internal\n * reactive state. Reuse the same type only when the public props and bindable\n * members are intentionally identical.\n * @extends HTMLElement\n * @implements IRadiantElement<Bindings>\n */\nexport class RadiantElement<Bindings extends object = {}>\n\textends RadiantElementBase\n\timplements IRadiantElement<Bindings>\n{\n\t/**\n\t * Controls where the JSX render lifecycle mounts the component view.\n\t *\n\t * Subclasses can override this with `'shadow'` to force an internal open\n\t * shadow root for client-side rendering. Host SSR helpers remain light-DOM\n\t * only and throw when shadow render mode is enabled.\n\t */\n\tprotected readonly renderRootMode: 'light' | 'shadow' = 'light';\n\tpublic readonly bindings: ReactiveBindings<Bindings>;\n\tpublic readonly $: ReactiveBindings<Bindings>;\n\tprivate readonly reactiveHost: ReactiveHost<this, Bindings>;\n\tprivate readonly reactivePropertyState: ReactivePropertyState;\n\tprivate readonly eventSubscriptionRegistry: EventSubscriptionRegistry;\n\n\t/**\n\t * Registered context providers and hydration bindings for SSR.\n\t */\n\tprivate readonly hostSsrRegistry = new HostSsrRegistry();\n\n\t/**\n\t * A map for event emitters\n\t */\n\tprivate eventEmitters = new Map<string, EventEmitter>();\n\n\t/**\n\t * A flag indicating whether the element has been connected to the DOM.\n\t */\n\tprivate elementReady = false;\n\tprivate isFirstConnectPending = false;\n\tprivate readonly renderScheduler: RenderScheduler;\n\tprivate renderRuntime?: RenderRuntime;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.reactivePropertyState = new ReactivePropertyState(this);\n\t\tthis.eventSubscriptionRegistry = new EventSubscriptionRegistry(\n\t\t\t() => this.resolveRenderSurface().interactionTarget,\n\t\t\t() => this,\n\t\t);\n\t\tthis.renderScheduler = new RenderScheduler({\n\t\t\tcanFlush: () =>\n\t\t\t\tthis.isConnected &&\n\t\t\t\t!this.renderScheduler.rendering &&\n\t\t\t\t!(this.isFirstConnectPending && shouldHydrateOnConnect(this)),\n\t\t\tcommit: () => {\n\t\t\t\tconst { renderTarget } = this.resolveRenderSurface();\n\t\t\t\tthis.getOrCreateRenderRuntime().render(renderTarget as HTMLElement);\n\t\t\t},\n\t\t});\n\n\t\tthis.reactiveHost = new ReactiveHost<this, Bindings>(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tdefineProperty: (target, property, descriptor) => Object.defineProperty(target, property, descriptor),\n\t\t\t\tgetBindingTarget: (target) => Object.getPrototypeOf(target) ?? target,\n\t\t\t\thasProperty: (target, property) => property in target,\n\t\t\t\treadProperty: (target, property) => (target as Record<string, unknown>)[property],\n\t\t\t},\n\t\t\t() => this.shouldAutoBindReactiveMembers(),\n\t\t);\n\t\tthis.bindings = this.reactiveHost.bindings;\n\t\tthis.$ = this.reactiveHost.$;\n\t\tensureLegacyHostReady(this, 'construct');\n\t}\n\n\tpublic get slotProjectionVersion(): number {\n\t\treturn this.renderRuntime?.slotProjectionVersion ?? 0;\n\t}\n\n\tconnectedCallback() {\n\t\tensureLegacyHostReady(this, 'connect');\n\t\tconst isReconnectDuringPendingFirstConnect = this.isFirstConnectPending;\n\n\t\tthis.elementReady = true;\n\n\t\tthis.reactiveHost.connectHost();\n\n\t\tif (isReconnectDuringPendingFirstConnect) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isFirstConnectPending = true;\n\n\t\tqueueMicrotask(() => {\n\t\t\tthis.isFirstConnectPending = false;\n\n\t\t\tif (!this.isConnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst renderRuntime = this.getOrCreateRenderRuntime();\n\t\t\trenderRuntime.observeSlotProjection();\n\n\t\t\tif (shouldHydrateOnConnect(this)) {\n\t\t\t\tthis.renderScheduler.clearPending();\n\t\t\t\tthis.hydrate();\n\n\t\t\t\tif (this.renderScheduler.pending) {\n\t\t\t\t\tthis.update();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.update();\n\t\t});\n\t}\n\n\tconnectedContextCallback(_contextName: UnknownContext): void {}\n\n\tdisconnectedCallback() {\n\t\tthis.renderRuntime?.dispose();\n\t\tthis.renderRuntime = undefined;\n\t\tthis.eventSubscriptionRegistry.removeAll();\n\t\tthis.reactiveHost.disconnectHost();\n\t}\n\n\tpublic notifyUpdate(changedProperty: string, oldValue: unknown, value: unknown) {\n\t\tthis.reactiveHost.notifyUpdate(changedProperty, oldValue, value);\n\t}\n\n\tattributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n\t\tif (oldValue === newValue || !this.elementReady) return;\n\n\t\tthis.reactivePropertyState.applyAttributeChange(name, oldValue, newValue);\n\t}\n\n\t/**\n\t * Renders a trusted HTML template string into the specified target element.\n\t *\n\t * **Security:** The `template` string is written to the DOM via `innerHTML`\n\t * or `insertAdjacentHTML` without built-in sanitization. Callers are\n\t * responsible for ensuring the input is trusted. Supply a `sanitize`\n\t * function to transform the template before insertion.\n\t */\n\tpublic renderTemplate({\n\t\ttarget = this,\n\t\ttemplate,\n\t\tinsert = 'replace',\n\t\tsanitize,\n\t}: {\n\t\ttarget: HTMLElement;\n\t\ttemplate: string;\n\t\tinsert?: RenderInsertPosition;\n\t\tsanitize?: (html: string) => string;\n\t}) {\n\t\tconst html = sanitize ? sanitize(template) : template;\n\t\tswitch (insert) {\n\t\t\tcase 'replace':\n\t\t\t\ttarget.innerHTML = html;\n\t\t\t\tbreak;\n\t\t\tcase 'beforeend':\n\t\t\t\ttarget.insertAdjacentHTML('beforeend', html);\n\t\t\t\tbreak;\n\t\t\tcase 'afterbegin':\n\t\t\t\ttarget.insertAdjacentHTML('afterbegin', html);\n\t\t\t\tbreak;\n\t\t\tcase 'beforebegin':\n\t\t\t\ttarget.insertAdjacentHTML('beforebegin', html);\n\t\t\t\tbreak;\n\t\t\tcase 'afterend':\n\t\t\t\ttarget.insertAdjacentHTML('afterend', html);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic render(): JsxRenderable {\n\t\treturn jsx('slot', {});\n\t}\n\n\tpublic getReactivePropDefinitions(): ReactivePropDefinition[] {\n\t\treturn getReactivePropDefinitions(this);\n\t}\n\n\tpublic getPropertyValue(name: string): unknown {\n\t\treturn Reflect.get(this, name);\n\t}\n\n\tpublic renderViewToString(options: RenderToStringOptions = {}): string {\n\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\treturn this.innerHTML;\n\t\t}\n\n\t\tensureLegacyHostReady(this, 'ssr');\n\t\tthis.prepareForSsr();\n\n\t\treturn requireRadiantElementSsrRuntime().renderView(this as unknown as InternalRadiantSsrHost, options);\n\t}\n\n\tpublic hydrate(): void {\n\t\tif (!this.shouldRunRenderLifecycle() || !this.isConnected || this.renderScheduler.rendering) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { renderTarget } = this.resolveRenderSurface();\n\t\tconst renderRuntime = this.getOrCreateRenderRuntime();\n\n\t\tthis.renderScheduler.runExclusive(() => {\n\t\t\trenderRuntime.hydrate(renderTarget as HTMLElement);\n\t\t});\n\t}\n\n\tpublic requestUpdate(): void {\n\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.renderScheduler.requestUpdate();\n\t}\n\n\tpublic update(): void {\n\t\tif (!this.shouldRunRenderLifecycle()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.renderScheduler.markPending();\n\t\tthis.renderScheduler.flush();\n\t}\n\n\tpublic registerReactiveProperty(config: ReactiveProperty) {\n\t\tthis.reactivePropertyState.register(config);\n\t}\n\n\tpublic getReactiveProperties(): ReactiveProperty[] {\n\t\treturn this.reactivePropertyState.getAll();\n\t}\n\n\tpublic registerContextProvider(name: string, provider: SsrSerializableContextProvider): void {\n\t\tthis.hostSsrRegistry.registerContextProvider(name, provider);\n\t}\n\n\tpublic registerHydrationBinding(name: string, binding: SsrSerializableHydrationBinding): void {\n\t\tthis.hostSsrRegistry.registerHydrationBinding(name, binding);\n\t}\n\n\tpublic getContextProviders(): SsrSerializableContextProvider[] {\n\t\treturn this.hostSsrRegistry.getContextProviders();\n\t}\n\n\tpublic getHydrationBindings(): SsrSerializableHydrationBinding[] {\n\t\treturn this.hostSsrRegistry.getHydrationBindings();\n\t}\n\n\t/**\n\t * Flushes any deferred SSR-only preparation work before the host is\n\t * serialized.\n\t *\n\t * Radiant uses this to reapply SSR consumer state after construction so the\n\t * first server render sees finalized fields, props, and authored content.\n\t */\n\tprotected prepareForSsr(): void {\n\t\trunSsrPreparationCallbacks(this);\n\t}\n\n\t/**\n\t * Returns the default JSX binding policy for reactive members on this host.\n\t *\n\t * `RadiantElement` hosts default to automatic bindings for reactive members\n\t * when no explicit `bind` option is supplied.\n\t *\n\t * Lower-level hosts can override this hook to opt out when they want binding\n\t * creation to stay fully explicit across `@prop`, `@state`, and direct\n\t * `createReactiveProp`/`createReactiveField` calls.\n\t */\n\tprotected shouldAutoBindReactiveMembers(): boolean {\n\t\treturn true;\n\t}\n\n\tprotected shouldRunRenderLifecycle(): boolean {\n\t\treturn this.render !== RadiantElement.prototype.render;\n\t}\n\n\t/** Returns the DOM root used by client-side render and hydrate work. */\n\tprotected getRenderTarget(): RadiantRenderTarget {\n\t\tif (this.renderRootMode !== 'shadow') {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.shadowRoot) {\n\t\t\treturn this.shadowRoot;\n\t\t}\n\n\t\tif (typeof this.attachShadow !== 'function') {\n\t\t\tthrow new Error('RadiantElement shadow render mode requires attachShadow().');\n\t\t}\n\n\t\treturn this.attachShadow({ mode: 'open' });\n\t}\n\n\tpublic registerUpdateCallback(property: string, update: () => void): () => void {\n\t\treturn this.reactiveHost.registerUpdateCallback(property, update);\n\t}\n\n\tpublic getReactiveBinding<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>> {\n\t\treturn this.reactiveHost.getReactiveBinding(property);\n\t}\n\n\tpublic bind<Property extends StringPropertyKey<Bindings>>(\n\t\tproperty: Property,\n\t): SubscribableJsxValueWithAccess<ReactiveBindingValue<Bindings, Property>> {\n\t\treturn this.reactiveHost.getReactiveBinding(property);\n\t}\n\n\tpublic defineReactiveBinding(property: string, bind: ReactiveBindingOption = true): void {\n\t\tthis.reactiveHost.defineReactiveBinding(property, bind);\n\t}\n\n\tpublic createReactiveMember<T>(propertyName: string, initialValue: T): ReactiveState<T> {\n\t\treturn this.reactiveHost.createReactiveMember(propertyName, initialValue);\n\t}\n\n\tpublic registerReactiveMember<T>(propertyName: string, signal: ReactiveState<T>): void {\n\t\tthis.reactiveHost.registerReactiveMember(propertyName, signal);\n\t}\n\n\tpublic getReactiveMember<T = unknown>(propertyName: string): ReactiveState<T> | undefined {\n\t\treturn this.reactiveHost.getReactiveMember(propertyName);\n\t}\n\n\tpublic subscribeEvents(events: RadiantElementEventListener[]): Array<() => void> {\n\t\tconst unsubscribers: Array<() => void> = [];\n\t\tfor (const event of events) {\n\t\t\tunsubscribers.push(this.subscribeEvent(event));\n\t\t}\n\t\treturn unsubscribers;\n\t}\n\n\tpublic hasEventSubscription(subscriptionId: string): boolean {\n\t\treturn this.eventSubscriptionRegistry.hasEventSubscription(subscriptionId);\n\t}\n\n\tpublic subscribeEvent(eventConfig: RadiantElementEventListener): () => void {\n\t\treturn this.eventSubscriptionRegistry.subscribe(eventConfig);\n\t}\n\n\t/**\n\t * Registers a callback that runs on every future disconnect.\n\t */\n\tpublic registerCleanupCallback(callback: () => void): void {\n\t\tthis.reactiveHost.registerCleanupCallback(callback);\n\t}\n\n\t/**\n\t * Registers a callback that runs from `connectedCallback()` on future host\n\t * connections.\n\t *\n\t * Registering after the host is already connected does not invoke the\n\t * callback immediately.\n\t */\n\tpublic registerConnectedCallback(callback: () => void): void {\n\t\tthis.reactiveHost.registerConnectedCallback(callback);\n\t}\n\n\tpublic registerEventEmitter(name: string, emitter: EventEmitter) {\n\t\tthis.eventEmitters.set(name, emitter);\n\t}\n\n\tpublic getRef<T extends Element = Element>(ref: string, all: true): T[];\n\tpublic getRef<T extends Element = Element>(ref: string, all?: false): T | null;\n\tpublic getRef<T extends Element = Element>(ref: string, all = false): T | T[] | null {\n\t\tconst selector = `[data-ref=\"${ref}\"]`;\n\t\tconst { queryRoot } = this.resolveRenderSurface();\n\t\tif (all) {\n\t\t\treturn Array.from(queryRoot.querySelectorAll(selector)) as T[];\n\t\t}\n\t\treturn (queryRoot.querySelector(selector) as T) ?? null;\n\t}\n\n\tpublic getSlotElement<T extends Element = Element>(name?: string): T | null {\n\t\treturn (this.getSlotElements<T>(name)[0] ?? null) as T | null;\n\t}\n\n\tpublic getSlotElements<T extends Element = Element>(name?: string): T[] {\n\t\treturn this.getOrCreateRenderRuntime().getSlotElements<T>(name);\n\t}\n\n\tpublic createReactiveField<T>(propertyName: string, initialValue: T, options: ReactiveFieldOptions = {}): void {\n\t\tthis.reactiveHost.createReactiveField(propertyName, initialValue, options);\n\t}\n\n\t/**\n\t * Defines a reactive custom-element property backed by a Radiant accessor.\n\t *\n\t * When the host was assigned a value before upgrade, that pre-upgrade value is\n\t * preferred over attribute parsing and `defaultValue` so early `.prop = value`\n\t * writes survive into the reactive lifecycle.\n\t */\n\tpublic createReactiveProp<T = unknown>(propertyName: string, options: ReactivePropertyOptions<T>): void {\n\t\tthis.reactivePropertyState.create(\n\t\t\tpropertyName,\n\t\t\toptions,\n\t\t\t(type, attributeKey, defaultValue) => getInitialValue(this, type, attributeKey, defaultValue) as T,\n\t\t\t(name, config) => {\n\t\t\t\tthis.reactiveHost.defineReactiveAccessor(name, config);\n\t\t\t},\n\t\t\t(name, initial) => this.createReactiveMember(name, initial),\n\t\t);\n\t}\n\n\tpublic getSlotProjectionScriptTag(): string | undefined {\n\t\treturn this.getOrCreateRenderRuntime().getSlotProjectionScriptTag();\n\t}\n\n\tpublic getAuthoredHydrationScriptMarkup(): string | undefined {\n\t\treturn this.getOrCreateRenderRuntime().getAuthoredHydrationScriptMarkup();\n\t}\n\n\tpublic resolveTrackedRenderOutput(): { containsSlots: boolean; value: JsxRenderable } {\n\t\treturn this.getOrCreateRenderRuntime().resolveTrackedRenderOutput();\n\t}\n\n\tprivate getOrCreateRenderRuntime() {\n\t\tif (this.renderRuntime) {\n\t\t\treturn this.renderRuntime;\n\t\t}\n\n\t\tthis.renderRuntime = new RenderRuntime(this as RenderRuntimeHost);\n\t\treturn this.renderRuntime;\n\t}\n\n\tprivate resolveRenderSurface(): RadiantRenderSurface {\n\t\tconst renderTarget = this.getRenderTarget();\n\t\tconst interactionTarget =\n\t\t\ttypeof ShadowRoot !== 'undefined' && renderTarget instanceof ShadowRoot ? renderTarget : this;\n\n\t\treturn {\n\t\t\tinteractionTarget,\n\t\t\tqueryRoot: interactionTarget,\n\t\t\trenderTarget,\n\t\t};\n\t}\n}\n\nfunction requireRadiantElementSsrRuntime() {\n\tconst runtime = getRadiantElementSsrRuntime();\n\n\tif (!runtime) {\n\t\tthrow new Error('Radiant SSR runtime unavailable. Import `@ecopages/radiant/server/render-component` first.');\n\t}\n\n\treturn runtime;\n}\n\nfunction shouldHydrateOnConnect(component: HTMLElement): boolean {\n\treturn isRadiantHydratorInstalled() && hasHydrationMarkers(component);\n}\n"
|
|
27
|
+
],
|
|
28
|
+
"mappings": "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",
|
|
29
|
+
"debugId": "4F27A0624E24367F64756E2164756E21",
|
|
30
|
+
"names": []
|
|
31
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var{defineProperty:e,getOwnPropertyNames:h,getOwnPropertyDescriptor:i}=Object,j=Object.prototype.hasOwnProperty;function k(a){return this[a]}var n=(a)=>{var b=(g??=new WeakMap).get(a),c;if(b)return b;if(b=e({},"__esModule",{value:!0}),a&&typeof a==="object"||typeof a==="function"){for(var d of h(a))if(!j.call(b,d))e(b,d,{get:k.bind(a,d),enumerable:!(c=i(a,d))||c.enumerable})}return g.set(a,b),b},g;var l=(a)=>a;function m(a,b){this[a]=l.bind(null,b)}var o=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:!0,configurable:!0,set:m.bind(b,c)})};var p=(a,b)=>()=>(a&&(b=a(a=0)),b);var q=((a)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var f=Symbol.for("@ecopages/radiant.hydrator-installed");function s(){globalThis[f]=!0}function t(){delete globalThis[f]}function u(){return globalThis[f]===!0}export{t as uninstallRadiantHydratorState,u as isRadiantHydratorInstalled,s as installRadiantHydratorState};
|
|
2
|
+
|
|
3
|
+
//# debugId=15199BA2DF32A34E64756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"const RADIANT_HYDRATOR_INSTALLED_SYMBOL = Symbol.for('@ecopages/radiant.hydrator-installed');\n\ntype GlobalHydratorState = typeof globalThis & Record<PropertyKey, unknown>;\n\n/**\n * Marks the current JavaScript environment as hydration-enabled for first\n * custom-element connect.\n *\n * `RadiantElement` reads this flag before deciding whether SSR markup should\n * hydrate in place or be replaced by a fresh client render.\n */\nexport function installRadiantHydratorState(): void {\n\t(globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] = true;\n}\n\n/**\n * Clears the explicit hydration-enabled flag from `globalThis`.\n *\n * This is mainly used by tests so they can assert both hydrated and non-\n * hydrated first-connect behavior deterministically.\n */\nexport function uninstallRadiantHydratorState(): void {\n\tdelete (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL];\n}\n\n/**\n * Returns whether first-connect hydration is currently enabled for this\n * JavaScript environment.\n */\nexport function isRadiantHydratorInstalled(): boolean {\n\treturn (globalThis as GlobalHydratorState)[RADIANT_HYDRATOR_INSTALLED_SYMBOL] === true;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "i0BAAA,IAAM,EAAoC,OAAO,IAAI,sCAAsC,EAWpF,SAAS,CAA2B,EAAS,CAClD,WAAmC,GAAqC,GASnE,SAAS,CAA6B,EAAS,CACrD,OAAQ,WAAmC,GAOrC,SAAS,CAA0B,EAAY,CACrD,OAAQ,WAAmC,KAAuC",
|
|
8
|
+
"debugId": "15199BA2DF32A34E64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type JsxBindingSourceValue, type SubscribableJsxValueWithAccess } from '@ecopages/jsx';
|
|
2
|
+
import type { ReactiveState } from './reactivity-contract';
|
|
3
|
+
/**
|
|
4
|
+
* Adapts a host member {@link ReactiveState} into the jsx binding shape.
|
|
5
|
+
*
|
|
6
|
+
* Kept in a dedicated module so `reactive-host.ts` stays free of direct
|
|
7
|
+
* `@ecopages/jsx` imports while bindings still expose `getValue`, `subscribe`,
|
|
8
|
+
* and `map` for derived child updates.
|
|
9
|
+
*/
|
|
10
|
+
export declare function adaptReactiveStateToJsxBinding<Value extends JsxBindingSourceValue>(state: ReactiveState<Value>): SubscribableJsxValueWithAccess<Value>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var{defineProperty:D,getOwnPropertyNames:F,getOwnPropertyDescriptor:G}=Object,H=Object.prototype.hasOwnProperty;function I(q){return this[q]}var O=(q)=>{var z=(E??=new WeakMap).get(q),B;if(z)return z;if(z=D({},"__esModule",{value:!0}),q&&typeof q==="object"||typeof q==="function"){for(var C of F(q))if(!H.call(z,C))D(z,C,{get:I.bind(q,C),enumerable:!(B=G(q,C))||B.enumerable})}return E.set(q,z),z},E;var L=(q)=>q;function M(q,z){this[q]=L.bind(null,z)}var P=(q,z)=>{for(var B in z)D(q,B,{get:z[B],enumerable:!0,configurable:!0,set:M.bind(z,B)})};var Q=(q,z)=>()=>(q&&(z=q(q=0)),z);var T=((q)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(q,{get:(z,B)=>(typeof require<"u"?require:z)[B]}):q)(function(q){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+q+'" is not supported')});import{createSubscribableJsxValue as N}from"@ecopages/jsx";function X(q){return N({getValue:()=>q.get(),subscribe:(z)=>q.subscribe(z)})}export{X as adaptReactiveStateToJsxBinding};
|
|
2
|
+
|
|
3
|
+
//# debugId=0DF745AA3E25FAA664756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/reactive-binding-adapter.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n\tcreateSubscribableJsxValue,\n\ttype JsxBindingSourceValue,\n\ttype SubscribableJsxValueWithAccess,\n} from '@ecopages/jsx';\nimport type { ReactiveState } from './reactivity-contract';\n\n/**\n * Adapts a host member {@link ReactiveState} into the jsx binding shape.\n *\n * Kept in a dedicated module so `reactive-host.ts` stays free of direct\n * `@ecopages/jsx` imports while bindings still expose `getValue`, `subscribe`,\n * and `map` for derived child updates.\n */\nexport function adaptReactiveStateToJsxBinding<Value extends JsxBindingSourceValue>(\n\tstate: ReactiveState<Value>,\n): SubscribableJsxValueWithAccess<Value> {\n\treturn createSubscribableJsxValue({\n\t\tgetValue: () => state.get(),\n\t\tsubscribe: (notify) => state.subscribe(notify),\n\t});\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "i0BAAA,qCACC,sBAaM,SAAS,CAAmE,CAClF,EACwC,CACxC,OAAO,EAA2B,CACjC,SAAU,IAAM,EAAM,IAAI,EAC1B,UAAW,CAAC,IAAW,EAAM,UAAU,CAAM,CAC9C,CAAC",
|
|
8
|
+
"debugId": "0DF745AA3E25FAA664756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|