postext 0.1.3 → 0.1.5

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 (46) hide show
  1. package/README.md +8 -2
  2. package/dist/__tests__/exports.test.js +26 -0
  3. package/dist/__tests__/exports.test.js.map +1 -1
  4. package/dist/canvas-backend.d.ts +5 -0
  5. package/dist/canvas-backend.d.ts.map +1 -0
  6. package/dist/canvas-backend.js +183 -0
  7. package/dist/canvas-backend.js.map +1 -0
  8. package/dist/createLayout.d.ts +2 -2
  9. package/dist/createLayout.d.ts.map +1 -1
  10. package/dist/createLayout.js +25 -2
  11. package/dist/createLayout.js.map +1 -1
  12. package/dist/defaults.d.ts +26 -3
  13. package/dist/defaults.d.ts.map +1 -1
  14. package/dist/defaults.js +309 -8
  15. package/dist/defaults.js.map +1 -1
  16. package/dist/hyphenate.d.ts +11 -0
  17. package/dist/hyphenate.d.ts.map +1 -0
  18. package/dist/hyphenate.js +140 -0
  19. package/dist/hyphenate.js.map +1 -0
  20. package/dist/index.d.ts +11 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +7 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/measure.d.ts +40 -0
  25. package/dist/measure.d.ts.map +1 -0
  26. package/dist/measure.js +267 -0
  27. package/dist/measure.js.map +1 -0
  28. package/dist/parse.d.ts +17 -0
  29. package/dist/parse.d.ts.map +1 -0
  30. package/dist/parse.js +152 -0
  31. package/dist/parse.js.map +1 -0
  32. package/dist/pipeline.d.ts +4 -0
  33. package/dist/pipeline.d.ts.map +1 -0
  34. package/dist/pipeline.js +324 -0
  35. package/dist/pipeline.js.map +1 -0
  36. package/dist/types.d.ts +122 -7
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/units.d.ts +9 -0
  39. package/dist/units.d.ts.map +1 -0
  40. package/dist/units.js +27 -0
  41. package/dist/units.js.map +1 -0
  42. package/dist/vdt.d.ts +83 -0
  43. package/dist/vdt.d.ts.map +1 -0
  44. package/dist/vdt.js +50 -0
  45. package/dist/vdt.js.map +1 -0
  46. package/package.json +5 -1
