@openpresentation/cli 0.8.0 → 0.9.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.
- package/README.md +11 -5
- package/dist/index.js +1108 -447
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -8149,13 +8149,13 @@ import path2 from "path";
|
|
|
8149
8149
|
// ../javascript/dist/index.js
|
|
8150
8150
|
init_define_OPF_SKILLS();
|
|
8151
8151
|
|
|
8152
|
-
// ../javascript/dist/chunk-
|
|
8152
|
+
// ../javascript/dist/chunk-EQHZ3ZO4.js
|
|
8153
8153
|
init_define_OPF_SKILLS();
|
|
8154
8154
|
|
|
8155
|
-
// ../javascript/dist/chunk-
|
|
8155
|
+
// ../javascript/dist/chunk-CHKJ4QHQ.js
|
|
8156
8156
|
init_define_OPF_SKILLS();
|
|
8157
8157
|
|
|
8158
|
-
// ../javascript/dist/chunk-
|
|
8158
|
+
// ../javascript/dist/chunk-FTWNWFIV.js
|
|
8159
8159
|
init_define_OPF_SKILLS();
|
|
8160
8160
|
var record = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
8161
8161
|
function tableGrid(value, path3 = "table") {
|
|
@@ -8263,8 +8263,105 @@ var headings = /* @__PURE__ */ new Set(["title", "subtitle", "tag"]);
|
|
|
8263
8263
|
var rows = ["top", "middle", "bottom"];
|
|
8264
8264
|
var columns = ["left", "center", "right"];
|
|
8265
8265
|
var record2 = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
8266
|
-
var kind = (field) => field === "items"
|
|
8266
|
+
var kind = (field) => field === "items" ? "list" : field === "bullets" ? "text" : field;
|
|
8267
8267
|
var round = (value) => Math.round(value * 1e6) / 1e6 || value;
|
|
8268
|
+
function layoutFurniture(input, options = {}) {
|
|
8269
|
+
const slide = record2(input), width = options.width ?? 1280, height = options.height ?? 720, scale = Math.min(width, height) / 720;
|
|
8270
|
+
const settings = { ...record2(record2(options.layout).composition), ...record2(slide.composition) };
|
|
8271
|
+
assertComposition(settings);
|
|
8272
|
+
const minimum = (settings.minFontSize ?? 16) * scale, size = Math.max(13 * scale, minimum), padding = (options.textRasterPadding ?? 2) * scale;
|
|
8273
|
+
if (![width, height, scale, minimum, padding].every(Number.isFinite) || width <= 0 || height <= 0 || minimum <= 0 || padding < 0) throw new RangeError("Furniture requires finite positive dimensions and nonnegative raster padding.");
|
|
8274
|
+
const number = options.slideNumber ?? (options.slideIndex ?? 0) + 1;
|
|
8275
|
+
if (!Number.isSafeInteger(number) || number < 1) throw new RangeError("Displayed slide number must be a positive safe integer.");
|
|
8276
|
+
const outlines = options.textMeasurement?.outlineBounds !== void 0, parts2 = [], diagnostics = [];
|
|
8277
|
+
const sourceRoot = `slides.${options.slideIndex ?? 0}`, organizations = Array.isArray(options.presentation?.organization) ? options.presentation.organization : [options.presentation?.organization];
|
|
8278
|
+
const primaryIndex = organizations.findIndex((item) => record2(item).role === "primary"), organizationIndex = primaryIndex >= 0 ? primaryIndex : organizations.findIndex(Boolean);
|
|
8279
|
+
const organization = record2(organizations[organizationIndex]), organizationPath = Array.isArray(options.presentation?.organization) ? `organization.${organizationIndex}.name` : "organization.name";
|
|
8280
|
+
const fontFamily = options.fonts?.body ?? "sans-serif";
|
|
8281
|
+
let headerBottom = 0, footerTop = height, configured = false;
|
|
8282
|
+
const error = (path3, message, code = "text-overflow") => diagnostics.push({ code, path: path3, message });
|
|
8283
|
+
for (const kind2 of ["header", "footer"]) {
|
|
8284
|
+
const local = record2(slide.design)[kind2] !== void 0, value = local ? record2(slide.design)[kind2] : options.presentation?.design?.[kind2];
|
|
8285
|
+
if (value === void 0 || value === false) continue;
|
|
8286
|
+
const root = local ? `${sourceRoot}.design.${kind2}` : `design.${kind2}`;
|
|
8287
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new TypeError("Header/footer content must be an object or false.");
|
|
8288
|
+
configured = true;
|
|
8289
|
+
const zones = [];
|
|
8290
|
+
for (const [index2, zone] of ["left", "center", "right"].entries()) {
|
|
8291
|
+
const content = record2(record2(value)[zone]), path3 = `${root}.${zone}`, x = width * (0.07 + index2 * 0.3), zoneWidth = width * 0.26, zoneParts = [];
|
|
8292
|
+
let y = 0;
|
|
8293
|
+
const add = (field, text, generated = false, sourcePath) => {
|
|
8294
|
+
if (text === void 0) return;
|
|
8295
|
+
if (typeof text !== "string") throw new TypeError(`Furniture field ${path3}.${field} requires string content.`);
|
|
8296
|
+
const partPath = `${path3}.${field}`, style = resolveTextStyle({ fontFamily, fontWeight: 400, italic: false, path: partPath }, options.textMeasurement);
|
|
8297
|
+
const fit = fitText(text, { width: Math.max(Number.MIN_VALUE, zoneWidth - (outlines ? 2 * padding : 0)), height: Number.MAX_VALUE }, size, size, textWidthMeasurer(style, options.textMeasurement));
|
|
8298
|
+
const ink = fit.sourceLines.map((line, index22) => {
|
|
8299
|
+
let outline = null;
|
|
8300
|
+
if (outlines) {
|
|
8301
|
+
for (const segment of line.segments) if (segment.kind === "text") {
|
|
8302
|
+
const bounds = measureTextOutline(text.slice(segment.start, segment.end), size, style, options.textMeasurement);
|
|
8303
|
+
if (bounds) {
|
|
8304
|
+
const next = { ...bounds, x: bounds.x + segment.x };
|
|
8305
|
+
if (!outline) outline = next;
|
|
8306
|
+
else {
|
|
8307
|
+
const right = Math.max(outline.x + outline.width, next.x + next.width), bottom = Math.max(outline.y + outline.height, next.y + next.height);
|
|
8308
|
+
outline.x = Math.min(outline.x, next.x);
|
|
8309
|
+
outline.y = Math.min(outline.y, next.y);
|
|
8310
|
+
outline.width = right - outline.x;
|
|
8311
|
+
outline.height = bottom - outline.y;
|
|
8312
|
+
}
|
|
8313
|
+
}
|
|
8314
|
+
}
|
|
8315
|
+
}
|
|
8316
|
+
return { width: line.width, y: index22 * fit.lineHeight, baseline: size + index22 * fit.lineHeight, height: fit.lineHeight, outline };
|
|
8317
|
+
});
|
|
8318
|
+
const natural = outlines ? placeTextLines(ink, { x, y, width: zoneWidth, height: Number.MAX_VALUE }, zone, padding) : void 0;
|
|
8319
|
+
const partHeight = natural?.height ?? fit.sourceLines.length * fit.lineHeight;
|
|
8320
|
+
if (!Number.isFinite(partHeight)) throw new RangeError("Furniture exceeds finite layout coordinates.");
|
|
8321
|
+
const box = { x, y, width: zoneWidth, height: Math.max(scale, partHeight) }, placement = outlines ? placeTextLines(ink, box, zone, padding) : void 0;
|
|
8322
|
+
const accepted = { ...fit, ...placement ? { placement } : {}, overflow: fit.overflow || !!placement?.overflow };
|
|
8323
|
+
zoneParts.push({ type: "text", kind: kind2, zone, field, path: partPath, sourcePath: sourcePath ?? (!generated ? partPath : void 0), generated, text, style, requestedFontSize: 13 * scale, minFontSize: minimum, box, alignment: zone, fit: accepted });
|
|
8324
|
+
if (accepted.overflow) error(partPath, "Repeated text exceeds its zone at the selected readability floor; change the furniture or slide design.");
|
|
8325
|
+
y += box.height;
|
|
8326
|
+
};
|
|
8327
|
+
if (content.image !== void 0) {
|
|
8328
|
+
const box = { x, y, width: zoneWidth, height: Math.max(32 * scale, Math.min(height * 0.05, 72 * scale)) };
|
|
8329
|
+
zoneParts.push({ type: "image", kind: kind2, zone, field: "image", path: `${path3}.image`, sourcePath: `${path3}.image`, generated: false, image: content.image, box, alignment: zone });
|
|
8330
|
+
y += box.height;
|
|
8331
|
+
}
|
|
8332
|
+
add("text", content.text);
|
|
8333
|
+
if (content.organization === true) {
|
|
8334
|
+
if (typeof organization.name === "string") add("organization", organization.name, true, organizationPath);
|
|
8335
|
+
else error(`${path3}.organization`, "Generated organization name needs a named organization in the presentation.", "unresolved-content");
|
|
8336
|
+
}
|
|
8337
|
+
if (content.section === true) {
|
|
8338
|
+
if (typeof slide.section === "string") add("section", slide.section, true, `${sourceRoot}.section`);
|
|
8339
|
+
else error(`${path3}.section`, "Generated section needs a literal slide section.", "unresolved-content");
|
|
8340
|
+
}
|
|
8341
|
+
if (content.slideNumber === true) add("slideNumber", String(number), true);
|
|
8342
|
+
if (content.date === true) error(`${path3}.date`, "Use a literal date string for deterministic header/footer content.", "unresolved-content");
|
|
8343
|
+
else if (typeof content.date === "string") add("date", content.date);
|
|
8344
|
+
zones.push(zoneParts);
|
|
8345
|
+
}
|
|
8346
|
+
const tallest = Math.max(0, ...zones.map((zone) => zone.reduce((sum, part) => sum + part.box.height, 0)));
|
|
8347
|
+
if (!tallest) continue;
|
|
8348
|
+
const top = kind2 === "header" ? height * 0.025 : Math.max(height * 0.025, height - height * 0.04 - tallest);
|
|
8349
|
+
if (kind2 === "header") headerBottom = top + tallest;
|
|
8350
|
+
else footerTop = top;
|
|
8351
|
+
for (const zone of zones) for (const part of zone) {
|
|
8352
|
+
part.box.y += top;
|
|
8353
|
+
if (part.type === "text" && part.fit.placement) for (const line of part.fit.placement.lines) {
|
|
8354
|
+
line.y += top;
|
|
8355
|
+
line.baseline += top;
|
|
8356
|
+
if (line.outline) line.outline.y += top;
|
|
8357
|
+
}
|
|
8358
|
+
if (part.box.y + part.box.height > height - height * 0.04 + 0.01) error(part.path, "Repeated header/footer content extends beyond the usable slide height. Change its content or design before pagination.");
|
|
8359
|
+
parts2.push(part);
|
|
8360
|
+
}
|
|
8361
|
+
}
|
|
8362
|
+
if (headerBottom > footerTop + 0.01) error(parts2.find((part) => part.kind === "footer")?.path ?? sourceRoot, "Header and footer content overlap; repeated content cannot be repaired by splitting body content.");
|
|
8363
|
+
return { algorithm: "furniture-flow-v2", configured, textMeasurement: options.textMeasurement ? "provided" : "estimated", textOutlines: outlines ? "provided" : "unavailable", parts: parts2, headerBottom, footerTop, diagnostics, overflow: diagnostics.length > 0 };
|
|
8364
|
+
}
|
|
8268
8365
|
var textSegments = new Intl.Segmenter("und", { granularity: "grapheme" });
|
|
8269
8366
|
function measureText(text, fontSize) {
|
|
8270
8367
|
let units = 0;
|
|
@@ -9192,7 +9289,11 @@ function composeSlide(input, options = {}) {
|
|
|
9192
9289
|
const fitContent = (field, value, text, box, size, minimum, path22) => field === "text" ? fitPlacedText(field, value, text, box, size, minimum, path22) : field === "items" || field === "bullets" ? fitList(value, box, size, minimum, { style: styleFor(field, path22), textMeasurement: options.textMeasurement }) : fitText(text, box, size, minimum, widthFor(field, path22));
|
|
9193
9290
|
const path3 = `slides.${options.slideIndex ?? 0}`;
|
|
9194
9291
|
const items = [], diagnostics = [];
|
|
9195
|
-
|
|
9292
|
+
const measuredFurniture = layoutFurniture(slide, options);
|
|
9293
|
+
const furniture = measuredFurniture.configured || measuredFurniture.diagnostics.length ? measuredFurniture : void 0;
|
|
9294
|
+
if (furniture) diagnostics.push(...furniture.diagnostics);
|
|
9295
|
+
const bodyBottom = Math.min(height - padding, furniture && furniture.footerTop < height ? furniture.footerTop - gap * 0.5 : height - padding);
|
|
9296
|
+
let y = Math.max(padding, furniture?.headerBottom ? furniture.headerBottom + gap * 0.5 : padding);
|
|
9196
9297
|
for (const field of ["tag", "title", "subtitle"]) {
|
|
9197
9298
|
if (!slide[field]) continue;
|
|
9198
9299
|
const requested = (field === "title" ? 54 : field === "tag" ? 16 : 25) * scale;
|
|
@@ -9200,11 +9301,12 @@ function composeSlide(input, options = {}) {
|
|
|
9200
9301
|
const box = { x: padding, y, width: width - padding * 2, height: maxHeight };
|
|
9201
9302
|
const text = fitPlacedText(field, slide[field], String(slide[field]), box, requested, minSize, `${path3}.${field}`);
|
|
9202
9303
|
box.height = Math.min(maxHeight, Math.max(text.lines.length * text.lineHeight, text.placement?.height ?? 0));
|
|
9304
|
+
if (furniture && box.y + box.height > bodyBottom + 0.01) diagnostics.push({ code: "text-overflow", path: `${path3}.${field}`, message: "Repeated furniture leaves too little room for this heading. Change the header/footer or slide design." });
|
|
9203
9305
|
items.push({ path: `${path3}.${field}`, field, type: "text", value: slide[field], payload: { text: slide[field] }, box, text, textStyle: styleFor(field, `${path3}.${field}`), composition });
|
|
9204
9306
|
y += box.height + gap * 0.5;
|
|
9205
9307
|
}
|
|
9206
9308
|
if (items.length) y += gap * 0.5;
|
|
9207
|
-
const contentBox = { x: padding, y, width: width - padding * 2, height: Math.max(scale,
|
|
9309
|
+
const contentBox = { x: padding, y, width: width - padding * 2, height: Math.max(scale, bodyBottom - y) };
|
|
9208
9310
|
const collect = (host, basePath, depth = 0, ancestors = []) => {
|
|
9209
9311
|
if (Array.isArray(host.blocks)) {
|
|
9210
9312
|
if (depth >= MAX_COMPOSITION_DEPTH || ancestors.includes(host)) throw new RangeError(`Content groups must be acyclic and nest at most ${MAX_COMPOSITION_DEPTH} levels.`);
|
|
@@ -9399,6 +9501,7 @@ function composeSlide(input, options = {}) {
|
|
|
9399
9501
|
for (const group of groups) for (const box of [group.box, group.contentBox]) for (const key of ["x", "y", "width", "height"]) box[key] = round(box[key]);
|
|
9400
9502
|
const strictPaths = new Set(items.filter((item) => item.composition.overflow === "error").map((item) => item.path));
|
|
9401
9503
|
const failures = diagnostics.filter((diagnostic) => {
|
|
9504
|
+
if (composition.overflow === "error") return true;
|
|
9402
9505
|
let path22 = diagnostic.path;
|
|
9403
9506
|
while (path22) {
|
|
9404
9507
|
if (strictPaths.has(path22)) return true;
|
|
@@ -9409,7 +9512,7 @@ function composeSlide(input, options = {}) {
|
|
|
9409
9512
|
return false;
|
|
9410
9513
|
});
|
|
9411
9514
|
const explanation = decisions ? {
|
|
9412
|
-
algorithm: "grid-score-
|
|
9515
|
+
algorithm: "grid-score-v9",
|
|
9413
9516
|
textMeasurement: options.textMeasurement ? "provided" : "estimated",
|
|
9414
9517
|
textOutlines: options.textMeasurement?.outlineBounds ? "provided" : "unavailable",
|
|
9415
9518
|
textRasterPadding: rasterPadding,
|
|
@@ -9417,7 +9520,7 @@ function composeSlide(input, options = {}) {
|
|
|
9417
9520
|
unmeasuredPayloads: items.filter((item) => !headings.has(item.field) && !item.quoteLayout && !item.codeLayout && !item.metricLayout && !item.timelineLayout && !["text", "items", "bullets", "table"].includes(item.field)).map((item) => item.path)
|
|
9418
9521
|
} : void 0;
|
|
9419
9522
|
if (failures.length) throw new OPFCompositionError(failures, explanation);
|
|
9420
|
-
return { width, height, contentBox, items, groups, flows, diagnostics, composition, ...explanation ? { explanation } : {} };
|
|
9523
|
+
return { width, height, contentBox, items, groups, flows, diagnostics, composition, ...furniture ? { furniture } : {}, ...explanation ? { explanation } : {} };
|
|
9421
9524
|
}
|
|
9422
9525
|
function resolveCanvasDimensions(input) {
|
|
9423
9526
|
const presets = {
|
|
@@ -9437,13 +9540,13 @@ function resolveCanvasDimensions(input) {
|
|
|
9437
9540
|
return { width, height };
|
|
9438
9541
|
}
|
|
9439
9542
|
|
|
9440
|
-
// ../javascript/dist/chunk-
|
|
9543
|
+
// ../javascript/dist/chunk-GN52EE3P.js
|
|
9441
9544
|
init_define_OPF_SKILLS();
|
|
9442
9545
|
var presentation = {
|
|
9443
9546
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
9444
9547
|
"$id": "https://openpresentation.org/schema/opf/v1",
|
|
9445
9548
|
"title": "Presentation",
|
|
9446
|
-
"description": "Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design \u2014 the engine handles OOXML complexity.\n\nFields that reference catalog records (narrative, language, tone, audience, purpose, design.theme / design.theme.id, design.colorScheme / design.colorScheme.id, design.fontScheme / design.fontScheme.id, Slide.layout, Chart.type, Organization.socials / Speaker.socials) resolve through the catalog system: inline 'catalogs.<kind>.records[]' on the document \u2192 'catalogs.<kind>.source' on the document \u2192 engine defaults \u2192 the default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. When an OPF document omits a reference entirely, the engine falls back to engine defaults (see /spec/reference/engine-defaults.json for a reference example). The defaults file is engine configuration; it is not part of the OPF document contract and has no JSON Schema.\n\nMost catalog references accept the bare 'id' as a string for the common case (e.g. narrative = 'classic-story', design.colorScheme = 'cool-horizon'). Audience, purpose, tone, design, and language object forms use 'id' as a base catalog reference plus inline overrides. Asset references use 'asset:<id>' strings that point into the top-level assets registry.",
|
|
9549
|
+
"description": "Open-source JSON format for describing PowerPoint presentations. Agents describe narratives, content, audience, reusable assets, and design \u2014 the engine handles OOXML complexity.\n\nFields that reference catalog records (narrative, language, tone, audience, purpose, design.theme / design.theme.id, design.colorScheme / design.colorScheme.id, design.fontScheme / design.fontScheme.id, Slide.layout, Chart.type, Organization.socials / Speaker.socials) resolve through the catalog system: inline 'catalogs.<kind>.records[]' on the document \u2192 'catalogs.<kind>.source' on the document \u2192 engine defaults \u2192 the default catalog at https://www.pptx.gallery/<kind>. Every reference resolves to the catalog record's 'id' field. When an OPF document omits a reference entirely, the engine falls back to engine defaults (see /spec/reference/engine-defaults.json for a reference example). The defaults file is engine configuration; it is not part of the OPF document contract and has no JSON Schema.\n\nMost catalog references accept the bare 'id' as a string for the common case (e.g. narrative = 'classic-story', design.colorScheme = 'cool-horizon'). Audience, purpose, tone, design, and language object forms use 'id' as a base catalog reference plus inline overrides. Asset references use 'asset:<id>' strings that point into the top-level assets registry, and content color fields (rich-text runs, styled table cells) accept hex values, color-scheme slot/role names, or 'var:<id>' references into the top-level variables map.",
|
|
9447
9550
|
"type": "object",
|
|
9448
9551
|
"required": [
|
|
9449
9552
|
"slides"
|
|
@@ -9724,6 +9827,10 @@ var presentation = {
|
|
|
9724
9827
|
"$ref": "#/$defs/Design",
|
|
9725
9828
|
"description": "Optional design system covering theme, color scheme, font scheme, dimensions, background, logo, watermark, header, and footer applied to the deck. When omitted, engines use their default design configuration."
|
|
9726
9829
|
},
|
|
9830
|
+
"variables": {
|
|
9831
|
+
"$ref": "#/$defs/Variables",
|
|
9832
|
+
"description": "Optional named color variables for values the deck uses in more than one place or wants to name for intent (e.g. a risk red, a brand highlight). Content color fields reference entries as 'var:<id>' strings. Variables complement the color scheme: scheme slots and roles stay the primary vocabulary; variables cover deck-specific named colors that have no scheme slot."
|
|
9833
|
+
},
|
|
9727
9834
|
"narrative": {
|
|
9728
9835
|
"oneOf": [
|
|
9729
9836
|
{
|
|
@@ -11422,6 +11529,109 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
|
|
|
11422
11529
|
"#0F172AFF"
|
|
11423
11530
|
]
|
|
11424
11531
|
},
|
|
11532
|
+
"ColorRef": {
|
|
11533
|
+
"anyOf": [
|
|
11534
|
+
{
|
|
11535
|
+
"$ref": "#/$defs/HexColor"
|
|
11536
|
+
},
|
|
11537
|
+
{
|
|
11538
|
+
"type": "string",
|
|
11539
|
+
"enum": [
|
|
11540
|
+
"accent1",
|
|
11541
|
+
"accent2",
|
|
11542
|
+
"accent3",
|
|
11543
|
+
"accent4",
|
|
11544
|
+
"accent5",
|
|
11545
|
+
"accent6",
|
|
11546
|
+
"dark1",
|
|
11547
|
+
"dark2",
|
|
11548
|
+
"light1",
|
|
11549
|
+
"light2",
|
|
11550
|
+
"hyperlink",
|
|
11551
|
+
"followedHyperlink",
|
|
11552
|
+
"primary",
|
|
11553
|
+
"secondary",
|
|
11554
|
+
"accent",
|
|
11555
|
+
"background",
|
|
11556
|
+
"surface",
|
|
11557
|
+
"text",
|
|
11558
|
+
"textSecondary"
|
|
11559
|
+
]
|
|
11560
|
+
},
|
|
11561
|
+
{
|
|
11562
|
+
"type": "string",
|
|
11563
|
+
"pattern": "^var:[a-z][a-z0-9-]*$"
|
|
11564
|
+
}
|
|
11565
|
+
],
|
|
11566
|
+
"description": "A color value or reference, enforced on styled table cell fill and text colors and on cell border colors. Three forms:\n- Literal hex: '#RGB', '#RRGGBB', or '#RRGGBBAA'.\n- Color-scheme name, resolved through the effective color scheme after design resolution: an OOXML slot ('accent1'-'accent6', 'dark1', 'dark2', 'light1', 'light2', 'hyperlink', 'followedHyperlink') or an abstract role ('primary', 'secondary', 'accent', 'background', 'surface', 'text', 'textSecondary'). Roles resolve through the same role-to-slot mapping engines already apply to color schemes.\n- Variable reference: 'var:<id>' into the top-level variables map.\n\nNames keep content theme-portable: re-theming the deck updates every named reference, where a literal hex stays frozen. Unknown 'var:' ids produce a validation warning, never an error, and engines fall back to their default text color. TextRun.color documents the same three forms but remains an open string so imported decks with unrecognized run colors stay valid; validators warn there instead of erroring.",
|
|
11567
|
+
"examples": [
|
|
11568
|
+
"#0F4C81",
|
|
11569
|
+
"accent2",
|
|
11570
|
+
"text",
|
|
11571
|
+
"var:risk"
|
|
11572
|
+
]
|
|
11573
|
+
},
|
|
11574
|
+
"Variables": {
|
|
11575
|
+
"type": "object",
|
|
11576
|
+
"propertyNames": {
|
|
11577
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
11578
|
+
},
|
|
11579
|
+
"additionalProperties": {
|
|
11580
|
+
"$ref": "#/$defs/Variable"
|
|
11581
|
+
},
|
|
11582
|
+
"description": "Named color variables, keyed by stable kebab-case id. Content color fields reference entries as 'var:<id>' strings. Each value is a hex string shorthand or a Variable object.",
|
|
11583
|
+
"examples": [
|
|
11584
|
+
{
|
|
11585
|
+
"risk": "#B42318",
|
|
11586
|
+
"highlight": {
|
|
11587
|
+
"type": "color",
|
|
11588
|
+
"value": "#0F4C81",
|
|
11589
|
+
"description": "Brand highlight for emphasized runs."
|
|
11590
|
+
}
|
|
11591
|
+
}
|
|
11592
|
+
]
|
|
11593
|
+
},
|
|
11594
|
+
"Variable": {
|
|
11595
|
+
"oneOf": [
|
|
11596
|
+
{
|
|
11597
|
+
"$ref": "#/$defs/HexColor"
|
|
11598
|
+
},
|
|
11599
|
+
{
|
|
11600
|
+
"type": "object",
|
|
11601
|
+
"required": [
|
|
11602
|
+
"type",
|
|
11603
|
+
"value"
|
|
11604
|
+
],
|
|
11605
|
+
"additionalProperties": false,
|
|
11606
|
+
"properties": {
|
|
11607
|
+
"type": {
|
|
11608
|
+
"type": "string",
|
|
11609
|
+
"enum": [
|
|
11610
|
+
"color"
|
|
11611
|
+
],
|
|
11612
|
+
"description": "Variable kind. Only 'color' is defined today; other kinds may be added when content surfaces exist to consume them."
|
|
11613
|
+
},
|
|
11614
|
+
"value": {
|
|
11615
|
+
"$ref": "#/$defs/HexColor",
|
|
11616
|
+
"description": "Hex color this variable resolves to."
|
|
11617
|
+
},
|
|
11618
|
+
"description": {
|
|
11619
|
+
"type": "string",
|
|
11620
|
+
"description": "Optional prose describing what the variable is for, surfaced by pickers and agents."
|
|
11621
|
+
}
|
|
11622
|
+
}
|
|
11623
|
+
}
|
|
11624
|
+
],
|
|
11625
|
+
"description": 'A single named variable. A hex string is shorthand for { "type": "color", "value": value }.',
|
|
11626
|
+
"examples": [
|
|
11627
|
+
"#B42318",
|
|
11628
|
+
{
|
|
11629
|
+
"type": "color",
|
|
11630
|
+
"value": "#B42318",
|
|
11631
|
+
"description": "Risk emphasis."
|
|
11632
|
+
}
|
|
11633
|
+
]
|
|
11634
|
+
},
|
|
11425
11635
|
"BackgroundShortcut": {
|
|
11426
11636
|
"oneOf": [
|
|
11427
11637
|
{
|
|
@@ -12153,6 +12363,10 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
|
|
|
12153
12363
|
},
|
|
12154
12364
|
"composition": {
|
|
12155
12365
|
"$ref": "#/$defs/Composition"
|
|
12366
|
+
},
|
|
12367
|
+
"extensions": {
|
|
12368
|
+
"type": "object",
|
|
12369
|
+
"description": 'Custom data passthrough for agent workflows at slide scope; ignored by the engine but preserved across read/write round-trips. Use for review state, generation provenance, or authoring conventions such as { "authoring": { "locked": true } }.'
|
|
12156
12370
|
}
|
|
12157
12371
|
}
|
|
12158
12372
|
},
|
|
@@ -12161,6 +12375,18 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
|
|
|
12161
12375
|
"description": "A content leaf or recursively composed group. A group contains blocks and optional composition; it cannot mix blocks with leaf payload fields. Groups may nest up to 32 levels.",
|
|
12162
12376
|
"additionalProperties": false,
|
|
12163
12377
|
"properties": {
|
|
12378
|
+
"id": {
|
|
12379
|
+
"type": "string",
|
|
12380
|
+
"description": "Optional stable identifier for this payload, unique among slide and payload ids in the document. Use when another system needs to address the payload across edits \u2014 patch-style agent edits, comments, review state, or generation provenance. Identity survives reordering where array indexes do not.",
|
|
12381
|
+
"examples": [
|
|
12382
|
+
"kpi-adoption",
|
|
12383
|
+
"churn-quote"
|
|
12384
|
+
]
|
|
12385
|
+
},
|
|
12386
|
+
"extensions": {
|
|
12387
|
+
"type": "object",
|
|
12388
|
+
"description": "Custom data passthrough for agent workflows at payload scope; ignored by the engine but preserved across read/write round-trips."
|
|
12389
|
+
},
|
|
12164
12390
|
"type": {
|
|
12165
12391
|
"type": "string",
|
|
12166
12392
|
"enum": [
|
|
@@ -13027,10 +13253,11 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
|
|
|
13027
13253
|
},
|
|
13028
13254
|
"color": {
|
|
13029
13255
|
"type": "string",
|
|
13030
|
-
"description": "Run text color
|
|
13256
|
+
"description": "Run text color. Documented forms: a hex string ('#RGB', '#RRGGBB', '#RRGGBBAA'), a color-scheme slot or role name resolved through the effective color scheme ('accent2', 'text'), or a 'var:<id>' reference into the top-level variables map. Prefer names over hex so runs survive re-theming. Any other string stays schema-valid so imported decks keep validating: validators warn and renderers fall back to the theme text color.",
|
|
13031
13257
|
"examples": [
|
|
13032
13258
|
"#0F172A",
|
|
13033
|
-
"
|
|
13259
|
+
"accent2",
|
|
13260
|
+
"var:risk"
|
|
13034
13261
|
]
|
|
13035
13262
|
},
|
|
13036
13263
|
"fontSize": {
|
|
@@ -13373,14 +13600,12 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
|
|
|
13373
13600
|
"additionalProperties": false,
|
|
13374
13601
|
"properties": {
|
|
13375
13602
|
"fill": {
|
|
13376
|
-
"
|
|
13377
|
-
"
|
|
13378
|
-
"description": "Explicit RGB or RGBA color. Eight-digit colors include alpha; #00000000 is transparent."
|
|
13603
|
+
"$ref": "#/$defs/ColorRef",
|
|
13604
|
+
"description": "Cell background: a hex color, a color-scheme slot or role name, or a 'var:<id>' variable reference. Eight-digit hex colors include alpha; #00000000 is transparent."
|
|
13379
13605
|
},
|
|
13380
13606
|
"color": {
|
|
13381
|
-
"
|
|
13382
|
-
"
|
|
13383
|
-
"description": "Default text color, overridden by individual rich run colors."
|
|
13607
|
+
"$ref": "#/$defs/ColorRef",
|
|
13608
|
+
"description": "Default text color, overridden by individual rich run colors. Accepts a hex color, a color-scheme slot or role name, or a 'var:<id>' variable reference."
|
|
13384
13609
|
},
|
|
13385
13610
|
"align": {
|
|
13386
13611
|
"type": "string",
|
|
@@ -13461,9 +13686,8 @@ Resolution order: inline catalogs.fontSchemes.records[] -> catalogs.fontSchemes.
|
|
|
13461
13686
|
],
|
|
13462
13687
|
"properties": {
|
|
13463
13688
|
"color": {
|
|
13464
|
-
"
|
|
13465
|
-
"
|
|
13466
|
-
"description": "Explicit RGB or RGBA color. Eight-digit colors include alpha; #00000000 is transparent."
|
|
13689
|
+
"$ref": "#/$defs/ColorRef",
|
|
13690
|
+
"description": "Border color: a hex color, a color-scheme slot or role name, or a 'var:<id>' variable reference. Eight-digit hex colors include alpha; #00000000 is transparent."
|
|
13467
13691
|
},
|
|
13468
13692
|
"width": {
|
|
13469
13693
|
"type": "number",
|
|
@@ -14313,9 +14537,15 @@ var layout = {
|
|
|
14313
14537
|
"List",
|
|
14314
14538
|
"Image",
|
|
14315
14539
|
"Number",
|
|
14316
|
-
"
|
|
14540
|
+
"Metric",
|
|
14541
|
+
"Chart",
|
|
14542
|
+
"Table",
|
|
14543
|
+
"Code",
|
|
14544
|
+
"Video",
|
|
14545
|
+
"Quote",
|
|
14546
|
+
"Timeline"
|
|
14317
14547
|
],
|
|
14318
|
-
"description": "Primary kind of content the layout holds. Drives pickers and AI placement decisions."
|
|
14548
|
+
"description": "Primary kind of content the layout holds. Drives pickers and AI placement decisions. Metric is the canonical numeric/KPI category; Number remains an accepted legacy label."
|
|
14319
14549
|
},
|
|
14320
14550
|
"contentMultiple": {
|
|
14321
14551
|
"type": "string",
|
|
@@ -14523,6 +14753,9 @@ var layout = {
|
|
|
14523
14753
|
"subtitle",
|
|
14524
14754
|
"tag",
|
|
14525
14755
|
"text",
|
|
14756
|
+
"metric",
|
|
14757
|
+
"quote",
|
|
14758
|
+
"timeline",
|
|
14526
14759
|
"list",
|
|
14527
14760
|
"chart",
|
|
14528
14761
|
"picture",
|
|
@@ -14531,7 +14764,7 @@ var layout = {
|
|
|
14531
14764
|
"diagram",
|
|
14532
14765
|
"code"
|
|
14533
14766
|
],
|
|
14534
|
-
"description": "OPF placeholder kind. 'text' and 'list' are flexible textual content regions. The named kinds describe a specific content role used by pickers, AI generation, and engine defaulting."
|
|
14767
|
+
"description": "OPF placeholder kind. 'text' and 'list' are flexible textual content regions. 'metric' is a numeric/KPI content region filled by a metric payload, including its optional label, description, unit, delta, and trend. The named kinds describe a specific content role used by pickers, AI generation, and engine defaulting. 'picture' and legacy 'diagram' use image payloads; 'media' uses video. Quote and timeline use their corresponding payload fields."
|
|
14535
14768
|
}
|
|
14536
14769
|
}
|
|
14537
14770
|
},
|
|
@@ -15311,7 +15544,7 @@ var narrative = {
|
|
|
15311
15544
|
"quote",
|
|
15312
15545
|
"timeline"
|
|
15313
15546
|
],
|
|
15314
|
-
"description": "Default content kind for the beat's slide.
|
|
15547
|
+
"description": "Default content kind for the beat's slide. Uses ContentPayload.type names to help engines choose a layout. The legacy shape value is retained for compatibility and requests an image representation; it is not a native ContentPayload type."
|
|
15315
15548
|
},
|
|
15316
15549
|
"layoutHint": {
|
|
15317
15550
|
"type": "string",
|
|
@@ -16113,7 +16346,7 @@ var schemaEntries = [
|
|
|
16113
16346
|
{ name: "fontScheme", file: "schemas/font-scheme.schema.json", schema: fontScheme }
|
|
16114
16347
|
];
|
|
16115
16348
|
|
|
16116
|
-
// ../javascript/dist/chunk-
|
|
16349
|
+
// ../javascript/dist/chunk-6FU2KICU.js
|
|
16117
16350
|
init_define_OPF_SKILLS();
|
|
16118
16351
|
var audiences = [
|
|
16119
16352
|
{
|
|
@@ -17293,7 +17526,7 @@ var layouts = [
|
|
|
17293
17526
|
"type": "title"
|
|
17294
17527
|
},
|
|
17295
17528
|
{
|
|
17296
|
-
"type": "
|
|
17529
|
+
"type": "metric"
|
|
17297
17530
|
}
|
|
17298
17531
|
]
|
|
17299
17532
|
},
|
|
@@ -17306,10 +17539,10 @@ var layouts = [
|
|
|
17306
17539
|
"type": "title"
|
|
17307
17540
|
},
|
|
17308
17541
|
{
|
|
17309
|
-
"type": "
|
|
17542
|
+
"type": "metric"
|
|
17310
17543
|
},
|
|
17311
17544
|
{
|
|
17312
|
-
"type": "
|
|
17545
|
+
"type": "metric"
|
|
17313
17546
|
}
|
|
17314
17547
|
],
|
|
17315
17548
|
"composition": {
|
|
@@ -17325,13 +17558,13 @@ var layouts = [
|
|
|
17325
17558
|
"type": "title"
|
|
17326
17559
|
},
|
|
17327
17560
|
{
|
|
17328
|
-
"type": "
|
|
17561
|
+
"type": "metric"
|
|
17329
17562
|
},
|
|
17330
17563
|
{
|
|
17331
|
-
"type": "
|
|
17564
|
+
"type": "metric"
|
|
17332
17565
|
},
|
|
17333
17566
|
{
|
|
17334
|
-
"type": "
|
|
17567
|
+
"type": "metric"
|
|
17335
17568
|
}
|
|
17336
17569
|
],
|
|
17337
17570
|
"composition": {
|
|
@@ -17347,16 +17580,16 @@ var layouts = [
|
|
|
17347
17580
|
"type": "title"
|
|
17348
17581
|
},
|
|
17349
17582
|
{
|
|
17350
|
-
"type": "
|
|
17583
|
+
"type": "metric"
|
|
17351
17584
|
},
|
|
17352
17585
|
{
|
|
17353
|
-
"type": "
|
|
17586
|
+
"type": "metric"
|
|
17354
17587
|
},
|
|
17355
17588
|
{
|
|
17356
|
-
"type": "
|
|
17589
|
+
"type": "metric"
|
|
17357
17590
|
},
|
|
17358
17591
|
{
|
|
17359
|
-
"type": "
|
|
17592
|
+
"type": "metric"
|
|
17360
17593
|
}
|
|
17361
17594
|
],
|
|
17362
17595
|
"composition": {
|
|
@@ -17373,19 +17606,19 @@ var layouts = [
|
|
|
17373
17606
|
"type": "title"
|
|
17374
17607
|
},
|
|
17375
17608
|
{
|
|
17376
|
-
"type": "
|
|
17609
|
+
"type": "metric"
|
|
17377
17610
|
},
|
|
17378
17611
|
{
|
|
17379
|
-
"type": "
|
|
17612
|
+
"type": "metric"
|
|
17380
17613
|
},
|
|
17381
17614
|
{
|
|
17382
|
-
"type": "
|
|
17615
|
+
"type": "metric"
|
|
17383
17616
|
},
|
|
17384
17617
|
{
|
|
17385
|
-
"type": "
|
|
17618
|
+
"type": "metric"
|
|
17386
17619
|
},
|
|
17387
17620
|
{
|
|
17388
|
-
"type": "
|
|
17621
|
+
"type": "metric"
|
|
17389
17622
|
}
|
|
17390
17623
|
],
|
|
17391
17624
|
"composition": {
|
|
@@ -17402,22 +17635,22 @@ var layouts = [
|
|
|
17402
17635
|
"type": "title"
|
|
17403
17636
|
},
|
|
17404
17637
|
{
|
|
17405
|
-
"type": "
|
|
17638
|
+
"type": "metric"
|
|
17406
17639
|
},
|
|
17407
17640
|
{
|
|
17408
|
-
"type": "
|
|
17641
|
+
"type": "metric"
|
|
17409
17642
|
},
|
|
17410
17643
|
{
|
|
17411
|
-
"type": "
|
|
17644
|
+
"type": "metric"
|
|
17412
17645
|
},
|
|
17413
17646
|
{
|
|
17414
|
-
"type": "
|
|
17647
|
+
"type": "metric"
|
|
17415
17648
|
},
|
|
17416
17649
|
{
|
|
17417
|
-
"type": "
|
|
17650
|
+
"type": "metric"
|
|
17418
17651
|
},
|
|
17419
17652
|
{
|
|
17420
|
-
"type": "
|
|
17653
|
+
"type": "metric"
|
|
17421
17654
|
}
|
|
17422
17655
|
],
|
|
17423
17656
|
"composition": {
|
|
@@ -17425,6 +17658,19 @@ var layouts = [
|
|
|
17425
17658
|
"columns": 3
|
|
17426
17659
|
}
|
|
17427
17660
|
},
|
|
17661
|
+
{
|
|
17662
|
+
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
|
|
17663
|
+
"id": "quote-1x",
|
|
17664
|
+
"name": "Quote 1x",
|
|
17665
|
+
"placeholders": [
|
|
17666
|
+
{
|
|
17667
|
+
"type": "title"
|
|
17668
|
+
},
|
|
17669
|
+
{
|
|
17670
|
+
"type": "quote"
|
|
17671
|
+
}
|
|
17672
|
+
]
|
|
17673
|
+
},
|
|
17428
17674
|
{
|
|
17429
17675
|
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
|
|
17430
17676
|
"id": "table-1x",
|
|
@@ -17498,6 +17744,19 @@ var layouts = [
|
|
|
17498
17744
|
"mode": "row"
|
|
17499
17745
|
}
|
|
17500
17746
|
},
|
|
17747
|
+
{
|
|
17748
|
+
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
|
|
17749
|
+
"id": "timeline-1x",
|
|
17750
|
+
"name": "Timeline 1x",
|
|
17751
|
+
"placeholders": [
|
|
17752
|
+
{
|
|
17753
|
+
"type": "title"
|
|
17754
|
+
},
|
|
17755
|
+
{
|
|
17756
|
+
"type": "timeline"
|
|
17757
|
+
}
|
|
17758
|
+
]
|
|
17759
|
+
},
|
|
17501
17760
|
{
|
|
17502
17761
|
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
|
|
17503
17762
|
"id": "title",
|
|
@@ -25302,7 +25561,7 @@ var narratives = [
|
|
|
25302
25561
|
"id": "hook",
|
|
25303
25562
|
"name": "Hook",
|
|
25304
25563
|
"description": "Open with a striking question, statistic, customer quote, or moment that earns the audience's attention. The goal is to make them want to hear what comes next, not to convey information.",
|
|
25305
|
-
"layoutHint": "title
|
|
25564
|
+
"layoutHint": "title"
|
|
25306
25565
|
},
|
|
25307
25566
|
{
|
|
25308
25567
|
"id": "problem",
|
|
@@ -25333,7 +25592,7 @@ var narratives = [
|
|
|
25333
25592
|
"id": "ask",
|
|
25334
25593
|
"name": "The Ask",
|
|
25335
25594
|
"description": "State a clear, specific call to action. What do you want the audience to do, decide, or commit to next? Make the smallest credible ask that moves things forward, and make it unambiguous.",
|
|
25336
|
-
"layoutHint": "title
|
|
25595
|
+
"layoutHint": "title"
|
|
25337
25596
|
}
|
|
25338
25597
|
]
|
|
25339
25598
|
},
|
|
@@ -25378,7 +25637,7 @@ var narratives = [
|
|
|
25378
25637
|
"id": "answer",
|
|
25379
25638
|
"name": "Answer",
|
|
25380
25639
|
"description": "Deliver the recommendation in a single sentence, up front. No arguments yet, no caveats \u2014 just the conclusion the rest of the deck will defend. This is the apex of the Minto pyramid; everything that follows supports it.",
|
|
25381
|
-
"layoutHint": "title
|
|
25640
|
+
"layoutHint": "title"
|
|
25382
25641
|
},
|
|
25383
25642
|
{
|
|
25384
25643
|
"id": "key-arguments",
|
|
@@ -25449,7 +25708,7 @@ var narratives = [
|
|
|
25449
25708
|
"id": "ask",
|
|
25450
25709
|
"name": "Call to Action",
|
|
25451
25710
|
"description": "Close with the single decision you want the audience to make. Frame it as the obvious next move given the shift, the stakes, and the new game. Make it small enough to say yes to today and large enough to start a real engagement.",
|
|
25452
|
-
"layoutHint": "title
|
|
25711
|
+
"layoutHint": "title"
|
|
25453
25712
|
}
|
|
25454
25713
|
]
|
|
25455
25714
|
},
|
|
@@ -25499,7 +25758,7 @@ var narratives = [
|
|
|
25499
25758
|
"id": "invitation",
|
|
25500
25759
|
"name": "Invitation",
|
|
25501
25760
|
"description": "Close by inviting the audience to share the belief \u2014 to buy, build, join, or evangelize. The strongest invitations don't argue; they assume alignment and offer a way in.",
|
|
25502
|
-
"layoutHint": "title
|
|
25761
|
+
"layoutHint": "title"
|
|
25503
25762
|
}
|
|
25504
25763
|
]
|
|
25505
25764
|
},
|
|
@@ -25553,7 +25812,7 @@ var narratives = [
|
|
|
25553
25812
|
"id": "recap",
|
|
25554
25813
|
"name": "Recap",
|
|
25555
25814
|
"description": "Restate the promise, the mechanism, and the call to action in a single short slide. Give the audience the line they'll repeat to a colleague and the one image that will stick with them after the lights come up.",
|
|
25556
|
-
"layoutHint": "title
|
|
25815
|
+
"layoutHint": "title"
|
|
25557
25816
|
}
|
|
25558
25817
|
]
|
|
25559
25818
|
},
|
|
@@ -25603,7 +25862,7 @@ var narratives = [
|
|
|
25603
25862
|
"id": "ask",
|
|
25604
25863
|
"name": "Ask",
|
|
25605
25864
|
"description": "Close with the single low-friction action that starts the audience across the bridge. Make it small enough to act on now and meaningful enough to count as commitment.",
|
|
25606
|
-
"layoutHint": "title
|
|
25865
|
+
"layoutHint": "title"
|
|
25607
25866
|
}
|
|
25608
25867
|
]
|
|
25609
25868
|
},
|
|
@@ -25633,7 +25892,7 @@ var narratives = [
|
|
|
25633
25892
|
"id": "opening",
|
|
25634
25893
|
"name": "Opening",
|
|
25635
25894
|
"description": "Open with the company name, logo, and a one-line tagline that doubles as a positioning statement. Set the visual tone for the deck. Keep it confident and uncluttered \u2014 this is the cover.",
|
|
25636
|
-
"layoutHint": "title
|
|
25895
|
+
"layoutHint": "title"
|
|
25637
25896
|
},
|
|
25638
25897
|
{
|
|
25639
25898
|
"id": "purpose",
|
|
@@ -25704,13 +25963,13 @@ var narratives = [
|
|
|
25704
25963
|
"id": "ask",
|
|
25705
25964
|
"name": "The Ask",
|
|
25706
25965
|
"description": "State the round size, intended use of funds, and what milestones the capital takes you to. Be specific \u2014 investors should leave knowing exactly what you want and what they get.",
|
|
25707
|
-
"layoutHint": "title
|
|
25966
|
+
"layoutHint": "title"
|
|
25708
25967
|
},
|
|
25709
25968
|
{
|
|
25710
25969
|
"id": "closing",
|
|
25711
25970
|
"name": "Closing",
|
|
25712
25971
|
"description": "Close on a strong final image: logo, contact info, and the one line you most want the investor to remember. Leave space for the conversation that follows.",
|
|
25713
|
-
"layoutHint": "title
|
|
25972
|
+
"layoutHint": "title"
|
|
25714
25973
|
}
|
|
25715
25974
|
]
|
|
25716
25975
|
},
|
|
@@ -25739,7 +25998,7 @@ var narratives = [
|
|
|
25739
25998
|
"id": "logo",
|
|
25740
25999
|
"name": "Logo",
|
|
25741
26000
|
"description": "Cover slide with the company name, logo, and one-line positioning. Simple, branded, confident.",
|
|
25742
|
-
"layoutHint": "title
|
|
26001
|
+
"layoutHint": "title",
|
|
25743
26002
|
"instructions": "Establish presence",
|
|
25744
26003
|
"slideType": "text"
|
|
25745
26004
|
},
|
|
@@ -25749,7 +26008,7 @@ var narratives = [
|
|
|
25749
26008
|
"description": "Open by naming a large, undeniable shift in the world. Tech, regulatory, behavioral. The shift is the reason this company exists \u2014 investors should feel its weight before they hear about the product.",
|
|
25750
26009
|
"instructions": "Highlight market transformation",
|
|
25751
26010
|
"slideType": "text",
|
|
25752
|
-
"layoutHint": "text-1x
|
|
26011
|
+
"layoutHint": "text-1x"
|
|
25753
26012
|
},
|
|
25754
26013
|
{
|
|
25755
26014
|
"id": "past-struggle",
|
|
@@ -25757,7 +26016,7 @@ var narratives = [
|
|
|
25757
26016
|
"description": "Show what the world tried to do about the problem before the shift, and why those approaches fell short. Honest credit to predecessors makes the new game more credible.",
|
|
25758
26017
|
"instructions": "Emphasize previous challenges",
|
|
25759
26018
|
"slideType": "text",
|
|
25760
|
-
"layoutHint": "text-1x
|
|
26019
|
+
"layoutHint": "text-1x"
|
|
25761
26020
|
},
|
|
25762
26021
|
{
|
|
25763
26022
|
"id": "innovative-breakthrough",
|
|
@@ -25765,7 +26024,7 @@ var narratives = [
|
|
|
25765
26024
|
"description": "Present the founding insight or breakthrough that makes a new approach possible. This is the 'secret' the company is built on \u2014 name it plainly.",
|
|
25766
26025
|
"instructions": "Present innovative solution",
|
|
25767
26026
|
"slideType": "text",
|
|
25768
|
-
"layoutHint": "text-1x
|
|
26027
|
+
"layoutHint": "text-1x"
|
|
25769
26028
|
},
|
|
25770
26029
|
{
|
|
25771
26030
|
"id": "unique-offering",
|
|
@@ -25773,7 +26032,7 @@ var narratives = [
|
|
|
25773
26032
|
"description": "Detail the product or service. Lead with the customer-visible thing they touch; the architecture can wait. Show why this offering is structurally different from the past struggle.",
|
|
25774
26033
|
"instructions": "Detail product or service",
|
|
25775
26034
|
"slideType": "text",
|
|
25776
|
-
"layoutHint": "text-1x
|
|
26035
|
+
"layoutHint": "text-1x"
|
|
25777
26036
|
},
|
|
25778
26037
|
{
|
|
25779
26038
|
"id": "costly-issues",
|
|
@@ -25781,7 +26040,7 @@ var narratives = [
|
|
|
25781
26040
|
"description": "Quantify the pain customers experience without your offering. Time, dollars, opportunity cost. Specific numbers convert sympathy into urgency.",
|
|
25782
26041
|
"instructions": "Quantify problems faced",
|
|
25783
26042
|
"slideType": "text",
|
|
25784
|
-
"layoutHint": "text-1x
|
|
26043
|
+
"layoutHint": "text-1x"
|
|
25785
26044
|
},
|
|
25786
26045
|
{
|
|
25787
26046
|
"id": "effective-solutions",
|
|
@@ -25789,7 +26048,7 @@ var narratives = [
|
|
|
25789
26048
|
"description": "Demonstrate the customer outcome your offering produces. Before/after numbers from early users, even small N. Early-stage pitches are won by leading indicators, not by trailing ones.",
|
|
25790
26049
|
"instructions": "Demonstrate benefits",
|
|
25791
26050
|
"slideType": "text",
|
|
25792
|
-
"layoutHint": "text-1x
|
|
26051
|
+
"layoutHint": "text-1x"
|
|
25793
26052
|
},
|
|
25794
26053
|
{
|
|
25795
26054
|
"id": "unit-economics",
|
|
@@ -25797,7 +26056,7 @@ var narratives = [
|
|
|
25797
26056
|
"description": "Explain the financial model. Cost to acquire, gross margin, payback. Investors don't expect maturity \u2014 they expect that you've thought about it.",
|
|
25798
26057
|
"instructions": "Explain financial model",
|
|
25799
26058
|
"slideType": "text",
|
|
25800
|
-
"layoutHint": "text-1x
|
|
26059
|
+
"layoutHint": "text-1x"
|
|
25801
26060
|
},
|
|
25802
26061
|
{
|
|
25803
26062
|
"id": "talented-team",
|
|
@@ -25805,7 +26064,7 @@ var narratives = [
|
|
|
25805
26064
|
"description": "Introduce the founders and key early hires. Show why this team uniquely sees and can execute on this opportunity. Insight beats r\xE9sum\xE9 at the seed stage.",
|
|
25806
26065
|
"instructions": "Introduce key players",
|
|
25807
26066
|
"slideType": "text",
|
|
25808
|
-
"layoutHint": "text-1x
|
|
26067
|
+
"layoutHint": "text-1x"
|
|
25809
26068
|
},
|
|
25810
26069
|
{
|
|
25811
26070
|
"id": "traction",
|
|
@@ -25813,7 +26072,7 @@ var narratives = [
|
|
|
25813
26072
|
"description": "Showcase the early signal: pilots, design partners, waitlist, retention data, anything credible. Frame it honestly \u2014 investors at this stage discount inflation aggressively.",
|
|
25814
26073
|
"instructions": "Showcase accomplishments",
|
|
25815
26074
|
"slideType": "text",
|
|
25816
|
-
"layoutHint": "text-1x
|
|
26075
|
+
"layoutHint": "text-1x"
|
|
25817
26076
|
},
|
|
25818
26077
|
{
|
|
25819
26078
|
"id": "investment-opportunity",
|
|
@@ -25821,13 +26080,13 @@ var narratives = [
|
|
|
25821
26080
|
"description": "Detail the round size, structure, and use of funds. Tie the raise to specific milestones it takes the company to. Specificity here signals operational maturity.",
|
|
25822
26081
|
"instructions": "Detail funding needs",
|
|
25823
26082
|
"slideType": "text",
|
|
25824
|
-
"layoutHint": "text-1x
|
|
26083
|
+
"layoutHint": "text-1x"
|
|
25825
26084
|
},
|
|
25826
26085
|
{
|
|
25827
26086
|
"id": "closing-logo",
|
|
25828
26087
|
"name": "Closing Logo",
|
|
25829
26088
|
"description": "Close on the brand and contact info. Leave the room with the line you most want repeated when the partner pitches you to the rest of the firm.",
|
|
25830
|
-
"layoutHint": "title
|
|
26089
|
+
"layoutHint": "title",
|
|
25831
26090
|
"instructions": "Leave a lasting impression",
|
|
25832
26091
|
"slideType": "text"
|
|
25833
26092
|
}
|
|
@@ -25861,84 +26120,84 @@ var narratives = [
|
|
|
25861
26120
|
"name": "Opening",
|
|
25862
26121
|
"instructions": "Establish identity",
|
|
25863
26122
|
"slideType": "text",
|
|
25864
|
-
"layoutHint": "text-1x
|
|
26123
|
+
"layoutHint": "text-1x"
|
|
25865
26124
|
},
|
|
25866
26125
|
{
|
|
25867
26126
|
"id": "purpose",
|
|
25868
26127
|
"name": "Purpose",
|
|
25869
26128
|
"instructions": "State your mission",
|
|
25870
26129
|
"slideType": "text",
|
|
25871
|
-
"layoutHint": "text-1x
|
|
26130
|
+
"layoutHint": "text-1x"
|
|
25872
26131
|
},
|
|
25873
26132
|
{
|
|
25874
26133
|
"id": "problem",
|
|
25875
26134
|
"name": "Problem",
|
|
25876
26135
|
"instructions": "Present the challenge",
|
|
25877
26136
|
"slideType": "text",
|
|
25878
|
-
"layoutHint": "text-1x
|
|
26137
|
+
"layoutHint": "text-1x"
|
|
25879
26138
|
},
|
|
25880
26139
|
{
|
|
25881
26140
|
"id": "solution",
|
|
25882
26141
|
"name": "Solution",
|
|
25883
26142
|
"instructions": "Propose your idea",
|
|
25884
26143
|
"slideType": "text",
|
|
25885
|
-
"layoutHint": "text-1x
|
|
26144
|
+
"layoutHint": "text-1x"
|
|
25886
26145
|
},
|
|
25887
26146
|
{
|
|
25888
26147
|
"id": "why-now",
|
|
25889
26148
|
"name": "Why Now",
|
|
25890
26149
|
"instructions": "Explain timing importance",
|
|
25891
26150
|
"slideType": "text",
|
|
25892
|
-
"layoutHint": "text-1x
|
|
26151
|
+
"layoutHint": "text-1x"
|
|
25893
26152
|
},
|
|
25894
26153
|
{
|
|
25895
26154
|
"id": "market-size",
|
|
25896
26155
|
"name": "Market Size",
|
|
25897
26156
|
"instructions": "Demonstrate potential",
|
|
25898
26157
|
"slideType": "text",
|
|
25899
|
-
"layoutHint": "text-1x
|
|
26158
|
+
"layoutHint": "text-1x"
|
|
25900
26159
|
},
|
|
25901
26160
|
{
|
|
25902
26161
|
"id": "competition",
|
|
25903
26162
|
"name": "Competition",
|
|
25904
26163
|
"instructions": "Analyze competitive landscape",
|
|
25905
26164
|
"slideType": "text",
|
|
25906
|
-
"layoutHint": "text-1x
|
|
26165
|
+
"layoutHint": "text-1x"
|
|
25907
26166
|
},
|
|
25908
26167
|
{
|
|
25909
26168
|
"id": "product",
|
|
25910
26169
|
"name": "Product",
|
|
25911
26170
|
"instructions": "Showcase features/benefits",
|
|
25912
26171
|
"slideType": "text",
|
|
25913
|
-
"layoutHint": "text-1x
|
|
26172
|
+
"layoutHint": "text-1x"
|
|
25914
26173
|
},
|
|
25915
26174
|
{
|
|
25916
26175
|
"id": "business-model",
|
|
25917
26176
|
"name": "Business Model",
|
|
25918
26177
|
"instructions": "Detail revenue streams",
|
|
25919
26178
|
"slideType": "text",
|
|
25920
|
-
"layoutHint": "text-1x
|
|
26179
|
+
"layoutHint": "text-1x"
|
|
25921
26180
|
},
|
|
25922
26181
|
{
|
|
25923
26182
|
"id": "team",
|
|
25924
26183
|
"name": "Team",
|
|
25925
26184
|
"instructions": "Highlight key members",
|
|
25926
26185
|
"slideType": "text",
|
|
25927
|
-
"layoutHint": "text-1x
|
|
26186
|
+
"layoutHint": "text-1x"
|
|
25928
26187
|
},
|
|
25929
26188
|
{
|
|
25930
26189
|
"id": "financials",
|
|
25931
26190
|
"name": "Financials",
|
|
25932
26191
|
"instructions": "Show projections/needs",
|
|
25933
26192
|
"slideType": "text",
|
|
25934
|
-
"layoutHint": "text-1x
|
|
26193
|
+
"layoutHint": "text-1x"
|
|
25935
26194
|
},
|
|
25936
26195
|
{
|
|
25937
26196
|
"id": "closing",
|
|
25938
26197
|
"name": "Closing",
|
|
25939
26198
|
"instructions": "Reinforce brand",
|
|
25940
26199
|
"slideType": "text",
|
|
25941
|
-
"layoutHint": "text-1x
|
|
26200
|
+
"layoutHint": "text-1x"
|
|
25942
26201
|
}
|
|
25943
26202
|
]
|
|
25944
26203
|
},
|
|
@@ -25969,7 +26228,7 @@ var narratives = [
|
|
|
25969
26228
|
"description": "Open with a brief framing of who you are and why this conversation is worth the prospect's next thirty minutes. Keep credentials short; the audience cares about their problem, not your r\xE9sum\xE9.",
|
|
25970
26229
|
"instructions": "Name & logo",
|
|
25971
26230
|
"slideType": "text",
|
|
25972
|
-
"layoutHint": "text-1x
|
|
26231
|
+
"layoutHint": "text-1x"
|
|
25973
26232
|
},
|
|
25974
26233
|
{
|
|
25975
26234
|
"id": "big-change",
|
|
@@ -25977,7 +26236,7 @@ var narratives = [
|
|
|
25977
26236
|
"description": "Name the market shift the prospect's industry is living through. Make it concrete, recent, and undeniable. The change \u2014 not the product \u2014 is the reason they should care.",
|
|
25978
26237
|
"instructions": "Highlight market shift",
|
|
25979
26238
|
"slideType": "text",
|
|
25980
|
-
"layoutHint": "text-1x
|
|
26239
|
+
"layoutHint": "text-1x"
|
|
25981
26240
|
},
|
|
25982
26241
|
{
|
|
25983
26242
|
"id": "response-to-change",
|
|
@@ -25985,7 +26244,7 @@ var narratives = [
|
|
|
25985
26244
|
"description": "Show how the change is creating winners and losers in the prospect's space. Use named examples where you can. The goal is for the prospect to wonder which side they'll end up on.",
|
|
25986
26245
|
"instructions": "Show winners & losers",
|
|
25987
26246
|
"slideType": "text",
|
|
25988
|
-
"layoutHint": "text-1x
|
|
26247
|
+
"layoutHint": "text-1x"
|
|
25989
26248
|
},
|
|
25990
26249
|
{
|
|
25991
26250
|
"id": "benefits",
|
|
@@ -25993,7 +26252,7 @@ var narratives = [
|
|
|
25993
26252
|
"description": "Paint the outcome a winner experiences: a vivid picture of the prospect's life on the other side of the change. Lead with what changes for them, not with what your product does.",
|
|
25994
26253
|
"instructions": "Describe benefits, paint a vivid picture",
|
|
25995
26254
|
"slideType": "text",
|
|
25996
|
-
"layoutHint": "text-1x
|
|
26255
|
+
"layoutHint": "text-1x"
|
|
25997
26256
|
},
|
|
25998
26257
|
{
|
|
25999
26258
|
"id": "capabilities",
|
|
@@ -26001,7 +26260,7 @@ var narratives = [
|
|
|
26001
26260
|
"description": "Reveal the unique capabilities that make those outcomes possible. Frame them as the 'magic gifts' the prospect needs to win the new game. Highlight what's structurally different from the alternatives.",
|
|
26002
26261
|
"instructions": "Present unique features as 'magic gifts' to the customer",
|
|
26003
26262
|
"slideType": "text",
|
|
26004
|
-
"layoutHint": "text-1x
|
|
26263
|
+
"layoutHint": "text-1x"
|
|
26005
26264
|
},
|
|
26006
26265
|
{
|
|
26007
26266
|
"id": "evidence",
|
|
@@ -26009,13 +26268,13 @@ var narratives = [
|
|
|
26009
26268
|
"description": "Share customer testimonials, case studies, and measurable outcomes from organizations like the prospect's. Pick evidence that maps to the benefits you promised, not generic logos.",
|
|
26010
26269
|
"instructions": "Share testimonials",
|
|
26011
26270
|
"slideType": "text",
|
|
26012
|
-
"layoutHint": "text-1x
|
|
26271
|
+
"layoutHint": "text-1x"
|
|
26013
26272
|
},
|
|
26014
26273
|
{
|
|
26015
26274
|
"id": "call-to-action",
|
|
26016
26275
|
"name": "Call to Action",
|
|
26017
26276
|
"description": "Ask for the next step in the sales process. Be specific: a pilot, a workshop, a follow-on conversation with a named stakeholder. Make the smallest credible commitment that keeps momentum.",
|
|
26018
|
-
"layoutHint": "title
|
|
26277
|
+
"layoutHint": "title",
|
|
26019
26278
|
"instructions": "Encourage decision-making",
|
|
26020
26279
|
"slideType": "text"
|
|
26021
26280
|
},
|
|
@@ -26023,7 +26282,7 @@ var narratives = [
|
|
|
26023
26282
|
"id": "close",
|
|
26024
26283
|
"name": "Close",
|
|
26025
26284
|
"description": "Close with a final image and contact path. Leave the prospect with one line about why they're better off acting now than later, and clear instructions for how to engage.",
|
|
26026
|
-
"layoutHint": "title
|
|
26285
|
+
"layoutHint": "title",
|
|
26027
26286
|
"instructions": "Logo & contact info",
|
|
26028
26287
|
"slideType": "text"
|
|
26029
26288
|
}
|
|
@@ -26055,7 +26314,7 @@ var narratives = [
|
|
|
26055
26314
|
"id": "logo",
|
|
26056
26315
|
"name": "Logo",
|
|
26057
26316
|
"description": "Cover slide with the logo, tagline, and a single line of positioning. Set the visual tone \u2014 confident, branded, uncluttered.",
|
|
26058
|
-
"layoutHint": "title
|
|
26317
|
+
"layoutHint": "title",
|
|
26059
26318
|
"instructions": "Establish brand identity",
|
|
26060
26319
|
"slideType": "text"
|
|
26061
26320
|
},
|
|
@@ -26065,7 +26324,7 @@ var narratives = [
|
|
|
26065
26324
|
"description": "Capture the company in three or four lines: what you do, who you do it for, and how long you've been at it. Avoid jargon; an outsider should grok the business in fifteen seconds.",
|
|
26066
26325
|
"instructions": "Capture attention",
|
|
26067
26326
|
"slideType": "text",
|
|
26068
|
-
"layoutHint": "text-1x
|
|
26327
|
+
"layoutHint": "text-1x"
|
|
26069
26328
|
},
|
|
26070
26329
|
{
|
|
26071
26330
|
"id": "competitive-advantage",
|
|
@@ -26073,7 +26332,7 @@ var narratives = [
|
|
|
26073
26332
|
"description": "State the one or two things you do that the alternatives can't. Frame it as a structural advantage, not a feature list. The audience should leave able to repeat the differentiator in their own words.",
|
|
26074
26333
|
"instructions": "Stand out",
|
|
26075
26334
|
"slideType": "text",
|
|
26076
|
-
"layoutHint": "text-1x
|
|
26335
|
+
"layoutHint": "text-1x"
|
|
26077
26336
|
},
|
|
26078
26337
|
{
|
|
26079
26338
|
"id": "company-story",
|
|
@@ -26081,7 +26340,7 @@ var narratives = [
|
|
|
26081
26340
|
"description": "Share the founding insight or origin moment \u2014 why this company exists, told as a short story. Specific people, specific problems, a specific 'aha.' Story beats biography.",
|
|
26082
26341
|
"instructions": "Share origin",
|
|
26083
26342
|
"slideType": "text",
|
|
26084
|
-
"layoutHint": "text-1x
|
|
26343
|
+
"layoutHint": "text-1x"
|
|
26085
26344
|
},
|
|
26086
26345
|
{
|
|
26087
26346
|
"id": "offerings",
|
|
@@ -26089,7 +26348,7 @@ var narratives = [
|
|
|
26089
26348
|
"description": "Map the products and services into a coherent picture. Show how they fit together rather than listing them flat. The shape of the portfolio is itself a message.",
|
|
26090
26349
|
"instructions": "Highlight products/services",
|
|
26091
26350
|
"slideType": "text",
|
|
26092
|
-
"layoutHint": "text-1x
|
|
26351
|
+
"layoutHint": "text-1x"
|
|
26093
26352
|
},
|
|
26094
26353
|
{
|
|
26095
26354
|
"id": "ideal-customer",
|
|
@@ -26097,7 +26356,7 @@ var narratives = [
|
|
|
26097
26356
|
"description": "Define who you serve best. Industry, size, role, situation. Specificity here helps the audience self-select and signals you understand the customer well enough to be choosy.",
|
|
26098
26357
|
"instructions": "Define target market",
|
|
26099
26358
|
"slideType": "text",
|
|
26100
|
-
"layoutHint": "text-1x
|
|
26359
|
+
"layoutHint": "text-1x"
|
|
26101
26360
|
},
|
|
26102
26361
|
{
|
|
26103
26362
|
"id": "key-benefits",
|
|
@@ -26105,7 +26364,7 @@ var narratives = [
|
|
|
26105
26364
|
"description": "Translate offerings into three to five customer outcomes. Lead with the result, not the mechanism. Each benefit should answer 'what becomes easier or better for me?'",
|
|
26106
26365
|
"instructions": "Emphasize value",
|
|
26107
26366
|
"slideType": "text",
|
|
26108
|
-
"layoutHint": "text-1x
|
|
26367
|
+
"layoutHint": "text-1x"
|
|
26109
26368
|
},
|
|
26110
26369
|
{
|
|
26111
26370
|
"id": "success-story",
|
|
@@ -26113,13 +26372,13 @@ var narratives = [
|
|
|
26113
26372
|
"description": "Tell one named customer's story with concrete before/after metrics. A single specific story is more persuasive than a logo grid; pick one that mirrors the audience you're presenting to.",
|
|
26114
26373
|
"instructions": "Showcase satisfied customer",
|
|
26115
26374
|
"slideType": "text",
|
|
26116
|
-
"layoutHint": "text-1x
|
|
26375
|
+
"layoutHint": "text-1x"
|
|
26117
26376
|
},
|
|
26118
26377
|
{
|
|
26119
26378
|
"id": "closing-cta",
|
|
26120
26379
|
"name": "Closing & CTA",
|
|
26121
26380
|
"description": "Close with one line of why now and one specific next step \u2014 a discovery call, a pilot, a partner program. End with contact info that's easy to act on without searching.",
|
|
26122
|
-
"layoutHint": "title
|
|
26381
|
+
"layoutHint": "title",
|
|
26123
26382
|
"instructions": "Encourage action",
|
|
26124
26383
|
"slideType": "text"
|
|
26125
26384
|
}
|
|
@@ -26152,7 +26411,7 @@ var narratives = [
|
|
|
26152
26411
|
"description": "Open by establishing the product or service this strategy is for, and what window of time it covers. One slide that tells the audience exactly which world they're being asked to weigh in on.",
|
|
26153
26412
|
"instructions": "Establish product/service specifics",
|
|
26154
26413
|
"slideType": "text",
|
|
26155
|
-
"layoutHint": "text-1x
|
|
26414
|
+
"layoutHint": "text-1x"
|
|
26156
26415
|
},
|
|
26157
26416
|
{
|
|
26158
26417
|
"id": "objective",
|
|
@@ -26160,7 +26419,7 @@ var narratives = [
|
|
|
26160
26419
|
"description": "State the marketing goals in measurable terms: revenue, pipeline, awareness, share. Two or three goals, ranked. Goals without ranking get equal energy and equal mediocrity.",
|
|
26161
26420
|
"instructions": "Share marketing goals",
|
|
26162
26421
|
"slideType": "text",
|
|
26163
|
-
"layoutHint": "text-1x
|
|
26422
|
+
"layoutHint": "text-1x"
|
|
26164
26423
|
},
|
|
26165
26424
|
{
|
|
26166
26425
|
"id": "customer",
|
|
@@ -26168,7 +26427,7 @@ var narratives = [
|
|
|
26168
26427
|
"description": "Detail the target audience. Segments, jobs-to-be-done, decision criteria, where they live in the buying cycle. Specificity here is the foundation everything else stands on.",
|
|
26169
26428
|
"instructions": "Detail target audience",
|
|
26170
26429
|
"slideType": "text",
|
|
26171
|
-
"layoutHint": "text-1x
|
|
26430
|
+
"layoutHint": "text-1x"
|
|
26172
26431
|
},
|
|
26173
26432
|
{
|
|
26174
26433
|
"id": "market",
|
|
@@ -26176,7 +26435,7 @@ var narratives = [
|
|
|
26176
26435
|
"description": "Describe the market landscape: size, growth, segments, behavioral trends. Use external data for credibility and your own research for nuance. Show how the market is changing, not just how big it is.",
|
|
26177
26436
|
"instructions": "Discuss market landscape",
|
|
26178
26437
|
"slideType": "text",
|
|
26179
|
-
"layoutHint": "text-1x
|
|
26438
|
+
"layoutHint": "text-1x"
|
|
26180
26439
|
},
|
|
26181
26440
|
{
|
|
26182
26441
|
"id": "competition",
|
|
@@ -26184,7 +26443,7 @@ var narratives = [
|
|
|
26184
26443
|
"description": "Map the competitive set honestly. Direct, indirect, and substitutes. A 2x2 or feature-comparison framework helps; what matters is that the audience trusts your read of the field.",
|
|
26185
26444
|
"instructions": "Analyze competitive environment",
|
|
26186
26445
|
"slideType": "text",
|
|
26187
|
-
"layoutHint": "text-1x
|
|
26446
|
+
"layoutHint": "text-1x"
|
|
26188
26447
|
},
|
|
26189
26448
|
{
|
|
26190
26449
|
"id": "strategy",
|
|
@@ -26192,7 +26451,7 @@ var narratives = [
|
|
|
26192
26451
|
"description": "Articulate the marketing approach in one sentence and a single supporting frame. Positioning, primary motion, where you choose to play and not play. Clarity here is what makes the tactics that follow coherent.",
|
|
26193
26452
|
"instructions": "Elaborate marketing approach",
|
|
26194
26453
|
"slideType": "text",
|
|
26195
|
-
"layoutHint": "text-1x
|
|
26454
|
+
"layoutHint": "text-1x"
|
|
26196
26455
|
},
|
|
26197
26456
|
{
|
|
26198
26457
|
"id": "product",
|
|
@@ -26200,7 +26459,7 @@ var narratives = [
|
|
|
26200
26459
|
"description": "Highlight the unique value the product brings to the strategy. Lead with the customer outcome; tie it directly back to the customer beat. Avoid feature soup.",
|
|
26201
26460
|
"instructions": "Highlight unique value",
|
|
26202
26461
|
"slideType": "text",
|
|
26203
|
-
"layoutHint": "text-1x
|
|
26462
|
+
"layoutHint": "text-1x"
|
|
26204
26463
|
},
|
|
26205
26464
|
{
|
|
26206
26465
|
"id": "price",
|
|
@@ -26208,7 +26467,7 @@ var narratives = [
|
|
|
26208
26467
|
"description": "Justify pricing and packaging. Show the logic \u2014 cost-plus, value-based, competitor-anchored \u2014 and the levers you'll use over the period. Price decisions are strategy decisions.",
|
|
26209
26468
|
"instructions": "Justify pricing strategy",
|
|
26210
26469
|
"slideType": "text",
|
|
26211
|
-
"layoutHint": "text-1x
|
|
26470
|
+
"layoutHint": "text-1x"
|
|
26212
26471
|
},
|
|
26213
26472
|
{
|
|
26214
26473
|
"id": "place",
|
|
@@ -26216,7 +26475,7 @@ var narratives = [
|
|
|
26216
26475
|
"description": "Describe distribution channels and the role each plays. Direct, partner, marketplace, retail. Channel mix is often where strategies quietly succeed or fail.",
|
|
26217
26476
|
"instructions": "Discuss distribution channels",
|
|
26218
26477
|
"slideType": "text",
|
|
26219
|
-
"layoutHint": "text-1x
|
|
26478
|
+
"layoutHint": "text-1x"
|
|
26220
26479
|
},
|
|
26221
26480
|
{
|
|
26222
26481
|
"id": "promotion",
|
|
@@ -26224,13 +26483,13 @@ var narratives = [
|
|
|
26224
26483
|
"description": "Reveal the campaign and content tactics that bring the strategy to market. Pair each tactic with the audience and metric it serves. Avoid listing channels for their own sake.",
|
|
26225
26484
|
"instructions": "Reveal promotional tactics",
|
|
26226
26485
|
"slideType": "text",
|
|
26227
|
-
"layoutHint": "text-1x
|
|
26486
|
+
"layoutHint": "text-1x"
|
|
26228
26487
|
},
|
|
26229
26488
|
{
|
|
26230
26489
|
"id": "summary",
|
|
26231
26490
|
"name": "Summary",
|
|
26232
26491
|
"description": "Recap the strategy in a single page: customer, position, motion, expected outcome. End with the decision or commitment you need from the audience.",
|
|
26233
|
-
"layoutHint": "title
|
|
26492
|
+
"layoutHint": "title",
|
|
26234
26493
|
"instructions": "Recap key points",
|
|
26235
26494
|
"slideType": "text"
|
|
26236
26495
|
}
|
|
@@ -26262,7 +26521,7 @@ var narratives = [
|
|
|
26262
26521
|
"id": "opening",
|
|
26263
26522
|
"name": "Opening",
|
|
26264
26523
|
"description": "Open with the company brand and a confident visual. Set the tone \u2014 this is a moment, not a meeting. One slide that signals the audience is somewhere worth being.",
|
|
26265
|
-
"layoutHint": "title
|
|
26524
|
+
"layoutHint": "title",
|
|
26266
26525
|
"instructions": "Show company branding",
|
|
26267
26526
|
"slideType": "text"
|
|
26268
26527
|
},
|
|
@@ -26272,7 +26531,7 @@ var narratives = [
|
|
|
26272
26531
|
"description": "Hook the audience with the promise of the talk. Tell them, in one sentence, what they're about to see and why it matters to them. Specific promises buy patient audiences.",
|
|
26273
26532
|
"instructions": "Hook the audience",
|
|
26274
26533
|
"slideType": "text",
|
|
26275
|
-
"layoutHint": "text-1x
|
|
26534
|
+
"layoutHint": "text-1x"
|
|
26276
26535
|
},
|
|
26277
26536
|
{
|
|
26278
26537
|
"id": "context",
|
|
@@ -26280,7 +26539,7 @@ var narratives = [
|
|
|
26280
26539
|
"description": "Set the stage with the world the product enters. The customer reality, the market state, the unmet expectation. Context turns the launch from a product release into a moment in a larger story.",
|
|
26281
26540
|
"instructions": "Set the stage",
|
|
26282
26541
|
"slideType": "text",
|
|
26283
|
-
"layoutHint": "text-1x
|
|
26542
|
+
"layoutHint": "text-1x"
|
|
26284
26543
|
},
|
|
26285
26544
|
{
|
|
26286
26545
|
"id": "conflict",
|
|
@@ -26288,7 +26547,7 @@ var narratives = [
|
|
|
26288
26547
|
"description": "Introduce the villain \u2014 the problem, friction, or status quo the product opposes. Make the conflict concrete enough that the audience can name a moment they've felt it themselves.",
|
|
26289
26548
|
"instructions": "Introduce villain/problem",
|
|
26290
26549
|
"slideType": "text",
|
|
26291
|
-
"layoutHint": "text-1x
|
|
26550
|
+
"layoutHint": "text-1x"
|
|
26292
26551
|
},
|
|
26293
26552
|
{
|
|
26294
26553
|
"id": "stakes",
|
|
@@ -26296,7 +26555,7 @@ var narratives = [
|
|
|
26296
26555
|
"description": "Emphasize what's at risk if the conflict isn't resolved. Quantify, personalize, dramatize. Stakes are what convert a curious audience into an invested one.",
|
|
26297
26556
|
"instructions": "Emphasize importance",
|
|
26298
26557
|
"slideType": "text",
|
|
26299
|
-
"layoutHint": "text-1x
|
|
26558
|
+
"layoutHint": "text-1x"
|
|
26300
26559
|
},
|
|
26301
26560
|
{
|
|
26302
26561
|
"id": "reveal",
|
|
@@ -26304,7 +26563,7 @@ var narratives = [
|
|
|
26304
26563
|
"description": "Showcase the product. One striking visual, one defining capability, one sentence that captures what's new. Earn the applause line; don't bury it under a bullet list.",
|
|
26305
26564
|
"instructions": "Showcase the solution",
|
|
26306
26565
|
"slideType": "text",
|
|
26307
|
-
"layoutHint": "text-1x
|
|
26566
|
+
"layoutHint": "text-1x"
|
|
26308
26567
|
},
|
|
26309
26568
|
{
|
|
26310
26569
|
"id": "raise-stakes",
|
|
@@ -26312,7 +26571,7 @@ var narratives = [
|
|
|
26312
26571
|
"description": "Highlight where the alternatives fall short and what they cost the customer. Re-energize the room midway by sharpening the contrast with the reveal.",
|
|
26313
26572
|
"instructions": "Highlight shortcomings of alternatives",
|
|
26314
26573
|
"slideType": "text",
|
|
26315
|
-
"layoutHint": "text-1x
|
|
26574
|
+
"layoutHint": "text-1x"
|
|
26316
26575
|
},
|
|
26317
26576
|
{
|
|
26318
26577
|
"id": "raise-stakes-again",
|
|
@@ -26320,7 +26579,7 @@ var narratives = [
|
|
|
26320
26579
|
"description": "Reinforce why change is non-negotiable now. A second beat of stakes, framed differently \u2014 perhaps a customer voice or a future cost. Cement the reason to act.",
|
|
26321
26580
|
"instructions": "Reinforce the need for change",
|
|
26322
26581
|
"slideType": "text",
|
|
26323
|
-
"layoutHint": "text-1x
|
|
26582
|
+
"layoutHint": "text-1x"
|
|
26324
26583
|
},
|
|
26325
26584
|
{
|
|
26326
26585
|
"id": "sell",
|
|
@@ -26328,13 +26587,13 @@ var narratives = [
|
|
|
26328
26587
|
"description": "Make the audience want the product. Lead with the outcome it produces in their lives. Pricing, packaging, availability go here, but only after the desire is built.",
|
|
26329
26588
|
"instructions": "Make them want your solution",
|
|
26330
26589
|
"slideType": "text",
|
|
26331
|
-
"layoutHint": "text-1x
|
|
26590
|
+
"layoutHint": "text-1x"
|
|
26332
26591
|
},
|
|
26333
26592
|
{
|
|
26334
26593
|
"id": "cta",
|
|
26335
26594
|
"name": "Call to Action",
|
|
26336
26595
|
"description": "Close with the single action you want from the audience. Pre-order, sign up, attend, share. Make it simple, specific, and immediate.",
|
|
26337
|
-
"layoutHint": "title
|
|
26596
|
+
"layoutHint": "title",
|
|
26338
26597
|
"instructions": "Inspire action",
|
|
26339
26598
|
"slideType": "text"
|
|
26340
26599
|
}
|
|
@@ -26366,7 +26625,7 @@ var narratives = [
|
|
|
26366
26625
|
"id": "title",
|
|
26367
26626
|
"name": "Title",
|
|
26368
26627
|
"description": "Open with a one-line summary statement that captures the recommendation, not the topic. The title slide is the headline of the entire engagement \u2014 make it specific enough that someone reading only this slide already understands the position.",
|
|
26369
|
-
"layoutHint": "title
|
|
26628
|
+
"layoutHint": "title",
|
|
26370
26629
|
"instructions": "Brief summary sentence",
|
|
26371
26630
|
"slideType": "text"
|
|
26372
26631
|
},
|
|
@@ -26381,7 +26640,7 @@ var narratives = [
|
|
|
26381
26640
|
"description": "Deliver the recommendation in a single sentence. No arguments yet, no caveats. The answer is the apex of the pyramid; the rest of the deck supports it.",
|
|
26382
26641
|
"instructions": "A solution in one sentence, no arguments yet",
|
|
26383
26642
|
"slideType": "text",
|
|
26384
|
-
"layoutHint": "text-1x
|
|
26643
|
+
"layoutHint": "text-1x"
|
|
26385
26644
|
},
|
|
26386
26645
|
{
|
|
26387
26646
|
"id": "arguments",
|
|
@@ -26389,7 +26648,7 @@ var narratives = [
|
|
|
26389
26648
|
"description": "Preview the three top-level arguments that defend the answer. One slide naming all three so the audience knows where the deck is going. Each argument should be a complete claim, not a topic.",
|
|
26390
26649
|
"instructions": "Support the solution",
|
|
26391
26650
|
"slideType": "text",
|
|
26392
|
-
"layoutHint": "text-1x
|
|
26651
|
+
"layoutHint": "text-1x"
|
|
26393
26652
|
},
|
|
26394
26653
|
{
|
|
26395
26654
|
"id": "argument-1",
|
|
@@ -26397,7 +26656,7 @@ var narratives = [
|
|
|
26397
26656
|
"description": "Develop the first argument with supporting data, examples, and reasoning. Lead with the claim, then the evidence \u2014 Minto-style. The slide should stand alone if pulled out.",
|
|
26398
26657
|
"instructions": "First key point",
|
|
26399
26658
|
"slideType": "text",
|
|
26400
|
-
"layoutHint": "text-1x
|
|
26659
|
+
"layoutHint": "text-1x"
|
|
26401
26660
|
},
|
|
26402
26661
|
{
|
|
26403
26662
|
"id": "argument-2",
|
|
@@ -26405,7 +26664,7 @@ var narratives = [
|
|
|
26405
26664
|
"description": "Develop the second argument the same way. Vary the type of evidence \u2014 quantitative, qualitative, comparative \u2014 so the audience hears the case from multiple angles.",
|
|
26406
26665
|
"instructions": "Second key point",
|
|
26407
26666
|
"slideType": "text",
|
|
26408
|
-
"layoutHint": "text-1x
|
|
26667
|
+
"layoutHint": "text-1x"
|
|
26409
26668
|
},
|
|
26410
26669
|
{
|
|
26411
26670
|
"id": "argument-3",
|
|
@@ -26413,13 +26672,13 @@ var narratives = [
|
|
|
26413
26672
|
"description": "Develop the third argument and walk through the supporting process or methodology. This is often where the 'how' lives \u2014 the implementation insight that makes the recommendation feel actionable.",
|
|
26414
26673
|
"instructions": "Third key point with a process",
|
|
26415
26674
|
"slideType": "text",
|
|
26416
|
-
"layoutHint": "text-1x
|
|
26675
|
+
"layoutHint": "text-1x"
|
|
26417
26676
|
},
|
|
26418
26677
|
{
|
|
26419
26678
|
"id": "summary",
|
|
26420
26679
|
"name": "Summary",
|
|
26421
26680
|
"description": "Recap the answer and arguments in a single slide and point to additional resources. Close with the explicit next step you want the audience to take.",
|
|
26422
|
-
"layoutHint": "title
|
|
26681
|
+
"layoutHint": "title",
|
|
26423
26682
|
"instructions": "Recap the answer, provide additional resources",
|
|
26424
26683
|
"slideType": "text"
|
|
26425
26684
|
}
|
|
@@ -26453,7 +26712,7 @@ var narratives = [
|
|
|
26453
26712
|
"description": "Open with a specific, visible signal of the challenge \u2014 a metric heading the wrong way, a customer story, a competitive event. The hook should make the audience nod that yes, this matters.",
|
|
26454
26713
|
"instructions": "Capture audience attention",
|
|
26455
26714
|
"slideType": "text",
|
|
26456
|
-
"layoutHint": "text-1x
|
|
26715
|
+
"layoutHint": "text-1x"
|
|
26457
26716
|
},
|
|
26458
26717
|
{
|
|
26459
26718
|
"id": "dilemma",
|
|
@@ -26461,7 +26720,7 @@ var narratives = [
|
|
|
26461
26720
|
"description": "State the challenge plainly. What is failing, who is feeling it, and why has it now risen to a level that demands a decision? The dilemma must feel real, not academic.",
|
|
26462
26721
|
"instructions": "Present the problem",
|
|
26463
26722
|
"slideType": "text",
|
|
26464
|
-
"layoutHint": "text-1x
|
|
26723
|
+
"layoutHint": "text-1x"
|
|
26465
26724
|
},
|
|
26466
26725
|
{
|
|
26467
26726
|
"id": "backdrop",
|
|
@@ -26469,7 +26728,7 @@ var narratives = [
|
|
|
26469
26728
|
"description": "Provide the context behind the dilemma: how it formed, what's been tried, what constraints exist. Just enough history that the audience trusts your diagnosis without drowning in detail.",
|
|
26470
26729
|
"instructions": "Provide context",
|
|
26471
26730
|
"slideType": "text",
|
|
26472
|
-
"layoutHint": "text-1x
|
|
26731
|
+
"layoutHint": "text-1x"
|
|
26473
26732
|
},
|
|
26474
26733
|
{
|
|
26475
26734
|
"id": "remedy",
|
|
@@ -26477,7 +26736,7 @@ var narratives = [
|
|
|
26477
26736
|
"description": "Propose the resolution. Lead with the recommendation, then sketch the approach. Be opinionated \u2014 vague remedies invite vague responses.",
|
|
26478
26737
|
"instructions": "Propose a solution",
|
|
26479
26738
|
"slideType": "text",
|
|
26480
|
-
"layoutHint": "text-1x
|
|
26739
|
+
"layoutHint": "text-1x"
|
|
26481
26740
|
},
|
|
26482
26741
|
{
|
|
26483
26742
|
"id": "evidence",
|
|
@@ -26485,7 +26744,7 @@ var narratives = [
|
|
|
26485
26744
|
"description": "Demonstrate why the remedy will work. Comparable cases, supporting data, or pilot results. Choose evidence that addresses the audience's most likely objection, not the one easiest to answer.",
|
|
26486
26745
|
"instructions": "Demonstrate success",
|
|
26487
26746
|
"slideType": "text",
|
|
26488
|
-
"layoutHint": "text-1x
|
|
26747
|
+
"layoutHint": "text-1x"
|
|
26489
26748
|
},
|
|
26490
26749
|
{
|
|
26491
26750
|
"id": "motivate",
|
|
@@ -26493,13 +26752,13 @@ var narratives = [
|
|
|
26493
26752
|
"description": "Make the case for acting now. Quantify the cost of delay and the upside of decisive action. Help the audience picture the room a quarter from now if they say yes.",
|
|
26494
26753
|
"instructions": "Encourage action",
|
|
26495
26754
|
"slideType": "text",
|
|
26496
|
-
"layoutHint": "text-1x
|
|
26755
|
+
"layoutHint": "text-1x"
|
|
26497
26756
|
},
|
|
26498
26757
|
{
|
|
26499
26758
|
"id": "conclusion",
|
|
26500
26759
|
"name": "Conclusion",
|
|
26501
26760
|
"description": "Recap the challenge, the remedy, and the specific decision you need from the audience. End with a clear ask, not a summary slide.",
|
|
26502
|
-
"layoutHint": "title
|
|
26761
|
+
"layoutHint": "title",
|
|
26503
26762
|
"instructions": "Recap and end powerfully",
|
|
26504
26763
|
"slideType": "text"
|
|
26505
26764
|
}
|
|
@@ -26533,7 +26792,7 @@ var narratives = [
|
|
|
26533
26792
|
"description": "Open with the proposal in one slide: the project name, the audience, the goal, and the headline benefit. If a sponsor reads only this slide, they should still know what they're being asked to approve.",
|
|
26534
26793
|
"instructions": "Audience hook & objectives",
|
|
26535
26794
|
"slideType": "text",
|
|
26536
|
-
"layoutHint": "text-1x
|
|
26795
|
+
"layoutHint": "text-1x"
|
|
26537
26796
|
},
|
|
26538
26797
|
{
|
|
26539
26798
|
"id": "problem-statement",
|
|
@@ -26541,7 +26800,7 @@ var narratives = [
|
|
|
26541
26800
|
"description": "Articulate the problem this project solves and why it deserves resources now. Tie it to a known business goal or pain. Vague problems produce vague approvals.",
|
|
26542
26801
|
"instructions": "Highlight struggles & project necessity",
|
|
26543
26802
|
"slideType": "text",
|
|
26544
|
-
"layoutHint": "text-1x
|
|
26803
|
+
"layoutHint": "text-1x"
|
|
26545
26804
|
},
|
|
26546
26805
|
{
|
|
26547
26806
|
"id": "core-concept",
|
|
@@ -26549,7 +26808,7 @@ var narratives = [
|
|
|
26549
26808
|
"description": "Describe the central idea of the project in plain language. The 'what' before the 'how.' A reader should be able to repeat the concept in one sentence after this slide.",
|
|
26550
26809
|
"instructions": "Share actionable idea",
|
|
26551
26810
|
"slideType": "text",
|
|
26552
|
-
"layoutHint": "text-1x
|
|
26811
|
+
"layoutHint": "text-1x"
|
|
26553
26812
|
},
|
|
26554
26813
|
{
|
|
26555
26814
|
"id": "benefits",
|
|
@@ -26557,7 +26816,7 @@ var narratives = [
|
|
|
26557
26816
|
"description": "Quantify the impact: revenue, cost, risk, customer, capability. Use numbers where possible and clear comparisons where not. Each benefit should map to a metric the sponsor cares about.",
|
|
26558
26817
|
"instructions": "Spotlight key metrics",
|
|
26559
26818
|
"slideType": "text",
|
|
26560
|
-
"layoutHint": "text-1x
|
|
26819
|
+
"layoutHint": "text-1x"
|
|
26561
26820
|
},
|
|
26562
26821
|
{
|
|
26563
26822
|
"id": "justification",
|
|
@@ -26565,7 +26824,7 @@ var narratives = [
|
|
|
26565
26824
|
"description": "Connect the project to broader strategy, OKRs, or constraints the audience already cares about. Show why this project is more important than the alternatives competing for the same resources.",
|
|
26566
26825
|
"instructions": "Strategic alignment & significance",
|
|
26567
26826
|
"slideType": "text",
|
|
26568
|
-
"layoutHint": "text-1x
|
|
26827
|
+
"layoutHint": "text-1x"
|
|
26569
26828
|
},
|
|
26570
26829
|
{
|
|
26571
26830
|
"id": "approach",
|
|
@@ -26573,7 +26832,7 @@ var narratives = [
|
|
|
26573
26832
|
"description": "Lay out how the project will be executed: the solution, the team shape, the budget envelope. Enough detail to feel credible, not so much that it pre-commits to choices that will mature in flight.",
|
|
26574
26833
|
"instructions": "Solution, resources, & budget",
|
|
26575
26834
|
"slideType": "text",
|
|
26576
|
-
"layoutHint": "text-1x
|
|
26835
|
+
"layoutHint": "text-1x"
|
|
26577
26836
|
},
|
|
26578
26837
|
{
|
|
26579
26838
|
"id": "timeline",
|
|
@@ -26581,7 +26840,7 @@ var narratives = [
|
|
|
26581
26840
|
"description": "Show the project phases on a timeline, with major milestones and decision points marked. Sponsors are buying a sequence of bets, not a single launch \u2014 make those bets visible.",
|
|
26582
26841
|
"instructions": "Outline project phases",
|
|
26583
26842
|
"slideType": "text",
|
|
26584
|
-
"layoutHint": "text-1x
|
|
26843
|
+
"layoutHint": "text-1x"
|
|
26585
26844
|
},
|
|
26586
26845
|
{
|
|
26587
26846
|
"id": "risks",
|
|
@@ -26589,7 +26848,7 @@ var narratives = [
|
|
|
26589
26848
|
"description": "Name the top risks honestly and pair each with a mitigation or open question. Listing risks without mitigations signals you haven't thought it through; hiding risks signals worse.",
|
|
26590
26849
|
"instructions": "Consider potential challenges",
|
|
26591
26850
|
"slideType": "text",
|
|
26592
|
-
"layoutHint": "text-1x
|
|
26851
|
+
"layoutHint": "text-1x"
|
|
26593
26852
|
},
|
|
26594
26853
|
{
|
|
26595
26854
|
"id": "outlook",
|
|
@@ -26597,13 +26856,13 @@ var narratives = [
|
|
|
26597
26856
|
"description": "Paint the picture of what the organization looks like a quarter or year after the project ships. Stretch beyond the immediate deliverable to the second-order benefits.",
|
|
26598
26857
|
"instructions": "Envision project impact",
|
|
26599
26858
|
"slideType": "text",
|
|
26600
|
-
"layoutHint": "text-1x
|
|
26859
|
+
"layoutHint": "text-1x"
|
|
26601
26860
|
},
|
|
26602
26861
|
{
|
|
26603
26862
|
"id": "wrap-up",
|
|
26604
26863
|
"name": "Wrap Up",
|
|
26605
26864
|
"description": "Recap the proposal and state the specific decision you're asking for: approval, budget, headcount, sponsorship. Make it easy to say yes today.",
|
|
26606
|
-
"layoutHint": "title
|
|
26865
|
+
"layoutHint": "title",
|
|
26607
26866
|
"instructions": "Summarize & persuade",
|
|
26608
26867
|
"slideType": "text"
|
|
26609
26868
|
}
|
|
@@ -26637,7 +26896,7 @@ var narratives = [
|
|
|
26637
26896
|
"description": "Set an empathetic, accountable tone before any analysis. Acknowledge the impact on the people in the room and the customers affected. Authenticity here earns you the credibility you'll need for the rest of the deck.",
|
|
26638
26897
|
"instructions": "Set an empathetic tone",
|
|
26639
26898
|
"slideType": "text",
|
|
26640
|
-
"layoutHint": "text-1x
|
|
26899
|
+
"layoutHint": "text-1x"
|
|
26641
26900
|
},
|
|
26642
26901
|
{
|
|
26643
26902
|
"id": "incident-breakdown",
|
|
@@ -26645,7 +26904,7 @@ var narratives = [
|
|
|
26645
26904
|
"description": "Walk through what happened, in time order. Stick to facts: what systems, what users, what timeline. No causal claims yet \u2014 just an accurate, neutral reconstruction the audience can trust.",
|
|
26646
26905
|
"instructions": "Detail the failure",
|
|
26647
26906
|
"slideType": "text",
|
|
26648
|
-
"layoutHint": "text-1x
|
|
26907
|
+
"layoutHint": "text-1x"
|
|
26649
26908
|
},
|
|
26650
26909
|
{
|
|
26651
26910
|
"id": "impact-analysis",
|
|
@@ -26653,7 +26912,7 @@ var narratives = [
|
|
|
26653
26912
|
"description": "Quantify the damage. Customer-hours lost, revenue at risk, SLA breaches, downstream knock-ons. Be specific and direct; vague impact statements undermine the rest of the post-mortem.",
|
|
26654
26913
|
"instructions": "Describe failure's effects",
|
|
26655
26914
|
"slideType": "text",
|
|
26656
|
-
"layoutHint": "text-1x
|
|
26915
|
+
"layoutHint": "text-1x"
|
|
26657
26916
|
},
|
|
26658
26917
|
{
|
|
26659
26918
|
"id": "root-cause",
|
|
@@ -26661,7 +26920,7 @@ var narratives = [
|
|
|
26661
26920
|
"description": "Trace the failure to its underlying cause, not the most visible symptom. Use a 'five whys' or fishbone framing if useful. Distinguish between the proximate trigger and the systemic conditions that allowed it.",
|
|
26662
26921
|
"instructions": "Analyze underlying reasons",
|
|
26663
26922
|
"slideType": "text",
|
|
26664
|
-
"layoutHint": "text-1x
|
|
26923
|
+
"layoutHint": "text-1x"
|
|
26665
26924
|
},
|
|
26666
26925
|
{
|
|
26667
26926
|
"id": "proposed-solutions",
|
|
@@ -26669,7 +26928,7 @@ var narratives = [
|
|
|
26669
26928
|
"description": "Present the corrective actions you're taking. Lead with the highest-leverage fix; sequence the rest. For each action, name an owner and a date \u2014 solutions without owners are aspirations.",
|
|
26670
26929
|
"instructions": "Suggest corrective measures",
|
|
26671
26930
|
"slideType": "text",
|
|
26672
|
-
"layoutHint": "text-1x
|
|
26931
|
+
"layoutHint": "text-1x"
|
|
26673
26932
|
},
|
|
26674
26933
|
{
|
|
26675
26934
|
"id": "action-plan",
|
|
@@ -26677,7 +26936,7 @@ var narratives = [
|
|
|
26677
26936
|
"description": "Lay out the rollout: what ships when, how it's verified, who signs off. Show that 'fixed' has a definition and a deadline, not just intent.",
|
|
26678
26937
|
"instructions": "Map out steps",
|
|
26679
26938
|
"slideType": "text",
|
|
26680
|
-
"layoutHint": "text-1x
|
|
26939
|
+
"layoutHint": "text-1x"
|
|
26681
26940
|
},
|
|
26682
26941
|
{
|
|
26683
26942
|
"id": "evaluate-outcome",
|
|
@@ -26685,7 +26944,7 @@ var narratives = [
|
|
|
26685
26944
|
"description": "Define the metrics that will tell you the fix worked. Pre/post comparisons, monitoring SLOs, error budgets \u2014 whatever proves the failure mode is closed and not just deferred.",
|
|
26686
26945
|
"instructions": "Assess corrective actions",
|
|
26687
26946
|
"slideType": "text",
|
|
26688
|
-
"layoutHint": "text-1x
|
|
26947
|
+
"layoutHint": "text-1x"
|
|
26689
26948
|
},
|
|
26690
26949
|
{
|
|
26691
26950
|
"id": "lessons-learned",
|
|
@@ -26693,7 +26952,7 @@ var narratives = [
|
|
|
26693
26952
|
"description": "Distill the broader lessons that outlive this specific incident. What does the team or organization now know that it didn't before? What patterns will you watch for elsewhere?",
|
|
26694
26953
|
"instructions": "Reflect on failure lessons",
|
|
26695
26954
|
"slideType": "text",
|
|
26696
|
-
"layoutHint": "text-1x
|
|
26955
|
+
"layoutHint": "text-1x"
|
|
26697
26956
|
},
|
|
26698
26957
|
{
|
|
26699
26958
|
"id": "preventive-measures",
|
|
@@ -26701,13 +26960,13 @@ var narratives = [
|
|
|
26701
26960
|
"description": "List the systemic safeguards being added \u2014 process changes, automated checks, on-call procedures, review gates. Show how this category of failure becomes harder to recur, not just this specific instance.",
|
|
26702
26961
|
"instructions": "List safeguards",
|
|
26703
26962
|
"slideType": "text",
|
|
26704
|
-
"layoutHint": "text-1x
|
|
26963
|
+
"layoutHint": "text-1x"
|
|
26705
26964
|
},
|
|
26706
26965
|
{
|
|
26707
26966
|
"id": "closing-thoughts",
|
|
26708
26967
|
"name": "Closing Thoughts",
|
|
26709
26968
|
"description": "Close with humility and forward momentum. Re-affirm accountability, thank the audience for their patience, and signal confidence in the path forward without overclaiming.",
|
|
26710
|
-
"layoutHint": "title
|
|
26969
|
+
"layoutHint": "title",
|
|
26711
26970
|
"instructions": "Empathize, trust, and encourage",
|
|
26712
26971
|
"slideType": "text"
|
|
26713
26972
|
}
|
|
@@ -26739,7 +26998,7 @@ var narratives = [
|
|
|
26739
26998
|
"description": "Capture attention with a vivid moment, image, or question that sets the world of the story. The audience should immediately know what kind of room they're in. Avoid agendas \u2014 the opening is the first scene, not a preamble.",
|
|
26740
26999
|
"instructions": "Capture audience attention",
|
|
26741
27000
|
"slideType": "text",
|
|
26742
|
-
"layoutHint": "text-1x
|
|
27001
|
+
"layoutHint": "text-1x"
|
|
26743
27002
|
},
|
|
26744
27003
|
{
|
|
26745
27004
|
"id": "context",
|
|
@@ -26747,7 +27006,7 @@ var narratives = [
|
|
|
26747
27006
|
"description": "Establish what's normal in this world before anything goes wrong. Just enough background for the audience to feel the stakes when the villain shows up. Keep it tight; backstory is fuel, not the engine.",
|
|
26748
27007
|
"instructions": "Give background & importance",
|
|
26749
27008
|
"slideType": "text",
|
|
26750
|
-
"layoutHint": "text-1x
|
|
27009
|
+
"layoutHint": "text-1x"
|
|
26751
27010
|
},
|
|
26752
27011
|
{
|
|
26753
27012
|
"id": "villain",
|
|
@@ -26755,7 +27014,7 @@ var narratives = [
|
|
|
26755
27014
|
"description": "Introduce the antagonist \u2014 a problem, a competitor, a market force, an inertia. Give it a face and a name where you can. The clearer the villain, the more the audience cares about how the story turns out.",
|
|
26756
27015
|
"instructions": "Introduce problem",
|
|
26757
27016
|
"slideType": "text",
|
|
26758
|
-
"layoutHint": "text-1x
|
|
27017
|
+
"layoutHint": "text-1x"
|
|
26759
27018
|
},
|
|
26760
27019
|
{
|
|
26761
27020
|
"id": "despair",
|
|
@@ -26763,7 +27022,7 @@ var narratives = [
|
|
|
26763
27022
|
"description": "Show what's at risk if the villain wins. Emphasize the human or business cost of inaction. Don't rush past this beat \u2014 the discomfort here is what makes the resolution land.",
|
|
26764
27023
|
"instructions": "Emphasize negative impact",
|
|
26765
27024
|
"slideType": "text",
|
|
26766
|
-
"layoutHint": "text-1x
|
|
27025
|
+
"layoutHint": "text-1x"
|
|
26767
27026
|
},
|
|
26768
27027
|
{
|
|
26769
27028
|
"id": "hero",
|
|
@@ -26771,7 +27030,7 @@ var narratives = [
|
|
|
26771
27030
|
"description": "Reveal the hero of the story. Often this is the audience themselves, your team, or your product. Frame the hero by what they uniquely bring to the fight, not by their r\xE9sum\xE9.",
|
|
26772
27031
|
"instructions": "Present solution",
|
|
26773
27032
|
"slideType": "text",
|
|
26774
|
-
"layoutHint": "text-1x
|
|
27033
|
+
"layoutHint": "text-1x"
|
|
26775
27034
|
},
|
|
26776
27035
|
{
|
|
26777
27036
|
"id": "plan",
|
|
@@ -26779,13 +27038,13 @@ var narratives = [
|
|
|
26779
27038
|
"description": "Walk through how the hero defeats the villain. Concrete, sequential, credible. Generic plans signal weak heroes; specific plans earn belief that the ending you're promising is reachable.",
|
|
26780
27039
|
"instructions": "Detail implementation",
|
|
26781
27040
|
"slideType": "text",
|
|
26782
|
-
"layoutHint": "text-1x
|
|
27041
|
+
"layoutHint": "text-1x"
|
|
26783
27042
|
},
|
|
26784
27043
|
{
|
|
26785
27044
|
"id": "closing",
|
|
26786
27045
|
"name": "Closing",
|
|
26787
27046
|
"description": "End with the resolution and the lesson. Show what the world looks like after the villain loses, and leave the audience with the feeling \u2014 and the line \u2014 they'll repeat afterwards.",
|
|
26788
|
-
"layoutHint": "title
|
|
27047
|
+
"layoutHint": "title",
|
|
26789
27048
|
"instructions": "Inspire & conclude",
|
|
26790
27049
|
"slideType": "text"
|
|
26791
27050
|
}
|
|
@@ -26818,7 +27077,7 @@ var narratives = [
|
|
|
26818
27077
|
"description": "Engage the audience and set expectations for the next twenty minutes. Tell them you're going to tell them a story \u2014 and then start telling it. Avoid a separate agenda slide; the introduction is the first scene.",
|
|
26819
27078
|
"instructions": "Engage and set expectations",
|
|
26820
27079
|
"slideType": "text",
|
|
26821
|
-
"layoutHint": "text-1x
|
|
27080
|
+
"layoutHint": "text-1x"
|
|
26822
27081
|
},
|
|
26823
27082
|
{
|
|
26824
27083
|
"id": "setting",
|
|
@@ -26826,7 +27085,7 @@ var narratives = [
|
|
|
26826
27085
|
"description": "Establish the world the story takes place in: the team, the market, the moment. Just enough context that the challenge will feel meaningful when it arrives.",
|
|
26827
27086
|
"instructions": "Establish the environment",
|
|
26828
27087
|
"slideType": "text",
|
|
26829
|
-
"layoutHint": "text-1x
|
|
27088
|
+
"layoutHint": "text-1x"
|
|
26830
27089
|
},
|
|
26831
27090
|
{
|
|
26832
27091
|
"id": "challenge",
|
|
@@ -26834,7 +27093,7 @@ var narratives = [
|
|
|
26834
27093
|
"description": "Identify the issue at hand. Concrete, specific, attributable. The challenge is the inciting incident \u2014 the thing that pulled the rest of the story into motion.",
|
|
26835
27094
|
"instructions": "Identify the issue at hand",
|
|
26836
27095
|
"slideType": "text",
|
|
26837
|
-
"layoutHint": "text-1x
|
|
27096
|
+
"layoutHint": "text-1x"
|
|
26838
27097
|
},
|
|
26839
27098
|
{
|
|
26840
27099
|
"id": "tension",
|
|
@@ -26842,7 +27101,7 @@ var narratives = [
|
|
|
26842
27101
|
"description": "Raise the stakes. What happens if the challenge isn't met? Quantify the cost, name the people affected, surface the trade-offs that make the choice hard. Tension is what makes the audience lean in.",
|
|
26843
27102
|
"instructions": "Emphasize the stakes",
|
|
26844
27103
|
"slideType": "text",
|
|
26845
|
-
"layoutHint": "text-1x
|
|
27104
|
+
"layoutHint": "text-1x"
|
|
26846
27105
|
},
|
|
26847
27106
|
{
|
|
26848
27107
|
"id": "solution",
|
|
@@ -26850,7 +27109,7 @@ var narratives = [
|
|
|
26850
27109
|
"description": "Reveal the strategy or hero of the story. Lead with what changes for the audience or customer when the solution is in place. This is the turn from problem to promise.",
|
|
26851
27110
|
"instructions": "Present the hero/strategy",
|
|
26852
27111
|
"slideType": "text",
|
|
26853
|
-
"layoutHint": "text-1x
|
|
27112
|
+
"layoutHint": "text-1x"
|
|
26854
27113
|
},
|
|
26855
27114
|
{
|
|
26856
27115
|
"id": "implementation",
|
|
@@ -26858,7 +27117,7 @@ var narratives = [
|
|
|
26858
27117
|
"description": "Describe the path to success. Phases, owners, milestones, key bets. Show the audience that the solution has weight behind it \u2014 not just intent.",
|
|
26859
27118
|
"instructions": "Describe the path to success",
|
|
26860
27119
|
"slideType": "text",
|
|
26861
|
-
"layoutHint": "text-1x
|
|
27120
|
+
"layoutHint": "text-1x"
|
|
26862
27121
|
},
|
|
26863
27122
|
{
|
|
26864
27123
|
"id": "recap",
|
|
@@ -26866,13 +27125,13 @@ var narratives = [
|
|
|
26866
27125
|
"description": "Bring the audience back to the surface with a clear summary of what was said and decided. Echo the language from the opening so the story feels closed.",
|
|
26867
27126
|
"instructions": "Review key points and insights",
|
|
26868
27127
|
"slideType": "text",
|
|
26869
|
-
"layoutHint": "text-1x
|
|
27128
|
+
"layoutHint": "text-1x"
|
|
26870
27129
|
},
|
|
26871
27130
|
{
|
|
26872
27131
|
"id": "conclusion",
|
|
26873
27132
|
"name": "Conclusion",
|
|
26874
27133
|
"description": "Reinforce the key message and the call to action. End on the line you most want repeated in tomorrow's hallway conversations.",
|
|
26875
|
-
"layoutHint": "title
|
|
27134
|
+
"layoutHint": "title",
|
|
26876
27135
|
"instructions": "Reinforce takeaways and call to action",
|
|
26877
27136
|
"slideType": "text"
|
|
26878
27137
|
}
|
|
@@ -26906,7 +27165,7 @@ var narratives = [
|
|
|
26906
27165
|
"description": "Start at the bottom. Describe the humble beginning, the constraint, the moment before anything had been built. Concrete details \u2014 a place, a year, a feeling \u2014 earn the audience's investment in what follows.",
|
|
26907
27166
|
"instructions": "Humble beginning",
|
|
26908
27167
|
"slideType": "text",
|
|
26909
|
-
"layoutHint": "text-1x
|
|
27168
|
+
"layoutHint": "text-1x"
|
|
26910
27169
|
},
|
|
26911
27170
|
{
|
|
26912
27171
|
"id": "inspiration",
|
|
@@ -26914,7 +27173,7 @@ var narratives = [
|
|
|
26914
27173
|
"description": "Show the moment the protagonist found their calling. A conversation, a customer, a problem they couldn't unsee. The inspiration is the engine that pushes the rest of the story uphill.",
|
|
26915
27174
|
"instructions": "Discover true calling",
|
|
26916
27175
|
"slideType": "text",
|
|
26917
|
-
"layoutHint": "text-1x
|
|
27176
|
+
"layoutHint": "text-1x"
|
|
26918
27177
|
},
|
|
26919
27178
|
{
|
|
26920
27179
|
"id": "opportunity",
|
|
@@ -26922,7 +27181,7 @@ var narratives = [
|
|
|
26922
27181
|
"description": "Reveal the chance the protagonist took. Why this and not something safer? Make the choice visible \u2014 opportunities only count when there was something else they passed up to grab them.",
|
|
26923
27182
|
"instructions": "Spot golden chance",
|
|
26924
27183
|
"slideType": "text",
|
|
26925
|
-
"layoutHint": "text-1x
|
|
27184
|
+
"layoutHint": "text-1x"
|
|
26926
27185
|
},
|
|
26927
27186
|
{
|
|
26928
27187
|
"id": "adversity",
|
|
@@ -26930,7 +27189,7 @@ var narratives = [
|
|
|
26930
27189
|
"description": "Walk through the hardest stretch. Concrete failures, near-misses, moments of doubt. Resist the temptation to skip past the pain \u2014 the audience trusts the win more when the loss was real.",
|
|
26931
27190
|
"instructions": "Face hardest struggles",
|
|
26932
27191
|
"slideType": "text",
|
|
26933
|
-
"layoutHint": "text-1x
|
|
27192
|
+
"layoutHint": "text-1x"
|
|
26934
27193
|
},
|
|
26935
27194
|
{
|
|
26936
27195
|
"id": "overcoming",
|
|
@@ -26938,7 +27197,7 @@ var narratives = [
|
|
|
26938
27197
|
"description": "Show how the obstacles got beaten. What changed, what was learned, what hard call was made. The transition from 'rags' to 'riches' should feel earned, not granted.",
|
|
26939
27198
|
"instructions": "Surmount tough obstacles",
|
|
26940
27199
|
"slideType": "text",
|
|
26941
|
-
"layoutHint": "text-1x
|
|
27200
|
+
"layoutHint": "text-1x"
|
|
26942
27201
|
},
|
|
26943
27202
|
{
|
|
26944
27203
|
"id": "impactful-change",
|
|
@@ -26946,13 +27205,13 @@ var narratives = [
|
|
|
26946
27205
|
"description": "Describe the moment the world tipped. The customer who said yes, the product that broke through, the metric that turned. One concrete transformation lands harder than a montage.",
|
|
26947
27206
|
"instructions": "Alter the status quo",
|
|
26948
27207
|
"slideType": "text",
|
|
26949
|
-
"layoutHint": "text-1x
|
|
27208
|
+
"layoutHint": "text-1x"
|
|
26950
27209
|
},
|
|
26951
27210
|
{
|
|
26952
27211
|
"id": "lasting-legacy",
|
|
26953
27212
|
"name": "Lasting Legacy",
|
|
26954
27213
|
"description": "Close on what the journey means for those who come next. The lesson, the people changed, the work that endures. Leave the audience with a takeaway that outlives the story.",
|
|
26955
|
-
"layoutHint": "title
|
|
27214
|
+
"layoutHint": "title",
|
|
26956
27215
|
"instructions": "Create enduring effect",
|
|
26957
27216
|
"slideType": "text"
|
|
26958
27217
|
}
|
|
@@ -26985,7 +27244,7 @@ var narratives = [
|
|
|
26985
27244
|
"description": "Establish the opening scene: who the underdog is and the world that overlooked them. Specific details make the rest of the journey feel real.",
|
|
26986
27245
|
"instructions": "Establish opening scene",
|
|
26987
27246
|
"slideType": "text",
|
|
26988
|
-
"layoutHint": "text-1x
|
|
27247
|
+
"layoutHint": "text-1x"
|
|
26989
27248
|
},
|
|
26990
27249
|
{
|
|
26991
27250
|
"id": "struggles",
|
|
@@ -26993,7 +27252,7 @@ var narratives = [
|
|
|
26993
27252
|
"description": "Highlight the early setbacks. What didn't work, who said no, where the path closed up. The audience needs to feel the doubt before they can feel the win.",
|
|
26994
27253
|
"instructions": "Highlight initial setbacks",
|
|
26995
27254
|
"slideType": "text",
|
|
26996
|
-
"layoutHint": "text-1x
|
|
27255
|
+
"layoutHint": "text-1x"
|
|
26997
27256
|
},
|
|
26998
27257
|
{
|
|
26999
27258
|
"id": "determination",
|
|
@@ -27001,7 +27260,7 @@ var narratives = [
|
|
|
27001
27260
|
"description": "Showcase the enduring passion that kept the underdog going. What they refused to give up on, and why. Determination, in this beat, is the only resource the underdog has.",
|
|
27002
27261
|
"instructions": "Showcase enduring passion",
|
|
27003
27262
|
"slideType": "text",
|
|
27004
|
-
"layoutHint": "text-1x
|
|
27263
|
+
"layoutHint": "text-1x"
|
|
27005
27264
|
},
|
|
27006
27265
|
{
|
|
27007
27266
|
"id": "crisis",
|
|
@@ -27009,7 +27268,7 @@ var narratives = [
|
|
|
27009
27268
|
"description": "Identify the lowest point of the journey. The moment the dream nearly ended. Don't soften \u2014 the contrast with the triumph ahead depends on the depth of this slide.",
|
|
27010
27269
|
"instructions": "Identify lowest point",
|
|
27011
27270
|
"slideType": "text",
|
|
27012
|
-
"layoutHint": "text-1x
|
|
27271
|
+
"layoutHint": "text-1x"
|
|
27013
27272
|
},
|
|
27014
27273
|
{
|
|
27015
27274
|
"id": "resolve",
|
|
@@ -27017,7 +27276,7 @@ var narratives = [
|
|
|
27017
27276
|
"description": "Articulate the choice the underdog made to keep going. The strong will, the small bet, the borrowed faith. Resolve is where the protagonist becomes someone the audience roots for.",
|
|
27018
27277
|
"instructions": "Articulate strong will",
|
|
27019
27278
|
"slideType": "text",
|
|
27020
|
-
"layoutHint": "text-1x
|
|
27279
|
+
"layoutHint": "text-1x"
|
|
27021
27280
|
},
|
|
27022
27281
|
{
|
|
27023
27282
|
"id": "breakthrough",
|
|
@@ -27025,7 +27284,7 @@ var narratives = [
|
|
|
27025
27284
|
"description": "Show the reward of perseverance: the customer who said yes, the door that opened, the fortune that turned. The breakthrough should feel earned, not granted.",
|
|
27026
27285
|
"instructions": "Reward of perseverance",
|
|
27027
27286
|
"slideType": "text",
|
|
27028
|
-
"layoutHint": "text-1x
|
|
27287
|
+
"layoutHint": "text-1x"
|
|
27029
27288
|
},
|
|
27030
27289
|
{
|
|
27031
27290
|
"id": "triumph",
|
|
@@ -27033,13 +27292,13 @@ var narratives = [
|
|
|
27033
27292
|
"description": "Reveal the ultimate success. Concrete outcomes, named milestones. The triumph is the audience's emotional payoff \u2014 let it land.",
|
|
27034
27293
|
"instructions": "Reveal ultimate success",
|
|
27035
27294
|
"slideType": "text",
|
|
27036
|
-
"layoutHint": "text-1x
|
|
27295
|
+
"layoutHint": "text-1x"
|
|
27037
27296
|
},
|
|
27038
27297
|
{
|
|
27039
27298
|
"id": "legacy",
|
|
27040
27299
|
"name": "Legacy",
|
|
27041
27300
|
"description": "Share the lasting impact. What the underdog's victory makes possible for those who come after. The legacy beat is what turns a story into a lesson.",
|
|
27042
|
-
"layoutHint": "title
|
|
27301
|
+
"layoutHint": "title",
|
|
27043
27302
|
"instructions": "Share long-lasting impact",
|
|
27044
27303
|
"slideType": "text"
|
|
27045
27304
|
}
|
|
@@ -27072,7 +27331,7 @@ var narratives = [
|
|
|
27072
27331
|
"description": "Open in the middle of the disaster. Specific moment, specific stakes, specific damage. Drop the audience into the worst point of the story before walking them back.",
|
|
27073
27332
|
"instructions": "Present initial disaster",
|
|
27074
27333
|
"slideType": "text",
|
|
27075
|
-
"layoutHint": "text-1x
|
|
27334
|
+
"layoutHint": "text-1x"
|
|
27076
27335
|
},
|
|
27077
27336
|
{
|
|
27078
27337
|
"id": "backstory",
|
|
@@ -27080,7 +27339,7 @@ var narratives = [
|
|
|
27080
27339
|
"description": "Detail the events that led up to the catastrophe. Just enough for the audience to understand how the disaster could have happened. Avoid moralizing \u2014 the story does the work.",
|
|
27081
27340
|
"instructions": "Detail past events",
|
|
27082
27341
|
"slideType": "text",
|
|
27083
|
-
"layoutHint": "text-1x
|
|
27342
|
+
"layoutHint": "text-1x"
|
|
27084
27343
|
},
|
|
27085
27344
|
{
|
|
27086
27345
|
"id": "blueprint",
|
|
@@ -27088,7 +27347,7 @@ var narratives = [
|
|
|
27088
27347
|
"description": "Illustrate the recovery plan. Specific moves, specific bets, specific people. The audience should see the strategy as more than 'try hard.'",
|
|
27089
27348
|
"instructions": "Illustrate recovery plans",
|
|
27090
27349
|
"slideType": "text",
|
|
27091
|
-
"layoutHint": "text-1x
|
|
27350
|
+
"layoutHint": "text-1x"
|
|
27092
27351
|
},
|
|
27093
27352
|
{
|
|
27094
27353
|
"id": "danger",
|
|
@@ -27096,7 +27355,7 @@ var narratives = [
|
|
|
27096
27355
|
"description": "Highlight the emerging threats to the recovery plan. New risks, returning ones. Tension here makes the eventual triumph credible.",
|
|
27097
27356
|
"instructions": "Highlight emerging threats",
|
|
27098
27357
|
"slideType": "text",
|
|
27099
|
-
"layoutHint": "text-1x
|
|
27358
|
+
"layoutHint": "text-1x"
|
|
27100
27359
|
},
|
|
27101
27360
|
{
|
|
27102
27361
|
"id": "endeavor",
|
|
@@ -27104,7 +27363,7 @@ var narratives = [
|
|
|
27104
27363
|
"description": "Show the determined effort underway. The hours, the trade-offs, the discipline. The audience must feel the work, not just hear about it.",
|
|
27105
27364
|
"instructions": "Show determination effort",
|
|
27106
27365
|
"slideType": "text",
|
|
27107
|
-
"layoutHint": "text-1x
|
|
27366
|
+
"layoutHint": "text-1x"
|
|
27108
27367
|
},
|
|
27109
27368
|
{
|
|
27110
27369
|
"id": "struggles",
|
|
@@ -27112,7 +27371,7 @@ var narratives = [
|
|
|
27112
27371
|
"description": "Showcase challenging moments along the way: the setbacks, the false starts, the hard calls. Honest setbacks make eventual success feel earned.",
|
|
27113
27372
|
"instructions": "Showcase challenging encounters",
|
|
27114
27373
|
"slideType": "text",
|
|
27115
|
-
"layoutHint": "text-1x
|
|
27374
|
+
"layoutHint": "text-1x"
|
|
27116
27375
|
},
|
|
27117
27376
|
{
|
|
27118
27377
|
"id": "pivot",
|
|
@@ -27120,7 +27379,7 @@ var narratives = [
|
|
|
27120
27379
|
"description": "Highlight the strategic shift that changed the trajectory. What got reconsidered, what got dropped, what got doubled down on. The pivot is the moment the protagonist became something new.",
|
|
27121
27380
|
"instructions": "Highlight strategy shift",
|
|
27122
27381
|
"slideType": "text",
|
|
27123
|
-
"layoutHint": "text-1x
|
|
27382
|
+
"layoutHint": "text-1x"
|
|
27124
27383
|
},
|
|
27125
27384
|
{
|
|
27126
27385
|
"id": "breakthrough",
|
|
@@ -27128,7 +27387,7 @@ var narratives = [
|
|
|
27128
27387
|
"description": "Emphasize the moment adversity finally broke. Concrete result, concrete date. Let the slide land \u2014 the audience came for this turn.",
|
|
27129
27388
|
"instructions": "Emphasize overcoming adversity",
|
|
27130
27389
|
"slideType": "text",
|
|
27131
|
-
"layoutHint": "text-1x
|
|
27390
|
+
"layoutHint": "text-1x"
|
|
27132
27391
|
},
|
|
27133
27392
|
{
|
|
27134
27393
|
"id": "legacy",
|
|
@@ -27136,13 +27395,13 @@ var narratives = [
|
|
|
27136
27395
|
"description": "Discuss the enduring impact. What survival made possible afterward, who benefited, what was built on top. Survival stories are most powerful when they create more than they restore.",
|
|
27137
27396
|
"instructions": "Discuss enduring impact",
|
|
27138
27397
|
"slideType": "text",
|
|
27139
|
-
"layoutHint": "text-1x
|
|
27398
|
+
"layoutHint": "text-1x"
|
|
27140
27399
|
},
|
|
27141
27400
|
{
|
|
27142
27401
|
"id": "takeaway",
|
|
27143
27402
|
"name": "Takeaway",
|
|
27144
27403
|
"description": "Share the lesson the audience can carry away. One transferable insight, framed for their own challenges \u2014 not a general moral.",
|
|
27145
|
-
"layoutHint": "title
|
|
27404
|
+
"layoutHint": "title",
|
|
27146
27405
|
"instructions": "Share important lessons",
|
|
27147
27406
|
"slideType": "text"
|
|
27148
27407
|
}
|
|
@@ -27175,7 +27434,7 @@ var narratives = [
|
|
|
27175
27434
|
"description": "Introduce the topic in a way that respects the audience's time and curiosity. Frame why this question is worth asking, and signal the shape of the journey ahead without giving away the destination.",
|
|
27176
27435
|
"instructions": "Introduce the topic",
|
|
27177
27436
|
"slideType": "text",
|
|
27178
|
-
"layoutHint": "text-1x
|
|
27437
|
+
"layoutHint": "text-1x"
|
|
27179
27438
|
},
|
|
27180
27439
|
{
|
|
27181
27440
|
"id": "surprising-fact",
|
|
@@ -27183,7 +27442,7 @@ var narratives = [
|
|
|
27183
27442
|
"description": "Lead with a single curious fact that recasts how the audience thinks about the topic. The fact should be small, specific, and unforgettable \u2014 the cognitive door the rest of the talk walks through.",
|
|
27184
27443
|
"instructions": "Share a curious fact",
|
|
27185
27444
|
"slideType": "text",
|
|
27186
|
-
"layoutHint": "text-1x
|
|
27445
|
+
"layoutHint": "text-1x"
|
|
27187
27446
|
},
|
|
27188
27447
|
{
|
|
27189
27448
|
"id": "experiment",
|
|
@@ -27191,7 +27450,7 @@ var narratives = [
|
|
|
27191
27450
|
"description": "Walk through a method, study, or thought experiment that probes the surprising fact. Show how knowledge here gets made \u2014 the audience should feel like they're shoulder-to-shoulder with the investigator.",
|
|
27192
27451
|
"instructions": "Explain a tried method",
|
|
27193
27452
|
"slideType": "text",
|
|
27194
|
-
"layoutHint": "text-1x
|
|
27453
|
+
"layoutHint": "text-1x"
|
|
27195
27454
|
},
|
|
27196
27455
|
{
|
|
27197
27456
|
"id": "amusing-anecdote",
|
|
@@ -27199,7 +27458,7 @@ var narratives = [
|
|
|
27199
27458
|
"description": "Drop in a story or moment from the field that brings the topic to human scale. Personality and humor here keep the audience leaning forward; technical depth without warmth loses the room.",
|
|
27200
27459
|
"instructions": "Relay an interesting story",
|
|
27201
27460
|
"slideType": "text",
|
|
27202
|
-
"layoutHint": "text-1x
|
|
27461
|
+
"layoutHint": "text-1x"
|
|
27203
27462
|
},
|
|
27204
27463
|
{
|
|
27205
27464
|
"id": "intriguing-information",
|
|
@@ -27207,7 +27466,7 @@ var narratives = [
|
|
|
27207
27466
|
"description": "Layer in the more complex data or detail. By this point the audience is invested enough to do real work alongside you. Visualize generously \u2014 make the numbers tangible.",
|
|
27208
27467
|
"instructions": "Share complex data",
|
|
27209
27468
|
"slideType": "text",
|
|
27210
|
-
"layoutHint": "text-1x
|
|
27469
|
+
"layoutHint": "text-1x"
|
|
27211
27470
|
},
|
|
27212
27471
|
{
|
|
27213
27472
|
"id": "skeptical-scrutiny",
|
|
@@ -27215,7 +27474,7 @@ var narratives = [
|
|
|
27215
27474
|
"description": "Question the easy interpretations. Challenge the audience's defaults and your own. Showing where the evidence is contested is what separates a teacher from a publicist.",
|
|
27216
27475
|
"instructions": "Encourage questioning of accepted truths",
|
|
27217
27476
|
"slideType": "text",
|
|
27218
|
-
"layoutHint": "text-1x
|
|
27477
|
+
"layoutHint": "text-1x"
|
|
27219
27478
|
},
|
|
27220
27479
|
{
|
|
27221
27480
|
"id": "extraordinary-explanation",
|
|
@@ -27223,7 +27482,7 @@ var narratives = [
|
|
|
27223
27482
|
"description": "Present the most counterintuitive or beautiful explanation the topic offers. Take your time here \u2014 this is the payoff slide the audience came for.",
|
|
27224
27483
|
"instructions": "Break down unusual research findings",
|
|
27225
27484
|
"slideType": "text",
|
|
27226
|
-
"layoutHint": "text-1x
|
|
27485
|
+
"layoutHint": "text-1x"
|
|
27227
27486
|
},
|
|
27228
27487
|
{
|
|
27229
27488
|
"id": "unconventional-use",
|
|
@@ -27231,13 +27490,13 @@ var narratives = [
|
|
|
27231
27490
|
"description": "Show an unexpected application or implication of the idea. Surprise reinforces the lesson and gives the audience a story to retell tomorrow.",
|
|
27232
27491
|
"instructions": "Expand on unique aspects",
|
|
27233
27492
|
"slideType": "text",
|
|
27234
|
-
"layoutHint": "text-1x
|
|
27493
|
+
"layoutHint": "text-1x"
|
|
27235
27494
|
},
|
|
27236
27495
|
{
|
|
27237
27496
|
"id": "captivating-conclusion",
|
|
27238
27497
|
"name": "Captivating Conclusion",
|
|
27239
27498
|
"description": "Close with a thoughtful, slightly poetic wrap-up. Echo the surprising fact, name the lesson, and leave the audience with a new question instead of a tidy answer.",
|
|
27240
|
-
"layoutHint": "title
|
|
27499
|
+
"layoutHint": "title",
|
|
27241
27500
|
"instructions": "Provide a thoughtful wrap-up",
|
|
27242
27501
|
"slideType": "text"
|
|
27243
27502
|
}
|
|
@@ -27270,7 +27529,7 @@ var narratives = [
|
|
|
27270
27529
|
"description": "Open with a moment, image, or claim the audience can't easily look away from. The first sixty seconds buy you the next twenty minutes \u2014 spend them on something specific and emotionally charged, not on housekeeping.",
|
|
27271
27530
|
"instructions": "Draw in the audience with a compelling opener",
|
|
27272
27531
|
"slideType": "text",
|
|
27273
|
-
"layoutHint": "text-1x
|
|
27532
|
+
"layoutHint": "text-1x"
|
|
27274
27533
|
},
|
|
27275
27534
|
{
|
|
27276
27535
|
"id": "challenge-status-quo",
|
|
@@ -27288,7 +27547,7 @@ var narratives = [
|
|
|
27288
27547
|
"description": "Anchor the issue in a specific person, place, or moment. Story is what gets the argument past the audience's defenses. Pick a story that personalizes the data without overstating it.",
|
|
27289
27548
|
"instructions": "Share significant stories to illuminate the issue",
|
|
27290
27549
|
"slideType": "text",
|
|
27291
|
-
"layoutHint": "text-1x
|
|
27550
|
+
"layoutHint": "text-1x"
|
|
27292
27551
|
},
|
|
27293
27552
|
{
|
|
27294
27553
|
"id": "statistic-shock",
|
|
@@ -27296,7 +27555,7 @@ var narratives = [
|
|
|
27296
27555
|
"description": "Drop in a single statistic that recasts the scale of the problem. One number, presented well, lands harder than a dashboard. Cite the source so the audience can repeat it with confidence.",
|
|
27297
27556
|
"instructions": "Use impactful stats to highlight the gravity of the issue",
|
|
27298
27557
|
"slideType": "text",
|
|
27299
|
-
"layoutHint": "text-1x
|
|
27558
|
+
"layoutHint": "text-1x"
|
|
27300
27559
|
},
|
|
27301
27560
|
{
|
|
27302
27561
|
"id": "historical-context",
|
|
@@ -27304,7 +27563,7 @@ var narratives = [
|
|
|
27304
27563
|
"description": "Show how the issue evolved. Why it has the shape it does today, what was tried, what was missed. Historical context turns 'this is broken' into 'this stayed broken for these reasons.'",
|
|
27305
27564
|
"instructions": "Show the evolution or history of the issue",
|
|
27306
27565
|
"slideType": "text",
|
|
27307
|
-
"layoutHint": "text-1x
|
|
27566
|
+
"layoutHint": "text-1x"
|
|
27308
27567
|
},
|
|
27309
27568
|
{
|
|
27310
27569
|
"id": "weave-narrative",
|
|
@@ -27317,7 +27576,7 @@ var narratives = [
|
|
|
27317
27576
|
"description": "Deliver the surprising or significant turn. The fact, finding, or reframing the rest of the talk has been earning. The revelation should redirect, not merely confirm.",
|
|
27318
27577
|
"instructions": "Deliver a surprising or significant discovery",
|
|
27319
27578
|
"slideType": "text",
|
|
27320
|
-
"layoutHint": "text-1x
|
|
27579
|
+
"layoutHint": "text-1x"
|
|
27321
27580
|
},
|
|
27322
27581
|
{
|
|
27323
27582
|
"id": "propose-solution",
|
|
@@ -27325,13 +27584,13 @@ var narratives = [
|
|
|
27325
27584
|
"description": "Advocate for the change you want. Concrete enough to be acted on, broad enough to inspire. Pair the solution with the smallest credible first step.",
|
|
27326
27585
|
"instructions": "Advocate for change or propose an actionable solution",
|
|
27327
27586
|
"slideType": "text",
|
|
27328
|
-
"layoutHint": "text-1x
|
|
27587
|
+
"layoutHint": "text-1x"
|
|
27329
27588
|
},
|
|
27330
27589
|
{
|
|
27331
27590
|
"id": "final-question",
|
|
27332
27591
|
"name": "Final Question",
|
|
27333
27592
|
"description": "Close on a question rather than a summary. The right closing question follows the audience out of the room and into their conversations afterward.",
|
|
27334
|
-
"layoutHint": "title
|
|
27593
|
+
"layoutHint": "title",
|
|
27335
27594
|
"instructions": "Finish with a thought-provoking question to stimulate audience thinking",
|
|
27336
27595
|
"slideType": "text"
|
|
27337
27596
|
}
|
|
@@ -27364,7 +27623,7 @@ var narratives = [
|
|
|
27364
27623
|
"description": "Open with a personal experience that establishes why the topic matters to you. Specificity earns intimacy; intimacy earns the audience's permission to be moved.",
|
|
27365
27624
|
"instructions": "Share personal experiences to connect with the audience",
|
|
27366
27625
|
"slideType": "text",
|
|
27367
|
-
"layoutHint": "text-1x
|
|
27626
|
+
"layoutHint": "text-1x"
|
|
27368
27627
|
},
|
|
27369
27628
|
{
|
|
27370
27629
|
"id": "research-exposition",
|
|
@@ -27372,7 +27631,7 @@ var narratives = [
|
|
|
27372
27631
|
"description": "Lay out the scientific or empirical data that backs the premise. Be rigorous but not academic \u2014 the audience needs to understand the evidence well enough to defend it later.",
|
|
27373
27632
|
"instructions": "Unravel scientific data backing the premise",
|
|
27374
27633
|
"slideType": "text",
|
|
27375
|
-
"layoutHint": "text-1x
|
|
27634
|
+
"layoutHint": "text-1x"
|
|
27376
27635
|
},
|
|
27377
27636
|
{
|
|
27378
27637
|
"id": "real-life-anecdote",
|
|
@@ -27380,7 +27639,7 @@ var narratives = [
|
|
|
27380
27639
|
"description": "Illustrate the research with a story from the field. Make the abstract finding feel like something that happens to people the audience could imagine being.",
|
|
27381
27640
|
"instructions": "Illustrate with stories to make the point relatable",
|
|
27382
27641
|
"slideType": "text",
|
|
27383
|
-
"layoutHint": "text-1x
|
|
27642
|
+
"layoutHint": "text-1x"
|
|
27384
27643
|
},
|
|
27385
27644
|
{
|
|
27386
27645
|
"id": "critical-insights",
|
|
@@ -27388,7 +27647,7 @@ var narratives = [
|
|
|
27388
27647
|
"description": "Summarize the two or three findings the audience must walk away with. Distill them into language a non-specialist could repeat without distortion.",
|
|
27389
27648
|
"instructions": "Summarize key points",
|
|
27390
27649
|
"slideType": "text",
|
|
27391
|
-
"layoutHint": "text-1x
|
|
27650
|
+
"layoutHint": "text-1x"
|
|
27392
27651
|
},
|
|
27393
27652
|
{
|
|
27394
27653
|
"id": "break-stereotypes",
|
|
@@ -27396,7 +27655,7 @@ var narratives = [
|
|
|
27396
27655
|
"description": "Question redundant norms or beliefs the research undermines. Be specific about what's being challenged so the audience knows what to update.",
|
|
27397
27656
|
"instructions": "Question redundant norms and belief systems",
|
|
27398
27657
|
"slideType": "text",
|
|
27399
|
-
"layoutHint": "text-1x
|
|
27658
|
+
"layoutHint": "text-1x"
|
|
27400
27659
|
},
|
|
27401
27660
|
{
|
|
27402
27661
|
"id": "empowering-advice",
|
|
@@ -27404,7 +27663,7 @@ var narratives = [
|
|
|
27404
27663
|
"description": "Translate the insights into a small, actionable practice. The advice should be doable today, not only next quarter \u2014 the goal is movement, not aspiration.",
|
|
27405
27664
|
"instructions": "Motivational message to act upon",
|
|
27406
27665
|
"slideType": "text",
|
|
27407
|
-
"layoutHint": "text-1x
|
|
27666
|
+
"layoutHint": "text-1x"
|
|
27408
27667
|
},
|
|
27409
27668
|
{
|
|
27410
27669
|
"id": "authenticity",
|
|
@@ -27412,13 +27671,13 @@ var narratives = [
|
|
|
27412
27671
|
"description": "Speak honestly about your own struggle with the topic. Vulnerability, used with restraint, is what turns research into a felt truth.",
|
|
27413
27672
|
"instructions": "Honest and real communication to demonstrate authenticity",
|
|
27414
27673
|
"slideType": "text",
|
|
27415
|
-
"layoutHint": "text-1x
|
|
27674
|
+
"layoutHint": "text-1x"
|
|
27416
27675
|
},
|
|
27417
27676
|
{
|
|
27418
27677
|
"id": "close-with-impact",
|
|
27419
27678
|
"name": "Close With Impact",
|
|
27420
27679
|
"description": "End on a motivational high \u2014 the line, image, or invitation you want to follow the audience out of the room. Close the talk where it began, transformed.",
|
|
27421
|
-
"layoutHint": "title
|
|
27680
|
+
"layoutHint": "title",
|
|
27422
27681
|
"instructions": "End on a motivational high",
|
|
27423
27682
|
"slideType": "text"
|
|
27424
27683
|
}
|
|
@@ -27452,7 +27711,7 @@ var narratives = [
|
|
|
27452
27711
|
"description": "Set the stage with a moment that earns the audience's full attention. Speak in the moral register the rest of the talk will require. Avoid throat-clearing \u2014 open as if the speech were already underway.",
|
|
27453
27712
|
"instructions": "Set the stage",
|
|
27454
27713
|
"slideType": "text",
|
|
27455
|
-
"layoutHint": "text-1x
|
|
27714
|
+
"layoutHint": "text-1x"
|
|
27456
27715
|
},
|
|
27457
27716
|
{
|
|
27458
27717
|
"id": "give-context",
|
|
@@ -27460,7 +27719,7 @@ var narratives = [
|
|
|
27460
27719
|
"description": "Place the issue in its historical and current context. What promises were made, what has and hasn't been kept. Context turns the speech from opinion into accountability.",
|
|
27461
27720
|
"instructions": "Put in historical and current context",
|
|
27462
27721
|
"slideType": "text",
|
|
27463
|
-
"layoutHint": "text-1x
|
|
27722
|
+
"layoutHint": "text-1x"
|
|
27464
27723
|
},
|
|
27465
27724
|
{
|
|
27466
27725
|
"id": "highlight-inequality",
|
|
@@ -27468,7 +27727,7 @@ var narratives = [
|
|
|
27468
27727
|
"description": "Show specific, undeniable examples of the inequality at issue. Concrete moments and people, not abstractions. The audience should feel the gap between what is and what was promised.",
|
|
27469
27728
|
"instructions": "Show examples of inequality",
|
|
27470
27729
|
"slideType": "text",
|
|
27471
|
-
"layoutHint": "text-1x
|
|
27730
|
+
"layoutHint": "text-1x"
|
|
27472
27731
|
},
|
|
27473
27732
|
{
|
|
27474
27733
|
"id": "share-dream",
|
|
@@ -27476,7 +27735,7 @@ var narratives = [
|
|
|
27476
27735
|
"description": "Describe the future you envision in vivid, specific detail. The dream must be both ambitious and recognizable \u2014 a world the audience can picture themselves living in.",
|
|
27477
27736
|
"instructions": "Describe your vision",
|
|
27478
27737
|
"slideType": "text",
|
|
27479
|
-
"layoutHint": "text-1x
|
|
27738
|
+
"layoutHint": "text-1x"
|
|
27480
27739
|
},
|
|
27481
27740
|
{
|
|
27482
27741
|
"id": "create-urgency",
|
|
@@ -27484,7 +27743,7 @@ var narratives = [
|
|
|
27484
27743
|
"description": "Explain why the time for change is now. The cost of waiting, the moment that won't return. Urgency converts shared vision into shared movement.",
|
|
27485
27744
|
"instructions": "Explain the need for immediate change",
|
|
27486
27745
|
"slideType": "text",
|
|
27487
|
-
"layoutHint": "text-1x
|
|
27746
|
+
"layoutHint": "text-1x"
|
|
27488
27747
|
},
|
|
27489
27748
|
{
|
|
27490
27749
|
"id": "another-dream",
|
|
@@ -27492,7 +27751,7 @@ var narratives = [
|
|
|
27492
27751
|
"description": "Layer additional visions of the future in parallel structure. Repetition and rhythm build momentum the way a single image cannot.",
|
|
27493
27752
|
"instructions": "Continue to elaborate on your vision",
|
|
27494
27753
|
"slideType": "text",
|
|
27495
|
-
"layoutHint": "text-1x
|
|
27754
|
+
"layoutHint": "text-1x"
|
|
27496
27755
|
},
|
|
27497
27756
|
{
|
|
27498
27757
|
"id": "emphasize-unity",
|
|
@@ -27500,7 +27759,7 @@ var narratives = [
|
|
|
27500
27759
|
"description": "Speak to the collective power of the audience together. Name common ground that crosses lines the issue normally divides. Unity is the engine that turns dream into march.",
|
|
27501
27760
|
"instructions": "Talk about collective power",
|
|
27502
27761
|
"slideType": "text",
|
|
27503
|
-
"layoutHint": "text-1x
|
|
27762
|
+
"layoutHint": "text-1x"
|
|
27504
27763
|
},
|
|
27505
27764
|
{
|
|
27506
27765
|
"id": "last-dream",
|
|
@@ -27508,7 +27767,7 @@ var narratives = [
|
|
|
27508
27767
|
"description": "Deliver one more, fully realized vision of the world you're calling for. Specific enough to be remembered, expansive enough to inspire.",
|
|
27509
27768
|
"instructions": "Further share dreams of ideal in-depth",
|
|
27510
27769
|
"slideType": "text",
|
|
27511
|
-
"layoutHint": "text-1x
|
|
27770
|
+
"layoutHint": "text-1x"
|
|
27512
27771
|
},
|
|
27513
27772
|
{
|
|
27514
27773
|
"id": "call-to-action",
|
|
@@ -27516,7 +27775,7 @@ var narratives = [
|
|
|
27516
27775
|
"description": "Ask the audience to participate in the change. Be specific about what 'doing something' looks like \u2014 show, march, give, vote, organize. Vague CTAs produce vague action.",
|
|
27517
27776
|
"instructions": "Ask audience to participate in change",
|
|
27518
27777
|
"slideType": "text",
|
|
27519
|
-
"layoutHint": "text-1x
|
|
27778
|
+
"layoutHint": "text-1x"
|
|
27520
27779
|
},
|
|
27521
27780
|
{
|
|
27522
27781
|
"id": "show-determination",
|
|
@@ -27524,13 +27783,13 @@ var narratives = [
|
|
|
27524
27783
|
"description": "Encourage persistence in the face of resistance. Acknowledge what will be hard. Determination, named honestly, is more durable than easy optimism.",
|
|
27525
27784
|
"instructions": "Encourage persistence",
|
|
27526
27785
|
"slideType": "text",
|
|
27527
|
-
"layoutHint": "text-1x
|
|
27786
|
+
"layoutHint": "text-1x"
|
|
27528
27787
|
},
|
|
27529
27788
|
{
|
|
27530
27789
|
"id": "create-hope",
|
|
27531
27790
|
"name": "Create Hope",
|
|
27532
27791
|
"description": "Close on hope grounded in evidence: progress already made, victories already won, ground already moved. Hope as a conclusion lands strongest when it sounds like it has been earned.",
|
|
27533
|
-
"layoutHint": "title
|
|
27792
|
+
"layoutHint": "title",
|
|
27534
27793
|
"instructions": "Inspire hope for future",
|
|
27535
27794
|
"slideType": "text"
|
|
27536
27795
|
}
|
|
@@ -27562,7 +27821,7 @@ var narratives = [
|
|
|
27562
27821
|
"id": "opening",
|
|
27563
27822
|
"name": "Opening",
|
|
27564
27823
|
"description": "Set the stage. Tell the audience they're about to see something that matters, without yet showing it. The pause before the reveal is part of the reveal.",
|
|
27565
|
-
"layoutHint": "title
|
|
27824
|
+
"layoutHint": "title",
|
|
27566
27825
|
"instructions": "Set the stage",
|
|
27567
27826
|
"slideType": "text"
|
|
27568
27827
|
},
|
|
@@ -27572,7 +27831,7 @@ var narratives = [
|
|
|
27572
27831
|
"description": "Announce the product. One image, one name, one sentence. Anything more competes with the moment. The slide should feel like the curtain going up.",
|
|
27573
27832
|
"instructions": "Announce product",
|
|
27574
27833
|
"slideType": "text",
|
|
27575
|
-
"layoutHint": "text-1x
|
|
27834
|
+
"layoutHint": "text-1x"
|
|
27576
27835
|
},
|
|
27577
27836
|
{
|
|
27578
27837
|
"id": "demonstration",
|
|
@@ -27580,7 +27839,7 @@ var narratives = [
|
|
|
27580
27839
|
"description": "Show the product in real use. Choose a single defining workflow that captures what the product does and how it feels. Live beats canned wherever possible.",
|
|
27581
27840
|
"instructions": "Showcase the product",
|
|
27582
27841
|
"slideType": "text",
|
|
27583
|
-
"layoutHint": "text-1x
|
|
27842
|
+
"layoutHint": "text-1x"
|
|
27584
27843
|
},
|
|
27585
27844
|
{
|
|
27586
27845
|
"id": "wow-factor",
|
|
@@ -27588,7 +27847,7 @@ var narratives = [
|
|
|
27588
27847
|
"description": "Highlight the cutting-edge feature that earns the headline. One thing, presented well \u2014 the audience should leave able to repeat it in a sentence.",
|
|
27589
27848
|
"instructions": "Highlight cutting-edge features",
|
|
27590
27849
|
"slideType": "text",
|
|
27591
|
-
"layoutHint": "text-1x
|
|
27850
|
+
"layoutHint": "text-1x"
|
|
27592
27851
|
},
|
|
27593
27852
|
{
|
|
27594
27853
|
"id": "differentiation",
|
|
@@ -27596,7 +27855,7 @@ var narratives = [
|
|
|
27596
27855
|
"description": "Make the contrast with existing alternatives unmistakable. Use comparisons that the audience already understands; don't argue against straw versions of the competition.",
|
|
27597
27856
|
"instructions": "Distinctive factors",
|
|
27598
27857
|
"slideType": "text",
|
|
27599
|
-
"layoutHint": "text-1x
|
|
27858
|
+
"layoutHint": "text-1x"
|
|
27600
27859
|
},
|
|
27601
27860
|
{
|
|
27602
27861
|
"id": "revolution",
|
|
@@ -27604,7 +27863,7 @@ var narratives = [
|
|
|
27604
27863
|
"description": "Reframe the category. Show how the product changes what the playing field looks like, not just where you sit on it. This is the slide pundits will quote.",
|
|
27605
27864
|
"instructions": "Change in the playing field",
|
|
27606
27865
|
"slideType": "text",
|
|
27607
|
-
"layoutHint": "text-1x
|
|
27866
|
+
"layoutHint": "text-1x"
|
|
27608
27867
|
},
|
|
27609
27868
|
{
|
|
27610
27869
|
"id": "excitement",
|
|
@@ -27612,7 +27871,7 @@ var narratives = [
|
|
|
27612
27871
|
"description": "Build anticipation around what's next: availability, partnerships, what the audience can imagine doing with the product. Excitement is how the room exits the keynote into the world.",
|
|
27613
27872
|
"instructions": "Build anticipation",
|
|
27614
27873
|
"slideType": "text",
|
|
27615
|
-
"layoutHint": "text-1x
|
|
27874
|
+
"layoutHint": "text-1x"
|
|
27616
27875
|
},
|
|
27617
27876
|
{
|
|
27618
27877
|
"id": "call-to-action",
|
|
@@ -27620,13 +27879,13 @@ var narratives = [
|
|
|
27620
27879
|
"description": "Give the audience the action that channels the excitement. Pre-order, try it, tell others. Be specific so the energy converts into behavior.",
|
|
27621
27880
|
"instructions": "Urge to explore",
|
|
27622
27881
|
"slideType": "text",
|
|
27623
|
-
"layoutHint": "text-1x
|
|
27882
|
+
"layoutHint": "text-1x"
|
|
27624
27883
|
},
|
|
27625
27884
|
{
|
|
27626
27885
|
"id": "gratitude",
|
|
27627
27886
|
"name": "Gratitude",
|
|
27628
27887
|
"description": "Thank the team that built it and the audience that came. Brief, sincere, not perfunctory. The closing thanks is the period at the end of the keynote.",
|
|
27629
|
-
"layoutHint": "title
|
|
27888
|
+
"layoutHint": "title",
|
|
27630
27889
|
"instructions": "Thank the audience",
|
|
27631
27890
|
"slideType": "text"
|
|
27632
27891
|
}
|
|
@@ -27660,7 +27919,7 @@ var narratives = [
|
|
|
27660
27919
|
"description": "Open with a brief framing of what this update is for and what you intend to leave the audience with. Set the tone \u2014 long-term, candid, principle-driven.",
|
|
27661
27920
|
"instructions": "Overview and objectives",
|
|
27662
27921
|
"slideType": "text",
|
|
27663
|
-
"layoutHint": "text-1x
|
|
27922
|
+
"layoutHint": "text-1x"
|
|
27664
27923
|
},
|
|
27665
27924
|
{
|
|
27666
27925
|
"id": "accomplishments",
|
|
@@ -27668,7 +27927,7 @@ var narratives = [
|
|
|
27668
27927
|
"description": "Showcase the period's most material wins, briefly. The audience came for what's next; wins earn permission for the harder slides ahead, but they aren't the headline.",
|
|
27669
27928
|
"instructions": "Showcase recent achievements",
|
|
27670
27929
|
"slideType": "text",
|
|
27671
|
-
"layoutHint": "text-1x
|
|
27930
|
+
"layoutHint": "text-1x"
|
|
27672
27931
|
},
|
|
27673
27932
|
{
|
|
27674
27933
|
"id": "potential",
|
|
@@ -27676,7 +27935,7 @@ var narratives = [
|
|
|
27676
27935
|
"description": "Detail the market and customer opportunities ahead. Size them honestly and connect them to the work already underway. Potential without specifics reads as wishful.",
|
|
27677
27936
|
"instructions": "Detail market opportunities",
|
|
27678
27937
|
"slideType": "text",
|
|
27679
|
-
"layoutHint": "text-1x
|
|
27938
|
+
"layoutHint": "text-1x"
|
|
27680
27939
|
},
|
|
27681
27940
|
{
|
|
27682
27941
|
"id": "competitive-edge",
|
|
@@ -27684,7 +27943,7 @@ var narratives = [
|
|
|
27684
27943
|
"description": "Reveal the strategic positioning that gives the business its advantage. Frame it as a structural moat, not a list of features. The audience should be able to repeat the moat in their own words.",
|
|
27685
27944
|
"instructions": "Reveal strategic positioning",
|
|
27686
27945
|
"slideType": "text",
|
|
27687
|
-
"layoutHint": "text-1x
|
|
27946
|
+
"layoutHint": "text-1x"
|
|
27688
27947
|
},
|
|
27689
27948
|
{
|
|
27690
27949
|
"id": "long-term-vision",
|
|
@@ -27692,7 +27951,7 @@ var narratives = [
|
|
|
27692
27951
|
"description": "Emphasize the long-term view that anchors decisions. Quarters serve years; years serve decades. Anchor the audience in the time horizon you actually run the business on.",
|
|
27693
27952
|
"instructions": "Emphasize focused future orientation",
|
|
27694
27953
|
"slideType": "text",
|
|
27695
|
-
"layoutHint": "text-1x
|
|
27954
|
+
"layoutHint": "text-1x"
|
|
27696
27955
|
},
|
|
27697
27956
|
{
|
|
27698
27957
|
"id": "performance-metrics",
|
|
@@ -27700,7 +27959,7 @@ var narratives = [
|
|
|
27700
27959
|
"description": "Illuminate the indicators that show the long-term thesis is working. Choose metrics that compound \u2014 retention, NPS, unit economics \u2014 over those that flatter.",
|
|
27701
27960
|
"instructions": "Illuminate growth indicators",
|
|
27702
27961
|
"slideType": "text",
|
|
27703
|
-
"layoutHint": "text-1x
|
|
27962
|
+
"layoutHint": "text-1x"
|
|
27704
27963
|
},
|
|
27705
27964
|
{
|
|
27706
27965
|
"id": "growth-achievement",
|
|
@@ -27708,7 +27967,7 @@ var narratives = [
|
|
|
27708
27967
|
"description": "Certify the tangible progress against the long-term plan. Year-over-year, cohort behavior, expanded reach. Growth, in this beat, is evidence that the strategy is real.",
|
|
27709
27968
|
"instructions": "Certify tangible progress",
|
|
27710
27969
|
"slideType": "text",
|
|
27711
|
-
"layoutHint": "text-1x
|
|
27970
|
+
"layoutHint": "text-1x"
|
|
27712
27971
|
},
|
|
27713
27972
|
{
|
|
27714
27973
|
"id": "strategic-framework",
|
|
@@ -27716,7 +27975,7 @@ var narratives = [
|
|
|
27716
27975
|
"description": "Explain the principles that guide decisions. Customer obsession, long-term thinking, frugality, ownership \u2014 whatever the actual operating discipline is. Principles are the connective tissue between strategy and behavior.",
|
|
27717
27976
|
"instructions": "Explain decision principles",
|
|
27718
27977
|
"slideType": "text",
|
|
27719
|
-
"layoutHint": "text-1x
|
|
27978
|
+
"layoutHint": "text-1x"
|
|
27720
27979
|
},
|
|
27721
27980
|
{
|
|
27722
27981
|
"id": "expansion",
|
|
@@ -27724,7 +27983,7 @@ var narratives = [
|
|
|
27724
27983
|
"description": "Detail the next areas of growth: products, segments, geographies. Tie each to the principles above so the audience sees expansion as continuity rather than scatter.",
|
|
27725
27984
|
"instructions": "Detail growth potential",
|
|
27726
27985
|
"slideType": "text",
|
|
27727
|
-
"layoutHint": "text-1x
|
|
27986
|
+
"layoutHint": "text-1x"
|
|
27728
27987
|
},
|
|
27729
27988
|
{
|
|
27730
27989
|
"id": "future-objectives",
|
|
@@ -27732,7 +27991,7 @@ var narratives = [
|
|
|
27732
27991
|
"description": "Forecast the targets and commitments for the period ahead. Be specific enough to be held accountable. Vague objectives are how strategies erode.",
|
|
27733
27992
|
"instructions": "Forecast upcoming targets",
|
|
27734
27993
|
"slideType": "text",
|
|
27735
|
-
"layoutHint": "text-1x
|
|
27994
|
+
"layoutHint": "text-1x"
|
|
27736
27995
|
},
|
|
27737
27996
|
{
|
|
27738
27997
|
"id": "acknowledgment",
|
|
@@ -27740,13 +27999,13 @@ var narratives = [
|
|
|
27740
27999
|
"description": "Recognize the contributions of teams, customers, and partners that made the period possible. Specific names land harder than blanket thanks.",
|
|
27741
28000
|
"instructions": "Recognize contributions and successes",
|
|
27742
28001
|
"slideType": "text",
|
|
27743
|
-
"layoutHint": "text-1x
|
|
28002
|
+
"layoutHint": "text-1x"
|
|
27744
28003
|
},
|
|
27745
28004
|
{
|
|
27746
28005
|
"id": "closing-remarks",
|
|
27747
28006
|
"name": "Closing Remarks",
|
|
27748
28007
|
"description": "Recap the focus, thank the audience, and inspire the work ahead. End with the line you most want quoted in tomorrow's newsletter.",
|
|
27749
|
-
"layoutHint": "title
|
|
28008
|
+
"layoutHint": "title",
|
|
27750
28009
|
"instructions": "Recap, thank, inspire",
|
|
27751
28010
|
"slideType": "text"
|
|
27752
28011
|
}
|
|
@@ -27777,7 +28036,7 @@ var narratives = [
|
|
|
27777
28036
|
"id": "objectives",
|
|
27778
28037
|
"name": "Objectives",
|
|
27779
28038
|
"description": "Open with what this review is for and what decisions you want out of it. Frame the scope and the hour ahead, so the audience knows what they're being asked to weigh in on.",
|
|
27780
|
-
"layoutHint": "title
|
|
28039
|
+
"layoutHint": "title",
|
|
27781
28040
|
"instructions": "Set the expectations",
|
|
27782
28041
|
"slideType": "text"
|
|
27783
28042
|
},
|
|
@@ -27807,7 +28066,7 @@ var narratives = [
|
|
|
27807
28066
|
"description": "Name the misses and headwinds honestly. What didn't work, what's still hard, what got harder. Pretending things are fine costs more credibility than acknowledging they aren't.",
|
|
27808
28067
|
"instructions": "Address difficulties",
|
|
27809
28068
|
"slideType": "text",
|
|
27810
|
-
"layoutHint": "text-1x
|
|
28069
|
+
"layoutHint": "text-1x"
|
|
27811
28070
|
},
|
|
27812
28071
|
{
|
|
27813
28072
|
"id": "insights",
|
|
@@ -27833,7 +28092,7 @@ var narratives = [
|
|
|
27833
28092
|
"id": "asks",
|
|
27834
28093
|
"name": "Asks",
|
|
27835
28094
|
"description": "Specific, named requests of the audience. Decisions needed, resources required, escalations to unblock. End with clarity on what happens next and who owns it.",
|
|
27836
|
-
"layoutHint": "title
|
|
28095
|
+
"layoutHint": "title"
|
|
27837
28096
|
}
|
|
27838
28097
|
]
|
|
27839
28098
|
},
|
|
@@ -27862,7 +28121,7 @@ var narratives = [
|
|
|
27862
28121
|
"id": "logo",
|
|
27863
28122
|
"name": "Logo",
|
|
27864
28123
|
"description": "Cover slide with logos and the review period. Establishes brand identity and signals the level of formality the rest of the deck will hold to.",
|
|
27865
|
-
"layoutHint": "title
|
|
28124
|
+
"layoutHint": "title",
|
|
27866
28125
|
"instructions": "Identity & representation",
|
|
27867
28126
|
"slideType": "text"
|
|
27868
28127
|
},
|
|
@@ -27872,7 +28131,7 @@ var narratives = [
|
|
|
27872
28131
|
"description": "Frame the meeting context and the goals for the next hour. What you'll cover, what decisions you want, what you don't intend to relitigate.",
|
|
27873
28132
|
"instructions": "Meeting context & goals",
|
|
27874
28133
|
"slideType": "text",
|
|
27875
|
-
"layoutHint": "text-1x
|
|
28134
|
+
"layoutHint": "text-1x"
|
|
27876
28135
|
},
|
|
27877
28136
|
{
|
|
27878
28137
|
"id": "review",
|
|
@@ -27880,7 +28139,7 @@ var narratives = [
|
|
|
27880
28139
|
"description": "Outline the recent activities in scope: launches, projects, programs. Just enough scope-setting that the rest of the deck has shared vocabulary.",
|
|
27881
28140
|
"instructions": "Outline recent activities",
|
|
27882
28141
|
"slideType": "text",
|
|
27883
|
-
"layoutHint": "text-1x
|
|
28142
|
+
"layoutHint": "text-1x"
|
|
27884
28143
|
},
|
|
27885
28144
|
{
|
|
27886
28145
|
"id": "successes",
|
|
@@ -27888,7 +28147,7 @@ var narratives = [
|
|
|
27888
28147
|
"description": "Recognize the achievements in the review window. Lead with outcomes the audience cares about, not effort. Specific moves earn more credibility than aggregate progress.",
|
|
27889
28148
|
"instructions": "Recognize achievements",
|
|
27890
28149
|
"slideType": "text",
|
|
27891
|
-
"layoutHint": "text-1x
|
|
28150
|
+
"layoutHint": "text-1x"
|
|
27892
28151
|
},
|
|
27893
28152
|
{
|
|
27894
28153
|
"id": "challenges",
|
|
@@ -27896,7 +28155,7 @@ var narratives = [
|
|
|
27896
28155
|
"description": "Address the problems faced honestly. What didn't work, what's still hard. Naming challenges in front of the audience earns more trust than letting them ask.",
|
|
27897
28156
|
"instructions": "Address problems faced",
|
|
27898
28157
|
"slideType": "text",
|
|
27899
|
-
"layoutHint": "text-1x
|
|
28158
|
+
"layoutHint": "text-1x"
|
|
27900
28159
|
},
|
|
27901
28160
|
{
|
|
27902
28161
|
"id": "solutions",
|
|
@@ -27904,7 +28163,7 @@ var narratives = [
|
|
|
27904
28163
|
"description": "Discuss the fixes already implemented. Pair each with the result it produced, or, if it's still in flight, with the leading indicator you're watching.",
|
|
27905
28164
|
"instructions": "Discuss implemented fixes",
|
|
27906
28165
|
"slideType": "text",
|
|
27907
|
-
"layoutHint": "text-1x
|
|
28166
|
+
"layoutHint": "text-1x"
|
|
27908
28167
|
},
|
|
27909
28168
|
{
|
|
27910
28169
|
"id": "outcome",
|
|
@@ -27912,7 +28171,7 @@ var narratives = [
|
|
|
27912
28171
|
"description": "Display the results achieved across the review window. Let the data carry the slide; supporting commentary should explain context, not inflate the numbers.",
|
|
27913
28172
|
"instructions": "Display results achieved",
|
|
27914
28173
|
"slideType": "text",
|
|
27915
|
-
"layoutHint": "text-1x
|
|
28174
|
+
"layoutHint": "text-1x"
|
|
27916
28175
|
},
|
|
27917
28176
|
{
|
|
27918
28177
|
"id": "insights",
|
|
@@ -27920,7 +28179,7 @@ var narratives = [
|
|
|
27920
28179
|
"description": "Highlight the key learnings. What was confirmed, what surprised you, what the audience should take away. Insights are the slides people quote in follow-on meetings.",
|
|
27921
28180
|
"instructions": "Highlight key learnings",
|
|
27922
28181
|
"slideType": "text",
|
|
27923
|
-
"layoutHint": "text-1x
|
|
28182
|
+
"layoutHint": "text-1x"
|
|
27924
28183
|
},
|
|
27925
28184
|
{
|
|
27926
28185
|
"id": "future-strategy",
|
|
@@ -27928,7 +28187,7 @@ var narratives = [
|
|
|
27928
28187
|
"description": "Define the next steps and the strategic direction that follows from the review. Specific enough to sequence; flexible enough to adapt.",
|
|
27929
28188
|
"instructions": "Define next steps",
|
|
27930
28189
|
"slideType": "text",
|
|
27931
|
-
"layoutHint": "text-1x
|
|
28190
|
+
"layoutHint": "text-1x"
|
|
27932
28191
|
},
|
|
27933
28192
|
{
|
|
27934
28193
|
"id": "feedback",
|
|
@@ -27936,7 +28195,7 @@ var narratives = [
|
|
|
27936
28195
|
"description": "Capture audience thoughts. Two or three explicit prompts where you want input or alignment. The strength of a relationship review is in the conversation it provokes.",
|
|
27937
28196
|
"instructions": "Capture audience thoughts",
|
|
27938
28197
|
"slideType": "text",
|
|
27939
|
-
"layoutHint": "text-1x
|
|
28198
|
+
"layoutHint": "text-1x"
|
|
27940
28199
|
},
|
|
27941
28200
|
{
|
|
27942
28201
|
"id": "next-review",
|
|
@@ -27944,13 +28203,13 @@ var narratives = [
|
|
|
27944
28203
|
"description": "Plan for follow-up: when the next review happens, what evidence you'll bring, what decisions are deferred until then. Continuity is the point of the cadence.",
|
|
27945
28204
|
"instructions": "Plan for follow-up",
|
|
27946
28205
|
"slideType": "text",
|
|
27947
|
-
"layoutHint": "text-1x
|
|
28206
|
+
"layoutHint": "text-1x"
|
|
27948
28207
|
},
|
|
27949
28208
|
{
|
|
27950
28209
|
"id": "closing",
|
|
27951
28210
|
"name": "Closing",
|
|
27952
28211
|
"description": "Recap and express optimism about the path forward. Close with the next concrete step and the people responsible for it.",
|
|
27953
|
-
"layoutHint": "title
|
|
28212
|
+
"layoutHint": "title",
|
|
27954
28213
|
"instructions": "Recap and express optimism",
|
|
27955
28214
|
"slideType": "text"
|
|
27956
28215
|
}
|
|
@@ -27982,7 +28241,7 @@ var narratives = [
|
|
|
27982
28241
|
"id": "introduction",
|
|
27983
28242
|
"name": "Introduction",
|
|
27984
28243
|
"description": "Set the tone for the meeting and walk through the agenda in one slide. Signal which sections are for discussion versus information so directors know where their time is most valuable.",
|
|
27985
|
-
"layoutHint": "title
|
|
28244
|
+
"layoutHint": "title",
|
|
27986
28245
|
"instructions": "Set the tone",
|
|
27987
28246
|
"slideType": "text"
|
|
27988
28247
|
},
|
|
@@ -27992,7 +28251,7 @@ var narratives = [
|
|
|
27992
28251
|
"description": "Deliver the CEO's view of the period: what changed, what mattered, where the company stands. Two or three sentences in the speaker's voice \u2014 board members read this slide first.",
|
|
27993
28252
|
"instructions": "Deliver company insights",
|
|
27994
28253
|
"slideType": "text",
|
|
27995
|
-
"layoutHint": "text-1x
|
|
28254
|
+
"layoutHint": "text-1x"
|
|
27996
28255
|
},
|
|
27997
28256
|
{
|
|
27998
28257
|
"id": "highlights",
|
|
@@ -28000,7 +28259,7 @@ var narratives = [
|
|
|
28000
28259
|
"description": "Share major successes across the business. Customer wins, launches, hires, milestones. Specific and brief; this is the slide that sets the tone, not the slide that proves the case.",
|
|
28001
28260
|
"instructions": "Share major successes",
|
|
28002
28261
|
"slideType": "text",
|
|
28003
|
-
"layoutHint": "text-1x
|
|
28262
|
+
"layoutHint": "text-1x"
|
|
28004
28263
|
},
|
|
28005
28264
|
{
|
|
28006
28265
|
"id": "challenges",
|
|
@@ -28008,7 +28267,7 @@ var narratives = [
|
|
|
28008
28267
|
"description": "Address the obstacles facing the business honestly. Boards earn their value when surfaced to real problems; under-disclosure here erodes trust faster than the problems themselves.",
|
|
28009
28268
|
"instructions": "Address potential obstacles",
|
|
28010
28269
|
"slideType": "text",
|
|
28011
|
-
"layoutHint": "text-1x
|
|
28270
|
+
"layoutHint": "text-1x"
|
|
28012
28271
|
},
|
|
28013
28272
|
{
|
|
28014
28273
|
"id": "company-needs",
|
|
@@ -28016,7 +28275,7 @@ var narratives = [
|
|
|
28016
28275
|
"description": "Identify where the business needs the board's help: introductions, decisions, advice. Specific asks turn the meeting from a report into a working session.",
|
|
28017
28276
|
"instructions": "Identify support requirements",
|
|
28018
28277
|
"slideType": "text",
|
|
28019
|
-
"layoutHint": "text-1x
|
|
28278
|
+
"layoutHint": "text-1x"
|
|
28020
28279
|
},
|
|
28021
28280
|
{
|
|
28022
28281
|
"id": "funnel-metrics",
|
|
@@ -28024,7 +28283,7 @@ var narratives = [
|
|
|
28024
28283
|
"description": "Discuss the sales pipeline: leads, conversion, velocity, win rate. Use the metrics that match the company's current motion; resist the temptation to show the same chart you showed last quarter for continuity's sake.",
|
|
28025
28284
|
"instructions": "Discuss sales progress",
|
|
28026
28285
|
"slideType": "text",
|
|
28027
|
-
"layoutHint": "text-1x
|
|
28286
|
+
"layoutHint": "text-1x"
|
|
28028
28287
|
},
|
|
28029
28288
|
{
|
|
28030
28289
|
"id": "engagement-metrics",
|
|
@@ -28032,7 +28291,7 @@ var narratives = [
|
|
|
28032
28291
|
"description": "Analyze customer interaction: usage, retention, NPS, expansion. Show whether the product is being loved or only being bought.",
|
|
28033
28292
|
"instructions": "Analyze customer interaction",
|
|
28034
28293
|
"slideType": "text",
|
|
28035
|
-
"layoutHint": "text-1x
|
|
28294
|
+
"layoutHint": "text-1x"
|
|
28036
28295
|
},
|
|
28037
28296
|
{
|
|
28038
28297
|
"id": "financial-metrics",
|
|
@@ -28040,7 +28299,7 @@ var narratives = [
|
|
|
28040
28299
|
"description": "Review fiscal health: revenue, gross margin, burn, runway, cash. One slide directors can scan in twenty seconds and trust the numbers on.",
|
|
28041
28300
|
"instructions": "Review fiscal health",
|
|
28042
28301
|
"slideType": "text",
|
|
28043
|
-
"layoutHint": "text-1x
|
|
28302
|
+
"layoutHint": "text-1x"
|
|
28044
28303
|
},
|
|
28045
28304
|
{
|
|
28046
28305
|
"id": "performance-vs-plan",
|
|
@@ -28048,7 +28307,7 @@ var narratives = [
|
|
|
28048
28307
|
"description": "Compare actuals to plan across the metrics that matter most. Variance is the slide directors will probe; show your work, name the drivers, propose adjustments.",
|
|
28049
28308
|
"instructions": "Compare objectives and actuals",
|
|
28050
28309
|
"slideType": "text",
|
|
28051
|
-
"layoutHint": "text-1x
|
|
28310
|
+
"layoutHint": "text-1x"
|
|
28052
28311
|
},
|
|
28053
28312
|
{
|
|
28054
28313
|
"id": "org-chart",
|
|
@@ -28056,7 +28315,7 @@ var narratives = [
|
|
|
28056
28315
|
"description": "Present the team structure and any key changes since the last meeting. Directors track org evolution as a leading indicator; help them see hires, departures, and reshapes clearly.",
|
|
28057
28316
|
"instructions": "Present team structure",
|
|
28058
28317
|
"slideType": "text",
|
|
28059
|
-
"layoutHint": "text-1x
|
|
28318
|
+
"layoutHint": "text-1x"
|
|
28060
28319
|
},
|
|
28061
28320
|
{
|
|
28062
28321
|
"id": "product-roadmap",
|
|
@@ -28064,7 +28323,7 @@ var narratives = [
|
|
|
28064
28323
|
"description": "Highlight the product plan and what ships when. Pair each major bet with the customer or business outcome it serves.",
|
|
28065
28324
|
"instructions": "Highlight future plans",
|
|
28066
28325
|
"slideType": "text",
|
|
28067
|
-
"layoutHint": "text-1x
|
|
28326
|
+
"layoutHint": "text-1x"
|
|
28068
28327
|
},
|
|
28069
28328
|
{
|
|
28070
28329
|
"id": "quality",
|
|
@@ -28072,7 +28331,7 @@ var narratives = [
|
|
|
28072
28331
|
"description": "Showcase the product quality bar: reliability, defect rates, support outcomes. Directors take quality as a proxy for engineering culture; let the data speak.",
|
|
28073
28332
|
"instructions": "Showcase product's standards",
|
|
28074
28333
|
"slideType": "text",
|
|
28075
|
-
"layoutHint": "text-1x
|
|
28334
|
+
"layoutHint": "text-1x"
|
|
28076
28335
|
},
|
|
28077
28336
|
{
|
|
28078
28337
|
"id": "engineering-update",
|
|
@@ -28080,7 +28339,7 @@ var narratives = [
|
|
|
28080
28339
|
"description": "Communicate technical progress, key bets, and platform investments. Translate engineering work into business consequences directors can evaluate.",
|
|
28081
28340
|
"instructions": "Communicate technical progress",
|
|
28082
28341
|
"slideType": "text",
|
|
28083
|
-
"layoutHint": "text-1x
|
|
28342
|
+
"layoutHint": "text-1x"
|
|
28084
28343
|
},
|
|
28085
28344
|
{
|
|
28086
28345
|
"id": "marketing-update",
|
|
@@ -28088,7 +28347,7 @@ var narratives = [
|
|
|
28088
28347
|
"description": "Update on demand-gen, brand, and category-shaping efforts. Connect spend to pipeline and pipeline to revenue; avoid 'campaigns we ran' lists.",
|
|
28089
28348
|
"instructions": "Update on promotional efforts",
|
|
28090
28349
|
"slideType": "text",
|
|
28091
|
-
"layoutHint": "text-1x
|
|
28350
|
+
"layoutHint": "text-1x"
|
|
28092
28351
|
},
|
|
28093
28352
|
{
|
|
28094
28353
|
"id": "business-development-update",
|
|
@@ -28096,7 +28355,7 @@ var narratives = [
|
|
|
28096
28355
|
"description": "Speak to growth initiatives: partnerships, channels, alliances. Each entry should have a stage, an owner, and a credible upside.",
|
|
28097
28356
|
"instructions": "Speak on growth initiatives",
|
|
28098
28357
|
"slideType": "text",
|
|
28099
|
-
"layoutHint": "text-1x
|
|
28358
|
+
"layoutHint": "text-1x"
|
|
28100
28359
|
},
|
|
28101
28360
|
{
|
|
28102
28361
|
"id": "operations-update",
|
|
@@ -28104,7 +28363,7 @@ var narratives = [
|
|
|
28104
28363
|
"description": "Discuss day-to-day operations: people ops, finance, legal, IT. Brief but explicit \u2014 directors notice when ops is missing.",
|
|
28105
28364
|
"instructions": "Discuss day-to-day activities",
|
|
28106
28365
|
"slideType": "text",
|
|
28107
|
-
"layoutHint": "text-1x
|
|
28366
|
+
"layoutHint": "text-1x"
|
|
28108
28367
|
},
|
|
28109
28368
|
{
|
|
28110
28369
|
"id": "special-topic-1",
|
|
@@ -28112,7 +28371,7 @@ var narratives = [
|
|
|
28112
28371
|
"description": "Discuss the period's first deep-dive topic. This is where the board does its highest-leverage work; pose the question, show the analysis, ask for their view.",
|
|
28113
28372
|
"instructions": "Discuss selected subject",
|
|
28114
28373
|
"slideType": "text",
|
|
28115
|
-
"layoutHint": "text-1x
|
|
28374
|
+
"layoutHint": "text-1x"
|
|
28116
28375
|
},
|
|
28117
28376
|
{
|
|
28118
28377
|
"id": "special-topic-2",
|
|
@@ -28120,7 +28379,7 @@ var narratives = [
|
|
|
28120
28379
|
"description": "Cover the second deep-dive topic, framed the same way. Two specials per meeting; more, and the meeting becomes a recital.",
|
|
28121
28380
|
"instructions": "Touch on additional topic",
|
|
28122
28381
|
"slideType": "text",
|
|
28123
|
-
"layoutHint": "text-1x
|
|
28382
|
+
"layoutHint": "text-1x"
|
|
28124
28383
|
},
|
|
28125
28384
|
{
|
|
28126
28385
|
"id": "feedback",
|
|
@@ -28128,7 +28387,7 @@ var narratives = [
|
|
|
28128
28387
|
"description": "Elicit the board's perspective with concrete prompts. The strength of board governance is in its candor \u2014 invite it explicitly.",
|
|
28129
28388
|
"instructions": "Elicit board's thoughts",
|
|
28130
28389
|
"slideType": "text",
|
|
28131
|
-
"layoutHint": "text-1x
|
|
28390
|
+
"layoutHint": "text-1x"
|
|
28132
28391
|
},
|
|
28133
28392
|
{
|
|
28134
28393
|
"id": "formalities",
|
|
@@ -28136,13 +28395,13 @@ var narratives = [
|
|
|
28136
28395
|
"description": "Conclude with the necessary governance items: votes, approvals, committee reports, document acknowledgments. Run them efficiently and document the outcomes.",
|
|
28137
28396
|
"instructions": "Conclude with necessary formalities",
|
|
28138
28397
|
"slideType": "text",
|
|
28139
|
-
"layoutHint": "text-1x
|
|
28398
|
+
"layoutHint": "text-1x"
|
|
28140
28399
|
},
|
|
28141
28400
|
{
|
|
28142
28401
|
"id": "closing-remarks",
|
|
28143
28402
|
"name": "Closing Remarks",
|
|
28144
28403
|
"description": "Close with concluding observations and the agenda for the next meeting. End on a forward-looking note; directors should leave knowing what to watch.",
|
|
28145
|
-
"layoutHint": "title
|
|
28404
|
+
"layoutHint": "title",
|
|
28146
28405
|
"instructions": "Concluding observations",
|
|
28147
28406
|
"slideType": "text"
|
|
28148
28407
|
}
|
|
@@ -28173,7 +28432,7 @@ var narratives = [
|
|
|
28173
28432
|
"id": "opening",
|
|
28174
28433
|
"name": "Opening",
|
|
28175
28434
|
"description": "Open with the initiative name, the date, and the one-line headline for the week. Frame the meeting in fifteen seconds so the rest of the time is content.",
|
|
28176
|
-
"layoutHint": "title
|
|
28435
|
+
"layoutHint": "title",
|
|
28177
28436
|
"instructions": "Initiative name & date",
|
|
28178
28437
|
"slideType": "text"
|
|
28179
28438
|
},
|
|
@@ -28183,7 +28442,7 @@ var narratives = [
|
|
|
28183
28442
|
"description": "State what the team set out to do this week. Specific, measurable. The audience should be able to read this slide alone and know what 'on track' would mean.",
|
|
28184
28443
|
"instructions": "Set the expectations",
|
|
28185
28444
|
"slideType": "text",
|
|
28186
|
-
"layoutHint": "text-1x
|
|
28445
|
+
"layoutHint": "text-1x"
|
|
28187
28446
|
},
|
|
28188
28447
|
{
|
|
28189
28448
|
"id": "achievements",
|
|
@@ -28191,7 +28450,7 @@ var narratives = [
|
|
|
28191
28450
|
"description": "Celebrate the week's wins. Concrete, attributable, dated. Brevity here \u2014 the meeting is for what's next, not a victory lap.",
|
|
28192
28451
|
"instructions": "Celebrate success",
|
|
28193
28452
|
"slideType": "text",
|
|
28194
|
-
"layoutHint": "text-1x
|
|
28453
|
+
"layoutHint": "text-1x"
|
|
28195
28454
|
},
|
|
28196
28455
|
{
|
|
28197
28456
|
"id": "overall-progress",
|
|
@@ -28199,7 +28458,7 @@ var narratives = [
|
|
|
28199
28458
|
"description": "Evaluate performance against the objectives. Use a simple status indicator (green/yellow/red) plus the leading metric. Help the audience scan the state in seconds.",
|
|
28200
28459
|
"instructions": "Evaluate performance",
|
|
28201
28460
|
"slideType": "text",
|
|
28202
|
-
"layoutHint": "text-1x
|
|
28461
|
+
"layoutHint": "text-1x"
|
|
28203
28462
|
},
|
|
28204
28463
|
{
|
|
28205
28464
|
"id": "challenges",
|
|
@@ -28207,7 +28466,7 @@ var narratives = [
|
|
|
28207
28466
|
"description": "Address what's hard right now: blockers, slipping items, surfaced risks. Tie each challenge to either an owner working it or a discussion you want this week.",
|
|
28208
28467
|
"instructions": "Address difficulties",
|
|
28209
28468
|
"slideType": "text",
|
|
28210
|
-
"layoutHint": "text-1x
|
|
28469
|
+
"layoutHint": "text-1x"
|
|
28211
28470
|
},
|
|
28212
28471
|
{
|
|
28213
28472
|
"id": "opportunities-for-improvement",
|
|
@@ -28215,7 +28474,7 @@ var narratives = [
|
|
|
28215
28474
|
"description": "Surface where the team can level up. Process tweaks, tooling needs, ways of working. Improvement opportunities should feel like seeds, not corrections.",
|
|
28216
28475
|
"instructions": "Seek growth",
|
|
28217
28476
|
"slideType": "text",
|
|
28218
|
-
"layoutHint": "text-1x
|
|
28477
|
+
"layoutHint": "text-1x"
|
|
28219
28478
|
},
|
|
28220
28479
|
{
|
|
28221
28480
|
"id": "highlights-recognition",
|
|
@@ -28223,7 +28482,7 @@ var narratives = [
|
|
|
28223
28482
|
"description": "Recognize specific contributions by name. Recognition belongs in the deck, not just in the meeting \u2014 written acknowledgment travels further than verbal.",
|
|
28224
28483
|
"instructions": "Appreciate efforts",
|
|
28225
28484
|
"slideType": "text",
|
|
28226
|
-
"layoutHint": "text-1x
|
|
28485
|
+
"layoutHint": "text-1x"
|
|
28227
28486
|
},
|
|
28228
28487
|
{
|
|
28229
28488
|
"id": "goals-next-week",
|
|
@@ -28231,7 +28490,7 @@ var narratives = [
|
|
|
28231
28490
|
"description": "Plan the week ahead with three to five specific goals. Each should be small enough to finish, large enough to matter, and clearly owned.",
|
|
28232
28491
|
"instructions": "Plan ahead",
|
|
28233
28492
|
"slideType": "text",
|
|
28234
|
-
"layoutHint": "text-1x
|
|
28493
|
+
"layoutHint": "text-1x"
|
|
28235
28494
|
},
|
|
28236
28495
|
{
|
|
28237
28496
|
"id": "discussion-feedback",
|
|
@@ -28239,13 +28498,13 @@ var narratives = [
|
|
|
28239
28498
|
"description": "Open the floor with two or three prompts \u2014 decisions you need, opinions you want, blockers you'd like cleared. End the recap actively.",
|
|
28240
28499
|
"instructions": "Encourage input",
|
|
28241
28500
|
"slideType": "text",
|
|
28242
|
-
"layoutHint": "text-1x
|
|
28501
|
+
"layoutHint": "text-1x"
|
|
28243
28502
|
},
|
|
28244
28503
|
{
|
|
28245
28504
|
"id": "conclusion",
|
|
28246
28505
|
"name": "Conclusion",
|
|
28247
28506
|
"description": "Close with one line that motivates the team into the next week. Echo the headline so the meeting feels closed.",
|
|
28248
|
-
"layoutHint": "title
|
|
28507
|
+
"layoutHint": "title",
|
|
28249
28508
|
"instructions": "Recap & motivate",
|
|
28250
28509
|
"slideType": "text"
|
|
28251
28510
|
}
|
|
@@ -28277,7 +28536,7 @@ var narratives = [
|
|
|
28277
28536
|
"id": "headline",
|
|
28278
28537
|
"name": "Headline",
|
|
28279
28538
|
"description": "Open with the single most important sentence the audience needs to know \u2014 on track, off track, or shifted. The headline replaces 'how's it going' with a clear answer.",
|
|
28280
|
-
"layoutHint": "title
|
|
28539
|
+
"layoutHint": "title",
|
|
28281
28540
|
"instructions": "Title & date",
|
|
28282
28541
|
"slideType": "text"
|
|
28283
28542
|
},
|
|
@@ -28287,7 +28546,7 @@ var narratives = [
|
|
|
28287
28546
|
"description": "State the objective for the period and what was promised. One slide, three lines. Frames the rest of the update so progress is read against a clear bar.",
|
|
28288
28547
|
"instructions": "Summary/objectives",
|
|
28289
28548
|
"slideType": "text",
|
|
28290
|
-
"layoutHint": "text-1x
|
|
28549
|
+
"layoutHint": "text-1x"
|
|
28291
28550
|
},
|
|
28292
28551
|
{
|
|
28293
28552
|
"id": "progress",
|
|
@@ -28295,7 +28554,7 @@ var narratives = [
|
|
|
28295
28554
|
"description": "Walk through the actions taken since the last update. Specific, attributable, dated. Avoid effort theater \u2014 list outcomes and material moves, not activity for its own sake.",
|
|
28296
28555
|
"instructions": "Explain actions taken",
|
|
28297
28556
|
"slideType": "text",
|
|
28298
|
-
"layoutHint": "text-1x
|
|
28557
|
+
"layoutHint": "text-1x"
|
|
28299
28558
|
},
|
|
28300
28559
|
{
|
|
28301
28560
|
"id": "results",
|
|
@@ -28303,7 +28562,7 @@ var narratives = [
|
|
|
28303
28562
|
"description": "Show the outcomes those actions produced. Metrics, customer signals, decisions made. Keep the comparison crisp \u2014 versus plan, versus last period, versus benchmark.",
|
|
28304
28563
|
"instructions": "Show outcomes",
|
|
28305
28564
|
"slideType": "text",
|
|
28306
|
-
"layoutHint": "text-1x
|
|
28565
|
+
"layoutHint": "text-1x"
|
|
28307
28566
|
},
|
|
28308
28567
|
{
|
|
28309
28568
|
"id": "action-plan",
|
|
@@ -28311,13 +28570,13 @@ var narratives = [
|
|
|
28311
28570
|
"description": "Outline the next steps and who owns them. Be specific about the next decision point and what would have to happen to slip the schedule.",
|
|
28312
28571
|
"instructions": "Outline next steps",
|
|
28313
28572
|
"slideType": "text",
|
|
28314
|
-
"layoutHint": "text-1x
|
|
28573
|
+
"layoutHint": "text-1x"
|
|
28315
28574
|
},
|
|
28316
28575
|
{
|
|
28317
28576
|
"id": "feedback",
|
|
28318
28577
|
"name": "Feedback",
|
|
28319
28578
|
"description": "Invite the audience to weigh in: where you'd like input, where you need a decision, where help would unblock you. End the update with an open hand, not a closed file.",
|
|
28320
|
-
"layoutHint": "title
|
|
28579
|
+
"layoutHint": "title",
|
|
28321
28580
|
"instructions": "Ask for response",
|
|
28322
28581
|
"slideType": "text"
|
|
28323
28582
|
}
|
|
@@ -28348,7 +28607,7 @@ var narratives = [
|
|
|
28348
28607
|
"id": "briefing",
|
|
28349
28608
|
"name": "Briefing",
|
|
28350
28609
|
"description": "Frame what this review covers: the period, the unit, the standard you're measuring against. One slide that lets the audience know exactly what they're being asked to evaluate.",
|
|
28351
|
-
"layoutHint": "title
|
|
28610
|
+
"layoutHint": "title",
|
|
28352
28611
|
"instructions": "Outline presentation objective",
|
|
28353
28612
|
"slideType": "text"
|
|
28354
28613
|
},
|
|
@@ -28358,7 +28617,7 @@ var narratives = [
|
|
|
28358
28617
|
"description": "Lead with the headline result. On track, ahead, or behind, and by how much. Resist softening \u2014 clear numbers up front earn credibility for the analysis that follows.",
|
|
28359
28618
|
"instructions": "Summarize performance findings",
|
|
28360
28619
|
"slideType": "text",
|
|
28361
|
-
"layoutHint": "text-1x
|
|
28620
|
+
"layoutHint": "text-1x"
|
|
28362
28621
|
},
|
|
28363
28622
|
{
|
|
28364
28623
|
"id": "key-metrics",
|
|
@@ -28366,7 +28625,7 @@ var narratives = [
|
|
|
28366
28625
|
"description": "Walk through the pivotal indicators. One chart per metric, clear comparison period, target or benchmark visible on the same frame. Help the audience see the data the way you do.",
|
|
28367
28626
|
"instructions": "Review pivotal indicators",
|
|
28368
28627
|
"slideType": "text",
|
|
28369
|
-
"layoutHint": "text-1x
|
|
28628
|
+
"layoutHint": "text-1x"
|
|
28370
28629
|
},
|
|
28371
28630
|
{
|
|
28372
28631
|
"id": "team-performance",
|
|
@@ -28374,7 +28633,7 @@ var narratives = [
|
|
|
28374
28633
|
"description": "Examine collective achievements and how the team contributed. Avoid generic praise; cite specific moves and the people behind them where the audience would expect it.",
|
|
28375
28634
|
"instructions": "Examine collective achievements",
|
|
28376
28635
|
"slideType": "text",
|
|
28377
|
-
"layoutHint": "text-1x
|
|
28636
|
+
"layoutHint": "text-1x"
|
|
28378
28637
|
},
|
|
28379
28638
|
{
|
|
28380
28639
|
"id": "highlight",
|
|
@@ -28382,7 +28641,7 @@ var narratives = [
|
|
|
28382
28641
|
"description": "Spotlight one standout contribution that defined the period. A landmark deal, a launch, a fix, a hire. One vivid example sticks longer than a list of accomplishments.",
|
|
28383
28642
|
"instructions": "Show key contribution",
|
|
28384
28643
|
"slideType": "text",
|
|
28385
|
-
"layoutHint": "text-1x
|
|
28644
|
+
"layoutHint": "text-1x"
|
|
28386
28645
|
},
|
|
28387
28646
|
{
|
|
28388
28647
|
"id": "analysis",
|
|
@@ -28390,7 +28649,7 @@ var narratives = [
|
|
|
28390
28649
|
"description": "Dig under the metrics. What drove the numbers, what held them back, what's signal versus noise. Analysis is where the audience learns whether you actually understand the system you're reporting on.",
|
|
28391
28650
|
"instructions": "Uncover data insights",
|
|
28392
28651
|
"slideType": "text",
|
|
28393
|
-
"layoutHint": "text-1x
|
|
28652
|
+
"layoutHint": "text-1x"
|
|
28394
28653
|
},
|
|
28395
28654
|
{
|
|
28396
28655
|
"id": "success",
|
|
@@ -28398,7 +28657,7 @@ var narratives = [
|
|
|
28398
28657
|
"description": "Reinforce the past triumphs that show the system works. Briefly \u2014 the audience came for what's next, not a victory lap. Wins earn permission for the harder slides ahead.",
|
|
28399
28658
|
"instructions": "Reinforce past triumphs",
|
|
28400
28659
|
"slideType": "text",
|
|
28401
|
-
"layoutHint": "text-1x
|
|
28660
|
+
"layoutHint": "text-1x"
|
|
28402
28661
|
},
|
|
28403
28662
|
{
|
|
28404
28663
|
"id": "challenges",
|
|
@@ -28406,7 +28665,7 @@ var narratives = [
|
|
|
28406
28665
|
"description": "Name the obstacles encountered honestly. What didn't move, what regressed, what the team is still wrestling with. Understated challenges read as missed signal, not modesty.",
|
|
28407
28666
|
"instructions": "Highlight encountered obstacles",
|
|
28408
28667
|
"slideType": "text",
|
|
28409
|
-
"layoutHint": "text-1x
|
|
28668
|
+
"layoutHint": "text-1x"
|
|
28410
28669
|
},
|
|
28411
28670
|
{
|
|
28412
28671
|
"id": "adjustments",
|
|
@@ -28414,7 +28673,7 @@ var narratives = [
|
|
|
28414
28673
|
"description": "Identify the changes you're making in response. New tactics, reallocations, sunsets. Each adjustment should map to a challenge above \u2014 adjustments without diagnosis feel arbitrary.",
|
|
28415
28674
|
"instructions": "Identify necessary changes",
|
|
28416
28675
|
"slideType": "text",
|
|
28417
|
-
"layoutHint": "text-1x
|
|
28676
|
+
"layoutHint": "text-1x"
|
|
28418
28677
|
},
|
|
28419
28678
|
{
|
|
28420
28679
|
"id": "strategy-evolution",
|
|
@@ -28422,13 +28681,13 @@ var narratives = [
|
|
|
28422
28681
|
"description": "Show how the strategy itself evolves heading into the next period. Refinements, sharpened bets, dropped initiatives. The audience should see continuity as well as change.",
|
|
28423
28682
|
"instructions": "Plan for improvement",
|
|
28424
28683
|
"slideType": "text",
|
|
28425
|
-
"layoutHint": "text-1x
|
|
28684
|
+
"layoutHint": "text-1x"
|
|
28426
28685
|
},
|
|
28427
28686
|
{
|
|
28428
28687
|
"id": "discussion",
|
|
28429
28688
|
"name": "Discussion",
|
|
28430
28689
|
"description": "Open the floor with two or three specific prompts. End the review actively \u2014 questions you want answered, decisions you want made \u2014 so the meeting yields more than the deck.",
|
|
28431
|
-
"layoutHint": "title
|
|
28690
|
+
"layoutHint": "title",
|
|
28432
28691
|
"instructions": "Promote active discourse",
|
|
28433
28692
|
"slideType": "text"
|
|
28434
28693
|
}
|
|
@@ -28462,7 +28721,7 @@ var narratives = [
|
|
|
28462
28721
|
"description": "Open by naming the question the survey was meant to answer. Why this, why now, who commissioned it. Anchor the audience in the decision the survey is designed to inform.",
|
|
28463
28722
|
"instructions": "Present survey topic",
|
|
28464
28723
|
"slideType": "text",
|
|
28465
|
-
"layoutHint": "text-1x
|
|
28724
|
+
"layoutHint": "text-1x"
|
|
28466
28725
|
},
|
|
28467
28726
|
{
|
|
28468
28727
|
"id": "executive-summary",
|
|
@@ -28470,7 +28729,7 @@ var narratives = [
|
|
|
28470
28729
|
"description": "State the top three findings in plain language on a single slide. A reader who only sees this slide should still be able to make the right call. Avoid hedging \u2014 synthesis is the point.",
|
|
28471
28730
|
"instructions": "Summarize key findings",
|
|
28472
28731
|
"slideType": "text",
|
|
28473
|
-
"layoutHint": "text-1x
|
|
28732
|
+
"layoutHint": "text-1x"
|
|
28474
28733
|
},
|
|
28475
28734
|
{
|
|
28476
28735
|
"id": "context",
|
|
@@ -28478,7 +28737,7 @@ var narratives = [
|
|
|
28478
28737
|
"description": "Detail the situation behind the survey: prior knowledge, related research, the gap this work fills. Just enough to position the findings as new information rather than restated common sense.",
|
|
28479
28738
|
"instructions": "Detail survey background",
|
|
28480
28739
|
"slideType": "text",
|
|
28481
|
-
"layoutHint": "text-1x
|
|
28740
|
+
"layoutHint": "text-1x"
|
|
28482
28741
|
},
|
|
28483
28742
|
{
|
|
28484
28743
|
"id": "data-methodology",
|
|
@@ -28486,7 +28745,7 @@ var narratives = [
|
|
|
28486
28745
|
"description": "Describe how the data was collected and from whom. Sample size, recruitment, instrument, timing. Be honest about limitations; methodological transparency is what gives the findings their weight.",
|
|
28487
28746
|
"instructions": "Discuss sourcing and collection",
|
|
28488
28747
|
"slideType": "text",
|
|
28489
|
-
"layoutHint": "text-1x
|
|
28748
|
+
"layoutHint": "text-1x"
|
|
28490
28749
|
},
|
|
28491
28750
|
{
|
|
28492
28751
|
"id": "data-summary",
|
|
@@ -28494,7 +28753,7 @@ var narratives = [
|
|
|
28494
28753
|
"description": "Give the audience an overview of the dataset before drilling in. Demographics, response rates, distribution of key variables. Help them calibrate what 'most' and 'few' mean in this study.",
|
|
28495
28754
|
"instructions": "Provide data overview",
|
|
28496
28755
|
"slideType": "text",
|
|
28497
|
-
"layoutHint": "text-1x
|
|
28756
|
+
"layoutHint": "text-1x"
|
|
28498
28757
|
},
|
|
28499
28758
|
{
|
|
28500
28759
|
"id": "findings",
|
|
@@ -28502,7 +28761,7 @@ var narratives = [
|
|
|
28502
28761
|
"description": "Present the key insights one at a time. Lead each finding with the claim, then the chart. Avoid burying the point under the visualization \u2014 captions should restate the insight in words.",
|
|
28503
28762
|
"instructions": "Highlight key insights",
|
|
28504
28763
|
"slideType": "text",
|
|
28505
|
-
"layoutHint": "text-1x
|
|
28764
|
+
"layoutHint": "text-1x"
|
|
28506
28765
|
},
|
|
28507
28766
|
{
|
|
28508
28767
|
"id": "data-analysis",
|
|
@@ -28510,7 +28769,7 @@ var narratives = [
|
|
|
28510
28769
|
"description": "Break down the data behind each finding: cross-tabs, segment splits, statistical confidence. This is the slide skeptics will scrutinize \u2014 make it scrutinizable.",
|
|
28511
28770
|
"instructions": "Break down data",
|
|
28512
28771
|
"slideType": "text",
|
|
28513
|
-
"layoutHint": "text-1x
|
|
28772
|
+
"layoutHint": "text-1x"
|
|
28514
28773
|
},
|
|
28515
28774
|
{
|
|
28516
28775
|
"id": "implications",
|
|
@@ -28518,7 +28777,7 @@ var narratives = [
|
|
|
28518
28777
|
"description": "Translate findings into 'so what.' What changes for product, marketing, ops, the customer? Implications without consequences are interesting trivia, not research.",
|
|
28519
28778
|
"instructions": "Discuss survey implications",
|
|
28520
28779
|
"slideType": "text",
|
|
28521
|
-
"layoutHint": "text-1x
|
|
28780
|
+
"layoutHint": "text-1x"
|
|
28522
28781
|
},
|
|
28523
28782
|
{
|
|
28524
28783
|
"id": "recommendations",
|
|
@@ -28526,13 +28785,13 @@ var narratives = [
|
|
|
28526
28785
|
"description": "Provide the actions that follow from the implications. Prioritize, attach owners, mark which require decisions. This is where research becomes useful.",
|
|
28527
28786
|
"instructions": "Provide action plans",
|
|
28528
28787
|
"slideType": "text",
|
|
28529
|
-
"layoutHint": "text-1x
|
|
28788
|
+
"layoutHint": "text-1x"
|
|
28530
28789
|
},
|
|
28531
28790
|
{
|
|
28532
28791
|
"id": "conclusion",
|
|
28533
28792
|
"name": "Conclusion",
|
|
28534
28793
|
"description": "Recap the headline finding and the most important recommendation. End with the next step \u2014 a follow-on study, a workshop, a decision \u2014 so the work doesn't sit on a shelf.",
|
|
28535
|
-
"layoutHint": "title
|
|
28794
|
+
"layoutHint": "title",
|
|
28536
28795
|
"instructions": "Recap and finalize",
|
|
28537
28796
|
"slideType": "text"
|
|
28538
28797
|
}
|
|
@@ -28565,7 +28824,7 @@ var narratives = [
|
|
|
28565
28824
|
"description": "Open by establishing why this trend matters now. Tie it to a decision on the table or a forecast that's about to be made. Trends without consequences are filler.",
|
|
28566
28825
|
"instructions": "Ignite interest, establish significance",
|
|
28567
28826
|
"slideType": "text",
|
|
28568
|
-
"layoutHint": "text-1x
|
|
28827
|
+
"layoutHint": "text-1x"
|
|
28569
28828
|
},
|
|
28570
28829
|
{
|
|
28571
28830
|
"id": "historical-comparison",
|
|
@@ -28573,7 +28832,7 @@ var narratives = [
|
|
|
28573
28832
|
"description": "Contrast current data with the relevant past. Pick the comparison window that makes the trend visible without cherry-picking. Be honest about base effects.",
|
|
28574
28833
|
"instructions": "Contrast current and past data",
|
|
28575
28834
|
"slideType": "text",
|
|
28576
|
-
"layoutHint": "text-1x
|
|
28835
|
+
"layoutHint": "text-1x"
|
|
28577
28836
|
},
|
|
28578
28837
|
{
|
|
28579
28838
|
"id": "pattern-identification",
|
|
@@ -28581,7 +28840,7 @@ var narratives = [
|
|
|
28581
28840
|
"description": "Name the recurring outcome you've spotted. Use one or two strong charts that show the pattern unambiguously. Avoid overclaiming significance from a small N.",
|
|
28582
28841
|
"instructions": "Point out recurring outcomes",
|
|
28583
28842
|
"slideType": "text",
|
|
28584
|
-
"layoutHint": "text-1x
|
|
28843
|
+
"layoutHint": "text-1x"
|
|
28585
28844
|
},
|
|
28586
28845
|
{
|
|
28587
28846
|
"id": "future-prediction",
|
|
@@ -28589,7 +28848,7 @@ var narratives = [
|
|
|
28589
28848
|
"description": "Project where the trend leads if it continues. Show the forecast and the confidence interval. State the assumptions that would have to break for the prediction to fail.",
|
|
28590
28849
|
"instructions": "Predict using established patterns",
|
|
28591
28850
|
"slideType": "text",
|
|
28592
|
-
"layoutHint": "text-1x
|
|
28851
|
+
"layoutHint": "text-1x"
|
|
28593
28852
|
},
|
|
28594
28853
|
{
|
|
28595
28854
|
"id": "action-plan",
|
|
@@ -28597,7 +28856,7 @@ var narratives = [
|
|
|
28597
28856
|
"description": "Translate the prediction into the strategy it implies. Specific actions, sequenced. Each action should map to a particular reading of the trend, not a generic best practice.",
|
|
28598
28857
|
"instructions": "Strategies based on prediction",
|
|
28599
28858
|
"slideType": "text",
|
|
28600
|
-
"layoutHint": "text-1x
|
|
28859
|
+
"layoutHint": "text-1x"
|
|
28601
28860
|
},
|
|
28602
28861
|
{
|
|
28603
28862
|
"id": "implementation",
|
|
@@ -28605,13 +28864,13 @@ var narratives = [
|
|
|
28605
28864
|
"description": "Walk through how the actions get executed: owners, milestones, monitoring. The audience should leave understanding what to do tomorrow, not just what to think about.",
|
|
28606
28865
|
"instructions": "Discuss strategy execution",
|
|
28607
28866
|
"slideType": "text",
|
|
28608
|
-
"layoutHint": "text-1x
|
|
28867
|
+
"layoutHint": "text-1x"
|
|
28609
28868
|
},
|
|
28610
28869
|
{
|
|
28611
28870
|
"id": "conclusion",
|
|
28612
28871
|
"name": "Conclusion",
|
|
28613
28872
|
"description": "Recap the trend, the forecast, and the recommended action. End with the leading indicator you'll watch to know if the call is right.",
|
|
28614
|
-
"layoutHint": "title
|
|
28873
|
+
"layoutHint": "title",
|
|
28615
28874
|
"instructions": "Summarize key points",
|
|
28616
28875
|
"slideType": "text"
|
|
28617
28876
|
}
|
|
@@ -28642,7 +28901,7 @@ var narratives = [
|
|
|
28642
28901
|
"id": "introduction",
|
|
28643
28902
|
"name": "Introduction",
|
|
28644
28903
|
"description": "Open with the period covered and the spirit of the conversation: collaborative, honest, growth-focused. Frame the meeting so both sides know what to expect.",
|
|
28645
|
-
"layoutHint": "title
|
|
28904
|
+
"layoutHint": "title",
|
|
28646
28905
|
"instructions": "Name & date",
|
|
28647
28906
|
"slideType": "text"
|
|
28648
28907
|
},
|
|
@@ -28652,7 +28911,7 @@ var narratives = [
|
|
|
28652
28911
|
"description": "Review job execution against the role's expectations. Specific examples, dated. Avoid characterizing the person; describe the work and its impact.",
|
|
28653
28912
|
"instructions": "Review job execution",
|
|
28654
28913
|
"slideType": "text",
|
|
28655
|
-
"layoutHint": "text-1x
|
|
28914
|
+
"layoutHint": "text-1x"
|
|
28656
28915
|
},
|
|
28657
28916
|
{
|
|
28658
28917
|
"id": "achievements",
|
|
@@ -28660,7 +28919,7 @@ var narratives = [
|
|
|
28660
28919
|
"description": "Acknowledge what went well. Name the projects, the moves, the moments where the employee made a difference. Specific recognition lands harder than generic praise.",
|
|
28661
28920
|
"instructions": "Acknowledge success",
|
|
28662
28921
|
"slideType": "text",
|
|
28663
|
-
"layoutHint": "text-1x
|
|
28922
|
+
"layoutHint": "text-1x"
|
|
28664
28923
|
},
|
|
28665
28924
|
{
|
|
28666
28925
|
"id": "feedback",
|
|
@@ -28668,7 +28927,7 @@ var narratives = [
|
|
|
28668
28927
|
"description": "Provide constructive feedback grounded in observation. Distinguish patterns from one-offs. Tell the employee something they can act on, not something they can only feel.",
|
|
28669
28928
|
"instructions": "Provide positive remarks",
|
|
28670
28929
|
"slideType": "text",
|
|
28671
|
-
"layoutHint": "text-1x
|
|
28930
|
+
"layoutHint": "text-1x"
|
|
28672
28931
|
},
|
|
28673
28932
|
{
|
|
28674
28933
|
"id": "constructive-criticism",
|
|
@@ -28676,7 +28935,7 @@ var narratives = [
|
|
|
28676
28935
|
"description": "Suggest improvements in language that respects the employee's intelligence. Pair each piece of criticism with a concrete example and a specific behavior change you'd like to see.",
|
|
28677
28936
|
"instructions": "Suggest improvements",
|
|
28678
28937
|
"slideType": "text",
|
|
28679
|
-
"layoutHint": "text-1x
|
|
28938
|
+
"layoutHint": "text-1x"
|
|
28680
28939
|
},
|
|
28681
28940
|
{
|
|
28682
28941
|
"id": "development-opportunities",
|
|
@@ -28684,7 +28943,7 @@ var narratives = [
|
|
|
28684
28943
|
"description": "Highlight growth areas and the experiences that could stretch the employee. Frame development as an investment, not a fix.",
|
|
28685
28944
|
"instructions": "Highlight growth areas",
|
|
28686
28945
|
"slideType": "text",
|
|
28687
|
-
"layoutHint": "text-1x
|
|
28946
|
+
"layoutHint": "text-1x"
|
|
28688
28947
|
},
|
|
28689
28948
|
{
|
|
28690
28949
|
"id": "goals",
|
|
@@ -28692,13 +28951,13 @@ var narratives = [
|
|
|
28692
28951
|
"description": "Outline next-period goals together. Specific, measurable, with explicit support. The strongest goals are co-authored, not handed down.",
|
|
28693
28952
|
"instructions": "Outline next steps",
|
|
28694
28953
|
"slideType": "text",
|
|
28695
|
-
"layoutHint": "text-1x
|
|
28954
|
+
"layoutHint": "text-1x"
|
|
28696
28955
|
},
|
|
28697
28956
|
{
|
|
28698
28957
|
"id": "mentoring",
|
|
28699
28958
|
"name": "Mentoring",
|
|
28700
28959
|
"description": "Encourage continued learning through mentorship, training, peer pairings. Close the review with the message that growth is a shared responsibility, not a one-way evaluation.",
|
|
28701
|
-
"layoutHint": "title
|
|
28960
|
+
"layoutHint": "title",
|
|
28702
28961
|
"instructions": "Encourage continuous learning",
|
|
28703
28962
|
"slideType": "text"
|
|
28704
28963
|
}
|
|
@@ -28731,7 +28990,7 @@ var narratives = [
|
|
|
28731
28990
|
"description": "Begin respectfully and set a constructive tone. Be clear about what this conversation is and isn't. The opening shouldn't catastrophize or sugarcoat \u2014 clarity is kinder than either.",
|
|
28732
28991
|
"instructions": "Begin respectfully and positively",
|
|
28733
28992
|
"slideType": "text",
|
|
28734
|
-
"layoutHint": "text-1x
|
|
28993
|
+
"layoutHint": "text-1x"
|
|
28735
28994
|
},
|
|
28736
28995
|
{
|
|
28737
28996
|
"id": "set-expectations",
|
|
@@ -28739,7 +28998,7 @@ var narratives = [
|
|
|
28739
28998
|
"description": "Detail the level of performance expected in the role. Specific behaviors, deliverables, and standards. Expectations the employee can't quote back are expectations they can't meet.",
|
|
28740
28999
|
"instructions": "Detail desired performance",
|
|
28741
29000
|
"slideType": "text",
|
|
28742
|
-
"layoutHint": "text-1x
|
|
29001
|
+
"layoutHint": "text-1x"
|
|
28743
29002
|
},
|
|
28744
29003
|
{
|
|
28745
29004
|
"id": "identify-problems",
|
|
@@ -28747,7 +29006,7 @@ var narratives = [
|
|
|
28747
29006
|
"description": "Name the gap between expected and observed performance. Use specific examples and dates rather than impressions. Avoid characterizing the person; focus on the work product and the impact.",
|
|
28748
29007
|
"instructions": "Highlight struggles and weaknesses",
|
|
28749
29008
|
"slideType": "text",
|
|
28750
|
-
"layoutHint": "text-1x
|
|
29009
|
+
"layoutHint": "text-1x"
|
|
28751
29010
|
},
|
|
28752
29011
|
{
|
|
28753
29012
|
"id": "possible-solutions",
|
|
@@ -28755,7 +29014,7 @@ var narratives = [
|
|
|
28755
29014
|
"description": "Suggest improvement strategies tailored to the gaps named above. Behavior changes, structural changes, support structures. Frame them as paths the employee can choose, not orders to follow.",
|
|
28756
29015
|
"instructions": "Suggest improvement strategies",
|
|
28757
29016
|
"slideType": "text",
|
|
28758
|
-
"layoutHint": "text-1x
|
|
29017
|
+
"layoutHint": "text-1x"
|
|
28759
29018
|
},
|
|
28760
29019
|
{
|
|
28761
29020
|
"id": "offer-resources",
|
|
@@ -28763,7 +29022,7 @@ var narratives = [
|
|
|
28763
29022
|
"description": "Make explicit what tools, coaching, training, or peer support is available. Resources demonstrate that the organization is investing in the outcome, not setting the employee up to fail.",
|
|
28764
29023
|
"instructions": "Propose help and tools",
|
|
28765
29024
|
"slideType": "text",
|
|
28766
|
-
"layoutHint": "text-1x
|
|
29025
|
+
"layoutHint": "text-1x"
|
|
28767
29026
|
},
|
|
28768
29027
|
{
|
|
28769
29028
|
"id": "motivate-change",
|
|
@@ -28771,7 +29030,7 @@ var narratives = [
|
|
|
28771
29030
|
"description": "Connect improvement to what the employee values: their growth, their team, their career. Inspire action without minimizing the seriousness of the situation.",
|
|
28772
29031
|
"instructions": "Inspire improvement action",
|
|
28773
29032
|
"slideType": "text",
|
|
28774
|
-
"layoutHint": "text-1x
|
|
29033
|
+
"layoutHint": "text-1x"
|
|
28775
29034
|
},
|
|
28776
29035
|
{
|
|
28777
29036
|
"id": "follow-up",
|
|
@@ -28779,13 +29038,13 @@ var narratives = [
|
|
|
28779
29038
|
"description": "Schedule the check-ins. Frequency, format, criteria for progress. Predictable follow-up turns a PIP from a threat into a plan.",
|
|
28780
29039
|
"instructions": "Schedule progress check-ins",
|
|
28781
29040
|
"slideType": "text",
|
|
28782
|
-
"layoutHint": "text-1x
|
|
29041
|
+
"layoutHint": "text-1x"
|
|
28783
29042
|
},
|
|
28784
29043
|
{
|
|
28785
29044
|
"id": "conclusion",
|
|
28786
29045
|
"name": "Conclusion",
|
|
28787
29046
|
"description": "Close with confidence in the path forward and a clear restatement of what success looks like. End the meeting having both raised the bar and reaffirmed the relationship.",
|
|
28788
|
-
"layoutHint": "title
|
|
29047
|
+
"layoutHint": "title",
|
|
28789
29048
|
"instructions": "Encourage and remind success",
|
|
28790
29049
|
"slideType": "text"
|
|
28791
29050
|
}
|
|
@@ -28817,7 +29076,7 @@ var narratives = [
|
|
|
28817
29076
|
"id": "kickoff",
|
|
28818
29077
|
"name": "Kickoff",
|
|
28819
29078
|
"description": "Introduce what the planning exercise covers and the decision you need from the audience. Frame the time horizon and the resources in scope so the rest of the deck stays bounded.",
|
|
28820
|
-
"layoutHint": "title
|
|
29079
|
+
"layoutHint": "title",
|
|
28821
29080
|
"instructions": "Introduce the topic",
|
|
28822
29081
|
"slideType": "text"
|
|
28823
29082
|
},
|
|
@@ -28827,7 +29086,7 @@ var narratives = [
|
|
|
28827
29086
|
"description": "Show why this is the right moment to plan capacity. Pipeline shifts, hiring freezes, operational stress signals. Urgency turns capacity from an annual ritual into a decision the audience leans into.",
|
|
28828
29087
|
"instructions": "Show needs",
|
|
28829
29088
|
"slideType": "text",
|
|
28830
|
-
"layoutHint": "text-1x
|
|
29089
|
+
"layoutHint": "text-1x"
|
|
28831
29090
|
},
|
|
28832
29091
|
{
|
|
28833
29092
|
"id": "situation",
|
|
@@ -28835,7 +29094,7 @@ var narratives = [
|
|
|
28835
29094
|
"description": "Highlight the current resource picture: people, tools, infrastructure, vendor capacity. Show utilization, not just headcount. The audience should know where slack and stress live today.",
|
|
28836
29095
|
"instructions": "Highlight current resources",
|
|
28837
29096
|
"slideType": "text",
|
|
28838
|
-
"layoutHint": "text-1x
|
|
29097
|
+
"layoutHint": "text-1x"
|
|
28839
29098
|
},
|
|
28840
29099
|
{
|
|
28841
29100
|
"id": "projection",
|
|
@@ -28843,7 +29102,7 @@ var narratives = [
|
|
|
28843
29102
|
"description": "Predict future demand under your base case and a sensitivity case. Tie demand to specific drivers \u2014 pipeline, launches, seasonality \u2014 so the audience can challenge the assumptions, not just the totals.",
|
|
28844
29103
|
"instructions": "Predict future demands",
|
|
28845
29104
|
"slideType": "text",
|
|
28846
|
-
"layoutHint": "text-1x
|
|
29105
|
+
"layoutHint": "text-1x"
|
|
28847
29106
|
},
|
|
28848
29107
|
{
|
|
28849
29108
|
"id": "tactics",
|
|
@@ -28851,7 +29110,7 @@ var narratives = [
|
|
|
28851
29110
|
"description": "Suggest the strategies for closing any gap: hiring, automation, outsourcing, prioritization. Each tactic should map to a specific demand driver and a defensible cost.",
|
|
28852
29111
|
"instructions": "Suggest coping strategies",
|
|
28853
29112
|
"slideType": "text",
|
|
28854
|
-
"layoutHint": "text-1x
|
|
29113
|
+
"layoutHint": "text-1x"
|
|
28855
29114
|
},
|
|
28856
29115
|
{
|
|
28857
29116
|
"id": "implementation",
|
|
@@ -28859,7 +29118,7 @@ var narratives = [
|
|
|
28859
29118
|
"description": "Discuss how the plan gets deployed. Sequencing, owners, dependencies, lead times. Capacity decisions slip the most when the rollout isn't planned with the same rigor as the sizing.",
|
|
28860
29119
|
"instructions": "Discuss deployment plans",
|
|
28861
29120
|
"slideType": "text",
|
|
28862
|
-
"layoutHint": "text-1x
|
|
29121
|
+
"layoutHint": "text-1x"
|
|
28863
29122
|
},
|
|
28864
29123
|
{
|
|
28865
29124
|
"id": "revision",
|
|
@@ -28867,13 +29126,13 @@ var narratives = [
|
|
|
28867
29126
|
"description": "Define the leading indicators that would trigger a re-plan, and the cadence of review. Capacity plans age fast; show the audience how the plan stays alive.",
|
|
28868
29127
|
"instructions": "Evaluate and adjust",
|
|
28869
29128
|
"slideType": "text",
|
|
28870
|
-
"layoutHint": "text-1x
|
|
29129
|
+
"layoutHint": "text-1x"
|
|
28871
29130
|
},
|
|
28872
29131
|
{
|
|
28873
29132
|
"id": "conclusion",
|
|
28874
29133
|
"name": "Conclusion",
|
|
28875
29134
|
"description": "Wrap up with the specific recommendations and the decisions you need today. End with the next checkpoint and what evidence will be on the table at it.",
|
|
28876
|
-
"layoutHint": "title
|
|
29135
|
+
"layoutHint": "title",
|
|
28877
29136
|
"instructions": "Wrap-up & recommendations",
|
|
28878
29137
|
"slideType": "text"
|
|
28879
29138
|
}
|
|
@@ -31678,6 +31937,11 @@ var catalogIndexes = {
|
|
|
31678
31937
|
"name": "Number 6x",
|
|
31679
31938
|
"file": "number-6x.json"
|
|
31680
31939
|
},
|
|
31940
|
+
{
|
|
31941
|
+
"id": "quote-1x",
|
|
31942
|
+
"name": "Quote 1x",
|
|
31943
|
+
"file": "quote-1x.json"
|
|
31944
|
+
},
|
|
31681
31945
|
{
|
|
31682
31946
|
"id": "table-1x",
|
|
31683
31947
|
"name": "Table 1x",
|
|
@@ -31698,6 +31962,11 @@ var catalogIndexes = {
|
|
|
31698
31962
|
"name": "Text 3x",
|
|
31699
31963
|
"file": "text-3x.json"
|
|
31700
31964
|
},
|
|
31965
|
+
{
|
|
31966
|
+
"id": "timeline-1x",
|
|
31967
|
+
"name": "Timeline 1x",
|
|
31968
|
+
"file": "timeline-1x.json"
|
|
31969
|
+
},
|
|
31701
31970
|
{
|
|
31702
31971
|
"id": "title",
|
|
31703
31972
|
"name": "Title",
|
|
@@ -34347,10 +34616,12 @@ var catalogEntries = [
|
|
|
34347
34616
|
"number-4x.json",
|
|
34348
34617
|
"number-5x.json",
|
|
34349
34618
|
"number-6x.json",
|
|
34619
|
+
"quote-1x.json",
|
|
34350
34620
|
"table-1x.json",
|
|
34351
34621
|
"text-1x.json",
|
|
34352
34622
|
"text-2x.json",
|
|
34353
34623
|
"text-3x.json",
|
|
34624
|
+
"timeline-1x.json",
|
|
34354
34625
|
"title.json",
|
|
34355
34626
|
"title-subtitle.json"
|
|
34356
34627
|
], records: layouts, index: catalogIndexes.layouts },
|
|
@@ -34689,9 +34960,87 @@ var catalogEntries = [
|
|
|
34689
34960
|
], records: fontSchemes, index: catalogIndexes.fontSchemes }
|
|
34690
34961
|
];
|
|
34691
34962
|
|
|
34692
|
-
// ../javascript/dist/chunk-
|
|
34963
|
+
// ../javascript/dist/chunk-CHKJ4QHQ.js
|
|
34693
34964
|
var import__ = __toESM(require__(), 1);
|
|
34694
34965
|
var import_ajv_formats = __toESM(require_dist(), 1);
|
|
34966
|
+
function isRecord(value) {
|
|
34967
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
34968
|
+
}
|
|
34969
|
+
function pathFor(parentPath, key) {
|
|
34970
|
+
return parentPath === "/" ? `/${key}` : `${parentPath}/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`;
|
|
34971
|
+
}
|
|
34972
|
+
var bareIdPattern = /^[a-z0-9][a-z0-9-]*$/;
|
|
34973
|
+
var promotedRegionKeys = [
|
|
34974
|
+
"left",
|
|
34975
|
+
"center",
|
|
34976
|
+
"right",
|
|
34977
|
+
"left+center",
|
|
34978
|
+
"center+right",
|
|
34979
|
+
"left+center+right",
|
|
34980
|
+
"top",
|
|
34981
|
+
"middle",
|
|
34982
|
+
"bottom",
|
|
34983
|
+
"top+middle",
|
|
34984
|
+
"middle+bottom",
|
|
34985
|
+
"top+middle+bottom",
|
|
34986
|
+
"top:left",
|
|
34987
|
+
"top:center",
|
|
34988
|
+
"top:right",
|
|
34989
|
+
"top:left+center",
|
|
34990
|
+
"top:center+right",
|
|
34991
|
+
"top:left+center+right",
|
|
34992
|
+
"middle:left",
|
|
34993
|
+
"middle:center",
|
|
34994
|
+
"middle:right",
|
|
34995
|
+
"middle:left+center",
|
|
34996
|
+
"middle:center+right",
|
|
34997
|
+
"middle:left+center+right",
|
|
34998
|
+
"bottom:left",
|
|
34999
|
+
"bottom:center",
|
|
35000
|
+
"bottom:right",
|
|
35001
|
+
"bottom:left+center",
|
|
35002
|
+
"bottom:center+right",
|
|
35003
|
+
"bottom:left+center+right",
|
|
35004
|
+
"top+middle:left",
|
|
35005
|
+
"top+middle:center",
|
|
35006
|
+
"top+middle:right",
|
|
35007
|
+
"top+middle:left+center",
|
|
35008
|
+
"top+middle:center+right",
|
|
35009
|
+
"top+middle:left+center+right",
|
|
35010
|
+
"middle+bottom:left",
|
|
35011
|
+
"middle+bottom:center",
|
|
35012
|
+
"middle+bottom:right",
|
|
35013
|
+
"middle+bottom:left+center",
|
|
35014
|
+
"middle+bottom:center+right",
|
|
35015
|
+
"middle+bottom:left+center+right",
|
|
35016
|
+
"top+middle+bottom:left",
|
|
35017
|
+
"top+middle+bottom:center",
|
|
35018
|
+
"top+middle+bottom:right",
|
|
35019
|
+
"top+middle+bottom:left+center",
|
|
35020
|
+
"top+middle+bottom:center+right",
|
|
35021
|
+
"top+middle+bottom:left+center+right"
|
|
35022
|
+
];
|
|
35023
|
+
function visitContentPayloads(slide, slidePath, visit2) {
|
|
35024
|
+
const walk = (payload, path3, depth, ancestors) => {
|
|
35025
|
+
visit2(payload, path3);
|
|
35026
|
+
if (!Array.isArray(payload.blocks) || depth >= MAX_COMPOSITION_DEPTH || ancestors.includes(payload)) return;
|
|
35027
|
+
const nested = [...ancestors, payload];
|
|
35028
|
+
const blocksPath = pathFor(path3, "blocks");
|
|
35029
|
+
payload.blocks.forEach((block, index2) => {
|
|
35030
|
+
if (isRecord(block)) walk(block, `${blocksPath}/${index2}`, depth + 1, nested);
|
|
35031
|
+
});
|
|
35032
|
+
};
|
|
35033
|
+
if (Array.isArray(slide.blocks)) {
|
|
35034
|
+
const blocksPath = pathFor(slidePath, "blocks");
|
|
35035
|
+
slide.blocks.forEach((block, index2) => {
|
|
35036
|
+
if (isRecord(block)) walk(block, `${blocksPath}/${index2}`, 0, []);
|
|
35037
|
+
});
|
|
35038
|
+
}
|
|
35039
|
+
for (const key of promotedRegionKeys) {
|
|
35040
|
+
const region = slide[key];
|
|
35041
|
+
if (isRecord(region)) walk(region, pathFor(slidePath, key), 0, []);
|
|
35042
|
+
}
|
|
35043
|
+
}
|
|
34695
35044
|
var catalogIds = {
|
|
34696
35045
|
audiences: [
|
|
34697
35046
|
"executives",
|
|
@@ -34754,10 +35103,12 @@ var catalogIds = {
|
|
|
34754
35103
|
"number-4x",
|
|
34755
35104
|
"number-5x",
|
|
34756
35105
|
"number-6x",
|
|
35106
|
+
"quote-1x",
|
|
34757
35107
|
"table-1x",
|
|
34758
35108
|
"text-1x",
|
|
34759
35109
|
"text-2x",
|
|
34760
35110
|
"text-3x",
|
|
35111
|
+
"timeline-1x",
|
|
34761
35112
|
"title",
|
|
34762
35113
|
"title-subtitle"
|
|
34763
35114
|
],
|
|
@@ -35147,56 +35498,6 @@ var OPFValidationError = class extends Error {
|
|
|
35147
35498
|
var schemaNameByCatalogKind = catalogSchemaNames;
|
|
35148
35499
|
var ajv;
|
|
35149
35500
|
var dynamicSchemaCache = /* @__PURE__ */ new WeakMap();
|
|
35150
|
-
var promotedRegionKeys = [
|
|
35151
|
-
"left",
|
|
35152
|
-
"center",
|
|
35153
|
-
"right",
|
|
35154
|
-
"left+center",
|
|
35155
|
-
"center+right",
|
|
35156
|
-
"left+center+right",
|
|
35157
|
-
"top",
|
|
35158
|
-
"middle",
|
|
35159
|
-
"bottom",
|
|
35160
|
-
"top+middle",
|
|
35161
|
-
"middle+bottom",
|
|
35162
|
-
"top+middle+bottom",
|
|
35163
|
-
"top:left",
|
|
35164
|
-
"top:center",
|
|
35165
|
-
"top:right",
|
|
35166
|
-
"top:left+center",
|
|
35167
|
-
"top:center+right",
|
|
35168
|
-
"top:left+center+right",
|
|
35169
|
-
"middle:left",
|
|
35170
|
-
"middle:center",
|
|
35171
|
-
"middle:right",
|
|
35172
|
-
"middle:left+center",
|
|
35173
|
-
"middle:center+right",
|
|
35174
|
-
"middle:left+center+right",
|
|
35175
|
-
"bottom:left",
|
|
35176
|
-
"bottom:center",
|
|
35177
|
-
"bottom:right",
|
|
35178
|
-
"bottom:left+center",
|
|
35179
|
-
"bottom:center+right",
|
|
35180
|
-
"bottom:left+center+right",
|
|
35181
|
-
"top+middle:left",
|
|
35182
|
-
"top+middle:center",
|
|
35183
|
-
"top+middle:right",
|
|
35184
|
-
"top+middle:left+center",
|
|
35185
|
-
"top+middle:center+right",
|
|
35186
|
-
"top+middle:left+center+right",
|
|
35187
|
-
"middle+bottom:left",
|
|
35188
|
-
"middle+bottom:center",
|
|
35189
|
-
"middle+bottom:right",
|
|
35190
|
-
"middle+bottom:left+center",
|
|
35191
|
-
"middle+bottom:center+right",
|
|
35192
|
-
"middle+bottom:left+center+right",
|
|
35193
|
-
"top+middle+bottom:left",
|
|
35194
|
-
"top+middle+bottom:center",
|
|
35195
|
-
"top+middle+bottom:right",
|
|
35196
|
-
"top+middle+bottom:left+center",
|
|
35197
|
-
"top+middle+bottom:center+right",
|
|
35198
|
-
"top+middle+bottom:left+center+right"
|
|
35199
|
-
];
|
|
35200
35501
|
var promotedRegionKeySet = new Set(promotedRegionKeys);
|
|
35201
35502
|
var rootPayloadFields = [
|
|
35202
35503
|
"type",
|
|
@@ -35336,18 +35637,12 @@ function semanticIssue(path3, message, params = {}) {
|
|
|
35336
35637
|
params
|
|
35337
35638
|
};
|
|
35338
35639
|
}
|
|
35339
|
-
function isRecord(value) {
|
|
35340
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
35341
|
-
}
|
|
35342
35640
|
function hasOwn(value, key) {
|
|
35343
35641
|
return Object.hasOwn(value, key);
|
|
35344
35642
|
}
|
|
35345
35643
|
function isEnUkTag(value) {
|
|
35346
35644
|
return typeof value === "string" && value.toLowerCase() === "en-uk";
|
|
35347
35645
|
}
|
|
35348
|
-
function pathFor(parentPath, key) {
|
|
35349
|
-
return parentPath === "/" ? `/${key}` : `${parentPath}/${key.replaceAll("~", "~0").replaceAll("/", "~1")}`;
|
|
35350
|
-
}
|
|
35351
35646
|
function presentFields(value, fields3) {
|
|
35352
35647
|
return fields3.filter((field) => hasOwn(value, field));
|
|
35353
35648
|
}
|
|
@@ -35520,27 +35815,32 @@ function validatePresentationSemantics(value) {
|
|
|
35520
35815
|
replacement: "en-GB"
|
|
35521
35816
|
}));
|
|
35522
35817
|
}
|
|
35523
|
-
const
|
|
35818
|
+
const documentIds = /* @__PURE__ */ new Map();
|
|
35524
35819
|
value.slides.forEach((slide, index2) => {
|
|
35525
35820
|
if (isRecord(slide)) {
|
|
35821
|
+
const slidePath = `/slides/${index2}`;
|
|
35526
35822
|
if (typeof slide.id === "string") {
|
|
35527
|
-
|
|
35528
|
-
|
|
35529
|
-
|
|
35530
|
-
|
|
35531
|
-
|
|
35532
|
-
|
|
35533
|
-
if (
|
|
35534
|
-
if (
|
|
35535
|
-
|
|
35536
|
-
|
|
35823
|
+
const seen = documentIds.get(slide.id);
|
|
35824
|
+
if (seen === "slide") issues.push(semanticIssue(`${slidePath}/id`, "slide ids must be unique within a presentation", { id: slide.id }));
|
|
35825
|
+
else if (seen === "payload") issues.push(semanticIssue(`${slidePath}/id`, "slide id duplicates a content payload id; ids must be unique among slide and payload ids within a presentation", { id: slide.id }));
|
|
35826
|
+
else documentIds.set(slide.id, "slide");
|
|
35827
|
+
}
|
|
35828
|
+
visitContentPayloads(slide, slidePath, (payload, path3) => {
|
|
35829
|
+
if (typeof payload.id === "string") {
|
|
35830
|
+
if (documentIds.has(payload.id)) issues.push(semanticIssue(`${path3}/id`, "content payload ids must be unique among slide and payload ids within a presentation", { id: payload.id }));
|
|
35831
|
+
else documentIds.set(payload.id, "payload");
|
|
35832
|
+
}
|
|
35833
|
+
});
|
|
35834
|
+
issues.push(...validateSlideRegions(slide, slidePath));
|
|
35835
|
+
const payloadTableIssues = (payload, path3) => {
|
|
35836
|
+
if (isRecord(payload.table)) for (const issue of tableGrid(payload.table).issues) issues.push(semanticIssue(pathFor(path3, "table") + issue.path.slice(5).replaceAll(".", "/"), issue.message));
|
|
35537
35837
|
};
|
|
35538
|
-
|
|
35838
|
+
payloadTableIssues(slide, slidePath);
|
|
35839
|
+
visitContentPayloads(slide, slidePath, payloadTableIssues);
|
|
35539
35840
|
}
|
|
35540
35841
|
});
|
|
35541
35842
|
return issues;
|
|
35542
35843
|
}
|
|
35543
|
-
var bareIdPattern = /^[a-z0-9][a-z0-9-]*$/;
|
|
35544
35844
|
function inlineCatalogEntry(context, kind2) {
|
|
35545
35845
|
const catalogsField = context.document.catalogs;
|
|
35546
35846
|
if (!isRecord(catalogsField)) {
|
|
@@ -35559,7 +35859,7 @@ function unknownIdWarning(kind2, value, path3, context) {
|
|
|
35559
35859
|
if (Array.isArray(entry.records) && entry.records.some((record3) => isRecord(record3) && record3.id === value)) {
|
|
35560
35860
|
return void 0;
|
|
35561
35861
|
}
|
|
35562
|
-
if (typeof entry.source === "string") {
|
|
35862
|
+
if (typeof entry.source === "string" || Array.isArray(entry.source) && entry.source.length > 0) {
|
|
35563
35863
|
return void 0;
|
|
35564
35864
|
}
|
|
35565
35865
|
}
|
|
@@ -35613,6 +35913,126 @@ function chartTypeWarnings(payload, path3, context) {
|
|
|
35613
35913
|
}
|
|
35614
35914
|
return issues;
|
|
35615
35915
|
}
|
|
35916
|
+
var cellBorderEdges = ["top", "right", "bottom", "left"];
|
|
35917
|
+
var variableIdPattern = /^[a-z][a-z0-9-]*$/;
|
|
35918
|
+
var hexColorPattern = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
|
|
35919
|
+
var schemeColorNames = /* @__PURE__ */ new Set([
|
|
35920
|
+
"accent1",
|
|
35921
|
+
"accent2",
|
|
35922
|
+
"accent3",
|
|
35923
|
+
"accent4",
|
|
35924
|
+
"accent5",
|
|
35925
|
+
"accent6",
|
|
35926
|
+
"dark1",
|
|
35927
|
+
"dark2",
|
|
35928
|
+
"light1",
|
|
35929
|
+
"light2",
|
|
35930
|
+
"hyperlink",
|
|
35931
|
+
"followedHyperlink",
|
|
35932
|
+
"primary",
|
|
35933
|
+
"secondary",
|
|
35934
|
+
"accent",
|
|
35935
|
+
"background",
|
|
35936
|
+
"surface",
|
|
35937
|
+
"text",
|
|
35938
|
+
"textSecondary"
|
|
35939
|
+
]);
|
|
35940
|
+
function variableReferenceWarnings(value) {
|
|
35941
|
+
if (!Array.isArray(value.slides)) {
|
|
35942
|
+
return [];
|
|
35943
|
+
}
|
|
35944
|
+
const variables = isRecord(value.variables) ? value.variables : {};
|
|
35945
|
+
const issues = [];
|
|
35946
|
+
const colorRef = (entry, path3) => {
|
|
35947
|
+
if (typeof entry !== "string" || !entry.startsWith("var:")) return;
|
|
35948
|
+
const id = entry.slice("var:".length);
|
|
35949
|
+
if (!variableIdPattern.test(id) || hasOwn(variables, id)) return;
|
|
35950
|
+
issues.push(semanticIssue(path3, `unknown variable '${id}'; declare it in the top-level variables map`, { id }));
|
|
35951
|
+
};
|
|
35952
|
+
const runColor = (entry, path3) => {
|
|
35953
|
+
if (typeof entry !== "string") return;
|
|
35954
|
+
if (hexColorPattern.test(entry) || schemeColorNames.has(entry)) return;
|
|
35955
|
+
if (entry.startsWith("var:") && variableIdPattern.test(entry.slice("var:".length))) {
|
|
35956
|
+
colorRef(entry, path3);
|
|
35957
|
+
return;
|
|
35958
|
+
}
|
|
35959
|
+
issues.push(semanticIssue(
|
|
35960
|
+
path3,
|
|
35961
|
+
`run color '${entry}' is not a hex color, a color-scheme name, or a 'var:' reference; renderers fall back to the theme color`,
|
|
35962
|
+
{ color: entry }
|
|
35963
|
+
));
|
|
35964
|
+
};
|
|
35965
|
+
const richText = (entry, path3) => {
|
|
35966
|
+
if (!Array.isArray(entry)) return;
|
|
35967
|
+
entry.forEach((run, index2) => {
|
|
35968
|
+
if (isRecord(run)) runColor(run.color, `${path3}/${index2}/color`);
|
|
35969
|
+
});
|
|
35970
|
+
};
|
|
35971
|
+
const cellStyle = (style, path3) => {
|
|
35972
|
+
if (!isRecord(style)) return;
|
|
35973
|
+
colorRef(style.fill, pathFor(path3, "fill"));
|
|
35974
|
+
colorRef(style.color, pathFor(path3, "color"));
|
|
35975
|
+
if (!isRecord(style.borders)) return;
|
|
35976
|
+
const bordersPath = pathFor(path3, "borders");
|
|
35977
|
+
for (const edge of cellBorderEdges) {
|
|
35978
|
+
const border = style.borders[edge];
|
|
35979
|
+
if (isRecord(border)) colorRef(border.color, `${pathFor(bordersPath, edge)}/color`);
|
|
35980
|
+
}
|
|
35981
|
+
};
|
|
35982
|
+
const tableCell = (cell2, path3) => {
|
|
35983
|
+
if (Array.isArray(cell2)) {
|
|
35984
|
+
richText(cell2, path3);
|
|
35985
|
+
return;
|
|
35986
|
+
}
|
|
35987
|
+
if (!isRecord(cell2)) return;
|
|
35988
|
+
richText(cell2.value, pathFor(path3, "value"));
|
|
35989
|
+
cellStyle(cell2.style, pathFor(path3, "style"));
|
|
35990
|
+
};
|
|
35991
|
+
const table = (node, path3) => {
|
|
35992
|
+
if (!isRecord(node)) return;
|
|
35993
|
+
if (Array.isArray(node.columns)) {
|
|
35994
|
+
const columnsPath = pathFor(path3, "columns");
|
|
35995
|
+
node.columns.forEach((column, index2) => {
|
|
35996
|
+
tableCell(column, `${columnsPath}/${index2}`);
|
|
35997
|
+
});
|
|
35998
|
+
}
|
|
35999
|
+
if (Array.isArray(node.rows)) {
|
|
36000
|
+
const rowsPath = pathFor(path3, "rows");
|
|
36001
|
+
node.rows.forEach((row, rowIndex) => {
|
|
36002
|
+
if (!Array.isArray(row)) return;
|
|
36003
|
+
row.forEach((cell2, cellIndex) => {
|
|
36004
|
+
tableCell(cell2, `${rowsPath}/${rowIndex}/${cellIndex}`);
|
|
36005
|
+
});
|
|
36006
|
+
});
|
|
36007
|
+
}
|
|
36008
|
+
};
|
|
36009
|
+
const textEntries = (entries, path3) => {
|
|
36010
|
+
if (!Array.isArray(entries)) return;
|
|
36011
|
+
entries.forEach((entry, index2) => {
|
|
36012
|
+
const entryPath = `${path3}/${index2}`;
|
|
36013
|
+
if (Array.isArray(entry)) {
|
|
36014
|
+
richText(entry, entryPath);
|
|
36015
|
+
return;
|
|
36016
|
+
}
|
|
36017
|
+
if (!isRecord(entry)) return;
|
|
36018
|
+
richText(entry.text, pathFor(entryPath, "text"));
|
|
36019
|
+
richText(entry.description, pathFor(entryPath, "description"));
|
|
36020
|
+
});
|
|
36021
|
+
};
|
|
36022
|
+
const payload = (node, path3) => {
|
|
36023
|
+
richText(node.text, pathFor(path3, "text"));
|
|
36024
|
+
textEntries(node.items, pathFor(path3, "items"));
|
|
36025
|
+
textEntries(node.bullets, pathFor(path3, "bullets"));
|
|
36026
|
+
table(node.table, pathFor(path3, "table"));
|
|
36027
|
+
};
|
|
36028
|
+
value.slides.forEach((slide, index2) => {
|
|
36029
|
+
if (!isRecord(slide)) return;
|
|
36030
|
+
const slidePath = `/slides/${index2}`;
|
|
36031
|
+
payload(slide, slidePath);
|
|
36032
|
+
visitContentPayloads(slide, slidePath, payload);
|
|
36033
|
+
});
|
|
36034
|
+
return issues;
|
|
36035
|
+
}
|
|
35616
36036
|
function presentationReferenceWarnings(value) {
|
|
35617
36037
|
if (!isRecord(value) || !Array.isArray(value.slides)) {
|
|
35618
36038
|
return [];
|
|
@@ -35623,6 +36043,7 @@ function presentationReferenceWarnings(value) {
|
|
|
35623
36043
|
pushIfDefined(issues, unknownIdWarning("narratives", value.narrative, "/narrative", context));
|
|
35624
36044
|
}
|
|
35625
36045
|
issues.push(...designReferenceWarnings(value.design, "/design", context));
|
|
36046
|
+
issues.push(...variableReferenceWarnings(value));
|
|
35626
36047
|
value.slides.forEach((slide, index2) => {
|
|
35627
36048
|
if (!isRecord(slide)) {
|
|
35628
36049
|
return;
|
|
@@ -36695,7 +37116,7 @@ function printParseErrorCode(code) {
|
|
|
36695
37116
|
return "<unknown ParseErrorCode>";
|
|
36696
37117
|
}
|
|
36697
37118
|
|
|
36698
|
-
// ../javascript/dist/chunk-
|
|
37119
|
+
// ../javascript/dist/chunk-EQHZ3ZO4.js
|
|
36699
37120
|
var own = (value, key) => Object.hasOwn(value, key);
|
|
36700
37121
|
var object = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
36701
37122
|
var primitive = (value) => value === null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value);
|
|
@@ -37430,7 +37851,7 @@ function createDataContent(input, options) {
|
|
|
37430
37851
|
return { chart: { type: options.chartType ?? "column", data: { columns: names, rows: rows2 } } };
|
|
37431
37852
|
}
|
|
37432
37853
|
|
|
37433
|
-
// ../javascript/dist/chunk-
|
|
37854
|
+
// ../javascript/dist/chunk-FWA5XB45.js
|
|
37434
37855
|
init_define_OPF_SKILLS();
|
|
37435
37856
|
var OPFPaginationError = class extends Error {
|
|
37436
37857
|
constructor(message, diagnostics = []) {
|
|
@@ -37445,6 +37866,13 @@ var contentFields = /* @__PURE__ */ new Set(["text", "items", "bullets", "image"
|
|
|
37445
37866
|
var headingFields = /* @__PURE__ */ new Set(["title", "subtitle", "tag"]);
|
|
37446
37867
|
var isRecord2 = (v) => !!v && typeof v === "object" && !Array.isArray(v);
|
|
37447
37868
|
var clone = (value) => structuredClone(value);
|
|
37869
|
+
var slideIds = (slide) => {
|
|
37870
|
+
const ids = typeof slide.id === "string" ? [slide.id] : [];
|
|
37871
|
+
visitContentPayloads(slide, "", (payload) => {
|
|
37872
|
+
if (typeof payload.id === "string") ids.push(payload.id);
|
|
37873
|
+
});
|
|
37874
|
+
return ids;
|
|
37875
|
+
};
|
|
37448
37876
|
var textOf = (value) => typeof value === "string" ? value : Array.isArray(value) ? value.map(textOf).join("") : value?.text ?? "";
|
|
37449
37877
|
var graphemes = new Intl.Segmenter("und", { granularity: "grapheme" });
|
|
37450
37878
|
function sliceRichText(value, start, end) {
|
|
@@ -37512,20 +37940,48 @@ function paginateSlide(input, options = {}) {
|
|
|
37512
37940
|
};
|
|
37513
37941
|
source = withReadability(source);
|
|
37514
37942
|
let evaluations = 0;
|
|
37515
|
-
const geometry = (slide) => {
|
|
37943
|
+
const geometry = (slide, pageIndex = 0) => {
|
|
37516
37944
|
if (++evaluations > 2e4) throw new OPFPaginationError("Pagination exceeded its layout evaluation limit. Split the input into smaller sections.");
|
|
37517
|
-
return composeSlide(withReadability(slide, true), options);
|
|
37945
|
+
return composeSlide(withReadability(slide, true), { ...options, slideNumber: (options.slideNumber ?? sourceIndex + 1) + pageIndex });
|
|
37518
37946
|
};
|
|
37519
37947
|
const initial = geometry(source);
|
|
37520
|
-
|
|
37521
|
-
|
|
37522
|
-
|
|
37948
|
+
const repeatedMappings = (pageIndex) => {
|
|
37949
|
+
if (!initial.furniture) return [];
|
|
37950
|
+
const paths = new Set(initial.items.filter((item) => headingFields.has(item.field)).map((item) => item.path));
|
|
37951
|
+
for (const part of initial.furniture?.parts ?? []) {
|
|
37952
|
+
paths.add(part.path);
|
|
37953
|
+
if (part.sourcePath) paths.add(part.sourcePath);
|
|
37954
|
+
}
|
|
37955
|
+
return [...paths].map((sourcePath) => ({ sourcePath, outputPath: sourcePath.startsWith(`${sourceBase}.`) ? `slides.${sourceIndex + pageIndex}${sourcePath.slice(sourceBase.length)}` : sourcePath }));
|
|
37956
|
+
};
|
|
37957
|
+
if (!initial.diagnostics.length) return { slides: [source], pages: [{ slideIndex: sourceIndex, mappings: initial.items.map((item) => ({ sourcePath: item.path, outputPath: item.path })), ...initial.furniture ? { repeatedMappings: repeatedMappings(0) } : {} }] };
|
|
37958
|
+
const headerIssues = initial.diagnostics.filter((issue) => headingFields.has(issue.path.slice(sourceBase.length + 1)) || initial.furniture?.diagnostics.includes(issue));
|
|
37959
|
+
if (headerIssues.length) throw new OPFPaginationError("Repeated headings or header/footer content cannot fit or resolve. Change the repeated content or slide design before pagination.", headerIssues);
|
|
37523
37960
|
const leaves = initial.items.filter((item) => !headingFields.has(item.field)).map((item) => leafFor(item.path, item.field, item.value));
|
|
37524
37961
|
const leafPaths = new Set(leaves.map((leaf) => leaf.path));
|
|
37525
37962
|
const slides = [], pages = [];
|
|
37526
37963
|
let selected = /* @__PURE__ */ new Map();
|
|
37527
37964
|
const reservedIds = new Set(options.reservedIds ?? []);
|
|
37528
|
-
|
|
37965
|
+
for (const id of slideIds(source)) reservedIds.add(id);
|
|
37966
|
+
const emittedIds = /* @__PURE__ */ new Set();
|
|
37967
|
+
const pageId = (base, pageIndex) => {
|
|
37968
|
+
if (!emittedIds.has(base)) {
|
|
37969
|
+
emittedIds.add(base);
|
|
37970
|
+
return base;
|
|
37971
|
+
}
|
|
37972
|
+
let suffix = pageIndex + 1, id = `${base}--${suffix}`;
|
|
37973
|
+
while (reservedIds.has(id)) id = `${base}--${++suffix}`;
|
|
37974
|
+
reservedIds.add(id);
|
|
37975
|
+
emittedIds.add(id);
|
|
37976
|
+
return id;
|
|
37977
|
+
};
|
|
37978
|
+
const assignPageIds = (slide, pageIndex) => {
|
|
37979
|
+
const assign = (node) => {
|
|
37980
|
+
if (typeof node.id === "string") node.id = pageId(node.id, pageIndex);
|
|
37981
|
+
};
|
|
37982
|
+
assign(slide);
|
|
37983
|
+
visitContentPayloads(slide, "", assign);
|
|
37984
|
+
};
|
|
37529
37985
|
const project = (portions, pageIndex) => {
|
|
37530
37986
|
const mappings = [];
|
|
37531
37987
|
const visit2 = (node, path3, out, root = false) => {
|
|
@@ -37564,20 +38020,17 @@ function paginateSlide(input, options = {}) {
|
|
|
37564
38020
|
if (pageIndex > 0) delete slide.notes;
|
|
37565
38021
|
return { slide, mappings };
|
|
37566
38022
|
};
|
|
37567
|
-
const diagnosticsFor = (portions) => geometry(project(portions, slides.length).slide).diagnostics;
|
|
38023
|
+
const diagnosticsFor = (portions) => geometry(project(portions, slides.length).slide, slides.length).diagnostics;
|
|
37568
38024
|
const finish = () => {
|
|
37569
38025
|
if (!selected.size) return;
|
|
37570
38026
|
if (slides.length >= maxSlides) throw new OPFPaginationError(`Pagination needs more than ${maxSlides} slides. No partial result was returned.`);
|
|
37571
38027
|
const { slide, mappings } = project(selected, slides.length);
|
|
37572
|
-
|
|
37573
|
-
|
|
37574
|
-
|
|
37575
|
-
slide.id = id;
|
|
37576
|
-
reservedIds.add(id);
|
|
37577
|
-
}
|
|
38028
|
+
const issues = geometry(slide, slides.length).diagnostics;
|
|
38029
|
+
if (issues.length) throw new OPFPaginationError("A continuation page does not fit at its final page number. No partial result was returned.", issues);
|
|
38030
|
+
assignPageIds(slide, slides.length);
|
|
37578
38031
|
assertValidPresentation({ slides: [slide] });
|
|
37579
38032
|
slides.push(slide);
|
|
37580
|
-
pages.push({ slideIndex: sourceIndex + slides.length - 1, mappings });
|
|
38033
|
+
pages.push({ slideIndex: sourceIndex + slides.length - 1, mappings, ...initial.furniture ? { repeatedMappings: repeatedMappings(slides.length - 1) } : {} });
|
|
37581
38034
|
selected = /* @__PURE__ */ new Map();
|
|
37582
38035
|
};
|
|
37583
38036
|
for (const leaf of leaves) {
|
|
@@ -37633,7 +38086,7 @@ function paginatePresentation(input, options = {}) {
|
|
|
37633
38086
|
const maxSlides = options.maxSlides ?? 100;
|
|
37634
38087
|
if (!Number.isInteger(maxSlides) || maxSlides < 1 || maxSlides > 1e4) throw new RangeError("maxSlides must be an integer between 1 and 10000.");
|
|
37635
38088
|
const output = [], pages = [];
|
|
37636
|
-
const reservedIds = presentation2.slides.
|
|
38089
|
+
const reservedIds = presentation2.slides.flatMap((slide) => slideIds(slide));
|
|
37637
38090
|
const resolve2 = (kind2, id) => presentation2.catalogs?.[kind2]?.records?.find((record3) => record3.id === id) ?? catalogs[kind2].find((record3) => record3.id === id);
|
|
37638
38091
|
presentation2.slides.forEach((slide, index2) => {
|
|
37639
38092
|
const overrides = options.slideOptions?.(slide, index2) ?? {};
|
|
@@ -37647,19 +38100,214 @@ function paginatePresentation(input, options = {}) {
|
|
|
37647
38100
|
const fontReference = design.fontScheme ?? theme2.fontScheme ?? "roboto";
|
|
37648
38101
|
const fontScheme2 = typeof fontReference === "string" ? resolve2("fontSchemes", fontReference) : { ...resolve2("fontSchemes", fontReference.id), ...fontReference };
|
|
37649
38102
|
const fonts = resolveFontFamilies(fontScheme2);
|
|
37650
|
-
const result = paginateSlide(slide, { ...resolveCanvasDimensions(design.dimensions ?? theme2.dimensions), layout: layout2, fonts, contentAlignment: design.contentAlignment, titleAlignment: design.titleAlignment, contentBox: design.contentBox, textMeasurement: options.textMeasurement, textRasterPadding: options.textRasterPadding, ...overrides, slideIndex: index2, maxSlides: maxSlides - output.length, minFontSize: options.minFontSize, reservedIds });
|
|
38103
|
+
const result = paginateSlide(slide, { ...resolveCanvasDimensions(design.dimensions ?? theme2.dimensions), layout: layout2, fonts, contentAlignment: design.contentAlignment, titleAlignment: design.titleAlignment, contentBox: design.contentBox, textMeasurement: options.textMeasurement, textRasterPadding: options.textRasterPadding, ...overrides, presentation: presentation2, slideIndex: index2, slideNumber: output.length + 1, maxSlides: maxSlides - output.length, minFontSize: options.minFontSize, reservedIds });
|
|
37651
38104
|
const outputStart = output.length;
|
|
37652
38105
|
result.pages.forEach((page, pageIndex) => {
|
|
37653
|
-
|
|
38106
|
+
const remap = (mapping) => ({ ...mapping, outputPath: mapping.outputPath.replace(/^slides\.\d+/, `slides.${outputStart + pageIndex}`) });
|
|
38107
|
+
pages.push({ sourceSlideIndex: index2, slideIndex: outputStart + pageIndex, mappings: page.mappings.map(remap), ...page.repeatedMappings ? { repeatedMappings: page.repeatedMappings.map(remap) } : {} });
|
|
37654
38108
|
});
|
|
37655
38109
|
output.push(...result.slides);
|
|
37656
|
-
reservedIds.push(...result.slides.
|
|
38110
|
+
reservedIds.push(...result.slides.flatMap((slide2) => slideIds(slide2)));
|
|
37657
38111
|
});
|
|
37658
38112
|
presentation2.slides = output;
|
|
37659
38113
|
assertValidPresentation(presentation2);
|
|
37660
38114
|
return { presentation: presentation2, pages };
|
|
37661
38115
|
}
|
|
37662
38116
|
|
|
38117
|
+
// ../javascript/dist/index.js
|
|
38118
|
+
function reportKey(kind2, id) {
|
|
38119
|
+
return `${kind2}:${id}`;
|
|
38120
|
+
}
|
|
38121
|
+
function referenceId(value) {
|
|
38122
|
+
if (typeof value === "string" && bareIdPattern.test(value)) return value;
|
|
38123
|
+
if (isRecord(value) && typeof value.id === "string" && bareIdPattern.test(value.id)) return value.id;
|
|
38124
|
+
return void 0;
|
|
38125
|
+
}
|
|
38126
|
+
function addReference(collector, kind2, value, reportable) {
|
|
38127
|
+
const id = referenceId(value);
|
|
38128
|
+
if (!id) return;
|
|
38129
|
+
if (reportable) collector.reportable.add(reportKey(kind2, id));
|
|
38130
|
+
let ids = collector.referenced.get(kind2);
|
|
38131
|
+
if (!ids) {
|
|
38132
|
+
ids = /* @__PURE__ */ new Set();
|
|
38133
|
+
collector.referenced.set(kind2, ids);
|
|
38134
|
+
}
|
|
38135
|
+
if (ids.has(id)) return;
|
|
38136
|
+
ids.add(id);
|
|
38137
|
+
collector.queue.push({ kind: kind2, id });
|
|
38138
|
+
}
|
|
38139
|
+
function collectDesignReferences(collector, design) {
|
|
38140
|
+
if (!isRecord(design)) return;
|
|
38141
|
+
addReference(collector, "themes", design.theme, true);
|
|
38142
|
+
addReference(collector, "colorSchemes", design.colorScheme, true);
|
|
38143
|
+
addReference(collector, "fontSchemes", design.fontScheme, true);
|
|
38144
|
+
if (isRecord(design.theme)) {
|
|
38145
|
+
addReference(collector, "colorSchemes", design.theme.colorScheme, true);
|
|
38146
|
+
addReference(collector, "fontSchemes", design.theme.fontScheme, true);
|
|
38147
|
+
}
|
|
38148
|
+
}
|
|
38149
|
+
function collectChartReference(collector, payload) {
|
|
38150
|
+
if (!isRecord(payload.chart)) return;
|
|
38151
|
+
addReference(collector, "chartTypes", payload.chart.type, typeof payload.chart.type === "string");
|
|
38152
|
+
}
|
|
38153
|
+
function collectSocialReferences(collector, holder) {
|
|
38154
|
+
const entries = Array.isArray(holder) ? holder : [holder];
|
|
38155
|
+
for (const entry of entries) {
|
|
38156
|
+
if (!isRecord(entry) || !isRecord(entry.socials)) continue;
|
|
38157
|
+
for (const key of Object.keys(entry.socials)) addReference(collector, "socialPlatforms", key, false);
|
|
38158
|
+
}
|
|
38159
|
+
}
|
|
38160
|
+
function collectBeatReferences(collector, narrative2) {
|
|
38161
|
+
if (!isRecord(narrative2) || !Array.isArray(narrative2.beats)) return;
|
|
38162
|
+
for (const beat of narrative2.beats) {
|
|
38163
|
+
if (isRecord(beat)) addReference(collector, "layouts", beat.layoutHint, false);
|
|
38164
|
+
}
|
|
38165
|
+
}
|
|
38166
|
+
function collectLanguageReferences(collector, language2) {
|
|
38167
|
+
addReference(collector, "languages", language2, false);
|
|
38168
|
+
if (!isRecord(language2)) return;
|
|
38169
|
+
addReference(collector, "fontSchemes", language2.fontScheme, false);
|
|
38170
|
+
addReference(collector, "fontSchemes", language2.googleFontScheme, false);
|
|
38171
|
+
}
|
|
38172
|
+
function collectDocumentReferences(collector, document) {
|
|
38173
|
+
addReference(collector, "narratives", document.narrative, typeof document.narrative === "string");
|
|
38174
|
+
collectBeatReferences(collector, document.narrative);
|
|
38175
|
+
addReference(collector, "tones", document.tone, false);
|
|
38176
|
+
addReference(collector, "purposes", document.purpose, false);
|
|
38177
|
+
collectLanguageReferences(collector, document.language);
|
|
38178
|
+
const audiences2 = Array.isArray(document.audience) ? document.audience : [document.audience];
|
|
38179
|
+
for (const entry of audiences2) addReference(collector, "audiences", entry, false);
|
|
38180
|
+
collectDesignReferences(collector, document.design);
|
|
38181
|
+
collectSocialReferences(collector, document.organization);
|
|
38182
|
+
collectSocialReferences(collector, document.speaker);
|
|
38183
|
+
if (!Array.isArray(document.slides)) return;
|
|
38184
|
+
for (const slide of document.slides) {
|
|
38185
|
+
if (!isRecord(slide)) continue;
|
|
38186
|
+
addReference(collector, "layouts", slide.layout, false);
|
|
38187
|
+
collectDesignReferences(collector, slide.design);
|
|
38188
|
+
collectChartReference(collector, slide);
|
|
38189
|
+
visitContentPayloads(slide, "", (payload) => {
|
|
38190
|
+
collectChartReference(collector, payload);
|
|
38191
|
+
});
|
|
38192
|
+
}
|
|
38193
|
+
}
|
|
38194
|
+
function collectRecordReferences(collector, kind2, record3) {
|
|
38195
|
+
if (kind2 === "themes") {
|
|
38196
|
+
addReference(collector, "colorSchemes", record3.colorScheme, false);
|
|
38197
|
+
addReference(collector, "fontSchemes", record3.fontScheme, false);
|
|
38198
|
+
} else if (kind2 === "narratives") {
|
|
38199
|
+
collectBeatReferences(collector, record3);
|
|
38200
|
+
} else if (kind2 === "languages") {
|
|
38201
|
+
addReference(collector, "fontSchemes", record3.fontScheme, false);
|
|
38202
|
+
addReference(collector, "fontSchemes", record3.googleFontScheme, false);
|
|
38203
|
+
}
|
|
38204
|
+
}
|
|
38205
|
+
var bundledIndex;
|
|
38206
|
+
function bundledCatalogIndex() {
|
|
38207
|
+
if (bundledIndex) return bundledIndex;
|
|
38208
|
+
const index2 = /* @__PURE__ */ new Map();
|
|
38209
|
+
for (const entry of catalogEntries) {
|
|
38210
|
+
const records = /* @__PURE__ */ new Map();
|
|
38211
|
+
for (const record3 of entry.records) {
|
|
38212
|
+
if (isRecord(record3) && typeof record3.id === "string") records.set(record3.id, record3);
|
|
38213
|
+
}
|
|
38214
|
+
index2.set(entry.kind, records);
|
|
38215
|
+
}
|
|
38216
|
+
bundledIndex = index2;
|
|
38217
|
+
return index2;
|
|
38218
|
+
}
|
|
38219
|
+
function bundledRecord(kind2, id) {
|
|
38220
|
+
const record3 = bundledCatalogIndex().get(kind2)?.get(id);
|
|
38221
|
+
if (!record3) return void 0;
|
|
38222
|
+
const clone2 = structuredClone(record3);
|
|
38223
|
+
delete clone2.$schema;
|
|
38224
|
+
return clone2;
|
|
38225
|
+
}
|
|
38226
|
+
function readKindState(catalogsField, kind2) {
|
|
38227
|
+
const entry = catalogsField[kind2];
|
|
38228
|
+
const inline = /* @__PURE__ */ new Map();
|
|
38229
|
+
if (!isRecord(entry)) return { customSource: false, inline };
|
|
38230
|
+
if (Array.isArray(entry.records)) {
|
|
38231
|
+
for (const record3 of entry.records) {
|
|
38232
|
+
if (isRecord(record3) && typeof record3.id === "string") inline.set(record3.id, record3);
|
|
38233
|
+
}
|
|
38234
|
+
}
|
|
38235
|
+
const customSource = typeof entry.source === "string" || Array.isArray(entry.source) && entry.source.length > 0;
|
|
38236
|
+
return { customSource, inline };
|
|
38237
|
+
}
|
|
38238
|
+
function kindState(states, catalogsField, kind2) {
|
|
38239
|
+
const cached = states.get(kind2);
|
|
38240
|
+
if (cached) return cached;
|
|
38241
|
+
const state = readKindState(catalogsField, kind2);
|
|
38242
|
+
states.set(kind2, state);
|
|
38243
|
+
return state;
|
|
38244
|
+
}
|
|
38245
|
+
function pushReportId(map, kind2, id) {
|
|
38246
|
+
const list = map[kind2];
|
|
38247
|
+
if (list) list.push(id);
|
|
38248
|
+
else map[kind2] = [id];
|
|
38249
|
+
}
|
|
38250
|
+
function bundlePresentation(value) {
|
|
38251
|
+
const report2 = { added: {}, alreadyInline: {}, keptSources: [], unresolved: {} };
|
|
38252
|
+
if (!isRecord(value)) {
|
|
38253
|
+
return { presentation: value, report: report2 };
|
|
38254
|
+
}
|
|
38255
|
+
const presentation2 = structuredClone(value);
|
|
38256
|
+
if (presentation2.catalogs !== void 0 && !isRecord(presentation2.catalogs)) {
|
|
38257
|
+
return { presentation: presentation2, report: report2 };
|
|
38258
|
+
}
|
|
38259
|
+
const catalogsField = isRecord(presentation2.catalogs) ? presentation2.catalogs : {};
|
|
38260
|
+
const collector = { queue: [], referenced: /* @__PURE__ */ new Map(), reportable: /* @__PURE__ */ new Set() };
|
|
38261
|
+
collectDocumentReferences(collector, presentation2);
|
|
38262
|
+
const states = /* @__PURE__ */ new Map();
|
|
38263
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
38264
|
+
for (let index2 = 0; index2 < collector.queue.length; index2 += 1) {
|
|
38265
|
+
const pending = collector.queue[index2];
|
|
38266
|
+
if (!pending) continue;
|
|
38267
|
+
const { kind: kind2, id } = pending;
|
|
38268
|
+
const state = kindState(states, catalogsField, kind2);
|
|
38269
|
+
const inlineRecord = state.inline.get(id);
|
|
38270
|
+
if (inlineRecord) {
|
|
38271
|
+
collectRecordReferences(collector, kind2, inlineRecord);
|
|
38272
|
+
continue;
|
|
38273
|
+
}
|
|
38274
|
+
if (state.customSource) continue;
|
|
38275
|
+
const record3 = bundledRecord(kind2, id);
|
|
38276
|
+
if (!record3) continue;
|
|
38277
|
+
let kindRecords = resolved.get(kind2);
|
|
38278
|
+
if (!kindRecords) {
|
|
38279
|
+
kindRecords = /* @__PURE__ */ new Map();
|
|
38280
|
+
resolved.set(kind2, kindRecords);
|
|
38281
|
+
}
|
|
38282
|
+
kindRecords.set(id, record3);
|
|
38283
|
+
collectRecordReferences(collector, kind2, record3);
|
|
38284
|
+
}
|
|
38285
|
+
for (const [kind2, ids] of collector.referenced) {
|
|
38286
|
+
const state = kindState(states, catalogsField, kind2);
|
|
38287
|
+
if (state.customSource) report2.keptSources.push(kind2);
|
|
38288
|
+
const kindResolved = resolved.get(kind2);
|
|
38289
|
+
const addedIds = [];
|
|
38290
|
+
for (const id of [...ids].sort()) {
|
|
38291
|
+
if (state.inline.has(id)) pushReportId(report2.alreadyInline, kind2, id);
|
|
38292
|
+
else if (kindResolved?.has(id)) addedIds.push(id);
|
|
38293
|
+
else if (!state.customSource && collector.reportable.has(reportKey(kind2, id))) {
|
|
38294
|
+
pushReportId(report2.unresolved, kind2, id);
|
|
38295
|
+
}
|
|
38296
|
+
}
|
|
38297
|
+
if (!addedIds.length) continue;
|
|
38298
|
+
if (!isRecord(presentation2.catalogs)) presentation2.catalogs = {};
|
|
38299
|
+
const catalogs2 = presentation2.catalogs;
|
|
38300
|
+
if (!isRecord(catalogs2[kind2])) catalogs2[kind2] = {};
|
|
38301
|
+
const entry = catalogs2[kind2];
|
|
38302
|
+
if (!Array.isArray(entry.records)) entry.records = [];
|
|
38303
|
+
const records = entry.records;
|
|
38304
|
+
for (const id of addedIds) records.push(kindResolved?.get(id));
|
|
38305
|
+
report2.added[kind2] = addedIds;
|
|
38306
|
+
}
|
|
38307
|
+
report2.keptSources.sort();
|
|
38308
|
+
return { presentation: presentation2, report: report2 };
|
|
38309
|
+
}
|
|
38310
|
+
|
|
37663
38311
|
// src/patch.ts
|
|
37664
38312
|
init_define_OPF_SKILLS();
|
|
37665
38313
|
var PatchError = class extends Error {
|
|
@@ -38036,6 +38684,7 @@ var usage = `OPF \u2014 local presentation files for agents (Node 24)
|
|
|
38036
38684
|
[--chart-type <id>] [--no-header] [--delimiter <character>] [--title <text>]
|
|
38037
38685
|
[--force] [--strict]
|
|
38038
38686
|
opf paginate <input|-> <output|-> [--force] [--strict]
|
|
38687
|
+
opf bundle <input|-> <output|-> [--force] [--strict]
|
|
38039
38688
|
opf schemas
|
|
38040
38689
|
opf schema [name] [JSON-Pointer]
|
|
38041
38690
|
opf catalogs
|
|
@@ -38050,6 +38699,9 @@ Edits apply JSON Patch (add/remove/replace/move/copy/test), validate the whole
|
|
|
38050
38699
|
result, and save atomically. --dry-run emits the result without saving.
|
|
38051
38700
|
Exit codes: 0 success, 1 invalid document/patch/conflict, 2 usage/JSON/I/O error.
|
|
38052
38701
|
Validation checks structure and references, not visual fidelity.
|
|
38702
|
+
Bundle inlines the bundled catalog records a document references (kinds with a
|
|
38703
|
+
custom source are left untouched) so the file resolves every catalog reference
|
|
38704
|
+
offline. Remote media and data assets are not inlined.
|
|
38053
38705
|
Lint adds source locations, contextual suggestions and explicit host contracts.
|
|
38054
38706
|
Lint syntax/schema/policy errors exit 1; --strict also rejects warnings.
|
|
38055
38707
|
|
|
@@ -38157,7 +38809,7 @@ async function main(argv) {
|
|
|
38157
38809
|
return;
|
|
38158
38810
|
}
|
|
38159
38811
|
if (argv.length === 1 && argv[0] === "--version") {
|
|
38160
|
-
print({ cli: "0.
|
|
38812
|
+
print({ cli: "0.9.0", opf: "0.11.0" });
|
|
38161
38813
|
return;
|
|
38162
38814
|
}
|
|
38163
38815
|
const [command, ...args] = argv;
|
|
@@ -38168,7 +38820,7 @@ async function main(argv) {
|
|
|
38168
38820
|
if (command === "skills") {
|
|
38169
38821
|
const { positional, options } = parse2(args, ["agent", "global", "directory"]);
|
|
38170
38822
|
arity(positional, 1);
|
|
38171
|
-
print(await manageSkills(positional[0], define_OPF_SKILLS_default, "0.
|
|
38823
|
+
print(await manageSkills(positional[0], define_OPF_SKILLS_default, "0.9.0", { agent: options.agent, global: !!options.global, directory: options.directory }));
|
|
38172
38824
|
return;
|
|
38173
38825
|
}
|
|
38174
38826
|
if (command === "create") {
|
|
@@ -38203,7 +38855,7 @@ async function main(argv) {
|
|
|
38203
38855
|
print({
|
|
38204
38856
|
...result,
|
|
38205
38857
|
sha256: hash(raw),
|
|
38206
|
-
opfVersion: "0.
|
|
38858
|
+
opfVersion: "0.11.0",
|
|
38207
38859
|
...config ? { context: { file: path2.resolve(String(options.config)), sha256: hash(config.raw) } } : {}
|
|
38208
38860
|
});
|
|
38209
38861
|
if (!result.valid || options.strict && result.counts.warning) process.exitCode = 1;
|
|
@@ -38272,6 +38924,15 @@ async function main(argv) {
|
|
|
38272
38924
|
await emit(result.presentation, positional[1], options, void 0, { pages: result.pages });
|
|
38273
38925
|
return;
|
|
38274
38926
|
}
|
|
38927
|
+
if (command === "bundle") {
|
|
38928
|
+
const { positional, options } = parse2(args, ["force", "strict"]);
|
|
38929
|
+
arity(positional, 2);
|
|
38930
|
+
const source = await readJson(positional[0]);
|
|
38931
|
+
checked(source.value, !!options.strict);
|
|
38932
|
+
const result = bundlePresentation(source.value);
|
|
38933
|
+
await emit(result.presentation, positional[1], options, void 0, { bundle: result.report });
|
|
38934
|
+
return;
|
|
38935
|
+
}
|
|
38275
38936
|
if (command === "schemas") {
|
|
38276
38937
|
arity(args, 0);
|
|
38277
38938
|
print(schemaEntries.map((entry) => ({ name: entry.name, file: entry.file, id: entry.schema.$id })));
|