@draig/lexis-two 1.0.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 (140) hide show
  1. package/.agents/plugins/marketplace.json +21 -0
  2. package/.claude-plugin/marketplace.json +29 -0
  3. package/.claude-plugin/plugin.json +9 -0
  4. package/.clinerules/lexis-two.md +163 -0
  5. package/.codex-plugin/plugin.json +31 -0
  6. package/.cursor/rules/lexis-two.mdc +169 -0
  7. package/.env.example +8 -0
  8. package/.github/FUNDING.yml +1 -0
  9. package/.github/copilot-instructions.md +47 -0
  10. package/.github/plugin/marketplace.json +20 -0
  11. package/.github/plugin/plugin.json +16 -0
  12. package/.github/workflows/deploy-site.yml +53 -0
  13. package/.github/workflows/test.yml +29 -0
  14. package/.kiro/steering/lexis-two.md +167 -0
  15. package/.nojekyll +0 -0
  16. package/.opencode/command/lexis-two-audit.md +5 -0
  17. package/.opencode/command/lexis-two-debt.md +5 -0
  18. package/.opencode/command/lexis-two-help.md +5 -0
  19. package/.opencode/command/lexis-two-plan.md +5 -0
  20. package/.opencode/command/lexis-two-review.md +5 -0
  21. package/.opencode/command/lexis-two-security.md +5 -0
  22. package/.opencode/command/lexis-two.md +5 -0
  23. package/.opencode/plugins/lexis-two.mjs +74 -0
  24. package/.windsurf/rules/lexis-two.md +163 -0
  25. package/AGENTS.md +163 -0
  26. package/AUDIT.md +74 -0
  27. package/CNAME +1 -0
  28. package/LICENSE +23 -0
  29. package/README.md +301 -0
  30. package/SPECXIS.md +576 -0
  31. package/assets/benchmark-3model.svg +21 -0
  32. package/assets/lexis-two-complete.webp +0 -0
  33. package/assets/lexis-two-nobg.png +0 -0
  34. package/assets/logo.png +0 -0
  35. package/assets/social-preview.png +0 -0
  36. package/benchmarks/README.md +114 -0
  37. package/benchmarks/arms/baseline.js +2 -0
  38. package/benchmarks/arms/caveman-SKILL.md +67 -0
  39. package/benchmarks/arms/caveman.js +8 -0
  40. package/benchmarks/arms/lexis-two.js +10 -0
  41. package/benchmarks/arms/ponytail.js +6 -0
  42. package/benchmarks/behavior.js +58 -0
  43. package/benchmarks/behavior.yaml +40 -0
  44. package/benchmarks/benchmark-local.py +156 -0
  45. package/benchmarks/benchmark-opencode-go.js +294 -0
  46. package/benchmarks/correctness.js +294 -0
  47. package/benchmarks/lib/aggregate-opencode-go.js +103 -0
  48. package/benchmarks/lib/load-env.js +31 -0
  49. package/benchmarks/lib/opencode-go-client.js +151 -0
  50. package/benchmarks/loc.js +13 -0
  51. package/benchmarks/opencode-go-models.json +31 -0
  52. package/benchmarks/promptfooconfig.yaml +41 -0
  53. package/benchmarks/prompts.json +15 -0
  54. package/benchmarks/render-opencode-go-report.js +28 -0
  55. package/benchmarks/results/2026-06-15-llama3.2-local.md +76 -0
  56. package/benchmarks/results/2026-06-16-opencode-go.md +56 -0
  57. package/benchmarks/results/opencode-go-2026-06-16-report.html +226 -0
  58. package/benchmarks/results/opencode-go-2026-06-16.json +1339 -0
  59. package/commands/lexis-two-audit.toml +3 -0
  60. package/commands/lexis-two-debt.toml +3 -0
  61. package/commands/lexis-two-help.toml +3 -0
  62. package/commands/lexis-two-plan.toml +3 -0
  63. package/commands/lexis-two-review.toml +3 -0
  64. package/commands/lexis-two-security.toml +3 -0
  65. package/commands/lexis-two.toml +3 -0
  66. package/docs/assets/lexis-two-nobg.png +0 -0
  67. package/docs/assets/logo.png +0 -0
  68. package/docs/assets/logo.svg +4 -0
  69. package/docs/portability.md +147 -0
  70. package/docs/site.md +52 -0
  71. package/examples/api-endpoint.md +68 -0
  72. package/examples/caching.md +74 -0
  73. package/examples/date-picker.md +48 -0
  74. package/examples/email-validation.md +51 -0
  75. package/examples/sorting.md +42 -0
  76. package/gemini-extension.json +7 -0
  77. package/hooks/copilot-hooks.json +21 -0
  78. package/hooks/hooks.json +31 -0
  79. package/hooks/lexis-two-activate.js +72 -0
  80. package/hooks/lexis-two-config.js +101 -0
  81. package/hooks/lexis-two-instructions.js +126 -0
  82. package/hooks/lexis-two-mode-tracker.js +55 -0
  83. package/hooks/lexis-two-runtime.js +50 -0
  84. package/hooks/lexis-two-statusline.ps1 +19 -0
  85. package/hooks/lexis-two-statusline.sh +11 -0
  86. package/opencode.json +4 -0
  87. package/package.json +31 -0
  88. package/pi-extension/index.js +161 -0
  89. package/pi-extension/package.json +8 -0
  90. package/pi-extension/test/extension.test.js +89 -0
  91. package/pi-extension/test/helpers.test.js +35 -0
  92. package/scripts/check-rule-copies.js +82 -0
  93. package/site/astro.config.mjs +18 -0
  94. package/site/package-lock.json +4913 -0
  95. package/site/package.json +14 -0
  96. package/site/public/CNAME +1 -0
  97. package/site/public/assets/lexis-two-nobg.png +0 -0
  98. package/site/public/assets/logo.png +0 -0
  99. package/site/public/assets/logo.svg +4 -0
  100. package/site/public/robots.txt +4 -0
  101. package/site/src/components/Adapt.astro +33 -0
  102. package/site/src/components/Benchmarks.astro +232 -0
  103. package/site/src/components/Commands.astro +33 -0
  104. package/site/src/components/Ecosystem.astro +30 -0
  105. package/site/src/components/Example.astro +77 -0
  106. package/site/src/components/Footer.astro +28 -0
  107. package/site/src/components/Header.astro +87 -0
  108. package/site/src/components/Hero.astro +58 -0
  109. package/site/src/components/Home.astro +46 -0
  110. package/site/src/components/Hosts.astro +62 -0
  111. package/site/src/components/Install.astro +143 -0
  112. package/site/src/components/LanguageSwitcher.astro +82 -0
  113. package/site/src/components/Philosophy.astro +23 -0
  114. package/site/src/components/Stacks.astro +33 -0
  115. package/site/src/components/Suggested.astro +39 -0
  116. package/site/src/data/opencode-go-benchmark.json +230 -0
  117. package/site/src/i18n/en.ts +155 -0
  118. package/site/src/i18n/es.ts +158 -0
  119. package/site/src/i18n/index.ts +14 -0
  120. package/site/src/layouts/Layout.astro +114 -0
  121. package/site/src/pages/benchmarks.astro +4 -0
  122. package/site/src/pages/es/benchmarks.astro +4 -0
  123. package/site/src/pages/es/index.astro +10 -0
  124. package/site/src/pages/index.astro +10 -0
  125. package/site/src/styles/global.css +780 -0
  126. package/site/tsconfig.json +3 -0
  127. package/skills/lexis-two/SKILL.md +109 -0
  128. package/skills/lexis-two-audit/SKILL.md +21 -0
  129. package/skills/lexis-two-debt/SKILL.md +22 -0
  130. package/skills/lexis-two-plan/SKILL.md +25 -0
  131. package/skills/lexis-two-review/SKILL.md +24 -0
  132. package/skills/lexis-two-security/SKILL.md +24 -0
  133. package/tests/behavior.test.js +80 -0
  134. package/tests/commands.test.js +40 -0
  135. package/tests/copilot-plugin.test.js +33 -0
  136. package/tests/correctness.test.js +191 -0
  137. package/tests/gemini-extension.test.js +78 -0
  138. package/tests/hooks-windows.test.js +48 -0
  139. package/tests/hooks.test.js +177 -0
  140. package/tests/opencode-plugin.test.js +64 -0
