@folienbaukasten/extension-toolkit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +109 -0
  2. package/abi/README.md +20 -0
  3. package/abi/abi.json +151 -0
  4. package/abi/pack.d.ts +196 -0
  5. package/abi/pack.js +126 -0
  6. package/abi/provenance.json +5 -0
  7. package/abi/shims/jsx-runtime.js +13 -0
  8. package/abi/shims/platform.js +48 -0
  9. package/abi/shims/react.js +18 -0
  10. package/abi/types/charts/geometry.d.ts +43 -0
  11. package/abi/types/charts/option.d.ts +15 -0
  12. package/abi/types/charts/scale.d.ts +14 -0
  13. package/abi/types/charts/theme.d.ts +16 -0
  14. package/abi/types/charts/waterfall.d.ts +35 -0
  15. package/abi/types/components/Block.d.ts +31 -0
  16. package/abi/types/components/BlockArrow.d.ts +16 -0
  17. package/abi/types/components/Card.d.ts +25 -0
  18. package/abi/types/components/ChartView.d.ts +4 -0
  19. package/abi/types/components/DriverTree.d.ts +9 -0
  20. package/abi/types/components/FindingsBanner.d.ts +21 -0
  21. package/abi/types/components/HarveyBall.d.ts +12 -0
  22. package/abi/types/components/HeaderTitle.d.ts +19 -0
  23. package/abi/types/components/InsightRail.d.ts +13 -0
  24. package/abi/types/components/KpiTile.d.ts +5 -0
  25. package/abi/types/components/Matrix.d.ts +5 -0
  26. package/abi/types/components/QuoteColumn.d.ts +5 -0
  27. package/abi/types/components/SourceLine.d.ts +6 -0
  28. package/abi/types/components/Table.d.ts +5 -0
  29. package/abi/types/components/Timeline.d.ts +5 -0
  30. package/abi/types/components/slide/ContentSlide.d.ts +29 -0
  31. package/abi/types/components/slide/MissingComponent.d.ts +26 -0
  32. package/abi/types/components/slide/SlideFrame.d.ts +20 -0
  33. package/abi/types/components/slide/SlotView.d.ts +30 -0
  34. package/abi/types/components/slide/registry.d.ts +27 -0
  35. package/abi/types/components/slide/views/AgendaSlideView.d.ts +8 -0
  36. package/abi/types/components/slide/views/CardsSlideView.d.ts +12 -0
  37. package/abi/types/components/slide/views/ChaptersSlideView.d.ts +11 -0
  38. package/abi/types/components/slide/views/ChartSlideView.d.ts +3 -0
  39. package/abi/types/components/slide/views/ComponentSlideView.d.ts +19 -0
  40. package/abi/types/components/slide/views/DriverTreeSlideView.d.ts +3 -0
  41. package/abi/types/components/slide/views/FreeformSlideView.d.ts +3 -0
  42. package/abi/types/components/slide/views/KpiSlideView.d.ts +3 -0
  43. package/abi/types/components/slide/views/MatrixSlideView.d.ts +3 -0
  44. package/abi/types/components/slide/views/QuoteSlideView.d.ts +3 -0
  45. package/abi/types/components/slide/views/QuotesSlideView.d.ts +5 -0
  46. package/abi/types/components/slide/views/SplitSlideView.d.ts +3 -0
  47. package/abi/types/components/slide/views/TableSlideView.d.ts +3 -0
  48. package/abi/types/components/slide/views/TimelineSlideView.d.ts +3 -0
  49. package/abi/types/components/slide/views/TitleSlideView.d.ts +7 -0
  50. package/abi/types/components/slide/views/TwoBlockSlideView.d.ts +3 -0
  51. package/abi/types/components/slide/views/WebSlideView.d.ts +23 -0
  52. package/abi/types/components/slide/views/WhileArrowSlideView.d.ts +14 -0
  53. package/abi/types/deck/data.d.ts +127 -0
  54. package/abi/types/deck/host.d.ts +9 -0
  55. package/abi/types/deck/layouts.d.ts +685 -0
  56. package/abi/types/deck/schema.d.ts +437 -0
  57. package/abi/types/deck/web-body.d.ts +47 -0
  58. package/abi/types/lib/format.d.ts +12 -0
  59. package/abi/types/sets/platform.d.ts +45 -0
  60. package/abi/types/sets/types.d.ts +128 -0
  61. package/dist/fbk-pack.js +756 -0
  62. package/package.json +49 -0
  63. package/tsconfig.extension.json +17 -0
