@flux-lang/render-html 0.1.1

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.
@@ -0,0 +1,36 @@
1
+ import type { RenderDocumentIR } from "@flux-lang/core";
2
+ export interface RenderHtmlAsset {
3
+ id: string;
4
+ url: string;
5
+ }
6
+ export interface RenderHtmlResult {
7
+ html: string;
8
+ css: string;
9
+ assets: RenderHtmlAsset[];
10
+ slots: Record<string, string>;
11
+ }
12
+ export interface RenderHtmlOptions {
13
+ hyphenate?: boolean;
14
+ page?: {
15
+ width: number;
16
+ height: number;
17
+ units: string;
18
+ };
19
+ margins?: {
20
+ top: number;
21
+ right: number;
22
+ bottom: number;
23
+ left: number;
24
+ units: string;
25
+ };
26
+ fonts?: {
27
+ body: string;
28
+ heading: string;
29
+ mono: string;
30
+ };
31
+ assetUrl?: (assetId: string) => string;
32
+ rawUrl?: (raw: string) => string;
33
+ }
34
+ export declare function renderHtml(doc: RenderDocumentIR, options?: RenderHtmlOptions): RenderHtmlResult;
35
+ export declare function renderSlotMap(doc: RenderDocumentIR, options?: RenderHtmlOptions): Record<string, string>;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAIjB,MAAM,iBAAiB,CAAC;AAIzB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAClC;AAYD,wBAAgB,UAAU,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAyBnG;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY5G"}
package/dist/index.js ADDED
@@ -0,0 +1,1000 @@
1
+ import Hypher from "hypher";
2
+ import enUsPatterns from "hyphenation.en-us";
3
+ const DEFAULT_PAGE = { width: 8.5, height: 11, units: "in" };
4
+ const DEFAULT_MARGINS = { top: 1, right: 1, bottom: 1.1, left: 1, units: "in" };
5
+ const DEFAULT_FONTS = {
6
+ body: '"Iowan Old Style", "Palatino Linotype", Palatino, "Times New Roman", serif',
7
+ heading: '"Iowan Old Style", "Palatino Linotype", Palatino, "Times New Roman", serif',
8
+ mono: '"Source Code Pro", "Courier New", monospace',
9
+ };
10
+ const hyphenator = new Hypher(enUsPatterns);
11
+ export function renderHtml(doc, options = {}) {
12
+ const page = options.page ?? doc.pageConfig?.size ?? DEFAULT_PAGE;
13
+ const margins = options.margins ?? DEFAULT_MARGINS;
14
+ const fonts = options.fonts ?? DEFAULT_FONTS;
15
+ const css = buildCss(doc, page, margins, fonts);
16
+ const assets = doc.assets.map((asset) => ({ id: asset.id, url: asset.path }));
17
+ const slotMap = {};
18
+ const theme = doc.theme ?? "screen";
19
+ const html = [
20
+ `<main class="flux-doc" data-flux-docstep="${doc.docstep}" data-flux-theme="${escapeAttr(theme)}">`,
21
+ doc.body
22
+ .map((node) => renderNode(node, {
23
+ hyphenate: options.hyphenate !== false,
24
+ slots: slotMap,
25
+ assetUrl: options.assetUrl,
26
+ rawUrl: options.rawUrl,
27
+ }))
28
+ .join(""),
29
+ `</main>`,
30
+ ].join("");
31
+ return { html, css, assets, slots: slotMap };
32
+ }
33
+ export function renderSlotMap(doc, options = {}) {
34
+ const slotMap = {};
35
+ const renderOptions = {
36
+ hyphenate: options.hyphenate !== false,
37
+ slots: slotMap,
38
+ assetUrl: options.assetUrl,
39
+ rawUrl: options.rawUrl,
40
+ };
41
+ doc.body.forEach((node) => {
42
+ renderNode(node, renderOptions);
43
+ });
44
+ return slotMap;
45
+ }
46
+ function buildCss(doc, page, margins, fonts) {
47
+ const pageWidth = `${page.width}${page.units}`;
48
+ const pageHeight = `${page.height}${page.units}`;
49
+ const marginTop = `${margins.top}${margins.units}`;
50
+ const marginRight = `${margins.right}${margins.units}`;
51
+ const marginBottom = `${margins.bottom}${margins.units}`;
52
+ const marginLeft = `${margins.left}${margins.units}`;
53
+ const styleCss = buildStyleCss(doc.styles ?? []);
54
+ return `
55
+ :root {
56
+ --page-width: ${pageWidth};
57
+ --page-height: ${pageHeight};
58
+ --page-margin-top: ${marginTop};
59
+ --page-margin-right: ${marginRight};
60
+ --page-margin-bottom: ${marginBottom};
61
+ --page-margin-left: ${marginLeft};
62
+ }
63
+
64
+ @page {
65
+ size: ${pageWidth} ${pageHeight};
66
+ margin: ${marginTop} ${marginRight} ${marginBottom} ${marginLeft};
67
+ }
68
+
69
+ * { box-sizing: border-box; }
70
+
71
+ body {
72
+ margin: 0;
73
+ background: #ebe6df;
74
+ }
75
+
76
+ .flux-doc {
77
+ --doc-bg: #ebe6df;
78
+ --page-bg: #fffdf9;
79
+ --page-border: #d8d0c4;
80
+ --page-shadow: 0 16px 30px rgba(20, 12, 8, 0.18);
81
+ --page-number-color: #5f5a52;
82
+ --rule-color: #d1c8bb;
83
+ --link-color: #2b4c7e;
84
+ counter-reset: flux-page;
85
+ padding: 32px;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 32px;
89
+ align-items: center;
90
+ color: #141414;
91
+ font-family: ${fonts.body};
92
+ font-size: 10.8pt;
93
+ line-height: 1.4;
94
+ font-kerning: normal;
95
+ font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
96
+ text-rendering: optimizeLegibility;
97
+ }
98
+
99
+ .flux-doc[data-flux-theme="print"] {
100
+ --doc-bg: #ffffff;
101
+ --page-bg: #ffffff;
102
+ --page-border: transparent;
103
+ --page-shadow: none;
104
+ --page-number-color: #222222;
105
+ --rule-color: #bbbbbb;
106
+ --link-color: #000000;
107
+ }
108
+
109
+ .flux-doc[data-flux-theme="screen"] {
110
+ --doc-bg: #ebe6df;
111
+ }
112
+
113
+ .flux-page {
114
+ width: var(--page-width);
115
+ height: var(--page-height);
116
+ background: var(--page-bg);
117
+ color: inherit;
118
+ box-shadow: var(--page-shadow);
119
+ border: 1px solid var(--page-border);
120
+ position: relative;
121
+ counter-increment: flux-page;
122
+ display: flex;
123
+ flex-direction: column;
124
+ overflow: hidden;
125
+ }
126
+
127
+ .flux-page-inner {
128
+ flex: 1;
129
+ padding: var(--page-margin-top) var(--page-margin-right) var(--page-margin-bottom) var(--page-margin-left);
130
+ }
131
+
132
+ .flux-page-number {
133
+ position: absolute;
134
+ bottom: 0.45in;
135
+ left: 0;
136
+ right: 0;
137
+ text-align: center;
138
+ font-size: 9pt;
139
+ color: var(--page-number-color);
140
+ letter-spacing: 0.08em;
141
+ }
142
+
143
+ .flux-page-number::after {
144
+ content: counter(flux-page);
145
+ }
146
+
147
+ .flux-section {
148
+ margin: 0 0 18px 0;
149
+ }
150
+
151
+ .flux-text {
152
+ margin: 0 0 12px 0;
153
+ text-align: justify;
154
+ text-justify: inter-word;
155
+ hyphens: manual;
156
+ widows: 2;
157
+ orphans: 2;
158
+ }
159
+
160
+ .flux-text.inline {
161
+ margin: 0;
162
+ text-align: inherit;
163
+ }
164
+
165
+ .flux-text-title,
166
+ .flux-text-subtitle,
167
+ .flux-text-heading,
168
+ .flux-text-edition,
169
+ .flux-text-label,
170
+ .flux-text-caption,
171
+ .flux-text-credit,
172
+ .flux-text-note,
173
+ .flux-text-sample,
174
+ .flux-text-list,
175
+ .flux-text-end {
176
+ font: inherit;
177
+ }
178
+
179
+ .flux-row {
180
+ display: flex;
181
+ gap: 16px;
182
+ }
183
+
184
+ .flux-column {
185
+ display: flex;
186
+ flex-direction: column;
187
+ gap: 12px;
188
+ }
189
+
190
+ .flux-figure {
191
+ margin: 0 0 16px 0;
192
+ }
193
+
194
+ .flux-figure img {
195
+ width: 100%;
196
+ height: auto;
197
+ display: block;
198
+ }
199
+
200
+ .flux-figure figcaption {
201
+ margin-top: 6px;
202
+ }
203
+
204
+ .flux-image {
205
+ display: block;
206
+ max-width: 100%;
207
+ height: auto;
208
+ }
209
+
210
+ .flux-blockquote {
211
+ margin: 12px 0;
212
+ padding: 0 0 0 12px;
213
+ border-left: 2px solid var(--rule-color);
214
+ }
215
+
216
+ .flux-codeblock {
217
+ margin: 12px 0;
218
+ padding: 10px 12px;
219
+ background: #f4f0e9;
220
+ border-radius: 6px;
221
+ border: 1px solid #e2dccf;
222
+ font-family: ${fonts.mono};
223
+ font-size: 9.5pt;
224
+ white-space: pre-wrap;
225
+ }
226
+
227
+ .flux-codeblock code {
228
+ font-family: inherit;
229
+ }
230
+
231
+ .flux-callout {
232
+ margin: 12px 0;
233
+ padding: 12px 14px;
234
+ border-radius: 8px;
235
+ background: #f6f1e8;
236
+ border: 1px solid #d9d0c4;
237
+ }
238
+
239
+ .flux-callout-info {
240
+ border-left: 4px solid #7c8aa0;
241
+ }
242
+
243
+ .flux-callout-warn {
244
+ border-left: 4px solid #b65f32;
245
+ }
246
+
247
+ .flux-callout-note {
248
+ border-left: 4px solid #7b6b5d;
249
+ }
250
+
251
+ .flux-table {
252
+ width: 100%;
253
+ border-collapse: collapse;
254
+ font-size: 9.5pt;
255
+ }
256
+
257
+ .flux-table th,
258
+ .flux-table td {
259
+ border-bottom: 1px solid var(--rule-color);
260
+ padding: 4px 6px;
261
+ vertical-align: top;
262
+ }
263
+
264
+ .flux-hr {
265
+ border: none;
266
+ border-top: 1px solid var(--rule-color);
267
+ margin: 12px 0;
268
+ }
269
+
270
+ .flux-list {
271
+ margin: 8px 0 12px;
272
+ padding-left: 1.4em;
273
+ }
274
+
275
+ .flux-list li {
276
+ margin: 4px 0;
277
+ }
278
+
279
+ .flux-smallcaps {
280
+ font-variant: small-caps;
281
+ letter-spacing: 0.04em;
282
+ }
283
+
284
+ .flux-link {
285
+ color: var(--link-color);
286
+ text-decoration: none;
287
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
288
+ }
289
+
290
+ .flux-mark {
291
+ background: #fef3c7;
292
+ padding: 0 0.12em;
293
+ }
294
+
295
+ code,
296
+ .flux-code {
297
+ font-family: ${fonts.mono};
298
+ font-size: 0.95em;
299
+ }
300
+
301
+ .flux-footnote-ref {
302
+ font-size: 0.75em;
303
+ vertical-align: super;
304
+ }
305
+
306
+ .flux-footnotes {
307
+ margin-top: 18px;
308
+ padding-top: 8px;
309
+ border-top: 1px solid var(--rule-color);
310
+ font-size: 8.5pt;
311
+ color: #5f5a52;
312
+ }
313
+
314
+ .flux-footnotes ol {
315
+ margin: 0;
316
+ padding-left: 1.2em;
317
+ }
318
+
319
+ .flux-footnotes li {
320
+ margin: 4px 0;
321
+ }
322
+
323
+ .flux-grid {
324
+ display: grid;
325
+ gap: 4px;
326
+ border: 1px solid #bdb7ad;
327
+ padding: 6px;
328
+ font-size: 10pt;
329
+ }
330
+
331
+ .flux-grid-cell {
332
+ border: 1px solid #d3cdc3;
333
+ padding: 4px;
334
+ min-height: 18px;
335
+ background: #fbf8f2;
336
+ }
337
+
338
+ .flux-slot,
339
+ .flux-inline-slot {
340
+ position: relative;
341
+ overflow: hidden;
342
+ }
343
+
344
+ .flux-slot {
345
+ display: block;
346
+ border: 1px solid #d2cbc0;
347
+ background: #ffffff;
348
+ border-radius: 3px;
349
+ }
350
+
351
+ .flux-inline-slot {
352
+ display: inline-block;
353
+ vertical-align: baseline;
354
+ padding: 0 0.15em;
355
+ border-radius: 0.2em;
356
+ background: rgba(234, 228, 216, 0.7);
357
+ border: none;
358
+ }
359
+
360
+ .flux-slot-inner {
361
+ width: 100%;
362
+ height: 100%;
363
+ position: relative;
364
+ }
365
+
366
+ .flux-inline-slot .flux-slot-inner {
367
+ display: inline-block;
368
+ min-width: 100%;
369
+ line-height: inherit;
370
+ }
371
+
372
+ .flux-transition {
373
+ position: relative;
374
+ --flux-dur: 220ms;
375
+ --flux-ease: cubic-bezier(0.4, 0, 0.2, 1);
376
+ }
377
+
378
+ .flux-transition .flux-layer {
379
+ position: absolute;
380
+ inset: 0;
381
+ width: 100%;
382
+ height: 100%;
383
+ pointer-events: none;
384
+ }
385
+
386
+ .flux-transition .flux-layer--sizer {
387
+ position: relative;
388
+ inset: auto;
389
+ width: auto;
390
+ height: auto;
391
+ visibility: hidden;
392
+ }
393
+
394
+ .flux-transition .flux-layer--old {
395
+ z-index: 1;
396
+ }
397
+
398
+ .flux-transition .flux-layer--new {
399
+ z-index: 2;
400
+ }
401
+
402
+ .flux-transition .flux-layer--flash {
403
+ z-index: 3;
404
+ }
405
+
406
+ .flux-transition--fade .flux-layer--old {
407
+ opacity: 1;
408
+ }
409
+
410
+ .flux-transition--fade .flux-layer--new {
411
+ opacity: 0;
412
+ }
413
+
414
+ .flux-transition--fade.is-active .flux-layer--old {
415
+ opacity: 0;
416
+ transition: opacity var(--flux-dur) var(--flux-ease);
417
+ }
418
+
419
+ .flux-transition--fade.is-active .flux-layer--new {
420
+ opacity: 1;
421
+ transition: opacity var(--flux-dur) var(--flux-ease);
422
+ }
423
+
424
+ .flux-transition--wipe .flux-layer--new {
425
+ clip-path: inset(0 100% 0 0);
426
+ }
427
+
428
+ .flux-transition--wipe[data-flux-wipe="right"] .flux-layer--new {
429
+ clip-path: inset(0 0 0 100%);
430
+ }
431
+
432
+ .flux-transition--wipe[data-flux-wipe="up"] .flux-layer--new {
433
+ clip-path: inset(100% 0 0 0);
434
+ }
435
+
436
+ .flux-transition--wipe[data-flux-wipe="down"] .flux-layer--new {
437
+ clip-path: inset(0 0 100% 0);
438
+ }
439
+
440
+ .flux-transition--wipe.is-active .flux-layer--new {
441
+ clip-path: inset(0 0 0 0);
442
+ transition: clip-path var(--flux-dur) var(--flux-ease);
443
+ }
444
+
445
+ .flux-transition--flash .flux-layer--flash {
446
+ background: rgba(255, 241, 200, 0.75);
447
+ opacity: 0;
448
+ }
449
+
450
+ .flux-transition--flash.is-active .flux-layer--flash {
451
+ animation: flux-flash var(--flux-dur) var(--flux-ease);
452
+ }
453
+
454
+ @keyframes flux-flash {
455
+ 0% {
456
+ opacity: 0;
457
+ }
458
+ 20% {
459
+ opacity: 0.7;
460
+ }
461
+ 100% {
462
+ opacity: 0;
463
+ }
464
+ }
465
+
466
+ body[data-debug-slots="1"] .flux-slot,
467
+ body[data-debug-slots="1"] .flux-inline-slot {
468
+ outline: 1px dashed rgba(120, 110, 98, 0.55);
469
+ outline-offset: 1px;
470
+ }
471
+
472
+ .flux-slot-inner > .flux-image {
473
+ width: 100%;
474
+ height: 100%;
475
+ object-fit: contain;
476
+ display: block;
477
+ }
478
+
479
+ .flux-fit-ellipsis .flux-slot-inner {
480
+ overflow: hidden;
481
+ text-overflow: ellipsis;
482
+ white-space: nowrap;
483
+ }
484
+
485
+ .flux-fit-clip .flux-slot-inner {
486
+ overflow: hidden;
487
+ }
488
+ ${styleCss}
489
+ `.trim();
490
+ }
491
+ function buildStyleCss(styles) {
492
+ if (!styles.length)
493
+ return "";
494
+ const blocks = [];
495
+ for (const style of styles) {
496
+ const cssProps = stylePropsToCss(style.props);
497
+ const entries = Object.entries(cssProps);
498
+ if (!entries.length)
499
+ continue;
500
+ const body = entries.map(([key, value]) => `${key}: ${value};`).join(" ");
501
+ blocks.push(`.${style.className} { ${body} }`);
502
+ }
503
+ return blocks.join("\n");
504
+ }
505
+ function stylePropsToCss(props) {
506
+ const css = {};
507
+ const axes = {};
508
+ for (const [key, value] of Object.entries(props)) {
509
+ if (value == null)
510
+ continue;
511
+ if (key.startsWith("font.axes.")) {
512
+ const axis = key.slice("font.axes.".length);
513
+ axes[axis] = formatStyleValue(key, value);
514
+ continue;
515
+ }
516
+ switch (key) {
517
+ case "font.family":
518
+ css["font-family"] = formatStyleValue(key, value);
519
+ break;
520
+ case "font.size":
521
+ css["font-size"] = formatStyleValue(key, value, "pt");
522
+ break;
523
+ case "font.weight":
524
+ css["font-weight"] = formatStyleValue(key, value);
525
+ break;
526
+ case "font.style":
527
+ css["font-style"] = formatStyleValue(key, value);
528
+ break;
529
+ case "line.height":
530
+ css["line-height"] = formatStyleValue(key, value, "unitless");
531
+ break;
532
+ case "letter.spacing":
533
+ css["letter-spacing"] = formatStyleValue(key, value, "pt");
534
+ break;
535
+ case "text.transform":
536
+ css["text-transform"] = formatStyleValue(key, value);
537
+ break;
538
+ case "text.align":
539
+ css["text-align"] = formatStyleValue(key, value);
540
+ break;
541
+ case "space.before":
542
+ css["margin-top"] = formatStyleValue(key, value, "pt");
543
+ break;
544
+ case "space.after":
545
+ css["margin-bottom"] = formatStyleValue(key, value, "pt");
546
+ break;
547
+ case "space.indent":
548
+ css["text-indent"] = formatStyleValue(key, value, "pt");
549
+ break;
550
+ case "color":
551
+ css.color = formatStyleValue(key, value);
552
+ break;
553
+ case "background":
554
+ css["background"] = formatStyleValue(key, value);
555
+ break;
556
+ case "border":
557
+ css["border"] = formatStyleValue(key, value);
558
+ break;
559
+ case "border.color":
560
+ css["border-color"] = formatStyleValue(key, value);
561
+ break;
562
+ case "border.width":
563
+ css["border-width"] = formatStyleValue(key, value, "pt");
564
+ break;
565
+ case "border.radius":
566
+ css["border-radius"] = formatStyleValue(key, value, "pt");
567
+ break;
568
+ case "padding":
569
+ css["padding"] = formatStyleValue(key, value, "pt");
570
+ break;
571
+ default:
572
+ break;
573
+ }
574
+ }
575
+ const axisEntries = Object.entries(axes);
576
+ if (axisEntries.length) {
577
+ const axisValue = axisEntries
578
+ .map(([axis, value]) => `"${escapeAttr(axis)}" ${value}`)
579
+ .join(", ");
580
+ css["font-variation-settings"] = axisValue;
581
+ }
582
+ return css;
583
+ }
584
+ function formatStyleValue(_key, value, mode = "auto") {
585
+ if (typeof value === "number" && Number.isFinite(value)) {
586
+ if (mode === "unitless")
587
+ return String(value);
588
+ if (mode === "pt")
589
+ return `${value}pt`;
590
+ return `${value}`;
591
+ }
592
+ if (typeof value === "string")
593
+ return value;
594
+ if (typeof value === "boolean")
595
+ return value ? "1" : "0";
596
+ if (Array.isArray(value))
597
+ return value.map((item) => formatStyleValue(_key, item)).join(" ");
598
+ if (typeof value === "object" && value.kind === "asset") {
599
+ return value.name ?? "";
600
+ }
601
+ return String(value ?? "");
602
+ }
603
+ function buildInlineStyle(inlineProps) {
604
+ if (!inlineProps)
605
+ return "";
606
+ const cssProps = stylePropsToCss(inlineProps);
607
+ const entries = Object.entries(cssProps);
608
+ if (!entries.length)
609
+ return "";
610
+ const body = entries.map(([key, value]) => `${key}:${value};`).join("");
611
+ return ` style="${escapeAttr(body)}"`;
612
+ }
613
+ function renderNode(node, options, inlineContext = false, footnotes, inlineSlotContext = false) {
614
+ const isInlineKind = isInlineNode(node.kind);
615
+ const childrenInline = inlineContext || isInlineKind || node.kind === "text";
616
+ const attrs = buildAttrs(node, inlineContext);
617
+ const styleAttr = buildInlineStyle(mergeInlineStyles(node, inlineContext));
618
+ const renderChildren = (inline = childrenInline, context = footnotes, slotContext = inlineSlotContext) => node.children.map((child) => renderNode(child, options, inline, context, slotContext)).join("");
619
+ if (inlineSlotContext && inlineContext && isBlockLike(node.kind)) {
620
+ return renderChildren(true, footnotes, inlineSlotContext);
621
+ }
622
+ switch (node.kind) {
623
+ case "page": {
624
+ const pageFootnotes = { items: [] };
625
+ const pageHtml = node.children
626
+ .map((child) => renderNode(child, options, false, pageFootnotes))
627
+ .join("");
628
+ const footnoteHtml = renderFootnotes(pageFootnotes);
629
+ const className = buildClassName("flux-page", node);
630
+ return `<section class="${className}" ${attrs}${styleAttr}><div class="flux-page-inner">${pageHtml}${footnoteHtml}</div><div class="flux-page-number"></div></section>`;
631
+ }
632
+ case "section":
633
+ return `<section class="${buildClassName("flux-section", node)}" ${attrs}${styleAttr}>${renderChildren()}</section>`;
634
+ case "row":
635
+ return `<div class="${buildClassName("flux-row", node)}" ${attrs}${styleAttr}>${renderChildren()}</div>`;
636
+ case "column":
637
+ return `<div class="${buildClassName("flux-column", node)}" ${attrs}${styleAttr}>${renderChildren()}</div>`;
638
+ case "spacer": {
639
+ const height = resolveNumeric(node.props.size, 12);
640
+ return `<div class="${buildClassName("flux-spacer", node)}" ${attrs} style="height:${height}px;"></div>`;
641
+ }
642
+ case "text": {
643
+ const content = renderTextContent(node.props.content, options.hyphenate);
644
+ const tag = inlineContext ? "span" : "p";
645
+ const variantRaw = resolveString(node.props.variant);
646
+ const variant = variantRaw ? sanitizeClass(variantRaw) : "";
647
+ const variantClass = variant ? ` flux-text-${variant}` : "";
648
+ const className = buildClassName(inlineContext ? `flux-text inline${variantClass}` : `flux-text${variantClass}`, node);
649
+ return `<${tag} class="${className}" ${attrs}${styleAttr}>${content}${renderChildren()}</${tag}>`;
650
+ }
651
+ case "em":
652
+ return `<em class="${buildClassName("flux-em", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</em>`;
653
+ case "strong":
654
+ return `<strong class="${buildClassName("flux-strong", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</strong>`;
655
+ case "code":
656
+ return `<code class="${buildClassName("flux-code", node)}" ${attrs}${styleAttr}>${renderInlineCode(node)}${renderChildren(true)}</code>`;
657
+ case "smallcaps":
658
+ return `<span class="${buildClassName("flux-smallcaps", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</span>`;
659
+ case "sub":
660
+ return `<sub class="${buildClassName("flux-sub", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</sub>`;
661
+ case "sup":
662
+ return `<sup class="${buildClassName("flux-sup", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</sup>`;
663
+ case "mark":
664
+ return `<mark class="${buildClassName("flux-mark", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</mark>`;
665
+ case "quote":
666
+ return `<q class="${buildClassName("flux-quote", node)}" ${attrs}${styleAttr}>${renderInlineContent(node, options)}${renderChildren(true)}</q>`;
667
+ case "link":
668
+ return renderLink(node, attrs, styleAttr, options, renderChildren(true));
669
+ case "blockquote":
670
+ return `<blockquote class="${buildClassName("flux-blockquote", node)}" ${attrs}${styleAttr}>${renderChildren()}</blockquote>`;
671
+ case "codeblock": {
672
+ const content = renderInlineCode(node);
673
+ return `<pre class="${buildClassName("flux-codeblock", node)}" ${attrs}${styleAttr}><code>${content}${renderChildren(true)}</code></pre>`;
674
+ }
675
+ case "callout": {
676
+ const toneRaw = resolveString(node.props.tone || node.props.variant);
677
+ const tone = toneRaw ? sanitizeClass(toneRaw) : "info";
678
+ const className = buildClassName(`flux-callout flux-callout-${tone}`, node);
679
+ return `<aside class="${className}" ${attrs}${styleAttr}>${renderChildren()}</aside>`;
680
+ }
681
+ case "table":
682
+ return renderTable(node, attrs, styleAttr, options, renderChildren());
683
+ case "ul":
684
+ return `<ul class="${buildClassName("flux-list", node)}" ${attrs}${styleAttr}>${renderChildren()}</ul>`;
685
+ case "ol": {
686
+ const start = resolveNumeric(node.props.start, 1);
687
+ const startAttr = node.props.start != null ? ` start="${start}"` : "";
688
+ return `<ol class="${buildClassName("flux-list", node)}" ${attrs}${styleAttr}${startAttr}>${renderChildren()}</ol>`;
689
+ }
690
+ case "li":
691
+ return `<li class="${buildClassName("flux-list-item", node)}" ${attrs}${styleAttr}>${renderChildren()}</li>`;
692
+ case "hr":
693
+ return `<hr class="${buildClassName("flux-hr", node)}" ${attrs}${styleAttr} />`;
694
+ case "footnote":
695
+ return renderFootnote(node, options, footnotes);
696
+ case "image":
697
+ return renderImage(node, attrs, options, styleAttr);
698
+ case "figure":
699
+ return `<figure class="${buildClassName("flux-figure", node)}" ${attrs}${styleAttr}>${renderFigureMedia(node, options)}${renderChildren()}</figure>`;
700
+ case "grid":
701
+ return renderGrid(node, attrs);
702
+ case "slot":
703
+ return renderSlot(node, attrs, false, renderChildren(false), options.slots, styleAttr);
704
+ case "inline_slot":
705
+ return renderSlot(node, attrs, true, renderChildren(true, footnotes, true), options.slots, styleAttr);
706
+ default:
707
+ return `<div class="${buildClassName("flux-node", node)}" ${attrs}${styleAttr}>${renderChildren()}</div>`;
708
+ }
709
+ }
710
+ function isInlineNode(kind) {
711
+ return (kind === "em" ||
712
+ kind === "strong" ||
713
+ kind === "code" ||
714
+ kind === "smallcaps" ||
715
+ kind === "sub" ||
716
+ kind === "sup" ||
717
+ kind === "mark" ||
718
+ kind === "link" ||
719
+ kind === "quote" ||
720
+ kind === "footnote");
721
+ }
722
+ function isBlockLike(kind) {
723
+ return (kind === "page" ||
724
+ kind === "section" ||
725
+ kind === "row" ||
726
+ kind === "column" ||
727
+ kind === "blockquote" ||
728
+ kind === "codeblock" ||
729
+ kind === "callout" ||
730
+ kind === "table" ||
731
+ kind === "ul" ||
732
+ kind === "ol" ||
733
+ kind === "li" ||
734
+ kind === "figure" ||
735
+ kind === "grid" ||
736
+ kind === "slot");
737
+ }
738
+ function buildClassName(base, node) {
739
+ const styleClass = node.style?.className ? ` ${escapeAttr(node.style.className)}` : "";
740
+ return `${base}${styleClass}`;
741
+ }
742
+ function mergeInlineStyles(node, inlineContext) {
743
+ const merged = {};
744
+ if (node.style?.inline) {
745
+ Object.assign(merged, node.style.inline);
746
+ }
747
+ if (node.kind === "text" || inlineContext) {
748
+ const align = resolveString(node.props.align);
749
+ if (align) {
750
+ merged["text.align"] = align;
751
+ }
752
+ }
753
+ return Object.keys(merged).length ? merged : undefined;
754
+ }
755
+ function renderInlineContent(node, options) {
756
+ return renderTextContent(node.props.content, options.hyphenate);
757
+ }
758
+ function renderInlineCode(node) {
759
+ const raw = resolveString(node.props.content);
760
+ return raw ? escapeHtml(raw) : "";
761
+ }
762
+ function renderLink(node, attrs, styleAttr, options, childHtml) {
763
+ const rawHref = resolveString(node.props.href || node.props.url || node.props.to);
764
+ const href = sanitizeHref(rawHref);
765
+ const content = renderInlineContent(node, options) + childHtml;
766
+ return `<a class="${buildClassName("flux-link", node)}" ${attrs}${styleAttr} href="${escapeAttr(href)}" rel="noopener noreferrer">${content}</a>`;
767
+ }
768
+ function sanitizeHref(href) {
769
+ if (!href)
770
+ return "#";
771
+ const trimmed = href.trim();
772
+ if (trimmed.startsWith("#"))
773
+ return trimmed;
774
+ if (trimmed.startsWith("/"))
775
+ return trimmed;
776
+ try {
777
+ const url = new URL(trimmed, "https://example.invalid");
778
+ const protocol = url.protocol.replace(":", "");
779
+ if (protocol === "http" || protocol === "https" || protocol === "mailto" || protocol === "tel") {
780
+ return trimmed;
781
+ }
782
+ }
783
+ catch {
784
+ return "#";
785
+ }
786
+ return "#";
787
+ }
788
+ function renderTable(node, attrs, styleAttr, options, childHtml) {
789
+ const rowsValue = node.props.rows ?? node.props.data;
790
+ const rows = Array.isArray(rowsValue) ? rowsValue : [];
791
+ const header = Boolean(node.props.header);
792
+ const tableRows = rows
793
+ .map((row, rowIndex) => {
794
+ const cells = Array.isArray(row) ? row : [row];
795
+ const tag = header && rowIndex === 0 ? "th" : "td";
796
+ const cellsHtml = cells
797
+ .map((cell) => `<${tag}>${escapeHtml(resolveString(cell))}</${tag}>`)
798
+ .join("");
799
+ return `<tr>${cellsHtml}</tr>`;
800
+ })
801
+ .join("");
802
+ const tableHtml = `<table class="${buildClassName("flux-table", node)}" ${attrs}${styleAttr}>${tableRows}</table>`;
803
+ if (childHtml) {
804
+ return `${tableHtml}${childHtml}`;
805
+ }
806
+ return tableHtml;
807
+ }
808
+ function renderFootnote(node, options, footnotes) {
809
+ const explicit = resolveString(node.props.number || node.props.index || node.props.n);
810
+ const counter = node.counters?.footnote;
811
+ const number = explicit || (counter != null ? String(counter) : String((footnotes?.items.length ?? 0) + 1));
812
+ const content = renderInlineContent(node, options) +
813
+ node.children.map((child) => renderNode(child, options, true, undefined)).join("");
814
+ if (footnotes) {
815
+ footnotes.items.push({ number, html: content, nodeId: node.nodeId });
816
+ }
817
+ return `<sup class="flux-footnote-ref" data-footnote="${escapeAttr(number)}">${escapeHtml(number)}</sup>`;
818
+ }
819
+ function renderFootnotes(context) {
820
+ if (!context.items.length)
821
+ return "";
822
+ const items = context.items
823
+ .map((item) => `<li data-footnote="${escapeAttr(item.number)}">${item.html}</li>`)
824
+ .join("");
825
+ return `<section class="flux-footnotes"><ol>${items}</ol></section>`;
826
+ }
827
+ function renderSlot(node, attrs, inline, childHtml, slots, styleAttr = "") {
828
+ slots[node.nodeId] = childHtml;
829
+ const reserve = node.slot?.reserve;
830
+ const fit = node.slot?.fit;
831
+ const styleParts = [];
832
+ if (reserve?.kind === "fixed") {
833
+ styleParts.push(`width:${reserve.width}${reserve.units}`);
834
+ styleParts.push(`height:${reserve.height}${reserve.units}`);
835
+ }
836
+ if (reserve?.kind === "fixedWidth") {
837
+ styleParts.push(`width:${reserve.width}${reserve.units}`);
838
+ }
839
+ const style = styleParts.length ? ` style="${styleParts.join(";")}"` : "";
840
+ const fitClass = fit ? ` flux-fit-${fit}` : "";
841
+ const styleClass = node.style?.className ? ` ${escapeAttr(node.style.className)}` : "";
842
+ const className = inline
843
+ ? `flux-inline-slot${fitClass}${styleClass}`
844
+ : `flux-slot${fitClass}${styleClass}`;
845
+ const innerTag = inline ? "span" : "div";
846
+ return `<${inline ? "span" : "div"} class="${className}" ${attrs}${styleAttr}${style}><${innerTag} class="flux-slot-inner" data-flux-slot-inner>${childHtml}</${innerTag}></${inline ? "span" : "div"}>`;
847
+ }
848
+ function renderImage(node, attrs, options, styleAttr = "") {
849
+ const { src, assetId, raw } = resolveImageSource(node.props, options);
850
+ const resolvedSrc = resolveImageUrl(src, assetId, raw, options.assetUrl, options.rawUrl);
851
+ const extraAttrs = [
852
+ assetId ? `data-flux-asset-id="${escapeAttr(assetId)}"` : "",
853
+ raw ? `data-flux-src="${escapeAttr(raw)}"` : "",
854
+ ]
855
+ .filter(Boolean)
856
+ .join(" ");
857
+ const className = buildClassName("flux-image", node);
858
+ return `<img class="${className}" ${attrs}${styleAttr} ${extraAttrs} src="${escapeAttr(resolvedSrc)}" alt="${escapeAttr(resolveString(node.props.alt))}">`;
859
+ }
860
+ function renderFigureMedia(node, options) {
861
+ const { src, assetId, raw } = resolveImageSource(node.props, options);
862
+ if (!src && !assetId && !raw)
863
+ return "";
864
+ const extraAttrs = [
865
+ assetId ? `data-flux-asset-id="${escapeAttr(assetId)}"` : "",
866
+ raw ? `data-flux-src="${escapeAttr(raw)}"` : "",
867
+ ]
868
+ .filter(Boolean)
869
+ .join(" ");
870
+ const resolvedSrc = resolveImageUrl(src, assetId, raw, options.assetUrl, options.rawUrl);
871
+ return `<img class="flux-image" ${extraAttrs} src="${escapeAttr(resolvedSrc)}" alt="">`;
872
+ }
873
+ function renderGrid(node, attrs) {
874
+ if (!node.grid) {
875
+ return `<div class="flux-grid" ${attrs}></div>`;
876
+ }
877
+ const { rows, cols, cells } = node.grid;
878
+ const style = ` style="grid-template-columns: repeat(${cols}, 1fr);"`;
879
+ const cellMap = new Map();
880
+ for (const cell of cells) {
881
+ cellMap.set(`${cell.row}:${cell.col}`, escapeHtml(cell.content ?? ""));
882
+ }
883
+ const pieces = [];
884
+ for (let r = 0; r < rows; r += 1) {
885
+ for (let c = 0; c < cols; c += 1) {
886
+ const key = `${r}:${c}`;
887
+ const value = cellMap.get(key) ?? "";
888
+ pieces.push(`<div class="flux-grid-cell" data-cell="${r}-${c}">${value}</div>`);
889
+ }
890
+ }
891
+ return `<div class="flux-grid" ${attrs}${style}>${pieces.join("")}</div>`;
892
+ }
893
+ function renderTextContent(value, hyphenate) {
894
+ const raw = resolveString(value);
895
+ if (!raw)
896
+ return "";
897
+ const text = hyphenate ? hyphenateText(raw) : raw;
898
+ return escapeHtml(text);
899
+ }
900
+ function resolveString(value) {
901
+ if (value == null)
902
+ return "";
903
+ if (typeof value === "string")
904
+ return value;
905
+ if (typeof value === "number" || typeof value === "boolean")
906
+ return String(value);
907
+ if (Array.isArray(value))
908
+ return value.map((item) => resolveString(item)).join(" ");
909
+ if (typeof value === "object") {
910
+ if (value.kind === "asset") {
911
+ return value.name ?? "";
912
+ }
913
+ return "";
914
+ }
915
+ return "";
916
+ }
917
+ function resolveNumeric(value, fallback) {
918
+ if (typeof value === "number" && Number.isFinite(value))
919
+ return value;
920
+ if (typeof value === "string") {
921
+ const parsed = Number(value);
922
+ if (Number.isFinite(parsed))
923
+ return parsed;
924
+ }
925
+ return fallback;
926
+ }
927
+ function resolveImageSource(props, options) {
928
+ const asset = props.asset;
929
+ if (asset && typeof asset === "object" && asset.kind === "asset") {
930
+ return {
931
+ src: transparentPixel(),
932
+ assetId: asset.id,
933
+ raw: null,
934
+ };
935
+ }
936
+ const srcValue = resolveString(props.src);
937
+ if (srcValue) {
938
+ return { src: transparentPixel(), assetId: null, raw: srcValue };
939
+ }
940
+ return { src: transparentPixel(), assetId: null, raw: null };
941
+ }
942
+ function resolveImageUrl(fallback, assetId, raw, assetUrl, rawUrl) {
943
+ if (assetId && assetUrl) {
944
+ const resolved = assetUrl(assetId);
945
+ if (resolved)
946
+ return resolved;
947
+ }
948
+ if (raw && rawUrl) {
949
+ const resolved = rawUrl(raw);
950
+ if (resolved)
951
+ return resolved;
952
+ }
953
+ return fallback;
954
+ }
955
+ function buildAttrs(node, inline) {
956
+ const refresh = node.refresh?.kind ?? "never";
957
+ const isInline = inline || node.kind === "inline_slot";
958
+ const attrs = [
959
+ `data-flux-id="${escapeAttr(node.nodeId)}"`,
960
+ `data-flux-node="${escapeAttr(node.id)}"`,
961
+ `data-flux-kind="${escapeAttr(node.kind)}"`,
962
+ `data-flux-refresh="${escapeAttr(refresh)}"`,
963
+ ];
964
+ if (node.slot?.fit) {
965
+ attrs.push(`data-flux-fit="${escapeAttr(node.slot.fit)}"`);
966
+ }
967
+ if (node.slot?.reserve) {
968
+ attrs.push(`data-flux-reserve="${escapeAttr(node.slot.reserve.kind)}"`);
969
+ }
970
+ if (isInline) {
971
+ attrs.push(`data-flux-inline="true"`);
972
+ }
973
+ return attrs.join(" ");
974
+ }
975
+ function hyphenateText(text) {
976
+ return text.replace(/\p{L}[\p{L}\p{N}]{3,}/gu, (word) => {
977
+ const parts = hyphenator.hyphenate(word);
978
+ if (parts.length <= 1)
979
+ return word;
980
+ return parts.join("\u00ad");
981
+ });
982
+ }
983
+ function escapeHtml(text) {
984
+ return text
985
+ .replace(/&/g, "&amp;")
986
+ .replace(/</g, "&lt;")
987
+ .replace(/>/g, "&gt;")
988
+ .replace(/"/g, "&quot;")
989
+ .replace(/'/g, "&#39;");
990
+ }
991
+ function escapeAttr(value) {
992
+ return escapeHtml(value);
993
+ }
994
+ function sanitizeClass(value) {
995
+ return value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, "-");
996
+ }
997
+ function transparentPixel() {
998
+ return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
999
+ }
1000
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { RenderDocumentIR } from "@flux-lang/core";
2
+
3
+ export interface RenderHtmlAsset {
4
+ id: string;
5
+ url: string;
6
+ }
7
+
8
+ export interface RenderHtmlResult {
9
+ html: string;
10
+ css: string;
11
+ assets: RenderHtmlAsset[];
12
+ slots: Record<string, string>;
13
+ }
14
+
15
+ export interface RenderHtmlOptions {
16
+ hyphenate?: boolean;
17
+ page?: {
18
+ width: number;
19
+ height: number;
20
+ units: string;
21
+ };
22
+ margins?: {
23
+ top: number;
24
+ right: number;
25
+ bottom: number;
26
+ left: number;
27
+ units: string;
28
+ };
29
+ fonts?: {
30
+ body: string;
31
+ heading: string;
32
+ mono: string;
33
+ };
34
+ assetUrl?: (assetId: string) => string;
35
+ rawUrl?: (raw: string) => string;
36
+ }
37
+
38
+ export function renderHtml(doc: RenderDocumentIR, options?: RenderHtmlOptions): RenderHtmlResult;
39
+
40
+ export function renderSlotMap(doc: RenderDocumentIR, options?: RenderHtmlOptions): Record<string, string>;
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@flux-lang/render-html",
3
+ "version": "0.1.1",
4
+ "description": "HTML/CSS renderer for Flux RenderDocumentIR.",
5
+ "license": "MIT",
6
+ "author": "Sebastian Suarez-Solis",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "module": "dist/index.js",
10
+ "types": "index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "index.d.ts"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "import": "./dist/index.js",
19
+ "types": "./index.d.ts"
20
+ }
21
+ },
22
+ "scripts": {
23
+ "build": "tsc -p tsconfig.json",
24
+ "test": "vitest"
25
+ },
26
+ "dependencies": {
27
+ "@flux-lang/core": "^0.1.6",
28
+ "hyphenation.en-us": "^0.2.1",
29
+ "hypher": "^0.2.5"
30
+ },
31
+ "devDependencies": {
32
+ "typescript": "^5.6.0",
33
+ "vitest": "^2.1.0"
34
+ }
35
+ }