@@ -0,0 +1,780 @@
1
+ :root {
2
+ --bg: #0b0d0c;
3
+ --bg-elevated: #121614;
4
+ --bg-code: #0f1210;
5
+ --border: #1e2420;
6
+ --border-bright: #2a332c;
7
+ --text: #e8ece9;
8
+ --text-muted: #a0aa9e;
9
+ --accent: #7cba8a;
10
+ --accent-dim: #4a7356;
11
+ --accent-glow: rgba(124, 186, 138, 0.12);
12
+ --danger: #c97a7a;
13
+ --font-sans: "Syne", system-ui, sans-serif;
14
+ --font-mono: "IBM Plex Mono", ui-monospace, monospace;
15
+ --max: 72rem;
16
+ --radius: 0.5rem;
17
+ }
18
+
19
+ *,
20
+ *::before,
21
+ *::after {
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ html {
26
+ scroll-behavior: smooth;
27
+ }
28
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
29
+ a:focus-visible, button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius); }
30
+
31
+
32
+ body {
33
+ margin: 0;
34
+ font-family: var(--font-sans);
35
+ font-size: 1.05rem;
36
+ line-height: 1.6;
37
+ color: var(--text);
38
+ background: var(--bg);
39
+ background-image:
40
+ radial-gradient(
41
+ ellipse 80% 50% at 50% -20%,
42
+ var(--accent-glow),
43
+ transparent
44
+ ),
45
+ linear-gradient(var(--border) 1px, transparent 1px),
46
+ linear-gradient(90deg, var(--border) 1px, transparent 1px);
47
+ background-size:
48
+ 100% 100%,
49
+ 3rem 3rem,
50
+ 3rem 3rem;
51
+ background-position: center top;
52
+ }
53
+
54
+ a {
55
+ color: var(--accent);
56
+ text-decoration-thickness: 1px;
57
+ text-underline-offset: 0.2em;
58
+ }
59
+
60
+ a:hover {
61
+ color: #9fd4a8;
62
+ }
63
+
64
+ img {
65
+ max-width: 100%;
66
+ height: auto;
67
+ }
68
+
69
+ .skip-link {
70
+ position: absolute;
71
+ left: -9999px;
72
+ top: 0;
73
+ padding: 0.75rem 1rem;
74
+ background: var(--accent);
75
+ color: var(--bg);
76
+ z-index: 100;
77
+ }
78
+
79
+ .skip-link:focus {
80
+ left: 1rem;
81
+ top: 1rem;
82
+ }
83
+
84
+ .wrap {
85
+ width: min(var(--max), calc(100% - 2rem));
86
+ margin-inline: auto;
87
+ }
88
+
89
+ .site-header {
90
+ position: sticky;
91
+ top: 0;
92
+ z-index: 50;
93
+ border-bottom: 1px solid var(--border);
94
+ background: color-mix(in srgb, var(--bg) 88%, transparent);
95
+ backdrop-filter: blur(10px);
96
+ }
97
+
98
+ .hero-content {
99
+ display: flex;
100
+ flex-direction: column;
101
+ align-items: center;
102
+ gap: 1rem;
103
+ }
104
+
105
+ .site-header .wrap,
106
+ .site-header .header-inner {
107
+ display: flex;
108
+ flex-wrap: wrap;
109
+ align-items: center;
110
+ gap: 0.75rem 1rem;
111
+ padding: 0.85rem 0;
112
+ }
113
+
114
+ .brand {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 0.65rem;
118
+ color: var(--text);
119
+ text-decoration: none;
120
+ font-weight: 700;
121
+ letter-spacing: 0.04em;
122
+ min-width: 0;
123
+ flex: 1 1 auto;
124
+ }
125
+
126
+ .brand img {
127
+ height: 2rem;
128
+ width: auto;
129
+ max-width: min(11rem, 55vw);
130
+ }
131
+
132
+ .nav-toggle {
133
+ display: flex;
134
+ flex-direction: column;
135
+ justify-content: center;
136
+ gap: 0.3rem;
137
+ width: 2.75rem;
138
+ height: 2.75rem;
139
+ padding: 0;
140
+ margin-left: auto;
141
+ border: 1px solid var(--border-bright);
142
+ border-radius: var(--radius);
143
+ background: var(--bg-elevated);
144
+ color: var(--text);
145
+ cursor: pointer;
146
+ flex-shrink: 0;
147
+ }
148
+
149
+ .nav-toggle:hover {
150
+ border-color: var(--accent-dim);
151
+ }
152
+
153
+ .nav-toggle-bar {
154
+ display: block;
155
+ width: 1.15rem;
156
+ height: 2px;
157
+ margin-inline: auto;
158
+ background: var(--accent);
159
+ border-radius: 1px;
160
+ transition:
161
+ transform 0.2s ease,
162
+ opacity 0.2s ease;
163
+ }
164
+
165
+ .site-header.is-nav-open .nav-toggle-bar:nth-child(1) {
166
+ transform: translateY(0.45rem) rotate(45deg);
167
+ }
168
+
169
+ .site-header.is-nav-open .nav-toggle-bar:nth-child(2) {
170
+ opacity: 0;
171
+ }
172
+
173
+ .site-header.is-nav-open .nav-toggle-bar:nth-child(3) {
174
+ transform: translateY(-0.45rem) rotate(-45deg);
175
+ }
176
+
177
+ .nav {
178
+ display: none;
179
+ flex-direction: column;
180
+ width: 100%;
181
+ flex-basis: 100%;
182
+ gap: 0;
183
+ font-size: 0.875rem;
184
+ padding-top: 0.5rem;
185
+ border-top: 1px solid var(--border);
186
+ }
187
+
188
+ .site-header.is-nav-open .nav {
189
+ display: flex;
190
+ }
191
+
192
+ .nav a {
193
+ color: var(--text-muted);
194
+ text-decoration: none;
195
+ padding: 0.75rem 0;
196
+ border-bottom: 1px solid var(--border);
197
+ }
198
+
199
+ .nav a:last-child {
200
+ border-bottom: none;
201
+ padding-bottom: 0.25rem;
202
+ }
203
+
204
+ .nav a:hover {
205
+ color: var(--accent);
206
+ }
207
+
208
+ @media (min-width: 768px) {
209
+ .site-header .header-inner {
210
+ flex-wrap: nowrap;
211
+ }
212
+
213
+ .brand {
214
+ flex: 0 1 auto;
215
+ }
216
+
217
+ .brand img {
218
+ max-width: 11rem;
219
+ }
220
+
221
+ .nav-toggle {
222
+ display: none;
223
+ }
224
+
225
+ .nav {
226
+ display: flex;
227
+ flex-direction: row;
228
+ flex-wrap: wrap;
229
+ justify-content: flex-end;
230
+ width: auto;
231
+ flex-basis: auto;
232
+ gap: 0.35rem 1.25rem;
233
+ padding-top: 0;
234
+ border-top: none;
235
+ }
236
+
237
+ .nav a {
238
+ padding: 0;
239
+ border-bottom: none;
240
+ }
241
+
242
+ .nav a:last-child {
243
+ padding-bottom: 0;
244
+ }
245
+ }
246
+
247
+ @media (max-width: 420px) {
248
+ .brand-text {
249
+ display: none;
250
+ }
251
+ }
252
+
253
+ .hero {
254
+ padding: 4.5rem 0 3rem;
255
+ text-align: center;
256
+ }
257
+
258
+ .hero-badge {
259
+ display: inline-block;
260
+ font-family: var(--font-mono);
261
+ font-size: 0.75rem;
262
+ letter-spacing: 0.08em;
263
+ color: var(--accent);
264
+ border: 1px solid var(--accent-dim);
265
+ background: var(--accent-glow);
266
+ padding: 0.35rem 0.75rem;
267
+ border-radius: 999px;
268
+ margin-bottom: 1.5rem;
269
+ }
270
+
271
+ .hero h1 {
272
+ font-size: clamp(2.25rem, 6vw, 3.75rem);
273
+ line-height: 1.05;
274
+ margin: 0 0 1rem;
275
+ font-weight: 800;
276
+ letter-spacing: -0.03em;
277
+ }
278
+
279
+ .hero .tagline {
280
+ font-size: clamp(1.05rem, 2.5vw, 1.35rem);
281
+ color: var(--text-muted);
282
+ max-width: 38rem;
283
+ margin: 0 auto 1.25rem;
284
+ }
285
+
286
+ .cta-row {
287
+ display: flex;
288
+ flex-wrap: wrap;
289
+ justify-content: center;
290
+ gap: 0.75rem;
291
+ }
292
+
293
+ .btn {
294
+ display: inline-flex;
295
+ align-items: center;
296
+ justify-content: center;
297
+ gap: 0.4rem;
298
+ padding: 0.75rem 1.35rem;
299
+ border-radius: var(--radius);
300
+ font-weight: 600;
301
+ font-size: 0.95rem;
302
+ text-decoration: none;
303
+ border: 1px solid transparent;
304
+ cursor: pointer;
305
+ font-family: inherit;
306
+ transition:
307
+ transform 0.15s ease,
308
+ border-color 0.15s ease,
309
+ background 0.15s ease;
310
+ }
311
+
312
+ .btn:hover {
313
+ transform: translateY(-1px);
314
+ }
315
+
316
+ .btn-primary {
317
+ background: var(--accent);
318
+ color: var(--bg);
319
+ }
320
+
321
+ .btn-primary:hover {
322
+ background: #9fd4a8;
323
+ color: var(--bg);
324
+ }
325
+
326
+ .btn-ghost {
327
+ background: transparent;
328
+ color: var(--text);
329
+ border-color: var(--border-bright);
330
+ }
331
+
332
+ .btn-ghost:hover {
333
+ border-color: var(--accent-dim);
334
+ color: var(--accent);
335
+ }
336
+
337
+ section {
338
+ padding: 3.5rem 0;
339
+ }
340
+
341
+ section:nth-of-type(even) {
342
+ background: color-mix(in srgb, var(--bg-elevated) 70%, transparent);
343
+ border-block: 1px solid var(--border);
344
+ }
345
+
346
+ .section-head {
347
+ margin-bottom: 2rem;
348
+ }
349
+
350
+ .section-head h2 {
351
+ font-size: clamp(1.5rem, 3vw, 2rem);
352
+ margin: 0 0 0.5rem;
353
+ letter-spacing: -0.02em;
354
+ }
355
+
356
+ .section-head p {
357
+ margin: 0;
358
+ color: var(--text-muted);
359
+ max-width: 40rem;
360
+ }
361
+
362
+ .ladder {
363
+ list-style: none;
364
+ padding: 0;
365
+ margin: 0;
366
+ counter-reset: rung;
367
+ display: grid;
368
+ gap: 0.75rem;
369
+ }
370
+
371
+ .ladder li {
372
+ counter-increment: rung;
373
+ display: grid;
374
+ grid-template-columns: auto 1fr;
375
+ gap: 1rem;
376
+ align-items: start;
377
+ padding: 1rem 1.15rem;
378
+ background: var(--bg-elevated);
379
+ border: 1px solid var(--border);
380
+ border-radius: var(--radius);
381
+ }
382
+
383
+ .ladder li::before {
384
+ content: counter(rung);
385
+ font-family: var(--font-mono);
386
+ font-size: 0.85rem;
387
+ font-weight: 600;
388
+ color: var(--accent);
389
+ background: var(--accent-glow);
390
+ border: 1px solid var(--accent-dim);
391
+ width: 2rem;
392
+ height: 2rem;
393
+ display: grid;
394
+ place-items: center;
395
+ border-radius: 0.35rem;
396
+ flex-shrink: 0;
397
+ }
398
+
399
+ .compare {
400
+ display: grid;
401
+ gap: 1rem;
402
+ }
403
+
404
+ @media (min-width: 768px) {
405
+ .compare {
406
+ grid-template-columns: 1fr 1fr;
407
+ }
408
+ }
409
+
410
+ .panel {
411
+ border: 1px solid var(--border);
412
+ border-radius: var(--radius);
413
+ overflow: hidden;
414
+ background: var(--bg-elevated);
415
+ }
416
+
417
+ .panel-head {
418
+ padding: 0.65rem 1rem;
419
+ font-family: var(--font-mono);
420
+ font-size: 0.75rem;
421
+ letter-spacing: 0.06em;
422
+ text-transform: uppercase;
423
+ border-bottom: 1px solid var(--border);
424
+ }
425
+
426
+ .panel-head.bad {
427
+ color: var(--danger);
428
+ }
429
+
430
+ .panel-head.good {
431
+ color: var(--accent);
432
+ }
433
+
434
+ .panel-body {
435
+ position: relative;
436
+ }
437
+
438
+ .panel-body pre {
439
+ margin: 0;
440
+ padding: 1rem;
441
+ overflow-x: auto;
442
+ font-family: var(--font-mono);
443
+ font-size: 0.8rem;
444
+ line-height: 1.55;
445
+ background: var(--bg-code);
446
+ }
447
+
448
+ .panel-foot {
449
+ padding: 0.75rem 1rem;
450
+ font-size: 0.875rem;
451
+ color: var(--text-muted);
452
+ border-top: 1px solid var(--border);
453
+ }
454
+
455
+ .copy-btn {
456
+ position: absolute;
457
+ top: 0.5rem;
458
+ right: 0.5rem;
459
+ font-family: var(--font-mono);
460
+ font-size: 0.7rem;
461
+ padding: 0.3rem 0.55rem;
462
+ border: 1px solid var(--border-bright);
463
+ border-radius: 0.25rem;
464
+ background: var(--bg-elevated);
465
+ color: var(--text-muted);
466
+ cursor: pointer;
467
+ }
468
+
469
+ .copy-btn:hover {
470
+ color: var(--accent);
471
+ border-color: var(--accent-dim);
472
+ }
473
+
474
+ .table-wrap {
475
+ overflow-x: auto;
476
+ border: 1px solid var(--border);
477
+ border-radius: var(--radius);
478
+ }
479
+
480
+ table {
481
+ width: 100%;
482
+ border-collapse: collapse;
483
+ font-size: 0.9rem;
484
+ }
485
+
486
+ th,
487
+ td {
488
+ padding: 0.75rem 1rem;
489
+ text-align: left;
490
+ border-bottom: 1px solid var(--border);
491
+ vertical-align: top;
492
+ }
493
+
494
+ th {
495
+ font-family: var(--font-mono);
496
+ font-size: 0.72rem;
497
+ letter-spacing: 0.06em;
498
+ text-transform: uppercase;
499
+ color: var(--text-muted);
500
+ background: var(--bg-elevated);
501
+ }
502
+
503
+ tr:last-child td {
504
+ border-bottom: none;
505
+ }
506
+
507
+ td code {
508
+ font-family: var(--font-mono);
509
+ font-size: 0.82em;
510
+ color: var(--accent);
511
+ }
512
+
513
+ .pill {
514
+ display: inline-block;
515
+ font-family: var(--font-mono);
516
+ font-size: 0.68rem;
517
+ padding: 0.15rem 0.45rem;
518
+ border-radius: 999px;
519
+ border: 1px solid var(--border-bright);
520
+ color: var(--text-muted);
521
+ white-space: nowrap;
522
+ }
523
+
524
+ .pill.full {
525
+ border-color: var(--accent-dim);
526
+ color: var(--accent);
527
+ }
528
+
529
+ .pill.soon {
530
+ border-color: #5a4a2a;
531
+ color: #c9a86a;
532
+ }
533
+
534
+ .benchmark-note {
535
+ max-width: 32rem;
536
+ margin: 0 auto 2rem;
537
+ padding: 0.85rem 1rem;
538
+ font-size: 0.875rem;
539
+ color: var(--text-muted);
540
+ text-align: center;
541
+ background: var(--bg-elevated);
542
+ border: 1px solid var(--border);
543
+ border-radius: var(--radius);
544
+ }
545
+
546
+ .benchmark-note a {
547
+ white-space: nowrap;
548
+ }
549
+
550
+ .cmd-grid {
551
+ display: grid;
552
+ gap: 0.75rem;
553
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
554
+ }
555
+
556
+ .cmd-card {
557
+ padding: 1rem;
558
+ background: var(--bg-elevated);
559
+ border: 1px solid var(--border);
560
+ border-radius: var(--radius);
561
+ }
562
+
563
+ .cmd-card code {
564
+ font-family: var(--font-mono);
565
+ font-size: 0.85rem;
566
+ color: var(--accent);
567
+ }
568
+
569
+ .cmd-card p {
570
+ margin: 0.5rem 0 0;
571
+ font-size: 0.875rem;
572
+ color: var(--text-muted);
573
+ }
574
+
575
+ .install-tabs {
576
+ display: flex;
577
+ flex-wrap: wrap;
578
+ gap: 0.5rem;
579
+ margin-bottom: 1rem;
580
+ }
581
+
582
+ .tab-btn {
583
+ font-family: var(--font-mono);
584
+ font-size: 0.8rem;
585
+ padding: 0.45rem 0.85rem;
586
+ border: 1px solid var(--border);
587
+ border-radius: var(--radius);
588
+ background: var(--bg-elevated);
589
+ color: var(--text-muted);
590
+ cursor: pointer;
591
+ }
592
+
593
+ .tab-btn[aria-selected="true"] {
594
+ border-color: var(--accent-dim);
595
+ color: var(--accent);
596
+ background: var(--accent-glow);
597
+ }
598
+
599
+ .tab-panel {
600
+ display: none;
601
+ }
602
+
603
+ .tab-panel.active {
604
+ display: block;
605
+ }
606
+
607
+ .tab-panel pre {
608
+ margin: 0;
609
+ padding: 1rem;
610
+ overflow-x: auto;
611
+ font-family: var(--font-mono);
612
+ font-size: 0.82rem;
613
+ line-height: 1.55;
614
+ background: var(--bg-code);
615
+ border: 1px solid var(--border);
616
+ border-radius: var(--radius);
617
+ }
618
+
619
+ .adapt-list {
620
+ display: grid;
621
+ gap: 1rem;
622
+ }
623
+
624
+ @media (min-width: 768px) {
625
+ .adapt-list {
626
+ grid-template-columns: repeat(3, 1fr);
627
+ }
628
+ }
629
+
630
+ .adapt-card {
631
+ padding: 1.15rem;
632
+ background: var(--bg-elevated);
633
+ border: 1px solid var(--border);
634
+ border-radius: var(--radius);
635
+ }
636
+
637
+ .adapt-card h3 {
638
+ margin: 0 0 0.5rem;
639
+ font-size: 1rem;
640
+ }
641
+
642
+ .adapt-card p {
643
+ margin: 0;
644
+ font-size: 0.875rem;
645
+ color: var(--text-muted);
646
+ }
647
+
648
+ .ecosystem {
649
+ font-family: var(--font-mono);
650
+ font-size: clamp(0.65rem, 1.8vw, 0.78rem);
651
+ line-height: 1.45;
652
+ padding: 1.25rem;
653
+ overflow-x: auto;
654
+ background: var(--bg-code);
655
+ border: 1px solid var(--border);
656
+ border-radius: var(--radius);
657
+ color: var(--text-muted);
658
+ }
659
+
660
+ .site-footer {
661
+ padding: 2.5rem 0 3rem;
662
+ border-top: 1px solid var(--border);
663
+ text-align: center;
664
+ font-size: 0.875rem;
665
+ color: var(--text-muted);
666
+ }
667
+
668
+ .site-footer p {
669
+ margin: 0.35rem 0;
670
+ }
671
+
672
+ /* Benchmark page */
673
+ .benchmark-page {
674
+ padding: 2.5rem 0 3rem;
675
+ }
676
+
677
+ .benchmark-head {
678
+ margin-bottom: 2rem;
679
+ }
680
+
681
+ .benchmark-meta {
682
+ font-size: 0.9rem;
683
+ color: var(--text-muted);
684
+ }
685
+
686
+ .benchmark-grid {
687
+ display: grid;
688
+ gap: 1.25rem;
689
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
690
+ }
691
+
692
+ .benchmark-card {
693
+ padding: 1rem 1rem 0.5rem;
694
+ background: var(--bg-elevated);
695
+ border: 1px solid var(--border);
696
+ border-radius: var(--radius);
697
+ }
698
+
699
+ .benchmark-card h2 {
700
+ margin: 0 0 0.75rem;
701
+ font-size: 0.85rem;
702
+ text-transform: uppercase;
703
+ letter-spacing: 0.06em;
704
+ color: var(--text-muted);
705
+ }
706
+
707
+ .benchmark-card.wide {
708
+ grid-column: 1 / -1;
709
+ }
710
+
711
+ .benchmark-card canvas {
712
+ max-height: 280px;
713
+ }
714
+
715
+ .benchmark-card .good {
716
+ color: var(--accent);
717
+ }
718
+
719
+ .benchmark-foot {
720
+ margin-top: 2rem;
721
+ font-size: 0.85rem;
722
+ color: var(--text-muted);
723
+ }
724
+
725
+ .stacks-grid {
726
+ display: grid;
727
+ gap: 0.75rem;
728
+ grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
729
+ }
730
+
731
+ .stack-card {
732
+ padding: 1rem;
733
+ background: var(--bg-elevated);
734
+ border: 1px solid var(--border);
735
+ border-radius: var(--radius);
736
+ }
737
+
738
+ .stack-card h3 {
739
+ margin: 0 0 0.4rem;
740
+ font-size: 0.95rem;
741
+ color: var(--accent);
742
+ }
743
+
744
+ .stack-card p {
745
+ margin: 0;
746
+ font-size: 0.85rem;
747
+ color: var(--text-muted);
748
+ }
749
+
750
+ .suggested-list {
751
+ display: grid;
752
+ gap: 1rem;
753
+ grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
754
+ }
755
+
756
+ .suggested-card {
757
+ display: block;
758
+ padding: 1.15rem;
759
+ background: var(--bg-elevated);
760
+ border: 1px solid var(--border);
761
+ border-radius: var(--radius);
762
+ text-decoration: none;
763
+ transition: border-color 0.15s ease;
764
+ }
765
+
766
+ .suggested-card:hover {
767
+ border-color: var(--accent-dim);
768
+ }
769
+
770
+ .suggested-card h3 {
771
+ margin: 0 0 0.4rem;
772
+ font-size: 1rem;
773
+ color: var(--accent);
774
+ }
775
+
776
+ .suggested-card p {
777
+ margin: 0;
778
+ font-size: 0.875rem;
779
+ color: var(--text-muted);
780
+ }