@classic-homes/slides 0.5.6 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,40 @@
1
1
  import {
2
2
  DeckSchema,
3
+ Image,
4
+ Item,
3
5
  LAYOUTS,
4
6
  LAYOUT_CATEGORIES,
5
7
  baseSlide,
6
8
  getLayout
7
- } from "./chunk-36736WP4.js";
9
+ } from "./chunk-AOOBBLKE.js";
8
10
 
9
11
  // src/catalog.ts
10
12
  import { z } from "zod";
11
- import { zodToJsonSchema } from "zod-to-json-schema";
13
+ import { ignoreOverride, zodToJsonSchema } from "zod-to-json-schema";
14
+ var SHORTHAND = /* @__PURE__ */ new Map([
15
+ [Item._def.schema, "Shorthand for { text }."],
16
+ [Image._def.schema, "Shorthand for { src }."]
17
+ ]);
18
+ function toJsonSchema(schema, name) {
19
+ return zodToJsonSchema(schema, {
20
+ ...name ? { name } : {},
21
+ $refStrategy: "none",
22
+ override: (def) => {
23
+ const inner = def.schema;
24
+ const isEffects = def.typeName === "ZodEffects";
25
+ const hint = isEffects ? SHORTHAND.get(inner) : void 0;
26
+ if (!hint) return ignoreOverride;
27
+ const object = zodToJsonSchema(inner, {
28
+ $refStrategy: "none"
29
+ });
30
+ delete object.$schema;
31
+ return {
32
+ anyOf: [{ type: "string", description: hint }, object],
33
+ ...def.description ? { description: def.description } : {}
34
+ };
35
+ }
36
+ });
37
+ }
12
38
  function listLayouts() {
13
39
  return LAYOUTS.map((l) => ({
14
40
  name: l.name,
@@ -26,12 +52,12 @@ function describeLayout(name) {
26
52
  description: layout.description,
27
53
  whenToUse: layout.whenToUse,
28
54
  defaults: layout.defaults ?? {},
29
- schema: zodToJsonSchema(schema, { $refStrategy: "none" }),
55
+ schema: toJsonSchema(schema),
30
56
  example: layout.example
31
57
  };
32
58
  }
33
59
  function deckJsonSchema() {
34
- return zodToJsonSchema(DeckSchema, { name: "ClassicDeck", $refStrategy: "none" });
60
+ return toJsonSchema(DeckSchema, "ClassicDeck");
35
61
  }
36
62
  var AUTHORING_GUIDE = `# Writing a Classic Homes deck
37
63
 
@@ -104,4 +130,4 @@ export {
104
130
  deckJsonSchema,
105
131
  AUTHORING_GUIDE
106
132
  };
107
- //# sourceMappingURL=chunk-73QTNWG4.js.map
133
+ //# sourceMappingURL=chunk-O4HEBEJ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/catalog.ts"],"sourcesContent":["import { z } from 'zod';\nimport { ignoreOverride, zodToJsonSchema } from 'zod-to-json-schema';\nimport {\n LAYOUT_CATEGORIES,\n LAYOUTS,\n getLayout,\n type LayoutCategory,\n type LayoutName,\n} from './layouts/index.js';\nimport { baseSlide, Image, Item } from './schema/common.js';\nimport { DeckSchema } from './schema/deck.js';\n\n/**\n * Item and Image accept a bare string as shorthand (\"Q4 best\" → { text }, \"a.jpg\" → { src }).\n * zod-to-json-schema only sees the object behind the preprocess, so advertise both forms\n * or agents reading the schema think the shorthand in our own examples is invalid.\n */\nconst SHORTHAND = new Map<unknown, string>([\n [(Item._def as { schema: unknown }).schema, 'Shorthand for { text }.'],\n [(Image._def as { schema: unknown }).schema, 'Shorthand for { src }.'],\n]);\n\nfunction toJsonSchema(schema: z.ZodTypeAny, name?: string) {\n return zodToJsonSchema(schema, {\n ...(name ? { name } : {}),\n $refStrategy: 'none',\n override: (def) => {\n const inner = (def as { schema?: unknown }).schema;\n const isEffects = (def as { typeName?: string }).typeName === 'ZodEffects';\n const hint = isEffects ? SHORTHAND.get(inner) : undefined;\n if (!hint) return ignoreOverride;\n const object = zodToJsonSchema(inner as z.ZodTypeAny, {\n $refStrategy: 'none',\n }) as Record<string, unknown>;\n delete object.$schema;\n return {\n anyOf: [{ type: 'string', description: hint }, object],\n ...((def as { description?: string }).description\n ? { description: (def as { description?: string }).description }\n : {}),\n };\n },\n });\n}\n\nexport interface LayoutSummary {\n name: string;\n category: LayoutCategory;\n description: string;\n whenToUse: string;\n}\n\nexport function listLayouts(): LayoutSummary[] {\n return LAYOUTS.map((l) => ({\n name: l.name,\n category: LAYOUT_CATEGORIES[l.name as LayoutName],\n description: l.description,\n whenToUse: l.whenToUse,\n }));\n}\n\n/** Full description of one layout: fields as JSON Schema plus a working example. */\nexport function describeLayout(name: string) {\n const layout = getLayout(name);\n if (!layout) return undefined;\n const schema = z.object({ layout: z.literal(layout.name), ...layout.shape, ...baseSlide });\n return {\n name: layout.name,\n description: layout.description,\n whenToUse: layout.whenToUse,\n defaults: layout.defaults ?? {},\n schema: toJsonSchema(schema),\n example: layout.example,\n };\n}\n\n/** JSON Schema for a whole deck (editor tooling, `$schema` in deck files). */\nexport function deckJsonSchema() {\n return toJsonSchema(DeckSchema, 'ClassicDeck');\n}\n\n/** Authoring guidance shared by the CLI, MCP server and docs. */\nexport const AUTHORING_GUIDE = `# Writing a Classic Homes deck\n\nA deck is a YAML (or JSON) file: deck-level fields plus a list of slides. Each slide\npicks a **layout** and fills its fields. Layouts own all styling — there is no way to\nset colours, fonts or sizes directly, which is what keeps every deck on-brand.\n\n## Principles\n- **One idea per slide.** The headline states the point. Detail goes in \\`notes\\`.\n- **Short copy.** Titles under ~70 characters, bullets a few words, at most 6 bullets.\n \\`validate\\` warns when a slide gets crowded — split it rather than shrinking text.\n- **Speaker notes on every content slide.** Presenters press N (or P for presenter view).\n- **Real photos over decoration.** Every image needs \\`alt\\` text.\n- **Tracks** colour the accent: \\`value\\` (red, default) for the homeowner/value story,\n \\`build\\` (teal) for construction/process, \\`neutral\\` (navy) for framing slides.\n- **Backgrounds**: \\`paper\\` (default) for content; solid \\`navy\\`/\\`red\\`/\\`teal\\`/\\`plum\\`/\\`grey\\`/\\`stone\\`\n for dividers. \\`backgroundImage\\` + \\`overlay\\` puts a photo behind title/section/statement slides.\n\n## Picking a layout\n- **Numbers:** \\`stats\\` (2–6 headline figures, optional trend + sparkline), \\`chart\\` (a real chart —\n put the takeaway in the title), \\`table\\` (exact figures people compare).\n- **Processes & structure:** \\`flow\\` (ordered steps with arrows), \\`timeline\\` (dated milestones, phases),\n \\`cycle\\` (things that repeat), \\`hierarchy\\` (org chart / tree), \\`matrix\\` (2×2), \\`tiers\\`\n (funnel or pyramid), \\`walkthrough\\` (photo per stage), \\`journey\\` (deck agenda).\n- **Media:** \\`split\\` (text + photos), \\`photos\\`, \\`image\\` (with numbered \\`hotspots\\` for floor plans\n and site maps), \\`compare\\` (before/after slider), \\`video\\` (YouTube/Vimeo), \\`embed\\` (any https page:\n maps, dashboards, 3D tours, forms).\n- **Words:** \\`statement\\`, \\`bullets\\`, \\`cards\\`, \\`comparison\\`, \\`quote\\`.\n- **Wrap-up:** \\`qr\\` (send people somewhere), \\`contacts\\`, closing \\`statement\\`.\n\n## Charts\n\\`chart.labels\\` are the categories; each series has one value per label. Pie, donut, funnel and\ngauge use the first series; gauge needs \\`max\\`; scatter uses two series as x and y. Use\n\\`highlight\\` to emphasise one category and \\`format\\`/\\`unit\\` instead of typing symbols into numbers.\n\n## Video & embeds\nThey need internet while presenting. Offline, in print and in PDF they show a poster (or\n\\`fallback\\` screenshot) with a QR code. Some sites refuse to be framed — the \"Open ↗\" link\nalways works; add a \\`fallback\\` image for anything critical.\n\n## Brand\n\\`brand.profile\\` picks who the deck speaks for (default \\`classic-homes\\`). You may override\n\\`name\\`, \\`tagline\\`, \\`logo\\`, \\`logoOnDark\\`, \\`favicon\\` and \\`footer\\`; colours come from the profile.\n\\`settings\\` controls slide numbers, logo placement, a confidential label and kiosk auto-advance.\n\n## Presenting\nArrow keys / Space advance (and step through \\`build: true\\` reveals). N notes · P presenter window\n(current + next slide, notes, timer) · O overview · F fullscreen · \\`?kiosk=15\\` on the URL loops\nunattended. \\`hidden: true\\` skips a slide without deleting it.\n\n## Inline text\n\\`**bold**\\`, \\`*highlight*\\` (accent colour), \\`\\\\\\`code\\\\\\`\\`, \\`[label](https://…)\\`. No HTML.\n\n## Journey decks\nSet \\`journey.steps\\` at deck level to get a numbered agenda. Then:\n- a \\`journey\\` slide shows the full map,\n- \\`step: 3\\` on any slide draws the vertical STEP rail,\n- \\`showJourney: true\\` adds the compact \"you are here\" strip (great on \\`section\\` slides).\n\n## Typical shape\n1. \\`title\\`\n2. \\`statement\\` or \\`journey\\` (why we're here / the agenda)\n3. per part: \\`section\\` → 2–5 content slides\n4. \\`qr\\` (where to go next) → \\`contacts\\` → closing \\`statement\\`\n`;\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,SAAS;AAClB,SAAS,gBAAgB,uBAAuB;AAgBhD,IAAM,YAAY,oBAAI,IAAqB;AAAA,EACzC,CAAE,KAAK,KAA6B,QAAQ,yBAAyB;AAAA,EACrE,CAAE,MAAM,KAA6B,QAAQ,wBAAwB;AACvE,CAAC;AAED,SAAS,aAAa,QAAsB,MAAe;AACzD,SAAO,gBAAgB,QAAQ;AAAA,IAC7B,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,cAAc;AAAA,IACd,UAAU,CAAC,QAAQ;AACjB,YAAM,QAAS,IAA6B;AAC5C,YAAM,YAAa,IAA8B,aAAa;AAC9D,YAAM,OAAO,YAAY,UAAU,IAAI,KAAK,IAAI;AAChD,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,SAAS,gBAAgB,OAAuB;AAAA,QACpD,cAAc;AAAA,MAChB,CAAC;AACD,aAAO,OAAO;AACd,aAAO;AAAA,QACL,OAAO,CAAC,EAAE,MAAM,UAAU,aAAa,KAAK,GAAG,MAAM;AAAA,QACrD,GAAK,IAAiC,cAClC,EAAE,aAAc,IAAiC,YAAY,IAC7D,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,CAAC;AACH;AASO,SAAS,cAA+B;AAC7C,SAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,IACzB,MAAM,EAAE;AAAA,IACR,UAAU,kBAAkB,EAAE,IAAkB;AAAA,IAChD,aAAa,EAAE;AAAA,IACf,WAAW,EAAE;AAAA,EACf,EAAE;AACJ;AAGO,SAAS,eAAe,MAAc;AAC3C,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,OAAO,IAAI,GAAG,GAAG,OAAO,OAAO,GAAG,UAAU,CAAC;AACzF,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,YAAY,CAAC;AAAA,IAC9B,QAAQ,aAAa,MAAM;AAAA,IAC3B,SAAS,OAAO;AAAA,EAClB;AACF;AAGO,SAAS,iBAAiB;AAC/B,SAAO,aAAa,YAAY,aAAa;AAC/C;AAGO,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  parseDeckSource,
4
4
  renderDeck,
5
5
  stringifyDeck
6
- } from "./chunk-36736WP4.js";
6
+ } from "./chunk-AOOBBLKE.js";
7
7
 
8
8
  // src/node/index.ts
9
9
  import { readFile, stat, writeFile } from "fs/promises";
@@ -117,4 +117,4 @@ export {
117
117
  buildDeckFile,
118
118
  exportDeckFile
119
119
  };
120
- //# sourceMappingURL=chunk-BNRC4EI3.js.map
120
+ //# sourceMappingURL=chunk-XARJP3G2.js.map
package/dist/cli.js CHANGED
@@ -4,19 +4,19 @@ import {
4
4
  deckJsonSchema,
5
5
  describeLayout,
6
6
  listLayouts
7
- } from "./chunk-73QTNWG4.js";
7
+ } from "./chunk-O4HEBEJ5.js";
8
8
  import {
9
9
  buildDeckFile,
10
10
  exportDeckFile,
11
11
  fileImageResolver,
12
12
  loadDeckFile
13
- } from "./chunk-BNRC4EI3.js";
13
+ } from "./chunk-XARJP3G2.js";
14
14
  import {
15
15
  DeckError,
16
16
  formatIssues,
17
17
  renderDeck,
18
18
  validateDeck
19
- } from "./chunk-36736WP4.js";
19
+ } from "./chunk-AOOBBLKE.js";
20
20
 
