@rubytech/create-realagent-code 0.1.254 → 0.1.256

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 (340) 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/.docs/search-surface-contract.md +58 -0
  6. package/payload/platform/config/brand-registry.json +8 -0
  7. package/payload/platform/config/brand.json +2 -2
  8. package/payload/platform/lib/embed-client/dist/index.d.ts +4 -0
  9. package/payload/platform/lib/embed-client/dist/index.d.ts.map +1 -0
  10. package/payload/platform/lib/embed-client/dist/index.js +53 -0
  11. package/payload/platform/lib/embed-client/dist/index.js.map +1 -0
  12. package/payload/platform/lib/embed-client/src/index.ts +53 -0
  13. package/payload/platform/lib/embed-client/tsconfig.json +8 -0
  14. package/payload/platform/lib/graph-search/dist/index.d.ts +27 -6
  15. package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
  16. package/payload/platform/lib/graph-search/dist/index.js +19 -1
  17. package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
  18. package/payload/platform/lib/graph-search/src/__tests__/fulltext-coverage.test.ts +12 -0
  19. package/payload/platform/lib/graph-search/src/index.ts +28 -6
  20. package/payload/platform/lib/graph-write/dist/index.d.ts +25 -0
  21. package/payload/platform/lib/graph-write/dist/index.d.ts.map +1 -1
  22. package/payload/platform/lib/graph-write/dist/index.js +80 -2
  23. package/payload/platform/lib/graph-write/dist/index.js.map +1 -1
  24. package/payload/platform/lib/graph-write/src/index.ts +98 -1
  25. package/payload/platform/neo4j/schema.cypher +126 -0
  26. package/payload/platform/package.json +2 -2
  27. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  28. package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
  29. package/payload/platform/plugins/admin/PLUGIN.md +3 -6
  30. package/payload/platform/plugins/admin/mcp/dist/index.js +14 -60
  31. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  32. package/payload/platform/plugins/admin/skills/insight/SKILL.md +24 -0
  33. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +84 -31
  34. package/payload/platform/plugins/docs/PLUGIN.md +1 -0
  35. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  36. package/payload/platform/plugins/docs/references/deployment.md +18 -5
  37. package/payload/platform/plugins/docs/references/graph.md +2 -0
  38. package/payload/platform/plugins/docs/references/internals.md +12 -1
  39. package/payload/platform/plugins/docs/references/memory-guide.md +4 -0
  40. package/payload/platform/plugins/docs/references/neo4j.md +2 -2
  41. package/payload/platform/plugins/docs/references/platform.md +1 -1
  42. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  43. package/payload/platform/plugins/docs/references/session-retrospective.md +5 -18
  44. package/payload/platform/plugins/docs/references/slides.md +31 -0
  45. package/payload/platform/plugins/docs/references/voice-mirror-guide.md +1 -1
  46. package/payload/platform/plugins/email/PLUGIN.md +2 -2
  47. package/payload/platform/plugins/email/mcp/dist/index.js +8 -0
  48. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  49. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +19 -0
  50. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -0
  51. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +64 -0
  52. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -0
  53. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts +4 -0
  54. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
  55. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +1 -0
  56. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
  57. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts +1 -0
  58. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
  59. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +6 -1
  60. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
  61. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts +1 -0
  62. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
  63. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +7 -1
  64. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
  65. package/payload/platform/plugins/email/references/email-reference.md +4 -0
  66. package/payload/platform/plugins/memory/PLUGIN.md +1 -2
  67. package/payload/platform/plugins/memory/mcp/dist/index.js +6 -44
  68. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  69. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts +2 -0
  70. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.d.ts.map +1 -0
  71. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js +41 -0
  72. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/document-sectioniser.test.js.map +1 -0
  73. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts +2 -0
  74. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.d.ts.map +1 -0
  75. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js +90 -0
  76. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/graph-write-embed-net.test.js.map +1 -0
  77. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts +2 -0
  78. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.d.ts.map +1 -0
  79. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js +27 -0
  80. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/vector-indexed-labels-drift.test.js.map +1 -0
  81. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts +10 -0
  82. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.d.ts.map +1 -0
  83. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js +47 -0
  84. package/payload/platform/plugins/memory/mcp/dist/lib/document-sectioniser.js.map +1 -0
  85. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts +1 -2
  86. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.d.ts.map +1 -1
  87. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js +5 -28
  88. package/payload/platform/plugins/memory/mcp/dist/lib/embeddings.js.map +1 -1
  89. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts +2 -0
  90. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.d.ts.map +1 -0
  91. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js +20 -0
  92. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/build-text-representation-bound.test.js.map +1 -0
  93. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts +2 -0
  94. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.d.ts.map +1 -0
  95. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js +67 -0
  96. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/conversation-archive-preference-embed.test.js.map +1 -0
  97. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts +2 -0
  98. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.d.ts.map +1 -0
  99. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js +34 -0
  100. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/embeddings-cap.test.js.map +1 -0
  101. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts +2 -0
  102. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.d.ts.map +1 -0
  103. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js +61 -0
  104. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-section-writer.test.js.map +1 -0
  105. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js +23 -1
  106. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-archive-write.test.js.map +1 -1
  107. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts +2 -0
  108. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.d.ts.map +1 -0
  109. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js +87 -0
  110. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-reindex.test.js.map +1 -0
  111. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js +3 -0
  112. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-fields.test.js.map +1 -1
  113. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts +2 -0
  114. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.d.ts.map +1 -0
  115. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js +34 -0
  116. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/memory-search-threshold.test.js.map +1 -0
  117. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts.map +1 -1
  118. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +19 -4
  119. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js.map +1 -1
  120. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -6
  121. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
  122. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +280 -10
  123. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
  124. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.d.ts.map +1 -1
  125. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js +76 -37
  126. package/payload/platform/plugins/memory/mcp/dist/tools/memory-reindex.js.map +1 -1
  127. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.d.ts.map +1 -1
  128. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js +11 -2
  129. package/payload/platform/plugins/memory/mcp/dist/tools/memory-search.js.map +1 -1
  130. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.d.ts +4 -4
  131. package/payload/platform/plugins/memory/mcp/dist/tools/memory-typed-edge-pass.js +3 -3
  132. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.d.ts.map +1 -1
  133. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js +20 -2
  134. package/payload/platform/plugins/memory/mcp/dist/tools/memory-write.js.map +1 -1
  135. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +6 -3
  136. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  137. package/payload/platform/plugins/memory/mcp/vitest.config.ts +5 -0
  138. package/payload/platform/plugins/memory/references/schema-base.md +1 -1
  139. package/payload/platform/plugins/memory/references/schema-construction.md +72 -0
  140. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.d.ts.map +1 -1
  141. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js +15 -0
  142. package/payload/platform/plugins/scheduling/mcp/dist/lib/ics-graph-ingest.js.map +1 -1
  143. package/payload/platform/plugins/slides/.claude-plugin/plugin.json +8 -0
  144. package/payload/platform/plugins/slides/LICENSE +21 -0
  145. package/payload/platform/plugins/slides/PLUGIN.md +18 -0
  146. package/payload/platform/plugins/slides/PROVENANCE.md +40 -0
  147. package/payload/platform/plugins/slides/commands/add-slide.md +29 -0
  148. package/payload/platform/plugins/slides/commands/slides-claus.md +39 -0
  149. package/payload/platform/plugins/slides/commands/slides-new-component.md +39 -0
  150. package/payload/platform/plugins/slides/commands/slides-outline.md +43 -0
  151. package/payload/platform/plugins/slides/commands/slides-review.md +52 -0
  152. package/payload/platform/plugins/slides/commands/slides-theme.md +64 -0
  153. package/payload/platform/plugins/slides/commands/slides.md +59 -0
  154. package/payload/platform/plugins/slides/skills/deck-system/REFERENCE.md +581 -0
  155. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +607 -0
  156. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-board.md +426 -0
  157. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-claus.md +185 -0
  158. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-mbb.md +450 -0
  159. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-product-launch.md +579 -0
  160. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sales.md +464 -0
  161. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING-sequoia.md +489 -0
  162. package/payload/platform/plugins/slides/skills/deck-system/STORYTELLING.md +273 -0
  163. package/payload/platform/plugins/slides/skills/deck-system/deck-craft.html +1371 -0
  164. package/payload/platform/plugins/slides/skills/deck-system/deck-solid.html +1667 -0
  165. package/payload/platform/plugins/slides/skills/deck-system/deck.html +1359 -0
  166. package/payload/platform/plugins/url-get/.claude-plugin/plugin.json +1 -1
  167. package/payload/platform/plugins/url-get/PLUGIN.md +26 -21
  168. package/payload/platform/plugins/url-get/mcp/dist/index.js +3 -3
  169. package/payload/platform/plugins/url-get/mcp/dist/index.js.map +1 -1
  170. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts +1 -2
  171. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.d.ts.map +1 -1
  172. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +20 -40
  173. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  174. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js +4 -0
  175. package/payload/platform/plugins/workflows/mcp/dist/tools/workflow-execute.js.map +1 -1
  176. package/payload/platform/scripts/identity-forbidden-token-check.mjs +0 -1
  177. package/payload/platform/scripts/setup-account.sh +0 -15
  178. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts +23 -0
  179. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.d.ts.map +1 -0
  180. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js +29 -0
  181. package/payload/platform/services/claude-session-manager/dist/agent-identity-locator.js.map +1 -0
  182. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
  183. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +0 -2
  184. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
  185. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +5 -0
  186. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  187. package/payload/platform/services/claude-session-manager/dist/http-server.js +32 -2
  188. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  189. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  190. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +8 -1
  191. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  192. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts +13 -1
  193. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.d.ts.map +1 -1
  194. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js +26 -2
  195. package/payload/platform/services/claude-session-manager/dist/public-agent-reachability.js.map +1 -1
  196. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +2 -2
  197. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
  198. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +12 -3
  199. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  200. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +3 -2
  201. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  202. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -2
  203. package/payload/platform/templates/specialists/agents/database-operator.md +3 -7
  204. package/payload/platform/templates/specialists/agents/typed-edge-classifier.md +1 -1
  205. package/payload/server/{chunk-M6A6EZD4.js → chunk-76HRO7NX.js} +16 -2
  206. package/payload/server/maxy-edge.js +1 -1
  207. package/payload/server/public/assets/AdminShell-T-YknnBn.js +1 -0
  208. package/payload/server/public/assets/Checkbox-DmDxpqVv.js +1 -0
  209. package/payload/server/public/assets/admin-COUV-jgt.js +1 -0
  210. package/payload/server/public/assets/{arc-aUiRP9AS.js → arc-B2CweJq3.js} +1 -1
  211. package/payload/server/public/assets/architecture-YZFGNWBL-Dnn6Hc65.js +1 -0
  212. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-c09loTER.js → architectureDiagram-Q4EWVU46-DP2o-MFV.js} +1 -1
  213. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-Cjdeyoq1.js → blockDiagram-DXYQGD6D-DO4mcYDJ.js} +1 -1
  214. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-NY6Wlzo2.js → c4Diagram-AHTNJAMY-Sy1giHbj.js} +1 -1
  215. package/payload/server/public/assets/channel-CEpR_0rE.js +1 -0
  216. package/payload/server/public/assets/{chunk-2KRD3SAO-BK3470lx.js → chunk-2KRD3SAO-CKsCYCsN.js} +1 -1
  217. package/payload/server/public/assets/chunk-336JU56O-C0-P-aUF.js +2 -0
  218. package/payload/server/public/assets/chunk-426QAEUC-DFjEt3Zb.js +1 -0
  219. package/payload/server/public/assets/{chunk-4BX2VUAB-BOvVdJLf.js → chunk-4BX2VUAB-B8bqAmBa.js} +1 -1
  220. package/payload/server/public/assets/{chunk-4TB4RGXK-BXpto3yW.js → chunk-4TB4RGXK-D1k0VSlW.js} +1 -1
  221. package/payload/server/public/assets/{chunk-55IACEB6-BwZyF7vR.js → chunk-55IACEB6-B-p_QNqz.js} +1 -1
  222. package/payload/server/public/assets/{chunk-5FUZZQ4R-C403gCUk.js → chunk-5FUZZQ4R-D6U6tV_j.js} +1 -1
  223. package/payload/server/public/assets/{chunk-5PVQY5BW-CjVzXQEp.js → chunk-5PVQY5BW-CYK76xfs.js} +1 -1
  224. package/payload/server/public/assets/{chunk-67CJDMHE-D5bhMrtY.js → chunk-67CJDMHE-BC9js-lf.js} +1 -1
  225. package/payload/server/public/assets/{chunk-7N4EOEYR-Si7Lgrwc.js → chunk-7N4EOEYR-4j2OqKkv.js} +1 -1
  226. package/payload/server/public/assets/{chunk-AA7GKIK3-DMuHtDqO.js → chunk-AA7GKIK3-Coen-fXN.js} +1 -1
  227. package/payload/server/public/assets/{chunk-BSJP7CBP-L79XKVcb.js → chunk-BSJP7CBP-CAiOBvec.js} +1 -1
  228. package/payload/server/public/assets/{chunk-CIAEETIT-C0O7Upmg.js → chunk-CIAEETIT-AJzzpZVb.js} +1 -1
  229. package/payload/server/public/assets/{chunk-EDXVE4YY-DJcJAsAg.js → chunk-EDXVE4YY-BL4BKozX.js} +1 -1
  230. package/payload/server/public/assets/{chunk-ENJZ2VHE-CFDNvYu1.js → chunk-ENJZ2VHE-mhAFG8UD.js} +1 -1
  231. package/payload/server/public/assets/{chunk-FMBD7UC4-C_E43NFJ.js → chunk-FMBD7UC4-H231gZA_.js} +1 -1
  232. package/payload/server/public/assets/{chunk-FOC6F5B3-D9lWWHAu.js → chunk-FOC6F5B3-Cl3ZZjYG.js} +1 -1
  233. package/payload/server/public/assets/{chunk-ICPOFSXX-ecLOxGhL.js → chunk-ICPOFSXX-DOEzvzJa.js} +2 -2
  234. package/payload/server/public/assets/{chunk-K5T4RW27-DuhsNH4c.js → chunk-K5T4RW27-C_ipbUDD.js} +1 -1
  235. package/payload/server/public/assets/{chunk-KGLVRYIC-B4-A1Abi.js → chunk-KGLVRYIC-CTsDNSCU.js} +1 -1
  236. package/payload/server/public/assets/{chunk-LIHQZDEY-BxqgHRgT.js → chunk-LIHQZDEY-DvSXhkGf.js} +1 -1
  237. package/payload/server/public/assets/{chunk-ORNJ4GCN-DEYQ5WaJ.js → chunk-ORNJ4GCN-p574NOI7.js} +1 -1
  238. package/payload/server/public/assets/{chunk-OYMX7WX6-B7MW66KB.js → chunk-OYMX7WX6-BlEgFM6U.js} +1 -1
  239. package/payload/server/public/assets/chunk-QZHKN3VN-DpF06ZZQ.js +1 -0
  240. package/payload/server/public/assets/{chunk-U2HBQHQK-BMawmsyk.js → chunk-U2HBQHQK-B2bDK0jv.js} +1 -1
  241. package/payload/server/public/assets/{chunk-X2U36JSP-CT6g7pno.js → chunk-X2U36JSP-D69BxKFw.js} +1 -1
  242. package/payload/server/public/assets/{chunk-XPW4576I-CBfZXZDB.js → chunk-XPW4576I-Dm-PcyUi.js} +1 -1
  243. package/payload/server/public/assets/{chunk-YZCP3GAM-xeAluiAH.js → chunk-YZCP3GAM-Be8RnXgx.js} +1 -1
  244. package/payload/server/public/assets/{chunk-ZZ45TVLE-BRN9qUC5.js → chunk-ZZ45TVLE-Ck8PCTa4.js} +1 -1
  245. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CYbXvKLI.js +1 -0
  246. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DEyHzRhq.js +1 -0
  247. package/payload/server/public/assets/clone-y8gexbBy.js +1 -0
  248. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Br2gjtEO.js → cose-bilkent-S5V4N54A-CmkW2Eaj.js} +1 -1
  249. package/payload/server/public/assets/{dagre-DTjePoco.js → dagre-Dqp-ns8F.js} +1 -1
  250. package/payload/server/public/assets/{dagre-KV5264BT-DHBkRke4.js → dagre-KV5264BT-ZgWWXPLc.js} +1 -1
  251. package/payload/server/public/assets/data-gy6QH9c1.js +1 -0
  252. package/payload/server/public/assets/{diagram-5BDNPKRD-BIq1-idL.js → diagram-5BDNPKRD-CTX5-ScM.js} +1 -1
  253. package/payload/server/public/assets/{diagram-G4DWMVQ6-BsIUDzV6.js → diagram-G4DWMVQ6-BovIsO6H.js} +1 -1
  254. package/payload/server/public/assets/{diagram-MMDJMWI5-CgHSri2i.js → diagram-MMDJMWI5-DcETsQy-.js} +1 -1
  255. package/payload/server/public/assets/{diagram-TYMM5635-Ce2Wh9ZX.js → diagram-TYMM5635-yyq6peoZ.js} +1 -1
  256. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BU0Kh6OQ.js → erDiagram-SMLLAGMA-CiNToftB.js} +1 -1
  257. package/payload/server/public/assets/{flatten-Bo6YRmWl.js → flatten-BtFI066E.js} +1 -1
  258. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-B0N06MF7.js → flowDiagram-DWJPFMVM-Xnl3SpIM.js} +1 -1
  259. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BVbx4ARZ.js → ganttDiagram-T4ZO3ILL-C1iyWe0f.js} +1 -1
  260. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CNs-LD5i.js +1 -0
  261. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C-xRJ94t.js → gitGraphDiagram-UUTBAWPF-D97pbMQb.js} +1 -1
  262. package/payload/server/public/assets/graph-labels-cZu4pK16.js +1 -0
  263. package/payload/server/public/assets/{graph-g48ZcA5M.js → graph-qz5tFKqU.js} +3 -3
  264. package/payload/server/public/assets/{graphlib-YmNcoMjY.js → graphlib-Lq8ijgON.js} +1 -1
  265. package/payload/server/public/assets/info-OMHHGYJF-DsTNigSS.js +1 -0
  266. package/payload/server/public/assets/infoDiagram-42DDH7IO-C_OarRTA.js +2 -0
  267. package/payload/server/public/assets/{isEmpty-D6Kr-M1M.js → isEmpty-D6QovjYR.js} +1 -1
  268. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DTrq54yC.js → ishikawaDiagram-UXIWVN3A-B8XBdjJn.js} +1 -1
  269. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-OZZZMrFX.js → journeyDiagram-VCZTEJTY-CZYbiOaQ.js} +1 -1
  270. package/payload/server/public/assets/{kanban-definition-6JOO6SKY--w-IP9pN.js → kanban-definition-6JOO6SKY-B1PybFoh.js} +1 -1
  271. package/payload/server/public/assets/{line-Ckeulv5T.js → line-D-tw3hHp.js} +1 -1
  272. package/payload/server/public/assets/{linear-DOh_6k2k.js → linear-BHhXD3cd.js} +1 -1
  273. package/payload/server/public/assets/{mermaid-parser.core-CVRAxYRD.js → mermaid-parser.core-C9RAnysF.js} +2 -2
  274. package/payload/server/public/assets/{mermaid.core-B-mE18I1.js → mermaid.core-B532LT1r.js} +3 -3
  275. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-Bm8mDicL.js → mindmap-definition-QFDTVHPH-DGlgeeTV.js} +1 -1
  276. package/payload/server/public/assets/{ordinal-BDi6f4xk.js → ordinal-Bl-aM5b9.js} +1 -1
  277. package/payload/server/public/assets/packet-4T2RLAQJ-DGES22b-.js +1 -0
  278. package/payload/server/public/assets/pie-ZZUOXDRM-ChKeDbzt.js +1 -0
  279. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BCmRLgGO.js → pieDiagram-DEJITSTG-DV9FIWko.js} +1 -1
  280. package/payload/server/public/assets/{public-DknO-g9S.js → public-Bu2_Xi0a.js} +5 -5
  281. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CniTIUTm.js → quadrantDiagram-34T5L4WZ-Betwya4l.js} +1 -1
  282. package/payload/server/public/assets/radar-PYXPWWZC-FGG5Fs7N.js +1 -0
  283. package/payload/server/public/assets/{reduce-CGi9ik8i.js → reduce-BD4xUd2c.js} +1 -1
  284. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CoxBSj9M.js → requirementDiagram-MS252O5E-Cq3vODdg.js} +1 -1
  285. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-BjS-4jzq.js → sankeyDiagram-XADWPNL6-x8krXWcS.js} +1 -1
  286. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-B9jVOnPR.js → sequenceDiagram-FGHM5R23-i-_uH-Yl.js} +1 -1
  287. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BvOQPzP8.js → stateDiagram-FHFEXIEX-il4KqSgI.js} +1 -1
  288. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B6zNJ6Tv.js +1 -0
  289. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CdfgWLo1.js → timeline-definition-GMOUNBTQ-DATdZkA5.js} +1 -1
  290. package/payload/server/public/assets/treeView-SZITEDCU-VAQQdbtf.js +1 -0
  291. package/payload/server/public/assets/treemap-W4RFUUIX-DKchO3zI.js +1 -0
  292. package/payload/server/public/assets/useSelectionMode-A5KItZ2T.js +13 -0
  293. package/payload/server/public/assets/{brand-D0gNihp7.css → useSelectionMode-C-Ojh7W9.css} +1 -1
  294. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-JCgpIbj-.js → vennDiagram-DHZGUBPP-BJh9tJTt.js} +1 -1
  295. package/payload/server/public/assets/wardley-RL74JXVD-CBGtx0bS.js +1 -0
  296. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Dei3VqHo.js → wardleyDiagram-NUSXRM2D-EMN1Hdfg.js} +1 -1
  297. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DUtIyoIb.js → xychartDiagram-5P7HB3ND-DbUWXa7T.js} +1 -1
  298. package/payload/server/public/data.html +5 -5
  299. package/payload/server/public/graph.html +6 -6
  300. package/payload/server/public/index.html +5 -6
  301. package/payload/server/public/public.html +4 -5
  302. package/payload/server/server.js +525 -39
  303. package/payload/platform/plugins/admin/hooks/__tests__/session-end-retrospective.test.sh +0 -396
  304. package/payload/platform/plugins/admin/hooks/lib/admin-graph-pass-common.sh +0 -239
  305. package/payload/platform/plugins/admin/hooks/session-end-retrospective.sh +0 -214
  306. package/payload/server/public/assets/AdminShell-892Jy_rs.js +0 -1
  307. package/payload/server/public/assets/Checkbox-Bc2QzX9b.js +0 -1
  308. package/payload/server/public/assets/admin-D3K13ndi.js +0 -1
  309. package/payload/server/public/assets/architecture-YZFGNWBL--v-pJPNp.js +0 -1
  310. package/payload/server/public/assets/brand-CcN3dELF.js +0 -9
  311. package/payload/server/public/assets/channel-B1IT7to2.js +0 -1
  312. package/payload/server/public/assets/chunk-336JU56O-CdKRCIeE.js +0 -2
  313. package/payload/server/public/assets/chunk-426QAEUC-BybuQ3Ve.js +0 -1
  314. package/payload/server/public/assets/chunk-QZHKN3VN-Bd-GrQM6.js +0 -1
  315. package/payload/server/public/assets/classDiagram-6PBFFD2Q-rjCize6i.js +0 -1
  316. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BORWOUt0.js +0 -1
  317. package/payload/server/public/assets/clone-Csqv5U6T.js +0 -1
  318. package/payload/server/public/assets/data-Br-pdljK.js +0 -1
  319. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CI0s_tqn.js +0 -1
  320. package/payload/server/public/assets/graph-labels-BYH-IPCb.js +0 -1
  321. package/payload/server/public/assets/info-OMHHGYJF-g3gYW7Qm.js +0 -1
  322. package/payload/server/public/assets/infoDiagram-42DDH7IO-Di6oPQ_-.js +0 -2
  323. package/payload/server/public/assets/packet-4T2RLAQJ-CT0TB9HI.js +0 -1
  324. package/payload/server/public/assets/pie-ZZUOXDRM-CXLe7TFF.js +0 -1
  325. package/payload/server/public/assets/radar-PYXPWWZC-DnPLBl-D.js +0 -1
  326. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-v4ND10uR.js +0 -1
  327. package/payload/server/public/assets/treeView-SZITEDCU-C3cb7Xwe.js +0 -1
  328. package/payload/server/public/assets/treemap-W4RFUUIX-Dc7G3Bgm.js +0 -1
  329. package/payload/server/public/assets/useSelectionMode-DwsyptOw.js +0 -5
  330. package/payload/server/public/assets/wardley-RL74JXVD-DtgibWAt.js +0 -1
  331. /package/payload/server/public/assets/{_baseFor-Cam2PbSt.js → _baseFor-Cs8Y-rGh.js} +0 -0
  332. /package/payload/server/public/assets/{array-DYRGGQae.js → array-iHZP4KWJ.js} +0 -0
  333. /package/payload/server/public/assets/{cytoscape.esm-nWsJMTNI.js → cytoscape.esm-BR2GOQ8_.js} +0 -0
  334. /package/payload/server/public/assets/{defaultLocale-Du1XY3Dp.js → defaultLocale-B9aLeOTg.js} +0 -0
  335. /package/payload/server/public/assets/{dist-BzAsli7o.js → dist-DB-VPj_8.js} +0 -0
  336. /package/payload/server/public/assets/{init-B5BXBRcm.js → init-BNFRgqHM.js} +0 -0
  337. /package/payload/server/public/assets/{katex-HOUACuRw.js → katex-B-EfS3nw.js} +0 -0
  338. /package/payload/server/public/assets/{path-CNO468J-.js → path-DmWWdwp7.js} +0 -0
  339. /package/payload/server/public/assets/{rough.esm-DRO6hWPh.js → rough.esm-Ci7Kjt46.js} +0 -0
  340. /package/payload/server/public/assets/{src-CWiyyVfn.js → src-C1jfwBq0.js} +0 -0
