@mulmocast/deck 0.1.2 → 0.3.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.
@@ -1,8 +1,11 @@
1
- import { renderInlineMarkup, accentBar, resolveAccent } from "../utils.js";
1
+ import { renderInlineMarkup, accentBar, resolveAccent, renderEyebrow } from "../utils.js";
2
2
  export const layoutBigQuote = (data) => {
3
3
  const accent = resolveAccent(data.accentColor);
4
+ const eyebrowHtml = renderEyebrow(data.eyebrow, accent);
4
5
  const parts = [];
5
6
  parts.push(`<div class="flex flex-col items-center justify-center h-full px-20">`);
7
+ if (eyebrowHtml)
8
+ parts.push(` <div class="mb-6">${eyebrowHtml}</div>`);
6
9
  parts.push(` ${accentBar(accent, "w-24 mb-8")}`);
7
10
  parts.push(` <blockquote class="text-[32px] text-d-text font-title italic text-center leading-relaxed">`);
8
11
  parts.push(` &ldquo;${renderInlineMarkup(data.quote)}&rdquo;`);
@@ -1,4 +1,4 @@
1
- import { renderInlineMarkup, c, cardWrap, numBadge, iconSquare, slideHeader, renderOptionalCallout, resolveAccent } from "../utils.js";
1
+ import { renderInlineMarkup, c, cardWrap, numBadge, iconSquare, slideHeader, renderOptionalCallout, resolveAccent, renderNumLabel } from "../utils.js";
2
2
  import { renderCardContentBlocks } from "../blocks.js";
3
3
  const buildColumnCard = (col) => {
4
4
  const accent = resolveAccent(col.accentColor);
@@ -19,7 +19,8 @@ const buildColumnCard = (col) => {
19
19
  if (col.label) {
20
20
  inner.push(`<p class="text-sm font-bold text-${c(accent)} font-body">${renderInlineMarkup(col.label)}</p>`);
21
21
  }
22
- inner.push(`<h3 class="text-2xl font-title font-bold text-d-text mt-1">${renderInlineMarkup(col.title)}</h3>`);
22
+ const numPrefix = renderNumLabel(col.numLabel, accent);
23
+ inner.push(`<h3 class="text-2xl font-title font-bold text-d-text mt-1">${numPrefix}${renderInlineMarkup(col.title)}</h3>`);
23
24
  }
24
25
  if (col.content) {
25
26
  const centerCls = col.icon ? "text-center" : "";
@@ -9,6 +9,9 @@ export const layoutStats = (data) => {
9
9
  const color = resolveItemColor(stat.color, data.accentColor);
10
10
  parts.push(`<div class="flex-1 bg-d-card rounded-lg shadow-lg p-10 text-center">`);
11
11
  parts.push(` <div class="h-[3px] bg-${c(color)} rounded-full w-12 mx-auto mb-6"></div>`);
12
+ if (stat.numLabel) {
13
+ parts.push(` <p class="font-accent font-extrabold text-${c(color)} text-sm tracking-wider mb-2">${renderInlineMarkup(stat.numLabel)}</p>`);
14
+ }
12
15
  parts.push(` <p class="text-[52px] font-bold text-${c(color)} font-body leading-none">${renderInlineMarkup(stat.value)}</p>`);
13
16
  parts.push(` <p class="text-lg text-d-muted font-body mt-4">${renderInlineMarkup(stat.label)}</p>`);
14
17
  if (stat.change) {
@@ -1,16 +1,21 @@
1
- import { renderInlineMarkup, accentBar } from "../utils.js";
1
+ import { renderInlineMarkup, accentBar, renderEyebrow, renderChipRow, resolveAccent } from "../utils.js";
2
2
  export const layoutTitle = (data) => {
3
+ const accent = resolveAccent(data.accentColor);
4
+ const eyebrowHtml = renderEyebrow(data.eyebrow, accent);
5
+ const chipsHtml = renderChipRow(data.chips);
3
6
  return [
4
7
  accentBar("primary"),
5
8
  `<div class="absolute -top-20 -right-8 w-[360px] h-[360px] rounded-full bg-d-primary opacity-10"></div>`,
6
9
  `<div class="absolute -bottom-12 -left-16 w-[280px] h-[280px] rounded-full bg-d-accent opacity-10"></div>`,
7
10
  `<div class="flex flex-col justify-center h-full px-16 relative z-10">`,
11
+ eyebrowHtml ? ` <div class="mb-4">${eyebrowHtml}</div>` : "",
8
12
  ` <h1 class="text-[60px] leading-tight font-title font-bold text-d-text">${renderInlineMarkup(data.title)}</h1>`,
9
13
  data.subtitle ? ` <p class="text-2xl text-d-muted mt-6 font-body">${renderInlineMarkup(data.subtitle)}</p>` : "",
10
14
  data.author ? ` <p class="text-lg text-d-dim mt-10 font-body">${renderInlineMarkup(data.author)}</p>` : "",
11
15
  data.note
12
16
  ? ` <div class="bg-d-card px-4 py-2 mt-6 inline-block rounded"><p class="text-sm text-d-dim font-body">${renderInlineMarkup(data.note)}</p></div>`
13
17
  : "",
18
+ chipsHtml,
14
19
  `</div>`,
15
20
  accentBar("accent", "absolute bottom-0 left-0 right-0"),
16
21
  ]
package/lib/render.js CHANGED
@@ -1,4 +1,4 @@
1
- import { escapeHtml, buildTailwindConfig, sanitizeHex, detectBlockTypes } from "./utils.js";
1
+ import { escapeHtml, buildTailwindConfig, sanitizeHex, detectBlockTypes, isSafeCssBackground } from "./utils.js";
2
2
  import { renderSlideContent } from "./layouts/index.js";
3
3
  /** Determine if a hex color is dark (luminance < 128) */
4
4
  const isDarkBg = (hex) => {
@@ -64,9 +64,30 @@ export const generateSlideHTML = (theme, slide, reference, branding) => {
64
64
  const cdnScripts = buildCdnScripts(theme, slide);
65
65
  const slideStyle = slide.style;
66
66
  const hasBgOpacity = branding?.backgroundImage?.bgOpacity !== undefined;
67
- const bgCls = hasBgOpacity || slideStyle?.bgColor ? "" : "bg-d-bg";
68
- const bgColorStyle = slideStyle?.bgColor ? ` style="background-color:#${sanitizeHex(slideStyle.bgColor)}"` : "";
69
- const inlineStyle = hasBgOpacity ? "" : bgColorStyle;
67
+ // Background resolution priority (any new field is optional; when absent the output is byte-identical to pre-extension behavior):
68
+ // slide.style.bgGradient > theme.bgGradient > slide.style.bgColor > theme.colors.bg (via `bg-d-bg` class).
69
+ // hasBgOpacity (branding bg image with custom opacity) still suppresses background styling, as before.
70
+ let bgCls = "";
71
+ let inlineStyle = "";
72
+ if (!hasBgOpacity) {
73
+ const slideBgGradient = slideStyle?.bgGradient && isSafeCssBackground(slideStyle.bgGradient) ? slideStyle.bgGradient : undefined;
74
+ const themeBgGradient = !slideBgGradient && theme.bgGradient && isSafeCssBackground(theme.bgGradient) ? theme.bgGradient : undefined;
75
+ const bgGradient = slideBgGradient ?? themeBgGradient;
76
+ if (bgGradient) {
77
+ inlineStyle = ` style="background:${bgGradient}"`;
78
+ }
79
+ else if (slideStyle?.bgColor) {
80
+ inlineStyle = ` style="background-color:#${sanitizeHex(slideStyle.bgColor)}"`;
81
+ }
82
+ else {
83
+ bgCls = "bg-d-bg";
84
+ }
85
+ }
86
+ // Optional `<style>` block: when theme.titleGradient is set (and safe), paint h1 titles with a background-clipped gradient.
87
+ // Prepend a newline so that when set the block appears on its own line; when empty, no extra blank line is emitted.
88
+ const titleGradientCss = theme.titleGradient && isSafeCssBackground(theme.titleGradient)
89
+ ? `\n<style>h1.font-title.font-bold{background:${theme.titleGradient};-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent;}</style>`
90
+ : "";
70
91
  const footer = slideStyle?.footer ? `<p class="absolute bottom-2 right-4 text-xs text-d-dim font-body">${escapeHtml(slideStyle.footer)}</p>` : "";
71
92
  const referenceHtml = reference
72
93
  ? `<div class="mt-auto px-4 pb-2"><p class="text-sm text-d-muted font-body opacity-80">${escapeHtml(reference)}</p></div>`
@@ -84,7 +105,7 @@ export const generateSlideHTML = (theme, slide, reference, branding) => {
84
105
  ${cdnScripts}
85
106
  <style>
86
107
  html, body { height: 100%; margin: 0; padding: 0; overflow: hidden; }
87
- </style>
108
+ </style>${titleGradientCss}
88
109
  </head>
89
110
  <body class="h-full">
90
111
  <div class="relative overflow-hidden ${bgCls} w-full h-full flex flex-col"${inlineStyle}>
package/lib/schema.d.ts CHANGED
@@ -28,6 +28,7 @@ export declare const slideThemeFontsSchema: z.ZodObject<{
28
28
  title: z.ZodString;
29
29
  body: z.ZodString;
30
30
  mono: z.ZodString;
31
+ accent: z.ZodOptional<z.ZodString>;
31
32
  }, z.core.$strip>;
32
33
  export declare const slideThemeSchema: z.ZodObject<{
33
34
  colors: z.ZodObject<{
@@ -49,7 +50,10 @@ export declare const slideThemeSchema: z.ZodObject<{
49
50
  title: z.ZodString;
50
51
  body: z.ZodString;
51
52
  mono: z.ZodString;
53
+ accent: z.ZodOptional<z.ZodString>;
52
54
  }, z.core.$strip>;
55
+ bgGradient: z.ZodOptional<z.ZodString>;
56
+ titleGradient: z.ZodOptional<z.ZodString>;
53
57
  }, z.core.$strip>;
54
58
  export declare const textBlockSchema: z.ZodObject<{
55
59
  type: z.ZodLiteral<"text">;
@@ -891,19 +895,35 @@ export declare const cardSchema: z.ZodObject<{
891
895
  footer: z.ZodOptional<z.ZodString>;
892
896
  label: z.ZodOptional<z.ZodString>;
893
897
  num: z.ZodOptional<z.ZodNumber>;
898
+ numLabel: z.ZodOptional<z.ZodString>;
894
899
  icon: z.ZodOptional<z.ZodString>;
895
900
  }, z.core.$strip>;
896
901
  export declare const slideStyleSchema: z.ZodObject<{
897
902
  bgColor: z.ZodOptional<z.ZodString>;
903
+ bgGradient: z.ZodOptional<z.ZodString>;
898
904
  decorations: z.ZodOptional<z.ZodBoolean>;
899
905
  bgOpacity: z.ZodOptional<z.ZodNumber>;
900
906
  footer: z.ZodOptional<z.ZodString>;
901
907
  }, z.core.$strip>;
908
+ /** Optional kicker/category label rendered at the top of a slide (small uppercase pill). */
909
+ export declare const eyebrowSchema: z.ZodObject<{
910
+ label: z.ZodString;
911
+ color: z.ZodOptional<z.ZodEnum<{
912
+ primary: "primary";
913
+ accent: "accent";
914
+ success: "success";
915
+ warning: "warning";
916
+ danger: "danger";
917
+ info: "info";
918
+ highlight: "highlight";
919
+ }>>;
920
+ }, z.core.$strip>;
902
921
  export declare const titleSlideSchema: z.ZodObject<{
903
922
  title: z.ZodString;
904
923
  subtitle: z.ZodOptional<z.ZodString>;
905
924
  author: z.ZodOptional<z.ZodString>;
906
925
  note: z.ZodOptional<z.ZodString>;
926
+ chips: z.ZodOptional<z.ZodArray<z.ZodString>>;
907
927
  accentColor: z.ZodOptional<z.ZodEnum<{
908
928
  primary: "primary";
909
929
  accent: "accent";
@@ -915,10 +935,23 @@ export declare const titleSlideSchema: z.ZodObject<{
915
935
  }>>;
916
936
  style: z.ZodOptional<z.ZodObject<{
917
937
  bgColor: z.ZodOptional<z.ZodString>;
938
+ bgGradient: z.ZodOptional<z.ZodString>;
918
939
  decorations: z.ZodOptional<z.ZodBoolean>;
919
940
  bgOpacity: z.ZodOptional<z.ZodNumber>;
920
941
  footer: z.ZodOptional<z.ZodString>;
921
942
  }, z.core.$strip>>;
943
+ eyebrow: z.ZodOptional<z.ZodObject<{
944
+ label: z.ZodString;
945
+ color: z.ZodOptional<z.ZodEnum<{
946
+ primary: "primary";
947
+ accent: "accent";
948
+ success: "success";
949
+ warning: "warning";
950
+ danger: "danger";
951
+ info: "info";
952
+ highlight: "highlight";
953
+ }>>;
954
+ }, z.core.$strip>>;
922
955
  layout: z.ZodLiteral<"title">;
923
956
  }, z.core.$strip>;
924
957
  export declare const columnsSlideSchema: z.ZodObject<{
@@ -1197,6 +1230,7 @@ export declare const columnsSlideSchema: z.ZodObject<{
1197
1230
  footer: z.ZodOptional<z.ZodString>;
1198
1231
  label: z.ZodOptional<z.ZodString>;
1199
1232
  num: z.ZodOptional<z.ZodNumber>;
1233
+ numLabel: z.ZodOptional<z.ZodString>;
1200
1234
  icon: z.ZodOptional<z.ZodString>;
1201
1235
  }, z.core.$strip>>;
1202
1236
  showArrows: z.ZodOptional<z.ZodBoolean>;
@@ -1230,10 +1264,23 @@ export declare const columnsSlideSchema: z.ZodObject<{
1230
1264
  }>>;
1231
1265
  style: z.ZodOptional<z.ZodObject<{
1232
1266
  bgColor: z.ZodOptional<z.ZodString>;
1267
+ bgGradient: z.ZodOptional<z.ZodString>;
1233
1268
  decorations: z.ZodOptional<z.ZodBoolean>;
1234
1269
  bgOpacity: z.ZodOptional<z.ZodNumber>;
1235
1270
  footer: z.ZodOptional<z.ZodString>;
1236
1271
  }, z.core.$strip>>;
1272
+ eyebrow: z.ZodOptional<z.ZodObject<{
1273
+ label: z.ZodString;
1274
+ color: z.ZodOptional<z.ZodEnum<{
1275
+ primary: "primary";
1276
+ accent: "accent";
1277
+ success: "success";
1278
+ warning: "warning";
1279
+ danger: "danger";
1280
+ info: "info";
1281
+ highlight: "highlight";
1282
+ }>>;
1283
+ }, z.core.$strip>>;
1237
1284
  layout: z.ZodLiteral<"columns">;
1238
1285
  }, z.core.$strip>;
1239
1286
  export declare const comparisonPanelSchema: z.ZodObject<{
@@ -2082,10 +2129,23 @@ export declare const comparisonSlideSchema: z.ZodObject<{
2082
2129
  }>>;
2083
2130
  style: z.ZodOptional<z.ZodObject<{
2084
2131
  bgColor: z.ZodOptional<z.ZodString>;
2132
+ bgGradient: z.ZodOptional<z.ZodString>;
2085
2133
  decorations: z.ZodOptional<z.ZodBoolean>;
2086
2134
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2087
2135
  footer: z.ZodOptional<z.ZodString>;
2088
2136
  }, z.core.$strip>>;
2137
+ eyebrow: z.ZodOptional<z.ZodObject<{
2138
+ label: z.ZodString;
2139
+ color: z.ZodOptional<z.ZodEnum<{
2140
+ primary: "primary";
2141
+ accent: "accent";
2142
+ success: "success";
2143
+ warning: "warning";
2144
+ danger: "danger";
2145
+ info: "info";
2146
+ highlight: "highlight";
2147
+ }>>;
2148
+ }, z.core.$strip>>;
2089
2149
  layout: z.ZodLiteral<"comparison">;
2090
2150
  }, z.core.$strip>;
2091
2151
  export declare const gridItemSchema: z.ZodObject<{
@@ -2650,10 +2710,23 @@ export declare const gridSlideSchema: z.ZodObject<{
2650
2710
  }>>;
2651
2711
  style: z.ZodOptional<z.ZodObject<{
2652
2712
  bgColor: z.ZodOptional<z.ZodString>;
2713
+ bgGradient: z.ZodOptional<z.ZodString>;
2653
2714
  decorations: z.ZodOptional<z.ZodBoolean>;
2654
2715
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2655
2716
  footer: z.ZodOptional<z.ZodString>;
2656
2717
  }, z.core.$strip>>;
2718
+ eyebrow: z.ZodOptional<z.ZodObject<{
2719
+ label: z.ZodString;
2720
+ color: z.ZodOptional<z.ZodEnum<{
2721
+ primary: "primary";
2722
+ accent: "accent";
2723
+ success: "success";
2724
+ warning: "warning";
2725
+ danger: "danger";
2726
+ info: "info";
2727
+ highlight: "highlight";
2728
+ }>>;
2729
+ }, z.core.$strip>>;
2657
2730
  layout: z.ZodLiteral<"grid">;
2658
2731
  }, z.core.$strip>;
2659
2732
  export declare const bigQuoteSlideSchema: z.ZodObject<{
@@ -2671,10 +2744,23 @@ export declare const bigQuoteSlideSchema: z.ZodObject<{
2671
2744
  }>>;
2672
2745
  style: z.ZodOptional<z.ZodObject<{
2673
2746
  bgColor: z.ZodOptional<z.ZodString>;
2747
+ bgGradient: z.ZodOptional<z.ZodString>;
2674
2748
  decorations: z.ZodOptional<z.ZodBoolean>;
2675
2749
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2676
2750
  footer: z.ZodOptional<z.ZodString>;
2677
2751
  }, z.core.$strip>>;
2752
+ eyebrow: z.ZodOptional<z.ZodObject<{
2753
+ label: z.ZodString;
2754
+ color: z.ZodOptional<z.ZodEnum<{
2755
+ primary: "primary";
2756
+ accent: "accent";
2757
+ success: "success";
2758
+ warning: "warning";
2759
+ danger: "danger";
2760
+ info: "info";
2761
+ highlight: "highlight";
2762
+ }>>;
2763
+ }, z.core.$strip>>;
2678
2764
  layout: z.ZodLiteral<"bigQuote">;
2679
2765
  }, z.core.$strip>;
2680
2766
  export declare const statItemSchema: z.ZodObject<{
@@ -2690,6 +2776,7 @@ export declare const statItemSchema: z.ZodObject<{
2690
2776
  highlight: "highlight";
2691
2777
  }>>;
2692
2778
  change: z.ZodOptional<z.ZodString>;
2779
+ numLabel: z.ZodOptional<z.ZodString>;
2693
2780
  }, z.core.$strip>;
2694
2781
  export declare const statsSlideSchema: z.ZodObject<{
2695
2782
  title: z.ZodString;
@@ -2708,6 +2795,7 @@ export declare const statsSlideSchema: z.ZodObject<{
2708
2795
  highlight: "highlight";
2709
2796
  }>>;
2710
2797
  change: z.ZodOptional<z.ZodString>;
2798
+ numLabel: z.ZodOptional<z.ZodString>;
2711
2799
  }, z.core.$strip>>;
2712
2800
  callout: z.ZodOptional<z.ZodObject<{
2713
2801
  text: z.ZodString;
@@ -2738,10 +2826,23 @@ export declare const statsSlideSchema: z.ZodObject<{
2738
2826
  }>>;
2739
2827
  style: z.ZodOptional<z.ZodObject<{
2740
2828
  bgColor: z.ZodOptional<z.ZodString>;
2829
+ bgGradient: z.ZodOptional<z.ZodString>;
2741
2830
  decorations: z.ZodOptional<z.ZodBoolean>;
2742
2831
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2743
2832
  footer: z.ZodOptional<z.ZodString>;
2744
2833
  }, z.core.$strip>>;
2834
+ eyebrow: z.ZodOptional<z.ZodObject<{
2835
+ label: z.ZodString;
2836
+ color: z.ZodOptional<z.ZodEnum<{
2837
+ primary: "primary";
2838
+ accent: "accent";
2839
+ success: "success";
2840
+ warning: "warning";
2841
+ danger: "danger";
2842
+ info: "info";
2843
+ highlight: "highlight";
2844
+ }>>;
2845
+ }, z.core.$strip>>;
2745
2846
  layout: z.ZodLiteral<"stats">;
2746
2847
  }, z.core.$strip>;
2747
2848
  export declare const timelineItemSchema: z.ZodObject<{
@@ -2789,10 +2890,23 @@ export declare const timelineSlideSchema: z.ZodObject<{
2789
2890
  }>>;
2790
2891
  style: z.ZodOptional<z.ZodObject<{
2791
2892
  bgColor: z.ZodOptional<z.ZodString>;
2893
+ bgGradient: z.ZodOptional<z.ZodString>;
2792
2894
  decorations: z.ZodOptional<z.ZodBoolean>;
2793
2895
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2794
2896
  footer: z.ZodOptional<z.ZodString>;
2795
2897
  }, z.core.$strip>>;
2898
+ eyebrow: z.ZodOptional<z.ZodObject<{
2899
+ label: z.ZodString;
2900
+ color: z.ZodOptional<z.ZodEnum<{
2901
+ primary: "primary";
2902
+ accent: "accent";
2903
+ success: "success";
2904
+ warning: "warning";
2905
+ danger: "danger";
2906
+ info: "info";
2907
+ highlight: "highlight";
2908
+ }>>;
2909
+ }, z.core.$strip>>;
2796
2910
  layout: z.ZodLiteral<"timeline">;
2797
2911
  }, z.core.$strip>;
2798
2912
  export declare const splitPanelSchema: z.ZodObject<{
@@ -3647,10 +3761,23 @@ export declare const splitSlideSchema: z.ZodObject<{
3647
3761
  }>>;
3648
3762
  style: z.ZodOptional<z.ZodObject<{
3649
3763
  bgColor: z.ZodOptional<z.ZodString>;
3764
+ bgGradient: z.ZodOptional<z.ZodString>;
3650
3765
  decorations: z.ZodOptional<z.ZodBoolean>;
3651
3766
  bgOpacity: z.ZodOptional<z.ZodNumber>;
3652
3767
  footer: z.ZodOptional<z.ZodString>;
3653
3768
  }, z.core.$strip>>;
3769
+ eyebrow: z.ZodOptional<z.ZodObject<{
3770
+ label: z.ZodString;
3771
+ color: z.ZodOptional<z.ZodEnum<{
3772
+ primary: "primary";
3773
+ accent: "accent";
3774
+ success: "success";
3775
+ warning: "warning";
3776
+ danger: "danger";
3777
+ info: "info";
3778
+ highlight: "highlight";
3779
+ }>>;
3780
+ }, z.core.$strip>>;
3654
3781
  layout: z.ZodLiteral<"split">;
3655
3782
  }, z.core.$strip>;
3656
3783
  export declare const matrixCellSchema: z.ZodObject<{
@@ -4222,10 +4349,23 @@ export declare const matrixSlideSchema: z.ZodObject<{
4222
4349
  }>>;
4223
4350
  style: z.ZodOptional<z.ZodObject<{
4224
4351
  bgColor: z.ZodOptional<z.ZodString>;
4352
+ bgGradient: z.ZodOptional<z.ZodString>;
4225
4353
  decorations: z.ZodOptional<z.ZodBoolean>;
4226
4354
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4227
4355
  footer: z.ZodOptional<z.ZodString>;
4228
4356
  }, z.core.$strip>>;
4357
+ eyebrow: z.ZodOptional<z.ZodObject<{
4358
+ label: z.ZodString;
4359
+ color: z.ZodOptional<z.ZodEnum<{
4360
+ primary: "primary";
4361
+ accent: "accent";
4362
+ success: "success";
4363
+ warning: "warning";
4364
+ danger: "danger";
4365
+ info: "info";
4366
+ highlight: "highlight";
4367
+ }>>;
4368
+ }, z.core.$strip>>;
4229
4369
  layout: z.ZodLiteral<"matrix">;
4230
4370
  }, z.core.$strip>;
4231
4371
  export declare const tableSlideSchema: z.ZodObject<{
@@ -4278,10 +4418,23 @@ export declare const tableSlideSchema: z.ZodObject<{
4278
4418
  }>>;
4279
4419
  style: z.ZodOptional<z.ZodObject<{
4280
4420
  bgColor: z.ZodOptional<z.ZodString>;
4421
+ bgGradient: z.ZodOptional<z.ZodString>;
4281
4422
  decorations: z.ZodOptional<z.ZodBoolean>;
4282
4423
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4283
4424
  footer: z.ZodOptional<z.ZodString>;
4284
4425
  }, z.core.$strip>>;
4426
+ eyebrow: z.ZodOptional<z.ZodObject<{
4427
+ label: z.ZodString;
4428
+ color: z.ZodOptional<z.ZodEnum<{
4429
+ primary: "primary";
4430
+ accent: "accent";
4431
+ success: "success";
4432
+ warning: "warning";
4433
+ danger: "danger";
4434
+ info: "info";
4435
+ highlight: "highlight";
4436
+ }>>;
4437
+ }, z.core.$strip>>;
4285
4438
  layout: z.ZodLiteral<"table">;
4286
4439
  }, z.core.$strip>;
4287
4440
  export declare const waterfallItemSchema: z.ZodObject<{
@@ -4346,10 +4499,23 @@ export declare const waterfallSlideSchema: z.ZodObject<{
4346
4499
  }>>;
4347
4500
  style: z.ZodOptional<z.ZodObject<{
4348
4501
  bgColor: z.ZodOptional<z.ZodString>;
4502
+ bgGradient: z.ZodOptional<z.ZodString>;
4349
4503
  decorations: z.ZodOptional<z.ZodBoolean>;
4350
4504
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4351
4505
  footer: z.ZodOptional<z.ZodString>;
4352
4506
  }, z.core.$strip>>;
4507
+ eyebrow: z.ZodOptional<z.ZodObject<{
4508
+ label: z.ZodString;
4509
+ color: z.ZodOptional<z.ZodEnum<{
4510
+ primary: "primary";
4511
+ accent: "accent";
4512
+ success: "success";
4513
+ warning: "warning";
4514
+ danger: "danger";
4515
+ info: "info";
4516
+ highlight: "highlight";
4517
+ }>>;
4518
+ }, z.core.$strip>>;
4353
4519
  layout: z.ZodLiteral<"waterfall">;
4354
4520
  }, z.core.$strip>;
4355
4521
  export declare const funnelStageSchema: z.ZodObject<{
@@ -4413,10 +4579,23 @@ export declare const funnelSlideSchema: z.ZodObject<{
4413
4579
  }>>;
4414
4580
  style: z.ZodOptional<z.ZodObject<{
4415
4581
  bgColor: z.ZodOptional<z.ZodString>;
4582
+ bgGradient: z.ZodOptional<z.ZodString>;
4416
4583
  decorations: z.ZodOptional<z.ZodBoolean>;
4417
4584
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4418
4585
  footer: z.ZodOptional<z.ZodString>;
4419
4586
  }, z.core.$strip>>;
4587
+ eyebrow: z.ZodOptional<z.ZodObject<{
4588
+ label: z.ZodString;
4589
+ color: z.ZodOptional<z.ZodEnum<{
4590
+ primary: "primary";
4591
+ accent: "accent";
4592
+ success: "success";
4593
+ warning: "warning";
4594
+ danger: "danger";
4595
+ info: "info";
4596
+ highlight: "highlight";
4597
+ }>>;
4598
+ }, z.core.$strip>>;
4420
4599
  layout: z.ZodLiteral<"funnel">;
4421
4600
  }, z.core.$strip>;
4422
4601
  export declare const slideBrandingLogoSchema: z.ZodObject<{
@@ -4484,6 +4663,7 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4484
4663
  subtitle: z.ZodOptional<z.ZodString>;
4485
4664
  author: z.ZodOptional<z.ZodString>;
4486
4665
  note: z.ZodOptional<z.ZodString>;
4666
+ chips: z.ZodOptional<z.ZodArray<z.ZodString>>;
4487
4667
  accentColor: z.ZodOptional<z.ZodEnum<{
4488
4668
  primary: "primary";
4489
4669
  accent: "accent";
@@ -4495,10 +4675,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4495
4675
  }>>;
4496
4676
  style: z.ZodOptional<z.ZodObject<{
4497
4677
  bgColor: z.ZodOptional<z.ZodString>;
4678
+ bgGradient: z.ZodOptional<z.ZodString>;
4498
4679
  decorations: z.ZodOptional<z.ZodBoolean>;
4499
4680
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4500
4681
  footer: z.ZodOptional<z.ZodString>;
4501
4682
  }, z.core.$strip>>;
4683
+ eyebrow: z.ZodOptional<z.ZodObject<{
4684
+ label: z.ZodString;
4685
+ color: z.ZodOptional<z.ZodEnum<{
4686
+ primary: "primary";
4687
+ accent: "accent";
4688
+ success: "success";
4689
+ warning: "warning";
4690
+ danger: "danger";
4691
+ info: "info";
4692
+ highlight: "highlight";
4693
+ }>>;
4694
+ }, z.core.$strip>>;
4502
4695
  layout: z.ZodLiteral<"title">;
4503
4696
  }, z.core.$strip>, z.ZodObject<{
4504
4697
  title: z.ZodString;
@@ -4776,6 +4969,7 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4776
4969
  footer: z.ZodOptional<z.ZodString>;
4777
4970
  label: z.ZodOptional<z.ZodString>;
4778
4971
  num: z.ZodOptional<z.ZodNumber>;
4972
+ numLabel: z.ZodOptional<z.ZodString>;
4779
4973
  icon: z.ZodOptional<z.ZodString>;
4780
4974
  }, z.core.$strip>>;
4781
4975
  showArrows: z.ZodOptional<z.ZodBoolean>;
@@ -4809,10 +5003,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4809
5003
  }>>;
4810
5004
  style: z.ZodOptional<z.ZodObject<{
4811
5005
  bgColor: z.ZodOptional<z.ZodString>;
5006
+ bgGradient: z.ZodOptional<z.ZodString>;
4812
5007
  decorations: z.ZodOptional<z.ZodBoolean>;
4813
5008
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4814
5009
  footer: z.ZodOptional<z.ZodString>;
4815
5010
  }, z.core.$strip>>;
5011
+ eyebrow: z.ZodOptional<z.ZodObject<{
5012
+ label: z.ZodString;
5013
+ color: z.ZodOptional<z.ZodEnum<{
5014
+ primary: "primary";
5015
+ accent: "accent";
5016
+ success: "success";
5017
+ warning: "warning";
5018
+ danger: "danger";
5019
+ info: "info";
5020
+ highlight: "highlight";
5021
+ }>>;
5022
+ }, z.core.$strip>>;
4816
5023
  layout: z.ZodLiteral<"columns">;
4817
5024
  }, z.core.$strip>, z.ZodObject<{
4818
5025
  title: z.ZodString;
@@ -5389,10 +5596,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5389
5596
  }>>;
5390
5597
  style: z.ZodOptional<z.ZodObject<{
5391
5598
  bgColor: z.ZodOptional<z.ZodString>;
5599
+ bgGradient: z.ZodOptional<z.ZodString>;
5392
5600
  decorations: z.ZodOptional<z.ZodBoolean>;
5393
5601
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5394
5602
  footer: z.ZodOptional<z.ZodString>;
5395
5603
  }, z.core.$strip>>;
5604
+ eyebrow: z.ZodOptional<z.ZodObject<{
5605
+ label: z.ZodString;
5606
+ color: z.ZodOptional<z.ZodEnum<{
5607
+ primary: "primary";
5608
+ accent: "accent";
5609
+ success: "success";
5610
+ warning: "warning";
5611
+ danger: "danger";
5612
+ info: "info";
5613
+ highlight: "highlight";
5614
+ }>>;
5615
+ }, z.core.$strip>>;
5396
5616
  layout: z.ZodLiteral<"comparison">;
5397
5617
  }, z.core.$strip>, z.ZodObject<{
5398
5618
  title: z.ZodString;
@@ -5683,10 +5903,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5683
5903
  }>>;
5684
5904
  style: z.ZodOptional<z.ZodObject<{
5685
5905
  bgColor: z.ZodOptional<z.ZodString>;
5906
+ bgGradient: z.ZodOptional<z.ZodString>;
5686
5907
  decorations: z.ZodOptional<z.ZodBoolean>;
5687
5908
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5688
5909
  footer: z.ZodOptional<z.ZodString>;
5689
5910
  }, z.core.$strip>>;
5911
+ eyebrow: z.ZodOptional<z.ZodObject<{
5912
+ label: z.ZodString;
5913
+ color: z.ZodOptional<z.ZodEnum<{
5914
+ primary: "primary";
5915
+ accent: "accent";
5916
+ success: "success";
5917
+ warning: "warning";
5918
+ danger: "danger";
5919
+ info: "info";
5920
+ highlight: "highlight";
5921
+ }>>;
5922
+ }, z.core.$strip>>;
5690
5923
  layout: z.ZodLiteral<"grid">;
5691
5924
  }, z.core.$strip>, z.ZodObject<{
5692
5925
  quote: z.ZodString;
@@ -5703,10 +5936,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5703
5936
  }>>;
5704
5937
  style: z.ZodOptional<z.ZodObject<{
5705
5938
  bgColor: z.ZodOptional<z.ZodString>;
5939
+ bgGradient: z.ZodOptional<z.ZodString>;
5706
5940
  decorations: z.ZodOptional<z.ZodBoolean>;
5707
5941
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5708
5942
  footer: z.ZodOptional<z.ZodString>;
5709
5943
  }, z.core.$strip>>;
5944
+ eyebrow: z.ZodOptional<z.ZodObject<{
5945
+ label: z.ZodString;
5946
+ color: z.ZodOptional<z.ZodEnum<{
5947
+ primary: "primary";
5948
+ accent: "accent";
5949
+ success: "success";
5950
+ warning: "warning";
5951
+ danger: "danger";
5952
+ info: "info";
5953
+ highlight: "highlight";
5954
+ }>>;
5955
+ }, z.core.$strip>>;
5710
5956
  layout: z.ZodLiteral<"bigQuote">;
5711
5957
  }, z.core.$strip>, z.ZodObject<{
5712
5958
  title: z.ZodString;
@@ -5725,6 +5971,7 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5725
5971
  highlight: "highlight";
5726
5972
  }>>;
5727
5973
  change: z.ZodOptional<z.ZodString>;
5974
+ numLabel: z.ZodOptional<z.ZodString>;
5728
5975
  }, z.core.$strip>>;
5729
5976
  callout: z.ZodOptional<z.ZodObject<{
5730
5977
  text: z.ZodString;
@@ -5755,10 +6002,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5755
6002
  }>>;
5756
6003
  style: z.ZodOptional<z.ZodObject<{
5757
6004
  bgColor: z.ZodOptional<z.ZodString>;
6005
+ bgGradient: z.ZodOptional<z.ZodString>;
5758
6006
  decorations: z.ZodOptional<z.ZodBoolean>;
5759
6007
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5760
6008
  footer: z.ZodOptional<z.ZodString>;
5761
6009
  }, z.core.$strip>>;
6010
+ eyebrow: z.ZodOptional<z.ZodObject<{
6011
+ label: z.ZodString;
6012
+ color: z.ZodOptional<z.ZodEnum<{
6013
+ primary: "primary";
6014
+ accent: "accent";
6015
+ success: "success";
6016
+ warning: "warning";
6017
+ danger: "danger";
6018
+ info: "info";
6019
+ highlight: "highlight";
6020
+ }>>;
6021
+ }, z.core.$strip>>;
5762
6022
  layout: z.ZodLiteral<"stats">;
5763
6023
  }, z.core.$strip>, z.ZodObject<{
5764
6024
  title: z.ZodString;
@@ -5790,10 +6050,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5790
6050
  }>>;
5791
6051
  style: z.ZodOptional<z.ZodObject<{
5792
6052
  bgColor: z.ZodOptional<z.ZodString>;
6053
+ bgGradient: z.ZodOptional<z.ZodString>;
5793
6054
  decorations: z.ZodOptional<z.ZodBoolean>;
5794
6055
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5795
6056
  footer: z.ZodOptional<z.ZodString>;
5796
6057
  }, z.core.$strip>>;
6058
+ eyebrow: z.ZodOptional<z.ZodObject<{
6059
+ label: z.ZodString;
6060
+ color: z.ZodOptional<z.ZodEnum<{
6061
+ primary: "primary";
6062
+ accent: "accent";
6063
+ success: "success";
6064
+ warning: "warning";
6065
+ danger: "danger";
6066
+ info: "info";
6067
+ highlight: "highlight";
6068
+ }>>;
6069
+ }, z.core.$strip>>;
5797
6070
  layout: z.ZodLiteral<"timeline">;
5798
6071
  }, z.core.$strip>, z.ZodObject<{
5799
6072
  left: z.ZodOptional<z.ZodObject<{
@@ -6367,10 +6640,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6367
6640
  }>>;
6368
6641
  style: z.ZodOptional<z.ZodObject<{
6369
6642
  bgColor: z.ZodOptional<z.ZodString>;
6643
+ bgGradient: z.ZodOptional<z.ZodString>;
6370
6644
  decorations: z.ZodOptional<z.ZodBoolean>;
6371
6645
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6372
6646
  footer: z.ZodOptional<z.ZodString>;
6373
6647
  }, z.core.$strip>>;
6648
+ eyebrow: z.ZodOptional<z.ZodObject<{
6649
+ label: z.ZodString;
6650
+ color: z.ZodOptional<z.ZodEnum<{
6651
+ primary: "primary";
6652
+ accent: "accent";
6653
+ success: "success";
6654
+ warning: "warning";
6655
+ danger: "danger";
6656
+ info: "info";
6657
+ highlight: "highlight";
6658
+ }>>;
6659
+ }, z.core.$strip>>;
6374
6660
  layout: z.ZodLiteral<"split">;
6375
6661
  }, z.core.$strip>, z.ZodObject<{
6376
6662
  title: z.ZodString;
@@ -6670,10 +6956,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6670
6956
  }>>;
6671
6957
  style: z.ZodOptional<z.ZodObject<{
6672
6958
  bgColor: z.ZodOptional<z.ZodString>;
6959
+ bgGradient: z.ZodOptional<z.ZodString>;
6673
6960
  decorations: z.ZodOptional<z.ZodBoolean>;
6674
6961
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6675
6962
  footer: z.ZodOptional<z.ZodString>;
6676
6963
  }, z.core.$strip>>;
6964
+ eyebrow: z.ZodOptional<z.ZodObject<{
6965
+ label: z.ZodString;
6966
+ color: z.ZodOptional<z.ZodEnum<{
6967
+ primary: "primary";
6968
+ accent: "accent";
6969
+ success: "success";
6970
+ warning: "warning";
6971
+ danger: "danger";
6972
+ info: "info";
6973
+ highlight: "highlight";
6974
+ }>>;
6975
+ }, z.core.$strip>>;
6677
6976
  layout: z.ZodLiteral<"matrix">;
6678
6977
  }, z.core.$strip>, z.ZodObject<{
6679
6978
  title: z.ZodString;
@@ -6725,10 +7024,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6725
7024
  }>>;
6726
7025
  style: z.ZodOptional<z.ZodObject<{
6727
7026
  bgColor: z.ZodOptional<z.ZodString>;
7027
+ bgGradient: z.ZodOptional<z.ZodString>;
6728
7028
  decorations: z.ZodOptional<z.ZodBoolean>;
6729
7029
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6730
7030
  footer: z.ZodOptional<z.ZodString>;
6731
7031
  }, z.core.$strip>>;
7032
+ eyebrow: z.ZodOptional<z.ZodObject<{
7033
+ label: z.ZodString;
7034
+ color: z.ZodOptional<z.ZodEnum<{
7035
+ primary: "primary";
7036
+ accent: "accent";
7037
+ success: "success";
7038
+ warning: "warning";
7039
+ danger: "danger";
7040
+ info: "info";
7041
+ highlight: "highlight";
7042
+ }>>;
7043
+ }, z.core.$strip>>;
6732
7044
  layout: z.ZodLiteral<"table">;
6733
7045
  }, z.core.$strip>, z.ZodObject<{
6734
7046
  title: z.ZodString;
@@ -6777,10 +7089,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6777
7089
  }>>;
6778
7090
  style: z.ZodOptional<z.ZodObject<{
6779
7091
  bgColor: z.ZodOptional<z.ZodString>;
7092
+ bgGradient: z.ZodOptional<z.ZodString>;
6780
7093
  decorations: z.ZodOptional<z.ZodBoolean>;
6781
7094
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6782
7095
  footer: z.ZodOptional<z.ZodString>;
6783
7096
  }, z.core.$strip>>;
7097
+ eyebrow: z.ZodOptional<z.ZodObject<{
7098
+ label: z.ZodString;
7099
+ color: z.ZodOptional<z.ZodEnum<{
7100
+ primary: "primary";
7101
+ accent: "accent";
7102
+ success: "success";
7103
+ warning: "warning";
7104
+ danger: "danger";
7105
+ info: "info";
7106
+ highlight: "highlight";
7107
+ }>>;
7108
+ }, z.core.$strip>>;
6784
7109
  layout: z.ZodLiteral<"funnel">;
6785
7110
  }, z.core.$strip>, z.ZodObject<{
6786
7111
  title: z.ZodString;
@@ -6830,10 +7155,23 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6830
7155
  }>>;
6831
7156
  style: z.ZodOptional<z.ZodObject<{
6832
7157
  bgColor: z.ZodOptional<z.ZodString>;
7158
+ bgGradient: z.ZodOptional<z.ZodString>;
6833
7159
  decorations: z.ZodOptional<z.ZodBoolean>;
6834
7160
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6835
7161
  footer: z.ZodOptional<z.ZodString>;
6836
7162
  }, z.core.$strip>>;
7163
+ eyebrow: z.ZodOptional<z.ZodObject<{
7164
+ label: z.ZodString;
7165
+ color: z.ZodOptional<z.ZodEnum<{
7166
+ primary: "primary";
7167
+ accent: "accent";
7168
+ success: "success";
7169
+ warning: "warning";
7170
+ danger: "danger";
7171
+ info: "info";
7172
+ highlight: "highlight";
7173
+ }>>;
7174
+ }, z.core.$strip>>;
6837
7175
  layout: z.ZodLiteral<"waterfall">;
6838
7176
  }, z.core.$strip>], "layout">;
