draft-ole 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +134 -0
  3. package/README.md +128 -0
  4. package/dist/chunk-5BNNDTRT.js +95 -0
  5. package/dist/chunk-5BNNDTRT.js.map +1 -0
  6. package/dist/chunk-STLTIBMA.js +7658 -0
  7. package/dist/chunk-STLTIBMA.js.map +1 -0
  8. package/dist/chunk-YK4Y4ENL.js +389 -0
  9. package/dist/chunk-YK4Y4ENL.js.map +1 -0
  10. package/dist/entries/app.cjs +7337 -0
  11. package/dist/entries/app.cjs.map +1 -0
  12. package/dist/entries/app.d.cts +115 -0
  13. package/dist/entries/app.d.ts +115 -0
  14. package/dist/entries/app.js +10 -0
  15. package/dist/entries/app.js.map +1 -0
  16. package/dist/entries/page.cjs +7558 -0
  17. package/dist/entries/page.cjs.map +1 -0
  18. package/dist/entries/page.d.cts +2 -0
  19. package/dist/entries/page.d.ts +2 -0
  20. package/dist/entries/page.js +30 -0
  21. package/dist/entries/page.js.map +1 -0
  22. package/dist/index.cjs +10524 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.cts +4700 -0
  25. package/dist/index.d.ts +4700 -0
  26. package/dist/index.js +2573 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/page-DylNkWXm.d.ts +366 -0
  29. package/dist/page-h3DPzs8l.d.cts +366 -0
  30. package/dist/transformer/call-detector.d.ts +38 -0
  31. package/dist/transformer/call-detector.d.ts.map +1 -0
  32. package/dist/transformer/call-detector.js +151 -0
  33. package/dist/transformer/call-detector.js.map +1 -0
  34. package/dist/transformer/command-injector.d.ts +27 -0
  35. package/dist/transformer/command-injector.d.ts.map +1 -0
  36. package/dist/transformer/command-injector.js +111 -0
  37. package/dist/transformer/command-injector.js.map +1 -0
  38. package/dist/transformer/diagnostic-reporter.d.ts +81 -0
  39. package/dist/transformer/diagnostic-reporter.d.ts.map +1 -0
  40. package/dist/transformer/diagnostic-reporter.js +330 -0
  41. package/dist/transformer/diagnostic-reporter.js.map +1 -0
  42. package/dist/transformer/each-scope-branch.d.ts +28 -0
  43. package/dist/transformer/each-scope-branch.d.ts.map +1 -0
  44. package/dist/transformer/each-scope-branch.js +95 -0
  45. package/dist/transformer/each-scope-branch.js.map +1 -0
  46. package/dist/transformer/each-state-rewriter.d.ts +117 -0
  47. package/dist/transformer/each-state-rewriter.d.ts.map +1 -0
  48. package/dist/transformer/each-state-rewriter.js +393 -0
  49. package/dist/transformer/each-state-rewriter.js.map +1 -0
  50. package/dist/transformer/format-diagnostics.d.ts +27 -0
  51. package/dist/transformer/format-diagnostics.d.ts.map +1 -0
  52. package/dist/transformer/format-diagnostics.js +50 -0
  53. package/dist/transformer/format-diagnostics.js.map +1 -0
  54. package/dist/transformer/handler-ir-extractor.d.ts +71 -0
  55. package/dist/transformer/handler-ir-extractor.d.ts.map +1 -0
  56. package/dist/transformer/handler-ir-extractor.js +171 -0
  57. package/dist/transformer/handler-ir-extractor.js.map +1 -0
  58. package/dist/transformer/handler-serializer.d.ts +56 -0
  59. package/dist/transformer/handler-serializer.d.ts.map +1 -0
  60. package/dist/transformer/handler-serializer.js +315 -0
  61. package/dist/transformer/handler-serializer.js.map +1 -0
  62. package/dist/transformer/helper-context-resolver.d.ts +180 -0
  63. package/dist/transformer/helper-context-resolver.d.ts.map +1 -0
  64. package/dist/transformer/helper-context-resolver.js +376 -0
  65. package/dist/transformer/helper-context-resolver.js.map +1 -0
  66. package/dist/transformer/helper-decl-utils.d.ts +28 -0
  67. package/dist/transformer/helper-decl-utils.d.ts.map +1 -0
  68. package/dist/transformer/helper-decl-utils.js +92 -0
  69. package/dist/transformer/helper-decl-utils.js.map +1 -0
  70. package/dist/transformer/identifier-collector.d.ts +28 -0
  71. package/dist/transformer/identifier-collector.d.ts.map +1 -0
  72. package/dist/transformer/identifier-collector.js +184 -0
  73. package/dist/transformer/identifier-collector.js.map +1 -0
  74. package/dist/transformer/index.d.ts +56 -0
  75. package/dist/transformer/index.d.ts.map +1 -0
  76. package/dist/transformer/index.js +333 -0
  77. package/dist/transformer/index.js.map +1 -0
  78. package/dist/transformer/inline-recovery.d.ts +109 -0
  79. package/dist/transformer/inline-recovery.d.ts.map +1 -0
  80. package/dist/transformer/inline-recovery.js +369 -0
  81. package/dist/transformer/inline-recovery.js.map +1 -0
  82. package/dist/transformer/label-injector.d.ts +105 -0
  83. package/dist/transformer/label-injector.d.ts.map +1 -0
  84. package/dist/transformer/label-injector.js +221 -0
  85. package/dist/transformer/label-injector.js.map +1 -0
  86. package/dist/transformer/package.json +3 -0
  87. package/dist/transformer/per-call-context.d.ts +95 -0
  88. package/dist/transformer/per-call-context.d.ts.map +1 -0
  89. package/dist/transformer/per-call-context.js +3 -0
  90. package/dist/transformer/per-call-context.js.map +1 -0
  91. package/dist/transformer/state-id-fallback.d.ts +85 -0
  92. package/dist/transformer/state-id-fallback.d.ts.map +1 -0
  93. package/dist/transformer/state-id-fallback.js +132 -0
  94. package/dist/transformer/state-id-fallback.js.map +1 -0
  95. package/dist/transformer/state-id-resolver.d.ts +104 -0
  96. package/dist/transformer/state-id-resolver.d.ts.map +1 -0
  97. package/dist/transformer/state-id-resolver.js +222 -0
  98. package/dist/transformer/state-id-resolver.js.map +1 -0
  99. package/dist/transformer/theme-class-detector.d.ts +47 -0
  100. package/dist/transformer/theme-class-detector.d.ts.map +1 -0
  101. package/dist/transformer/theme-class-detector.js +242 -0
  102. package/dist/transformer/theme-class-detector.js.map +1 -0
  103. package/dist/transformer/varname-resolver.d.ts +53 -0
  104. package/dist/transformer/varname-resolver.d.ts.map +1 -0
  105. package/dist/transformer/varname-resolver.js +231 -0
  106. package/dist/transformer/varname-resolver.js.map +1 -0
  107. package/dist/transformer/whitelist-registry.d.ts +68 -0
  108. package/dist/transformer/whitelist-registry.d.ts.map +1 -0
  109. package/dist/transformer/whitelist-registry.js +122 -0
  110. package/dist/transformer/whitelist-registry.js.map +1 -0
  111. package/dist/transformer/whitelist-validator.d.ts +59 -0
  112. package/dist/transformer/whitelist-validator.d.ts.map +1 -0
  113. package/dist/transformer/whitelist-validator.js +493 -0
  114. package/dist/transformer/whitelist-validator.js.map +1 -0
  115. package/dist/types-BXV3vhHS.d.cts +4590 -0
  116. package/dist/types-BXV3vhHS.d.ts +4590 -0
  117. package/package.json +121 -0
