zubo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/.github/workflows/ci.yml +35 -0
  2. package/README.md +149 -0
  3. package/bun.lock +216 -0
  4. package/desktop/README.md +57 -0
  5. package/desktop/package.json +12 -0
  6. package/desktop/src-tauri/Cargo.toml +25 -0
  7. package/desktop/src-tauri/build.rs +3 -0
  8. package/desktop/src-tauri/icons/README.md +17 -0
  9. package/desktop/src-tauri/icons/icon.png +0 -0
  10. package/desktop/src-tauri/src/main.rs +189 -0
  11. package/desktop/src-tauri/tauri.conf.json +68 -0
  12. package/docs/ROADMAP.md +490 -0
  13. package/migrations/001_init.sql +9 -0
  14. package/migrations/002_memory.sql +33 -0
  15. package/migrations/003_cron.sql +24 -0
  16. package/migrations/004_usage.sql +12 -0
  17. package/migrations/005_secrets.sql +8 -0
  18. package/migrations/006_agents.sql +1 -0
  19. package/migrations/007_workflows.sql +22 -0
  20. package/migrations/008_proactive.sql +24 -0
  21. package/migrations/009_uploads.sql +9 -0
  22. package/migrations/010_observability.sql +22 -0
  23. package/migrations/011_api_keys.sql +7 -0
  24. package/migrations/012_indexes.sql +5 -0
  25. package/migrations/013_budget.sql +11 -0
  26. package/migrations/014_usage_session_idx.sql +2 -0
  27. package/package.json +39 -0
  28. package/site/404.html +156 -0
  29. package/site/CNAME +1 -0
  30. package/site/docs/agents.html +294 -0
  31. package/site/docs/api.html +446 -0
  32. package/site/docs/channels.html +345 -0
  33. package/site/docs/cli.html +238 -0
  34. package/site/docs/config.html +1034 -0
  35. package/site/docs/index.html +433 -0
  36. package/site/docs/integrations.html +381 -0
  37. package/site/docs/memory.html +254 -0
  38. package/site/docs/security.html +375 -0
  39. package/site/docs/skills.html +322 -0
  40. package/site/docs.css +412 -0
  41. package/site/index.html +638 -0
  42. package/site/install.sh +98 -0
  43. package/site/logo.svg +1 -0
  44. package/site/og-image.png +0 -0
  45. package/site/robots.txt +4 -0
  46. package/site/script.js +361 -0
  47. package/site/sitemap.xml +63 -0
  48. package/site/skills.html +532 -0
  49. package/site/style.css +1686 -0
  50. package/src/agent/agents.ts +159 -0
  51. package/src/agent/compaction.ts +53 -0
  52. package/src/agent/context.ts +18 -0
  53. package/src/agent/delegate.ts +118 -0
  54. package/src/agent/loop.ts +318 -0
  55. package/src/agent/prompts.ts +111 -0
  56. package/src/agent/session.ts +87 -0
  57. package/src/agent/teams.ts +116 -0
  58. package/src/agent/workflow-executor.ts +192 -0
  59. package/src/agent/workflow.ts +175 -0
  60. package/src/channels/adapter.ts +21 -0
  61. package/src/channels/dashboard.html.ts +2969 -0
  62. package/src/channels/discord.ts +137 -0
  63. package/src/channels/optional-deps.d.ts +17 -0
  64. package/src/channels/router.ts +199 -0
  65. package/src/channels/signal.ts +133 -0
  66. package/src/channels/slack.ts +101 -0
  67. package/src/channels/telegram.ts +102 -0
  68. package/src/channels/utils.ts +18 -0
  69. package/src/channels/webchat.ts +1797 -0
  70. package/src/channels/whatsapp.ts +119 -0
  71. package/src/config/loader.ts +22 -0
  72. package/src/config/paths.ts +43 -0
  73. package/src/config/schema.ts +121 -0
  74. package/src/db/connection.ts +20 -0
  75. package/src/db/export.ts +148 -0
  76. package/src/db/migrations.ts +42 -0
  77. package/src/index.ts +261 -0
  78. package/src/llm/claude.ts +193 -0
  79. package/src/llm/factory.ts +115 -0
  80. package/src/llm/failover.ts +101 -0
  81. package/src/llm/openai-compat.ts +409 -0
  82. package/src/llm/provider.ts +83 -0
  83. package/src/llm/smart-router.ts +241 -0
  84. package/src/logs.ts +53 -0
  85. package/src/memory/chunker.ts +58 -0
  86. package/src/memory/document-parser.ts +115 -0
  87. package/src/memory/embedder.ts +235 -0
  88. package/src/memory/engine.ts +170 -0
  89. package/src/memory/fts-index.ts +55 -0
  90. package/src/memory/hybrid-search.ts +72 -0
  91. package/src/memory/store.ts +56 -0
  92. package/src/memory/vector-index.ts +72 -0
  93. package/src/model.ts +118 -0
  94. package/src/registry/cli.ts +43 -0
  95. package/src/registry/client.ts +54 -0
  96. package/src/registry/installer.ts +67 -0
  97. package/src/scheduler/briefing.ts +71 -0
  98. package/src/scheduler/cron.ts +258 -0
  99. package/src/scheduler/heartbeat.ts +58 -0
  100. package/src/scheduler/memory-triggers.ts +100 -0
  101. package/src/scheduler/natural-cron.ts +163 -0
  102. package/src/scheduler/proactive.ts +25 -0
  103. package/src/scheduler/recipes.ts +110 -0
  104. package/src/secrets/store.ts +64 -0
  105. package/src/setup.ts +413 -0
  106. package/src/skills.ts +293 -0
  107. package/src/start.ts +373 -0
  108. package/src/status.ts +165 -0
  109. package/src/tools/builtin/connect-service.ts +205 -0
  110. package/src/tools/builtin/cron.ts +126 -0
  111. package/src/tools/builtin/datetime.ts +36 -0
  112. package/src/tools/builtin/delegate-task.ts +81 -0
  113. package/src/tools/builtin/delegate.ts +42 -0
  114. package/src/tools/builtin/diagnose.ts +41 -0
  115. package/src/tools/builtin/google-oauth.ts +379 -0
  116. package/src/tools/builtin/manage-agents.ts +149 -0
  117. package/src/tools/builtin/manage-skills.ts +294 -0
  118. package/src/tools/builtin/manage-teams.ts +89 -0
  119. package/src/tools/builtin/manage-triggers.ts +94 -0
  120. package/src/tools/builtin/manage-workflows.ts +119 -0
  121. package/src/tools/builtin/memory-search.ts +38 -0
  122. package/src/tools/builtin/memory-write.ts +30 -0
  123. package/src/tools/builtin/run-workflow.ts +36 -0
  124. package/src/tools/builtin/secrets.ts +122 -0
  125. package/src/tools/builtin/skill-registry.ts +75 -0
  126. package/src/tools/builtin-integrations/api-helpers.ts +26 -0
  127. package/src/tools/builtin-integrations/github/github_issues/SKILL.md +56 -0
  128. package/src/tools/builtin-integrations/github/github_issues/handler.ts +108 -0
  129. package/src/tools/builtin-integrations/github/github_prs/SKILL.md +57 -0
  130. package/src/tools/builtin-integrations/github/github_prs/handler.ts +113 -0
  131. package/src/tools/builtin-integrations/github/github_repos/SKILL.md +37 -0
  132. package/src/tools/builtin-integrations/github/github_repos/handler.ts +88 -0
  133. package/src/tools/builtin-integrations/google/gmail/SKILL.md +51 -0
  134. package/src/tools/builtin-integrations/google/gmail/handler.ts +125 -0
  135. package/src/tools/builtin-integrations/google/google_calendar/SKILL.md +35 -0
  136. package/src/tools/builtin-integrations/google/google_calendar/handler.ts +105 -0
  137. package/src/tools/builtin-integrations/google/google_docs/SKILL.md +35 -0
  138. package/src/tools/builtin-integrations/google/google_docs/handler.ts +108 -0
  139. package/src/tools/builtin-integrations/google/google_drive/SKILL.md +39 -0
  140. package/src/tools/builtin-integrations/google/google_drive/handler.ts +106 -0
  141. package/src/tools/builtin-integrations/google/google_sheets/SKILL.md +36 -0
  142. package/src/tools/builtin-integrations/google/google_sheets/handler.ts +116 -0
  143. package/src/tools/builtin-integrations/jira/jira_boards/SKILL.md +21 -0
  144. package/src/tools/builtin-integrations/jira/jira_boards/handler.ts +74 -0
  145. package/src/tools/builtin-integrations/jira/jira_issues/SKILL.md +28 -0
  146. package/src/tools/builtin-integrations/jira/jira_issues/handler.ts +140 -0
  147. package/src/tools/builtin-integrations/linear/linear_issues/SKILL.md +30 -0
  148. package/src/tools/builtin-integrations/linear/linear_issues/handler.ts +75 -0
  149. package/src/tools/builtin-integrations/linear/linear_projects/SKILL.md +21 -0
  150. package/src/tools/builtin-integrations/linear/linear_projects/handler.ts +43 -0
  151. package/src/tools/builtin-integrations/notion/notion_databases/SKILL.md +39 -0
  152. package/src/tools/builtin-integrations/notion/notion_databases/handler.ts +83 -0
  153. package/src/tools/builtin-integrations/notion/notion_pages/SKILL.md +43 -0
  154. package/src/tools/builtin-integrations/notion/notion_pages/handler.ts +130 -0
  155. package/src/tools/builtin-integrations/notion/notion_search/SKILL.md +27 -0
  156. package/src/tools/builtin-integrations/notion/notion_search/handler.ts +69 -0
  157. package/src/tools/builtin-integrations/slack/slack_messages/SKILL.md +42 -0
  158. package/src/tools/builtin-integrations/slack/slack_messages/handler.ts +72 -0
  159. package/src/tools/builtin-integrations/twitter/twitter_posts/SKILL.md +24 -0
  160. package/src/tools/builtin-integrations/twitter/twitter_posts/handler.ts +133 -0
  161. package/src/tools/builtin-skills/file-read/SKILL.md +26 -0
  162. package/src/tools/builtin-skills/file-read/handler.ts +66 -0
  163. package/src/tools/builtin-skills/file-write/SKILL.md +30 -0
  164. package/src/tools/builtin-skills/file-write/handler.ts +64 -0
  165. package/src/tools/builtin-skills/http-request/SKILL.md +34 -0
  166. package/src/tools/builtin-skills/http-request/handler.ts +87 -0
  167. package/src/tools/builtin-skills/shell/SKILL.md +26 -0
  168. package/src/tools/builtin-skills/shell/handler.ts +96 -0
  169. package/src/tools/builtin-skills/url-fetch/SKILL.md +26 -0
  170. package/src/tools/builtin-skills/url-fetch/handler.ts +37 -0
  171. package/src/tools/builtin-skills/web-search/SKILL.md +26 -0
  172. package/src/tools/builtin-skills/web-search/handler.ts +50 -0
  173. package/src/tools/executor.ts +205 -0
  174. package/src/tools/integration-installer.ts +106 -0
  175. package/src/tools/permissions.ts +45 -0
  176. package/src/tools/registry.ts +39 -0
  177. package/src/tools/sandbox-runner.ts +56 -0
  178. package/src/tools/sandbox.ts +82 -0
  179. package/src/tools/skill-installer.ts +52 -0
  180. package/src/tools/skill-loader.ts +259 -0
  181. package/src/types/optional-deps.d.ts +23 -0
  182. package/src/util/auth.ts +121 -0
  183. package/src/util/costs.ts +59 -0
  184. package/src/util/error-buffer.ts +32 -0
  185. package/src/util/google-tokens.ts +180 -0
  186. package/src/util/logger.ts +73 -0
  187. package/src/util/perf-collector.ts +35 -0
  188. package/src/util/rate-limiter.ts +70 -0
  189. package/src/util/tokens.ts +17 -0
  190. package/src/voice/stt.ts +57 -0
  191. package/src/voice/tts.ts +103 -0
  192. package/tests/agent/session.test.ts +109 -0
  193. package/tests/agent-loop.test.ts +54 -0
  194. package/tests/auth.test.ts +89 -0
  195. package/tests/channels.test.ts +67 -0
  196. package/tests/compaction.test.ts +44 -0
  197. package/tests/config.test.ts +51 -0
  198. package/tests/costs.test.ts +19 -0
  199. package/tests/cron.test.ts +55 -0
  200. package/tests/db/export.test.ts +219 -0
  201. package/tests/executor.test.ts +144 -0
  202. package/tests/export.test.ts +137 -0
  203. package/tests/helpers/mock-llm.ts +34 -0
  204. package/tests/helpers/test-db.ts +74 -0
  205. package/tests/integration/chat-flow.test.ts +48 -0
  206. package/tests/integrations.test.ts +97 -0
  207. package/tests/memory/engine.test.ts +114 -0
  208. package/tests/memory-engine.test.ts +57 -0
  209. package/tests/permissions.test.ts +21 -0
  210. package/tests/rate-limiter.test.ts +70 -0
  211. package/tests/registry.test.ts +67 -0
  212. package/tests/router.test.ts +36 -0
  213. package/tests/session.test.ts +58 -0
  214. package/tests/skill-loader.test.ts +44 -0
  215. package/tests/tokens.test.ts +30 -0
  216. package/tests/tools/executor.test.ts +130 -0
  217. package/tests/util/auth.test.ts +75 -0
  218. package/tests/util/rate-limiter.test.ts +73 -0
  219. package/tests/voice.test.ts +60 -0
  220. package/tests/webchat.test.ts +88 -0
  221. package/tests/workflow.test.ts +38 -0
  222. package/tsconfig.json +16 -0