6839
7177
  /** Media schema registered in mulmoImageAssetSchema */
@@ -6859,13 +7197,17 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
6859
7197
  title: z.ZodString;
6860
7198
  body: z.ZodString;
6861
7199
  mono: z.ZodString;
7200
+ accent: z.ZodOptional<z.ZodString>;
6862
7201
  }, z.core.$strip>;
7202
+ bgGradient: z.ZodOptional<z.ZodString>;
7203
+ titleGradient: z.ZodOptional<z.ZodString>;
6863
7204
  }, z.core.$strip>>;
6864
7205
  slide: z.ZodDiscriminatedUnion<[z.ZodObject<{
6865
7206
  title: z.ZodString;
6866
7207
  subtitle: z.ZodOptional<z.ZodString>;
6867
7208
  author: z.ZodOptional<z.ZodString>;
6868
7209
  note: z.ZodOptional<z.ZodString>;
7210
+ chips: z.ZodOptional<z.ZodArray<z.ZodString>>;
6869
7211
  accentColor: z.ZodOptional<z.ZodEnum<{
6870
7212
  primary: "primary";
6871
7213
  accent: "accent";
@@ -6877,10 +7219,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
6877
7219
  }>>;
6878
7220
  style: z.ZodOptional<z.ZodObject<{
6879
7221
  bgColor: z.ZodOptional<z.ZodString>;
7222
+ bgGradient: z.ZodOptional<z.ZodString>;
6880
7223
  decorations: z.ZodOptional<z.ZodBoolean>;
6881
7224
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6882
7225
  footer: z.ZodOptional<z.ZodString>;
6883
7226
  }, z.core.$strip>>;
7227
+ eyebrow: z.ZodOptional<z.ZodObject<{
7228
+ label: z.ZodString;
7229
+ color: z.ZodOptional<z.ZodEnum<{
7230
+ primary: "primary";
7231
+ accent: "accent";
7232
+ success: "success";
7233
+ warning: "warning";
7234
+ danger: "danger";
7235
+ info: "info";
7236
+ highlight: "highlight";
7237
+ }>>;
7238
+ }, z.core.$strip>>;
6884
7239
  layout: z.ZodLiteral<"title">;
6885
7240
  }, z.core.$strip>, z.ZodObject<{
6886
7241
  title: z.ZodString;
@@ -7158,6 +7513,7 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
7158
7513
  footer: z.ZodOptional<z.ZodString>;
7159
7514
  label: z.ZodOptional<z.ZodString>;
7160
7515
  num: z.ZodOptional<z.ZodNumber>;
7516
+ numLabel: z.ZodOptional<z.ZodString>;
7161
7517
  icon: z.ZodOptional<z.ZodString>;
7162
7518
  }, z.core.$strip>>;
7163
7519
  showArrows: z.ZodOptional<z.ZodBoolean>;
@@ -7191,10 +7547,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
7191
7547
  }>>;