@@ -0,0 +1,1667 @@
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 — Solid</title>
7
+ <!--
8
+ ============================================================
9
+ TEMPLATE: SOLID
10
+
11
+ An editorial-tech theme inspired by solid.design.
12
+
13
+ - Deep black base with subtle aurora gradient
14
+ - Frosted-glass cards (backdrop-filter blur)
15
+ - Inter Tight for headlines, JetBrains Mono for chrome
16
+ - Numbered markers (`01`) in hairline bordered boxes — signature
17
+ - Hairline gradient borders, subtle inner highlights
18
+ - Noise overlay for premium tech feel
19
+ - No chromatic accent
20
+
21
+ Same 21 components and behavior as deck.html.
22
+ ============================================================
23
+ -->
24
+ <style>
25
+ @import url('https://fonts.googleapis.com/css2?family=Inter+Tight:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
26
+
27
+ :root {
28
+ --bg: #0a0a0a;
29
+ --bg-deeper: #050505;
30
+ --glass: rgba(255,255,255,0.03);
31
+ --glass-strong: rgba(255,255,255,0.05);
32
+ --glass-bright: rgba(255,255,255,0.08);
33
+ --hairline: rgba(255,255,255,0.08);
34
+ --hairline-strong: rgba(255,255,255,0.14);
35
+ --hairline-bright: rgba(255,255,255,0.22);
36
+ --text: #f0f0f0;
37
+ --text-muted: #8a8a8a;
38
+ --text-subtle: #555555;
39
+ --invert-bg: #f5f5f3;
40
+ --invert-text: #0a0a0a;
41
+ --invert-muted: #5a5a5a;
42
+ --radius-sm: 6px;
43
+ --radius: 10px;
44
+ --radius-lg: 14px;
45
+ --radius-pill: 999px;
46
+ --mono: 'JetBrains Mono', 'SF Mono', ui-monospace, monospace;
47
+ --blur: blur(24px) saturate(1.4);
48
+ }
49
+
50
+ * { margin: 0; padding: 0; box-sizing: border-box; }
51
+
52
+ html, body {
53
+ width: 100%;
54
+ height: 100%;
55
+ overflow: hidden;
56
+ font-family: 'Inter Tight', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
57
+ background: var(--bg);
58
+ color: var(--text);
59
+ -webkit-font-smoothing: antialiased;
60
+ font-feature-settings: 'ss01', 'cv11';
61
+ }
62
+
63
+ /* Aurora gradient — gives the frosted glass something to reveal */
64
+ body::before {
65
+ content: '';
66
+ position: fixed;
67
+ inset: 0;
68
+ background:
69
+ radial-gradient(ellipse 70% 50% at 18% 8%, rgba(255,255,255,0.06), transparent 55%),
70
+ radial-gradient(ellipse 60% 50% at 82% 92%, rgba(255,255,255,0.04), transparent 55%),
71
+ radial-gradient(ellipse 100% 60% at 50% 50%, transparent 30%, rgba(0,0,0,0.5) 100%);
72
+ pointer-events: none;
73
+ z-index: 0;
74
+ }
75
+
76
+ /* Subtle noise overlay for premium tech feel */
77
+ body::after {
78
+ content: '';
79
+ position: fixed;
80
+ inset: 0;
81
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.18 0'/></filter><rect width='200' height='200' filter='url(%23n)'/></svg>");
82
+ background-size: 200px 200px;
83
+ opacity: 0.35;
84
+ mix-blend-mode: overlay;
85
+ pointer-events: none;
86
+ z-index: 1;
87
+ }
88
+
89
+ .deck {
90
+ width: 100vw;
91
+ height: 100vh;
92
+ position: relative;
93
+ z-index: 2;
94
+ }
95
+
96
+ .slide {
97
+ position: absolute;
98
+ inset: 0;
99
+ display: none;
100
+ align-items: center;
101
+ justify-content: center;
102
+ padding: 6vh 8vw;
103
+ }
104
+
105
+ .slide.active { display: flex; }
106
+
107
+ .slide-inner {
108
+ width: 100%;
109
+ max-width: 1100px;
110
+ }
111
+
112
+ /* --- Glass primitive shared across cards --- */
113
+ .glass {
114
+ background: var(--glass);
115
+ backdrop-filter: var(--blur);
116
+ -webkit-backdrop-filter: var(--blur);
117
+ border: 1px solid var(--hairline);
118
+ border-radius: var(--radius);
119
+ box-shadow:
120
+ inset 0 1px 0 rgba(255,255,255,0.06),
121
+ 0 1px 0 rgba(0,0,0,0.3);
122
+ }
123
+
124
+ /* --- Typography --- */
125
+ .eyebrow {
126
+ font-family: var(--mono);
127
+ font-size: 0.7rem;
128
+ font-weight: 400;
129
+ color: var(--text-muted);
130
+ margin-bottom: 1.75rem;
131
+ display: inline-flex;
132
+ align-items: center;
133
+ gap: 0.5rem;
134
+ background: var(--glass);
135
+ backdrop-filter: var(--blur);
136
+ -webkit-backdrop-filter: var(--blur);
137
+ border: 1px solid var(--hairline);
138
+ border-radius: var(--radius);
139
+ padding: 0.3rem 0.6rem;
140
+ letter-spacing: 0.02em;
141
+ }
142
+
143
+ .eyebrow::before {
144
+ content: '';
145
+ width: 6px;
146
+ height: 6px;
147
+ background: var(--text);
148
+ border-radius: 50%;
149
+ display: inline-block;
150
+ box-shadow: 0 0 8px rgba(255,255,255,0.4);
151
+ }
152
+
153
+ h1 {
154
+ font-size: clamp(2.5rem, 5.6vw, 5rem);
155
+ font-weight: 500;
156
+ line-height: 1.2;
157
+ letter-spacing: 0.01em;
158
+ color: var(--text);
159
+ margin-bottom: 1.5rem;
160
+ }
161
+
162
+ h1 span.dim, h2 span.dim, h3 span.dim {
163
+ color: var(--text-muted);
164
+ font-weight: 500;
165
+ }
166
+
167
+ h2 {
168
+ font-size: clamp(1.7rem, 3.3vw, 2.6rem);
169
+ font-weight: 500;
170
+ line-height: 1.25;
171
+ letter-spacing: 0.01em;
172
+ color: var(--text);
173
+ margin-bottom: 1.25rem;
174
+ }
175
+
176
+ .subtitle {
177
+ font-family: var(--mono);
178
+ font-size: clamp(0.82rem, 1.05vw, 0.92rem);
179
+ color: var(--text-muted);
180
+ font-weight: 400;
181
+ line-height: 1.65;
182
+ max-width: 720px;
183
+ }
184
+
185
+ .meta {
186
+ font-family: var(--mono);
187
+ font-size: 0.78rem;
188
+ color: var(--text-muted);
189
+ font-weight: 400;
190
+ margin-top: 3rem;
191
+ letter-spacing: 0.02em;
192
+ }
193
+
194
+ /* --- Quote slide --- */
195
+ .quote-slide h1 {
196
+ font-size: clamp(2.8rem, 6.2vw, 5.8rem);
197
+ line-height: 1.15;
198
+ letter-spacing: 0em;
199
+ }
200
+
201
+ /* --- Two col --- */
202
+ .two-col {
203
+ display: grid;
204
+ grid-template-columns: 1fr 1fr;
205
+ gap: 4rem;
206
+ align-items: center;
207
+ }
208
+
209
+ .two-col h3 {
210
+ font-size: 1rem;
211
+ font-weight: 500;
212
+ color: var(--text);
213
+ margin-bottom: 0.5rem;
214
+ }
215
+
216
+ .two-col p {
217
+ font-family: var(--mono);
218
+ font-size: 0.84rem;
219
+ color: var(--text-muted);
220
+ line-height: 1.65;
221
+ }
222
+
223
+ .col-stack > * + * { margin-top: 0; }
224
+
225
+ .step {
226
+ font-family: var(--mono);
227
+ font-size: clamp(0.8rem, 1.05vw, 0.92rem);
228
+ color: var(--text);
229
+ font-weight: 400;
230
+ padding: 0.8rem 0.95rem;
231
+ background: var(--glass);
232
+ backdrop-filter: var(--blur);
233
+ -webkit-backdrop-filter: var(--blur);
234
+ border: 1px solid var(--hairline);
235
+ border-radius: var(--radius);
236
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.04);
237
+ margin-bottom: 0.45rem;
238
+ }
239
+
240
+ .step.dim { color: var(--text-subtle); border-color: rgba(255,255,255,0.04); background: transparent; box-shadow: none; }
241
+ .step.kill { color: var(--text); border-color: var(--hairline-strong); }
242
+ .step.kill::before { content: '×'; margin-right: 0.55rem; color: var(--text-muted); }
243
+ .step.live { color: var(--text); border-color: var(--hairline-strong); }
244
+ .step.live::before { content: '✓'; margin-right: 0.55rem; color: var(--text-muted); }
245
+
246
+ /* --- Three col --- */
247
+ .three-col {
248
+ display: grid;
249
+ grid-template-columns: repeat(3, 1fr);
250
+ gap: 1rem;
251
+ counter-reset: threecol;
252
+ }
253
+
254
+ .three-col > div {
255
+ background: var(--glass);
256
+ backdrop-filter: var(--blur);
257
+ -webkit-backdrop-filter: var(--blur);
258
+ border: 1px solid var(--hairline);
259
+ border-radius: var(--radius);
260
+ padding: 1.75rem 1.5rem 1.75rem;
261
+ position: relative;
262
+ box-shadow:
263
+ inset 0 1px 0 rgba(255,255,255,0.06),
264
+ 0 1px 30px rgba(0,0,0,0.2);
265
+ }
266
+
267
+ .three-col > div::before {
268
+ content: counter(threecol, decimal-leading-zero);
269
+ counter-increment: threecol;
270
+ position: absolute;
271
+ top: 1rem;
272
+ right: 1rem;
273
+ font-family: var(--mono);
274
+ font-size: 0.65rem;
275
+ color: var(--text-subtle);
276
+ border: 1px solid var(--hairline);
277
+ border-radius: var(--radius-sm);
278
+ padding: 0.2rem 0.45rem;
279
+ }
280
+
281
+ .three-col h3 {
282
+ font-size: 1.05rem;
283
+ font-weight: 500;
284
+ color: var(--text);
285
+ margin-bottom: 0.5rem;
286
+ margin-top: 1.75rem;
287
+ letter-spacing: -0.015em;
288
+ }
289
+
290
+ .three-col p {
291
+ font-family: var(--mono);
292
+ font-size: 0.78rem;
293
+ color: var(--text-muted);
294
+ line-height: 1.65;
295
+ }
296
+
297
+ /* --- Capability list (Q&A) --- */
298
+ .cap-list {
299
+ background: var(--glass);
300
+ backdrop-filter: var(--blur);
301
+ -webkit-backdrop-filter: var(--blur);
302
+ border: 1px solid var(--hairline);
303
+ border-radius: var(--radius);
304
+ padding: 0.5rem 1.5rem;
305
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.06);
306
+ }
307
+
308
+ .cap-row {
309
+ display: grid;
310
+ grid-template-columns: 1fr 1fr;
311
+ gap: 3rem;
312
+ padding: 1.3rem 0;
313
+ border-top: 1px solid var(--hairline);
314
+ align-items: baseline;
315
+ }
316
+
317
+ .cap-row:first-child { border-top: none; }
318
+ .cap-q { font-size: 1.05rem; font-weight: 500; color: var(--text); letter-spacing: -0.015em; }
319
+ .cap-a { font-family: var(--mono); font-size: 0.82rem; color: var(--text-muted); line-height: 1.65; }
320
+
321
+ /* --- Callout --- */
322
+ .callout {
323
+ background: var(--glass-strong);
324
+ backdrop-filter: var(--blur);
325
+ -webkit-backdrop-filter: var(--blur);
326
+ border: 1px solid var(--hairline-strong);
327
+ border-radius: var(--radius);
328
+ padding: 2.5rem 2.75rem;
329
+ box-shadow:
330
+ inset 0 1px 0 rgba(255,255,255,0.1),
331
+ 0 30px 60px rgba(0,0,0,0.4);
332
+ position: relative;
333
+ overflow: hidden;
334
+ }
335
+
336
+ .callout::before {
337
+ content: '';
338
+ position: absolute;
339
+ inset: 0;
340
+ background: radial-gradient(ellipse 80% 60% at 30% -10%, rgba(255,255,255,0.06), transparent 60%);
341
+ pointer-events: none;
342
+ }
343
+
344
+ .callout h3 {
345
+ font-family: var(--mono);
346
+ font-size: 0.7rem;
347
+ color: var(--text-muted);
348
+ margin-bottom: 1rem;
349
+ font-weight: 400;
350
+ border: 1px solid var(--hairline);
351
+ border-radius: var(--radius-sm);
352
+ padding: 0.25rem 0.55rem;
353
+ display: inline-block;
354
+ background: var(--glass);
355
+ }
356
+
357
+ .callout p {
358
+ font-family: var(--mono);
359
+ font-size: 0.95rem;
360
+ line-height: 1.65;
361
+ color: var(--text-muted);
362
+ position: relative;
363
+ }
364
+
365
+ .callout p strong { color: var(--text); font-weight: 500; }
366
+
367
+ /* --- Dot flow --- */
368
+ .dot-flow {
369
+ display: grid;
370
+ grid-template-columns: repeat(5, 1fr);
371
+ margin: 2.5rem 0;
372
+ position: relative;
373
+ }
374
+
375
+ .dot-flow::before {
376
+ content: '';
377
+ position: absolute;
378
+ top: 14px;
379
+ left: 8%;
380
+ right: 8%;
381
+ height: 1px;
382
+ background: linear-gradient(90deg, transparent, var(--hairline-bright) 20%, var(--hairline-bright) 80%, transparent);
383
+ }
384
+
385
+ .dot-step { text-align: center; }
386
+
387
+ .dot-step .dot {
388
+ width: 28px;
389
+ height: 28px;
390
+ border-radius: var(--radius-sm);
391
+ background: var(--bg);
392
+ border: 1px solid var(--hairline-bright);
393
+ margin: 0 auto 0.95rem;
394
+ position: relative;
395
+ z-index: 1;
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: center;
399
+ color: var(--text-muted);
400
+ font-family: var(--mono);
401
+ font-size: 0.7rem;
402
+ font-weight: 400;
403
+ box-shadow:
404
+ inset 0 1px 0 rgba(255,255,255,0.06),
405
+ 0 0 0 4px var(--bg);
406
+ }
407
+
408
+ .dot-step h4 { font-size: 0.92rem; font-weight: 500; color: var(--text); margin-bottom: 0.3rem; letter-spacing: -0.01em; }
409
+ .dot-step p { font-family: var(--mono); font-size: 0.7rem; color: var(--text-muted); line-height: 1.5; padding: 0 0.5rem; }
410
+
411
+ /* --- Stack grid --- */
412
+ .stack-grid {
413
+ display: grid;
414
+ grid-template-columns: repeat(4, 1fr);
415
+ gap: 0.75rem;
416
+ margin-top: 2rem;
417
+ }
418
+
419
+ .stack-card {
420
+ background: var(--glass);
421
+ backdrop-filter: var(--blur);
422
+ -webkit-backdrop-filter: var(--blur);
423
+ border: 1px solid var(--hairline);
424
+ border-radius: var(--radius);
425
+ padding: 1.25rem 1.25rem 1.4rem;
426
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
427
+ }
428
+
429
+ .stack-card-label {
430
+ font-family: var(--mono);
431
+ font-size: 0.65rem;
432
+ color: var(--text-muted);
433
+ margin-bottom: 0.95rem;
434
+ border: 1px solid var(--hairline);
435
+ border-radius: var(--radius-sm);
436
+ padding: 0.2rem 0.45rem;
437
+ display: inline-block;
438
+ font-weight: 400;
439
+ background: rgba(0,0,0,0.2);
440
+ }
441
+
442
+ .stack-tool {
443
+ display: flex;
444
+ align-items: center;
445
+ gap: 0.5rem;
446
+ font-family: var(--mono);
447
+ font-size: 0.85rem;
448
+ font-weight: 400;
449
+ color: var(--text);
450
+ padding: 0.3rem 0;
451
+ }
452
+
453
+ .stack-tool .mark {
454
+ width: 14px;
455
+ height: 14px;
456
+ background: transparent;
457
+ border: 1px solid var(--hairline-bright);
458
+ border-radius: 3px;
459
+ flex-shrink: 0;
460
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
461
+ }
462
+
463
+ /* --- Spec flow --- */
464
+ .spec-flow {
465
+ display: flex;
466
+ flex-direction: column;
467
+ gap: 1rem;
468
+ margin-top: 2rem;
469
+ }
470
+
471
+ .spec-block {
472
+ background: var(--invert-bg);
473
+ color: var(--invert-text);
474
+ border-radius: var(--radius);
475
+ padding: 1.2rem 1.6rem;
476
+ display: flex;
477
+ align-items: center;
478
+ justify-content: space-between;
479
+ box-shadow:
480
+ inset 0 1px 0 rgba(255,255,255,0.5),
481
+ 0 30px 60px rgba(0,0,0,0.3);
482
+ }
483
+
484
+ .spec-block h4 { font-size: 1.05rem; font-weight: 500; letter-spacing: -0.015em; }
485
+ .spec-block p { font-family: var(--mono); font-size: 0.78rem; color: var(--invert-muted); font-weight: 400; }
486
+
487
+ .ctx-row { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
488
+
489
+ .ctx-label {
490
+ font-family: var(--mono);
491
+ font-size: 0.7rem;
492
+ color: var(--text-subtle);
493
+ margin-right: 0.4rem;
494
+ }
495
+
496
+ .ctx-pill {
497
+ font-family: var(--mono);
498
+ font-size: 0.7rem;
499
+ color: var(--text-muted);
500
+ background: var(--glass);
501
+ backdrop-filter: var(--blur);
502
+ -webkit-backdrop-filter: var(--blur);
503
+ border: 1px solid var(--hairline);
504
+ border-radius: var(--radius-sm);
505
+ padding: 0.3rem 0.65rem;
506
+ }
507
+
508
+ .ai-divider { display: flex; align-items: center; gap: 1rem; }
509
+ .ai-divider .line { flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--hairline-bright), transparent); }
510
+
511
+ .ai-pill {
512
+ font-family: var(--mono);
513
+ font-size: 0.65rem;
514
+ font-weight: 400;
515
+ color: var(--text-muted);
516
+ background: var(--glass);
517
+ backdrop-filter: var(--blur);
518
+ -webkit-backdrop-filter: var(--blur);
519
+ border: 1px solid var(--hairline);
520
+ border-radius: var(--radius-sm);
521
+ padding: 0.25rem 0.6rem;
522
+ }
523
+
524
+ .outputs-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75rem; }
525
+
526
+ .output-card {
527
+ background: var(--glass);
528
+ backdrop-filter: var(--blur);
529
+ -webkit-backdrop-filter: var(--blur);
530
+ border: 1px solid var(--hairline);
531
+ border-radius: var(--radius);
532
+ padding: 1.1rem 1.2rem;
533
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
534
+ }
535
+
536
+ .output-card h5 { font-size: 0.95rem; font-weight: 500; color: var(--text); margin-bottom: 0.3rem; letter-spacing: -0.015em; }
537
+ .output-card p { font-family: var(--mono); font-size: 0.7rem; color: var(--text-muted); line-height: 1.55; }
538
+
539
+ /* --- Product slide --- */
540
+ .product-row {
541
+ display: grid;
542
+ grid-template-columns: 1fr auto;
543
+ gap: 4rem;
544
+ align-items: center;
545
+ }
546
+
547
+ .product-meta { max-width: 460px; }
548
+ .product-num {
549
+ font-family: var(--mono);
550
+ font-size: 0.7rem;
551
+ color: var(--text-muted);
552
+ margin-bottom: 1.5rem;
553
+ background: var(--glass);
554
+ backdrop-filter: var(--blur);
555
+ -webkit-backdrop-filter: var(--blur);
556
+ border: 1px solid var(--hairline);
557
+ border-radius: var(--radius-sm);
558
+ padding: 0.25rem 0.55rem;
559
+ display: inline-block;
560
+ }
561
+ .product-tag { font-size: 0.92rem; font-weight: 500; color: var(--text-muted); margin-bottom: 0.85rem; letter-spacing: -0.01em; }
562
+
563
+ .product-headline {
564
+ font-size: clamp(1.5rem, 2.6vw, 2.2rem);
565
+ font-weight: 500;
566
+ color: var(--text);
567
+ line-height: 1.15;
568
+ letter-spacing: -0.03em;
569
+ margin-bottom: 1rem;
570
+ }
571
+
572
+ .product-desc {
573
+ font-family: var(--mono);
574
+ font-size: clamp(0.85rem, 1.05vw, 0.95rem);
575
+ color: var(--text-muted);
576
+ line-height: 1.65;
577
+ margin-bottom: 1.5rem;
578
+ }
579
+
580
+ .product-stat {
581
+ font-family: var(--mono);
582
+ font-size: 0.72rem;
583
+ color: var(--text-muted);
584
+ background: var(--glass);
585
+ backdrop-filter: var(--blur);
586
+ -webkit-backdrop-filter: var(--blur);
587
+ border: 1px solid var(--hairline);
588
+ border-radius: var(--radius-sm);
589
+ padding: 0.3rem 0.6rem;
590
+ display: inline-block;
591
+ }
592
+
593
+ .product-name {
594
+ font-size: clamp(4rem, 9vw, 8rem);
595
+ font-weight: 500;
596
+ color: var(--text);
597
+ letter-spacing: -0.05em;
598
+ line-height: 0.95;
599
+ text-align: right;
600
+ background: linear-gradient(180deg, var(--text) 0%, rgba(240,240,240,0.5) 100%);
601
+ -webkit-background-clip: text;
602
+ -webkit-text-fill-color: transparent;
603
+ background-clip: text;
604
+ }
605
+
606
+ .product-name sup {
607
+ font-size: 0.25em;
608
+ font-weight: 400;
609
+ color: var(--text-muted);
610
+ -webkit-text-fill-color: var(--text-muted);
611
+ vertical-align: super;
612
+ margin-left: 0.1em;
613
+ }
614
+
615
+ /* --- Collage slide --- */
616
+ .slide.collage-slide {
617
+ background: var(--bg);
618
+ padding: 4vh 4vw;
619
+ }
620
+
621
+ .collage {
622
+ border-radius: var(--radius);
623
+ overflow: hidden;
624
+ border: 1px solid var(--hairline);
625
+ box-shadow: 0 40px 100px rgba(0,0,0,0.5);
626
+ display: flex;
627
+ align-items: center;
628
+ justify-content: center;
629
+ line-height: 0;
630
+ }
631
+
632
+ .collage img,
633
+ .collage video {
634
+ max-height: 92vh;
635
+ max-width: 90vw;
636
+ height: auto;
637
+ width: auto;
638
+ display: block;
639
+ }
640
+
641
+ .collage .placeholder {
642
+ font-family: var(--mono);
643
+ color: var(--text-subtle);
644
+ font-size: 0.75rem;
645
+ letter-spacing: 0.04em;
646
+ padding: 4rem;
647
+ text-align: center;
648
+ background: var(--glass);
649
+ backdrop-filter: var(--blur);
650
+ -webkit-backdrop-filter: var(--blur);
651
+ aspect-ratio: 3 / 4;
652
+ height: 92vh;
653
+ display: flex;
654
+ align-items: center;
655
+ justify-content: center;
656
+ }
657
+
658
+ /* --- JEDUF --- */
659
+ .jeduf {
660
+ display: grid;
661
+ grid-template-columns: 1fr 1.15fr 1fr;
662
+ gap: 0.75rem;
663
+ margin-top: 1.5rem;
664
+ }
665
+
666
+ .jeduf-col {
667
+ background: var(--glass);
668
+ backdrop-filter: var(--blur);
669
+ -webkit-backdrop-filter: var(--blur);
670
+ border: 1px solid var(--hairline);
671
+ border-radius: var(--radius);
672
+ padding: 1.4rem 1.2rem 1.6rem;
673
+ display: flex;
674
+ flex-direction: column;
675
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
676
+ }
677
+
678
+ .jeduf-col.hero {
679
+ background: var(--invert-bg);
680
+ color: var(--invert-text);
681
+ border-color: var(--invert-bg);
682
+ box-shadow:
683
+ inset 0 1px 0 rgba(255,255,255,0.5),
684
+ 0 30px 60px rgba(0,0,0,0.4);
685
+ }
686
+
687
+ .jeduf-label {
688
+ font-family: var(--mono);
689
+ font-size: 0.65rem;
690
+ color: var(--text-muted);
691
+ margin-bottom: 0.55rem;
692
+ border: 1px solid var(--hairline);
693
+ border-radius: var(--radius-sm);
694
+ padding: 0.18rem 0.45rem;
695
+ display: inline-block;
696
+ align-self: flex-start;
697
+ background: rgba(0,0,0,0.2);
698
+ }
699
+
700
+ .jeduf-col.hero .jeduf-label {
701
+ color: var(--invert-muted);
702
+ border-color: rgba(0,0,0,0.15);
703
+ background: transparent;
704
+ }
705
+
706
+ .jeduf-title { font-size: 1.05rem; font-weight: 500; color: var(--text); margin-bottom: 0.4rem; letter-spacing: -0.015em; }
707
+ .jeduf-col.hero .jeduf-title { color: var(--invert-text); }
708
+
709
+ .jeduf-philosophy {
710
+ font-family: var(--mono);
711
+ font-size: 0.72rem;
712
+ color: var(--text-muted);
713
+ margin-bottom: 1rem;
714
+ line-height: 1.55;
715
+ min-height: 30pt;
716
+ }
717
+
718
+ .jeduf-col.hero .jeduf-philosophy { color: var(--invert-muted); }
719
+
720
+ .jeduf-step {
721
+ border: 1px solid var(--hairline);
722
+ border-radius: var(--radius-sm);
723
+ padding: 0.5rem 0.75rem;
724
+ font-family: var(--mono);
725
+ font-size: 0.72rem;
726
+ font-weight: 400;
727
+ text-align: left;
728
+ color: var(--text);
729
+ background: rgba(0,0,0,0.2);
730
+ margin-bottom: 0.4rem;
731
+ }
732
+
733
+ .jeduf-col.hero .jeduf-step {
734
+ background: rgba(0,0,0,0.04);
735
+ border-color: rgba(0,0,0,0.1);
736
+ color: var(--invert-text);
737
+ }
738
+
739
+ /* --- Timeline --- */
740
+ .timeline {
741
+ display: flex;
742
+ flex-direction: column;
743
+ margin-top: 2rem;
744
+ }
745
+
746
+ .timeline-row {
747
+ display: grid;
748
+ grid-template-columns: 120px 24px 1fr;
749
+ gap: 0 1.5rem;
750
+ align-items: start;
751
+ }
752
+
753
+ .timeline-year {
754
+ font-family: var(--mono);
755
+ font-size: 0.78rem;
756
+ font-weight: 400;
757
+ text-align: right;
758
+ padding-top: 1.15rem;
759
+ color: var(--text-muted);
760
+ letter-spacing: 0.02em;
761
+ }
762
+
763
+ .timeline-track {
764
+ display: flex;
765
+ flex-direction: column;
766
+ align-items: center;
767
+ position: relative;
768
+ height: 100%;
769
+ }
770
+
771
+ .timeline-dot {
772
+ width: 11px;
773
+ height: 11px;
774
+ border-radius: 50%;
775
+ background: var(--bg);
776
+ border: 1px solid var(--hairline-bright);
777
+ margin-top: 1.3rem;
778
+ flex-shrink: 0;
779
+ position: relative;
780
+ z-index: 1;
781
+ box-shadow:
782
+ inset 0 1px 0 rgba(255,255,255,0.1),
783
+ 0 0 12px rgba(255,255,255,0.08);
784
+ }
785
+
786
+ .timeline-line {
787
+ width: 1px;
788
+ flex: 1;
789
+ background: linear-gradient(180deg, var(--hairline-bright), var(--hairline));
790
+ }
791
+
792
+ .timeline-row:last-child .timeline-line { display: none; }
793
+
794
+ .timeline-content {
795
+ padding: 1rem 0 2rem;
796
+ }
797
+
798
+ .timeline-content h4 {
799
+ font-size: 1rem;
800
+ font-weight: 500;
801
+ color: var(--text);
802
+ margin-bottom: 0.3rem;
803
+ letter-spacing: -0.015em;
804
+ }
805
+
806
+ .timeline-content p {
807
+ font-family: var(--mono);
808
+ font-size: 0.78rem;
809
+ color: var(--text-muted);
810
+ line-height: 1.6;
811
+ }
812
+
813
+ /* --- Stat grid --- */
814
+ .stat-grid {
815
+ display: grid;
816
+ grid-template-columns: repeat(3, 1fr);
817
+ gap: 0.85rem;
818
+ margin-top: 2rem;
819
+ }
820
+
821
+ .stat-card {
822
+ background: var(--glass);
823
+ backdrop-filter: var(--blur);
824
+ -webkit-backdrop-filter: var(--blur);
825
+ border: 1px solid var(--hairline);
826
+ border-radius: var(--radius);
827
+ padding: 1.75rem 1.6rem;
828
+ position: relative;
829
+ overflow: hidden;
830
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
831
+ }
832
+
833
+ .stat-card::before {
834
+ content: '';
835
+ position: absolute;
836
+ inset: 0;
837
+ background: radial-gradient(ellipse 100% 60% at 30% 0%, rgba(255,255,255,0.04), transparent 60%);
838
+ pointer-events: none;
839
+ }
840
+
841
+ .stat-card.stat-dark {
842
+ background: var(--invert-bg);
843
+ border-color: var(--invert-bg);
844
+ color: var(--invert-text);
845
+ box-shadow:
846
+ inset 0 1px 0 rgba(255,255,255,0.5),
847
+ 0 30px 60px rgba(0,0,0,0.4);
848
+ }
849
+
850
+ .stat-card.stat-dark::before { display: none; }
851
+
852
+ .stat-number {
853
+ font-size: clamp(2.6rem, 5vw, 3.8rem);
854
+ font-weight: 500;
855
+ color: var(--text);
856
+ letter-spacing: -0.045em;
857
+ line-height: 1;
858
+ margin-bottom: 0.7rem;
859
+ position: relative;
860
+ }
861
+
862
+ .stat-card.stat-dark .stat-number { color: var(--invert-text); }
863
+
864
+ .stat-label {
865
+ font-family: var(--mono);
866
+ font-size: 0.65rem;
867
+ color: var(--text-muted);
868
+ margin-bottom: 0.8rem;
869
+ border: 1px solid var(--hairline);
870
+ border-radius: var(--radius-sm);
871
+ padding: 0.2rem 0.45rem;
872
+ display: inline-block;
873
+ background: rgba(0,0,0,0.2);
874
+ position: relative;
875
+ }
876
+
877
+ .stat-card.stat-dark .stat-label {
878
+ color: var(--invert-muted);
879
+ border-color: rgba(0,0,0,0.15);
880
+ background: transparent;
881
+ }
882
+
883
+ .stat-desc {
884
+ font-family: var(--mono);
885
+ font-size: 0.78rem;
886
+ color: var(--text-muted);
887
+ line-height: 1.55;
888
+ position: relative;
889
+ }
890
+
891
+ .stat-card.stat-dark .stat-desc { color: var(--invert-muted); }
892
+
893
+ /* --- Quote pair --- */
894
+ .quote-pair {
895
+ display: grid;
896
+ grid-template-columns: 1fr 1fr;
897
+ gap: 0.85rem;
898
+ margin-top: 2rem;
899
+ }
900
+
901
+ .quote-card {
902
+ background: var(--glass);
903
+ backdrop-filter: var(--blur);
904
+ -webkit-backdrop-filter: var(--blur);
905
+ border: 1px solid var(--hairline);
906
+ border-radius: var(--radius);
907
+ padding: 1.85rem 1.6rem;
908
+ display: flex;
909
+ flex-direction: column;
910
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
911
+ }
912
+
913
+ .quote-card.quote-dark {
914
+ background: var(--invert-bg);
915
+ border-color: var(--invert-bg);
916
+ color: var(--invert-text);
917
+ box-shadow:
918
+ inset 0 1px 0 rgba(255,255,255,0.5),
919
+ 0 30px 60px rgba(0,0,0,0.4);
920
+ }
921
+
922
+ .quote-text {
923
+ font-size: clamp(0.98rem, 1.3vw, 1.18rem);
924
+ font-weight: 400;
925
+ line-height: 1.45;
926
+ flex: 1;
927
+ color: var(--text);
928
+ margin-bottom: 1.25rem;
929
+ letter-spacing: -0.015em;
930
+ }
931
+
932
+ .quote-card.quote-dark .quote-text { color: var(--invert-text); }
933
+
934
+ .quote-attr {
935
+ font-family: var(--mono);
936
+ font-size: 0.72rem;
937
+ font-weight: 400;
938
+ color: var(--text-muted);
939
+ padding-top: 1rem;
940
+ border-top: 1px solid var(--hairline);
941
+ }
942
+
943
+ .quote-card.quote-dark .quote-attr {
944
+ color: var(--invert-muted);
945
+ border-top-color: rgba(0,0,0,0.1);
946
+ }
947
+
948
+ /* --- Logo grid --- */
949
+ .logo-grid {
950
+ display: grid;
951
+ grid-template-columns: repeat(4, 1fr);
952
+ gap: 0.75rem;
953
+ margin-top: 2rem;
954
+ }
955
+
956
+ .logo-cell {
957
+ background: var(--glass);
958
+ backdrop-filter: var(--blur);
959
+ -webkit-backdrop-filter: var(--blur);
960
+ border: 1px solid var(--hairline);
961
+ border-radius: var(--radius);
962
+ padding: 1.5rem 1rem;
963
+ display: flex;
964
+ flex-direction: column;
965
+ align-items: center;
966
+ justify-content: center;
967
+ text-align: center;
968
+ min-height: 120px;
969
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.05);
970
+ }
971
+
972
+ .logo-cell img {
973
+ max-height: 36px;
974
+ max-width: 80%;
975
+ margin-bottom: 0.85rem;
976
+ object-fit: contain;
977
+ filter: grayscale(1) brightness(1.4);
978
+ opacity: 0.65;
979
+ }
980
+
981
+ .logo-mark {
982
+ width: 36px;
983
+ height: 36px;
984
+ border-radius: var(--radius-sm);
985
+ background: rgba(0,0,0,0.3);
986
+ border: 1px solid var(--hairline-bright);
987
+ margin-bottom: 0.85rem;
988
+ flex-shrink: 0;
989
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.06);
990
+ }
991
+
992
+ .logo-name {
993
+ font-family: var(--mono);
994
+ font-size: 0.78rem;
995
+ font-weight: 400;
996
+ color: var(--text);
997
+ }
998
+
999
+ .logo-role {
1000
+ font-family: var(--mono);
1001
+ font-size: 0.68rem;
1002
+ color: var(--text-subtle);
1003
+ margin-top: 0.25rem;
1004
+ }
1005
+
1006
+ /* --- Code slide --- */
1007
+ .code-frame {
1008
+ background: rgba(0,0,0,0.4);
1009
+ backdrop-filter: var(--blur);
1010
+ -webkit-backdrop-filter: var(--blur);
1011
+ border: 1px solid var(--hairline);
1012
+ border-radius: var(--radius);
1013
+ padding: 1.6rem 1.85rem;
1014
+ margin-top: 2rem;
1015
+ overflow-x: auto;
1016
+ box-shadow:
1017
+ inset 0 1px 0 rgba(255,255,255,0.05),
1018
+ 0 30px 60px rgba(0,0,0,0.4);
1019
+ }
1020
+
1021
+ .code-frame-header {
1022
+ display: flex;
1023
+ align-items: center;
1024
+ gap: 0.5rem;
1025
+ margin-bottom: 1.1rem;
1026
+ padding-bottom: 0.85rem;
1027
+ border-bottom: 1px solid var(--hairline);
1028
+ }
1029
+
1030
+ .code-frame-dot {
1031
+ width: 8px;
1032
+ height: 8px;
1033
+ border-radius: 50%;
1034
+ background: var(--hairline-bright);
1035
+ }
1036
+
1037
+ .code-frame-title {
1038
+ font-family: var(--mono);
1039
+ font-size: 0.7rem;
1040
+ color: var(--text-subtle);
1041
+ margin-left: 0.5rem;
1042
+ letter-spacing: 0.02em;
1043
+ }
1044
+
1045
+ .code-frame pre {
1046
+ font-family: var(--mono);
1047
+ font-size: 0.84rem;
1048
+ line-height: 1.7;
1049
+ color: var(--text);
1050
+ margin: 0;
1051
+ background: none;
1052
+ }
1053
+
1054
+ .code-frame .code-comment { color: var(--text-subtle); }
1055
+ .code-frame .code-keyword { color: var(--text-muted); font-weight: 500; }
1056
+ .code-frame .code-string { color: var(--text); }
1057
+ .code-frame .code-dim { color: var(--text-subtle); }
1058
+
1059
+ /* --- "Dark" slide (in this theme: inverted = light) --- */
1060
+ .slide.dark {
1061
+ background: var(--invert-bg);
1062
+ color: var(--invert-text);
1063
+ }
1064
+ .slide.dark::before, .slide.dark::after { display: none; }
1065
+ .slide.dark h1 { color: var(--invert-text); background: none; -webkit-text-fill-color: var(--invert-text); }
1066
+ .slide.dark h1 span.dim { color: var(--invert-muted); font-weight: 500; }
1067
+ .slide.dark .subtitle { color: var(--invert-muted); }
1068
+ .slide.dark .meta { color: var(--invert-muted); }
1069
+ .slide.dark .eyebrow {
1070
+ color: var(--invert-muted);
1071
+ border-color: rgba(0,0,0,0.12);
1072
+ background: rgba(0,0,0,0.02);
1073
+ }
1074
+ .slide.dark .eyebrow::before { background: var(--invert-text); box-shadow: none; }
1075
+
1076
+ /* --- Nav (frosted glass) --- */
1077
+ .nav {
1078
+ position: fixed;
1079
+ bottom: 1.5rem;
1080
+ right: 1.5rem;
1081
+ font-family: var(--mono);
1082
+ font-size: 0.7rem;
1083
+ color: var(--text-muted);
1084
+ z-index: 100;
1085
+ display: flex;
1086
+ align-items: center;
1087
+ gap: 0.85rem;
1088
+ background: var(--glass-bright);
1089
+ backdrop-filter: var(--blur);
1090
+ -webkit-backdrop-filter: var(--blur);
1091
+ border: 1px solid var(--hairline-strong);
1092
+ border-radius: var(--radius-pill);
1093
+ padding: 0.4rem 0.4rem 0.4rem 1rem;
1094
+ box-shadow:
1095
+ inset 0 1px 0 rgba(255,255,255,0.08),
1096
+ 0 12px 32px rgba(0,0,0,0.4);
1097
+ }
1098
+
1099
+ .nav-buttons { display: flex; gap: 0.3rem; }
1100
+
1101
+ .nav-btn {
1102
+ width: 28px;
1103
+ height: 28px;
1104
+ border-radius: var(--radius-pill);
1105
+ border: 1px solid var(--hairline);
1106
+ background: rgba(0,0,0,0.2);
1107
+ color: var(--text-muted);
1108
+ cursor: pointer;
1109
+ display: flex;
1110
+ align-items: center;
1111
+ justify-content: center;
1112
+ font-size: 0.85rem;
1113
+ padding: 0;
1114
+ font-family: var(--mono);
1115
+ }
1116
+
1117
+ .nav-btn:hover {
1118
+ border-color: var(--hairline-bright);
1119
+ color: var(--text);
1120
+ background: var(--glass-bright);
1121
+ }
1122
+
1123
+ .progress {
1124
+ position: fixed;
1125
+ top: 0;
1126
+ left: 0;
1127
+ height: 1px;
1128
+ background: linear-gradient(90deg, transparent, var(--text));
1129
+ transition: width 0.3s ease;
1130
+ z-index: 100;
1131
+ }
1132
+
1133
+ /* --- PDF download button --- */
1134
+ .pdf-btn {
1135
+ position: fixed;
1136
+ bottom: 1.5rem;
1137
+ left: 50%;
1138
+ transform: translateX(-50%);
1139
+ z-index: 200;
1140
+ background: var(--invert-bg);
1141
+ color: var(--invert-text);
1142
+ border: none;
1143
+ padding: 0.6rem 1.4rem;
1144
+ border-radius: var(--radius-pill);
1145
+ font-family: var(--mono);
1146
+ font-size: 0.74rem;
1147
+ font-weight: 400;
1148
+ cursor: pointer;
1149
+ letter-spacing: 0.02em;
1150
+ box-shadow:
1151
+ inset 0 1px 0 rgba(255,255,255,0.5),
1152
+ 0 12px 32px rgba(0,0,0,0.4);
1153
+ }
1154
+
1155
+ .pdf-btn:hover { background: #ffffff; }
1156
+
1157
+ /* --- Print: each slide becomes one 16:9 PDF page --- */
1158
+ @page { size: 13.333in 7.5in; margin: 0; }
1159
+
1160
+ @media print {
1161
+ html, body {
1162
+ width: 13.333in;
1163
+ height: auto !important;
1164
+ overflow: visible !important;
1165
+ background: var(--bg);
1166
+ -webkit-print-color-adjust: exact !important;
1167
+ print-color-adjust: exact !important;
1168
+ }
1169
+ body::before, body::after { display: none !important; }
1170
+ .deck { width: 13.333in; height: auto; position: static; }
1171
+ .slide {
1172
+ display: flex !important;
1173
+ position: relative !important;
1174
+ inset: auto !important;
1175
+ width: 13.333in !important;
1176
+ height: 7.5in !important;
1177
+ page-break-after: always !important;
1178
+ break-after: page !important;
1179
+ -webkit-print-color-adjust: exact !important;
1180
+ background: var(--bg) !important;
1181
+ }
1182
+ .slide:last-child { page-break-after: auto !important; }
1183
+ .slide.dark { background: var(--invert-bg) !important; }
1184
+ .nav, .progress, .pdf-btn { display: none !important; }
1185
+ /* Print can't render backdrop-filter; fall back to opaque tint */
1186
+ .glass, .eyebrow, .step, .three-col > div, .cap-list, .callout, .stack-card,
1187
+ .ctx-pill, .ai-pill, .output-card, .product-num, .product-stat,
1188
+ .jeduf-col, .stat-card, .quote-card, .logo-cell, .code-frame, .nav {
1189
+ backdrop-filter: none !important;
1190
+ -webkit-backdrop-filter: none !important;
1191
+ background: rgba(255,255,255,0.04) !important;
1192
+ }
1193
+ .jeduf-col.hero, .stat-card.stat-dark, .quote-card.quote-dark, .spec-block {
1194
+ background: var(--invert-bg) !important;
1195
+ }
1196
+ }
1197
+ </style>
1198
+ </head>
1199
+ <body>
1200
+
1201
+ <div class="progress" id="progress"></div>
1202
+
1203
+ <div class="deck">
1204
+
1205
+ <!-- ========== 1. COVER ========== -->
1206
+ <section class="slide active">
1207
+ <div class="slide-inner">
1208
+ <div class="eyebrow">Conference · Date</div>
1209
+ <h1>Your headline.<br><span class="dim">Continuation that fades.</span></h1>
1210
+ <div class="meta">Speaker name · 20 minutes</div>
1211
+ </div>
1212
+ </section>
1213
+
1214
+ <!-- ========== 2. QUOTE SLIDE ========== -->
1215
+ <section class="slide quote-slide">
1216
+ <div class="slide-inner">
1217
+ <h1>A bold statement <span class="dim">that opens the talk.</span></h1>
1218
+ </div>
1219
+ </section>
1220
+
1221
+ <!-- ========== 3. EYEBROW + HEADLINE + SUBTITLE ========== -->
1222
+ <section class="slide">
1223
+ <div class="slide-inner">
1224
+ <div class="eyebrow">Section label</div>
1225
+ <h1>Section headline. <span class="dim">One line that lands.</span></h1>
1226
+ <p class="subtitle">A subtitle that adds nuance without saying everything. Keep it short. One or two sentences max.</p>
1227
+ </div>
1228
+ </section>
1229
+
1230
+ <!-- ========== 4. TWO-COLUMN (PROBLEM / FIX) ========== -->
1231
+ <section class="slide">
1232
+ <div class="slide-inner">
1233
+ <div class="two-col">
1234
+ <div>
1235
+ <div class="eyebrow">01 / The problem</div>
1236
+ <h2>What's broken.</h2>
1237
+ <p>Describe the situation today. Be specific. Avoid abstractions. The reader should recognize their own pain.</p>
1238
+ </div>
1239
+ <div>
1240
+ <div class="eyebrow">02 / The fix</div>
1241
+ <h2>What we built.</h2>
1242
+ <p>Describe the solution. Same length and tone as the problem. Side-by-side comparison drives the point.</p>
1243
+ </div>
1244
+ </div>
1245
+ </div>
1246
+ </section>
1247
+
1248
+ <!-- ========== 4b. TWO-COLUMN STEP STACK ========== -->
1249
+ <section class="slide">
1250
+ <div class="slide-inner">
1251
+ <div class="two-col">
1252
+ <div>
1253
+ <div class="eyebrow">Section label</div>
1254
+ <h2>Title for the steps on the right.</h2>
1255
+ <p class="subtitle">Brief explanation of what these steps represent.</p>
1256
+ </div>
1257
+ <div class="col-stack">
1258
+ <div class="step">First step</div>
1259
+ <div class="step">Second step</div>
1260
+ <div class="step">Third step</div>
1261
+ <div class="step dim">Fourth step (dimmed = blocker)</div>
1262
+ <div class="step dim">Fifth step (dimmed)</div>
1263
+ <div class="step kill">Final outcome (negative)</div>
1264
+ </div>
1265
+ </div>
1266
+ </div>
1267
+ </section>
1268
+
1269
+ <!-- ========== 5. THREE-COLUMN (WHY / HOW / WHAT) ========== -->
1270
+ <section class="slide">
1271
+ <div class="slide-inner">
1272
+ <div class="eyebrow">Section label</div>
1273
+ <h2>Headline for the breakdown.</h2>
1274
+ <div class="three-col" style="margin-top: 2rem;">
1275
+ <div>
1276
+ <h3>Why</h3>
1277
+ <p>The motivation. Why this matters. Why now.</p>
1278
+ </div>
1279
+ <div>
1280
+ <h3>How</h3>
1281
+ <p>The mechanism. The four pillars. The structure.</p>
1282
+ </div>
1283
+ <div>
1284
+ <h3>What</h3>
1285
+ <p>The outcome. What you walk away with.</p>
1286
+ </div>
1287
+ </div>
1288
+ </div>
1289
+ </section>
1290
+
1291
+ <!-- ========== 6. CAPABILITY LIST (Q&A) ========== -->
1292
+ <section class="slide">
1293
+ <div class="slide-inner">
1294
+ <div class="eyebrow">What it solves</div>
1295
+ <h2>The questions you have. <span class="dim">Answered.</span></h2>
1296
+ <div class="cap-list" style="margin-top: 2rem;">
1297
+ <div class="cap-row">
1298
+ <div class="cap-q">Question one?</div>
1299
+ <div class="cap-a">A clear, specific answer that addresses the question directly.</div>
1300
+ </div>
1301
+ <div class="cap-row">
1302
+ <div class="cap-q">Question two?</div>
1303
+ <div class="cap-a">Another concrete answer. Avoid hedging.</div>
1304
+ </div>
1305
+ <div class="cap-row">
1306
+ <div class="cap-q">Question three?</div>
1307
+ <div class="cap-a">Keep answers parallel in length and tone.</div>
1308
+ </div>
1309
+ </div>
1310
+ </div>
1311
+ </section>
1312
+
1313
+ <!-- ========== 7. CALLOUT ========== -->
1314
+ <section class="slide">
1315
+ <div class="slide-inner">
1316
+ <div class="callout">
1317
+ <h3>Why now</h3>
1318
+ <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>
1319
+ </div>
1320
+ </div>
1321
+ </section>
1322
+
1323
+ <!-- ========== 8. DOT FLOW ========== -->
1324
+ <section class="slide">
1325
+ <div class="slide-inner">
1326
+ <div class="eyebrow">The flow</div>
1327
+ <h2>How it works. <span class="dim">Step by step.</span></h2>
1328
+ <div class="dot-flow">
1329
+ <div class="dot-step"><div class="dot">01</div><h4>Step 1</h4><p>Short caption</p></div>
1330
+ <div class="dot-step"><div class="dot">02</div><h4>Step 2</h4><p>Short caption</p></div>
1331
+ <div class="dot-step"><div class="dot">03</div><h4>Step 3</h4><p>Short caption</p></div>
1332
+ <div class="dot-step"><div class="dot">04</div><h4>Step 4</h4><p>Short caption</p></div>
1333
+ <div class="dot-step"><div class="dot">05</div><h4>Step 5</h4><p>Short caption</p></div>
1334
+ </div>
1335
+ </div>
1336
+ </section>
1337
+
1338
+ <!-- ========== 9. STACK GRID ========== -->
1339
+ <section class="slide">
1340
+ <div class="slide-inner">
1341
+ <div class="eyebrow">The stack</div>
1342
+ <h2>Built on tools <span class="dim">you already know.</span></h2>
1343
+ <div class="stack-grid">
1344
+ <div class="stack-card">
1345
+ <div class="stack-card-label">01 / Category one</div>
1346
+ <div class="stack-tool"><span class="mark"></span>Tool A</div>
1347
+ <div class="stack-tool"><span class="mark"></span>Tool B</div>
1348
+ <div class="stack-tool"><span class="mark"></span>Tool C</div>
1349
+ </div>
1350
+ <div class="stack-card">
1351
+ <div class="stack-card-label">02 / Category two</div>
1352
+ <div class="stack-tool"><span class="mark"></span>Tool D</div>
1353
+ <div class="stack-tool"><span class="mark"></span>Tool E</div>
1354
+ </div>
1355
+ <div class="stack-card">
1356
+ <div class="stack-card-label">03 / Category three</div>
1357
+ <div class="stack-tool"><span class="mark"></span>Tool F</div>
1358
+ <div class="stack-tool"><span class="mark"></span>Tool G</div>
1359
+ </div>
1360
+ <div class="stack-card">
1361
+ <div class="stack-card-label">04 / Category four</div>
1362
+ <div class="stack-tool"><span class="mark"></span>Tool H</div>
1363
+ <div class="stack-tool"><span class="mark"></span>Tool I</div>
1364
+ </div>
1365
+ </div>
1366
+ </div>
1367
+ </section>
1368
+
1369
+ <!-- ========== 10. SPEC BLOCK + CONTEXT + OUTPUTS ========== -->
1370
+ <section class="slide">
1371
+ <div class="slide-inner">
1372
+ <div class="eyebrow">The mechanism</div>
1373
+ <h2>One input. <span class="dim">Three outputs.</span></h2>
1374
+ <div class="spec-flow">
1375
+ <div class="spec-block">
1376
+ <h4>The Input</h4>
1377
+ <p>What goes in</p>
1378
+ </div>
1379
+ <div class="ctx-row">
1380
+ <span class="ctx-label">draws from</span>
1381
+ <span class="ctx-pill">Source 1</span>
1382
+ <span class="ctx-pill">Source 2</span>
1383
+ <span class="ctx-pill">Source 3</span>
1384
+ </div>
1385
+ <div class="ai-divider">
1386
+ <div class="line"></div>
1387
+ <span class="ai-pill">Process</span>
1388
+ <div class="line"></div>
1389
+ </div>
1390
+ <div class="outputs-row">
1391
+ <div class="output-card"><h5>Output A</h5><p>What it produces.</p></div>
1392
+ <div class="output-card"><h5>Output B</h5><p>What it produces.</p></div>
1393
+ <div class="output-card"><h5>Output C</h5><p>What it produces.</p></div>
1394
+ </div>
1395
+ </div>
1396
+ </div>
1397
+ </section>
1398
+
1399
+ <!-- ========== 11. PRODUCT SLIDE ========== -->
1400
+ <section class="slide">
1401
+ <div class="slide-inner">
1402
+ <div class="product-row">
1403
+ <div class="product-meta">
1404
+ <div class="product-num">01</div>
1405
+ <div class="product-tag">A short, punchy quote or hook.</div>
1406
+ <h3 class="product-headline">One-line description of what this thing does.</h3>
1407
+ <p class="product-desc">Two or three sentences that explain it. Keep it concrete. Avoid abstract language. Tell the story behind it.</p>
1408
+ <div class="product-stat">A few hours · One weekend · Or whatever's true</div>
1409
+ </div>
1410
+ <div class="product-name">Name<sup>™</sup></div>
1411
+ </div>
1412
+ </div>
1413
+ </section>
1414
+
1415
+ <!-- ========== 12. COLLAGE SLIDE ========== -->
1416
+ <section class="slide collage-slide">
1417
+ <div class="collage">
1418
+ <img src="media/KMS529.jpg" alt="" style="width:100%;height:100%;object-fit:cover;">
1419
+ </div>
1420
+ </section>
1421
+
1422
+ <!-- ========== 13. JEDUF THREE-COLUMN COMPARISON ========== -->
1423
+ <section class="slide">
1424
+ <div class="slide-inner">
1425
+ <div class="eyebrow">The middle path</div>
1426
+ <h2>Between two extremes. <span class="dim">The thing that actually works.</span></h2>
1427
+ <div class="jeduf">
1428
+ <div class="jeduf-col">
1429
+ <div class="jeduf-label">Too much</div>
1430
+ <div class="jeduf-title">Extreme A</div>
1431
+ <div class="jeduf-philosophy">A philosophy quote that captures the extreme.</div>
1432
+ <div class="jeduf-step">Step 1</div>
1433
+ <div class="jeduf-step">Step 2</div>
1434
+ <div class="jeduf-step">Step 3</div>
1435
+ <div class="jeduf-step">Step 4</div>
1436
+ </div>
1437
+ <div class="jeduf-col hero">
1438
+ <div class="jeduf-label">Just right</div>
1439
+ <div class="jeduf-title">The middle path</div>
1440
+ <div class="jeduf-philosophy">The philosophy of the balanced approach.</div>
1441
+ <div class="jeduf-step">Step 1</div>
1442
+ <div class="jeduf-step">Step 2</div>
1443
+ <div class="jeduf-step">Step 3</div>
1444
+ <div class="jeduf-step">Step 4</div>
1445
+ </div>
1446
+ <div class="jeduf-col">
1447
+ <div class="jeduf-label">Too little</div>
1448
+ <div class="jeduf-title">Extreme B</div>
1449
+ <div class="jeduf-philosophy">A philosophy quote that captures the other extreme.</div>
1450
+ <div class="jeduf-step">Step 1</div>
1451
+ <div class="jeduf-step">Step 2</div>
1452
+ <div class="jeduf-step">Step 3</div>
1453
+ <div class="jeduf-step">Step 4</div>
1454
+ </div>
1455
+ </div>
1456
+ </div>
1457
+ </section>
1458
+
1459
+ <!-- ========== 14. TIMELINE ========== -->
1460
+ <section class="slide">
1461
+ <div class="slide-inner">
1462
+ <div class="eyebrow">The journey</div>
1463
+ <h2>How we got here. <span class="dim">Year by year.</span></h2>
1464
+ <div class="timeline">
1465
+ <div class="timeline-row">
1466
+ <div class="timeline-year">Year 1</div>
1467
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1468
+ <div class="timeline-content"><h4>The starting point</h4><p>Where things began. The initial conditions and constraints.</p></div>
1469
+ </div>
1470
+ <div class="timeline-row">
1471
+ <div class="timeline-year">Year 2</div>
1472
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1473
+ <div class="timeline-content"><h4>Early progress</h4><p>First experiments. Initial wins. Lessons learned.</p></div>
1474
+ </div>
1475
+ <div class="timeline-row">
1476
+ <div class="timeline-year">Year 3</div>
1477
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1478
+ <div class="timeline-content"><h4>The inflection</h4><p>The moment things accelerated. What changed and why.</p></div>
1479
+ </div>
1480
+ <div class="timeline-row">
1481
+ <div class="timeline-year">Now</div>
1482
+ <div class="timeline-track"><div class="timeline-dot"></div><div class="timeline-line"></div></div>
1483
+ <div class="timeline-content"><h4>Where we are</h4><p>Current state. What's been achieved. What's next.</p></div>
1484
+ </div>
1485
+ </div>
1486
+ </div>
1487
+ </section>
1488
+
1489
+ <!-- ========== 15. STAT GRID ========== -->
1490
+ <section class="slide">
1491
+ <div class="slide-inner">
1492
+ <div class="eyebrow">The numbers</div>
1493
+ <h2>Impact you can measure. <span class="dim">Not just feel.</span></h2>
1494
+ <div class="stat-grid">
1495
+ <div class="stat-card">
1496
+ <div class="stat-label">Metric one</div>
1497
+ <div class="stat-number">N×</div>
1498
+ <div class="stat-desc">What this number means in context. Be specific.</div>
1499
+ </div>
1500
+ <div class="stat-card stat-dark">
1501
+ <div class="stat-label">Metric two</div>
1502
+ <div class="stat-number">00</div>
1503
+ <div class="stat-desc">The hero number. Light card draws attention here.</div>
1504
+ </div>
1505
+ <div class="stat-card">
1506
+ <div class="stat-label">Metric three</div>
1507
+ <div class="stat-number">00%</div>
1508
+ <div class="stat-desc">Another concrete measurement with context.</div>
1509
+ </div>
1510
+ </div>
1511
+ </div>
1512
+ </section>
1513
+
1514
+ <!-- ========== 16. QUOTE PAIR ========== -->
1515
+ <section class="slide">
1516
+ <div class="slide-inner">
1517
+ <div class="eyebrow">Two perspectives</div>
1518
+ <h2>The debate. <span class="dim">Both sides, one slide.</span></h2>
1519
+ <div class="quote-pair">
1520
+ <div class="quote-card">
1521
+ <div class="quote-text">"The first perspective. A position or belief that one side holds."</div>
1522
+ <div class="quote-attr">Perspective A</div>
1523
+ </div>
1524
+ <div class="quote-card quote-dark">
1525
+ <div class="quote-text">"The counterpoint. A contrasting view that creates tension with the first."</div>
1526
+ <div class="quote-attr">Perspective B</div>
1527
+ </div>
1528
+ </div>
1529
+ </div>
1530
+ </section>
1531
+
1532
+ <!-- ========== 17. LOGO GRID ========== -->
1533
+ <section class="slide">
1534
+ <div class="slide-inner">
1535
+ <div class="eyebrow">Who uses this</div>
1536
+ <h2>Trusted by teams <span class="dim">who ship.</span></h2>
1537
+ <div class="logo-grid">
1538
+ <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>
1539
+ <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>
1540
+ <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>
1541
+ <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>
1542
+ <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>
1543
+ <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>
1544
+ <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>
1545
+ <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>
1546
+ </div>
1547
+ </div>
1548
+ </section>
1549
+
1550
+ <!-- ========== 18. CODE SLIDE ========== -->
1551
+ <section class="slide">
1552
+ <div class="slide-inner">
1553
+ <div class="eyebrow">Under the hood</div>
1554
+ <h2>How it works. <span class="dim">The code behind it.</span></h2>
1555
+ <div class="code-frame">
1556
+ <div class="code-frame-header">
1557
+ <div class="code-frame-dot"></div>
1558
+ <div class="code-frame-dot"></div>
1559
+ <div class="code-frame-dot"></div>
1560
+ <div class="code-frame-title">deck-solid.html</div>
1561
+ </div>
1562
+ <pre><span class="code-comment">&lt;!-- A slide is just a section --&gt;</span>
1563
+ <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>
1564
+ <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>
1565
+ <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>
1566
+ <span class="code-keyword">&lt;h1&gt;</span>The bottleneck moved.
1567
+ <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>
1568
+ <span class="code-keyword">&lt;/h1&gt;</span>
1569
+ <span class="code-keyword">&lt;/div&gt;</span>
1570
+ <span class="code-keyword">&lt;/section&gt;</span></pre>
1571
+ </div>
1572
+ </div>
1573
+ </section>
1574
+
1575
+ <!-- ========== 19. INVERTED SLIDE ========== -->
1576
+ <section class="slide dark">
1577
+ <div class="slide-inner">
1578
+ <div class="eyebrow">Section label</div>
1579
+ <h1>The pivot moment. <span class="dim">Inverted to land harder.</span></h1>
1580
+ <p class="subtitle">Use inverted slides sparingly. They mark turning points. Two or three per deck max.</p>
1581
+ </div>
1582
+ </section>
1583
+
1584
+ <!-- ========== 20. CLOSING SLIDE ========== -->
1585
+ <section class="slide quote-slide">
1586
+ <div class="slide-inner">
1587
+ <h1>The closing line.<br><span class="dim">Slow down for it.</span></h1>
1588
+ </div>
1589
+ </section>
1590
+
1591
+ <!-- ========== 21. THANKS ========== -->
1592
+ <section class="slide">
1593
+ <div class="slide-inner">
1594
+ <h1 style="font-size: clamp(2.5rem, 5vw, 4rem);">Thanks.</h1>
1595
+ <p class="subtitle">Questions?</p>
1596
+ <div class="meta">Speaker name · Affiliation</div>
1597
+ </div>
1598
+ </section>
1599
+
1600
+ </div>
1601
+
1602
+ <button class="pdf-btn" onclick="downloadPDF()">Download PDF</button>
1603
+
1604
+ <div class="nav">
1605
+ <span id="counter">1 / 21</span>
1606
+ <div class="nav-buttons">
1607
+ <button class="nav-btn" onclick="prev()">‹</button>
1608
+ <button class="nav-btn" onclick="next()">›</button>
1609
+ </div>
1610
+ </div>
1611
+
1612
+ <script>
1613
+ const slides = document.querySelectorAll('.slide');
1614
+ const counter = document.getElementById('counter');
1615
+ const progress = document.getElementById('progress');
1616
+ let current = 0;
1617
+
1618
+ function show(i) {
1619
+ slides.forEach(s => s.classList.remove('active'));
1620
+ slides[i].classList.add('active');
1621
+ counter.textContent = `${String(i + 1).padStart(2, '0')} / ${String(slides.length).padStart(2, '0')}`;
1622
+ progress.style.width = `${((i + 1) / slides.length) * 100}%`;
1623
+ current = i;
1624
+ }
1625
+
1626
+ function next() { if (current < slides.length - 1) show(current + 1); }
1627
+ function prev() { if (current > 0) show(current - 1); }
1628
+
1629
+ document.addEventListener('keydown', (e) => {
1630
+ if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'PageDown') { e.preventDefault(); next(); }
1631
+ if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); prev(); }
1632
+ if (e.key === 'Home') { show(0); }
1633
+ if (e.key === 'End') { show(slides.length - 1); }
1634
+ if (e.key === 'p' || e.key === 'P') { e.preventDefault(); downloadPDF(); }
1635
+ });
1636
+
1637
+ function downloadPDF() {
1638
+ const originalTitle = document.title;
1639
+ document.title = 'deck-solid';
1640
+ window.print();
1641
+ setTimeout(() => { document.title = originalTitle; }, 1000);
1642
+ }
1643
+
1644
+ let touchStartX = 0;
1645
+ let touchStartY = 0;
1646
+ const SWIPE_THRESHOLD = 50;
1647
+
1648
+ document.addEventListener('touchstart', (e) => {
1649
+ touchStartX = e.changedTouches[0].screenX;
1650
+ touchStartY = e.changedTouches[0].screenY;
1651
+ }, { passive: true });
1652
+
1653
+ document.addEventListener('touchend', (e) => {
1654
+ const dx = e.changedTouches[0].screenX - touchStartX;
1655
+ const dy = e.changedTouches[0].screenY - touchStartY;
1656
+ if (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dy) > Math.abs(dx)) return;
1657
+ if (dx < 0) next();
1658
+ else prev();
1659
+ }, { passive: true });
1660
+
1661
+ const isEmbed = new URLSearchParams(window.location.search).has('embed');
1662
+
1663
+ show(0);
1664
+ </script>
1665
+
1666
+ </body>
1667
+ </html>