@stonedeck/core 0.7.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 (110) hide show
  1. package/dist/emitter.d.ts +6 -0
  2. package/dist/emitter.d.ts.map +1 -0
  3. package/dist/emitter.js +107 -0
  4. package/dist/emitter.js.map +1 -0
  5. package/dist/emitter.test.d.ts +2 -0
  6. package/dist/emitter.test.d.ts.map +1 -0
  7. package/dist/emitter.test.js +70 -0
  8. package/dist/emitter.test.js.map +1 -0
  9. package/dist/index.d.ts +8 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +8 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/interface/export-plugin.d.ts +5 -0
  14. package/dist/interface/export-plugin.d.ts.map +1 -0
  15. package/dist/interface/export-plugin.js +2 -0
  16. package/dist/interface/export-plugin.js.map +1 -0
  17. package/dist/layouts/layout-generator.d.ts +14 -0
  18. package/dist/layouts/layout-generator.d.ts.map +1 -0
  19. package/dist/layouts/layout-generator.js +110 -0
  20. package/dist/layouts/layout-generator.js.map +1 -0
  21. package/dist/layouts/registry.json +290 -0
  22. package/dist/layouts/validator.d.ts +7 -0
  23. package/dist/layouts/validator.d.ts.map +1 -0
  24. package/dist/layouts/validator.js +27 -0
  25. package/dist/layouts/validator.js.map +1 -0
  26. package/dist/layouts/validator.test.d.ts +2 -0
  27. package/dist/layouts/validator.test.d.ts.map +1 -0
  28. package/dist/layouts/validator.test.js +19 -0
  29. package/dist/layouts/validator.test.js.map +1 -0
  30. package/dist/models/ir.d.ts +91 -0
  31. package/dist/models/ir.d.ts.map +1 -0
  32. package/dist/models/ir.js +2 -0
  33. package/dist/models/ir.js.map +1 -0
  34. package/dist/parser/image-mapper.d.ts +8 -0
  35. package/dist/parser/image-mapper.d.ts.map +1 -0
  36. package/dist/parser/image-mapper.js +15 -0
  37. package/dist/parser/image-mapper.js.map +1 -0
  38. package/dist/parser/list-mapper.d.ts +3 -0
  39. package/dist/parser/list-mapper.d.ts.map +1 -0
  40. package/dist/parser/list-mapper.js +24 -0
  41. package/dist/parser/list-mapper.js.map +1 -0
  42. package/dist/parser/list-mapper.test.d.ts +2 -0
  43. package/dist/parser/list-mapper.test.d.ts.map +1 -0
  44. package/dist/parser/list-mapper.test.js +26 -0
  45. package/dist/parser/list-mapper.test.js.map +1 -0
  46. package/dist/parser/manifesto.d.ts +9 -0
  47. package/dist/parser/manifesto.d.ts.map +1 -0
  48. package/dist/parser/manifesto.js +40 -0
  49. package/dist/parser/manifesto.js.map +1 -0
  50. package/dist/parser/manifesto.test.d.ts +2 -0
  51. package/dist/parser/manifesto.test.d.ts.map +1 -0
  52. package/dist/parser/manifesto.test.js +32 -0
  53. package/dist/parser/manifesto.test.js.map +1 -0
  54. package/dist/parser/table-mapper.d.ts +7 -0
  55. package/dist/parser/table-mapper.d.ts.map +1 -0
  56. package/dist/parser/table-mapper.js +33 -0
  57. package/dist/parser/table-mapper.js.map +1 -0
  58. package/dist/parser/tokenizer.d.ts +4 -0
  59. package/dist/parser/tokenizer.d.ts.map +1 -0
  60. package/dist/parser/tokenizer.js +103 -0
  61. package/dist/parser/tokenizer.js.map +1 -0
  62. package/dist/parser/tokenizer.test.d.ts +2 -0
  63. package/dist/parser/tokenizer.test.d.ts.map +1 -0
  64. package/dist/parser/tokenizer.test.js +31 -0
  65. package/dist/parser/tokenizer.test.js.map +1 -0
  66. package/dist/processor.d.ts +3 -0
  67. package/dist/processor.d.ts.map +1 -0
  68. package/dist/processor.js +5 -0
  69. package/dist/processor.js.map +1 -0
  70. package/dist/resolver/metrics.d.ts +27 -0
  71. package/dist/resolver/metrics.d.ts.map +1 -0
  72. package/dist/resolver/metrics.js +43 -0
  73. package/dist/resolver/metrics.js.map +1 -0
  74. package/dist/resolver/metrics.test.d.ts +2 -0
  75. package/dist/resolver/metrics.test.d.ts.map +1 -0
  76. package/dist/resolver/metrics.test.js +23 -0
  77. package/dist/resolver/metrics.test.js.map +1 -0
  78. package/dist/resolver/theme-loader.d.ts +17 -0
  79. package/dist/resolver/theme-loader.d.ts.map +1 -0
  80. package/dist/resolver/theme-loader.js +110 -0
  81. package/dist/resolver/theme-loader.js.map +1 -0
  82. package/dist/resolver/theme-loader.test.d.ts +2 -0
  83. package/dist/resolver/theme-loader.test.d.ts.map +1 -0
  84. package/dist/resolver/theme-loader.test.js +60 -0
  85. package/dist/resolver/theme-loader.test.js.map +1 -0
  86. package/package.json +19 -0
  87. package/src/emitter.ts +118 -0
  88. package/src/index.ts +7 -0
  89. package/src/interface/export-plugin.ts +5 -0
  90. package/src/layouts/layout-generator.ts +116 -0
  91. package/src/layouts/registry.json +290 -0
  92. package/src/layouts/validator.ts +31 -0
  93. package/src/models/ir.ts +98 -0
  94. package/src/parser/image-mapper.ts +14 -0
  95. package/src/parser/list-mapper.ts +28 -0
  96. package/src/parser/manifesto.ts +49 -0
  97. package/src/parser/table-mapper.ts +38 -0
  98. package/src/parser/tokenizer.ts +126 -0
  99. package/src/processor.ts +6 -0
  100. package/src/resolver/metrics.ts +64 -0
  101. package/src/resolver/theme-loader.ts +122 -0
  102. package/src/themes/academico.yaml +25 -0
  103. package/src/themes/corporativo.yaml +25 -0
  104. package/src/themes/dark_mode.yaml +26 -0
  105. package/src/themes/minimalista.yaml +25 -0
  106. package/src/themes/moderno.yaml +26 -0
  107. package/test/cycle2_markdown.test.ts +36 -0
  108. package/test/cycle2_slides.test.ts +52 -0
  109. package/tsconfig.json +17 -0
  110. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,6 @@