7192
7548
  style: z.ZodOptional<z.ZodObject<{
7193
7549
  bgColor: z.ZodOptional<z.ZodString>;
7550
+ bgGradient: z.ZodOptional<z.ZodString>;
7194
7551
  decorations: z.ZodOptional<z.ZodBoolean>;
7195
7552
  bgOpacity: z.ZodOptional<z.ZodNumber>;
7196
7553
  footer: z.ZodOptional<z.ZodString>;
7197
7554
  }, z.core.$strip>>;
7555
+ eyebrow: z.ZodOptional<z.ZodObject<{
7556
+ label: z.ZodString;
7557
+ color: z.ZodOptional<z.ZodEnum<{
7558
+ primary: "primary";
7559
+ accent: "accent";
7560
+ success: "success";
7561
+ warning: "warning";
7562
+ danger: "danger";
7563
+ info: "info";
7564
+ highlight: "highlight";
7565
+ }>>;
7566
+ }, z.core.$strip>>;
7198
7567
  layout: z.ZodLiteral<"columns">;
7199
7568
  }, z.core.$strip>, z.ZodObject<{
7200
7569
  title: z.ZodString;
@@ -7771,10 +8140,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
7771
8140
  }>>;
7772
8141
  style: z.ZodOptional<z.ZodObject<{
7773
8142
  bgColor: z.ZodOptional<z.ZodString>;
8143
+ bgGradient: z.ZodOptional<z.ZodString>;
7774
8144
  decorations: z.ZodOptional<z.ZodBoolean>;
7775
8145
  bgOpacity: z.ZodOptional<z.ZodNumber>;
7776
8146
  footer: z.ZodOptional<z.ZodString>;
7777
8147
  }, z.core.$strip>>;