package/site/style.css ADDED
@@ -0,0 +1,1686 @@
1
+ /* ============================================
2
+ Zubo Marketing Website — style.css
3
+ Brand: Black #060608, Violet #7c3aed,
4
+ Indigo #6366f1, Fuchsia #d946ef,
5
+ Emerald #10b981
6
+ ============================================ */
7
+
8
+ /* --- Reset & Vars --- */
9
+ *, *::before, *::after {
10
+ margin: 0;
11
+ padding: 0;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ :root {
16
+ --bg: #060608;
17
+ --bg-elevated: #0e0e12;
18
+ --bg-card: #111116;
19
+ --bg-card-hover: #18181f;
20
+ --border: #1e1e26;
21
+ --border-light: #2a2a35;
22
+ --text: #f0f0f5;
23
+ --text-secondary: #9595a8;
24
+ --text-muted: #5f5f73;
25
+ --violet: #7c3aed;
26
+ --indigo: #6366f1;
27
+ --fuchsia: #d946ef;
28
+ --emerald: #10b981;
29
+ --amber: #f59e0b;
30
+ --gradient: linear-gradient(135deg, var(--violet), var(--fuchsia));
31
+ --gradient-text: linear-gradient(135deg, #fbbf24 0%, #f97316 25%, #ec4899 50%, #a855f7 75%, #6366f1 100%);
32
+ --shadow-glow: 0 0 80px rgba(124, 58, 237, 0.15);
33
+ --radius: 12px;
34
+ --radius-lg: 20px;
35
+ --radius-xl: 28px;
36
+ --font: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
37
+ --display: 'Bricolage Grotesque', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
38
+ --mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
39
+ --nav-h: 64px;
40
+ --ease: cubic-bezier(0.16, 1, 0.3, 1);
41
+ }
42
+
43
+ html {
44
+ scroll-behavior: smooth;
45
+ -webkit-font-smoothing: antialiased;
46
+ -moz-osx-font-smoothing: grayscale;
47
+ }
48
+
49
+ body {
50
+ font-family: var(--font);
51
+ background: var(--bg);
52
+ color: var(--text);
53
+ line-height: 1.65;
54
+ overflow-x: hidden;
55
+ }
56
+
57
+ a { color: inherit; text-decoration: none; }
58
+ img { max-width: 100%; display: block; }
59
+ strong { font-weight: 600; color: #fff; }
60
+
61
+ /* Display font for headings */
62
+ h1, h2, h3, h4,
63
+ .section-title,
64
+ .hero-title,
65
+ .oss-card h2,
66
+ .cta-content h2 {
67
+ font-family: var(--display);
68
+ }
69
+
70
+ .container {
71
+ max-width: 1140px;
72
+ margin: 0 auto;
73
+ padding: 0 24px;
74
+ }
75
+
76
+ /* --- Scroll Progress Bar --- */
77
+ .scroll-progress {
78
+ position: fixed;
79
+ top: 0;
80
+ left: 0;
81
+ height: 3px;
82
+ width: var(--progress, 0%);
83
+ background: var(--gradient-text);
84
+ z-index: 9999;
85
+ pointer-events: none;
86
+ transition: width 0.1s linear;
87
+ }
88
+
89
+ /* --- Noise Overlay --- */
90
+ .noise {
91
+ position: fixed;
92
+ inset: 0;
93
+ z-index: 9999;
94
+ pointer-events: none;
95
+ opacity: 0.025;
96
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
97
+ background-repeat: repeat;
98
+ background-size: 256px;
99
+ }
100
+
101
+ /* --- Gradient Text --- */
102
+ .gradient-text {
103
+ background: var(--gradient-text);
104
+ -webkit-background-clip: text;
105
+ -webkit-text-fill-color: transparent;
106
+ background-clip: text;
107
+ }
108
+
109
+ /* --- Reveal Animation --- */
110
+ .reveal {
111
+ opacity: 0;
112
+ transform: translateY(32px);
113
+ transition: opacity 0.8s var(--ease), transform 0.8s var(--ease);
114
+ }
115
+ .reveal.visible {
116
+ opacity: 1;
117
+ transform: translateY(0);
118
+ }
119
+ .reveal-delay-1 { transition-delay: 0.15s; }
120
+ .reveal-delay-2 { transition-delay: 0.3s; }
121
+
122
+ /* --- Staggered Reveal Animation --- */
123
+ .reveal-stagger > * {
124
+ opacity: 0;
125
+ transform: translateY(24px);
126
+ transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
127
+ }
128
+ .reveal-stagger.visible > * {
129
+ opacity: 1;
130
+ transform: translateY(0);
131
+ }
132
+ .reveal-stagger.visible > *:nth-child(1) { transition-delay: 0.08s; }
133
+ .reveal-stagger.visible > *:nth-child(2) { transition-delay: 0.16s; }
134
+ .reveal-stagger.visible > *:nth-child(3) { transition-delay: 0.24s; }
135
+ .reveal-stagger.visible > *:nth-child(4) { transition-delay: 0.32s; }
136
+ .reveal-stagger.visible > *:nth-child(5) { transition-delay: 0.40s; }
137
+ .reveal-stagger.visible > *:nth-child(6) { transition-delay: 0.48s; }
138
+ .reveal-stagger.visible > *:nth-child(7) { transition-delay: 0.56s; }
139
+ .reveal-stagger.visible > *:nth-child(8) { transition-delay: 0.64s; }
140
+
141
+ /* --- Animated Gradient Border --- */
142
+ @property --angle {
143
+ syntax: '<angle>';
144
+ initial-value: 0deg;
145
+ inherits: false;
146
+ }
147
+
148
+ @keyframes rotate-border {
149
+ to { --angle: 360deg; }
150
+ }
151
+
152
+ .glow-border {
153
+ position: relative;
154
+ }
155
+
156
+ .glow-border::before {
157
+ content: '';
158
+ position: absolute;
159
+ inset: 0;
160
+ border-radius: inherit;
161
+ padding: 1px;
162
+ background: conic-gradient(
163
+ from var(--angle, 0deg),
164
+ transparent 40%,
165
+ var(--violet),
166
+ var(--fuchsia),
167
+ var(--amber),
168
+ transparent 60%
169
+ );
170
+ -webkit-mask:
171
+ linear-gradient(#fff 0 0) content-box,
172
+ linear-gradient(#fff 0 0);
173
+ -webkit-mask-composite: xor;
174
+ mask:
175
+ linear-gradient(#fff 0 0) content-box,
176
+ linear-gradient(#fff 0 0);
177
+ mask-composite: exclude;
178
+ animation: rotate-border 4s linear infinite;
179
+ pointer-events: none;
180
+ }
181
+
182
+ /* --- Card Tilt (JS-driven) --- */
183
+ .tilt-card {
184
+ transform-style: preserve-3d;
185
+ transition: transform 0.4s ease, box-shadow 0.4s ease;
186
+ }
187
+
188
+ /* --- Buttons --- */
189
+ .btn {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ gap: 8px;
193
+ font-family: var(--font);
194
+ font-weight: 600;
195
+ font-size: 14px;
196
+ border: none;
197
+ border-radius: 10px;
198
+ cursor: pointer;
199
+ transition: all 0.25s var(--ease);
200
+ text-decoration: none;
201
+ white-space: nowrap;
202
+ letter-spacing: -0.01em;
203
+ }
204
+ .btn-primary {
205
+ background: var(--gradient);
206
+ color: #fff;
207
+ box-shadow: 0 2px 16px rgba(124, 58, 237, 0.3), inset 0 1px 0 rgba(255,255,255,0.1);
208
+ }
209
+ .btn-primary:hover {
210
+ box-shadow: 0 8px 32px rgba(124, 58, 237, 0.5), 0 2px 12px rgba(217, 70, 239, 0.3), inset 0 1px 0 rgba(255,255,255,0.2);
211
+ transform: translateY(-2px) scale(1.02);
212
+ }
213
+ .btn-primary:active {
214
+ transform: translateY(0) scale(0.98);
215
+ box-shadow: 0 2px 12px rgba(124, 58, 237, 0.3), inset 0 1px 0 rgba(255,255,255,0.1);
216
+ }
217
+ .btn-ghost {
218
+ background: rgba(255,255,255,0.06);
219
+ color: var(--text);
220
+ border: 1px solid var(--border-light);
221
+ }
222
+ .btn-ghost:hover {
223
+ background: rgba(255,255,255,0.1);
224
+ border-color: rgba(255,255,255,0.15);
225
+ }
226
+ .btn-nav { padding: 8px 18px; font-size: 13px; }
227
+ .btn-lg { padding: 14px 28px; font-size: 15px; border-radius: 12px; }
228
+ .btn-xl { padding: 18px 36px; font-size: 17px; border-radius: 14px; }
229
+
230
+ /* ========== NAVIGATION ========== */
231
+ .nav {
232
+ position: fixed;
233
+ top: 0;
234
+ left: 0;
235
+ right: 0;
236
+ z-index: 1000;
237
+ height: var(--nav-h);
238
+ transition: all 0.3s var(--ease);
239
+ }
240
+ .nav.scrolled {
241
+ background: rgba(6, 6, 8, 0.85);
242
+ backdrop-filter: blur(16px) saturate(180%);
243
+ -webkit-backdrop-filter: blur(16px) saturate(180%);
244
+ border-bottom: 1px solid var(--border);
245
+ }
246
+ .nav-inner {
247
+ max-width: 1140px;
248
+ margin: 0 auto;
249
+ padding: 0 24px;
250
+ height: 100%;
251
+ display: flex;
252
+ align-items: center;
253
+ justify-content: space-between;
254
+ }
255
+ .nav-logo {
256
+ display: flex;
257
+ align-items: center;
258
+ gap: 10px;
259
+ font-weight: 800;
260
+ font-size: 18px;
261
+ letter-spacing: -0.02em;
262
+ }
263
+ .logo-mark { display: none; }
264
+ .logo-wordmark { color: #fff; }
265
+ .nav-links {
266
+ display: flex;
267
+ gap: 32px;
268
+ }
269
+ .nav-links a {
270
+ font-size: 14px;
271
+ font-weight: 500;
272
+ color: var(--text-secondary);
273
+ transition: color 0.2s;
274
+ }
275
+ .nav-links a:hover { color: #fff; }
276
+ .nav-right {
277
+ display: flex;
278
+ align-items: center;
279
+ gap: 16px;
280
+ }
281
+ .nav-github {
282
+ color: var(--text-secondary);
283
+ transition: color 0.2s;
284
+ display: flex;
285
+ }
286
+ .nav-github:hover { color: #fff; }
287
+ .nav-toggle {
288
+ display: none;
289
+ flex-direction: column;
290
+ gap: 5px;
291
+ background: none;
292
+ border: none;
293
+ cursor: pointer;
294
+ padding: 4px;
295
+ }
296
+ .nav-toggle span {
297
+ width: 22px;
298
+ height: 2px;
299
+ background: var(--text);
300
+ border-radius: 2px;
301
+ transition: all 0.3s var(--ease);
302
+ }
303
+ .nav-toggle.active span:nth-child(1) { transform: rotate(45deg) translate(4px, 4px); }
304
+ .nav-toggle.active span:nth-child(2) { opacity: 0; }
305
+ .nav-toggle.active span:nth-child(3) { transform: rotate(-45deg) translate(4px, -4px); }
306
+
307
+ /* ========== HERO ========== */
308
+ .hero {
309
+ position: relative;
310
+ min-height: 100vh;
311
+ display: flex;
312
+ flex-direction: column;
313
+ align-items: center;
314
+ justify-content: center;
315
+ padding: 120px 0 80px;
316
+ overflow: hidden;
317
+ }
318
+
319
+ /* Animated gradient orbs */
320
+ .hero-glow {
321
+ position: absolute;
322
+ inset: 0;
323
+ overflow: hidden;
324
+ pointer-events: none;
325
+ }
326
+ .orb {
327
+ position: absolute;
328
+ border-radius: 50%;
329
+ filter: blur(100px);
330
+ opacity: 0.4;
331
+ }
332
+ .orb-1 {
333
+ width: 600px;
334
+ height: 600px;
335
+ background: var(--violet);
336
+ top: -15%;
337
+ left: -10%;
338
+ animation: orb-float-1 20s ease-in-out infinite;
339
+ }
340
+ .orb-2 {
341
+ width: 500px;
342
+ height: 500px;
343
+ background: var(--fuchsia);
344
+ top: 10%;
345
+ right: -15%;
346
+ animation: orb-float-2 25s ease-in-out infinite;
347
+ }
348
+ .orb-3 {
349
+ width: 400px;
350
+ height: 400px;
351
+ background: var(--indigo);
352
+ bottom: -10%;
353
+ left: 30%;
354
+ animation: orb-float-3 22s ease-in-out infinite;
355
+ }
356
+
357
+ @keyframes orb-float-1 {
358
+ 0%, 100% { transform: translate(0, 0) scale(1); }
359
+ 33% { transform: translate(80px, 40px) scale(1.1); }
360
+ 66% { transform: translate(-40px, 80px) scale(0.95); }
361
+ }
362
+ @keyframes orb-float-2 {
363
+ 0%, 100% { transform: translate(0, 0) scale(1); }
364
+ 33% { transform: translate(-60px, 60px) scale(0.9); }
365
+ 66% { transform: translate(40px, -40px) scale(1.15); }
366
+ }
367
+ @keyframes orb-float-3 {
368
+ 0%, 100% { transform: translate(0, 0) scale(1); }
369
+ 33% { transform: translate(60px, -60px) scale(1.05); }
370
+ 66% { transform: translate(-80px, 20px) scale(0.95); }
371
+ }
372
+
373
+ /* Grid background */
374
+ .hero-grid-bg {
375
+ position: absolute;
376
+ inset: 0;
377
+ background-image:
378
+ linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
379
+ linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
380
+ background-size: 64px 64px;
381
+ mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, black, transparent);
382
+ -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, black, transparent);
383
+ pointer-events: none;
384
+ }
385
+
386
+ .hero-content {
387
+ text-align: center;
388
+ position: relative;
389
+ z-index: 2;
390
+ }
391
+
392
+ /* Hero badge with shimmer */
393
+ .hero-badge {
394
+ display: inline-flex;
395
+ align-items: center;
396
+ gap: 10px;
397
+ padding: 8px 18px;
398
+ background: rgba(124, 58, 237, 0.1);
399
+ border: 1px solid rgba(124, 58, 237, 0.2);
400
+ border-radius: 100px;
401
+ font-size: 13px;
402
+ font-weight: 500;
403
+ color: #c4b5fd;
404
+ margin-bottom: 32px;
405
+ position: relative;
406
+ overflow: hidden;
407
+ }
408
+ .hero-badge::after {
409
+ content: '';
410
+ position: absolute;
411
+ top: 0;
412
+ left: -100%;
413
+ width: 60%;
414
+ height: 100%;
415
+ background: linear-gradient(
416
+ 90deg,
417
+ transparent,
418
+ rgba(255, 255, 255, 0.12),
419
+ transparent
420
+ );
421
+ animation: badge-shimmer 3s ease-in-out infinite;
422
+ }
423
+ @keyframes badge-shimmer {
424
+ 0% { left: -100%; }
425
+ 40%, 100% { left: 150%; }
426
+ }
427
+
428
+ .badge-pulse {
429
+ width: 8px;
430
+ height: 8px;
431
+ background: var(--emerald);
432
+ border-radius: 50%;
433
+ animation: pulse 2s ease-in-out infinite;
434
+ }
435
+ @keyframes pulse {
436
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); }
437
+ 50% { opacity: 0.7; box-shadow: 0 0 0 8px rgba(16, 185, 129, 0); }
438
+ }
439
+
440
+ .hero-title {
441
+ font-size: clamp(3rem, 7vw, 5.5rem);
442
+ font-weight: 900;
443
+ line-height: 1.05;
444
+ letter-spacing: -0.04em;
445
+ margin-bottom: 24px;
446
+ }
447
+ .hero-line { display: block; }
448
+
449
+ .hero-subtitle {
450
+ max-width: 640px;
451
+ margin: 0 auto 40px;
452
+ font-size: clamp(1rem, 1.8vw, 1.2rem);
453
+ color: var(--text-secondary);
454
+ line-height: 1.7;
455
+ }
456
+
457
+ .hero-actions {
458
+ display: flex;
459
+ gap: 16px;
460
+ justify-content: center;
461
+ flex-wrap: wrap;
462
+ margin-bottom: 48px;
463
+ }
464
+
465
+ /* Stats bar */
466
+ .hero-stats {
467
+ display: flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ gap: 0;
471
+ padding: 20px 0;
472
+ }
473
+ .hero-stat {
474
+ display: flex;
475
+ flex-direction: column;
476
+ align-items: center;
477
+ padding: 0 32px;
478
+ }
479
+ .hero-stat-number {
480
+ font-size: 32px;
481
+ font-weight: 800;
482
+ letter-spacing: -0.03em;
483
+ background: var(--gradient-text);
484
+ -webkit-background-clip: text;
485
+ -webkit-text-fill-color: transparent;
486
+ background-clip: text;
487
+ }
488
+ .hero-stat-label {
489
+ font-size: 13px;
490
+ color: var(--text-muted);
491
+ font-weight: 500;
492
+ margin-top: 2px;
493
+ }
494
+ .hero-stat-divider {
495
+ width: 1px;
496
+ height: 32px;
497
+ background: var(--border);
498
+ }
499
+
500
+ /* ========== TERMINAL ========== */
501
+ .hero-terminal {
502
+ position: relative;
503
+ z-index: 2;
504
+ margin-top: 56px;
505
+ max-width: 720px;
506
+ width: 100%;
507
+ margin-left: auto;
508
+ margin-right: auto;
509
+ }
510
+ .terminal {
511
+ background: #0c0c10;
512
+ border: 1px solid var(--border);
513
+ border-radius: var(--radius-lg);
514
+ overflow: hidden;
515
+ box-shadow: var(--shadow-glow), 0 24px 64px rgba(0,0,0,0.5);
516
+ }
517
+ .terminal-chrome {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: 12px;
521
+ padding: 14px 18px;
522
+ background: rgba(255,255,255,0.02);
523
+ border-bottom: 1px solid var(--border);
524
+ }
525
+ .terminal-dots {
526
+ display: flex;
527
+ gap: 7px;
528
+ }
529
+ .td {
530
+ width: 12px;
531
+ height: 12px;
532
+ border-radius: 50%;
533
+ }
534
+ .td-r { background: #ff5f57; }
535
+ .td-y { background: #febc2e; }
536
+ .td-g { background: #28c840; }
537
+ .terminal-title {
538
+ flex: 1;
539
+ text-align: center;
540
+ font-size: 12px;
541
+ font-family: var(--mono);
542
+ color: var(--text-muted);
543
+ margin-right: 48px;
544
+ }
545
+ .terminal-body {
546
+ padding: 24px;
547
+ font-family: var(--mono);
548
+ font-size: 13px;
549
+ line-height: 1.8;
550
+ min-height: 260px;
551
+ }
552
+ .terminal-line {
553
+ display: flex;
554
+ gap: 12px;
555
+ margin-bottom: 16px;
556
+ align-items: flex-start;
557
+ }
558
+ .terminal-line:last-of-type { margin-bottom: 0; }
559
+ .t-user, .t-agent {
560
+ font-size: 11px;
561
+ font-weight: 600;
562
+ padding: 2px 8px;
563
+ border-radius: 4px;
564
+ flex-shrink: 0;
565
+ margin-top: 1px;
566
+ text-transform: uppercase;
567
+ letter-spacing: 0.05em;
568
+ }
569
+ .t-user {
570
+ background: rgba(99, 102, 241, 0.15);
571
+ color: #818cf8;
572
+ }
573
+ .t-agent {
574
+ background: rgba(16, 185, 129, 0.15);
575
+ color: #34d399;
576
+ }
577
+ .t-msg {
578
+ color: var(--text-secondary);
579
+ }
580
+ .terminal-response .t-msg {
581
+ color: var(--text);
582
+ }
583
+ .t-tool {
584
+ display: inline-block;
585
+ font-size: 11px;
586
+ color: var(--amber);
587
+ background: rgba(245, 158, 11, 0.1);
588
+ padding: 1px 6px;
589
+ border-radius: 3px;
590
+ margin-right: 4px;
591
+ }
592
+ .terminal-cursor {
593
+ color: var(--violet);
594
+ animation: blink 1s step-end infinite;
595
+ margin-left: 60px;
596
+ }
597
+ @keyframes blink {
598
+ 0%, 100% { opacity: 1; }
599
+ 50% { opacity: 0; }
600
+ }
601
+
602
+ /* ========== TECH STACK (Marquee) ========== */
603
+ .stack {
604
+ padding: 48px 0;
605
+ border-top: 1px solid var(--border);
606
+ border-bottom: 1px solid var(--border);
607
+ overflow: hidden;
608
+ position: relative;
609
+ }
610
+ .stack-label {
611
+ font-size: 13px;
612
+ font-weight: 600;
613
+ color: var(--text-muted);
614
+ text-transform: uppercase;
615
+ letter-spacing: 0.1em;
616
+ text-align: center;
617
+ margin-bottom: 24px;
618
+ }
619
+ .stack-track {
620
+ display: flex;
621
+ animation: marquee 30s linear infinite;
622
+ width: max-content;
623
+ }
624
+ .stack-track:hover {
625
+ animation-play-state: paused;
626
+ }
627
+ @keyframes marquee {
628
+ 0% { transform: translateX(0); }
629
+ 100% { transform: translateX(-50%); }
630
+ }
631
+ .stack-items {
632
+ display: flex;
633
+ gap: 48px;
634
+ padding: 0 24px;
635
+ flex-shrink: 0;
636
+ }
637
+ .stack-item {
638
+ display: flex;
639
+ align-items: center;
640
+ gap: 8px;
641
+ color: var(--text-secondary);
642
+ font-size: 14px;
643
+ font-weight: 500;
644
+ white-space: nowrap;
645
+ }
646
+ .stack-fade {
647
+ position: absolute;
648
+ top: 0;
649
+ bottom: 0;
650
+ width: 120px;
651
+ z-index: 2;
652
+ pointer-events: none;
653
+ }
654
+ .stack-fade-left {
655
+ left: 0;
656
+ background: linear-gradient(to right, var(--bg), transparent);
657
+ }
658
+ .stack-fade-right {
659
+ right: 0;
660
+ background: linear-gradient(to left, var(--bg), transparent);
661
+ }
662
+
663
+ /* ========== SECTION HEADERS ========== */
664
+ .section-header {
665
+ text-align: center;
666
+ margin-bottom: 64px;
667
+ }
668
+ .section-badge {
669
+ display: inline-block;
670
+ padding: 6px 14px;
671
+ background: rgba(124, 58, 237, 0.08);
672
+ border: 1px solid rgba(124, 58, 237, 0.15);
673
+ border-radius: 100px;
674
+ font-size: 12px;
675
+ font-weight: 600;
676
+ color: #c4b5fd;
677
+ text-transform: uppercase;
678
+ letter-spacing: 0.1em;
679
+ margin-bottom: 20px;
680
+ }
681
+ .section-title {
682
+ font-size: clamp(2rem, 4.5vw, 3.2rem);
683
+ font-weight: 800;
684
+ line-height: 1.15;
685
+ letter-spacing: -0.03em;
686
+ margin-bottom: 16px;
687
+ }
688
+ .section-subtitle {
689
+ max-width: 560px;
690
+ margin: 0 auto;
691
+ font-size: 16px;
692
+ color: var(--text-secondary);
693
+ line-height: 1.7;
694
+ }
695
+
696
+ /* ========== FEATURES BENTO ========== */
697
+ .features {
698
+ padding: 120px 0;
699
+ }
700
+ .bento {
701
+ display: grid;
702
+ grid-template-columns: repeat(3, 1fr);
703
+ gap: 16px;
704
+ }
705
+ .bento-card {
706
+ background: var(--bg-card);
707
+ border: 1px solid var(--border);
708
+ border-radius: var(--radius-lg);
709
+ padding: 32px;
710
+ transition: all 0.35s var(--ease);
711
+ position: relative;
712
+ overflow: hidden;
713
+ }
714
+ .bento-card::before {
715
+ content: '';
716
+ position: absolute;
717
+ inset: 0;
718
+ background: radial-gradient(600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(124, 58, 237, 0.06), transparent 40%);
719
+ opacity: 0;
720
+ transition: opacity 0.4s;
721
+ }
722
+ .bento-card:hover::before { opacity: 1; }
723
+ .bento-card:hover {
724
+ border-color: var(--border-light);
725
+ transform: translateY(-2px);
726
+ box-shadow: 0 8px 32px rgba(0,0,0,0.3);
727
+ }
728
+ .bento-lg {
729
+ grid-column: span 2;
730
+ }
731
+ .bento-icon {
732
+ width: 52px;
733
+ height: 52px;
734
+ display: flex;
735
+ align-items: center;
736
+ justify-content: center;
737
+ background: rgba(124, 58, 237, 0.1);
738
+ border-radius: 14px;
739
+ color: #a78bfa;
740
+ margin-bottom: 20px;
741
+ }
742
+ .bento-card h3 {
743
+ font-size: 20px;
744
+ font-weight: 700;
745
+ letter-spacing: -0.02em;
746
+ margin-bottom: 10px;
747
+ }
748
+ .bento-card p {
749
+ color: var(--text-secondary);
750
+ font-size: 14px;
751
+ line-height: 1.7;
752
+ }
753
+
754
+ /* Memory card visual */
755
+ .bento-visual {
756
+ margin-top: 24px;
757
+ height: 120px;
758
+ position: relative;
759
+ }
760
+ .memory-dots {
761
+ position: relative;
762
+ width: 100%;
763
+ height: 100%;
764
+ }
765
+ .m-dot {
766
+ position: absolute;
767
+ width: 10px;
768
+ height: 10px;
769
+ background: var(--violet);
770
+ border-radius: 50%;
771
+ left: var(--x);
772
+ top: var(--y);
773
+ animation: dot-pulse 3s ease-in-out var(--delay) infinite;
774
+ box-shadow: 0 0 12px rgba(124, 58, 237, 0.4);
775
+ }
776
+ @keyframes dot-pulse {
777
+ 0%, 100% { transform: scale(1); opacity: 0.7; }
778
+ 50% { transform: scale(1.5); opacity: 1; }
779
+ }
780
+ .m-line {
781
+ position: absolute;
782
+ left: var(--x1);
783
+ top: var(--y1);
784
+ width: 1px;
785
+ height: 1px;
786
+ background: linear-gradient(to bottom right, rgba(124, 58, 237, 0.3), transparent);
787
+ transform-origin: top left;
788
+ }
789
+
790
+ /* Model tags */
791
+ .bento-models {
792
+ display: flex;
793
+ flex-wrap: wrap;
794
+ gap: 8px;
795
+ margin-top: 20px;
796
+ }
797
+ .model-tag {
798
+ padding: 6px 14px;
799
+ background: rgba(255,255,255,0.04);
800
+ border: 1px solid var(--border);
801
+ border-radius: 8px;
802
+ font-size: 12px;
803
+ font-weight: 600;
804
+ color: var(--text-secondary);
805
+ font-family: var(--mono);
806
+ }
807
+
808
+ /* ========== INTEGRATIONS ========== */
809
+ .integrations {
810
+ padding: 120px 0;
811
+ position: relative;
812
+ }
813
+ .integrations::before {
814
+ content: '';
815
+ position: absolute;
816
+ top: 0;
817
+ left: 0;
818
+ right: 0;
819
+ height: 1px;
820
+ background: linear-gradient(90deg, transparent, var(--border-light), transparent);
821
+ }
822
+ .integrations-grid {
823
+ display: grid;
824
+ grid-template-columns: repeat(3, 1fr);
825
+ gap: 16px;
826
+ }
827
+ .integration-card {
828
+ background: var(--bg-card);
829
+ border: 1px solid var(--border);
830
+ border-radius: var(--radius-lg);
831
+ padding: 32px;
832
+ transition: all 0.3s var(--ease);
833
+ text-align: center;
834
+ }
835
+ .integration-card:hover {
836
+ border-color: var(--border-light);
837
+ transform: translateY(-3px);
838
+ box-shadow: 0 12px 40px rgba(0,0,0,0.3);
839
+ }
840
+ .integration-icon {
841
+ width: 64px;
842
+ height: 64px;
843
+ display: flex;
844
+ align-items: center;
845
+ justify-content: center;
846
+ background: rgba(255,255,255,0.04);
847
+ border-radius: 16px;
848
+ margin: 0 auto 20px;
849
+ color: var(--text-secondary);
850
+ transition: all 0.3s;
851
+ }
852
+ .integration-card:hover .integration-icon {
853
+ color: #fff;
854
+ background: rgba(124, 58, 237, 0.12);
855
+ }
856
+ .integration-card h4 {
857
+ font-size: 17px;
858
+ font-weight: 700;
859
+ margin-bottom: 8px;
860
+ letter-spacing: -0.01em;
861
+ }
862
+ .integration-card p {
863
+ font-size: 13px;
864
+ color: var(--text-muted);
865
+ line-height: 1.6;
866
+ }
867
+
868
+ /* ========== CHANNELS ========== */
869
+ .channels {
870
+ padding: 120px 0;
871
+ }
872
+ .channels-grid {
873
+ display: flex;
874
+ justify-content: center;
875
+ gap: 20px;
876
+ flex-wrap: wrap;
877
+ }
878
+ .channel-card {
879
+ display: flex;
880
+ flex-direction: column;
881
+ align-items: center;
882
+ gap: 12px;
883
+ padding: 28px 32px;
884
+ background: var(--bg-card);
885
+ border: 1px solid var(--border);
886
+ border-radius: var(--radius-lg);
887
+ transition: all 0.3s var(--ease);
888
+ min-width: 140px;
889
+ }
890
+ .channel-card:hover {
891
+ transform: translateY(-4px);
892
+ border-color: var(--border-light);
893
+ box-shadow: 0 12px 40px rgba(0,0,0,0.3);
894
+ }
895
+ .channel-icon {
896
+ width: 56px;
897
+ height: 56px;
898
+ display: flex;
899
+ align-items: center;
900
+ justify-content: center;
901
+ border-radius: 14px;
902
+ transition: all 0.3s;
903
+ }
904
+ .channel-telegram { background: rgba(0, 136, 204, 0.1); color: #0088cc; }
905
+ .channel-card:hover .channel-telegram { background: rgba(0, 136, 204, 0.2); }
906
+ .channel-discord { background: rgba(88, 101, 242, 0.1); color: #5865f2; }
907
+ .channel-card:hover .channel-discord { background: rgba(88, 101, 242, 0.2); }
908
+ .channel-slack { background: rgba(74, 21, 75, 0.15); color: #e01e5a; }
909
+ .channel-card:hover .channel-slack { background: rgba(74, 21, 75, 0.3); }
910
+ .channel-whatsapp { background: rgba(37, 211, 102, 0.1); color: #25d366; }
911
+ .channel-card:hover .channel-whatsapp { background: rgba(37, 211, 102, 0.2); }
912
+ .channel-signal { background: rgba(59, 134, 247, 0.1); color: #3b86f7; }
913
+ .channel-card:hover .channel-signal { background: rgba(59, 134, 247, 0.2); }
914
+ .channel-web { background: rgba(124, 58, 237, 0.1); color: #a78bfa; }
915
+ .channel-card:hover .channel-web { background: rgba(124, 58, 237, 0.2); }
916
+ .channel-card span {
917
+ font-size: 14px;
918
+ font-weight: 600;
919
+ color: var(--text-secondary);
920
+ }
921
+ .channel-card:hover span { color: #fff; }
922
+ .channels-note {
923
+ text-align: center;
924
+ margin-top: 40px;
925
+ font-size: 15px;
926
+ color: var(--text-muted);
927
+ font-style: italic;
928
+ }
929
+
930
+ /* ========== GETTING STARTED ========== */
931
+ .getting-started {
932
+ padding: 120px 0;
933
+ position: relative;
934
+ }
935
+ .getting-started::before {
936
+ content: '';
937
+ position: absolute;
938
+ top: 0;
939
+ left: 0;
940
+ right: 0;
941
+ height: 1px;
942
+ background: linear-gradient(90deg, transparent, var(--border-light), transparent);
943
+ }
944
+
945
+ /* Quick Start terminal card */
946
+ .qs-terminal {
947
+ max-width: 680px;
948
+ margin: 0 auto;
949
+ background: #0c0c10;
950
+ border: 1px solid var(--border);
951
+ border-radius: var(--radius-lg);
952
+ overflow: hidden;
953
+ box-shadow: var(--shadow-glow), 0 24px 64px rgba(0,0,0,0.4);
954
+ }
955
+ .qs-chrome {
956
+ display: flex;
957
+ align-items: center;
958
+ gap: 16px;
959
+ padding: 14px 20px;
960
+ background: rgba(255,255,255,0.02);
961
+ border-bottom: 1px solid var(--border);
962
+ }
963
+ .qs-tabs {
964
+ display: flex;
965
+ gap: 4px;
966
+ margin-left: 8px;
967
+ }
968
+ .qs-tab {
969
+ background: none;
970
+ border: 1px solid transparent;
971
+ border-radius: 8px;
972
+ padding: 5px 14px;
973
+ font-family: var(--font);
974
+ font-size: 13px;
975
+ font-weight: 500;
976
+ color: var(--text-muted);
977
+ cursor: pointer;
978
+ transition: all 0.2s var(--ease);
979
+ }
980
+ .qs-tab:hover {
981
+ color: var(--text-secondary);
982
+ }
983
+ .qs-tab.active {
984
+ background: rgba(124, 58, 237, 0.15);
985
+ border-color: rgba(124, 58, 237, 0.3);
986
+ color: #c4b5fd;
987
+ }
988
+ .qs-chrome-spacer { flex: 1; }
989
+ .qs-body {
990
+ padding: 28px 28px 32px;
991
+ font-family: var(--mono);
992
+ font-size: 14px;
993
+ line-height: 2.2;
994
+ }
995
+ .qs-pane {
996
+ display: none;
997
+ }
998
+ .qs-pane.active {
999
+ display: block;
1000
+ }
1001
+ .qs-line {
1002
+ display: flex;
1003
+ align-items: center;
1004
+ min-height: 28px;
1005
+ }
1006
+ .qs-line.qs-spacer {
1007
+ height: 12px;
1008
+ }
1009
+ .qs-comment {
1010
+ color: var(--text-muted);
1011
+ font-style: italic;
1012
+ }
1013
+ .qs-prompt {
1014
+ color: var(--emerald);
1015
+ margin-right: 10px;
1016
+ font-weight: 600;
1017
+ user-select: none;
1018
+ }
1019
+ .qs-text {
1020
+ color: var(--text);
1021
+ font-weight: 500;
1022
+ flex: 1;
1023
+ }
1024
+ .qs-cmd {
1025
+ position: relative;
1026
+ }
1027
+ .qs-cmd .copy-btn {
1028
+ position: absolute;
1029
+ right: 0;
1030
+ top: 50%;
1031
+ transform: translateY(-50%);
1032
+ opacity: 0;
1033
+ transition: opacity 0.2s, color 0.2s;
1034
+ }
1035
+ .qs-terminal:hover .qs-cmd .copy-btn,
1036
+ .qs-cmd:hover .copy-btn {
1037
+ opacity: 1;
1038
+ }
1039
+ .copy-btn {
1040
+ background: rgba(255,255,255,0.06);
1041
+ border: 1px solid var(--border);
1042
+ border-radius: 6px;
1043
+ color: var(--text-muted);
1044
+ cursor: pointer;
1045
+ padding: 6px;
1046
+ transition: all 0.2s;
1047
+ display: flex;
1048
+ }
1049
+ .copy-btn:hover { color: #fff; background: rgba(255,255,255,0.1); }
1050
+ .copy-btn.copied { color: var(--emerald); border-color: rgba(16, 185, 129, 0.3); }
1051
+ .qs-note {
1052
+ text-align: center;
1053
+ margin-top: 24px;
1054
+ font-size: 14px;
1055
+ color: var(--text-muted);
1056
+ }
1057
+
1058
+ /* ========== OPEN SOURCE ========== */
1059
+ .oss {
1060
+ padding: 120px 0;
1061
+ }
1062
+ .oss-card {
1063
+ background: var(--bg-card);
1064
+ border: 1px solid var(--border);
1065
+ border-radius: var(--radius-xl);
1066
+ padding: 64px;
1067
+ text-align: center;
1068
+ position: relative;
1069
+ overflow: hidden;
1070
+ }
1071
+ .oss-card::before {
1072
+ content: '';
1073
+ position: absolute;
1074
+ top: -50%;
1075
+ left: -50%;
1076
+ width: 200%;
1077
+ height: 200%;
1078
+ background: radial-gradient(circle at 50% 100%, rgba(124, 58, 237, 0.06), transparent 50%);
1079
+ pointer-events: none;
1080
+ }
1081
+ .oss-badge {
1082
+ display: inline-flex;
1083
+ align-items: center;
1084
+ gap: 8px;
1085
+ padding: 8px 16px;
1086
+ background: rgba(16, 185, 129, 0.1);
1087
+ border: 1px solid rgba(16, 185, 129, 0.2);
1088
+ border-radius: 100px;
1089
+ font-size: 13px;
1090
+ font-weight: 600;
1091
+ color: #34d399;
1092
+ margin-bottom: 28px;
1093
+ }
1094
+ .oss-card h2 {
1095
+ font-size: clamp(1.8rem, 3.5vw, 2.8rem);
1096
+ font-weight: 800;
1097
+ line-height: 1.15;
1098
+ letter-spacing: -0.03em;
1099
+ margin-bottom: 16px;
1100
+ }
1101
+ .oss-card > p {
1102
+ max-width: 480px;
1103
+ margin: 0 auto 32px;
1104
+ font-size: 16px;
1105
+ color: var(--text-secondary);
1106
+ line-height: 1.7;
1107
+ position: relative;
1108
+ }
1109
+ .oss-actions {
1110
+ display: flex;
1111
+ gap: 16px;
1112
+ justify-content: center;
1113
+ flex-wrap: wrap;
1114
+ position: relative;
1115
+ }
1116
+
1117
+ /* ========== FINAL CTA ========== */
1118
+ .final-cta {
1119
+ position: relative;
1120
+ padding: 140px 0;
1121
+ overflow: hidden;
1122
+ }
1123
+ .final-cta-glow {
1124
+ position: absolute;
1125
+ inset: 0;
1126
+ pointer-events: none;
1127
+ }
1128
+ .orb-cta-1 {
1129
+ position: absolute;
1130
+ width: 500px;
1131
+ height: 500px;
1132
+ background: var(--violet);
1133
+ border-radius: 50%;
1134
+ filter: blur(120px);
1135
+ opacity: 0.2;
1136
+ top: 50%;
1137
+ left: 20%;
1138
+ transform: translate(-50%, -50%);
1139
+ animation: orb-float-1 18s ease-in-out infinite;
1140
+ }
1141
+ .orb-cta-2 {
1142
+ position: absolute;
1143
+ width: 400px;
1144
+ height: 400px;
1145
+ background: var(--fuchsia);
1146
+ border-radius: 50%;
1147
+ filter: blur(100px);
1148
+ opacity: 0.15;
1149
+ top: 40%;
1150
+ right: 10%;
1151
+ animation: orb-float-2 22s ease-in-out infinite;
1152
+ }
1153
+ .cta-content {
1154
+ text-align: center;
1155
+ position: relative;
1156
+ z-index: 2;
1157
+ }
1158
+ .cta-content h2 {
1159
+ font-size: clamp(2rem, 4.5vw, 3.5rem);
1160
+ font-weight: 800;
1161
+ line-height: 1.15;
1162
+ letter-spacing: -0.03em;
1163
+ margin-bottom: 16px;
1164
+ }
1165
+ .cta-content > p {
1166
+ font-size: 18px;
1167
+ color: var(--text-secondary);
1168
+ margin-bottom: 40px;
1169
+ }
1170
+ .cta-actions {
1171
+ margin-bottom: 28px;
1172
+ }
1173
+ .cta-subtext {
1174
+ display: flex;
1175
+ align-items: center;
1176
+ justify-content: center;
1177
+ gap: 16px;
1178
+ font-size: 14px;
1179
+ color: var(--text-muted);
1180
+ flex-wrap: wrap;
1181
+ }
1182
+ .cta-subtext svg {
1183
+ color: var(--emerald);
1184
+ }
1185
+
1186
+ /* ========== FOOTER ========== */
1187
+ .footer {
1188
+ padding: 64px 0 32px;
1189
+ position: relative;
1190
+ }
1191
+ .footer::before {
1192
+ content: '';
1193
+ position: absolute;
1194
+ top: 0;
1195
+ left: 0;
1196
+ right: 0;
1197
+ height: 1px;
1198
+ background: linear-gradient(90deg, transparent, var(--violet), var(--fuchsia), var(--indigo), transparent);
1199
+ }
1200
+ .footer-inner {
1201
+ display: flex;
1202
+ justify-content: space-between;
1203
+ gap: 64px;
1204
+ margin-bottom: 48px;
1205
+ }
1206
+ .footer-brand {
1207
+ max-width: 280px;
1208
+ }
1209
+ .footer-brand p {
1210
+ margin-top: 12px;
1211
+ font-size: 14px;
1212
+ color: var(--text-muted);
1213
+ }
1214
+ .footer-links {
1215
+ display: flex;
1216
+ gap: 64px;
1217
+ }
1218
+ .footer-col {
1219
+ display: flex;
1220
+ flex-direction: column;
1221
+ gap: 10px;
1222
+ }
1223
+ .footer-col h5 {
1224
+ font-size: 13px;
1225
+ font-weight: 700;
1226
+ color: var(--text);
1227
+ text-transform: uppercase;
1228
+ letter-spacing: 0.08em;
1229
+ margin-bottom: 4px;
1230
+ }
1231
+ .footer-col a {
1232
+ font-size: 14px;
1233
+ color: var(--text-muted);
1234
+ transition: color 0.2s;
1235
+ }
1236
+ .footer-col a:hover { color: var(--text); }
1237
+ .footer-bottom {
1238
+ border-top: 1px solid var(--border);
1239
+ padding-top: 24px;
1240
+ }
1241
+ .footer-bottom p {
1242
+ font-size: 13px;
1243
+ color: var(--text-muted);
1244
+ text-align: center;
1245
+ }
1246
+
1247
+ /* ========== RESPONSIVE ========== */
1248
+ @media (max-width: 1024px) {
1249
+ .bento {
1250
+ grid-template-columns: repeat(2, 1fr);
1251
+ }
1252
+ .bento-lg { grid-column: span 2; }
1253
+ .integrations-grid {
1254
+ grid-template-columns: repeat(2, 1fr);
1255
+ }
1256
+ }
1257
+
1258
+ @media (max-width: 768px) {
1259
+ .nav-links { display: none; }
1260
+ .nav-toggle { display: flex; }
1261
+ .nav-links.open {
1262
+ display: flex;
1263
+ flex-direction: column;
1264
+ position: absolute;
1265
+ top: var(--nav-h);
1266
+ left: 0;
1267
+ right: 0;
1268
+ background: rgba(6, 6, 8, 0.95);
1269
+ backdrop-filter: blur(16px);
1270
+ -webkit-backdrop-filter: blur(16px);
1271
+ padding: 24px;
1272
+ gap: 20px;
1273
+ border-bottom: 1px solid var(--border);
1274
+ }
1275
+
1276
+ .hero { padding: 100px 0 60px; min-height: auto; }
1277
+ .hero-title { font-size: clamp(2.2rem, 8vw, 3.5rem); }
1278
+
1279
+ .hero-stats {
1280
+ flex-wrap: wrap;
1281
+ gap: 8px;
1282
+ }
1283
+ .hero-stat { padding: 12px 20px; }
1284
+ .hero-stat-divider { display: none; }
1285
+
1286
+ .bento {
1287
+ grid-template-columns: 1fr;
1288
+ }
1289
+ .bento-lg { grid-column: span 1; }
1290
+
1291
+ .integrations-grid {
1292
+ grid-template-columns: 1fr;
1293
+ }
1294
+
1295
+ .channels-grid {
1296
+ gap: 12px;
1297
+ }
1298
+ .channel-card {
1299
+ min-width: 100px;
1300
+ padding: 20px 24px;
1301
+ }
1302
+
1303
+ .footer-inner {
1304
+ flex-direction: column;
1305
+ gap: 40px;
1306
+ }
1307
+ .footer-links {
1308
+ flex-wrap: wrap;
1309
+ gap: 40px;
1310
+ }
1311
+
1312
+ .oss-card { padding: 40px 24px; }
1313
+
1314
+ .hero-terminal { margin-top: 40px; }
1315
+ .terminal-body { padding: 16px; font-size: 12px; }
1316
+
1317
+ .qs-body { padding: 20px; font-size: 13px; }
1318
+ .qs-cmd .copy-btn { opacity: 1; }
1319
+ }
1320
+
1321
+ @media (max-width: 480px) {
1322
+ .container { padding: 0 16px; }
1323
+ .hero-actions { flex-direction: column; align-items: center; }
1324
+ .hero-stats { flex-direction: column; gap: 0; }
1325
+ .hero-stat { flex-direction: row; gap: 8px; padding: 8px 0; }
1326
+ .channels-grid { flex-direction: column; align-items: center; }
1327
+ .channel-card { width: 100%; flex-direction: row; justify-content: flex-start; gap: 16px; }
1328
+ .qs-body { padding: 16px; font-size: 12px; line-height: 2; }
1329
+ .qs-chrome { padding: 12px 14px; gap: 10px; }
1330
+ .qs-tab { padding: 4px 10px; font-size: 12px; }
1331
+ }
1332
+
1333
+ /* ========== SKILLS PAGE ========== */
1334
+ .skills-hero {
1335
+ padding: 140px 0 48px;
1336
+ text-align: center;
1337
+ }
1338
+
1339
+ .skills-search-wrap {
1340
+ max-width: 520px;
1341
+ margin: 32px auto 0;
1342
+ }
1343
+
1344
+ .skills-search {
1345
+ width: 100%;
1346
+ padding: 14px 20px;
1347
+ background: var(--bg-card);
1348
+ border: 1px solid var(--border);
1349
+ border-radius: 12px;
1350
+ color: var(--text);
1351
+ font-family: var(--font);
1352
+ font-size: 15px;
1353
+ outline: none;
1354
+ transition: border-color 0.2s;
1355
+ }
1356
+ .skills-search:focus {
1357
+ border-color: var(--violet);
1358
+ box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.1);
1359
+ }
1360
+ .skills-search::placeholder { color: var(--text-muted); }
1361
+
1362
+ .skills-filter {
1363
+ padding: 0 0 40px;
1364
+ }
1365
+
1366
+ .skills-tags {
1367
+ display: flex;
1368
+ gap: 8px;
1369
+ flex-wrap: wrap;
1370
+ justify-content: center;
1371
+ }
1372
+
1373
+ .skill-tag-btn {
1374
+ padding: 6px 14px;
1375
+ background: rgba(255, 255, 255, 0.04);
1376
+ border: 1px solid var(--border);
1377
+ border-radius: 100px;
1378
+ font-family: var(--mono);
1379
+ font-size: 12px;
1380
+ font-weight: 500;
1381
+ color: var(--text-secondary);
1382
+ cursor: pointer;
1383
+ transition: all 0.2s;
1384
+ }
1385
+ .skill-tag-btn:hover {
1386
+ color: #fff;
1387
+ border-color: var(--border-light);
1388
+ background: rgba(255, 255, 255, 0.08);
1389
+ }
1390
+ .skill-tag-btn.active {
1391
+ background: rgba(124, 58, 237, 0.15);
1392
+ border-color: rgba(124, 58, 237, 0.3);
1393
+ color: #c4b5fd;
1394
+ }
1395
+
1396
+ .skills-listing {
1397
+ padding: 0 0 80px;
1398
+ }
1399
+
1400
+ .skills-state {
1401
+ text-align: center;
1402
+ padding: 40px 20px;
1403
+ font-size: 15px;
1404
+ color: var(--text-muted);
1405
+ }
1406
+
1407
+ .skills-grid {
1408
+ display: grid;
1409
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
1410
+ gap: 16px;
1411
+ }
1412
+
1413
+ .skill-card {
1414
+ background: var(--bg-card);
1415
+ border: 1px solid var(--border);
1416
+ border-radius: var(--radius-lg);
1417
+ padding: 24px;
1418
+ transition: all 0.3s var(--ease);
1419
+ display: flex;
1420
+ flex-direction: column;
1421
+ gap: 12px;
1422
+ }
1423
+ .skill-card:hover {
1424
+ border-color: rgba(124, 58, 237, 0.3);
1425
+ transform: translateY(-3px);
1426
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), 0 0 24px rgba(124, 58, 237, 0.06);
1427
+ }
1428
+
1429
+ .skill-card-header {
1430
+ display: flex;
1431
+ align-items: baseline;
1432
+ justify-content: space-between;
1433
+ gap: 12px;
1434
+ }
1435
+ .skill-card-name {
1436
+ font-family: var(--display);
1437
+ font-size: 17px;
1438
+ font-weight: 700;
1439
+ color: #fff;
1440
+ letter-spacing: -0.01em;
1441
+ }
1442
+ .skill-card-meta {
1443
+ display: flex;
1444
+ gap: 10px;
1445
+ font-size: 12px;
1446
+ color: var(--text-muted);
1447
+ flex-shrink: 0;
1448
+ }
1449
+
1450
+ .skill-card-desc {
1451
+ font-size: 14px;
1452
+ line-height: 1.6;
1453
+ color: var(--text-secondary);
1454
+ }
1455
+
1456
+ .skill-card-tags {
1457
+ display: flex;
1458
+ flex-wrap: wrap;
1459
+ gap: 6px;
1460
+ }
1461
+ .skill-card-tag {
1462
+ padding: 3px 10px;
1463
+ background: rgba(255, 255, 255, 0.04);
1464
+ border: 1px solid var(--border);
1465
+ border-radius: 6px;
1466
+ font-family: var(--mono);
1467
+ font-size: 11px;
1468
+ color: var(--text-muted);
1469
+ }
1470
+
1471
+ .skill-card-secrets {
1472
+ font-size: 12px;
1473
+ color: var(--text-muted);
1474
+ }
1475
+ .skill-card-secrets code {
1476
+ font-family: var(--mono);
1477
+ font-size: 11px;
1478
+ background: rgba(245, 158, 11, 0.1);
1479
+ color: #fbbf24;
1480
+ padding: 1px 6px;
1481
+ border-radius: 4px;
1482
+ }
1483
+
1484
+ .skill-card-install {
1485
+ display: flex;
1486
+ align-items: center;
1487
+ gap: 8px;
1488
+ margin-top: auto;
1489
+ padding-top: 12px;
1490
+ border-top: 1px solid var(--border);
1491
+ }
1492
+ .skill-card-install code {
1493
+ flex: 1;
1494
+ font-family: var(--mono);
1495
+ font-size: 12px;
1496
+ color: var(--text-secondary);
1497
+ background: rgba(255, 255, 255, 0.03);
1498
+ padding: 6px 10px;
1499
+ border-radius: 6px;
1500
+ overflow: hidden;
1501
+ text-overflow: ellipsis;
1502
+ white-space: nowrap;
1503
+ }
1504
+ .skill-copy-btn {
1505
+ flex-shrink: 0;
1506
+ background: rgba(255, 255, 255, 0.06);
1507
+ border: 1px solid var(--border);
1508
+ border-radius: 6px;
1509
+ color: var(--text-muted);
1510
+ cursor: pointer;
1511
+ padding: 6px;
1512
+ display: flex;
1513
+ transition: all 0.2s;
1514
+ }
1515
+ .skill-copy-btn:hover { color: #fff; background: rgba(255, 255, 255, 0.1); }
1516
+
1517
+ /* Skill Guide Steps */
1518
+ .skill-guide {
1519
+ padding: 100px 0;
1520
+ position: relative;
1521
+ }
1522
+ .skill-guide::before {
1523
+ content: '';
1524
+ position: absolute;
1525
+ top: 0;
1526
+ left: 0;
1527
+ right: 0;
1528
+ height: 1px;
1529
+ background: linear-gradient(90deg, transparent, var(--border-light), transparent);
1530
+ }
1531
+
1532
+ .skill-guide-steps {
1533
+ display: grid;
1534
+ grid-template-columns: repeat(4, 1fr);
1535
+ gap: 16px;
1536
+ margin-bottom: 48px;
1537
+ }
1538
+ .skill-guide-step {
1539
+ background: var(--bg-card);
1540
+ border: 1px solid var(--border);
1541
+ border-radius: var(--radius-lg);
1542
+ padding: 28px 24px;
1543
+ text-align: center;
1544
+ transition: all 0.3s var(--ease);
1545
+ }
1546
+ .skill-guide-step:hover {
1547
+ border-color: rgba(124, 58, 237, 0.25);
1548
+ transform: translateY(-2px);
1549
+ }
1550
+ .step-number {
1551
+ display: inline-flex;
1552
+ align-items: center;
1553
+ justify-content: center;
1554
+ width: 36px;
1555
+ height: 36px;
1556
+ background: var(--gradient);
1557
+ border-radius: 50%;
1558
+ font-family: var(--display);
1559
+ font-size: 15px;
1560
+ font-weight: 700;
1561
+ color: #fff;
1562
+ margin-bottom: 16px;
1563
+ }
1564
+ .skill-guide-step h3 {
1565
+ font-family: var(--display);
1566
+ font-size: 17px;
1567
+ font-weight: 700;
1568
+ letter-spacing: -0.01em;
1569
+ margin-bottom: 8px;
1570
+ }
1571
+ .skill-guide-step p {
1572
+ font-size: 13px;
1573
+ color: var(--text-secondary);
1574
+ line-height: 1.6;
1575
+ }
1576
+ .skill-guide-step code {
1577
+ font-family: var(--mono);
1578
+ font-size: 12px;
1579
+ background: rgba(255, 255, 255, 0.06);
1580
+ padding: 1px 5px;
1581
+ border-radius: 4px;
1582
+ color: #c4b5fd;
1583
+ }
1584
+
1585
+ .skill-format-block {
1586
+ max-width: 600px;
1587
+ margin: 0 auto;
1588
+ }
1589
+
1590
+ /* AI Prompt Section */
1591
+ .ai-prompt-section {
1592
+ padding: 100px 0;
1593
+ position: relative;
1594
+ }
1595
+ .ai-prompt-section::before {
1596
+ content: '';
1597
+ position: absolute;
1598
+ top: 0;
1599
+ left: 0;
1600
+ right: 0;
1601
+ height: 1px;
1602
+ background: linear-gradient(90deg, transparent, var(--border-light), transparent);
1603
+ }
1604
+
1605
+ .ai-prompt-block {
1606
+ max-width: 720px;
1607
+ margin: 0 auto;
1608
+ background: #0c0c10;
1609
+ border: 1px solid var(--border);
1610
+ border-radius: var(--radius-lg);
1611
+ overflow: hidden;
1612
+ box-shadow: var(--shadow-glow), 0 16px 48px rgba(0, 0, 0, 0.4);
1613
+ }
1614
+
1615
+ .ai-prompt-header {
1616
+ display: flex;
1617
+ align-items: center;
1618
+ justify-content: space-between;
1619
+ padding: 14px 20px;
1620
+ background: rgba(255, 255, 255, 0.02);
1621
+ border-bottom: 1px solid var(--border);
1622
+ }
1623
+
1624
+ .ai-prompt-label {
1625
+ font-family: var(--mono);
1626
+ font-size: 12px;
1627
+ font-weight: 600;
1628
+ color: var(--text-muted);
1629
+ text-transform: uppercase;
1630
+ letter-spacing: 0.05em;
1631
+ }
1632
+
1633
+ .ai-prompt-copy-btn {
1634
+ display: inline-flex;
1635
+ align-items: center;
1636
+ gap: 6px;
1637
+ padding: 6px 14px;
1638
+ background: rgba(124, 58, 237, 0.12);
1639
+ border: 1px solid rgba(124, 58, 237, 0.25);
1640
+ border-radius: 8px;
1641
+ font-family: var(--font);
1642
+ font-size: 13px;
1643
+ font-weight: 600;
1644
+ color: #c4b5fd;
1645
+ cursor: pointer;
1646
+ transition: all 0.2s var(--ease);
1647
+ }
1648
+ .ai-prompt-copy-btn:hover {
1649
+ background: rgba(124, 58, 237, 0.2);
1650
+ border-color: rgba(124, 58, 237, 0.4);
1651
+ color: #fff;
1652
+ }
1653
+
1654
+ .ai-prompt-code {
1655
+ display: block;
1656
+ padding: 24px;
1657
+ margin: 0;
1658
+ font-family: var(--mono);
1659
+ font-size: 13px;
1660
+ line-height: 1.7;
1661
+ color: var(--text-secondary);
1662
+ white-space: pre-wrap;
1663
+ word-wrap: break-word;
1664
+ overflow-x: auto;
1665
+ background: transparent;
1666
+ border: none;
1667
+ }
1668
+
1669
+ @media (max-width: 768px) {
1670
+ .skills-grid {
1671
+ grid-template-columns: 1fr;
1672
+ }
1673
+ .skill-guide-steps {
1674
+ grid-template-columns: repeat(2, 1fr);
1675
+ }
1676
+ .ai-prompt-code {
1677
+ padding: 16px;
1678
+ font-size: 12px;
1679
+ }
1680
+ }
1681
+
1682
+ @media (max-width: 480px) {
1683
+ .skill-guide-steps {
1684
+ grid-template-columns: 1fr;
1685
+ }
1686
+ }