@steipete/summarize 0.8.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +114 -1
  2. package/LICENSE +1 -1
  3. package/README.md +309 -182
  4. package/dist/cli.js +1 -1
  5. package/dist/esm/cache.js +72 -4
  6. package/dist/esm/cache.js.map +1 -1
  7. package/dist/esm/config.js +197 -1
  8. package/dist/esm/config.js.map +1 -1
  9. package/dist/esm/content/asset.js +75 -2
  10. package/dist/esm/content/asset.js.map +1 -1
  11. package/dist/esm/daemon/agent.js +547 -0
  12. package/dist/esm/daemon/agent.js.map +1 -0
  13. package/dist/esm/daemon/chat.js +97 -0
  14. package/dist/esm/daemon/chat.js.map +1 -0
  15. package/dist/esm/daemon/cli.js +105 -10
  16. package/dist/esm/daemon/cli.js.map +1 -1
  17. package/dist/esm/daemon/env-snapshot.js +3 -0
  18. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  19. package/dist/esm/daemon/flow-context.js +53 -28
  20. package/dist/esm/daemon/flow-context.js.map +1 -1
  21. package/dist/esm/daemon/launchd.js +27 -0
  22. package/dist/esm/daemon/launchd.js.map +1 -1
  23. package/dist/esm/daemon/process-registry.js +206 -0
  24. package/dist/esm/daemon/process-registry.js.map +1 -0
  25. package/dist/esm/daemon/schtasks.js +64 -0
  26. package/dist/esm/daemon/schtasks.js.map +1 -1
  27. package/dist/esm/daemon/server.js +1034 -52
  28. package/dist/esm/daemon/server.js.map +1 -1
  29. package/dist/esm/daemon/summarize.js +66 -18
  30. package/dist/esm/daemon/summarize.js.map +1 -1
  31. package/dist/esm/daemon/systemd.js +61 -0
  32. package/dist/esm/daemon/systemd.js.map +1 -1
  33. package/dist/esm/flags.js +24 -0
  34. package/dist/esm/flags.js.map +1 -1
  35. package/dist/esm/llm/attachments.js +2 -0
  36. package/dist/esm/llm/attachments.js.map +1 -0
  37. package/dist/esm/llm/errors.js +6 -0
  38. package/dist/esm/llm/errors.js.map +1 -0
  39. package/dist/esm/llm/generate-text.js +206 -356
  40. package/dist/esm/llm/generate-text.js.map +1 -1
  41. package/dist/esm/llm/html-to-markdown.js +1 -2
  42. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  43. package/dist/esm/llm/prompt.js.map +1 -1
  44. package/dist/esm/llm/providers/anthropic.js +126 -0
  45. package/dist/esm/llm/providers/anthropic.js.map +1 -0
  46. package/dist/esm/llm/providers/google.js +78 -0
  47. package/dist/esm/llm/providers/google.js.map +1 -0
  48. package/dist/esm/llm/providers/models.js +111 -0
  49. package/dist/esm/llm/providers/models.js.map +1 -0
  50. package/dist/esm/llm/providers/openai.js +150 -0
  51. package/dist/esm/llm/providers/openai.js.map +1 -0
  52. package/dist/esm/llm/providers/shared.js +48 -0
  53. package/dist/esm/llm/providers/shared.js.map +1 -0
  54. package/dist/esm/llm/providers/types.js +2 -0
  55. package/dist/esm/llm/providers/types.js.map +1 -0
  56. package/dist/esm/llm/transcript-to-markdown.js +1 -2
  57. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  58. package/dist/esm/llm/types.js +2 -0
  59. package/dist/esm/llm/types.js.map +1 -0
  60. package/dist/esm/llm/usage.js +69 -0
  61. package/dist/esm/llm/usage.js.map +1 -0
  62. package/dist/esm/logging/daemon.js +124 -0
  63. package/dist/esm/logging/daemon.js.map +1 -0
  64. package/dist/esm/logging/ring-file.js +66 -0
  65. package/dist/esm/logging/ring-file.js.map +1 -0
  66. package/dist/esm/media-cache.js +251 -0
  67. package/dist/esm/media-cache.js.map +1 -0
  68. package/dist/esm/model-auto.js +103 -5
  69. package/dist/esm/model-auto.js.map +1 -1
  70. package/dist/esm/processes.js +2 -0
  71. package/dist/esm/processes.js.map +1 -0
  72. package/dist/esm/refresh-free.js +3 -3
  73. package/dist/esm/refresh-free.js.map +1 -1
  74. package/dist/esm/run/attachments.js +8 -4
  75. package/dist/esm/run/attachments.js.map +1 -1
  76. package/dist/esm/run/bird.js +118 -5
  77. package/dist/esm/run/bird.js.map +1 -1
  78. package/dist/esm/run/cache-state.js +3 -2
  79. package/dist/esm/run/cache-state.js.map +1 -1
  80. package/dist/esm/run/cli-preflight.js +19 -1
  81. package/dist/esm/run/cli-preflight.js.map +1 -1
  82. package/dist/esm/run/constants.js +0 -7
  83. package/dist/esm/run/constants.js.map +1 -1
  84. package/dist/esm/run/finish-line.js +58 -11
  85. package/dist/esm/run/finish-line.js.map +1 -1
  86. package/dist/esm/run/flows/asset/extract.js +70 -0
  87. package/dist/esm/run/flows/asset/extract.js.map +1 -0
  88. package/dist/esm/run/flows/asset/input.js +209 -25
  89. package/dist/esm/run/flows/asset/input.js.map +1 -1
  90. package/dist/esm/run/flows/asset/media-policy.js +3 -0
  91. package/dist/esm/run/flows/asset/media-policy.js.map +1 -0
  92. package/dist/esm/run/flows/asset/media.js +224 -0
  93. package/dist/esm/run/flows/asset/media.js.map +1 -0
  94. package/dist/esm/run/flows/asset/output.js +98 -0
  95. package/dist/esm/run/flows/asset/output.js.map +1 -0
  96. package/dist/esm/run/flows/asset/preprocess.js +92 -16
  97. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  98. package/dist/esm/run/flows/asset/summary.js +165 -11
  99. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  100. package/dist/esm/run/flows/url/extract.js +6 -6
  101. package/dist/esm/run/flows/url/extract.js.map +1 -1
  102. package/dist/esm/run/flows/url/flow.js +338 -36
  103. package/dist/esm/run/flows/url/flow.js.map +1 -1
  104. package/dist/esm/run/flows/url/markdown.js +6 -1
  105. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  106. package/dist/esm/run/flows/url/slides-output.js +485 -0
  107. package/dist/esm/run/flows/url/slides-output.js.map +1 -0
  108. package/dist/esm/run/flows/url/slides-text.js +628 -0
  109. package/dist/esm/run/flows/url/slides-text.js.map +1 -0
  110. package/dist/esm/run/flows/url/summary.js +358 -83
  111. package/dist/esm/run/flows/url/summary.js.map +1 -1
  112. package/dist/esm/run/help.js +94 -5
  113. package/dist/esm/run/help.js.map +1 -1
  114. package/dist/esm/run/logging.js +12 -4
  115. package/dist/esm/run/logging.js.map +1 -1
  116. package/dist/esm/run/media-cache-state.js +33 -0
  117. package/dist/esm/run/media-cache-state.js.map +1 -0
  118. package/dist/esm/run/progress.js +19 -1
  119. package/dist/esm/run/progress.js.map +1 -1
  120. package/dist/esm/run/run-context.js +19 -0
  121. package/dist/esm/run/run-context.js.map +1 -0
  122. package/dist/esm/run/run-output.js +1 -1
  123. package/dist/esm/run/run-output.js.map +1 -1
  124. package/dist/esm/run/run-settings.js +182 -0
  125. package/dist/esm/run/run-settings.js.map +1 -0
  126. package/dist/esm/run/runner.js +225 -32
  127. package/dist/esm/run/runner.js.map +1 -1
  128. package/dist/esm/run/slides-cli.js +225 -0
  129. package/dist/esm/run/slides-cli.js.map +1 -0
  130. package/dist/esm/run/slides-render.js +163 -0
  131. package/dist/esm/run/slides-render.js.map +1 -0
  132. package/dist/esm/run/stream-output.js +63 -0
  133. package/dist/esm/run/stream-output.js.map +1 -0
  134. package/dist/esm/run/streaming.js +16 -43
  135. package/dist/esm/run/streaming.js.map +1 -1
  136. package/dist/esm/run/summary-engine.js +59 -41
  137. package/dist/esm/run/summary-engine.js.map +1 -1
  138. package/dist/esm/run/transcriber-cli.js +148 -0
  139. package/dist/esm/run/transcriber-cli.js.map +1 -0
  140. package/dist/esm/shared/sse-events.js +26 -0
  141. package/dist/esm/shared/sse-events.js.map +1 -0
  142. package/dist/esm/shared/streaming-merge.js +44 -0
  143. package/dist/esm/shared/streaming-merge.js.map +1 -0
  144. package/dist/esm/slides/extract.js +1942 -0
  145. package/dist/esm/slides/extract.js.map +1 -0
  146. package/dist/esm/slides/index.js +4 -0
  147. package/dist/esm/slides/index.js.map +1 -0
  148. package/dist/esm/slides/settings.js +73 -0
  149. package/dist/esm/slides/settings.js.map +1 -0
  150. package/dist/esm/slides/store.js +111 -0
  151. package/dist/esm/slides/store.js.map +1 -0
  152. package/dist/esm/slides/types.js +2 -0
  153. package/dist/esm/slides/types.js.map +1 -0
  154. package/dist/esm/tty/osc-progress.js +21 -1
  155. package/dist/esm/tty/osc-progress.js.map +1 -1
  156. package/dist/esm/tty/progress/fetch-html.js +8 -4
  157. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  158. package/dist/esm/tty/progress/transcript.js +82 -31
  159. package/dist/esm/tty/progress/transcript.js.map +1 -1
  160. package/dist/esm/tty/spinner.js +2 -2
  161. package/dist/esm/tty/spinner.js.map +1 -1
  162. package/dist/esm/tty/theme.js +189 -0
  163. package/dist/esm/tty/theme.js.map +1 -0
  164. package/dist/esm/tty/website-progress.js +17 -13
  165. package/dist/esm/tty/website-progress.js.map +1 -1
  166. package/dist/esm/version.js +1 -1
  167. package/dist/esm/version.js.map +1 -1
  168. package/dist/types/cache.d.ts +14 -2
  169. package/dist/types/config.d.ts +34 -0
  170. package/dist/types/daemon/agent.d.ts +25 -0
  171. package/dist/types/daemon/chat.d.ts +27 -0
  172. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  173. package/dist/types/daemon/flow-context.d.ts +24 -3
  174. package/dist/types/daemon/launchd.d.ts +4 -0
  175. package/dist/types/daemon/process-registry.d.ts +73 -0
  176. package/dist/types/daemon/schtasks.d.ts +4 -0
  177. package/dist/types/daemon/server.d.ts +7 -1
  178. package/dist/types/daemon/summarize.d.ts +47 -5
  179. package/dist/types/daemon/systemd.d.ts +4 -0
  180. package/dist/types/flags.d.ts +1 -0
  181. package/dist/types/llm/attachments.d.ts +6 -0
  182. package/dist/types/llm/errors.d.ts +1 -0
  183. package/dist/types/llm/generate-text.d.ts +29 -13
  184. package/dist/types/llm/prompt.d.ts +7 -2
  185. package/dist/types/llm/providers/anthropic.d.ts +30 -0
  186. package/dist/types/llm/providers/google.d.ts +29 -0
  187. package/dist/types/llm/providers/models.d.ts +27 -0
  188. package/dist/types/llm/providers/openai.d.ts +38 -0
  189. package/dist/types/llm/providers/shared.d.ts +14 -0
  190. package/dist/types/llm/providers/types.d.ts +6 -0
  191. package/dist/types/llm/types.d.ts +5 -0
  192. package/dist/types/llm/usage.d.ts +5 -0
  193. package/dist/types/logging/daemon.d.ts +26 -0
  194. package/dist/types/logging/ring-file.d.ts +10 -0
  195. package/dist/types/media-cache.d.ts +22 -0
  196. package/dist/types/model-auto.d.ts +1 -0
  197. package/dist/types/processes.d.ts +1 -0
  198. package/dist/types/run/attachments.d.ts +9 -6
  199. package/dist/types/run/bird.d.ts +7 -0
  200. package/dist/types/run/constants.d.ts +0 -2
  201. package/dist/types/run/finish-line.d.ts +59 -1
  202. package/dist/types/run/flows/asset/extract.d.ts +18 -0
  203. package/dist/types/run/flows/asset/input.d.ts +12 -2
  204. package/dist/types/run/flows/asset/media-policy.d.ts +2 -0
  205. package/dist/types/run/flows/asset/media.d.ts +21 -0
  206. package/dist/types/run/flows/asset/output.d.ts +42 -0
  207. package/dist/types/run/flows/asset/preprocess.d.ts +22 -2
  208. package/dist/types/run/flows/asset/summary.d.ts +6 -0
  209. package/dist/types/run/flows/url/extract.d.ts +2 -1
  210. package/dist/types/run/flows/url/slides-output.d.ts +66 -0
  211. package/dist/types/run/flows/url/slides-text.d.ts +87 -0
  212. package/dist/types/run/flows/url/summary.d.ts +11 -3
  213. package/dist/types/run/flows/url/types.d.ts +29 -2
  214. package/dist/types/run/help.d.ts +3 -0
  215. package/dist/types/run/logging.d.ts +3 -2
  216. package/dist/types/run/media-cache-state.d.ts +7 -0
  217. package/dist/types/run/progress.d.ts +2 -1
  218. package/dist/types/run/run-context.d.ts +44 -0
  219. package/dist/types/run/run-settings.d.ts +62 -0
  220. package/dist/types/run/slides-cli.d.ts +9 -0
  221. package/dist/types/run/slides-render.d.ts +30 -0
  222. package/dist/types/run/stream-output.d.ts +12 -0
  223. package/dist/types/run/streaming.d.ts +10 -4
  224. package/dist/types/run/summary-engine.d.ts +15 -3
  225. package/dist/types/run/summary-llm.d.ts +2 -2
  226. package/dist/types/run/transcriber-cli.d.ts +8 -0
  227. package/dist/types/shared/sse-events.d.ts +64 -0
  228. package/dist/types/shared/streaming-merge.d.ts +4 -0
  229. package/dist/types/slides/extract.d.ts +42 -0
  230. package/dist/types/slides/index.d.ts +5 -0
  231. package/dist/types/slides/settings.d.ts +20 -0
  232. package/dist/types/slides/store.d.ts +15 -0
  233. package/dist/types/slides/types.d.ts +40 -0
  234. package/dist/types/tty/osc-progress.d.ts +2 -2
  235. package/dist/types/tty/progress/fetch-html.d.ts +3 -1
  236. package/dist/types/tty/progress/transcript.d.ts +3 -1
  237. package/dist/types/tty/spinner.d.ts +3 -1
  238. package/dist/types/tty/theme.d.ts +44 -0
  239. package/dist/types/tty/website-progress.d.ts +3 -1
  240. package/dist/types/version.d.ts +1 -1
  241. package/docs/README.md +13 -8
  242. package/docs/_config.yml +26 -0
  243. package/docs/_layouts/default.html +60 -0
  244. package/docs/agent.md +333 -0
  245. package/docs/assets/site.css +748 -0
  246. package/docs/assets/site.js +72 -0
  247. package/docs/assets/summarize-cli.png +0 -0
  248. package/docs/assets/summarize-extension.png +0 -0
  249. package/docs/assets/youtube-slides.png +0 -0
  250. package/docs/cache.md +29 -3
  251. package/docs/chrome-extension.md +85 -7
  252. package/docs/config.md +74 -2
  253. package/docs/extract-only.md +10 -2
  254. package/docs/index.html +205 -0
  255. package/docs/index.md +25 -0
  256. package/docs/language.md +1 -1
  257. package/docs/llm.md +17 -1
  258. package/docs/manual-tests.md +2 -0
  259. package/docs/media.md +37 -0
  260. package/docs/model-auto.md +2 -1
  261. package/docs/nvidia-onnx-transcription.md +55 -0
  262. package/docs/openai.md +5 -0
  263. package/docs/releasing.md +26 -0
  264. package/docs/site/assets/site.css +399 -228
  265. package/docs/site/assets/summarize-cli.png +0 -0
  266. package/docs/site/assets/summarize-extension.png +0 -0
  267. package/docs/site/docs/chrome-extension.html +89 -0
  268. package/docs/site/docs/config.html +1 -0
  269. package/docs/site/docs/extract-only.html +1 -0
  270. package/docs/site/docs/firecrawl.html +1 -0
  271. package/docs/site/docs/index.html +5 -0
  272. package/docs/site/docs/llm.html +1 -0
  273. package/docs/site/docs/openai.html +1 -0
  274. package/docs/site/docs/website.html +1 -0
  275. package/docs/site/docs/youtube.html +1 -0
  276. package/docs/site/index.html +148 -84
  277. package/docs/slides.md +74 -0
  278. package/docs/timestamps.md +103 -0
  279. package/docs/website.md +13 -0
  280. package/docs/youtube.md +16 -0
  281. package/package.json +22 -18
  282. package/dist/esm/daemon/request-settings.js +0 -91
  283. package/dist/esm/daemon/request-settings.js.map +0 -1
  284. package/dist/types/daemon/request-settings.d.ts +0 -27