8148
+ eyebrow: z.ZodOptional<z.ZodObject<{
8149
+ label: z.ZodString;
8150
+ color: z.ZodOptional<z.ZodEnum<{
8151
+ primary: "primary";
8152
+ accent: "accent";
8153
+ success: "success";
8154
+ warning: "warning";
8155
+ danger: "danger";
8156
+ info: "info";
8157
+ highlight: "highlight";
8158
+ }>>;
8159
+ }, z.core.$strip>>;
7778
8160
  layout: z.ZodLiteral<"comparison">;
7779
8161
  }, z.core.$strip>, z.ZodObject<{
7780
8162
  title: z.ZodString;
@@ -8065,10 +8447,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8065
8447
  }>>;
8066
8448
  style: z.ZodOptional<z.ZodObject<{
8067
8449
  bgColor: z.ZodOptional<z.ZodString>;
8450
+ bgGradient: z.ZodOptional<z.ZodString>;
8068
8451
  decorations: z.ZodOptional<z.ZodBoolean>;
8069
8452
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8070
8453
  footer: z.ZodOptional<z.ZodString>;
8071
8454
  }, z.core.$strip>>;
8455
+ eyebrow: z.ZodOptional<z.ZodObject<{
8456
+ label: z.ZodString;
8457
+ color: z.ZodOptional<z.ZodEnum<{
8458
+ primary: "primary";
8459
+ accent: "accent";
8460
+ success: "success";
8461
+ warning: "warning";
8462
+ danger: "danger";
8463
+ info: "info";
8464
+ highlight: "highlight";
8465
+ }>>;
8466
+ }, z.core.$strip>>;
8072
8467
  layout: z.ZodLiteral<"grid">;
