deploy.sh 2.0.0 → 3.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.
- package/.claude/settings.local.json +36 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +105 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +56 -0
- package/.github/workflows/ci.yml +15 -34
- package/.github/workflows/pages.yml +48 -0
- package/.oxfmtrc.json +7 -0
- package/.oxlintrc.json +11 -0
- package/LICENSE +183 -183
- package/README.md +99 -10
- package/app/actions/deployments.ts +82 -0
- package/app/actions/metrics.ts +13 -0
- package/app/root.tsx +60 -0
- package/app/routes/dashboard/detail/history.tsx +73 -0
- package/app/routes/dashboard/detail/layout.tsx +125 -0
- package/app/routes/dashboard/detail/logs.tsx +85 -0
- package/app/routes/dashboard/detail/overview.tsx +119 -0
- package/app/routes/dashboard/detail/requests.tsx +163 -0
- package/app/routes/dashboard/detail/resources.tsx +268 -0
- package/app/routes/dashboard/detail/shared.tsx +59 -0
- package/app/routes/dashboard/index.tsx +360 -0
- package/app/routes/dashboard/layout.tsx +30 -0
- package/app/routes/docs/architecture.tsx +155 -0
- package/app/routes/docs/cli.tsx +122 -0
- package/app/routes/docs/deploying.tsx +105 -0
- package/app/routes/docs/index.tsx +104 -0
- package/app/routes/docs/layout.tsx +58 -0
- package/app/routes/home.tsx +134 -0
- package/app/routes/root.client.tsx +46 -0
- package/app/routes.ts +21 -0
- package/app/styles.css +15 -0
- package/app/theme.css +134 -0
- package/bin/deploy.js +362 -138
- package/docs-site/404.html +33 -0
- package/docs-site/home.tsx +130 -0
- package/docs-site/index.html +35 -0
- package/docs-site/layout.tsx +57 -0
- package/docs-site/main.tsx +41 -0
- package/docs-site/shell.tsx +34 -0
- package/docs-site/styles.css +4 -0
- package/drizzle.config.js +8 -0
- package/examples/docker/Dockerfile +5 -5
- package/examples/docker/server.js +18 -0
- package/examples/node/package.json +3 -11
- package/examples/node/pnpm-lock.yaml +9 -0
- package/examples/node/server.js +12 -0
- package/examples/static/index.html +41 -15
- package/package.json +40 -64
- package/public/favicon.ico +0 -0
- package/react-router-vite/entry.browser.tsx +49 -0
- package/react-router-vite/entry.rsc.single.tsx +7 -0
- package/react-router-vite/entry.rsc.tsx +36 -0
- package/react-router-vite/entry.ssr.tsx +29 -0
- package/react-router-vite/plugin.ts +114 -0
- package/react-router-vite/types.d.ts +11 -0
- package/react-router.config.ts +5 -0
- package/server/api.test.ts +344 -0
- package/server/api.ts +445 -0
- package/server/docker.ts +268 -0
- package/server/index.ts +17 -0
- package/server/metrics-collector.ts +29 -0
- package/server/schema.ts +56 -0
- package/server/store.test.ts +278 -0
- package/server/store.ts +398 -0
- package/tsconfig.json +21 -0
- package/vite.config.ts +45 -0
- package/vite.docs.config.ts +31 -0
- package/.eslintignore +0 -6
- package/.eslintrc +0 -12
- package/.husky/pre-commit +0 -5
- package/.prettierrc +0 -0
- package/.release-it.json +0 -5
- package/CHANGELOG.md +0 -56
- package/__tests__/fixtures/unknown/.gitkeep +0 -0
- package/__tests__/lib/classifier.test.js +0 -49
- package/__tests__/lib/helpers/util.test.js +0 -57
- package/bin/deploy-delete.js +0 -14
- package/bin/deploy-deploy.js +0 -36
- package/bin/deploy-list.js +0 -40
- package/bin/deploy-login.js +0 -43
- package/bin/deploy-logout.js +0 -16
- package/bin/deploy-logs.js +0 -26
- package/bin/deploy-open.js +0 -26
- package/bin/deploy-register.js +0 -45
- package/bin/deploy-server.js +0 -11
- package/bin/deploy-whoami.js +0 -14
- package/examples/docker/index.js +0 -12
- package/examples/node/index.js +0 -8
- package/examples/static/main.css +0 -9
- package/examples/static/out.gifcd +0 -0
- package/generate-docs.js +0 -55
- package/index.js +0 -69
- package/jsdoc.json +0 -27
- package/lib/classifier.js +0 -63
- package/lib/deploy.js +0 -70
- package/lib/helpers/cli.js +0 -262
- package/lib/helpers/util.js +0 -140
- package/lib/models/deployment.js +0 -474
- package/lib/models/request.js +0 -101
- package/lib/models/user.js +0 -147
- package/lib/server.js +0 -211
- package/lib/static/not-found.html +0 -30
- package/lib/static/page-could-not-load.html +0 -30
- package/lib/static/static-server.js +0 -70
- package/website/README.md +0 -41
- package/website/babel.config.js +0 -3
- package/website/docs/api/_category_.yml +0 -1
- package/website/docs/api/lib/classifier.js.md +0 -11
- package/website/docs/api/lib/deploy.js.md +0 -13
- package/website/docs/api/lib/helpers/cli.js.md +0 -193
- package/website/docs/api/lib/helpers/util.js.md +0 -65
- package/website/docs/api/lib/models/deployment.js.md +0 -171
- package/website/docs/api/lib/models/request.js.md +0 -67
- package/website/docs/api/lib/models/user.js.md +0 -92
- package/website/docs/api/lib/server.js.md +0 -0
- package/website/docs/api/lib/static/static-server.js.md +0 -0
- package/website/docs/intro.md +0 -57
- package/website/docusaurus.config.js +0 -82
- package/website/package-lock.json +0 -25218
- package/website/package.json +0 -39
- package/website/sidebars.js +0 -31
- package/website/src/components/HomepageFeatures/index.js +0 -79
- package/website/src/components/HomepageFeatures/styles.module.css +0 -11
- package/website/src/css/custom.css +0 -39
- package/website/src/pages/index.js +0 -57
- package/website/src/pages/index.module.css +0 -23
- package/website/static/.nojekyll +0 -0
- package/website/static/example.gif +0 -0
- package/website/static/example.mov +0 -0
- package/website/static/img/favicon.ico +0 -0
- package/website/static/img/intro/deploy.png +0 -0
- package/website/static/img/intro/logs.png +0 -0
- package/website/static/img/logo.png +0 -0
- package/website/static/img/logo.pxm +0 -0
- package/website/static/img/logo@2x.png +0 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Link } from 'react-router';
|
|
2
|
+
|
|
3
|
+
export default function Component() {
|
|
4
|
+
return (
|
|
5
|
+
<main className="max-w-7xl mx-auto px-6">
|
|
6
|
+
<section className="py-20 max-w-2xl">
|
|
7
|
+
<p className="text-sm font-medium text-accent mb-4">Self-hosted deployment platform</p>
|
|
8
|
+
<h1 className="text-4xl font-bold tracking-tight leading-tight mb-5">
|
|
9
|
+
Deploy from your own server.
|
|
10
|
+
<br />
|
|
11
|
+
<span className="text-text-secondary">No cloud provider needed.</span>
|
|
12
|
+
</h1>
|
|
13
|
+
<p className="text-text-secondary leading-relaxed mb-8">
|
|
14
|
+
deploy.sh turns any machine into a deployment platform. Push your code, and it handles
|
|
15
|
+
building, containerization, and routing. Node.js apps, Docker containers, static
|
|
16
|
+
sites—all managed through a single dashboard.
|
|
17
|
+
</p>
|
|
18
|
+
<div className="flex gap-3">
|
|
19
|
+
<Link to="/docs" className="btn btn-primary">
|
|
20
|
+
Read the docs
|
|
21
|
+
</Link>
|
|
22
|
+
<Link to="/dashboard" className="btn">
|
|
23
|
+
Open dashboard
|
|
24
|
+
</Link>
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
|
|
28
|
+
<section className="border-t border-border py-16">
|
|
29
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-px bg-border rounded-xl overflow-hidden border border-border">
|
|
30
|
+
<div className="bg-bg-surface p-6">
|
|
31
|
+
<div className="text-xs font-mono text-accent mb-3">01</div>
|
|
32
|
+
<h3 className="text-sm font-semibold mb-2">Push your code</h3>
|
|
33
|
+
<p className="text-sm text-text-secondary leading-relaxed">
|
|
34
|
+
Bundle your project and upload it. deploy.sh auto-detects whether it's a Node.js
|
|
35
|
+
app, Docker container, or static site.
|
|
36
|
+
</p>
|
|
37
|
+
</div>
|
|
38
|
+
<div className="bg-bg-surface p-6">
|
|
39
|
+
<div className="text-xs font-mono text-accent mb-3">02</div>
|
|
40
|
+
<h3 className="text-sm font-semibold mb-2">Automatic builds</h3>
|
|
41
|
+
<p className="text-sm text-text-secondary leading-relaxed">
|
|
42
|
+
A Dockerfile is generated if needed, the image is built, and a container is started
|
|
43
|
+
with an allocated port.
|
|
44
|
+
</p>
|
|
45
|
+
</div>
|
|
46
|
+
<div className="bg-bg-surface p-6">
|
|
47
|
+
<div className="text-xs font-mono text-accent mb-3">03</div>
|
|
48
|
+
<h3 className="text-sm font-semibold mb-2">Manage everything</h3>
|
|
49
|
+
<p className="text-sm text-text-secondary leading-relaxed">
|
|
50
|
+
View logs, monitor status, scale, or tear down deployments from the dashboard or CLI.
|
|
51
|
+
Your server, your rules.
|
|
52
|
+
</p>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</section>
|
|
56
|
+
|
|
57
|
+
<section className="border-t border-border py-16">
|
|
58
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-12">
|
|
59
|
+
<div>
|
|
60
|
+
<h2 className="text-lg font-semibold mb-4">Why self-host?</h2>
|
|
61
|
+
<ul className="space-y-3">
|
|
62
|
+
<li className="flex gap-3 text-sm text-text-secondary">
|
|
63
|
+
<span className="text-accent shrink-0 mt-0.5">✓</span>
|
|
64
|
+
<span>
|
|
65
|
+
<strong className="text-text">No vendor lock-in.</strong> Run on any Linux
|
|
66
|
+
machine, old laptop, Raspberry Pi, or rack server.
|
|
67
|
+
</span>
|
|
68
|
+
</li>
|
|
69
|
+
<li className="flex gap-3 text-sm text-text-secondary">
|
|
70
|
+
<span className="text-accent shrink-0 mt-0.5">✓</span>
|
|
71
|
+
<span>
|
|
72
|
+
<strong className="text-text">No monthly bills.</strong> Use hardware you already
|
|
73
|
+
own. No per-seat pricing, no compute charges.
|
|
74
|
+
</span>
|
|
75
|
+
</li>
|
|
76
|
+
<li className="flex gap-3 text-sm text-text-secondary">
|
|
77
|
+
<span className="text-accent shrink-0 mt-0.5">✓</span>
|
|
78
|
+
<span>
|
|
79
|
+
<strong className="text-text">Full control.</strong> Your data stays on your
|
|
80
|
+
machine. Inspect and modify the platform itself.
|
|
81
|
+
</span>
|
|
82
|
+
</li>
|
|
83
|
+
<li className="flex gap-3 text-sm text-text-secondary">
|
|
84
|
+
<span className="text-accent shrink-0 mt-0.5">✓</span>
|
|
85
|
+
<span>
|
|
86
|
+
<strong className="text-text">Open source.</strong> MIT licensed. Read the code,
|
|
87
|
+
contribute, fork it.
|
|
88
|
+
</span>
|
|
89
|
+
</li>
|
|
90
|
+
</ul>
|
|
91
|
+
</div>
|
|
92
|
+
<div>
|
|
93
|
+
<h2 className="text-lg font-semibold mb-4">Quick start</h2>
|
|
94
|
+
<div className="rounded-xl border border-border bg-bg-surface overflow-hidden">
|
|
95
|
+
<div className="flex items-center gap-2 px-4 py-2.5 border-b border-border">
|
|
96
|
+
<div className="w-2.5 h-2.5 rounded-full bg-text-tertiary/30" />
|
|
97
|
+
<div className="w-2.5 h-2.5 rounded-full bg-text-tertiary/30" />
|
|
98
|
+
<div className="w-2.5 h-2.5 rounded-full bg-text-tertiary/30" />
|
|
99
|
+
<span className="text-xs text-text-tertiary ml-2 font-mono">terminal</span>
|
|
100
|
+
</div>
|
|
101
|
+
<pre className="p-4 text-sm font-mono leading-relaxed text-text-secondary overflow-x-auto">
|
|
102
|
+
<code>
|
|
103
|
+
<span className="text-text-tertiary">$</span>{' '}
|
|
104
|
+
<span className="text-text">git clone</span>{' '}
|
|
105
|
+
<span className="text-accent">https://github.com/gabrielcsapo/deploy.sh.git</span>
|
|
106
|
+
{'\n'}
|
|
107
|
+
<span className="text-text-tertiary">$</span>{' '}
|
|
108
|
+
<span className="text-text">cd</span> deploy.sh{'\n'}
|
|
109
|
+
<span className="text-text-tertiary">$</span>{' '}
|
|
110
|
+
<span className="text-text">npm install</span>
|
|
111
|
+
{'\n'}
|
|
112
|
+
<span className="text-text-tertiary">$</span>{' '}
|
|
113
|
+
<span className="text-text">npm run server</span>
|
|
114
|
+
{'\n'}
|
|
115
|
+
<span className="text-success">✓</span>{' '}
|
|
116
|
+
<span className="text-text-tertiary">API running at http://localhost:5050</span>
|
|
117
|
+
{'\n'}
|
|
118
|
+
{'\n'}
|
|
119
|
+
<span className="text-text-tertiary">$</span>{' '}
|
|
120
|
+
<span className="text-text">npm run dev</span>
|
|
121
|
+
{'\n'}
|
|
122
|
+
<span className="text-success">✓</span>{' '}
|
|
123
|
+
<span className="text-text-tertiary">
|
|
124
|
+
Dashboard running at http://localhost:5173
|
|
125
|
+
</span>
|
|
126
|
+
</code>
|
|
127
|
+
</pre>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
</section>
|
|
132
|
+
</main>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useNavigation, useRouteError } from 'react-router';
|
|
4
|
+
|
|
5
|
+
export function GlobalNavigationLoadingBar() {
|
|
6
|
+
const navigation = useNavigation();
|
|
7
|
+
|
|
8
|
+
if (navigation.state === 'idle') return null;
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<div className="h-0.5 w-full bg-bg-surface overflow-hidden fixed top-0 left-0 z-50">
|
|
12
|
+
<div className="animate-progress origin-[0%_50%] w-full h-full bg-accent" />
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function DumpError() {
|
|
18
|
+
const error = useRouteError();
|
|
19
|
+
const message =
|
|
20
|
+
error instanceof Error ? (
|
|
21
|
+
<div>
|
|
22
|
+
<pre className="text-sm bg-bg border border-border rounded-lg p-4 overflow-auto">
|
|
23
|
+
{JSON.stringify(
|
|
24
|
+
{
|
|
25
|
+
...error,
|
|
26
|
+
name: error.name,
|
|
27
|
+
message: error.message,
|
|
28
|
+
},
|
|
29
|
+
null,
|
|
30
|
+
2,
|
|
31
|
+
)}
|
|
32
|
+
</pre>
|
|
33
|
+
{error.stack && (
|
|
34
|
+
<pre className="text-xs text-text-tertiary mt-4 overflow-auto">{error.stack}</pre>
|
|
35
|
+
)}
|
|
36
|
+
</div>
|
|
37
|
+
) : (
|
|
38
|
+
<div className="text-sm text-text-secondary">Unknown Error</div>
|
|
39
|
+
);
|
|
40
|
+
return (
|
|
41
|
+
<div className="max-w-7xl mx-auto px-6 py-16">
|
|
42
|
+
<h1 className="text-lg font-semibold text-danger mb-4">Something went wrong</h1>
|
|
43
|
+
{message}
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
package/app/routes.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type RouteConfig, index, route } from '@react-router/dev/routes';
|
|
2
|
+
|
|
3
|
+
export default [
|
|
4
|
+
index('routes/home.tsx'),
|
|
5
|
+
route('docs', 'routes/docs/layout.tsx', [
|
|
6
|
+
index('routes/docs/index.tsx'),
|
|
7
|
+
route('deploying', 'routes/docs/deploying.tsx'),
|
|
8
|
+
route('cli', 'routes/docs/cli.tsx'),
|
|
9
|
+
route('architecture', 'routes/docs/architecture.tsx'),
|
|
10
|
+
]),
|
|
11
|
+
route('dashboard', 'routes/dashboard/layout.tsx', [
|
|
12
|
+
index('routes/dashboard/index.tsx'),
|
|
13
|
+
route(':name', 'routes/dashboard/detail/layout.tsx', [
|
|
14
|
+
index('routes/dashboard/detail/overview.tsx'),
|
|
15
|
+
route('logs', 'routes/dashboard/detail/logs.tsx'),
|
|
16
|
+
route('requests', 'routes/dashboard/detail/requests.tsx'),
|
|
17
|
+
route('resources', 'routes/dashboard/detail/resources.tsx'),
|
|
18
|
+
route('history', 'routes/dashboard/detail/history.tsx'),
|
|
19
|
+
]),
|
|
20
|
+
]),
|
|
21
|
+
] satisfies RouteConfig;
|
package/app/styles.css
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@import 'tailwindcss';
|
|
2
|
+
@plugin '@tailwindcss/typography';
|
|
3
|
+
@import './theme.css';
|
|
4
|
+
|
|
5
|
+
@utility vt-name {
|
|
6
|
+
view-transition-name: var(--vt-name);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@utility no-vt {
|
|
10
|
+
view-transition-name: none;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@view-transition {
|
|
14
|
+
navigation: auto;
|
|
15
|
+
}
|
package/app/theme.css
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
@theme {
|
|
2
|
+
--font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
3
|
+
--font-mono:
|
|
4
|
+
'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;
|
|
5
|
+
|
|
6
|
+
--color-bg: hsl(250 24% 9%);
|
|
7
|
+
--color-bg-surface: hsl(250 21% 11%);
|
|
8
|
+
--color-bg-hover: hsl(250 20% 14%);
|
|
9
|
+
--color-bg-active: hsl(250 18% 17%);
|
|
10
|
+
|
|
11
|
+
--color-border: hsl(250 15% 20%);
|
|
12
|
+
--color-border-hover: hsl(250 15% 28%);
|
|
13
|
+
|
|
14
|
+
--color-text: hsl(0 0% 98%);
|
|
15
|
+
--color-text-secondary: hsl(250 10% 60%);
|
|
16
|
+
--color-text-tertiary: hsl(250 10% 42%);
|
|
17
|
+
|
|
18
|
+
--color-accent: hsl(262 83% 68%);
|
|
19
|
+
--color-accent-hover: hsl(262 83% 74%);
|
|
20
|
+
|
|
21
|
+
--color-success: hsl(142 60% 55%);
|
|
22
|
+
--color-warning: hsl(38 92% 60%);
|
|
23
|
+
--color-danger: hsl(0 72% 60%);
|
|
24
|
+
|
|
25
|
+
--animate-progress: progress 1s infinite linear;
|
|
26
|
+
|
|
27
|
+
@keyframes progress {
|
|
28
|
+
0% {
|
|
29
|
+
transform: translateX(0) scaleX(0);
|
|
30
|
+
}
|
|
31
|
+
40% {
|
|
32
|
+
transform: translateX(0) scaleX(0.4);
|
|
33
|
+
}
|
|
34
|
+
100% {
|
|
35
|
+
transform: translateX(100%) scaleX(0.5);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@layer base {
|
|
41
|
+
html {
|
|
42
|
+
@apply bg-bg text-text antialiased;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
body {
|
|
46
|
+
@apply min-h-screen;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
::selection {
|
|
50
|
+
@apply bg-accent/30;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@layer components {
|
|
55
|
+
.btn {
|
|
56
|
+
@apply inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors;
|
|
57
|
+
@apply bg-bg-surface border border-border text-text;
|
|
58
|
+
@apply hover:bg-bg-hover hover:border-border-hover;
|
|
59
|
+
@apply disabled:opacity-50 disabled:pointer-events-none;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.btn-primary {
|
|
63
|
+
@apply bg-accent text-white border-accent;
|
|
64
|
+
@apply hover:bg-accent-hover hover:border-accent-hover;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.btn-danger {
|
|
68
|
+
@apply bg-danger/10 text-danger border-danger/30;
|
|
69
|
+
@apply hover:bg-danger/20;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.btn-sm {
|
|
73
|
+
@apply px-3 py-1.5 text-xs;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.card {
|
|
77
|
+
@apply rounded-xl border border-border bg-bg-surface;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.input {
|
|
81
|
+
@apply w-full rounded-lg border border-border bg-bg px-3 py-2 text-sm text-text placeholder:text-text-tertiary;
|
|
82
|
+
@apply focus:outline-none focus:border-accent focus:ring-1 focus:ring-accent/50;
|
|
83
|
+
@apply disabled:opacity-50;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.badge {
|
|
87
|
+
@apply inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.badge-success {
|
|
91
|
+
@apply bg-success/10 text-success;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.badge-warning {
|
|
95
|
+
@apply bg-warning/10 text-warning;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.badge-danger {
|
|
99
|
+
@apply bg-danger/10 text-danger;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Dark theme overrides for @tailwindcss/typography prose */
|
|
104
|
+
.prose {
|
|
105
|
+
--tw-prose-body: var(--color-text-secondary);
|
|
106
|
+
--tw-prose-headings: var(--color-text);
|
|
107
|
+
--tw-prose-links: var(--color-accent);
|
|
108
|
+
--tw-prose-bold: var(--color-text);
|
|
109
|
+
--tw-prose-counters: var(--color-text-tertiary);
|
|
110
|
+
--tw-prose-bullets: var(--color-text-tertiary);
|
|
111
|
+
--tw-prose-hr: var(--color-border);
|
|
112
|
+
--tw-prose-quotes: var(--color-text-secondary);
|
|
113
|
+
--tw-prose-code: var(--color-text);
|
|
114
|
+
--tw-prose-pre-code: var(--color-text-secondary);
|
|
115
|
+
--tw-prose-pre-bg: var(--color-bg);
|
|
116
|
+
--tw-prose-th-borders: var(--color-border);
|
|
117
|
+
--tw-prose-td-borders: var(--color-border);
|
|
118
|
+
|
|
119
|
+
:where(a):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
|
|
120
|
+
text-decoration: none;
|
|
121
|
+
}
|
|
122
|
+
:where(a):not(:where([class~='not-prose'], [class~='not-prose'] *)):hover {
|
|
123
|
+
color: var(--color-accent-hover);
|
|
124
|
+
}
|
|
125
|
+
:where(code):not(:where(pre *, [class~='not-prose'], [class~='not-prose'] *)) {
|
|
126
|
+
@apply rounded bg-bg-hover px-1.5 py-0.5 font-mono text-sm;
|
|
127
|
+
}
|
|
128
|
+
:where(pre):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
|
|
129
|
+
@apply rounded-lg border border-border;
|
|
130
|
+
}
|
|
131
|
+
:where(th):not(:where([class~='not-prose'], [class~='not-prose'] *)) {
|
|
132
|
+
color: var(--color-text);
|
|
133
|
+
}
|
|
134
|
+
}
|