careermate 0.0.5 → 0.0.7
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/AGENTS.md +13 -10
- package/INSTALL.md +16 -15
- package/README.md +24 -24
- package/THIRD_PARTY_NOTICES.md +2 -3
- package/bin/careermate.mjs +8 -1
- package/dist/career-os/README.md +12 -6
- package/dist/career-os/eop/career-description.md +139 -0
- package/dist/career-os/eop/cover-letter.md +10 -5
- package/dist/career-os/eop/fit-analysis.md +16 -6
- package/dist/career-os/eop/interview-prep.md +209 -21
- package/dist/career-os/eop/job-analysis.md +6 -4
- package/dist/career-os/eop/profile-extraction.md +5 -4
- package/dist/career-os/knowledge/cover-letter.md +5 -4
- package/dist/career-os/knowledge/fit-matching.md +8 -8
- package/dist/career-os/knowledge/human-writing.md +2 -0
- package/dist/career-os/knowledge/interview-behavioral.md +76 -8
- package/dist/career-os/knowledge/interview-technical.md +106 -4
- package/dist/career-os/knowledge/linkedin-profile.md +1 -1
- package/dist/career-os/knowledge/networking-referrals.md +1 -1
- package/dist/career-os/knowledge/offer-evaluation-decision.md +10 -10
- package/dist/career-os/knowledge/portfolio.md +3 -3
- package/dist/career-os/knowledge/verifiers/ats-compat.md +8 -4
- package/dist/career-os/knowledge/verifiers/human-voice.md +4 -2
- package/dist/career-os/knowledge/verifiers/recency-staleness.md +1 -1
- package/dist/career-os/knowledge/verifiers/responsiveness-on-target.md +2 -2
- package/dist/career-os/knowledge/verifiers/truthfulness.md +1 -1
- package/dist/doctor.mjs +692 -71
- package/dist/mcp.mjs +710 -71
- package/dist/migrate.mjs +52 -1
- package/dist/public/app.js +42 -16
- package/dist/public/i18n/en/applications.js +23 -0
- package/dist/public/i18n/en/common.js +22 -0
- package/dist/public/i18n/en/documents.js +133 -0
- package/dist/public/i18n/en/home.js +75 -0
- package/dist/public/i18n/en/interview.js +69 -0
- package/dist/public/i18n/en/jobs.js +152 -0
- package/dist/public/i18n/en/nav.js +18 -0
- package/dist/public/i18n/en/profile.js +201 -0
- package/dist/public/i18n/en/settings.js +127 -0
- package/dist/public/i18n/en/status.js +22 -0
- package/dist/public/i18n/en.js +17 -0
- package/dist/public/i18n/ko/applications.js +23 -0
- package/dist/public/i18n/ko/common.js +22 -0
- package/dist/public/i18n/ko/documents.js +133 -0
- package/dist/public/i18n/ko/home.js +63 -0
- package/dist/public/i18n/ko/interview.js +69 -0
- package/dist/public/i18n/ko/jobs.js +152 -0
- package/dist/public/i18n/ko/nav.js +18 -0
- package/dist/public/i18n/ko/profile.js +201 -0
- package/dist/public/i18n/ko/settings.js +127 -0
- package/dist/public/i18n/ko/status.js +23 -0
- package/dist/public/i18n/ko.js +18 -0
- package/dist/public/i18n.js +55 -0
- package/dist/public/index.html +1 -0
- package/dist/public/lib.js +24 -17
- package/dist/public/pages/applications.js +17 -21
- package/dist/public/pages/documents.js +153 -107
- package/dist/public/pages/home.js +88 -53
- package/dist/public/pages/interview.js +105 -51
- package/dist/public/pages/jobs.js +330 -106
- package/dist/public/pages/profile.js +157 -152
- package/dist/public/pages/settings.js +154 -102
- package/dist/public/styles.css +28 -1
- package/dist/web.mjs +495 -75
- package/docs/FAQ.md +23 -3
- package/docs/MCP_TOOLS.md +22 -13
- package/docs/START_WORKFLOW.md +3 -3
- package/docs/SUPPORTED_AI_APPS.md +13 -0
- package/docs/WORKFLOWS.md +77 -20
- package/docs/career-os/README.md +12 -6
- package/docs/career-os/eop/career-description.md +139 -0
- package/docs/career-os/eop/cover-letter.md +10 -5
- package/docs/career-os/eop/fit-analysis.md +16 -6
- package/docs/career-os/eop/interview-prep.md +209 -21
- package/docs/career-os/eop/job-analysis.md +6 -4
- package/docs/career-os/eop/profile-extraction.md +5 -4
- package/docs/career-os/knowledge/cover-letter.md +5 -4
- package/docs/career-os/knowledge/fit-matching.md +8 -8
- package/docs/career-os/knowledge/human-writing.md +2 -0
- package/docs/career-os/knowledge/interview-behavioral.md +76 -8
- package/docs/career-os/knowledge/interview-technical.md +106 -4
- package/docs/career-os/knowledge/linkedin-profile.md +1 -1
- package/docs/career-os/knowledge/networking-referrals.md +1 -1
- package/docs/career-os/knowledge/offer-evaluation-decision.md +10 -10
- package/docs/career-os/knowledge/portfolio.md +3 -3
- package/docs/career-os/knowledge/verifiers/ats-compat.md +8 -4
- package/docs/career-os/knowledge/verifiers/human-voice.md +4 -2
- package/docs/career-os/knowledge/verifiers/recency-staleness.md +1 -1
- package/docs/career-os/knowledge/verifiers/responsiveness-on-target.md +2 -2
- package/docs/career-os/knowledge/verifiers/truthfulness.md +1 -1
- package/package.json +2 -2
- package/packages/core/src/onboarding.ts +2 -1
- package/packages/core/src/services.ts +134 -17
- package/packages/core/src/summary.ts +59 -1
- package/packages/core/src/verify/lint.ts +4 -0
- package/packages/db/src/index.ts +1 -0
- package/packages/db/src/repositories.ts +0 -0
- package/packages/db/src/schema.ts +17 -0
- package/packages/exporters/src/index.ts +28 -17
- package/packages/knowledge/src/index.ts +55 -9
- package/packages/mcp-tools/src/tools.ts +250 -24
- package/packages/mcp-tools/src/update.ts +30 -15
- package/packages/parsers/src/documents.ts +12 -1
- package/packages/prompts/src/humanize.ts +46 -0
- package/packages/prompts/src/index.ts +5 -1
- package/packages/prompts/src/install.ts +4 -4
- package/packages/prompts/src/onboarding.ts +4 -4
- package/packages/prompts/src/system.ts +9 -7
- package/packages/shared/src/enums.ts +14 -4
- package/packages/shared/src/schemas.ts +41 -0
- package/packages/workflows/src/definitions.ts +45 -8
- package/scripts/init.ts +284 -13
- package/dist/site/analytics.js +0 -97
- package/dist/site/favicon.svg +0 -1
- package/dist/site/fonts/PretendardVariable.woff2 +0 -0
- package/dist/site/icon-180.png +0 -0
- package/dist/site/icon-512.png +0 -0
- package/dist/site/index.html +0 -465
- package/dist/site/landing.js +0 -163
- package/dist/site/llms-install.txt +0 -218
- package/dist/site/robots.txt +0 -4
- package/dist/site/sitemap.xml +0 -21
- package/dist/site/start.html +0 -356
- package/dist/site/style.css +0 -665
- package/dist/site/vercel.json +0 -20
package/dist/site/style.css
DELETED
|
@@ -1,665 +0,0 @@
|
|
|
1
|
-
/* =============================================================================
|
|
2
|
-
CareerMate — public landing / install page.
|
|
3
|
-
Self-contained: no external fonts, no CDN, no network (works fully offline).
|
|
4
|
-
|
|
5
|
-
Design language synthesized from established install/registry sites
|
|
6
|
-
(Homebrew, Bun, npm, MCP docs), not copied from any one:
|
|
7
|
-
· restraint over decoration — one flat accent, warm-neutral paper, no
|
|
8
|
-
gradients / glows / gradient-text
|
|
9
|
-
· the two install paths (.mcpb one-click / terminal) are the focal point
|
|
10
|
-
· system sans for prose, monospace for commands → reads as a real tool
|
|
11
|
-
· trust through whitespace, hairlines and consistency
|
|
12
|
-
Light + dark (system preference or manual toggle).
|
|
13
|
-
========================================================================== */
|
|
14
|
-
|
|
15
|
-
/* Self-hosted brand font — the SAME face the dashboard ships (apps/web), so the
|
|
16
|
-
landing prose and the embedded dashboard screenshots read as one product.
|
|
17
|
-
Without this the page silently falls back to Segoe UI / 맑은 고딕 on machines
|
|
18
|
-
that don't have Pretendard installed. */
|
|
19
|
-
@font-face {
|
|
20
|
-
font-family: 'Pretendard Variable';
|
|
21
|
-
font-weight: 45 920;
|
|
22
|
-
font-style: normal;
|
|
23
|
-
font-display: swap;
|
|
24
|
-
/* relative URL: resolves under the site root (Vercel) AND under /install/ when
|
|
25
|
-
the local dashboard serves this same page. */
|
|
26
|
-
src: local('Pretendard Variable'),
|
|
27
|
-
url('fonts/PretendardVariable.woff2') format('woff2');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
:root {
|
|
31
|
-
/* quiet green-neutral system (light) */
|
|
32
|
-
--bg: #f7f8f5;
|
|
33
|
-
--bg-elev: #ffffff;
|
|
34
|
-
--bg-subtle: #eef3ed;
|
|
35
|
-
--bg-sunken: #e8ede8;
|
|
36
|
-
--surface: #ffffff;
|
|
37
|
-
--surface-hover: #f1f5f0;
|
|
38
|
-
--border: #dfe5dc;
|
|
39
|
-
--border-strong: #cbd5ca;
|
|
40
|
-
--text: #171a16;
|
|
41
|
-
--text-secondary: #50584f;
|
|
42
|
-
--text-tertiary: #7d877b;
|
|
43
|
-
|
|
44
|
-
/* signature accent — deep emerald, kept from the existing product */
|
|
45
|
-
--accent: #0f7256;
|
|
46
|
-
--accent-hover: #0b5b44;
|
|
47
|
-
--accent-soft: #e7f1ec;
|
|
48
|
-
--accent-border: #bcdccd;
|
|
49
|
-
--text-on-accent: #ffffff;
|
|
50
|
-
--support-blue: #2f6fed;
|
|
51
|
-
--support-blue-soft: #edf4ff;
|
|
52
|
-
--support-amber: #b46917;
|
|
53
|
-
--support-amber-soft: #fff5e7;
|
|
54
|
-
|
|
55
|
-
--code-bg: #f2f5ef;
|
|
56
|
-
--code-text: #20261f;
|
|
57
|
-
--warn-bg: #fbf3e3;
|
|
58
|
-
--warn-border: #ecd9ac;
|
|
59
|
-
--warn-text: #876214;
|
|
60
|
-
|
|
61
|
-
--shadow-sm: 0 1px 2px rgba(28,26,22,.05);
|
|
62
|
-
--shadow-md: 0 4px 14px rgba(28,26,22,.07);
|
|
63
|
-
|
|
64
|
-
--radius-sm: 6px;
|
|
65
|
-
--radius: 9px;
|
|
66
|
-
--radius-lg: 12px;
|
|
67
|
-
--maxw: 1000px;
|
|
68
|
-
|
|
69
|
-
--font: 'Pretendard Variable', Pretendard, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Malgun Gothic',
|
|
70
|
-
'Apple SD Gothic Neo', 'Noto Sans KR', Roboto, sans-serif;
|
|
71
|
-
--mono: 'Cascadia Code', 'SFMono-Regular', 'JetBrains Mono', Consolas, 'D2Coding', ui-monospace, monospace;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@media (prefers-color-scheme: dark) {
|
|
75
|
-
:root:not([data-theme='light']) { color-scheme: dark; }
|
|
76
|
-
}
|
|
77
|
-
:root[data-theme='dark'] { color-scheme: dark; }
|
|
78
|
-
|
|
79
|
-
@media (prefers-color-scheme: dark) {
|
|
80
|
-
:root:not([data-theme='light']) {
|
|
81
|
-
--bg: #111513; --bg-elev: #171c19; --bg-subtle: #1d241f; --bg-sunken: #0c100e;
|
|
82
|
-
--surface: #171c19; --surface-hover: #202822;
|
|
83
|
-
--border: #2a332e; --border-strong: #3a463f;
|
|
84
|
-
--text: #eef4ed; --text-secondary: #aab5a9; --text-tertiary: #788579;
|
|
85
|
-
--accent: #34d399; --accent-hover: #6ee7b7; --accent-soft: #11281d; --accent-border: #1f4f3c; --text-on-accent: #05241a;
|
|
86
|
-
--support-blue: #75a7ff; --support-blue-soft: #10213a;
|
|
87
|
-
--support-amber: #f0b76a; --support-amber-soft: #33230e;
|
|
88
|
-
--code-bg: #0c100e; --code-text: #d9e3d7;
|
|
89
|
-
--warn-bg: #292008; --warn-border: #574510; --warn-text: #e6c578;
|
|
90
|
-
--shadow-sm: 0 1px 2px rgba(0,0,0,.4); --shadow-md: 0 4px 14px rgba(0,0,0,.45);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
:root[data-theme='dark'] {
|
|
94
|
-
--bg: #111513; --bg-elev: #171c19; --bg-subtle: #1d241f; --bg-sunken: #0c100e;
|
|
95
|
-
--surface: #171c19; --surface-hover: #202822;
|
|
96
|
-
--border: #2a332e; --border-strong: #3a463f;
|
|
97
|
-
--text: #eef4ed; --text-secondary: #aab5a9; --text-tertiary: #788579;
|
|
98
|
-
--accent: #34d399; --accent-hover: #6ee7b7; --accent-soft: #11281d; --accent-border: #1f4f3c;
|
|
99
|
-
--support-blue: #75a7ff; --support-blue-soft: #10213a;
|
|
100
|
-
--support-amber: #f0b76a; --support-amber-soft: #33230e;
|
|
101
|
-
--code-bg: #0c100e; --code-text: #d9e3d7;
|
|
102
|
-
--warn-bg: #292008; --warn-border: #574510; --warn-text: #e6c578;
|
|
103
|
-
--shadow-sm: 0 1px 2px rgba(0,0,0,.4); --shadow-md: 0 4px 14px rgba(0,0,0,.45);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
* { box-sizing: border-box; }
|
|
107
|
-
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
|
|
108
|
-
body {
|
|
109
|
-
margin: 0; background: var(--bg); color: var(--text);
|
|
110
|
-
font-family: var(--font); font-size: 16px; line-height: 1.65;
|
|
111
|
-
word-break: keep-all; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;
|
|
112
|
-
}
|
|
113
|
-
h1, h2, h3, h4 { margin: 0; font-weight: 650; letter-spacing: 0; line-height: 1.25; }
|
|
114
|
-
p { margin: 0; }
|
|
115
|
-
a { color: var(--accent); text-decoration: none; }
|
|
116
|
-
a:hover { text-decoration: underline; }
|
|
117
|
-
code { font-family: var(--mono); }
|
|
118
|
-
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
|
|
119
|
-
::selection { background: color-mix(in srgb, var(--accent) 22%, transparent); }
|
|
120
|
-
/* skip link — hidden until focused, then drops into the top-left */
|
|
121
|
-
.skip-link { position: fixed; top: 8px; left: 8px; z-index: 200; transform: translateY(-200%);
|
|
122
|
-
background: var(--accent); color: var(--text-on-accent); padding: 8px 14px; border-radius: var(--radius-sm);
|
|
123
|
-
font-weight: 600; transition: transform .15s; }
|
|
124
|
-
.skip-link:focus { transform: none; outline: 2px solid var(--text-on-accent); outline-offset: 2px; }
|
|
125
|
-
/* agent-prompt paste boxes: a caption so they read as "message to the AI", not a shell command,
|
|
126
|
-
plus the privacy reassurance at the highest-anxiety paste moment */
|
|
127
|
-
.paste-note { font-size: .86rem; line-height: 1.55; color: var(--text-secondary);
|
|
128
|
-
background: var(--accent-soft); border: 1px solid var(--accent-border); border-radius: var(--radius-sm);
|
|
129
|
-
padding: .55rem .8rem; margin: 0 0 .5rem; }
|
|
130
|
-
.paste-note strong { color: var(--text); font-weight: 650; }
|
|
131
|
-
.recover { font-size: .88rem; line-height: 1.55; color: var(--text-secondary); margin: .5rem 0 0; }
|
|
132
|
-
.recover strong { color: var(--text); }
|
|
133
|
-
|
|
134
|
-
.accent { color: var(--accent); }
|
|
135
|
-
.nowrap { white-space: nowrap; }
|
|
136
|
-
|
|
137
|
-
/* ----------------------------------------------------------------- nav */
|
|
138
|
-
.nav {
|
|
139
|
-
position: sticky; top: 0; z-index: 50;
|
|
140
|
-
display: flex; align-items: center; gap: 18px;
|
|
141
|
-
max-width: var(--maxw); margin: 0 auto; padding: 15px 24px;
|
|
142
|
-
background: color-mix(in srgb, var(--bg) 85%, transparent);
|
|
143
|
-
backdrop-filter: saturate(120%) blur(8px);
|
|
144
|
-
border-bottom: 1px solid var(--border);
|
|
145
|
-
}
|
|
146
|
-
.nav__brand { display: inline-flex; align-items: center; gap: 9px; color: var(--text); font-weight: 700; }
|
|
147
|
-
.nav__brand:hover { text-decoration: none; }
|
|
148
|
-
.nav__logo {
|
|
149
|
-
width: 24px; height: 24px; border-radius: 6px; flex: none;
|
|
150
|
-
background: var(--accent); color: var(--text-on-accent); font-weight: 800; font-size: 13px;
|
|
151
|
-
display: grid; place-items: center;
|
|
152
|
-
}
|
|
153
|
-
.nav__name { font-size: 15.5px; font-family: var(--mono); letter-spacing: 0; }
|
|
154
|
-
.nav__links { display: flex; gap: 2px; margin-left: 12px; }
|
|
155
|
-
.nav__links a {
|
|
156
|
-
color: var(--text-secondary); font-size: 14px; font-weight: 500;
|
|
157
|
-
padding: 6px 10px; border-radius: var(--radius-sm);
|
|
158
|
-
}
|
|
159
|
-
.nav__links a:hover { color: var(--text); background: var(--surface-hover); text-decoration: none; }
|
|
160
|
-
.nav__actions { margin-left: auto; display: flex; align-items: center; gap: 8px; }
|
|
161
|
-
|
|
162
|
-
.theme-toggle {
|
|
163
|
-
width: 34px; height: 34px; display: grid; place-items: center;
|
|
164
|
-
border: 1px solid var(--border-strong); background: var(--surface); border-radius: var(--radius-sm);
|
|
165
|
-
color: var(--text-secondary); cursor: pointer; transition: background .15s, color .15s;
|
|
166
|
-
}
|
|
167
|
-
.theme-toggle:hover { background: var(--surface-hover); color: var(--text); }
|
|
168
|
-
.theme-toggle svg { width: 16px; height: 16px; }
|
|
169
|
-
.theme-toggle .i-moon { display: none; }
|
|
170
|
-
.theme-toggle .i-sun { display: block; }
|
|
171
|
-
:root[data-theme='dark'] .theme-toggle .i-moon { display: block; }
|
|
172
|
-
:root[data-theme='dark'] .theme-toggle .i-sun { display: none; }
|
|
173
|
-
@media (prefers-color-scheme: dark) {
|
|
174
|
-
:root:not([data-theme='light']) .theme-toggle .i-moon { display: block; }
|
|
175
|
-
:root:not([data-theme='light']) .theme-toggle .i-sun { display: none; }
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/* github icon link — mirrors .theme-toggle so the two read as siblings */
|
|
179
|
-
.nav__icon {
|
|
180
|
-
width: 34px; height: 34px; display: grid; place-items: center;
|
|
181
|
-
border: 1px solid var(--border-strong); background: var(--surface); border-radius: var(--radius-sm);
|
|
182
|
-
color: var(--text-secondary); transition: background .15s, color .15s;
|
|
183
|
-
}
|
|
184
|
-
.nav__icon:hover { background: var(--surface-hover); color: var(--text); text-decoration: none; }
|
|
185
|
-
.nav__icon svg { width: 17px; height: 17px; }
|
|
186
|
-
|
|
187
|
-
/* ----------------------------------------------------------------- buttons */
|
|
188
|
-
.btn {
|
|
189
|
-
display: inline-flex; align-items: center; justify-content: center; gap: 8px;
|
|
190
|
-
height: 38px; padding: 0 15px; border-radius: var(--radius-sm);
|
|
191
|
-
border: 1px solid var(--border-strong); background: var(--surface); color: var(--text);
|
|
192
|
-
font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer; white-space: nowrap;
|
|
193
|
-
transition: background .15s, border-color .15s;
|
|
194
|
-
}
|
|
195
|
-
.btn:hover { background: var(--surface-hover); text-decoration: none; }
|
|
196
|
-
.btn svg { width: 16px; height: 16px; flex: none; }
|
|
197
|
-
.btn--ghost { background: transparent; border-color: var(--border); color: var(--text-secondary); }
|
|
198
|
-
.btn--ghost:hover { color: var(--text); background: var(--surface-hover); }
|
|
199
|
-
.btn--primary { background: var(--accent); border-color: var(--accent); color: var(--text-on-accent); }
|
|
200
|
-
.btn--primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
|
|
201
|
-
|
|
202
|
-
/* ----------------------------------------------------------------- hero */
|
|
203
|
-
/* Asymmetric two columns: headline + CTAs on the left, the "한 문장" install
|
|
204
|
-
demo (the signature element) on the right. Left-aligned, not centered.
|
|
205
|
-
Stacks to one column on narrow screens. */
|
|
206
|
-
.hero {
|
|
207
|
-
max-width: var(--maxw); margin: 0 auto; padding: 76px 24px 8px;
|
|
208
|
-
display: grid; grid-template-columns: 0.92fr 1.08fr; gap: 56px; align-items: start;
|
|
209
|
-
}
|
|
210
|
-
.hero__main { min-width: 0; }
|
|
211
|
-
/* solo variant (start.html): no demo column — one left-aligned column */
|
|
212
|
-
.hero--solo { grid-template-columns: 1fr; max-width: 760px; }
|
|
213
|
-
/* gentle staggered entrance on load */
|
|
214
|
-
@keyframes riseIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
|
|
215
|
-
.hero__main > *, .hero__demo { animation: riseIn .55s cubic-bezier(.22,.61,.36,1) both; }
|
|
216
|
-
.hero__title { animation-delay: .04s; }
|
|
217
|
-
.hero__lede { animation-delay: .10s; }
|
|
218
|
-
.hero__cta { animation-delay: .18s; }
|
|
219
|
-
.hero__note { animation-delay: .24s; }
|
|
220
|
-
.hero__demo { animation-delay: .16s; }
|
|
221
|
-
.pill-badge {
|
|
222
|
-
display: inline-flex; align-items: center; gap: 8px;
|
|
223
|
-
padding: 5px 13px; border-radius: 999px; font-size: 12.5px; font-weight: 600;
|
|
224
|
-
color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-border);
|
|
225
|
-
}
|
|
226
|
-
.pill-badge__dot { width: 6px; height: 6px; border-radius: 999px; background: var(--accent); }
|
|
227
|
-
/* heavy display weight + tight tracking — strong contrast against the 400 lede */
|
|
228
|
-
.hero__title { font-size: 3.05rem; font-weight: 800; margin: 20px 0 0; letter-spacing: 0; line-height: 1.12; }
|
|
229
|
-
.hero__lede {
|
|
230
|
-
font-size: 1.11rem; color: var(--text-secondary);
|
|
231
|
-
margin: 18px 0 0; max-width: 33rem; line-height: 1.62;
|
|
232
|
-
}
|
|
233
|
-
.hero__lede strong { color: var(--text); font-weight: 650; }
|
|
234
|
-
|
|
235
|
-
/* trust strip — the four anxiety answers, scannable, restrained (accent only on the ✓) */
|
|
236
|
-
.trust-strip {
|
|
237
|
-
list-style: none; margin: 20px 0 0; padding: 0; max-width: 38rem;
|
|
238
|
-
display: flex; flex-wrap: wrap; gap: 8px;
|
|
239
|
-
}
|
|
240
|
-
.trust-strip li {
|
|
241
|
-
display: inline-flex; align-items: center; gap: 6px;
|
|
242
|
-
font-size: 12.5px; font-weight: 500; color: var(--text-secondary);
|
|
243
|
-
background: var(--surface); border: 1px solid var(--border);
|
|
244
|
-
padding: 5px 11px; border-radius: 999px;
|
|
245
|
-
}
|
|
246
|
-
.trust-strip li::before { content: "✓"; color: var(--accent); font-weight: 700; }
|
|
247
|
-
|
|
248
|
-
/* hero call-to-action — two install paths */
|
|
249
|
-
.hero__cta { margin: 26px 0 0; display: flex; flex-wrap: wrap; gap: 10px; }
|
|
250
|
-
.hero__cta .btn { height: 42px; padding: 0 18px; font-size: 14.5px; }
|
|
251
|
-
|
|
252
|
-
.hero__note {
|
|
253
|
-
margin: 20px 0 0; max-width: 36rem; font-size: 12.5px; line-height: 1.65;
|
|
254
|
-
color: var(--text-tertiary);
|
|
255
|
-
}
|
|
256
|
-
.hero__note strong { color: var(--text-secondary); font-weight: 600; }
|
|
257
|
-
.hero__note code { font-family: var(--mono); font-size: .92em; background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; color: var(--text-secondary); }
|
|
258
|
-
|
|
259
|
-
/* signature — one stable card that shows what people can ask their AI to do. */
|
|
260
|
-
.hero__demo { min-width: 0; margin-top: 18px; }
|
|
261
|
-
.hero__demo-note { margin: 12px 2px 0; font-size: 12.5px; line-height: 1.55; color: var(--text-tertiary); }
|
|
262
|
-
.command-card {
|
|
263
|
-
background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
|
|
264
|
-
box-shadow: var(--shadow-md); overflow: hidden; min-height: 392px;
|
|
265
|
-
}
|
|
266
|
-
.command-card__head {
|
|
267
|
-
display: flex; align-items: center; gap: 10px; min-height: 42px; padding: 0 15px;
|
|
268
|
-
font-family: var(--mono); font-size: 12px; color: var(--text-tertiary);
|
|
269
|
-
background: var(--bg-subtle); border-bottom: 1px solid var(--border);
|
|
270
|
-
}
|
|
271
|
-
.command-card__dots { display: inline-flex; gap: 6px; flex: none; }
|
|
272
|
-
.command-card__dots i { width: 9px; height: 9px; border-radius: 999px; background: var(--border-strong); }
|
|
273
|
-
.command-card__title { color: var(--text-secondary); }
|
|
274
|
-
.command-card__status {
|
|
275
|
-
margin-left: auto; color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-border);
|
|
276
|
-
border-radius: 999px; padding: 2px 9px; font-family: var(--font); font-size: 11.5px; font-weight: 650;
|
|
277
|
-
}
|
|
278
|
-
.command-card__file {
|
|
279
|
-
display: flex; align-items: center; gap: 10px; margin: 18px 18px 0; padding: 11px 13px;
|
|
280
|
-
border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-elev);
|
|
281
|
-
}
|
|
282
|
-
.command-card__file svg { width: 20px; height: 20px; flex: none; color: var(--support-amber); }
|
|
283
|
-
.command-card__file span {
|
|
284
|
-
min-width: 0; flex: 1; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
|
|
285
|
-
font-family: var(--mono); font-size: 12.5px; color: var(--text);
|
|
286
|
-
}
|
|
287
|
-
.command-card__file strong {
|
|
288
|
-
flex: none; color: var(--support-amber); background: var(--support-amber-soft);
|
|
289
|
-
border-radius: 999px; padding: 2px 8px; font-size: 11.5px; font-weight: 650;
|
|
290
|
-
}
|
|
291
|
-
.command-card__body { display: grid; gap: 12px; padding: 18px; }
|
|
292
|
-
.command-card__bubble {
|
|
293
|
-
border-radius: var(--radius); border: 1px solid var(--border); padding: 13px 14px;
|
|
294
|
-
min-height: 94px; transition: opacity .24s ease, transform .24s ease;
|
|
295
|
-
}
|
|
296
|
-
.command-card__bubble span {
|
|
297
|
-
display: block; margin-bottom: 8px; font-size: 11px; font-weight: 700; color: var(--text-tertiary);
|
|
298
|
-
}
|
|
299
|
-
.command-card__bubble p { font-size: 14px; line-height: 1.58; color: var(--text-secondary); }
|
|
300
|
-
.command-card__bubble--user {
|
|
301
|
-
background: var(--code-bg);
|
|
302
|
-
}
|
|
303
|
-
.command-card__bubble--user p {
|
|
304
|
-
color: var(--code-text); font-family: var(--mono); font-size: 12.7px;
|
|
305
|
-
}
|
|
306
|
-
.command-card__bubble--ai {
|
|
307
|
-
margin-left: 28px; background: var(--surface);
|
|
308
|
-
}
|
|
309
|
-
.command-card__bubble--ai span { color: var(--accent); }
|
|
310
|
-
.command-card__steps {
|
|
311
|
-
list-style: none; display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px;
|
|
312
|
-
margin: 0 18px 14px; padding: 0;
|
|
313
|
-
}
|
|
314
|
-
.command-card__steps li { min-width: 0; }
|
|
315
|
-
.command-card__steps button {
|
|
316
|
-
width: 100%; height: 28px; display: grid; place-items: center; border: 1px solid var(--border);
|
|
317
|
-
border-radius: 999px; color: var(--text-tertiary); font-family: inherit; font-size: 11.5px; font-weight: 650;
|
|
318
|
-
background: var(--bg-elev); cursor: pointer; transition: background .14s ease, border-color .14s ease, color .14s ease;
|
|
319
|
-
}
|
|
320
|
-
.command-card__steps button:hover {
|
|
321
|
-
border-color: var(--accent-border); color: var(--accent); background: var(--accent-soft);
|
|
322
|
-
}
|
|
323
|
-
.command-card__steps button:focus-visible {
|
|
324
|
-
outline: 2px solid var(--accent); outline-offset: 2px;
|
|
325
|
-
}
|
|
326
|
-
.command-card__steps button.is-active {
|
|
327
|
-
color: var(--text-on-accent); background: var(--accent); border-color: var(--accent);
|
|
328
|
-
}
|
|
329
|
-
.command-card__progress {
|
|
330
|
-
height: 3px; background: var(--bg-subtle); overflow: hidden;
|
|
331
|
-
}
|
|
332
|
-
.command-card__progress span {
|
|
333
|
-
display: block; height: 100%; width: 100%; background: var(--accent);
|
|
334
|
-
transform-origin: left; animation: commandProgress 4.5s linear infinite;
|
|
335
|
-
}
|
|
336
|
-
.command-demo.is-changing .command-card__bubble,
|
|
337
|
-
.command-demo.is-changing .command-card__file {
|
|
338
|
-
opacity: .28; transform: translateY(3px);
|
|
339
|
-
}
|
|
340
|
-
@keyframes commandProgress { from { transform: scaleX(0); } to { transform: scaleX(1); } }
|
|
341
|
-
|
|
342
|
-
/* ----------------------------------------------------------------- sections */
|
|
343
|
-
.section { max-width: var(--maxw); margin: 0 auto; padding: 136px 24px 0; scroll-margin-top: 80px; }
|
|
344
|
-
/* left-aligned section heads (centered heads + uppercase eyebrows read as a template) */
|
|
345
|
-
.section__head { max-width: 50rem; margin: 0 0 44px; }
|
|
346
|
-
.section__head h2 { font-size: 2rem; font-weight: 750; letter-spacing: 0; }
|
|
347
|
-
.section__head p { margin-top: 14px; color: var(--text-secondary); font-size: 1.02rem; max-width: 42rem; }
|
|
348
|
-
.section__cta { margin-top: 22px; display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
|
|
349
|
-
.section__cta-note { font-size: 13px; color: var(--text-tertiary, var(--text-secondary)); }
|
|
350
|
-
/* Centered head for showcase/guide sections whose body is itself centered (the big
|
|
351
|
-
carousel screenshot, the reading-column install guide) — a left head would misalign
|
|
352
|
-
with the centered media below it. Left-aligned heads stay on the content sections above. */
|
|
353
|
-
.section__head--center { text-align: center; margin-left: auto; margin-right: auto; }
|
|
354
|
-
.section__head--center p { margin-left: auto; margin-right: auto; }
|
|
355
|
-
.section__head--center .section__cta { align-items: center; }
|
|
356
|
-
|
|
357
|
-
/* how-it-works — a quiet numbered sequence, not an icon-card grid */
|
|
358
|
-
.cards-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px; }
|
|
359
|
-
.feature { padding-top: 22px; border-top: 1px solid var(--border-strong); }
|
|
360
|
-
.feature__no { display: block; font-family: var(--mono); font-size: 13px; font-weight: 700; letter-spacing: .06em; color: var(--accent); }
|
|
361
|
-
.feature h3 { font-size: 16px; margin: 14px 0 8px; }
|
|
362
|
-
.feature p { color: var(--text-secondary); font-size: 14px; line-height: 1.65; }
|
|
363
|
-
.feature code { font-family: var(--mono); font-size: .85em; background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; }
|
|
364
|
-
|
|
365
|
-
/* capability list — hairline rows, not boxes ("use fewer borders") */
|
|
366
|
-
.checks { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0 40px; max-width: 880px; margin: 0; }
|
|
367
|
-
.check {
|
|
368
|
-
display: flex; gap: 12px; align-items: flex-start;
|
|
369
|
-
padding: 19px 0; border-bottom: 1px solid var(--border);
|
|
370
|
-
}
|
|
371
|
-
.check > svg { width: 18px; height: 18px; flex: none; color: var(--accent); margin-top: 1px; }
|
|
372
|
-
.check strong { display: block; font-size: 14.5px; font-weight: 650; }
|
|
373
|
-
.check span { display: block; color: var(--text-secondary); font-size: 13px; margin-top: 2px; }
|
|
374
|
-
|
|
375
|
-
/* ----------------------------------------------------------- dashboard preview */
|
|
376
|
-
/* A carousel of real dashboard screenshots, one browser-framed slide at a time.
|
|
377
|
-
Prev/next arrows + dots; light/dark variants both in the DOM, CSS shows the one
|
|
378
|
-
matching the page theme. Degrades to the first slide if JS is off. */
|
|
379
|
-
/* side padding reserves space for the arrows so they sit OUTSIDE the frame
|
|
380
|
-
(never covering the screenshot). The frame shrinks to fit; on small screens
|
|
381
|
-
the padding collapses and arrows overlap the edges instead. */
|
|
382
|
-
.carousel { position: relative; max-width: 936px; margin: 0 auto; padding: 0 54px; }
|
|
383
|
-
.carousel__viewport { overflow: hidden; border-radius: var(--radius-lg); }
|
|
384
|
-
.carousel__track { display: flex; transition: transform .42s cubic-bezier(.22,.61,.36,1); }
|
|
385
|
-
@media (prefers-reduced-motion: reduce) { .carousel__track { transition: none; } }
|
|
386
|
-
.slide { flex: 0 0 100%; min-width: 0; margin: 0; } /* reset <figure> default margin so each slide is exactly 100% (translateX math) */
|
|
387
|
-
.slide figcaption { margin-top: 14px; text-align: center; font-size: 13.5px; color: var(--text-secondary); }
|
|
388
|
-
.slide figcaption strong { color: var(--text); font-weight: 650; }
|
|
389
|
-
|
|
390
|
-
.browser {
|
|
391
|
-
border: 1px solid var(--border-strong); border-radius: var(--radius-lg); overflow: hidden;
|
|
392
|
-
background: var(--surface); box-shadow: var(--shadow-md);
|
|
393
|
-
}
|
|
394
|
-
.browser__bar {
|
|
395
|
-
display: flex; align-items: center; gap: 10px; height: 38px; padding: 0 14px;
|
|
396
|
-
background: var(--bg-subtle); border-bottom: 1px solid var(--border);
|
|
397
|
-
}
|
|
398
|
-
.browser__dots { display: inline-flex; gap: 6px; flex: none; }
|
|
399
|
-
.browser__dots i { width: 10px; height: 10px; border-radius: 999px; background: var(--border-strong); }
|
|
400
|
-
.browser__url {
|
|
401
|
-
flex: 1; max-width: 320px; margin: 0 auto;
|
|
402
|
-
font-family: var(--mono); font-size: 12px; color: var(--text-tertiary); text-align: center;
|
|
403
|
-
background: var(--surface); border: 1px solid var(--border); border-radius: 999px; padding: 3px 12px;
|
|
404
|
-
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
405
|
-
}
|
|
406
|
-
.browser__body { display: block; background: var(--bg); }
|
|
407
|
-
.browser__body img { width: 100%; height: auto; }
|
|
408
|
-
|
|
409
|
-
/* show the screenshot that matches the current theme (default page theme = dark) */
|
|
410
|
-
.shot__img { display: none; }
|
|
411
|
-
:root[data-theme='dark'] .shot__img--dark { display: block; }
|
|
412
|
-
:root:not([data-theme='dark']) .shot__img--light { display: block; }
|
|
413
|
-
|
|
414
|
-
/* prev / next arrows — overlap the frame edges, vertically centred on the FRAME
|
|
415
|
-
(not the frame+caption). top:0 / bottom:caption-height + margin-block:auto centers
|
|
416
|
-
the arrow within the image area regardless of the responsive frame height — no
|
|
417
|
-
eyeballed percentage. ~36px ≈ figcaption line (13.5px ×1.65) + its 14px margin-top. */
|
|
418
|
-
.carousel__arrow {
|
|
419
|
-
position: absolute; top: 0; bottom: 36px; margin-block: auto;
|
|
420
|
-
width: 44px; height: 44px; border-radius: 999px; display: grid; place-items: center;
|
|
421
|
-
background: var(--surface); border: 1px solid var(--border-strong); color: var(--text);
|
|
422
|
-
box-shadow: var(--shadow-md); cursor: pointer; z-index: 2;
|
|
423
|
-
transition: background .15s, opacity .15s;
|
|
424
|
-
}
|
|
425
|
-
.carousel__arrow:hover { background: var(--surface-hover); }
|
|
426
|
-
.carousel__arrow:disabled { opacity: .3; cursor: default; box-shadow: none; }
|
|
427
|
-
.carousel__arrow svg { width: 20px; height: 20px; }
|
|
428
|
-
.carousel__arrow--prev { left: 0; }
|
|
429
|
-
.carousel__arrow--next { right: 0; }
|
|
430
|
-
|
|
431
|
-
/* dots */
|
|
432
|
-
.carousel__dots { display: flex; justify-content: center; gap: 8px; margin-top: 18px; }
|
|
433
|
-
.carousel__dot {
|
|
434
|
-
width: 8px; height: 8px; padding: 0; border: 0; border-radius: 999px;
|
|
435
|
-
background: var(--border-strong); cursor: pointer; transition: background .15s, width .15s;
|
|
436
|
-
}
|
|
437
|
-
.carousel__dot:hover { background: var(--text-tertiary); }
|
|
438
|
-
.carousel__dot.is-active { width: 22px; background: var(--accent); }
|
|
439
|
-
|
|
440
|
-
@media (max-width: 640px) {
|
|
441
|
-
.carousel { padding: 0; }
|
|
442
|
-
.carousel__arrow--prev { left: 6px; }
|
|
443
|
-
.carousel__arrow--next { right: 6px; }
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
/* ----------------------------------------------------------------- install */
|
|
447
|
-
/* The first install view is intentionally short: three human steps, one
|
|
448
|
-
pasteable prompt, and one developer command. */
|
|
449
|
-
.quick-start {
|
|
450
|
-
max-width: 840px; margin: 0 auto 18px;
|
|
451
|
-
display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;
|
|
452
|
-
}
|
|
453
|
-
.quick-start__step {
|
|
454
|
-
background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
|
|
455
|
-
padding: 19px; min-height: 184px;
|
|
456
|
-
}
|
|
457
|
-
.quick-start__step span {
|
|
458
|
-
width: 28px; height: 28px; display: grid; place-items: center; border-radius: 999px;
|
|
459
|
-
background: var(--accent-soft); border: 1px solid var(--accent-border); color: var(--accent);
|
|
460
|
-
font-weight: 750; font-size: 13px;
|
|
461
|
-
}
|
|
462
|
-
.quick-start__step h3 { margin-top: 13px; font-size: 16px; font-weight: 720; }
|
|
463
|
-
.quick-start__step p { margin-top: 7px; color: var(--text-secondary); font-size: 13px; line-height: 1.55; }
|
|
464
|
-
.quick-start__step a {
|
|
465
|
-
display: inline-flex; margin-top: 10px; color: var(--accent); font-size: 13px; font-weight: 700;
|
|
466
|
-
}
|
|
467
|
-
.code--install { max-width: 840px; }
|
|
468
|
-
.install-footnote {
|
|
469
|
-
max-width: 840px; margin: 0 auto 20px; text-align: center;
|
|
470
|
-
color: var(--text-tertiary); font-size: 13px; line-height: 1.58;
|
|
471
|
-
}
|
|
472
|
-
.install-footnote--label {
|
|
473
|
-
margin-bottom: 8px; color: var(--text-secondary); font-weight: 700;
|
|
474
|
-
}
|
|
475
|
-
.code.code--install + .install-footnote--label { margin-top: 18px; }
|
|
476
|
-
.note--compact { margin-bottom: 22px; }
|
|
477
|
-
|
|
478
|
-
/* install track (A: .mcpb / B: terminal) */
|
|
479
|
-
.track {
|
|
480
|
-
max-width: 720px; margin: 0 auto;
|
|
481
|
-
padding: 26px 0 0;
|
|
482
|
-
}
|
|
483
|
-
.track + .track { margin-top: 14px; padding-top: 30px; border-top: 1px solid var(--border); }
|
|
484
|
-
.track__head { max-width: 720px; margin: 0 auto 18px; }
|
|
485
|
-
.track__tag {
|
|
486
|
-
display: inline-block; font-size: 11.5px; font-weight: 700; letter-spacing: .04em;
|
|
487
|
-
color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-border);
|
|
488
|
-
padding: 3px 10px; border-radius: 999px; margin-bottom: 10px;
|
|
489
|
-
}
|
|
490
|
-
.track__head h3 { font-size: 1.15rem; }
|
|
491
|
-
.track__head h3 code { font-family: var(--mono); font-size: .82em; background: var(--bg-sunken); padding: 1px 6px; border-radius: 4px; font-weight: 600; }
|
|
492
|
-
.track__head > p { margin-top: 7px; color: var(--text-secondary); font-size: 14px; }
|
|
493
|
-
.track .steps, .track .note, .track .acc { margin-left: 0; margin-right: 0; }
|
|
494
|
-
.track .step__body .btn { margin-top: 4px; }
|
|
495
|
-
|
|
496
|
-
.note {
|
|
497
|
-
border: 1px solid var(--border); border-left: 3px solid var(--accent);
|
|
498
|
-
background: var(--surface); border-radius: var(--radius);
|
|
499
|
-
padding: 13px 17px; margin: 0 auto 24px; max-width: 720px;
|
|
500
|
-
font-size: 14px; color: var(--text-secondary); line-height: 1.6;
|
|
501
|
-
}
|
|
502
|
-
.note strong { color: var(--text); }
|
|
503
|
-
.note code { font-family: var(--mono); background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; font-size: .88em; color: var(--text); }
|
|
504
|
-
|
|
505
|
-
.steps { list-style: none; margin: 0 auto; padding: 0; max-width: 720px; }
|
|
506
|
-
.step { display: flex; gap: 15px; padding: 2px 0 24px; position: relative; }
|
|
507
|
-
.step__no {
|
|
508
|
-
width: 30px; height: 30px; flex: none; border-radius: 999px;
|
|
509
|
-
display: grid; place-items: center; font-weight: 700; font-size: 14px;
|
|
510
|
-
color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-border); z-index: 1;
|
|
511
|
-
}
|
|
512
|
-
.step:not(:last-of-type)::before {
|
|
513
|
-
content: ''; position: absolute; left: 15px; top: 34px; bottom: 6px; width: 1px;
|
|
514
|
-
background: var(--border); z-index: 0;
|
|
515
|
-
}
|
|
516
|
-
.step__body { flex: 1; min-width: 0; padding-top: 3px; }
|
|
517
|
-
.step__body h3 { font-size: 16px; margin-bottom: 5px; }
|
|
518
|
-
.step__body > p { color: var(--text-secondary); font-size: 14px; margin-bottom: 11px; }
|
|
519
|
-
.step__body code { font-family: var(--mono); background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; font-size: .86em; }
|
|
520
|
-
.step__tip { margin-top: 11px; font-size: 13px; color: var(--text-secondary); }
|
|
521
|
-
.step__tip code { font-family: var(--mono); background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; }
|
|
522
|
-
|
|
523
|
-
kbd {
|
|
524
|
-
font-family: inherit; font-size: .82em; background: var(--bg-sunken);
|
|
525
|
-
border: 1px solid var(--border-strong); border-bottom-width: 2px; border-radius: 4px; padding: 1px 6px;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
/* code blocks */
|
|
529
|
-
.code {
|
|
530
|
-
position: relative; margin: 11px 0; background: var(--code-bg);
|
|
531
|
-
border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden;
|
|
532
|
-
}
|
|
533
|
-
.code.code--install { margin: 0 auto 10px; }
|
|
534
|
-
.code__label {
|
|
535
|
-
display: block; font-family: var(--mono); font-size: 11px; letter-spacing: .03em;
|
|
536
|
-
color: var(--text-tertiary); padding: 9px 13px 0;
|
|
537
|
-
}
|
|
538
|
-
.code pre {
|
|
539
|
-
margin: 0; padding: 11px 64px 13px 13px; overflow-x: auto;
|
|
540
|
-
font-family: var(--mono); font-size: 12.5px; line-height: 1.6; color: var(--code-text);
|
|
541
|
-
white-space: pre-wrap; overflow-wrap: anywhere;
|
|
542
|
-
}
|
|
543
|
-
.copy-btn {
|
|
544
|
-
position: absolute; top: 7px; right: 7px; font-family: inherit; font-size: 12px; font-weight: 600;
|
|
545
|
-
color: var(--text-secondary); background: var(--surface); border: 1px solid var(--border-strong);
|
|
546
|
-
border-radius: 6px; padding: 3px 10px; cursor: pointer; transition: background .12s, color .12s, border-color .12s;
|
|
547
|
-
}
|
|
548
|
-
.copy-btn:hover { border-color: var(--accent); color: var(--accent); }
|
|
549
|
-
.copy-btn.copied { color: var(--text-on-accent); background: var(--accent); border-color: var(--accent); }
|
|
550
|
-
|
|
551
|
-
/* tabs */
|
|
552
|
-
.tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--border); margin: 4px 0 0; flex-wrap: wrap; }
|
|
553
|
-
.tab {
|
|
554
|
-
font-family: inherit; font-size: 13.5px; font-weight: 600; color: var(--text-secondary);
|
|
555
|
-
background: none; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px;
|
|
556
|
-
padding: 8px 12px; cursor: pointer; transition: color .12s;
|
|
557
|
-
}
|
|
558
|
-
.tab:hover { color: var(--text); }
|
|
559
|
-
.tab.is-active { color: var(--accent); border-bottom-color: var(--accent); }
|
|
560
|
-
.panel { display: none; padding-top: 11px; }
|
|
561
|
-
.panel[data-active='true'] { display: block; }
|
|
562
|
-
.path-note { font-size: 12.5px; color: var(--text-tertiary); margin-bottom: 6px; line-height: 1.6; }
|
|
563
|
-
.path-note code { font-family: var(--mono); font-size: .9em; background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; }
|
|
564
|
-
|
|
565
|
-
/* troubleshooting accordion */
|
|
566
|
-
.acc {
|
|
567
|
-
max-width: 720px; margin: 4px auto 0; border: 1px solid var(--border);
|
|
568
|
-
border-radius: var(--radius); background: var(--surface); overflow: hidden;
|
|
569
|
-
}
|
|
570
|
-
.acc > summary {
|
|
571
|
-
cursor: pointer; list-style: none; padding: 15px 17px; font-weight: 650; font-size: 14.5px;
|
|
572
|
-
display: flex; align-items: center; gap: 10px;
|
|
573
|
-
}
|
|
574
|
-
.acc > summary::-webkit-details-marker { display: none; }
|
|
575
|
-
.acc > summary::after { content: '+'; margin-left: auto; color: var(--text-tertiary); font-weight: 400; }
|
|
576
|
-
.acc[open] > summary::after { content: '-'; }
|
|
577
|
-
.acc > summary:hover { background: var(--surface-hover); }
|
|
578
|
-
.acc__hint { font-weight: 500; font-size: 12.5px; color: var(--text-tertiary); }
|
|
579
|
-
.acc__body { padding: 0 17px 16px; }
|
|
580
|
-
.acc + .acc { margin-top: 10px; }
|
|
581
|
-
.track + .acc { margin-top: 16px; }
|
|
582
|
-
/* track-as-accordion: pill in summary + intro paragraph in body */
|
|
583
|
-
.acc > summary .track__tag { margin: 0; flex: none; }
|
|
584
|
-
.acc > summary { flex-wrap: wrap; }
|
|
585
|
-
.track-desc { color: var(--text-secondary); font-size: 14px; line-height: 1.6; margin: 0 0 12px; }
|
|
586
|
-
.trouble { display: grid; grid-template-columns: repeat(2, 1fr); gap: 13px; }
|
|
587
|
-
.trouble__item h4 { font-size: 14px; margin-bottom: 4px; }
|
|
588
|
-
.trouble__item p { color: var(--text-secondary); font-size: 13px; }
|
|
589
|
-
.trouble__item code { font-family: var(--mono); background: var(--bg-sunken); padding: 1px 5px; border-radius: 4px; font-size: .86em; }
|
|
590
|
-
|
|
591
|
-
/* privacy */
|
|
592
|
-
.privacy-card {
|
|
593
|
-
max-width: 800px; margin: 0 auto; display: flex; gap: 20px; align-items: flex-start;
|
|
594
|
-
background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg);
|
|
595
|
-
padding: 28px 30px;
|
|
596
|
-
}
|
|
597
|
-
.privacy-card__icon {
|
|
598
|
-
width: 50px; height: 50px; flex: none; border-radius: 12px; display: grid; place-items: center;
|
|
599
|
-
color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent-border);
|
|
600
|
-
}
|
|
601
|
-
.privacy-card__icon svg { width: 26px; height: 26px; }
|
|
602
|
-
.privacy-card__text h2 { font-size: 1.3rem; }
|
|
603
|
-
.privacy-card__text > p { color: var(--text-secondary); margin-top: 9px; font-size: 14.5px; }
|
|
604
|
-
.privacy-card__list { list-style: none; margin: 14px 0 0; padding: 0; display: grid; gap: 7px; }
|
|
605
|
-
.privacy-card__list li { font-size: 13.5px; color: var(--text-secondary); }
|
|
606
|
-
.privacy-card__list strong { color: var(--text); margin-right: 8px; }
|
|
607
|
-
.privacy-card__list code { font-family: var(--mono); font-size: .86em; background: var(--bg-sunken); padding: 1px 6px; border-radius: 4px; color: var(--text); }
|
|
608
|
-
.privacy-card__note { margin: 16px 0 0; padding-top: 14px; border-top: 1px solid var(--border); font-size: 12.5px; color: var(--text-tertiary); line-height: 1.6; }
|
|
609
|
-
|
|
610
|
-
/* footer */
|
|
611
|
-
.foot {
|
|
612
|
-
max-width: var(--maxw); margin: 104px auto 0; padding: 32px 24px 56px;
|
|
613
|
-
border-top: 1px solid var(--border); text-align: center; color: var(--text-tertiary);
|
|
614
|
-
}
|
|
615
|
-
.foot__brand { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; color: var(--text); font-size: 15px; font-family: var(--mono); }
|
|
616
|
-
.foot p { margin: 11px 0 0; font-size: 13px; }
|
|
617
|
-
.foot__links { display: flex; justify-content: center; gap: 16px; margin-top: 14px; font-size: 13px; }
|
|
618
|
-
.foot__links a { color: var(--text-secondary); }
|
|
619
|
-
|
|
620
|
-
/* a11y */
|
|
621
|
-
.sr-only {
|
|
622
|
-
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
|
|
623
|
-
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
/* scroll reveal — JS adds .reveal only when motion is allowed, so no-JS /
|
|
627
|
-
reduced-motion shows everything immediately (no hidden content risk) */
|
|
628
|
-
.reveal { opacity: 0; transform: translateY(14px); transition: opacity .55s ease, transform .55s ease; }
|
|
629
|
-
.reveal.is-visible { opacity: 1; transform: none; }
|
|
630
|
-
.cards-3 .feature:nth-child(2).reveal { transition-delay: .07s; }
|
|
631
|
-
.cards-3 .feature:nth-child(3).reveal { transition-delay: .14s; }
|
|
632
|
-
.checks .check:nth-child(even).reveal { transition-delay: .05s; }
|
|
633
|
-
|
|
634
|
-
/* responsive */
|
|
635
|
-
@media (max-width: 820px) {
|
|
636
|
-
.hero { grid-template-columns: 1fr; gap: 32px; padding-top: 56px; }
|
|
637
|
-
.section { padding-top: 104px; }
|
|
638
|
-
.section__head { margin-bottom: 34px; }
|
|
639
|
-
.hero__title { font-size: 2.48rem; }
|
|
640
|
-
.section__head h2 { font-size: 1.72rem; }
|
|
641
|
-
.hero__demo { max-width: 520px; margin-top: 0; }
|
|
642
|
-
.cards-3 { grid-template-columns: 1fr; gap: 24px; }
|
|
643
|
-
.checks { grid-template-columns: 1fr; }
|
|
644
|
-
.trouble { grid-template-columns: 1fr; }
|
|
645
|
-
.quick-start { grid-template-columns: 1fr; max-width: 720px; }
|
|
646
|
-
.quick-start__step { min-height: 0; }
|
|
647
|
-
/* Logo-only brand on mobile keeps the sticky nav quiet and compact. */
|
|
648
|
-
.nav__name { display: none; }
|
|
649
|
-
.nav__links a { display: none; }
|
|
650
|
-
}
|
|
651
|
-
@media (max-width: 540px) {
|
|
652
|
-
.hero { padding-top: 46px; }
|
|
653
|
-
.section { padding-top: 88px; }
|
|
654
|
-
.hero__title { font-size: 2.18rem; }
|
|
655
|
-
.hero__lede { font-size: 1rem; }
|
|
656
|
-
.command-card { min-height: 420px; }
|
|
657
|
-
.command-card__bubble { min-height: 108px; }
|
|
658
|
-
.command-card__bubble--ai { margin-left: 0; }
|
|
659
|
-
.command-card__steps { grid-template-columns: repeat(3, 1fr); }
|
|
660
|
-
.privacy-card { flex-direction: column; gap: 15px; padding: 22px; }
|
|
661
|
-
}
|
|
662
|
-
@media (prefers-reduced-motion: reduce) {
|
|
663
|
-
html { scroll-behavior: auto; }
|
|
664
|
-
* { animation: none !important; transition: none !important; }
|
|
665
|
-
}
|
package/dist/site/vercel.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://openapi.vercel.sh/vercel.json",
|
|
3
|
-
"cleanUrls": true,
|
|
4
|
-
"trailingSlash": false,
|
|
5
|
-
"headers": [
|
|
6
|
-
{
|
|
7
|
-
"source": "/style.css",
|
|
8
|
-
"headers": [
|
|
9
|
-
{ "key": "Cache-Control", "value": "public, max-age=3600, must-revalidate" }
|
|
10
|
-
]
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
"source": "/(.*)",
|
|
14
|
-
"headers": [
|
|
15
|
-
{ "key": "X-Content-Type-Options", "value": "nosniff" },
|
|
16
|
-
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" }
|
|
17
|
-
]
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
}
|