semajsx 0.1.1 → 0.1.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/dist/{computed-BpjqvQu1.mjs → computed-BidG06Lt.mjs} +2 -2
- package/dist/{computed-BpjqvQu1.mjs.map → computed-BidG06Lt.mjs.map} +1 -1
- package/dist/{document-OGuk9jhK.mjs → document-BOJDaiBc.mjs} +19 -4
- package/dist/document-BOJDaiBc.mjs.map +1 -0
- package/dist/{document-DFsOtfef.mjs → document-CwHVG_PJ.mjs} +2 -2
- package/dist/dom/index.d.mts +68 -3
- package/dist/dom/index.d.mts.map +1 -1
- package/dist/dom/index.mjs +4 -4
- package/dist/dom/jsx-dev-runtime.d.mts +4 -4
- package/dist/dom/jsx-dev-runtime.mjs +1 -1
- package/dist/dom/jsx-runtime.d.mts +4 -4
- package/dist/dom/jsx-runtime.mjs +2 -2
- package/dist/{helpers-DrifjCXb.d.mts → helpers-CfRDJgcP.d.mts} +3 -3
- package/dist/{helpers-DrifjCXb.d.mts.map → helpers-CfRDJgcP.d.mts.map} +1 -1
- package/dist/{index-DS5X3Pvb.d.mts → index-B1pjI-Su.d.mts} +2 -2
- package/dist/{index-DS5X3Pvb.d.mts.map → index-B1pjI-Su.d.mts.map} +1 -1
- package/dist/index-DC3tthWf.d.mts +81 -0
- package/dist/index-DC3tthWf.d.mts.map +1 -0
- package/dist/index.d.mts +7 -7
- package/dist/index.mjs +5 -5
- package/dist/{island-marker-hZdmHMvx.d.mts → island-marker-BJIO07Vj.d.mts} +1 -1
- package/dist/island-marker-BJIO07Vj.d.mts.map +1 -0
- package/dist/{jsx-CGW4OyqA.d.mts → jsx-fNlLjLou.d.mts} +2 -2
- package/dist/{jsx-CGW4OyqA.d.mts.map → jsx-fNlLjLou.d.mts.map} +1 -1
- package/dist/{jsx-runtime-DU8DRISG.d.mts → jsx-runtime-BFuFPDzn.d.mts} +3 -3
- package/dist/{jsx-runtime-DU8DRISG.d.mts.map → jsx-runtime-BFuFPDzn.d.mts.map} +1 -1
- package/dist/jsx-runtime-D9ZNjMJ2.mjs.map +1 -1
- package/dist/{jsx-runtime-mBpL8czJ.d.mts → jsx-runtime-DZx2Yv-t.d.mts} +28 -6
- package/dist/{jsx-runtime-mBpL8czJ.d.mts.map → jsx-runtime-DZx2Yv-t.d.mts.map} +1 -1
- package/dist/lucide-CVtHepGM.mjs +126 -0
- package/dist/lucide-CVtHepGM.mjs.map +1 -0
- package/dist/{resource-B1IudM8_.d.mts → resource-BQI6AeJ0.d.mts} +23 -3
- package/dist/resource-BQI6AeJ0.d.mts.map +1 -0
- package/dist/{resource-BjsDAkbG.mjs → resource-DSlXDZZi.mjs} +2 -2
- package/dist/{resource-BjsDAkbG.mjs.map → resource-DSlXDZZi.mjs.map} +1 -1
- package/dist/signal/index.d.mts +2 -2
- package/dist/signal/index.mjs +3 -3
- package/dist/{signal-4PgGfydw.mjs → signal-BN8vHXDb.mjs} +1 -1
- package/dist/{signal-4PgGfydw.mjs.map → signal-BN8vHXDb.mjs.map} +1 -1
- package/dist/{signal-CLsaPA7c.d.mts → signal-BwxUlXKs.d.mts} +1 -1
- package/dist/{signal-CLsaPA7c.d.mts.map → signal-BwxUlXKs.d.mts.map} +1 -1
- package/dist/{src-CRi0xsNK.mjs → src-BqX3sryB.mjs} +68 -5
- package/dist/src-BqX3sryB.mjs.map +1 -0
- package/dist/src-DR-EWgVP.mjs +868 -0
- package/dist/src-DR-EWgVP.mjs.map +1 -0
- package/dist/{src-DEoBG1zB.mjs → src-DUpFNNM_.mjs} +4 -4
- package/dist/{src-DEoBG1zB.mjs.map → src-DUpFNNM_.mjs.map} +1 -1
- package/dist/{src-BlS3Hc-L.mjs → src-DW3tIczg.mjs} +75 -5
- package/dist/src-DW3tIczg.mjs.map +1 -0
- package/dist/{src-Jbt_w0hc.mjs → src-Ds9vl42d.mjs} +37 -35
- package/dist/src-Ds9vl42d.mjs.map +1 -0
- package/dist/{src-iC-NFwTy.mjs → src-DuSN6go_.mjs} +79 -22
- package/dist/src-DuSN6go_.mjs.map +1 -0
- package/dist/ssg/index.d.mts +4 -182
- package/dist/ssg/index.d.mts.map +1 -1
- package/dist/ssg/index.mjs +7 -756
- package/dist/ssg/index.mjs.map +1 -1
- package/dist/ssg/plugins/docs-theme.d.mts +180 -0
- package/dist/ssg/plugins/docs-theme.d.mts.map +1 -0
- package/dist/ssg/plugins/docs-theme.mjs +2042 -0
- package/dist/ssg/plugins/docs-theme.mjs.map +1 -0
- package/dist/ssg/plugins/lucide.d.mts +3 -0
- package/dist/ssg/plugins/lucide.mjs +7 -0
- package/dist/ssr/client.d.mts +3 -3
- package/dist/ssr/client.mjs +5 -5
- package/dist/ssr/index.d.mts +3 -3
- package/dist/ssr/index.d.mts.map +1 -1
- package/dist/ssr/index.mjs +6 -5
- package/dist/style/index.d.mts +2 -2
- package/dist/style/index.d.mts.map +1 -1
- package/dist/style/index.mjs +1 -1
- package/dist/style/react.d.mts +2 -2
- package/dist/style/react.mjs +2 -2
- package/dist/style/vue.d.mts +2 -2
- package/dist/style/vue.mjs +2 -2
- package/dist/terminal/index.d.mts +4 -4
- package/dist/terminal/index.mjs +2 -2
- package/dist/terminal/jsx-dev-runtime.d.mts +4 -4
- package/dist/terminal/jsx-dev-runtime.mjs +1 -1
- package/dist/terminal/jsx-runtime.d.mts +4 -4
- package/dist/terminal/jsx-runtime.mjs +1 -1
- package/dist/{types-DlNR9ZaJ.d.mts → types-BlaUrkq0.d.mts} +2 -2
- package/dist/{types-DlNR9ZaJ.d.mts.map → types-BlaUrkq0.d.mts.map} +1 -1
- package/dist/types-CGkRxnQB.d.mts +220 -0
- package/dist/types-CGkRxnQB.d.mts.map +1 -0
- package/dist/{types-Dgj6n-EE.d.mts → types-CZMcXQTW.d.mts} +9 -4
- package/dist/types-CZMcXQTW.d.mts.map +1 -0
- package/dist/{types-Bjx1Pp14.d.mts → types-D0jRO840.d.mts} +1 -1
- package/dist/{types-Bjx1Pp14.d.mts.map → types-D0jRO840.d.mts.map} +1 -1
- package/dist/{types-DEi0apQO.d.mts → types-DucvOZQ2.d.mts} +2 -2
- package/dist/{types-DEi0apQO.d.mts.map → types-DucvOZQ2.d.mts.map} +1 -1
- package/dist/{utils-BrGmTgfG.mjs → utils-DbTAs943.mjs} +1 -1
- package/dist/{utils-BrGmTgfG.mjs.map → utils-DbTAs943.mjs.map} +1 -1
- package/package.json +30 -2
- package/dist/document-OGuk9jhK.mjs.map +0 -1
- package/dist/island-marker-hZdmHMvx.d.mts.map +0 -1
- package/dist/jsx-runtime-D2B2BK8X.mjs +0 -4
- package/dist/resource-B1IudM8_.d.mts.map +0 -1
- package/dist/src-BlS3Hc-L.mjs.map +0 -1
- package/dist/src-CRi0xsNK.mjs.map +0 -1
- package/dist/src-Jbt_w0hc.mjs.map +0 -1
- package/dist/src-iC-NFwTy.mjs.map +0 -1
- package/dist/types-Dgj6n-EE.d.mts.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { r as Signal } from "./types-
|
|
3
|
-
import { o as StyleToken } from "./types-
|
|
1
|
+
import { c as JSXNode, d as VNode, m as WithSignals, n as ComponentAPI, p as WithKey, u as Ref } from "./types-CZMcXQTW.mjs";
|
|
2
|
+
import { r as Signal } from "./types-BlaUrkq0.mjs";
|
|
3
|
+
import { o as StyleToken } from "./types-DucvOZQ2.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../dom/src/jsx-runtime.d.ts
|
|
6
6
|
/**
|
|
@@ -334,6 +334,12 @@ interface BaseMetaHTMLAttributes extends BaseHTMLAttributes<HTMLMetaElement> {
|
|
|
334
334
|
}
|
|
335
335
|
type MetaHTMLAttributes = WithKey<WithSignals<BaseMetaHTMLAttributes>>;
|
|
336
336
|
/**
|
|
337
|
+
* SVG element attributes — permissive to cover SVG's large attribute set
|
|
338
|
+
*/
|
|
339
|
+
type SVGAttributes = HTMLAttributes<SVGElement> & {
|
|
340
|
+
[key: string]: unknown;
|
|
341
|
+
};
|
|
342
|
+
/**
|
|
337
343
|
* JSX namespace for DOM elements
|
|
338
344
|
*/
|
|
339
345
|
declare namespace JSX {
|
|
@@ -422,7 +428,23 @@ declare namespace JSX {
|
|
|
422
428
|
source: HTMLAttributes<HTMLSourceElement>;
|
|
423
429
|
track: HTMLAttributes<HTMLTrackElement>;
|
|
424
430
|
canvas: CanvasHTMLAttributes;
|
|
425
|
-
svg:
|
|
431
|
+
svg: SVGAttributes;
|
|
432
|
+
circle: SVGAttributes;
|
|
433
|
+
clipPath: SVGAttributes;
|
|
434
|
+
defs: SVGAttributes;
|
|
435
|
+
ellipse: SVGAttributes;
|
|
436
|
+
g: SVGAttributes;
|
|
437
|
+
line: SVGAttributes;
|
|
438
|
+
linearGradient: SVGAttributes;
|
|
439
|
+
mask: SVGAttributes;
|
|
440
|
+
path: SVGAttributes;
|
|
441
|
+
polygon: SVGAttributes;
|
|
442
|
+
polyline: SVGAttributes;
|
|
443
|
+
radialGradient: SVGAttributes;
|
|
444
|
+
rect: SVGAttributes;
|
|
445
|
+
stop: SVGAttributes;
|
|
446
|
+
text: SVGAttributes;
|
|
447
|
+
use: SVGAttributes;
|
|
426
448
|
iframe: IframeHTMLAttributes;
|
|
427
449
|
embed: HTMLAttributes<HTMLEmbedElement>;
|
|
428
450
|
object: HTMLAttributes<HTMLObjectElement>;
|
|
@@ -437,5 +459,5 @@ declare namespace JSX {
|
|
|
437
459
|
}
|
|
438
460
|
}
|
|
439
461
|
//#endregion
|
|
440
|
-
export {
|
|
441
|
-
//# sourceMappingURL=jsx-runtime-
|
|
462
|
+
export { ThHTMLAttributes as C, TextareaHTMLAttributes as S, ScriptHTMLAttributes as _, ClassValue as a, TableHTMLAttributes as b, IframeHTMLAttributes as c, JSX as d, LabelHTMLAttributes as f, SVGAttributes as g, OptionHTMLAttributes as h, CanvasHTMLAttributes as i, ImgHTMLAttributes as l, MetaHTMLAttributes as m, AudioHTMLAttributes as n, FormHTMLAttributes as o, LinkHTMLAttributes as p, ButtonHTMLAttributes as r, HTMLAttributes as s, AnchorHTMLAttributes as t, InputHTMLAttributes as u, SelectHTMLAttributes as v, VideoHTMLAttributes as w, TdHTMLAttributes as x, StyleHTMLAttributes as y };
|
|
463
|
+
//# sourceMappingURL=jsx-runtime-DZx2Yv-t.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime-
|
|
1
|
+
{"version":3,"file":"jsx-runtime-DZx2Yv-t.d.mts","names":[],"sources":["../../dom/src/jsx-runtime.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { h, i as jsx } from "./src-DW3tIczg.mjs";
|
|
2
|
+
import { t as Native } from "./src-BqX3sryB.mjs";
|
|
3
|
+
import * as allExports from "lucide";
|
|
4
|
+
import { createElement } from "lucide";
|
|
5
|
+
|
|
6
|
+
//#region ../ssg/src/plugins/lucide/component.tsx
|
|
7
|
+
/** @jsxImportSource @semajsx/dom */
|
|
8
|
+
/**
|
|
9
|
+
* Convert kebab-case icon name to PascalCase for lucide lookup.
|
|
10
|
+
*
|
|
11
|
+
* "arrow-right" → "ArrowRight"
|
|
12
|
+
* "rocket" → "Rocket"
|
|
13
|
+
*/
|
|
14
|
+
function toPascalCase(name) {
|
|
15
|
+
return name.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Look up an icon by kebab-case name from lucide's exports.
|
|
19
|
+
* Returns the IconNode data (array of [tag, attrs] tuples) or undefined.
|
|
20
|
+
*/
|
|
21
|
+
function getIcon(name) {
|
|
22
|
+
const icon = allExports[toPascalCase(name)];
|
|
23
|
+
if (Array.isArray(icon)) return icon;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Default SVG attributes matching lucide's defaults.
|
|
27
|
+
*/
|
|
28
|
+
const SVG_DEFAULTS = {
|
|
29
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
30
|
+
viewBox: "0 0 24 24",
|
|
31
|
+
fill: "none",
|
|
32
|
+
stroke: "currentColor",
|
|
33
|
+
"stroke-width": 2,
|
|
34
|
+
"stroke-linecap": "round",
|
|
35
|
+
"stroke-linejoin": "round"
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Isomorphic Lucide icon component.
|
|
39
|
+
*
|
|
40
|
+
* - **Browser**: uses lucide's `createElement` to produce a real SVGElement,
|
|
41
|
+
* embedded via `<Native>` for optimal performance.
|
|
42
|
+
* - **Server (SSG/SSR)**: constructs JSX SVG from IconNode data,
|
|
43
|
+
* rendered to HTML string by the SSR renderer.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```mdx
|
|
47
|
+
* <Icon name="rocket" />
|
|
48
|
+
* <Icon name="arrow-right" size={20} color="#007aff" />
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
function Icon({ name, size = 24, color = "currentColor", strokeWidth = 2, class: className }) {
|
|
52
|
+
const iconNode = getIcon(name);
|
|
53
|
+
if (!iconNode) return /* @__PURE__ */ jsx("span", {
|
|
54
|
+
class: "lucide-icon-missing",
|
|
55
|
+
title: `Unknown icon: ${name}`,
|
|
56
|
+
children: "?"
|
|
57
|
+
});
|
|
58
|
+
const iconClass = className ? `lucide lucide-${name} ${className}` : `lucide lucide-${name}`;
|
|
59
|
+
if (typeof document !== "undefined") return /* @__PURE__ */ jsx(Native, { element: createElement(iconNode, {
|
|
60
|
+
width: size,
|
|
61
|
+
height: size,
|
|
62
|
+
stroke: color,
|
|
63
|
+
"stroke-width": strokeWidth,
|
|
64
|
+
class: iconClass
|
|
65
|
+
}) });
|
|
66
|
+
return h("svg", {
|
|
67
|
+
...SVG_DEFAULTS,
|
|
68
|
+
width: size,
|
|
69
|
+
height: size,
|
|
70
|
+
stroke: color,
|
|
71
|
+
"stroke-width": strokeWidth,
|
|
72
|
+
class: iconClass
|
|
73
|
+
}, ...iconNode.map(([tag, attrs]) => h(tag, attrs)));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region ../ssg/src/plugins/lucide/index.ts
|
|
78
|
+
/**
|
|
79
|
+
* Lucide icon plugin for SSG.
|
|
80
|
+
*
|
|
81
|
+
* Registers the `<Icon>` component for use in MDX content.
|
|
82
|
+
* Optionally configure default icon properties.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```tsx
|
|
86
|
+
* import { createSSG } from "@semajsx/ssg";
|
|
87
|
+
* import { lucide } from "@semajsx/ssg/plugins/lucide";
|
|
88
|
+
*
|
|
89
|
+
* const ssg = createSSG({
|
|
90
|
+
* plugins: [lucide()],
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```tsx
|
|
96
|
+
* // With custom defaults
|
|
97
|
+
* const ssg = createSSG({
|
|
98
|
+
* plugins: [lucide({ size: 20, color: "#333" })],
|
|
99
|
+
* });
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```mdx
|
|
104
|
+
* <Icon name="rocket" />
|
|
105
|
+
* <Icon name="arrow-right" size={16} color="#007aff" />
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
function lucide(options = {}) {
|
|
109
|
+
const { size, color, strokeWidth } = options;
|
|
110
|
+
const IconComponent = size !== void 0 || color !== void 0 || strokeWidth !== void 0 ? (props) => Icon({
|
|
111
|
+
...props,
|
|
112
|
+
size: props.size ?? size,
|
|
113
|
+
color: props.color ?? color,
|
|
114
|
+
strokeWidth: props.strokeWidth ?? strokeWidth
|
|
115
|
+
}) : Icon;
|
|
116
|
+
return {
|
|
117
|
+
name: "lucide",
|
|
118
|
+
config() {
|
|
119
|
+
return { mdx: { components: { Icon: IconComponent } } };
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
//#endregion
|
|
125
|
+
export { Icon as n, lucide as t };
|
|
126
|
+
//# sourceMappingURL=lucide-CVtHepGM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lucide-CVtHepGM.mjs","names":[],"sources":["../../ssg/src/plugins/lucide/component.tsx","../../ssg/src/plugins/lucide/index.ts"],"sourcesContent":["/** @jsxImportSource @semajsx/dom */\n\nimport { h } from \"@semajsx/core\";\nimport type { VNode } from \"@semajsx/core\";\nimport { Native } from \"@semajsx/dom\";\nimport { createElement } from \"lucide\";\nimport * as allExports from \"lucide\";\n\n/**\n * lucide IconNode: array of [tag, attrs] tuples\n * e.g., [[\"path\", { d: \"M4.5 16.5...\" }], [\"circle\", { cx: \"12\", ... }]]\n */\ntype IconNode = [string, Record<string, string>][];\n\n/**\n * Convert kebab-case icon name to PascalCase for lucide lookup.\n *\n * \"arrow-right\" → \"ArrowRight\"\n * \"rocket\" → \"Rocket\"\n */\nfunction toPascalCase(name: string): string {\n return name\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\n/**\n * Look up an icon by kebab-case name from lucide's exports.\n * Returns the IconNode data (array of [tag, attrs] tuples) or undefined.\n */\nfunction getIcon(name: string): IconNode | undefined {\n const pascalName = toPascalCase(name);\n const icon = (allExports as Record<string, unknown>)[pascalName];\n // IconNode is an array of tuples; functions (createElement, createIcons) are filtered out\n if (Array.isArray(icon)) return icon as IconNode;\n return undefined;\n}\n\nexport interface IconProps {\n /** Icon name in kebab-case (e.g., \"rocket\", \"arrow-right\", \"circle-check\") */\n name: string;\n /** Icon size in pixels (default: 24) */\n size?: number;\n /** Stroke color (default: \"currentColor\") */\n color?: string;\n /** Stroke width (default: 2) */\n strokeWidth?: number;\n /** Additional CSS class */\n class?: string;\n}\n\n/**\n * Default SVG attributes matching lucide's defaults.\n */\nconst SVG_DEFAULTS = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n} as const;\n\n/**\n * Isomorphic Lucide icon component.\n *\n * - **Browser**: uses lucide's `createElement` to produce a real SVGElement,\n * embedded via `<Native>` for optimal performance.\n * - **Server (SSG/SSR)**: constructs JSX SVG from IconNode data,\n * rendered to HTML string by the SSR renderer.\n *\n * @example\n * ```mdx\n * <Icon name=\"rocket\" />\n * <Icon name=\"arrow-right\" size={20} color=\"#007aff\" />\n * ```\n */\nexport function Icon({\n name,\n size = 24,\n color = \"currentColor\",\n strokeWidth = 2,\n class: className,\n}: IconProps): VNode {\n const iconNode = getIcon(name);\n\n if (!iconNode) {\n return (\n <span class=\"lucide-icon-missing\" title={`Unknown icon: ${name}`}>\n {\"?\"}\n </span>\n );\n }\n\n const iconClass = className ? `lucide lucide-${name} ${className}` : `lucide lucide-${name}`;\n\n // Browser: use lucide's createElement + Native\n if (typeof document !== \"undefined\") {\n const element = createElement(iconNode, {\n width: size,\n height: size,\n stroke: color,\n \"stroke-width\": strokeWidth,\n class: iconClass,\n });\n return <Native element={element} />;\n }\n\n // Server: construct SVG from IconNode data\n return h(\n \"svg\",\n {\n ...SVG_DEFAULTS,\n width: size,\n height: size,\n stroke: color,\n \"stroke-width\": strokeWidth,\n class: iconClass,\n },\n ...iconNode.map(([tag, attrs]) => h(tag, attrs)),\n );\n}\n","import type { SSGPlugin } from \"../../types\";\nimport { Icon, type IconProps } from \"./component\";\n\nexport type { IconProps } from \"./component\";\nexport { Icon };\n\nexport interface LucidePluginOptions {\n /** Default icon size in pixels (default: 24) */\n size?: number;\n /** Default stroke color (default: \"currentColor\") */\n color?: string;\n /** Default stroke width (default: 2) */\n strokeWidth?: number;\n}\n\n/**\n * Lucide icon plugin for SSG.\n *\n * Registers the `<Icon>` component for use in MDX content.\n * Optionally configure default icon properties.\n *\n * @example\n * ```tsx\n * import { createSSG } from \"@semajsx/ssg\";\n * import { lucide } from \"@semajsx/ssg/plugins/lucide\";\n *\n * const ssg = createSSG({\n * plugins: [lucide()],\n * });\n * ```\n *\n * @example\n * ```tsx\n * // With custom defaults\n * const ssg = createSSG({\n * plugins: [lucide({ size: 20, color: \"#333\" })],\n * });\n * ```\n *\n * @example\n * ```mdx\n * <Icon name=\"rocket\" />\n * <Icon name=\"arrow-right\" size={16} color=\"#007aff\" />\n * ```\n */\nexport function lucide(options: LucidePluginOptions = {}): SSGPlugin {\n const { size, color, strokeWidth } = options;\n const hasDefaults = size !== undefined || color !== undefined || strokeWidth !== undefined;\n\n // Wrap Icon with custom defaults if any options are provided\n const IconComponent = hasDefaults\n ? (props: IconProps) =>\n Icon({\n ...props,\n size: props.size ?? size,\n color: props.color ?? color,\n strokeWidth: props.strokeWidth ?? strokeWidth,\n })\n : Icon;\n\n return {\n name: \"lucide\",\n config() {\n return {\n mdx: {\n components: { Icon: IconComponent },\n },\n };\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,SAAS,aAAa,MAAsB;AAC1C,QAAO,KACJ,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,GAAG;;;;;;AAOb,SAAS,QAAQ,MAAoC;CAEnD,MAAM,OAAQ,WADK,aAAa,KAAK;AAGrC,KAAI,MAAM,QAAQ,KAAK,CAAE,QAAO;;;;;AAoBlC,MAAM,eAAe;CACnB,OAAO;CACP,SAAS;CACT,MAAM;CACN,QAAQ;CACR,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACpB;;;;;;;;;;;;;;;AAgBD,SAAgB,KAAK,EACnB,MACA,OAAO,IACP,QAAQ,gBACR,cAAc,GACd,OAAO,aACY;CACnB,MAAM,WAAW,QAAQ,KAAK;AAE9B,KAAI,CAAC,SACH,QACE,oBAAC;EAAK,OAAM;EAAsB,OAAO,iBAAiB;YACvD;GACI;CAIX,MAAM,YAAY,YAAY,iBAAiB,KAAK,GAAG,cAAc,iBAAiB;AAGtF,KAAI,OAAO,aAAa,YAQtB,QAAO,oBAAC,UAAO,SAPC,cAAc,UAAU;EACtC,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,gBAAgB;EAChB,OAAO;EACR,CAAC,GACiC;AAIrC,QAAO,EACL,OACA;EACE,GAAG;EACH,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,gBAAgB;EAChB,OAAO;EACR,EACD,GAAG,SAAS,KAAK,CAAC,KAAK,WAAW,EAAE,KAAK,MAAM,CAAC,CACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7EH,SAAgB,OAAO,UAA+B,EAAE,EAAa;CACnE,MAAM,EAAE,MAAM,OAAO,gBAAgB;CAIrC,MAAM,gBAHc,SAAS,UAAa,UAAU,UAAa,gBAAgB,UAI5E,UACC,KAAK;EACH,GAAG;EACH,MAAM,MAAM,QAAQ;EACpB,OAAO,MAAM,SAAS;EACtB,aAAa,MAAM,eAAe;EACnC,CAAC,GACJ;AAEJ,QAAO;EACL,MAAM;EACN,SAAS;AACP,UAAO,EACL,KAAK,EACH,YAAY,EAAE,MAAM,eAAe,EACpC,EACF;;EAEJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as JSXNode, d as VNode, t as Component } from "./types-CZMcXQTW.mjs";
|
|
2
2
|
import { UserConfig, ViteDevServer } from "vite";
|
|
3
3
|
|
|
4
4
|
//#region ../ssr/src/shared/types.d.ts
|
|
@@ -202,6 +202,13 @@ interface AppConfig {
|
|
|
202
202
|
resources?: ResourceConfig;
|
|
203
203
|
}
|
|
204
204
|
/**
|
|
205
|
+
* Script entry included in a build page (e.g., island hydration scripts).
|
|
206
|
+
*/
|
|
207
|
+
interface BuildScriptEntry {
|
|
208
|
+
/** Script module URL (resolved by Vite during build) */
|
|
209
|
+
src: string;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
205
212
|
* Build options for production
|
|
206
213
|
*/
|
|
207
214
|
interface BuildOptions {
|
|
@@ -217,6 +224,19 @@ interface BuildOptions {
|
|
|
217
224
|
vite?: UserConfig;
|
|
218
225
|
/** Callback when an island is built */
|
|
219
226
|
onIslandBuilt?: (island: IslandMetadata) => void;
|
|
227
|
+
/**
|
|
228
|
+
* Custom HTML renderer for build output.
|
|
229
|
+
* When provided, used instead of the default minimal HTML template.
|
|
230
|
+
* This allows callers (e.g., SSG) to inject their own Document template
|
|
231
|
+
* with custom head elements (fonts, meta tags, etc.).
|
|
232
|
+
*/
|
|
233
|
+
renderHtml?: (opts: {
|
|
234
|
+
/** Rendered page content (HTML string) */html: string; /** CSS stylesheet paths */
|
|
235
|
+
css: string[]; /** Island script entries to include */
|
|
236
|
+
scripts: BuildScriptEntry[]; /** Page title */
|
|
237
|
+
title: string; /** Route path */
|
|
238
|
+
path: string;
|
|
239
|
+
}) => string;
|
|
220
240
|
}
|
|
221
241
|
/**
|
|
222
242
|
* Development server options
|
|
@@ -365,5 +385,5 @@ declare function isLinkVNode(vnode: VNode): boolean;
|
|
|
365
385
|
*/
|
|
366
386
|
declare function isAssetVNode(vnode: VNode): boolean;
|
|
367
387
|
//#endregion
|
|
368
|
-
export {
|
|
369
|
-
//# sourceMappingURL=resource-
|
|
388
|
+
export { RouterConfig as A, IslandScriptTransformer as C, RouteContext as D, RenderToStringOptions as E, RouteHandler as O, IslandScriptContext as S, RenderResult as T, BuildScriptEntry as _, ResourceTools as a, IslandMarker as b, isAssetVNode as c, resource as d, App as f, BuildResult as g, BuildOptions as h, LinkProps as i, SSRResult as j, RouteMeta as k, isLinkVNode as l, AssetMetadata as m, AssetProps as n, STYLE_MARKER as o, AppConfig as p, LINK_MARKER as r, StyleProps as s, ASSET_MARKER as t, isStyleVNode as u, DevOptions as v, LinkMetadata as w, IslandMetadata as x, DocumentTemplate as y };
|
|
389
|
+
//# sourceMappingURL=resource-BQI6AeJ0.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-BQI6AeJ0.d.mts","names":[],"sources":["../../ssr/src/shared/types.ts","../../ssr/src/client/resource.ts"],"mappings":";;;;;;AAMA;UAAiB,cAAA;;EAEf,EAAA;;EAEA,IAAA;;EAEA,KAAA,EAAO,MAAA;;EAEP,aAAA;AAAA;AAMF;;;AAAA,UAAiB,mBAAA;;EAEf,EAAA;;EAEA,IAAA;;EAEA,KAAA,EAAO,MAAA;;EAEP,aAAA;EASF;EAPE,QAAA;AAAA;;;AAYF;;KALY,uBAAA,IAA2B,OAAA,EAAS,mBAAA;;;;UAK/B,qBAAA;;;AAiBjB;;;EAXE,qBAAA,GAAwB,uBAAA;;;;;EAKxB,OAAA;AAAA;;;;UAMe,SAAA;EAkBA;EAhBf,IAAA;EAgBe;EAdf,OAAA,EAAS,cAAA;;EAET,OAAA;;EAEA,QAAA;EAmBF;EAjBE,GAAA;;EAEA,MAAA;AAAA;AAuBF;;;AAAA,UAjBiB,YAAA;EACf,IAAA;EACA,GAAA;EACA,EAAA;AAAA;;;AA8BF;UAxBiB,aAAA;EACf,GAAA;EACA,IAAA;AAAA;;;;UAMe,YAAA;EAoBR;EAlBP,UAAA;EAwBU;EAtBV,SAAA,EAAW,QAAA;EAsByC;EApBpD,KAAA;AAAA;;;;UAUe,YAAA;EAeA;EAbf,MAAA,EAAQ,MAAA;EAaO;EAXf,KAAA,EAAO,MAAA;AAAA;;;;KAMG,YAAA,IAAgB,OAAA,EAAS,YAAA,KAAiB,KAAA;;;;UAKrC,SAAA;EAyBX;EAvBJ,KAAA;;GAAA,GAAA;AAAA;;;;KAQU,gBAAA,IAAoB,KAAA;6DAE9B,QAAA,EAAU,OAAA;EAEV,OAAA,EAAS,OAAA;EAET,OAAA,EAAS,cAAA,IASL;EAPJ,GAAA,YAYe;EAVf,IAAA,UA2BO;EAzBP,KAAA;EAEA,IAAA,GAAO,MAAA;AAAA,MACH,KAAA;;;;UAKW,YAAA;;EAEf,WAAA;;EAEA,GAAA;EAaO;EAXP,IAAA;EAiBe;EAff,YAAA;IACE,MAAA;IACA,SAAA;EAAA;;EAGF,QAAA,GAAW,gBAAA;;EAEX,KAAA;EA0CF;EAxCE,IAAA,GAAO,MAAA;AAAA;;;;UAMQ,cAAA;;;;;;;;;;;;EAYf,OAAA,GAAU,MAAA;;;;;EAMV,OAAA;;;;;EAMA,OAAA;AAAA;;;;UAUe,SAAA;EA0CjB;EAxCE,MAAA,GAAS,MAAA,SAAe,YAAA;;EAGxB,IAAA,GAAO,UAAA;;EAGP,OAAA;IAiEW,qCA/DT,KAAA,YAkCF;IAhCE,SAAA;EAAA;;EAIF,QAAA,GAAW,gBAAA;;EAGX,KAAA;;EAGA,IAAA,GAAO,MAAA;;EAGP,IAAA;;EAGA,SAAA,GAAY,cAAA;AAAA;;;;UAMG,gBAAA;;EAEf,GAAA;AAAA;;;;UAMe,YAAA;;EAEf,MAAA;EAgDA;EA7CA,IAAA;EAmDe;EAhDf,MAAA;EAqDS;EAlDT,SAAA;;EAGA,IAAA,GAAO,UAAA;;EAGP,aAAA,IAAiB,MAAA,EAAQ,cAAA;;;;;AAyD3B;;EAjDE,UAAA,IAAc,IAAA;IAiDW,0CA/CvB,IAAA,UAoDJ;IAlDI,GAAA;IAEA,OAAA,EAAS,gBAAA,IAqDkB;IAnD3B,KAAA,UAsD4B;IApD5B,IAAA;EAAA;AAAA;;;;UAOa,UAAA;;EAEf,IAAA;;EAGA,IAAA;;EAGA,IAAA;AAAA;;;;UAMe,WAAA;EA0Dc;EAxD7B,MAAA;;EAGA,OAAA,EAAS,KAAA;IACP,EAAA;IACA,IAAA;IACA,UAAA;EAAA;;EAIF,MAAA;AAAA;;;;KAMU,YAAA,GAAe,SAAA;;;;UAKV,GAAA;;WAEN,MAAA,EAAQ,SAAA;;EAGjB,KAAA,CAAM,IAAA,UAAc,OAAA,EAAS,YAAA,EAAc,IAAA,GAAO,SAAA;;EAGlD,MAAA,CAAO,MAAA,EAAQ,MAAA,SAAe,YAAA;;EAG9B,OAAA,IAAW,OAAA;;EAGX,KAAA,IAAS,OAAA;;EAGT,MAAA,CAAO,IAAA,WAAe,OAAA,CAAQ,YAAA;;EAG9B,GAAA,CAAI,OAAA,GAAU,UAAA,GAAa,OAAA;IAAU,IAAA;IAAc,KAAA,QAAa,OAAA;EAAA;;EAGhE,KAAA,CAAM,OAAA,GAAU,YAAA,GAAe,OAAA,CAAQ,WAAA;;EAGvC,aAAA,CAAc,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,QAAA;;EAGzC,aAAA,IAAiB,aAAA;;EAGjB,mBAAA,CAAoB,QAAA,WAAmB,OAAA;;EAGvC,SAAA,CAAU,QAAA,WAAmB,cAAA;AAAA;;;;;;cC1WlB,YAAA;AAAA,cACA,WAAA;AAAA,cACA,YAAA;;;;UAKI,UAAA;EACf,IAAA;AAAA;;;ADMF;UCAiB,SAAA;EACf,IAAA;EACA,GAAA;EACA,EAAA;AAAA;;;;UAMe,UAAA;EACf,GAAA;EACA,IAAA;AAAA;;;;UAMe,aAAA;EDKjB;ECHE,KAAA,GAAQ,KAAA,EAAO,UAAA,KAAe,KAAA;;EAE9B,IAAA,GAAO,KAAA,EAAO,SAAA,KAAc,KAAA;;EAE5B,KAAA,GAAQ,KAAA,EAAO,UAAA,KAAe,KAAA;;EAE9B,GAAA,GAAM,IAAA;EDQN;ECNA,MAAA,aAAmB,SAAA,OAAgB,SAAA,EAAW,CAAA,EAAG,IAAA,cAAkB,CAAA;AAAA;;;;;;;;;;;;AD8BrE;;;;;;;;;AASA;;;;;AAQA;;iBCjBgB,QAAA,CAAS,OAAA,WAAkB,aAAA;;;;iBA+E3B,YAAA,CAAa,KAAA,EAAO,KAAA;;;;iBAOpB,WAAA,CAAY,KAAA,EAAO,KAAA;;;;iBAOnB,YAAA,CAAa,KAAA,EAAO,KAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as ISLAND_MARKER } from "./src-
|
|
1
|
+
import { f as ISLAND_MARKER } from "./src-DW3tIczg.mjs";
|
|
2
2
|
|
|
3
3
|
//#region ../ssr/src/client/island.ts
|
|
4
4
|
/**
|
|
@@ -193,4 +193,4 @@ function isAssetVNode(vnode) {
|
|
|
193
193
|
|
|
194
194
|
//#endregion
|
|
195
195
|
export { isLinkVNode as a, getIslandMetadata as c, island as d, isAssetVNode as i, isIslandComponent as l, LINK_MARKER as n, isStyleVNode as o, STYLE_MARKER as r, resource as s, ASSET_MARKER as t, isIslandVNode as u };
|
|
196
|
-
//# sourceMappingURL=resource-
|
|
196
|
+
//# sourceMappingURL=resource-DSlXDZZi.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-
|
|
1
|
+
{"version":3,"file":"resource-DSlXDZZi.mjs","names":[],"sources":["../../ssr/src/client/island.ts","../../ssr/src/client/resource.ts"],"sourcesContent":["import { ISLAND_MARKER, type Component, type JSXNode, type VNode } from \"@semajsx/core\";\nimport type { IslandMarker } from \"../shared/types\";\n\n/**\n * Mark a component as an Island that should be hydrated on the client\n *\n * @param component - The component function to mark as an island\n * @param modulePath - The module path to the component file (use import.meta.url or relative path)\n * @returns A wrapped component that can be used in SSR\n *\n * @example\n * ```tsx\n * // Using import.meta.url (recommended)\n * export const Counter = island(\n * function Counter({ initial = 0 }) {\n * const count = signal(initial)\n * return <button onClick={() => count.value++}>{count}</button>\n * },\n * import.meta.url\n * )\n *\n * // Using relative path\n * export const TodoList = island(\n * TodoListComponent,\n * './components/TodoList.tsx'\n * )\n * ```\n */\nexport function island<T extends Component<any>>(component: T, modulePath: string): T {\n // Create a wrapped component that marks itself as an island\n const wrappedComponent = ((props: any): JSXNode => {\n // Create a VNode with island marker\n const vnode: VNode & { [ISLAND_MARKER]?: IslandMarker } = {\n type: component,\n props: props || {},\n children: [],\n [ISLAND_MARKER]: {\n modulePath,\n component,\n props,\n },\n };\n\n return vnode;\n }) as T;\n\n // Also mark the wrapper function itself for static analysis\n (wrappedComponent as any)[ISLAND_MARKER] = {\n modulePath,\n component,\n };\n\n // Preserve component name for debugging\n Object.defineProperty(wrappedComponent, \"name\", {\n value: component.name || \"IslandComponent\",\n configurable: true,\n });\n\n return wrappedComponent;\n}\n\n/**\n * Check if a component is marked as an Island\n */\nexport function isIslandComponent(component: any): boolean {\n return component && ISLAND_MARKER in component;\n}\n\n/**\n * Check if a VNode is an Island instance\n */\nexport function isIslandVNode(vnode: VNode): vnode is VNode & {\n [ISLAND_MARKER]: IslandMarker;\n} {\n return ISLAND_MARKER in vnode;\n}\n\n/**\n * Get island metadata from a VNode\n */\nexport function getIslandMetadata(vnode: VNode): IslandMarker | undefined {\n if (isIslandVNode(vnode)) {\n return vnode[ISLAND_MARKER];\n }\n return undefined;\n}\n","import { ISLAND_MARKER, type Component, type JSXNode, type VNode } from \"@semajsx/core\";\nimport type { IslandMarker } from \"../shared/types\";\n\n/**\n * Symbol markers for resource types\n */\nexport const STYLE_MARKER: symbol = Symbol.for(\"semajsx.style\");\nexport const LINK_MARKER: symbol = Symbol.for(\"semajsx.link\");\nexport const ASSET_MARKER: symbol = Symbol.for(\"semajsx.asset\");\n\n/**\n * Style component props\n */\nexport interface StyleProps {\n href: string;\n}\n\n/**\n * Link component props\n */\nexport interface LinkProps {\n href: string;\n rel?: string;\n as?: string;\n}\n\n/**\n * Asset component props\n */\nexport interface AssetProps {\n src: string;\n type?: \"image\" | \"font\" | \"script\";\n}\n\n/**\n * Resource tools returned by resource()\n */\nexport interface ResourceTools {\n /** CSS stylesheet declaration */\n Style: (props: StyleProps) => VNode;\n /** External resource link */\n Link: (props: LinkProps) => VNode;\n /** Static asset declaration */\n Asset: (props: AssetProps) => VNode;\n /** Resolve relative path to absolute */\n url: (path: string) => string;\n /** Create an island component */\n island: <T extends Component<any>>(component: T, name?: string) => T;\n}\n\n/**\n * Create resource tools bound to a module path\n *\n * @param baseUrl - The module URL (use import.meta.url)\n * @returns Resource tools with resolved paths\n *\n * @example\n * ```tsx\n * import { resource } from '@semajsx/ssr';\n *\n * const { Style, Link, Asset, url, island } = resource(import.meta.url);\n *\n * export default function Page() {\n * return (\n * <>\n * <Style href=\"./page.css\" />\n * <img src={url('./hero.png')} />\n * <Counter />\n * </>\n * );\n * }\n *\n * const Counter = island(function Counter({ initial = 0 }) {\n * return <button>{initial}</button>;\n * });\n * ```\n */\nexport function resource(baseUrl: string): ResourceTools {\n /**\n * Resolve a relative path against the base URL\n */\n const resolve = (href: string): string => {\n if (href.startsWith(\"./\") || href.startsWith(\"../\")) {\n const url = new URL(href, baseUrl);\n return url.pathname + url.search + url.hash;\n }\n return href;\n };\n\n return {\n Style({ href }: StyleProps): VNode {\n return {\n type: STYLE_MARKER as unknown as string,\n props: { href: resolve(href) },\n children: [],\n };\n },\n\n Link({ href, rel = \"stylesheet\", as: asType }: LinkProps): VNode {\n return {\n type: LINK_MARKER as unknown as string,\n props: { href: resolve(href), rel, as: asType },\n children: [],\n };\n },\n\n Asset({ src, type = \"image\" }: AssetProps): VNode {\n return {\n type: ASSET_MARKER as unknown as string,\n props: { src: resolve(src), type },\n children: [],\n };\n },\n\n url(path: string): string {\n return resolve(path);\n },\n\n island<T extends Component<any>>(component: T, name?: string): T {\n const componentName = name || component.name || \"Anonymous\";\n\n const wrappedComponent = ((props: Record<string, unknown>): JSXNode => {\n const vnode: VNode & { [ISLAND_MARKER]?: IslandMarker } = {\n type: component,\n props: props || {},\n children: [],\n [ISLAND_MARKER]: {\n modulePath: baseUrl,\n component,\n props,\n },\n };\n\n return vnode;\n }) as T;\n\n // Mark the wrapper function for static analysis\n (wrappedComponent as Record<symbol, unknown>)[ISLAND_MARKER] = {\n modulePath: baseUrl,\n component,\n };\n\n // Preserve component name\n Object.defineProperty(wrappedComponent, \"name\", {\n value: componentName,\n configurable: true,\n });\n\n return wrappedComponent;\n },\n };\n}\n\n/**\n * Check if a VNode is a Style resource\n */\nexport function isStyleVNode(vnode: VNode): boolean {\n return vnode.type === STYLE_MARKER;\n}\n\n/**\n * Check if a VNode is a Link resource\n */\nexport function isLinkVNode(vnode: VNode): boolean {\n return vnode.type === LINK_MARKER;\n}\n\n/**\n * Check if a VNode is an Asset resource\n */\nexport function isAssetVNode(vnode: VNode): boolean {\n return vnode.type === ASSET_MARKER;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,OAAiC,WAAc,YAAuB;CAEpF,MAAM,qBAAqB,UAAwB;AAajD,SAX0D;GACxD,MAAM;GACN,OAAO,SAAS,EAAE;GAClB,UAAU,EAAE;IACX,gBAAgB;IACf;IACA;IACA;IACD;GACF;;AAMH,CAAC,iBAAyB,iBAAiB;EACzC;EACA;EACD;AAGD,QAAO,eAAe,kBAAkB,QAAQ;EAC9C,OAAO,UAAU,QAAQ;EACzB,cAAc;EACf,CAAC;AAEF,QAAO;;;;;AAMT,SAAgB,kBAAkB,WAAyB;AACzD,QAAO,aAAa,iBAAiB;;;;;AAMvC,SAAgB,cAAc,OAE5B;AACA,QAAO,iBAAiB;;;;;AAM1B,SAAgB,kBAAkB,OAAwC;AACxE,KAAI,cAAc,MAAM,CACtB,QAAO,MAAM;;;;;;;;AC5EjB,MAAa,eAAuB,OAAO,IAAI,gBAAgB;AAC/D,MAAa,cAAsB,OAAO,IAAI,eAAe;AAC7D,MAAa,eAAuB,OAAO,IAAI,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqE/D,SAAgB,SAAS,SAAgC;;;;CAIvD,MAAM,WAAW,SAAyB;AACxC,MAAI,KAAK,WAAW,KAAK,IAAI,KAAK,WAAW,MAAM,EAAE;GACnD,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ;AAClC,UAAO,IAAI,WAAW,IAAI,SAAS,IAAI;;AAEzC,SAAO;;AAGT,QAAO;EACL,MAAM,EAAE,QAA2B;AACjC,UAAO;IACL,MAAM;IACN,OAAO,EAAE,MAAM,QAAQ,KAAK,EAAE;IAC9B,UAAU,EAAE;IACb;;EAGH,KAAK,EAAE,MAAM,MAAM,cAAc,IAAI,UAA4B;AAC/D,UAAO;IACL,MAAM;IACN,OAAO;KAAE,MAAM,QAAQ,KAAK;KAAE;KAAK,IAAI;KAAQ;IAC/C,UAAU,EAAE;IACb;;EAGH,MAAM,EAAE,KAAK,OAAO,WAA8B;AAChD,UAAO;IACL,MAAM;IACN,OAAO;KAAE,KAAK,QAAQ,IAAI;KAAE;KAAM;IAClC,UAAU,EAAE;IACb;;EAGH,IAAI,MAAsB;AACxB,UAAO,QAAQ,KAAK;;EAGtB,OAAiC,WAAc,MAAkB;GAC/D,MAAM,gBAAgB,QAAQ,UAAU,QAAQ;GAEhD,MAAM,qBAAqB,UAA4C;AAYrE,WAX0D;KACxD,MAAM;KACN,OAAO,SAAS,EAAE;KAClB,UAAU,EAAE;MACX,gBAAgB;MACf,YAAY;MACZ;MACA;MACD;KACF;;AAMH,GAAC,iBAA6C,iBAAiB;IAC7D,YAAY;IACZ;IACD;AAGD,UAAO,eAAe,kBAAkB,QAAQ;IAC9C,OAAO;IACP,cAAc;IACf,CAAC;AAEF,UAAO;;EAEV;;;;;AAMH,SAAgB,aAAa,OAAuB;AAClD,QAAO,MAAM,SAAS;;;;;AAMxB,SAAgB,YAAY,OAAuB;AACjD,QAAO,MAAM,SAAS;;;;;AAMxB,SAAgB,aAAa,OAAuB;AAClD,QAAO,MAAM,SAAS"}
|
package/dist/signal/index.d.mts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as WritableSignal, i as SignalValue, n as ReadableSignal, r as Signal, t as MaybeSignal } from "../types-
|
|
2
|
-
import { a as memo, i as computed, n as unwrap, o as signal, r as batch, t as isSignal } from "../index-
|
|
1
|
+
import { a as WritableSignal, i as SignalValue, n as ReadableSignal, r as Signal, t as MaybeSignal } from "../types-BlaUrkq0.mjs";
|
|
2
|
+
import { a as memo, i as computed, n as unwrap, o as signal, r as batch, t as isSignal } from "../index-B1pjI-Su.mjs";
|
|
3
3
|
export { MaybeSignal, ReadableSignal, Signal, SignalValue, WritableSignal, batch, computed, isSignal, memo, signal, unwrap };
|
package/dist/signal/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as batch, t as signal } from "../signal-
|
|
2
|
-
import { n as memo, t as computed } from "../computed-
|
|
3
|
-
import { n as unwrap, t as isSignal } from "../utils-
|
|
1
|
+
import { n as batch, t as signal } from "../signal-BN8vHXDb.mjs";
|
|
2
|
+
import { n as memo, t as computed } from "../computed-BidG06Lt.mjs";
|
|
3
|
+
import { n as unwrap, t as isSignal } from "../utils-DbTAs943.mjs";
|
|
4
4
|
|
|
5
5
|
export { batch, computed, isSignal, memo, signal, unwrap };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-
|
|
1
|
+
{"version":3,"file":"signal-BN8vHXDb.mjs","names":[],"sources":["../../signal/src/batch.ts","../../signal/src/signal.ts"],"sourcesContent":["/**\n * Batch multiple signal updates using microtask scheduling\n *\n * Updates are collected and executed in a single microtask to prevent\n * multiple synchronous DOM updates and layout thrashing.\n */\n\n// Queue of pending updates\nlet updateQueue = new Set<() => void>();\nlet isFlushScheduled = false;\nlet isBatching = false;\n\n/**\n * Schedule a notification to run in a microtask\n */\nexport function scheduleUpdate(notify: () => void): void {\n // If we're in a batch, always queue the update\n if (isBatching) {\n updateQueue.add(notify);\n return;\n }\n\n // If not batching, check if we should schedule a flush\n updateQueue.add(notify);\n\n if (!isFlushScheduled) {\n isFlushScheduled = true;\n queueMicrotask(flushUpdates);\n }\n}\n\n/**\n * Flush all pending updates\n */\nfunction flushUpdates(): void {\n isFlushScheduled = false;\n\n // Copy and clear the queue to handle updates that trigger new updates\n const updates = Array.from(updateQueue);\n updateQueue.clear();\n\n // Execute all updates\n for (const notify of updates) {\n notify();\n }\n}\n\n/**\n * Batch multiple signal updates\n * All updates inside the batch function will be deferred until the batch completes\n */\nexport function batch<T>(fn: () => T): T {\n // If already batching, just run the function\n if (isBatching) {\n return fn();\n }\n\n isBatching = true;\n\n try {\n const result = fn();\n return result;\n } finally {\n isBatching = false;\n\n // Flush all queued updates immediately after the batch\n if (updateQueue.size > 0) {\n const updates = Array.from(updateQueue);\n updateQueue.clear();\n\n for (const notify of updates) {\n notify();\n }\n }\n }\n}\n","import type { WritableSignal } from \"./types\";\nimport { scheduleUpdate } from \"./batch\";\n\n/**\n * Create a writable signal\n */\nexport function signal<T>(initialValue: T): WritableSignal<T> {\n let value = initialValue;\n const subscribers = new Set<(value: T) => void>();\n\n const sig: WritableSignal<T> = {\n get value() {\n return value;\n },\n\n set value(newValue: T) {\n if (!Object.is(value, newValue)) {\n value = newValue;\n notify();\n }\n },\n\n set(newValue: T) {\n this.value = newValue;\n },\n\n update(fn: (prev: T) => T) {\n this.value = fn(value);\n },\n\n subscribe(listener: (value: T) => void) {\n subscribers.add(listener);\n return () => {\n subscribers.delete(listener);\n };\n },\n };\n\n function notify() {\n // Schedule the notification instead of running it immediately\n // This allows batching multiple updates into a single microtask\n scheduleUpdate(() => {\n // Directly iterate over the Set - no need to copy to array\n // The Set is stable during iteration even if modified\n for (const listener of subscribers) {\n listener(value);\n }\n });\n }\n\n return sig;\n}\n"],"mappings":";;;;;;;AAQA,IAAI,8BAAc,IAAI,KAAiB;AACvC,IAAI,mBAAmB;AACvB,IAAI,aAAa;;;;AAKjB,SAAgB,eAAe,QAA0B;AAEvD,KAAI,YAAY;AACd,cAAY,IAAI,OAAO;AACvB;;AAIF,aAAY,IAAI,OAAO;AAEvB,KAAI,CAAC,kBAAkB;AACrB,qBAAmB;AACnB,iBAAe,aAAa;;;;;;AAOhC,SAAS,eAAqB;AAC5B,oBAAmB;CAGnB,MAAM,UAAU,MAAM,KAAK,YAAY;AACvC,aAAY,OAAO;AAGnB,MAAK,MAAM,UAAU,QACnB,SAAQ;;;;;;AAQZ,SAAgB,MAAS,IAAgB;AAEvC,KAAI,WACF,QAAO,IAAI;AAGb,cAAa;AAEb,KAAI;AAEF,SADe,IAAI;WAEX;AACR,eAAa;AAGb,MAAI,YAAY,OAAO,GAAG;GACxB,MAAM,UAAU,MAAM,KAAK,YAAY;AACvC,eAAY,OAAO;AAEnB,QAAK,MAAM,UAAU,QACnB,SAAQ;;;;;;;;;;ACjEhB,SAAgB,OAAU,cAAoC;CAC5D,IAAI,QAAQ;CACZ,MAAM,8BAAc,IAAI,KAAyB;CAEjD,MAAM,MAAyB;EAC7B,IAAI,QAAQ;AACV,UAAO;;EAGT,IAAI,MAAM,UAAa;AACrB,OAAI,CAAC,OAAO,GAAG,OAAO,SAAS,EAAE;AAC/B,YAAQ;AACR,YAAQ;;;EAIZ,IAAI,UAAa;AACf,QAAK,QAAQ;;EAGf,OAAO,IAAoB;AACzB,QAAK,QAAQ,GAAG,MAAM;;EAGxB,UAAU,UAA8B;AACtC,eAAY,IAAI,SAAS;AACzB,gBAAa;AACX,gBAAY,OAAO,SAAS;;;EAGjC;CAED,SAAS,SAAS;AAGhB,uBAAqB;AAGnB,QAAK,MAAM,YAAY,YACrB,UAAS,MAAM;IAEjB;;AAGJ,QAAO"}
|
|
@@ -72,4 +72,4 @@ type MaybeSignal<T> = T | ReadableSignal<T>;
|
|
|
72
72
|
type SignalValue<S> = S extends ReadableSignal<infer T> ? T : never;
|
|
73
73
|
//#endregion
|
|
74
74
|
export { WritableSignal as i, ReadableSignal as n, SignalValue as r, MaybeSignal as t };
|
|
75
|
-
//# sourceMappingURL=signal-
|
|
75
|
+
//# sourceMappingURL=signal-BwxUlXKs.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-
|
|
1
|
+
{"version":3,"file":"signal-BwxUlXKs.d.mts","names":[],"sources":["../../core/src/signal.ts"],"mappings":";;AA4BA;;;;;;;;;;;;;AA6BA;;;;;;;;;;;;;UA7BiB,cAAA;EAkCR;AAOT;;;EAPS,SA7BE,KAAA,EAAO,CAAA;;;;;;EAOhB,SAAA,CAAU,QAAA,GAAW,KAAA,EAAO,CAAA;AAAA;;;;AAmC9B;;;;;;;;;;;UAlBiB,cAAA,YAA0B,cAAA,CAAe,CAAA;;;;;EAKxD,KAAA,EAAO,CAAA;AAAA;;;;;KAOG,WAAA,MAAiB,CAAA,GAAI,cAAA,CAAe,CAAA;;;;;KAMpC,WAAA,MAAiB,CAAA,SAAU,cAAA,YAA0B,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as isSignal } from "./utils-
|
|
2
|
-
import { _ as
|
|
3
|
-
import {
|
|
1
|
+
import { t as isSignal } from "./utils-DbTAs943.mjs";
|
|
2
|
+
import { _ as Forward, h, n as isAsyncIterator, o as resource, r as isPromise, s as stream, t as createRenderer, v as Fragment, y as Portal } from "./src-DW3tIczg.mjs";
|
|
3
|
+
import { B as inject, U as isStyleToken } from "./src-Ds9vl42d.mjs";
|
|
4
4
|
|
|
5
5
|
//#region ../dom/src/operations.ts
|
|
6
6
|
/**
|
|
@@ -363,6 +363,34 @@ function PortalComponent(props) {
|
|
|
363
363
|
return createPortal(props.children, props.container);
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
+
//#endregion
|
|
367
|
+
//#region ../dom/src/forward.ts
|
|
368
|
+
/**
|
|
369
|
+
* Forward component - merges props onto its single child element
|
|
370
|
+
*
|
|
371
|
+
* Forward is a renderless primitive that injects props into its child
|
|
372
|
+
* without producing an extra DOM node. Think of it as declarative
|
|
373
|
+
* prop spreading from parent to child.
|
|
374
|
+
*
|
|
375
|
+
* Props merging behavior:
|
|
376
|
+
* - `class`/`className`: concatenated (both applied)
|
|
377
|
+
* - `style`: merged objects (Forward overrides per-property)
|
|
378
|
+
* - Event handlers (`on*`): chained (both run)
|
|
379
|
+
* - Other props: Forward overrides child
|
|
380
|
+
*
|
|
381
|
+
* @example
|
|
382
|
+
* ```tsx
|
|
383
|
+
* <Forward onClick={handler} class="extra">
|
|
384
|
+
* <button class="btn">Click me</button>
|
|
385
|
+
* </Forward>
|
|
386
|
+
* // renders: <button class="btn extra" onClick={handler}>Click me</button>
|
|
387
|
+
* ```
|
|
388
|
+
*/
|
|
389
|
+
function ForwardComponent(props) {
|
|
390
|
+
const { children, ...rest } = props;
|
|
391
|
+
return h(Forward, rest, children);
|
|
392
|
+
}
|
|
393
|
+
|
|
366
394
|
//#endregion
|
|
367
395
|
//#region ../dom/src/style-anchor.ts
|
|
368
396
|
/**
|
|
@@ -461,5 +489,40 @@ function ComponentStyleAnchor({ target, children }) {
|
|
|
461
489
|
}
|
|
462
490
|
|
|
463
491
|
//#endregion
|
|
464
|
-
|
|
465
|
-
|
|
492
|
+
//#region ../dom/src/native.ts
|
|
493
|
+
/**
|
|
494
|
+
* Embed a native DOM element in the SemaJSX render tree.
|
|
495
|
+
*
|
|
496
|
+
* Useful for integrating third-party libraries that return real DOM elements
|
|
497
|
+
* (e.g., Lucide's createElement, D3 nodes, Canvas elements).
|
|
498
|
+
*
|
|
499
|
+
* Props (except `element`) are applied to the element using the same
|
|
500
|
+
* property-setting logic as regular JSX elements — supports class, style,
|
|
501
|
+
* event handlers, signals, and standard attributes.
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
* ```tsx
|
|
505
|
+
* import { Native } from "semajsx/dom";
|
|
506
|
+
* import { createElement, Rocket } from "lucide";
|
|
507
|
+
*
|
|
508
|
+
* const App = () => (
|
|
509
|
+
* <div>
|
|
510
|
+
* <Native element={createElement(Rocket)} stroke="#007aff" />
|
|
511
|
+
* </div>
|
|
512
|
+
* );
|
|
513
|
+
* ```
|
|
514
|
+
*/
|
|
515
|
+
function Native({ element, ...attrs }) {
|
|
516
|
+
return {
|
|
517
|
+
type: "#native",
|
|
518
|
+
props: {
|
|
519
|
+
__nativeNode: element,
|
|
520
|
+
...attrs
|
|
521
|
+
},
|
|
522
|
+
children: []
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
//#endregion
|
|
527
|
+
export { createTextNode as _, setAppStyleTarget as a, replaceNode as b, PortalComponent as c, setProperty as d, setRef as f, createElement as g, createComment as h, getStyleTarget as i, createPortal as l, appendChild as m, AppStyleAnchor as n, setComponentStyleTarget as o, setSignalProperty as p, ComponentStyleAnchor as r, ForwardComponent as s, Native as t, render as u, insertBefore as v, setText as x, removeChild as y };
|
|
528
|
+
//# sourceMappingURL=src-BqX3sryB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-BqX3sryB.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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"}
|