@stonedeck/core 0.7.3 → 0.7.6

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 (37) hide show
  1. package/README.md +51 -0
  2. package/dist/emitter.d.ts.map +1 -1
  3. package/dist/emitter.js +3 -36
  4. package/dist/emitter.js.map +1 -1
  5. package/dist/layouts/registry.json +1 -1
  6. package/dist/models/ir.d.ts +2 -3
  7. package/dist/models/ir.d.ts.map +1 -1
  8. package/dist/parser/tokenizer.js +2 -0
  9. package/dist/parser/tokenizer.js.map +1 -1
  10. package/dist/resolver/theme-loader.d.ts +3 -1
  11. package/dist/resolver/theme-loader.d.ts.map +1 -1
  12. package/dist/resolver/theme-loader.js +45 -2
  13. package/dist/resolver/theme-loader.js.map +1 -1
  14. package/package.json +1 -3
  15. package/src/emitter.ts +3 -35
  16. package/src/layouts/registry.json +1 -1
  17. package/src/models/ir.ts +2 -3
  18. package/src/parser/tokenizer.ts +2 -0
  19. package/src/resolver/theme-loader.ts +51 -2
  20. package/src/themes/academico_v2.yaml +55 -0
  21. package/src/themes/corporativo_v2.yaml +55 -0
  22. package/src/themes/dark_mode_v2.yaml +54 -0
  23. package/src/themes/default_v2.yaml +58 -0
  24. package/src/themes/minimalista_v2.yaml +56 -0
  25. package/src/themes/moderno_v2.yaml +56 -0
  26. package/src/themes/tech_blue.yaml +56 -0
  27. package/test/verify_clipping.html +338 -0
  28. package/test/verify_clipping.md +14 -0
  29. package/test/verify_theme.ts +24 -0
  30. package/test/verify_theme_runner.js +34 -0
  31. package/test/verify_variants.html +348 -0
  32. package/test/verify_variants.md +40 -0
  33. package/dist/resolver/metrics.d.ts +0 -27
  34. package/dist/resolver/metrics.d.ts.map +0 -1
  35. package/dist/resolver/metrics.js +0 -43
  36. package/dist/resolver/metrics.js.map +0 -1
  37. package/src/resolver/metrics.ts +0 -64
