@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.
Files changed (157) hide show
  1. package/LICENSE +661 -0
  2. package/LICENSING.md +40 -0
  3. package/README.md +170 -2
  4. package/dist/_virtual/_rolldown/runtime.js +13 -0
  5. package/dist/audience/index.d.ts +14 -0
  6. package/dist/audience/index.js +680 -0
  7. package/dist/backgrounds/index.d.ts +65 -0
  8. package/dist/backgrounds/index.js +604 -0
  9. package/dist/backgrounds/shared.d.ts +7 -0
  10. package/dist/backgrounds/shared.js +89 -0
  11. package/dist/cli/bin.d.ts +1 -0
  12. package/dist/cli/bin.js +8 -0
  13. package/dist/cli/host.js +111 -0
  14. package/dist/cli/index.d.ts +4 -0
  15. package/dist/cli/index.js +140 -0
  16. package/dist/cli/login.js +56 -0
  17. package/dist/cli/publish.js +159 -0
  18. package/dist/cli/vite.js +39 -0
  19. package/dist/compiler/code-meta.d.ts +33 -0
  20. package/dist/compiler/code-meta.js +81 -0
  21. package/dist/compiler/index.d.ts +8 -0
  22. package/dist/compiler/index.js +8 -0
  23. package/dist/compiler/magic-move.d.ts +26 -0
  24. package/dist/compiler/magic-move.js +33 -0
  25. package/dist/compiler/plain-text.js +7 -0
  26. package/dist/compiler/rehype-code.d.ts +18 -0
  27. package/dist/compiler/rehype-code.js +66 -0
  28. package/dist/compiler/rehype-glossary.d.ts +35 -0
  29. package/dist/compiler/rehype-glossary.js +211 -0
  30. package/dist/compiler/slots.d.ts +3 -0
  31. package/dist/compiler/slots.js +36 -0
  32. package/dist/compiler/split.d.ts +63 -0
  33. package/dist/compiler/split.js +195 -0
  34. package/dist/components/Background.d.ts +15 -0
  35. package/dist/components/Background.js +24 -0
  36. package/dist/components/Click.d.ts +54 -0
  37. package/dist/components/Click.js +129 -0
  38. package/dist/components/Code.d.ts +27 -0
  39. package/dist/components/Code.js +124 -0
  40. package/dist/components/Motion.d.ts +25 -0
  41. package/dist/components/Motion.js +45 -0
  42. package/dist/components/Sketch.d.ts +44 -0
  43. package/dist/components/Sketch.js +141 -0
  44. package/dist/components/Term.d.ts +63 -0
  45. package/dist/components/Term.js +492 -0
  46. package/dist/components/bling.d.ts +75 -0
  47. package/dist/components/bling.js +146 -0
  48. package/dist/components/content.d.ts +232 -0
  49. package/dist/components/content.js +637 -0
  50. package/dist/components/index.d.ts +10 -0
  51. package/dist/components/index.js +88 -0
  52. package/dist/core/clicks.d.ts +45 -0
  53. package/dist/core/clicks.js +75 -0
  54. package/dist/core/hash.d.ts +33 -0
  55. package/dist/core/hash.js +49 -0
  56. package/dist/core/keyboard.d.ts +17 -0
  57. package/dist/core/keyboard.js +198 -0
  58. package/dist/core/layout.d.ts +16 -0
  59. package/dist/core/layout.js +25 -0
  60. package/dist/core/model.d.ts +259 -0
  61. package/dist/core/model.js +377 -0
  62. package/dist/core/navigation.d.ts +74 -0
  63. package/dist/core/navigation.js +244 -0
  64. package/dist/core/poster.js +30 -0
  65. package/dist/core/store.d.ts +20 -0
  66. package/dist/core/store.js +64 -0
  67. package/dist/core/touch.js +27 -0
  68. package/dist/draw/DrawingLayer.js +315 -0
  69. package/dist/draw/strokes.js +188 -0
  70. package/dist/export/index.d.ts +68 -0
  71. package/dist/export/index.js +251 -0
  72. package/dist/export/run.js +81 -0
  73. package/dist/glossary/model.d.ts +81 -0
  74. package/dist/glossary/model.js +156 -0
  75. package/dist/glossary/parse.d.ts +27 -0
  76. package/dist/glossary/parse.js +90 -0
  77. package/dist/index.d.ts +31 -0
  78. package/dist/index.js +30 -0
  79. package/dist/live/LiveProvider.d.ts +20 -0
  80. package/dist/live/LiveProvider.js +450 -0
  81. package/dist/live/analytics.d.ts +15 -0
  82. package/dist/live/analytics.js +103 -0
  83. package/dist/live/client.d.ts +51 -0
  84. package/dist/live/client.js +193 -0
  85. package/dist/live/components.d.ts +64 -0
  86. package/dist/live/components.js +471 -0
  87. package/dist/live/context.d.ts +15 -0
  88. package/dist/live/context.js +28 -0
  89. package/dist/live/index.d.ts +7 -0
  90. package/dist/live/index.js +7 -0
  91. package/dist/live/protocol.d.ts +284 -0
  92. package/dist/live/protocol.js +42 -0
  93. package/dist/live/turnstile.js +49 -0
  94. package/dist/presenter/index.d.ts +20 -0
  95. package/dist/presenter/index.js +1211 -0
  96. package/dist/react/AutoAnimate.js +92 -0
  97. package/dist/react/Backgrounds.d.ts +11 -0
  98. package/dist/react/Backgrounds.js +154 -0
  99. package/dist/react/ConfettiLayer.js +85 -0
  100. package/dist/react/Deck.d.ts +35 -0
  101. package/dist/react/Deck.js +983 -0
  102. package/dist/react/Frame.d.ts +16 -0
  103. package/dist/react/Frame.js +174 -0
  104. package/dist/react/Hints.d.ts +3 -0
  105. package/dist/react/Hints.js +201 -0
  106. package/dist/react/Lightbox.js +54 -0
  107. package/dist/react/Overview.js +93 -0
  108. package/dist/react/PrintView.js +128 -0
  109. package/dist/react/ScrollView.js +128 -0
  110. package/dist/react/SlideFrame.d.ts +51 -0
  111. package/dist/react/SlideFrame.js +323 -0
  112. package/dist/react/Stage.js +151 -0
  113. package/dist/react/ThemeMenu.d.ts +5 -0
  114. package/dist/react/ThemeMenu.js +124 -0
  115. package/dist/react/Zoom.js +23 -0
  116. package/dist/react/chrome.js +339 -0
  117. package/dist/react/context.d.ts +165 -0
  118. package/dist/react/context.js +19 -0
  119. package/dist/react/hooks.d.ts +33 -0
  120. package/dist/react/hooks.js +70 -0
  121. package/dist/react/layouts.d.ts +21 -0
  122. package/dist/react/layouts.js +104 -0
  123. package/dist/react/mdx.d.ts +4 -0
  124. package/dist/react/mdx.js +33 -0
  125. package/dist/react/terms.d.ts +6 -0
  126. package/dist/react/terms.js +66 -0
  127. package/dist/renderers/Island.d.ts +57 -0
  128. package/dist/renderers/Island.js +223 -0
  129. package/dist/renderers/contract.d.ts +173 -0
  130. package/dist/renderers/contract.js +152 -0
  131. package/dist/renderers/index.d.ts +12 -0
  132. package/dist/renderers/index.js +16 -0
  133. package/dist/renderers/react.d.ts +16 -0
  134. package/dist/renderers/react.js +32 -0
  135. package/dist/renderers/web-components.d.ts +4 -0
  136. package/dist/renderers/web-components.js +103 -0
  137. package/dist/sketch/Canvas.js +49 -0
  138. package/dist/sketch/dsl.d.ts +131 -0
  139. package/dist/sketch/dsl.js +281 -0
  140. package/dist/sketch/index.d.ts +4 -0
  141. package/dist/sketch/index.js +3 -0
  142. package/dist/sketch/palette.d.ts +21 -0
  143. package/dist/sketch/palette.js +66 -0
  144. package/dist/sketch/render.d.ts +43 -0
  145. package/dist/sketch/render.js +198 -0
  146. package/dist/themes/base.css +1704 -0
  147. package/dist/themes/bling.css +592 -0
  148. package/dist/themes/glossary.css +317 -0
  149. package/dist/themes/live.css +1557 -0
  150. package/dist/themes/minimal.css +83 -0
  151. package/dist/themes/rla.css +92 -0
  152. package/dist/themes/sketch.css +121 -0
  153. package/dist/themes/stack.css +62 -0
  154. package/dist/vite/index.d.ts +15 -0
  155. package/dist/vite/index.js +320 -0
  156. package/package.json +159 -4
  157. 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 };