@clipkit/patterns 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +84 -0
  3. package/dist/anchor-default.d.ts +4 -0
  4. package/dist/anchor-default.d.ts.map +1 -0
  5. package/dist/anchor-default.js +34 -0
  6. package/dist/anchor-default.js.map +1 -0
  7. package/dist/bar-chart-row.d.ts +43 -0
  8. package/dist/bar-chart-row.d.ts.map +1 -0
  9. package/dist/bar-chart-row.js +143 -0
  10. package/dist/bar-chart-row.js.map +1 -0
  11. package/dist/beat-sync.d.ts +101 -0
  12. package/dist/beat-sync.d.ts.map +1 -0
  13. package/dist/beat-sync.js +145 -0
  14. package/dist/beat-sync.js.map +1 -0
  15. package/dist/camera-orbit.d.ts +22 -0
  16. package/dist/camera-orbit.d.ts.map +1 -0
  17. package/dist/camera-orbit.js +32 -0
  18. package/dist/camera-orbit.js.map +1 -0
  19. package/dist/cta-outro.d.ts +18 -0
  20. package/dist/cta-outro.d.ts.map +1 -0
  21. package/dist/cta-outro.js +44 -0
  22. package/dist/cta-outro.js.map +1 -0
  23. package/dist/data-scenes.d.ts +66 -0
  24. package/dist/data-scenes.d.ts.map +1 -0
  25. package/dist/data-scenes.js +188 -0
  26. package/dist/data-scenes.js.map +1 -0
  27. package/dist/flow-line.d.ts +27 -0
  28. package/dist/flow-line.d.ts.map +1 -0
  29. package/dist/flow-line.js +53 -0
  30. package/dist/flow-line.js.map +1 -0
  31. package/dist/glass-panel.d.ts +24 -0
  32. package/dist/glass-panel.d.ts.map +1 -0
  33. package/dist/glass-panel.js +32 -0
  34. package/dist/glass-panel.js.map +1 -0
  35. package/dist/header-bar.d.ts +36 -0
  36. package/dist/header-bar.d.ts.map +1 -0
  37. package/dist/header-bar.js +108 -0
  38. package/dist/header-bar.js.map +1 -0
  39. package/dist/hero-reveal.d.ts +17 -0
  40. package/dist/hero-reveal.d.ts.map +1 -0
  41. package/dist/hero-reveal.js +47 -0
  42. package/dist/hero-reveal.js.map +1 -0
  43. package/dist/index.d.ts +21 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +43 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/intro-card.d.ts +23 -0
  48. package/dist/intro-card.d.ts.map +1 -0
  49. package/dist/intro-card.js +123 -0
  50. package/dist/intro-card.js.map +1 -0
  51. package/dist/kinetic-headline.d.ts +18 -0
  52. package/dist/kinetic-headline.d.ts.map +1 -0
  53. package/dist/kinetic-headline.js +39 -0
  54. package/dist/kinetic-headline.js.map +1 -0
  55. package/dist/layers.d.ts +13 -0
  56. package/dist/layers.d.ts.map +1 -0
  57. package/dist/layers.js +19 -0
  58. package/dist/layers.js.map +1 -0
  59. package/dist/liquid-morph.d.ts +62 -0
  60. package/dist/liquid-morph.d.ts.map +1 -0
  61. package/dist/liquid-morph.js +113 -0
  62. package/dist/liquid-morph.js.map +1 -0
  63. package/dist/lit-surface.d.ts +38 -0
  64. package/dist/lit-surface.d.ts.map +1 -0
  65. package/dist/lit-surface.js +63 -0
  66. package/dist/lit-surface.js.map +1 -0
  67. package/dist/lower-third.d.ts +26 -0
  68. package/dist/lower-third.d.ts.map +1 -0
  69. package/dist/lower-third.js +101 -0
  70. package/dist/lower-third.js.map +1 -0
  71. package/dist/morph-shape.d.ts +42 -0
  72. package/dist/morph-shape.d.ts.map +1 -0
  73. package/dist/morph-shape.js +57 -0
  74. package/dist/morph-shape.js.map +1 -0
  75. package/dist/pie-card.d.ts +35 -0
  76. package/dist/pie-card.d.ts.map +1 -0
  77. package/dist/pie-card.js +168 -0
  78. package/dist/pie-card.js.map +1 -0
  79. package/dist/promo.d.ts +38 -0
  80. package/dist/promo.d.ts.map +1 -0
  81. package/dist/promo.js +61 -0
  82. package/dist/promo.js.map +1 -0
  83. package/dist/ranked-list.d.ts +38 -0
  84. package/dist/ranked-list.d.ts.map +1 -0
  85. package/dist/ranked-list.js +130 -0
  86. package/dist/ranked-list.js.map +1 -0
  87. package/dist/stat-block.d.ts +26 -0
  88. package/dist/stat-block.d.ts.map +1 -0
  89. package/dist/stat-block.js +92 -0
  90. package/dist/stat-block.js.map +1 -0
  91. package/dist/theme.d.ts +36 -0
  92. package/dist/theme.d.ts.map +1 -0
  93. package/dist/theme.js +75 -0
  94. package/dist/theme.js.map +1 -0
  95. package/dist/tilted-showcase.d.ts +29 -0
  96. package/dist/tilted-showcase.d.ts.map +1 -0
  97. package/dist/tilted-showcase.js +106 -0
  98. package/dist/tilted-showcase.js.map +1 -0
  99. package/dist/trend-pill.d.ts +33 -0
  100. package/dist/trend-pill.d.ts.map +1 -0
  101. package/dist/trend-pill.js +83 -0
  102. package/dist/trend-pill.js.map +1 -0
  103. package/dist/zoom-rig.d.ts +27 -0
  104. package/dist/zoom-rig.d.ts.map +1 -0
  105. package/dist/zoom-rig.js +46 -0
  106. package/dist/zoom-rig.js.map +1 -0
  107. package/package.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morph-shape.js","sourceRoot":"","sources":["../src/morph-shape.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,0EAA0E;AAC1E,8EAA8E;AAC9E,EAAE;AACF,kFAAkF;AAClF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,kFAAkF;AAClF,WAAW;AAiCX,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACpG,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG;QACX,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;IAEF,OAAO;QACL,EAAE;QACF,IAAI,EAAE,KAAK;QACX,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,QAAQ,EAAE,OAAO;QACjB,KAAK;QACL,MAAM;QACN,CAAC;QACD,CAAC;QACD,KAAK,EAAE,CAAC,IAAI,CAAC;KACH,CAAC;AACf,CAAC;AAED,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACnD,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAExK,MAAM,UAAU,UAAU,CAAC,CAAC,GAAG,GAAG;IAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;IACrB,OAAO;QACL,yCAAyC;QACzC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,iDAAiD;QACjD,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC7G,4DAA4D;QAC5D,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3E,kCAAkC;QAClC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,8BAA8B;QAC9B,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;KAC5I,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { Element } from '@clipkit/protocol';