1
+ import { StoneDeckIR } from './models/ir.js';
2
+ /**
3
+ * Emitter orchestrates the parsing and theme resolution to produce the final IR.
4
+ */
5
+ export declare function emitIR(content: string, filePath: string, themeOverride?: string): StoneDeckIR;
6
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAA2C,MAAM,gBAAgB,CAAC;AAOtF;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAuG7F"}
@@ -0,0 +1,107 @@
1
+ import { parseManifesto } from './parser/manifesto.js';
2
+ import { parseSlides } from './parser/tokenizer.js';
3
+ import { ThemeLoader } from './resolver/theme-loader.js';
4
+ import { validateLayout, getLayout } from './layouts/validator.js';
5
+ import { metricsCalculator } from './resolver/metrics.js';
6
+ import { mapMarkdownLists } from './parser/list-mapper.js';
7
+ import { mapMarkdownTable } from './parser/table-mapper.js';
8
+ import { mapMarkdownImage } from './parser/image-mapper.js';
9
+ import * as path from 'path';
10
+ /**
11
+ * Emitter orchestrates the parsing and theme resolution to produce the final IR.
12
+ */
13
+ export function emitIR(content, filePath, themeOverride) {
14
+ const basePath = path.dirname(filePath);
15
+ const globalWarnings = [];
16
+ // 1. Parse Manifesto
17
+ const { manifesto, remainingContent } = parseManifesto(content);
18
+ // 2. Parse Slides
19
+ const slides = parseSlides(remainingContent);
20
+ // 4. Resolve Temas e Validar Layouts
21
+ const themeToLoad = themeOverride || manifesto.theme;
22
+ const theme = ThemeLoader.load(themeToLoad, basePath);
23
+ const resolvedSlides = slides.map((slide, slideIdx) => {
24
+ // Validate Layout
25
+ const validation = validateLayout(slide.layout_id, slide.slots.length);
26
+ const warnings = [];
27
+ if (!validation.valid) {
28
+ warnings.push(validation.error);
29
+ }
30
+ const layout = getLayout(slide.layout_id, slide.slots.length);
31
+ // Merge Theme Defaults
32
+ const defaults = theme.defaults || {};
33
+ const mergedStyle = { ...defaults, ...slide.style };
34
+ // Resolve Style with Theme
35
+ const resolvedStyle = ThemeLoader.resolveStyle(mergedStyle, theme);
36
+ // Process Slots (List, Table, Image detection)
37
+ const processedSlots = slide.slots.map(slot => {
38
+ if (slot.type === 'markdown') {
39
+ // Try Table
40
+ const tableRows = mapMarkdownTable(slot.raw);
41
+ if (tableRows)
42
+ return { type: 'table', rows: tableRows };
43
+ // Try Image
44
+ const img = mapMarkdownImage(slot.raw);
45
+ if (img)
46
+ return { type: 'image', src: img.src, ...(img.alt ? { alt: img.alt } : {}) };
47
+ // Try List - but only convert if ALL content is list items
48
+ const listItems = mapMarkdownLists(slot.raw);
49
+ if (listItems.length > 0) {
50
+ // Count non-empty, non-list lines
51
+ const lines = slot.raw.split(/\r?\n/).filter(l => l.trim().length > 0);
52
+ const hasOnlyListItems = lines.every(line => {
53
+ // Check if line matches list pattern
54
+ return /^\s*([-*]|\d+\.)\s+/.test(line);
55
+ });
56
+ if (hasOnlyListItems) {
57
+ return { type: 'list', items: listItems };
58
+ }
59
+ }
60
+ }
61
+ return slot;
62
+ });
63
+ // Calculate Metrics and Overflow
64
+ const heights = [];
65
+ if (layout) {
66
+ processedSlots.forEach((slot, slotIdx) => {
67
+ const slotDef = layout.slots[slotIdx];
68
+ if (slotDef) {
69
+ let contentToMeasure = '';
70
+ if (slot.type === 'list') {
71
+ contentToMeasure = slot.items.map((i) => i.text).join('\n');
72
+ }
73
+ else if (slot.type === 'markdown') {
74
+ contentToMeasure = slot.raw;
75
+ }
76
+ else if (slot.type === 'table') {
77
+ contentToMeasure = slot.rows.map((r) => r.map((c) => c.text).join(' ')).join('\n');
78
+ }
79
+ else if (slot.type === 'image') {
80
+ contentToMeasure = slot.alt || slot.src;
81
+ }
82
+ const estimatedHeight = metricsCalculator.estimateMarkdownHeight(contentToMeasure, resolvedStyle, slotDef.width);
83
+ heights.push(estimatedHeight);
84
+ if (estimatedHeight > slotDef.height) {
85
+ warnings.push(`Overflow Warning: Content in slot "${slotDef.id}" (slide ${slideIdx + 1}) exceeds defined height (${estimatedHeight.toFixed(1)}pt > ${slotDef.height}pt)`);
86
+ }
87
+ }
88
+ });
89
+ }
90
+ return {
91
+ ...slide,
92
+ style: resolvedStyle,
93
+ slots: processedSlots,
94
+ warnings: warnings.length > 0 ? warnings : undefined,
95
+ metrics: {
96
+ heights
97
+ }
98
+ };
99
+ });
100
+ return {
101
+ manifesto,
102
+ slides: resolvedSlides,
103
+ basePath,
104
+ warnings: globalWarnings.length > 0 ? globalWarnings : undefined
105
+ };
106
+ }
107
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=emitter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.test.d.ts","sourceRoot":"","sources":["../src/emitter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const emitter_1 = require("./emitter");
4
+ describe('Emitter', () => {
5
+ it('should generate a full IR from a valid StoneDeck markdown', () => {
6
+ const markdown = `---
7
+ StoneDeck: true
8
+ title: "Project Alpha"
9
+ theme: "standard"
10
+ ---
11
+
12
+ layout: title
13
+ ---
14
+ # Welcome
15
+ ***
16
+ Subtitle here
17
+
18
+ ---
19
+
20
+ layout: content
21
+ ---
22
+ # Introduction
23
+ ***
24
+ - Point 1
25
+ - Point 2
26
+ `;
27
+ const ir = (0, emitter_1.emitIR)(markdown, 'test.md');
28
+ expect(ir.manifesto.title).toBe('Project Alpha');
29
+ expect(ir.slides.length).toBe(2);
30
+ expect(ir.slides[0]?.layout_id).toBe('title');
31
+ expect(ir.slides[1]?.layout_id).toBe('content');
32
+ expect(ir.slides[1]?.slots.length).toBe(2);
33
+ expect(ir.slides[1]?.slots[1]?.type).toBe('list'); // Point 1, Point 2
34
+ });
35
+ it('should handle slides with styles', () => {
36
+ const markdown = `---
37
+ StoneDeck: true
38
+ title: "Styles Test"
39
+ theme: "dark"
40
+ ---
41
+
42
+ layout: blank
43
+ style:
44
+ background:
45
+ value: "accent"
46
+ ---
47
+ Empty slide
48
+ `;
49
+ const ir = (0, emitter_1.emitIR)(markdown, 'test.md');
50
+ expect(ir.slides[0]?.style.background?.value).toBe('#E94560'); // Resolved from dark preset
51
+ });
52
+ it('should generate overflow warning for long content', () => {
53
+ const markdown = `---
54
+ StoneDeck: true
55
+ title: "Overflow Test"
56
+ theme: "standard"
57
+ ---
58
+
59
+ layout: title-slide
60
+ ---
61
+ # This is a extremely long title that will surely exceed the 80pt height limit of the title slot in the title-slide layout. We need a lot of text here to make sure it wraps enough times to exceed eighty points of height. Adding even more text just to be absolutely sure that the pdfkit measurement will return a value greater than 80. Still adding more words to this very long sentence that serves as a title.
62
+ ***
63
+ Short subtitle
64
+ `;
65
+ const ir = (0, emitter_1.emitIR)(markdown, 'test.md');
66
+ expect(ir.slides[0]?.warnings).toBeDefined();
67
+ expect(ir.slides[0]?.warnings?.[0]).toMatch(/Overflow Warning/);
68
+ });
69
+ });
70
+ //# sourceMappingURL=emitter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.test.js","sourceRoot":"","sources":["../src/emitter.test.ts"],"names":[],"mappings":";;AAAA,uCAAmC;AAEnC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;CAoBxB,CAAC;QACM,MAAM,EAAE,GAAG,IAAA,gBAAM,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEvC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,QAAQ,GAAG;;;;;;;;;;;;CAYxB,CAAC;QACM,MAAM,EAAE,GAAG,IAAA,gBAAM,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B;IAC/F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG;;;;;;;;;;;CAWxB,CAAC;QACM,MAAM,EAAE,GAAG,IAAA,gBAAM,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './models/ir.js';
2
+ export * from './emitter.js';
3
+ export * from './parser/tokenizer.js';
4
+ export * from './parser/manifesto.js';
5
+ export * from './layouts/validator.js';
6
+ export * from './interface/export-plugin.js';
7
+ export * from './processor.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from './models/ir.js';
2
+ export * from './emitter.js';
3
+ export * from './parser/tokenizer.js';
4
+ export * from './parser/manifesto.js';
5
+ export * from './layouts/validator.js';
6
+ export * from './interface/export-plugin.js';
7
+ export * from './processor.js'; // Will create this next
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gBAAgB,CAAC,CAAC,wBAAwB"}
@@ -0,0 +1,5 @@
1
+ import { StoneDeckIR } from '../models/ir.js';
2
+ export interface ExportPlugin {
3
+ generate(ir: StoneDeckIR, outputPath: string, options?: any): Promise<void>;
4
+ }
5
+ //# sourceMappingURL=export-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-plugin.d.ts","sourceRoot":"","sources":["../../src/interface/export-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-plugin.js","sourceRoot":"","sources":["../../src/interface/export-plugin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { Layout } from '../models/ir.js';
2
+ export declare class LayoutGenerator {
3
+ private static CANVAS_WIDTH;
4
+ private static CANVAS_HEIGHT;
5
+ private static SAFETY_MARGIN;
6
+ /**
7
+ * Generates a dynamic layout based on valid base types.
8
+ */
9
+ static generate(layoutId: string, slotCount: number): Layout | null;
10
+ private static generateContentGrid;
11
+ private static generateTitleAndContent;
12
+ private static calculateGridSlots;
13
+ }
14
+ //# sourceMappingURL=layout-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-generator.d.ts","sourceRoot":"","sources":["../../src/layouts/layout-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAc,MAAM,iBAAiB,CAAC;AAErD,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAO;IAClC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAO;IACnC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAM;IAElC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUnE,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAelC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAqCtC,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA0CpC"}
@@ -0,0 +1,110 @@
1
+ export class LayoutGenerator {
2
+ /**
3
+ * Generates a dynamic layout based on valid base types.
4
+ */
5
+ static generate(layoutId, slotCount) {
6
+ if (layoutId === 'content') {
7
+ return this.generateContentGrid(slotCount);
8
+ }
9
+ if (layoutId === 'title-and-content') {
10
+ return this.generateTitleAndContent(slotCount);
11
+ }
12
+ return null;
13
+ }
14
+ static generateContentGrid(count) {
15
+ // Full canvas usage
16
+ const bounds = {
17
+ x: this.SAFETY_MARGIN,
18
+ y: this.SAFETY_MARGIN,
19
+ w: this.CANVAS_WIDTH - (this.SAFETY_MARGIN * 2),
20
+ h: this.CANVAS_HEIGHT - (this.SAFETY_MARGIN * 2)
21
+ };
22
+ return {
23
+ id: 'content',
24
+ slots: this.calculateGridSlots(count, bounds)
25
+ };
26
+ }
27
+ static generateTitleAndContent(count) {
28
+ // Slot 0 is always Title (Top)
29
+ // Slots 1..N are Body Content (Bottom)
30
+ const titleHeight = 120;
31
+ const spacing = 20;
32
+ const titleSlot = {
33
+ id: 'title',
34
+ x: this.SAFETY_MARGIN,
35
+ y: 30,
36
+ width: this.CANVAS_WIDTH - (this.SAFETY_MARGIN * 2),
37
+ height: titleHeight
38
+ };
39
+ if (count <= 1) {
40
+ return {
41
+ id: 'title-and-content',
42
+ slots: [titleSlot]
43
+ };
44
+ }
45
+ const bodyBounds = {
46
+ x: this.SAFETY_MARGIN,
47
+ y: 30 + titleHeight + spacing,
48
+ w: this.CANVAS_WIDTH - (this.SAFETY_MARGIN * 2),
49
+ h: this.CANVAS_HEIGHT - (30 + titleHeight + spacing) - 30
50
+ };
51
+ const bodySlots = this.calculateGridSlots(count - 1, bodyBounds, 1); // offset index by 1
52
+ return {
53
+ id: 'title-and-content',
54
+ slots: [titleSlot, ...bodySlots]
55
+ };
56
+ }
57
+ static calculateGridSlots(count, bounds, indexOffset = 0) {
58
+ const slots = [];
59
+ if (count === 0)
60
+ return slots;
61
+ // Simple Grid Logic
62
+ // 1: 1x1
63
+ // 2: 2 cols
64
+ // 3: 3 cols
65
+ // 4: 2x2
66
+ // 5: 3x2 (last row 2 center? No, simple grid for now)
67
+ // 6: 3x2
68
+ // 7-8: 4x2
69
+ // 9: 3x3
70
+ let cols = 1;
71
+ let rows = 1;
72
+ if (count === 2) {
73
+ cols = 2;
74
+ }
75
+ else if (count === 3) {
76
+ cols = 3;
77
+ }
78
+ else if (count === 4) {
79
+ cols = 2;
80
+ rows = 2;
81
+ }
82
+ else if (count === 5 || count === 6) {
83
+ cols = 3;
84
+ rows = 2;
85
+ }
86
+ else if (count > 6) {
87
+ cols = Math.ceil(Math.sqrt(count));
88
+ rows = Math.ceil(count / cols);
89
+ }
90
+ const cellW = (bounds.w - (cols - 1) * 20) / cols;
91
+ const cellH = (bounds.h - (rows - 1) * 20) / rows;
92
+ const gap = 20;
93
+ for (let i = 0; i < count; i++) {
94
+ const r = Math.floor(i / cols);
95
+ const c = i % cols;
96
+ slots.push({
97
+ id: `slot_${i + indexOffset}`,
98
+ x: bounds.x + c * (cellW + gap),
99
+ y: bounds.y + r * (cellH + gap),
100
+ width: cellW,
101
+ height: cellH
102
+ });
103
+ }
104
+ return slots;
105
+ }
106
+ }
107
+ LayoutGenerator.CANVAS_WIDTH = 720;
108
+ LayoutGenerator.CANVAS_HEIGHT = 405;
109
+ LayoutGenerator.SAFETY_MARGIN = 30;
110
+ //# sourceMappingURL=layout-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-generator.js","sourceRoot":"","sources":["../../src/layouts/layout-generator.ts"],"names":[],"mappings":"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"}