@@ -0,0 +1,748 @@
1
+ :root {
2
+ --bg0: #0b0f12;
3
+ --bg1: #101722;
4
+ --panel: rgba(16, 22, 30, 0.9);
5
+ --paper: #f7f2e7;
6
+ --ink: #0b0f12;
7
+ --fg0: rgba(247, 242, 231, 0.96);
8
+ --fg1: rgba(247, 242, 231, 0.72);
9
+ --fg2: rgba(247, 242, 231, 0.52);
10
+ --line: rgba(247, 242, 231, 0.12);
11
+ --shadow: 0 36px 90px rgba(0, 0, 0, 0.5);
12
+ --shadow2: 0 14px 40px rgba(0, 0, 0, 0.35);
13
+
14
+ --accent: #b8ff5a;
15
+ --accent2: #ff9b35;
16
+ --accent3: #36c9b9;
17
+
18
+ --r: 18px;
19
+ --r2: 28px;
20
+ --max: 1120px;
21
+
22
+ --display: "Fraunces", "Iowan Old Style", "Palatino Linotype", serif;
23
+ --body: "IBM Plex Sans", "Segoe UI", sans-serif;
24
+ --mono:
25
+ "IBM Plex Mono", "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
26
+ "Liberation Mono", "Courier New", monospace;
27
+ }
28
+
29
+ @media (prefers-color-scheme: light) {
30
+ :root {
31
+ --bg0: #fbf6eb;
32
+ --bg1: #f1ecdf;
33
+ --panel: rgba(255, 255, 255, 0.86);
34
+ --paper: #0b0f12;
35
+ --ink: #0b0f12;
36
+ --fg0: rgba(9, 12, 16, 0.92);
37
+ --fg1: rgba(9, 12, 16, 0.7);
38
+ --fg2: rgba(9, 12, 16, 0.5);
39
+ --line: rgba(9, 12, 16, 0.14);
40
+ --shadow: 0 26px 70px rgba(9, 12, 16, 0.12);
41
+ --shadow2: 0 10px 26px rgba(9, 12, 16, 0.1);
42
+ }
43
+ }
44
+
45
+ * {
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ html,
50
+ body {
51
+ height: 100%;
52
+ }
53
+
54
+ body {
55
+ margin: 0;
56
+ color: var(--fg0);
57
+ background:
58
+ radial-gradient(800px 520px at 10% -20%, rgba(184, 255, 90, 0.2), transparent 60%),
59
+ radial-gradient(740px 520px at 100% 0%, rgba(255, 155, 53, 0.18), transparent 60%),
60
+ radial-gradient(900px 600px at 80% 100%, rgba(54, 201, 185, 0.18), transparent 55%),
61
+ linear-gradient(180deg, var(--bg0), var(--bg1));
62
+ font-family: var(--body);
63
+ letter-spacing: 0.01em;
64
+ line-height: 1.6;
65
+ }
66
+
67
+ body::before {
68
+ content: "";
69
+ position: fixed;
70
+ inset: 0;
71
+ pointer-events: none;
72
+ opacity: 0.18;
73
+ background-image:
74
+ linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px),
75
+ linear-gradient(90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px);
76
+ background-size: 40px 40px;
77
+ mix-blend-mode: soft-light;
78
+ }
79
+
80
+ a {
81
+ color: inherit;
82
+ text-decoration: none;
83
+ }
84
+
85
+ a:hover {
86
+ text-decoration: underline;
87
+ text-decoration-thickness: 2px;
88
+ text-underline-offset: 4px;
89
+ }
90
+
91
+ .shell {
92
+ position: relative;
93
+ margin: 0 auto;
94
+ max-width: var(--max);
95
+ padding: 30px 18px 80px;
96
+ }
97
+
98
+ .top {
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: space-between;
102
+ gap: 12px;
103
+ padding: 10px 6px 16px;
104
+ }
105
+
106
+ .brand {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ gap: 10px;
110
+ text-decoration: none;
111
+ }
112
+
113
+ .brand:hover {
114
+ text-decoration: none;
115
+ }
116
+
117
+ .brand__mark {
118
+ width: 34px;
119
+ height: 34px;
120
+ border-radius: 12px;
121
+ display: grid;
122
+ place-items: center;
123
+ background:
124
+ radial-gradient(circle at 30% 30%, rgba(184, 255, 90, 0.92), transparent 60%),
125
+ radial-gradient(circle at 70% 20%, rgba(255, 155, 53, 0.7), transparent 60%),
126
+ radial-gradient(circle at 20% 80%, rgba(54, 201, 185, 0.65), transparent 60%),
127
+ rgba(255, 255, 255, 0.08);
128
+ border: 1px solid var(--line);
129
+ box-shadow: var(--shadow2);
130
+ font-family: var(--display);
131
+ font-weight: 700;
132
+ letter-spacing: -0.02em;
133
+ }
134
+
135
+ .brand__word {
136
+ font-family: var(--display);
137
+ font-weight: 700;
138
+ letter-spacing: 0.02em;
139
+ font-size: 18px;
140
+ }
141
+
142
+ .nav {
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 10px;
146
+ }
147
+
148
+ .nav a {
149
+ padding: 8px 12px;
150
+ border-radius: 999px;
151
+ border: 1px solid transparent;
152
+ color: var(--fg1);
153
+ font-family: var(--mono);
154
+ font-size: 12px;
155
+ letter-spacing: 0.08em;
156
+ text-transform: uppercase;
157
+ }
158
+
159
+ .nav a:hover {
160
+ text-decoration: none;
161
+ color: var(--fg0);
162
+ border-color: var(--line);
163
+ background: rgba(255, 255, 255, 0.05);
164
+ }
165
+
166
+ .nav a[aria-current="page"] {
167
+ color: var(--fg0);
168
+ border-color: rgba(184, 255, 90, 0.5);
169
+ background: rgba(184, 255, 90, 0.1);
170
+ }
171
+
172
+ .hero {
173
+ padding: 10px 6px 0;
174
+ }
175
+
176
+ .hero__frame {
177
+ position: relative;
178
+ border-radius: var(--r2);
179
+ border: 1px solid var(--line);
180
+ background: var(--panel);
181
+ box-shadow: var(--shadow);
182
+ overflow: hidden;
183
+ display: grid;
184
+ grid-template-columns: 1.1fr 0.9fr;
185
+ gap: 20px;
186
+ padding: 26px;
187
+ }
188
+
189
+ .hero__frame::after {
190
+ content: "";
191
+ position: absolute;
192
+ inset: 0;
193
+ background: linear-gradient(140deg, rgba(184, 255, 90, 0.08), transparent 40%);
194
+ pointer-events: none;
195
+ }
196
+
197
+ .hero__copy {
198
+ position: relative;
199
+ z-index: 1;
200
+ }
201
+
202
+ .kicker {
203
+ margin: 0 0 12px;
204
+ color: var(--fg2);
205
+ font-family: var(--mono);
206
+ font-size: 12px;
207
+ letter-spacing: 0.18em;
208
+ text-transform: uppercase;
209
+ }
210
+
211
+ .title {
212
+ margin: 0;
213
+ font-family: var(--display);
214
+ font-size: clamp(32px, 5vw, 52px);
215
+ font-weight: 700;
216
+ letter-spacing: -0.015em;
217
+ line-height: 1.05;
218
+ }
219
+
220
+ .lede {
221
+ margin: 14px 0 0;
222
+ color: var(--fg1);
223
+ font-size: 18px;
224
+ max-width: 58ch;
225
+ }
226
+
227
+ .lede strong {
228
+ color: var(--fg0);
229
+ font-weight: 600;
230
+ }
231
+
232
+ .ctaRow {
233
+ display: flex;
234
+ flex-wrap: wrap;
235
+ gap: 10px;
236
+ margin-top: 18px;
237
+ }
238
+
239
+ .btn {
240
+ display: inline-flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ gap: 10px;
244
+ padding: 11px 16px;
245
+ border-radius: 14px;
246
+ border: 1px solid var(--line);
247
+ background: rgba(255, 255, 255, 0.04);
248
+ color: var(--fg0);
249
+ font-family: var(--mono);
250
+ font-size: 12px;
251
+ letter-spacing: 0.08em;
252
+ text-transform: uppercase;
253
+ cursor: pointer;
254
+ }
255
+
256
+ .btn:hover {
257
+ text-decoration: none;
258
+ background: rgba(255, 255, 255, 0.08);
259
+ }
260
+
261
+ .btn--primary {
262
+ border-color: rgba(184, 255, 90, 0.5);
263
+ background: rgba(184, 255, 90, 0.12);
264
+ }
265
+
266
+ .btn--ghost {
267
+ border-color: rgba(255, 155, 53, 0.5);
268
+ background: rgba(255, 155, 53, 0.12);
269
+ }
270
+
271
+ .quickRow {
272
+ margin-top: 22px;
273
+ padding: 14px;
274
+ border-radius: 16px;
275
+ border: 1px solid var(--line);
276
+ background: rgba(0, 0, 0, 0.2);
277
+ display: grid;
278
+ gap: 10px;
279
+ }
280
+
281
+ .quickRow__label {
282
+ font-family: var(--mono);
283
+ font-size: 12px;
284
+ letter-spacing: 0.12em;
285
+ text-transform: uppercase;
286
+ color: var(--fg2);
287
+ }
288
+
289
+ .quickRow__code {
290
+ display: grid;
291
+ gap: 6px;
292
+ font-family: var(--mono);
293
+ font-size: 13px;
294
+ color: var(--fg0);
295
+ }
296
+
297
+ .quickRow__code code {
298
+ display: block;
299
+ padding: 8px 10px;
300
+ border-radius: 12px;
301
+ background: rgba(0, 0, 0, 0.35);
302
+ border: 1px solid rgba(255, 255, 255, 0.08);
303
+ }
304
+
305
+ .quickRow__actions {
306
+ display: flex;
307
+ flex-wrap: wrap;
308
+ gap: 8px;
309
+ }
310
+
311
+ .hero__visual {
312
+ position: relative;
313
+ z-index: 1;
314
+ display: grid;
315
+ gap: 14px;
316
+ }
317
+
318
+ .shot {
319
+ margin: 0;
320
+ border-radius: 20px;
321
+ border: 1px solid rgba(255, 255, 255, 0.12);
322
+ background: rgba(0, 0, 0, 0.24);
323
+ overflow: hidden;
324
+ box-shadow: var(--shadow2);
325
+ }
326
+
327
+ .shot img {
328
+ display: block;
329
+ width: 100%;
330
+ height: auto;
331
+ }
332
+
333
+ .shot figcaption {
334
+ padding: 10px 12px;
335
+ font-family: var(--mono);
336
+ font-size: 12px;
337
+ color: var(--fg2);
338
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
339
+ }
340
+
341
+ .shot--ext {
342
+ transform: translateX(18px);
343
+ }
344
+
345
+ .productGrid {
346
+ display: grid;
347
+ grid-template-columns: repeat(2, minmax(0, 1fr));
348
+ gap: 18px;
349
+ margin-top: 24px;
350
+ padding: 0 6px;
351
+ }
352
+
353
+ .productCard {
354
+ border-radius: var(--r2);
355
+ border: 1px solid var(--line);
356
+ background: rgba(255, 255, 255, 0.03);
357
+ padding: 20px 18px;
358
+ box-shadow: var(--shadow2);
359
+ }
360
+
361
+ .productCard__head {
362
+ display: grid;
363
+ gap: 10px;
364
+ margin-bottom: 12px;
365
+ }
366
+
367
+ .productCard h2 {
368
+ margin: 0;
369
+ font-family: var(--display);
370
+ font-weight: 700;
371
+ letter-spacing: -0.01em;
372
+ font-size: 22px;
373
+ }
374
+
375
+ .productCard p {
376
+ margin: 0;
377
+ color: var(--fg1);
378
+ }
379
+
380
+ .badge {
381
+ align-self: start;
382
+ display: inline-flex;
383
+ align-items: center;
384
+ gap: 8px;
385
+ padding: 6px 10px;
386
+ border-radius: 999px;
387
+ border: 1px solid rgba(184, 255, 90, 0.4);
388
+ background: rgba(184, 255, 90, 0.14);
389
+ font-family: var(--mono);
390
+ font-size: 11px;
391
+ letter-spacing: 0.1em;
392
+ text-transform: uppercase;
393
+ }
394
+
395
+ .badge--alt {
396
+ border-color: rgba(255, 155, 53, 0.5);
397
+ background: rgba(255, 155, 53, 0.14);
398
+ }
399
+
400
+ .list {
401
+ margin: 12px 0 0 16px;
402
+ color: var(--fg1);
403
+ }
404
+
405
+ .list li {
406
+ margin: 6px 0;
407
+ }
408
+
409
+ .cardCode {
410
+ margin-top: 14px;
411
+ border-radius: 16px;
412
+ border: 1px solid rgba(255, 255, 255, 0.1);
413
+ background: rgba(0, 0, 0, 0.35);
414
+ }
415
+
416
+ pre {
417
+ margin: 0;
418
+ padding: 14px 14px 12px;
419
+ color: rgba(247, 242, 231, 0.94);
420
+ font-family: var(--mono);
421
+ font-size: 12.5px;
422
+ line-height: 1.6;
423
+ overflow-x: auto;
424
+ }
425
+
426
+ code {
427
+ font-family: var(--mono);
428
+ }
429
+
430
+ .steps {
431
+ margin: 12px 0 0 18px;
432
+ color: var(--fg1);
433
+ }
434
+
435
+ .steps li {
436
+ margin: 6px 0;
437
+ }
438
+
439
+ .callout {
440
+ margin-top: 12px;
441
+ padding: 12px;
442
+ border-radius: 14px;
443
+ border: 1px dashed rgba(54, 201, 185, 0.5);
444
+ background: rgba(54, 201, 185, 0.08);
445
+ color: var(--fg1);
446
+ }
447
+
448
+ .capGrid {
449
+ display: grid;
450
+ grid-template-columns: repeat(4, minmax(0, 1fr));
451
+ gap: 14px;
452
+ margin-top: 22px;
453
+ padding: 0 6px;
454
+ }
455
+
456
+ .capCard {
457
+ border-radius: 18px;
458
+ border: 1px solid var(--line);
459
+ background: rgba(255, 255, 255, 0.03);
460
+ padding: 16px;
461
+ box-shadow: var(--shadow2);
462
+ }
463
+
464
+ .capCard__eyebrow {
465
+ font-family: var(--mono);
466
+ font-size: 11px;
467
+ letter-spacing: 0.18em;
468
+ text-transform: uppercase;
469
+ color: var(--fg2);
470
+ }
471
+
472
+ .capCard h3 {
473
+ margin: 8px 0 6px;
474
+ font-family: var(--display);
475
+ font-size: 18px;
476
+ }
477
+
478
+ .capCard p {
479
+ margin: 0;
480
+ color: var(--fg1);
481
+ }
482
+
483
+ .flow {
484
+ margin-top: 24px;
485
+ padding: 0 6px;
486
+ }
487
+
488
+ .flow__card {
489
+ border-radius: var(--r2);
490
+ border: 1px solid var(--line);
491
+ background: rgba(255, 255, 255, 0.03);
492
+ padding: 20px;
493
+ box-shadow: var(--shadow2);
494
+ }
495
+
496
+ .flow__card h2 {
497
+ margin: 0 0 16px;
498
+ font-family: var(--display);
499
+ font-size: 24px;
500
+ }
501
+
502
+ .flow__steps {
503
+ display: grid;
504
+ gap: 12px;
505
+ }
506
+
507
+ .flowStep {
508
+ display: grid;
509
+ grid-template-columns: 48px 1fr;
510
+ gap: 12px;
511
+ align-items: start;
512
+ padding: 12px;
513
+ border-radius: 16px;
514
+ border: 1px solid rgba(255, 255, 255, 0.08);
515
+ background: rgba(0, 0, 0, 0.2);
516
+ }
517
+
518
+ .flowStep__num {
519
+ font-family: var(--mono);
520
+ font-size: 16px;
521
+ letter-spacing: 0.12em;
522
+ color: var(--fg2);
523
+ }
524
+
525
+ .flowStep h4 {
526
+ margin: 0 0 4px;
527
+ font-family: var(--display);
528
+ font-size: 18px;
529
+ }
530
+
531
+ .flowStep p {
532
+ margin: 0;
533
+ color: var(--fg1);
534
+ }
535
+
536
+ .more {
537
+ margin-top: 24px;
538
+ padding: 0 6px;
539
+ }
540
+
541
+ .more__card {
542
+ border-radius: var(--r2);
543
+ border: 1px solid var(--line);
544
+ background: rgba(255, 255, 255, 0.03);
545
+ padding: 20px;
546
+ box-shadow: var(--shadow2);
547
+ }
548
+
549
+ .more__card h2 {
550
+ margin: 0 0 14px;
551
+ font-family: var(--display);
552
+ font-size: 22px;
553
+ }
554
+
555
+ .more__grid {
556
+ display: grid;
557
+ grid-template-columns: repeat(3, minmax(0, 1fr));
558
+ gap: 10px;
559
+ }
560
+
561
+ .moreLink {
562
+ display: block;
563
+ padding: 10px 12px;
564
+ border-radius: 12px;
565
+ border: 1px solid rgba(255, 255, 255, 0.1);
566
+ background: rgba(0, 0, 0, 0.2);
567
+ font-family: var(--mono);
568
+ font-size: 12px;
569
+ letter-spacing: 0.06em;
570
+ text-transform: uppercase;
571
+ color: var(--fg1);
572
+ }
573
+
574
+ .moreLink:hover {
575
+ text-decoration: none;
576
+ color: var(--fg0);
577
+ border-color: rgba(184, 255, 90, 0.4);
578
+ }
579
+
580
+ .footer {
581
+ margin-top: 30px;
582
+ padding: 18px 6px 0;
583
+ border-top: 1px solid var(--line);
584
+ display: flex;
585
+ flex-wrap: wrap;
586
+ align-items: baseline;
587
+ justify-content: space-between;
588
+ gap: 10px;
589
+ color: var(--fg2);
590
+ font-family: var(--mono);
591
+ font-size: 12px;
592
+ }
593
+
594
+ .footer a {
595
+ color: var(--fg1);
596
+ }
597
+
598
+ .reveal {
599
+ opacity: 0;
600
+ transform: translateY(14px);
601
+ }
602
+
603
+ .reveal.is-on {
604
+ opacity: 1;
605
+ transform: translateY(0);
606
+ transition:
607
+ opacity 700ms cubic-bezier(0.2, 0.9, 0.2, 1),
608
+ transform 700ms cubic-bezier(0.2, 0.9, 0.2, 1);
609
+ }
610
+
611
+ .hero--compact .hero__frame {
612
+ max-width: 760px;
613
+ margin: 30px auto 0;
614
+ grid-template-columns: 1fr;
615
+ }
616
+
617
+ .docShell {
618
+ display: grid;
619
+ grid-template-columns: 260px 1fr;
620
+ gap: 18px;
621
+ padding: 10px 6px 0;
622
+ }
623
+
624
+ .side {
625
+ position: sticky;
626
+ top: 14px;
627
+ align-self: start;
628
+ border-radius: var(--r2);
629
+ border: 1px solid var(--line);
630
+ background: rgba(255, 255, 255, 0.03);
631
+ padding: 14px 12px;
632
+ box-shadow: var(--shadow2);
633
+ }
634
+
635
+ .side h2 {
636
+ margin: 0 0 10px;
637
+ font-family: var(--mono);
638
+ font-size: 12px;
639
+ letter-spacing: 0.12em;
640
+ text-transform: uppercase;
641
+ color: var(--fg2);
642
+ }
643
+
644
+ .side a {
645
+ display: block;
646
+ padding: 9px 10px;
647
+ border-radius: 12px;
648
+ border: 1px solid transparent;
649
+ color: var(--fg1);
650
+ font-family: var(--mono);
651
+ font-size: 12px;
652
+ }
653
+
654
+ .side a:hover {
655
+ text-decoration: none;
656
+ border-color: var(--line);
657
+ background: rgba(255, 255, 255, 0.04);
658
+ color: var(--fg0);
659
+ }
660
+
661
+ .side a[aria-current="page"] {
662
+ border-color: rgba(184, 255, 90, 0.4);
663
+ background: rgba(184, 255, 90, 0.1);
664
+ color: var(--fg0);
665
+ }
666
+
667
+ .doc {
668
+ border-radius: var(--r2);
669
+ border: 1px solid var(--line);
670
+ background: rgba(255, 255, 255, 0.03);
671
+ box-shadow: var(--shadow);
672
+ padding: 18px 18px 14px;
673
+ }
674
+
675
+ .doc h1 {
676
+ margin: 0 0 10px;
677
+ font-family: var(--display);
678
+ font-weight: 700;
679
+ letter-spacing: -0.015em;
680
+ font-size: 30px;
681
+ }
682
+
683
+ .doc h2 {
684
+ margin: 18px 0 8px;
685
+ font-family: var(--display);
686
+ font-weight: 650;
687
+ letter-spacing: -0.01em;
688
+ font-size: 20px;
689
+ }
690
+
691
+ .doc ul {
692
+ margin: 8px 0 0 18px;
693
+ color: var(--fg1);
694
+ }
695
+
696
+ .doc li {
697
+ margin: 6px 0;
698
+ }
699
+
700
+ .doc p {
701
+ margin: 10px 0 0;
702
+ color: var(--fg1);
703
+ }
704
+
705
+ .doc .note {
706
+ margin-top: 14px;
707
+ padding: 12px 12px;
708
+ border-radius: 14px;
709
+ border: 1px dashed rgba(184, 255, 90, 0.45);
710
+ background: rgba(184, 255, 90, 0.08);
711
+ color: var(--fg1);
712
+ }
713
+
714
+ @media (max-width: 980px) {
715
+ .hero__frame {
716
+ grid-template-columns: 1fr;
717
+ }
718
+ .shot--ext {
719
+ transform: none;
720
+ }
721
+ .productGrid {
722
+ grid-template-columns: 1fr;
723
+ }
724
+ .capGrid {
725
+ grid-template-columns: 1fr 1fr;
726
+ }
727
+ .more__grid {
728
+ grid-template-columns: 1fr 1fr;
729
+ }
730
+ .docShell {
731
+ grid-template-columns: 1fr;
732
+ }
733
+ .side {
734
+ position: static;
735
+ }
736
+ }
737
+
738
+ @media (max-width: 640px) {
739
+ .capGrid {
740
+ grid-template-columns: 1fr;
741
+ }
742
+ .more__grid {
743
+ grid-template-columns: 1fr;
744
+ }
745
+ .flowStep {
746
+ grid-template-columns: 1fr;
747
+ }
748
+ }