@kadal/deck 0.0.0-stage → 0.1.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/LICENSE +661 -0
- package/LICENSING.md +40 -0
- package/README.md +170 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/audience/index.d.ts +14 -0
- package/dist/audience/index.js +680 -0
- package/dist/backgrounds/index.d.ts +65 -0
- package/dist/backgrounds/index.js +604 -0
- package/dist/backgrounds/shared.d.ts +7 -0
- package/dist/backgrounds/shared.js +89 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +8 -0
- package/dist/cli/host.js +111 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +140 -0
- package/dist/cli/login.js +56 -0
- package/dist/cli/publish.js +159 -0
- package/dist/cli/vite.js +39 -0
- package/dist/compiler/code-meta.d.ts +33 -0
- package/dist/compiler/code-meta.js +81 -0
- package/dist/compiler/index.d.ts +8 -0
- package/dist/compiler/index.js +8 -0
- package/dist/compiler/magic-move.d.ts +26 -0
- package/dist/compiler/magic-move.js +33 -0
- package/dist/compiler/plain-text.js +7 -0
- package/dist/compiler/rehype-code.d.ts +18 -0
- package/dist/compiler/rehype-code.js +66 -0
- package/dist/compiler/rehype-glossary.d.ts +35 -0
- package/dist/compiler/rehype-glossary.js +211 -0
- package/dist/compiler/slots.d.ts +3 -0
- package/dist/compiler/slots.js +36 -0
- package/dist/compiler/split.d.ts +63 -0
- package/dist/compiler/split.js +195 -0
- package/dist/components/Background.d.ts +15 -0
- package/dist/components/Background.js +24 -0
- package/dist/components/Click.d.ts +54 -0
- package/dist/components/Click.js +129 -0
- package/dist/components/Code.d.ts +27 -0
- package/dist/components/Code.js +124 -0
- package/dist/components/Motion.d.ts +25 -0
- package/dist/components/Motion.js +45 -0
- package/dist/components/Sketch.d.ts +44 -0
- package/dist/components/Sketch.js +141 -0
- package/dist/components/Term.d.ts +63 -0
- package/dist/components/Term.js +492 -0
- package/dist/components/bling.d.ts +75 -0
- package/dist/components/bling.js +146 -0
- package/dist/components/content.d.ts +232 -0
- package/dist/components/content.js +637 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.js +88 -0
- package/dist/core/clicks.d.ts +45 -0
- package/dist/core/clicks.js +75 -0
- package/dist/core/hash.d.ts +33 -0
- package/dist/core/hash.js +49 -0
- package/dist/core/keyboard.d.ts +17 -0
- package/dist/core/keyboard.js +198 -0
- package/dist/core/layout.d.ts +16 -0
- package/dist/core/layout.js +25 -0
- package/dist/core/model.d.ts +259 -0
- package/dist/core/model.js +377 -0
- package/dist/core/navigation.d.ts +74 -0
- package/dist/core/navigation.js +244 -0
- package/dist/core/poster.js +30 -0
- package/dist/core/store.d.ts +20 -0
- package/dist/core/store.js +64 -0
- package/dist/core/touch.js +27 -0
- package/dist/draw/DrawingLayer.js +315 -0
- package/dist/draw/strokes.js +188 -0
- package/dist/export/index.d.ts +68 -0
- package/dist/export/index.js +251 -0
- package/dist/export/run.js +81 -0
- package/dist/glossary/model.d.ts +81 -0
- package/dist/glossary/model.js +156 -0
- package/dist/glossary/parse.d.ts +27 -0
- package/dist/glossary/parse.js +90 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +30 -0
- package/dist/live/LiveProvider.d.ts +20 -0
- package/dist/live/LiveProvider.js +450 -0
- package/dist/live/analytics.d.ts +15 -0
- package/dist/live/analytics.js +103 -0
- package/dist/live/client.d.ts +51 -0
- package/dist/live/client.js +193 -0
- package/dist/live/components.d.ts +64 -0
- package/dist/live/components.js +471 -0
- package/dist/live/context.d.ts +15 -0
- package/dist/live/context.js +28 -0
- package/dist/live/index.d.ts +7 -0
- package/dist/live/index.js +7 -0
- package/dist/live/protocol.d.ts +284 -0
- package/dist/live/protocol.js +42 -0
- package/dist/live/turnstile.js +49 -0
- package/dist/presenter/index.d.ts +20 -0
- package/dist/presenter/index.js +1211 -0
- package/dist/react/AutoAnimate.js +92 -0
- package/dist/react/Backgrounds.d.ts +11 -0
- package/dist/react/Backgrounds.js +154 -0
- package/dist/react/ConfettiLayer.js +85 -0
- package/dist/react/Deck.d.ts +35 -0
- package/dist/react/Deck.js +983 -0
- package/dist/react/Frame.d.ts +16 -0
- package/dist/react/Frame.js +174 -0
- package/dist/react/Hints.d.ts +3 -0
- package/dist/react/Hints.js +201 -0
- package/dist/react/Lightbox.js +54 -0
- package/dist/react/Overview.js +93 -0
- package/dist/react/PrintView.js +128 -0
- package/dist/react/ScrollView.js +128 -0
- package/dist/react/SlideFrame.d.ts +51 -0
- package/dist/react/SlideFrame.js +323 -0
- package/dist/react/Stage.js +151 -0
- package/dist/react/ThemeMenu.d.ts +5 -0
- package/dist/react/ThemeMenu.js +124 -0
- package/dist/react/Zoom.js +23 -0
- package/dist/react/chrome.js +339 -0
- package/dist/react/context.d.ts +165 -0
- package/dist/react/context.js +19 -0
- package/dist/react/hooks.d.ts +33 -0
- package/dist/react/hooks.js +70 -0
- package/dist/react/layouts.d.ts +21 -0
- package/dist/react/layouts.js +104 -0
- package/dist/react/mdx.d.ts +4 -0
- package/dist/react/mdx.js +33 -0
- package/dist/react/terms.d.ts +6 -0
- package/dist/react/terms.js +66 -0
- package/dist/renderers/Island.d.ts +57 -0
- package/dist/renderers/Island.js +223 -0
- package/dist/renderers/contract.d.ts +173 -0
- package/dist/renderers/contract.js +152 -0
- package/dist/renderers/index.d.ts +12 -0
- package/dist/renderers/index.js +16 -0
- package/dist/renderers/react.d.ts +16 -0
- package/dist/renderers/react.js +32 -0
- package/dist/renderers/web-components.d.ts +4 -0
- package/dist/renderers/web-components.js +103 -0
- package/dist/sketch/Canvas.js +49 -0
- package/dist/sketch/dsl.d.ts +131 -0
- package/dist/sketch/dsl.js +281 -0
- package/dist/sketch/index.d.ts +4 -0
- package/dist/sketch/index.js +3 -0
- package/dist/sketch/palette.d.ts +21 -0
- package/dist/sketch/palette.js +66 -0
- package/dist/sketch/render.d.ts +43 -0
- package/dist/sketch/render.js +198 -0
- package/dist/themes/base.css +1704 -0
- package/dist/themes/bling.css +592 -0
- package/dist/themes/glossary.css +317 -0
- package/dist/themes/live.css +1557 -0
- package/dist/themes/minimal.css +83 -0
- package/dist/themes/rla.css +92 -0
- package/dist/themes/sketch.css +121 -0
- package/dist/themes/stack.css +62 -0
- package/dist/vite/index.d.ts +15 -0
- package/dist/vite/index.js +320 -0
- package/package.json +159 -4
- package/tools/verify-island.mjs +150 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { COLOR_MAP } from "./palette.js";
|
|
2
|
+
//#region src/sketch/render.ts
|
|
3
|
+
const LINK = "https://sketch.deck/#";
|
|
4
|
+
const cache = /* @__PURE__ */ new Map();
|
|
5
|
+
const scenes = /* @__PURE__ */ new Map();
|
|
6
|
+
/** Excalidraw's font ids → the family names its faces register under. */
|
|
7
|
+
const FAMILY = {
|
|
8
|
+
1: "Virgil",
|
|
9
|
+
2: "Helvetica",
|
|
10
|
+
3: "Cascadia",
|
|
11
|
+
5: "Excalifont",
|
|
12
|
+
6: "Nunito",
|
|
13
|
+
7: "Lilita One",
|
|
14
|
+
8: "Comic Shanns",
|
|
15
|
+
9: "Liberation Sans"
|
|
16
|
+
};
|
|
17
|
+
let modulePromise = null;
|
|
18
|
+
/** Where the fonts are: `<deck base>/excalidraw/`, absolute so the package resolves it plainly. */
|
|
19
|
+
function assetPath() {
|
|
20
|
+
const base = import.meta.env?.BASE_URL ?? "/";
|
|
21
|
+
return new URL(`${base.replace(/\/?$/, "/")}excalidraw/`, window.location.href).toString();
|
|
22
|
+
}
|
|
23
|
+
function loadExcalidraw() {
|
|
24
|
+
if (!modulePromise) {
|
|
25
|
+
window.EXCALIDRAW_ASSET_PATH = assetPath();
|
|
26
|
+
modulePromise = import("@excalidraw/excalidraw");
|
|
27
|
+
}
|
|
28
|
+
return modulePromise;
|
|
29
|
+
}
|
|
30
|
+
/** A stable key for an input, so re-mounts and the canvas find the same render. */
|
|
31
|
+
function hashInput(input) {
|
|
32
|
+
const text = input.kind === "sketch" ? JSON.stringify(input.elements) : input.kind === "file" ? JSON.stringify(input.data.elements) : input.kind === "url" ? input.src : `${input.source}|${input.fontSize ?? ""}`;
|
|
33
|
+
let h = 2166136261;
|
|
34
|
+
for (let i = 0; i < text.length; i++) {
|
|
35
|
+
h ^= text.charCodeAt(i);
|
|
36
|
+
h = Math.imul(h, 16777619);
|
|
37
|
+
}
|
|
38
|
+
return `${input.kind}-${(h >>> 0).toString(36)}`;
|
|
39
|
+
}
|
|
40
|
+
/** The elements behind a rendered sketch, for the interactive canvas. */
|
|
41
|
+
function getScene(key) {
|
|
42
|
+
return scenes.get(key) ?? null;
|
|
43
|
+
}
|
|
44
|
+
function renderSketch(input, key = hashInput(input)) {
|
|
45
|
+
let p = cache.get(key);
|
|
46
|
+
if (!p) {
|
|
47
|
+
p = render(input, key).catch((e) => {
|
|
48
|
+
cache.delete(key);
|
|
49
|
+
throw e;
|
|
50
|
+
});
|
|
51
|
+
cache.set(key, p);
|
|
52
|
+
}
|
|
53
|
+
return p;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Register and load the fonts these ids name, for the characters the sketch uses, so text
|
|
57
|
+
* measured before export is measured in the real face. Only the canvas export path loads fonts
|
|
58
|
+
* into `document.fonts` (the SVG path inlines them instead), so a one-pixel canvas export of a
|
|
59
|
+
* probe carrying every character does the registration; Excalidraw caches what it has loaded.
|
|
60
|
+
*/
|
|
61
|
+
async function ensureFonts(ex, ids, sample) {
|
|
62
|
+
const families = [...new Set(ids.length ? ids : [5])];
|
|
63
|
+
const chars = [...new Set(sample.replace(/\s+/g, ""))].join("") || "Ag";
|
|
64
|
+
const probes = ex.convertToExcalidrawElements(families.map((fontFamily, i) => ({
|
|
65
|
+
type: "text",
|
|
66
|
+
x: i * 10,
|
|
67
|
+
y: 0,
|
|
68
|
+
text: chars,
|
|
69
|
+
fontFamily
|
|
70
|
+
})));
|
|
71
|
+
await ex.exportToCanvas({
|
|
72
|
+
elements: probes,
|
|
73
|
+
files: null,
|
|
74
|
+
appState: { exportBackground: false },
|
|
75
|
+
getDimensions: () => ({
|
|
76
|
+
width: 4,
|
|
77
|
+
height: 4
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
await document.fonts.ready;
|
|
81
|
+
}
|
|
82
|
+
/** True when every family is registered in `document.fonts`, so the SVG can lean on the page. */
|
|
83
|
+
function registered(ids) {
|
|
84
|
+
const have = new Set([...document.fonts].map((f) => f.family.replace(/^"|"$/g, "")));
|
|
85
|
+
return (ids.length ? ids : [5]).every((id) => have.has(FAMILY[id] ?? ""));
|
|
86
|
+
}
|
|
87
|
+
const textOf = (elements) => elements.flatMap((e) => [typeof e.text === "string" ? e.text : "", typeof e.label?.text === "string" ? e.label.text ?? "" : ""]).join("");
|
|
88
|
+
async function elementsFor(ex, input) {
|
|
89
|
+
if (input.kind === "sketch") {
|
|
90
|
+
await ensureFonts(ex, input.fonts, textOf(input.elements));
|
|
91
|
+
return {
|
|
92
|
+
elements: ex.convertToExcalidrawElements(input.elements, { regenerateIds: false }),
|
|
93
|
+
files: {},
|
|
94
|
+
regions: input.regions,
|
|
95
|
+
fonts: input.fonts
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (input.kind === "mermaid") {
|
|
99
|
+
const { parseMermaidToExcalidraw } = await import("@excalidraw/mermaid-to-excalidraw");
|
|
100
|
+
await ensureFonts(ex, [5], input.source);
|
|
101
|
+
const out = await parseMermaidToExcalidraw(input.source, { themeVariables: { fontSize: `${input.fontSize ?? 20}px` } });
|
|
102
|
+
return {
|
|
103
|
+
elements: ex.convertToExcalidrawElements(out.elements),
|
|
104
|
+
files: out.files ?? {},
|
|
105
|
+
regions: {},
|
|
106
|
+
fonts: [5]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const data = input.kind === "file" ? input.data : await fetch(input.src).then((r) => {
|
|
110
|
+
if (!r.ok) throw new Error(`sketch: ${input.src} answered ${r.status}`);
|
|
111
|
+
return r.json();
|
|
112
|
+
});
|
|
113
|
+
const fonts = data.elements.filter((e) => e.type === "text").map((e) => Number(e.fontFamily ?? 5));
|
|
114
|
+
await ensureFonts(ex, fonts, textOf(data.elements));
|
|
115
|
+
const elements = ex.restoreElements(data.elements, null, {
|
|
116
|
+
refreshDimensions: true,
|
|
117
|
+
repairBindings: true
|
|
118
|
+
});
|
|
119
|
+
const regions = {};
|
|
120
|
+
for (const e of elements) {
|
|
121
|
+
const names = [];
|
|
122
|
+
if (typeof e.frameId === "string") names.push(e.frameId);
|
|
123
|
+
if (Array.isArray(e.groupIds)) names.push(...e.groupIds);
|
|
124
|
+
if (names.length) regions[e.id] = names;
|
|
125
|
+
}
|
|
126
|
+
for (const e of elements) if (e.type === "frame" && typeof e.name === "string") {
|
|
127
|
+
regions[e.id] = [e.id];
|
|
128
|
+
for (const [id, rs] of Object.entries(regions)) if (rs.includes(e.id) && !rs.includes(e.name)) regions[id] = [...rs, e.name];
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
elements,
|
|
132
|
+
files: data.files ?? {},
|
|
133
|
+
regions,
|
|
134
|
+
fonts
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async function render(input, key) {
|
|
138
|
+
const ex = await loadExcalidraw();
|
|
139
|
+
const { elements, files, regions, fonts } = await elementsFor(ex, input);
|
|
140
|
+
const regionOf = (e) => {
|
|
141
|
+
const own = regions[e.id];
|
|
142
|
+
if (own) return own;
|
|
143
|
+
return (typeof e.containerId === "string" ? regions[e.containerId] : void 0) ?? [];
|
|
144
|
+
};
|
|
145
|
+
for (const e of elements) e.link = `${LINK}${e.id}`;
|
|
146
|
+
const svg = await ex.exportToSvg({
|
|
147
|
+
elements,
|
|
148
|
+
files,
|
|
149
|
+
appState: {
|
|
150
|
+
exportBackground: false,
|
|
151
|
+
exportWithDarkMode: false,
|
|
152
|
+
exportEmbedScene: false,
|
|
153
|
+
viewBackgroundColor: "transparent"
|
|
154
|
+
},
|
|
155
|
+
exportPadding: 12,
|
|
156
|
+
...registered(fonts) ? { skipInliningFonts: true } : {}
|
|
157
|
+
});
|
|
158
|
+
const byId = new Map(elements.map((e) => [e.id, e]));
|
|
159
|
+
for (const a of [...svg.querySelectorAll("a")]) {
|
|
160
|
+
const href = a.getAttribute("href") ?? "";
|
|
161
|
+
if (!href.startsWith(LINK)) continue;
|
|
162
|
+
const id = href.slice(21);
|
|
163
|
+
const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
164
|
+
g.setAttribute("class", "sk-el");
|
|
165
|
+
g.setAttribute("data-id", id);
|
|
166
|
+
const el = byId.get(id);
|
|
167
|
+
const rs = el ? regionOf(el) : [];
|
|
168
|
+
if (rs.length) g.setAttribute("data-region", rs.join("|"));
|
|
169
|
+
while (a.firstChild) g.appendChild(a.firstChild);
|
|
170
|
+
a.replaceWith(g);
|
|
171
|
+
}
|
|
172
|
+
for (const node of svg.querySelectorAll("[stroke], [fill]")) for (const attr of ["stroke", "fill"]) {
|
|
173
|
+
const v = node.getAttribute(attr)?.toLowerCase();
|
|
174
|
+
if (!v) continue;
|
|
175
|
+
const css = COLOR_MAP.get(v);
|
|
176
|
+
if (css) node.style.setProperty(attr, css);
|
|
177
|
+
}
|
|
178
|
+
svg.removeAttribute("xmlns:xlink");
|
|
179
|
+
svg.setAttribute("class", "deck-sketch-svg");
|
|
180
|
+
svg.setAttribute("role", "img");
|
|
181
|
+
const width = Number(svg.getAttribute("width") ?? 0);
|
|
182
|
+
const height = Number(svg.getAttribute("height") ?? 0);
|
|
183
|
+
scenes.set(key, {
|
|
184
|
+
elements: elements.map((e) => ({
|
|
185
|
+
...e,
|
|
186
|
+
link: null
|
|
187
|
+
})),
|
|
188
|
+
files
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
key,
|
|
192
|
+
svg: svg.outerHTML,
|
|
193
|
+
width,
|
|
194
|
+
height
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//#endregion
|
|
198
|
+
export { getScene, hashInput, loadExcalidraw, renderSketch };
|