@rasenjs/html 0.1.2-alpha → 0.1.4-alpha

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/index.cjs CHANGED
@@ -207,14 +207,25 @@ function text(props) {
207
207
  return void 0;
208
208
  };
209
209
  }
210
+ function createMarker(type) {
211
+ return `<!-- ${type} -->`;
212
+ }
213
+
214
+ // src/components/fragment.ts
210
215
  var hostHooks = {
211
216
  createTextNode: (text2) => {
212
- return `<!-- t -->${escapeHtml(text2)}<!-- /t -->`;
217
+ return `${createMarker(core.MARKERS.TEXT_START)}${escapeHtml(text2)}${createMarker(core.MARKERS.TEXT_END)}`;
213
218
  },
214
219
  appendNode: (host, node) => host.append(node),
215
220
  updateTextNode: () => {
216
221
  },
217
222
  removeNode: () => {
223
+ },
224
+ createMarker: (_host, content) => {
225
+ return createMarker(content);
226
+ },
227
+ appendMarker: (host, marker) => host.append(marker),
228
+ removeMarker: () => {
218
229
  }
219
230
  };
220
231
  var fragment = (configOrStrings, ...values) => {
@@ -246,6 +257,167 @@ var fragment = (configOrStrings, ...values) => {
246
257
  };
247
258
  var f = fragment;
248
259
 
260
+ // src/host-hooks.ts
261
+ var whenHostHooks = {
262
+ createMarker: (_host, content) => {
263
+ return createMarker(content);
264
+ },
265
+ appendMarker: (host, marker) => {
266
+ host.append(marker);
267
+ },
268
+ insertBefore: (host, node, _before) => {
269
+ host.append(node);
270
+ },
271
+ removeNode: () => {
272
+ },
273
+ captureNode: (callback) => {
274
+ const capturedChunks = [];
275
+ const captureHost = {
276
+ fragments: capturedChunks,
277
+ append: (chunk) => {
278
+ capturedChunks.push(chunk);
279
+ },
280
+ toString: () => capturedChunks.join("")
281
+ };
282
+ const result = capturedChunks.join("");
283
+ callback(result);
284
+ return captureHost;
285
+ },
286
+ createFragment: () => {
287
+ const chunks = [];
288
+ return {
289
+ host: {
290
+ fragments: chunks,
291
+ append: (chunk) => chunks.push(chunk),
292
+ toString: () => chunks.join("")
293
+ },
294
+ flush: (host, _before) => {
295
+ const content = chunks.join("");
296
+ host.append(content);
297
+ host.append(createMarker("/w"));
298
+ }
299
+ };
300
+ },
301
+ removeMarker: () => {
302
+ }
303
+ };
304
+ var eachHostHooks = {
305
+ createMarker: (_host, content) => {
306
+ return createMarker(content);
307
+ },
308
+ appendMarker: (host, marker) => {
309
+ host.append(marker);
310
+ },
311
+ insertBefore: (host, node, _before) => {
312
+ host.append(node);
313
+ },
314
+ removeNode: () => {
315
+ },
316
+ captureNode: (callback) => {
317
+ const capturedChunks = [];
318
+ const captureHost = {
319
+ fragments: capturedChunks,
320
+ append: (chunk) => {
321
+ capturedChunks.push(chunk);
322
+ },
323
+ toString: () => capturedChunks.join("")
324
+ };
325
+ const result = capturedChunks.join("");
326
+ callback(result);
327
+ return captureHost;
328
+ },
329
+ createFragment: () => {
330
+ const chunks = [];
331
+ return {
332
+ host: {
333
+ fragments: chunks,
334
+ append: (chunk) => chunks.push(chunk),
335
+ toString: () => chunks.join("")
336
+ },
337
+ flush: (host, _before) => {
338
+ const content = chunks.join("");
339
+ host.append(content);
340
+ host.append(createMarker(core.MARKERS.EACH_END));
341
+ }
342
+ };
343
+ },
344
+ removeMarker: () => {
345
+ }
346
+ };
347
+ var matchHostHooks = {
348
+ createMarker: (_host, content) => {
349
+ return createMarker(content);
350
+ },
351
+ appendMarker: (host, marker) => {
352
+ host.append(marker);
353
+ },
354
+ insertBefore: (host, node, _before) => {
355
+ host.append(node);
356
+ },
357
+ removeNode: () => {
358
+ },
359
+ captureNode: (callback) => {
360
+ const capturedChunks = [];
361
+ const captureHost = {
362
+ fragments: capturedChunks,
363
+ append: (chunk) => {
364
+ capturedChunks.push(chunk);
365
+ },
366
+ toString: () => capturedChunks.join("")
367
+ };
368
+ const result = capturedChunks.join("");
369
+ callback(result);
370
+ return captureHost;
371
+ },
372
+ createFragment: () => {
373
+ const chunks = [];
374
+ return {
375
+ host: {
376
+ fragments: chunks,
377
+ append: (chunk) => chunks.push(chunk),
378
+ toString: () => chunks.join("")
379
+ },
380
+ flush: (host, _before) => {
381
+ const content = chunks.join("");
382
+ host.append(content);
383
+ host.append(createMarker(core.MARKERS.MATCH_END));
384
+ }
385
+ };
386
+ },
387
+ removeMarker: () => {
388
+ }
389
+ };
390
+
391
+ // src/components/when.ts
392
+ function when(config) {
393
+ return core.when({
394
+ ...config,
395
+ ...whenHostHooks
396
+ });
397
+ }
398
+ function each(items, render) {
399
+ const isRef = (v) => v !== null && typeof v === "object" && "value" in v;
400
+ return core.eachImpl({
401
+ items: typeof items === "function" ? items : isRef(items) ? () => items.value : () => items,
402
+ render,
403
+ ...eachHostHooks
404
+ });
405
+ }
406
+ function repeat(itemsOrCount, render) {
407
+ return core.repeatImpl({
408
+ items: itemsOrCount,
409
+ render,
410
+ ...eachHostHooks
411
+ });
412
+ }
413
+ function match(config) {
414
+ return core.match({
415
+ ...config,
416
+ ...matchHostHooks
417
+ });
418
+ }
419
+ var switchCase = match;
420
+
249
421
  // src/components/elements.ts
250
422
  function createElement(tag) {
251
423
  return (propsOrChild, ...restChildren) => {
@@ -438,6 +610,14 @@ var canvas = (props) => {
438
610
  });
439
611
  };
440
612
 
613
+ Object.defineProperty(exports, "MARKERS", {
614
+ enumerable: true,
615
+ get: function () { return core.MARKERS; }
616
+ });
617
+ Object.defineProperty(exports, "MARKER_DEBUG_MAP", {
618
+ enumerable: true,
619
+ get: function () { return core.MARKER_DEBUG_MAP; }
620
+ });
441
621
  exports.VOID_ELEMENTS = VOID_ELEMENTS;
442
622
  exports.a = a;
443
623
  exports.article = article;
@@ -448,9 +628,12 @@ exports.br = br;
448
628
  exports.button = button;
449
629
  exports.canvas = canvas;
450
630
  exports.code = code;
631
+ exports.createMarker = createMarker;
451
632
  exports.createStringHost = createStringHost;
452
633
  exports.del = del;
453
634
  exports.div = div;
635
+ exports.each = each;
636
+ exports.eachHostHooks = eachHostHooks;
454
637
  exports.element = element;
455
638
  exports.em = em;
456
639
  exports.escapeAttr = escapeAttr;
@@ -477,6 +660,8 @@ exports.label = label;
477
660
  exports.li = li;
478
661
  exports.main = main;
479
662
  exports.mark = mark;
663
+ exports.match = match;
664
+ exports.matchHostHooks = matchHostHooks;
480
665
  exports.nav = nav;
481
666
  exports.ol = ol;
482
667
  exports.option = option;
@@ -484,6 +669,7 @@ exports.p = p;
484
669
  exports.pre = pre;
485
670
  exports.renderToString = renderToString;
486
671
  exports.renderToStringMultiple = renderToStringMultiple;
672
+ exports.repeat = repeat;
487
673
  exports.section = section;
488
674
  exports.select = select;
489
675
  exports.small = small;
@@ -497,6 +683,7 @@ exports.strong = strong;
497
683
  exports.sub = sub;
498
684
  exports.sup = sup;
499
685
  exports.svg = svg;
686
+ exports.switchCase = switchCase;
500
687
  exports.table = table;
501
688
  exports.tbody = tbody;
502
689
  exports.td = td;
@@ -508,5 +695,7 @@ exports.thead = thead;
508
695
  exports.tr = tr;
509
696
  exports.ul = ul;
510
697
  exports.video = video;
698
+ exports.when = when;
699
+ exports.whenHostHooks = whenHostHooks;
511
700
  //# sourceMappingURL=index.cjs.map
512
701
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/components/string-context.ts","../src/utils.ts","../src/components/element.ts","../src/components/html.ts","../src/components/text.ts","../src/components/fragment.ts","../src/components/elements.ts"],"names":["html","text","unrefValue","getReactiveRuntime"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 字符串渲染器类型定义\n */\n\nimport type { Mountable } from '@rasenjs/core'\n\n/**\n * 字符串渲染宿主\n * 用于收集渲染结果\n */\nexport interface StringHost {\n /**\n * 收集的 HTML 片段\n */\n fragments: string[]\n\n /**\n * 添加 HTML 片段\n */\n append(html: string): void\n\n /**\n * 获取完整的 HTML 字符串\n */\n toString(): string\n}\n\n/**\n * 创建字符串宿主\n */\nexport function createStringHost(): StringHost {\n const fragments: string[] = []\n return {\n fragments,\n append(html: string) {\n fragments.push(html)\n },\n toString() {\n return fragments.join('')\n }\n }\n}\n\n/**\n * 字符串渲染的 Mountable 类型\n * @deprecated 使用 Mountable<StringHost> 替代\n */\nexport type StringMountFunction = Mountable<StringHost>\n","/**\n * htmlContext 组件 - 提供 HTML 渲染上下文\n */\nimport type { Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { createStringHost } from '../types'\n\n/**\n * 创建字符串渲染上下文\n */\nexport function stringContext(props: {\n children: Array<Mountable<StringHost>>\n}): Mountable<StringHost> {\n return (host: StringHost) => {\n const { children } = props\n\n // 挂载所有子组件\n for (const child of children) {\n child(host)\n }\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n\n/**\n * 将组件渲染为 HTML 字符串\n *\n * 这是 SSR 的主要入口\n */\nexport function renderToString(component: Mountable<StringHost>): string {\n const host = createStringHost()\n component(host)\n return host.toString()\n}\n\n/**\n * 将多个组件渲染为 HTML 字符串\n */\nexport function renderToStringMultiple(components: Mountable<StringHost>[]): string {\n const host = createStringHost()\n for (const component of components) {\n component(host)\n }\n return host.toString()\n}\n","/**\n * HTML 转义字符映射\n */\nconst HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n}\n\n/**\n * 转义 HTML 特殊字符,防止 XSS\n */\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] || char)\n}\n\n/**\n * 转义属性值\n */\nexport function escapeAttr(value: string): string {\n return value.replace(/[&<>\"]/g, (char) => HTML_ESCAPE_MAP[char] || char)\n}\n\n/**\n * 将属性值转换为字符串\n */\nexport function stringifyAttr(\n name: string,\n value: string | number | boolean | null | undefined\n): string {\n if (value === null || value === undefined || value === false) {\n return ''\n }\n if (value === true) {\n return ` ${name}`\n }\n return ` ${name}=\"${escapeAttr(String(value))}\"`\n}\n\n/**\n * 将样式对象转换为 style 属性字符串\n */\nexport function stringifyStyle(\n styles: Record<string, string | number | null | undefined>\n): string {\n const parts: string[] = []\n for (const [key, value] of Object.entries(styles)) {\n if (value !== null && value !== undefined) {\n // 将 camelCase 转换为 kebab-case\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n parts.push(`${kebabKey}: ${value}`)\n }\n }\n return parts.join('; ')\n}\n\n/**\n * 将类名数组或对象转换为 class 属性字符串\n */\nexport function stringifyClass(\n className: string | string[] | Record<string, boolean> | undefined\n): string {\n if (!className) {\n return ''\n }\n if (typeof className === 'string') {\n return className\n }\n if (Array.isArray(className)) {\n return className.filter(Boolean).join(' ')\n }\n // 对象形式 { 'class-name': true/false }\n return Object.entries(className)\n .filter(([, value]) => value)\n .map(([key]) => key)\n .join(' ')\n}\n\n/**\n * 自闭合标签列表\n */\nexport const VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n])\n\n/**\n * 判断是否为自闭合标签\n */\nexport function isVoidElement(tag: string): boolean {\n return VOID_ELEMENTS.has(tag.toLowerCase())\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport { unrefValue } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport {\n stringifyAttr,\n stringifyStyle,\n escapeHtml,\n isVoidElement\n} from '../utils'\n\n/**\n * element 组件 - 通用 HTML 元素组件(字符串版本)\n *\n * SSR 场景下不需要响应式更新,直接取值渲染\n */\nexport const element = (props: {\n tag: string\n id?: PropValue<string>\n className?: PropValue<string>\n style?: PropValue<Record<string, string | number>>\n attrs?: PropValue<Record<string, string | number | boolean>>\n /** Text content or child mount functions (including reactive text functions) */\n children?: PropValue<string> | Array<string | (() => string | number) | Mountable<StringHost>>\n value?: PropValue<string | number>\n // SSR does not need events - removed for consistency\n}): Mountable<StringHost> => {\n return (host: StringHost) => {\n const tag = props.tag\n const isVoid = isVoidElement(tag)\n\n // 构建开始标签\n let html = `<${tag}`\n\n // id\n const id = unrefValue(props.id)\n if (id) {\n html += stringifyAttr('id', id)\n }\n\n // className\n const className = unrefValue(props.className)\n if (className) {\n html += stringifyAttr('class', className)\n }\n\n // style\n const style = unrefValue(props.style)\n if (style && Object.keys(style).length > 0) {\n html += stringifyAttr('style', stringifyStyle(style))\n }\n\n // value (for input, textarea, select)\n const value = unrefValue(props.value)\n if (value !== undefined) {\n html += stringifyAttr('value', String(value))\n }\n\n // attrs (other attributes)\n const attrs = unrefValue(props.attrs)\n if (attrs) {\n for (const [key, val] of Object.entries(attrs)) {\n // 跳过无效的属性名(数字开头或纯数字)\n if (/^\\d/.test(key)) continue\n html += stringifyAttr(key, val)\n }\n }\n \n // 处理其他props(除了特殊props和已处理的)\n const specialProps = new Set(['tag', 'id', 'className', 'style', 'value', 'attrs', 'children', 'on'])\n for (const [key, val] of Object.entries(props)) {\n if (specialProps.has(key)) continue\n if (key.startsWith('on')) continue // 跳过事件处理器(SSR不需要)\n if (val === undefined || val === null) continue\n \n const attrValue = unrefValue(val as PropValue<unknown>)\n if (attrValue !== undefined && attrValue !== null) {\n // 只处理基本类型(string, number, boolean)\n if (typeof attrValue === 'string' || typeof attrValue === 'number' || typeof attrValue === 'boolean') {\n html += stringifyAttr(key, attrValue)\n }\n }\n }\n\n html += '>'\n\n // 自闭合标签不需要内容和结束标签\n if (isVoid) {\n host.append(html)\n return undefined\n }\n\n // children (text content or mount functions)\n const children = props.children\n if (children !== undefined) {\n if (typeof children === 'string' || (typeof children === 'object' && 'value' in (children as any))) {\n // String content (or ref to string)\n html += escapeHtml(String(unrefValue(children as PropValue<string>)))\n } else if (Array.isArray(children) && children.length > 0) {\n // Array of children - 创建子宿主收集子元素内容\n const childHost: StringHost = {\n fragments: [],\n append(s: string) {\n this.fragments.push(s)\n },\n toString() {\n return this.fragments.join('')\n }\n }\n\n for (const child of children) {\n if (child === null || child === undefined) continue\n \n if (typeof child === 'string') {\n // String child\n childHost.append(escapeHtml(child))\n } else if (typeof child === 'function') {\n // Function - could be Mountable or reactive text function\n // Call it with childHost and check the return value type\n const result = (child as any)(childHost)\n \n // If it returns string/number, it's a reactive text function that ignored our parameter\n if (typeof result === 'string' || typeof result === 'number') {\n childHost.append(escapeHtml(String(result)))\n }\n // Otherwise it's a Mountable, already executed correctly\n }\n }\n\n html += childHost.toString()\n }\n }\n\n // 结束标签\n html += `</${tag}>`\n\n host.append(html)\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport { unrefValue } from '@rasenjs/core'\nimport type { StringHost } from '../types'\n\n/**\n * html 组件 - 用于插入原始 HTML 内容(字符串版本)\n *\n * SSR 场景下不需要响应式更新,直接取值渲染。\n * 直接将 HTML 字符串输出,不创建额外的包裹元素。\n *\n * 安全提示:请确保传入的 HTML 内容是可信的,因为它会直接插入到输出中\n *\n * @example\n * ```ts\n * // 静态 HTML - 直接插入\n * div({}, html({ content: '<p>paragraph</p><span>text</span>' }))\n * // 结果: <div><p>paragraph</p><span>text</span></div>\n * ```\n */\nexport const html = (props: {\n /** 原始 HTML 内容 */\n content: PropValue<string>\n}): Mountable<StringHost> => {\n return (host: StringHost) => {\n const content = unrefValue(props.content) || ''\n // 直接输出 HTML 内容,不添加包裹元素\n host.append(content)\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n","/**\n * Text node component for HTML (SSR)\n * \n * Outputs escaped text content\n */\n\nimport type { Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { escapeHtml } from '../utils'\n\nexport interface TextProps {\n /** Text content - can be static string/number or reactive getter */\n content: string | number | (() => string | number)\n}\n\n/**\n * Create a text node for SSR\n * \n * @example\n * ```ts\n * // Static text\n * text({ content: 'Hello' })\n * \n * // Reactive text (evaluates immediately in SSR)\n * text({ content: () => count.value })\n * ```\n */\nexport function text(props: TextProps): Mountable<StringHost> {\n const { content } = props\n\n return (host: StringHost) => {\n // Resolve content\n const textContent = typeof content === 'function' \n ? String(content())\n : String(content)\n \n // Append escaped text\n host.append(escapeHtml(textContent))\n \n return undefined\n }\n}\n","/**\n * HTML fragment implementation for SSR\n */\nimport { getReactiveRuntime, type Mountable, type FragmentChild } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { escapeHtml } from '../utils'\n\n/**\n * HTML fragment uses empty comments as separators between text nodes\n * to preserve the same structure as client-side rendering for proper hydration\n */\nconst hostHooks = {\n createTextNode: (text: string) => {\n // Wrap each text piece with comment markers for hydration matching\n return `<!-- t -->${escapeHtml(text)}<!-- /t -->`\n },\n appendNode: (host: StringHost, node: string) => host.append(node),\n updateTextNode: () => {\n // SSR 中不需要更新文本节点\n },\n removeNode: () => {\n // SSR 中不需要移除节点\n }\n}\n\n/**\n * Fragment function interface for HTML/SSR\n */\ninterface FragmentFunction {\n (config: { children: Array<Mountable<StringHost>> }): Mountable<StringHost>\n (strings: TemplateStringsArray, ...values: FragmentChild<StringHost>[]): Mountable<StringHost>\n}\n\n/**\n * fragment - 组合多个子组件\n * \n * 注意:在 SSR 中,响应式值会被立即求值并转换为静态字符串\n * \n * @example\n * // 对象参数用法\n * fragment({ children: [child1, child2] })\n * \n * // Tagged template 用法\n * const count = ref(0)\n * fragment`Count: ${count} items` // SSR: 立即求值\n * \n * // 别名\n * f`Count: ${count} items`\n */\nexport const fragment: FragmentFunction = (\n configOrStrings: { children: Array<Mountable<StringHost>> } | TemplateStringsArray,\n ...values: FragmentChild<StringHost>[]\n): Mountable<StringHost> => {\n const runtime = getReactiveRuntime()\n \n // 检测是否是 tagged template 调用\n if (Array.isArray(configOrStrings) && 'raw' in configOrStrings) {\n const strings = configOrStrings as TemplateStringsArray\n \n // 直接生成 HTML 字符串而不是通过 core fragment\n // 这样可以避免每个片段都被包装,减少注释标记\n return (host: StringHost) => {\n let html = ''\n for (let i = 0; i < strings.length; i++) {\n if (strings[i]) {\n html += escapeHtml(strings[i])\n }\n if (i < values.length) {\n const value = values[i]\n // Check if it's a ref\n if (runtime.isRef(value)) {\n html += escapeHtml(String((value as any).value))\n } else if (typeof value === 'string' || typeof value === 'number') {\n html += escapeHtml(String(value))\n }\n // Mountables not supported in template strings for SSR\n }\n }\n host.append(html)\n return undefined\n }\n }\n \n // For object config, import core fragment\n const { fragment: coreFragment } = require('@rasenjs/core')\n const config = configOrStrings as { children: Array<Mountable<StringHost>> }\n return coreFragment({ children: config.children, hooks: hostHooks })\n}\n\n/**\n * f - fragment 的简写别名\n */\nexport const f = fragment\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { element } from './element'\n\n// ============================================================================\n// Type definitions\n// ============================================================================\n\ninterface BaseProps {\n id?: PropValue<string>\n class?: PropValue<string>\n className?: PropValue<string>\n style?: PropValue<Record<string, string | number>>\n attrs?: PropValue<Record<string, string | number | boolean>>\n /** Text content or child mount functions */\n children?: PropValue<string> | Array<string | (() => string | number) | Mountable<StringHost>>\n // SSR does not support events - removed on, onClick, onInput, etc.\n}\n\n/** Child type - 响应式文本函数优先匹配 */\ntype Child = string | (() => string | number) | Mountable<StringHost>\n\n/**\n * Factory function to create HTML element components\n * Supports: el(), el('text'), el(child), el(props), el(props, ...children)\n */\nfunction createElement(tag: string) {\n return (\n propsOrChild?: BaseProps | Child,\n ...restChildren: Child[]\n ): Mountable<StringHost> => {\n // No arguments\n if (propsOrChild === undefined) {\n return element({ tag })\n }\n\n // First argument is string or function (Mountable or reactive text), treat as child\n if (\n typeof propsOrChild === 'string' ||\n typeof propsOrChild === 'function'\n ) {\n const children = [propsOrChild, ...restChildren]\n return element({ tag, children })\n }\n \n // First argument is props object\n const props = propsOrChild as BaseProps\n \n // Normalize props: convert `class` to `className` for element()\n const { class: cls, className, ...restProps } = props as any\n const normalizedProps = {\n ...restProps,\n className: className || cls\n }\n \n if (restChildren.length > 0) {\n // Merge children\n const existingChildren = props.children\n const children = Array.isArray(existingChildren)\n ? [...existingChildren, ...restChildren]\n : existingChildren !== undefined\n ? [existingChildren, ...restChildren]\n : restChildren\n \n return element({ tag, ...normalizedProps, children })\n }\n\n return element({ tag, ...normalizedProps })\n }\n}\n\n// ============================================================================\n// Common elements\n// ============================================================================\n\nexport const div = createElement('div')\nexport const span = createElement('span')\nexport const button = createElement('button')\nexport const a = createElement('a')\nexport const p = createElement('p')\n\n// Headings\nexport const h1 = createElement('h1')\nexport const h2 = createElement('h2')\nexport const h3 = createElement('h3')\nexport const h4 = createElement('h4')\nexport const h5 = createElement('h5')\nexport const h6 = createElement('h6')\n\n// Lists\nexport const ul = createElement('ul')\nexport const ol = createElement('ol')\nexport const li = createElement('li')\n\n// Forms\nexport const form = createElement('form')\nexport const label = createElement('label')\nexport const select = createElement('select')\n\n// Tables\nexport const table = createElement('table')\nexport const thead = createElement('thead')\nexport const tbody = createElement('tbody')\nexport const tfoot = createElement('tfoot')\nexport const tr = createElement('tr')\nexport const th = createElement('th')\nexport const td = createElement('td')\n\n// Semantic layout\nexport const section = createElement('section')\nexport const article = createElement('article')\nexport const header = createElement('header')\nexport const footer = createElement('footer')\nexport const nav = createElement('nav')\nexport const main = createElement('main')\nexport const aside = createElement('aside')\n\n// Other common elements\nexport const pre = createElement('pre')\nexport const code = createElement('code')\nexport const blockquote = createElement('blockquote')\nexport const strong = createElement('strong')\nexport const em = createElement('em')\nexport const small = createElement('small')\nexport const mark = createElement('mark')\nexport const del = createElement('del')\nexport const ins = createElement('ins')\nexport const sub = createElement('sub')\nexport const sup = createElement('sup')\nexport const svg = createElement('svg')\n\n// Self-closing elements\nexport const br = () => element({ tag: 'br' })\nexport const hr = () => element({ tag: 'hr' })\n\n// ============================================================================\n// Special elements with extended props\n// ============================================================================\n\n/**\n * input component\n */\nexport const input = (\n props: BaseProps & {\n type?: PropValue<string>\n value?: PropValue<string | any>\n placeholder?: PropValue<string>\n disabled?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { type, value, placeholder, disabled, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(type !== undefined ? { type } : {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(disabled !== undefined ? { disabled } : {})\n }\n\n return element({\n tag: 'input',\n ...restProps,\n attrs: newAttrs as any,\n ...(value !== undefined ? { value } : {})\n })\n}\n\n/**\n * img component\n */\nexport const img = (props: BaseProps & {\n src?: PropValue<string>\n alt?: PropValue<string>\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n}): Mountable<StringHost> => {\n return element({ tag: 'img', ...props })\n}\n\n/**\n * textarea component\n */\nexport const textarea = (\n props: BaseProps & {\n value?: PropValue<string>\n placeholder?: PropValue<string>\n disabled?: PropValue<boolean>\n rows?: PropValue<number>\n cols?: PropValue<number>\n }\n): Mountable<StringHost> => {\n const { value, placeholder, disabled, rows, cols, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(rows !== undefined ? { rows } : {}),\n ...(cols !== undefined ? { cols } : {})\n }\n\n // textarea value should be children (text content)\n return element({\n tag: 'textarea',\n ...restProps,\n attrs: newAttrs as any,\n ...(value !== undefined ? { children: String(value) } : {})\n })\n}\n\n/**\n * option component\n */\nexport const option = (\n props: BaseProps & {\n value?: PropValue<string | number>\n selected?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { value, selected, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(value !== undefined ? { value } : {}),\n ...(selected ? { selected: true } : {})\n }\n\n return element({\n tag: 'option',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * video component\n */\nexport const video = (\n props: BaseProps & {\n src?: PropValue<string>\n poster?: PropValue<string>\n controls?: PropValue<boolean>\n autoplay?: PropValue<boolean>\n loop?: PropValue<boolean>\n muted?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, poster, controls, autoplay, loop, muted, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(poster !== undefined ? { poster } : {}),\n ...(controls ? { controls: true } : {}),\n ...(autoplay ? { autoplay: true } : {}),\n ...(loop ? { loop: true } : {}),\n ...(muted ? { muted: true } : {})\n }\n\n return element({\n tag: 'video',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * audio component\n */\nexport const audio = (\n props: BaseProps & {\n src?: PropValue<string>\n controls?: PropValue<boolean>\n autoplay?: PropValue<boolean>\n loop?: PropValue<boolean>\n muted?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, controls, autoplay, loop, muted, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(controls ? { controls: true } : {}),\n ...(autoplay ? { autoplay: true } : {}),\n ...(loop ? { loop: true } : {}),\n ...(muted ? { muted: true } : {})\n }\n\n return element({\n tag: 'audio',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * source component\n */\nexport const source = (\n props: BaseProps & {\n src?: PropValue<string>\n type?: PropValue<string>\n }\n): Mountable<StringHost> => {\n const { src, type, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(type !== undefined ? { type } : {})\n }\n\n return element({\n tag: 'source',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * iframe component\n */\nexport const iframe = (\n props: BaseProps & {\n src?: PropValue<string>\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n frameborder?: PropValue<string | number>\n allowfullscreen?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, width, height, frameborder, allowfullscreen, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {}),\n ...(frameborder !== undefined ? { frameborder } : {}),\n ...(allowfullscreen ? { allowfullscreen: true } : {})\n }\n\n return element({\n tag: 'iframe',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * canvas component (SSR only renders empty canvas tag)\n */\nexport const canvas = (\n props: BaseProps & {\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n }\n): Mountable<StringHost> => {\n const { width, height, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {})\n }\n\n return element({\n tag: 'canvas',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/components/string-context.ts","../src/utils.ts","../src/components/element.ts","../src/components/html.ts","../src/components/text.ts","../src/marker-constants.ts","../src/components/fragment.ts","../src/host-hooks.ts","../src/components/when.ts","../src/components/each.ts","../src/components/match.ts","../src/components/elements.ts"],"names":["html","text","unrefValue","MARKERS","getReactiveRuntime","coreWhen","eachImpl","repeatImpl","coreMatch"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 字符串渲染器类型定义\n */\n\nimport type { Mountable } from '@rasenjs/core'\n\n/**\n * 字符串渲染宿主\n * 用于收集渲染结果\n */\nexport interface StringHost {\n /**\n * 收集的 HTML 片段\n */\n fragments: string[]\n\n /**\n * 添加 HTML 片段\n */\n append(html: string): void\n\n /**\n * 获取完整的 HTML 字符串\n */\n toString(): string\n}\n\n/**\n * 创建字符串宿主\n */\nexport function createStringHost(): StringHost {\n const fragments: string[] = []\n return {\n fragments,\n append(html: string) {\n fragments.push(html)\n },\n toString() {\n return fragments.join('')\n }\n }\n}\n\n/**\n * 字符串渲染的 Mountable 类型\n * @deprecated 使用 Mountable<StringHost> 替代\n */\nexport type StringMountFunction = Mountable<StringHost>\n","/**\n * htmlContext 组件 - 提供 HTML 渲染上下文\n */\nimport type { Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { createStringHost } from '../types'\n\n/**\n * 创建字符串渲染上下文\n */\nexport function stringContext(props: {\n children: Array<Mountable<StringHost>>\n}): Mountable<StringHost> {\n return (host: StringHost) => {\n const { children } = props\n\n // 挂载所有子组件\n for (const child of children) {\n child(host)\n }\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n\n/**\n * 将组件渲染为 HTML 字符串\n *\n * 这是 SSR 的主要入口\n */\nexport function renderToString(component: Mountable<StringHost>): string {\n const host = createStringHost()\n component(host)\n return host.toString()\n}\n\n/**\n * 将多个组件渲染为 HTML 字符串\n */\nexport function renderToStringMultiple(components: Mountable<StringHost>[]): string {\n const host = createStringHost()\n for (const component of components) {\n component(host)\n }\n return host.toString()\n}\n","/**\n * HTML 转义字符映射\n */\nconst HTML_ESCAPE_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;'\n}\n\n/**\n * 转义 HTML 特殊字符,防止 XSS\n */\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => HTML_ESCAPE_MAP[char] || char)\n}\n\n/**\n * 转义属性值\n */\nexport function escapeAttr(value: string): string {\n return value.replace(/[&<>\"]/g, (char) => HTML_ESCAPE_MAP[char] || char)\n}\n\n/**\n * 将属性值转换为字符串\n */\nexport function stringifyAttr(\n name: string,\n value: string | number | boolean | null | undefined\n): string {\n if (value === null || value === undefined || value === false) {\n return ''\n }\n if (value === true) {\n return ` ${name}`\n }\n return ` ${name}=\"${escapeAttr(String(value))}\"`\n}\n\n/**\n * 将样式对象转换为 style 属性字符串\n */\nexport function stringifyStyle(\n styles: Record<string, string | number | null | undefined>\n): string {\n const parts: string[] = []\n for (const [key, value] of Object.entries(styles)) {\n if (value !== null && value !== undefined) {\n // 将 camelCase 转换为 kebab-case\n const kebabKey = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n parts.push(`${kebabKey}: ${value}`)\n }\n }\n return parts.join('; ')\n}\n\n/**\n * 将类名数组或对象转换为 class 属性字符串\n */\nexport function stringifyClass(\n className: string | string[] | Record<string, boolean> | undefined\n): string {\n if (!className) {\n return ''\n }\n if (typeof className === 'string') {\n return className\n }\n if (Array.isArray(className)) {\n return className.filter(Boolean).join(' ')\n }\n // 对象形式 { 'class-name': true/false }\n return Object.entries(className)\n .filter(([, value]) => value)\n .map(([key]) => key)\n .join(' ')\n}\n\n/**\n * 自闭合标签列表\n */\nexport const VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n])\n\n/**\n * 判断是否为自闭合标签\n */\nexport function isVoidElement(tag: string): boolean {\n return VOID_ELEMENTS.has(tag.toLowerCase())\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport { unrefValue } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport {\n stringifyAttr,\n stringifyStyle,\n escapeHtml,\n isVoidElement\n} from '../utils'\n\n/**\n * element 组件 - 通用 HTML 元素组件(字符串版本)\n *\n * SSR 场景下不需要响应式更新,直接取值渲染\n */\nexport const element = (props: {\n tag: string\n id?: PropValue<string>\n className?: PropValue<string>\n style?: PropValue<Record<string, string | number>>\n attrs?: PropValue<Record<string, string | number | boolean>>\n /** Text content or child mount functions (including reactive text functions) */\n children?: PropValue<string> | Array<string | (() => string | number) | Mountable<StringHost>>\n value?: PropValue<string | number>\n // SSR does not need events - removed for consistency\n}): Mountable<StringHost> => {\n return (host: StringHost) => {\n const tag = props.tag\n const isVoid = isVoidElement(tag)\n\n // 构建开始标签\n let html = `<${tag}`\n\n // id\n const id = unrefValue(props.id)\n if (id) {\n html += stringifyAttr('id', id)\n }\n\n // className\n const className = unrefValue(props.className)\n if (className) {\n html += stringifyAttr('class', className)\n }\n\n // style\n const style = unrefValue(props.style)\n if (style && Object.keys(style).length > 0) {\n html += stringifyAttr('style', stringifyStyle(style))\n }\n\n // value (for input, textarea, select)\n const value = unrefValue(props.value)\n if (value !== undefined) {\n html += stringifyAttr('value', String(value))\n }\n\n // attrs (other attributes)\n const attrs = unrefValue(props.attrs)\n if (attrs) {\n for (const [key, val] of Object.entries(attrs)) {\n // 跳过无效的属性名(数字开头或纯数字)\n if (/^\\d/.test(key)) continue\n html += stringifyAttr(key, val)\n }\n }\n \n // 处理其他props(除了特殊props和已处理的)\n const specialProps = new Set(['tag', 'id', 'className', 'style', 'value', 'attrs', 'children', 'on'])\n for (const [key, val] of Object.entries(props)) {\n if (specialProps.has(key)) continue\n if (key.startsWith('on')) continue // 跳过事件处理器(SSR不需要)\n if (val === undefined || val === null) continue\n \n const attrValue = unrefValue(val as PropValue<unknown>)\n if (attrValue !== undefined && attrValue !== null) {\n // 只处理基本类型(string, number, boolean)\n if (typeof attrValue === 'string' || typeof attrValue === 'number' || typeof attrValue === 'boolean') {\n html += stringifyAttr(key, attrValue)\n }\n }\n }\n\n html += '>'\n\n // 自闭合标签不需要内容和结束标签\n if (isVoid) {\n host.append(html)\n return undefined\n }\n\n // children (text content or mount functions)\n const children = props.children\n if (children !== undefined) {\n if (typeof children === 'string' || (typeof children === 'object' && 'value' in (children as any))) {\n // String content (or ref to string)\n html += escapeHtml(String(unrefValue(children as PropValue<string>)))\n } else if (Array.isArray(children) && children.length > 0) {\n // Array of children - 创建子宿主收集子元素内容\n const childHost: StringHost = {\n fragments: [],\n append(s: string) {\n this.fragments.push(s)\n },\n toString() {\n return this.fragments.join('')\n }\n }\n\n for (const child of children) {\n if (child === null || child === undefined) continue\n \n if (typeof child === 'string') {\n // String child\n childHost.append(escapeHtml(child))\n } else if (typeof child === 'function') {\n // Function - could be Mountable or reactive text function\n // Call it with childHost and check the return value type\n const result = (child as any)(childHost)\n \n // If it returns string/number, it's a reactive text function that ignored our parameter\n if (typeof result === 'string' || typeof result === 'number') {\n childHost.append(escapeHtml(String(result)))\n }\n // Otherwise it's a Mountable, already executed correctly\n }\n }\n\n html += childHost.toString()\n }\n }\n\n // 结束标签\n html += `</${tag}>`\n\n host.append(html)\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport { unrefValue } from '@rasenjs/core'\nimport type { StringHost } from '../types'\n\n/**\n * html 组件 - 用于插入原始 HTML 内容(字符串版本)\n *\n * SSR 场景下不需要响应式更新,直接取值渲染。\n * 直接将 HTML 字符串输出,不创建额外的包裹元素。\n *\n * 安全提示:请确保传入的 HTML 内容是可信的,因为它会直接插入到输出中\n *\n * @example\n * ```ts\n * // 静态 HTML - 直接插入\n * div({}, html({ content: '<p>paragraph</p><span>text</span>' }))\n * // 结果: <div><p>paragraph</p><span>text</span></div>\n * ```\n */\nexport const html = (props: {\n /** 原始 HTML 内容 */\n content: PropValue<string>\n}): Mountable<StringHost> => {\n return (host: StringHost) => {\n const content = unrefValue(props.content) || ''\n // 直接输出 HTML 内容,不添加包裹元素\n host.append(content)\n\n // SSR 不需要 unmount\n return undefined\n }\n}\n","/**\n * Text node component for HTML (SSR)\n * \n * Outputs escaped text content\n */\n\nimport type { Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { escapeHtml } from '../utils'\n\nexport interface TextProps {\n /** Text content - can be static string/number or reactive getter */\n content: string | number | (() => string | number)\n}\n\n/**\n * Create a text node for SSR\n * \n * @example\n * ```ts\n * // Static text\n * text({ content: 'Hello' })\n * \n * // Reactive text (evaluates immediately in SSR)\n * text({ content: () => count.value })\n * ```\n */\nexport function text(props: TextProps): Mountable<StringHost> {\n const { content } = props\n\n return (host: StringHost) => {\n // Resolve content\n const textContent = typeof content === 'function' \n ? String(content())\n : String(content)\n \n // Append escaped text\n host.append(escapeHtml(textContent))\n \n return undefined\n }\n}\n","/**\n * HTML/SSR-specific marker utilities\n * \n * Re-exports marker constants from @rasenjs/core and provides\n * HTML-specific helper functions for generating comment markers.\n */\nexport { MARKERS, MARKER_DEBUG_MAP, type MarkerType } from '@rasenjs/core'\n\n/**\n * Create an HTML comment marker\n * @example\n * createMarker(MARKERS.FRAGMENT_START) // <!-- f -->\n * createMarker(MARKERS.WHEN_END) // <!-- /w -->\n */\nexport function createMarker(type: string): string {\n return `<!-- ${type} -->`\n}\n\n","/**\n * HTML fragment implementation for SSR\n */\nimport { getReactiveRuntime, type Mountable, type FragmentChild } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { escapeHtml } from '../utils'\nimport { MARKERS, createMarker } from '../marker-constants'\n\n/**\n * HTML fragment uses comment markers to preserve boundaries for hydration\n * Following the same pattern as text nodes: <!-- f --> and <!-- /f -->\n */\nconst hostHooks = {\n createTextNode: (text: string) => {\n // Wrap each text piece with comment markers for hydration matching\n return `${createMarker(MARKERS.TEXT_START)}${escapeHtml(text)}${createMarker(MARKERS.TEXT_END)}`\n },\n appendNode: (host: StringHost, node: string) => host.append(node),\n updateTextNode: () => {\n // SSR 中不需要更新文本节点\n },\n removeNode: () => {\n // SSR 中不需要移除节点\n },\n createMarker: (_host: StringHost, content: string) => {\n return createMarker(content)\n },\n appendMarker: (host: StringHost, marker: string) => host.append(marker),\n removeMarker: () => {\n // SSR 中不需要移除标记\n }\n}\n\n/**\n * Fragment function interface for HTML/SSR\n */\ninterface FragmentFunction {\n (config: { children: Array<Mountable<StringHost>> }): Mountable<StringHost>\n (strings: TemplateStringsArray, ...values: FragmentChild<StringHost>[]): Mountable<StringHost>\n}\n\n/**\n * fragment - 组合多个子组件\n * \n * 注意:在 SSR 中,响应式值会被立即求值并转换为静态字符串\n * \n * @example\n * // 对象参数用法\n * fragment({ children: [child1, child2] })\n * \n * // Tagged template 用法\n * const count = ref(0)\n * fragment`Count: ${count} items` // SSR: 立即求值\n * \n * // 别名\n * f`Count: ${count} items`\n */\nexport const fragment: FragmentFunction = (\n configOrStrings: { children: Array<Mountable<StringHost>> } | TemplateStringsArray,\n ...values: FragmentChild<StringHost>[]\n): Mountable<StringHost> => {\n const runtime = getReactiveRuntime()\n \n // 检测是否是 tagged template 调用\n if (Array.isArray(configOrStrings) && 'raw' in configOrStrings) {\n const strings = configOrStrings as TemplateStringsArray\n \n // 直接生成 HTML 字符串而不是通过 core fragment\n // 这样可以避免每个片段都被包装,减少注释标记\n return (host: StringHost) => {\n let html = ''\n for (let i = 0; i < strings.length; i++) {\n if (strings[i]) {\n html += escapeHtml(strings[i])\n }\n if (i < values.length) {\n const value = values[i]\n // Check if it's a ref\n if (runtime.isRef(value)) {\n html += escapeHtml(String((value as any).value))\n } else if (typeof value === 'string' || typeof value === 'number') {\n html += escapeHtml(String(value))\n }\n // Mountables not supported in template strings for SSR\n }\n }\n host.append(html)\n return undefined\n }\n }\n \n // For object config, import core fragment\n const { fragment: coreFragment } = require('@rasenjs/core')\n const config = configOrStrings as { children: Array<Mountable<StringHost>> }\n return coreFragment({ children: config.children, hooks: hostHooks })\n}\n\n/**\n * f - fragment 的简写别名\n */\nexport const f = fragment\n","/**\n * Host hooks for control flow components (when/each/switch) in SSR\n */\nimport type { StringHost } from './types'\nimport { MARKERS, createMarker } from './marker-constants'\n\n/**\n * Host hooks for When component\n */\nexport const whenHostHooks = {\n createMarker: (_host: StringHost, content: string) => {\n return createMarker(content)\n },\n appendMarker: (host: StringHost, marker: string) => {\n host.append(marker)\n },\n insertBefore: (host: StringHost, node: string, _before: string | null) => {\n // In SSR, we just append; there's no concept of \"insert before\"\n host.append(node)\n },\n removeNode: () => {\n // SSR doesn't need to remove nodes\n },\n captureNode: (callback: (node: string) => void) => {\n const capturedChunks: string[] = []\n const captureHost: StringHost = {\n fragments: capturedChunks,\n append: (chunk: string) => {\n capturedChunks.push(chunk)\n },\n toString: () => capturedChunks.join('')\n }\n \n // Capture all appended content\n const result = capturedChunks.join('')\n callback(result)\n \n return captureHost\n },\n createFragment: () => {\n const chunks: string[] = []\n return {\n host: {\n fragments: chunks,\n append: (chunk: string) => chunks.push(chunk),\n toString: () => chunks.join('')\n } as StringHost,\n flush: (host: StringHost, _before: string | null) => {\n const content = chunks.join('')\n host.append(content)\n host.append(createMarker('/w'))\n }\n }\n },\n removeMarker: () => {\n // SSR doesn't need to remove markers\n }\n}\n\n/**\n * Host hooks for Each component\n */\nexport const eachHostHooks = {\n createMarker: (_host: StringHost, content: string) => {\n return createMarker(content)\n },\n appendMarker: (host: StringHost, marker: string) => {\n host.append(marker)\n },\n insertBefore: (host: StringHost, node: string, _before: string | null) => {\n host.append(node)\n },\n removeNode: () => {},\n captureNode: (callback: (node: string) => void) => {\n const capturedChunks: string[] = []\n const captureHost: StringHost = {\n fragments: capturedChunks,\n append: (chunk: string) => {\n capturedChunks.push(chunk)\n },\n toString: () => capturedChunks.join('')\n }\n \n const result = capturedChunks.join('')\n callback(result)\n \n return captureHost\n },\n createFragment: () => {\n const chunks: string[] = []\n return {\n host: {\n fragments: chunks,\n append: (chunk: string) => chunks.push(chunk),\n toString: () => chunks.join('')\n } as StringHost,\n flush: (host: StringHost, _before: string | null) => {\n const content = chunks.join('')\n host.append(content)\n host.append(createMarker(MARKERS.EACH_END))\n }\n }\n },\n removeMarker: () => {}\n}\n\n/**\n * Host hooks for Match component\n */\nexport const matchHostHooks = {\n createMarker: (_host: StringHost, content: string) => {\n return createMarker(content)\n },\n appendMarker: (host: StringHost, marker: string) => {\n host.append(marker)\n },\n insertBefore: (host: StringHost, node: string, _before: string | null) => {\n host.append(node)\n },\n removeNode: () => {},\n captureNode: (callback: (node: string) => void) => {\n const capturedChunks: string[] = []\n const captureHost: StringHost = {\n fragments: capturedChunks,\n append: (chunk: string) => {\n capturedChunks.push(chunk)\n },\n toString: () => capturedChunks.join('')\n }\n \n const result = capturedChunks.join('')\n callback(result)\n \n return captureHost\n },\n createFragment: () => {\n const chunks: string[] = []\n return {\n host: {\n fragments: chunks,\n append: (chunk: string) => chunks.push(chunk),\n toString: () => chunks.join('')\n } as StringHost,\n flush: (host: StringHost, _before: string | null) => {\n const content = chunks.join('')\n host.append(content)\n host.append(createMarker(MARKERS.MATCH_END))\n }\n }\n },\n removeMarker: () => {}\n}\n","/**\n * HTML when component for SSR\n */\nimport { when as coreWhen, type WhenConfig, type Mountable } from '@rasenjs/core'\nimport { whenHostHooks } from '../host-hooks'\nimport type { StringHost } from '../types'\n\n/**\n * when - conditional rendering for SSR\n */\nexport function when<Host extends StringHost = StringHost>(\n config: Omit<WhenConfig<Host>, keyof typeof whenHostHooks>\n): Mountable<Host> {\n return coreWhen({\n ...config,\n ...whenHostHooks\n } as any)\n}\n","/**\n * HTML each/repeat components for SSR\n */\nimport { eachImpl, repeatImpl, type Mountable, type Ref } from '@rasenjs/core'\nimport { eachHostHooks } from '../host-hooks'\nimport type { StringHost } from '../types'\n\n/**\n * each - object list rendering for SSR\n */\nexport function each<T extends object>(\n items: T[] | Ref<T[]> | (() => T[]),\n render: (item: T, index: number) => Mountable<StringHost>\n): Mountable<StringHost> {\n // Determine if it's a Ref (has value property)\n const isRef = (v: unknown): v is Ref<T[]> =>\n v !== null && typeof v === 'object' && 'value' in v\n\n return eachImpl<T, StringHost, string>({\n items:\n typeof items === 'function'\n ? items\n : isRef(items)\n ? () => items.value\n : () => items,\n render,\n ...eachHostHooks\n })\n}\n\n/**\n * repeat - value list or count rendering for SSR\n */\nexport function repeat<T = any>(\n itemsOrCount: Ref<T[]> | (() => T[] | number) | Ref<number> | (() => number),\n render: ((item: T, index: number) => Mountable<StringHost>) | ((index: number) => Mountable<StringHost>)\n): Mountable<StringHost> {\n return repeatImpl<T, StringHost, string>({\n items: itemsOrCount as () => T[],\n render: render as (item: T, index: number) => Mountable<StringHost>,\n ...eachHostHooks\n })\n}\n","/**\n * HTML match component for SSR\n */\nimport { match as coreMatch, type MatchConfig, type Mountable } from '@rasenjs/core'\nimport { matchHostHooks } from '../host-hooks'\nimport type { StringHost } from '../types'\n\n/**\n * match - multi-branch conditional rendering for SSR\n */\nexport function match<K extends string = string>(\n config: Omit<MatchConfig<StringHost, K>, keyof typeof matchHostHooks>\n): Mountable<StringHost> {\n return coreMatch({\n ...config,\n ...matchHostHooks\n })\n}\n\n/**\n * @deprecated Use `match` instead. Will be removed in future versions.\n */\nexport const switchCase = match\n","import type { PropValue, Mountable } from '@rasenjs/core'\nimport type { StringHost } from '../types'\nimport { element } from './element'\n\n// ============================================================================\n// Type definitions\n// ============================================================================\n\ninterface BaseProps {\n id?: PropValue<string>\n class?: PropValue<string>\n className?: PropValue<string>\n style?: PropValue<Record<string, string | number>>\n attrs?: PropValue<Record<string, string | number | boolean>>\n /** Text content or child mount functions */\n children?: PropValue<string> | Array<string | (() => string | number) | Mountable<StringHost>>\n // SSR does not support events - removed on, onClick, onInput, etc.\n}\n\n/** Child type - 响应式文本函数优先匹配 */\ntype Child = string | (() => string | number) | Mountable<StringHost>\n\n/**\n * Factory function to create HTML element components\n * Supports: el(), el('text'), el(child), el(props), el(props, ...children)\n */\nfunction createElement(tag: string) {\n return (\n propsOrChild?: BaseProps | Child,\n ...restChildren: Child[]\n ): Mountable<StringHost> => {\n // No arguments\n if (propsOrChild === undefined) {\n return element({ tag })\n }\n\n // First argument is string or function (Mountable or reactive text), treat as child\n if (\n typeof propsOrChild === 'string' ||\n typeof propsOrChild === 'function'\n ) {\n const children = [propsOrChild, ...restChildren]\n return element({ tag, children })\n }\n \n // First argument is props object\n const props = propsOrChild as BaseProps\n \n // Normalize props: convert `class` to `className` for element()\n const { class: cls, className, ...restProps } = props as any\n const normalizedProps = {\n ...restProps,\n className: className || cls\n }\n \n if (restChildren.length > 0) {\n // Merge children\n const existingChildren = props.children\n const children = Array.isArray(existingChildren)\n ? [...existingChildren, ...restChildren]\n : existingChildren !== undefined\n ? [existingChildren, ...restChildren]\n : restChildren\n \n return element({ tag, ...normalizedProps, children })\n }\n\n return element({ tag, ...normalizedProps })\n }\n}\n\n// ============================================================================\n// Common elements\n// ============================================================================\n\nexport const div = createElement('div')\nexport const span = createElement('span')\nexport const button = createElement('button')\nexport const a = createElement('a')\nexport const p = createElement('p')\n\n// Headings\nexport const h1 = createElement('h1')\nexport const h2 = createElement('h2')\nexport const h3 = createElement('h3')\nexport const h4 = createElement('h4')\nexport const h5 = createElement('h5')\nexport const h6 = createElement('h6')\n\n// Lists\nexport const ul = createElement('ul')\nexport const ol = createElement('ol')\nexport const li = createElement('li')\n\n// Forms\nexport const form = createElement('form')\nexport const label = createElement('label')\nexport const select = createElement('select')\n\n// Tables\nexport const table = createElement('table')\nexport const thead = createElement('thead')\nexport const tbody = createElement('tbody')\nexport const tfoot = createElement('tfoot')\nexport const tr = createElement('tr')\nexport const th = createElement('th')\nexport const td = createElement('td')\n\n// Semantic layout\nexport const section = createElement('section')\nexport const article = createElement('article')\nexport const header = createElement('header')\nexport const footer = createElement('footer')\nexport const nav = createElement('nav')\nexport const main = createElement('main')\nexport const aside = createElement('aside')\n\n// Other common elements\nexport const pre = createElement('pre')\nexport const code = createElement('code')\nexport const blockquote = createElement('blockquote')\nexport const strong = createElement('strong')\nexport const em = createElement('em')\nexport const small = createElement('small')\nexport const mark = createElement('mark')\nexport const del = createElement('del')\nexport const ins = createElement('ins')\nexport const sub = createElement('sub')\nexport const sup = createElement('sup')\nexport const svg = createElement('svg')\n\n// Self-closing elements\nexport const br = () => element({ tag: 'br' })\nexport const hr = () => element({ tag: 'hr' })\n\n// ============================================================================\n// Special elements with extended props\n// ============================================================================\n\n/**\n * input component\n */\nexport const input = (\n props: BaseProps & {\n type?: PropValue<string>\n value?: PropValue<string | any>\n placeholder?: PropValue<string>\n disabled?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { type, value, placeholder, disabled, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(type !== undefined ? { type } : {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(disabled !== undefined ? { disabled } : {})\n }\n\n return element({\n tag: 'input',\n ...restProps,\n attrs: newAttrs as any,\n ...(value !== undefined ? { value } : {})\n })\n}\n\n/**\n * img component\n */\nexport const img = (props: BaseProps & {\n src?: PropValue<string>\n alt?: PropValue<string>\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n}): Mountable<StringHost> => {\n return element({ tag: 'img', ...props })\n}\n\n/**\n * textarea component\n */\nexport const textarea = (\n props: BaseProps & {\n value?: PropValue<string>\n placeholder?: PropValue<string>\n disabled?: PropValue<boolean>\n rows?: PropValue<number>\n cols?: PropValue<number>\n }\n): Mountable<StringHost> => {\n const { value, placeholder, disabled, rows, cols, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(placeholder !== undefined ? { placeholder } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(rows !== undefined ? { rows } : {}),\n ...(cols !== undefined ? { cols } : {})\n }\n\n // textarea value should be children (text content)\n return element({\n tag: 'textarea',\n ...restProps,\n attrs: newAttrs as any,\n ...(value !== undefined ? { children: String(value) } : {})\n })\n}\n\n/**\n * option component\n */\nexport const option = (\n props: BaseProps & {\n value?: PropValue<string | number>\n selected?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { value, selected, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(value !== undefined ? { value } : {}),\n ...(selected ? { selected: true } : {})\n }\n\n return element({\n tag: 'option',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * video component\n */\nexport const video = (\n props: BaseProps & {\n src?: PropValue<string>\n poster?: PropValue<string>\n controls?: PropValue<boolean>\n autoplay?: PropValue<boolean>\n loop?: PropValue<boolean>\n muted?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, poster, controls, autoplay, loop, muted, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(poster !== undefined ? { poster } : {}),\n ...(controls ? { controls: true } : {}),\n ...(autoplay ? { autoplay: true } : {}),\n ...(loop ? { loop: true } : {}),\n ...(muted ? { muted: true } : {})\n }\n\n return element({\n tag: 'video',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * audio component\n */\nexport const audio = (\n props: BaseProps & {\n src?: PropValue<string>\n controls?: PropValue<boolean>\n autoplay?: PropValue<boolean>\n loop?: PropValue<boolean>\n muted?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, controls, autoplay, loop, muted, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(controls ? { controls: true } : {}),\n ...(autoplay ? { autoplay: true } : {}),\n ...(loop ? { loop: true } : {}),\n ...(muted ? { muted: true } : {})\n }\n\n return element({\n tag: 'audio',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * source component\n */\nexport const source = (\n props: BaseProps & {\n src?: PropValue<string>\n type?: PropValue<string>\n }\n): Mountable<StringHost> => {\n const { src, type, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(type !== undefined ? { type } : {})\n }\n\n return element({\n tag: 'source',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * iframe component\n */\nexport const iframe = (\n props: BaseProps & {\n src?: PropValue<string>\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n frameborder?: PropValue<string | number>\n allowfullscreen?: PropValue<boolean>\n }\n): Mountable<StringHost> => {\n const { src, width, height, frameborder, allowfullscreen, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(src !== undefined ? { src } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {}),\n ...(frameborder !== undefined ? { frameborder } : {}),\n ...(allowfullscreen ? { allowfullscreen: true } : {})\n }\n\n return element({\n tag: 'iframe',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n\n/**\n * canvas component (SSR only renders empty canvas tag)\n */\nexport const canvas = (\n props: BaseProps & {\n width?: PropValue<string | number>\n height?: PropValue<string | number>\n }\n): Mountable<StringHost> => {\n const { width, height, attrs, ...restProps } = props as any\n\n const newAttrs = {\n ...(attrs || {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {})\n }\n\n return element({\n tag: 'canvas',\n ...restProps,\n attrs: newAttrs as any\n })\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
- import { Mountable, PropValue, FragmentChild } from '@rasenjs/core';
1
+ import { Mountable, PropValue, FragmentChild, WhenConfig, Ref, MatchConfig } from '@rasenjs/core';
2
+ export { MARKERS, MARKER_DEBUG_MAP } from '@rasenjs/core';
2
3
 
3
4
  /**
4
5
  * 字符串渲染器类型定义
@@ -148,6 +149,91 @@ declare const fragment: FragmentFunction;
148
149
  */
149
150
  declare const f: FragmentFunction;
150
151
 
152
+ /**
153
+ * Host hooks for control flow components (when/each/switch) in SSR
154
+ */
155
+
156
+ /**
157
+ * Host hooks for When component
158
+ */
159
+ declare const whenHostHooks: {
160
+ createMarker: (_host: StringHost, content: string) => string;
161
+ appendMarker: (host: StringHost, marker: string) => void;
162
+ insertBefore: (host: StringHost, node: string, _before: string | null) => void;
163
+ removeNode: () => void;
164
+ captureNode: (callback: (node: string) => void) => StringHost;
165
+ createFragment: () => {
166
+ host: StringHost;
167
+ flush: (host: StringHost, _before: string | null) => void;
168
+ };
169
+ removeMarker: () => void;
170
+ };
171
+ /**
172
+ * Host hooks for Each component
173
+ */
174
+ declare const eachHostHooks: {
175
+ createMarker: (_host: StringHost, content: string) => string;
176
+ appendMarker: (host: StringHost, marker: string) => void;
177
+ insertBefore: (host: StringHost, node: string, _before: string | null) => void;
178
+ removeNode: () => void;
179
+ captureNode: (callback: (node: string) => void) => StringHost;
180
+ createFragment: () => {
181
+ host: StringHost;
182
+ flush: (host: StringHost, _before: string | null) => void;
183
+ };
184
+ removeMarker: () => void;
185
+ };
186
+ /**
187
+ * Host hooks for Match component
188
+ */
189
+ declare const matchHostHooks: {
190
+ createMarker: (_host: StringHost, content: string) => string;
191
+ appendMarker: (host: StringHost, marker: string) => void;
192
+ insertBefore: (host: StringHost, node: string, _before: string | null) => void;
193
+ removeNode: () => void;
194
+ captureNode: (callback: (node: string) => void) => StringHost;
195
+ createFragment: () => {
196
+ host: StringHost;
197
+ flush: (host: StringHost, _before: string | null) => void;
198
+ };
199
+ removeMarker: () => void;
200
+ };
201
+
202
+ /**
203
+ * HTML when component for SSR
204
+ */
205
+
206
+ /**
207
+ * when - conditional rendering for SSR
208
+ */
209
+ declare function when<Host extends StringHost = StringHost>(config: Omit<WhenConfig<Host>, keyof typeof whenHostHooks>): Mountable<Host>;
210
+
211
+ /**
212
+ * HTML each/repeat components for SSR
213
+ */
214
+
215
+ /**
216
+ * each - object list rendering for SSR
217
+ */
218
+ declare function each<T extends object>(items: T[] | Ref<T[]> | (() => T[]), render: (item: T, index: number) => Mountable<StringHost>): Mountable<StringHost>;
219
+ /**
220
+ * repeat - value list or count rendering for SSR
221
+ */
222
+ declare function repeat<T = any>(itemsOrCount: Ref<T[]> | (() => T[] | number) | Ref<number> | (() => number), render: ((item: T, index: number) => Mountable<StringHost>) | ((index: number) => Mountable<StringHost>)): Mountable<StringHost>;
223
+
224
+ /**
225
+ * HTML match component for SSR
226
+ */
227
+
228
+ /**
229
+ * match - multi-branch conditional rendering for SSR
230
+ */
231
+ declare function match<K extends string = string>(config: Omit<MatchConfig<StringHost, K>, keyof typeof matchHostHooks>): Mountable<StringHost>;
232
+ /**
233
+ * @deprecated Use `match` instead. Will be removed in future versions.
234
+ */
235
+ declare const switchCase: typeof match;
236
+
151
237
  interface BaseProps {
152
238
  id?: PropValue<string>;
153
239
  class?: PropValue<string>;
@@ -314,4 +400,19 @@ declare const VOID_ELEMENTS: Set<string>;
314
400
  */
315
401
  declare function isVoidElement(tag: string): boolean;
316
402
 
317
- export { type StringHost, type StringMountFunction, type TextProps, VOID_ELEMENTS, a, article, aside, audio, blockquote, br, button, canvas, code, createStringHost, del, div, element, em, escapeAttr, escapeHtml, f, footer, form, fragment, h1, h2, h3, h4, h5, h6, header, hr, html, iframe, img, input, ins, isVoidElement, label, li, main, mark, nav, ol, option, p, pre, renderToString, renderToStringMultiple, section, select, small, source, span, stringContext, stringifyAttr, stringifyClass, stringifyStyle, strong, sub, sup, svg, table, tbody, td, text, textarea, tfoot, th, thead, tr, ul, video };
403
+ /**
404
+ * HTML/SSR-specific marker utilities
405
+ *
406
+ * Re-exports marker constants from @rasenjs/core and provides
407
+ * HTML-specific helper functions for generating comment markers.
408
+ */
409
+
410
+ /**
411
+ * Create an HTML comment marker
412
+ * @example
413
+ * createMarker(MARKERS.FRAGMENT_START) // <!-- f -->
414
+ * createMarker(MARKERS.WHEN_END) // <!-- /w -->
415
+ */
416
+ declare function createMarker(type: string): string;
417
+
418
+ export { type StringHost, type StringMountFunction, type TextProps, VOID_ELEMENTS, a, article, aside, audio, blockquote, br, button, canvas, code, createMarker, createStringHost, del, div, each, eachHostHooks, element, em, escapeAttr, escapeHtml, f, footer, form, fragment, h1, h2, h3, h4, h5, h6, header, hr, html, iframe, img, input, ins, isVoidElement, label, li, main, mark, match, matchHostHooks, nav, ol, option, p, pre, renderToString, renderToStringMultiple, repeat, section, select, small, source, span, stringContext, stringifyAttr, stringifyClass, stringifyStyle, strong, sub, sup, svg, switchCase, table, tbody, td, text, textarea, tfoot, th, thead, tr, ul, video, when, whenHostHooks };