2
+ import { type ColorName, type ThemeName } from './theme.js';
3
+ export interface PieCardProps {
4
+ id: string;
5
+ /** Raw value backing the percentage + count display. */
6
+ value: number;
7
+ /** Total used to compute the displayed percentage. */
8
+ total: number;
9
+ /** Previous-period value. If set, a trend pill is rendered. */
10
+ previous?: number;
11
+ /** Bottom label (e.g. "Chrome"). */
12
+ label: string;
13
+ /**
14
+ * Optional logo image URL. If supplied, an image element is layered
15
+ * over the white logo background. The image is sized 100 × 100.
16
+ */
17
+ logoUrl?: string;
18
+ /**
19
+ * Color slot — drives the trend pill colors. The pie itself is drawn
20
+ * in white over a colored body background.
21
+ */
22
+ color: ColorName;
23
+ theme?: ThemeName;
24
+ /** Center x of the card. */
25
+ cx: number;
26
+ time: number;
27
+ duration: number;
28
+ /**
29
+ * Index used to stagger the entrance across multiple cards in a row.
30
+ */
31
+ staggerIndex?: number;
32
+ layerBase: number;
33
+ }
34
+ export declare function pieCard(props: PieCardProps): Element[];
35
+ //# sourceMappingURL=pie-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-card.d.ts","sourceRoot":"","sources":["../src/pie-card.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAwB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,EAAE,CAmKtD"}
@@ -0,0 +1,168 @@
1
+ // PieCard — a vertical card with an animated pie chart on top, percentage
2
+ // + supporting count, optional trend pill, optional logo placeholder,
3
+ // and a label at the bottom. The unit used in the Mux "Top browsers"
4
+ // scene.
5
+ //
6
+ // The pie chart uses the path shape stroke-evolution trick: a circle path
7
+ // with stroke_progress animated 0 → percentage/100 and a stroke width
8
+ // equal to the circle's radius (so the "stroke" fills the entire disc as
9
+ // a growing pie slice).
10
+ import { getFonts, getPalette } from './theme.js';
11
+ import { trendPct, trendPill } from './trend-pill.js';
12
+ const FRAME = 1 / 30;
13
+ // One decimal, trailing ".0" stripped (e.g. 64.2 → "64.2", 50 → "50").
14
+ function formatPct(p) {
15
+ return p.toFixed(1).replace(/\.0$/, '');
16
+ }
17
+ export function pieCard(props) {
18
+ const { id, value, total, previous, label, logoUrl, color, cx, time, duration, layerBase, } = props;
19
+ const theme = props.theme ?? 'mux';
20
+ const palette = getPalette(theme, color);
21
+ const fonts = getFonts(theme);
22
+ const i = props.staggerIndex ?? 0;
23
+ const stagger = (10 + 5 * i) * FRAME;
24
+ const pct = total > 0 ? (value / total) * 100 : 0;
25
+ const out = [];
26
+ // Pie chart — circle path with growing stroke. ViewBox is 20 × 20 so
27
+ // stroke-width 10 fills the entire disc when stroke_progress = 1.
28
+ out.push({
29
+ id: `${id}-pie`,
30
+ type: 'shape',
31
+ layer: layerBase,
32
+ time: time + stagger,
33
+ duration: duration - stagger,
34
+ x: cx,
35
+ y: 460,
36
+ x_anchor: '50%',
37
+ y_anchor: '50%',
38
+ width: 320,
39
+ height: 320,
40
+ view_box: [0, 0, 20, 20],
41
+ paths: [
42
+ {
43
+ // Circle starting at top (12 o'clock), sweeping clockwise.
44
+ d: 'M 10 5 A 5 5 0 1 0 10 15 A 5 5 0 1 0 10 5 Z',
45
+ stroke: palette.measure,
46
+ stroke_width: 10,
47
+ stroke_progress: [
48
+ { time: 0, value: 0 },
49
+ { time: 0.8, value: pct / 100, easing: 'ease-out-cubic' },
50
+ ],
51
+ },
52
+ ],
53
+ });
54
+ // Percentage centered on the pie.
55
+ out.push({
56
+ id: `${id}-pct`,
57
+ type: 'text',
58
+ layer: layerBase + 1,
59
+ time: time + stagger,
60
+ duration: duration - stagger,
61
+ text: `${formatPct(pct)}%`,
62
+ x: cx,
63
+ y: 440,
64
+ x_anchor: '50%',
65
+ y_anchor: '50%',
66
+ font_family: fonts.sans,
67
+ font_size: 64,
68
+ font_weight: '400',
69
+ fill_color: palette.text,
70
+ animations: [{ type: 'fade-in', duration: 0.4 }],
71
+ });
72
+ // Supporting view count under the percentage.
73
+ out.push({
74
+ id: `${id}-count`,
75
+ type: 'text',
76
+ layer: layerBase + 2,
77
+ time: time + stagger + 5 * FRAME,
78
+ duration: duration - (stagger + 5 * FRAME),
79
+ text: `${new Intl.NumberFormat('en-US').format(value)} views`,
80
+ x: cx,
81
+ y: 510,
82
+ x_anchor: '50%',
83
+ y_anchor: '50%',
84
+ font_family: fonts.sans,
85
+ font_size: 32,
86
+ font_weight: '400',
87
+ fill_color: palette.text,
88
+ animations: [{ type: 'fade-in', duration: 0.4 }],
89
+ });
90
+ // Trend pill.
91
+ if (typeof previous === 'number') {
92
+ out.push(...trendPill({
93
+ id: `${id}-pill`,
94
+ layerBase: layerBase + 4,
95
+ time: time + stagger + 10 * FRAME,
96
+ duration: duration - (stagger + 10 * FRAME),
97
+ cx,
98
+ cy: 700,
99
+ color,
100
+ theme,
101
+ delta: trendPct(value, previous),
102
+ width: 380,
103
+ height: 50,
104
+ }));
105
+ }
106
+ // White rounded-square background for the logo.
107
+ out.push({
108
+ id: `${id}-logo-bg`,
109
+ type: 'shape',
110
+ layer: layerBase + 8,
111
+ time: time + stagger + 15 * FRAME,
112
+ duration: duration - (stagger + 15 * FRAME),
113
+ shape: 'rectangle',
114
+ x: cx,
115
+ y: 850,
116
+ x_anchor: '50%',
117
+ y_anchor: '50%',
118
+ width: 132,
119
+ height: 132,
120
+ fill_color: '#ffffff',
121
+ border_radius: 16,
122
+ animations: [
123
+ { type: 'fade-in', duration: 0.4 },
124
+ { type: 'scale-in', duration: 0.5, easing: 'ease-out-back' },
125
+ ],
126
+ });
127
+ // Logo image (if URL given).
128
+ if (logoUrl) {
129
+ out.push({
130
+ id: `${id}-logo`,
131
+ type: 'image',
132
+ layer: layerBase + 9,
133
+ time: time + stagger + 17 * FRAME,
134
+ duration: duration - (stagger + 17 * FRAME),
135
+ source: logoUrl,
136
+ x: cx,
137
+ y: 850,
138
+ x_anchor: '50%',
139
+ y_anchor: '50%',
140
+ width: 100,
141
+ height: 100,
142
+ animations: [
143
+ { type: 'fade-in', duration: 0.4 },
144
+ { type: 'scale-in', duration: 0.5, easing: 'ease-out-back' },
145
+ ],
146
+ });
147
+ }
148
+ // Card label at bottom.
149
+ out.push({
150
+ id: `${id}-label`,
151
+ type: 'text',
152
+ layer: layerBase + 10,
153
+ time: time + stagger + 18 * FRAME,
154
+ duration: duration - (stagger + 18 * FRAME),
155
+ text: label,
156
+ x: cx,
157
+ y: 980,
158
+ x_anchor: '50%',
159
+ y_anchor: '50%',
160
+ font_family: fonts.sans,
161
+ font_size: 36,
162
+ font_weight: '400',
163
+ fill_color: palette.text,
164
+ animations: [{ type: 'fade-in', duration: 0.4 }],
165
+ });
166
+ return out;
167
+ }
168
+ //# sourceMappingURL=pie-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pie-card.js","sourceRoot":"","sources":["../src/pie-card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Camera, Element, Source } from '@clipkit/protocol';
2
+ import { type ThemeName } from './theme.js';
3
+ export interface SceneCtx {
4
+ id: string;
5
+ theme: ThemeName;
6
+ canvasWidth: number;
7
+ canvasHeight: number;
8
+ /** Start time (s) the composer assigned this scene. */
9
+ time: number;
10
+ /** Visible duration (s) of this scene, including crossfade tails. */
11
+ duration: number;
12
+ /** Layer the composer assigned (scenes stack so crossfades overlap). */
13
+ layer: number;
14
+ }
15
+ export interface Scene {
16
+ /** On-screen length in seconds (before crossfade overlap). */
17
+ duration: number;
18
+ /** Build the scene's root element from composer-assigned timing/dims. */
19
+ build: (ctx: SceneCtx) => Element;
20
+ }
21
+ export interface PromoOptions {
22
+ scenes: Scene[];
23
+ theme?: ThemeName;
24
+ width?: number;
25
+ height?: number;
26
+ frameRate?: number;
27
+ /** Crossfade overlap between consecutive scenes, seconds. Default 0.4. */
28
+ crossfade?: number;
29
+ /** Shared scene camera (e.g. from cameraOrbit). */
30
+ camera?: Camera;
31
+ /** Supersampled motion-blur sample count (≥2 enables it). */
32
+ motionBlur?: number;
33
+ /** Background color override (defaults to the theme's canvas color). */
34
+ background?: string;
35
+ }
36
+ /** Compose scenes + theme into one renderable Source. */
37
+ export declare function promo(opts: PromoOptions): Source;
38
+ //# sourceMappingURL=promo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promo.d.ts","sourceRoot":"","sources":["../src/promo.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,KAAK,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yDAAyD;AACzD,wBAAgB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA+ChD"}
package/dist/promo.js ADDED
@@ -0,0 +1,61 @@
1
+ // promo() — the Source-level composer.
2
+ //
3
+ // Component patterns return scene FRAGMENTS (one group each). `promo`
4
+ // assembles an ordered list of scenes into a complete, renderable Source:
5
+ // it sequences them on the timeline with a crossfade overlap, registers
6
+ // the theme's webfonts, and wires the shared camera + motion blur. This is
7
+ // where the *sequence-level* taste lives (timing, crossfades, one camera,
8
+ // motion blur on) — the part an agent gets wrong when hand-assembling.
9
+ //
10
+ // Each scene is a builder that receives the timing/layer/dims the composer
11
+ // assigns, so callers (or an agent) only choose patterns + content + a
12
+ // duration — never the bookkeeping.
13
+ import { THEMES } from './theme.js';
14
+ /** Compose scenes + theme into one renderable Source. */
15
+ export function promo(opts) {
16
+ const theme = opts.theme ?? 'cinematic';
17
+ const W = opts.width ?? 1280;
18
+ const H = opts.height ?? 720;
19
+ const crossfade = opts.crossfade ?? 0.4;
20
+ const themeDef = THEMES[theme];
21
+ // Lay scenes end-to-end, overlapping each by `crossfade` so the patterns'
22
+ // built-in fade-out/fade-in produce a dissolve. Each on its own layer so
23
+ // the overlap actually composites.
24
+ const elements = [];
25
+ let cursor = 0;
26
+ opts.scenes.forEach((scene, i) => {
27
+ const time = i === 0 ? 0 : cursor - crossfade;
28
+ elements.push(scene.build({
29
+ id: `s${i}`,
30
+ theme,
31
+ canvasWidth: W,
32
+ canvasHeight: H,
33
+ time,
34
+ duration: scene.duration,
35
+ // Later scenes sit in FRONT (lower layer) so a crossfade dissolves
36
+ // INTO the incoming scene. Unique 1..N across the scene list.
37
+ layer: opts.scenes.length - i,
38
+ }));
39
+ cursor = time + scene.duration;
40
+ });
41
+ const total = cursor;
42
+ const source = {
43
+ clipkit_version: '1.0',
44
+ output_format: 'mp4',
45
+ width: W,
46
+ height: H,
47
+ duration: total,
48
+ frame_rate: opts.frameRate ?? 30,
49
+ background_color: opts.background ?? themeDef.palettes.gray.bg,
50
+ elements,
51
+ };
52
+ if (themeDef.fontFaces && themeDef.fontFaces.length)
53
+ source.fonts = themeDef.fontFaces;
54
+ if (opts.camera)
55
+ source.camera = opts.camera;
56
+ if (opts.motionBlur && opts.motionBlur >= 2) {
57
+ source.motion_blur = { samples: opts.motionBlur, shutter: 0.6 };
58
+ }
59
+ return source;
60
+ }
61
+ //# sourceMappingURL=promo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promo.js","sourceRoot":"","sources":["../src/promo.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,sEAAsE;AACtE,0EAA0E;AAC1E,wEAAwE;AACxE,2EAA2E;AAC3E,0EAA0E;AAC1E,uEAAuE;AACvE,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,oCAAoC;AAGpC,OAAO,EAAE,MAAM,EAAkB,MAAM,YAAY,CAAC;AAsCpD,yDAAyD;AACzD,MAAM,UAAU,KAAK,CAAC,IAAkB;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/B,0EAA0E;IAC1E,yEAAyE;IACzE,mCAAmC;IACnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QAC9C,QAAQ,CAAC,IAAI,CACX,KAAK,CAAC,KAAK,CAAC;YACV,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK;YACL,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,IAAI;YACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,mEAAmE;YACnE,8DAA8D;YAC9D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;SAC9B,CAAC,CACH,CAAC;QACF,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC;IAErB,MAAM,MAAM,GAAW;QACrB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,KAAK;QACpB,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QAChC,gBAAgB,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAC9D,QAAQ;KACT,CAAC;IACF,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC;IACvF,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7C,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,WAAW,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Element } from '@clipkit/protocol';
2
+ import { type ColorName, type ThemeName } from './theme.js';
3
+ export interface RankedListItem {
4
+ /** Label shown after the rank number. */
5
+ label: string;
6
+ /** Numeric value driving the measure-bar width + the displayed value. */
7
+ value: number;
8
+ }
9
+ export interface RankedListProps {
10
+ id: string;
11
+ items: RankedListItem[];
12
+ /**
13
+ * Maximum used to normalize bar widths. Defaults to items[0].value.
14
+ * Pass explicitly if the list is sorted by some other metric.
15
+ */
16
+ max?: number;
17
+ color: ColorName;
18
+ theme?: ThemeName;
19
+ /** Top-left x of the list (the leftmost column starts here). */
20
+ x: number;
21
+ /** Top y of the list. */
22
+ y: number;
23
+ /** Total width available across all columns. */
24
+ width: number;
25
+ /** Number of columns. Default 1; 2 splits items left half / right half. */
26
+ columns?: 1 | 2;
27
+ /** Gap between columns when columns=2. Default 40. */
28
+ columnGap?: number;
29
+ /** Row height. Default 130. */
30
+ rowHeight?: number;
31
+ /** Font size for rank, name, value. Default 46. */
32
+ fontSize?: number;
33
+ time: number;
34
+ duration: number;
35
+ layerBase: number;
36
+ }
37
+ export declare function rankedList(props: RankedListProps): Element[];
38
+ //# sourceMappingURL=ranked-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranked-list.d.ts","sourceRoot":"","sources":["../src/ranked-list.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAwB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gEAAgE;IAChE,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,EAAE,CAiI5D"}
@@ -0,0 +1,130 @@
1
+ // RankedList — a list of N entries with rank numbers, names, animated
2
+ // measure bars, and values. Renders as 1 or 2 columns. Composes on top
3
+ // of the same primitives BarChartRow uses, but the rendering is
4
+ // simpler (no icon, no trend pill, no count-up) since this is meant
5
+ // for "top-10" style scenes.
6
+ //
7
+ // Used in the Mux "Top 10 videos" and "Top 5 states" scenes.
8
+ import { getFonts, getPalette } from './theme.js';
9
+ const FRAME = 1 / 30;
10
+ export function rankedList(props) {
11
+ const { id, items, color, x, y, width, time, duration, layerBase, } = props;
12
+ const theme = props.theme ?? 'mux';
13
+ const palette = getPalette(theme, color);
14
+ const fonts = getFonts(theme);
15
+ const cols = props.columns ?? 1;
16
+ const colGap = props.columnGap ?? 40;
17
+ const rowH = props.rowHeight ?? 130;
18
+ const fontSize = props.fontSize ?? 46;
19
+ const max = props.max ?? (items.length > 0 ? items[0].value : 1);
20
+ const colW = cols === 2 ? (width - colGap) / 2 : width;
21
+ const out = [];
22
+ const itemsPerCol = cols === 2 ? Math.ceil(items.length / 2) : items.length;
23
+ for (let i = 0; i < items.length; i++) {
24
+ const item = items[i];
25
+ const colIdx = i < itemsPerCol ? 0 : 1;
26
+ const rowIdx = i % itemsPerCol;
27
+ const rowTop = y + rowIdx * rowH;
28
+ const rowX = x + colIdx * (colW + colGap);
29
+ const rowRight = rowX + colW;
30
+ const rowLayer = layerBase + i * 10;
31
+ const stagger = (10 + 6 * i) * FRAME;
32
+ // Animated measure bar.
33
+ const measurePct = max > 0 ? (item.value / max) * 100 : 0;
34
+ const measureFullW = (colW * measurePct) / 100;
35
+ out.push({
36
+ id: `${id}-measure-${i}`,
37
+ type: 'shape',
38
+ layer: rowLayer,
39
+ time: time + stagger,
40
+ duration: duration - stagger,
41
+ shape: 'rectangle',
42
+ x: rowX,
43
+ y: rowTop,
44
+ x_anchor: 0,
45
+ y_anchor: 0,
46
+ width: measureFullW,
47
+ height: rowH,
48
+ fill_color: palette.measure,
49
+ keyframe_animations: [
50
+ {
51
+ property: 'width',
52
+ keyframes: [
53
+ { time: 0, value: 0 },
54
+ { time: 1.6, value: measureFullW, easing: 'ease-out-quart' },
55
+ ],
56
+ },
57
+ ],
58
+ });
59
+ // Top border.
60
+ out.push({
61
+ id: `${id}-border-${i}`,
62
+ type: 'shape',
63
+ layer: rowLayer + 1,
64
+ time,
65
+ duration,
66
+ shape: 'rectangle',
67
+ x: rowX + colW / 2,
68
+ y: rowTop,
69
+ x_anchor: '50%',
70
+ y_anchor: '50%',
71
+ width: colW,
72
+ height: 3,
73
+ fill_color: palette.accent,
74
+ });
75
+ // Rank ("01.", "02.", ...).
76
+ const rankStr = items.length >= 10 ? `${i + 1}.` : `0${i + 1}.`;
77
+ out.push({
78
+ id: `${id}-rank-${i}`,
79
+ type: 'text',
80
+ layer: rowLayer + 2,
81
+ time: time + stagger,
82
+ duration: duration - stagger,
83
+ text: rankStr,
84
+ x: rowX + 30,
85
+ y: rowTop + rowH / 2,
86
+ x_anchor: 0,
87
+ font_family: fonts.sans,
88
+ font_size: fontSize,
89
+ font_weight: '400',
90
+ fill_color: palette.accentDark,
91
+ animations: [{ type: 'fade-in', duration: 0.4 }],
92
+ });
93
+ // Label.
94
+ out.push({
95
+ id: `${id}-label-${i}`,
96
+ type: 'text',
97
+ layer: rowLayer + 3,
98
+ time: time + stagger + 2 * FRAME,
99
+ duration: duration - (stagger + 2 * FRAME),
100
+ text: item.label,
101
+ x: rowX + 100,
102
+ y: rowTop + rowH / 2,
103
+ x_anchor: 0,
104
+ font_family: fonts.sans,
105
+ font_size: fontSize,
106
+ font_weight: '400',
107
+ fill_color: palette.text,
108
+ animations: [{ type: 'fade-in', duration: 0.4 }],
109
+ });
110
+ // Value (right-aligned).
111
+ out.push({
112
+ id: `${id}-value-${i}`,
113
+ type: 'text',
114
+ layer: rowLayer + 4,
115
+ time: time + stagger + 4 * FRAME,
116
+ duration: duration - (stagger + 4 * FRAME),
117
+ text: new Intl.NumberFormat('en-US').format(item.value),
118
+ x: rowRight - 30,
119
+ y: rowTop + rowH / 2,
120
+ x_anchor: 1,
121
+ font_family: fonts.sans,
122
+ font_size: fontSize,
123
+ font_weight: '400',
124
+ fill_color: palette.text,
125
+ animations: [{ type: 'fade-in', duration: 0.4 }],
126
+ });
127
+ }
128
+ return out;
129
+ }
130
+ //# sourceMappingURL=ranked-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranked-list.js","sourceRoot":"","sources":["../src/ranked-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Element } from '@clipkit/protocol';
2
+ import { type ColorName, type ThemeName } from './theme.js';
3
+ export interface StatBlockProps {
4
+ id: string;
5
+ /** The number being revealed; counts from 0 → this over ~1s. */
6
+ current: number;
7
+ /** Previous-period value. If set, a trend pill is rendered to the right. */
8
+ previous?: number;
9
+ /** Sub-label under the number ("Total views"). */
10
+ label: string;
11
+ /** Color slot — drives the top border + trend pill. */
12
+ color: ColorName;
13
+ theme?: ThemeName;
14
+ /** Top-left x of the block. */
15
+ x: number;
16
+ /** Top-left y of the block. */
17
+ y: number;
18
+ /** Block width — usually the body content width. */
19
+ width: number;
20
+ /** Scene-local start time + duration. */
21
+ time: number;
22
+ duration: number;
23
+ layerBase: number;
24
+ }
25
+ export declare function statBlock(props: StatBlockProps): Element[];
26
+ //# sourceMappingURL=stat-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-block.d.ts","sourceRoot":"","sources":["../src/stat-block.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAwB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,EAAE,CA4F1D"}
@@ -0,0 +1,92 @@
1
+ // StatBlock — themed border line, a big number, label below, optional
2
+ // trend pill on the right.
3
+ //
4
+ // Used for hero stats in a dashboard-style scene. The number is rendered as
5
+ // plain comma-grouped text that fades + rises into place — the protocol has
6
+ // no text-content animation, so there is no per-digit count-up.
7
+ import { getFonts, getPalette } from './theme.js';
8
+ import { trendPct, trendPill } from './trend-pill.js';
9
+ export function statBlock(props) {
10
+ const { id, current, previous, label, color, x, y, width, time, duration, layerBase, } = props;
11
+ const theme = props.theme ?? 'mux';
12
+ const palette = getPalette(theme, color);
13
+ const fonts = getFonts(theme);
14
+ const out = [];
15
+ // 3-px top border in the dark accent (the "rule" above each stat).
16
+ out.push({
17
+ id: `${id}-border`,
18
+ type: 'shape',
19
+ layer: layerBase,
20
+ time,
21
+ duration,
22
+ shape: 'rectangle',
23
+ x: x + width / 2,
24
+ y,
25
+ x_anchor: '50%',
26
+ y_anchor: '50%',
27
+ width,
28
+ height: 3,
29
+ fill_color: palette.accent,
30
+ });
31
+ // Big number, anchored top-left 50 px below the border; fades + rises in.
32
+ out.push({
33
+ id: `${id}-value`,
34
+ type: 'text',
35
+ layer: layerBase + 1,
36
+ time,
37
+ duration,
38
+ text: new Intl.NumberFormat('en-US').format(current),
39
+ x: x + 60,
40
+ y: y + 50,
41
+ x_anchor: 0,
42
+ y_anchor: 0,
43
+ font_family: fonts.sans,
44
+ font_size: 160,
45
+ font_weight: '300',
46
+ fill_color: palette.text,
47
+ animations: [{ type: 'fade-in', duration: 0.5 }],
48
+ keyframe_animations: [
49
+ {
50
+ property: 'y',
51
+ keyframes: [
52
+ { time: 0, value: y + 50 + 30 },
53
+ { time: 0.6, value: y + 50, easing: 'ease-out' },
54
+ ],
55
+ },
56
+ ],
57
+ });
58
+ // Sub-label.
59
+ out.push({
60
+ id: `${id}-label`,
61
+ type: 'text',
62
+ layer: layerBase + 2,
63
+ time: time + 10 / 30,
64
+ duration: duration - 10 / 30,
65
+ text: label,
66
+ x: x + 60,
67
+ y: y + 240,
68
+ x_anchor: 0,
69
+ y_anchor: 0,
70
+ font_family: fonts.sans,
71
+ font_size: 36,
72
+ font_weight: '400',
73
+ fill_color: palette.text,
74
+ animations: [{ type: 'fade-in', duration: 0.4 }],
75
+ });
76
+ // Optional trend pill on the right.
77
+ if (typeof previous === 'number') {
78
+ out.push(...trendPill({
79
+ id: `${id}-pill`,
80
+ layerBase: layerBase + 3,
81
+ time: time + 15 / 30,
82
+ duration: duration - 15 / 30,
83
+ cx: x + width - 280,
84
+ cy: y + 50,
85
+ color,
86
+ theme,
87
+ delta: trendPct(current, previous),
88
+ }));
89
+ }
90
+ return out;
91
+ }
92
+ //# sourceMappingURL=stat-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-block.js","sourceRoot":"","sources":["../src/stat-block.ts"],"names":[],"mappings":"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"}