@@ -0,0 +1,389 @@
1
+ import {
2
+ ExportableError,
3
+ HtmlTag,
4
+ PairType,
5
+ Root,
6
+ TextType,
7
+ a,
8
+ body,
9
+ button,
10
+ errorToString,
11
+ h1,
12
+ h2,
13
+ h3,
14
+ h4,
15
+ h5,
16
+ h6,
17
+ head,
18
+ html,
19
+ img,
20
+ main,
21
+ meta,
22
+ p,
23
+ section,
24
+ title
25
+ } from "./chunk-STLTIBMA.js";
26
+
27
+ // src/view/static-page-writer.ts
28
+ import { mkdirSync, writeFileSync } from "fs";
29
+ import { join } from "path";
30
+ var StaticPageWriter = class {
31
+ /**
32
+ * `root` を `outputPath` 配下に静的ファイルとして書き出す。
33
+ *
34
+ * - デフォルト(`inlineCss=true`)では `index.html` のみ出力し、
35
+ * CSS を `<style>` タグとして `</head>` 直前に埋め込む。
36
+ * - `inlineCss=false` のときは `index.html` と `style.css` を出力し、
37
+ * `<link rel="stylesheet">` を `</head>` 直前に挿入する。
38
+ * - CSS が空文字列の場合は CSS 関連の出力・挿入を完全にスキップする。
39
+ *
40
+ * @param root - 静的検証済みの {@link Root}
41
+ * @param outputPath - 出力先ディレクトリパス
42
+ * @param options - 書き出しオプション
43
+ *
44
+ * @throws {@link ExportableError}
45
+ * - `invalidPath`: `outputPath` が空文字列
46
+ * - `writeFailed`: ディレクトリ作成またはファイル書き込みに失敗
47
+ */
48
+ write(root, outputPath, options) {
49
+ if (outputPath.length === 0) {
50
+ throw new ExportableError(
51
+ "invalidPath",
52
+ outputPath,
53
+ "Output path must not be empty"
54
+ );
55
+ }
56
+ const htmlFileName = options?.htmlFileName ?? "index.html";
57
+ const cssFileName = options?.cssFileName ?? "style.css";
58
+ const inlineCss = options?.inlineCss ?? true;
59
+ const htmlContent = root.render();
60
+ const cssContent = root.collectCssStyleString();
61
+ const hasCss = cssContent.trim().length > 0;
62
+ try {
63
+ mkdirSync(outputPath, { recursive: true });
64
+ } catch (error) {
65
+ throw new ExportableError(
66
+ "writeFailed",
67
+ outputPath,
68
+ `Failed to create directory: ${errorToString(error)}`
69
+ );
70
+ }
71
+ let finalHtml = htmlContent;
72
+ if (hasCss) {
73
+ const headEndIndex = finalHtml.indexOf("</head>");
74
+ if (headEndIndex !== -1) {
75
+ const insertion = inlineCss ? `<style>
76
+ ${cssContent}
77
+ </style>
78
+ ` : `<link rel="stylesheet" href="${cssFileName}">
79
+ `;
80
+ finalHtml = finalHtml.slice(0, headEndIndex) + insertion + finalHtml.slice(headEndIndex);
81
+ }
82
+ }
83
+ try {
84
+ writeFileSync(join(outputPath, htmlFileName), finalHtml, "utf-8");
85
+ if (hasCss && !inlineCss) {
86
+ writeFileSync(join(outputPath, cssFileName), cssContent, "utf-8");
87
+ }
88
+ } catch (error) {
89
+ throw new ExportableError(
90
+ "writeFailed",
91
+ outputPath,
92
+ `Failed to write files: ${errorToString(error)}`
93
+ );
94
+ }
95
+ }
96
+ };
97
+
98
+ // src/view/page.ts
99
+ var PageDocument = class {
100
+ _root;
101
+ /**
102
+ * @internal `page()` ファクトリからのみ呼び出されることを想定する。
103
+ * 外部から直接構築すると静的性検証を素通りするため非推奨。
104
+ */
105
+ constructor(root) {
106
+ this._root = root;
107
+ }
108
+ render() {
109
+ const htmlStr = this._root.render();
110
+ const css = this._root.collectCssStyleString();
111
+ if (css.length === 0) return htmlStr;
112
+ const styleTag = `<style>
113
+ ${css}
114
+ </style>`;
115
+ const insertPoint = htmlStr.indexOf("</head>");
116
+ if (insertPoint === -1) return htmlStr;
117
+ return `${htmlStr.slice(0, insertPoint)}${styleTag}
118
+ ${htmlStr.slice(insertPoint)}`;
119
+ }
120
+ export(outputPath, options) {
121
+ new StaticPageWriter().write(this._root, outputPath, options);
122
+ }
123
+ };
124
+ function isPageOptions(arg) {
125
+ return typeof arg === "object" && arg !== null && !("protoRender" in arg);
126
+ }
127
+ function page(...args) {
128
+ const lastArg = args[args.length - 1];
129
+ const options = args.length > 0 && isPageOptions(lastArg) ? lastArg : void 0;
130
+ const views = options !== void 0 ? args.slice(0, -1) : args;
131
+ const root = new Root();
132
+ root.setDoctype(true);
133
+ const charsetMeta = meta({ charset: options?.charset ?? "UTF-8" });
134
+ const viewportMeta = options?.viewport !== void 0 ? meta({ name: "viewport", content: options.viewport }) : void 0;
135
+ const descriptionMeta = options?.description !== void 0 ? meta({ name: "description", content: options.description }) : void 0;
136
+ const titleEl = title(options?.title ?? "");
137
+ const metaList = [charsetMeta, viewportMeta, descriptionMeta, titleEl].filter((el) => el !== void 0);
138
+ const headEl = head(...metaList);
139
+ const resolvedViews = views.map(
140
+ (v) => v instanceof HtmlTag ? v : TextType.raw(v.protoRender())
141
+ );
142
+ const mainEl = main(...resolvedViews);
143
+ const bodyEl = body(mainEl);
144
+ const htmlEl = options?.lang !== void 0 ? html({ lang: options.lang }, headEl, bodyEl) : html(headEl, bodyEl);
145
+ root.addChild(htmlEl);
146
+ const usedMethods = root.collectUsedMethods();
147
+ const jsContent = root.collectJsContent();
148
+ if (usedMethods.size > 0 || jsContent.length > 0) {
149
+ const hints = [];
150
+ if (usedMethods.size > 0) {
151
+ hints.push(`jQuery methods=[${Array.from(usedMethods).join(",")}]`);
152
+ }
153
+ if (jsContent.length > 0) {
154
+ hints.push("inline js content");
155
+ }
156
+ throw new Error(
157
+ `page surface does not allow runtime content: ${hints.join("; ")}`
158
+ );
159
+ }
160
+ return new PageDocument(root);
161
+ }
162
+
163
+ // src/css/constants/alignment.ts
164
+ var Alignment = {
165
+ center: "center",
166
+ leading: "flex-start",
167
+ trailing: "flex-end",
168
+ top: "flex-start",
169
+ bottom: "flex-end"
170
+ };
171
+ var ZStackAlignment = {
172
+ center: { alignItems: "center", justifyContent: "center" },
173
+ topLeading: { alignItems: "flex-start", justifyContent: "flex-start" },
174
+ topTrailing: { alignItems: "flex-start", justifyContent: "flex-end" },
175
+ bottomLeading: { alignItems: "flex-end", justifyContent: "flex-start" },
176
+ bottomTrailing: { alignItems: "flex-end", justifyContent: "flex-end" },
177
+ top: { alignItems: "flex-start", justifyContent: "center" },
178
+ bottom: { alignItems: "flex-end", justifyContent: "center" },
179
+ leading: { alignItems: "center", justifyContent: "flex-start" },
180
+ trailing: { alignItems: "center", justifyContent: "flex-end" }
181
+ };
182
+
183
+ // src/html/layout/layout-factories.ts
184
+ function isStackOptions(value) {
185
+ if (value === void 0) return false;
186
+ if (typeof value === "string") return false;
187
+ if (typeof value === "object" && "tagType" in value) return false;
188
+ return true;
189
+ }
190
+ function addChildren(tag, children) {
191
+ for (const child of children) {
192
+ if (typeof child === "string") {
193
+ tag.addChild(new TextType(child, { escape: true }));
194
+ } else {
195
+ tag.addChild(child);
196
+ }
197
+ }
198
+ }
199
+ function makeStack(direction, options) {
200
+ const tag = new PairType("div");
201
+ tag.style.flex.setFlex({ direction });
202
+ if (options.spacing !== void 0) {
203
+ tag.style.flex.setGap(`${options.spacing}px`);
204
+ }
205
+ if (options.alignment !== void 0) {
206
+ tag.style.flex.setAlignItems(options.alignment);
207
+ }
208
+ if (options.wrap === true) {
209
+ tag.style.flex.setFlexWrap("wrap");
210
+ }
211
+ return tag;
212
+ }
213
+ function hstack(optionsOrChild, ...children) {
214
+ if (isStackOptions(optionsOrChild)) {
215
+ const tag2 = makeStack("row", optionsOrChild);
216
+ addChildren(tag2, children);
217
+ return tag2;
218
+ }
219
+ const tag = makeStack("row", {});
220
+ if (optionsOrChild !== void 0) {
221
+ addChildren(tag, [optionsOrChild, ...children]);
222
+ } else {
223
+ addChildren(tag, children);
224
+ }
225
+ return tag;
226
+ }
227
+ function vstack(optionsOrChild, ...children) {
228
+ if (isStackOptions(optionsOrChild)) {
229
+ const tag2 = makeStack("column", optionsOrChild);
230
+ addChildren(tag2, children);
231
+ return tag2;
232
+ }
233
+ const tag = makeStack("column", {});
234
+ if (optionsOrChild !== void 0) {
235
+ addChildren(tag, [optionsOrChild, ...children]);
236
+ } else {
237
+ addChildren(tag, children);
238
+ }
239
+ return tag;
240
+ }
241
+ function isZStackOptions(value) {
242
+ if (value === void 0) return false;
243
+ if (typeof value === "string") return false;
244
+ if (typeof value === "object" && "tagType" in value) return false;
245
+ return true;
246
+ }
247
+ function makeZStack(options) {
248
+ const tag = new PairType("div");
249
+ tag.style.grid.setGrid({ areas: '"stack"', rows: "1fr", columns: "1fr" });
250
+ const alignKey = options.alignment ?? "center";
251
+ const { alignItems, justifyContent } = ZStackAlignment[alignKey];
252
+ tag.style.flex.setAlignItems(alignItems);
253
+ tag.style.flex.setJustifyContent(justifyContent);
254
+ return tag;
255
+ }
256
+ function zstack(optionsOrChild, ...children) {
257
+ if (isZStackOptions(optionsOrChild)) {
258
+ const tag2 = makeZStack(optionsOrChild);
259
+ addChildren(tag2, children);
260
+ return tag2;
261
+ }
262
+ const tag = makeZStack({});
263
+ if (optionsOrChild !== void 0) {
264
+ addChildren(tag, [optionsOrChild, ...children]);
265
+ }
266
+ return tag;
267
+ }
268
+ function spacer(options) {
269
+ const tag = new PairType("div");
270
+ tag.style.flex.setFlexValue("1 1 auto");
271
+ if (options?.minLength !== void 0) {
272
+ tag.minWidth(`${options.minLength}px`);
273
+ }
274
+ return tag;
275
+ }
276
+ function divider(direction = "horizontal") {
277
+ const tag = new PairType("div");
278
+ tag.background("currentColor");
279
+ tag.opacity("0.15");
280
+ if (direction === "vertical") {
281
+ tag.width("1px");
282
+ tag.style.flex.setAlignSelf("stretch");
283
+ } else {
284
+ tag.height("1px");
285
+ tag.width("100%");
286
+ }
287
+ return tag;
288
+ }
289
+
290
+ // src/view/primitives.ts
291
+ function VStack(options, ...children) {
292
+ if (options !== void 0) {
293
+ return vstack(options, ...children);
294
+ }
295
+ const [first, ...rest] = children;
296
+ return first !== void 0 ? vstack(first, ...rest) : vstack();
297
+ }
298
+ function HStack(options, ...children) {
299
+ if (options !== void 0) {
300
+ return hstack(options, ...children);
301
+ }
302
+ const [first, ...rest] = children;
303
+ return first !== void 0 ? hstack(first, ...rest) : hstack();
304
+ }
305
+ function Text(content) {
306
+ return p(content);
307
+ }
308
+ function Image(src, alt) {
309
+ return img({ src, alt });
310
+ }
311
+ function Section(...children) {
312
+ return section(...children);
313
+ }
314
+ function Spacer(options) {
315
+ return spacer(options);
316
+ }
317
+ function Heading(level, content) {
318
+ switch (level) {
319
+ case 1:
320
+ return h1(content);
321
+ case 2:
322
+ return h2(content);
323
+ case 3:
324
+ return h3(content);
325
+ case 4:
326
+ return h4(content);
327
+ case 5:
328
+ return h5(content);
329
+ case 6:
330
+ return h6(content);
331
+ default:
332
+ throw new Error(`invalid heading level: ${level}`);
333
+ }
334
+ }
335
+ function Link(options, ...children) {
336
+ const attrs = { href: options.href };
337
+ if (options.target !== void 0) {
338
+ attrs.target = options.target;
339
+ }
340
+ if (options.rel !== void 0) {
341
+ attrs.rel = options.rel;
342
+ } else if (options.target === "_blank") {
343
+ attrs.rel = "noopener noreferrer";
344
+ }
345
+ return a(attrs, ...children);
346
+ }
347
+ function Button(options, ...children) {
348
+ const type = options?.type ?? "button";
349
+ return button({ type }, ...children);
350
+ }
351
+
352
+ // src/view/app-slot.ts
353
+ function AppSlot(optionsOrId) {
354
+ const id = typeof optionsOrId === "string" ? optionsOrId : optionsOrId.id;
355
+ if (id === "") {
356
+ throw new Error("AppSlot id must be a non-empty string");
357
+ }
358
+ return {
359
+ protoRender(_ctx) {
360
+ return `<div data-draftole-mount="${id}"></div>`;
361
+ },
362
+ collectCssStyleString() {
363
+ return "";
364
+ }
365
+ };
366
+ }
367
+
368
+ export {
369
+ PageDocument,
370
+ page,
371
+ Alignment,
372
+ ZStackAlignment,
373
+ hstack,
374
+ vstack,
375
+ zstack,
376
+ spacer,
377
+ divider,
378
+ VStack,
379
+ HStack,
380
+ Text,
381
+ Image,
382
+ Section,
383
+ Spacer,
384
+ Heading,
385
+ Link,
386
+ Button,
387
+ AppSlot
388
+ };
389
+ //# sourceMappingURL=chunk-YK4Y4ENL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/view/static-page-writer.ts","../src/view/page.ts","../src/css/constants/alignment.ts","../src/html/layout/layout-factories.ts","../src/view/primitives.ts","../src/view/app-slot.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Root } from '../html/elements/root.js';\nimport { ExportableError } from '../publisher/exportable-error.js';\nimport { errorToString } from '../utils/errors.js';\n\n/**\n * 静的ページ書き出しのオプション。\n *\n * design.md §6.3 で定義された `StaticExportOptions` インターフェース。\n *\n * - `htmlFileName`: 出力 HTML ファイル名(デフォルト: `'index.html'`)\n * - `cssFileName`: 出力 CSS ファイル名(デフォルト: `'style.css'`)。`inlineCss=false` のときのみ使用\n * - `inlineCss`: CSS を `<style>` タグとして HTML 内に埋め込むか(デフォルト: `true`)\n *\n * @public\n */\nexport interface StaticExportOptions {\n readonly htmlFileName?: string;\n readonly cssFileName?: string;\n readonly inlineCss?: boolean;\n}\n\n/**\n * 静的ページ書き出し専用の Writer。\n *\n * `Root.render()` と `Root.collectCssStyleString()` のみを使用し、\n * runtime prelude / `Root.renderJs()` / `Root.renderVanillaScript()` /\n * `FileExporter` のいずれにも依存しない。JS ファイル(`runtime.js`,\n * `app.js`, `script.js` など)は一切生成しない。\n *\n * design.md §6.4 のサービス契約に対応する。\n *\n * @public\n */\nexport class StaticPageWriter {\n /**\n * `root` を `outputPath` 配下に静的ファイルとして書き出す。\n *\n * - デフォルト(`inlineCss=true`)では `index.html` のみ出力し、\n * CSS を `<style>` タグとして `</head>` 直前に埋め込む。\n * - `inlineCss=false` のときは `index.html` と `style.css` を出力し、\n * `<link rel=\"stylesheet\">` を `</head>` 直前に挿入する。\n * - CSS が空文字列の場合は CSS 関連の出力・挿入を完全にスキップする。\n *\n * @param root - 静的検証済みの {@link Root}\n * @param outputPath - 出力先ディレクトリパス\n * @param options - 書き出しオプション\n *\n * @throws {@link ExportableError}\n * - `invalidPath`: `outputPath` が空文字列\n * - `writeFailed`: ディレクトリ作成またはファイル書き込みに失敗\n */\n write(root: Root, outputPath: string, options?: StaticExportOptions): void {\n if (outputPath.length === 0) {\n throw new ExportableError(\n 'invalidPath',\n outputPath,\n 'Output path must not be empty',\n );\n }\n\n const htmlFileName = options?.htmlFileName ?? 'index.html';\n const cssFileName = options?.cssFileName ?? 'style.css';\n const inlineCss = options?.inlineCss ?? true;\n\n // Root からは render() / collectCssStyleString() のみを呼ぶ。\n // renderJs() / renderVanillaScript() / collectJsContent() / export() には依存しない。\n const htmlContent = root.render();\n const cssContent = root.collectCssStyleString();\n const hasCss = cssContent.trim().length > 0;\n\n // ディレクトリを作成(存在しない場合は再帰的に)\n try {\n mkdirSync(outputPath, { recursive: true });\n } catch (error) {\n throw new ExportableError(\n 'writeFailed',\n outputPath,\n `Failed to create directory: ${errorToString(error)}`,\n );\n }\n\n // HTML へ CSS を埋め込む / link を挿入する\n let finalHtml = htmlContent;\n if (hasCss) {\n const headEndIndex = finalHtml.indexOf('</head>');\n if (headEndIndex !== -1) {\n const insertion = inlineCss\n ? `<style>\\n${cssContent}\\n</style>\\n`\n : `<link rel=\"stylesheet\" href=\"${cssFileName}\">\\n`;\n finalHtml =\n finalHtml.slice(0, headEndIndex) +\n insertion +\n finalHtml.slice(headEndIndex);\n }\n }\n\n try {\n writeFileSync(join(outputPath, htmlFileName), finalHtml, 'utf-8');\n if (hasCss && !inlineCss) {\n writeFileSync(join(outputPath, cssFileName), cssContent, 'utf-8');\n }\n } catch (error) {\n throw new ExportableError(\n 'writeFailed',\n outputPath,\n `Failed to write files: ${errorToString(error)}`,\n );\n }\n }\n}\n","import { Root } from '../html/elements/root.js';\nimport { HtmlTag } from '../html/elements/html-tag.js';\nimport { TextType } from '../html/elements/text-type.js';\nimport { body, head, html, main, meta, title } from '../html/tags/index.js';\nimport { StaticPageWriter, type StaticExportOptions } from './static-page-writer.js';\nimport type { PageOptions, StaticView } from './types.js';\n\nexport type { StaticExportOptions } from './static-page-writer.js';\n\n/**\n * 静的ページの境界オブジェクト。\n *\n * 内部で {@link Root} を保持するが外部 API では露出しない。\n * `render()` は HTML + inline CSS を返し、`export()` は {@link StaticPageWriter} に委譲する。\n *\n * design.md §6.3 / requirements.md 4.2, 5.1, 5.2 に対応。\n *\n * 構築時 pure validation を {@link page} ファクトリで 1 度だけ実施するため、\n * `render()` / `export()` 側では再検証しない(冪等性)。\n */\nexport class PageDocument {\n private readonly _root: Root;\n\n /**\n * @internal `page()` ファクトリからのみ呼び出されることを想定する。\n * 外部から直接構築すると静的性検証を素通りするため非推奨。\n */\n constructor(root: Root) {\n this._root = root;\n }\n\n render(): string {\n const htmlStr = this._root.render();\n const css = this._root.collectCssStyleString();\n if (css.length === 0) return htmlStr;\n const styleTag = `<style>\\n${css}\\n</style>`;\n const insertPoint = htmlStr.indexOf('</head>');\n if (insertPoint === -1) return htmlStr;\n return `${htmlStr.slice(0, insertPoint)}${styleTag}\\n${htmlStr.slice(insertPoint)}`;\n }\n\n export(outputPath: string, options?: StaticExportOptions): void {\n new StaticPageWriter().write(this._root, outputPath, options);\n }\n}\n\n/**\n * `arg` が `PageOptions` かどうかを判別する内部型ガード。\n *\n * `StaticView` は `protoRender` プロパティを持つ(design.md §6.1)ため、\n * `protoRender` が存在しないオブジェクトを `PageOptions` として扱う。\n */\nfunction isPageOptions(arg: unknown): arg is PageOptions {\n return typeof arg === 'object' && arg !== null && !('protoRender' in arg);\n}\n\n/**\n * 静的ページのファクトリ。\n *\n * design.md §6.2 に準拠し `StaticView` を受け取り {@link PageDocument} を返す。\n *\n * **レイアウト契約**: 渡した StaticView は `<main>` の直接の子として縦方向に積まれる(ブロックフロー)。\n * ページルート自体のレイアウト変更は不可。横並び等が必要な場合は View 側でコンテナを組むこと。\n *\n * 構築時 pure validation:\n * - 新規 `Root` 構築直後に `_root.collectUsedMethods()` / `_root.collectJsContent()`\n * を 1 回だけ読み取り専用 walk として実行する。\n * - いずれかが非空なら `Error('page surface does not allow runtime content: <hint>')`\n * を throw し、`PageDocument` は生成されない(requirements.md 3.2)。\n * - `protoRender()` は呼ばないため `RenderContext.registry.reset()` 等の\n * レンダー副作用は発生しない(design.md §6.3 冪等性)。\n */\n// View のみ(options なし)\nexport function page(...views: StaticView[]): PageDocument;\n// Views + options(末尾)\nexport function page(...args: [...StaticView[], PageOptions]): PageDocument;\nexport function page(...args: (StaticView | PageOptions)[]): PageDocument {\n const lastArg = args[args.length - 1];\n const options = args.length > 0 && isPageOptions(lastArg) ? (lastArg as PageOptions) : undefined;\n const views = options !== undefined ? (args.slice(0, -1) as StaticView[]) : (args as StaticView[]);\n const root = new Root();\n root.setDoctype(true);\n\n const charsetMeta = meta({ charset: options?.charset ?? 'UTF-8' });\n\n const viewportMeta = options?.viewport !== undefined\n ? meta({ name: 'viewport', content: options.viewport })\n : undefined;\n\n const descriptionMeta = options?.description !== undefined\n ? meta({ name: 'description', content: options.description })\n : undefined;\n\n const titleEl = title(options?.title ?? '');\n\n const metaList = [charsetMeta, viewportMeta, descriptionMeta, titleEl]\n .filter((el): el is NonNullable<typeof el> => el !== undefined);\n\n const headEl = head(...metaList);\n // `StaticView` は narrow interface(design.md §6.1)であり、`HtmlTag`\n // が構造的にこれを満たす。`main(...)` / `body(...)` はタグ構築側の `ChildArg` 型を\n // 期待するため、ここで `unknown` 経由のキャストでブリッジする(design.md §6.2)。\n // `HtmlTag` インスタンスでない純粋な `StaticView`(AppSlot 等)は\n // `TextType.raw(protoRender())` でラップしてから渡す。\n const resolvedViews = views.map((v) =>\n v instanceof HtmlTag ? v : TextType.raw(v.protoRender()),\n );\n const mainEl = main(...(resolvedViews as unknown as Parameters<typeof main>));\n const bodyEl = body(mainEl as unknown as Parameters<typeof body>[0]);\n const htmlEl = options?.lang !== undefined\n ? html({ lang: options.lang }, headEl, bodyEl)\n : html(headEl, bodyEl);\n\n root.addChild(htmlEl);\n\n // 構築時 pure validation: runtime 担持を 1 回だけ検査(読み取り専用 walk)。\n const usedMethods = root.collectUsedMethods();\n const jsContent = root.collectJsContent();\n if (usedMethods.size > 0 || jsContent.length > 0) {\n const hints: string[] = [];\n if (usedMethods.size > 0) {\n hints.push(`jQuery methods=[${Array.from(usedMethods).join(',')}]`);\n }\n if (jsContent.length > 0) {\n hints.push('inline js content');\n }\n throw new Error(\n `page surface does not allow runtime content: ${hints.join('; ')}`,\n );\n }\n\n return new PageDocument(root);\n}\n","/**\n * Alignment 定数と型定義\n *\n * SwiftUI の Alignment に対応する CSS 値の定数を提供する。\n */\n\nexport const Alignment = {\n center: 'center',\n leading: 'flex-start',\n trailing: 'flex-end',\n top: 'flex-start',\n bottom: 'flex-end',\n} as const;\n\nexport type AlignmentValue = typeof Alignment[keyof typeof Alignment];\n\nexport const ZStackAlignment = {\n center: { alignItems: 'center', justifyContent: 'center' },\n topLeading: { alignItems: 'flex-start', justifyContent: 'flex-start' },\n topTrailing: { alignItems: 'flex-start', justifyContent: 'flex-end' },\n bottomLeading: { alignItems: 'flex-end', justifyContent: 'flex-start' },\n bottomTrailing:{ alignItems: 'flex-end', justifyContent: 'flex-end' },\n top: { alignItems: 'flex-start', justifyContent: 'center' },\n bottom: { alignItems: 'flex-end', justifyContent: 'center' },\n leading: { alignItems: 'center', justifyContent: 'flex-start' },\n trailing: { alignItems: 'center', justifyContent: 'flex-end' },\n} as const;\n\nexport type ZStackAlignmentKey = keyof typeof ZStackAlignment;\n","/**\n * layout-factories.ts\n *\n * SwiftUI ライクなレイアウトコンテナファクトリ関数。\n * hstack / vstack / zstack / spacer / divider を提供する。\n *\n * Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.3, 3.4,\n * 4.1, 4.2, 4.3, 4.4, 5.1, 5.2, 5.3, 5.4\n */\nimport { PairType } from '../elements/pair-type.js';\nimport { TextType } from '../elements/text-type.js';\nimport type { StackOptions, ZStackOptions, SpacerOptions, LayoutChild } from './layout-types.js';\nimport { ZStackAlignment } from '../../css/constants/alignment.js';\n\n// ---------------------------------------------------------------------------\n// 内部ヘルパー\n// ---------------------------------------------------------------------------\n\n/**\n * `LayoutChild` が `StackOptions` かどうかを判定するランタイム型ガード。\n *\n * `StackOptions` はプレーンオブジェクトで、`PairType`(HtmlTag サブクラス)\n * でも string でもないものを StackOptions とみなす。\n *\n * @internal\n */\nfunction isStackOptions(\n value: StackOptions | LayoutChild | undefined,\n): value is StackOptions {\n if (value === undefined) return false;\n if (typeof value === 'string') return false;\n // LayoutChild の HtmlTag サブクラスかどうかは constructor.name や instanceof で判定する。\n // PairType は HtmlTag → Object の継承チェーンを持つため、\n // 'tagType' プロパティの有無でタグ要素と判別する。\n if (typeof value === 'object' && 'tagType' in value) return false;\n return true;\n}\n\n/**\n * 子要素リストを PairType に追加するユーティリティ。\n *\n * - string → TextType (escape: true) に変換して追加\n * - HtmlTag → そのまま追加\n *\n * @internal\n */\nfunction addChildren(tag: PairType, children: LayoutChild[]): void {\n for (const child of children) {\n if (typeof child === 'string') {\n tag.addChild(new TextType(child, { escape: true }));\n } else {\n tag.addChild(child);\n }\n }\n}\n\n/**\n * flex スタックコンテナの基礎 PairType を作成し、\n * オプションに基づいて flex CSS プロパティを設定する。\n *\n * @param direction - 'row' (hstack) または 'column' (vstack)\n * @param options - StackOptions\n * @returns 設定済み PairType\n *\n * @internal\n */\nfunction makeStack(direction: 'row' | 'column', options: StackOptions): PairType {\n const tag = new PairType('div');\n\n // display: flex + flex-direction\n tag.style.flex.setFlex({ direction });\n\n // spacing → gap\n if (options.spacing !== undefined) {\n tag.style.flex.setGap(`${options.spacing}px`);\n }\n\n // alignment → align-items\n if (options.alignment !== undefined) {\n tag.style.flex.setAlignItems(options.alignment);\n }\n\n // wrap → flex-wrap: wrap\n if (options.wrap === true) {\n tag.style.flex.setFlexWrap('wrap');\n }\n\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * 水平スタックコンテナ(display: flex; flex-direction: row)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * hstack() // 空コンテナ\n * hstack(child1, child2) // 子要素のみ\n * hstack({ spacing: 12 }) // オプションのみ\n * hstack({ spacing: 8, alignment: 'center' }, child1, child2) // オプション + 子要素\n * ```\n *\n * **生成 CSS:**\n * - `display: flex; flex-direction: row`\n * - `spacing` → `gap: {n}px`\n * - `alignment` → `align-items: {value}`\n * - `wrap: true` → `flex-wrap: wrap`\n *\n * Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6\n *\n * @param optionsOrChild - StackOptions または最初の子要素(省略可)\n * @param children - 追加の子要素\n * @returns display:flex; flex-direction:row が設定された PairType\n */\nexport function hstack(\n optionsOrChild?: StackOptions | LayoutChild,\n ...children: LayoutChild[]\n): PairType {\n if (isStackOptions(optionsOrChild)) {\n const tag = makeStack('row', optionsOrChild);\n addChildren(tag, children);\n return tag;\n }\n\n // optionsOrChild は LayoutChild または undefined\n const tag = makeStack('row', {});\n if (optionsOrChild !== undefined) {\n addChildren(tag, [optionsOrChild, ...children]);\n } else {\n addChildren(tag, children);\n }\n return tag;\n}\n\n/**\n * 垂直スタックコンテナ(display: flex; flex-direction: column)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * vstack() // 空コンテナ\n * vstack(child1, child2) // 子要素のみ\n * vstack({ spacing: 14 }) // オプションのみ\n * vstack({ spacing: 8, alignment: 'center' }, child1, child2) // オプション + 子要素\n * ```\n *\n * **生成 CSS:**\n * - `display: flex; flex-direction: column`\n * - `spacing` → `gap: {n}px`\n * - `alignment` → `align-items: {value}`\n * - `wrap: true` → `flex-wrap: wrap`\n *\n * Requirements: 2.1, 2.2, 2.3, 2.4\n *\n * @param optionsOrChild - StackOptions または最初の子要素(省略可)\n * @param children - 追加の子要素\n * @returns display:flex; flex-direction:column が設定された PairType\n */\nexport function vstack(\n optionsOrChild?: StackOptions | LayoutChild,\n ...children: LayoutChild[]\n): PairType {\n if (isStackOptions(optionsOrChild)) {\n const tag = makeStack('column', optionsOrChild);\n addChildren(tag, children);\n return tag;\n }\n\n // optionsOrChild は LayoutChild または undefined\n const tag = makeStack('column', {});\n if (optionsOrChild !== undefined) {\n addChildren(tag, [optionsOrChild, ...children]);\n } else {\n addChildren(tag, children);\n }\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// ZStack 内部ヘルパー\n// ---------------------------------------------------------------------------\n\n/**\n * `ZStackOptions | LayoutChild | undefined` が `ZStackOptions` かどうかを判定するランタイム型ガード。\n *\n * @internal\n */\nfunction isZStackOptions(\n value: ZStackOptions | LayoutChild | undefined,\n): value is ZStackOptions {\n if (value === undefined) return false;\n if (typeof value === 'string') return false;\n // HtmlTag サブクラスは 'tagType' プロパティを持つ\n if (typeof value === 'object' && 'tagType' in value) return false;\n return true;\n}\n\n/**\n * ZStack グリッドコンテナの PairType を作成し、\n * CSS Grid overlap 方式のプロパティを設定する。\n *\n * CSS: `display:grid; grid-template-areas:\"stack\"; grid-template-rows:1fr; grid-template-columns:1fr`\n * デフォルト alignment: ZStackAlignment.center(align-items:center; justify-content:center)\n *\n * @param options - ZStackOptions\n * @returns 設定済み PairType\n *\n * @internal\n */\nfunction makeZStack(options: ZStackOptions): PairType {\n const tag = new PairType('div');\n\n // display:grid + grid-template-areas + rows/columns(CSS Grid overlap 方式)\n tag.style.grid.setGrid({ areas: '\"stack\"', rows: '1fr', columns: '1fr' });\n\n // alignment → align-items / justify-content\n // ZStackOptions.alignment が未指定の場合はデフォルト 'center' を使用する\n const alignKey = options.alignment ?? 'center';\n const { alignItems, justifyContent } = ZStackAlignment[alignKey];\n tag.style.flex.setAlignItems(alignItems);\n tag.style.flex.setJustifyContent(justifyContent);\n\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API: zstack\n// ---------------------------------------------------------------------------\n\n/**\n * 重ね合わせスタックコンテナ(CSS Grid overlap 方式)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * zstack() // 空コンテナ(デフォルト: center/center)\n * zstack(child1, child2) // 子要素のみ\n * zstack({ alignment: 'topLeading' }) // オプションのみ\n * zstack({ alignment: 'center' }, child1) // オプション + 子要素\n * ```\n *\n * **生成 CSS:**\n * - `display: grid`\n * - `grid-template-areas: \"stack\"`\n * - `grid-template-rows: 1fr`\n * - `grid-template-columns: 1fr`\n * - `align-items: center`(デフォルト)\n * - `justify-content: center`(デフォルト)\n *\n * **注意:** 子要素への `grid-area: stack` の自動適用は行わない。\n *\n * Requirements: 3.1, 3.2, 3.3, 3.4\n *\n * @param optionsOrChild - ZStackOptions または最初の子要素(省略可)\n * @param children - 追加の子要素\n * @returns CSS Grid overlap が設定された PairType\n */\nexport function zstack(\n optionsOrChild?: ZStackOptions | LayoutChild,\n ...children: LayoutChild[]\n): PairType {\n if (isZStackOptions(optionsOrChild)) {\n const tag = makeZStack(optionsOrChild);\n addChildren(tag, children);\n return tag;\n }\n\n // optionsOrChild は LayoutChild または undefined\n const tag = makeZStack({});\n if (optionsOrChild !== undefined) {\n addChildren(tag, [optionsOrChild, ...children]);\n }\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API: spacer\n// ---------------------------------------------------------------------------\n\n/**\n * フレキシブルスペーサー(flex:1 1 auto)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * spacer() // flex:1 1 auto のみ\n * spacer({ minLength: 8 }) // flex:1 1 auto; min-width:8px\n * ```\n *\n * **生成 CSS:**\n * - `flex: 1 1 auto`\n * - `minLength` → `min-width: {n}px`\n *\n * Requirements: 4.1, 4.2, 4.3, 4.4\n *\n * @param options - SpacerOptions(省略可)\n * @returns flex:1 1 auto が設定された PairType\n */\nexport function spacer(options?: SpacerOptions): PairType {\n const tag = new PairType('div');\n\n // flex: 1 1 auto(スペーサーの基本動作)\n tag.style.flex.setFlexValue('1 1 auto');\n\n // minLength → min-width:{n}px\n if (options?.minLength !== undefined) {\n tag.minWidth(`${options.minLength}px`);\n }\n\n return tag;\n}\n\n// ---------------------------------------------------------------------------\n// Public API: divider\n// ---------------------------------------------------------------------------\n\n/**\n * 区切り線(水平または垂直)を生成するファクトリ。\n *\n * **呼び出しパターン:**\n * ```typescript\n * divider() // 水平区切り線(デフォルト)\n * divider('horizontal') // 水平区切り線\n * divider('vertical') // 垂直区切り線\n * ```\n *\n * **生成 CSS:**\n * - 水平: `height:1px; background:currentColor; opacity:0.15; width:100%`\n * - 垂直: `width:1px; background:currentColor; opacity:0.15; align-self:stretch`\n *\n * Requirements: 5.1, 5.2, 5.3, 5.4\n *\n * @param direction - 'horizontal'(デフォルト)または 'vertical'\n * @returns 区切り線 CSS が設定された PairType\n */\nexport function divider(direction: 'horizontal' | 'vertical' = 'horizontal'): PairType {\n const tag = new PairType('div');\n\n // 共通スタイル\n tag.background('currentColor');\n tag.opacity('0.15');\n\n if (direction === 'vertical') {\n // 垂直区切り線\n tag.width('1px');\n tag.style.flex.setAlignSelf('stretch');\n } else {\n // 水平区切り線(デフォルト)\n tag.height('1px');\n tag.width('100%');\n }\n\n return tag;\n}\n","import { a, button, h1, h2, h3, h4, h5, h6, img, p, section } from '../html/tags/index.js';\nimport { hstack, spacer, vstack } from '../html/layout/layout-factories.js';\nimport type { ButtonOptions, HeadingLevel, LinkOptions, View } from './types.js';\nimport type { StackOptions, SpacerOptions } from '../html/layout/layout-types.js';\nimport type { PairType } from '../html/elements/pair-type.js';\nimport type { SelfClosingType } from '../html/elements/self-closing-type.js';\nimport type { LayoutChild } from '../html/layout/layout-types.js';\n\nexport function VStack(options?: StackOptions, ...children: View[]): PairType {\n if (options !== undefined) {\n return vstack(options, ...(children as LayoutChild[]));\n }\n const [first, ...rest] = children as LayoutChild[];\n return first !== undefined ? vstack(first, ...rest) : vstack();\n}\n\nexport function HStack(options?: StackOptions, ...children: View[]): PairType {\n if (options !== undefined) {\n return hstack(options, ...(children as LayoutChild[]));\n }\n const [first, ...rest] = children as LayoutChild[];\n return first !== undefined ? hstack(first, ...rest) : hstack();\n}\n\nexport function Text(content: string): PairType {\n return p(content);\n}\n\nexport function Image(src: string, alt: string): SelfClosingType {\n return img({ src, alt });\n}\n\nexport function Section(...children: View[]): PairType {\n return section(...children);\n}\n\nexport function Spacer(options?: SpacerOptions): PairType {\n return spacer(options);\n}\n\nexport function Heading(level: HeadingLevel, content: string): PairType {\n switch (level) {\n case 1: return h1(content);\n case 2: return h2(content);\n case 3: return h3(content);\n case 4: return h4(content);\n case 5: return h5(content);\n case 6: return h6(content);\n default: throw new Error(`invalid heading level: ${level}`);\n }\n}\n\nexport function Link(options: LinkOptions, ...children: View[]): PairType {\n const attrs: Record<string, string> = { href: options.href };\n if (options.target !== undefined) {\n attrs.target = options.target;\n }\n if (options.rel !== undefined) {\n attrs.rel = options.rel;\n } else if (options.target === '_blank') {\n attrs.rel = 'noopener noreferrer';\n }\n return a(attrs, ...children);\n}\n\nexport function Button(options: ButtonOptions | undefined, ...children: View[]): PairType {\n const type = options?.type ?? 'button';\n return button({ type }, ...children);\n}\n","import type { RenderContext } from '../html/elements/render-context.js';\nimport type { StaticView } from './types.js';\n\n/**\n * AppSlot — マウントポイントを表す StaticView プリミティブ。\n *\n * `data-draftole-mount` 属性を持つ `<div>` を生成し、\n * ランタイム系の App コンポーネントをマウントする際の\n * プレースホルダとして機能する。\n *\n * - `protoRender()` は `<div data-draftole-mount=\"${id}\"></div>` を返す。\n * - `collectCssStyleString()` は空文字列を返す(CSS なし)。\n * - runtime メソッド(jqm / state / script 等)は持たない。\n * - `app/` モジュールへの依存を持たない。\n */\nexport interface AppSlotOptions {\n readonly id: string;\n}\n\nexport function AppSlot(options: AppSlotOptions): StaticView;\nexport function AppSlot(id: string): StaticView;\nexport function AppSlot(optionsOrId: AppSlotOptions | string): StaticView {\n const id = typeof optionsOrId === 'string' ? optionsOrId : optionsOrId.id;\n\n if (id === '') {\n throw new Error('AppSlot id must be a non-empty string');\n }\n\n return {\n protoRender(_ctx?: RenderContext): string {\n return `<div data-draftole-mount=\"${id}\"></div>`;\n },\n collectCssStyleString(): string {\n return '';\n },\n };\n}\n"],"mappings":"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","names":["tag"]}