create-swift-rust 0.7.1 → 0.8.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.
- package/dist/index.js +1041 -39
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/default/src/app/about/page.tsx +6 -6
- package/templates/default/src/app/about/team/page.tsx +6 -6
- package/templates/default/src/app/blog/[slug]/page.tsx +24 -16
- package/templates/default/src/app/blog/page.tsx +23 -19
- package/templates/default/src/app/blog/tag/[tag]/page.tsx +8 -8
- package/templates/default/src/app/contact/page.tsx +8 -8
- package/templates/default/src/app/dashboard/analytics/page.tsx +12 -12
- package/templates/default/src/app/dashboard/loading.tsx +8 -8
- package/templates/default/src/app/dashboard/page.tsx +36 -27
- package/templates/default/src/app/dashboard/posts/[id]/not-found.tsx +2 -2
- package/templates/default/src/app/dashboard/posts/[id]/page.tsx +5 -5
- package/templates/default/src/app/dashboard/posts/new/page.tsx +15 -10
- package/templates/default/src/app/dashboard/posts/page.tsx +7 -7
- package/templates/default/src/app/dashboard/settings/page.tsx +39 -17
- package/templates/default/src/app/error.tsx +2 -2
- package/templates/default/src/app/fonts/page.tsx +39 -39
- package/templates/default/src/app/images/page.tsx +53 -15
- package/templates/default/src/app/layout.tsx +1 -1
- package/templates/default/src/app/loading.tsx +5 -5
- package/templates/default/src/app/not-found.tsx +2 -2
- package/templates/default/src/app/page.tsx +114 -72
- package/templates/default/src/app/videos/page.tsx +22 -22
- package/templates/default/src/components/font-studio.tsx +37 -37
- package/templates/default/src/components/footer.tsx +5 -5
- package/templates/default/src/components/logo.tsx +2 -2
- package/templates/default/src/components/nav.tsx +28 -10
- package/templates/default/src/components/sidebar.tsx +10 -10
|
@@ -129,26 +129,26 @@ export function FontStudio() {
|
|
|
129
129
|
const activeImportName = customFont.trim() ? toImportName(customFont) : entry.importName;
|
|
130
130
|
|
|
131
131
|
return (
|
|
132
|
-
<div className="rounded-2xl border border-
|
|
133
|
-
<div className="flex items-center justify-between border-b border-
|
|
132
|
+
<div className="rounded-2xl border border-border bg-surface overflow-hidden shadow-sm">
|
|
133
|
+
<div className="flex items-center justify-between border-b border-border bg-surface-2 px-6 py-3">
|
|
134
134
|
<div className="flex items-center gap-2">
|
|
135
|
-
<span className="pulse-dot h-1.5 w-1.5 rounded-full bg-
|
|
136
|
-
<span className="text-xs font-medium uppercase tracking-wider text-
|
|
135
|
+
<span className="pulse-dot h-1.5 w-1.5 rounded-full bg-accent" />
|
|
136
|
+
<span className="text-xs font-medium uppercase tracking-wider text-fg-muted">
|
|
137
137
|
Typography studio
|
|
138
138
|
</span>
|
|
139
139
|
</div>
|
|
140
|
-
<span className="font-mono text-xs text-
|
|
140
|
+
<span className="font-mono text-xs text-fg-subtle">
|
|
141
141
|
{entry.name} · {weight} · {italic ? "italic" : "roman"}
|
|
142
142
|
</span>
|
|
143
143
|
</div>
|
|
144
144
|
|
|
145
145
|
<div className="grid gap-0 lg:grid-cols-[20rem_1fr]">
|
|
146
|
-
<div className="border-b border-
|
|
146
|
+
<div className="border-b border-border p-6 lg:border-b-0 lg:border-r">
|
|
147
147
|
<div className="space-y-5">
|
|
148
148
|
<div>
|
|
149
149
|
<label
|
|
150
150
|
htmlFor="studio-font"
|
|
151
|
-
className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-
|
|
151
|
+
className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-fg-subtle"
|
|
152
152
|
>
|
|
153
153
|
Font
|
|
154
154
|
</label>
|
|
@@ -159,7 +159,7 @@ export function FontStudio() {
|
|
|
159
159
|
setFontName(e.target.value);
|
|
160
160
|
setCustomFont("");
|
|
161
161
|
}}
|
|
162
|
-
className="h-10 w-full rounded-md border border-
|
|
162
|
+
className="h-10 w-full rounded-md border border-border bg-surface px-3 text-sm text-fg focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent-soft"
|
|
163
163
|
>
|
|
164
164
|
{STUDIO_FONTS.map((f) => (
|
|
165
165
|
<option key={f.name} value={f.name}>
|
|
@@ -172,7 +172,7 @@ export function FontStudio() {
|
|
|
172
172
|
<div>
|
|
173
173
|
<label
|
|
174
174
|
htmlFor="studio-weight"
|
|
175
|
-
className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-
|
|
175
|
+
className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-fg-subtle"
|
|
176
176
|
>
|
|
177
177
|
Weight
|
|
178
178
|
</label>
|
|
@@ -182,7 +182,7 @@ export function FontStudio() {
|
|
|
182
182
|
onChange={(e: ChangeEvent<HTMLSelectElement>) =>
|
|
183
183
|
setWeight(Number(e.target.value))
|
|
184
184
|
}
|
|
185
|
-
className="h-10 w-full rounded-md border border-
|
|
185
|
+
className="h-10 w-full rounded-md border border-border bg-surface px-3 text-sm text-fg focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent-soft"
|
|
186
186
|
>
|
|
187
187
|
{WEIGHTS.map((w) => (
|
|
188
188
|
<option key={w.value} value={w.value}>
|
|
@@ -193,7 +193,7 @@ export function FontStudio() {
|
|
|
193
193
|
</div>
|
|
194
194
|
|
|
195
195
|
<div>
|
|
196
|
-
<span className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-
|
|
196
|
+
<span className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-fg-subtle">
|
|
197
197
|
Style
|
|
198
198
|
</span>
|
|
199
199
|
<div className="flex gap-2">
|
|
@@ -202,8 +202,8 @@ export function FontStudio() {
|
|
|
202
202
|
onClick={() => setItalic(false)}
|
|
203
203
|
className={`flex-1 h-10 rounded-md text-sm font-medium transition-colors ${
|
|
204
204
|
!italic
|
|
205
|
-
? "bg-
|
|
206
|
-
: "border border-
|
|
205
|
+
? "bg-fg text-bg"
|
|
206
|
+
: "border border-border bg-surface text-fg-muted hover:text-fg"
|
|
207
207
|
}`}
|
|
208
208
|
>
|
|
209
209
|
Regular
|
|
@@ -213,8 +213,8 @@ export function FontStudio() {
|
|
|
213
213
|
onClick={() => setItalic(true)}
|
|
214
214
|
className={`flex-1 h-10 rounded-md text-sm font-medium transition-colors ${
|
|
215
215
|
italic
|
|
216
|
-
? "bg-
|
|
217
|
-
: "border border-
|
|
216
|
+
? "bg-fg text-bg"
|
|
217
|
+
: "border border-border bg-surface text-fg-muted hover:text-fg"
|
|
218
218
|
}`}
|
|
219
219
|
>
|
|
220
220
|
Italic
|
|
@@ -226,11 +226,11 @@ export function FontStudio() {
|
|
|
226
226
|
<div className="mb-1.5 flex items-baseline justify-between">
|
|
227
227
|
<label
|
|
228
228
|
htmlFor="studio-size"
|
|
229
|
-
className="text-xs font-medium uppercase tracking-wider text-
|
|
229
|
+
className="text-xs font-medium uppercase tracking-wider text-fg-subtle"
|
|
230
230
|
>
|
|
231
231
|
Size
|
|
232
232
|
</label>
|
|
233
|
-
<span className="font-mono text-xs text-
|
|
233
|
+
<span className="font-mono text-xs text-fg-muted">{size}px</span>
|
|
234
234
|
</div>
|
|
235
235
|
<input
|
|
236
236
|
id="studio-size"
|
|
@@ -241,7 +241,7 @@ export function FontStudio() {
|
|
|
241
241
|
onChange={(e: ChangeEvent<HTMLInputElement>) =>
|
|
242
242
|
setSize(Number(e.target.value))
|
|
243
243
|
}
|
|
244
|
-
className="w-full accent-
|
|
244
|
+
className="w-full accent-accent"
|
|
245
245
|
/>
|
|
246
246
|
</div>
|
|
247
247
|
|
|
@@ -249,11 +249,11 @@ export function FontStudio() {
|
|
|
249
249
|
<div className="mb-1.5 flex items-baseline justify-between">
|
|
250
250
|
<label
|
|
251
251
|
htmlFor="studio-tracking"
|
|
252
|
-
className="text-xs font-medium uppercase tracking-wider text-
|
|
252
|
+
className="text-xs font-medium uppercase tracking-wider text-fg-subtle"
|
|
253
253
|
>
|
|
254
254
|
Tracking
|
|
255
255
|
</label>
|
|
256
|
-
<span className="font-mono text-xs text-
|
|
256
|
+
<span className="font-mono text-xs text-fg-muted">
|
|
257
257
|
{tracking >= 0 ? "+" : ""}
|
|
258
258
|
{tracking}
|
|
259
259
|
</span>
|
|
@@ -267,7 +267,7 @@ export function FontStudio() {
|
|
|
267
267
|
onChange={(e: ChangeEvent<HTMLInputElement>) =>
|
|
268
268
|
setTracking(Number(e.target.value))
|
|
269
269
|
}
|
|
270
|
-
className="w-full accent-
|
|
270
|
+
className="w-full accent-accent"
|
|
271
271
|
/>
|
|
272
272
|
</div>
|
|
273
273
|
|
|
@@ -275,11 +275,11 @@ export function FontStudio() {
|
|
|
275
275
|
<div className="mb-1.5 flex items-baseline justify-between">
|
|
276
276
|
<label
|
|
277
277
|
htmlFor="studio-leading"
|
|
278
|
-
className="text-xs font-medium uppercase tracking-wider text-
|
|
278
|
+
className="text-xs font-medium uppercase tracking-wider text-fg-subtle"
|
|
279
279
|
>
|
|
280
280
|
Line height
|
|
281
281
|
</label>
|
|
282
|
-
<span className="font-mono text-xs text-
|
|
282
|
+
<span className="font-mono text-xs text-fg-muted">
|
|
283
283
|
{leading.toFixed(2)}
|
|
284
284
|
</span>
|
|
285
285
|
</div>
|
|
@@ -293,14 +293,14 @@ export function FontStudio() {
|
|
|
293
293
|
onChange={(e: ChangeEvent<HTMLInputElement>) =>
|
|
294
294
|
setLeading(Number(e.target.value))
|
|
295
295
|
}
|
|
296
|
-
className="w-full accent-
|
|
296
|
+
className="w-full accent-accent"
|
|
297
297
|
/>
|
|
298
298
|
</div>
|
|
299
299
|
|
|
300
300
|
<div>
|
|
301
301
|
<label
|
|
302
302
|
htmlFor="studio-custom"
|
|
303
|
-
className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-
|
|
303
|
+
className="mb-1.5 block text-xs font-medium uppercase tracking-wider text-fg-subtle"
|
|
304
304
|
>
|
|
305
305
|
Any of 2,071 Google fonts
|
|
306
306
|
</label>
|
|
@@ -310,7 +310,7 @@ export function FontStudio() {
|
|
|
310
310
|
value={customFont}
|
|
311
311
|
onChange={(e: ChangeEvent<HTMLInputElement>) => setCustomFont(e.target.value)}
|
|
312
312
|
placeholder="e.g. Fraunces, IBM Plex Sans KR, Anton"
|
|
313
|
-
className="h-10 w-full rounded-md border border-
|
|
313
|
+
className="h-10 w-full rounded-md border border-border bg-surface px-3 text-sm text-fg placeholder:text-fg-subtle focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent-soft"
|
|
314
314
|
/>
|
|
315
315
|
</div>
|
|
316
316
|
</div>
|
|
@@ -333,8 +333,8 @@ export function FontStudio() {
|
|
|
333
333
|
{sample}
|
|
334
334
|
</div>
|
|
335
335
|
|
|
336
|
-
<div className="flex flex-wrap items-center gap-2 border-t border-
|
|
337
|
-
<span className="text-xs font-medium uppercase tracking-wider text-
|
|
336
|
+
<div className="flex flex-wrap items-center gap-2 border-t border-border bg-surface-2 px-6 py-3">
|
|
337
|
+
<span className="text-xs font-medium uppercase tracking-wider text-fg-subtle">
|
|
338
338
|
Sample
|
|
339
339
|
</span>
|
|
340
340
|
<div className="flex flex-wrap gap-1.5">
|
|
@@ -345,8 +345,8 @@ export function FontStudio() {
|
|
|
345
345
|
onClick={() => setSample(s)}
|
|
346
346
|
className={`rounded-full px-2.5 py-1 text-xs transition-colors ${
|
|
347
347
|
sample === s
|
|
348
|
-
? "bg-
|
|
349
|
-
: "border border-
|
|
348
|
+
? "bg-fg text-bg"
|
|
349
|
+
: "border border-border bg-surface text-fg-muted hover:text-fg"
|
|
350
350
|
}`}
|
|
351
351
|
>
|
|
352
352
|
{s.length > 24 ? `${s.slice(0, 22)}…` : s}
|
|
@@ -357,21 +357,21 @@ export function FontStudio() {
|
|
|
357
357
|
type="text"
|
|
358
358
|
value={sample}
|
|
359
359
|
onChange={(e: ChangeEvent<HTMLInputElement>) => setSample(e.target.value)}
|
|
360
|
-
className="ml-auto h-8 min-w-0 max-w-xs flex-1 rounded-md border border-
|
|
360
|
+
className="ml-auto h-8 min-w-0 max-w-xs flex-1 rounded-md border border-border bg-surface px-3 text-xs text-fg focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent-soft"
|
|
361
361
|
placeholder="Type to preview…"
|
|
362
362
|
/>
|
|
363
363
|
</div>
|
|
364
364
|
</div>
|
|
365
365
|
</div>
|
|
366
366
|
|
|
367
|
-
<div className="border-t border-
|
|
368
|
-
<span className="text-
|
|
367
|
+
<div className="border-t border-border bg-bg px-6 py-4 font-mono text-xs">
|
|
368
|
+
<span className="text-accent">import</span>
|
|
369
369
|
{" { "}
|
|
370
|
-
<span className="text-
|
|
370
|
+
<span className="text-fg">{activeImportName}</span>
|
|
371
371
|
{" } "}
|
|
372
|
-
<span className="text-
|
|
373
|
-
<span className="text-
|
|
374
|
-
<span className="text-
|
|
372
|
+
<span className="text-accent">from</span>
|
|
373
|
+
<span className="text-success">{" "}"swift-rust/font/google"</span>
|
|
374
|
+
<span className="text-fg-muted">;</span>
|
|
375
375
|
</div>
|
|
376
376
|
</div>
|
|
377
377
|
);
|
|
@@ -34,19 +34,19 @@ const COLUMNS: Array<{ title: string; links: Array<{ href: string; label: string
|
|
|
34
34
|
export function Footer() {
|
|
35
35
|
const year = new Date().getFullYear();
|
|
36
36
|
return (
|
|
37
|
-
<footer className="mt-32 border-t border-
|
|
37
|
+
<footer className="mt-32 border-t border-border bg-surface">
|
|
38
38
|
<div className="container-page py-16">
|
|
39
39
|
<div className="grid gap-12 md:grid-cols-[1.5fr_2fr]">
|
|
40
40
|
<div>
|
|
41
41
|
<Logo />
|
|
42
|
-
<p className="mt-4 max-w-xs text-[0.875rem] leading-relaxed text-
|
|
42
|
+
<p className="mt-4 max-w-xs text-[0.875rem] leading-relaxed text-fg-muted">
|
|
43
43
|
A full-stack React framework powered with Rust + Bun. TSX-first, single binary, four rendering modes.
|
|
44
44
|
</p>
|
|
45
45
|
</div>
|
|
46
46
|
<div className="grid grid-cols-2 gap-8 sm:grid-cols-3">
|
|
47
47
|
{COLUMNS.map((col) => (
|
|
48
48
|
<div key={col.title}>
|
|
49
|
-
<h3 className="text-[0.75rem] font-semibold uppercase tracking-wider text-
|
|
49
|
+
<h3 className="text-[0.75rem] font-semibold uppercase tracking-wider text-fg-subtle">
|
|
50
50
|
{col.title}
|
|
51
51
|
</h3>
|
|
52
52
|
<ul className="mt-4 space-y-2.5">
|
|
@@ -54,7 +54,7 @@ export function Footer() {
|
|
|
54
54
|
<li key={link.href}>
|
|
55
55
|
<Link
|
|
56
56
|
href={link.href}
|
|
57
|
-
className="text-[0.875rem] text-
|
|
57
|
+
className="text-[0.875rem] text-fg-muted transition-colors hover:text-fg"
|
|
58
58
|
>
|
|
59
59
|
{link.label}
|
|
60
60
|
</Link>
|
|
@@ -65,7 +65,7 @@ export function Footer() {
|
|
|
65
65
|
))}
|
|
66
66
|
</div>
|
|
67
67
|
</div>
|
|
68
|
-
<div className="mt-12 flex flex-col items-start justify-between gap-4 border-t border-
|
|
68
|
+
<div className="mt-12 flex flex-col items-start justify-between gap-4 border-t border-border pt-8 text-[0.8125rem] text-fg-subtle sm:flex-row sm:items-center">
|
|
69
69
|
<p>© {year} swift-rust. Built with Rust + Bun.</p>
|
|
70
70
|
<p className="font-mono">v{siteConfig.version} · MIT</p>
|
|
71
71
|
</div>
|
|
@@ -18,8 +18,8 @@ export function Logo({ className = "" }: { className?: string }) {
|
|
|
18
18
|
loader={({ src }) => src}
|
|
19
19
|
className="h-6 w-6"
|
|
20
20
|
/>
|
|
21
|
-
<span className="text-[0.95rem] font-semibold tracking-tight text-
|
|
22
|
-
swift<span className="text-
|
|
21
|
+
<span className="text-[0.95rem] font-semibold tracking-tight text-fg">
|
|
22
|
+
swift<span className="text-accent">·</span>rust
|
|
23
23
|
</span>
|
|
24
24
|
</span>
|
|
25
25
|
);
|
|
@@ -20,10 +20,15 @@ const GitHubIcon = () => (
|
|
|
20
20
|
|
|
21
21
|
export function Nav() {
|
|
22
22
|
return (
|
|
23
|
-
<header className="sticky top-0 z-40 border-b border-
|
|
23
|
+
<header className="sticky top-0 z-40 border-b border-border bg-bg/80 backdrop-blur-md">
|
|
24
24
|
{/* CSS-only mobile menu toggle: no client JS required (these pages are
|
|
25
25
|
static SSR). The peer checkbox drives the panel below. */}
|
|
26
|
-
<input
|
|
26
|
+
<input
|
|
27
|
+
type="checkbox"
|
|
28
|
+
id="site-menu"
|
|
29
|
+
className="peer sr-only"
|
|
30
|
+
aria-label="Toggle menu"
|
|
31
|
+
/>
|
|
27
32
|
|
|
28
33
|
<div className="container-page flex h-14 items-center justify-between gap-8">
|
|
29
34
|
<Link href="/" aria-label="Home">
|
|
@@ -35,7 +40,7 @@ export function Nav() {
|
|
|
35
40
|
<Link
|
|
36
41
|
key={item.href}
|
|
37
42
|
href={item.href}
|
|
38
|
-
className="rounded-md px-3 py-1.5 text-[0.875rem] text-
|
|
43
|
+
className="rounded-md px-3 py-1.5 text-[0.875rem] text-fg-muted transition-colors hover:bg-surface-2 hover:text-fg"
|
|
39
44
|
>
|
|
40
45
|
{item.label}
|
|
41
46
|
</Link>
|
|
@@ -52,7 +57,10 @@ export function Nav() {
|
|
|
52
57
|
<GitHubIcon />
|
|
53
58
|
GitHub
|
|
54
59
|
</a>
|
|
55
|
-
<Link
|
|
60
|
+
<Link
|
|
61
|
+
href={siteConfig.docsUrl}
|
|
62
|
+
className="btn btn-accent btn-sm hidden sm:inline-flex"
|
|
63
|
+
>
|
|
56
64
|
Get started
|
|
57
65
|
</Link>
|
|
58
66
|
|
|
@@ -60,9 +68,16 @@ export function Nav() {
|
|
|
60
68
|
<label
|
|
61
69
|
htmlFor="site-menu"
|
|
62
70
|
aria-label="Toggle navigation menu"
|
|
63
|
-
className="inline-flex h-9 w-9 cursor-pointer items-center justify-center rounded-md border border-
|
|
71
|
+
className="inline-flex h-9 w-9 cursor-pointer items-center justify-center rounded-md border border-border text-fg md:hidden"
|
|
64
72
|
>
|
|
65
|
-
<svg
|
|
73
|
+
<svg
|
|
74
|
+
viewBox="0 0 24 24"
|
|
75
|
+
className="h-5 w-5 peer-checked:hidden"
|
|
76
|
+
fill="none"
|
|
77
|
+
stroke="currentColor"
|
|
78
|
+
strokeWidth="2"
|
|
79
|
+
aria-hidden
|
|
80
|
+
>
|
|
66
81
|
<path d="M4 7h16M4 12h16M4 17h16" strokeLinecap="round" />
|
|
67
82
|
</svg>
|
|
68
83
|
</label>
|
|
@@ -70,18 +85,18 @@ export function Nav() {
|
|
|
70
85
|
</div>
|
|
71
86
|
|
|
72
87
|
{/* Mobile dropdown panel — shown only when the checkbox is checked. */}
|
|
73
|
-
<nav className="hidden border-t border-
|
|
88
|
+
<nav className="hidden border-t border-border bg-bg px-4 py-3 peer-checked:block md:hidden!">
|
|
74
89
|
<div className="flex flex-col gap-1">
|
|
75
90
|
{NAV.map((item) => (
|
|
76
91
|
<Link
|
|
77
92
|
key={item.href}
|
|
78
93
|
href={item.href}
|
|
79
|
-
className="rounded-md px-3 py-2 text-[0.95rem] text-
|
|
94
|
+
className="rounded-md px-3 py-2 text-[0.95rem] text-fg-muted hover:bg-surface-2 hover:text-fg"
|
|
80
95
|
>
|
|
81
96
|
{item.label}
|
|
82
97
|
</Link>
|
|
83
98
|
))}
|
|
84
|
-
<div className="mt-2 flex gap-2 border-t border-
|
|
99
|
+
<div className="mt-2 flex gap-2 border-t border-border pt-3">
|
|
85
100
|
<a
|
|
86
101
|
href={siteConfig.githubUrl}
|
|
87
102
|
target="_blank"
|
|
@@ -91,7 +106,10 @@ export function Nav() {
|
|
|
91
106
|
<GitHubIcon />
|
|
92
107
|
GitHub
|
|
93
108
|
</a>
|
|
94
|
-
<Link
|
|
109
|
+
<Link
|
|
110
|
+
href={siteConfig.docsUrl}
|
|
111
|
+
className="btn btn-accent btn-sm flex-1 justify-center"
|
|
112
|
+
>
|
|
95
113
|
Get started
|
|
96
114
|
</Link>
|
|
97
115
|
</div>
|
|
@@ -21,14 +21,14 @@ const ITEMS = [
|
|
|
21
21
|
|
|
22
22
|
export function Sidebar({ pathname = "" }: { pathname?: string }) {
|
|
23
23
|
return (
|
|
24
|
-
<aside className="sticky top-14 hidden h-[calc(100vh-3.5rem)] w-60 shrink-0 self-start flex-col border-r border-
|
|
25
|
-
<div className="flex h-14 items-center border-b border-
|
|
24
|
+
<aside className="sticky top-14 hidden h-[calc(100vh-3.5rem)] w-60 shrink-0 self-start flex-col border-r border-border bg-surface lg:flex">
|
|
25
|
+
<div className="flex h-14 items-center border-b border-border px-5">
|
|
26
26
|
<Logo />
|
|
27
27
|
</div>
|
|
28
28
|
<nav className="flex-1 space-y-8 overflow-y-auto p-5">
|
|
29
29
|
{ITEMS.map((group) => (
|
|
30
30
|
<div key={group.section}>
|
|
31
|
-
<h3 className="mb-2 px-2 text-[0.7rem] font-semibold uppercase tracking-wider text-
|
|
31
|
+
<h3 className="mb-2 px-2 text-[0.7rem] font-semibold uppercase tracking-wider text-fg-subtle">
|
|
32
32
|
{group.section}
|
|
33
33
|
</h3>
|
|
34
34
|
<ul className="space-y-0.5">
|
|
@@ -44,8 +44,8 @@ export function Sidebar({ pathname = "" }: { pathname?: string }) {
|
|
|
44
44
|
href={link.href}
|
|
45
45
|
className={`flex items-center gap-2.5 rounded-md px-2.5 py-1.5 text-[0.875rem] transition-colors ${
|
|
46
46
|
active
|
|
47
|
-
? "bg-
|
|
48
|
-
: "text-
|
|
47
|
+
? "bg-accent-soft font-medium text-accent"
|
|
48
|
+
: "text-fg-muted hover:bg-surface-2 hover:text-fg"
|
|
49
49
|
}`}
|
|
50
50
|
>
|
|
51
51
|
<Icon className="h-4 w-4" />
|
|
@@ -58,11 +58,11 @@ export function Sidebar({ pathname = "" }: { pathname?: string }) {
|
|
|
58
58
|
</div>
|
|
59
59
|
))}
|
|
60
60
|
</nav>
|
|
61
|
-
<div className="border-t border-
|
|
62
|
-
<div className="rounded-lg border border-
|
|
63
|
-
<p className="text-[0.75rem] font-medium text-
|
|
64
|
-
<p className="mt-1 text-[0.75rem] leading-relaxed text-
|
|
65
|
-
Press <kbd className="rounded border border-
|
|
61
|
+
<div className="border-t border-border p-4">
|
|
62
|
+
<div className="rounded-lg border border-border bg-surface-2 p-3">
|
|
63
|
+
<p className="text-[0.75rem] font-medium text-fg">Pro tip</p>
|
|
64
|
+
<p className="mt-1 text-[0.75rem] leading-relaxed text-fg-muted">
|
|
65
|
+
Press <kbd className="rounded border border-border bg-surface px-1 font-mono text-[0.6875rem]">⌘K</kbd> for quick search.
|
|
66
66
|
</p>
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|