8073
8468
  }, z.core.$strip>, z.ZodObject<{
8074
8469
  quote: z.ZodString;
@@ -8085,10 +8480,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8085
8480
  }>>;
8086
8481
  style: z.ZodOptional<z.ZodObject<{
8087
8482
  bgColor: z.ZodOptional<z.ZodString>;
8483
+ bgGradient: z.ZodOptional<z.ZodString>;
8088
8484
  decorations: z.ZodOptional<z.ZodBoolean>;
8089
8485
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8090
8486
  footer: z.ZodOptional<z.ZodString>;
8091
8487
  }, z.core.$strip>>;
8488
+ eyebrow: z.ZodOptional<z.ZodObject<{
8489
+ label: z.ZodString;
8490
+ color: z.ZodOptional<z.ZodEnum<{
8491
+ primary: "primary";
8492
+ accent: "accent";
8493
+ success: "success";
8494
+ warning: "warning";
8495
+ danger: "danger";
8496
+ info: "info";
8497
+ highlight: "highlight";
8498
+ }>>;
8499
+ }, z.core.$strip>>;
8092
8500
  layout: z.ZodLiteral<"bigQuote">;
8093
8501
  }, z.core.$strip>, z.ZodObject<{
8094
8502
  title: z.ZodString;
@@ -8107,6 +8515,7 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8107
8515
  highlight: "highlight";
8108
8516
  }>>;
