create-shibumi 0.2.8 → 0.3.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 (52) hide show
  1. package/README.md +17 -4
  2. package/package.json +2 -2
  3. package/scripts/ship.lock.json +2 -2
  4. package/src/adopt.ts +250 -0
  5. package/src/args.ts +32 -6
  6. package/src/cli.ts +230 -41
  7. package/src/templates/blog/agents.md +4 -1
  8. package/src/templates/blog/bun.lock +1 -0
  9. package/src/templates/blog/gitignore +2 -0
  10. package/src/templates/blog/package.json +4 -2
  11. package/src/templates/blog/public/favicon.svg +1 -0
  12. package/src/templates/blog/public/style.css +77 -4
  13. package/src/templates/blog/src/components/BaseHead.astro +4 -0
  14. package/src/templates/blog/src/content/blog/one-vps-is-plenty.md +7 -5
  15. package/src/templates/blog/src/content/blog/own-your-source.md +9 -5
  16. package/src/templates/blog/src/content/blog/writing-for-agents.md +7 -5
  17. package/src/templates/blog/src/content.config.ts +3 -0
  18. package/src/templates/blog/src/layouts/Base.astro +12 -1
  19. package/src/templates/blog/src/pages/index.astro +5 -2
  20. package/src/templates/blog/src/pages/llms.txt.ts +1 -1
  21. package/src/templates/blog/src/pages/posts/[id].astro +2 -1
  22. package/src/templates/blog/src/pages/posts/[id].md.ts +1 -1
  23. package/src/templates/blog/src/pages/rss.xml.ts +1 -1
  24. package/src/templates/full-stack/agents.md +1 -0
  25. package/src/templates/full-stack/package.json +1 -0
  26. package/src/templates/full-stack/public/favicon.svg +1 -0
  27. package/src/templates/full-stack/public/style.css +5 -6
  28. package/src/templates/full-stack/src/app.ts +5 -3
  29. package/src/templates/ship.ts +551 -153
  30. package/src/templates/static/agents.md +1 -0
  31. package/src/templates/{web → static}/bun.lock +1 -21
  32. package/src/templates/static/gitignore +2 -0
  33. package/src/templates/static/package.json +6 -2
  34. package/src/templates/static/public/favicon.svg +1 -0
  35. package/src/templates/static/public/index.html +11 -3
  36. package/src/templates/static/public/style.css +66 -20
  37. package/src/templates/web/.dockerignore +0 -12
  38. package/src/templates/web/Dockerfile +0 -24
  39. package/src/templates/web/README.md +0 -10
  40. package/src/templates/web/agents.md +0 -54
  41. package/src/templates/web/compose.yaml +0 -17
  42. package/src/templates/web/gitignore +0 -5
  43. package/src/templates/web/package.json +0 -34
  44. package/src/templates/web/public/app.js +0 -11
  45. package/src/templates/web/public/style.css +0 -150
  46. package/src/templates/web/public/vendor/alpine-csp-3.16.2.min.js +0 -23
  47. package/src/templates/web/public/vendor/shibumi.css +0 -422
  48. package/src/templates/web/src/app.ts +0 -106
  49. package/src/templates/web/src/env.ts +0 -21
  50. package/src/templates/web/src/server.ts +0 -23
  51. package/src/templates/web/test/app.test.ts +0 -145
  52. package/src/templates/web/tsconfig.json +0 -13
@@ -8,6 +8,7 @@ Static site generated by create-shibumi. Plain committed files in `public/`, no
8
8
  bun dev # preview public/ locally (scripts/preview.ts, dev only)
9
9
  bun ship:setup # configure the deploy target (preconfigured: static, public/)
10
10
  bun ship # verify public/, build the static image, upload, deploy
