@vfrey/vfrey 0.0.1 → 1.0.0-beta.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 (603) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +78 -3
  3. package/accounts.example.json +61 -0
  4. package/accounts.first-run.json +41 -0
  5. package/bin/vfrey.mjs +36 -0
  6. package/integration-tools/README.md +43 -0
  7. package/integration-tools/image/pillow.md +32 -0
  8. package/integration-tools/image/playwright.md +33 -0
  9. package/integration-tools/image/resvg.md +36 -0
  10. package/integration-tools/image/satori.md +36 -0
  11. package/integration-tools/image/sharp.md +38 -0
  12. package/integration-tools/video/blender.md +34 -0
  13. package/integration-tools/video/ffmpeg.md +41 -0
  14. package/integration-tools/video/manim.md +37 -0
  15. package/integration-tools/video/motion-canvas.md +37 -0
  16. package/integration-tools/video/remotion.md +50 -0
  17. package/integration-tools/video/revideo.md +32 -0
  18. package/package.json +74 -6
  19. package/skills/vfrey-orchestrator/SKILL.md +15 -0
  20. package/skills/vfrey-orchestrator/channel-video/SKILL.md +41 -0
  21. package/skills/vfrey-product/SKILL.md +63 -0
  22. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-one.svg +14 -0
  23. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/cook-two.svg +22 -0
  24. package/skills/vfrey-product/examples/concurrency-vs-parallelism/framey/index.html +70 -0
  25. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-one.svg +14 -0
  26. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/cook-two.svg +22 -0
  27. package/skills/vfrey-product/examples/concurrency-vs-parallelism/remotion/index.tsx +49 -0
  28. package/skills/vfrey-product/examples/concurrency-vs-parallelism/script.json +15 -0
  29. package/skills/vfrey-product/examples/octopus-facts/index.html +60 -0
  30. package/skills/vfrey-product/examples/octopus-facts/octopus.svg +8 -0
  31. package/skills/vfrey-product/examples/octopus-facts/script.json +14 -0
  32. package/skills/vfrey-product/push/SKILL.md +15 -0
  33. package/skills/vfrey-product/scenes/NOTICE +5 -0
  34. package/skills/vfrey-product/scenes/blocks.md +57 -0
  35. package/skills/vfrey-product/scenes/craft.md +118 -0
  36. package/skills/vfrey-product/scenes/motion.md +88 -0
  37. package/src/analytics/dashboard.ts +109 -0
  38. package/src/analytics/index.ts +260 -0
  39. package/src/api/client.ts +282 -0
  40. package/src/api/commands.ts +330 -0
  41. package/src/api/config.ts +34 -0
  42. package/src/api/creators.ts +463 -0
  43. package/src/api/credentials.ts +152 -0
  44. package/src/api/mail.ts +333 -0
  45. package/src/api/topics.ts +207 -0
  46. package/src/api/types.ts +205 -0
  47. package/src/cli.ts +467 -0
  48. package/src/cloud/executor.ts +281 -0
  49. package/src/cloud/job.ts +106 -0
  50. package/src/cloud/render-job.ts +187 -0
  51. package/src/config.ts +309 -0
  52. package/src/dashboard-link.ts +180 -0
  53. package/src/dashboard-start.ts +103 -0
  54. package/src/desk/channel.ts +64 -0
  55. package/src/desk/cli.ts +216 -0
  56. package/src/desk/creators-route.ts +129 -0
  57. package/src/desk/fonts/JetBrainsMono-OFL.txt +93 -0
  58. package/src/desk/fonts/google-sans-flex-latin.woff2 +0 -0
  59. package/src/desk/fonts/jetbrains-mono-medium.woff2 +0 -0
  60. package/src/desk/http.ts +460 -0
  61. package/src/desk/mail-route.ts +103 -0
  62. package/src/desk/overlay.ts +112 -0
  63. package/src/desk/preview.ts +422 -0
  64. package/src/desk/screens.ts +149 -0
  65. package/src/desk/secrets.ts +143 -0
  66. package/src/desk/series.ts +127 -0
  67. package/src/desk/state.ts +77 -0
  68. package/src/desk/studio-route.ts +119 -0
  69. package/src/desk/tick-runner.ts +66 -0
  70. package/src/desk/tick.ts +56 -0
  71. package/src/desk/topics-route.ts +41 -0
  72. package/src/desk/ui/app.css +505 -0
  73. package/src/desk/ui/app.js +185 -0
  74. package/src/desk/ui/apple-icon.png +0 -0
  75. package/src/desk/ui/components.js +79 -0
  76. package/src/desk/ui/core.js +156 -0
  77. package/src/desk/ui/favicon.ico +0 -0
  78. package/src/desk/ui/icon.svg +1 -0
  79. package/src/desk/ui/icons.js +49 -0
  80. package/src/desk/ui/index.html +41 -0
  81. package/src/desk/ui/metrics-math.d.ts +22 -0
  82. package/src/desk/ui/metrics-math.js +135 -0
  83. package/src/desk/ui/theme.js +5 -0
  84. package/src/desk/ui/views-creators.js +209 -0
  85. package/src/desk/ui/views-keys.js +114 -0
  86. package/src/desk/ui/views-mail.js +188 -0
  87. package/src/desk/ui/views-misc.js +123 -0
  88. package/src/desk/ui/views-review.js +119 -0
  89. package/src/desk/ui/views-runs.js +350 -0
  90. package/src/desk/ui/views-screens.js +163 -0
  91. package/src/desk/ui/views-series.js +318 -0
  92. package/src/desk/ui/views-topics.js +87 -0
  93. package/src/desk/verbs.ts +361 -0
  94. package/src/doctor.ts +212 -0
  95. package/src/drain.ts +14 -0
  96. package/src/engage/index.ts +217 -0
  97. package/src/generate/index.ts +110 -0
  98. package/src/generate/script.ts +152 -0
  99. package/src/generate/title.ts +78 -0
  100. package/src/help.ts +233 -0
  101. package/src/home.ts +45 -0
  102. package/src/llm/client.ts +177 -0
  103. package/src/log.ts +7 -0
  104. package/src/oauth/tokens.ts +189 -0
  105. package/src/oauth/vault.ts +72 -0
  106. package/src/pipeline/review.ts +642 -0
  107. package/src/pipeline/run.ts +443 -0
  108. package/src/pipeline/series-guard.ts +26 -0
  109. package/src/pipeline/source-fetch.ts +69 -0
  110. package/src/pipeline/stages.ts +728 -0
  111. package/src/pipeline/topics-source.ts +90 -0
  112. package/src/product/commands.ts +296 -0
  113. package/src/product/config-file.ts +38 -0
  114. package/src/product/engine-choice.ts +89 -0
  115. package/src/product/engines.ts +103 -0
  116. package/src/product/insights.ts +50 -0
  117. package/src/product/keys.ts +67 -0
  118. package/src/product/paths.ts +18 -0
  119. package/src/product/probes.ts +88 -0
  120. package/src/product/push-flow.ts +90 -0
  121. package/src/product/render-video.ts +21 -0
  122. package/src/product/short.ts +62 -0
  123. package/src/product/update.ts +32 -0
  124. package/src/project/canonical.ts +14 -0
  125. package/src/project/commands.ts +177 -0
  126. package/src/project/dashboard-status.ts +28 -0
  127. package/src/project/discover.ts +19 -0
  128. package/src/project/index-file.ts +73 -0
  129. package/src/project/marker.ts +87 -0
  130. package/src/project/migrate.ts +201 -0
  131. package/src/project/names.ts +27 -0
  132. package/src/project/notice.ts +16 -0
  133. package/src/project/open.ts +88 -0
  134. package/src/project/scaffold.ts +112 -0
  135. package/src/project/templates.ts +42 -0
  136. package/src/project/videos.ts +64 -0
  137. package/src/publish/facebook.ts +91 -0
  138. package/src/publish/index.ts +12 -0
  139. package/src/publish/instagram.ts +97 -0
  140. package/src/publish/rate.ts +62 -0
  141. package/src/publish/session.ts +242 -0
  142. package/src/publish/tiktok.ts +202 -0
  143. package/src/publish/youtube.ts +177 -0
  144. package/src/queue/desk-ops.ts +1170 -0
  145. package/src/queue/seal.ts +3 -0
  146. package/src/queue/store.ts +1006 -0
  147. package/src/remotion/AiLabel.tsx +26 -0
  148. package/src/remotion/Root.tsx +73 -0
  149. package/src/remotion/defaults.ts +26 -0
  150. package/src/remotion/films/claude/ClaudeFilm.tsx +1014 -0
  151. package/src/remotion/films/engine/EngineMark.tsx +17 -0
  152. package/src/remotion/films/rea/ReaShort.tsx +552 -0
  153. package/src/remotion/films/rea/drawings.tsx +907 -0
  154. package/src/remotion/films/rea/timing.ts +144 -0
  155. package/src/remotion/index.ts +4 -0
  156. package/src/remotion/templates/EditorialSplit.tsx +39 -0
  157. package/src/remotion/templates/KineticType.tsx +39 -0
  158. package/src/remotion/templates/SignalBoard.tsx +50 -0
  159. package/src/remotion/timing.ts +22 -0
  160. package/src/render/chrome.ts +78 -0
  161. package/src/render/engine-mark.ts +29 -0
  162. package/src/render/framey-template.ts +130 -0
  163. package/src/render/html-engine.ts +149 -0
  164. package/src/render/node-crypto-stub.ts +11 -0
  165. package/src/render/probe.ts +29 -0
  166. package/src/render/props.ts +17 -0
  167. package/src/render/vertical-short.ts +35 -0
  168. package/src/render/webpack.ts +33 -0
  169. package/src/render/worker.ts +65 -0
  170. package/src/scene/assets/fonts/TitanOne-OFL.txt +94 -0
  171. package/src/scene/assets/fonts/titan-one.woff2 +0 -0
  172. package/src/scene/assets/gsap/LICENSE.txt +8 -0
  173. package/src/scene/assets/gsap/gsap.min.js +11 -0
  174. package/src/scene/audio.ts +54 -0
  175. package/src/scene/blocks/LICENSE +190 -0
  176. package/src/scene/blocks/NOTICE +5 -0
  177. package/src/scene/blocks/bar-chart-race/bar-chart-race.html +585 -0
  178. package/src/scene/blocks/beat-freeze-cut/beat-freeze-cut.html +874 -0
  179. package/src/scene/blocks/camcorder-hud/camcorder-hud.html +164 -0
  180. package/src/scene/blocks/camera-dolly-zoom/camera-dolly-zoom.html +355 -0
  181. package/src/scene/blocks/code-diff/code-diff.html +817 -0
  182. package/src/scene/blocks/code-snippet-apple-terminal-pro/code-snippet-apple-terminal-pro.html +248 -0
  183. package/src/scene/blocks/code-typing/code-typing.html +764 -0
  184. package/src/scene/blocks/data-chart/data-chart.html +452 -0
  185. package/src/scene/blocks/flowchart-vertical/flowchart-vertical.html +454 -0
  186. package/src/scene/blocks/hw-scribble-transition/hw-scribble-transition.html +153 -0
  187. package/src/scene/blocks/index.json +824 -0
  188. package/src/scene/blocks/lt-accent-underline/lt-accent-underline.html +107 -0
  189. package/src/scene/blocks/lt-bold-block/lt-bold-block.html +109 -0
  190. package/src/scene/blocks/lt-clean-bar/lt-clean-bar.html +112 -0
  191. package/src/scene/blocks/lt-dark-card/lt-dark-card.html +111 -0
  192. package/src/scene/blocks/lt-kicker-name/lt-kicker-name.html +114 -0
  193. package/src/scene/blocks/lt-mask-reveal/lt-mask-reveal.html +120 -0
  194. package/src/scene/blocks/lt-neon-border/lt-neon-border.html +391 -0
  195. package/src/scene/blocks/lt-stack-bars/lt-stack-bars.html +109 -0
  196. package/src/scene/blocks/macos-notification/macos-notification.html +194 -0
  197. package/src/scene/blocks/mk-background/mk-background.html +236 -0
  198. package/src/scene/blocks/mk-callout-highlight/mk-callout-highlight.html +183 -0
  199. package/src/scene/blocks/mk-clone-wall-transition/mk-clone-wall-transition.html +226 -0
  200. package/src/scene/blocks/mk-line-graph/mk-line-graph.html +293 -0
  201. package/src/scene/blocks/mk-progress-stat/mk-progress-stat.html +186 -0
  202. package/src/scene/blocks/mk-specs-list/mk-specs-list.html +223 -0
  203. package/src/scene/blocks/news-ticker/news-ticker.html +409 -0
  204. package/src/scene/blocks/organic-light-leak-overlay/organic-light-leak-overlay.html +126 -0
  205. package/src/scene/blocks/oscilloscope-trace/oscilloscope-trace.html +519 -0
  206. package/src/scene/blocks/snow/snow.html +205 -0
  207. package/src/scene/blocks/split-flap-board/split-flap-board.html +347 -0
  208. package/src/scene/blocks/spotify-card/spotify-card.html +294 -0
  209. package/src/scene/blocks/starfield/starfield.html +188 -0
  210. package/src/scene/blocks/thread-message-stack/thread-message-stack.html +239 -0
  211. package/src/scene/blocks/week-in-merges/week-in-merges.html +470 -0
  212. package/src/scene/blocks/x-post/x-post.html +437 -0
  213. package/src/scene/blocks/yt-comment-card/yt-comment-card.html +319 -0
  214. package/src/scene/blocks/yt-lcd-background/yt-lcd-background.html +307 -0
  215. package/src/scene/blocks/yt-prism-title/yt-prism-title.html +205 -0
  216. package/src/scene/blocks.ts +229 -0
  217. package/src/scene/command.ts +272 -0
  218. package/src/scene/figure.ts +181 -0
  219. package/src/scene/glyphs.ts +107 -0
  220. package/src/scene/init.ts +86 -0
  221. package/src/scene/inspect/css-tree.d.ts +6 -0
  222. package/src/scene/inspect/page-scripts.ts +272 -0
  223. package/src/scene/inspect/report.ts +405 -0
  224. package/src/scene/inspect/run.ts +200 -0
  225. package/src/scene/inspect/source.ts +236 -0
  226. package/src/scene/label.ts +131 -0
  227. package/src/scene/net-guard.ts +74 -0
  228. package/src/scene/render.ts +292 -0
  229. package/src/scene/runtime/browser.ts +199 -0
  230. package/src/scene/runtime/core.ts +181 -0
  231. package/src/scene/runtime/react.tsx +115 -0
  232. package/src/scene/runtime/transitions.ts +133 -0
  233. package/src/scene/sanitize.ts +181 -0
  234. package/src/scene/scene.ts +152 -0
  235. package/src/scene/studio-command.ts +48 -0
  236. package/src/scene/studio-skin.ts +59 -0
  237. package/src/scene/studio.ts +337 -0
  238. package/src/scene/supply.ts +111 -0
  239. package/src/scene/timing.ts +288 -0
  240. package/src/scene/transitions/LICENSE +190 -0
  241. package/src/scene/transitions/NOTICE +5 -0
  242. package/src/scene/transitions/SOURCE.json +24 -0
  243. package/src/scene/transitions/transitions.global.js +38 -0
  244. package/src/scene/transitions.ts +26 -0
  245. package/src/service/all-projects.ts +153 -0
  246. package/src/service/commands.ts +256 -0
  247. package/src/service/due.ts +82 -0
  248. package/src/service/lock.ts +101 -0
  249. package/src/service/log-file.ts +56 -0
  250. package/src/service/state.ts +41 -0
  251. package/src/service/units.ts +90 -0
  252. package/src/service/worker.ts +51 -0
  253. package/src/skill-agents.ts +74 -0
  254. package/src/skill-install.ts +334 -0
  255. package/src/sync-write.ts +21 -0
  256. package/src/tick-report.ts +205 -0
  257. package/src/tts.ts +124 -0
  258. package/vendor/@vfrey/contracts/dist/account.d.ts +97 -0
  259. package/vendor/@vfrey/contracts/dist/account.js +27 -0
  260. package/vendor/@vfrey/contracts/dist/checks.d.ts +8 -0
  261. package/vendor/@vfrey/contracts/dist/checks.js +1 -0
  262. package/vendor/@vfrey/contracts/dist/credentials/crypto.d.ts +4 -0
  263. package/vendor/@vfrey/contracts/dist/credentials/crypto.js +38 -0
  264. package/vendor/@vfrey/contracts/dist/domain/advice-persona.d.ts +10 -0
  265. package/vendor/@vfrey/contracts/dist/domain/advice-persona.js +24 -0
  266. package/vendor/@vfrey/contracts/dist/domain/backoff.d.ts +13 -0
  267. package/vendor/@vfrey/contracts/dist/domain/backoff.js +27 -0
  268. package/vendor/@vfrey/contracts/dist/domain/cadence.d.ts +29 -0
  269. package/vendor/@vfrey/contracts/dist/domain/cadence.js +95 -0
  270. package/vendor/@vfrey/contracts/dist/domain/creators.d.ts +146 -0
  271. package/vendor/@vfrey/contracts/dist/domain/creators.js +2 -0
  272. package/vendor/@vfrey/contracts/dist/domain/disclosure.d.ts +127 -0
  273. package/vendor/@vfrey/contracts/dist/domain/disclosure.js +250 -0
  274. package/vendor/@vfrey/contracts/dist/domain/errors.d.ts +34 -0
  275. package/vendor/@vfrey/contracts/dist/domain/errors.js +68 -0
  276. package/vendor/@vfrey/contracts/dist/domain/redact.d.ts +1 -0
  277. package/vendor/@vfrey/contracts/dist/domain/redact.js +21 -0
  278. package/vendor/@vfrey/contracts/dist/domain/revenue.d.ts +13 -0
  279. package/vendor/@vfrey/contracts/dist/domain/revenue.js +16 -0
  280. package/vendor/@vfrey/contracts/dist/domain/safety.d.ts +20 -0
  281. package/vendor/@vfrey/contracts/dist/domain/safety.js +61 -0
  282. package/vendor/@vfrey/contracts/dist/domain/similarity.d.ts +13 -0
  283. package/vendor/@vfrey/contracts/dist/domain/similarity.js +100 -0
  284. package/vendor/@vfrey/contracts/dist/domain/templates.d.ts +18 -0
  285. package/vendor/@vfrey/contracts/dist/domain/templates.js +67 -0
  286. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.d.ts +19 -0
  287. package/vendor/@vfrey/contracts/dist/domain/tiktok-chunks.js +52 -0
  288. package/vendor/@vfrey/contracts/dist/domain/topics.d.ts +78 -0
  289. package/vendor/@vfrey/contracts/dist/domain/topics.js +4 -0
  290. package/vendor/@vfrey/contracts/dist/domain/types.d.ts +216 -0
  291. package/vendor/@vfrey/contracts/dist/domain/types.js +1 -0
  292. package/vendor/@vfrey/contracts/dist/domain/variation.d.ts +57 -0
  293. package/vendor/@vfrey/contracts/dist/domain/variation.js +278 -0
  294. package/vendor/@vfrey/contracts/dist/events.d.ts +20 -0
  295. package/vendor/@vfrey/contracts/dist/events.js +1 -0
  296. package/vendor/@vfrey/contracts/dist/http.d.ts +11 -0
  297. package/vendor/@vfrey/contracts/dist/http.js +37 -0
  298. package/vendor/@vfrey/contracts/dist/index.d.ts +22 -0
  299. package/vendor/@vfrey/contracts/dist/index.js +22 -0
  300. package/vendor/@vfrey/contracts/dist/log.d.ts +2 -0
  301. package/vendor/@vfrey/contracts/dist/log.js +10 -0
  302. package/vendor/@vfrey/contracts/dist/mail.d.ts +55 -0
  303. package/vendor/@vfrey/contracts/dist/mail.js +1 -0
  304. package/vendor/@vfrey/contracts/package.json +18 -0
  305. package/vendor/@vfrey/ingest/dist/index.d.ts +41 -0
  306. package/vendor/@vfrey/ingest/dist/index.js +221 -0
  307. package/vendor/@vfrey/ingest/dist/parse.d.ts +5 -0
  308. package/vendor/@vfrey/ingest/dist/parse.js +165 -0
  309. package/vendor/@vfrey/ingest/package.json +21 -0
  310. package/vendor/framey/LICENSE +190 -0
  311. package/vendor/framey/NOTICE +15 -0
  312. package/vendor/framey/SOURCE.json +24 -0
  313. package/vendor/framey/STUDIO-SOURCE.json +9 -0
  314. package/vendor/framey/bin/framey-localize-fonts.mjs +12 -0
  315. package/vendor/framey/bin/framey.mjs +16 -0
  316. package/vendor/framey/dist/add-VMJD5KBS.js +75 -0
  317. package/vendor/framey/dist/animatedGifPrep-QPKGJ6PM.js +43 -0
  318. package/vendor/framey/dist/api.d.ts +211 -0
  319. package/vendor/framey/dist/api.js +76 -0
  320. package/vendor/framey/dist/appHistory-WW56FZTT.js +31 -0
  321. package/vendor/framey/dist/asset-WQKGOELE.js +26 -0
  322. package/vendor/framey/dist/audio-RSJWVWRA.js +1936 -0
  323. package/vendor/framey/dist/batchRender-3HPICDCT.js +366 -0
  324. package/vendor/framey/dist/beats-HL2BDUZI.js +273 -0
  325. package/vendor/framey/dist/benchmark-RWCWHI5Z.js +230 -0
  326. package/vendor/framey/dist/browser-ECYET3Q2.js +206 -0
  327. package/vendor/framey/dist/bundleWithLocalizedFonts-ALYBQEQT.js +52 -0
  328. package/vendor/framey/dist/captureCompositionFrame-4DA6SEH2.js +94 -0
  329. package/vendor/framey/dist/catalog-5JVDEUWK.js +979 -0
  330. package/vendor/framey/dist/catch-up-NEBCL5NO.js +106 -0
  331. package/vendor/framey/dist/check-F5N544ML.js +111 -0
  332. package/vendor/framey/dist/checkBrowser-LZ66CMJG.js +110 -0
  333. package/vendor/framey/dist/chunk-2K7Z2HVP.js +372 -0
  334. package/vendor/framey/dist/chunk-2UZQHDM7.js +323 -0
  335. package/vendor/framey/dist/chunk-2X4PQEYM.js +34 -0
  336. package/vendor/framey/dist/chunk-3422KMTD.js +168 -0
  337. package/vendor/framey/dist/chunk-3FYD4YEK.js +72 -0
  338. package/vendor/framey/dist/chunk-3GXQPCJC.js +682 -0
  339. package/vendor/framey/dist/chunk-3LM6YPBR.js +179 -0
  340. package/vendor/framey/dist/chunk-442JNXRM.js +20 -0
  341. package/vendor/framey/dist/chunk-4BNN5FGX.js +182 -0
  342. package/vendor/framey/dist/chunk-4P7NX5BM.js +11532 -0
  343. package/vendor/framey/dist/chunk-4UMPIPCQ.js +88 -0
  344. package/vendor/framey/dist/chunk-4YYJOFKS.js +28 -0
  345. package/vendor/framey/dist/chunk-54HJ63Q2.js +29 -0
  346. package/vendor/framey/dist/chunk-5ETJX6WM.js +89 -0
  347. package/vendor/framey/dist/chunk-5SG54JRS.js +68 -0
  348. package/vendor/framey/dist/chunk-634HSJ3J.js +58 -0
  349. package/vendor/framey/dist/chunk-66LREXGS.js +48 -0
  350. package/vendor/framey/dist/chunk-6BEFEWFB.js +25 -0
  351. package/vendor/framey/dist/chunk-6BNTGNGD.js +286 -0
  352. package/vendor/framey/dist/chunk-6DDPOHMK.js +140 -0
  353. package/vendor/framey/dist/chunk-6GV5XSOR.js +214 -0
  354. package/vendor/framey/dist/chunk-6JR2XUEE.js +127 -0
  355. package/vendor/framey/dist/chunk-73QVATIM.js +362 -0
  356. package/vendor/framey/dist/chunk-7FMUTGOH.js +279 -0
  357. package/vendor/framey/dist/chunk-7JQFJ6JJ.js +291 -0
  358. package/vendor/framey/dist/chunk-AHPGAESX.js +113 -0
  359. package/vendor/framey/dist/chunk-AHX34EFP.js +15 -0
  360. package/vendor/framey/dist/chunk-AJ5CSAEZ.js +487 -0
  361. package/vendor/framey/dist/chunk-B7RJV74O.js +5047 -0
  362. package/vendor/framey/dist/chunk-BL4U6U52.js +254 -0
  363. package/vendor/framey/dist/chunk-BSQ7XANM.js +210 -0
  364. package/vendor/framey/dist/chunk-BZ56MTDX.js +6 -0
  365. package/vendor/framey/dist/chunk-C5BO7PMT.js +282 -0
  366. package/vendor/framey/dist/chunk-CFUCHO4T.js +358 -0
  367. package/vendor/framey/dist/chunk-CZGHFATT.js +31 -0
  368. package/vendor/framey/dist/chunk-DLA44CMS.js +5649 -0
  369. package/vendor/framey/dist/chunk-DPVXBVLL.js +31292 -0
  370. package/vendor/framey/dist/chunk-DQBY7FRR.js +397 -0
  371. package/vendor/framey/dist/chunk-EAMLBAHA.js +154 -0
  372. package/vendor/framey/dist/chunk-EOVYQ3IG.js +143 -0
  373. package/vendor/framey/dist/chunk-EVMY7IPL.js +612 -0
  374. package/vendor/framey/dist/chunk-FG4BBFZI.js +122 -0
  375. package/vendor/framey/dist/chunk-FI4I7CME.js +56 -0
  376. package/vendor/framey/dist/chunk-FLREUEHW.js +2081 -0
  377. package/vendor/framey/dist/chunk-FUFP7A7S.js +1126 -0
  378. package/vendor/framey/dist/chunk-FV3PIKGH.js +56 -0
  379. package/vendor/framey/dist/chunk-FXMKHHPO.js +123 -0
  380. package/vendor/framey/dist/chunk-GGZAM5VH.js +1187 -0
  381. package/vendor/framey/dist/chunk-GKZEVJIB.js +39 -0
  382. package/vendor/framey/dist/chunk-GMECXFAN.js +57 -0
  383. package/vendor/framey/dist/chunk-GNEFDLFB.js +621 -0
  384. package/vendor/framey/dist/chunk-GPMLSOEG.js +19274 -0
  385. package/vendor/framey/dist/chunk-GPYVT5EE.js +59 -0
  386. package/vendor/framey/dist/chunk-H6IEMZEV.js +40 -0
  387. package/vendor/framey/dist/chunk-HEFQCIXR.js +170 -0
  388. package/vendor/framey/dist/chunk-HFQ4CWHA.js +118 -0
  389. package/vendor/framey/dist/chunk-HPDTCOKE.js +304 -0
  390. package/vendor/framey/dist/chunk-HTUHQKDB.js +548 -0
  391. package/vendor/framey/dist/chunk-HU2SPFNG.js +103 -0
  392. package/vendor/framey/dist/chunk-HVW7ABXD.js +19 -0
  393. package/vendor/framey/dist/chunk-IG7NDKXO.js +26 -0
  394. package/vendor/framey/dist/chunk-II3J3WXK.js +246 -0
  395. package/vendor/framey/dist/chunk-IR35BCLK.js +13 -0
  396. package/vendor/framey/dist/chunk-ISN5GRYI.js +20 -0
  397. package/vendor/framey/dist/chunk-IUONB55J.js +669 -0
  398. package/vendor/framey/dist/chunk-IVSUQR2B.js +161 -0
  399. package/vendor/framey/dist/chunk-IXU6PQSW.js +259 -0
  400. package/vendor/framey/dist/chunk-IZCW2NKT.js +29 -0
  401. package/vendor/framey/dist/chunk-JGXJU5PF.js +68 -0
  402. package/vendor/framey/dist/chunk-JHOCK3DG.js +27 -0
  403. package/vendor/framey/dist/chunk-JVBRJMOP.js +121 -0
  404. package/vendor/framey/dist/chunk-K4MJX7SR.js +17 -0
  405. package/vendor/framey/dist/chunk-K4WKGXRC.js +18 -0
  406. package/vendor/framey/dist/chunk-KGPLIH7B.js +127 -0
  407. package/vendor/framey/dist/chunk-KLIKCX6Q.js +63 -0
  408. package/vendor/framey/dist/chunk-KXTKKBOC.js +61 -0
  409. package/vendor/framey/dist/chunk-KZI44OPA.js +185 -0
  410. package/vendor/framey/dist/chunk-LEKZNRKI.js +45 -0
  411. package/vendor/framey/dist/chunk-LFGJWOVA.js +61 -0
  412. package/vendor/framey/dist/chunk-LLMSX6V6.js +17 -0
  413. package/vendor/framey/dist/chunk-LTGTN2TH.js +195 -0
  414. package/vendor/framey/dist/chunk-M2WBOQ2Q.js +54 -0
  415. package/vendor/framey/dist/chunk-MI5FTLYK.js +399 -0
  416. package/vendor/framey/dist/chunk-MLQP2QUF.js +1809 -0
  417. package/vendor/framey/dist/chunk-MMQ52NIZ.js +956 -0
  418. package/vendor/framey/dist/chunk-ND46XKK3.js +742 -0
  419. package/vendor/framey/dist/chunk-NYEXNSHM.js +504 -0
  420. package/vendor/framey/dist/chunk-O4YRB27L.js +57 -0
  421. package/vendor/framey/dist/chunk-O7BGSQ5F.js +92 -0
  422. package/vendor/framey/dist/chunk-OFQWTKPW.js +117 -0
  423. package/vendor/framey/dist/chunk-P5ZBLXJ6.js +91 -0
  424. package/vendor/framey/dist/chunk-P6LJ4Y32.js +4662 -0
  425. package/vendor/framey/dist/chunk-PKZ7RK5N.js +281 -0
  426. package/vendor/framey/dist/chunk-PURHAXFL.js +15 -0
  427. package/vendor/framey/dist/chunk-Q5X2B5WT.js +29 -0
  428. package/vendor/framey/dist/chunk-QAMKOG67.js +248 -0
  429. package/vendor/framey/dist/chunk-R6YBK4XX.js +514 -0
  430. package/vendor/framey/dist/chunk-RGLQURIX.js +2997 -0
  431. package/vendor/framey/dist/chunk-RNV3DM4S.js +3573 -0
  432. package/vendor/framey/dist/chunk-ROEW726S.js +4638 -0
  433. package/vendor/framey/dist/chunk-RQVDTPGD.js +6 -0
  434. package/vendor/framey/dist/chunk-RVZHGOGR.js +26 -0
  435. package/vendor/framey/dist/chunk-RXATE6FZ.js +385 -0
  436. package/vendor/framey/dist/chunk-S3S4TGEH.js +424 -0
  437. package/vendor/framey/dist/chunk-SDYDNHEE.js +11202 -0
  438. package/vendor/framey/dist/chunk-SSWBU67I.js +173 -0
  439. package/vendor/framey/dist/chunk-ST35C4K6.js +28 -0
  440. package/vendor/framey/dist/chunk-SZNTYTIV.js +990 -0
  441. package/vendor/framey/dist/chunk-T2EUWCJE.js +29 -0
  442. package/vendor/framey/dist/chunk-T6AGUTZJ.js +444 -0
  443. package/vendor/framey/dist/chunk-THJALHFJ.js +11131 -0
  444. package/vendor/framey/dist/chunk-TIQB63MX.js +18128 -0
  445. package/vendor/framey/dist/chunk-U242RTCT.js +134 -0
  446. package/vendor/framey/dist/chunk-UJZREAV6.js +3901 -0
  447. package/vendor/framey/dist/chunk-UMD3V7CU.js +264 -0
  448. package/vendor/framey/dist/chunk-UOFAE5RF.js +42 -0
  449. package/vendor/framey/dist/chunk-UTEIUGAZ.js +29 -0
  450. package/vendor/framey/dist/chunk-VAS6HQX3.js +138 -0
  451. package/vendor/framey/dist/chunk-VC76R6W2.js +27 -0
  452. package/vendor/framey/dist/chunk-VFZ7W5W7.js +226 -0
  453. package/vendor/framey/dist/chunk-VHNLZAE2.js +348 -0
  454. package/vendor/framey/dist/chunk-VMC4WSH5.js +278 -0
  455. package/vendor/framey/dist/chunk-VORQIH64.js +108 -0
  456. package/vendor/framey/dist/chunk-VTXFRIHO.js +186 -0
  457. package/vendor/framey/dist/chunk-W2LGJSEN.js +182 -0
  458. package/vendor/framey/dist/chunk-WKBM7NDG.js +32 -0
  459. package/vendor/framey/dist/chunk-WMQNIQDJ.js +2057 -0
  460. package/vendor/framey/dist/chunk-WN4XZC5F.js +504 -0
  461. package/vendor/framey/dist/chunk-WQ6ZXHFQ.js +133 -0
  462. package/vendor/framey/dist/chunk-X7HBSTCZ.js +53 -0
  463. package/vendor/framey/dist/chunk-X7MTZ4T2.js +6 -0
  464. package/vendor/framey/dist/chunk-XPTOJZJF.js +308 -0
  465. package/vendor/framey/dist/chunk-XT6MXC7A.js +6 -0
  466. package/vendor/framey/dist/chunk-XT7X6QCP.js +6 -0
  467. package/vendor/framey/dist/chunk-XTMDWNEC.js +2820 -0
  468. package/vendor/framey/dist/chunk-XUHOIDKG.js +6 -0
  469. package/vendor/framey/dist/chunk-XX7LTW5Y.js +138 -0
  470. package/vendor/framey/dist/chunk-Y3YGTZEG.js +382 -0
  471. package/vendor/framey/dist/chunk-Y5SBSGN7.js +346 -0
  472. package/vendor/framey/dist/chunk-YCMVI4MZ.js +625 -0
  473. package/vendor/framey/dist/chunk-YOR4CTCE.js +261 -0
  474. package/vendor/framey/dist/chunk-YPRBGITP.js +2748 -0
  475. package/vendor/framey/dist/chunk-ZKDMAOFU.js +32 -0
  476. package/vendor/framey/dist/chunk-ZW6DURPF.js +1318 -0
  477. package/vendor/framey/dist/clean-ZJOGDKDM.js +336 -0
  478. package/vendor/framey/dist/cli.js +439 -0
  479. package/vendor/framey/dist/cloudrun-HGJ3B6ZV.js +767 -0
  480. package/vendor/framey/dist/commands/contrast-audit.browser.js +643 -0
  481. package/vendor/framey/dist/commands/layout-audit.browser.js +2914 -0
  482. package/vendor/framey/dist/commands/motion-sample.browser.js +74 -0
  483. package/vendor/framey/dist/commands/motion-signature.browser.js +475 -0
  484. package/vendor/framey/dist/compare-W7UY3BAZ.js +463 -0
  485. package/vendor/framey/dist/compiler-TM3W6GYF.js +136 -0
  486. package/vendor/framey/dist/component-QF5VGYMU.js +176 -0
  487. package/vendor/framey/dist/compositions-XT3PMNDF.js +238 -0
  488. package/vendor/framey/dist/contactSheet-7W6GYHBQ.js +24 -0
  489. package/vendor/framey/dist/deploy-6FJPWKF2.js +299 -0
  490. package/vendor/framey/dist/destroy-HE2RIPKZ.js +57 -0
  491. package/vendor/framey/dist/deterministicFonts-RADD3BSX.js +50 -0
  492. package/vendor/framey/dist/dist-4S2FGGVY.js +422 -0
  493. package/vendor/framey/dist/dist-BE4B2EZE.js +32 -0
  494. package/vendor/framey/dist/dist-EWXJGN63.js +129 -0
  495. package/vendor/framey/dist/docs-VKIRFEEX.js +131 -0
  496. package/vendor/framey/dist/doctor-2UNJ2G7U.js +74 -0
  497. package/vendor/framey/dist/dom-37K6YOH4.js +14 -0
  498. package/vendor/framey/dist/dotEnv-7PZQTVIM.js +54 -0
  499. package/vendor/framey/dist/events-ACY3P2PA.js +76 -0
  500. package/vendor/framey/dist/events-IHB3B2MK.js +69 -0
  501. package/vendor/framey/dist/ffmpeg-DR5LGGSK.js +63 -0
  502. package/vendor/framey/dist/figma-BODVUPHB.js +63 -0
  503. package/vendor/framey/dist/fontData.generated-NXAOI4GH.js +13 -0
  504. package/vendor/framey/dist/fontLocalizeCli.js +142 -0
  505. package/vendor/framey/dist/gpuPolicy-XLEXORZY.js +49 -0
  506. package/vendor/framey/dist/grade-compare-GAXFQ74C.js +661 -0
  507. package/vendor/framey/dist/gsapParser-IEUSLYDJ.js +2885 -0
  508. package/vendor/framey/dist/gsapParserAcorn-LZJKCFQI.js +30 -0
  509. package/vendor/framey/dist/help-VCB5X2HS.js +184 -0
  510. package/vendor/framey/dist/history-ENGZEVFT.js +471 -0
  511. package/vendor/framey/dist/hyperframe.manifest.json +22 -0
  512. package/vendor/framey/dist/hyperframe.runtime.iife.js +1132 -0
  513. package/vendor/framey/dist/hyperframes-player.global.js +478 -0
  514. package/vendor/framey/dist/hyperframes-slideshow.global.js +148 -0
  515. package/vendor/framey/dist/info-WPCJHBMU.js +182 -0
  516. package/vendor/framey/dist/init-G4WGLYGD.js +1176 -0
  517. package/vendor/framey/dist/inspect-5IQ6CNEQ.js +106 -0
  518. package/vendor/framey/dist/installer-ML4HWUV7.js +40 -0
  519. package/vendor/framey/dist/keyframes-Q6XJO7VW.js +2755 -0
  520. package/vendor/framey/dist/lambda-A7JC74JF.js +468 -0
  521. package/vendor/framey/dist/layout-YET6XNXA.js +95 -0
  522. package/vendor/framey/dist/lint-I7FZN2VJ.js +162 -0
  523. package/vendor/framey/dist/lintProject-PDB3UN72.js +30 -0
  524. package/vendor/framey/dist/manager-CD6LJ7ZN.js +45 -0
  525. package/vendor/framey/dist/manager-WA4F2GST.js +67 -0
  526. package/vendor/framey/dist/media-treatment-BXYS4WVA.js +1030 -0
  527. package/vendor/framey/dist/media-use-LWH3MANK.js +113 -0
  528. package/vendor/framey/dist/models-K363FYM4.js +195 -0
  529. package/vendor/framey/dist/motionShot-GPAVWXLH.js +640 -0
  530. package/vendor/framey/dist/normalize-FASIPBUM.js +24 -0
  531. package/vendor/framey/dist/normalize-audio-VDWYRHN6.js +268 -0
  532. package/vendor/framey/dist/open-E3TB6P6J.js +128 -0
  533. package/vendor/framey/dist/parakeetRunner-UP34UOI2.js +58 -0
  534. package/vendor/framey/dist/pipeline-VXIUYEBU.js +64 -0
  535. package/vendor/framey/dist/play-BUTDQ4DV.js +353 -0
  536. package/vendor/framey/dist/policies-OLDYGFK5.js +309 -0
  537. package/vendor/framey/dist/preflight-2KZ2GWAZ.js +55 -0
  538. package/vendor/framey/dist/present-GXYSM7NX.js +353 -0
  539. package/vendor/framey/dist/preview-EKZ33JOJ.js +1910 -0
  540. package/vendor/framey/dist/producer-SKU5EV3J.js +13 -0
  541. package/vendor/framey/dist/progress-ZWB4Z4ET.js +76 -0
  542. package/vendor/framey/dist/projectConfig-3MZAYVTS.js +60 -0
  543. package/vendor/framey/dist/publication-DTKWNF74.js +33 -0
  544. package/vendor/framey/dist/remove-background-OY5L7XN2.js +265 -0
  545. package/vendor/framey/dist/render-CDV4GDFX.js +187 -0
  546. package/vendor/framey/dist/render-YE5YAMOD.js +2620 -0
  547. package/vendor/framey/dist/render-batch-ZAMFPCLL.js +274 -0
  548. package/vendor/framey/dist/renderSetupWorker.js +120 -0
  549. package/vendor/framey/dist/resolver-D5BIPSEW.js +42 -0
  550. package/vendor/framey/dist/runtimeVersion.js +18 -0
  551. package/vendor/framey/dist/sam-WFZXI4F7.js +23 -0
  552. package/vendor/framey/dist/shaderTransitionWorker.js +44 -0
  553. package/vendor/framey/dist/sherpa-RQWLV7I3.js +79 -0
  554. package/vendor/framey/dist/sherpaWorker.js +84 -0
  555. package/vendor/framey/dist/sites-AMOVABTK.js +54 -0
  556. package/vendor/framey/dist/skill-ZHVLH7KX.js +15 -0
  557. package/vendor/framey/dist/slideshow-SJGK4RQS.js +24 -0
  558. package/vendor/framey/dist/snapshot-TUXL6LBQ.js +1515 -0
  559. package/vendor/framey/dist/src-JHQGB2S6.js +215 -0
  560. package/vendor/framey/dist/src-Z5PGEMXB.js +532 -0
  561. package/vendor/framey/dist/state-B6H3WHCF.js +28 -0
  562. package/vendor/framey/dist/staticProjectServer-DFVZOUGI.js +63 -0
  563. package/vendor/framey/dist/studio/assets/hyperframes-player-DLaKjw0L.js +478 -0
  564. package/vendor/framey/dist/studio/assets/index-BX3KHhGX.js +71 -0
  565. package/vendor/framey/dist/studio/assets/index-CYbvOVp-.css +1 -0
  566. package/vendor/framey/dist/studio/assets/index-Dp3QEUGL.js +402 -0
  567. package/vendor/framey/dist/studio/assets/index-qrTAXbqc.js +531 -0
  568. package/vendor/framey/dist/studio/favicon.svg +14 -0
  569. package/vendor/framey/dist/studio/icons/timeline/audio.svg +7 -0
  570. package/vendor/framey/dist/studio/icons/timeline/captions.svg +5 -0
  571. package/vendor/framey/dist/studio/icons/timeline/composition.svg +12 -0
  572. package/vendor/framey/dist/studio/icons/timeline/image.svg +18 -0
  573. package/vendor/framey/dist/studio/icons/timeline/music.svg +10 -0
  574. package/vendor/framey/dist/studio/icons/timeline/text.svg +3 -0
  575. package/vendor/framey/dist/studio/index.html +23 -0
  576. package/vendor/framey/dist/studio-api-2NECGRMB.js +179 -0
  577. package/vendor/framey/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  578. package/vendor/framey/dist/studioServer-N2OPUMOQ.js +1569 -0
  579. package/vendor/framey/dist/synthesize-PKTB5ATG.js +183 -0
  580. package/vendor/framey/dist/system-7F3UEHQT.js +27 -0
  581. package/vendor/framey/dist/telemetry-DQGPEKM6.js +145 -0
  582. package/vendor/framey/dist/telemetry-UN55N6U6.js +77 -0
  583. package/vendor/framey/dist/timeline-LHUUMK63.js +1295 -0
  584. package/vendor/framey/dist/tokens-OLECWDFK.js +92 -0
  585. package/vendor/framey/dist/transcribe-O7HQKMIV.js +331 -0
  586. package/vendor/framey/dist/transcribe-UJESPBT5.js +76 -0
  587. package/vendor/framey/dist/tts-YCCQHZD4.js +234 -0
  588. package/vendor/framey/dist/urlDownloader-H2LXLG4U.js +48 -0
  589. package/vendor/framey/dist/usage-HG4WMM7A.js +2167 -0
  590. package/vendor/framey/dist/validate-F2XMN6EV.js +87 -0
  591. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/GSAP-LICENSE.txt +8 -0
  592. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/CustomEase.min.js +11 -0
  593. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/MotionPathPlugin.min.js +11 -0
  594. package/vendor/framey/dist/vendor/npm/gsap@3.15.0/dist/gsap.min.js +11 -0
  595. package/vendor/framey/dist/warmCheck.js +220 -0
  596. package/vendor/framey/dist/warmCheckClient.js +139 -0
  597. package/vendor/framey/dist/workspaceBuildCheck-XYD2YTFW.js +133 -0
  598. package/vendor/framey-player/LICENSE +190 -0
  599. package/vendor/framey-player/NOTICE +16 -0
  600. package/vendor/framey-player/SOURCE.json +6 -0
  601. package/vendor/framey-player/hyperframes-player.global.js +478 -0
  602. package/vendor/framey.pin +1 -0
  603. package/bin/index.js +0 -3
