@rune-kit/rune 2.2.1 → 2.2.3

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 (94) hide show
  1. package/README.md +39 -13
  2. package/compiler/__tests__/adapters.test.js +109 -0
  3. package/compiler/__tests__/openclaw-adapter.test.js +149 -140
  4. package/compiler/__tests__/pack-split.test.js +145 -145
  5. package/compiler/__tests__/parser.test.js +3 -3
  6. package/compiler/__tests__/pipeline.test.js +110 -0
  7. package/compiler/__tests__/skill-validation.test.js +148 -0
  8. package/compiler/__tests__/transformer.test.js +70 -0
  9. package/compiler/__tests__/transforms.test.js +92 -0
  10. package/compiler/adapters/antigravity.js +5 -6
  11. package/compiler/adapters/claude.js +1 -1
  12. package/compiler/adapters/codex.js +69 -77
  13. package/compiler/adapters/cursor.js +5 -6
  14. package/compiler/adapters/generic.js +5 -6
  15. package/compiler/adapters/index.js +3 -3
  16. package/compiler/adapters/openclaw.js +146 -150
  17. package/compiler/adapters/opencode.js +78 -86
  18. package/compiler/adapters/windsurf.js +5 -6
  19. package/compiler/bin/rune.js +52 -21
  20. package/compiler/doctor.js +19 -7
  21. package/compiler/emitter.js +11 -18
  22. package/compiler/parser.js +5 -5
  23. package/compiler/transformer.js +3 -5
  24. package/compiler/transforms/branding.js +5 -4
  25. package/compiler/transforms/compliance.js +40 -40
  26. package/compiler/transforms/frontmatter.js +1 -1
  27. package/compiler/transforms/hooks.js +12 -14
  28. package/compiler/transforms/subagents.js +1 -3
  29. package/compiler/transforms/tool-names.js +1 -1
  30. package/docs/ANTIGRAVITY-GAP-ANALYSIS.md +369 -0
  31. package/docs/ARCHITECTURE.md +332 -0
  32. package/docs/COMMUNITY-PACKS.md +109 -0
  33. package/docs/CONTRIBUTING-L4.md +215 -0
  34. package/docs/CROSS-IDE-ANALYSIS.md +164 -0
  35. package/docs/EXTENSION-TEMPLATE.md +108 -0
  36. package/docs/MESH-RULES.md +34 -0
  37. package/docs/MULTI-PLATFORM.md +804 -0
  38. package/docs/SKILL-DEPTH-AUDIT.md +191 -0
  39. package/docs/SKILL-TEMPLATE.md +72 -0
  40. package/docs/TRADE-MATRIX.md +327 -0
  41. package/docs/VERSIONING.md +91 -0
  42. package/docs/VISION.md +263 -0
  43. package/docs/assets/demo-subtitles.srt +215 -0
  44. package/docs/assets/end-card.html +276 -0
  45. package/docs/assets/mesh-diagram.html +654 -0
  46. package/docs/assets/thumbnail.html +295 -0
  47. package/docs/guides/cli.md +403 -0
  48. package/docs/guides/index.html +1387 -0
  49. package/docs/index.html +739 -0
  50. package/docs/references/claudekit-analysis.md +414 -0
  51. package/docs/references/voltagent-analysis.md +189 -0
  52. package/docs/script.js +277 -0
  53. package/docs/skills/index.html +832 -0
  54. package/docs/style.css +600 -0
  55. package/docs/video-demo-plan.md +172 -0
  56. package/extensions/security/PACK.md +4 -3
  57. package/extensions/security/skills/defense-in-depth.md +103 -0
  58. package/extensions/ui/PACK.md +2 -0
  59. package/extensions/ui/skills/design-decision.md +10 -0
  60. package/extensions/ui/skills/palette-picker.md +11 -0
  61. package/hooks/.gitkeep +0 -0
  62. package/hooks/auto-format/index.cjs +48 -0
  63. package/hooks/context-watch/index.cjs +68 -0
  64. package/hooks/hooks.json +99 -0
  65. package/hooks/metrics-collector/index.cjs +42 -0
  66. package/hooks/post-session-reflect/index.cjs +153 -0
  67. package/hooks/pre-compact/index.cjs +95 -0
  68. package/hooks/pre-tool-guard/index.cjs +68 -0
  69. package/hooks/run-hook +17 -0
  70. package/hooks/run-hook.cjs +16 -0
  71. package/hooks/run-hook.cmd +1 -0
  72. package/hooks/secrets-scan/index.cjs +100 -0
  73. package/hooks/session-start/index.cjs +65 -0
  74. package/hooks/typecheck/index.cjs +65 -0
  75. package/package.json +16 -4
  76. package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -0
  77. package/references/ui-pro-max-data/charts.csv +26 -0
  78. package/references/ui-pro-max-data/colors.csv +162 -0
  79. package/references/ui-pro-max-data/styles.csv +85 -0
  80. package/references/ui-pro-max-data/typography.csv +74 -0
  81. package/references/ui-pro-max-data/ui-reasoning.csv +162 -0
  82. package/references/ui-pro-max-data/ux-guidelines.csv +100 -0
  83. package/skills/ba/SKILL.md +10 -0
  84. package/skills/completion-gate/SKILL.md +34 -1
  85. package/skills/context-engine/SKILL.md +13 -0
  86. package/skills/cook/SKILL.md +71 -0
  87. package/skills/debug/SKILL.md +71 -1
  88. package/skills/design/SKILL.md +11 -0
  89. package/skills/fix/SKILL.md +26 -1
  90. package/skills/plan/SKILL.md +23 -6
  91. package/skills/review/SKILL.md +2 -0
  92. package/skills/skill-forge/SKILL.md +94 -3
  93. package/skills/test/SKILL.md +44 -2
  94. package/skills/verification/SKILL.md +60 -2