11
+ bun ship:webhook # opt in to push-to-deploy; --off reverses it
11
12
  ```
12
13
 
13
14
  ## Routes and templates
@@ -3,15 +3,9 @@
3
3
  "configVersion": 1,
4
4
  "workspaces": {
5
5
  "": {
6
- "name": "shibumi-web-app",
7
- "dependencies": {
8
- "hono": "4.13.3",
9
- "zod": "4.4.3",
10
- },
6
+ "name": "shibumi-static-site",
11
7
  "devDependencies": {
12
8
  "@clack/prompts": "1.7.0",
13
- "@types/bun": "latest",
14
- "typescript": "5.9.2",
15
9
  },
16
10
  },
17
11
  },
@@ -20,26 +14,12 @@
20
14
 
21
15
  "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="],
22
16
 
23
- "@types/bun": ["@types/bun@1.4.0", "", { "dependencies": { "bun-types": "1.4.0" } }, "sha512-K+lZULY23vRgK/CfTjFIV+tyifaNdSMlPh9j+6mQ/cLfpOznLyAuzgV/JQysyECpkBQLVMSyvjlr2fBUSA9wFQ=="],
24
-
25
- "@types/node": ["@types/node@26.2.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg=="],
26
-
27
- "bun-types": ["bun-types@1.4.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-iIKw23BspnQQYd3prITOBxeUsxBHnwzX6YJfGMuNOZzeNcMmVqzIIVGRm1l69ogaPQmb4wB6BN8mA5bE9YuC5Q=="],
28
-
29
17
  "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="],
30
18
 
31
19
  "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="],
32
20
 
33
21
  "fast-wrap-ansi": ["fast-wrap-ansi@0.2.2", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="],
34
22
 
35
- "hono": ["hono@4.13.3", "", {}, "sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw=="],
36
-
37
23
  "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
38
-
39
- "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="],
40
-
41
- "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="],
42
-
43
- "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="],
44
24
  }
45
25
  }
@@ -1,2 +1,4 @@
1
1
  node_modules/
2
+ .env
3
+ .env.*
2
4
  .DS_Store
@@ -6,12 +6,16 @@
6
6
  "scripts": {
7
7
  "dev": "bun scripts/preview.ts",
8
8
  "ship": "bun scripts/ship.ts",
9
- "ship:setup": "bun scripts/ship.ts --setup --static --output-dir public",
9
+ "ship:setup": "bun scripts/ship.ts --setup --static --output-dir public --no-spa",
10
10
  "ship:update": "bun scripts/ship.ts --update",
11
11
  "ship:status": "bun scripts/ship.ts --status",
12
- "ship:logs": "bun scripts/ship.ts --logs"
12
+ "ship:logs": "bun scripts/ship.ts --logs",
13
+ "ship:webhook": "bun scripts/ship.ts --webhook"
13
14
  },
14
15
  "engines": {
15
16
  "bun": ">=1.4.0"
17
+ },
18
+ "devDependencies": {
19
+ "@clack/prompts": "1.7.0"
16
20
  }
17
21
  }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><style>text{fill:#e95f19;font-family:"Hiragino Sans","Noto Sans JP",sans-serif}@media (prefers-color-scheme:dark){text{fill:#ff8648}}</style><text x="50" y="55" font-size="62" text-anchor="middle" dominant-baseline="central">渋</text></svg>
@@ -3,14 +3,22 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Shibumi static site</title>
6
+ <title>It ships · shibumi static</title>
7
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
+ <meta name="generator" content="create-shibumi (shibumistack.dev)" />
7
9
  <link rel="stylesheet" href="/style.css" />
8
10
  </head>
9
11
  <body>
10
12
  <main>
13
+ <p class="masthead"><span class="masthead-mark">渋み</span> shibumi static</p>
11
14
  <h1>It ships.</h1>
12
- <p>To get started, open <code>public/index.html</code>; this page is that file. Edit, commit, run <code>bun ship</code>.</p>
13
- <p>Using Astro, Jekyll, Eleventy, or another generator? Point its output here, or run <code>bun ship:setup</code> in that project instead; the Ship client packages any verified build directory.</p>
15
+ <p class="lede">Every file in <code>public/</code> is a page on your site. You are looking at <code>public/index.html</code>.</p>
16
+ <ol class="steps">
17
+ <li>Edit this file. <code>bun dev</code> shows it locally.</li>
18
+ <li>Connect your server once with <code>bun ship:setup</code>.</li>
19
+ <li>After that, every deploy is <code>git commit</code> and <code>bun ship</code>.</li>
20
+ </ol>
21
+ <p class="aside">Writing with Astro, Jekyll, or Eleventy instead? Run <code>bun ship:setup</code> inside that project; Ship deploys any build folder it can verify.</p>
14
22
  </main>
15
23
  </body>
16
24
  </html>
@@ -1,36 +1,71 @@
1
+ /* Self-contained styles on the shibumi palette. Yours to edit. */
1
2
  :root {
2
3
  color-scheme: light dark;
3
- --paper: #f5f0e4;
4
- --ink: #1b130f;
5
- --accent: #e95f19;
6
- }
7
-
8
- @media (prefers-color-scheme: dark) {
9
- :root {
10
- --paper: #1b130f;
11
- --ink: #f5f0e4;
12
- --accent: #ff8648;
13
- }
4
+ --paper: light-dark(#f5f0e4, #1b130f);
5
+ --ink: light-dark(#272016, #eee5d7);
6
+ --muted: light-dark(#746b5d, #aaa092);
7
+ --faint: light-dark(rgba(39, 32, 22, 0.055), rgba(238, 229, 215, 0.07));
8
+ --line: light-dark(rgba(39, 32, 22, 0.14), rgba(238, 229, 215, 0.16));
9
+ --accent: light-dark(#e95f19, #ff8648);
10
+ --font-serif: ui-serif, Georgia, "Iowan Old Style", Cambria, serif;
11
+ --font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
14
12
  }
15
13
 
16
14
  body {
17
15
  margin: 0;
18
16
  background: var(--paper);
19
17
  color: var(--ink);
20
- font-family: system-ui, sans-serif;
18
+ font-family: ui-sans-serif, system-ui, sans-serif;
21
19
  font-size: 1.125rem;
22
- line-height: 1.6;
20
+ line-height: 1.65;
23
21
  }
24
22
 
25
23
  main {
26
- max-width: 40rem;
24
+ max-width: 40.625rem;
27
25
  margin: 0 auto;
28
- padding: 4rem 1.5rem;
26
+ padding: clamp(3rem, 9vh, 6.5rem) 1.5rem 4rem;
27
+ }
28
+
29
+ .masthead {
30
+ display: flex;
31
+ align-items: baseline;
32
+ gap: 0.6rem;
33
+ margin: 0 0 3.5rem;
34
+ padding-bottom: 1rem;
35
+ border-bottom: 1px solid var(--line);
36
+ color: var(--muted);
37
+ font-size: 0.875rem;
38
+ letter-spacing: 0.04em;
39
+ }
40
+
41
+ .masthead-mark {
42
+ color: var(--accent);
43
+ font-size: 1rem;
29
44
  }
30
45
 
31
46
  h1 {
32
- font-family: Georgia, "Times New Roman", serif;
33
- font-weight: 500;
47
+ margin: 0 0 0.75rem;
48
+ font-family: var(--font-serif);
49
+ font-size: clamp(2.6rem, 7vw, 3.8rem);
50
+ font-weight: 450;
51
+ letter-spacing: -0.03em;
52
+ line-height: 1.05;
53
+ }
54
+
55
+ .lede {
56
+ margin: 0 0 3rem;
57
+ max-width: 34rem;
58
+ color: var(--muted);
59
+ font-size: 1.3125rem;
60
+ line-height: 1.55;
61
+ }
62
+
63
+ code {
64
+ padding: 0.12em 0.42em;
65
+ border-radius: 0.35rem;
66
+ background: var(--faint);
67
+ font-family: var(--font-mono);
68
+ font-size: 0.85em;
34
69
  }
35
70
 
36
71
  a {
@@ -44,7 +79,18 @@ a:hover {
44
79
  text-decoration-color: var(--accent);
45
80
  }
46
81
 
47
- code {
48
- font-family: ui-monospace, monospace;
49
- font-size: 0.9em;
82
+ .steps {
83
+ margin: 0 0 2.5rem;
84
+ padding-left: 1.4rem;
85
+ }
86
+
87
+ .steps li {
88
+ margin-bottom: 0.6rem;
89
+ }
90
+
91
+ .aside {
92
+ padding-top: 1.5rem;
93
+ border-top: 1px solid var(--line);
94
+ color: var(--muted);
95
+ font-size: 1rem;
50
96
  }
@@ -1,12 +0,0 @@
1
- .git
2
- node_modules
3
- dist
4
- test
5
- scripts
6
- .env
7
- .env.*
8
- *.md
9
- .gitignore
10
- .dockerignore
11
- compose.yaml
12
- shibumi-server.json
@@ -1,24 +0,0 @@
1
- FROM oven/bun:1-alpine AS deps
2
- WORKDIR /app
3
- COPY package.json bun.lock ./
4
- RUN bun install --frozen-lockfile --production
5
-
6
- # Major-pinned: minors and patches flow, a future Bun 2 cannot break deploys.
7
- FROM oven/bun:1-alpine AS build
8
- WORKDIR /app
9
- COPY package.json bun.lock ./
10
- RUN bun install --frozen-lockfile
11
- COPY tsconfig.json ./
12
- COPY src ./src
13
- RUN bun run build
14
-
15
- FROM oven/bun:1-alpine
16
- WORKDIR /app
17
- COPY --from=build /app/dist ./dist
18
- COPY public ./public
19
- COPY package.json ./
20
- # Production mode: extensions gate security behavior on this. Never unset it.
21
- ENV NODE_ENV=production
22
- USER bun
23
- EXPOSE 3000
24
- CMD ["bun", "dist/server.js"]
@@ -1,10 +0,0 @@
1
- # Shibumi web app
2
-
3
- Bun, Hono, Zod, and Alpine. Everything here is your source.
4
-
5
- ```sh
6
- bun install
7
- bun dev
8
- ```
9
-
10
- Deploy to your VPS with `bun ship:setup`, then `bun ship`. See `agents.md` for the project map and the rules tests enforce.
@@ -1,54 +0,0 @@
1
- # Agent Notes
2
-
3
- Bun web app generated by create-shibumi. Hono routes, Zod validation, Alpine behavior, no framework runtime. All source is owned by this project; edit anything.
4
-
5
- ## Commands
6
-
7
- ```sh
8
- bun dev # Ship wrapper starts hot reload on the configured app port
9
- bun dev:app # plain watch mode on PORT (default 3000)
10
- bun test # route and security-header tests
11
- bun run check # TypeScript check
12
- bun run build # bundle src/server.ts to dist/server.js
13
- bun ship # build image, upload, deploy via shibumi-server
14
- bun ship:setup # configure the deploy target
15
- bun run shibumi add <name> # install an extension (auth, email); --dry-run previews
16
- ```
17
-
18
- ## Routes and templates
19
-
20
- - `src/app.ts`: all routes and the HTML page. `src/server.ts`: startup and graceful shutdown. `src/env.ts`: environment schema.
21
- - Static assets under `public/`, served at `/public/*`.
22
- - Alpine is the vendored CSP build (`public/vendor/alpine-csp-*.min.js`): register components with `Alpine.data()` in `public/app.js` and reference methods by name in markup; inline expressions do not evaluate.
23
-
24
- ## Trust boundaries and validation
25
-
26
- - Every environment variable goes through the Zod schema in `src/env.ts`; the app never reads `process.env` elsewhere.
27
- - Every request input (query, params, body) is validated with Zod at the route before use; `/api/hello` is the pattern.
28
- - The response header set in `SECURITY_HEADERS` (`src/app.ts`) is asserted verbatim by tests on success, error, API, and static responses; change both together. The CSP allows no inline or eval'd script.
29
- - Add no unauthenticated mutation endpoints (POST/PUT/PATCH/DELETE); tests fail if a route registers one. Add authentication first.
30
-
31
- ## Database
32
-
33
- This template has no database. The full-stack template adds Drizzle and SQLite under `/data`.
34
-
35
- ## Files Ship generates
36
-
37
- `bun ship:setup` writes `shibumi-server.json` (committed) and stores SSH targets in `~/.config/shibumi/config.json` (never committed). `scripts/ship.ts` is owned source, vendored at generation time; update it with `bun ship:update`.
38
-
39
- ## Secrets and runtime config
40
-
41
- Set production env vars (secrets, per-deploy config) on the server, never in git or the image:
42
-
43
- ```sh
44
- bun ship:env set KEY=VALUE # one or more
45
- bun ship:env import .env.production # bulk from a local file
46
- bun ship:env list # names only
47
- bun ship:env rm KEY
48
- ```
49
-
50
- Values are stored per-app on the server and injected at deploy; run `bun ship` to apply. Non-secret tunables that belong in git live in `src/config/*.yaml` instead.
51
-
52
- ## Checks required before commit
53
-
54
- `bun test` and `bun run check` must pass. The Docker image copies only `dist/`, `public/`, and `package.json`; if you add runtime files elsewhere, update the Dockerfile and `.dockerignore` together.
@@ -1,17 +0,0 @@
1
- services:
2
- app:
3
- build: .
4
- ports:
5
- - "127.0.0.1:${SHIBUMI_PORT:-9001}:3000"
6
- restart: unless-stopped
7
- healthcheck:
8
- test: ["CMD", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://127.0.0.1:3000/healthz"]
9
- interval: 60s
10
- timeout: 10s
11
- retries: 3
12
- start_period: 10s
13
- deploy:
14
- resources:
15
- limits:
16
- cpus: "1.0"
17
- memory: 512M
@@ -1,5 +0,0 @@
1
- node_modules/
2
- dist/
3
- .env
4
- .env.*
5
- .DS_Store
@@ -1,34 +0,0 @@
1
- {
2
- "name": "shibumi-web-app",
3
- "version": "0.1.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "dev": "bun scripts/ship.ts --dev",
8
- "dev:app": "bun --watch src/server.ts",
9
- "start": "bun dist/server.js",
10
- "build": "bun build src/server.ts --outdir dist --target bun",
11
- "test": "bun test",
12
- "check": "tsc --noEmit",
13
- "ship": "bun scripts/ship.ts",
14
- "ship:setup": "bun scripts/ship.ts --setup",
15
- "ship:update": "bun scripts/ship.ts --update",
16
- "ship:status": "bun scripts/ship.ts --status",
17
- "ship:logs": "bun scripts/ship.ts --logs",
18
- "ship:env": "bun scripts/ship.ts --env",
19
- "shibumi": "bun scripts/shibumi.ts",
20
- "shi": "bun scripts/shibumi.ts"
21
- },
22
- "dependencies": {
23
- "hono": "4.13.3",
24
- "zod": "4.4.3"
25
- },
26
- "devDependencies": {
27
- "@clack/prompts": "1.7.0",
28
- "@types/bun": "1.4.0",
29
- "typescript": "5.9.2"
30
- },
31
- "engines": {
32
- "bun": ">=1.4.0"
33
- }
34
- }
@@ -1,11 +0,0 @@
1
- // Alpine behavior lives here. The vendored build is the CSP-safe variant:
2
- // register components with Alpine.data() and reference methods by name in
3
- // markup; inline expressions are not evaluated.
4
- document.addEventListener("alpine:init", () => {
5
- Alpine.data("counter", () => ({
6
- count: 0,
7
- inc() {
8
- this.count++;
9
- },
10
- }));
11
- });
@@ -1,150 +0,0 @@
1
- /* App styles on top of the vendored shibumi.css tokens (public/vendor/).
2
- Edit freely; this file is yours. Tokens: --paper --ink --muted --line
3
- --accent, type scale --text-xs..--text-2xl, --font-sans/serif/mono. */
4
-
5
- /* The vendored shibumi.css sets a kozo paper background for the sites; apps
6
- stay flat, and this override also stops the browser fetching the image. */
7
- body {
8
- background-image: none;
9
- }
10
-
11
- .scaffold {
12
- max-width: 40.625rem;
13
- margin: 0 auto;
14
- padding: clamp(3rem, 9vh, 6.5rem) 1.5rem 4rem;
15
- }
16
-
17
- .masthead {
18
- display: flex;
19
- align-items: baseline;
20
- gap: 0.6rem;
21
- margin: 0 0 3.5rem;
22
- padding-bottom: 1rem;
23
- border-bottom: 1px solid var(--line);
24
- color: var(--muted);
25
- font-size: var(--text-sm);
26
- letter-spacing: 0.04em;
27
- }
28
-
29
- .masthead-mark {
30
- color: var(--accent);
31
- font-size: var(--text-md);
32
- }
33
-
34
- .scaffold h1 {
35
- margin: 0 0 0.75rem;
36
- font-size: clamp(2.6rem, 7vw, 3.8rem);
37
- font-weight: 450;
38
- letter-spacing: -0.03em;
39
- line-height: 1.05;
40
- }
41
-
42
- .lede {
43
- margin: 0 0 3rem;
44
- max-width: 34rem;
45
- color: var(--muted);
46
- font-size: var(--text-lg);
47
- line-height: 1.55;
48
- }
49
-
50
- .demo {
51
- display: flex;
52
- align-items: center;
53
- gap: 1rem;
54
- margin-bottom: 3.25rem;
55
- }
56
-
57
- .demo button {
58
- font: 500 var(--text-md) var(--font-sans);
59
- padding: 0.5rem 1.3rem;
60
- border: 1px solid var(--ink);
61
- border-radius: 0.35rem;
62
- background: transparent;
63
- color: inherit;
64
- cursor: pointer;
65
- transition: border-color 160ms ease, color 160ms ease;
66
- }
67
-
68
- .demo button:hover,
69
- .demo button:focus-visible {
70
- border-color: var(--accent);
71
- color: var(--accent);
72
- }
73
-
74
- .demo output {
75
- min-width: 2ch;
76
- font-size: var(--text-lg);
77
- font-variant-numeric: tabular-nums;
78
- }
79
-
80
- .demo-hint {
81
- color: var(--muted);
82
- font-size: var(--text-sm);
83
- }
84
-
85
- .endpoints {
86
- margin: 0;
87
- padding: 0;
88
- list-style: none;
89
- border-top: 1px solid var(--line);
90
- }
91
-
92
- main .endpoints a {
93
- display: flex;
94
- align-items: baseline;
95
- justify-content: space-between;
96
- gap: 1.5rem;
97
- padding: 0.9rem 0.25rem;
98
- border-bottom: 1px solid var(--line);
99
- text-decoration: none;
100
- text-decoration-color: transparent;
101
- transition: background 160ms ease;
102
- }
103
-
104
- main .endpoints a:hover,
105
- main .endpoints a:focus-visible {
106
- background: var(--faint);
107
- }
108
-
109
- .endpoint-path {
110
- font-family: var(--font-mono);
111
- font-size: var(--text-sm);
112
- }
113
- /* Inline code as rounded chips on the faint layer. */
114
- .scaffold code {
115
- padding: 0.12em 0.42em;
116
- border-radius: 0.35rem;
117
- background: var(--faint);
118
- font-family: var(--font-mono);
119
- font-size: 0.85em;
120
- }
121
-
122
-
123
- main .endpoints a:hover .endpoint-path {
124
- color: var(--accent);
125
- }
126
-
127
- .endpoints span {
128
- color: var(--muted);
129
- font-size: var(--text-sm);
130
- text-align: right;
131
- }
132
-
133
- .colophon {
134
- margin-top: 3.5rem;
135
- }
136
-
137
- .colophon p {
138
- margin: 0 0 0.5rem;
139
- color: var(--muted);
140
- font-size: var(--text-sm);
141
- line-height: 1.7;
142
- }
143
-
144
- .colophon code {
145
- color: var(--ink);
146
- }
147
-
148
- .colophon-links {
149
- font-size: var(--text-sm);
150
- }