@mulmocast/deck 0.2.0 → 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/schema.d.ts CHANGED
@@ -895,6 +895,7 @@ export declare const cardSchema: z.ZodObject<{
895
895
  footer: z.ZodOptional<z.ZodString>;
896
896
  label: z.ZodOptional<z.ZodString>;
897
897
  num: z.ZodOptional<z.ZodNumber>;
898
+ numLabel: z.ZodOptional<z.ZodString>;
898
899
  icon: z.ZodOptional<z.ZodString>;
899
900
  }, z.core.$strip>;
900
901
  export declare const slideStyleSchema: z.ZodObject<{
@@ -904,11 +905,25 @@ export declare const slideStyleSchema: z.ZodObject<{
904
905
  bgOpacity: z.ZodOptional<z.ZodNumber>;
905
906
  footer: z.ZodOptional<z.ZodString>;
906
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>;
907
921
  export declare const titleSlideSchema: z.ZodObject<{
908
922
  title: z.ZodString;
909
923
  subtitle: z.ZodOptional<z.ZodString>;
910
924
  author: z.ZodOptional<z.ZodString>;
911
925
  note: z.ZodOptional<z.ZodString>;
926
+ chips: z.ZodOptional<z.ZodArray<z.ZodString>>;
912
927
  accentColor: z.ZodOptional<z.ZodEnum<{
913
928
  primary: "primary";
914
929
  accent: "accent";
@@ -925,6 +940,18 @@ export declare const titleSlideSchema: z.ZodObject<{
925
940
  bgOpacity: z.ZodOptional<z.ZodNumber>;
926
941
  footer: z.ZodOptional<z.ZodString>;
927
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>>;
928
955
  layout: z.ZodLiteral<"title">;
929
956
  }, z.core.$strip>;
930
957
  export declare const columnsSlideSchema: z.ZodObject<{
@@ -1203,6 +1230,7 @@ export declare const columnsSlideSchema: z.ZodObject<{
1203
1230
  footer: z.ZodOptional<z.ZodString>;
1204
1231
  label: z.ZodOptional<z.ZodString>;
1205
1232
  num: z.ZodOptional<z.ZodNumber>;
1233
+ numLabel: z.ZodOptional<z.ZodString>;
1206
1234
  icon: z.ZodOptional<z.ZodString>;
1207
1235
  }, z.core.$strip>>;
1208
1236
  showArrows: z.ZodOptional<z.ZodBoolean>;
@@ -1241,6 +1269,18 @@ export declare const columnsSlideSchema: z.ZodObject<{
1241
1269
  bgOpacity: z.ZodOptional<z.ZodNumber>;
1242
1270
  footer: z.ZodOptional<z.ZodString>;
1243
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>>;
1244
1284
  layout: z.ZodLiteral<"columns">;
1245
1285
  }, z.core.$strip>;
1246
1286
  export declare const comparisonPanelSchema: z.ZodObject<{
@@ -2094,6 +2134,18 @@ export declare const comparisonSlideSchema: z.ZodObject<{
2094
2134
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2095
2135
  footer: z.ZodOptional<z.ZodString>;
2096
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>>;
2097
2149
  layout: z.ZodLiteral<"comparison">;
2098
2150
  }, z.core.$strip>;
2099
2151
  export declare const gridItemSchema: z.ZodObject<{
@@ -2663,6 +2715,18 @@ export declare const gridSlideSchema: z.ZodObject<{
2663
2715
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2664
2716
  footer: z.ZodOptional<z.ZodString>;
2665
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>>;
2666
2730
  layout: z.ZodLiteral<"grid">;
2667
2731
  }, z.core.$strip>;
2668
2732
  export declare const bigQuoteSlideSchema: z.ZodObject<{
@@ -2685,6 +2749,18 @@ export declare const bigQuoteSlideSchema: z.ZodObject<{
2685
2749
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2686
2750
  footer: z.ZodOptional<z.ZodString>;
2687
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>>;
2688
2764
  layout: z.ZodLiteral<"bigQuote">;
2689
2765
  }, z.core.$strip>;
2690
2766
  export declare const statItemSchema: z.ZodObject<{
@@ -2700,6 +2776,7 @@ export declare const statItemSchema: z.ZodObject<{
2700
2776
  highlight: "highlight";
2701
2777
  }>>;
2702
2778
  change: z.ZodOptional<z.ZodString>;
2779
+ numLabel: z.ZodOptional<z.ZodString>;
2703
2780
  }, z.core.$strip>;
2704
2781
  export declare const statsSlideSchema: z.ZodObject<{
2705
2782
  title: z.ZodString;
@@ -2718,6 +2795,7 @@ export declare const statsSlideSchema: z.ZodObject<{
2718
2795
  highlight: "highlight";
2719
2796
  }>>;
2720
2797
  change: z.ZodOptional<z.ZodString>;
2798
+ numLabel: z.ZodOptional<z.ZodString>;
2721
2799
  }, z.core.$strip>>;
2722
2800
  callout: z.ZodOptional<z.ZodObject<{
2723
2801
  text: z.ZodString;
@@ -2753,6 +2831,18 @@ export declare const statsSlideSchema: z.ZodObject<{
2753
2831
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2754
2832
  footer: z.ZodOptional<z.ZodString>;
2755
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>>;
2756
2846
  layout: z.ZodLiteral<"stats">;
2757
2847
  }, z.core.$strip>;
2758
2848
  export declare const timelineItemSchema: z.ZodObject<{
@@ -2805,6 +2895,18 @@ export declare const timelineSlideSchema: z.ZodObject<{
2805
2895
  bgOpacity: z.ZodOptional<z.ZodNumber>;
2806
2896
  footer: z.ZodOptional<z.ZodString>;
2807
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>>;
2808
2910
  layout: z.ZodLiteral<"timeline">;
2809
2911
  }, z.core.$strip>;
2810
2912
  export declare const splitPanelSchema: z.ZodObject<{
@@ -3664,6 +3766,18 @@ export declare const splitSlideSchema: z.ZodObject<{
3664
3766
  bgOpacity: z.ZodOptional<z.ZodNumber>;
3665
3767
  footer: z.ZodOptional<z.ZodString>;
3666
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>>;
3667
3781
  layout: z.ZodLiteral<"split">;
3668
3782
  }, z.core.$strip>;
3669
3783
  export declare const matrixCellSchema: z.ZodObject<{
@@ -4240,6 +4354,18 @@ export declare const matrixSlideSchema: z.ZodObject<{
4240
4354
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4241
4355
  footer: z.ZodOptional<z.ZodString>;
4242
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>>;
4243
4369
  layout: z.ZodLiteral<"matrix">;
4244
4370
  }, z.core.$strip>;
4245
4371
  export declare const tableSlideSchema: z.ZodObject<{
@@ -4297,6 +4423,18 @@ export declare const tableSlideSchema: z.ZodObject<{
4297
4423
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4298
4424
  footer: z.ZodOptional<z.ZodString>;
4299
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>>;
4300
4438
  layout: z.ZodLiteral<"table">;
4301
4439
  }, z.core.$strip>;
4302
4440
  export declare const waterfallItemSchema: z.ZodObject<{
@@ -4366,6 +4504,18 @@ export declare const waterfallSlideSchema: z.ZodObject<{
4366
4504
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4367
4505
  footer: z.ZodOptional<z.ZodString>;
4368
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>>;
4369
4519
  layout: z.ZodLiteral<"waterfall">;
4370
4520
  }, z.core.$strip>;
4371
4521
  export declare const funnelStageSchema: z.ZodObject<{
@@ -4434,6 +4584,18 @@ export declare const funnelSlideSchema: z.ZodObject<{
4434
4584
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4435
4585
  footer: z.ZodOptional<z.ZodString>;
4436
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>>;
4437
4599
  layout: z.ZodLiteral<"funnel">;
4438
4600
  }, z.core.$strip>;
4439
4601
  export declare const slideBrandingLogoSchema: z.ZodObject<{
@@ -4501,6 +4663,7 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4501
4663
  subtitle: z.ZodOptional<z.ZodString>;
4502
4664
  author: z.ZodOptional<z.ZodString>;
4503
4665
  note: z.ZodOptional<z.ZodString>;
4666
+ chips: z.ZodOptional<z.ZodArray<z.ZodString>>;
4504
4667
  accentColor: z.ZodOptional<z.ZodEnum<{
4505
4668
  primary: "primary";
4506
4669
  accent: "accent";
@@ -4517,6 +4680,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4517
4680
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4518
4681
  footer: z.ZodOptional<z.ZodString>;
4519
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>>;
4520
4695
  layout: z.ZodLiteral<"title">;
4521
4696
  }, z.core.$strip>, z.ZodObject<{
4522
4697
  title: z.ZodString;
@@ -4794,6 +4969,7 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4794
4969
  footer: z.ZodOptional<z.ZodString>;
4795
4970
  label: z.ZodOptional<z.ZodString>;
4796
4971
  num: z.ZodOptional<z.ZodNumber>;
4972
+ numLabel: z.ZodOptional<z.ZodString>;
4797
4973
  icon: z.ZodOptional<z.ZodString>;
4798
4974
  }, z.core.$strip>>;
4799
4975
  showArrows: z.ZodOptional<z.ZodBoolean>;
@@ -4832,6 +5008,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
4832
5008
  bgOpacity: z.ZodOptional<z.ZodNumber>;
4833
5009
  footer: z.ZodOptional<z.ZodString>;
4834
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>>;
4835
5023
  layout: z.ZodLiteral<"columns">;
4836
5024
  }, z.core.$strip>, z.ZodObject<{
4837
5025
  title: z.ZodString;
@@ -5413,6 +5601,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5413
5601
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5414
5602
  footer: z.ZodOptional<z.ZodString>;
5415
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>>;
5416
5616
  layout: z.ZodLiteral<"comparison">;
5417
5617
  }, z.core.$strip>, z.ZodObject<{
5418
5618
  title: z.ZodString;
@@ -5708,6 +5908,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5708
5908
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5709
5909
  footer: z.ZodOptional<z.ZodString>;
5710
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>>;
5711
5923
  layout: z.ZodLiteral<"grid">;
5712
5924
  }, z.core.$strip>, z.ZodObject<{
5713
5925
  quote: z.ZodString;
@@ -5729,6 +5941,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5729
5941
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5730
5942
  footer: z.ZodOptional<z.ZodString>;
5731
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>>;
5732
5956
  layout: z.ZodLiteral<"bigQuote">;
5733
5957
  }, z.core.$strip>, z.ZodObject<{
5734
5958
  title: z.ZodString;
@@ -5747,6 +5971,7 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5747
5971
  highlight: "highlight";
5748
5972
  }>>;
5749
5973
  change: z.ZodOptional<z.ZodString>;
5974
+ numLabel: z.ZodOptional<z.ZodString>;
5750
5975
  }, z.core.$strip>>;
5751
5976
  callout: z.ZodOptional<z.ZodObject<{
5752
5977
  text: z.ZodString;
@@ -5782,6 +6007,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5782
6007
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5783
6008
  footer: z.ZodOptional<z.ZodString>;
5784
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>>;
5785
6022
  layout: z.ZodLiteral<"stats">;
5786
6023
  }, z.core.$strip>, z.ZodObject<{
5787
6024
  title: z.ZodString;
@@ -5818,6 +6055,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5818
6055
  bgOpacity: z.ZodOptional<z.ZodNumber>;
5819
6056
  footer: z.ZodOptional<z.ZodString>;
5820
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>>;
5821
6070
  layout: z.ZodLiteral<"timeline">;
5822
6071
  }, z.core.$strip>, z.ZodObject<{
5823
6072
  left: z.ZodOptional<z.ZodObject<{
@@ -6396,6 +6645,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6396
6645
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6397
6646
  footer: z.ZodOptional<z.ZodString>;
6398
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>>;
6399
6660
  layout: z.ZodLiteral<"split">;
6400
6661
  }, z.core.$strip>, z.ZodObject<{
6401
6662
  title: z.ZodString;
@@ -6700,6 +6961,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6700
6961
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6701
6962
  footer: z.ZodOptional<z.ZodString>;
6702
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>>;
6703
6976
  layout: z.ZodLiteral<"matrix">;
6704
6977
  }, z.core.$strip>, z.ZodObject<{
6705
6978
  title: z.ZodString;
@@ -6756,6 +7029,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6756
7029
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6757
7030
  footer: z.ZodOptional<z.ZodString>;
6758
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>>;
6759
7044
  layout: z.ZodLiteral<"table">;
6760
7045
  }, z.core.$strip>, z.ZodObject<{
6761
7046
  title: z.ZodString;
@@ -6809,6 +7094,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6809
7094
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6810
7095
  footer: z.ZodOptional<z.ZodString>;
6811
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>>;
6812
7109
  layout: z.ZodLiteral<"funnel">;
6813
7110
  }, z.core.$strip>, z.ZodObject<{
6814
7111
  title: z.ZodString;
@@ -6863,6 +7160,18 @@ export declare const slideLayoutSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
6863
7160
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6864
7161
  footer: z.ZodOptional<z.ZodString>;
6865
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>>;
6866
7175
  layout: z.ZodLiteral<"waterfall">;
6867
7176
  }, z.core.$strip>], "layout">;
6868
7177
  /** Media schema registered in mulmoImageAssetSchema */
@@ -6898,6 +7207,7 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
6898
7207
  subtitle: z.ZodOptional<z.ZodString>;
6899
7208
  author: z.ZodOptional<z.ZodString>;
6900
7209
  note: z.ZodOptional<z.ZodString>;
7210
+ chips: z.ZodOptional<z.ZodArray<z.ZodString>>;
6901
7211
  accentColor: z.ZodOptional<z.ZodEnum<{
6902
7212
  primary: "primary";
6903
7213
  accent: "accent";
@@ -6914,6 +7224,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
6914
7224
  bgOpacity: z.ZodOptional<z.ZodNumber>;
6915
7225
  footer: z.ZodOptional<z.ZodString>;
6916
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>>;
6917
7239
  layout: z.ZodLiteral<"title">;
6918
7240
  }, z.core.$strip>, z.ZodObject<{
6919
7241
  title: z.ZodString;
@@ -7191,6 +7513,7 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
7191
7513
  footer: z.ZodOptional<z.ZodString>;
7192
7514
  label: z.ZodOptional<z.ZodString>;
7193
7515
  num: z.ZodOptional<z.ZodNumber>;
7516
+ numLabel: z.ZodOptional<z.ZodString>;
7194
7517
  icon: z.ZodOptional<z.ZodString>;
7195
7518
  }, z.core.$strip>>;
7196
7519
  showArrows: z.ZodOptional<z.ZodBoolean>;
@@ -7229,6 +7552,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
7229
7552
  bgOpacity: z.ZodOptional<z.ZodNumber>;
7230
7553
  footer: z.ZodOptional<z.ZodString>;
7231
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>>;
7232
7567
  layout: z.ZodLiteral<"columns">;
7233
7568
  }, z.core.$strip>, z.ZodObject<{
7234
7569
  title: z.ZodString;
@@ -7810,6 +8145,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
7810
8145
  bgOpacity: z.ZodOptional<z.ZodNumber>;
7811
8146
  footer: z.ZodOptional<z.ZodString>;
7812
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>>;
7813
8160
  layout: z.ZodLiteral<"comparison">;
7814
8161
  }, z.core.$strip>, z.ZodObject<{
7815
8162
  title: z.ZodString;
@@ -8105,6 +8452,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8105
8452
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8106
8453
  footer: z.ZodOptional<z.ZodString>;
8107
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>>;
8108
8467
  layout: z.ZodLiteral<"grid">;
8109
8468
  }, z.core.$strip>, z.ZodObject<{
8110
8469
  quote: z.ZodString;
@@ -8126,6 +8485,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8126
8485
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8127
8486
  footer: z.ZodOptional<z.ZodString>;
8128
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>>;
8129
8500
  layout: z.ZodLiteral<"bigQuote">;
8130
8501
  }, z.core.$strip>, z.ZodObject<{
8131
8502
  title: z.ZodString;
@@ -8144,6 +8515,7 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8144
8515
  highlight: "highlight";
8145
8516
  }>>;
8146
8517
  change: z.ZodOptional<z.ZodString>;
8518
+ numLabel: z.ZodOptional<z.ZodString>;
8147
8519
  }, z.core.$strip>>;
8148
8520
  callout: z.ZodOptional<z.ZodObject<{
8149
8521
  text: z.ZodString;
@@ -8179,6 +8551,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8179
8551
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8180
8552
  footer: z.ZodOptional<z.ZodString>;
8181
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>>;
8182
8566
  layout: z.ZodLiteral<"stats">;
8183
8567
  }, z.core.$strip>, z.ZodObject<{
8184
8568
  title: z.ZodString;
@@ -8215,6 +8599,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8215
8599
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8216
8600
  footer: z.ZodOptional<z.ZodString>;
8217
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>>;
8218
8614
  layout: z.ZodLiteral<"timeline">;
8219
8615
  }, z.core.$strip>, z.ZodObject<{
8220
8616
  left: z.ZodOptional<z.ZodObject<{
@@ -8793,6 +9189,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
8793
9189
  bgOpacity: z.ZodOptional<z.ZodNumber>;
8794
9190
  footer: z.ZodOptional<z.ZodString>;
8795
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>>;
8796
9204
  layout: z.ZodLiteral<"split">;
8797
9205
  }, z.core.$strip>, z.ZodObject<{
8798
9206
  title: z.ZodString;
@@ -9097,6 +9505,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9097
9505
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9098
9506
  footer: z.ZodOptional<z.ZodString>;
9099
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>>;
9100
9520
  layout: z.ZodLiteral<"matrix">;
9101
9521
  }, z.core.$strip>, z.ZodObject<{
9102
9522
  title: z.ZodString;
@@ -9153,6 +9573,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9153
9573
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9154
9574
  footer: z.ZodOptional<z.ZodString>;
9155
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>>;
9156
9588
  layout: z.ZodLiteral<"table">;
9157
9589
  }, z.core.$strip>, z.ZodObject<{
9158
9590
  title: z.ZodString;
@@ -9206,6 +9638,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9206
9638
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9207
9639
  footer: z.ZodOptional<z.ZodString>;
9208
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>>;
9209
9653
  layout: z.ZodLiteral<"funnel">;
9210
9654
  }, z.core.$strip>, z.ZodObject<{
9211
9655
  title: z.ZodString;
@@ -9260,6 +9704,18 @@ export declare const mulmoSlideMediaSchema: z.ZodObject<{
9260
9704
  bgOpacity: z.ZodOptional<z.ZodNumber>;
9261
9705
  footer: z.ZodOptional<z.ZodString>;
9262
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>>;
9263
9719
  layout: z.ZodLiteral<"waterfall">;
9264
9720
  }, z.core.$strip>], "layout">;
9265
9721
  reference: z.ZodOptional<z.ZodString>;
package/lib/schema.js CHANGED
@@ -170,6 +170,8 @@ export const cardSchema = z.object({
170
170
  footer: z.string().optional(),
171
171
  label: z.string().optional(),
172
172
  num: z.number().optional(),
173
+ /** Optional accent-colored typographic prefix before the card title (e.g. "01", "Ⅱ", "★"). */
174
+ numLabel: z.string().optional(),
173
175
  icon: z.string().optional(),
174
176
  });
175
177
  // ═══════════════════════════════════════════════════════════
@@ -183,10 +185,18 @@ export const slideStyleSchema = z.object({
183
185
  bgOpacity: z.number().optional(),
184
186
  footer: z.string().optional(),
185
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
+ });
186
194
  /** Common slide properties shared across all layouts */
187
195
  const slideBaseFields = {
188
196
  accentColor: accentColorKeySchema.optional(),
189
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(),
190
200
  };
191
201
  // ═══════════════════════════════════════════════════════════
192
202
  // Layouts
@@ -199,6 +209,8 @@ export const titleSlideSchema = z.object({
199
209
  subtitle: z.string().optional(),
200
210
  author: z.string().optional(),
201
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(),
202
214
  });
203
215
  // ─── columns ───
204
216
  export const columnsSlideSchema = z.object({
@@ -261,6 +273,8 @@ export const statItemSchema = z.object({
261
273
  label: z.string(),
262
274
  color: accentColorKeySchema.optional(),
263
275
  change: z.string().optional(),
276
+ /** Optional accent-colored typographic prefix shown above the value (e.g. "01"). */
277
+ numLabel: z.string().optional(),
264
278
  });
265
279
  export const statsSlideSchema = z.object({
266
280
  layout: z.literal("stats"),
package/lib/utils.d.ts CHANGED
@@ -47,19 +47,39 @@ export declare const renderCalloutBar: (obj: {
47
47
  align?: string;
48
48
  leftBar?: boolean;
49
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;
50
62
  /** Render header text elements (stepLabel + title + subtitle) without wrapping div */
51
63
  export declare const renderHeaderText: (data: {
52
64
  accentColor?: string;
53
65
  stepLabel?: string;
54
66
  title: string;
55
67
  subtitle?: string;
68
+ eyebrow?: {
69
+ label: string;
70
+ color?: string;
71
+ };
56
72
  }) => string;
57
- /** Render the common slide header (accent bar + title + subtitle) */
73
+ /** Render the common slide header (accent bar + title + subtitle, plus optional eyebrow pill) */
58
74
  export declare const slideHeader: (data: {
59
75
  accentColor?: string;
60
76
  stepLabel?: string;
61
77
  title: string;
62
78
  subtitle?: string;
79
+ eyebrow?: {
80
+ label: string;
81
+ color?: string;
82
+ };
63
83
  }) => string;
64
84
  /** Render accent bar + vertically-centered wrapper with header text (used by stats, timeline) */
65
85
  export declare const centeredSlideHeader: (data: {
@@ -67,6 +87,10 @@ export declare const centeredSlideHeader: (data: {
67
87
  stepLabel?: string;
68
88
  title: string;
69
89
  subtitle?: string;
90
+ eyebrow?: {
91
+ label: string;
92
+ color?: string;
93
+ };
70
94
  }) => string;
71
95
  /** Generate a unique ID with the given prefix (e.g. "chart-0", "mermaid-1") */
72
96
  export declare const generateSlideId: (prefix: string) => string;
package/lib/utils.js CHANGED
@@ -155,10 +155,39 @@ export const renderCalloutBar = (obj) => {
155
155
  <div class="px-4 py-3 text-sm font-body flex-1">${inner}</div>
156
156
  </div>`;
157
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
+ };
158
184
  /** Render header text elements (stepLabel + title + subtitle) without wrapping div */
159
185
  export const renderHeaderText = (data) => {
160
186
  const accent = resolveAccent(data.accentColor);
161
187
  const lines = [];
188
+ const eyebrowHtml = renderEyebrow(data.eyebrow, accent);
189
+ if (eyebrowHtml)
190
+ lines.push(`<div class="mb-2">${eyebrowHtml}</div>`);
162
191
  if (data.stepLabel) {
163
192
  lines.push(`<p class="text-sm font-bold text-${c(accent)} font-body">${renderInlineMarkup(data.stepLabel)}</p>`);
164
193
  }
@@ -168,7 +197,7 @@ export const renderHeaderText = (data) => {
168
197
  }
169
198
  return lines.join("\n");
170
199
  };
171
- /** Render the common slide header (accent bar + title + subtitle) */
200
+ /** Render the common slide header (accent bar + title + subtitle, plus optional eyebrow pill) */
172
201
  export const slideHeader = (data) => {
173
202
  const accent = resolveAccent(data.accentColor);
174
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.2.0",
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",