package/docs/style.css ADDED
@@ -0,0 +1,600 @@
1
+ /* ─── RESET & BASE ─── */
2
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
3
+
4
+ :root {
5
+ --bg-base: #0a0f1a;
6
+ --bg-card: #111827;
7
+ --bg-elevated: #1a2332;
8
+ --bg-section-alt: #080c14;
9
+ --bg-code: rgba(0,0,0,0.4);
10
+ --text-primary: #f0f4f8;
11
+ --text-secondary: #8896a8;
12
+ --text-muted: #5a6a7a;
13
+ --border: #1e2d3d;
14
+ --accent: #10b981;
15
+ --accent-dim: rgba(16, 185, 129, 0.15);
16
+ --accent-glow: rgba(16, 185, 129, 0.3);
17
+ --cyan: #06b6d4;
18
+ --loss: #ef4444;
19
+ --profit: #10b981;
20
+ --nav-bg: rgba(10, 15, 26, 0.85);
21
+ --font-display: 'Space Grotesk', system-ui, sans-serif;
22
+ --font-body: 'Inter', system-ui, sans-serif;
23
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
24
+ --radius-sm: 6px;
25
+ --radius-md: 10px;
26
+ --radius-lg: 16px;
27
+ --shadow-card: 0 4px 24px rgba(0,0,0,0.3);
28
+ --transition: 250ms ease;
29
+ --max-width: 1120px;
30
+ }
31
+
32
+ /* ─── LIGHT MODE ─── */
33
+ [data-theme="light"] {
34
+ --bg-base: #f8fafb;
35
+ --bg-card: #ffffff;
36
+ --bg-elevated: #f1f5f9;
37
+ --bg-section-alt: #eef2f6;
38
+ --bg-code: rgba(0,0,0,0.04);
39
+ --text-primary: #0f172a;
40
+ --text-secondary: #475569;
41
+ --text-muted: #94a3b8;
42
+ --border: #e2e8f0;
43
+ --accent: #059669;
44
+ --accent-dim: rgba(5, 150, 105, 0.1);
45
+ --accent-glow: rgba(5, 150, 105, 0.2);
46
+ --loss: #dc2626;
47
+ --profit: #059669;
48
+ --nav-bg: rgba(248, 250, 251, 0.88);
49
+ --shadow-card: 0 4px 24px rgba(0,0,0,0.08);
50
+ }
51
+ [data-theme="light"] .hero-mesh { opacity: 0.15; }
52
+ [data-theme="light"] .compare-diagram { background: rgba(0,0,0,0.04); }
53
+ [data-theme="light"] .code-block { background: var(--bg-code); }
54
+ [data-theme="light"] .phase { background: rgba(0,0,0,0.02); }
55
+ [data-theme="light"] .layer-count { background: rgba(0,0,0,0.05); }
56
+ [data-theme="light"] .compare-table tbody tr:hover { background: rgba(0,0,0,0.02); }
57
+
58
+ html { scroll-behavior: smooth; }
59
+
60
+ body {
61
+ font-family: var(--font-body);
62
+ background: var(--bg-base);
63
+ color: var(--text-primary);
64
+ line-height: 1.6;
65
+ -webkit-font-smoothing: antialiased;
66
+ overflow-x: hidden;
67
+ }
68
+
69
+ a { color: var(--accent); text-decoration: none; transition: opacity var(--transition); }
70
+ a:hover { opacity: 0.85; }
71
+
72
+ .container { max-width: var(--max-width); margin: 0 auto; padding: 0 24px; }
73
+
74
+ /* ─── NAV ─── */
75
+ .nav {
76
+ position: fixed; top: 0; left: 0; right: 0; z-index: 100;
77
+ background: var(--nav-bg);
78
+ backdrop-filter: blur(12px);
79
+ border-bottom: 1px solid var(--border);
80
+ }
81
+ .nav-inner {
82
+ max-width: var(--max-width); margin: 0 auto;
83
+ display: flex; align-items: center; justify-content: space-between;
84
+ padding: 14px 24px;
85
+ }
86
+ .nav-logo {
87
+ font-family: var(--font-display); font-weight: 700; font-size: 20px;
88
+ color: var(--text-primary); display: flex; align-items: center; gap: 8px;
89
+ }
90
+ .logo-rune { color: var(--accent); font-size: 18px; }
91
+ .nav-links { display: flex; align-items: center; gap: 28px; }
92
+ .nav-links a { color: var(--text-secondary); font-size: 14px; font-weight: 500; }
93
+ .nav-links a:hover { color: var(--text-primary); opacity: 1; }
94
+
95
+ /* ─── BUTTONS ─── */
96
+ .btn {
97
+ display: inline-flex; align-items: center; justify-content: center;
98
+ padding: 10px 22px; border-radius: var(--radius-sm);
99
+ font-family: var(--font-body); font-weight: 600; font-size: 14px;
100
+ cursor: pointer; transition: all var(--transition); border: none;
101
+ }
102
+ .btn-sm { padding: 6px 14px; font-size: 13px; }
103
+ .btn-primary {
104
+ background: var(--accent); color: #fff;
105
+ box-shadow: 0 0 20px var(--accent-glow);
106
+ }
107
+ .btn-primary:hover { background: #0ea572; transform: translateY(-1px); opacity: 1; }
108
+ .btn-ghost {
109
+ background: transparent; color: var(--text-secondary);
110
+ border: 1px solid var(--border);
111
+ }
112
+ .btn-ghost:hover { border-color: var(--accent); color: var(--text-primary); opacity: 1; }
113
+
114
+ /* ─── HERO ─── */
115
+ .hero {
116
+ position: relative; min-height: 100vh;
117
+ display: flex; align-items: center; justify-content: center;
118
+ padding: 120px 24px 80px;
119
+ }
120
+ .hero-mesh {
121
+ position: absolute; inset: 0; overflow: hidden; opacity: 0.4;
122
+ }
123
+ #mesh-canvas { width: 100%; height: 100%; }
124
+ .hero-content {
125
+ position: relative; z-index: 2; text-align: center; max-width: 680px;
126
+ }
127
+ .hero-badge {
128
+ display: inline-block; font-family: var(--font-mono); font-size: 13px;
129
+ color: var(--accent); background: var(--accent-dim);
130
+ padding: 6px 16px; border-radius: 999px; margin-bottom: 28px;
131
+ border: 1px solid rgba(16, 185, 129, 0.2);
132
+ }
133
+ .hero h1 {
134
+ font-family: var(--font-display); font-size: clamp(40px, 7vw, 72px);
135
+ font-weight: 700; line-height: 1.1; margin-bottom: 20px;
136
+ }
137
+ .accent { color: var(--accent); }
138
+ .hero-sub {
139
+ font-size: 18px; color: var(--text-secondary); max-width: 520px;
140
+ margin: 0 auto 36px; line-height: 1.7;
141
+ }
142
+ .hero-actions { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }
143
+
144
+ /* ─── SECTIONS ─── */
145
+ .section { padding: 100px 0; }
146
+ .section-dark { background: var(--bg-section-alt); }
147
+ .section h2 {
148
+ font-family: var(--font-display); font-size: 36px; font-weight: 700;
149
+ text-align: center; margin-bottom: 12px;
150
+ }
151
+ .section-sub {
152
+ text-align: center; color: var(--text-secondary); font-size: 17px;
153
+ max-width: 560px; margin: 0 auto 48px;
154
+ }
155
+
156
+ /* ─── COMPARE (PROBLEM) ─── */
157
+ .compare-grid {
158
+ display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;
159
+ }
160
+ .compare-card {
161
+ background: var(--bg-card); border: 1px solid var(--border);
162
+ border-radius: var(--radius-lg); padding: 28px;
163
+ }
164
+ .compare-card h3 {
165
+ font-family: var(--font-display); font-size: 20px; margin-bottom: 16px;
166
+ }
167
+ .compare-diagram {
168
+ font-family: var(--font-mono); font-size: 14px; line-height: 1.8;
169
+ color: var(--text-secondary); margin-bottom: 14px;
170
+ background: rgba(0,0,0,0.3); padding: 14px; border-radius: var(--radius-sm);
171
+ }
172
+ .compare-good { border-color: var(--accent); }
173
+ .compare-good h3 { color: var(--accent); }
174
+ .text-loss { color: var(--loss); }
175
+ .text-profit { color: var(--profit); }
176
+
177
+ /* ─── LAYERS (ARCHITECTURE) ─── */
178
+ .layers { display: flex; flex-direction: column; gap: 10px; max-width: 700px; margin: 0 auto; }
179
+ .layer {
180
+ display: flex; align-items: stretch; border-radius: var(--radius-md);
181
+ overflow: hidden; border: 1px solid var(--border);
182
+ transition: border-color var(--transition);
183
+ }
184
+ .layer:hover { border-color: var(--accent); }
185
+ .layer-label {
186
+ display: flex; align-items: center; justify-content: center;
187
+ min-width: 56px; font-family: var(--font-mono); font-weight: 700; font-size: 14px;
188
+ color: #fff;
189
+ }
190
+ .layer-0 .layer-label { background: var(--accent); }
191
+ .layer-1 .layer-label { background: #6366f1; }
192
+ .layer-2 .layer-label { background: #3b82f6; }
193
+ .layer-3 .layer-label { background: #8b5cf6; }
194
+ .layer-4 .layer-label { background: #f59e0b; }
195
+ .layer-content {
196
+ flex: 1; padding: 16px 20px; background: var(--bg-card);
197
+ display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 16px;
198
+ }
199
+ .layer-content strong { font-family: var(--font-display); font-size: 16px; }
200
+ .layer-count {
201
+ font-family: var(--font-mono); font-size: 12px;
202
+ color: var(--text-muted); background: rgba(255,255,255,0.06);
203
+ padding: 2px 8px; border-radius: 4px;
204
+ }
205
+ .layer-content p {
206
+ width: 100%; font-size: 14px; color: var(--text-secondary); margin: 0;
207
+ }
208
+
209
+ /* ─── WORKFLOWS ─── */
210
+ .workflow-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
211
+ .workflow-card {
212
+ background: var(--bg-card); border: 1px solid var(--border);
213
+ border-radius: var(--radius-lg); padding: 28px;
214
+ }
215
+ .workflow-card h3 {
216
+ font-family: var(--font-mono); font-size: 18px; color: var(--accent);
217
+ margin-bottom: 6px;
218
+ }
219
+ .workflow-desc { font-size: 14px; color: var(--text-secondary); margin-bottom: 20px; }
220
+ .workflow-phases { display: flex; flex-direction: column; gap: 6px; }
221
+ .phase {
222
+ font-size: 13px; color: var(--text-secondary); padding: 6px 10px;
223
+ background: rgba(255,255,255,0.03); border-radius: var(--radius-sm);
224
+ border-left: 2px solid var(--border);
225
+ transition: border-color var(--transition);
226
+ }
227
+ .phase:hover { border-left-color: var(--accent); }
228
+ .phase-num {
229
+ font-family: var(--font-mono); font-weight: 700; color: var(--accent);
230
+ margin-right: 8px;
231
+ }
232
+
233
+ /* ─── FEATURES ─── */
234
+ .features-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
235
+ .feature-card {
236
+ background: var(--bg-card); border: 1px solid var(--border);
237
+ border-radius: var(--radius-lg); padding: 28px;
238
+ transition: border-color var(--transition), transform var(--transition);
239
+ }
240
+ .feature-card:hover { border-color: var(--accent); transform: translateY(-2px); }
241
+ .feature-icon { font-size: 28px; margin-bottom: 14px; }
242
+ .feature-card h3 {
243
+ font-family: var(--font-display); font-size: 18px; margin-bottom: 8px;
244
+ }
245
+ .feature-card p { font-size: 14px; color: var(--text-secondary); line-height: 1.6; }
246
+
247
+ /* ─── INSTALL ─── */
248
+ .install-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; max-width: 960px; margin: 0 auto; }
249
+ .install-card {
250
+ background: var(--bg-card); border: 1px solid var(--border);
251
+ border-radius: var(--radius-lg); padding: 32px; text-align: center;
252
+ }
253
+ .install-card h3 { font-family: var(--font-display); font-size: 20px; margin-bottom: 8px; }
254
+ .install-badge {
255
+ font-family: var(--font-mono); font-size: 12px;
256
+ color: var(--accent); display: inline-block; margin-bottom: 18px;
257
+ }
258
+ .code-block {
259
+ background: rgba(0,0,0,0.4); border: 1px solid var(--border);
260
+ border-radius: var(--radius-sm); padding: 14px 20px;
261
+ font-family: var(--font-mono); font-size: 14px;
262
+ color: var(--accent); margin-bottom: 14px; text-align: left;
263
+ overflow-x: auto;
264
+ }
265
+ .install-card p:last-child { font-size: 14px; color: var(--text-secondary); }
266
+
267
+ /* ─── GUIDE DIRECTORY ─── */
268
+ .guide-grid {
269
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
270
+ gap: 12px; max-width: 960px; margin: 0 auto;
271
+ }
272
+ .guide-link {
273
+ display: flex; align-items: center; gap: 16px;
274
+ padding: 16px 20px; background: var(--bg-card);
275
+ border: 1px solid var(--border); border-radius: var(--radius-md);
276
+ color: var(--text-primary);
277
+ transition: border-color var(--transition), transform var(--transition);
278
+ }
279
+ .guide-link:hover { border-color: var(--accent); transform: translateY(-2px); opacity: 1; }
280
+ .guide-icon { font-size: 24px; flex-shrink: 0; }
281
+ .guide-link strong { display: block; font-size: 15px; margin-bottom: 2px; }
282
+ .guide-link span { font-size: 13px; color: var(--text-secondary); }
283
+
284
+ /* ─── PRICING ─── */
285
+
286
+ /* Persona cards — "who needs what" */
287
+ .pricing-personas {
288
+ display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;
289
+ margin-bottom: 40px; max-width: 960px; margin-left: auto; margin-right: auto;
290
+ }
291
+ .persona-card {
292
+ background: var(--bg-elevated); border: 1px solid var(--border);
293
+ border-radius: var(--radius-md); padding: 20px; text-align: center;
294
+ }
295
+ .persona-icon { font-size: 28px; margin-bottom: 10px; }
296
+ .persona-card p { font-size: 14px; color: var(--text-secondary); line-height: 1.6; }
297
+ .persona-card strong { color: var(--text-primary); }
298
+
299
+ /* 3-column pricing grid */
300
+ .pricing-grid-3 {
301
+ display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;
302
+ max-width: 1060px; margin: 0 auto;
303
+ }
304
+ .pricing-card {
305
+ background: var(--bg-card); border: 1px solid var(--border);
306
+ border-radius: var(--radius-lg); padding: 32px;
307
+ display: flex; flex-direction: column;
308
+ }
309
+ .pricing-pro {
310
+ border-color: #f59e0b;
311
+ background: linear-gradient(168deg, var(--bg-card) 60%, rgba(245, 158, 11, 0.06) 100%);
312
+ }
313
+ .pricing-biz {
314
+ border-color: #8b5cf6;
315
+ background: linear-gradient(168deg, var(--bg-card) 60%, rgba(139, 92, 246, 0.06) 100%);
316
+ }
317
+ .pricing-tier { margin-bottom: 16px; }
318
+ .pricing-badge {
319
+ display: inline-block; font-family: var(--font-mono); font-size: 11px;
320
+ font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px;
321
+ padding: 3px 10px; border-radius: 4px; margin-bottom: 12px;
322
+ }
323
+ .pricing-badge-free { background: var(--accent-dim); color: var(--accent); }
324
+ .pricing-badge-pro { background: rgba(245, 158, 11, 0.15); color: #f59e0b; }
325
+ .pricing-badge-biz { background: rgba(139, 92, 246, 0.15); color: #8b5cf6; }
326
+ .pricing-card h3 {
327
+ font-family: var(--font-display); font-size: 26px; font-weight: 700;
328
+ margin-bottom: 4px;
329
+ }
330
+ .pricing-price {
331
+ font-family: var(--font-mono); font-size: 38px; font-weight: 700;
332
+ color: var(--text-primary); line-height: 1.1;
333
+ }
334
+ .pricing-forever { font-size: 15px; color: var(--text-muted); font-weight: 400; }
335
+ .pricing-period { font-size: 15px; color: var(--text-muted); font-weight: 400; }
336
+ .pricing-desc {
337
+ font-size: 14px; color: var(--text-secondary); line-height: 1.6;
338
+ margin-bottom: 12px;
339
+ }
340
+ .pricing-who {
341
+ font-size: 12px; color: var(--text-muted); line-height: 1.5;
342
+ margin-bottom: 20px; font-style: italic;
343
+ }
344
+ .pricing-features {
345
+ list-style: none; display: flex; flex-direction: column; gap: 9px;
346
+ margin-bottom: 24px; flex: 1;
347
+ }
348
+ .pricing-features li {
349
+ font-size: 13px; color: var(--text-secondary); line-height: 1.5;
350
+ padding-left: 20px; position: relative;
351
+ }
352
+ .pricing-features li::before {
353
+ content: '\2713'; position: absolute; left: 0;
354
+ color: var(--accent); font-weight: 700; font-size: 12px;
355
+ }
356
+ .pricing-pro .pricing-features li::before { color: #f59e0b; }
357
+ .pricing-biz .pricing-features li::before { color: #8b5cf6; }
358
+ .pricing-features li strong { color: var(--text-primary); font-weight: 600; }
359
+ .btn-pro {
360
+ display: inline-flex; align-items: center; justify-content: center;
361
+ padding: 10px 22px; border-radius: var(--radius-sm);
362
+ font-family: var(--font-body); font-weight: 600; font-size: 14px;
363
+ cursor: pointer; transition: all var(--transition); border: none;
364
+ background: #f59e0b; color: #000;
365
+ box-shadow: 0 0 20px rgba(245, 158, 11, 0.3);
366
+ }
367
+ .btn-pro:hover { background: #d97706; transform: translateY(-1px); opacity: 1; }
368
+ .btn-biz {
369
+ display: inline-flex; align-items: center; justify-content: center;
370
+ padding: 10px 22px; border-radius: var(--radius-sm);
371
+ font-family: var(--font-body); font-weight: 600; font-size: 14px;
372
+ cursor: pointer; transition: all var(--transition); border: none;
373
+ background: #8b5cf6; color: #fff;
374
+ box-shadow: 0 0 20px rgba(139, 92, 246, 0.3);
375
+ }
376
+ .btn-biz:hover { background: #7c3aed; transform: translateY(-1px); opacity: 1; }
377
+ .pricing-note {
378
+ font-size: 12px; color: var(--text-muted); text-align: center;
379
+ margin-top: 10px; line-height: 1.5;
380
+ }
381
+
382
+ /* Comparison table */
383
+ .pricing-compare {
384
+ max-width: 860px; margin: 48px auto 0;
385
+ }
386
+ .pricing-compare h3 {
387
+ font-family: var(--font-display); font-size: 22px; font-weight: 700;
388
+ text-align: center; margin-bottom: 20px;
389
+ }
390
+ .compare-table {
391
+ width: 100%; border-collapse: collapse;
392
+ font-size: 13px; color: var(--text-secondary);
393
+ }
394
+ .compare-table thead th {
395
+ font-family: var(--font-display); font-weight: 600; font-size: 14px;
396
+ color: var(--text-primary); padding: 12px 16px;
397
+ border-bottom: 2px solid var(--border); text-align: center;
398
+ }
399
+ .compare-table thead th:first-child { text-align: left; }
400
+ .compare-table .table-price {
401
+ font-family: var(--font-mono); font-size: 11px; color: var(--text-muted);
402
+ font-weight: 400;
403
+ }
404
+ .compare-table tbody td {
405
+ padding: 10px 16px; border-bottom: 1px solid var(--border);
406
+ text-align: center;
407
+ }
408
+ .compare-table tbody td:first-child { text-align: left; color: var(--text-primary); }
409
+ .compare-table .check { color: var(--accent); font-weight: 700; font-size: 16px; }
410
+ .compare-table .dash { color: var(--text-muted); }
411
+ .compare-table tbody tr:hover { background: rgba(255,255,255,0.02); }
412
+
413
+ /* ─── EXTENSIONS ─── */
414
+ .ext-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
415
+ .ext-card {
416
+ background: var(--bg-card); border: 1px solid var(--border);
417
+ border-radius: var(--radius-md); padding: 18px;
418
+ display: flex; flex-direction: column; gap: 4px;
419
+ transition: border-color var(--transition);
420
+ }
421
+ .ext-card:hover { border-color: var(--accent); }
422
+ .ext-card strong { font-family: var(--font-mono); font-size: 13px; }
423
+ .ext-card span { font-size: 13px; color: var(--text-muted); }
424
+
425
+ /* ─── STATS ─── */
426
+ .stats-grid {
427
+ display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px;
428
+ text-align: center;
429
+ }
430
+ .stat-num {
431
+ font-family: var(--font-mono); font-size: 52px; font-weight: 700;
432
+ color: var(--accent); display: block; line-height: 1;
433
+ }
434
+ .stat-label {
435
+ font-size: 14px; color: var(--text-secondary); margin-top: 8px;
436
+ display: block;
437
+ }
438
+
439
+ /* ─── FOOTER ─── */
440
+ .footer {
441
+ border-top: 1px solid var(--border); padding: 32px 0;
442
+ }
443
+ .footer-inner {
444
+ display: flex; align-items: center; justify-content: space-between;
445
+ }
446
+ .footer-inner p { font-size: 14px; color: var(--text-secondary); }
447
+ .footer-links { display: flex; gap: 24px; }
448
+ .footer-links a { font-size: 13px; color: var(--text-muted); }
449
+ .footer-links a:hover { color: var(--text-primary); }
450
+
451
+ /* ─── RESPONSIVE ─── */
452
+ @media (max-width: 900px) {
453
+ .compare-grid, .workflow-grid, .features-grid { grid-template-columns: 1fr; }
454
+ .ext-grid { grid-template-columns: repeat(2, 1fr); }
455
+ .install-grid, .pricing-grid, .pricing-grid-3 { grid-template-columns: 1fr; }
456
+ .pricing-personas { grid-template-columns: 1fr; }
457
+ .compare-table { font-size: 12px; }
458
+ .compare-table thead th, .compare-table tbody td { padding: 8px 10px; }
459
+ .stats-grid { grid-template-columns: repeat(2, 1fr); gap: 32px; }
460
+ .nav-links a:not(.btn):not(.nav-ctrl) { display: none; }
461
+ .nav-controls { gap: 6px; }
462
+ }
463
+
464
+ @media (max-width: 640px) {
465
+ .section { padding: 64px 0; }
466
+ .section h2 { font-size: 28px; }
467
+ .hero { padding: 100px 20px 60px; }
468
+ .hero h1 { font-size: 36px; }
469
+ .footer-inner { flex-direction: column; gap: 16px; text-align: center; }
470
+ .ext-grid { grid-template-columns: 1fr; }
471
+ .stats-grid { grid-template-columns: repeat(2, 1fr); }
472
+ }
473
+
474
+ /* ─── THEME TOGGLE + TRANSLATE ─── */
475
+ .nav-controls { display: flex; align-items: center; gap: 8px; }
476
+ .theme-toggle, .lang-toggle {
477
+ background: none; border: 1px solid var(--border); color: var(--text-secondary);
478
+ width: 34px; height: 34px; border-radius: var(--radius-sm);
479
+ cursor: pointer; display: flex; align-items: center; justify-content: center;
480
+ font-size: 16px; transition: all var(--transition); flex-shrink: 0;
481
+ }
482
+ .theme-toggle:hover, .lang-toggle:hover {
483
+ border-color: var(--accent); color: var(--text-primary);
484
+ }
485
+ /* Google Translate — hide injected banner */
486
+ .goog-te-banner-frame { display: none !important; }
487
+ body { top: 0 !important; }
488
+ .skiptranslate { display: none !important; }
489
+ /* Language dropdown */
490
+ .lang-dropdown { position: relative; }
491
+ .lang-menu {
492
+ position: absolute; top: calc(100% + 6px); right: 0; z-index: 100;
493
+ background: var(--bg-card); border: 1px solid var(--border);
494
+ border-radius: var(--radius-md); padding: 4px; min-width: 140px;
495
+ box-shadow: 0 8px 24px rgba(0,0,0,0.15);
496
+ display: flex; flex-direction: column;
497
+ }
498
+ .lang-menu[hidden] { display: none; }
499
+ .lang-menu button {
500
+ background: none; border: none; color: var(--text-secondary);
501
+ padding: 7px 12px; font-family: var(--font-body); font-size: 13px;
502
+ text-align: left; cursor: pointer; border-radius: var(--radius-sm);
503
+ transition: all var(--transition);
504
+ }
505
+ .lang-menu button:hover {
506
+ background: var(--bg-elevated); color: var(--text-primary);
507
+ }
508
+
509
+ /* ─── PAYMENT MODAL ─── */
510
+ .pay-modal { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; }
511
+ .pay-modal[hidden] { display: none; }
512
+ .pay-backdrop { position: absolute; inset: 0; background: rgba(0,0,0,0.7); backdrop-filter: blur(4px); }
513
+ .pay-dialog {
514
+ position: relative; background: var(--bg-card); border: 1px solid var(--border);
515
+ border-radius: var(--radius-lg); padding: 32px; max-width: 440px; width: 90%;
516
+ box-shadow: 0 24px 64px rgba(0,0,0,0.5); max-height: 90vh; overflow-y: auto;
517
+ }
518
+ .pay-close {
519
+ position: absolute; top: 12px; right: 16px; background: none; border: none;
520
+ color: var(--text-muted); font-size: 24px; cursor: pointer; line-height: 1;
521
+ padding: 4px; transition: color var(--transition);
522
+ }
523
+ .pay-close:hover { color: var(--text-primary); }
524
+ .pay-back {
525
+ background: none; border: none; color: var(--text-muted); font-size: 14px;
526
+ cursor: pointer; padding: 0; margin-bottom: 12px; transition: color var(--transition);
527
+ }
528
+ .pay-back:hover { color: var(--text-primary); }
529
+ .pay-step h3 { font-family: var(--font-display); font-size: 22px; margin-bottom: 4px; color: var(--text-primary); }
530
+ .pay-subtitle { font-size: 14px; color: var(--text-secondary); margin-bottom: 20px; }
531
+
532
+ /* Payment method selector */
533
+ .pay-options { display: flex; flex-direction: column; gap: 12px; }
534
+ .pay-option {
535
+ display: flex; align-items: center; gap: 14px; padding: 16px;
536
+ background: var(--bg-base); border: 1px solid var(--border); border-radius: var(--radius-md);
537
+ cursor: pointer; transition: all var(--transition); text-decoration: none; color: inherit;
538
+ }
539
+ .pay-option:hover { border-color: var(--accent); background: var(--bg-elevated); }
540
+ .pay-option-flag { font-size: 28px; flex-shrink: 0; }
541
+ .pay-option-info { flex: 1; display: flex; flex-direction: column; gap: 2px; }
542
+ .pay-option-info strong { font-size: 15px; color: var(--text-primary); }
543
+ .pay-option-info span { font-size: 12px; color: var(--text-muted); }
544
+ .pay-option-price { font-family: var(--font-mono); font-weight: 700; font-size: 14px !important; color: var(--accent) !important; margin-top: 2px; }
545
+ .pay-option-arrow { font-size: 18px; color: var(--text-muted); flex-shrink: 0; }
546
+
547
+ /* Form inputs */
548
+ .pay-label { display: block; font-size: 13px; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; }
549
+ .pay-input {
550
+ width: 100%; padding: 10px 14px; background: var(--bg-base); border: 1px solid var(--border);
551
+ border-radius: var(--radius-sm); color: var(--text-primary); font-family: var(--font-mono);
552
+ font-size: 14px; outline: none; transition: border-color var(--transition); margin-bottom: 14px;
553
+ }
554
+ .pay-input:focus { border-color: var(--accent); }
555
+ .pay-input::placeholder { color: var(--text-muted); }
556
+ .pay-error { color: var(--loss); font-size: 13px; margin-top: 8px; text-align: center; }
557
+
558
+ /* QR section */
559
+ .pay-qr { text-align: center; margin: 16px 0; }
560
+ .pay-qr img { width: 240px; height: 240px; border-radius: var(--radius-md); background: #fff; }
561
+ .pay-details {
562
+ background: var(--bg-base); border: 1px solid var(--border);
563
+ border-radius: var(--radius-md); padding: 14px; margin-bottom: 16px;
564
+ }
565
+ .pay-detail-row { display: flex; justify-content: space-between; align-items: center; padding: 6px 0; font-size: 13px; }
566
+ .pay-detail-row span { color: var(--text-muted); }
567
+ .pay-detail-row strong { color: var(--text-primary); }
568
+ .pay-mono { font-family: var(--font-mono); font-size: 13px; }
569
+ .pay-status {
570
+ display: flex; align-items: center; justify-content: center; gap: 10px;
571
+ padding: 12px; border-radius: var(--radius-sm); font-size: 14px;
572
+ background: var(--accent-dim); color: var(--accent); font-weight: 500;
573
+ }
574
+ .pay-spinner {
575
+ width: 16px; height: 16px; border: 2px solid var(--accent);
576
+ border-top-color: transparent; border-radius: 50%;
577
+ animation: spin 0.8s linear infinite;
578
+ }
579
+ @keyframes spin { to { transform: rotate(360deg); } }
580
+ .pay-hint { font-size: 12px; color: var(--text-muted); text-align: center; margin-top: 12px; line-height: 1.5; }
581
+ .pay-success-icon {
582
+ width: 64px; height: 64px; border-radius: 50%; background: var(--accent);
583
+ color: #fff; font-size: 32px; display: flex; align-items: center; justify-content: center;
584
+ margin: 0 auto 16px; font-weight: 700;
585
+ }
586
+
587
+ /* ─── ANIMATIONS ─── */
588
+ @media (prefers-reduced-motion: no-preference) {
589
+ .layer, .feature-card, .workflow-card, .compare-card, .ext-card, .install-card, .pricing-card, .stat {
590
+ opacity: 0; transform: translateY(20px);
591
+ animation: fadeUp 0.5s ease forwards;
592
+ }
593
+ .section:nth-child(2) .compare-card:nth-child(1) { animation-delay: 0.1s; }
594
+ .section:nth-child(2) .compare-card:nth-child(2) { animation-delay: 0.2s; }
595
+ .section:nth-child(2) .compare-card:nth-child(3) { animation-delay: 0.3s; }
596
+ }
597
+
598
+ @keyframes fadeUp {
599
+ to { opacity: 1; transform: translateY(0); }
600
+ }