package/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # @stonedeck/core
2
+
3
+ > The engine that transforms Markdown into beautiful presentations
4
+
5
+ ## What is this?
6
+
7
+ This is the core package of StoneDeck. It reads your Markdown files and converts them into a structured format that can be turned into HTML slides.
8
+
9
+ **You probably don't need to use this directly** - use the [@stonedeck/cli](../cli) instead for a better experience.
10
+
11
+ ## When to use this
12
+
13
+ Use this package if you're:
14
+ - Building your own presentation tool on top of StoneDeck
15
+ - Creating a custom export format (not HTML)
16
+ - Integrating StoneDeck into another application
17
+
18
+ ## Quick Example
19
+
20
+ ```typescript
21
+ import { processStoneDeck } from '@stonedeck/core';
22
+ import * as fs from 'fs';
23
+
24
+ // Read your markdown file
25
+ const content = fs.readFileSync('my-slides.md', 'utf-8');
26
+
27
+ // Convert to StoneDeck format
28
+ const presentation = processStoneDeck(content, 'my-slides.md');
29
+
30
+ // Now you have structured data ready to export
31
+ console.log(`Your presentation has ${presentation.slides.length} slides`);
32
+ ```
33
+
34
+ ## What's included
35
+
36
+ - Markdown parser for StoneDeck syntax
37
+ - Theme system (colors, fonts, backgrounds)
38
+ - Layout engine (title, content, cards, etc.)
39
+ - Smart content detection (tables, lists, images, code)
40
+
41
+ ## Need help?
42
+
43
+ Check the main [StoneDeck documentation](../../README.md) or use the CLI tool directly.
44
+
45
+ ## Repository
46
+
47
+ [https://github.com/matheuspellisoli/StoneDeck](https://github.com/matheuspellisoli/StoneDeck)
48
+
49
+ ## License
50
+
51
+ MIT
@@ -1 +1 @@
1
- {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAoC,MAAM,gBAAgB,CAAC;AAO/E;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAuG7F"}
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAoC,MAAM,gBAAgB,CAAC;AAM/E;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,CAwE7F"}
package/dist/emitter.js CHANGED
@@ -2,7 +2,6 @@ import { parseManifesto } from './parser/manifesto.js';
2
2
  import { parseSlides } from './parser/tokenizer.js';
3
3
  import { ThemeLoader } from './resolver/theme-loader.js';
4
4
  import { validateLayout, getLayout } from './layouts/validator.js';
5
- import { metricsCalculator } from './resolver/metrics.js';
6
5
  import { mapMarkdownLists } from './parser/list-mapper.js';
7
6
  import { mapMarkdownTable } from './parser/table-mapper.js';
8
7
  import { mapMarkdownImage } from './parser/image-mapper.js';
@@ -28,11 +27,9 @@ export function emitIR(content, filePath, themeOverride) {
28
27
  warnings.push(validation.error);
29
28
  }
30
29
  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
30
  // Resolve Style with Theme
35
- const resolvedStyle = ThemeLoader.resolveStyle(mergedStyle, theme);
31
+ // Note: We pass slide.style directly. ThemeLoader will handle defaults and variants.
32
+ const resolvedStyle = ThemeLoader.resolveStyle(slide.style, theme, slide.variant, slideIdx);
36
33
  // Process Slots (List, Table, Image detection)
37
34
  const processedSlots = slide.slots.map(slot => {
38
35
  if (slot.type === 'markdown') {
@@ -60,41 +57,11 @@ export function emitIR(content, filePath, themeOverride) {
60
57
  }
61
58
  return slot;
62
59
  });
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
60
  return {
91
61
  ...slide,
92
62
  style: resolvedStyle,
93
63
  slots: processedSlots,
94
- warnings: warnings.length > 0 ? warnings : undefined,
95
- metrics: {
96
- heights
97
- }
64
+ warnings: warnings.length > 0 ? warnings : undefined
98
65
  };
99
66
  });
100
67
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAsB;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,qBAAqB;IACrB,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEhE,kBAAkB;IAClB,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAE7C,qCAAqC;IACrC,MAAM,WAAW,GAAG,aAAa,IAAI,SAAS,CAAC,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAEtD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAClD,kBAAkB;QAClB,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9D,2BAA2B;QAC3B,qFAAqF;QACrF,MAAM,aAAa,GAAG,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE5F,+CAA+C;QAC/C,MAAM,cAAc,GAAkB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACzD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC3B,YAAY;gBACZ,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,SAAS;oBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAEzD,YAAY;gBACZ,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvC,IAAI,GAAG;oBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAiB,CAAC;gBAErG,2DAA2D;gBAC3D,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,kCAAkC;oBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACvE,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;wBACxC,qCAAqC;wBACrC,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5C,CAAC,CAAC,CAAC;oBAEH,IAAI,gBAAgB,EAAE,CAAC;wBACnB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBAC9C,CAAC;gBACL,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAIH,OAAO;YACH,GAAG,KAAK;YACR,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACvD,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,SAAS;QACT,MAAM,EAAE,cAAc;QACtB,QAAQ;QACR,QAAQ,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;KACnE,CAAC;AACN,CAAC"}
@@ -27,7 +27,7 @@
27
27
  "x": 50,
28
28
  "y": 230,
29
29
  "width": 620,
30
- "height": 80
30
+ "height": 125
31
31
  }
32
32
  ]
33
33
  },
@@ -36,6 +36,7 @@ export interface SlideStyle {
36
36
  };
