semajsx 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{client-BrupjhG0.mjs → client-CEJQ4fit.mjs} +3 -3
- package/dist/{client-BrupjhG0.mjs.map → client-CEJQ4fit.mjs.map} +1 -1
- package/dist/{document-DsiJO2jG.mjs → document-Cbz4084O.mjs} +2 -2
- package/dist/{document-XKyAs62C.mjs → document-Cfdhi7vG.mjs} +2 -2
- package/dist/{document-XKyAs62C.mjs.map → document-Cfdhi7vG.mjs.map} +1 -1
- package/dist/dom/index.mjs +2 -2
- package/dist/dom/jsx-dev-runtime.mjs +1 -1
- package/dist/dom/jsx-runtime.mjs +1 -1
- package/dist/index.d.mts +11 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{jsx-runtime-Dc77fsnM.d.mts → jsx-runtime-tdaY-P9K.d.mts} +2 -2
- package/dist/{jsx-runtime-Dc77fsnM.d.mts.map → jsx-runtime-tdaY-P9K.d.mts.map} +1 -1
- package/dist/{lucide-Ddt_N9dJ.mjs → lucide-DWk3itzO.mjs} +3 -3
- package/dist/{lucide-Ddt_N9dJ.mjs.map → lucide-DWk3itzO.mjs.map} +1 -1
- package/dist/{resource-pm7qP-jV.mjs → resource-BU0Po0ez.mjs} +2 -2
- package/dist/{resource-pm7qP-jV.mjs.map → resource-BU0Po0ez.mjs.map} +1 -1
- package/dist/{src-Cv4rRVzv.mjs → src--YS4EvMz.mjs} +9 -6
- package/dist/src--YS4EvMz.mjs.map +1 -0
- package/dist/{src-CXY-7FC3.mjs → src-77V1Plyd.mjs} +665 -129
- package/dist/src-77V1Plyd.mjs.map +1 -0
- package/dist/{src-SqJ6k7Xv.mjs → src-BTG08Qnh.mjs} +4 -4
- package/dist/{src-SqJ6k7Xv.mjs.map → src-BTG08Qnh.mjs.map} +1 -1
- package/dist/{src-C_aFsFJ3.mjs → src-Cm12Y2XV.mjs} +2 -2
- package/dist/{src-C_aFsFJ3.mjs.map → src-Cm12Y2XV.mjs.map} +1 -1
- package/dist/{src-CAyv9Uf9.mjs → src-Mucdq4zw.mjs} +6 -6
- package/dist/{src-CAyv9Uf9.mjs.map → src-Mucdq4zw.mjs.map} +1 -1
- package/dist/ssg/index.mjs +6 -6
- package/dist/ssg/plugins/docs-theme.mjs +9 -9
- package/dist/ssg/plugins/lucide.mjs +3 -3
- package/dist/ssr/client.mjs +4 -4
- package/dist/ssr/index.mjs +5 -5
- package/dist/terminal/index.d.mts +248 -4
- package/dist/terminal/index.d.mts.map +1 -1
- package/dist/terminal/index.mjs +3 -3
- package/dist/terminal/jsx-dev-runtime.d.mts +2 -2
- package/dist/terminal/jsx-dev-runtime.mjs +1 -1
- package/dist/terminal/jsx-runtime.d.mts +2 -2
- package/dist/terminal/jsx-runtime.mjs +1 -1
- package/dist/{types-Bj5q5x2Q.d.mts → types-Bm8rZGKW.d.mts} +2 -2
- package/dist/{types-Bj5q5x2Q.d.mts.map → types-Bm8rZGKW.d.mts.map} +1 -1
- package/package.json +1 -1
- package/dist/src-CXY-7FC3.mjs.map +0 -1
- package/dist/src-Cv4rRVzv.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src-C_aFsFJ3.mjs","names":[],"sources":["../../dom/src/operations.ts","../../dom/src/properties.ts","../../dom/src/render.ts","../../dom/src/portal.ts","../../dom/src/forward.ts","../../dom/src/style-anchor.ts","../../dom/src/native.ts"],"sourcesContent":["/**\n * Low-level DOM operations\n */\n\nexport function createElement(tagName: string): Element {\n return document.createElement(tagName);\n}\n\nexport function createTextNode(text: string): Text {\n return document.createTextNode(text);\n}\n\nexport function createComment(text: string): Comment {\n return document.createComment(text);\n}\n\nexport function appendChild(parent: Node, child: Node): void {\n parent.appendChild(child);\n}\n\nexport function removeChild(node: Node): void {\n node.parentNode?.removeChild(node);\n}\n\nexport function insertBefore(parent: Node, newNode: Node, refNode: Node | null): void {\n parent.insertBefore(newNode, refNode);\n}\n\nexport function replaceNode(oldNode: Node, newNode: Node): void {\n oldNode.parentNode?.replaceChild(newNode, oldNode);\n}\n\nexport function setText(node: Node, text: string): void {\n node.textContent = text;\n}\n\nexport function getParent(node: Node): Node | null {\n return node.parentNode;\n}\n\nexport function getNextSibling(node: Node): Node | null {\n return node.nextSibling;\n}\n","import type { Signal } from \"@semajsx/signal\";\nimport type { Ref } from \"@semajsx/core\";\nimport { isSignal } from \"@semajsx/signal\";\nimport { isStyleToken, inject, type StyleToken } from \"@semajsx/style\";\n\n/**\n * Class value type - can be string, StyleToken, array, or falsy\n */\ntype ClassValue = string | StyleToken | ClassValue[] | false | null | undefined;\n\n/**\n * Resolve a class value to a string\n *\n * Supports:\n * - Strings: returned as-is\n * - StyleTokens: injects CSS and returns className\n * - Arrays: recursively resolves all values\n * - Falsy values: filtered out\n *\n * @example\n * resolveClass(\"btn\") // \"btn\"\n * resolveClass(button.root) // \"root-x7f3a\" (injects CSS)\n * resolveClass([button.root, \"custom\", isLarge && button.large]) // \"root-x7f3a custom large-y8g4b\"\n */\nfunction resolveClass(value: ClassValue): string {\n if (!value) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (isStyleToken(value)) {\n // Inject CSS for the token\n inject(value);\n // Return the className (or empty string if none)\n return value._ ?? \"\";\n }\n\n if (Array.isArray(value)) {\n // Recursively resolve array values, filter empty strings\n return value.map(resolveClass).filter(Boolean).join(\" \");\n }\n\n return \"\";\n}\n\n/**\n * Set a property on an element\n */\nexport function setProperty(element: Element, key: string, value: unknown): void {\n // Skip internal props\n if (key === \"key\" || key === \"ref\" || key === \"children\") {\n return;\n }\n\n // Handle events\n if (key.startsWith(\"on\") && typeof value === \"function\") {\n const eventName = key.toLowerCase().substring(2); // \"onClick\" -> \"click\"\n\n // Use addEventListener instead of property assignment for better reliability\n // especially in hydration scenarios\n const element_any = element as any;\n\n // Remove old listener if exists (stored on element)\n const oldListener = element_any[`__${key}`];\n if (oldListener) {\n element.removeEventListener(eventName, oldListener);\n }\n\n // Add new listener and store reference for future cleanup\n element.addEventListener(eventName, value as EventListener);\n element_any[`__${key}`] = value;\n\n return;\n }\n\n // Handle className/class with StyleToken support\n if (key === \"className\" || key === \"class\") {\n if (value == null) {\n element.removeAttribute(\"class\");\n return;\n }\n\n // Resolve class value (may be string, StyleToken, or array)\n const resolvedClass = resolveClass(value as ClassValue);\n if (resolvedClass) {\n element.setAttribute(\"class\", resolvedClass);\n } else {\n element.removeAttribute(\"class\");\n }\n return;\n }\n\n // Handle style\n if (key === \"style\" && element instanceof HTMLElement) {\n if (typeof value === \"string\") {\n element.style.cssText = value;\n } else if (typeof value === \"object\" && value !== null) {\n Object.assign(element.style, value);\n }\n return;\n }\n\n // Handle special boolean attributes\n if (typeof value === \"boolean\") {\n if (value) {\n element.setAttribute(key, \"\");\n } else {\n element.removeAttribute(key);\n }\n return;\n }\n\n // Handle value for form elements\n if (key === \"value\") {\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n element.value = String(value ?? \"\");\n return;\n }\n }\n\n // Handle checked for checkboxes\n if (key === \"checked\" && element instanceof HTMLInputElement) {\n element.checked = Boolean(value);\n return;\n }\n\n // Default: set as attribute\n if (value == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(value));\n }\n}\n\n/**\n * Set a signal property on an element\n */\nexport function setSignalProperty<T = unknown>(\n element: Element,\n key: string,\n signal: Signal<T>,\n): () => void {\n // Set initial value\n setProperty(element, key, signal.value);\n\n // Subscribe to changes and update property\n return signal.subscribe((value: T) => {\n setProperty(element, key, value);\n });\n}\n\n/**\n * Set a ref on an element\n * - Supports both Signal refs and callback refs\n * - Returns a cleanup function to clear the ref\n */\nexport function setRef(element: Node, ref: Ref<any>): () => void {\n // Signal ref\n if (isSignal(ref)) {\n ref.value = element;\n return () => {\n ref.value = null;\n };\n }\n\n // Callback ref\n if (typeof ref === \"function\") {\n ref(element);\n return () => {\n ref(null);\n };\n }\n\n // Invalid ref type\n return () => {};\n}\n","import type { VNode } from \"@semajsx/core\";\nimport {\n resource,\n stream,\n createRenderer,\n isAsyncIterator,\n isPromise,\n Fragment,\n Portal,\n type RenderedNode,\n type RenderStrategy,\n type ContextMap,\n} from \"@semajsx/core\";\nimport { setProperty, setSignalProperty, setRef } from \"./properties\";\nimport {\n appendChild,\n createElement,\n createTextNode,\n createComment,\n removeChild,\n replaceNode,\n insertBefore,\n getParent,\n getNextSibling,\n} from \"./operations\";\n\n/**\n * Helper to recursively collect all actual DOM nodes from a rendered node\n * Handles fragments and signal nodes that may not have their own DOM node\n */\nfunction collectNodes(rendered: RenderedNode<Node>): Node[] {\n const nodes: Node[] = [];\n\n // Portal: children are already rendered to the portal container\n // Don't collect them here as they shouldn't be added to the main tree\n if (rendered.vnode.type === Portal) {\n return nodes;\n }\n\n // Fragment: no node, only children\n if (rendered.vnode.type === Fragment) {\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n return nodes;\n }\n\n // Signal marker: include marker node + content children\n if (rendered.vnode.type === \"#signal\") {\n if (rendered.node) {\n nodes.push(rendered.node); // marker\n }\n // Collect content children (after marker)\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n return nodes;\n }\n\n // Regular elements and text nodes: just the node itself\n if (rendered.node) {\n nodes.push(rendered.node);\n } else if (rendered.children.length > 0) {\n // Component returned Fragment or other node-less structure\n // Need to collect from children\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n }\n return nodes;\n}\n\n/**\n * Result returned by the render function\n */\nexport interface DOMRenderResult {\n /**\n * Unmount the rendered tree and cleanup subscriptions\n */\n unmount: () => void;\n}\n\n/**\n * DOM-specific render strategy with optimization\n */\nconst domStrategy: RenderStrategy<Node> = {\n createTextNode,\n createComment,\n createElement,\n getParent,\n getNextSibling,\n insertBefore,\n appendChild,\n removeChild,\n replaceNode,\n setProperty,\n setSignalProperty,\n setRef,\n tryReuseNode,\n};\n\n// Create DOM renderer with optimization\nconst { renderNode, unmount: unmountCore } = createRenderer(domStrategy);\n\n/**\n * Render a VNode tree to the DOM\n * Supports sync VNodes, async VNodes (Promise), and streaming VNodes (AsyncIterableIterator)\n *\n * @example\n * // Basic usage\n * const { unmount } = render(<App />, container);\n *\n * @example\n * // With signals (auto-updates)\n * const count = signal(0);\n * render(<div>{count}</div>, container);\n * count.value++; // UI updates automatically\n *\n * @example\n * // Cleanup when needed\n * const { unmount } = render(<App />, container);\n * unmount();\n */\nexport function render(\n element: VNode | Promise<VNode> | AsyncIterableIterator<VNode>,\n container: Element,\n): DOMRenderResult {\n // Initialize empty context map for root render\n const initialContext: ContextMap = new Map();\n\n let rendered: RenderedNode<Node>;\n\n // Handle async element (Promise<VNode>)\n if (isPromise(element)) {\n const pending: VNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n const resultSignal = resource(element, pending);\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: resultSignal, context: initialContext },\n children: [],\n };\n rendered = renderNode(signalVNode, initialContext);\n if (rendered.node) {\n appendChild(container, rendered.node);\n }\n } else if (isAsyncIterator(element)) {\n // Handle async generator (AsyncIterableIterator<VNode>)\n const pending: VNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n const resultSignal = stream(element, pending);\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: resultSignal, context: initialContext },\n children: [],\n };\n rendered = renderNode(signalVNode, initialContext);\n if (rendered.node) {\n appendChild(container, rendered.node);\n }\n } else {\n // Handle sync VNode\n rendered = renderNode(element, initialContext);\n\n // Collect all nodes (handles Fragments with multiple children)\n const nodes = collectNodes(rendered);\n for (const node of nodes) {\n appendChild(container, node);\n }\n }\n\n // Return result object with unmount method\n return {\n unmount: () => unmountCore(rendered),\n };\n}\n\n/**\n * Try to reuse an existing DOM node instead of replacing it\n * Returns true if the node was successfully reused\n */\nfunction tryReuseNode(\n oldDom: Node,\n newDom: Node,\n oldRendered: RenderedNode<Node>,\n newRendered: RenderedNode<Node>,\n): boolean {\n // Both are text nodes - just update the content\n if (oldDom.nodeType === Node.TEXT_NODE && newDom.nodeType === Node.TEXT_NODE) {\n if (oldDom.textContent !== newDom.textContent) {\n oldDom.textContent = newDom.textContent;\n }\n // Update the newRendered to point to the old (reused) DOM node\n newRendered.node = oldDom;\n return true;\n }\n\n // Both are elements with the same tag name - update properties and children\n if (\n oldDom.nodeType === Node.ELEMENT_NODE &&\n newDom.nodeType === Node.ELEMENT_NODE &&\n (oldDom as Element).tagName === (newDom as Element).tagName\n ) {\n const oldElement = oldDom as Element;\n const newElement = newDom as Element;\n\n // Update attributes\n // Remove old attributes\n for (let i = oldElement.attributes.length - 1; i >= 0; i--) {\n const attr = oldElement.attributes[i];\n if (attr && !newElement.hasAttribute(attr.name)) {\n oldElement.removeAttribute(attr.name);\n }\n }\n\n // Set new attributes\n for (let i = 0; i < newElement.attributes.length; i++) {\n const attr = newElement.attributes[i];\n if (attr && oldElement.getAttribute(attr.name) !== attr.value) {\n oldElement.setAttribute(attr.name, attr.value);\n }\n }\n\n // Use keyed reconciliation if children have keys\n const hasKeys = hasChildKeys(oldRendered) || hasChildKeys(newRendered);\n\n if (hasKeys && oldRendered.children.length > 0 && newRendered.children.length > 0) {\n reconcileKeyedChildren(oldElement, oldRendered.children, newRendered.children);\n } else {\n // Fallback: replace all children\n // Clear old children\n while (oldElement.firstChild) {\n oldElement.removeChild(oldElement.firstChild);\n }\n\n // Add new children\n while (newElement.firstChild) {\n oldElement.appendChild(newElement.firstChild);\n }\n }\n\n // Update the newRendered to point to the old (reused) DOM node\n newRendered.node = oldDom;\n\n // Cleanup old subscriptions\n for (const unsub of oldRendered.subscriptions) {\n unsub();\n }\n\n return true;\n }\n\n // Different node types - can't reuse\n return false;\n}\n\n/**\n * Check if any children have keys\n */\nfunction hasChildKeys(rendered: RenderedNode<Node>): boolean {\n return rendered.children.some((child) => child.vnode.key != null);\n}\n\n/**\n * Reconcile children using keys for efficient list updates\n */\nfunction reconcileKeyedChildren(\n parent: Element,\n oldChildren: RenderedNode<Node>[],\n newChildren: RenderedNode<Node>[],\n): void {\n // Build a map of old children by key\n const oldKeyMap = new Map<string | number, RenderedNode<Node>>();\n const oldKeylessChildren: RenderedNode<Node>[] = [];\n\n for (const child of oldChildren) {\n if (child.vnode.key != null) {\n oldKeyMap.set(child.vnode.key, child);\n } else {\n oldKeylessChildren.push(child);\n }\n }\n\n // Track which old children have been reused\n const reusedKeys = new Set<string | number>();\n let keylessIndex = 0;\n\n // Process new children\n for (let i = 0; i < newChildren.length; i++) {\n const newChild = newChildren[i];\n if (!newChild) continue;\n\n const newKey = newChild.vnode.key;\n let oldChild: RenderedNode<Node> | undefined;\n let reused = false;\n\n // Try to find matching old child by key\n if (newKey != null) {\n oldChild = oldKeyMap.get(newKey);\n if (oldChild) {\n reusedKeys.add(newKey);\n reused = true;\n }\n } else {\n // No key, try to reuse next keyless child\n if (keylessIndex < oldKeylessChildren.length) {\n oldChild = oldKeylessChildren[keylessIndex++];\n }\n }\n\n // If we found a matching old child, try to update it\n if (oldChild && reused && oldChild.node && newChild.node) {\n const sameType =\n oldChild.vnode.type === newChild.vnode.type ||\n (oldChild.node.nodeType === Node.TEXT_NODE && newChild.node.nodeType === Node.TEXT_NODE);\n\n if (sameType) {\n // Try to reuse the node\n const nodeReused = tryReuseNode(oldChild.node, newChild.node, oldChild, newChild);\n\n if (nodeReused) {\n // Ensure the child is in the correct position\n const currentNode = parent.childNodes[i];\n if (currentNode !== oldChild.node) {\n parent.insertBefore(oldChild.node, currentNode || null);\n }\n continue;\n }\n }\n }\n\n // Can't reuse, insert the new child\n if (newChild.node) {\n const currentNode = parent.childNodes[i];\n if (currentNode) {\n parent.insertBefore(newChild.node, currentNode);\n } else {\n parent.appendChild(newChild.node);\n }\n }\n }\n\n // Remove old children that weren't reused\n for (const [key, oldChild] of oldKeyMap) {\n if (!reusedKeys.has(key) && oldChild.node) {\n removeChild(oldChild.node);\n unmountCore(oldChild);\n }\n }\n\n // Remove excess keyless children\n for (let i = keylessIndex; i < oldKeylessChildren.length; i++) {\n const oldChild = oldKeylessChildren[i];\n if (oldChild && oldChild.node) {\n removeChild(oldChild.node);\n unmountCore(oldChild);\n }\n }\n\n // Remove any extra DOM nodes that are still in the parent\n while (parent.childNodes.length > newChildren.length) {\n const lastChild = parent.lastChild;\n if (lastChild) {\n parent.removeChild(lastChild);\n }\n }\n}\n","import type { JSXNode, VNode } from \"@semajsx/core\";\nimport { Portal, h } from \"@semajsx/core\";\n\n/**\n * Portal props interface\n */\nexport interface PortalProps {\n children: JSXNode;\n container: Element;\n}\n\n/**\n * Create a portal VNode that renders children into a different DOM container\n *\n * @param children - The children to render\n * @param container - The target DOM container element\n * @returns A portal VNode\n *\n * @example\n * ```tsx\n * const Modal = () => {\n * return createPortal(\n * <div class=\"modal\">Modal content</div>,\n * document.body\n * );\n * };\n * ```\n */\nexport function createPortal(children: JSXNode, container: Element): VNode {\n // Use h() to create Portal VNode with proper normalization\n return h(Portal, { container }, children);\n}\n\n/**\n * Portal component (alternative to createPortal function)\n *\n * @example\n * ```tsx\n * <Portal container={document.body}>\n * <div class=\"modal\">Modal content</div>\n * </Portal>\n * ```\n */\nexport function PortalComponent(props: PortalProps): VNode {\n return createPortal(props.children, props.container);\n}\n","import type { JSXNode, VNode } from \"@semajsx/core\";\nimport { Forward, h } from \"@semajsx/core\";\n\n/**\n * Forward props interface\n */\nexport interface ForwardProps {\n children: JSXNode;\n [key: string]: unknown;\n}\n\n/**\n * Forward component - merges props onto its single child element\n *\n * Forward is a renderless primitive that injects props into its child\n * without producing an extra DOM node. Think of it as declarative\n * prop spreading from parent to child.\n *\n * Props merging behavior:\n * - `class`/`className`: concatenated (both applied)\n * - `style`: merged objects (Forward overrides per-property)\n * - Event handlers (`on*`): chained (both run)\n * - Other props: Forward overrides child\n *\n * @example\n * ```tsx\n * <Forward onClick={handler} class=\"extra\">\n * <button class=\"btn\">Click me</button>\n * </Forward>\n * // renders: <button class=\"btn extra\" onClick={handler}>Click me</button>\n * ```\n */\nexport function ForwardComponent(props: ForwardProps): VNode {\n const { children, ...rest } = props;\n return h(Forward, rest, children);\n}\n","/**\n * Style anchor components for @semajsx/dom\n *\n * These components control where styles are injected in the DOM.\n * Useful for Shadow DOM and component-scoped style injection.\n */\n\nimport type { VNode, JSXNode } from \"@semajsx/core\";\nimport { Fragment } from \"@semajsx/core\";\n\n/**\n * Style anchor context - stores the current injection target\n */\nlet appStyleTarget: Element | ShadowRoot | null = null;\nlet componentStyleTarget: Element | ShadowRoot | null = null;\n\n/**\n * Get the current style injection target\n *\n * Priority:\n * 1. Component anchor (if set)\n * 2. App anchor (if set)\n * 3. document.head (default)\n */\nexport function getStyleTarget(): Element | ShadowRoot {\n return componentStyleTarget ?? appStyleTarget ?? document.head;\n}\n\n/**\n * Set the app-level style injection target\n *\n * Use this for Shadow DOM to inject styles into the shadow root\n * instead of document.head.\n */\nexport function setAppStyleTarget(target: Element | ShadowRoot | null): void {\n appStyleTarget = target;\n}\n\n/**\n * Set the component-level style injection target\n *\n * This only affects the current component, not children.\n */\nexport function setComponentStyleTarget(target: Element | ShadowRoot | null): void {\n componentStyleTarget = target;\n}\n\n/**\n * AppStyleAnchor props\n */\nexport interface AppStyleAnchorProps {\n /** The target element or shadow root for style injection */\n target: Element | ShadowRoot;\n /** Children to render */\n children?: JSXNode;\n}\n\n/**\n * AppStyleAnchor - Sets the global style injection target\n *\n * Use this component to redirect all style injection to a specific target,\n * typically a Shadow DOM root.\n *\n * @example\n * ```tsx\n * function MyWebComponent() {\n * const shadow = useShadowRoot();\n *\n * return (\n * <AppStyleAnchor target={shadow}>\n * <App />\n * </AppStyleAnchor>\n * );\n * }\n * ```\n */\nexport function AppStyleAnchor({ target, children }: AppStyleAnchorProps): VNode {\n // Set the target when the component mounts\n setAppStyleTarget(target);\n\n // Return children wrapped in a fragment\n return {\n type: Fragment,\n props: {},\n children: children ? [children as VNode] : [],\n key: undefined,\n };\n}\n\n/**\n * ComponentStyleAnchor props\n */\nexport interface ComponentStyleAnchorProps {\n /** The target element or shadow root for style injection */\n target: Element | ShadowRoot;\n /** Children to render */\n children?: JSXNode;\n}\n\n/**\n * ComponentStyleAnchor - Sets style injection target for current component only\n *\n * Unlike AppStyleAnchor, this only affects styles used directly in the\n * component where it's declared. Child components use the App anchor\n * or fall back to document.head.\n *\n * @example\n * ```tsx\n * function IsolatedComponent() {\n * const containerRef = signal<HTMLElement | null>(null);\n *\n * return (\n * <div>\n * <style-container ref={containerRef} />\n * <ComponentStyleAnchor target={containerRef}>\n * <div class={card.root}>...</div>\n * <ChildComponent /> {* Uses App anchor, NOT this anchor *}\n * </ComponentStyleAnchor>\n * </div>\n * );\n * }\n * ```\n */\nexport function ComponentStyleAnchor({ target, children }: ComponentStyleAnchorProps): VNode {\n // Set the target when the component mounts\n setComponentStyleTarget(target);\n\n // Return children wrapped in a fragment\n return {\n type: Fragment,\n props: {},\n children: children ? [children as VNode] : [],\n key: undefined,\n };\n}\n","import type { VNode } from \"@semajsx/core\";\n\nexport interface NativeProps {\n /** The native DOM element to embed in the SemaJSX tree */\n element: Element;\n /** Additional attributes to apply to the element */\n [key: string]: unknown;\n}\n\n/**\n * Embed a native DOM element in the SemaJSX render tree.\n *\n * Useful for integrating third-party libraries that return real DOM elements\n * (e.g., Lucide's createElement, D3 nodes, Canvas elements).\n *\n * Props (except `element`) are applied to the element using the same\n * property-setting logic as regular JSX elements — supports class, style,\n * event handlers, signals, and standard attributes.\n *\n * @example\n * ```tsx\n * import { Native } from \"semajsx/dom\";\n * import { createElement, Rocket } from \"lucide\";\n *\n * const App = () => (\n * <div>\n * <Native element={createElement(Rocket)} stroke=\"#007aff\" />\n * </div>\n * );\n * ```\n */\nexport function Native({ element, ...attrs }: NativeProps): VNode {\n return {\n type: \"#native\",\n props: { __nativeNode: element, ...attrs },\n children: [],\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"src-Cm12Y2XV.mjs","names":[],"sources":["../../dom/src/operations.ts","../../dom/src/properties.ts","../../dom/src/render.ts","../../dom/src/portal.ts","../../dom/src/forward.ts","../../dom/src/style-anchor.ts","../../dom/src/native.ts"],"sourcesContent":["/**\n * Low-level DOM operations\n */\n\nexport function createElement(tagName: string): Element {\n return document.createElement(tagName);\n}\n\nexport function createTextNode(text: string): Text {\n return document.createTextNode(text);\n}\n\nexport function createComment(text: string): Comment {\n return document.createComment(text);\n}\n\nexport function appendChild(parent: Node, child: Node): void {\n parent.appendChild(child);\n}\n\nexport function removeChild(node: Node): void {\n node.parentNode?.removeChild(node);\n}\n\nexport function insertBefore(parent: Node, newNode: Node, refNode: Node | null): void {\n parent.insertBefore(newNode, refNode);\n}\n\nexport function replaceNode(oldNode: Node, newNode: Node): void {\n oldNode.parentNode?.replaceChild(newNode, oldNode);\n}\n\nexport function setText(node: Node, text: string): void {\n node.textContent = text;\n}\n\nexport function getParent(node: Node): Node | null {\n return node.parentNode;\n}\n\nexport function getNextSibling(node: Node): Node | null {\n return node.nextSibling;\n}\n","import type { Signal } from \"@semajsx/signal\";\nimport type { Ref } from \"@semajsx/core\";\nimport { isSignal } from \"@semajsx/signal\";\nimport { isStyleToken, inject, type StyleToken } from \"@semajsx/style\";\n\n/**\n * Class value type - can be string, StyleToken, array, or falsy\n */\ntype ClassValue = string | StyleToken | ClassValue[] | false | null | undefined;\n\n/**\n * Resolve a class value to a string\n *\n * Supports:\n * - Strings: returned as-is\n * - StyleTokens: injects CSS and returns className\n * - Arrays: recursively resolves all values\n * - Falsy values: filtered out\n *\n * @example\n * resolveClass(\"btn\") // \"btn\"\n * resolveClass(button.root) // \"root-x7f3a\" (injects CSS)\n * resolveClass([button.root, \"custom\", isLarge && button.large]) // \"root-x7f3a custom large-y8g4b\"\n */\nfunction resolveClass(value: ClassValue): string {\n if (!value) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (isStyleToken(value)) {\n // Inject CSS for the token\n inject(value);\n // Return the className (or empty string if none)\n return value._ ?? \"\";\n }\n\n if (Array.isArray(value)) {\n // Recursively resolve array values, filter empty strings\n return value.map(resolveClass).filter(Boolean).join(\" \");\n }\n\n return \"\";\n}\n\n/**\n * Set a property on an element\n */\nexport function setProperty(element: Element, key: string, value: unknown): void {\n // Skip internal props\n if (key === \"key\" || key === \"ref\" || key === \"children\") {\n return;\n }\n\n // Handle events\n if (key.startsWith(\"on\") && typeof value === \"function\") {\n const eventName = key.toLowerCase().substring(2); // \"onClick\" -> \"click\"\n\n // Use addEventListener instead of property assignment for better reliability\n // especially in hydration scenarios\n const element_any = element as any;\n\n // Remove old listener if exists (stored on element)\n const oldListener = element_any[`__${key}`];\n if (oldListener) {\n element.removeEventListener(eventName, oldListener);\n }\n\n // Add new listener and store reference for future cleanup\n element.addEventListener(eventName, value as EventListener);\n element_any[`__${key}`] = value;\n\n return;\n }\n\n // Handle className/class with StyleToken support\n if (key === \"className\" || key === \"class\") {\n if (value == null) {\n element.removeAttribute(\"class\");\n return;\n }\n\n // Resolve class value (may be string, StyleToken, or array)\n const resolvedClass = resolveClass(value as ClassValue);\n if (resolvedClass) {\n element.setAttribute(\"class\", resolvedClass);\n } else {\n element.removeAttribute(\"class\");\n }\n return;\n }\n\n // Handle style\n if (key === \"style\" && element instanceof HTMLElement) {\n if (typeof value === \"string\") {\n element.style.cssText = value;\n } else if (typeof value === \"object\" && value !== null) {\n Object.assign(element.style, value);\n }\n return;\n }\n\n // Handle special boolean attributes\n if (typeof value === \"boolean\") {\n if (value) {\n element.setAttribute(key, \"\");\n } else {\n element.removeAttribute(key);\n }\n return;\n }\n\n // Handle value for form elements\n if (key === \"value\") {\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n element.value = String(value ?? \"\");\n return;\n }\n }\n\n // Handle checked for checkboxes\n if (key === \"checked\" && element instanceof HTMLInputElement) {\n element.checked = Boolean(value);\n return;\n }\n\n // Default: set as attribute\n if (value == null) {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(value));\n }\n}\n\n/**\n * Set a signal property on an element\n */\nexport function setSignalProperty<T = unknown>(\n element: Element,\n key: string,\n signal: Signal<T>,\n): () => void {\n // Set initial value\n setProperty(element, key, signal.value);\n\n // Subscribe to changes and update property\n return signal.subscribe((value: T) => {\n setProperty(element, key, value);\n });\n}\n\n/**\n * Set a ref on an element\n * - Supports both Signal refs and callback refs\n * - Returns a cleanup function to clear the ref\n */\nexport function setRef(element: Node, ref: Ref<any>): () => void {\n // Signal ref\n if (isSignal(ref)) {\n ref.value = element;\n return () => {\n ref.value = null;\n };\n }\n\n // Callback ref\n if (typeof ref === \"function\") {\n ref(element);\n return () => {\n ref(null);\n };\n }\n\n // Invalid ref type\n return () => {};\n}\n","import type { VNode } from \"@semajsx/core\";\nimport {\n resource,\n stream,\n createRenderer,\n isAsyncIterator,\n isPromise,\n Fragment,\n Portal,\n type RenderedNode,\n type RenderStrategy,\n type ContextMap,\n} from \"@semajsx/core\";\nimport { setProperty, setSignalProperty, setRef } from \"./properties\";\nimport {\n appendChild,\n createElement,\n createTextNode,\n createComment,\n removeChild,\n replaceNode,\n insertBefore,\n getParent,\n getNextSibling,\n} from \"./operations\";\n\n/**\n * Helper to recursively collect all actual DOM nodes from a rendered node\n * Handles fragments and signal nodes that may not have their own DOM node\n */\nfunction collectNodes(rendered: RenderedNode<Node>): Node[] {\n const nodes: Node[] = [];\n\n // Portal: children are already rendered to the portal container\n // Don't collect them here as they shouldn't be added to the main tree\n if (rendered.vnode.type === Portal) {\n return nodes;\n }\n\n // Fragment: no node, only children\n if (rendered.vnode.type === Fragment) {\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n return nodes;\n }\n\n // Signal marker: include marker node + content children\n if (rendered.vnode.type === \"#signal\") {\n if (rendered.node) {\n nodes.push(rendered.node); // marker\n }\n // Collect content children (after marker)\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n return nodes;\n }\n\n // Regular elements and text nodes: just the node itself\n if (rendered.node) {\n nodes.push(rendered.node);\n } else if (rendered.children.length > 0) {\n // Component returned Fragment or other node-less structure\n // Need to collect from children\n for (const child of rendered.children) {\n nodes.push(...collectNodes(child));\n }\n }\n return nodes;\n}\n\n/**\n * Result returned by the render function\n */\nexport interface DOMRenderResult {\n /**\n * Unmount the rendered tree and cleanup subscriptions\n */\n unmount: () => void;\n}\n\n/**\n * DOM-specific render strategy with optimization\n */\nconst domStrategy: RenderStrategy<Node> = {\n createTextNode,\n createComment,\n createElement,\n getParent,\n getNextSibling,\n insertBefore,\n appendChild,\n removeChild,\n replaceNode,\n setProperty,\n setSignalProperty,\n setRef,\n tryReuseNode,\n};\n\n// Create DOM renderer with optimization\nconst { renderNode, unmount: unmountCore } = createRenderer(domStrategy);\n\n/**\n * Render a VNode tree to the DOM\n * Supports sync VNodes, async VNodes (Promise), and streaming VNodes (AsyncIterableIterator)\n *\n * @example\n * // Basic usage\n * const { unmount } = render(<App />, container);\n *\n * @example\n * // With signals (auto-updates)\n * const count = signal(0);\n * render(<div>{count}</div>, container);\n * count.value++; // UI updates automatically\n *\n * @example\n * // Cleanup when needed\n * const { unmount } = render(<App />, container);\n * unmount();\n */\nexport function render(\n element: VNode | Promise<VNode> | AsyncIterableIterator<VNode>,\n container: Element,\n): DOMRenderResult {\n // Initialize empty context map for root render\n const initialContext: ContextMap = new Map();\n\n let rendered: RenderedNode<Node>;\n\n // Handle async element (Promise<VNode>)\n if (isPromise(element)) {\n const pending: VNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n const resultSignal = resource(element, pending);\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: resultSignal, context: initialContext },\n children: [],\n };\n rendered = renderNode(signalVNode, initialContext);\n if (rendered.node) {\n appendChild(container, rendered.node);\n }\n } else if (isAsyncIterator(element)) {\n // Handle async generator (AsyncIterableIterator<VNode>)\n const pending: VNode = {\n type: \"#text\",\n props: { nodeValue: \"\" },\n children: [],\n };\n const resultSignal = stream(element, pending);\n const signalVNode: VNode = {\n type: \"#signal\",\n props: { signal: resultSignal, context: initialContext },\n children: [],\n };\n rendered = renderNode(signalVNode, initialContext);\n if (rendered.node) {\n appendChild(container, rendered.node);\n }\n } else {\n // Handle sync VNode\n rendered = renderNode(element, initialContext);\n\n // Collect all nodes (handles Fragments with multiple children)\n const nodes = collectNodes(rendered);\n for (const node of nodes) {\n appendChild(container, node);\n }\n }\n\n // Return result object with unmount method\n return {\n unmount: () => unmountCore(rendered),\n };\n}\n\n/**\n * Try to reuse an existing DOM node instead of replacing it\n * Returns true if the node was successfully reused\n */\nfunction tryReuseNode(\n oldDom: Node,\n newDom: Node,\n oldRendered: RenderedNode<Node>,\n newRendered: RenderedNode<Node>,\n): boolean {\n // Both are text nodes - just update the content\n if (oldDom.nodeType === Node.TEXT_NODE && newDom.nodeType === Node.TEXT_NODE) {\n if (oldDom.textContent !== newDom.textContent) {\n oldDom.textContent = newDom.textContent;\n }\n // Update the newRendered to point to the old (reused) DOM node\n newRendered.node = oldDom;\n return true;\n }\n\n // Both are elements with the same tag name - update properties and children\n if (\n oldDom.nodeType === Node.ELEMENT_NODE &&\n newDom.nodeType === Node.ELEMENT_NODE &&\n (oldDom as Element).tagName === (newDom as Element).tagName\n ) {\n const oldElement = oldDom as Element;\n const newElement = newDom as Element;\n\n // Update attributes\n // Remove old attributes\n for (let i = oldElement.attributes.length - 1; i >= 0; i--) {\n const attr = oldElement.attributes[i];\n if (attr && !newElement.hasAttribute(attr.name)) {\n oldElement.removeAttribute(attr.name);\n }\n }\n\n // Set new attributes\n for (let i = 0; i < newElement.attributes.length; i++) {\n const attr = newElement.attributes[i];\n if (attr && oldElement.getAttribute(attr.name) !== attr.value) {\n oldElement.setAttribute(attr.name, attr.value);\n }\n }\n\n // Use keyed reconciliation if children have keys\n const hasKeys = hasChildKeys(oldRendered) || hasChildKeys(newRendered);\n\n if (hasKeys && oldRendered.children.length > 0 && newRendered.children.length > 0) {\n reconcileKeyedChildren(oldElement, oldRendered.children, newRendered.children);\n } else {\n // Fallback: replace all children\n // Clear old children\n while (oldElement.firstChild) {\n oldElement.removeChild(oldElement.firstChild);\n }\n\n // Add new children\n while (newElement.firstChild) {\n oldElement.appendChild(newElement.firstChild);\n }\n }\n\n // Update the newRendered to point to the old (reused) DOM node\n newRendered.node = oldDom;\n\n // Cleanup old subscriptions\n for (const unsub of oldRendered.subscriptions) {\n unsub();\n }\n\n return true;\n }\n\n // Different node types - can't reuse\n return false;\n}\n\n/**\n * Check if any children have keys\n */\nfunction hasChildKeys(rendered: RenderedNode<Node>): boolean {\n return rendered.children.some((child) => child.vnode.key != null);\n}\n\n/**\n * Reconcile children using keys for efficient list updates\n */\nfunction reconcileKeyedChildren(\n parent: Element,\n oldChildren: RenderedNode<Node>[],\n newChildren: RenderedNode<Node>[],\n): void {\n // Build a map of old children by key\n const oldKeyMap = new Map<string | number, RenderedNode<Node>>();\n const oldKeylessChildren: RenderedNode<Node>[] = [];\n\n for (const child of oldChildren) {\n if (child.vnode.key != null) {\n oldKeyMap.set(child.vnode.key, child);\n } else {\n oldKeylessChildren.push(child);\n }\n }\n\n // Track which old children have been reused\n const reusedKeys = new Set<string | number>();\n let keylessIndex = 0;\n\n // Process new children\n for (let i = 0; i < newChildren.length; i++) {\n const newChild = newChildren[i];\n if (!newChild) continue;\n\n const newKey = newChild.vnode.key;\n let oldChild: RenderedNode<Node> | undefined;\n let reused = false;\n\n // Try to find matching old child by key\n if (newKey != null) {\n oldChild = oldKeyMap.get(newKey);\n if (oldChild) {\n reusedKeys.add(newKey);\n reused = true;\n }\n } else {\n // No key, try to reuse next keyless child\n if (keylessIndex < oldKeylessChildren.length) {\n oldChild = oldKeylessChildren[keylessIndex++];\n }\n }\n\n // If we found a matching old child, try to update it\n if (oldChild && reused && oldChild.node && newChild.node) {\n const sameType =\n oldChild.vnode.type === newChild.vnode.type ||\n (oldChild.node.nodeType === Node.TEXT_NODE && newChild.node.nodeType === Node.TEXT_NODE);\n\n if (sameType) {\n // Try to reuse the node\n const nodeReused = tryReuseNode(oldChild.node, newChild.node, oldChild, newChild);\n\n if (nodeReused) {\n // Ensure the child is in the correct position\n const currentNode = parent.childNodes[i];\n if (currentNode !== oldChild.node) {\n parent.insertBefore(oldChild.node, currentNode || null);\n }\n continue;\n }\n }\n }\n\n // Can't reuse, insert the new child\n if (newChild.node) {\n const currentNode = parent.childNodes[i];\n if (currentNode) {\n parent.insertBefore(newChild.node, currentNode);\n } else {\n parent.appendChild(newChild.node);\n }\n }\n }\n\n // Remove old children that weren't reused\n for (const [key, oldChild] of oldKeyMap) {\n if (!reusedKeys.has(key) && oldChild.node) {\n removeChild(oldChild.node);\n unmountCore(oldChild);\n }\n }\n\n // Remove excess keyless children\n for (let i = keylessIndex; i < oldKeylessChildren.length; i++) {\n const oldChild = oldKeylessChildren[i];\n if (oldChild && oldChild.node) {\n removeChild(oldChild.node);\n unmountCore(oldChild);\n }\n }\n\n // Remove any extra DOM nodes that are still in the parent\n while (parent.childNodes.length > newChildren.length) {\n const lastChild = parent.lastChild;\n if (lastChild) {\n parent.removeChild(lastChild);\n }\n }\n}\n","import type { JSXNode, VNode } from \"@semajsx/core\";\nimport { Portal, h } from \"@semajsx/core\";\n\n/**\n * Portal props interface\n */\nexport interface PortalProps {\n children: JSXNode;\n container: Element;\n}\n\n/**\n * Create a portal VNode that renders children into a different DOM container\n *\n * @param children - The children to render\n * @param container - The target DOM container element\n * @returns A portal VNode\n *\n * @example\n * ```tsx\n * const Modal = () => {\n * return createPortal(\n * <div class=\"modal\">Modal content</div>,\n * document.body\n * );\n * };\n * ```\n */\nexport function createPortal(children: JSXNode, container: Element): VNode {\n // Use h() to create Portal VNode with proper normalization\n return h(Portal, { container }, children);\n}\n\n/**\n * Portal component (alternative to createPortal function)\n *\n * @example\n * ```tsx\n * <Portal container={document.body}>\n * <div class=\"modal\">Modal content</div>\n * </Portal>\n * ```\n */\nexport function PortalComponent(props: PortalProps): VNode {\n return createPortal(props.children, props.container);\n}\n","import type { JSXNode, VNode } from \"@semajsx/core\";\nimport { Forward, h } from \"@semajsx/core\";\n\n/**\n * Forward props interface\n */\nexport interface ForwardProps {\n children: JSXNode;\n [key: string]: unknown;\n}\n\n/**\n * Forward component - merges props onto its single child element\n *\n * Forward is a renderless primitive that injects props into its child\n * without producing an extra DOM node. Think of it as declarative\n * prop spreading from parent to child.\n *\n * Props merging behavior:\n * - `class`/`className`: concatenated (both applied)\n * - `style`: merged objects (Forward overrides per-property)\n * - Event handlers (`on*`): chained (both run)\n * - Other props: Forward overrides child\n *\n * @example\n * ```tsx\n * <Forward onClick={handler} class=\"extra\">\n * <button class=\"btn\">Click me</button>\n * </Forward>\n * // renders: <button class=\"btn extra\" onClick={handler}>Click me</button>\n * ```\n */\nexport function ForwardComponent(props: ForwardProps): VNode {\n const { children, ...rest } = props;\n return h(Forward, rest, children);\n}\n","/**\n * Style anchor components for @semajsx/dom\n *\n * These components control where styles are injected in the DOM.\n * Useful for Shadow DOM and component-scoped style injection.\n */\n\nimport type { VNode, JSXNode } from \"@semajsx/core\";\nimport { Fragment } from \"@semajsx/core\";\n\n/**\n * Style anchor context - stores the current injection target\n */\nlet appStyleTarget: Element | ShadowRoot | null = null;\nlet componentStyleTarget: Element | ShadowRoot | null = null;\n\n/**\n * Get the current style injection target\n *\n * Priority:\n * 1. Component anchor (if set)\n * 2. App anchor (if set)\n * 3. document.head (default)\n */\nexport function getStyleTarget(): Element | ShadowRoot {\n return componentStyleTarget ?? appStyleTarget ?? document.head;\n}\n\n/**\n * Set the app-level style injection target\n *\n * Use this for Shadow DOM to inject styles into the shadow root\n * instead of document.head.\n */\nexport function setAppStyleTarget(target: Element | ShadowRoot | null): void {\n appStyleTarget = target;\n}\n\n/**\n * Set the component-level style injection target\n *\n * This only affects the current component, not children.\n */\nexport function setComponentStyleTarget(target: Element | ShadowRoot | null): void {\n componentStyleTarget = target;\n}\n\n/**\n * AppStyleAnchor props\n */\nexport interface AppStyleAnchorProps {\n /** The target element or shadow root for style injection */\n target: Element | ShadowRoot;\n /** Children to render */\n children?: JSXNode;\n}\n\n/**\n * AppStyleAnchor - Sets the global style injection target\n *\n * Use this component to redirect all style injection to a specific target,\n * typically a Shadow DOM root.\n *\n * @example\n * ```tsx\n * function MyWebComponent() {\n * const shadow = useShadowRoot();\n *\n * return (\n * <AppStyleAnchor target={shadow}>\n * <App />\n * </AppStyleAnchor>\n * );\n * }\n * ```\n */\nexport function AppStyleAnchor({ target, children }: AppStyleAnchorProps): VNode {\n // Set the target when the component mounts\n setAppStyleTarget(target);\n\n // Return children wrapped in a fragment\n return {\n type: Fragment,\n props: {},\n children: children ? [children as VNode] : [],\n key: undefined,\n };\n}\n\n/**\n * ComponentStyleAnchor props\n */\nexport interface ComponentStyleAnchorProps {\n /** The target element or shadow root for style injection */\n target: Element | ShadowRoot;\n /** Children to render */\n children?: JSXNode;\n}\n\n/**\n * ComponentStyleAnchor - Sets style injection target for current component only\n *\n * Unlike AppStyleAnchor, this only affects styles used directly in the\n * component where it's declared. Child components use the App anchor\n * or fall back to document.head.\n *\n * @example\n * ```tsx\n * function IsolatedComponent() {\n * const containerRef = signal<HTMLElement | null>(null);\n *\n * return (\n * <div>\n * <style-container ref={containerRef} />\n * <ComponentStyleAnchor target={containerRef}>\n * <div class={card.root}>...</div>\n * <ChildComponent /> {* Uses App anchor, NOT this anchor *}\n * </ComponentStyleAnchor>\n * </div>\n * );\n * }\n * ```\n */\nexport function ComponentStyleAnchor({ target, children }: ComponentStyleAnchorProps): VNode {\n // Set the target when the component mounts\n setComponentStyleTarget(target);\n\n // Return children wrapped in a fragment\n return {\n type: Fragment,\n props: {},\n children: children ? [children as VNode] : [],\n key: undefined,\n };\n}\n","import type { VNode } from \"@semajsx/core\";\n\nexport interface NativeProps {\n /** The native DOM element to embed in the SemaJSX tree */\n element: Element;\n /** Additional attributes to apply to the element */\n [key: string]: unknown;\n}\n\n/**\n * Embed a native DOM element in the SemaJSX render tree.\n *\n * Useful for integrating third-party libraries that return real DOM elements\n * (e.g., Lucide's createElement, D3 nodes, Canvas elements).\n *\n * Props (except `element`) are applied to the element using the same\n * property-setting logic as regular JSX elements — supports class, style,\n * event handlers, signals, and standard attributes.\n *\n * @example\n * ```tsx\n * import { Native } from \"semajsx/dom\";\n * import { createElement, Rocket } from \"lucide\";\n *\n * const App = () => (\n * <div>\n * <Native element={createElement(Rocket)} stroke=\"#007aff\" />\n * </div>\n * );\n * ```\n */\nexport function Native({ element, ...attrs }: NativeProps): VNode {\n return {\n type: \"#native\",\n props: { __nativeNode: element, ...attrs },\n children: [],\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { n as unwrap, t as isSignal } from "./utils-BrGmTgfG.mjs";
|
|
2
|
-
import { a as jsxs, i as jsx, v as Fragment } from "./src
|
|
2
|
+
import { a as jsxs, i as jsx, v as Fragment } from "./src--YS4EvMz.mjs";
|
|
3
3
|
import { U as isStyleToken } from "./src-DV9uwtE5.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import { c as getIslandMetadata, n as LINK_MARKER, r as STYLE_MARKER, t as ASSET_MARKER, u as isIslandVNode } from "./resource-
|
|
6
|
-
import { n as renderDocument } from "./document-
|
|
4
|
+
import { o as print } from "./src-77V1Plyd.mjs";
|
|
5
|
+
import { c as getIslandMetadata, n as LINK_MARKER, r as STYLE_MARKER, t as ASSET_MARKER, u as isIslandVNode } from "./resource-BU0Po0ez.mjs";
|
|
6
|
+
import { n as renderDocument } from "./document-Cfdhi7vG.mjs";
|
|
7
7
|
import { build, createServer, mergeConfig } from "vite";
|
|
8
8
|
import { dirname, resolve } from "path";
|
|
9
9
|
|
|
@@ -1730,7 +1730,7 @@ var ViteRouter = class {
|
|
|
1730
1730
|
const result = await renderToString(match.handler(context), { transformIslandScript: (island) => `<script type="module" src="${island.basePath}/${island.id}.js" async><\/script>` });
|
|
1731
1731
|
for (const island of result.islands) this.islandsCache.set(island.id, island);
|
|
1732
1732
|
if (this.config.document) {
|
|
1733
|
-
const { renderDocument } = await import("./document-
|
|
1733
|
+
const { renderDocument } = await import("./document-Cbz4084O.mjs");
|
|
1734
1734
|
result.document = renderDocument(this.config.document({
|
|
1735
1735
|
children: {
|
|
1736
1736
|
type: "template",
|
|
@@ -1928,4 +1928,4 @@ function createIslandCollector() {
|
|
|
1928
1928
|
|
|
1929
1929
|
//#endregion
|
|
1930
1930
|
export { ViteIslandBuilder as a, renderToString as c, createViteRouter as i, createIslandCollector as n, createViteIslandBuilder as o, ViteRouter as r, createApp as s, IslandCollector as t };
|
|
1931
|
-
//# sourceMappingURL=src-
|
|
1931
|
+
//# sourceMappingURL=src-Mucdq4zw.mjs.map
|