@neocode-ai/web 1.1.1

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 (86) hide show
  1. package/README.md +54 -0
  2. package/astro.config.mjs +145 -0
  3. package/config.mjs +14 -0
  4. package/package.json +41 -0
  5. package/public/robots.txt +6 -0
  6. package/public/theme.json +183 -0
  7. package/src/assets/lander/check.svg +2 -0
  8. package/src/assets/lander/copy.svg +2 -0
  9. package/src/assets/lander/screenshot-github.png +0 -0
  10. package/src/assets/lander/screenshot-splash.png +0 -0
  11. package/src/assets/lander/screenshot-vscode.png +0 -0
  12. package/src/assets/lander/screenshot.png +0 -0
  13. package/src/assets/logo-dark.svg +20 -0
  14. package/src/assets/logo-light.svg +20 -0
  15. package/src/assets/logo-ornate-dark.svg +18 -0
  16. package/src/assets/logo-ornate-light.svg +18 -0
  17. package/src/assets/web/web-homepage-active-session.png +0 -0
  18. package/src/assets/web/web-homepage-new-session.png +0 -0
  19. package/src/assets/web/web-homepage-see-servers.png +0 -0
  20. package/src/components/Head.astro +50 -0
  21. package/src/components/Header.astro +128 -0
  22. package/src/components/Hero.astro +11 -0
  23. package/src/components/Lander.astro +713 -0
  24. package/src/components/Share.tsx +634 -0
  25. package/src/components/SiteTitle.astro +59 -0
  26. package/src/components/icons/custom.tsx +87 -0
  27. package/src/components/icons/index.tsx +4454 -0
  28. package/src/components/share/common.tsx +77 -0
  29. package/src/components/share/content-bash.module.css +85 -0
  30. package/src/components/share/content-bash.tsx +67 -0
  31. package/src/components/share/content-code.module.css +26 -0
  32. package/src/components/share/content-code.tsx +32 -0
  33. package/src/components/share/content-diff.module.css +153 -0
  34. package/src/components/share/content-diff.tsx +231 -0
  35. package/src/components/share/content-error.module.css +64 -0
  36. package/src/components/share/content-error.tsx +24 -0
  37. package/src/components/share/content-markdown.module.css +154 -0
  38. package/src/components/share/content-markdown.tsx +75 -0
  39. package/src/components/share/content-text.module.css +63 -0
  40. package/src/components/share/content-text.tsx +37 -0
  41. package/src/components/share/copy-button.module.css +30 -0
  42. package/src/components/share/copy-button.tsx +28 -0
  43. package/src/components/share/part.module.css +428 -0
  44. package/src/components/share/part.tsx +780 -0
  45. package/src/components/share.module.css +832 -0
  46. package/src/content/docs/1-0.mdx +67 -0
  47. package/src/content/docs/acp.mdx +156 -0
  48. package/src/content/docs/agents.mdx +720 -0
  49. package/src/content/docs/cli.mdx +597 -0
  50. package/src/content/docs/commands.mdx +323 -0
  51. package/src/content/docs/config.mdx +683 -0
  52. package/src/content/docs/custom-tools.mdx +170 -0
  53. package/src/content/docs/ecosystem.mdx +76 -0
  54. package/src/content/docs/enterprise.mdx +170 -0
  55. package/src/content/docs/formatters.mdx +130 -0
  56. package/src/content/docs/github.mdx +321 -0
  57. package/src/content/docs/gitlab.mdx +195 -0
  58. package/src/content/docs/ide.mdx +48 -0
  59. package/src/content/docs/index.mdx +359 -0
  60. package/src/content/docs/keybinds.mdx +191 -0
  61. package/src/content/docs/lsp.mdx +188 -0
  62. package/src/content/docs/mcp-servers.mdx +511 -0
  63. package/src/content/docs/models.mdx +223 -0
  64. package/src/content/docs/modes.mdx +331 -0
  65. package/src/content/docs/network.mdx +57 -0
  66. package/src/content/docs/permissions.mdx +237 -0
  67. package/src/content/docs/plugins.mdx +362 -0
  68. package/src/content/docs/providers.mdx +1889 -0
  69. package/src/content/docs/rules.mdx +180 -0
  70. package/src/content/docs/sdk.mdx +391 -0
  71. package/src/content/docs/server.mdx +286 -0
  72. package/src/content/docs/share.mdx +128 -0
  73. package/src/content/docs/skills.mdx +220 -0
  74. package/src/content/docs/themes.mdx +369 -0
  75. package/src/content/docs/tools.mdx +345 -0
  76. package/src/content/docs/troubleshooting.mdx +300 -0
  77. package/src/content/docs/tui.mdx +390 -0
  78. package/src/content/docs/web.mdx +136 -0
  79. package/src/content/docs/windows-wsl.mdx +113 -0
  80. package/src/content/docs/zen.mdx +251 -0
  81. package/src/content.config.ts +7 -0
  82. package/src/pages/[...slug].md.ts +18 -0
  83. package/src/pages/s/[id].astro +113 -0
  84. package/src/styles/custom.css +405 -0
  85. package/src/types/lang-map.d.ts +27 -0
  86. package/tsconfig.json +9 -0