8109
8517
  change: z.ZodOptional<z.ZodString>;
8518
+ numLabel: z.ZodOptional<z.ZodString>;
8110
8519
  }, z.core.$strip>>;
8111
8520
  callout: z.ZodOptional<z.ZodObject<{
8112
8521
  text: z.ZodString;
@@ -8137,10 +8546,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8137
8546
  }>>;
8138
8547
  style: z.ZodOptional<z.ZodObject<{
8139
8548
  bgColor: z.ZodOptional<z.ZodString>;
8549
+ bgGradient: z.ZodOptional<z.ZodString>;
8140
8550
  decorations: z.ZodOptional<z.ZodBoolean>;
8141
8551
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8142
8552
  footer: z.ZodOptional<z.ZodString>;
8143
8553
  }, z.core.$strip>>;
8554
+ eyebrow: z.ZodOptional<z.ZodObject<{
8555
+ label: z.ZodString;
8556
+ color: z.ZodOptional<z.ZodEnum<{
8557
+ primary: "primary";
8558
+ accent: "accent";
8559
+ success: "success";
8560
+ warning: "warning";
8561
+ danger: "danger";
8562
+ info: "info";
8563
+ highlight: "highlight";
8564
+ }>>;
8565
+ }, z.core.$strip>>;
8144
8566
  layout: z.ZodLiteral<"stats">;
8145
8567
  }, z.core.$strip>, z.ZodObject<{
8146
8568
  title: z.ZodString;
@@ -8172,10 +8594,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8172
8594
  }>>;
8173
8595
  style: z.ZodOptional<z.ZodObject<{
8174
8596
  bgColor: z.ZodOptional<z.ZodString>;
8597
+ bgGradient: z.ZodOptional<z.ZodString>;
8175
8598
  decorations: z.ZodOptional<z.ZodBoolean>;
8176
8599
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8177
8600
  footer: z.ZodOptional<z.ZodString>;
8178
8601
  }, z.core.$strip>>;
8602
+ eyebrow: z.ZodOptional<z.ZodObject<{
8603
+ label: z.ZodString;
8604
+ color: z.ZodOptional<z.ZodEnum<{
8605
+ primary: "primary";
8606
+ accent: "accent";
8607
+ success: "success";
8608
+ warning: "warning";
8609
+ danger: "danger";
8610
+ info: "info";
8611
+ highlight: "highlight";
8612
+ }>>;
8613
+ }, z.core.$strip>>;
8179
8614
  layout: z.ZodLiteral<"timeline">;
