@rubytech/create-realagent-code 0.1.255 → 0.1.257

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 (217) hide show
  1. package/dist/__tests__/plugin-install.test.js +58 -40
  2. package/dist/index.js +77 -26
  3. package/dist/lib/plugin-install.js +31 -29
  4. package/package.json +1 -1
  5. package/payload/platform/config/brand-registry.json +8 -0
  6. package/payload/platform/config/brand.json +2 -2
  7. package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +12 -0
  8. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  9. package/payload/platform/lib/graph-write/dist/index.js +2 -0
  10. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  11. package/payload/platform/lib/graph-write/src/index.ts +2 -0
  12. package/payload/platform/neo4j/schema.cypher +126 -0
  13. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  14. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  15. package/payload/platform/plugins/admin/PLUGIN.md +3 -6
  16. package/payload/platform/plugins/admin/mcp/dist/index.js +0 -60
  17. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  18. package/payload/platform/plugins/admin/skills/insight/SKILL.md +24 -0
  19. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +63 -10
  20. package/payload/platform/plugins/business-assistant/PLUGIN.md +1 -1
  21. package/payload/platform/plugins/business-assistant/references/document-management.md +1 -1
  22. package/payload/platform/plugins/business-assistant/references/invoicing.md +2 -2
  23. package/payload/platform/plugins/business-assistant/references/quoting.md +1 -1
  24. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  25. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  26. package/payload/platform/plugins/docs/references/deployment.md +18 -5
  27. package/payload/platform/plugins/docs/references/memory-guide.md +4 -0
  28. package/payload/platform/plugins/docs/references/platform.md +1 -1
  29. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  30. package/payload/platform/plugins/docs/references/slides.md +31 -0
  31. package/payload/platform/plugins/docs/references/voice-mirror-guide.md +1 -1
  32. package/payload/platform/plugins/memory/PLUGIN.md +1 -1
  33. package/payload/platform/plugins/memory/mcp/dist/index.js +1 -1
  34. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  35. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +1 -1
  36. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +1 -1
  37. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  38. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +10 -0
  39. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  40. package/payload/platform/plugins/memory/references/schema-construction.md +72 -0
  41. package/payload/platform/plugins/slides/.claude-plugin/plugin.json +8 -0
  42. package/payload/platform/plugins/slides/LICENSE +21 -0
  43. package/payload/platform/plugins/slides/PLUGIN.md +18 -0
  44. package/payload/platform/plugins/slides/PROVENANCE.md +40 -0
  45. package/payload/platform/plugins/slides/commands/add-slide.md +29 -0
  46. package/payload/platform/plugins/slides/commands/slides-claus.md +39 -0
  47. package/payload/platform/plugins/slides/commands/slides-new-component.md +39 -0
  48. package/payload/platform/plugins/slides/commands/slides-outline.md +43 -0
  49. package/payload/platform/plugins/slides/commands/slides-review.md +52 -0
  50. package/payload/platform/plugins/slides/commands/slides-theme.md +64 -0
  51. package/payload/platform/plugins/slides/commands/slides.md +59 -0
  52. package/payload/platform/plugins/slides/skills/deck-system/REFERENCE.md +581 -0
  53. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +607 -0
  54. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-board.md +426 -0
  55. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-claus.md +185 -0
  56. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-mbb.md +450 -0
  57. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-product-launch.md +579 -0
  58. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sales.md +464 -0
  59. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sequoia.md +489 -0
  60. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING.md +273 -0
  61. package/payload/platform/plugins/slides/skills/deck-system/deck-craft.html +1371 -0
  62. package/payload/platform/plugins/slides/skills/deck-system/deck-solid.html +1667 -0
  63. package/payload/platform/plugins/slides/skills/deck-system/deck.html +1359 -0
  64. package/payload/platform/plugins/url-get/.claude-plugin/plugin.json +1 -1
  65. package/payload/platform/plugins/url-get/PLUGIN.md +26 -21
  66. package/payload/platform/plugins/url-get/mcp/dist/index.js +3 -3
  67. package/payload/platform/plugins/url-get/mcp/dist/index.js.map +1 -1
  68. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts +1 -2
  69. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts.map +1 -1
  70. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +20 -40
  71. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  72. package/payload/platform/scripts/setup-account.sh +1 -10
  73. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  74. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -1
  75. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  76. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
  77. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  78. package/payload/platform/services/claude-session-manager/dist/http-server.js +32 -2
  79. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  80. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +2 -2
  81. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  82. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  83. package/payload/platform/templates/specialists/agents/typed-edge-classifier.md +1 -1
  84. package/payload/server/public/assets/AdminShell-T-YknnBn.js +1 -0
  85. package/payload/server/public/assets/Checkbox-DmDxpqVv.js +1 -0
  86. package/payload/server/public/assets/admin-COUV-jgt.js +1 -0
  87. package/payload/server/public/assets/{arc-aUiRP9AS.js → arc-B2CweJq3.js} +1 -1
  88. package/payload/server/public/assets/architecture-YZFGNWBL-Dnn6Hc65.js +1 -0
  89. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-c09loTER.js → architectureDiagram-Q4EWVU46-DP2o-MFV.js} +1 -1
  90. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cjdeyoq1.js → blockDiagram-DXYQGD6D-DO4mcYDJ.js} +1 -1
  91. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-NY6Wlzo2.js → c4Diagram-AHTNJAMY-Sy1giHbj.js} +1 -1
  92. package/payload/server/public/assets/channel-CEpR_0rE.js +1 -0
  93. package/payload/server/public/assets/{chunk-2KRD3SAO-BK3470lx.js → chunk-2KRD3SAO-CKsCYCsN.js} +1 -1
  94. package/payload/server/public/assets/chunk-336JU56O-C0-P-aUF.js +2 -0
  95. package/payload/server/public/assets/chunk-426QAEUC-DFjEt3Zb.js +1 -0
  96. package/payload/server/public/assets/{chunk-4BX2VUAB-BOvVdJLf.js → chunk-4BX2VUAB-B8bqAmBa.js} +1 -1
  97. package/payload/server/public/assets/{chunk-4TB4RGXK-BXpto3yW.js → chunk-4TB4RGXK-D1k0VSlW.js} +1 -1
  98. package/payload/server/public/assets/{chunk-55IACEB6-BwZyF7vR.js → chunk-55IACEB6-B-p_QNqz.js} +1 -1
  99. package/payload/server/public/assets/{chunk-5FUZZQ4R-C403gCUk.js → chunk-5FUZZQ4R-D6U6tV_j.js} +1 -1
  100. package/payload/server/public/assets/{chunk-5PVQY5BW-CjVzXQEp.js → chunk-5PVQY5BW-CYK76xfs.js} +1 -1
  101. package/payload/server/public/assets/{chunk-67CJDMHE-D5bhMrtY.js → chunk-67CJDMHE-BC9js-lf.js} +1 -1
  102. package/payload/server/public/assets/{chunk-7N4EOEYR-Si7Lgrwc.js → chunk-7N4EOEYR-4j2OqKkv.js} +1 -1
  103. package/payload/server/public/assets/{chunk-AA7GKIK3-DMuHtDqO.js → chunk-AA7GKIK3-Coen-fXN.js} +1 -1
  104. package/payload/server/public/assets/{chunk-BSJP7CBP-L79XKVcb.js → chunk-BSJP7CBP-CAiOBvec.js} +1 -1
  105. package/payload/server/public/assets/{chunk-CIAEETIT-C0O7Upmg.js → chunk-CIAEETIT-AJzzpZVb.js} +1 -1
  106. package/payload/server/public/assets/{chunk-EDXVE4YY-DJcJAsAg.js → chunk-EDXVE4YY-BL4BKozX.js} +1 -1
  107. package/payload/server/public/assets/{chunk-ENJZ2VHE-CFDNvYu1.js → chunk-ENJZ2VHE-mhAFG8UD.js} +1 -1
  108. package/payload/server/public/assets/{chunk-FMBD7UC4-C_E43NFJ.js → chunk-FMBD7UC4-H231gZA_.js} +1 -1
  109. package/payload/server/public/assets/{chunk-FOC6F5B3-D9lWWHAu.js → chunk-FOC6F5B3-Cl3ZZjYG.js} +1 -1
  110. package/payload/server/public/assets/{chunk-ICPOFSXX-ecLOxGhL.js → chunk-ICPOFSXX-DOEzvzJa.js} +2 -2
  111. package/payload/server/public/assets/{chunk-K5T4RW27-DuhsNH4c.js → chunk-K5T4RW27-C_ipbUDD.js} +1 -1
  112. package/payload/server/public/assets/{chunk-KGLVRYIC-B4-A1Abi.js → chunk-KGLVRYIC-CTsDNSCU.js} +1 -1
  113. package/payload/server/public/assets/{chunk-LIHQZDEY-BxqgHRgT.js → chunk-LIHQZDEY-DvSXhkGf.js} +1 -1
  114. package/payload/server/public/assets/{chunk-ORNJ4GCN-DEYQ5WaJ.js → chunk-ORNJ4GCN-p574NOI7.js} +1 -1
  115. package/payload/server/public/assets/{chunk-OYMX7WX6-B7MW66KB.js → chunk-OYMX7WX6-BlEgFM6U.js} +1 -1
  116. package/payload/server/public/assets/chunk-QZHKN3VN-DpF06ZZQ.js +1 -0
  117. package/payload/server/public/assets/{chunk-U2HBQHQK-BMawmsyk.js → chunk-U2HBQHQK-B2bDK0jv.js} +1 -1
  118. package/payload/server/public/assets/{chunk-X2U36JSP-CT6g7pno.js → chunk-X2U36JSP-D69BxKFw.js} +1 -1
  119. package/payload/server/public/assets/{chunk-XPW4576I-CBfZXZDB.js → chunk-XPW4576I-Dm-PcyUi.js} +1 -1
  120. package/payload/server/public/assets/{chunk-YZCP3GAM-xeAluiAH.js → chunk-YZCP3GAM-Be8RnXgx.js} +1 -1
  121. package/payload/server/public/assets/{chunk-ZZ45TVLE-BRN9qUC5.js → chunk-ZZ45TVLE-Ck8PCTa4.js} +1 -1
  122. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CYbXvKLI.js +1 -0
  123. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DEyHzRhq.js +1 -0
  124. package/payload/server/public/assets/clone-y8gexbBy.js +1 -0
  125. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Br2gjtEO.js → cose-bilkent-S5V4N54A-CmkW2Eaj.js} +1 -1
  126. package/payload/server/public/assets/{dagre-DTjePoco.js → dagre-Dqp-ns8F.js} +1 -1
  127. package/payload/server/public/assets/{dagre-KV5264BT-DHBkRke4.js → dagre-KV5264BT-ZgWWXPLc.js} +1 -1
  128. package/payload/server/public/assets/data-gy6QH9c1.js +1 -0
  129. package/payload/server/public/assets/{diagram-5BDNPKRD-BIq1-idL.js → diagram-5BDNPKRD-CTX5-ScM.js} +1 -1
  130. package/payload/server/public/assets/{diagram-G4DWMVQ6-BsIUDzV6.js → diagram-G4DWMVQ6-BovIsO6H.js} +1 -1
  131. package/payload/server/public/assets/{diagram-MMDJMWI5-CgHSri2i.js → diagram-MMDJMWI5-DcETsQy-.js} +1 -1
  132. package/payload/server/public/assets/{diagram-TYMM5635-Ce2Wh9ZX.js → diagram-TYMM5635-yyq6peoZ.js} +1 -1
  133. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BU0Kh6OQ.js → erDiagram-SMLLAGMA-CiNToftB.js} +1 -1
  134. package/payload/server/public/assets/{flatten-Bo6YRmWl.js → flatten-BtFI066E.js} +1 -1
  135. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-B0N06MF7.js → flowDiagram-DWJPFMVM-Xnl3SpIM.js} +1 -1
  136. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BVbx4ARZ.js → ganttDiagram-T4ZO3ILL-C1iyWe0f.js} +1 -1
  137. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CNs-LD5i.js +1 -0
  138. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C-xRJ94t.js → gitGraphDiagram-UUTBAWPF-D97pbMQb.js} +1 -1
  139. package/payload/server/public/assets/graph-labels-cZu4pK16.js +1 -0
  140. package/payload/server/public/assets/{graph-g48ZcA5M.js → graph-qz5tFKqU.js} +3 -3
  141. package/payload/server/public/assets/{graphlib-YmNcoMjY.js → graphlib-Lq8ijgON.js} +1 -1
  142. package/payload/server/public/assets/info-OMHHGYJF-DsTNigSS.js +1 -0
  143. package/payload/server/public/assets/infoDiagram-42DDH7IO-C_OarRTA.js +2 -0
  144. package/payload/server/public/assets/{isEmpty-D6Kr-M1M.js → isEmpty-D6QovjYR.js} +1 -1
  145. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DTrq54yC.js → ishikawaDiagram-UXIWVN3A-B8XBdjJn.js} +1 -1
  146. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-OZZZMrFX.js → journeyDiagram-VCZTEJTY-CZYbiOaQ.js} +1 -1
  147. package/payload/server/public/assets/{kanban-definition-6JOO6SKY--w-IP9pN.js → kanban-definition-6JOO6SKY-B1PybFoh.js} +1 -1
  148. package/payload/server/public/assets/{line-Ckeulv5T.js → line-D-tw3hHp.js} +1 -1
  149. package/payload/server/public/assets/{linear-DOh_6k2k.js → linear-BHhXD3cd.js} +1 -1
  150. package/payload/server/public/assets/{mermaid-parser.core-CVRAxYRD.js → mermaid-parser.core-C9RAnysF.js} +2 -2
  151. package/payload/server/public/assets/{mermaid.core-B-mE18I1.js → mermaid.core-B532LT1r.js} +3 -3
  152. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Bm8mDicL.js → mindmap-definition-QFDTVHPH-DGlgeeTV.js} +1 -1
  153. package/payload/server/public/assets/{ordinal-BDi6f4xk.js → ordinal-Bl-aM5b9.js} +1 -1
  154. package/payload/server/public/assets/packet-4T2RLAQJ-DGES22b-.js +1 -0
  155. package/payload/server/public/assets/pie-ZZUOXDRM-ChKeDbzt.js +1 -0
  156. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BCmRLgGO.js → pieDiagram-DEJITSTG-DV9FIWko.js} +1 -1
  157. package/payload/server/public/assets/{public-DknO-g9S.js → public-Bu2_Xi0a.js} +5 -5
  158. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CniTIUTm.js → quadrantDiagram-34T5L4WZ-Betwya4l.js} +1 -1
  159. package/payload/server/public/assets/radar-PYXPWWZC-FGG5Fs7N.js +1 -0
  160. package/payload/server/public/assets/{reduce-CGi9ik8i.js → reduce-BD4xUd2c.js} +1 -1
  161. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CoxBSj9M.js → requirementDiagram-MS252O5E-Cq3vODdg.js} +1 -1
  162. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BjS-4jzq.js → sankeyDiagram-XADWPNL6-x8krXWcS.js} +1 -1
  163. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B9jVOnPR.js → sequenceDiagram-FGHM5R23-i-_uH-Yl.js} +1 -1
  164. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BvOQPzP8.js → stateDiagram-FHFEXIEX-il4KqSgI.js} +1 -1
  165. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B6zNJ6Tv.js +1 -0
  166. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CdfgWLo1.js → timeline-definition-GMOUNBTQ-DATdZkA5.js} +1 -1
  167. package/payload/server/public/assets/treeView-SZITEDCU-VAQQdbtf.js +1 -0
  168. package/payload/server/public/assets/treemap-W4RFUUIX-DKchO3zI.js +1 -0
  169. package/payload/server/public/assets/useSelectionMode-A5KItZ2T.js +13 -0
  170. package/payload/server/public/assets/{brand-D0gNihp7.css → useSelectionMode-C-Ojh7W9.css} +1 -1
  171. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-JCgpIbj-.js → vennDiagram-DHZGUBPP-BJh9tJTt.js} +1 -1
  172. package/payload/server/public/assets/wardley-RL74JXVD-CBGtx0bS.js +1 -0
  173. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Dei3VqHo.js → wardleyDiagram-NUSXRM2D-EMN1Hdfg.js} +1 -1
  174. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DUtIyoIb.js → xychartDiagram-5P7HB3ND-DbUWXa7T.js} +1 -1
  175. package/payload/server/public/data.html +5 -5
  176. package/payload/server/public/graph.html +6 -6
  177. package/payload/server/public/index.html +5 -6
  178. package/payload/server/public/public.html +4 -5
  179. package/payload/server/server.js +65 -23
  180. package/payload/platform/plugins/admin/hooks/__tests__/insight.test.sh +0 -395
  181. package/payload/platform/plugins/admin/hooks/insight.sh +0 -219
  182. package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +0 -239
  183. package/payload/server/public/assets/AdminShell-892Jy_rs.js +0 -1
  184. package/payload/server/public/assets/Checkbox-Bc2QzX9b.js +0 -1
  185. package/payload/server/public/assets/admin-D3K13ndi.js +0 -1
  186. package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +0 -1
  187. package/payload/server/public/assets/brand-CcN3dELF.js +0 -9
  188. package/payload/server/public/assets/channel-B1IT7to2.js +0 -1
  189. package/payload/server/public/assets/chunk-336JU56O-CdKRCIeE.js +0 -2
  190. package/payload/server/public/assets/chunk-426QAEUC-BybuQ3Ve.js +0 -1
  191. package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +0 -1
  192. package/payload/server/public/assets/classDiagram-6PBFFD2Q-rjCize6i.js +0 -1
  193. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BORWOUt0.js +0 -1
  194. package/payload/server/public/assets/clone-Csqv5U6T.js +0 -1
  195. package/payload/server/public/assets/data-Br-pdljK.js +0 -1
  196. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +0 -1
  197. package/payload/server/public/assets/graph-labels-BYH-IPCb.js +0 -1
  198. package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +0 -1
  199. package/payload/server/public/assets/infoDiagram-42DDH7IO-Di6oPQ_-.js +0 -2
  200. package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +0 -1
  201. package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +0 -1
  202. package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +0 -1
  203. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-v4ND10uR.js +0 -1
  204. package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +0 -1
  205. package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +0 -1
  206. package/payload/server/public/assets/useSelectionMode-DwsyptOw.js +0 -5
  207. package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +0 -1
  208. /package/payload/server/public/assets/{_baseFor-Cam2PbSt.js → _baseFor-Cs8Y-rGh.js} +0 -0
  209. /package/payload/server/public/assets/{array-DYRGGQae.js → array-iHZP4KWJ.js} +0 -0
  210. /package/payload/server/public/assets/{cytoscape.esm-nWsJMTNI.js → cytoscape.esm-BR2GOQ8_.js} +0 -0
  211. /package/payload/server/public/assets/{defaultLocale-Du1XY3Dp.js → defaultLocale-B9aLeOTg.js} +0 -0
  212. /package/payload/server/public/assets/{dist-BzAsli7o.js → dist-DB-VPj_8.js} +0 -0
  213. /package/payload/server/public/assets/{init-B5BXBRcm.js → init-BNFRgqHM.js} +0 -0
  214. /package/payload/server/public/assets/{katex-HOUACuRw.js → katex-B-EfS3nw.js} +0 -0
  215. /package/payload/server/public/assets/{path-CNO468J-.js → path-DmWWdwp7.js} +0 -0
  216. /package/payload/server/public/assets/{rough.esm-DRO6hWPh.js → rough.esm-Ci7Kjt46.js} +0 -0
  217. /package/payload/server/public/assets/{src-CWiyyVfn.js → src-C1jfwBq0.js} +0 -0
