@stonedeck/core 0.7.3 → 0.7.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.
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +3 -36
- package/dist/emitter.js.map +1 -1
- package/dist/layouts/registry.json +1 -1
- package/dist/models/ir.d.ts +2 -3
- package/dist/models/ir.d.ts.map +1 -1
- package/dist/parser/tokenizer.js +2 -0
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/resolver/theme-loader.d.ts +3 -1
- package/dist/resolver/theme-loader.d.ts.map +1 -1
- package/dist/resolver/theme-loader.js +45 -2
- package/dist/resolver/theme-loader.js.map +1 -1
- package/package.json +1 -3
- package/src/emitter.ts +3 -35
- package/src/layouts/registry.json +1 -1
- package/src/models/ir.ts +2 -3
- package/src/parser/tokenizer.ts +2 -0
- package/src/resolver/theme-loader.ts +51 -2
- package/src/themes/academico_v2.yaml +55 -0
- package/src/themes/corporativo_v2.yaml +55 -0
- package/src/themes/dark_mode_v2.yaml +54 -0
- package/src/themes/default_v2.yaml +58 -0
- package/src/themes/minimalista_v2.yaml +56 -0
- package/src/themes/moderno_v2.yaml +56 -0
- package/src/themes/tech_blue.yaml +56 -0
- package/test/verify_clipping.html +338 -0
- package/test/verify_clipping.md +14 -0
- package/test/verify_theme.ts +24 -0
- package/test/verify_theme_runner.js +34 -0
- package/test/verify_variants.html +348 -0
- package/test/verify_variants.md +40 -0
- package/dist/resolver/metrics.d.ts +0 -27
- package/dist/resolver/metrics.d.ts.map +0 -1
- package/dist/resolver/metrics.js +0 -43
- package/dist/resolver/metrics.js.map +0 -1
- package/src/resolver/metrics.ts +0 -64
package/dist/emitter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAoC,MAAM,gBAAgB,CAAC;
|
|
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
|
-
|
|
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 {
|
package/dist/emitter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"}
|
package/dist/models/ir.d.ts
CHANGED
|
@@ -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;
|
package/dist/models/ir.d.ts.map
CHANGED
|
@@ -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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"}
|
package/dist/parser/tokenizer.js
CHANGED
|
@@ -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":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,gBAAwB;IACnD,8BAA8B;IAC9B,4HAA4H;IAC5H,kEAAkE;IAElE,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,SAAS;QAE5B,6DAA6D;QAC7D,yBAAyB;QACzB,gDAAgD;QAChD,mDAAmD;QAEnD,YAAY;QACZ,cAAc;QACd,aAAa;QACb,MAAM;QACN,UAAU;QACV,MAAM;QACN,OAAO;QAEP,uFAAuF;QACvF,6DAA6D;QAC7D,4BAA4B;QAC5B,kCAAkC;QAElC,sEAAsE;QACtE,+EAA+E;QAC/E,uFAAuF;QAEvF,2BAA2B;QAC3B,yEAAyE;QACzE,kEAAkE;QAElE,uEAAuE;QACvE,qDAAqD;IACzD,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACvC,2DAA2D;IAC3D,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IAClC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,wBAAwB,CAAC;IAC5C,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAE1C,uBAAuB;QACvB,sCAAsC;QACtC,MAAM,OAAO,GAAG,4CAA4C,CAAC;QAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,MAAM,GAA4B,EAAE,CAAC;QACzC,IAAI,UAAU,GAAG,UAAU,CAAC;QAE5B,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC5D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAI,MAAM,CAAC,MAAiB,IAAI,OAAO,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAA2B,CAAC;QACjD,MAAM,KAAK,GAAI,MAAM,CAAC,KAAa,IAAI,EAAE,CAAC;QAE1C,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAErC,MAAM,CAAC,IAAI,CAAC;YACR,SAAS;YACT,KAAK;YACL,KAAK;YACL,KAAK;SACR,CAAC,CAAC;IACP,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IAC/B,IAAI,gBAAgB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEtC,uDAAuD;IACvD,kGAAkG;IAClG,iDAAiD;IAEjD,0BAA0B;IAC1B,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACpE,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAEvE,MAAM,aAAa,GAAG,gBAAgB;QAClC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACxF,CAAC,CAAC,EAAE,CAAC;IAET,kEAAkE;IAClE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC/C,IAAI,GAAG;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC3B,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
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;
|
|
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
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,OAAO,WAAW;IAoBpB,MAAM,CAAC,IAAI,CAAC,QAAgB,EAAE,QAAgB;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,cAAc,GAAG;YACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;YACxF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,iCAAiC;YAChG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,wCAAwC;YAC3G,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,wBAAwB;SACtF,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACnC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,UAAU,QAAQ,wCAAwC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,UAAsB,EAAE,KAAU;
|
|
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
|
+
"version": "0.7.5",
|
|
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
|
-
|
|
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
|
|
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 {
|
package/src/parser/tokenizer.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: "Dark Mode V2"
|
|
2
|
+
tokens:
|
|
3
|
+
colors:
|
|
4
|
+
primary: "#64ffda"
|
|
5
|
+
secondary: "#112240"
|
|
6
|
+
accent: "#64ffda"
|
|
7
|
+
surface: "#0a192f"
|
|
8
|
+
text: "#e6f1ff"
|
|
9
|
+
heading: "#64ffda"
|
|
10
|
+
muted: "#8892b0"
|
|
11
|
+
code: "#ff9f43"
|
|
12
|
+
|
|
13
|
+
# Variant
|
|
14
|
+
kind1_bg: "#020c1b" # Even darker
|
|
15
|
+
kind2_bg: "#172a45" # Lighter Navy
|
|
16
|
+
|
|
17
|
+
fonts:
|
|
18
|
+
heading: "Helvetica-Bold"
|
|
19
|
+
body: "Helvetica"
|
|
20
|
+
mono: "Courier New"
|
|
21
|
+
|
|
22
|
+
defaults:
|
|
23
|
+
background:
|
|
24
|
+
type: "color"
|
|
25
|
+
value: "surface"
|
|
26
|
+
color: "text"
|
|
27
|
+
font_family: "body"
|
|
28
|
+
font_size: 20
|
|
29
|
+
content_align:
|
|
30
|
+
horizontal: "left"
|
|
31
|
+
vertical: "top"
|
|
32
|
+
|
|
33
|
+
variants:
|
|
34
|
+
kind_1:
|
|
35
|
+
background:
|
|
36
|
+
type: "color"
|
|
37
|
+
value: "kind1_bg"
|
|
38
|
+
color: "muted"
|
|
39
|
+
font_family: "mono" # Hacker style
|
|
40
|
+
|
|
41
|
+
kind_2:
|
|
42
|
+
background:
|
|
43
|
+
type: "color"
|
|
44
|
+
value: "kind2_bg"
|
|
45
|
+
color: "heading"
|
|
46
|
+
font_family: "heading"
|
|
47
|
+
|
|
48
|
+
kind_3:
|
|
49
|
+
background:
|
|
50
|
+
type: "gradient"
|
|
51
|
+
colors: ["surface", "secondary"]
|
|
52
|
+
direction: "to bottom"
|
|
53
|
+
color: "text"
|
|
54
|
+
font_family: "body"
|