8180
8615
  }, z.core.$strip>, z.ZodObject<{
8181
8616
  left: z.ZodOptional<z.ZodObject<{
@@ -8749,10 +9184,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8749
9184
  }>>;
8750
9185
  style: z.ZodOptional<z.ZodObject<{
8751
9186
  bgColor: z.ZodOptional<z.ZodString>;
9187
+ bgGradient: z.ZodOptional<z.ZodString>;
8752
9188
  decorations: z.ZodOptional<z.ZodBoolean>;
8753
9189
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8754
9190
  footer: z.ZodOptional<z.ZodString>;
8755
9191
  }, z.core.$strip>>;
9192
+ eyebrow: z.ZodOptional<z.ZodObject<{
9193
+ label: z.ZodString;
9194
+ color: z.ZodOptional<z.ZodEnum<{
9195
+ primary: "primary";
9196
+ accent: "accent";
9197
+ success: "success";
9198
+ warning: "warning";
9199
+ danger: "danger";
9200
+ info: "info";
9201
+ highlight: "highlight";
9202
+ }>>;
9203
+ }, z.core.$strip>>;
8756
9204
  layout: z.ZodLiteral<"split">;
8757
9205
  }, z.core.$strip>, z.ZodObject<{
8758
9206
  title: z.ZodString;
@@ -9052,10 +9500,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9052
9500
  }>>;
9053
9501
  style: z.ZodOptional<z.ZodObject<{
9054
9502
  bgColor: z.ZodOptional<z.ZodString>;
9503
+ bgGradient: z.ZodOptional<z.ZodString>;
9055
9504
  decorations: z.ZodOptional<z.ZodBoolean>;
9056
9505
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9057
9506
  footer: z.ZodOptional<z.ZodString>;
9058
9507
  }, z.core.$strip>>;
9508
+ eyebrow: z.ZodOptional<z.ZodObject<{
9509
+ label: z.ZodString;
9510
+ color: z.ZodOptional<z.ZodEnum<{
9511
+ primary: "primary";
9512
+ accent: "accent";
9513
+ success: "success";
9514
+ warning: "warning";
9515
+ danger: "danger";
9516
+ info: "info";
9517
+ highlight: "highlight";
9518
+ }>>;
9519
+ }, z.core.$strip>>;
9059
9520
  layout: z.ZodLiteral<"matrix">;
9060
9521
  }, z.core.$strip>, z.ZodObject<{
9061
9522
  title: z.ZodString;
@@ -9107,10 +9568,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9107
9568
  }>>;
9108
9569
  style: z.ZodOptional<z.ZodObject<{
9109
9570
  bgColor: z.ZodOptional<z.ZodString>;
9571
+ bgGradient: z.ZodOptional<z.ZodString>;
9110
9572
  decorations: z.ZodOptional<z.ZodBoolean>;
9111
9573
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9112
9574
  footer: z.ZodOptional<z.ZodString>;
9113
9575
  }, z.core.$strip>>;
9576
+ eyebrow: z.ZodOptional<z.ZodObject<{
9577
+ label: z.ZodString;
9578
+ color: z.ZodOptional<z.ZodEnum<{
9579
+ primary: "primary";
9580
+ accent: "accent";
9581
+ success: "success";
9582
+ warning: "warning";
9583
+ danger: "danger";
9584
+ info: "info";
9585
+ highlight: "highlight";
9586
+ }>>;
9587
+ }, z.core.$strip>>;
9114
9588
  layout: z.ZodLiteral<"table">;
9115
9589
  }, z.core.$strip>, z.ZodObject<{
9116
9590
  title: z.ZodString;
@@ -9159,10 +9633,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9159
9633
  }>>;
9160
9634
  style: z.ZodOptional<z.ZodObject<{
9161
9635
  bgColor: z.ZodOptional<z.ZodString>;
9636
+ bgGradient: z.ZodOptional<z.ZodString>;
9162
9637
  decorations: z.ZodOptional<z.ZodBoolean>;
9163
9638
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9164
9639
  footer: z.ZodOptional<z.ZodString>;
9165
9640
  }, z.core.$strip>>;
9641
+ eyebrow: z.ZodOptional<z.ZodObject<{
9642
+ label: z.ZodString;
9643
+ color: z.ZodOptional<z.ZodEnum<{
9644
+ primary: "primary";
9645
+ accent: "accent";
9646
+ success: "success";
9647
+ warning: "warning";
9648
+ danger: "danger";
9649
+ info: "info";
9650
+ highlight: "highlight";
9651
+ }>>;
9652
+ }, z.core.$strip>>;
9166
9653
  layout: z.ZodLiteral<"funnel">;
9167
9654
  }, z.core.$strip>, z.ZodObject<{
9168
9655
  title: z.ZodString;
@@ -9212,10 +9699,23 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9212
9699
  }>>;
9213
9700
  style: z.ZodOptional<z.ZodObject<{
9214
9701
  bgColor: z.ZodOptional<z.ZodString>;
9702
+ bgGradient: z.ZodOptional<z.ZodString>;
9215
9703
  decorations: z.ZodOptional<z.ZodBoolean>;
9216
9704
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9217
9705
  footer: z.ZodOptional<z.ZodString>;
9218
9706
  }, z.core.$strip>>;
9707
+ eyebrow: z.ZodOptional<z.ZodObject<{
9708
+ label: z.ZodString;
9709
+ color: z.ZodOptional<z.ZodEnum<{
9710
+ primary: "primary";
9711
+ accent: "accent";
9712
+ success: "success";
9713
+ warning: "warning";
9714
+ danger: "danger";
9715
+ info: "info";
9716
+ highlight: "highlight";
9717
+ }>>;
9718
+ }, z.core.$strip>>;
9219
9719
  layout: z.ZodLiteral<"waterfall">;
9220
9720
  }, z.core.$strip>], "layout">;
9221
9721
  reference: z.ZodOptional<z.ZodString>;
package/lib/schema.js CHANGED
@@ -25,10 +25,16 @@ export const slideThemeFontsSchema = z.object({
25
25
  title: z.string(),
26
26
  body: z.string(),
27
27
  mono: z.string(),
28
+ /** Optional secondary font for numbers / English labels (e.g. "Outfit"). When set, registers a `font-accent` Tailwind utility. */
29
+ accent: z.string().optional(),
28
30
  });
29
31
  export const slideThemeSchema = z.object({
30
32
  colors: slideThemeColorsSchema,
31
33
  fonts: slideThemeFontsSchema,
34
+ /** Optional CSS background value applied to every slide (e.g. `linear-gradient(...)`). Per-slide `style.bgGradient` wins over this. */
35
+ bgGradient: z.string().optional(),
36
+ /** Optional CSS gradient injected as `<style>` to paint `h1.font-title.font-bold` with `background-clip: text`. */
37
+ titleGradient: z.string().optional(),
32
38
  });
33
39
  // ═══════════════════════════════════════════════════════════
34
40
  // Content Blocks — the atoms of slide content
@@ -164,6 +170,8 @@ export const cardSchema = z.object({
164
170
  footer: z.string().optional(),
165
171
  label: z.string().optional(),
166
172
  num: z.number().optional(),
173
+ /** Optional accent-colored typographic prefix before the card title (e.g. "01", "Ⅱ", "★"). */
174
+ numLabel: z.string().optional(),
167
175
  icon: z.string().optional(),
168
176
  });
169
177
  // ═══════════════════════════════════════════════════════════
