@rasenjs/html 0.1.1-alpha → 0.1.2-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
@@ -2,6 +2,13 @@
2
2
 
3
3
  var core = require('@rasenjs/core');
4
4
 
5
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
6
+ get: (a2, b) => (typeof require !== "undefined" ? require : a2)[b]
7
+ }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error('Dynamic require of "' + x + '" is not supported');
10
+ });
11
+
5
12
  // src/types.ts
6
13
  function createStringHost() {
7
14
  const fragments = [];
@@ -47,8 +54,8 @@ var HTML_ESCAPE_MAP = {
47
54
  '"': """,
48
55
  "'": "'"
49
56
  };
50
- function escapeHtml(text) {
51
- return text.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
57
+ function escapeHtml(text2) {
58
+ return text2.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
52
59
  }
53
60
  function escapeAttr(value) {
54
61
  return value.replace(/[&<>"]/g, (char) => HTML_ESCAPE_MAP[char] || char);
@@ -191,6 +198,54 @@ var html = (props) => {
191
198
  };
192
199
  };
193
200
 
201
+ // src/components/text.ts
202
+ function text(props) {
203
+ const { content } = props;
204
+ return (host) => {
205
+ const textContent = typeof content === "function" ? String(content()) : String(content);
206
+ host.append(escapeHtml(textContent));
207
+ return void 0;
208
+ };
209
+ }
210
+ var hostHooks = {
211
+ createTextNode: (text2) => {
212
+ return `<!-- t -->${escapeHtml(text2)}<!-- /t -->`;
213
+ },
214
+ appendNode: (host, node) => host.append(node),
215
+ updateTextNode: () => {
216
+ },
217
+ removeNode: () => {
218
+ }
219
+ };
220
+ var fragment = (configOrStrings, ...values) => {
221
+ const runtime = core.getReactiveRuntime();
222
+ if (Array.isArray(configOrStrings) && "raw" in configOrStrings) {
223
+ const strings = configOrStrings;
224
+ return (host) => {
225
+ let html2 = "";
226
+ for (let i = 0; i < strings.length; i++) {
227
+ if (strings[i]) {
228
+ html2 += escapeHtml(strings[i]);
229
+ }
230
+ if (i < values.length) {
231
+ const value = values[i];
232
+ if (runtime.isRef(value)) {
233
+ html2 += escapeHtml(String(value.value));
234
+ } else if (typeof value === "string" || typeof value === "number") {
235
+ html2 += escapeHtml(String(value));
236
+ }
237
+ }
238
+ }
239
+ host.append(html2);
240
+ return void 0;
241
+ };
242
+ }
243
+ const { fragment: coreFragment } = __require("@rasenjs/core");
244
+ const config = configOrStrings;
245
+ return coreFragment({ children: config.children, hooks: hostHooks });
246
+ };
247
+ var f = fragment;
248
+
194
249
  // src/components/elements.ts
195
250
  function createElement(tag) {
196
251
  return (propsOrChild, ...restChildren) => {
@@ -400,8 +455,10 @@ exports.element = element;
400
455
  exports.em = em;
401
456
  exports.escapeAttr = escapeAttr;
402
457
  exports.escapeHtml = escapeHtml;
458
+ exports.f = f;
403
459
  exports.footer = footer;
404
460
  exports.form = form;
461
+ exports.fragment = fragment;
405
462
  exports.h1 = h1;
406
463
  exports.h2 = h2;
407
464
  exports.h3 = h3;
@@ -443,6 +500,7 @@ exports.svg = svg;
443
500
  exports.table = table;
444
501
  exports.tbody = tbody;
445
502
  exports.td = td;
503
+ exports.text = text;
446
504
  exports.textarea = textarea;
447
505
  exports.tfoot = tfoot;
448
506
  exports.th = th;
@@ -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/elements.ts"],"names":["html","unrefValue"],"mappings":";;;;;AA8BO,SAAS,gBAAA,GAA+B;AAC7C,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAOA,KAAAA,EAAc;AACnB,MAAA,SAAA,CAAU,KAAKA,KAAI,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,OAAO,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,IAC1B;AAAA,GACF;AACF;;;AC/BO,SAAS,cAAc,KAAA,EAEJ;AACxB,EAAA,OAAO,CAAC,IAAA,KAAqB;AAC3B,IAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AAGrB,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ;AAGA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAOO,SAAS,eAAe,SAAA,EAA0C;AACvE,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAC9B,EAAA,SAAA,CAAU,IAAI,CAAA;AACd,EAAA,OAAO,KAAK,QAAA,EAAS;AACvB;AAKO,SAAS,uBAAuB,UAAA,EAA6C;AAClF,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAC9B,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,KAAK,QAAA,EAAS;AACvB;;;AC3CA,IAAM,eAAA,GAA0C;AAAA,EAC9C,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAKO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,EAAY,CAAC,SAAS,eAAA,CAAgB,IAAI,KAAK,IAAI,CAAA;AACzE;AAKO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,QAAQ,SAAA,EAAW,CAAC,SAAS,eAAA,CAAgB,IAAI,KAAK,IAAI,CAAA;AACzE;AAKO,SAAS,aAAA,CACd,MACA,KAAA,EACQ;AACR,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,UAAU,KAAA,EAAO;AAC5D,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,IAAI,IAAI,CAAA,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,IAAI,IAAI,CAAA,EAAA,EAAK,WAAW,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAA,CAAA;AAC/C;AAKO,SAAS,eACd,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAEzC,MAAA,MAAM,WAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,EAAE,WAAA,EAAY;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,eACd,SAAA,EACQ;AACR,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAO,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,MAAA,CAAO,QAAQ,SAAS,CAAA,CAC5B,OAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAK,CAAA,CAC3B,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAA,CAClB,KAAK,GAAG,CAAA;AACb;AAKO,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EACnC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAKM,SAAS,cAAc,GAAA,EAAsB;AAClD,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA;AAC5C;;;AC1FO,IAAM,OAAA,GAAU,CAAC,KAAA,KAUK;AAC3B,EAAA,OAAO,CAAC,IAAA,KAAqB;AAC3B,IAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAClB,IAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAGhC,IAAA,IAAIA,KAAAA,GAAO,IAAI,GAAG,CAAA,CAAA;AAGlB,IAAA,MAAM,EAAA,GAAKC,eAAA,CAAW,KAAA,CAAM,EAAE,CAAA;AAC9B,IAAA,IAAI,EAAA,EAAI;AACN,MAAAD,KAAAA,IAAQ,aAAA,CAAc,IAAA,EAAM,EAAE,CAAA;AAAA,IAChC;AAGA,IAAA,MAAM,SAAA,GAAYC,eAAA,CAAW,KAAA,CAAM,SAAS,CAAA;AAC5C,IAAA,IAAI,SAAA,EAAW;AACb,MAAAD,KAAAA,IAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,KAAA,GAAQC,eAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,MAAAD,KAAAA,IAAQ,aAAA,CAAc,OAAA,EAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,KAAA,GAAQC,eAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAAD,KAAAA,IAAQ,aAAA,CAAc,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAM,KAAA,GAAQC,eAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAE9C,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACrB,QAAAD,KAAAA,IAAQ,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAAA,MAChC;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,IAAI,CAAC,CAAA;AACpG,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9C,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,MAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM;AAEvC,MAAA,MAAM,SAAA,GAAYC,gBAAW,GAAyB,CAAA;AACtD,MAAA,IAAI,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,IAAA,EAAM;AAEjD,QAAA,IAAI,OAAO,cAAc,QAAA,IAAY,OAAO,cAAc,QAAA,IAAY,OAAO,cAAc,SAAA,EAAW;AACpG,UAAAD,KAAAA,IAAQ,aAAA,CAAc,GAAA,EAAK,SAAS,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,KAAAA,IAAQ,GAAA;AAGR,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,OAAOA,KAAI,CAAA;AAChB,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAa,OAAO,QAAA,KAAa,QAAA,IAAY,WAAY,QAAA,EAAmB;AAElG,QAAAA,SAAQ,UAAA,CAAW,MAAA,CAAOC,eAAA,CAAW,QAA6B,CAAC,CAAC,CAAA;AAAA,MACtE,WAAW,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAEzD,QAAA,MAAM,SAAA,GAAwB;AAAA,UAC5B,WAAW,EAAC;AAAA,UACZ,OAAO,CAAA,EAAW;AAChB,YAAA,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,UACvB,CAAA;AAAA,UACA,QAAA,GAAW;AACT,YAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,UAC/B;AAAA,SACF;AAEA,QAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,UAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAE3C,UAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,YAAA,SAAA,CAAU,MAAA,CAAO,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,UACpC,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,UAAA,EAAY;AAGtC,YAAA,MAAM,MAAA,GAAU,MAAc,SAAS,CAAA;AAGvC,YAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU;AAC5D,cAAA,SAAA,CAAU,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA;AAAA,YAC7C;AAAA,UAEF;AAAA,QACF;AAEA,QAAAD,KAAAA,IAAQ,UAAU,QAAA,EAAS;AAAA,MAC7B;AAAA,IACF;AAGA,IAAAA,KAAAA,IAAQ,KAAK,GAAG,CAAA,CAAA,CAAA;AAEhB,IAAA,IAAA,CAAK,OAAOA,KAAI,CAAA;AAGhB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;ACzHO,IAAM,IAAA,GAAO,CAAC,KAAA,KAGQ;AAC3B,EAAA,OAAO,CAAC,IAAA,KAAqB;AAC3B,IAAA,MAAM,OAAA,GAAUC,eAAAA,CAAW,KAAA,CAAM,OAAO,CAAA,IAAK,EAAA;AAE7C,IAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AAGnB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;;;ACLA,SAAS,cAAc,GAAA,EAAa;AAClC,EAAA,OAAO,CACL,iBACG,YAAA,KACuB;AAE1B,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,OAAO,OAAA,CAAQ,EAAE,GAAA,EAAK,CAAA;AAAA,IACxB;AAGA,IAAA,IACE,OAAO,YAAA,KAAiB,QAAA,IACxB,OAAO,iBAAiB,UAAA,EACxB;AACA,MAAA,MAAM,QAAA,GAAW,CAAC,YAAA,EAAc,GAAG,YAAY,CAAA;AAC/C,MAAA,OAAO,OAAA,CAAQ,EAAE,GAAA,EAAK,QAAA,EAAU,CAAA;AAAA,IAClC;AAGA,IAAA,MAAM,KAAA,GAAQ,YAAA;AAGd,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,SAAA,EAAW,GAAG,WAAU,GAAI,KAAA;AAChD,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,GAAG,SAAA;AAAA,MACH,WAAW,SAAA,IAAa;AAAA,KAC1B;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAE3B,MAAA,MAAM,mBAAmB,KAAA,CAAM,QAAA;AAC/B,MAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,GAC3C,CAAC,GAAG,gBAAA,EAAkB,GAAG,YAAY,IACrC,gBAAA,KAAqB,MAAA,GACnB,CAAC,gBAAA,EAAkB,GAAG,YAAY,CAAA,GAClC,YAAA;AAEN,MAAA,OAAO,QAAQ,EAAE,GAAA,EAAK,GAAG,eAAA,EAAiB,UAAU,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,OAAA,CAAQ,EAAE,GAAA,EAAK,GAAG,iBAAiB,CAAA;AAAA,EAC5C,CAAA;AACF;AAMO,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,IAAA,GAAO,cAAc,MAAM;AACjC,IAAM,MAAA,GAAS,cAAc,QAAQ;AACrC,IAAM,CAAA,GAAI,cAAc,GAAG;AAC3B,IAAM,CAAA,GAAI,cAAc,GAAG;AAG3B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAG7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAG7B,IAAM,IAAA,GAAO,cAAc,MAAM;AACjC,IAAM,KAAA,GAAQ,cAAc,OAAO;AACnC,IAAM,MAAA,GAAS,cAAc,QAAQ;AAGrC,IAAM,KAAA,GAAQ,cAAc,OAAO;AACnC,IAAM,KAAA,GAAQ,cAAc,OAAO;AACnC,IAAM,KAAA,GAAQ,cAAc,OAAO;AACnC,IAAM,KAAA,GAAQ,cAAc,OAAO;AACnC,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,EAAA,GAAK,cAAc,IAAI;AAG7B,IAAM,OAAA,GAAU,cAAc,SAAS;AACvC,IAAM,OAAA,GAAU,cAAc,SAAS;AACvC,IAAM,MAAA,GAAS,cAAc,QAAQ;AACrC,IAAM,MAAA,GAAS,cAAc,QAAQ;AACrC,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,IAAA,GAAO,cAAc,MAAM;AACjC,IAAM,KAAA,GAAQ,cAAc,OAAO;AAGnC,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,IAAA,GAAO,cAAc,MAAM;AACjC,IAAM,UAAA,GAAa,cAAc,YAAY;AAC7C,IAAM,MAAA,GAAS,cAAc,QAAQ;AACrC,IAAM,EAAA,GAAK,cAAc,IAAI;AAC7B,IAAM,KAAA,GAAQ,cAAc,OAAO;AACnC,IAAM,IAAA,GAAO,cAAc,MAAM;AACjC,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,GAAA,GAAM,cAAc,KAAK;AAC/B,IAAM,GAAA,GAAM,cAAc,KAAK;AAG/B,IAAM,KAAK,MAAM,OAAA,CAAQ,EAAE,GAAA,EAAK,MAAM;AACtC,IAAM,KAAK,MAAM,OAAA,CAAQ,EAAE,GAAA,EAAK,MAAM;AAStC,IAAM,KAAA,GAAQ,CACnB,KAAA,KAM0B;AAC1B,EAAA,MAAM,EAAE,MAAM,KAAA,EAAO,WAAA,EAAa,UAAU,KAAA,EAAO,GAAG,WAAU,GAAI,KAAA;AAEpE,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,IACnD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa;AAAC,GAC/C;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,OAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO,QAAA;AAAA,IACP,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU;AAAC,GACxC,CAAA;AACH;AAKO,IAAM,GAAA,GAAM,CAAC,KAAA,KAKS;AAC3B,EAAA,OAAO,QAAQ,EAAE,GAAA,EAAK,KAAA,EAAO,GAAG,OAAO,CAAA;AACzC;AAKO,IAAM,QAAA,GAAW,CACtB,KAAA,KAO0B;AAC1B,EAAA,MAAM,EAAE,OAAO,WAAA,EAAa,QAAA,EAAU,MAAM,IAAA,EAAM,KAAA,EAAO,GAAG,SAAA,EAAU,GAAI,KAAA;AAE1E,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,IACnD,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAAA,IAC7C,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS;AAAC,GACvC;AAGA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,UAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO,QAAA;AAAA,IACP,GAAI,UAAU,MAAA,GAAY,EAAE,UAAU,MAAA,CAAO,KAAK,CAAA,EAAE,GAAI;AAAC,GAC1D,CAAA;AACH;AAKO,IAAM,MAAA,GAAS,CACpB,KAAA,KAI0B;AAC1B,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,GAAG,WAAU,GAAI,KAAA;AAEjD,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,IACvC,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS;AAAC,GACvC;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,QAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,KAAA,GAAQ,CACnB,KAAA,KAQ0B;AAC1B,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,MAAM,KAAA,EAAO,KAAA,EAAO,GAAG,SAAA,EAAU,GAAI,KAAA;AAE9E,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAQ,EAAC;AAAA,IACnC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,IACzC,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,KAAS,EAAC;AAAA,IAC7B,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,GACjC;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,OAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,KAAA,GAAQ,CACnB,KAAA,KAO0B;AAC1B,EAAA,MAAM,EAAE,KAAK,QAAA,EAAU,QAAA,EAAU,MAAM,KAAA,EAAO,KAAA,EAAO,GAAG,SAAA,EAAU,GAAI,KAAA;AAEtE,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAQ,EAAC;AAAA,IACnC,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,IACrC,GAAI,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,KAAS,EAAC;AAAA,IAC7B,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,GACjC;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,OAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,MAAA,GAAS,CACpB,KAAA,KAI0B;AAC1B,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,GAAG,WAAU,GAAI,KAAA;AAE3C,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAQ,EAAC;AAAA,IACnC,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS;AAAC,GACvC;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,QAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,MAAA,GAAS,CACpB,KAAA,KAO0B;AAC1B,EAAA,MAAM,EAAE,KAAK,KAAA,EAAO,MAAA,EAAQ,aAAa,eAAA,EAAiB,KAAA,EAAO,GAAG,SAAA,EAAU,GAAI,KAAA;AAElF,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,KAAQ,EAAC;AAAA,IACnC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,IACvC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,IACzC,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,IACnD,GAAI,eAAA,GAAkB,EAAE,eAAA,EAAiB,IAAA,KAAS;AAAC,GACrD;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,QAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AACH;AAKO,IAAM,MAAA,GAAS,CACpB,KAAA,KAI0B;AAC1B,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,GAAG,WAAU,GAAI,KAAA;AAE/C,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAI,SAAS,EAAC;AAAA,IACd,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,IACvC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,GAC3C;AAEA,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,GAAA,EAAK,QAAA;AAAA,IACL,GAAG,SAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACR,CAAA;AACH","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","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/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"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { Mountable, PropValue } from '@rasenjs/core';
1
+ import { Mountable, PropValue, FragmentChild } from '@rasenjs/core';
2
2
 
3
3
  /**
4
4
  * 字符串渲染器类型定义
@@ -89,6 +89,65 @@ declare const html: (props: {
89
89
  content: PropValue<string>;
90
90
  }) => Mountable<StringHost>;
91
91
 
92
+ /**
93
+ * Text node component for HTML (SSR)
94
+ *
95
+ * Outputs escaped text content
96
+ */
97
+
98
+ interface TextProps {
99
+ /** Text content - can be static string/number or reactive getter */
100
+ content: string | number | (() => string | number);
101
+ }
102
+ /**
103
+ * Create a text node for SSR
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * // Static text
108
+ * text({ content: 'Hello' })
109
+ *
110
+ * // Reactive text (evaluates immediately in SSR)
111
+ * text({ content: () => count.value })
112
+ * ```
113
+ */
114
+ declare function text(props: TextProps): Mountable<StringHost>;
115
+
116
+ /**
117
+ * HTML fragment implementation for SSR
118
+ */
119
+
120
+ /**
121
+ * Fragment function interface for HTML/SSR
122
+ */
123
+ interface FragmentFunction {
124
+ (config: {
125
+ children: Array<Mountable<StringHost>>;
126
+ }): Mountable<StringHost>;
127
+ (strings: TemplateStringsArray, ...values: FragmentChild<StringHost>[]): Mountable<StringHost>;
128
+ }
129
+ /**
130
+ * fragment - 组合多个子组件
131
+ *
132
+ * 注意:在 SSR 中,响应式值会被立即求值并转换为静态字符串
133
+ *
134
+ * @example
135
+ * // 对象参数用法
136
+ * fragment({ children: [child1, child2] })
137
+ *
138
+ * // Tagged template 用法
139
+ * const count = ref(0)
140
+ * fragment`Count: ${count} items` // SSR: 立即求值
141
+ *
142
+ * // 别名
143
+ * f`Count: ${count} items`
144
+ */
145
+ declare const fragment: FragmentFunction;
146
+ /**
147
+ * f - fragment 的简写别名
148
+ */
149
+ declare const f: FragmentFunction;
150
+
92
151
  interface BaseProps {
93
152
  id?: PropValue<string>;
94
153
  class?: PropValue<string>;
@@ -255,4 +314,4 @@ declare const VOID_ELEMENTS: Set<string>;
255
314
  */
256
315
  declare function isVoidElement(tag: string): boolean;
257
316
 
258
- export { type StringHost, type StringMountFunction, VOID_ELEMENTS, a, article, aside, audio, blockquote, br, button, canvas, code, createStringHost, del, div, element, em, escapeAttr, escapeHtml, footer, form, 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, textarea, tfoot, th, thead, tr, ul, video };
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 };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Mountable, PropValue } from '@rasenjs/core';
1
+ import { Mountable, PropValue, FragmentChild } from '@rasenjs/core';
2
2
 
3
3
  /**
4
4
  * 字符串渲染器类型定义
@@ -89,6 +89,65 @@ declare const html: (props: {
89
89
  content: PropValue<string>;
90
90
  }) => Mountable<StringHost>;
91
91
 
92
+ /**
93
+ * Text node component for HTML (SSR)
94
+ *
95
+ * Outputs escaped text content
96
+ */
97
+
98
+ interface TextProps {
99
+ /** Text content - can be static string/number or reactive getter */
100
+ content: string | number | (() => string | number);
101
+ }
102
+ /**
103
+ * Create a text node for SSR
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * // Static text
108
+ * text({ content: 'Hello' })
109
+ *
110
+ * // Reactive text (evaluates immediately in SSR)
111
+ * text({ content: () => count.value })
112
+ * ```
113
+ */
114
+ declare function text(props: TextProps): Mountable<StringHost>;
115
+
116
+ /**
117
+ * HTML fragment implementation for SSR
118
+ */
119
+
120
+ /**
121
+ * Fragment function interface for HTML/SSR
122
+ */
123
+ interface FragmentFunction {
124
+ (config: {
125
+ children: Array<Mountable<StringHost>>;
126
+ }): Mountable<StringHost>;
127
+ (strings: TemplateStringsArray, ...values: FragmentChild<StringHost>[]): Mountable<StringHost>;
128
+ }
129
+ /**
130
+ * fragment - 组合多个子组件
131
+ *
132
+ * 注意:在 SSR 中,响应式值会被立即求值并转换为静态字符串
133
+ *
134
+ * @example
135
+ * // 对象参数用法
136
+ * fragment({ children: [child1, child2] })
137
+ *
138
+ * // Tagged template 用法
139
+ * const count = ref(0)
140
+ * fragment`Count: ${count} items` // SSR: 立即求值
141
+ *
142
+ * // 别名
143
+ * f`Count: ${count} items`
144
+ */
145
+ declare const fragment: FragmentFunction;
146
+ /**
147
+ * f - fragment 的简写别名
148
+ */
149
+ declare const f: FragmentFunction;
150
+
92
151
  interface BaseProps {
93
152
  id?: PropValue<string>;
94
153
  class?: PropValue<string>;
@@ -255,4 +314,4 @@ declare const VOID_ELEMENTS: Set<string>;
255
314
  */
256
315
  declare function isVoidElement(tag: string): boolean;
257
316
 
258
- export { type StringHost, type StringMountFunction, VOID_ELEMENTS, a, article, aside, audio, blockquote, br, button, canvas, code, createStringHost, del, div, element, em, escapeAttr, escapeHtml, footer, form, 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, textarea, tfoot, th, thead, tr, ul, video };
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 };
package/dist/index.js CHANGED
@@ -1,4 +1,11 @@
1
- import { unrefValue } from '@rasenjs/core';
1
+ import { unrefValue, getReactiveRuntime } from '@rasenjs/core';
2
+
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a2, b) => (typeof require !== "undefined" ? require : a2)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
2
9
 
3
10
  // src/types.ts
4
11
  function createStringHost() {
@@ -45,8 +52,8 @@ var HTML_ESCAPE_MAP = {
45
52
  '"': "&quot;",
46
53
  "'": "&#39;"
47
54
  };
48
- function escapeHtml(text) {
49
- return text.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
55
+ function escapeHtml(text2) {
56
+ return text2.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] || char);
50
57
  }
51
58
  function escapeAttr(value) {
52
59
  return value.replace(/[&<>"]/g, (char) => HTML_ESCAPE_MAP[char] || char);
@@ -189,6 +196,54 @@ var html = (props) => {
189
196
  };
190
197
  };
191
198
 
199
+ // src/components/text.ts
200
+ function text(props) {
201
+ const { content } = props;
202
+ return (host) => {
203
+ const textContent = typeof content === "function" ? String(content()) : String(content);
204
+ host.append(escapeHtml(textContent));
205
+ return void 0;
206
+ };
207
+ }
208
+ var hostHooks = {
209
+ createTextNode: (text2) => {
210
+ return `<!-- t -->${escapeHtml(text2)}<!-- /t -->`;
211
+ },
212
+ appendNode: (host, node) => host.append(node),
213
+ updateTextNode: () => {
214
+ },
215
+ removeNode: () => {
216
+ }
217
+ };
218
+ var fragment = (configOrStrings, ...values) => {
219
+ const runtime = getReactiveRuntime();
220
+ if (Array.isArray(configOrStrings) && "raw" in configOrStrings) {
221
+ const strings = configOrStrings;
222
+ return (host) => {
223
+ let html2 = "";
224
+ for (let i = 0; i < strings.length; i++) {
225
+ if (strings[i]) {
226
+ html2 += escapeHtml(strings[i]);
227
+ }
228
+ if (i < values.length) {
229
+ const value = values[i];
230
+ if (runtime.isRef(value)) {
231
+ html2 += escapeHtml(String(value.value));
232
+ } else if (typeof value === "string" || typeof value === "number") {
233
+ html2 += escapeHtml(String(value));
234
+ }
235
+ }
236
+ }
237
+ host.append(html2);
238
+ return void 0;
239
+ };
240
+ }
241
+ const { fragment: coreFragment } = __require("@rasenjs/core");
242
+ const config = configOrStrings;
243
+ return coreFragment({ children: config.children, hooks: hostHooks });
244
+ };
245
+ var f = fragment;
246
+
192
247
  // src/components/elements.ts
193
248
  function createElement(tag) {
194
249
  return (propsOrChild, ...restChildren) => {
@@ -381,6 +436,6 @@ var canvas = (props) => {
381
436
  });
382
437
  };
383
438
 
384
- export { VOID_ELEMENTS, a, article, aside, audio, blockquote, br, button, canvas, code, createStringHost, del, div, element, em, escapeAttr, escapeHtml, footer, form, 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, textarea, tfoot, th, thead, tr, ul, video };
439
+ export { 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 };
385
440
  //# sourceMappingURL=index.js.map
386
441
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -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/elements.ts"],"names":["html","unrefValue"],"mappings":"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","file":"index.js","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","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/components/fragment.ts","../src/components/elements.ts"],"names":["html","text","unrefValue"],"mappings":"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","file":"index.js","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rasenjs/html",
3
- "version": "0.1.1-alpha",
3
+ "version": "0.1.2-alpha",
4
4
  "description": "Rasen HTML renderer for SSR/SSG",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -39,9 +39,13 @@
39
39
  "bugs": {
40
40
  "url": "https://github.com/rasenjs/rasen/issues"
41
41
  },
42
+ "publishConfig": {
43
+ "registry": "https://registry.npmjs.org/",
44
+ "access": "public"
45
+ },
42
46
  "author": "Rasen Contributors",
43
47
  "license": "MIT",
44
48
  "dependencies": {
45
- "@rasenjs/core": "0.1.3-alpha"
49
+ "@rasenjs/core": "0.1.4-alpha"
46
50
  }
47
51
  }