@@ -0,0 +1,18 @@
1
+ // Injected into every theme pack in place of `react` (tools/pack-set.ts).
2
+ // A pack must never bundle its own React: two copies in one page are two
3
+ // renderers, and a platform component built by one cannot be rendered by the
4
+ // other. The app publishes the live one on globalThis before it imports a
5
+ // pack (src/sets/runtime.ts).
6
+ const runtime = globalThis.__FBK_SET_RUNTIME__;
7
+ if (!runtime) {
8
+ throw new Error('This theme was loaded without the Folien Baukasten set runtime.');
9
+ }
10
+ const React = runtime.react;
11
+ export default React.default ?? React;
12
+ export const {
13
+ Children, Fragment, StrictMode, Suspense, cloneElement, createContext,
14
+ createElement, forwardRef, isValidElement, lazy, memo, startTransition,
15
+ useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useId,
16
+ useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo,
17
+ useReducer, useRef, useState, useSyncExternalStore, useTransition,
18
+ } = React;
@@ -0,0 +1,43 @@
1
+ /** The inner plot rect — the data area, excluding axis labels. */
2
+ export interface PlotArea {
3
+ x: number;
4
+ y: number;
5
+ w: number;
6
+ h: number;
7
+ }
8
+ /**
9
+ * Centre of category band `i` of `n`, as a fraction along the plot axis.
10
+ *
11
+ * Both renderers put a bar group AND a line's data point at the centre of
12
+ * its category band (ECharts' `boundaryGap: true`, which is the category
13
+ * default; Excel and PowerPoint do the same for line charts). Anything
14
+ * anchored to a category — a marker rule, a row in a side column — belongs
15
+ * here, not at `i / (n - 1)`, which is the edge-to-edge spacing a scatter
16
+ * plot would use and is off by half a band everywhere but the middle.
17
+ */
18
+ export declare function bandCentre(i: number, n: number): number;
19
+ /** Band centre in the chart box's own coordinates: along x for columns and
20
+ * lines, along y for horizontal bars (category axis inverted, so band 0 is
21
+ * at the top). */
22
+ export declare function bandCentreX(plot: PlotArea, i: number, n: number): number;
23
+ export declare function bandCentreY(plot: PlotArea, i: number, n: number): number;
24
+ /**
25
+ * Where a value sits vertically, as a fraction of the chart box — only
26
+ * meaningful when the spec pins BOTH bounds, because otherwise each renderer
27
+ * picks its own "nice" axis maximum and the answer differs between them.
28
+ */
29
+ export declare function valueY(plot: PlotArea, value: number, min: number, max: number): number;
30
+ /**
31
+ * Minimum vertical distance between two end labels, as a fraction of the
32
+ * chart box. A 9pt label in a half-slide-tall chart is about this much.
33
+ */
34
+ export declare const LABEL_MIN_GAP = 0.034;
35
+ /**
36
+ * Pushes overlapping labels apart, top-first, preserving their order.
37
+ *
38
+ * Returns one offset per input (fraction of the chart box, negative is up),
39
+ * so a caller can apply them wherever its renderer takes an offset. Order is
40
+ * preserved deliberately: a label that has swapped places with its
41
+ * neighbour is worse than one sitting slightly off its line.
42
+ */
43
+ export declare function spreadLabels(ys: number[], minGap?: number): number[];
@@ -0,0 +1,15 @@
1
+ import type { EChartsOption } from 'echarts';
2
+ import type { ChartSpec } from '../deck/schema';
3
+ import type { ChartTheme } from './theme';
4
+ /**
5
+ * ChartSpec → ECharts option. Leans on ECharts defaults wherever the PPTX
6
+ * side can express the same look; everything themed comes from ChartTheme.
7
+ *
8
+ * Tooltips are always on: they only exist on hover, so the measure pass, the
9
+ * screenshots and the PDF never see them — a livelier preview for free. Entrance animation is opt-in via
10
+ * `animate`, because the PDF path reloads the page without the capture
11
+ * flags and would print mid-flight frames.
12
+ */
13
+ export declare function buildChartOption(spec: ChartSpec, theme: ChartTheme, opts?: {
14
+ animate?: boolean;
15
+ }): EChartsOption;
@@ -0,0 +1,14 @@
1
+ /** PowerPoint's gap width (% of bar width) → share of the category band. */
2
+ export declare function barFractionFromGapPct(gapPct: number): number;
3
+ /** Share of the category band → PowerPoint's gap width. */
4
+ export declare function gapPctFromBarFraction(fraction: number): number;
5
+ /**
6
+ * Where the value axis starts under a `zero` baseline: pinned to 0 when the
7
+ * data is all on one side of it. With negative values present both
8
+ * renderers already straddle zero on their own, and pinning the minimum
9
+ * would clip the chart — so the answer is "let it scale".
10
+ *
11
+ * `auto` always returns undefined: it truncates the scale, which is the
12
+ * commonest way these charts mislead, so it has to be asked for.
13
+ */
14
+ export declare function valueAxisMin(values: Array<number | null>, baseline: 'zero' | 'auto' | undefined): number | undefined;
@@ -0,0 +1,16 @@
1
+ /** Chart-relevant theme tokens, resolved from CSS custom properties at
2
+ * runtime so theme.css stays the single source of truth. */
3
+ export interface ChartTheme {
4
+ /** Series palette, '#rrggbb'. */
5
+ series: string[];
6
+ positive: string;
7
+ negative: string;
8
+ /** Waterfall totals. */
9
+ neutral: string;
10
+ /** The theme's accent, for the one series that carries the argument. */
11
+ accent: string;
12
+ fontFamily: string;
13
+ textColor: string;
14
+ mutedColor: string;
15
+ }
16
+ export declare function readChartTheme(): ChartTheme;
@@ -0,0 +1,35 @@
1
+ export interface WaterfallSegments {
2
+ /** Invisible stack offset. */
3
+ base: (number | null)[];
4
+ increase: (number | null)[];
5
+ decrease: (number | null)[];
6
+ total: (number | null)[];
7
+ /**
8
+ * Label value per category — magnitudes, unsigned: PPTX stacked-chart
9
+ * labels come from the (positive) series values, so ECharts shows the
10
+ * same; the bar color conveys direction.
11
+ */
12
+ labels: number[];
13
+ /**
14
+ * Running total after each category — the height at which category i's
15
+ * bar hands over to i+1. Both renderers draw the connector line there
16
+ * (ECharts a custom series, PPTX a native `<c:serLines>`).
17
+ */
18
+ ends: number[];
19
+ }
20
+ /**
21
+ * How much of a category band the column fills. Shared so the preview and
22
+ * the .pptx put the same amount of air between bars: ECharts takes the
23
+ * fraction directly, PowerPoint takes the gap *between* bands.
24
+ */
25
+ export declare const WF_BAR_FRACTION = 0.56;
26
+ export declare const WF_GAP_WIDTH_PCT: number;
27
+ /**
28
+ * How far the exporter nudges each bar label past the segment's top edge,
29
+ * as a fraction of the chart area (a `<c:manualLayout>` offset on the
30
+ * label, from its `inEnd` anchor). A fixed constant, not per-bar
31
+ * arithmetic: OOXML has no `outEnd` for stacked charts, and this is the
32
+ * declarative stand-in — ECharts says the same thing with position 'top'.
33
+ */
34
+ export declare const WF_LABEL_RAISE = -0.04;
35
+ export declare function computeWaterfall(rawDeltas: Array<number | null>, totalIndices?: number[]): WaterfallSegments;
@@ -0,0 +1,31 @@
1
+ import type { BlockSpec } from '../deck/schema';
2
+ /**
3
+ * Content block, rendered as the theme's `card` or `callout` box style —
4
+ * `variant` selects which (DESIGN-SPEC.md §5.C). All look lives in
5
+ * theme.css, including which side the accent edge sits on: `callout` is
6
+ * left-edged in every theme because a left edge means "aside", while `card`
7
+ * follows the theme's signature side.
8
+ *
9
+ * `bullets` render as a real list under the body. Each item is its own
10
+ * tagged text node so the exporter measures one textbox per bullet — a
11
+ * single multi-line textbox would lose the marker geometry in PPTX.
12
+ *
13
+ * Fills its grid cell, so sibling blocks always share the same height —
14
+ * enforced by the layout, never by content.
15
+ *
16
+ * `path` is the spec's location inside the slide props (`"left"`,
17
+ * `"items.2.block"`), threaded in by the layout for inline editing — the
18
+ * component is the only place that knows whether `body` was a string or an
19
+ * array, so it is where the exact `data-edit` path must be stamped.
20
+ *
21
+ * The same path goes on the root as `data-item`: `data-edit` says "this
22
+ * node's text *is* that scalar", `data-item` says "this node *is* that whole
23
+ * component-shaped value". Freeform drag hit-tests against those nodes and
24
+ * the bake reads them to know where a component ends, so the attribute
25
+ * belongs on the element whose box is the component's visible extent — here
26
+ * the `.box`, not the inner padding wrapper.
27
+ */
28
+ export declare function Block({ spec, path }: {
29
+ spec: BlockSpec;
30
+ path?: string;
31
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Slim right-pointing blade between the "while …" boxes: a solid isosceles
3
+ * triangle — width tapers from nothing at top/bottom to the apex at
4
+ * mid-height. Fills its container.
5
+ *
6
+ * PPTX: exported as the native `triangle` preset rotated 90° (see
7
+ * tools/export.ts), which is geometrically identical, so HTML and PPTX
8
+ * match by construction — the exporter reads the *computed* fill, so a set
9
+ * that retints the blade needs no export change.
10
+ *
11
+ * Colour: `--color-arrow`, falling back to the accent. It is connective
12
+ * tissue — it says "and then", it is not the point of the slide — so a set
13
+ * whose accent is loud can quiet it down without a component override. The
14
+ * fallback keeps the token optional for sets that do not care.
15
+ */
16
+ export declare function BlockArrow(): import("react").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import type { CardSpec } from '../deck/schema';
2
+ /**
3
+ * One card of a card grid, rendered as the theme's `card` box style.
4
+ *
5
+ * All look lives in theme.css (.box / .box-edge / .box-inner and the
6
+ * .box-card* modifiers, DESIGN-SPEC.md §5.C). This component owns only
7
+ * structure and the export/edit tagging, so a theme restyles every card —
8
+ * including flipping the accent edge from top to left — without touching
9
+ * this file.
10
+ *
11
+ * Emphasis moves the edge color AND the fill together (§5.B2). The edge is
12
+ * always present: on a plain card it is muted, on an emphasis card it is the
13
+ * accent, so a row of cards says which one matters before it is read. That
14
+ * is why the edge is not conditional the way it used to be.
15
+ *
16
+ * The edge and the title separator are real elements rather than CSS
17
+ * borders, because measure-dom reads computed border and a per-side border
18
+ * would export as a full outline.
19
+ *
20
+ * Fills its grid cell, so sibling cards always share a height.
21
+ */
22
+ export declare function Card({ spec, path }: {
23
+ spec: CardSpec;
24
+ path?: string;
25
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { ChartSpec } from '../deck/schema';
2
+ export declare function ChartView({ spec }: {
3
+ spec: ChartSpec;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import type { DriverSpec } from '../deck/schema';
2
+ export declare function DriverTree({ root, branches, rootPath, branchesPath, }: {
3
+ root: string;
4
+ branches: DriverSpec[];
5
+ /** `data-edit` paths for the two specs — passed separately because this
6
+ * component renders two independent props of its layout. */
7
+ rootPath?: string;
8
+ branchesPath?: string;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import type { FindingSpec } from '../deck/schema';
2
+ /**
3
+ * Findings/recommendation banner: accent label segment on the left, light
4
+ * statement bar filling the rest. Square corners by design (per-corner radii
5
+ * cannot be exported). The text spans are tagged individually so their
6
+ * vertically-centered position is measured — the shapes carry no text of
7
+ * their own.
8
+ *
9
+ * The height is FIXED (--banner-height), not content-driven. A one-line and
10
+ * a two-line finding have to occupy the same band: when the banner grew with
11
+ * its text, the slide's bottom edge shifted between slides and the deck
12
+ * visibly breathed from one to the next. Both segments stretch to that
13
+ * height and center their text, so one line sits mid-band and two lines fill
14
+ * it.
15
+ *
16
+ * Text beyond two lines overflows rather than growing the band — deliberate,
17
+ * and the overflow check reports it. A finding that long belongs in the body.
18
+ */
19
+ export declare function FindingsBanner({ spec }: {
20
+ spec: FindingSpec;
21
+ }): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { HarveyValue } from '../deck/schema';
2
+ /**
3
+ * Harvey ball, rendered as inline SVG. Exported to PPTX as vector shapes:
4
+ * an ellipse outline plus (for partial values) a pie segment — see
5
+ * tools/export.ts. Stroke width is a shared constant with the exporter.
6
+ */
7
+ export declare const HARVEY_STROKE_PX = 1.5;
8
+ export declare const HARVEY_SIZE_PX = 20;
9
+ export declare function HarveyBall({ value, size }: {
10
+ value: HarveyValue;
11
+ size?: number;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * The action title, with one phrase optionally in the theme's highlight
4
+ * colour (`HeaderSpec.highlight`).
5
+ *
6
+ * Shared by every set's Header so the behaviour cannot drift between them,
7
+ * and so a set that never thought about highlighting still renders it.
8
+ *
9
+ * Export note: the highlighted phrase is a `<span>` inside the tagged text
10
+ * element, not a separate `data-pptx` node. measure-dom's `runsOf` walks one
11
+ * level of inline markup and emits a styled run per child, so the PPTX gets
12
+ * a single textbox with a coloured run — which is what a highlighted phrase
13
+ * has to be to keep wrapping with the sentence around it.
14
+ *
15
+ * A `highlight` that is not in the title is ignored rather than throwing:
16
+ * the model composes these, and a near-miss should cost the colour, not the
17
+ * slide.
18
+ */
19
+ export declare function headerTitle(title: string, highlight?: string): ReactNode;
@@ -0,0 +1,13 @@
1
+ import type { InsightSpec } from '../deck/schema';
2
+ /**
3
+ * Takeaway strip: equal columns under a hairline rule, each an accent lead-in
4
+ * and one line of explanation. A lighter alternative to the FindingsBanner
5
+ * when a slide has several parallel takeaways rather than one statement.
6
+ *
7
+ * Rules and dividers are 1px `shape` divs (per-side borders export as full
8
+ * outlines); the columns are a grid so they stay equal regardless of length.
9
+ */
10
+ export declare function InsightRail({ insights, path }: {
11
+ insights: InsightSpec[];
12
+ path?: string;
13
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { KpiSpec } from '../deck/schema';
2
+ export declare function KpiTile({ spec, path }: {
3
+ spec: KpiSpec;
4
+ path?: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { MatrixSpec } from '../deck/schema';
2
+ export declare function Matrix({ spec, path }: {
3
+ spec: MatrixSpec;
4
+ path?: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { QuoteColumnSpec } from '../deck/schema';
2
+ export declare function QuoteColumn({ spec, path }: {
3
+ spec: QuoteColumnSpec;
4
+ path?: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ /** Small source note placed below charts, images and tables. The `data-edit`
2
+ * path is constant because `source` sits at `props.source` in every layout
3
+ * that has one (same reasoning as `header.*` in the set chrome). */
4
+ export declare function SourceLine({ text }: {
5
+ text: string;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { TableSpec } from '../deck/schema';
2
+ export declare function Table({ spec, path }: {
3
+ spec: TableSpec;
4
+ path?: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { TimelineEventSpec } from '../deck/schema';
2
+ export declare function Timeline({ events, path }: {
3
+ events: TimelineEventSpec[];
4
+ path?: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,29 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DeckMeta, FindingSpec, HeaderSpec } from '../../deck/schema';
3
+ import type { SetChrome } from '../../sets/types';
4
+ /**
5
+ * The chrome every content slide shares: the active set's header, the body,
6
+ * then the optional findings banner and source line, then the set's footer.
7
+ * Layouts supply only the body, which is why the views are short.
8
+ *
9
+ * It exists as much for geometry as for reuse: the body goes into the
10
+ * `slide-body` region, whose height is the space left over between the
11
+ * reserved chrome bands (src/base.css). A body that hugs its content and one
12
+ * that stretches both live inside that region, so neither can displace the
13
+ * footer — the layouts cannot get this wrong, because they no longer place
14
+ * the chrome themselves.
15
+ *
16
+ * `chrome` arrives explicitly from the active set via `SlideViewProps` — not
17
+ * a React context — so defaults live at platform level and a set never
18
+ * imports another set.
19
+ */
20
+ export declare function ContentSlide({ chrome, header, finding, source, meta, slideNumber, children, }: {
21
+ chrome: SetChrome;
22
+ /** Optional: the quote layout deliberately runs without an action title. */
23
+ header?: HeaderSpec;
24
+ finding?: FindingSpec;
25
+ source?: string;
26
+ meta: DeckMeta;
27
+ slideNumber: number;
28
+ children: ReactNode;
29
+ }): import("react").JSX.Element;
@@ -0,0 +1,26 @@
1
+ import type { DeckMeta } from '../../deck/schema';
2
+ /**
3
+ * The placeholder shown where an extension component should be and its
4
+ * extension is not installed.
5
+ *
6
+ * Two callers render it: the `component` layout, whose whole body it fills,
7
+ * and a freeform `component` item whose slot names an extension kind. Both
8
+ * want the same three things, which is why this is a component rather than a
9
+ * copied block:
10
+ *
11
+ * - it carries no `data-pptx` tags but does carry `data-fallback-component`,
12
+ * which is what makes the measurement pass refuse the export instead of
13
+ * writing a silently blank PPTX region (src/export/measure-dom.ts)
14
+ * - it names the extension the way a person would, not by id, whenever the
15
+ * deck's own metadata lets us say the name honestly
16
+ * - in the editor it carries the fix, because the Extensions dialog is one
17
+ * click away from the slide that needs it
18
+ */
19
+ export declare function MissingComponent({ kind, meta, compact, }: {
20
+ /** The namespaced kind the deck asked for. */
21
+ kind: string;
22
+ meta: DeckMeta;
23
+ /** Tighter padding and no button — for a freeform item, which is a box on
24
+ * a slide rather than the whole body. */
25
+ compact?: boolean;
26
+ }): import("react").JSX.Element;
@@ -0,0 +1,20 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * Fixed 1280×720 canvas with safe-area margins; every layout renders inside
4
+ * one. The `slide-frame` class carries the platform's chrome-containment
5
+ * rules (src/base.css): the header and footer bands are reserved, so an
6
+ * oversized body clips instead of pushing the footer off the canvas.
7
+ *
8
+ * Platform-owned: sets style the frame through tokens but cannot replace it,
9
+ * so the containment contract holds for every set by construction.
10
+ */
11
+ export declare function SlideFrame({ children, bleed, }: {
12
+ children: ReactNode;
13
+ /**
14
+ * Drop the safe-area margins so the body owns the canvas edge to edge
15
+ * (the `web` layout's full-bleed opener). The frame
16
+ * becomes the positioning context, because chrome that still has to sign a
17
+ * bleed slide has nowhere else to sit.
18
+ */
19
+ bleed?: boolean;
20
+ }): import("react").JSX.Element;
@@ -0,0 +1,30 @@
1
+ import type { SlotSpec } from '../../deck/layouts';
2
+ import type { DeckMeta } from '../../deck/schema';
3
+ import type { SetComponents } from '../../sets/types';
4
+ /**
5
+ * Renders one slot (src/deck/layouts.ts, `SlotSpec`) — the shared "one piece
6
+ * of content" vocabulary behind a `split` side and a freeform `component`
7
+ * item. One renderer for both, so a kind cannot mean two different things
8
+ * depending on which layout reached it.
9
+ *
10
+ * `path` is the slot's own location in the slide props (`"left"`,
11
+ * `"items.2.content"`), and every payload hangs off it under the key the
12
+ * type declares: `${path}.block`, `${path}.events`, `${path}.columns.0`.
13
+ * The components stamp their own `data-item`/`data-edit` from that, so the
14
+ * inline editor addresses a block inside a freeform item exactly as it
15
+ * addresses one inside a split side.
16
+ *
17
+ * The wrappers carry `flex: 1` wherever the content has no height of its
18
+ * own (a chart in a zero-height box measures to nothing, which is the
19
+ * failure that ships a blank PPTX region). A grid item ignores `flex`, so
20
+ * this is inert for `split` and load-bearing for freeform, whose item box
21
+ * is a flex column sized by `area.h` as a floor.
22
+ */
23
+ export declare function SlotView({ slot, path, meta, components, }: {
24
+ slot: SlotSpec;
25
+ path: string;
26
+ /** Only the `extension` kind needs these two — a slot that never names an
27
+ * extension renders without them. */
28
+ meta?: DeckMeta;
29
+ components?: SetComponents;
30
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,27 @@
1
+ import type { ComponentType } from 'react';
2
+ import type { SharedSlide } from '../../deck/layouts';
3
+ import type { LayoutName, ResolvedSet, SlideViewProps, ThemeSet } from '../../sets/types';
4
+ /**
5
+ * The platform's default view for every layout in the shared vocabulary.
6
+ * Typed against `SharedSlide`, so adding a layout without a default view is
7
+ * a compile error — this is where the old per-set registry exhaustiveness
8
+ * check now lives.
9
+ */
10
+ export declare const platformDefaults: {
11
+ [L in LayoutName]: ComponentType<SlideViewProps<Extract<SharedSlide, {
12
+ layout: L;
13
+ }>>>;
14
+ };
15
+ /**
16
+ * Resolve a set's layout registry: platform defaults merged with the set's
17
+ * overrides. A missing override is not an error state — it is the normal
18
+ * case. Lives here rather than in the loader so the standalone template
19
+ * (which pins one set at build time and never sees the loader's glob) can
20
+ * resolve without pulling every set into its bundle.
21
+ */
22
+ /**
23
+ * @param extensionComponents components from installed packs that provide
24
+ * them (src/sets/loader.ts). Kinds are namespaced by pack id, so the set's
25
+ * own components cannot collide with them; the set's win if one does.
26
+ */
27
+ export declare function resolveSet(set: ThemeSet, extensionComponents?: ResolvedSet['components']): ResolvedSet;
@@ -0,0 +1,8 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { AgendaSlideSpec } from '../../../deck/layouts';
3
+ /**
4
+ * Agenda / table of contents: equal-height rows, each an accent-colored
5
+ * two-digit number and the topic, separated by hairline dividers (1px tagged
6
+ * shapes, as in Footer — per-side borders would export as full outlines).
7
+ */
8
+ export declare function AgendaSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<AgendaSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { CardsSlideSpec } from '../../../deck/layouts';
3
+ /**
4
+ * Card grid. Up to three cards sit in one row; four or more wrap into three
5
+ * columns, so a fourth card starts a second row rather than shrinking the
6
+ * first three past readability.
7
+ *
8
+ * The insight rail is body content, not chrome — it comments on the cards —
9
+ * so it shares the body region with them rather than sitting beside the
10
+ * findings banner.
11
+ */
12
+ export declare function CardsSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<CardsSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { ChaptersSlideSpec } from '../../../deck/layouts';
3
+ /**
4
+ * Section divider: the chapters ahead as equal columns banded by a rule above
5
+ * and below, split by vertical hairlines. Rules and dividers are 1px `shape`
6
+ * divs (per-side borders export as full outlines).
7
+ *
8
+ * Carries no findings banner by design — a divider states the structure, it
9
+ * does not argue a point.
10
+ */
11
+ export declare function ChaptersSlideView({ slide, meta, slideNumber, chrome, }: SlideViewProps<ChaptersSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { ChartSlideSpec } from '../../../deck/layouts';
3
+ export declare function ChartSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<ChartSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { ComponentSlideSpec } from '../../../deck/layouts';
3
+ /**
4
+ * Host for an extension-supplied slide body: a
5
+ * `ContentSlide` whose single full-body slot is filled by the component the
6
+ * deck names. The component owns a box, never the slide — chrome, bands and
7
+ * the overflow contract stay platform-owned by construction.
8
+ *
9
+ * An unknown kind blanks only the body: correct chrome, correct slide
10
+ * number, the rest of the deck untouched, and a placeholder saying which
11
+ * extension is missing. The placeholder carries no `data-pptx` tags but a
12
+ * `data-fallback-component` marker, so the measurement pass refuses to
13
+ * export the deck rather than writing a silently blank PPTX region
14
+ * (src/export/measure-dom.ts — the FallbackSlide mechanism, one level down).
15
+ *
16
+ * In the editor the placeholder also carries the fix (see MissingComponent,
17
+ * which a freeform `component` item renders too).
18
+ */
19
+ export declare function ComponentSlideView({ slide, meta, slideNumber, chrome, components, }: SlideViewProps<ComponentSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { DriverTreeSlideSpec } from '../../../deck/layouts';
3
+ export declare function DriverTreeSlideView({ slide, meta, slideNumber, chrome, }: SlideViewProps<DriverTreeSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { FreeformSlideSpec } from '../../../deck/layouts';
3
+ export declare function FreeformSlideView({ slide, meta, slideNumber, chrome, components, }: SlideViewProps<FreeformSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { KpiSlideSpec } from '../../../deck/layouts';
3
+ export declare function KpiSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<KpiSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { MatrixSlideSpec } from '../../../deck/layouts';
3
+ export declare function MatrixSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<MatrixSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { QuoteSlideSpec } from '../../../deck/layouts';
3
+ export declare function QuoteSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<QuoteSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { QuotesSlideSpec } from '../../../deck/layouts';
3
+ /** Voice-of-customer evidence: equal columns, so a supporting and an opposing
4
+ * column always line up regardless of how many quotes each holds. */
5
+ export declare function QuotesSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<QuotesSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { SplitSlideSpec } from '../../../deck/layouts';
3
+ export declare function SplitSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<SplitSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { TableSlideSpec } from '../../../deck/layouts';
3
+ export declare function TableSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<TableSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { TimelineSlideSpec } from '../../../deck/layouts';
3
+ export declare function TimelineSlideView({ slide, meta, slideNumber, chrome, }: SlideViewProps<TimelineSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { TitleSlideSpec } from '../../../deck/layouts';
3
+ /** The platform's default title view: accent bar, heading, subheading,
4
+ * author · date, and an optional title picture filling the right side
5
+ * (object-fit: cover). No footer. Ignores the spec's `eyebrow` and `chips`
6
+ * — sets with a place for them override this view (editorial does). */
7
+ export declare function TitleSlideView({ slide }: SlideViewProps<TitleSlideSpec>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { SlideViewProps } from '../../../sets/types';
2
+ import type { TwoBlockSlideSpec } from '../../../deck/layouts';
3
+ export declare function TwoBlockSlideView({ slide, meta, slideNumber, chrome }: SlideViewProps<TwoBlockSlideSpec>): import("react").JSX.Element;