@@ -171,14 +179,24 @@ export const cardSchema = z.object({
171
179
  // ═══════════════════════════════════════════════════════════
172
180
  export const slideStyleSchema = z.object({
173
181
  bgColor: z.string().optional(),
182
+ /** Optional per-slide CSS background value (e.g. `linear-gradient(...)`); wins over `theme.bgGradient` and `bgColor`. */
183
+ bgGradient: z.string().optional(),
174
184
  decorations: z.boolean().optional(),
175
185
  bgOpacity: z.number().optional(),
176
186
  footer: z.string().optional(),
177
187
  });
188
+ /** Optional kicker/category label rendered at the top of a slide (small uppercase pill). */
189
+ export const eyebrowSchema = z.object({
190
+ label: z.string(),
191
+ /** Color token (e.g. "primary", "amber", "success"). Falls back to slide.accentColor / theme primary when absent. */
192
+ color: accentColorKeySchema.optional(),
193
+ });
178
194
  /** Common slide properties shared across all layouts */
179
195
  const slideBaseFields = {
180
196
  accentColor: accentColorKeySchema.optional(),
181
197
  style: slideStyleSchema.optional(),
198
+ /** Optional eyebrow (small uppercase pill) shown at the top of the slide above the header/title. */
199
+ eyebrow: eyebrowSchema.optional(),
182
200
  };
183
201
  // ═══════════════════════════════════════════════════════════
184
202
  // Layouts
@@ -191,6 +209,8 @@ export const titleSlideSchema = z.object({
191
209
  subtitle: z.string().optional(),
192
210
  author: z.string().optional(),
193
211
  note: z.string().optional(),
212
+ /** Optional row of small pill badges shown below the subtitle / note (e.g. ["🚀 deploy or die", "⚡ weekly output"]). */
213
+ chips: z.array(z.string()).optional(),
194
214
  });
195
215
  // ─── columns ───
196
216
  export const columnsSlideSchema = z.object({
@@ -253,6 +273,8 @@ export const statItemSchema = z.object({
253
273
  label: z.string(),
254
274
  color: accentColorKeySchema.optional(),
255
275
  change: z.string().optional(),
276
+ /** Optional accent-colored typographic prefix shown above the value (e.g. "01"). */
277
+ numLabel: z.string().optional(),
256
278
  });
257
279
  export const statsSlideSchema = z.object({
258
280
  layout: z.literal("stats"),
package/lib/utils.d.ts CHANGED
@@ -27,6 +27,12 @@ export declare const resolveChangeColor: (change: string) => string;
27
27
  export declare const renderOptionalCallout: (callout: CalloutBar | undefined) => string;
28
28
  /** Build the Tailwind config JSON string for theme colors and fonts */
29
29
  export declare const buildTailwindConfig: (theme: SlideTheme) => string;
30
+ /**
31
+ * Validate a user-supplied CSS background value before injecting it into an HTML attribute or `<style>` block.
32
+ * Accepts gradient / color syntax; rejects anything that could break out of the attribute context, inject script,
33
+ * or pull external resources. Returns true only when the string is safe to embed verbatim.
34
+ */
35
+ export declare const isSafeCssBackground: (s: string) => boolean;
30
36
  /** Render a numbered circle badge */
31
37
  export declare const numBadge: (num: number, colorKey: string) => string;
32
38
  /** Render an icon in a square container */
@@ -41,19 +47,39 @@ export declare const renderCalloutBar: (obj: {
41
47
  align?: string;
42
48
  leftBar?: boolean;
43
49
  }) => string;
50
+ /**
51
+ * Render an eyebrow pill (small uppercase letter-spaced category label).
52
+ * Renders nothing when `eyebrow` is undefined, so callers can pass through unconditionally.
53
+ */
54
+ export declare const renderEyebrow: (eyebrow: {
55
+ label: string;
56
+ color?: string;
57
+ } | undefined, defaultColor?: string) => string;
58
+ /** Render a chip-row (small bordered pill badges, e.g. tags below a title). Empty / undefined input renders nothing. */
59
+ export declare const renderChipRow: (chips: string[] | undefined) => string;
60
+ /** Render an accent-colored typographic prefix (e.g. "01") to be placed before a card / stat title. */
61
+ export declare const renderNumLabel: (label: string | undefined, colorKey?: string) => string;
44
62
  /** Render header text elements (stepLabel + title + subtitle) without wrapping div */
45
63
  export declare const renderHeaderText: (data: {
46
64
  accentColor?: string;
47
65
  stepLabel?: string;
48
66
  title: string;
49
67
  subtitle?: string;
68
+ eyebrow?: {
69
+ label: string;
70
+ color?: string;
71
+ };
50
72
  }) => string;
51
- /** Render the common slide header (accent bar + title + subtitle) */
73
+ /** Render the common slide header (accent bar + title + subtitle, plus optional eyebrow pill) */
52
74
  export declare const slideHeader: (data: {
53
75
  accentColor?: string;
54
76
  stepLabel?: string;
55
77
  title: string;
56
78
  subtitle?: string;
79
+ eyebrow?: {
80
+ label: string;
81
+ color?: string;
82
+ };
57
83
  }) => string;
58
84
  /** Render accent bar + vertically-centered wrapper with header text (used by stats, timeline) */
59
85
  export declare const centeredSlideHeader: (data: {
@@ -61,6 +87,10 @@ export declare const centeredSlideHeader: (data: {
61
87
  stepLabel?: string;
62
88
  title: string;
63
89
  subtitle?: string;
90
+ eyebrow?: {
91
+ label: string;
92
+ color?: string;
93
+ };
64
94
  }) => string;
65
95
  /** Generate a unique ID with the given prefix (e.g. "chart-0", "mermaid-1") */
66
96
  export declare const generateSlideId: (prefix: string) => string;
package/lib/utils.js CHANGED
@@ -90,19 +90,37 @@ export const buildTailwindConfig = (theme) => {
90
90
  colorMap[mapped] = `#${v}`;
91
91
  }
92
92
  });
93
+ const fontFamily = {
94
+ title: [theme.fonts.title, "serif"],
95
+ body: [theme.fonts.body, "Arial", "sans-serif"],
96
+ mono: [theme.fonts.mono, "monospace"],
97
+ };
98
+ if (theme.fonts.accent) {
99
+ fontFamily.accent = [theme.fonts.accent, "ui-sans-serif", "system-ui", "sans-serif"];
100
+ }
93
101
  return JSON.stringify({
94
102
  theme: {
95
103
  extend: {
96
104
  colors: { d: colorMap },
97
- fontFamily: {
98
- title: [theme.fonts.title, "serif"],
99
- body: [theme.fonts.body, "Arial", "sans-serif"],
100
- mono: [theme.fonts.mono, "monospace"],
101
- },
105
+ fontFamily,
102
106
  },
103
107
  },
104
108
  });
105
109
  };
110
+ /**
111
+ * Validate a user-supplied CSS background value before injecting it into an HTML attribute or `<style>` block.
112
+ * Accepts gradient / color syntax; rejects anything that could break out of the attribute context, inject script,
113
+ * or pull external resources. Returns true only when the string is safe to embed verbatim.
114
+ */
115
+ export const isSafeCssBackground = (s) => {
116
+ if (!s || typeof s !== "string" || s.length > 2000)
117
+ return false;
118
+ if (/[<>"'`{};:\\\r\n]/.test(s))
119
+ return false;
120
+ if (/(javascript|vbscript|data\s+|expression\s*\(|behavior|@import|url\s*\(|attr\s*\(|content\s*\()/i.test(s))
121
+ return false;
122
+ return true;
123
+ };
106
124
  /** Render a numbered circle badge */
107
125
  export const numBadge = (num, colorKey) => {
108
126
  return `<div class="w-10 h-10 rounded-full bg-${c(colorKey)} flex items-center justify-center shrink-0">
@@ -137,10 +155,39 @@ export const renderCalloutBar = (obj) => {
137
155
  <div class="px-4 py-3 text-sm font-body flex-1">${inner}</div>
138
156
  </div>`;
139
157
  };
158
+ /**
159
+ * Render an eyebrow pill (small uppercase letter-spaced category label).
160
+ * Renders nothing when `eyebrow` is undefined, so callers can pass through unconditionally.
161
+ */
162
+ export const renderEyebrow = (eyebrow, defaultColor) => {
163
+ if (!eyebrow)
164
+ return "";
165
+ const color = c(eyebrow.color ?? defaultColor ?? "primary");
166
+ return `<span class="inline-flex items-center gap-2 font-accent font-extrabold uppercase tracking-[0.16em] text-[12px] px-3 py-1 rounded-full border border-d-textDim/30 bg-${color}/10 text-${color}">${renderInlineMarkup(eyebrow.label)}</span>`;
167
+ };
168
+ /** Render a chip-row (small bordered pill badges, e.g. tags below a title). Empty / undefined input renders nothing. */
169
+ export const renderChipRow = (chips) => {
170
+ if (!chips || chips.length === 0)
171
+ return "";
172
+ const items = chips
173
+ .map((label) => `<span class="text-sm px-3 py-1.5 rounded-full border border-d-textDim/30 bg-d-card/40 text-d-text">${renderInlineMarkup(label)}</span>`)
174
+ .join("");
175
+ return `<div class="flex gap-2 flex-wrap mt-4">${items}</div>`;
176
+ };
177
+ /** Render an accent-colored typographic prefix (e.g. "01") to be placed before a card / stat title. */
178
+ export const renderNumLabel = (label, colorKey) => {
179
+ if (!label)
180
+ return "";
181
+ const color = c(colorKey ?? "primary");
182
+ return `<span class="font-accent font-extrabold text-${color} mr-2">${renderInlineMarkup(label)}</span>`;
183
+ };
140
184
  /** Render header text elements (stepLabel + title + subtitle) without wrapping div */
141
185
  export const renderHeaderText = (data) => {
142
186
  const accent = resolveAccent(data.accentColor);
143
187
  const lines = [];
188
+ const eyebrowHtml = renderEyebrow(data.eyebrow, accent);
189
+ if (eyebrowHtml)
190
+ lines.push(`<div class="mb-2">${eyebrowHtml}</div>`);
144
191
  if (data.stepLabel) {
145
192
  lines.push(`<p class="text-sm font-bold text-${c(accent)} font-body">${renderInlineMarkup(data.stepLabel)}</p>`);
146
193
  }
@@ -150,7 +197,7 @@ export const renderHeaderText = (data) => {
150
197
  }
151
198
  return lines.join("\n");
152
199
  };
153
- /** Render the common slide header (accent bar + title + subtitle) */
200
+ /** Render the common slide header (accent bar + title + subtitle, plus optional eyebrow pill) */
154
201
  export const slideHeader = (data) => {
155
202
  const accent = resolveAccent(data.accentColor);
156
203
  return [accentBar(accent), `<div class="px-12 pt-5 shrink-0">`, renderHeaderText(data), `</div>`].join("\n");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mulmocast/deck",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "description": "MulmoCast deck DSL: JSON-described semantic slide layouts (stats, comparison, timeline, ...) rendered to Tailwind-based HTML",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",