37
37
  card?: {
38
38
  background?: string;
39
+ color?: string;
39
40
  radius?: string;
40
41
  border?: string;
41
42
  shadow?: boolean;
@@ -69,13 +70,11 @@ export type SlotContent = {
69
70
  };
70
71
  export interface Slide {
71
72
  layout_id: string;
73
+ variant?: string;
72
74
  title?: string;
73
75
  style: SlideStyle;
74
76
  slots: SlotContent[];
75
77
  warnings?: string[] | undefined;
76
- metrics?: {
77
- heights: number[];
78
- } | undefined;
79
78
  }
80
79
  export interface StoneDeckIR {
81
80
  manifesto: StoneDeckManifesto;
@@ -1 +1 @@
1
- {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/models/ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/models/ir.ts"],"names":[],"mappings":"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"}
@@ -62,11 +62,13 @@ function parseSlidesV2(content) {
62
62
  }
63
63
  }
64
64
  const layout_id = config.layout || 'blank';
65
+ const variant = config.layout_style || undefined;
65
66
  const title = config.title;
66
67
  const style = config.style || {};
67
68
  const slots = parseSlots(rawContent);
68
69
  slides.push({
69
70
  layout_id,
71
+ variant,
70
72
  title,
71
73
  style,
72
74
  slots
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/parser/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,8 @@ export declare class ThemeLoader {
3
3
  private static __dirname;
4
4
  private static presets;
5
5
  static load(themeRef: string, basePath: string): any;
6
- static resolveStyle(slideStyle: SlideStyle, theme: any): SlideStyle;
6
+ static resolveStyle(slideStyle: SlideStyle, theme: any, variantName?: string, seed?: number): SlideStyle;
7
+ private static deepMerge;
7
8
  private static deepResolve;
8
9
  private static resolveTokenValue;
9
10
  /**
@@ -13,5 +14,6 @@ export declare class ThemeLoader {
13
14
  * RFC 4.1: "Todas as unidades finais devem ser em pt (Pontos)."
14
15
  */
15
16
  private static convertToPt;
17
+ private static isObject;
16
18
  }
17
19
  //# sourceMappingURL=theme-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-loader.d.ts","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAgD;IAExE,OAAO,CAAC,MAAM,CAAC,OAAO,CAepB;IAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG;IA4BpD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,UAAU;IAKnE,OAAO,CAAC,MAAM,CAAC,WAAW;IAsB1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAchC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;CAoB7B"}
1
+ {"version":3,"file":"theme-loader.d.ts","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAgD;IAExE,OAAO,CAAC,MAAM,CAAC,OAAO,CAepB;IAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG;IA4BpD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,UAAU;IA8B3G,OAAO,CAAC,MAAM,CAAC,SAAS;IAoBxB,OAAO,CAAC,MAAM,CAAC,WAAW;IAsB1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAchC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAqB1B,OAAO,CAAC,MAAM,CAAC,QAAQ;CAG1B"}
@@ -28,9 +28,49 @@ export class ThemeLoader {
28
28
  console.warn(`Theme "${themeRef}" not found. Falling back to standard.`);
29
29
  return this.presets.standard;
30
30
  }
31
- static resolveStyle(slideStyle, theme) {
31
+ static resolveStyle(slideStyle, theme, variantName, seed = 0) {
32
32
  const tokens = theme.tokens || {};
33
- return this.deepResolve(slideStyle, tokens);
33
+ const defaults = theme.defaults || {};
34
+ let variantStyle = {};
35
+ // 1. Explicit Variant
36
+ if (variantName && theme.variants?.[variantName]) {
37
+ variantStyle = theme.variants[variantName];
38
+ }
39
+ // 2. Dynamic Variant (if available and no explicit variant request or explicit variant not found)
40
+ else if (theme.variants && Object.keys(theme.variants).length > 0) {
41
+ const variantKeys = Object.keys(theme.variants);
42
+ // Use seed to pick a variant deterministically
43
+ const pickedKey = variantKeys[seed % variantKeys.length];
44
+ variantStyle = theme.variants[pickedKey];
45
+ }
46
+ // Merge: Defaults -> Variant -> Slide Style
47
+ // We need to merge carefully.
48
+ // Actually, we should resolve each layer against tokens first?
49
+ // Or merge raw values and then resolve?
50
+ // Let's merge raw values first to allow overrides.
51
+ // Deep merge: Defaults < Variant < SlideStyle
52
+ const mergedRaw = this.deepMerge(defaults, this.deepMerge(variantStyle, slideStyle));
53
+ return this.deepResolve(mergedRaw, tokens);
54
+ }
55
+ static deepMerge(target, source) {
56
+ if (!this.isObject(target) || !this.isObject(source)) {
57
+ return source;
58
+ }
59
+ const output = { ...target };
60
+ Object.keys(source).forEach(key => {
61
+ if (this.isObject(source[key])) {
62
+ if (!(key in target)) {
63
+ Object.assign(output, { [key]: source[key] });
64
+ }
65
+ else {
66
+ output[key] = this.deepMerge(target[key], source[key]);
67
+ }
68
+ }
69
+ else {
70
+ Object.assign(output, { [key]: source[key] });
71
+ }
72
+ });
73
+ return output;
34
74
  }
35
75
  static deepResolve(obj, tokens) {
36
76
  if (typeof obj !== 'object' || obj === null) {
@@ -89,6 +129,9 @@ export class ThemeLoader {
89
129
  default: return num;
90
130
  }
91
131
  }
132
+ static isObject(item) {
133
+ return (item && typeof item === 'object' && !Array.isArray(item));
134
+ }
92
135
  }
93
136
  ThemeLoader.__dirname = path.dirname(fileURLToPath(import.meta.url));
94
137
  ThemeLoader.presets = {
@@ -1 +1 @@
1
- {"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme-loader.js","sourceRoot":"","sources":["../../src/resolver/theme-loader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stonedeck/core",
3
- "version": "0.7.3",
3
+ "version": "0.7.6",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,8 +15,6 @@
15
15
  "build": "tsc -b"
16
16
  },
17
17
  "dependencies": {
18
- "@types/pdfkit": "^0.17.4",
19
- "pdfkit": "^0.17.2",
20
18
  "yaml": "^2.3.4"
21
19
  },
22
20
  "devDependencies": {
package/src/emitter.ts CHANGED
@@ -3,7 +3,6 @@ import { parseSlides } from './parser/tokenizer.js';
3
3
  import { ThemeLoader } from './resolver/theme-loader.js';
4
4
  import { validateLayout, getLayout } from './layouts/validator.js';
5
5
  import { StoneDeckIR, SlotContent, ListItem, TableCell } from './models/ir.js';
6
- import { metricsCalculator } from './resolver/metrics.js';
7
6
  import { mapMarkdownLists } from './parser/list-mapper.js';
8
7
  import { mapMarkdownTable } from './parser/table-mapper.js';
9
8
  import { mapMarkdownImage } from './parser/image-mapper.js';
@@ -35,12 +34,9 @@ export function emitIR(content: string, filePath: string, themeOverride?: string
35
34
  }
36
35
 
37
36
  const layout = getLayout(slide.layout_id, slide.slots.length);
38
- // Merge Theme Defaults
39
- const defaults = theme.defaults || {};
40
- const mergedStyle = { ...defaults, ...slide.style };
41
-
42
37
  // Resolve Style with Theme
43
- const resolvedStyle = ThemeLoader.resolveStyle(mergedStyle, theme);
38
+ // Note: We pass slide.style directly. ThemeLoader will handle defaults and variants.
39
+ const resolvedStyle = ThemeLoader.resolveStyle(slide.style, theme, slide.variant, slideIdx);
44
40
 
45
41
  // Process Slots (List, Table, Image detection)
46
42
  const processedSlots: SlotContent[] = slide.slots.map(slot => {
@@ -71,41 +67,13 @@ export function emitIR(content: string, filePath: string, themeOverride?: string
71
67
  return slot;
72
68
  });
73
69
 
74
- // Calculate Metrics and Overflow
75
- const heights: number[] = [];
76
- if (layout) {
77
- processedSlots.forEach((slot, slotIdx) => {
78
- const slotDef = layout.slots[slotIdx];
79
- if (slotDef) {
80
- let contentToMeasure = '';
81
- if (slot.type === 'list') {
82
- contentToMeasure = slot.items.map((i: ListItem) => i.text).join('\n');
83
- } else if (slot.type === 'markdown') {
84
- contentToMeasure = slot.raw;
85
- } else if (slot.type === 'table') {
86
- contentToMeasure = slot.rows.map((r: TableCell[]) => r.map((c: TableCell) => c.text).join(' ')).join('\n');
87
- } else if (slot.type === 'image') {
88
- contentToMeasure = slot.alt || slot.src;
89
- }
90
70
 
91
- const estimatedHeight = metricsCalculator.estimateMarkdownHeight(contentToMeasure, resolvedStyle, slotDef.width);
92
- heights.push(estimatedHeight);
93
-
94
- if (estimatedHeight > slotDef.height) {
95
- warnings.push(`Overflow Warning: Content in slot "${slotDef.id}" (slide ${slideIdx + 1}) exceeds defined height (${estimatedHeight.toFixed(1)}pt > ${slotDef.height}pt)`);
96
- }
97
- }
98
- });
99
- }
100
71
 
101
72
  return {
102
73
  ...slide,
103
74
  style: resolvedStyle,
104
75
  slots: processedSlots,
105
- warnings: warnings.length > 0 ? warnings : undefined,
106
- metrics: {
107
- heights
108
- }
76
+ warnings: warnings.length > 0 ? warnings : undefined
109
77
  };
110
78
  });
111
79
 
@@ -27,7 +27,7 @@
27
27
  "x": 50,
28
28
  "y": 230,
29
29
  "width": 620,
30
- "height": 80
30
+ "height": 125
31
31
  }
32
32
  ]
33
33
  },
package/src/models/ir.ts CHANGED
@@ -39,6 +39,7 @@ export interface SlideStyle {
39
39
  };
40
40
  card?: {
41
41
  background?: string;
42
+ color?: string;
42
43
  radius?: string;
43
44
  border?: string;
44
45
  shadow?: boolean;
@@ -74,13 +75,11 @@ export type SlotContent = {
74
75
 
75
76
  export interface Slide {
76
77
  layout_id: string;
78
+ variant?: string; // Optional variant (e.g. "kind_1") from frontmatter layout_style
77
79
  title?: string; // Optional slide title
78
80
  style: SlideStyle;
79
81
  slots: SlotContent[]; // Content of each slot (Structured)
80
82
  warnings?: string[] | undefined;
81
- metrics?: {
82
- heights: number[]; // Height of each slot in pt
83
- } | undefined;
84
83
  }
85
84
 
86
85
  export interface StoneDeckIR {
@@ -78,6 +78,7 @@ function parseSlidesV2(content: string): Slide[] {
78
78
  }
79
79
 
80
80
  const layout_id = (config.layout as string) || 'blank';
81
+ const variant = (config.layout_style as string) || undefined;
81
82
  const title = config.title as string | undefined;
82
83
  const style = (config.style as any) || {};
83
84
 
@@ -85,6 +86,7 @@ function parseSlidesV2(content: string): Slide[] {
85
86
 
86
87
  slides.push({
87
88
  layout_id,
89
+ variant,
88
90
  title,
89
91
  style,
90
92
  slots
@@ -52,9 +52,54 @@ export class ThemeLoader {
52
52
  return this.presets.standard;
53
53
  }
54
54
 
55
- static resolveStyle(slideStyle: SlideStyle, theme: any): SlideStyle {
55
+ static resolveStyle(slideStyle: SlideStyle, theme: any, variantName?: string, seed: number = 0): SlideStyle {
56
56
  const tokens = theme.tokens || {};
57
- return this.deepResolve(slideStyle, tokens);
57
+ const defaults = theme.defaults || {};
58
+
59
+ let variantStyle = {};
60
+
61
+ // 1. Explicit Variant
62
+ if (variantName && theme.variants?.[variantName]) {
63
+ variantStyle = theme.variants[variantName];
64
+ }
65
+ // 2. Dynamic Variant (if available and no explicit variant request or explicit variant not found)
66
+ else if (theme.variants && Object.keys(theme.variants).length > 0) {
67
+ const variantKeys = Object.keys(theme.variants);
68
+ // Use seed to pick a variant deterministically
69
+ const pickedKey = variantKeys[seed % variantKeys.length];
70
+ variantStyle = theme.variants[pickedKey];
71
+ }
72
+
73
+ // Merge: Defaults -> Variant -> Slide Style
74
+ // We need to merge carefully.
75
+ // Actually, we should resolve each layer against tokens first?
76
+ // Or merge raw values and then resolve?
77
+ // Let's merge raw values first to allow overrides.
78
+
79
+ // Deep merge: Defaults < Variant < SlideStyle
80
+ const mergedRaw = this.deepMerge(defaults, this.deepMerge(variantStyle, slideStyle));
81
+
82
+ return this.deepResolve(mergedRaw, tokens);
83
+ }
84
+
85
+ private static deepMerge(target: any, source: any): any {
86
+ if (!this.isObject(target) || !this.isObject(source)) {
87
+ return source;
88
+ }
89
+
90
+ const output = { ...target };
91
+ Object.keys(source).forEach(key => {
92
+ if (this.isObject(source[key])) {
93
+ if (!(key in target)) {
94
+ Object.assign(output, { [key]: source[key] });
95
+ } else {
96
+ output[key] = this.deepMerge(target[key], source[key]);
97
+ }
98
+ } else {
99
+ Object.assign(output, { [key]: source[key] });
100
+ }
101
+ });
102
+ return output;
58
103
  }
59
104
 
60
105
  private static deepResolve(obj: unknown, tokens: any): any {
@@ -119,4 +164,8 @@ export class ThemeLoader {
119
164
  default: return num;
120
165
  }
121
166
  }
167
+
168
+ private static isObject(item: any): boolean {
169
+ return (item && typeof item === 'object' && !Array.isArray(item));
170
+ }
122
171
  }
@@ -0,0 +1,55 @@
1
+ name: "Academico V2"
2
+ tokens:
3
+ colors:
4
+ primary: "#1a237e"
5
+ secondary: "#f3e5f5"
6
+ accent: "#b71c1c"
7
+ surface: "#fdfbf7"
8
+ text: "#212121"
9
+ heading: "#1a237e"
10
+ table_header: "#e8eaf6"
11
+
12
+ # Variant Specifics
13
+ kind1_bg: "#FFF8E1" # Warm paper-like
14
+ kind2_bg: "#ECEFF1" # Cool grey
15
+ kind2_color: "#263238"
16
+
17
+ fonts:
18
+ heading: "Times-Bold"
19
+ body: "Times-Roman"
20
+ mono: "Courier"
21
+ sans: "Helvetica"
22
+
23
+ defaults:
24
+ background:
25
+ type: "color"
26
+ value: "surface"
27
+ color: "text"
28
+ font_family: "body"
29
+ font_size: 20
30
+ content_align:
31
+ horizontal: "left"
32
+ vertical: "top"
33
+
34
+ variants:
35
+ kind_1:
36
+ background:
37
+ type: "color"
38
+ value: "kind1_bg"
39
+ color: "text"
40
+ font_family: "heading" # More formal headers for body too? logic check.
41
+
42
+ kind_2:
43
+ background:
44
+ type: "color"
45
+ value: "kind2_bg"
46
+ color: "kind2_color"
47
+ font_family: "sans" # Modern academic look
48
+
49
+ kind_3:
50
+ background:
51
+ type: "gradient"
52
+ colors: ["primary", "accent"]
53
+ direction: "45deg"
54
+ color: "surface" # Inverted for dark background
55
+ font_family: "heading"
@@ -0,0 +1,55 @@
1
+ name: "Corporativo V2"
2
+ tokens:
3
+ colors:
4
+ primary: "#2980b9"
5
+ secondary: "#dfe6e9"
6
+ accent: "#3498db"
7
+ surface: "#f0f2f5"
8
+ text: "#2c3e50"
9
+ heading: "#2980b9"
10
+ border: "#34495e"
11
+
12
+ # Variant Colors
13
+ kind1_bg: "#FFFFFF"
14
+ kind2_bg_start: "#2c3e50"
15
+ kind2_bg_end: "#4ca1af"
16
+
17
+ fonts:
18
+ heading: "Helvetica-Bold"
19
+ body: "Helvetica"
20
+ mono: "Courier New"
21
+ serif: "Times-Roman"
22
+
23
+ defaults:
24
+ background:
25
+ type: "color"
26
+ value: "surface"
27
+ color: "text"
28
+ font_family: "body"
29
+ font_size: 20
30
+ content_align:
31
+ horizontal: "left"
32
+ vertical: "top"
33
+
34
+ variants:
35
+ kind_1:
36
+ background:
37
+ type: "color"
38
+ value: "kind1_bg"
39
+ color: "primary" # High contrast brand color
40
+ font_family: "heading"
41
+
42
+ kind_2:
43
+ background:
44
+ type: "gradient"
45
+ colors: ["kind2_bg_start", "kind2_bg_end"]
46
+ direction: "to right"
47
+ color: "secondary" # Light text on dark
48
+ font_family: "body"
49
+
50
+ kind_3:
51
+ background:
52
+ type: "color"
53
+ value: "secondary"
54
+ color: "text"
55
+ font_family: "serif" # Classic corporate report style