21
21
  // src/node/cli.ts
22
22
  import { watch } from "fs";
@@ -126,7 +126,7 @@ ${"".padEnd(12)} Use for: ${l.whenToUse}
126
126
  case "mcp": {
127
127
  let mcp;
128
128
  try {
129
- mcp = await import("./mcp-C65N7OUL.js");
129
+ mcp = await import("./mcp-JE3DHERM.js");
130
130
  } catch (e) {
131
131
  if (e.code === "ERR_MODULE_NOT_FOUND") {
132
132
  throw new Error(
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  deckJsonSchema,
4
4
  describeLayout,
5
5
  listLayouts
6
- } from "./chunk-73QTNWG4.js";
6
+ } from "./chunk-O4HEBEJ5.js";
7
7
  import {
8
8
  BrandPaletteSchema,
9
9
  BrandProfileSchema,
@@ -65,7 +65,7 @@ import {
65
65
  validateBrandProfile,
66
66
  validateDeck,
67
67
  videoEmbedUrl
68
- } from "./chunk-36736WP4.js";
68
+ } from "./chunk-AOOBBLKE.js";
69
69
 
70
70
  // src/generated/runtime-hash.ts
71
71
  var RUNTIME_SCRIPT_HASH = "sha256-gElvQAb4VPvKu4UeyJRVKuoHYNp8NGhXwx2EhL7NB88=";
@@ -2,13 +2,13 @@ import {
2
2
  AUTHORING_GUIDE,
3
3
  describeLayout,
4
4
  listLayouts
5
- } from "./chunk-73QTNWG4.js";
5
+ } from "./chunk-O4HEBEJ5.js";
6
6
  import {
7
7
  buildDeckFile,
8
8
  confinedPath,
9
9
  loadDeckFile,
10
10
  saveDeckFile
11
- } from "./chunk-BNRC4EI3.js";
11
+ } from "./chunk-XARJP3G2.js";
12
12
  import {
13
13
  addSlide,
14
14
  formatIssues,
@@ -18,7 +18,7 @@ import {
18
18
  stringifyDeck,
19
19
  updateSlide,
20
20
  validateDeck
21
- } from "./chunk-36736WP4.js";
21
+ } from "./chunk-AOOBBLKE.js";
22
22
 