@@ -0,0 +1,1359 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Deck</title>
7
+ <!--
8
+ ============================================================
9
+ HOW TO USE THIS TEMPLATE
10
+
11
+ - Each slide is a <section class="slide">
12
+ - Add as many slides as you need by copying any section below
13
+ - Navigate with arrow keys, space, swipe, or the on-screen buttons
14
+ - Press P or click the button to download as PDF
15
+ - Drop images and videos into media/ and reference with relative paths
16
+
17
+ COMPONENT INDEX
18
+ 1. Cover slide
19
+ 2. Quote slide (bold statement)
20
+ 3. Eyebrow + Headline + Subtitle (default text slide)
21
+ 4. Two-column (any side-by-side comparison)
22
+ 4b. Two-column step stack (sequential steps with status)
23
+ 5. Three-column (structural breakdown)
24
+ 6. Capability list (Q&A rows)
25
+ 7. Dark callout (one per deck max)
26
+ 8. Dot flow (process / pipeline)
27
+ 9. Stack grid (categories / tools / partners)
28
+ 10. Spec block + context + outputs (input → process → output)
29
+ 11. Product slide (showcase style)
30
+ 12. Collage slide (full-bleed media)
31
+ 13. JEDUF three-column comparison (two extremes + middle path)
32
+ 14. Timeline (vertical, year-based)
33
+ 15. Stat grid (big numbers with context)
34
+ 16. Quote pair (two perspectives side by side)
35
+ 17. Logo grid (partners / clients / team)
36
+ 18. Code slide (syntax-highlighted code block)
37
+ 19. Dark slide (emphasis / pivot moment)
38
+ 20. Closing slide
39
+ 21. Thanks slide
40
+
41
+ STORYTELLING STRUCTURE (six beats)
42
+ Open → Act 1 (The World Before) → Act 2 (The Turn) →
43
+ Act 3 (The Evidence) → Act 4 (The Honest Part) → Close
44
+
45
+ Works for any format: talks, pitches, strategy decks,
46
+ product launches, team updates, investor presentations.
47
+
48
+ THE HEADLINE PATTERN
49
+ Bold-then-dim. Anchor + extension.
50
+ <h1>Headline. <span class="dim">Continuation.</span></h1>
51
+
52
+ TONE
53
+ No em-dashes in body copy. Use periods or shorter sentences.
54
+ Bold the keyword. Dim the rest.
55
+ Specific numbers beat vague claims.
56
+
57
+ See docs/USING.md, docs/STORYTELLING.md, and docs/DESIGN.md for more.
58
+ AI agents: see AGENTS.md for full component reference and instructions.
59
+ ============================================================
60
+ -->
61
+ <style>
62
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap');
63
+
64
+ * { margin: 0; padding: 0; box-sizing: border-box; }
65
+
66
+ html, body {
67
+ width: 100%;
68
+ height: 100%;
69
+ overflow: hidden;
70
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
71
+ background: #f5f5f3;
72
+ color: #1a1a1a;
73
+ -webkit-font-smoothing: antialiased;
74
+ }
75
+
76
+ .deck {
77
+ width: 100vw;
78
+ height: 100vh;
79
+ position: relative;
80
+ }
81
+
82
+ .slide {
83
+ position: absolute;
84
+ inset: 0;
85
+ display: none;
86
+ align-items: center;
87
+ justify-content: center;
88
+ padding: 6vh 8vw;
89
+ }
90
+
91
+ .slide.active { display: flex; }
92
+
93
+ .slide-inner {
94
+ width: 100%;
95
+ max-width: 1100px;
96
+ }
97
+
98
+ /* --- Typography --- */
99
+ .eyebrow {
100
+ font-size: 0.75rem;
101
+ font-weight: 500;
102
+ text-transform: uppercase;
103
+ letter-spacing: 0.1em;
104
+ color: #a0a09a;
105
+ margin-bottom: 1.5rem;
106
+ }
107
+
108
+ h1 {
109
+ font-size: clamp(2.5rem, 6vw, 5rem);
110
+ font-weight: 500;
111
+ line-height: 1.1;
112
+ letter-spacing: -0.035em;
113
+ margin-bottom: 1.5rem;
114
+ }
115
+
116
+ h1 span.dim, h2 span.dim, h3 span.dim {
117
+ color: #b5b5b0;
118
+ font-weight: 300;
119
+ }
120
+
121
+ h2 {
122
+ font-size: clamp(1.75rem, 3.5vw, 2.6rem);
123
+ font-weight: 500;
124
+ line-height: 1.2;
125
+ letter-spacing: -0.025em;
126
+ margin-bottom: 1.25rem;
127
+ }
128
+
129
+ .subtitle {
130
+ font-size: clamp(1rem, 1.4vw, 1.25rem);
131
+ color: #a0a09a;
132
+ font-weight: 400;
133
+ line-height: 1.5;
134
+ max-width: 720px;
135
+ }
136
+
137
+ .meta {
138
+ font-size: 0.85rem;
139
+ color: #a0a09a;
140
+ font-weight: 400;
141
+ margin-top: 3rem;
142
+ letter-spacing: 0.02em;
143
+ }
144
+
145
+ /* --- Quote slide --- */
146
+ .quote-slide h1 {
147
+ font-size: clamp(3rem, 7vw, 6.5rem);
148
+ line-height: 1.05;
149
+ letter-spacing: -0.045em;
150
+ }
151
+
152
+ /* --- Two col --- */
153
+ .two-col {
154
+ display: grid;
155
+ grid-template-columns: 1fr 1fr;
156
+ gap: 4rem;
157
+ align-items: center;
158
+ }
159
+
160
+ .two-col h3 {
161
+ font-size: 1rem;
162
+ font-weight: 500;
163
+ margin-bottom: 0.5rem;
164
+ }
165
+
166
+ .two-col p {
167
+ font-size: 0.95rem;
168
+ color: #a0a09a;
169
+ line-height: 1.6;
170
+ }
171
+
172
+ .col-stack > * + * { margin-top: 0.6rem; }
173
+
174
+ .step {
175
+ font-size: clamp(0.95rem, 1.3vw, 1.15rem);
176
+ color: #1a1a1a;
177
+ font-weight: 400;
178
+ padding: 0.4rem 0;
179
+ border-top: 1px solid #d5d5d0;
180
+ letter-spacing: -0.005em;
181
+ }
182
+
183
+ .step:first-child { border-top: none; padding-top: 0; }
184
+ .step.dim { color: #b5b5b0; }
185
+ .step.kill { color: #1a1a1a; font-weight: 500; }
186
+ .step.kill::before { content: '×'; margin-right: 0.5rem; }
187
+ .step.live { color: #1a1a1a; font-weight: 500; }
188
+ .step.live::before { content: '✓'; margin-right: 0.5rem; }
189
+
190
+ /* --- Three col --- */
191
+ .three-col {
192
+ display: grid;
193
+ grid-template-columns: repeat(3, 1fr);
194
+ gap: 2.5rem;
195
+ }
196
+
197
+ .three-col h3 {
198
+ font-size: 0.95rem;
199
+ font-weight: 500;
200
+ margin-bottom: 0.4rem;
201
+ }
202
+
203
+ .three-col p {
204
+ font-size: 0.85rem;
205
+ color: #a0a09a;
206
+ line-height: 1.6;
207
+ }
208
+
209
+ /* --- Capability list (Q&A) --- */
210
+ .cap-list { display: flex; flex-direction: column; }
211
+
212
+ .cap-row {
213
+ display: grid;
214
+ grid-template-columns: 1fr 1fr;
215
+ gap: 3rem;
216
+ padding: 1.1rem 0;
217
+ border-top: 1px solid #e0e0db;
218
+ align-items: baseline;
219
+ }
220
+
221
+ .cap-row:last-child { border-bottom: 1px solid #e0e0db; }
222
+ .cap-q { font-size: 1rem; font-weight: 500; }
223
+ .cap-a { font-size: 0.9rem; color: #a0a09a; line-height: 1.55; }
224
+
225
+ /* --- Callout --- */
226
+ .callout {
227
+ background: #1a1a1a;
228
+ color: #f5f5f3;
229
+ border-radius: 10px;
230
+ padding: 2rem 2.5rem;
231
+ }
232
+
233
+ .callout h3 {
234
+ font-size: 0.7rem;
235
+ text-transform: uppercase;
236
+ letter-spacing: 0.08em;
237
+ color: #888;
238
+ margin-bottom: 0.6rem;
239
+ font-weight: 500;
240
+ }
241
+
242
+ .callout p {
243
+ font-size: 1rem;
244
+ line-height: 1.55;
245
+ color: #ccc;
246
+ }
247
+
248
+ .callout p strong { color: #f5f5f3; font-weight: 500; }
249
+
250
+ /* --- Dot flow --- */
251
+ .dot-flow {
252
+ display: grid;
253
+ grid-template-columns: repeat(5, 1fr);
254
+ margin: 2.5rem 0;
255
+ position: relative;
256
+ }
257
+
258
+ .dot-flow::before {
259
+ content: '';
260
+ position: absolute;
261
+ top: 4px;
262
+ left: 8%;
263
+ right: 8%;
264
+ height: 1px;
265
+ background: #d5d5d0;
266
+ }
267
+
268
+ .dot-step { text-align: center; }
269
+
270
+ .dot-step .dot {
271
+ width: 9px;
272
+ height: 9px;
273
+ border-radius: 50%;
274
+ background: #1a1a1a;
275
+ margin: 0 auto 0.85rem;
276
+ position: relative;
277
+ z-index: 1;
278
+ }
279
+
280
+ .dot-step h4 { font-size: 0.85rem; font-weight: 500; margin-bottom: 0.25rem; }
281
+ .dot-step p { font-size: 0.72rem; color: #a0a09a; line-height: 1.4; padding: 0 0.5rem; }
282
+
283
+ /* --- Stack grid --- */
284
+ .stack-grid {
285
+ display: grid;
286
+ grid-template-columns: repeat(4, 1fr);
287
+ gap: 1rem;
288
+ margin-top: 2rem;
289
+ }
290
+
291
+ .stack-card {
292
+ border: 1px solid #e0e0db;
293
+ border-radius: 10px;
294
+ padding: 1.1rem 1.1rem 1.25rem;
295
+ background: #fafaf8;
296
+ }
297
+
298
+ .stack-card-label {
299
+ font-size: 0.6rem;
300
+ font-weight: 500;
301
+ text-transform: uppercase;
302
+ letter-spacing: 0.08em;
303
+ color: #a0a09a;
304
+ margin-bottom: 0.85rem;
305
+ }
306
+
307
+ .stack-tool {
308
+ display: flex;
309
+ align-items: center;
310
+ gap: 0.5rem;
311
+ font-size: 0.95rem;
312
+ font-weight: 500;
313
+ padding: 0.25rem 0;
314
+ }
315
+
316
+ .stack-tool .mark {
317
+ width: 14px;
318
+ height: 14px;
319
+ background: #1a1a1a;
320
+ border-radius: 2px;
321
+ flex-shrink: 0;
322
+ }
323
+
324
+ /* --- Spec flow --- */
325
+ .spec-flow {
326
+ display: flex;
327
+ flex-direction: column;
328
+ gap: 1rem;
329
+ margin-top: 2rem;
330
+ }
331
+
332
+ .spec-block {
333
+ background: #1a1a1a;
334
+ color: #f5f5f3;
335
+ border-radius: 10px;
336
+ padding: 1.1rem 1.5rem;
337
+ display: flex;
338
+ align-items: center;
339
+ justify-content: space-between;
340
+ }
341
+
342
+ .spec-block h4 { font-size: 1rem; font-weight: 500; }
343
+ .spec-block p { font-size: 0.8rem; color: #888; font-weight: 300; }
344
+
345
+ .ctx-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
346
+
347
+ .ctx-label {
348
+ font-size: 0.7rem;
349
+ color: #c5c5c0;
350
+ margin-right: 0.4rem;
351
+ font-style: italic;
352
+ }
353
+
354
+ .ctx-pill {
355
+ font-size: 0.72rem;
356
+ color: #a0a09a;
357
+ background: #eeeee9;
358
+ border-radius: 100px;
359
+ padding: 0.3rem 0.85rem;
360
+ }
361
+
362
+ .ai-divider { display: flex; align-items: center; gap: 1rem; }
363
+ .ai-divider .line { flex: 1; height: 1px; background: #d5d5d0; }
364
+
365
+ .ai-pill {
366
+ font-size: 0.65rem;
367
+ font-weight: 500;
368
+ color: #a0a09a;
369
+ letter-spacing: 0.06em;
370
+ text-transform: uppercase;
371
+ }
372
+
373
+ .outputs-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; }
374
+
375
+ .output-card {
376
+ border: 1px solid #e0e0db;
377
+ border-radius: 10px;
378
+ padding: 1rem 1.1rem;
379
+ background: #fff;
380
+ }
381
+
382
+ .output-card h5 { font-size: 0.9rem; font-weight: 500; margin-bottom: 0.2rem; }
383
+ .output-card p { font-size: 0.72rem; color: #a0a09a; line-height: 1.45; }
384
+
385
+ /* --- Product slide (showcase style) --- */
386
+ .product-row {
387
+ display: grid;
388
+ grid-template-columns: 1fr auto;
389
+ gap: 4rem;
390
+ align-items: center;
391
+ }
392
+
393
+ .product-meta { max-width: 460px; }
394
+ .product-num { font-size: 0.75rem; color: #a0a09a; margin-bottom: 1.25rem; letter-spacing: 0.04em; }
395
+ .product-tag { font-size: 0.85rem; font-weight: 500; margin-bottom: 0.75rem; }
396
+
397
+ .product-headline {
398
+ font-size: clamp(1.4rem, 2.4vw, 2rem);
399
+ font-weight: 500;
400
+ line-height: 1.25;
401
+ letter-spacing: -0.02em;
402
+ margin-bottom: 1rem;
403
+ }
404
+
405
+ .product-desc {
406
+ font-size: clamp(0.95rem, 1.2vw, 1.05rem);
407
+ color: #6a6a66;
408
+ line-height: 1.55;
409
+ margin-bottom: 1.5rem;
410
+ }
411
+
412
+ .product-stat { font-size: 0.8rem; color: #a0a09a; }
413
+
414
+ .product-name {
415
+ font-size: clamp(4rem, 9vw, 8rem);
416
+ font-weight: 500;
417
+ letter-spacing: -0.045em;
418
+ line-height: 0.95;
419
+ text-align: right;
420
+ }
421
+
422
+ .product-name sup {
423
+ font-size: 0.25em;
424
+ font-weight: 400;
425
+ color: #b5b5b0;
426
+ vertical-align: super;
427
+ margin-left: 0.1em;
428
+ }
429
+
430
+ /* --- Collage slide --- */
431
+ .slide.collage-slide {
432
+ background: #f5f5f3;
433
+ padding: 4vh 4vw;
434
+ }
435
+
436
+ .collage {
437
+ border-radius: 8px;
438
+ overflow: hidden;
439
+ box-shadow: 0 30px 80px rgba(0,0,0,0.15);
440
+ display: flex;
441
+ align-items: center;
442
+ justify-content: center;
443
+ line-height: 0;
444
+ }
445
+
446
+ .collage img,
447
+ .collage video {
448
+ max-height: 92vh;
449
+ max-width: 90vw;
450
+ height: auto;
451
+ width: auto;
452
+ display: block;
453
+ }
454
+
455
+ .collage .placeholder {
456
+ color: #b5b5b0;
457
+ font-size: 0.85rem;
458
+ letter-spacing: 0.04em;
459
+ text-transform: uppercase;
460
+ padding: 4rem;
461
+ text-align: center;
462
+ background: #eeeee9;
463
+ aspect-ratio: 3 / 4;
464
+ height: 92vh;
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ }
469
+
470
+ /* --- JEDUF three-column comparison --- */
471
+ .jeduf {
472
+ display: grid;
473
+ grid-template-columns: 1fr 1.15fr 1fr;
474
+ gap: 1rem;
475
+ margin-top: 1.5rem;
476
+ }
477
+
478
+ .jeduf-col {
479
+ border: 1px solid #e0e0db;
480
+ border-radius: 10px;
481
+ padding: 1.25rem 1.1rem 1.5rem;
482
+ background: #fafaf8;
483
+ display: flex;
484
+ flex-direction: column;
485
+ }
486
+
487
+ .jeduf-col.hero {
488
+ background: #1a1a1a;
489
+ color: #f5f5f3;
490
+ border-color: #1a1a1a;
491
+ }
492
+
493
+ .jeduf-label {
494
+ font-size: 0.6rem;
495
+ font-weight: 500;
496
+ text-transform: uppercase;
497
+ letter-spacing: 0.08em;
498
+ color: #a0a09a;
499
+ margin-bottom: 0.4rem;
500
+ }
501
+
502
+ .jeduf-col.hero .jeduf-label { color: #888; }
503
+ .jeduf-title { font-size: 1rem; font-weight: 500; margin-bottom: 0.35rem; }
504
+
505
+ .jeduf-philosophy {
506
+ font-size: 0.7rem;
507
+ color: #a0a09a;
508
+ font-style: italic;
509
+ margin-bottom: 1rem;
510
+ line-height: 1.5;
511
+ min-height: 30pt;
512
+ }
513
+
514
+ .jeduf-col.hero .jeduf-philosophy { color: #ccc; }
515
+
516
+ .jeduf-step {
517
+ border: 1px solid #d5d5d0;
518
+ border-radius: 4px;
519
+ padding: 0.4rem 0.6rem;
520
+ font-size: 0.72rem;
521
+ font-weight: 500;
522
+ text-align: center;
523
+ background: #fff;
524
+ margin-bottom: 0.35rem;
525
+ }
526
+
527
+ .jeduf-col.hero .jeduf-step {
528
+ background: #2a2a2a;
529
+ border-color: #3a3a3a;
530
+ color: #f5f5f3;
531
+ }
532
+
533
+ /* --- Timeline --- */
534
+ .timeline {
535
+ display: flex;
536
+ flex-direction: column;
537
+ margin-top: 2rem;
538
+ }
539
+
540
+ .timeline-row {
541
+ display: grid;
542
+ grid-template-columns: 120px 24px 1fr;
543
+ gap: 0 1.5rem;
544
+ align-items: start;
545
+ }
546
+
547
+ .timeline-year {
548
+ font-size: 0.85rem;
549
+ font-weight: 500;
550
+ text-align: right;
551
+ padding-top: 1.1rem;
552
+ color: #1a1a1a;
553
+ }
554
+
555
+ .timeline-track {
556
+ display: flex;
557
+ flex-direction: column;
558
+ align-items: center;
559
+ position: relative;
560
+ height: 100%;
561
+ }
562
+
563
+ .timeline-dot {
564
+ width: 9px;
565
+ height: 9px;
566
+ border-radius: 50%;
567
+ background: #1a1a1a;
568
+ margin-top: 1.25rem;
569
+ flex-shrink: 0;
570
+ position: relative;
571
+ z-index: 1;
572
+ }
573
+
574
+ .timeline-line {
575
+ width: 1px;
576
+ flex: 1;
577
+ background: #d5d5d0;
578
+ }
579
+
580
+ .timeline-row:last-child .timeline-line { display: none; }
581
+
582
+ .timeline-content {
583
+ padding: 1rem 0 2rem;
584
+ }
585
+
586
+ .timeline-content h4 {
587
+ font-size: 0.95rem;
588
+ font-weight: 500;
589
+ margin-bottom: 0.25rem;
590
+ }
591
+
592
+ .timeline-content p {
593
+ font-size: 0.82rem;
594
+ color: #a0a09a;
595
+ line-height: 1.55;
596
+ }
597
+
598
+ /* --- Stat grid --- */
599
+ .stat-grid {
600
+ display: grid;
601
+ grid-template-columns: repeat(3, 1fr);
602
+ gap: 1.5rem;
603
+ margin-top: 2rem;
604
+ }
605
+
606
+ .stat-card {
607
+ border: 1px solid #e0e0db;
608
+ border-radius: 10px;
609
+ padding: 1.5rem 1.4rem;
610
+ background: #fafaf8;
611
+ }
612
+
613
+ .stat-card.stat-dark {
614
+ background: #1a1a1a;
615
+ border-color: #1a1a1a;
616
+ color: #f5f5f3;
617
+ }
618
+
619
+ .stat-number {
620
+ font-size: clamp(2.4rem, 4.5vw, 3.5rem);
621
+ font-weight: 600;
622
+ letter-spacing: -0.035em;
623
+ line-height: 1;
624
+ margin-bottom: 0.5rem;
625
+ }
626
+
627
+ .stat-card.stat-dark .stat-number { color: #f5f5f3; }
628
+
629
+ .stat-label {
630
+ font-size: 0.7rem;
631
+ font-weight: 500;
632
+ text-transform: uppercase;
633
+ letter-spacing: 0.08em;
634
+ color: #a0a09a;
635
+ margin-bottom: 0.4rem;
636
+ }
637
+
638
+ .stat-card.stat-dark .stat-label { color: #888; }
639
+
640
+ .stat-desc {
641
+ font-size: 0.82rem;
642
+ color: #a0a09a;
643
+ line-height: 1.5;
644
+ }
645
+
646
+ .stat-card.stat-dark .stat-desc { color: #ccc; }
647
+
648
+ /* --- Quote pair --- */
649
+ .quote-pair {
650
+ display: grid;
651
+ grid-template-columns: 1fr 1fr;
652
+ gap: 1.5rem;
653
+ margin-top: 2rem;
654
+ }
655
+
656
+ .quote-card {
657
+ border: 1px solid #e0e0db;
658
+ border-radius: 10px;
659
+ padding: 1.75rem 1.5rem;
660
+ background: #fafaf8;
661
+ display: flex;
662
+ flex-direction: column;
663
+ }
664
+
665
+ .quote-card.quote-dark {
666
+ background: #1a1a1a;
667
+ border-color: #1a1a1a;
668
+ color: #f5f5f3;
669
+ }
670
+
671
+ .quote-text {
672
+ font-size: clamp(1rem, 1.4vw, 1.15rem);
673
+ font-weight: 400;
674
+ line-height: 1.5;
675
+ flex: 1;
676
+ font-style: italic;
677
+ color: #1a1a1a;
678
+ margin-bottom: 1.25rem;
679
+ }
680
+
681
+ .quote-card.quote-dark .quote-text { color: #f5f5f3; }
682
+
683
+ .quote-attr {
684
+ font-size: 0.78rem;
685
+ font-weight: 500;
686
+ color: #a0a09a;
687
+ padding-top: 1rem;
688
+ border-top: 1px solid #e0e0db;
689
+ }
690
+
691
+ .quote-card.quote-dark .quote-attr {
692
+ color: #888;
693
+ border-top-color: #2a2a2a;
694
+ }
695
+
696
+ /* --- Logo grid --- */
697
+ .logo-grid {
698
+ display: grid;
699
+ grid-template-columns: repeat(4, 1fr);
700
+ gap: 1rem;
701
+ margin-top: 2rem;
702
+ }
703
+
704
+ .logo-cell {
705
+ border: 1px solid #e0e0db;
706
+ border-radius: 10px;
707
+ padding: 1.5rem 1rem;
708
+ background: #fafaf8;
709
+ display: flex;
710
+ flex-direction: column;
711
+ align-items: center;
712
+ justify-content: center;
713
+ text-align: center;
714
+ min-height: 100px;
715
+ }
716
+
717
+ .logo-cell img {
718
+ max-height: 36px;
719
+ max-width: 80%;
720
+ margin-bottom: 0.75rem;
721
+ object-fit: contain;
722
+ }
723
+
724
+ .logo-mark {
725
+ width: 36px;
726
+ height: 36px;
727
+ border-radius: 6px;
728
+ background: #1a1a1a;
729
+ margin-bottom: 0.75rem;
730
+ flex-shrink: 0;
731
+ }
732
+
733
+ .logo-name {
734
+ font-size: 0.82rem;
735
+ font-weight: 500;
736
+ }
737
+
738
+ .logo-role {
739
+ font-size: 0.7rem;
740
+ color: #a0a09a;
741
+ margin-top: 0.15rem;
742
+ }
743
+
744
+ /* --- Code slide --- */
745
+ .code-frame {
746
+ background: #1a1a1a;
747
+ border-radius: 10px;
748
+ padding: 1.5rem 1.75rem;
749
+ margin-top: 2rem;
750
+ overflow-x: auto;
751
+ }
752
+
753
+ .code-frame-header {
754
+ display: flex;
755
+ align-items: center;
756
+ gap: 0.5rem;
757
+ margin-bottom: 1rem;
758
+ padding-bottom: 0.75rem;
759
+ border-bottom: 1px solid #2a2a2a;
760
+ }
761
+
762
+ .code-frame-dot {
763
+ width: 8px;
764
+ height: 8px;
765
+ border-radius: 50%;
766
+ background: #3a3a3a;
767
+ }
768
+
769
+ .code-frame-title {
770
+ font-family: 'Inter', sans-serif;
771
+ font-size: 0.7rem;
772
+ color: #555;
773
+ margin-left: 0.5rem;
774
+ letter-spacing: 0.02em;
775
+ }
776
+
777
+ .code-frame pre {
778
+ font-family: 'JetBrains Mono', 'SF Mono', monospace;
779
+ font-size: 0.82rem;
780
+ line-height: 1.7;
781
+ color: #f5f5f3;
782
+ margin: 0;
783
+ background: none;
784
+ }
785
+
786
+ .code-frame .code-comment { color: #555; }
787
+ .code-frame .code-keyword { color: #b5b5b0; font-weight: 500; }
788
+ .code-frame .code-string { color: #ccc; }
789
+ .code-frame .code-dim { color: #888; }
790
+
791
+ /* --- Dark slide --- */
792
+ .slide.dark { background: #1a1a1a; color: #f5f5f3; }
793
+ .slide.dark h1 { color: #f5f5f3; }
794
+ .slide.dark h1 span.dim { color: #888; }
795
+ .slide.dark .subtitle { color: #888; }
796
+ .slide.dark .eyebrow { color: #666; }
797
+
798
+ /* --- Nav --- */
799
+ .nav {
800
+ position: fixed;
801
+ bottom: 1.5rem;
802
+ right: 1.5rem;
803
+ font-size: 0.7rem;
804
+ color: #b5b5b0;
805
+ z-index: 100;
806
+ display: flex;
807
+ align-items: center;
808
+ gap: 1rem;
809
+ }
810
+
811
+ .nav-buttons { display: flex; gap: 0.5rem; }
812
+
813
+ .nav-btn {
814
+ width: 28px;
815
+ height: 28px;
816
+ border-radius: 50%;
817
+ border: 1px solid #d5d5d0;
818
+ background: transparent;
819
+ color: #b5b5b0;
820
+ cursor: pointer;
821
+ display: flex;
822
+ align-items: center;
823
+ justify-content: center;
824
+ font-size: 0.75rem;
825
+ padding: 0;
826
+ }
827
+
828
+ .nav-btn:hover { border-color: #1a1a1a; color: #1a1a1a; }
829
+
830
+ .progress {
831
+ position: fixed;
832
+ top: 0;
833
+ left: 0;
834
+ height: 2px;
835
+ background: #1a1a1a;
836
+ transition: width 0.3s ease;
837
+ z-index: 100;
838
+ }
839
+
840
+ /* --- PDF download button --- */
841
+ .pdf-btn {
842
+ position: fixed;
843
+ bottom: 1.5rem;
844
+ left: 50%;
845
+ transform: translateX(-50%);
846
+ z-index: 200;
847
+ background: #1a1a1a;
848
+ color: #f5f5f3;
849
+ border: none;
850
+ padding: 0.55rem 1.25rem;
851
+ border-radius: 100px;
852
+ font-size: 0.75rem;
853
+ font-weight: 500;
854
+ cursor: pointer;
855
+ font-family: inherit;
856
+ letter-spacing: 0.02em;
857
+ box-shadow: 0 8px 24px rgba(0,0,0,0.15);
858
+ }
859
+
860
+ .pdf-btn:hover { background: #000; }
861
+
862
+ /* --- Print: each slide becomes one 16:9 PDF page --- */
863
+ @page { size: 13.333in 7.5in; margin: 0; }
864
+
865
+ @media print {
866
+ html, body {
867
+ width: 13.333in;
868
+ height: auto !important;
869
+ overflow: visible !important;
870
+ background: #f5f5f3;
871
+ -webkit-print-color-adjust: exact !important;
872
+ print-color-adjust: exact !important;
873
+ }
874
+ .deck { width: 13.333in; height: auto; position: static; }
875
+ .slide {
876
+ display: flex !important;
877
+ position: relative !important;
878
+ inset: auto !important;
879
+ width: 13.333in !important;
880
+ height: 7.5in !important;
881
+ page-break-after: always !important;
882
+ break-after: page !important;
883
+ -webkit-print-color-adjust: exact !important;
884
+ }
885
+ .slide:last-child { page-break-after: auto !important; }
886
+ .slide.dark { background: #1a1a1a !important; }
887
+ .nav, .progress, .pdf-btn { display: none !important; }
888
+ }
889
+ </style>
890
+ </head>
891
+ <body>
892
+
893
+ <div class="progress" id="progress"></div>
894
+
895
+ <div class="deck">
896
+
897
+ <!-- ========== 1. COVER ========== -->
898
+ <section class="slide active">
899
+ <div class="slide-inner">
900
+ <div class="eyebrow">Conference · Date</div>
901
+ <h1>Your headline.<br><span class="dim">Continuation that fades.</span></h1>
902
+ <div class="meta">Speaker name · 20 minutes</div>
903
+ </div>
904
+ </section>
905
+
906
+ <!-- ========== 2. QUOTE SLIDE ========== -->
907
+ <section class="slide quote-slide">
908
+ <div class="slide-inner">
909
+ <h1>A bold statement <span class="dim">that opens the talk.</span></h1>
910
+ </div>
911
+ </section>
912
+
913
+ <!-- ========== 3. EYEBROW + HEADLINE + SUBTITLE ========== -->
914
+ <section class="slide">
915
+ <div class="slide-inner">
916
+ <div class="eyebrow">Section label</div>
917
+ <h1>Section headline. <span class="dim">One line that lands.</span></h1>
918
+ <p class="subtitle">A subtitle that adds nuance without saying everything. Keep it short. One or two sentences max.</p>
919
+ </div>
920
+ </section>
921
+
922
+ <!-- ========== 4. TWO-COLUMN (PROBLEM / FIX) ========== -->
923
+ <section class="slide">
924
+ <div class="slide-inner">
925
+ <div class="two-col">
926
+ <div>
927
+ <div class="eyebrow">The problem</div>
928
+ <h2>What's broken.</h2>
929
+ <p>Describe the situation today. Be specific. Avoid abstractions. The reader should recognize their own pain.</p>
930
+ </div>
931
+ <div>
932
+ <div class="eyebrow">The fix</div>
933
+ <h2>What we built.</h2>
934
+ <p>Describe the solution. Same length and tone as the problem. Side-by-side comparison drives the point.</p>
935
+ </div>
936
+ </div>
937
+ </div>
938
+ </section>
939
+
940
+ <!-- ========== 4b. TWO-COLUMN STEP STACK ========== -->
941
+ <section class="slide">
942
+ <div class="slide-inner">
943
+ <div class="two-col">
944
+ <div>
945
+ <div class="eyebrow">Section label</div>
946
+ <h2>Title for the steps on the right.</h2>
947
+ <p class="subtitle">Brief explanation of what these steps represent.</p>
948
+ </div>
949
+ <div class="col-stack">
950
+ <div class="step">First step</div>
951
+ <div class="step">Second step</div>
952
+ <div class="step">Third step</div>
953
+ <div class="step dim">Fourth step (dimmed = blocker)</div>
954
+ <div class="step dim">Fifth step (dimmed)</div>
955
+ <div class="step kill">Final outcome (negative)</div>
956
+ </div>
957
+ </div>
958
+ </div>
959
+ </section>
960
+
961
+ <!-- ========== 5. THREE-COLUMN (WHY / HOW / WHAT) ========== -->
962
+ <section class="slide">
963
+ <div class="slide-inner">
964
+ <div class="eyebrow">Section label</div>
965
+ <h2>Headline for the breakdown.</h2>
966
+ <div class="three-col" style="margin-top: 2rem;">
967
+ <div>
968
+ <h3>Why</h3>
969
+ <p>The motivation. Why this matters. Why now.</p>
970
+ </div>
971
+ <div>
972
+ <h3>How</h3>
973
+ <p>The mechanism. The four pillars. The structure.</p>
974
+ </div>
975
+ <div>
976
+ <h3>What</h3>
977
+ <p>The outcome. What you walk away with.</p>
978
+ </div>
979
+ </div>
980
+ </div>
981
+ </section>
982
+
983
+ <!-- ========== 6. CAPABILITY LIST (Q&A) ========== -->
984
+ <section class="slide">
985
+ <div class="slide-inner">
986
+ <div class="eyebrow">What it solves</div>
987
+ <h2>The questions you have. <span class="dim">Answered.</span></h2>
988
+ <div class="cap-list" style="margin-top: 2rem;">
989
+ <div class="cap-row">
990
+ <div class="cap-q">Question one?</div>
991
+ <div class="cap-a">A clear, specific answer that addresses the question directly.</div>
992
+ </div>
993
+ <div class="cap-row">
994
+ <div class="cap-q">Question two?</div>
995
+ <div class="cap-a">Another concrete answer. Avoid hedging.</div>
996
+ </div>
997
+ <div class="cap-row">
998
+ <div class="cap-q">Question three?</div>
999
+ <div class="cap-a">Keep answers parallel in length and tone.</div>
1000
+ </div>
1001
+ </div>
1002
+ </div>
1003
+ </section>
1004
+
1005
+ <!-- ========== 7. DARK CALLOUT ========== -->
1006
+ <section class="slide">
1007
+ <div class="slide-inner">
1008
+ <div class="callout">
1009
+ <h3>Why now</h3>
1010
+ <p>The moment lands here. <strong>The key insight in bold.</strong> Then the supporting context. One callout per deck max — too many and the emphasis stops working.</p>
1011
+ </div>
1012
+ </div>
1013
+ </section>
1014
+
1015
+ <!-- ========== 8. DOT FLOW ========== -->
1016
+ <section class="slide">
1017
+ <div class="slide-inner">
1018
+ <div class="eyebrow">The flow</div>
1019
+ <h2>How it works. <span class="dim">Step by step.</span></h2>
1020
+ <div class="dot-flow">
1021
+ <div class="dot-step"><div class="dot"></div><h4>Step 1</h4><p>Short caption</p></div>
1022
+ <div class="dot-step"><div class="dot"></div><h4>Step 2</h4><p>Short caption</p></div>
1023
+ <div class="dot-step"><div class="dot"></div><h4>Step 3</h4><p>Short caption</p></div>
1024
+ <div class="dot-step"><div class="dot"></div><h4>Step 4</h4><p>Short caption</p></div>
1025
+ <div class="dot-step"><div class="dot"></div><h4>Step 5</h4><p>Short caption</p></div>
1026
+ </div>
1027
+ </div>
1028
+ </section>
1029
+
1030
+ <!-- ========== 9. STACK GRID ========== -->
1031
+ <section class="slide">
1032
+ <div class="slide-inner">
1033
+ <div class="eyebrow">The stack</div>
1034
+ <h2>Built on tools <span class="dim">you already know.</span></h2>
1035
+ <div class="stack-grid">
1036
+ <div class="stack-card">
1037
+ <div class="stack-card-label">Category one</div>
1038
+ <div class="stack-tool"><span class="mark"></span>Tool A</div>
1039
+ <div class="stack-tool"><span class="mark"></span>Tool B</div>
1040
+ <div class="stack-tool"><span class="mark"></span>Tool C</div>
1041
+ </div>
1042
+ <div class="stack-card">
1043
+ <div class="stack-card-label">Category two</div>
1044
+ <div class="stack-tool"><span class="mark"></span>Tool D</div>
1045
+ <div class="stack-tool"><span class="mark"></span>Tool E</div>
1046
+ </div>
1047
+ <div class="stack-card">
1048
+ <div class="stack-card-label">Category three</div>
1049
+ <div class="stack-tool"><span class="mark"></span>Tool F</div>
1050
+ <div class="stack-tool"><span class="mark"></span>Tool G</div>
1051
+ </div>
1052
+ <div class="stack-card">
1053
+ <div class="stack-card-label">Category four</div>
1054
+ <div class="stack-tool"><span class="mark"></span>Tool H</div>
1055
+ <div class="stack-tool"><span class="mark"></span>Tool I</div>
1056
+ </div>
1057
+ </div>
1058
+ </div>
1059
+ </section>
1060
+
1061
+ <!-- ========== 10. SPEC BLOCK + CONTEXT + OUTPUTS ========== -->
1062
+ <section class="slide">
1063
+ <div class="slide-inner">
1064
+ <div class="eyebrow">The mechanism</div>
1065
+ <h2>One input. <span class="dim">Three outputs.</span></h2>
1066
+ <div class="spec-flow">
1067
+ <div class="spec-block">
1068
+ <h4>The Input</h4>
1069
+ <p>What goes in</p>
1070
+ </div>
1071
+ <div class="ctx-row">
1072
+ <span class="ctx-label">draws from</span>
1073
+ <span class="ctx-pill">Source 1</span>
1074
+ <span class="ctx-pill">Source 2</span>
1075
+ <span class="ctx-pill">Source 3</span>
1076
+ </div>
1077
+ <div class="ai-divider">
1078
+ <div class="line"></div>
1079
+ <span class="ai-pill">Process</span>
1080
+ <div class="line"></div>
1081
+ </div>
1082
+ <div class="outputs-row">
1083
+ <div class="output-card"><h5>Output A</h5><p>What it produces.</p></div>
1084
+ <div class="output-card"><h5>Output B</h5><p>What it produces.</p></div>
1085
+ <div class="output-card"><h5>Output C</h5><p>What it produces.</p></div>
1086
+ </div>
1087
+ </div>
1088
+ </div>
1089
+ </section>
1090
+
1091
+ <!-- ========== 11. PRODUCT SLIDE (SHOWCASE STYLE) ========== -->
1092
+ <section class="slide">
1093
+ <div class="slide-inner">
1094
+ <div class="product-row">
1095
+ <div class="product-meta">
1096
+ <div class="product-num">/01</div>
1097
+ <div class="product-tag">A short, punchy quote or hook.</div>
1098
+ <h3 class="product-headline">One-line description of what this thing does.</h3>
1099
+ <p class="product-desc">Two or three sentences that explain it. Keep it concrete. Avoid abstract language. Tell the story behind it.</p>
1100
+ <div class="product-stat">A few hours · One weekend · Or whatever's true</div>
1101
+ </div>
1102
+ <div class="product-name">Name<sup>™</sup></div>
1103
+ </div>
1104
+ </div>
1105
+ </section>
1106
+
1107
+ <!-- ========== 12. COLLAGE SLIDE (FULL MEDIA) ========== -->
1108
+ <section class="slide collage-slide">
1109
+ <div class="collage">
1110
+ <img src="media/KMS1821.jpg" alt="" style="width:100%;height:100%;object-fit:cover;">
1111
+ </div>
1112
+ </section>
1113
+
1114
+ <!-- ========== 13. JEDUF THREE-COLUMN COMPARISON ========== -->
1115
+ <section class="slide">
1116
+ <div class="slide-inner">
1117
+ <div class="eyebrow">The middle path</div>
1118
+ <h2>Between two extremes. <span class="dim">The thing that actually works.</span></h2>
1119
+ <div class="jeduf">
1120
+ <div class="jeduf-col">
1121
+ <div class="jeduf-label">Too much</div>
1122
+ <div class="jeduf-title">Extreme A</div>
1123
+ <div class="jeduf-philosophy">"A philosophy quote that captures the extreme."</div>
1124
+ <div class="jeduf-step">Step 1</div>
1125
+ <div class="jeduf-step">Step 2</div>
1126
+ <div class="jeduf-step">Step 3</div>
1127
+ <div class="jeduf-step">Step 4</div>
1128
+ </div>
1129
+ <div class="jeduf-col hero">
1130
+ <div class="jeduf-label">Just right</div>
1131
+ <div class="jeduf-title">The middle path</div>
1132
+ <div class="jeduf-philosophy">"The philosophy of the balanced approach."</div>
1133
+ <div class="jeduf-step">Step 1</div>
1134
+ <div class="jeduf-step">Step 2</div>
1135
+ <div class="jeduf-step">Step 3</div>
1136
+ <div class="jeduf-step">Step 4</div>
1137
+ </div>
1138
+ <div class="jeduf-col">
1139
+ <div class="jeduf-label">Too little</div>
1140
+ <div class="jeduf-title">Extreme B</div>
1141
+ <div class="jeduf-philosophy">"A philosophy quote that captures the other extreme."</div>
1142
+ <div class="jeduf-step">Step 1</div>
1143
+ <div class="jeduf-step">Step 2</div>
1144
+ <div class="jeduf-step">Step 3</div>
1145
+ <div class="jeduf-step">Step 4</div>
1146
+ </div>
1147
+ </div>
1148
+ </div>
1149
+ </section>
1150
+
1151
+ <!-- ========== 14. TIMELINE ========== -->
1152
+ <section class="slide">
1153
+ <div class="slide-inner">
1154
+ <div class="eyebrow">The journey</div>
1155
+ <h2>How we got here. <span class="dim">Year by year.</span></h2>
1156
+ <div class="timeline">
1157
+ <div class="timeline-row">
1158
+ <div class="timeline-year">Year 1</div>
1159
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1160
+ <div class="timeline-content"><h4>The starting point</h4><p>Where things began. The initial conditions and constraints.</p></div>
1161
+ </div>
1162
+ <div class="timeline-row">
1163
+ <div class="timeline-year">Year 2</div>
1164
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1165
+ <div class="timeline-content"><h4>Early progress</h4><p>First experiments. Initial wins. Lessons learned.</p></div>
1166
+ </div>
1167
+ <div class="timeline-row">
1168
+ <div class="timeline-year">Year 3</div>
1169
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1170
+ <div class="timeline-content"><h4>The inflection</h4><p>The moment things accelerated. What changed and why.</p></div>
1171
+ </div>
1172
+ <div class="timeline-row">
1173
+ <div class="timeline-year">Now</div>
1174
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1175
+ <div class="timeline-content"><h4>Where we are</h4><p>Current state. What's been achieved. What's next.</p></div>
1176
+ </div>
1177
+ </div>
1178
+ </div>
1179
+ </section>
1180
+
1181
+ <!-- ========== 15. STAT GRID ========== -->
1182
+ <section class="slide">
1183
+ <div class="slide-inner">
1184
+ <div class="eyebrow">The numbers</div>
1185
+ <h2>Impact you can measure. <span class="dim">Not just feel.</span></h2>
1186
+ <div class="stat-grid">
1187
+ <div class="stat-card">
1188
+ <div class="stat-label">Metric one</div>
1189
+ <div class="stat-number">N×</div>
1190
+ <div class="stat-desc">What this number means in context. Be specific.</div>
1191
+ </div>
1192
+ <div class="stat-card stat-dark">
1193
+ <div class="stat-label">Metric two</div>
1194
+ <div class="stat-number">00</div>
1195
+ <div class="stat-desc">The hero number. Dark card draws attention here.</div>
1196
+ </div>
1197
+ <div class="stat-card">
1198
+ <div class="stat-label">Metric three</div>
1199
+ <div class="stat-number">00%</div>
1200
+ <div class="stat-desc">Another concrete measurement with context.</div>
1201
+ </div>
1202
+ </div>
1203
+ </div>
1204
+ </section>
1205
+
1206
+ <!-- ========== 16. QUOTE PAIR ========== -->
1207
+ <section class="slide">
1208
+ <div class="slide-inner">
1209
+ <div class="eyebrow">Two perspectives</div>
1210
+ <h2>The debate. <span class="dim">Both sides, one slide.</span></h2>
1211
+ <div class="quote-pair">
1212
+ <div class="quote-card">
1213
+ <div class="quote-text">"The first perspective. A position or belief that one side holds."</div>
1214
+ <div class="quote-attr">Perspective A</div>
1215
+ </div>
1216
+ <div class="quote-card quote-dark">
1217
+ <div class="quote-text">"The counterpoint. A contrasting view that creates tension with the first."</div>
1218
+ <div class="quote-attr">Perspective B</div>
1219
+ </div>
1220
+ </div>
1221
+ </div>
1222
+ </section>
1223
+
1224
+ <!-- ========== 17. LOGO GRID ========== -->
1225
+ <section class="slide">
1226
+ <div class="slide-inner">
1227
+ <div class="eyebrow">Who uses this</div>
1228
+ <h2>Trusted by teams <span class="dim">who ship.</span></h2>
1229
+ <div class="logo-grid">
1230
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner A</div><div class="logo-role">Role or team</div></div>
1231
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner B</div><div class="logo-role">Role or team</div></div>
1232
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner C</div><div class="logo-role">Role or team</div></div>
1233
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner D</div><div class="logo-role">Role or team</div></div>
1234
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner E</div><div class="logo-role">Role or team</div></div>
1235
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner F</div><div class="logo-role">Role or team</div></div>
1236
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner G</div><div class="logo-role">Role or team</div></div>
1237
+ <div class="logo-cell"><div class="logo-mark"></div><div class="logo-name">Partner H</div><div class="logo-role">Role or team</div></div>
1238
+ </div>
1239
+ </div>
1240
+ </section>
1241
+
1242
+ <!-- ========== 18. CODE SLIDE ========== -->
1243
+ <section class="slide">
1244
+ <div class="slide-inner">
1245
+ <div class="eyebrow">Under the hood</div>
1246
+ <h2>How it works. <span class="dim">The code behind it.</span></h2>
1247
+ <div class="code-frame">
1248
+ <div class="code-frame-header">
1249
+ <div class="code-frame-dot"></div>
1250
+ <div class="code-frame-dot"></div>
1251
+ <div class="code-frame-dot"></div>
1252
+ <div class="code-frame-title">deck.html</div>
1253
+ </div>
1254
+ <pre><span class="code-comment">&lt;!-- A slide is just a section --&gt;</span>
1255
+ <span class="code-keyword">&lt;section</span> <span class="code-dim">class=</span><span class="code-string">"slide dark"</span><span class="code-keyword">&gt;</span>
1256
+ <span class="code-keyword">&lt;div</span> <span class="code-dim">class=</span><span class="code-string">"slide-inner"</span><span class="code-keyword">&gt;</span>
1257
+ <span class="code-keyword">&lt;div</span> <span class="code-dim">class=</span><span class="code-string">"eyebrow"</span><span class="code-keyword">&gt;</span>The shift<span class="code-keyword">&lt;/div&gt;</span>
1258
+ <span class="code-keyword">&lt;h1&gt;</span>The bottleneck moved.
1259
+ <span class="code-keyword">&lt;span</span> <span class="code-dim">class=</span><span class="code-string">"dim"</span><span class="code-keyword">&gt;</span>Ideas are the new blocker.<span class="code-keyword">&lt;/span&gt;</span>
1260
+ <span class="code-keyword">&lt;/h1&gt;</span>
1261
+ <span class="code-keyword">&lt;/div&gt;</span>
1262
+ <span class="code-keyword">&lt;/section&gt;</span></pre>
1263
+ </div>
1264
+ </div>
1265
+ </section>
1266
+
1267
+ <!-- ========== 19. DARK SLIDE (EMPHASIS) ========== -->
1268
+ <section class="slide dark">
1269
+ <div class="slide-inner">
1270
+ <div class="eyebrow">Section label</div>
1271
+ <h1>The pivot moment. <span class="dim">Lands harder in dark.</span></h1>
1272
+ <p class="subtitle">Use dark slides sparingly. They mark turning points. Two or three per deck max.</p>
1273
+ </div>
1274
+ </section>
1275
+
1276
+ <!-- ========== 20. CLOSING SLIDE ========== -->
1277
+ <section class="slide dark quote-slide">
1278
+ <div class="slide-inner">
1279
+ <h1>The closing line.<br><span class="dim">Slow down for it.</span></h1>
1280
+ </div>
1281
+ </section>
1282
+
1283
+ <!-- ========== 21. THANKS ========== -->
1284
+ <section class="slide">
1285
+ <div class="slide-inner">
1286
+ <h1 style="font-size: clamp(2.5rem, 5vw, 4rem);">Thanks.</h1>
1287
+ <p class="subtitle">Questions?</p>
1288
+ <div class="meta">Speaker name · Affiliation</div>
1289
+ </div>
1290
+ </section>
1291
+
1292
+ </div>
1293
+
1294
+ <button class="pdf-btn" onclick="downloadPDF()">Download PDF</button>
1295
+
1296
+ <div class="nav">
1297
+ <span id="counter">1 / 16</span>
1298
+ <div class="nav-buttons">
1299
+ <button class="nav-btn" onclick="prev()">‹</button>
1300
+ <button class="nav-btn" onclick="next()">›</button>
1301
+ </div>
1302
+ </div>
1303
+
1304
+ <script>
1305
+ const slides = document.querySelectorAll('.slide');
1306
+ const counter = document.getElementById('counter');
1307
+ const progress = document.getElementById('progress');
1308
+ let current = 0;
1309
+
1310
+ function show(i) {
1311
+ slides.forEach(s => s.classList.remove('active'));
1312
+ slides[i].classList.add('active');
1313
+ counter.textContent = `${i + 1} / ${slides.length}`;
1314
+ progress.style.width = `${((i + 1) / slides.length) * 100}%`;
1315
+ current = i;
1316
+ }
1317
+
1318
+ function next() { if (current < slides.length - 1) show(current + 1); }
1319
+ function prev() { if (current > 0) show(current - 1); }
1320
+
1321
+ document.addEventListener('keydown', (e) => {
1322
+ if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'PageDown') { e.preventDefault(); next(); }
1323
+ if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); prev(); }
1324
+ if (e.key === 'Home') { show(0); }
1325
+ if (e.key === 'End') { show(slides.length - 1); }
1326
+ if (e.key === 'p' || e.key === 'P') { e.preventDefault(); downloadPDF(); }
1327
+ });
1328
+
1329
+ function downloadPDF() {
1330
+ const originalTitle = document.title;
1331
+ document.title = 'deck';
1332
+ window.print();
1333
+ setTimeout(() => { document.title = originalTitle; }, 1000);
1334
+ }
1335
+
1336
+ let touchStartX = 0;
1337
+ let touchStartY = 0;
1338
+ const SWIPE_THRESHOLD = 50;
1339
+
1340
+ document.addEventListener('touchstart', (e) => {
1341
+ touchStartX = e.changedTouches[0].screenX;
1342
+ touchStartY = e.changedTouches[0].screenY;
1343
+ }, { passive: true });
1344
+
1345
+ document.addEventListener('touchend', (e) => {
1346
+ const dx = e.changedTouches[0].screenX - touchStartX;
1347
+ const dy = e.changedTouches[0].screenY - touchStartY;
1348
+ if (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dy) > Math.abs(dx)) return;
1349
+ if (dx < 0) next();
1350
+ else prev();
1351
+ }, { passive: true });
1352
+
1353
+ const isEmbed = new URLSearchParams(window.location.search).has('embed');
1354
+
1355
+ show(0);
1356
+ </script>
1357
+
1358
+ </body>
1359
+ </html>