@@ -0,0 +1,713 @@
1
+ ---
2
+ import { Image } from 'astro:assets';
3
+ import config from "virtual:starlight/user-config";
4
+ import type { Props } from '@astrojs/starlight/props';
5
+
6
+ import CopyIcon from "../assets/lander/copy.svg";
7
+ import CheckIcon from "../assets/lander/check.svg";
8
+ import TuiScreenshot from "../assets/lander/screenshot-splash.png";
9
+ import VscodeScreenshot from "../assets/lander/screenshot-vscode.png";
10
+ import GithubScreenshot from "../assets/lander/screenshot-github.png";
11
+
12
+ const { data } = Astro.locals.starlightRoute.entry;
13
+ const { title = data.title, tagline, image, actions = [] } = data.hero || {};
14
+
15
+ const imageAttrs = {
16
+ loading: 'eager' as const,
17
+ decoding: 'async' as const,
18
+ width: 400,
19
+ alt: image?.alt || '',
20
+ };
21
+
22
+ const github = config.social.filter(s => s.icon === 'github')[0];
23
+ const discord = config.social.filter(s => s.icon === 'discord')[0];
24
+
25
+ const command = "curl -fsSL"
26
+ const protocol = "https://"
27
+ const url = "neo.khulnasoft.com/install"
28
+ const bash = "| bash"
29
+
30
+ let darkImage: ImageMetadata | undefined;
31
+ let lightImage: ImageMetadata | undefined;
32
+ let rawHtml: string | undefined;
33
+ if (image) {
34
+ if ('file' in image) {
35
+ darkImage = image.file;
36
+ } else if ('dark' in image) {
37
+ darkImage = image.dark;
38
+ lightImage = image.light;
39
+ } else {
40
+ rawHtml = image.html;
41
+ }
42
+ }
43
+ ---
44
+ <div class="hero">
45
+ <section class="top">
46
+ <div class="logo">
47
+ <Image
48
+ src={darkImage}
49
+ {...imageAttrs}
50
+ class:list={{ 'light:sl-hidden': Boolean(lightImage) }}
51
+ />
52
+ <Image src={lightImage} {...imageAttrs} class="dark:sl-hidden" />
53
+ </div>
54
+ <h1>The AI coding agent built for the terminal.</h1>
55
+ </section>
56
+
57
+ <section class="cta">
58
+ <div class="col1">
59
+ <a href="/docs">Get Started</a>
60
+ </div>
61
+ <div class="col2">
62
+ <button class="command" data-command={`${command} ${protocol}${url} ${bash}`}>
63
+ <code>
64
+ <span>{command}&nbsp;</span><span class="protocol">{protocol}</span><span class="highlight">{url}</span>&nbsp;{bash}
65
+ </code>
66
+ <span class="copy">
67
+ <CopyIcon />
68
+ <CheckIcon />
69
+ </span>
70
+ </button>
71
+ </div>
72
+ </section>
73
+
74
+ <section class="content">
75
+ <ul>
76
+ <li><b>Native TUI</b>: A responsive, native, themeable terminal UI.</li>
77
+ <li><b>LSP enabled</b>: Automatically loads the right LSPs for the LLM.</li>
78
+ <li><b>Multi-session</b>: Start multiple agents in parallel on the same project.</li>
79
+ <li><b>Shareable links</b>: Share a link to any sessions for reference or to debug.</li>
80
+ <li><b>GitHub Copilot</b>: Log in with GitHub to use your Copilot account.</li>
81
+ <li><b>ChatGPT Plus/Pro</b>: Log in with OpenAI to use your ChatGPT Plus or Pro account.</li>
82
+ <li><b>Use any model</b>: Supports 75+ LLM providers through <a href="https://models.dev">Models.dev</a>, including local models.</li>
83
+ </ul>
84
+ </section>
85
+
86
+ <section class="alternatives">
87
+ <div class="col1">
88
+ <h3>npm</h3>
89
+ <button class="command" data-command="npm install -g neocode-ai">
90
+ <code>
91
+ <span>npm install -g</span> <span class="highlight">neocode-ai</span>
92
+ </code>
93
+ <span class="copy">
94
+ <CopyIcon />
95
+ <CheckIcon />
96
+ </span>
97
+ </button>
98
+ </div>
99
+ <div class="col2">
100
+ <h3>Bun</h3>
101
+ <button class="command" data-command="bun install -g neocode-ai">
102
+ <code>
103
+ <span>bun install -g</span> <span class="highlight">neocode-ai</span>
104
+ </code>
105
+ <span class="copy">
106
+ <CopyIcon />
107
+ <CheckIcon />
108
+ </span>
109
+ </button>
110
+ </div>
111
+ <div class="col3">
112
+ <h3>Homebrew</h3>
113
+ <button class="command" data-command="brew install neocode">
114
+ <code>
115
+ <span>brew install</span> <span class="highlight">neocode</span>
116
+ </code>
117
+ <span class="copy">
118
+ <CopyIcon />
119
+ <CheckIcon />
120
+ </span>
121
+ </button>
122
+ </div>
123
+ <div class="col4">
124
+ <h3>Paru</h3>
125
+ <button class="command" data-command="paru -S neocode-bin">
126
+ <code>
127
+ <span>paru -S</span> <span class="highlight">neocode-bin</span>
128
+ </code>
129
+ <span class="copy">
130
+ <CopyIcon />
131
+ <CheckIcon />
132
+ </span>
133
+ </button>
134
+ </div>
135
+ <div class="col4">
136
+ <h3>Mise</h3>
137
+ <button class="command" data-command="mise use -g github:neopilot-ai/neocode">
138
+ <code>
139
+ <span>mise use -g</span> <span class="highlight">github:neopilot-ai/neocode</span>
140
+ </code>
141
+ <span class="copy">
142
+ <CopyIcon />
143
+ <CheckIcon />
144
+ </span>
145
+ </button>
146
+ </div>
147
+ </section>
148
+
149
+ <section class="images">
150
+ <div class="left">
151
+ <figure>
152
+ <figcaption>neocode TUI with the tokyonight theme</figcaption>
153
+ <a href="/docs/cli">
154
+ <Image src={TuiScreenshot} alt="neocode TUI with the tokyonight theme" />
155
+ </a>
156
+ </figure>
157
+ </div>
158
+ <div class="right">
159
+ <div class="row1">
160
+ <figure>
161
+ <figcaption>neocode in VS Code</figcaption>
162
+ <a href="/docs/ide">
163
+ <Image src={VscodeScreenshot} alt="neocode in VS Code" />
164
+ </a>
165
+ </figure>
166
+ </div>
167
+ <div class="row2">
168
+ <figure>
169
+ <figcaption>neocode in GitHub</figcaption>
170
+ <a href="/docs/github">
171
+ <Image src={GithubScreenshot} alt="neocode in GitHub" />
172
+ </a>
173
+ </figure>
174
+ </div>
175
+ </div>
176
+ </section>
177
+
178
+ <section class="footer">
179
+ <div class="col1">
180
+ <a href={github.href} target="_blank" rel="noopener noreferrer">GitHub</a>
181
+ </div>
182
+ <div class="col2">
183
+ <a href={discord.href} target="_blank" rel="noopener noreferrer">Discord</a>
184
+ </div>
185
+ <div class="col3">
186
+ <span>&copy;2025 <a href="https://anoma.ly" target="_blank" rel="noopener noreferrer">Anomaly Innovations</a></span>
187
+ </div>
188
+ </section>
189
+ </div>
190
+
191
+ <style>
192
+ .hero {
193
+ --padding: 3rem;
194
+ --vertical-padding: 1.5rem;
195
+ --heading-font-size: var(--sl-text-3xl);
196
+
197
+ margin: 1rem;
198
+ border: 2px solid var(--sl-color-border);
199
+ }
200
+ @media (max-width: 30rem) {
201
+ .hero {
202
+ --padding: 1rem;
203
+ --vertical-padding: 0.75rem;
204
+ --heading-font-size: var(--sl-text-2xl);
205
+
206
+ margin: 0.5rem;
207
+ }
208
+ }
209
+
210
+ section.top {
211
+ padding: var(--padding);
212
+
213
+ h1 {
214
+ margin-top: calc(var(--vertical-padding) / 8);
215
+ font-size: var(--heading-font-size);
216
+ line-height: 1.25;
217
+ text-transform: uppercase;
218
+ }
219
+
220
+ img {
221
+ height: auto;
222
+ width: clamp(200px, 70vw, 400px);
223
+ }
224
+ }
225
+
226
+ section.cta {
227
+ display: flex;
228
+ flex-direction: row;
229
+ justify-content: flex-start;
230
+ align-items: stretch;
231
+ border-top: 2px solid var(--sl-color-border);
232
+
233
+ @media (max-width: 50rem) {
234
+ flex-direction: column;
235
+ }
236
+
237
+ & > div {
238
+ line-height: 1.4;
239
+ padding: var(--vertical-padding) var(--padding);
240
+
241
+ a {
242
+ font-size: 1rem;
243
+ }
244
+ }
245
+ & > div.col1 {
246
+ flex: 0 0 auto;
247
+ text-align: center;
248
+ text-transform: uppercase;
249
+
250
+ @media (max-width: 50rem) {
251
+ padding-bottom: calc(var(--vertical-padding) + 4px);
252
+ }
253
+ }
254
+ & > div.col2 {
255
+ flex: 1;
256
+ padding-left: 1rem;
257
+ padding-right: 1rem;
258
+ }
259
+
260
+ & > div + div {
261
+ border-left: 2px solid var(--sl-color-border);
262
+
263
+ @media (max-width: 50rem) {
264
+ border-left: none;
265
+ border-top: 2px solid var(--sl-color-border);
266
+ }
267
+ }
268
+
269
+ .command {
270
+ all: unset;
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 0.625rem;
274
+ justify-content: center;
275
+ cursor: pointer;
276
+ width: 100%;
277
+
278
+ code {
279
+ color: var(--sl-color-text-secondary);
280
+ font-size: 1.125rem;
281
+
282
+ @media (max-width: 24rem) {
283
+ font-size: 0.875rem;
284
+ }
285
+ @media (max-width: 30rem) {
286
+ span.protocol {
287
+ display: none;
288
+ }
289
+ }
290
+ @media (max-width: 43rem) {
291
+ text-align: center;
292
+ span:first-child {
293
+ display: block;
294
+ }
295
+ }
296
+ }
297
+ code .highlight {
298
+ color: var(--sl-color-text);
299
+ font-weight: 500;
300
+ }
301
+
302
+ .copy {
303
+ line-height: 1;
304
+ padding: 0;
305
+ @media (max-width: 43rem) {
306
+ display: none;
307
+ }
308
+ }
309
+ .copy svg {
310
+ width: 1rem;
311
+ height: 1rem;
312
+ vertical-align: middle;
313
+ }
314
+ .copy svg:first-child {
315
+ color: var(--sl-color-text-dimmed);
316
+ }
317
+ .copy svg:last-child {
318
+ color: var(--sl-color-text);
319
+ display: none;
320
+ }
321
+ &.success .copy {
322
+ pointer-events: none;
323
+ }
324
+ &.success .copy svg:first-child {
325
+ display: none;
326
+ }
327
+ &.success .copy svg:last-child {
328
+ display: inline;
329
+ }
330
+ }
331
+ }
332
+
333
+ section.content {
334
+ border-top: 2px solid var(--sl-color-border);
335
+ padding: var(--padding);
336
+
337
+ ul {
338
+ padding-left: 1rem;
339
+
340
+ li + li {
341
+ margin-top: calc(var(--vertical-padding) / 2);
342
+ }
343
+
344
+ li b {
345
+ text-transform: uppercase;
346
+ }
347
+ }
348
+ }
349
+
350
+ section.images {
351
+ --images-height: 600px;
352
+ display: grid;
353
+ grid-template-columns: 1fr 1fr;
354
+ grid-template-rows: var(--images-height);
355
+ border-top: 2px solid var(--sl-color-border);
356
+
357
+ & > div.left {
358
+ display: flex;
359
+ grid-row: 1;
360
+ grid-column: 1;
361
+ }
362
+
363
+ & > div.right {
364
+ display: grid;
365
+ grid-template-rows: 1fr 1fr;
366
+ grid-row: 1;
367
+ grid-column: 2;
368
+ border-left: 2px solid var(--sl-color-border);
369
+
370
+ & > div.row1 {
371
+ display: flex;
372
+ grid-row: 1;
373
+ border-bottom: 2px solid var(--sl-color-border);
374
+ height: calc(var(--images-height) / 2);
375
+ }
376
+
377
+ & > div.row2 {
378
+ display: flex;
379
+ grid-row: 2;
380
+ height: calc(var(--images-height) / 2);
381
+ }
382
+ }
383
+
384
+ figure {
385
+ flex: 1;
386
+ display: flex;
387
+ flex-direction: column;
388
+ gap: calc(var(--padding) / 4);
389
+ padding: calc(var(--padding) / 2);
390
+ border-width: 0;
391
+ border-style: solid;
392
+ border-color: var(--sl-color-border);
393
+ min-height: 0;
394
+ overflow: hidden;
395
+
396
+ & > div, figcaption {
397
+ display: flex;
398
+ align-items: center;
399
+ }
400
+
401
+ & > div {
402
+ flex: 1;
403
+ min-height: 0;
404
+ display: flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ }
408
+
409
+ a {
410
+ display: flex;
411
+ flex: 1;
412
+ min-height: 0;
413
+ align-items: center;
414
+ justify-content: center;
415
+ width: 100%;
416
+ height: 100%;
417
+ }
418
+
419
+ figcaption {
420
+ letter-spacing: -0.03125rem;
421
+ text-transform: uppercase;
422
+ color: var(--sl-color-text-dimmed);
423
+ flex-shrink: 0;
424
+
425
+ @media (max-width: 30rem) {
426
+ font-size: 0.75rem;
427
+ }
428
+ }
429
+ }
430
+
431
+ & > div.left figure {
432
+ height: var(--images-height);
433
+ box-sizing: border-box;
434
+ }
435
+
436
+ & > div.right figure {
437
+ height: calc(var(--images-height) / 2);
438
+ box-sizing: border-box;
439
+ }
440
+
441
+ & > div.left img {
442
+ width: 100%;
443
+ height: 100%;
444
+ min-width: 0;
445
+ object-fit: contain;
446
+ }
447
+
448
+ & > div.right img {
449
+ width: 100%;
450
+ height: calc(100% - 2rem);
451
+ object-fit: contain;
452
+ display: block;
453
+ }
454
+
455
+ @media (max-width: 30rem) {
456
+ & {
457
+ --images-height: auto;
458
+ grid-template-columns: 1fr;
459
+ grid-template-rows: auto auto;
460
+ }
461
+
462
+ & > div.left {
463
+ grid-row: 1;
464
+ grid-column: 1;
465
+ }
466
+
467
+ & > div.right {
468
+ grid-row: 2;
469
+ grid-column: 1;
470
+ border-left: none;
471
+ border-top: 2px solid var(--sl-color-border);
472
+
473
+ & > div.row1,
474
+ & > div.row2 {
475
+ height: auto;
476
+ }
477
+ }
478
+
479
+ & > div.left figure,
480
+ & > div.right figure {
481
+ height: auto;
482
+ }
483
+
484
+ & > div.left img,
485
+ & > div.right img {
486
+ width: 100%;
487
+ height: auto;
488
+ max-height: none;
489
+ }
490
+ }
491
+ }
492
+
493
+ section.alternatives {
494
+ border-top: 2px solid var(--sl-color-border);
495
+ display: grid;
496
+ grid-template-columns: 1fr 1fr;
497
+ grid-template-rows: 1fr 1fr;
498
+
499
+ @media (max-width: 40rem) {
500
+ grid-template-columns: 1fr;
501
+ grid-template-rows: auto;
502
+ }
503
+
504
+ & > div {
505
+ display: flex;
506
+ flex-direction: column;
507
+ padding: calc(var(--vertical-padding) / 2) calc(var(--padding) / 2) calc(var(--vertical-padding) / 2 + 0.125rem);
508
+ text-align: left;
509
+ gap: 0.5rem;
510
+
511
+ @media (max-width: 30rem) {
512
+ gap: 0.3125rem;
513
+ }
514
+
515
+ @media (max-width: 40rem) {
516
+ text-align: left;
517
+ }
518
+ }
519
+
520
+ & > div.col1 {
521
+ border-bottom: 2px solid var(--sl-color-border);
522
+
523
+ @media (max-width: 40rem) {
524
+ border-bottom: none;
525
+ }
526
+ }
527
+
528
+ & > div.col2 {
529
+ border-left: 2px solid var(--sl-color-border);
530
+ border-bottom: 2px solid var(--sl-color-border);
531
+
532
+ @media (max-width: 40rem) {
533
+ border-left: none;
534
+ border-bottom: none;
535
+ border-top: 2px solid var(--sl-color-border);
536
+ }
537
+ }
538
+
539
+ & > div.col3 {
540
+ @media (max-width: 40rem) {
541
+ border-top: 2px solid var(--sl-color-border);
542
+ }
543
+ }
544
+
545
+ & > div.col4 {
546
+ border-left: 2px solid var(--sl-color-border);
547
+ @media (max-width: 40rem) {
548
+ border-left: none;
549
+ border-top: 2px solid var(--sl-color-border);
550
+ }
551
+ }
552
+
553
+ h3 {
554
+ letter-spacing: -0.03125rem;
555
+ text-transform: uppercase;
556
+ color: var(--sl-color-text-dimmed);
557
+ font-weight: normal;
558
+ font-size: 1rem;
559
+ flex-shrink: 0;
560
+
561
+ @media (max-width: 30rem) {
562
+ font-size: 0.75rem;
563
+ }
564
+ }
565
+
566
+ .command {
567
+ all: unset;
568
+ display: flex;
569
+ align-items: center;
570
+ gap: 0.625rem;
571
+ justify-content: flex-start;
572
+ cursor: pointer;
573
+ width: 100%;
574
+
575
+ @media (max-width: 40rem) {
576
+ justify-content: flex-start;
577
+ }
578
+
579
+ @media (max-width: 30rem) {
580
+ justify-content: center;
581
+ }
582
+
583
+ code {
584
+ color: var(--sl-color-text-secondary);
585
+ font-size: 1rem;
586
+
587
+ @media (max-width: 24rem) {
588
+ font-size: 0.875rem;
589
+ }
590
+ }
591
+
592
+ code .highlight {
593
+ color: var(--sl-color-text);
594
+ font-weight: 500;
595
+ }
596
+
597
+ .copy {
598
+ line-height: 1;
599
+ padding: 0;
600
+
601
+ @media (max-width: 40rem) {
602
+ display: none;
603
+ }
604
+ }
605
+
606
+ .copy svg {
607
+ width: 1rem;
608
+ height: 1rem;
609
+ vertical-align: middle;
610
+ }
611
+
612
+ .copy svg:first-child {
613
+ color: var(--sl-color-text-dimmed);
614
+ }
615
+
616
+ .copy svg:last-child {
617
+ color: var(--sl-color-text);
618
+ display: none;
619
+ }
620
+
621
+ &.success .copy {
622
+ pointer-events: none;
623
+ }
624
+
625
+ &.success .copy svg:first-child {
626
+ display: none;
627
+ }
628
+
629
+ &.success .copy svg:last-child {
630
+ display: inline;
631
+ }
632
+ }
633
+ }
634
+
635
+ section.footer {
636
+ border-top: 2px solid var(--sl-color-border);
637
+ display: flex;
638
+ flex-direction: row;
639
+
640
+ & > div {
641
+ flex: 1;
642
+ text-align: center;
643
+ text-transform: uppercase;
644
+ padding: var(--vertical-padding) 0.5rem;
645
+ }
646
+
647
+ & > div + div {
648
+ border-left: 2px solid var(--sl-color-border);
649
+ }
650
+
651
+ /* Below 800px: first two columns shrink to content, third expands */
652
+ @media (max-width: 50rem) {
653
+ & > div.col1,
654
+ & > div.col2 {
655
+ flex: 0 0 auto;
656
+ padding-left: calc(var(--padding) / 2);
657
+ padding-right: calc(var(--padding) / 2);
658
+ }
659
+
660
+ & > div.col3 {
661
+ flex: 1;
662
+ }
663
+ }
664
+
665
+ /* Mobile: third column on its own row */
666
+ @media (max-width: 30rem) {
667
+ flex-wrap: wrap;
668
+
669
+ & > div.col1,
670
+ & > div.col2 {
671
+ flex: 1;
672
+ }
673
+
674
+ & > div.col3 {
675
+ flex: 1 0 100%;
676
+ border-left: none;
677
+ border-top: 2px solid var(--sl-color-border);
678
+ }
679
+ }
680
+ }
681
+ </style>
682
+
683
+ <style is:global>
684
+ :root[data-has-hero] {
685
+ header.header {
686
+ display: none;
687
+ }
688
+ .main-frame {
689
+ padding-top: 0;
690
+
691
+ .main-pane > main {
692
+ padding: 0;
693
+ }
694
+ }
695
+ main > .content-panel .sl-markdown-content {
696
+ margin-top: 0;
697
+ }
698
+ }
699
+ </style>
700
+
701
+ <script>
702
+ const buttons = document.querySelectorAll("button.command") as NodeListOf<HTMLButtonElement>
703
+
704
+ buttons.forEach(button => {
705
+ button.addEventListener("click", () => {
706
+ navigator.clipboard.writeText(button.dataset.command!)
707
+ button.classList.toggle("success")
708
+ setTimeout(() => {
709
+ button.classList.toggle("success");
710
+ }, 1500)
711
+ })
712
+ })
713
+ </script>