@@ -0,0 +1,907 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ const sans = "Liberation Sans, Arial, sans-serif";
4
+ const mono = "Liberation Mono, Menlo, monospace";
5
+
6
+ const githubPath =
7
+ "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12";
8
+
9
+ const javascriptPath =
10
+ "M0 0h24v24H0V0zm22.034 18.276c-.175-1.095-.888-2.015-3.003-2.873-.736-.345-1.554-.585-1.797-1.14-.091-.33-.105-.51-.046-.705.15-.646.915-.84 1.515-.66.39.12.75.42.976.9 1.034-.676 1.034-.676 1.755-1.125-.27-.42-.404-.601-.586-.78-.63-.705-1.469-1.065-2.834-1.034l-.705.089c-.676.165-1.32.525-1.71 1.005-1.14 1.291-.811 3.541.569 4.471 1.365 1.02 3.361 1.244 3.616 2.205.24 1.17-.87 1.545-1.966 1.41-.811-.18-1.26-.586-1.755-1.336l-1.83 1.051c.21.48.45.689.81 1.109 1.74 1.756 6.09 1.666 6.871-1.004.029-.09.24-.705.074-1.65l.046.067zm-8.983-7.245h-2.248c0 1.938-.009 3.864-.009 5.805 0 1.232.063 2.363-.138 2.711-.33.689-1.18.601-1.566.48-.396-.196-.597-.466-.83-.855-.063-.105-.11-.196-.127-.196l-1.825 1.125c.305.63.75 1.172 1.324 1.517.855.51 2.004.675 3.207.405.783-.226 1.458-.691 1.811-1.411.51-.93.402-2.07.397-3.346.012-2.054 0-4.109 0-6.179l.004-.056z";
11
+
12
+ function shadow(id: string) {
13
+ return (
14
+ <filter id={`${id}-sh`} x="-25%" y="-20%" width="150%" height="160%">
15
+ <feDropShadow dx="0" dy="16" stdDeviation="10" floodColor="#000" floodOpacity="0.42" />
16
+ </filter>
17
+ );
18
+ }
19
+
20
+ export function GithubMark({ size = 42, fill = "#f6f3ec" }: { size?: number; fill?: string }) {
21
+ return (
22
+ <svg width={size} height={size} viewBox="0 0 24 24" aria-hidden>
23
+ <path fill={fill} d={githubPath} />
24
+ </svg>
25
+ );
26
+ }
27
+
28
+ export function NotesApp({ id, query, filter, width }: { id: string; query: string; filter: number; width: number }) {
29
+ const notes = [
30
+ { title: "Grocery list", line: "oat milk, eggs", keep: false },
31
+ { title: "Search ideas", line: "how the box filters", keep: true },
32
+ { title: "Train times", line: "platform three", keep: false },
33
+ { title: "Recipe", line: "search the pantry", keep: true },
34
+ { title: "Monday", line: "call home", keep: false },
35
+ ];
36
+ const height = Math.round(width * (780 / 640));
37
+ return (
38
+ <svg width={width} height={height} viewBox="0 0 640 780">
39
+ <defs>
40
+ {shadow(id)}
41
+ <linearGradient id={`${id}-paper`} x1="0" y1="0" x2="0" y2="1">
42
+ <stop offset="0" stopColor="#fff6cc" />
43
+ <stop offset="1" stopColor="#e4bc52" />
44
+ </linearGradient>
45
+ <linearGradient id={`${id}-spine`} x1="0" y1="0" x2="1" y2="0">
46
+ <stop offset="0" stopColor="#c8922a" />
47
+ <stop offset="1" stopColor="#f0d48a" />
48
+ </linearGradient>
49
+ </defs>
50
+ <ellipse cx="330" cy="748" rx="240" ry="18" fill="#000" opacity="0.3" />
51
+ <rect x="40" y="24" width="560" height="700" rx="34" fill={`url(#${id}-paper)`} filter={`url(#${id}-sh)`} />
52
+ <rect x="40" y="24" width="26" height="700" fill={`url(#${id}-spine)`} />
53
+ <circle cx="104" cy="72" r="11" fill="#ff5d6c" />
54
+ <circle cx="138" cy="72" r="11" fill="#f0c14a" />
55
+ <circle cx="172" cy="72" r="11" fill="#3dce8e" />
56
+ <text x="210" y="84" fill="#5c4212" fontSize="34" fontFamily={sans} fontWeight="700">
57
+ Notes
58
+ </text>
59
+ <rect x="86" y="112" width="470" height="76" rx="38" fill="#fffaf0" stroke="#b8882e" strokeWidth="4" />
60
+ <circle cx="132" cy="150" r="16" fill="none" stroke="#5c4212" strokeWidth="5" />
61
+ <path d="M144 162 L158 176" stroke="#5c4212" strokeWidth="5" strokeLinecap="round" />
62
+ <text x="176" y="162" fill="#2c210c" fontSize="32" fontFamily={sans}>
63
+ {query}
64
+ <tspan fill="#b8882e">|</tspan>
65
+ </text>
66
+ {notes.map((note, index) => {
67
+ const y = 214 + index * 96;
68
+ const gone = note.keep ? 0 : filter;
69
+ return (
70
+ <g key={note.title} opacity={1 - gone * 0.92} transform={`translate(${gone * 90} 0)`}>
71
+ <rect x="86" y={y} width="470" height="82" rx="16" fill="#fffaf0" />
72
+ <text x="110" y={y + 34} fill="#2c210c" fontSize="26" fontFamily={sans} fontWeight="700">
73
+ {note.title}
74
+ </text>
75
+ <text x="110" y={y + 62} fill="#7a5e28" fontSize="20" fontFamily={sans}>
76
+ {note.line}
77
+ </text>
78
+ </g>
79
+ );
80
+ })}
81
+ </svg>
82
+ );
83
+ }
84
+
85
+ export function LockedFolder({ id, width }: { id: string; width: number }) {
86
+ const height = Math.round(width * 0.78);
87
+ return (
88
+ <svg width={width} height={height} viewBox="0 0 480 374">
89
+ <defs>
90
+ {shadow(id)}
91
+ <linearGradient id={`${id}-body`} x1="0" y1="0" x2="0" y2="1">
92
+ <stop offset="0" stopColor="#f7d56a" />
93
+ <stop offset="1" stopColor="#d39a28" />
94
+ </linearGradient>
95
+ <linearGradient id={`${id}-flap`} x1="0" y1="0" x2="0" y2="1">
96
+ <stop offset="0" stopColor="#c48418" />
97
+ <stop offset="1" stopColor="#8d5d0c" />
98
+ </linearGradient>
99
+ <linearGradient id={`${id}-lock`} x1="0" y1="0" x2="0" y2="1">
100
+ <stop offset="0" stopColor="#f4f7fb" />
101
+ <stop offset="1" stopColor="#9aa6bd" />
102
+ </linearGradient>
103
+ </defs>
104
+ <ellipse cx="240" cy="348" rx="170" ry="16" fill="#000" opacity="0.28" />
105
+ <path d="M70 96 H190 L214 68 H300 V110 H70 Z" fill="#e8c15a" />
106
+ <rect x="48" y="96" width="384" height="236" rx="22" fill={`url(#${id}-body)`} filter={`url(#${id}-sh)`} />
107
+ <path d="M48 196 H432 V310 a22 22 0 0 1 -22 22 H70 a22 22 0 0 1 -22 -22 Z" fill={`url(#${id}-flap)`} />
108
+ <path d="M168 232 L140 256 L168 280" fill="none" stroke="#fff6cc" strokeWidth="8" strokeLinejoin="round" strokeLinecap="round" />
109
+ <path d="M196 228 L236 284" stroke="#fff6cc" strokeWidth="8" strokeLinecap="round" />
110
+ <path d="M264 232 L292 256 L264 280" fill="none" stroke="#fff6cc" strokeWidth="8" strokeLinejoin="round" strokeLinecap="round" />
111
+ <rect x="292" y="118" width="78" height="64" rx="12" fill={`url(#${id}-lock)`} />
112
+ <path d="M308 122 V100 a24 24 0 0 1 48 0 V122" fill="none" stroke="#dfe6f2" strokeWidth="10" />
113
+ <circle cx="331" cy="148" r="6" fill="#3a4256" />
114
+ <rect x="327" y="150" width="8" height="16" rx="3" fill="#3a4256" />
115
+ </svg>
116
+ );
117
+ }
118
+
119
+ export function ReaPlate({ id, width }: { id: string; width: number }) {
120
+ const height = Math.round(width * 0.42);
121
+ return (
122
+ <svg width={width} height={height} viewBox="0 0 640 270">
123
+ <defs>
124
+ {shadow(id)}
125
+ <linearGradient id={`${id}-plate`} x1="0" y1="0" x2="0" y2="1">
126
+ <stop offset="0" stopColor="#2a354c" />
127
+ <stop offset="1" stopColor="#141b2c" />
128
+ </linearGradient>
129
+ <linearGradient id={`${id}-rim`} x1="0" y1="0" x2="1" y2="1">
130
+ <stop offset="0" stopColor="#ffe08a" />
131
+ <stop offset="1" stopColor="#b8860b" />
132
+ </linearGradient>
133
+ </defs>
134
+ <ellipse cx="320" cy="246" rx="220" ry="14" fill="#000" opacity="0.35" />
135
+ <rect x="28" y="28" width="584" height="200" rx="36" fill={`url(#${id}-rim)`} filter={`url(#${id}-sh)`} />
136
+ <rect x="42" y="42" width="556" height="172" rx="28" fill={`url(#${id}-plate)`} />
137
+ <circle cx="118" cy="128" r="36" fill="none" stroke="#f0c14a" strokeWidth="8" />
138
+ <circle cx="118" cy="128" r="16" fill="#8eb6ff" opacity="0.85" />
139
+ <path d="M142 152 L168 178" stroke="#f0c14a" strokeWidth="8" strokeLinecap="round" />
140
+ <text x="196" y="148" fill="#f6f3ec" fontSize="78" fontFamily={sans} fontWeight="700">
141
+ REA
142
+ </text>
143
+ </svg>
144
+ );
145
+ }
146
+
147
+ export function RepoCard({
148
+ id,
149
+ pathName,
150
+ stars,
151
+ fill,
152
+ dim,
153
+ width,
154
+ }: {
155
+ id: string;
156
+ pathName: string;
157
+ stars: string;
158
+ fill: number;
159
+ dim: number;
160
+ width: number;
161
+ }) {
162
+ const height = Math.round(width * 0.62);
163
+ return (
164
+ <svg width={width} height={height} viewBox="0 0 760 470" opacity={1 - dim * 0.45}>
165
+ <defs>
166
+ {shadow(id)}
167
+ <linearGradient id={`${id}-card`} x1="0" y1="0" x2="0" y2="1">
168
+ <stop offset="0" stopColor="#243044" />
169
+ <stop offset="1" stopColor="#151c2c" />
170
+ </linearGradient>
171
+ <linearGradient id={`${id}-star`} x1="0" y1="0" x2="0" y2="1">
172
+ <stop offset="0" stopColor="#ffe08a" />
173
+ <stop offset="1" stopColor="#e0a31a" />
174
+ </linearGradient>
175
+ </defs>
176
+ <rect x="24" y="20" width="712" height="420" rx="32" fill={`url(#${id}-card)`} filter={`url(#${id}-sh)`} />
177
+ <rect x="24" y="300" width="712" height="140" rx="32" fill="#101726" />
178
+ <rect x="24" y="300" width="712" height="40" fill="#101726" />
179
+ <svg x="56" y="52" width="64" height="64" viewBox="0 0 24 24">
180
+ <path fill="#f6f3ec" d={githubPath} />
181
+ </svg>
182
+ <text x="140" y="98" fill="#f6f3ec" fontSize="40" fontFamily={mono}>
183
+ {pathName}
184
+ </text>
185
+ {[0, 1, 2, 3].map((row) => (
186
+ <g key={row} opacity={0.85}>
187
+ <rect x="56" y={150 + row * 34} width={18} height="18" rx="4" fill="#3d4d68" />
188
+ <rect x="88" y={154 + row * 34} width={280 - row * 30} height="12" rx="6" fill="#3d4d68" />
189
+ </g>
190
+ ))}
191
+ <circle cx="560" cy="168" r="78" fill="#101726" stroke="#f0c14a" strokeWidth="4" />
192
+ <path
193
+ d="M560 112 L574 150 H614 L582 172 L594 212 L560 188 L526 212 L538 172 L506 150 H546 Z"
194
+ fill={fill > 0.5 ? `url(#${id}-star)` : "none"}
195
+ stroke="#f0c14a"
196
+ strokeWidth="6"
197
+ strokeLinejoin="round"
198
+ />
199
+ <text x="430" y="390" fill="#f6f3ec" fontSize="54" fontFamily={sans} fontWeight="700" textAnchor="middle">
200
+ {stars}
201
+ </text>
202
+ </svg>
203
+ );
204
+ }
205
+
206
+ export function ChatWindow({
207
+ id,
208
+ typed,
209
+ connected,
210
+ width,
211
+ }: {
212
+ id: string;
213
+ typed: string;
214
+ connected: number;
215
+ width: number;
216
+ }) {
217
+ const height = Math.round(width * 0.72);
218
+ return (
219
+ <svg width={width} height={height} viewBox="0 0 760 548">
220
+ <defs>
221
+ {shadow(id)}
222
+ <linearGradient id={`${id}-win`} x1="0" y1="0" x2="0" y2="1">
223
+ <stop offset="0" stopColor="#2c3850" />
224
+ <stop offset="1" stopColor="#141b2b" />
225
+ </linearGradient>
226
+ </defs>
227
+ <rect x="20" y="16" width="720" height="512" rx="28" fill={`url(#${id}-win)`} filter={`url(#${id}-sh)`} />
228
+ <rect x="20" y="16" width="720" height="72" rx="28" fill="#101726" />
229
+ <rect x="20" y="52" width="720" height="36" fill="#101726" />
230
+ <circle cx="64" cy="52" r="10" fill="#ff5d6c" />
231
+ <circle cx="96" cy="52" r="10" fill="#f0c14a" />
232
+ <circle cx="128" cy="52" r="10" fill="#3dce8e" />
233
+ <circle cx="660" cy="52" r="14" fill={connected > 0.6 ? "#3dce8e" : "#3a465f"} />
234
+ <rect x="676" y="46" width="28" height="12" rx="6" fill={connected > 0.6 ? "#3dce8e" : "#3a465f"} />
235
+ <rect x="56" y="120" width="420" height="84" rx="22" fill="#243044" />
236
+ <text x="80" y="170" fill="#d5dbea" fontSize="26" fontFamily={sans}>
237
+ How can I help?
238
+ </text>
239
+ {typed ? (
240
+ <g>
241
+ <rect x="250" y="224" width="460" height="120" rx="22" fill="#f0c14a" />
242
+ <text x="274" y="270" fill="#2a2108" fontSize="24" fontFamily={sans}>
243
+ {typed.slice(0, 32)}
244
+ </text>
245
+ {typed.length > 32 ? (
246
+ <text x="274" y="306" fill="#2a2108" fontSize="24" fontFamily={sans}>
247
+ {typed.slice(32, 64)}
248
+ </text>
249
+ ) : null}
250
+ </g>
251
+ ) : null}
252
+ <rect x="56" y="430" width="648" height="70" rx="18" fill="#0e1422" stroke="#3a465f" strokeWidth="3" />
253
+ <path d="M650 454 L684 466 L650 478 L658 466 Z" fill="#f0c14a" />
254
+ </svg>
255
+ );
256
+ }
257
+
258
+ export function LayerStack({ id, lit, width }: { id: string; lit: number; width: number }) {
259
+ const height = Math.round(width * 0.72);
260
+ const slabs = [
261
+ { y: 20, label: "What you see", kind: "screen" },
262
+ { y: 150, label: "The code", kind: "code" },
263
+ { y: 280, label: "Compiled", kind: "chip" },
264
+ ];
265
+ return (
266
+ <svg width={width} height={height} viewBox="0 0 760 520">
267
+ <defs>
268
+ <linearGradient id={`${id}-top`} x1="0" y1="0" x2="0" y2="1">
269
+ <stop offset="0" stopColor="#d5deee" />
270
+ <stop offset="1" stopColor="#8ea0bd" />
271
+ </linearGradient>
272
+ <linearGradient id={`${id}-face`} x1="0" y1="0" x2="0" y2="1">
273
+ <stop offset="0" stopColor="#5d6d8c" />
274
+ <stop offset="1" stopColor="#2c384e" />
275
+ </linearGradient>
276
+ </defs>
277
+ {slabs.map((slab, index) => {
278
+ const on = lit > index ? 1 : 0;
279
+ return (
280
+ <g key={slab.kind}>
281
+ <rect x="40" y={slab.y + 36} width="680" height="78" rx="16" fill={`url(#${id}-face)`} />
282
+ <rect
283
+ x="40"
284
+ y={slab.y}
285
+ width="680"
286
+ height="78"
287
+ rx="16"
288
+ fill={`url(#${id}-top)`}
289
+ stroke={on ? "#f0c14a" : "#243044"}
290
+ strokeWidth={on ? 6 : 0}
291
+ />
292
+ {slab.kind === "screen" ? (
293
+ <rect x="70" y={slab.y + 18} width="120" height="42" rx="8" fill="#141b2b" />
294
+ ) : null}
295
+ {slab.kind === "code" ? (
296
+ <path d="M90 28 L70 52 L90 76 M130 28 L150 52 L130 76" transform={`translate(0 ${slab.y})`} fill="none" stroke="#141b2b" strokeWidth="6" strokeLinecap="round" />
297
+ ) : null}
298
+ {slab.kind === "chip" ? (
299
+ <g>
300
+ {[0, 1, 2, 3].map((pin) => (
301
+ <rect key={pin} x={70 + pin * 22} y={slab.y + 8} width="8" height="16" rx="2" fill="#141b2b" />
302
+ ))}
303
+ <rect x="78" y={slab.y + 28} width="70" height="28" rx="4" fill="#141b2b" />
304
+ </g>
305
+ ) : null}
306
+ <text x="230" y={slab.y + 50} fill="#141b2b" fontSize="28" fontFamily={sans} fontWeight="700">
307
+ {slab.label}
308
+ </text>
309
+ </g>
310
+ );
311
+ })}
312
+ </svg>
313
+ );
314
+ }
315
+
316
+ export function TerminalWindow({ id, text, width }: { id: string; text: string; width: number }) {
317
+ const height = Math.round(width * 0.58);
318
+ return (
319
+ <svg width={width} height={height} viewBox="0 0 900 520">
320
+ <defs>
321
+ {shadow(id)}
322
+ <linearGradient id={`${id}-term`} x1="0" y1="0" x2="0" y2="1">
323
+ <stop offset="0" stopColor="#243044" />
324
+ <stop offset="1" stopColor="#101622" />
325
+ </linearGradient>
326
+ </defs>
327
+ <rect x="16" y="12" width="868" height="490" rx="28" fill={`url(#${id}-term)`} filter={`url(#${id}-sh)`} />
328
+ <circle cx="64" cy="64" r="12" fill="#ff5d6c" />
329
+ <circle cx="104" cy="64" r="12" fill="#f0c14a" />
330
+ <circle cx="144" cy="64" r="12" fill="#3dce8e" />
331
+ <text x="48" y="180" fill="#3dce8e" fontSize="40" fontFamily={mono}>
332
+ ${" "}
333
+ <tspan fill="#f0c14a">{text}</tspan>
334
+ <tspan fill="#f6f3ec">▌</tspan>
335
+ </text>
336
+ </svg>
337
+ );
338
+ }
339
+
340
+ export function EnterKey({ id, press, width }: { id: string; press: number; width: number }) {
341
+ const height = Math.round(width * 0.72);
342
+ return (
343
+ <svg width={width} height={height} viewBox="0 0 220 160" style={{ translate: `0px ${press * 10}px`, scale: `1 ${1 - press * 0.12}` }}>
344
+ <defs>
345
+ <linearGradient id={`${id}-key`} x1="0" y1="0" x2="0" y2="1">
346
+ <stop offset="0" stopColor="#f7f8fb" />
347
+ <stop offset="1" stopColor="#b7c0d1" />
348
+ </linearGradient>
349
+ </defs>
350
+ <rect x="18" y="28" width="184" height="28" rx="8" fill="#6d7890" />
351
+ <rect x="18" y="8" width="184" height="100" rx="16" fill={`url(#${id}-key)`} />
352
+ <path d="M48 58 H130 V40 L168 70 L130 100 V82 H48 Z" fill="#2a3142" />
353
+ </svg>
354
+ );
355
+ }
356
+
357
+ export function NameTile({ id, name, ring, dashed, width }: { id: string; name: string; ring: number; dashed: boolean; width: number }) {
358
+ const height = Math.round(width * 0.72);
359
+ return (
360
+ <svg width={width} height={height} viewBox="0 0 240 172">
361
+ <defs>
362
+ <linearGradient id={`${id}-tile`} x1="0" y1="0" x2="0" y2="1">
363
+ <stop offset="0" stopColor="#314158" />
364
+ <stop offset="1" stopColor="#1a2333" />
365
+ </linearGradient>
366
+ </defs>
367
+ <rect x="16" y="28" width="208" height="120" rx="22" fill="#121926" />
368
+ <rect
369
+ x="16"
370
+ y="12"
371
+ width="208"
372
+ height="120"
373
+ rx="22"
374
+ fill={`url(#${id}-tile)`}
375
+ stroke={ring ? "#f0c14a" : dashed ? "#8ea0bd" : "#0000"}
376
+ strokeWidth="6"
377
+ strokeDasharray={dashed ? "10 8" : "0"}
378
+ />
379
+ <text x="120" y="82" textAnchor="middle" fill="#f6f3ec" fontSize={name.length > 8 ? 24 : 28} fontFamily={sans} fontWeight="700">
380
+ {name}
381
+ </text>
382
+ </svg>
383
+ );
384
+ }
385
+
386
+ export function ReviewSheet({ id, rows, width }: { id: string; rows: number; width: number }) {
387
+ const height = Math.round(width * 0.7);
388
+ const lines = ["Add the connection", "Keep a backup", "Restart after"];
389
+ return (
390
+ <svg width={width} height={height} viewBox="0 0 680 476">
391
+ <defs>
392
+ {shadow(id)}
393
+ <linearGradient id={`${id}-paper`} x1="0" y1="0" x2="0" y2="1">
394
+ <stop offset="0" stopColor="#fffaf2" />
395
+ <stop offset="1" stopColor="#e4d3b4" />
396
+ </linearGradient>
397
+ </defs>
398
+ <rect x="30" y="20" width="620" height="430" rx="18" fill={`url(#${id}-paper)`} filter={`url(#${id}-sh)`} />
399
+ <path d="M560 20 H650 V110 L560 20 Z" fill="#d9c29a" />
400
+ <rect x="30" y="20" width="620" height="70" fill="#f0e2c4" />
401
+ <text x="60" y="66" fill="#3a2e18" fontSize="32" fontFamily={sans} fontWeight="700">
402
+ Review
403
+ </text>
404
+ {lines.map((line, index) => (
405
+ <g key={line} opacity={rows > index ? 1 : 0}>
406
+ <rect x="70" y={130 + index * 90} width="36" height="44" rx="6" fill="#f7f1e4" stroke="#b8882e" strokeWidth="3" />
407
+ <path d="M78 152 H98 M78 162 H98" stroke="#b8882e" strokeWidth="3" />
408
+ <rect x="130" y={130 + index * 90} width="36" height="36" rx="8" fill="#fff" stroke="#3a2e18" strokeWidth="3" />
409
+ {rows > index + 0.6 ? <path d="M138 148 L146 158 L160 138" fill="none" stroke="#1f8a4c" strokeWidth="4" /> : null}
410
+ <text x="186" y={160 + index * 90} fill="#3a2e18" fontSize="28" fontFamily={sans}>
411
+ {line}
412
+ </text>
413
+ </g>
414
+ ))}
415
+ </svg>
416
+ );
417
+ }
418
+
419
+ export function ApproveButton({ id, width }: { id: string; width: number }) {
420
+ const height = Math.round(width * 0.42);
421
+ return (
422
+ <svg width={width} height={height} viewBox="0 0 360 150">
423
+ <defs>
424
+ <linearGradient id={`${id}-btn`} x1="0" y1="0" x2="0" y2="1">
425
+ <stop offset="0" stopColor="#ffe08a" />
426
+ <stop offset="1" stopColor="#e0a31a" />
427
+ </linearGradient>
428
+ </defs>
429
+ <rect x="16" y="28" width="328" height="96" rx="48" fill="#8a6410" />
430
+ <rect x="16" y="12" width="328" height="96" rx="48" fill={`url(#${id}-btn)`} />
431
+ <path d="M78 62 L98 82 L138 40" fill="none" stroke="#3a2a08" strokeWidth="8" strokeLinecap="round" />
432
+ <text x="160" y="74" fill="#3a2a08" fontSize="36" fontFamily={sans} fontWeight="700">
433
+ Approve
434
+ </text>
435
+ </svg>
436
+ );
437
+ }
438
+
439
+ export function Laptop({ id, width }: { id: string; width: number }) {
440
+ const height = Math.round(width * 0.72);
441
+ return (
442
+ <svg width={width} height={height} viewBox="0 0 860 620">
443
+ <defs>
444
+ {shadow(id)}
445
+ <linearGradient id={`${id}-lid`} x1="0" y1="0" x2="0" y2="1">
446
+ <stop offset="0" stopColor="#d5deee" />
447
+ <stop offset="1" stopColor="#8b97ad" />
448
+ </linearGradient>
449
+ <linearGradient id={`${id}-base`} x1="0" y1="0" x2="0" y2="1">
450
+ <stop offset="0" stopColor="#9aa6bb" />
451
+ <stop offset="1" stopColor="#5c677c" />
452
+ </linearGradient>
453
+ </defs>
454
+ <ellipse cx="430" cy="590" rx="300" ry="18" fill="#000" opacity="0.3" />
455
+ <path d="M70 500 H790 L840 575 H20 Z" fill={`url(#${id}-base)`} filter={`url(#${id}-sh)`} />
456
+ <rect x="150" y="548" width="560" height="14" rx="7" fill="#3e475a" />
457
+ <rect x="110" y="36" width="640" height="450" rx="24" fill={`url(#${id}-lid)`} />
458
+ <rect x="136" y="60" width="588" height="392" rx="12" fill="#101622" />
459
+ <circle cx="430" cy="48" r="5" fill="#3e475a" />
460
+ </svg>
461
+ );
462
+ }
463
+
464
+ export function Cloud({ id, width }: { id: string; width: number }) {
465
+ const height = Math.round(width * 0.62);
466
+ return (
467
+ <svg width={width} height={height} viewBox="0 0 360 220">
468
+ <defs>
469
+ <linearGradient id={`${id}-cloud`} x1="0" y1="0" x2="0" y2="1">
470
+ <stop offset="0" stopColor="#f7fbff" />
471
+ <stop offset="1" stopColor="#b7c3d6" />
472
+ </linearGradient>
473
+ </defs>
474
+ <ellipse cx="180" cy="190" rx="120" ry="14" fill="#000" opacity="0.25" />
475
+ <path
476
+ d="M90 160 H250 a50 50 0 0 0 8 -98 a70 70 0 0 0 -132 -8 a46 46 0 0 0 -36 106 Z"
477
+ fill={`url(#${id}-cloud)`}
478
+ />
479
+ <ellipse cx="150" cy="78" rx="46" ry="28" fill="#ffffff" opacity="0.55" />
480
+ </svg>
481
+ );
482
+ }
483
+
484
+ export function NoMark({ id, width }: { id: string; width: number }) {
485
+ return (
486
+ <svg width={width} height={width} viewBox="0 0 160 160">
487
+ <defs>
488
+ <linearGradient id={`${id}-no`} x1="0" y1="0" x2="0" y2="1">
489
+ <stop offset="0" stopColor="#ff8b98" />
490
+ <stop offset="1" stopColor="#d23b4e" />
491
+ </linearGradient>
492
+ </defs>
493
+ <circle cx="80" cy="80" r="68" fill={`url(#${id}-no)`} />
494
+ <rect x="28" y="68" width="104" height="22" rx="11" fill="#fff6f7" transform="rotate(-28 80 80)" />
495
+ </svg>
496
+ );
497
+ }
498
+
499
+ export function ReportSheet({ id, shown, width }: { id: string; shown: number; width: number }) {
500
+ const height = Math.round(width * 1.15);
501
+ const blocks = [
502
+ { title: "Explained", y: 150, kind: "lines" },
503
+ { title: "Proof", y: 360, kind: "checks" },
504
+ { title: "Not proven", y: 570, kind: "dash" },
505
+ ];
506
+ return (
507
+ <svg width={width} height={height} viewBox="0 0 640 820">
508
+ <defs>
509
+ {shadow(id)}
510
+ <linearGradient id={`${id}-sheet`} x1="0" y1="0" x2="0" y2="1">
511
+ <stop offset="0" stopColor="#fffaf2" />
512
+ <stop offset="1" stopColor="#ead9b8" />
513
+ </linearGradient>
514
+ </defs>
515
+ <rect x="36" y="24" width="568" height="760" rx="16" fill={`url(#${id}-sheet)`} filter={`url(#${id}-sh)`} />
516
+ <path d="M480 24 H604 V148 L480 24 Z" fill="#d7c29a" />
517
+ <text x="70" y="100" fill="#3a2e18" fontSize="40" fontFamily={sans} fontWeight="700">
518
+ The answer
519
+ </text>
520
+ {blocks.map((block, index) => (
521
+ <g key={block.title} opacity={shown > index ? 1 : 0}>
522
+ <text x="70" y={block.y} fill="#3a2e18" fontSize="28" fontFamily={sans} fontWeight="700">
523
+ {block.title}
524
+ </text>
525
+ {block.kind === "lines" ? (
526
+ <g>
527
+ <rect x="70" y={block.y + 24} width="420" height="16" rx="8" fill="#c9b48a" />
528
+ <rect x="70" y={block.y + 52} width="340" height="16" rx="8" fill="#c9b48a" />
529
+ <circle cx="540" cy={block.y + 36} r="28" fill="#f0c14a" />
530
+ <path d="M524 36 H556" transform={`translate(0 ${block.y})`} stroke="#3a2e18" strokeWidth="4" />
531
+ </g>
532
+ ) : null}
533
+ {block.kind === "checks" ? (
534
+ <g>
535
+ {[0, 1].map((row) => (
536
+ <g key={row}>
537
+ <circle cx="92" cy={block.y + 40 + row * 48} r="16" fill="none" stroke="#5c4212" strokeWidth="4" />
538
+ <path d="M108 28 L124 44" transform={`translate(0 ${block.y + row * 48})`} stroke="#5c4212" strokeWidth="4" strokeLinecap="round" />
539
+ <path d="M70 52 L82 64 L106 40" transform={`translate(40 ${block.y + row * 48})`} fill="none" stroke="#1f8a4c" strokeWidth="4" />
540
+ <rect x="160" y={block.y + 28 + row * 48} width="300" height="14" rx="7" fill="#c9b48a" />
541
+ </g>
542
+ ))}
543
+ </g>
544
+ ) : null}
545
+ {block.kind === "dash" ? (
546
+ <g>
547
+ <rect x="70" y={block.y + 20} width="480" height="70" rx="14" fill="none" stroke="#8a7040" strokeWidth="4" strokeDasharray="10 8" />
548
+ <circle cx="118" cy={block.y + 55} r="18" fill="#f0c14a" />
549
+ <text x="110" y={block.y + 64} fill="#3a2e18" fontSize="26" fontFamily={sans} fontWeight="700">
550
+ ?
551
+ </text>
552
+ </g>
553
+ ) : null}
554
+ </g>
555
+ ))}
556
+ </svg>
557
+ );
558
+ }
559
+
560
+ export function Chip({ id, width }: { id: string; width: number }) {
561
+ return (
562
+ <svg width={width} height={width} viewBox="0 0 280 280">
563
+ <defs>
564
+ {shadow(id)}
565
+ <linearGradient id={`${id}-chip`} x1="0" y1="0" x2="0" y2="1">
566
+ <stop offset="0" stopColor="#d5deee" />
567
+ <stop offset="1" stopColor="#7e8ba3" />
568
+ </linearGradient>
569
+ </defs>
570
+ <ellipse cx="140" cy="250" rx="90" ry="12" fill="#000" opacity="0.3" />
571
+ <rect x="78" y="70" width="18" height="150" fill="#5c677c" />
572
+ {[0, 1, 2, 3].map((pin) => (
573
+ <g key={pin}>
574
+ <rect x="40" y={84 + pin * 36} width="48" height="14" rx="3" fill="#c5cedf" />
575
+ <rect x="192" y={84 + pin * 36} width="48" height="14" rx="3" fill="#c5cedf" />
576
+ <rect x={96 + pin * 28} y="40" width="14" height="40" rx="3" fill="#c5cedf" />
577
+ <rect x={96 + pin * 28} y="210" width="14" height="40" rx="3" fill="#c5cedf" />
578
+ </g>
579
+ ))}
580
+ <rect x="70" y="70" width="150" height="150" rx="16" fill={`url(#${id}-chip)`} filter={`url(#${id}-sh)`} />
581
+ <rect x="104" y="104" width="82" height="82" rx="10" fill="#1b2436" />
582
+ <path d="M118 146 H172 M146 118 V172" stroke="#8eb6ff" strokeWidth="4" />
583
+ </svg>
584
+ );
585
+ }
586
+
587
+ export function JsWindow({ id, width }: { id: string; width: number }) {
588
+ const height = Math.round(width * 0.72);
589
+ return (
590
+ <svg width={width} height={height} viewBox="0 0 640 460">
591
+ <defs>
592
+ {shadow(id)}
593
+ <linearGradient id={`${id}-js`} x1="0" y1="0" x2="0" y2="1">
594
+ <stop offset="0" stopColor="#2e3b52" />
595
+ <stop offset="1" stopColor="#151c2c" />
596
+ </linearGradient>
597
+ </defs>
598
+ <rect x="20" y="16" width="600" height="420" rx="24" fill={`url(#${id}-js)`} filter={`url(#${id}-sh)`} />
599
+ <circle cx="60" cy="58" r="10" fill="#ff5d6c" />
600
+ <circle cx="92" cy="58" r="10" fill="#f0c14a" />
601
+ <circle cx="124" cy="58" r="10" fill="#3dce8e" />
602
+ <svg x="520" y="28" width="72" height="72" viewBox="0 0 24 24">
603
+ <path fill="#f7df1e" d={javascriptPath} />
604
+ </svg>
605
+ <text x="48" y="160" fill="#9ad0ff" fontSize="28" fontFamily={mono}>
606
+ search(notes)
607
+ </text>
608
+ <text x="48" y="210" fill="#d5dbea" fontSize="28" fontFamily={mono}>
609
+ filter the list
610
+ </text>
611
+ <text x="48" y="260" fill="#d5dbea" fontSize="28" fontFamily={mono}>
612
+ return matches
613
+ </text>
614
+ </svg>
615
+ );
616
+ }
617
+
618
+ export function AnswerSlip({ id, width }: { id: string; width: number }) {
619
+ const height = Math.round(width * 0.7);
620
+ return (
621
+ <svg width={width} height={height} viewBox="0 0 280 196">
622
+ <defs>
623
+ <linearGradient id={`${id}-slip`} x1="0" y1="0" x2="0" y2="1">
624
+ <stop offset="0" stopColor="#fffaf2" />
625
+ <stop offset="1" stopColor="#e7d3ae" />
626
+ </linearGradient>
627
+ </defs>
628
+ <rect x="16" y="12" width="248" height="168" rx="16" fill={`url(#${id}-slip)`} />
629
+ <path d="M190 12 H264 V86 L190 12 Z" fill="#d9c29a" />
630
+ <rect x="40" y="70" width="150" height="12" rx="6" fill="#c9b48a" />
631
+ <rect x="40" y="96" width="110" height="12" rx="6" fill="#c9b48a" />
632
+ <path d="M40 140 L56 156 L92 120" fill="none" stroke="#1f8a4c" strokeWidth="8" strokeLinecap="round" />
633
+ </svg>
634
+ );
635
+ }
636
+
637
+ export function LampBench({ id, lit, width }: { id: string; lit: number; width: number }) {
638
+ const height = Math.round(width * 0.9);
639
+ return (
640
+ <svg width={width} height={height} viewBox="0 0 300 270">
641
+ <defs>
642
+ <linearGradient id={`${id}-lamp`} x1="0" y1="0" x2="0" y2="1">
643
+ <stop offset="0" stopColor="#ffe08a" />
644
+ <stop offset="1" stopColor="#c88812" />
645
+ </linearGradient>
646
+ </defs>
647
+ <ellipse cx="150" cy="250" rx="100" ry="12" fill="#000" opacity="0.28" />
648
+ <rect x="40" y="200" width="220" height="28" rx="8" fill="#8b97ad" />
649
+ <path d="M70 200 C90 120 150 90 188 70" fill="none" stroke="#d5deee" strokeWidth="10" strokeLinecap="round" />
650
+ <path d="M150 48 H230 L210 110 H168 Z" fill={`url(#${id}-lamp)`} opacity={0.45 + lit * 0.55} />
651
+ <rect x="96" y="150" width="70" height="50" rx="6" fill="#c5cedf" stroke={lit ? "#f0c14a" : "#5c677c"} strokeWidth="4" />
652
+ <rect x="114" y="164" width="34" height="24" rx="3" fill="#1b2436" />
653
+ </svg>
654
+ );
655
+ }
656
+
657
+ export function HexMonitor({ id, width }: { id: string; width: number }) {
658
+ const height = Math.round(width * 0.86);
659
+ return (
660
+ <svg width={width} height={height} viewBox="0 0 300 258">
661
+ <defs>
662
+ <linearGradient id={`${id}-bezel`} x1="0" y1="0" x2="0" y2="1">
663
+ <stop offset="0" stopColor="#d5deee" />
664
+ <stop offset="1" stopColor="#7d8ba3" />
665
+ </linearGradient>
666
+ </defs>
667
+ <rect x="28" y="16" width="244" height="180" rx="16" fill={`url(#${id}-bezel)`} />
668
+ <rect x="46" y="34" width="208" height="140" rx="8" fill="#102418" />
669
+ {[0, 1, 2, 3].map((row) => (
670
+ <g key={row}>
671
+ {[0, 1, 2, 3, 4].map((col) => (
672
+ <rect key={col} x={62 + col * 36} y={50 + row * 28} width="24" height="16" rx="3" fill="#3dce8e" opacity={0.35 + ((row + col) % 3) * 0.2} />
673
+ ))}
674
+ </g>
675
+ ))}
676
+ <rect x="120" y="196" width="60" height="28" fill="#8b97ad" />
677
+ <rect x="80" y="222" width="140" height="16" rx="6" fill="#5c677c" />
678
+ </svg>
679
+ );
680
+ }
681
+
682
+ export function ScopeTower({ id, width }: { id: string; width: number }) {
683
+ const height = Math.round(width * 0.95);
684
+ return (
685
+ <svg width={width} height={height} viewBox="0 0 300 285">
686
+ <defs>
687
+ <linearGradient id={`${id}-tube`} x1="0" y1="0" x2="1" y2="0">
688
+ <stop offset="0" stopColor="#9aa6bb" />
689
+ <stop offset="0.5" stopColor="#f4f7fb" />
690
+ <stop offset="1" stopColor="#6d7890" />
691
+ </linearGradient>
692
+ </defs>
693
+ <rect x="70" y="250" width="160" height="18" rx="8" fill="#5c677c" />
694
+ <rect x="126" y="70" width="48" height="180" rx="16" fill={`url(#${id}-tube)`} />
695
+ <circle cx="150" cy="58" r="40" fill="#d5deee" stroke="#6d7890" strokeWidth="8" />
696
+ <circle cx="150" cy="58" r="18" fill="#8eb6ff" />
697
+ <rect x="92" y="150" width="116" height="16" rx="6" fill="#8b97ad" />
698
+ </svg>
699
+ );
700
+ }
701
+
702
+ export function EditorWindow({ id, lines, search, width }: { id: string; lines: number; search: number; width: number }) {
703
+ const height = Math.round(width * 0.86);
704
+ return (
705
+ <svg width={width} height={height} viewBox="0 0 520 448">
706
+ <defs>
707
+ {shadow(id)}
708
+ <linearGradient id={`${id}-ed`} x1="0" y1="0" x2="0" y2="1">
709
+ <stop offset="0" stopColor="#2a354a" />
710
+ <stop offset="1" stopColor="#121826" />
711
+ </linearGradient>
712
+ </defs>
713
+ <rect x="12" y="10" width="496" height="420" rx="20" fill={`url(#${id}-ed)`} filter={`url(#${id}-sh)`} />
714
+ <rect x="12" y="10" width="180" height="48" rx="12" fill="#101622" />
715
+ <text x="36" y="42" fill="#f6f3ec" fontSize="20" fontFamily={sans}>
716
+ Your project
717
+ </text>
718
+ {[0, 1, 2, 3, 4].map((row) => (
719
+ <g key={row} opacity={lines > row ? 1 : 0.15}>
720
+ <text x="28" y={100 + row * 36} fill="#6d7890" fontSize="18" fontFamily={mono}>
721
+ {row + 1}
722
+ </text>
723
+ <rect x="64" y={84 + row * 36} width={220 - row * 16} height="14" rx="6" fill="#3d4e6b" />
724
+ </g>
725
+ ))}
726
+ <rect x="300" y="80" width="180" height="300" rx="16" fill="#0e1422" />
727
+ <g opacity={search}>
728
+ <rect x="318" y="120" width="146" height="40" rx="20" fill="#fffaf0" />
729
+ <circle cx="340" cy="140" r="8" fill="none" stroke="#5c4212" strokeWidth="3" />
730
+ <path d="M346 146 L354 154" stroke="#5c4212" strokeWidth="3" strokeLinecap="round" />
731
+ </g>
732
+ </svg>
733
+ );
734
+ }
735
+
736
+ export function ProofCard({ id, width }: { id: string; width: number }) {
737
+ const height = Math.round(width * 0.72);
738
+ return (
739
+ <svg width={width} height={height} viewBox="0 0 420 300">
740
+ <defs>
741
+ <linearGradient id={`${id}-proof`} x1="0" y1="0" x2="0" y2="1">
742
+ <stop offset="0" stopColor="#243044" />
743
+ <stop offset="1" stopColor="#151c2c" />
744
+ </linearGradient>
745
+ </defs>
746
+ <rect x="16" y="12" width="388" height="270" rx="22" fill={`url(#${id}-proof)`} />
747
+ <circle cx="70" cy="70" r="22" fill="none" stroke="#f0c14a" strokeWidth="5" />
748
+ <path d="M86 86 L104 104" stroke="#f0c14a" strokeWidth="5" strokeLinecap="round" />
749
+ <path d="M300 48 L320 70 L360 30" fill="none" stroke="#3dce8e" strokeWidth="8" strokeLinecap="round" />
750
+ <rect x="48" y="130" width="300" height="16" rx="8" fill="#3d4e6b" />
751
+ <rect x="48" y="166" width="240" height="16" rx="8" fill="#3d4e6b" />
752
+ <rect x="48" y="214" width="180" height="36" rx="18" fill="#102418" />
753
+ <text x="70" y="240" fill="#3dce8e" fontSize="20" fontFamily={sans} fontWeight="700">
754
+ Proof
755
+ </text>
756
+ </svg>
757
+ );
758
+ }
759
+
760
+ export function Funnel({ id, width }: { id: string; width: number }) {
761
+ const height = Math.round(width * 0.8);
762
+ return (
763
+ <svg width={width} height={height} viewBox="0 0 200 160">
764
+ <defs>
765
+ <linearGradient id={`${id}-fun`} x1="0" y1="0" x2="0" y2="1">
766
+ <stop offset="0" stopColor="#9ad0ff" />
767
+ <stop offset="1" stopColor="#3d6ea8" />
768
+ </linearGradient>
769
+ </defs>
770
+ <path d="M20 20 H180 L120 100 H80 Z" fill={`url(#${id}-fun)`} />
771
+ <rect x="86" y="100" width="28" height="36" fill="#3d6ea8" />
772
+ <circle cx="100" cy="148" r="8" fill="#f0c14a" />
773
+ </svg>
774
+ );
775
+ }
776
+
777
+ export function MiniBox({ id, width }: { id: string; width: number }) {
778
+ const height = Math.round(width * 0.7);
779
+ return (
780
+ <svg width={width} height={height} viewBox="0 0 200 140">
781
+ <rect x="10" y="28" width="180" height="84" rx="42" fill="#fffaf0" stroke="#b8882e" strokeWidth="4" />
782
+ <circle cx="48" cy="70" r="12" fill="none" stroke="#5c4212" strokeWidth="4" />
783
+ <path d="M57 79 L70 92" stroke="#5c4212" strokeWidth="4" strokeLinecap="round" />
784
+ <rect x="84" y="62" width="78" height="12" rx="6" fill="#e4bc52" />
785
+ </svg>
786
+ );
787
+ }
788
+
789
+ export function MiniList({ id, width }: { id: string; width: number }) {
790
+ const height = Math.round(width * 0.8);
791
+ return (
792
+ <svg width={width} height={height} viewBox="0 0 200 160">
793
+ <rect x="16" y="12" width="168" height="136" rx="16" fill="#fffaf0" />
794
+ {[0, 1, 2].map((row) => (
795
+ <rect key={row} x="32" y={32 + row * 36} width={120 - row * 16} height="16" rx="8" fill="#e4bc52" />
796
+ ))}
797
+ </svg>
798
+ );
799
+ }
800
+
801
+ export function AppPane({ id, locked, width }: { id: string; locked: boolean; width: number }) {
802
+ const height = Math.round(width * 0.85);
803
+ return (
804
+ <svg width={width} height={height} viewBox="0 0 300 255">
805
+ <defs>
806
+ <linearGradient id={`${id}-app`} x1="0" y1="0" x2="0" y2="1">
807
+ <stop offset="0" stopColor="#2c3850" />
808
+ <stop offset="1" stopColor="#151c2c" />
809
+ </linearGradient>
810
+ </defs>
811
+ <rect x="20" y="16" width="260" height="210" rx="20" fill={`url(#${id}-app)`} />
812
+ <rect x="40" y="70" width="220" height="120" rx="12" fill="#101622" />
813
+ <rect x="58" y="96" width="140" height="14" rx="7" fill="#3d4e6b" />
814
+ <rect x="58" y="122" width="100" height="14" rx="7" fill="#3d4e6b" />
815
+ {locked ? (
816
+ <g>
817
+ <rect x="188" y="40" width="46" height="36" rx="6" fill="#d5deee" />
818
+ <path d="M198 42 V30 a14 14 0 0 1 28 0 V42" fill="none" stroke="#f6f3ec" strokeWidth="5" />
819
+ </g>
820
+ ) : (
821
+ <circle cx="230" cy="52" r="16" fill="#3dce8e" />
822
+ )}
823
+ </svg>
824
+ );
825
+ }
826
+
827
+ export function GateArm({ id, open, blocked, width }: { id: string; open: number; blocked: boolean; width: number }) {
828
+ const height = Math.round(width * 0.7);
829
+ const angle = -78 * open;
830
+ return (
831
+ <svg width={width} height={height} viewBox="0 0 360 250">
832
+ <defs>
833
+ <linearGradient id={`${id}-post`} x1="0" y1="0" x2="1" y2="0">
834
+ <stop offset="0" stopColor="#d5deee" />
835
+ <stop offset="1" stopColor="#6d7890" />
836
+ </linearGradient>
837
+ </defs>
838
+ <rect x="36" y="40" width="28" height="190" rx="8" fill={`url(#${id}-post)`} />
839
+ <circle cx="50" cy="48" r="16" fill="#f0c14a" />
840
+ <g transform={`rotate(${angle} 50 70)`}>
841
+ <rect x="50" y="58" width="250" height="26" rx="8" fill={blocked ? "#d23b4e" : "#f0c14a"} />
842
+ {[0, 1, 2, 3, 4].map((bar) => (
843
+ <rect key={bar} x={80 + bar * 40} y="58" width="16" height="26" fill="#1b2436" opacity="0.35" />
844
+ ))}
845
+ </g>
846
+ </svg>
847
+ );
848
+ }
849
+
850
+ export function OfficialSeal({ id, width }: { id: string; width: number }) {
851
+ return (
852
+ <svg width={width} height={width} viewBox="0 0 160 160">
853
+ <defs>
854
+ <linearGradient id={`${id}-seal`} x1="0" y1="0" x2="0" y2="1">
855
+ <stop offset="0" stopColor="#ffe08a" />
856
+ <stop offset="1" stopColor="#c88812" />
857
+ </linearGradient>
858
+ </defs>
859
+ <circle cx="80" cy="80" r="70" fill={`url(#${id}-seal)`} />
860
+ <circle cx="80" cy="80" r="52" fill="none" stroke="#3a2a08" strokeWidth="4" />
861
+ <path d="M52 82 L72 102 L112 58" fill="none" stroke="#3a2a08" strokeWidth="10" strokeLinecap="round" />
862
+ </svg>
863
+ );
864
+ }
865
+
866
+ export function CrossStamp({ id, width }: { id: string; width: number }) {
867
+ return (
868
+ <svg width={width} height={width} viewBox="0 0 160 160">
869
+ <circle cx="80" cy="80" r="68" fill="#d23b4e" />
870
+ <path d="M48 48 L112 112 M112 48 L48 112" stroke="#fff6f7" strokeWidth="14" strokeLinecap="round" />
871
+ </svg>
872
+ );
873
+ }
874
+
875
+ export function ArrowShaft({ progress, x1, y1, x2, y2, color = "#f0c14a" }: { progress: number; x1: number; y1: number; x2: number; y2: number; color?: string }) {
876
+ const length = Math.hypot(x2 - x1, y2 - y1);
877
+ const angle = (Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI;
878
+ const drawn = Math.max(0, length * progress);
879
+ return (
880
+ <div style={{ position: "absolute", left: x1, top: y1, width: drawn, height: 10, background: color, borderRadius: 6, transformOrigin: "0 50%", rotate: `${angle}deg` }}>
881
+ {progress > 0.92 ? (
882
+ <div
883
+ style={{
884
+ position: "absolute",
885
+ right: -6,
886
+ top: -8,
887
+ width: 0,
888
+ height: 0,
889
+ borderTop: "13px solid transparent",
890
+ borderBottom: "13px solid transparent",
891
+ borderLeft: `20px solid ${color}`,
892
+ }}
893
+ />
894
+ ) : null}
895
+ </div>
896
+ );
897
+ }
898
+
899
+ export function Tag({ text, x, y }: { text: string; x: number; y: number }) {
900
+ return (
901
+ <div style={{ position: "absolute", left: x, top: y, color: "#c5cedf", fontSize: 28, fontWeight: 700, letterSpacing: 0.2 }}>{text}</div>
902
+ );
903
+ }
904
+
905
+ export function dim(amount: number): ReactNode {
906
+ return amount;
907
+ }