@farming-labs/theme 0.0.2-beta.17 → 0.0.2-beta.18

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.
@@ -336,7 +336,8 @@ function DocsCommandSearch() {
336
336
  const button = e.target.closest("button");
337
337
  if (!button) return;
338
338
  const text = button.textContent || "";
339
- if (text.includes("Search") && (text.includes("") || text.includes("K"))) {
339
+ const ariaLabel = (button.getAttribute("aria-label") || "").toLowerCase();
340
+ if (text.includes("Search") && (text.includes("⌘") || text.includes("K")) || ariaLabel.includes("search") || text === "Open Search") {
340
341
  e.preventDefault();
341
342
  e.stopPropagation();
342
343
  e.stopImmediatePropagation();
@@ -0,0 +1,79 @@
1
+ import * as _farming_labs_docs0 from "@farming-labs/docs";
2
+
3
+ //#region src/shiny/index.d.ts
4
+ declare const ShinyUIDefaults: {
5
+ colors: {
6
+ primary: string;
7
+ background: string;
8
+ muted: string;
9
+ border: string;
10
+ };
11
+ typography: {
12
+ font: {
13
+ style: {
14
+ sans: string;
15
+ mono: string;
16
+ };
17
+ h1: {
18
+ size: string;
19
+ weight: number;
20
+ lineHeight: string;
21
+ letterSpacing: string;
22
+ };
23
+ h2: {
24
+ size: string;
25
+ weight: number;
26
+ lineHeight: string;
27
+ letterSpacing: string;
28
+ };
29
+ h3: {
30
+ size: string;
31
+ weight: number;
32
+ lineHeight: string;
33
+ };
34
+ h4: {
35
+ size: string;
36
+ weight: number;
37
+ lineHeight: string;
38
+ };
39
+ body: {
40
+ size: string;
41
+ weight: number;
42
+ lineHeight: string;
43
+ };
44
+ small: {
45
+ size: string;
46
+ weight: number;
47
+ lineHeight: string;
48
+ };
49
+ };
50
+ };
51
+ layout: {
52
+ contentWidth: number;
53
+ sidebarWidth: number;
54
+ toc: {
55
+ enabled: boolean;
56
+ depth: number;
57
+ style: "default";
58
+ };
59
+ header: {
60
+ height: number;
61
+ sticky: boolean;
62
+ };
63
+ };
64
+ components: {
65
+ Callout: {
66
+ variant: string;
67
+ icon: boolean;
68
+ };
69
+ CodeBlock: {
70
+ showCopyButton: boolean;
71
+ };
72
+ Tabs: {
73
+ style: string;
74
+ };
75
+ };
76
+ };
77
+ declare const shiny: (overrides?: Partial<_farming_labs_docs0.DocsTheme>) => _farming_labs_docs0.DocsTheme;
78
+ //#endregion
79
+ export { ShinyUIDefaults, shiny };
@@ -0,0 +1,83 @@
1
+ import { createTheme } from "@farming-labs/docs";
2
+
3
+ //#region src/shiny/index.ts
4
+ /**
5
+ * Shiny theme preset — Clerk docs-inspired, clean, polished UI with
6
+ * purple accents and a professional light/dark design.
7
+ *
8
+ * CSS: `@import "@farming-labs/theme/shiny/css";`
9
+ */
10
+ const ShinyUIDefaults = {
11
+ colors: {
12
+ primary: "hsl(256, 100%, 64%)",
13
+ background: "#f7f7f8",
14
+ muted: "#73738c",
15
+ border: "#e5e5ea"
16
+ },
17
+ typography: { font: {
18
+ style: {
19
+ sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
20
+ mono: "ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"
21
+ },
22
+ h1: {
23
+ size: "2rem",
24
+ weight: 600,
25
+ lineHeight: "1.2",
26
+ letterSpacing: "-0.02em"
27
+ },
28
+ h2: {
29
+ size: "1.5rem",
30
+ weight: 600,
31
+ lineHeight: "1.3",
32
+ letterSpacing: "-0.01em"
33
+ },
34
+ h3: {
35
+ size: "1.25rem",
36
+ weight: 600,
37
+ lineHeight: "1.4"
38
+ },
39
+ h4: {
40
+ size: "1.125rem",
41
+ weight: 600,
42
+ lineHeight: "1.4"
43
+ },
44
+ body: {
45
+ size: "0.9375rem",
46
+ weight: 400,
47
+ lineHeight: "1.7"
48
+ },
49
+ small: {
50
+ size: "0.8125rem",
51
+ weight: 400,
52
+ lineHeight: "1.5"
53
+ }
54
+ } },
55
+ layout: {
56
+ contentWidth: 768,
57
+ sidebarWidth: 280,
58
+ toc: {
59
+ enabled: true,
60
+ depth: 3,
61
+ style: "default"
62
+ },
63
+ header: {
64
+ height: 64,
65
+ sticky: true
66
+ }
67
+ },
68
+ components: {
69
+ Callout: {
70
+ variant: "soft",
71
+ icon: true
72
+ },
73
+ CodeBlock: { showCopyButton: true },
74
+ Tabs: { style: "default" }
75
+ }
76
+ };
77
+ const shiny = createTheme({
78
+ name: "shiny",
79
+ ui: ShinyUIDefaults
80
+ });
81
+
82
+ //#endregion
83
+ export { ShinyUIDefaults, shiny };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/theme",
3
- "version": "0.0.2-beta.17",
3
+ "version": "0.0.2-beta.18",
4
4
  "description": "Theme package for @farming-labs/docs — layout, provider, MDX components, and styles",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -36,6 +36,11 @@
36
36
  "import": "./dist/colorful/index.mjs",
37
37
  "default": "./dist/colorful/index.mjs"
38
38
  },
39
+ "./shiny": {
40
+ "types": "./dist/shiny/index.d.mts",
41
+ "import": "./dist/shiny/index.mjs",
42
+ "default": "./dist/shiny/index.mjs"
43
+ },
39
44
  "./search": {
40
45
  "types": "./dist/search.d.mts",
41
46
  "import": "./dist/search.mjs",
@@ -52,6 +57,7 @@
52
57
  "./darksharp/css": "./styles/darksharp.css",
53
58
  "./pixel-border/css": "./styles/pixel-border.css",
54
59
  "./colorful/css": "./styles/colorful.css",
60
+ "./shiny/css": "./styles/shiny.css",
55
61
  "./presets/neutral": "./styles/presets/neutral.css",
56
62
  "./presets/black": "./styles/presets/black.css",
57
63
  "./presets/base": "./styles/presets/base.css"
@@ -80,7 +86,7 @@
80
86
  "next": ">=14.0.0",
81
87
  "tsdown": "^0.20.3",
82
88
  "typescript": "^5.9.3",
83
- "@farming-labs/docs": "0.0.2-beta.17"
89
+ "@farming-labs/docs": "0.0.2-beta.18"
84
90
  },
85
91
  "peerDependencies": {
86
92
  "@farming-labs/docs": ">=0.0.1",
package/styles/omni.css CHANGED
@@ -57,6 +57,17 @@
57
57
  animation: omni-scale-in 200ms cubic-bezier(0.16, 1, 0.3, 1);
58
58
  }
59
59
 
60
+ @media (max-width: 639px) {
61
+ .omni-content {
62
+ top: 10%;
63
+ width: calc(100% - 24px);
64
+ max-height: 75vh;
65
+ }
66
+ .omni-kbd {
67
+ display: none;
68
+ }
69
+ }
70
+
60
71
  /* Header */
61
72
  .omni-header {
62
73
  border-bottom: 1px solid var(--color-fd-border, #262626);
@@ -0,0 +1,488 @@
1
+ /* @farming-labs/theme — shiny theme CSS
2
+ * Clerk docs-inspired clean, polished light/dark theme with purple accents.
3
+ */
4
+ @import "./presets/neutral.css";
5
+
6
+ /* ─── Shiny color overrides ───────────────────────────────────────── */
7
+
8
+ :root {
9
+ --color-fd-primary: hsl(256, 100%, 64%);
10
+ --color-fd-primary-foreground: hsl(0, 0%, 100%);
11
+ --color-fd-ring: hsl(256, 85%, 60%);
12
+
13
+ --color-fd-background: hsl(240, 6%, 97%);
14
+ --color-fd-foreground: hsl(240, 10%, 8%);
15
+ --color-fd-card: hsl(0, 0%, 100%);
16
+ --color-fd-card-foreground: hsl(240, 10%, 8%);
17
+ --color-fd-popover: hsl(0, 0%, 100%);
18
+ --color-fd-popover-foreground: hsl(240, 10%, 8%);
19
+ --color-fd-secondary: hsl(240, 5%, 96%);
20
+ --color-fd-secondary-foreground: hsl(240, 6%, 10%);
21
+ --color-fd-muted: hsl(240, 5%, 96%);
22
+ --color-fd-muted-foreground: hsl(240, 4%, 46%);
23
+ --color-fd-accent: hsl(240, 5%, 94%);
24
+ --color-fd-accent-foreground: hsl(240, 6%, 10%);
25
+ --color-fd-border: hsl(240, 6%, 90%);
26
+ }
27
+
28
+ .dark {
29
+ --color-fd-primary: hsl(256, 100%, 72%);
30
+ --color-fd-primary-foreground: hsl(0, 0%, 100%);
31
+ --color-fd-ring: hsl(256, 85%, 65%);
32
+
33
+ --color-fd-background: hsl(240, 10%, 7%);
34
+ --color-fd-foreground: hsl(0, 0%, 95%);
35
+ --color-fd-card: hsl(240, 8%, 10%);
36
+ --color-fd-card-foreground: hsl(0, 0%, 95%);
37
+ --color-fd-popover: hsl(240, 8%, 10%);
38
+ --color-fd-popover-foreground: hsl(0, 0%, 95%);
39
+ --color-fd-secondary: hsl(240, 6%, 14%);
40
+ --color-fd-secondary-foreground: hsl(0, 0%, 90%);
41
+ --color-fd-muted: hsl(240, 5%, 16%);
42
+ --color-fd-muted-foreground: hsl(240, 4%, 58%);
43
+ --color-fd-accent: hsl(240, 6%, 16%);
44
+ --color-fd-accent-foreground: hsl(0, 0%, 90%);
45
+ --color-fd-border: hsl(240, 5%, 18%);
46
+ }
47
+
48
+ /* ─── Description under title ──────────────────────────────────────── */
49
+
50
+ .fd-page-description {
51
+ margin-bottom: 1rem;
52
+ font-size: 1rem;
53
+ line-height: 1.7;
54
+ color: var(--color-fd-muted-foreground);
55
+ }
56
+
57
+ /* ─── Page Actions (shiny theme) ────────────────────────────────────── */
58
+
59
+ .fd-page-action-btn {
60
+ border-radius: 0.5rem;
61
+ font-size: 0.8125rem;
62
+ }
63
+
64
+ .fd-page-action-menu {
65
+ border-radius: 0.75rem;
66
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.04);
67
+ }
68
+
69
+ .fd-page-action-menu-item {
70
+ border-radius: 0.375rem;
71
+ }
72
+
73
+ /* ─── AI Chat (shiny theme) ──────────────────────────────────────────── */
74
+
75
+ .fd-ai-dialog {
76
+ border-radius: 16px;
77
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.08), 0 8px 32px rgba(0, 0, 0, 0.1);
78
+ }
79
+
80
+ .fd-ai-bubble-user {
81
+ border-radius: 18px 18px 4px 18px;
82
+ }
83
+
84
+ .fd-ai-bubble-ai {
85
+ border-radius: 18px 18px 18px 4px;
86
+ }
87
+
88
+ .fd-ai-input-wrap {
89
+ border-radius: 12px;
90
+ }
91
+
92
+ .fd-ai-send-btn {
93
+ border-radius: 10px;
94
+ }
95
+
96
+ .fd-ai-floating-btn {
97
+ border-radius: 6px;
98
+ background: hsl(240, 6%, 15%);
99
+ color: #fff;
100
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.07), 0 1px 3px rgba(0, 0, 0, 0.2);
101
+ border: none;
102
+ }
103
+
104
+ .fd-ai-floating-btn:hover {
105
+ background: hsl(240, 6%, 20%);
106
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.1), 0 2px 6px rgba(0, 0, 0, 0.25);
107
+ }
108
+
109
+ :root .fd-ai-floating-btn {
110
+ background: hsl(240, 7%, 14%);
111
+ color: #fff;
112
+ }
113
+
114
+ :root .fd-ai-floating-btn:hover {
115
+ background: hsl(240, 7%, 20%);
116
+ }
117
+
118
+ .fd-ai-suggestion {
119
+ border-radius: 10px;
120
+ }
121
+
122
+ .fd-ai-result {
123
+ border-radius: 10px;
124
+ }
125
+
126
+ /* ─── Full-Modal ────────────────────────────────────────────────────── */
127
+
128
+ .fd-ai-fm-input-container {
129
+ border-radius: 14px;
130
+ }
131
+
132
+ .fd-ai-fm-send-btn {
133
+ border-radius: 9999px;
134
+ }
135
+
136
+ .fd-ai-fm-suggestion {
137
+ border-radius: 9999px;
138
+ }
139
+
140
+ .fd-ai-fm-trigger-btn {
141
+ border-radius: 18px;
142
+ }
143
+
144
+ .fd-ai-fm-close-btn {
145
+ border-radius: 9999px;
146
+ }
147
+
148
+ /* ─── Code blocks (shiny) ────────────────────────────────────────────── */
149
+
150
+ .fd-ai-code-block {
151
+ border-radius: 10px;
152
+ }
153
+
154
+ .fd-ai-code-copy {
155
+ border-radius: 6px;
156
+ }
157
+
158
+ /* ─── Sidebar shiny overrides ────────────────────────────────────────── */
159
+
160
+ :root .fd-sidebar {
161
+ --color-fd-muted: hsl(240, 5%, 96%);
162
+ --color-fd-secondary: hsl(240, 5%, 94%);
163
+ --color-fd-muted-foreground: hsl(240, 4%, 46%);
164
+ }
165
+
166
+ .dark .fd-sidebar {
167
+ --color-fd-muted: hsl(240, 5%, 14%);
168
+ --color-fd-secondary: hsl(240, 6%, 16%);
169
+ --color-fd-muted-foreground: hsl(240, 4%, 56%);
170
+ }
171
+
172
+ /* Active sidebar item: subtle purple tint — scoped to sidebar only */
173
+ :root aside [data-active="true"] > a,
174
+ :root aside a[data-active="true"] {
175
+ background: hsl(256, 100%, 97%);
176
+ color: hsl(256, 100%, 50%);
177
+ font-weight: 500;
178
+ }
179
+
180
+ .dark aside [data-active="true"] > a,
181
+ .dark aside a[data-active="true"] {
182
+ background: hsl(256, 40%, 16%);
183
+ color: hsl(256, 100%, 78%);
184
+ font-weight: 500;
185
+ }
186
+
187
+ /* ─── Cards (shiny style — clean, subtle shadow) ────────────────────── */
188
+
189
+ .fd-card {
190
+ display: block;
191
+ border-radius: 0.75rem;
192
+ border: 1px solid var(--color-fd-border);
193
+ background: var(--color-fd-card);
194
+ padding: 1.25rem;
195
+ font-size: 0.875rem;
196
+ color: var(--color-fd-card-foreground);
197
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.04), 0 1px 2px -1px rgb(0 0 0 / 0.04);
198
+ transition: background-color 150ms, border-color 150ms, box-shadow 150ms;
199
+ }
200
+
201
+ .fd-card:hover {
202
+ border-color: var(--color-fd-primary);
203
+ box-shadow: 0 2px 8px 0 rgb(0 0 0 / 0.06);
204
+ }
205
+
206
+ .fd-card-icon {
207
+ margin-bottom: 0.625rem;
208
+ width: fit-content;
209
+ border-radius: 0.5rem;
210
+ border: 1px solid var(--color-fd-border);
211
+ padding: 0.5rem;
212
+ color: var(--color-fd-muted-foreground);
213
+ background: var(--color-fd-secondary);
214
+ }
215
+
216
+ .fd-card-title {
217
+ font-weight: 500;
218
+ font-size: 0.9375rem;
219
+ }
220
+
221
+ .fd-card-description {
222
+ color: var(--color-fd-muted-foreground);
223
+ margin-top: 0.25rem;
224
+ font-size: 0.8125rem;
225
+ line-height: 1.55;
226
+ }
227
+
228
+ /* ─── Cards grid ──────────────────────────────────────────────────── */
229
+
230
+ .fd-cards {
231
+ display: grid;
232
+ grid-template-columns: 1fr;
233
+ gap: 0.75rem;
234
+ }
235
+
236
+ @media (min-width: 640px) {
237
+ .fd-cards {
238
+ grid-template-columns: repeat(2, 1fr);
239
+ }
240
+ }
241
+
242
+ /* ─── Page nav cards (shiny style) ─────────────────────────────────── */
243
+
244
+ .fd-page-nav-card {
245
+ border-radius: 0.75rem;
246
+ }
247
+
248
+ /* ─── Inline code (Clerk style — subtle, no heavy borders) ─────────── */
249
+
250
+ .fd-docs-content :not(pre) > code {
251
+ padding: 2px 6px;
252
+ border: 1px solid var(--color-fd-border);
253
+ font-size: 0.8125rem;
254
+ border-radius: 6px;
255
+ background: var(--color-fd-muted);
256
+ color: var(--color-fd-foreground);
257
+ font-weight: 450;
258
+ }
259
+
260
+ /* ─── Links in prose (purple underline like Clerk) ─────────────────── */
261
+
262
+ .fd-docs-content a:not(.fd-page-nav-card):not([class]) {
263
+ text-decoration: underline;
264
+ text-underline-offset: 3px;
265
+ text-decoration-color: var(--color-fd-primary);
266
+ text-decoration-thickness: 1.5px;
267
+ font-weight: 500;
268
+ color: var(--color-fd-primary);
269
+ transition: opacity 150ms;
270
+ }
271
+
272
+ .fd-docs-content a:not(.fd-page-nav-card):not([class]):hover {
273
+ opacity: 0.8;
274
+ }
275
+
276
+ /* ─── Tables (clean, rounded like Clerk) ───────────────────────────── */
277
+
278
+ .fd-docs-content table {
279
+ border-collapse: separate;
280
+ border-spacing: 0;
281
+ background: var(--color-fd-card);
282
+ border-radius: 0.75rem;
283
+ border: 1px solid var(--color-fd-border);
284
+ overflow: hidden;
285
+ width: 100%;
286
+ }
287
+
288
+ .fd-docs-content th {
289
+ background: var(--color-fd-muted);
290
+ font-weight: 600;
291
+ font-size: 0.8125rem;
292
+ text-transform: uppercase;
293
+ letter-spacing: 0.03em;
294
+ color: var(--color-fd-muted-foreground);
295
+ }
296
+
297
+ .fd-docs-content th,
298
+ .fd-docs-content td {
299
+ padding: 0.75rem 1rem;
300
+ border-bottom: 1px solid var(--color-fd-border);
301
+ font-size: 0.875rem;
302
+ }
303
+
304
+ .fd-docs-content tr:last-child td {
305
+ border-bottom: none;
306
+ }
307
+
308
+ /* ─── Blockquotes (purple left border like Clerk) ──────────────────── */
309
+
310
+ .fd-docs-content blockquote {
311
+ border-left: 3px solid var(--color-fd-primary);
312
+ padding-left: 1rem;
313
+ color: var(--color-fd-muted-foreground);
314
+ font-style: normal;
315
+ margin: 1rem 0;
316
+ }
317
+
318
+ /* ─── Horizontal rule ──────────────────────────────────────────────── */
319
+
320
+ .fd-docs-content hr {
321
+ border-color: var(--color-fd-border);
322
+ }
323
+
324
+ /* ─── Code blocks (Clerk-style dark, no radius on inner, rounded wrapper) */
325
+
326
+ figure.shiki {
327
+ border-radius: 0.625rem;
328
+ overflow: hidden;
329
+ border: 1px solid var(--color-fd-border);
330
+ }
331
+
332
+ :root figure.shiki {
333
+ border-color: hsl(240, 6%, 88%);
334
+ }
335
+
336
+ .dark figure.shiki {
337
+ border-color: hsl(240, 5%, 20%);
338
+ }
339
+
340
+ /* ─── Tabs (Clerk code tab style) ───────────────────────────────────── */
341
+
342
+ [role="tablist"] {
343
+ border-bottom: 1px solid var(--color-fd-border);
344
+ }
345
+
346
+ [role="tab"] {
347
+ font-size: 0.8125rem;
348
+ font-weight: 450;
349
+ padding: 0.5rem 0.875rem;
350
+ border-radius: 0;
351
+ color: var(--color-fd-muted-foreground);
352
+ border-bottom: 2px solid transparent;
353
+ transition: color 150ms, border-color 150ms;
354
+ }
355
+
356
+ [role="tab"][aria-selected="true"],
357
+ [role="tab"][data-state="active"] {
358
+ color: var(--color-fd-foreground);
359
+ border-bottom-color: var(--color-fd-primary);
360
+ font-weight: 500;
361
+ }
362
+
363
+ /* ─── Callout (clean, subtle) ───────────────────────────────────────── */
364
+
365
+ [style*="--callout-color"] {
366
+ border-radius: 0.625rem;
367
+ border-width: 1px;
368
+ }
369
+
370
+ /* ─── Accordion ────────────────────────────────────────────────────── */
371
+
372
+ details {
373
+ border: 1px solid var(--color-fd-border);
374
+ border-radius: 0.625rem;
375
+ padding: 0;
376
+ margin: 0.75rem 0;
377
+ overflow: hidden;
378
+ }
379
+
380
+ details summary {
381
+ padding: 0.75rem 1rem;
382
+ font-weight: 500;
383
+ font-size: 0.9375rem;
384
+ cursor: pointer;
385
+ color: var(--color-fd-foreground);
386
+ background: var(--color-fd-secondary);
387
+ transition: background 150ms;
388
+ }
389
+
390
+ details summary:hover {
391
+ background: var(--color-fd-accent);
392
+ }
393
+
394
+ details[open] summary {
395
+ border-bottom: 1px solid var(--color-fd-border);
396
+ }
397
+
398
+ details > :not(summary) {
399
+ padding: 0.75rem 1rem;
400
+ }
401
+
402
+ /* ─── Steps indicator (numbered circles like Clerk) ─────────────────── */
403
+
404
+ [data-type="step"] {
405
+ counter-increment: step;
406
+ position: relative;
407
+ padding-left: 2.5rem;
408
+ }
409
+
410
+ [data-type="step"]::before {
411
+ content: counter(step);
412
+ position: absolute;
413
+ left: 0;
414
+ top: 0.125rem;
415
+ width: 1.5rem;
416
+ height: 1.5rem;
417
+ border-radius: 9999px;
418
+ background: var(--color-fd-primary);
419
+ color: var(--color-fd-primary-foreground);
420
+ font-size: 0.75rem;
421
+ font-weight: 600;
422
+ display: flex;
423
+ align-items: center;
424
+ justify-content: center;
425
+ }
426
+
427
+ /* ─── Omni Command Palette (shiny theme) ─────────────────────────── */
428
+
429
+ .omni-content {
430
+ border-radius: 0.875rem;
431
+ border: 1px solid var(--color-fd-border);
432
+ background: var(--color-fd-popover);
433
+ box-shadow: 0 24px 80px -12px rgba(0, 0, 0, 0.12), 0 8px 30px rgba(0, 0, 0, 0.08);
434
+ }
435
+
436
+ .omni-item {
437
+ border-radius: 0.5rem;
438
+ }
439
+
440
+ .omni-item-active {
441
+ background: color-mix(in srgb, var(--color-fd-primary) 10%, transparent);
442
+ }
443
+
444
+ .omni-highlight {
445
+ background: color-mix(in srgb, var(--color-fd-primary) 20%, transparent);
446
+ color: var(--color-fd-primary);
447
+ }
448
+
449
+ .omni-search-input:focus {
450
+ caret-color: var(--color-fd-primary);
451
+ }
452
+
453
+ /* ─── TOC (shiny) ───────────────────────────────────────────────────── */
454
+
455
+ .toc-thumb {
456
+ background: var(--color-fd-border);
457
+ opacity: 1;
458
+ }
459
+
460
+ #nd-toc a[data-active="true"] {
461
+ box-shadow: inset 2px 0 0 var(--color-fd-primary);
462
+ color: var(--color-fd-primary);
463
+ }
464
+
465
+ #nd-toc a[data-active="false"] {
466
+ box-shadow: none;
467
+ }
468
+
469
+ /* ─── Page footer (shiny) ───────────────────────────────────────────── */
470
+
471
+ .fd-page-footer {
472
+ border-top: 1px solid var(--color-fd-border);
473
+ }
474
+
475
+ /* ─── Scrollbar (subtle) ────────────────────────────────────────────── */
476
+
477
+ .fd-sidebar::-webkit-scrollbar {
478
+ width: 4px;
479
+ }
480
+
481
+ .fd-sidebar::-webkit-scrollbar-thumb {
482
+ background: var(--color-fd-border);
483
+ border-radius: 4px;
484
+ }
485
+
486
+ .fd-sidebar::-webkit-scrollbar-track {
487
+ background: transparent;
488
+ }