package/README.md CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  postext is a layout engine that takes semantic content — enriched markdown with referenced resources — and applies professional editorial layout rules to produce publication-grade output. Built on top of [`@chenglou/pretext`](https://github.com/chenglou/pretext) for DOM-free, pixel-perfect text measurement.
6
6
 
7
- > **Early stage** — postext is at v0.0.1. The API is under active design and not yet stable.
7
+ > **Active development** — postext is under very active development and undergoing frequent changes. The team is working intensively on it. We will announce when a first stable version is available. In the meantime, the project is published so everyone can follow its evolution, but we do not recommend using it in production yet as configuration changes are frequent.
8
+
9
+ **Website:** [postext.dev](https://postext.dev/)
8
10
 
9
11
  ## Install
10
12
 
@@ -127,6 +129,10 @@ Top-level layout configuration.
127
129
 
128
130
  | Field | Type | Description |
129
131
  |---|---|---|
132
+ | `page?` | `PageConfig` | Page dimensions and margins |
133
+ | `layout?` | `LayoutConfig` | General layout settings |
134
+ | `bodyText?` | `BodyTextConfig` | Body text font, size, and line height |
135
+ | `headings?` | `HeadingsConfig` | Heading styles configuration |
130
136
  | `columns?` | `number` | Number of columns |
131
137
  | `gutter?` | `string` | Space between columns (e.g., `'24px'`) |
132
138
  | `columnConfig?` | `ColumnConfig` | Detailed column settings |
@@ -196,7 +202,7 @@ type PlacementStrategy =
196
202
 
197
203
  ## Full Documentation
198
204
 
199
- For the project vision, architecture, roadmap, and contributing guidelines, see the [project README](https://github.com/AUsername/postext#readme).
205
+ Visit [postext.dev](https://postext.dev/) for the full documentation, project vision, architecture, and roadmap. For contributing guidelines, see the [GitHub repository](https://github.com/AUsername/postext).
200
206
 
201
207
  ## License
202
208
 
@@ -9,10 +9,36 @@ describe("package exports", () => {
9
9
  const exportedKeys = Object.keys(postext);
10
10
  expect(exportedKeys).toEqual([
11
11
  "createLayout",
12
+ "buildDocument",
13
+ "renderToCanvas",
14
+ "renderPage",
15
+ "renderPageToCanvas",
16
+ "dimensionToPx",
17
+ "buildFontString",
18
+ "measureBlock",
19
+ "measureRichBlock",
20
+ "initHyphenator",
21
+ "clearMeasurementCache",
22
+ "hyphenateText",
23
+ "setHyphenationLocale",
24
+ "parseMarkdown",
12
25
  "DEFAULT_PAGE_CONFIG",
13
26
  "PAGE_SIZE_PRESETS",
14
27
  "resolvePageConfig",
28
+ "DEFAULT_LAYOUT_CONFIG",
29
+ "DEFAULT_COLUMN_RULE",
30
+ "resolveLayoutConfig",
31
+ "stripLayoutDefaults",
32
+ "DEFAULT_BODY_TEXT_CONFIG",
33
+ "DEFAULT_HYPHENATION_CONFIG",
34
+ "resolveBodyTextConfig",
35
+ "stripBodyTextDefaults",
36
+ "hyphenationEqual",
37
+ "DEFAULT_HEADINGS_CONFIG",
38
+ "resolveHeadingsConfig",
39
+ "stripHeadingsDefaults",
15
40
  "dimensionsEqual",
41
+ "colorsEqual",
16
42
  "stripPageDefaults",
17
43
  "stripConfigDefaults",
18
44
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,UAAU,CAAC;AAEpC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;YAC3B,cAAc;YACd,qBAAqB;YACrB,mBAAmB;YACnB,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;YACnB,qBAAqB;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,UAAU,CAAC;AAEpC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;YAC3B,cAAc;YACd,eAAe;YACf,gBAAgB;YAChB,YAAY;YACZ,oBAAoB;YACpB,eAAe;YACf,iBAAiB;YACjB,cAAc;YACd,kBAAkB;YAClB,gBAAgB;YAChB,uBAAuB;YACvB,eAAe;YACf,sBAAsB;YACtB,eAAe;YACf,qBAAqB;YACrB,mBAAmB;YACnB,mBAAmB;YACnB,uBAAuB;YACvB,qBAAqB;YACrB,qBAAqB;YACrB,qBAAqB;YACrB,0BAA0B;YAC1B,4BAA4B;YAC5B,uBAAuB;YACvB,uBAAuB;YACvB,kBAAkB;YAClB,yBAAyB;YACzB,uBAAuB;YACvB,uBAAuB;YACvB,iBAAiB;YACjB,aAAa;YACb,mBAAmB;YACnB,qBAAqB;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { VDTDocument, VDTPage } from './vdt';
2
+ export declare function renderPageToCanvas(page: VDTPage, doc: VDTDocument, canvas: HTMLCanvasElement): void;
3
+ export declare function renderPage(page: VDTPage, doc: VDTDocument): HTMLCanvasElement;
4
+ export declare function renderToCanvas(doc: VDTDocument): HTMLCanvasElement[];
5
+ //# sourceMappingURL=canvas-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-backend.d.ts","sourceRoot":"","sources":["../src/canvas-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAA6C,MAAM,OAAO,CAAC;AAwK7F,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CA2DN;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,GACf,iBAAiB,CAInB;AAMD,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAEpE"}
@@ -0,0 +1,183 @@
1
+ import { dimensionToPx } from './units';
2
+ // ---------------------------------------------------------------------------
3
+ // Baseline grid overlay
4
+ // ---------------------------------------------------------------------------
5
+ function renderBaselineGrid(ctx, contentArea, baselineIncrement, color, lineWidth) {
6
+ ctx.save();
7
+ ctx.strokeStyle = color;
8
+ ctx.lineWidth = lineWidth;
9
+ // Draw one baseline per line that actually fits in the content area.
10
+ // Must match the placement logic: Math.floor(height / lineHeight) lines.
11
+ const maxLines = Math.floor(contentArea.height / baselineIncrement);
12
+ let y = contentArea.y + baselineIncrement * 0.8;
13
+ const right = contentArea.x + contentArea.width;
14
+ for (let i = 0; i < maxLines; i++) {
15
+ ctx.beginPath();
16
+ ctx.moveTo(contentArea.x, y);
17
+ ctx.lineTo(right, y);
18
+ ctx.stroke();
19
+ y += baselineIncrement;
20
+ }
21
+ ctx.restore();
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Column rule (vertical line between columns)
25
+ // ---------------------------------------------------------------------------
26
+ function renderColumnRule(ctx, columns, color, lineWidth) {
27
+ if (columns.length < 2)
28
+ return;
29
+ ctx.save();
30
+ ctx.strokeStyle = color;
31
+ ctx.lineWidth = lineWidth;
32
+ for (let i = 0; i < columns.length - 1; i++) {
33
+ const left = columns[i].bbox;
34
+ const right = columns[i + 1].bbox;
35
+ const x = (left.x + left.width + right.x) / 2;
36
+ const top = Math.min(left.y, right.y);
37
+ const bottom = Math.max(left.y + left.height, right.y + right.height);
38
+ ctx.beginPath();
39
+ ctx.moveTo(x, top);
40
+ ctx.lineTo(x, bottom);
41
+ ctx.stroke();
42
+ }
43
+ ctx.restore();
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Text rendering
47
+ // ---------------------------------------------------------------------------
48
+ function renderLine(ctx, line, font, boldFont, color, textAlign, columnWidth) {
49
+ ctx.fillStyle = color;
50
+ ctx.textBaseline = 'alphabetic';
51
+ const hasBoldSegments = boldFont && line.segments && line.segments.some((s) => s.bold);
52
+ // Justified rendering with per-segment spacing
53
+ if (textAlign === 'justify' && !line.isLastLine && line.segments && line.segments.length > 0) {
54
+ let wordWidth = 0;
55
+ let spaceCount = 0;
56
+ for (const seg of line.segments) {
57
+ if (seg.kind === 'space')
58
+ spaceCount++;
59
+ else
60
+ wordWidth += seg.width;
61
+ }
62
+ if (spaceCount > 0) {
63
+ const justifiedSpaceWidth = (columnWidth - wordWidth) / spaceCount;
64
+ let x = line.bbox.x;
65
+ for (const seg of line.segments) {
66
+ if (seg.kind === 'space') {
67
+ x += justifiedSpaceWidth;
68
+ }
69
+ else {
70
+ ctx.font = seg.bold && boldFont ? boldFont : font;
71
+ ctx.fillText(seg.text, x, line.baseline);
72
+ x += seg.width;
73
+ }
74
+ }
75
+ return;
76
+ }
77
+ }
78
+ // Ragged (left-aligned) rendering — also used for last lines of justified blocks
79
+ // If there are bold segments, render per-segment to apply correct fonts
80
+ if (hasBoldSegments && line.segments) {
81
+ let x = line.bbox.x;
82
+ for (const seg of line.segments) {
83
+ if (seg.kind === 'space') {
84
+ x += seg.width;
85
+ }
86
+ else {
87
+ ctx.font = seg.bold && boldFont ? boldFont : font;
88
+ ctx.fillText(seg.text, x, line.baseline);
89
+ x += seg.width;
90
+ }
91
+ }
92
+ return;
93
+ }
94
+ ctx.font = font;
95
+ ctx.fillText(line.text, line.bbox.x, line.baseline);
96
+ }
97
+ function renderBlock(ctx, block, columnWidth) {
98
+ for (const line of block.lines) {
99
+ renderLine(ctx, line, block.fontString, block.boldFontString, block.color, block.textAlign, columnWidth);
100
+ }
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Page rendering
104
+ // ---------------------------------------------------------------------------
105
+ function computeContentArea(page, doc) {
106
+ const { dpi, margins } = doc.config.page;
107
+ // We can derive content area from page dimensions and margins
108
+ // (same logic as pipeline, but we recalculate from resolved config)
109
+ const pxPerCm = dpi / 2.54;
110
+ const marginTop = margins.top.unit === 'cm' ? margins.top.value * pxPerCm : margins.top.value;
111
+ const marginLeft = margins.left.unit === 'cm' ? margins.left.value * pxPerCm : margins.left.value;
112
+ // Use the first column's bbox to infer content area bounds
113
+ if (page.columns.length > 0) {
114
+ const firstCol = page.columns[0];
115
+ const lastCol = page.columns[page.columns.length - 1];
116
+ return {
117
+ x: firstCol.bbox.x,
118
+ y: firstCol.bbox.y,
119
+ width: (lastCol.bbox.x + lastCol.bbox.width) - firstCol.bbox.x,
120
+ height: firstCol.bbox.height,
121
+ };
122
+ }
123
+ return { x: marginLeft, y: marginTop, width: 0, height: 0 };
124
+ }
125
+ export function renderPageToCanvas(page, doc, canvas) {
126
+ canvas.width = Math.round(page.width);
127
+ canvas.height = Math.round(page.height);
128
+ const ctx = canvas.getContext('2d');
129
+ if (!ctx)
130
+ return;
131
+ // Background
132
+ const bgColor = doc.config.page.backgroundColor.hex;
133
+ if (bgColor && bgColor !== 'transparent') {
134
+ ctx.fillStyle = bgColor;
135
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
136
+ }
137
+ else {
138
+ ctx.fillStyle = '#ffffff';
139
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
140
+ }
141
+ // Baseline grid overlay
142
+ if (doc.config.page.baselineGrid.enabled) {
143
+ const contentArea = computeContentArea(page, doc);
144
+ const isLastPage = page.index === doc.pages.length - 1;
145
+ // On non-last pages, limit the grid to the height actually used by
146
+ // placed blocks so that no "phantom" baselines appear at the bottom
147
+ // when the split / orphan-control algorithm leaves unused space.
148
+ if (!isLastPage && page.columns.length > 0) {
149
+ const maxUsed = Math.max(...page.columns.map((col) => col.bbox.height - col.availableHeight));
150
+ contentArea.height = maxUsed;
151
+ }
152
+ const gridLineWidthPx = dimensionToPx(doc.config.page.baselineGrid.lineWidth, doc.config.page.dpi);
153
+ renderBaselineGrid(ctx, contentArea, doc.baselineGrid, doc.config.page.baselineGrid.color.hex, gridLineWidthPx);
154
+ }
155
+ // Column rule between columns
156
+ if (doc.config.layout.columnRule.enabled && page.columns.length > 1) {
157
+ const crLineWidthPx = dimensionToPx(doc.config.layout.columnRule.lineWidth, doc.config.page.dpi);
158
+ renderColumnRule(ctx, page.columns, doc.config.layout.columnRule.color.hex, crLineWidthPx);
159
+ }
160
+ // Render all blocks (clip to column bounds to prevent overflow)
161
+ for (const col of page.columns) {
162
+ ctx.save();
163
+ ctx.beginPath();
164
+ ctx.rect(col.bbox.x, col.bbox.y, col.bbox.width, col.bbox.height);
165
+ ctx.clip();
166
+ for (const block of col.blocks) {
167
+ renderBlock(ctx, block, col.bbox.width);
168
+ }
169
+ ctx.restore();
170
+ }
171
+ }
172
+ export function renderPage(page, doc) {
173
+ const canvas = document.createElement('canvas');
174
+ renderPageToCanvas(page, doc, canvas);
175
+ return canvas;
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Public API
179
+ // ---------------------------------------------------------------------------
180
+ export function renderToCanvas(doc) {
181
+ return doc.pages.map((page) => renderPage(page, doc));
182
+ }
183
+ //# sourceMappingURL=canvas-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-backend.js","sourceRoot":"","sources":["../src/canvas-backend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,SAAS,kBAAkB,CACzB,GAA6B,EAC7B,WAAwB,EACxB,iBAAyB,EACzB,KAAa,EACb,SAAiB;IAEjB,GAAG,CAAC,IAAI,EAAE,CAAC;IACX,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAE1B,qEAAqE;IACrE,yEAAyE;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IACpE,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC;IAChD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrB,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,CAAC,IAAI,iBAAiB,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,OAAO,EAAE,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E,SAAS,gBAAgB,CACvB,GAA6B,EAC7B,OAAoB,EACpB,KAAa,EACb,SAAiB;IAEjB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAE/B,GAAG,CAAC,IAAI,EAAE,CAAC;IACX,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAEtE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACtB,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,GAAG,CAAC,OAAO,EAAE,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,UAAU,CACjB,GAA6B,EAC7B,IAAa,EACb,IAAY,EACZ,QAA4B,EAC5B,KAAa,EACb,SAA6B,EAC7B,WAAmB;IAEnB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;IACtB,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;IAEhC,MAAM,eAAe,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEvF,+CAA+C;IAC/C,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7F,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;gBAAE,UAAU,EAAE,CAAC;;gBAClC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC;QAC9B,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,mBAAmB,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC;YACnE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACzB,CAAC,IAAI,mBAAmB,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;oBAClD,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,wEAAwE;IACxE,IAAI,eAAe,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClD,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAClB,GAA6B,EAC7B,KAAe,EACf,WAAmB;IAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,IAAa,EAAE,GAAgB;IACzD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAEzC,8DAA8D;IAC9D,oEAAoE;IACpE,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9F,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAElG,2DAA2D;IAC3D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACvD,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAa,EACb,GAAgB,EAChB,MAAyB;IAEzB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,aAAa;IACb,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IACpD,IAAI,OAAO,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QACzC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;QACxB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,wBAAwB;IACxB,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEvD,mEAAmE;QACnE,oEAAoE;QACpE,iEAAiE;QACjE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,CACpE,CAAC;YACF,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC;QAC/B,CAAC;QAED,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnG,kBAAkB,CAChB,GAAG,EACH,WAAW,EACX,GAAG,CAAC,YAAY,EAChB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EACtC,eAAe,CAChB,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC7F,CAAC;IAED,gEAAgE;IAChE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,IAAa,EACb,GAAgB;IAEhB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,cAAc,CAAC,GAAgB;IAC7C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { FC } from 'react';
1
+ import { type FC } from 'react';
2
2
  import type { PostextContent, PostextConfig } from './types';
3
- export declare function createLayout(_content: PostextContent, _config?: PostextConfig): FC;
3
+ export declare function createLayout(content: PostextContent, config?: PostextConfig): FC;
4
4
  //# sourceMappingURL=createLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createLayout.d.ts","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7D,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,EAAE,CAIJ"}
1
+ {"version":3,"file":"createLayout.d.ts","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAqB,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D,wBAAgB,YAAY,CAC1B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,aAAa,GACrB,EAAE,CA6BJ"}
@@ -1,5 +1,28 @@
1
- export function createLayout(_content, _config) {
2
- const Layout = () => null;
1
+ import { useEffect, useRef } from 'react';
2
+ import { buildDocument } from './pipeline';
3
+ import { renderToCanvas } from './canvas-backend';
4
+ export function createLayout(content, config) {
5
+ const Layout = () => {
6
+ const containerRef = useRef(null);
7
+ useEffect(() => {
8
+ const container = containerRef.current;
9
+ if (!container)
10
+ return;
11
+ const doc = buildDocument(content, config);
12
+ const pages = renderToCanvas(doc);
13
+ // Clear previous content
14
+ container.innerHTML = '';
15
+ // Display all pages
16
+ for (const canvas of pages) {
17
+ canvas.style.width = '100%';
18
+ canvas.style.height = 'auto';
19
+ canvas.style.display = 'block';
20
+ canvas.style.marginBottom = '16px';
21
+ container.appendChild(canvas);
22
+ }
23
+ }, []);
24
+ return null;
25
+ };
3
26
  Layout.displayName = 'PostextLayout';
4
27
  return Layout;
5
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createLayout.js","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAC1B,QAAwB,EACxB,OAAuB;IAEvB,MAAM,MAAM,GAAO,GAAG,EAAE,CAAC,IAAI,CAAC;IAC9B,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"createLayout.js","sourceRoot":"","sources":["../src/createLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,YAAY,CAC1B,OAAuB,EACvB,MAAsB;IAEtB,MAAM,MAAM,GAAO,GAAG,EAAE;QACtB,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;QAElD,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;YACvC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAElC,yBAAyB;YACzB,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;YAEzB,oBAAoB;YACpB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;gBAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;gBACnC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,11 +1,34 @@
1
- import type { PageConfig, PageSizePreset, Dimension, PostextConfig } from './types';
1
+ import type { PageConfig, ResolvedPageConfig, PageSizePreset, Dimension, PostextConfig, LayoutConfig, ResolvedLayoutConfig, BodyTextConfig, ResolvedBodyTextConfig, HeadingsConfig, ResolvedHeadingsConfig, ColorValue, HyphenationConfig } from './types';
2
2
  export declare const PAGE_SIZE_PRESETS: Record<Exclude<PageSizePreset, 'custom'>, {
3
3
  width: Dimension;
4
4
  height: Dimension;
5
5
  }>;
6
- export declare const DEFAULT_PAGE_CONFIG: Required<PageConfig>;
6
+ export declare const DEFAULT_PAGE_CONFIG: ResolvedPageConfig;
7
7
  export declare function dimensionsEqual(a: Dimension, b: Dimension): boolean;
8
+ export declare function colorsEqual(a: ColorValue, b: ColorValue): boolean;
8
9
  export declare function stripPageDefaults(page?: PageConfig): PageConfig | undefined;
10
+ export declare const DEFAULT_COLUMN_RULE: {
11
+ enabled: boolean;
12
+ color: {
13
+ readonly hex: "#cccccc";
14
+ readonly model: "hex";
15
+ };
16
+ lineWidth: {
17
+ readonly value: 0.5;
18
+ readonly unit: "pt";
19
+ };
20
+ };
21
+ export declare const DEFAULT_LAYOUT_CONFIG: ResolvedLayoutConfig;
22
+ export declare function stripLayoutDefaults(layout?: LayoutConfig): LayoutConfig | undefined;
23
+ export declare const DEFAULT_HYPHENATION_CONFIG: ResolvedBodyTextConfig['hyphenation'];
24
+ export declare const DEFAULT_BODY_TEXT_CONFIG: ResolvedBodyTextConfig;
25
+ export declare function hyphenationEqual(a: HyphenationConfig | undefined, b: HyphenationConfig | undefined): boolean;
26
+ export declare function stripBodyTextDefaults(bodyText?: BodyTextConfig): BodyTextConfig | undefined;
27
+ export declare const DEFAULT_HEADINGS_CONFIG: ResolvedHeadingsConfig;
28
+ export declare function stripHeadingsDefaults(headings?: HeadingsConfig): HeadingsConfig | undefined;
9
29
  export declare function stripConfigDefaults(config: PostextConfig): PostextConfig;
10
- export declare function resolvePageConfig(partial?: PageConfig): Required<PageConfig>;
30
+ export declare function resolvePageConfig(partial?: PageConfig): ResolvedPageConfig;
31
+ export declare function resolveLayoutConfig(partial?: LayoutConfig): ResolvedLayoutConfig;
32
+ export declare function resolveBodyTextConfig(partial?: BodyTextConfig): ResolvedBodyTextConfig;
33
+ export declare function resolveHeadingsConfig(partial?: HeadingsConfig): ResolvedHeadingsConfig;
11
34
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAe,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEjG,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,EACjC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAMxC,CAAC;AASF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,UAAU,CASpD,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAyD3E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CASxE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAyB5E"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAe,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,sBAAsB,EAAE,cAAc,EAAsB,sBAAsB,EAA8B,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAExT,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,EACjC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAMxC,CAAC;AASF,eAAO,MAAM,mBAAmB,EAAE,kBASjC,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAEnE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CA2D3E;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;CAI/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,oBAKnC,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CAwCnF;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAAsB,CAAC,aAAa,CAG5E,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,sBAStC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAK5G;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CAwC3F;AAkBD,eAAO,MAAM,uBAAuB,EAAE,sBASrC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CA8E3F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CA2BxE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,kBAAkB,CA0B1E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,oBAAoB,CAehF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,sBAAsB,CAgBtF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,sBAAsB,CA0BtF"}