23
23
  // src/node/mcp.ts
24
24
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -320,4 +320,4 @@ export {
320
320
  createSlidesMcpServer,
321
321
  runStdio
322
322
  };
323
- //# sourceMappingURL=mcp-C65N7OUL.js.map
323
+ //# sourceMappingURL=mcp-JE3DHERM.js.map
package/dist/node.js CHANGED
@@ -5,10 +5,10 @@ import {
5
5
  fileImageResolver,
6
6
  loadDeckFile,
7
7
  saveDeckFile
8
- } from "./chunk-BNRC4EI3.js";
8
+ } from "./chunk-XARJP3G2.js";
9
9
  import {
10
10
  renderDeck
11
- } from "./chunk-36736WP4.js";
11
+ } from "./chunk-AOOBBLKE.js";
12
12
  export {
13
13
  IMAGE_WARN_BYTES,
14
14
  buildDeckFile,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@classic-homes/slides",
3
- "version": "0.5.6",
3
+ "version": "0.5.8",
4
4
  "description": "Branded Classic Homes presentations from structured deck files: schema, layouts, renderer, CLI and MCP server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/catalog.ts"],"sourcesContent":["import { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport {\n LAYOUT_CATEGORIES,\n LAYOUTS,\n getLayout,\n type LayoutCategory,\n type LayoutName,\n} from './layouts/index.js';\nimport { baseSlide } from './schema/common.js';\nimport { DeckSchema } from './schema/deck.js';\n\nexport interface LayoutSummary {\n name: string;\n category: LayoutCategory;\n description: string;\n whenToUse: string;\n}\n\nexport function listLayouts(): LayoutSummary[] {\n return LAYOUTS.map((l) => ({\n name: l.name,\n category: LAYOUT_CATEGORIES[l.name as LayoutName],\n description: l.description,\n whenToUse: l.whenToUse,\n }));\n}\n\n/** Full description of one layout: fields as JSON Schema plus a working example. */\nexport function describeLayout(name: string) {\n const layout = getLayout(name);\n if (!layout) return undefined;\n const schema = z.object({ layout: z.literal(layout.name), ...layout.shape, ...baseSlide });\n return {\n name: layout.name,\n description: layout.description,\n whenToUse: layout.whenToUse,\n defaults: layout.defaults ?? {},\n schema: zodToJsonSchema(schema, { $refStrategy: 'none' }),\n example: layout.example,\n };\n}\n\n/** JSON Schema for a whole deck (editor tooling, `$schema` in deck files). */\nexport function deckJsonSchema() {\n return zodToJsonSchema(DeckSchema, { name: 'ClassicDeck', $refStrategy: 'none' });\n}\n\n/** Authoring guidance shared by the CLI, MCP server and docs. */\nexport const AUTHORING_GUIDE = `# Writing a Classic Homes deck\n\nA deck is a YAML (or JSON) file: deck-level fields plus a list of slides. Each slide\npicks a **layout** and fills its fields. Layouts own all styling — there is no way to\nset colours, fonts or sizes directly, which is what keeps every deck on-brand.\n\n## Principles\n- **One idea per slide.** The headline states the point. Detail goes in \\`notes\\`.\n- **Short copy.** Titles under ~70 characters, bullets a few words, at most 6 bullets.\n \\`validate\\` warns when a slide gets crowded — split it rather than shrinking text.\n- **Speaker notes on every content slide.** Presenters press N (or P for presenter view).\n- **Real photos over decoration.** Every image needs \\`alt\\` text.\n- **Tracks** colour the accent: \\`value\\` (red, default) for the homeowner/value story,\n \\`build\\` (teal) for construction/process, \\`neutral\\` (navy) for framing slides.\n- **Backgrounds**: \\`paper\\` (default) for content; solid \\`navy\\`/\\`red\\`/\\`teal\\`/\\`plum\\`/\\`grey\\`/\\`stone\\`\n for dividers. \\`backgroundImage\\` + \\`overlay\\` puts a photo behind title/section/statement slides.\n\n## Picking a layout\n- **Numbers:** \\`stats\\` (2–6 headline figures, optional trend + sparkline), \\`chart\\` (a real chart —\n put the takeaway in the title), \\`table\\` (exact figures people compare).\n- **Processes & structure:** \\`flow\\` (ordered steps with arrows), \\`timeline\\` (dated milestones, phases),\n \\`cycle\\` (things that repeat), \\`hierarchy\\` (org chart / tree), \\`matrix\\` (2×2), \\`tiers\\`\n (funnel or pyramid), \\`walkthrough\\` (photo per stage), \\`journey\\` (deck agenda).\n- **Media:** \\`split\\` (text + photos), \\`photos\\`, \\`image\\` (with numbered \\`hotspots\\` for floor plans\n and site maps), \\`compare\\` (before/after slider), \\`video\\` (YouTube/Vimeo), \\`embed\\` (any https page:\n maps, dashboards, 3D tours, forms).\n- **Words:** \\`statement\\`, \\`bullets\\`, \\`cards\\`, \\`comparison\\`, \\`quote\\`.\n- **Wrap-up:** \\`qr\\` (send people somewhere), \\`contacts\\`, closing \\`statement\\`.\n\n## Charts\n\\`chart.labels\\` are the categories; each series has one value per label. Pie, donut, funnel and\ngauge use the first series; gauge needs \\`max\\`; scatter uses two series as x and y. Use\n\\`highlight\\` to emphasise one category and \\`format\\`/\\`unit\\` instead of typing symbols into numbers.\n\n## Video & embeds\nThey need internet while presenting. Offline, in print and in PDF they show a poster (or\n\\`fallback\\` screenshot) with a QR code. Some sites refuse to be framed — the \"Open ↗\" link\nalways works; add a \\`fallback\\` image for anything critical.\n\n## Brand\n\\`brand.profile\\` picks who the deck speaks for (default \\`classic-homes\\`). You may override\n\\`name\\`, \\`tagline\\`, \\`logo\\`, \\`logoOnDark\\`, \\`favicon\\` and \\`footer\\`; colours come from the profile.\n\\`settings\\` controls slide numbers, logo placement, a confidential label and kiosk auto-advance.\n\n## Presenting\nArrow keys / Space advance (and step through \\`build: true\\` reveals). N notes · P presenter window\n(current + next slide, notes, timer) · O overview · F fullscreen · \\`?kiosk=15\\` on the URL loops\nunattended. \\`hidden: true\\` skips a slide without deleting it.\n\n## Inline text\n\\`**bold**\\`, \\`*highlight*\\` (accent colour), \\`\\\\\\`code\\\\\\`\\`, \\`[label](https://…)\\`. No HTML.\n\n## Journey decks\nSet \\`journey.steps\\` at deck level to get a numbered agenda. Then:\n- a \\`journey\\` slide shows the full map,\n- \\`step: 3\\` on any slide draws the vertical STEP rail,\n- \\`showJourney: true\\` adds the compact \"you are here\" strip (great on \\`section\\` slides).\n\n## Typical shape\n1. \\`title\\`\n2. \\`statement\\` or \\`journey\\` (why we're here / the agenda)\n3. per part: \\`section\\` → 2–5 content slides\n4. \\`qr\\` (where to go next) → \\`contacts\\` → closing \\`statement\\`\n`;\n"],"mappings":";;;;;;;;;AAAA,SAAS,SAAS;AAClB,SAAS,uBAAuB;AAkBzB,SAAS,cAA+B;AAC7C,SAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,IACzB,MAAM,EAAE;AAAA,IACR,UAAU,kBAAkB,EAAE,IAAkB;AAAA,IAChD,aAAa,EAAE;AAAA,IACf,WAAW,EAAE;AAAA,EACf,EAAE;AACJ;AAGO,SAAS,eAAe,MAAc;AAC3C,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,OAAO,IAAI,GAAG,GAAG,OAAO,OAAO,GAAG,UAAU,CAAC;AACzF,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,YAAY,CAAC;AAAA,IAC9B,QAAQ,gBAAgB,QAAQ,EAAE,cAAc,OAAO,CAAC;AAAA,IACxD,SAAS,OAAO;AAAA,EAClB;AACF;AAGO,SAAS,iBAAiB;AAC/B,SAAO,gBAAgB,YAAY,EAAE,MAAM,eAAe,cAAc,OAAO,CAAC;AAClF;AAGO,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}