@farming-labs/svelte-theme 0.0.2-beta.26 → 0.0.2-beta.28

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/svelte-theme",
3
- "version": "0.0.2-beta.26",
3
+ "version": "0.0.2-beta.28",
4
4
  "description": "Svelte UI components for @farming-labs/docs — layout, sidebar, TOC, search, and theme toggle",
5
5
  "keywords": [
6
6
  "docs",
@@ -29,6 +29,9 @@
29
29
  ],
30
30
  ".": [
31
31
  "./src/index.d.ts"
32
+ ],
33
+ "greentree": [
34
+ "./src/themes/greentree.d.ts"
32
35
  ]
33
36
  }
34
37
  },
@@ -67,13 +70,20 @@
67
70
  "./pixel-border/css": "./styles/pixel-border-bundle.css",
68
71
  "./darksharp/css": "./styles/darksharp-bundle.css",
69
72
  "./styles/colorful.css": "./styles/colorful.css",
70
- "./colorful/css": "./styles/colorful-bundle.css"
73
+ "./colorful/css": "./styles/colorful-bundle.css",
74
+ "./greentree": {
75
+ "types": "./src/themes/greentree.d.ts",
76
+ "import": "./src/themes/greentree.js",
77
+ "default": "./src/themes/greentree.js"
78
+ },
79
+ "./styles/greentree.css": "./styles/greentree.css",
80
+ "./greentree/css": "./styles/greentree-bundle.css"
71
81
  },
72
82
  "dependencies": {
73
83
  "gray-matter": "^4.0.3",
74
84
  "sugar-high": "^0.9.5",
75
- "@farming-labs/docs": "0.0.2-beta.26",
76
- "@farming-labs/svelte": "0.0.2-beta.26"
85
+ "@farming-labs/docs": "0.0.2-beta.28",
86
+ "@farming-labs/svelte": "0.0.2-beta.28"
77
87
  },
78
88
  "peerDependencies": {
79
89
  "svelte": ">=5.0.0"
@@ -13,6 +13,8 @@
13
13
  children,
14
14
  triggerComponent = null,
15
15
  sidebar = undefined,
16
+ sidebarHeader = undefined,
17
+ sidebarFooter = undefined,
16
18
  } = $props();
17
19
 
18
20
  let resolvedTitle = $derived(title ?? config?.nav?.title ?? "Docs");
@@ -252,107 +254,125 @@
252
254
  </button>
253
255
  </div>
254
256
 
257
+ {#if sidebarHeader}
258
+ <div class="fd-sidebar-banner">
259
+ {@render sidebarHeader()}
260
+ </div>
261
+ {/if}
262
+
255
263
  <nav class="fd-sidebar-nav">
256
- {#if sidebar}
257
- {@render sidebar({ tree, isActive })}
258
- {:else if tree?.children}
259
- {#each tree.children as node, i}
260
- {#if node.type === "page"}
261
- <a
262
- href={node.url}
263
- class="fd-sidebar-link fd-sidebar-top-link"
264
- class:fd-sidebar-link-active={isActive(node.url)}
265
- class:fd-sidebar-first-item={i === 0}
266
- data-active={isActive(node.url)}
267
- onclick={closeSidebar}
268
- >
269
- {#if getIcon(node.icon)}
270
- <span class="fd-sidebar-icon">{@html getIcon(node.icon)}</span>
271
- {/if}
272
- {node.name}
273
- </a>
274
- {:else if node.type === "folder"}
275
- <details class="fd-sidebar-folder" class:fd-sidebar-first-item={i === 0} open>
276
- <summary class="fd-sidebar-folder-trigger">
277
- <span class="fd-sidebar-folder-label">
278
- {#if getIcon(node.icon)}
279
- <span class="fd-sidebar-icon">{@html getIcon(node.icon)}</span>
280
- {/if}
281
- {node.name}
282
- </span>
283
- <svg class="fd-sidebar-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
284
- <polyline points="6 9 12 15 18 9" />
285
- </svg>
286
- </summary>
287
- <div class="fd-sidebar-folder-content">
288
- {#if node.index}
289
- <a
290
- href={node.index.url}
291
- class="fd-sidebar-link fd-sidebar-child-link"
292
- class:fd-sidebar-link-active={isActive(node.index.url)}
293
- data-active={isActive(node.index.url)}
294
- onclick={closeSidebar}
295
- >
296
- {node.index.name}
297
- </a>
264
+ {#snippet defaultSidebar()}
265
+ {#if tree?.children}
266
+ {#each tree.children as node, i}
267
+ {#if node.type === "page"}
268
+ <a
269
+ href={node.url}
270
+ class="fd-sidebar-link fd-sidebar-top-link"
271
+ class:fd-sidebar-link-active={isActive(node.url)}
272
+ class:fd-sidebar-first-item={i === 0}
273
+ data-active={isActive(node.url)}
274
+ onclick={closeSidebar}
275
+ >
276
+ {#if getIcon(node.icon)}
277
+ <span class="fd-sidebar-icon">{@html getIcon(node.icon)}</span>
298
278
  {/if}
299
- {#each node.children as child}
300
- {#if child.type === "page"}
279
+ {node.name}
280
+ </a>
281
+ {:else if node.type === "folder"}
282
+ <details class="fd-sidebar-folder" class:fd-sidebar-first-item={i === 0} open>
283
+ <summary class="fd-sidebar-folder-trigger">
284
+ <span class="fd-sidebar-folder-label">
285
+ {#if getIcon(node.icon)}
286
+ <span class="fd-sidebar-icon">{@html getIcon(node.icon)}</span>
287
+ {/if}
288
+ {node.name}
289
+ </span>
290
+ <svg class="fd-sidebar-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
291
+ <polyline points="6 9 12 15 18 9" />
292
+ </svg>
293
+ </summary>
294
+ <div class="fd-sidebar-folder-content">
295
+ {#if node.index}
301
296
  <a
302
- href={child.url}
297
+ href={node.index.url}
303
298
  class="fd-sidebar-link fd-sidebar-child-link"
304
- class:fd-sidebar-link-active={isActive(child.url)}
305
- data-active={isActive(child.url)}
299
+ class:fd-sidebar-link-active={isActive(node.index.url)}
300
+ data-active={isActive(node.index.url)}
306
301
  onclick={closeSidebar}
307
302
  >
308
- {child.name}
303
+ {node.index.name}
309
304
  </a>
310
- {:else if child.type === "folder"}
311
- <details class="fd-sidebar-folder fd-sidebar-nested-folder" open>
312
- <summary class="fd-sidebar-folder-trigger">
313
- <span class="fd-sidebar-folder-label">
314
- {child.name}
315
- </span>
316
- <svg class="fd-sidebar-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
317
- <polyline points="6 9 12 15 18 9" />
318
- </svg>
319
- </summary>
320
- <div class="fd-sidebar-folder-content">
321
- {#if child.index}
322
- <a
323
- href={child.index.url}
324
- class="fd-sidebar-link fd-sidebar-child-link"
325
- class:fd-sidebar-link-active={isActive(child.index.url)}
326
- data-active={isActive(child.index.url)}
327
- onclick={closeSidebar}
328
- >
329
- {child.index.name}
330
- </a>
331
- {/if}
332
- {#each child.children as grandchild}
333
- {#if grandchild.type === "page"}
305
+ {/if}
306
+ {#each node.children as child}
307
+ {#if child.type === "page"}
308
+ <a
309
+ href={child.url}
310
+ class="fd-sidebar-link fd-sidebar-child-link"
311
+ class:fd-sidebar-link-active={isActive(child.url)}
312
+ data-active={isActive(child.url)}
313
+ onclick={closeSidebar}
314
+ >
315
+ {child.name}
316
+ </a>
317
+ {:else if child.type === "folder"}
318
+ <details class="fd-sidebar-folder fd-sidebar-nested-folder" open>
319
+ <summary class="fd-sidebar-folder-trigger">
320
+ <span class="fd-sidebar-folder-label">
321
+ {child.name}
322
+ </span>
323
+ <svg class="fd-sidebar-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
324
+ <polyline points="6 9 12 15 18 9" />
325
+ </svg>
326
+ </summary>
327
+ <div class="fd-sidebar-folder-content">
328
+ {#if child.index}
334
329
  <a
335
- href={grandchild.url}
330
+ href={child.index.url}
336
331
  class="fd-sidebar-link fd-sidebar-child-link"
337
- class:fd-sidebar-link-active={isActive(grandchild.url)}
338
- data-active={isActive(grandchild.url)}
332
+ class:fd-sidebar-link-active={isActive(child.index.url)}
333
+ data-active={isActive(child.index.url)}
339
334
  onclick={closeSidebar}
340
335
  >
341
- {grandchild.name}
336
+ {child.index.name}
342
337
  </a>
343
338
  {/if}
344
- {/each}
345
- </div>
346
- </details>
347
- {/if}
348
- {/each}
349
- </div>
350
- </details>
351
- {/if}
352
- {/each}
339
+ {#each child.children as grandchild}
340
+ {#if grandchild.type === "page"}
341
+ <a
342
+ href={grandchild.url}
343
+ class="fd-sidebar-link fd-sidebar-child-link"
344
+ class:fd-sidebar-link-active={isActive(grandchild.url)}
345
+ data-active={isActive(grandchild.url)}
346
+ onclick={closeSidebar}
347
+ >
348
+ {grandchild.name}
349
+ </a>
350
+ {/if}
351
+ {/each}
352
+ </div>
353
+ </details>
354
+ {/if}
355
+ {/each}
356
+ </div>
357
+ </details>
358
+ {/if}
359
+ {/each}
360
+ {/if}
361
+ {/snippet}
362
+
363
+ {#if sidebar}
364
+ {@render sidebar({ tree, isActive })}
365
+ {:else}
366
+ {@render defaultSidebar()}
353
367
  {/if}
354
368
  </nav>
355
369
 
370
+ {#if sidebarFooter}
371
+ <div class="fd-sidebar-footer-custom">
372
+ {@render sidebarFooter()}
373
+ </div>
374
+ {/if}
375
+
356
376
  {#if showThemeToggle}
357
377
  <div class="fd-sidebar-footer">
358
378
  <ThemeToggle />
@@ -0,0 +1,4 @@
1
+ export declare const greentree: (overrides?: {
2
+ ui?: Record<string, unknown>;
3
+ }) => import("@farming-labs/docs").DocsTheme;
4
+ export declare const GreenTreeUIDefaults: Record<string, unknown>;
@@ -0,0 +1,42 @@
1
+ import { createTheme } from "@farming-labs/docs";
2
+
3
+ const GreenTreeUIDefaults = {
4
+ colors: {
5
+ primary: "#0D9373",
6
+ background: "#fff",
7
+ muted: "#505351",
8
+ border: "#DFE1E0",
9
+ },
10
+ typography: {
11
+ font: {
12
+ style: {
13
+ sans: "Inter, -apple-system, system-ui, 'Segoe UI', Roboto, sans-serif",
14
+ mono: "ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace",
15
+ },
16
+ h1: { size: "2.25rem", weight: 500, lineHeight: "1.2", letterSpacing: "-0.025em" },
17
+ h2: { size: "1.875rem", weight: 600, lineHeight: "1.25", letterSpacing: "-0.02em" },
18
+ h3: { size: "1.5rem", weight: 600, lineHeight: "1.3", letterSpacing: "-0.01em" },
19
+ h4: { size: "1.25rem", weight: 600, lineHeight: "1.4" },
20
+ body: { size: "1rem", weight: 400, lineHeight: "1.7" },
21
+ small: { size: "0.875rem", weight: 400, lineHeight: "1.5" },
22
+ },
23
+ },
24
+ layout: {
25
+ contentWidth: 768,
26
+ sidebarWidth: 240,
27
+ toc: { enabled: true, depth: 3, style: "default" },
28
+ header: { height: 56, sticky: true },
29
+ },
30
+ components: {
31
+ Callout: { variant: "soft", icon: true },
32
+ CodeBlock: { showCopyButton: true },
33
+ Tabs: { style: "default" },
34
+ },
35
+ };
36
+
37
+ export const greentree = createTheme({
38
+ name: "greentree",
39
+ ui: GreenTreeUIDefaults,
40
+ });
41
+
42
+ export { GreenTreeUIDefaults };
package/styles/docs.css CHANGED
@@ -375,6 +375,16 @@ samp {
375
375
  background: var(--color-fd-border);
376
376
  }
377
377
 
378
+ .fd-sidebar-banner {
379
+ padding: 12px 16px;
380
+ border-bottom: 1px solid var(--color-fd-border);
381
+ }
382
+
383
+ .fd-sidebar-footer-custom {
384
+ padding: 12px 16px;
385
+ border-top: 1px solid var(--color-fd-border);
386
+ }
387
+
378
388
  .fd-sidebar-footer {
379
389
  padding: 12px 16px;
380
390
  border-top: 1px solid var(--color-fd-border);
@@ -0,0 +1,2 @@
1
+ @import "./docs.css";
2
+ @import "./greentree.css";
@@ -0,0 +1,626 @@
1
+ /* @farming-labs/svelte-theme — greentree theme overrides
2
+ * Mintlify-inspired design, emerald green accent. Import AFTER docs.css.
3
+ */
4
+
5
+ /* ─── GreenTree color overrides ────────────────────────────────── */
6
+
7
+ :root {
8
+ --color-fd-primary: #0d9373;
9
+ --color-fd-primary-foreground: #fff;
10
+ --color-fd-ring: #0d9373;
11
+
12
+ --color-fd-background: #fff;
13
+ --color-fd-foreground: #171a18;
14
+ --color-fd-card: #fff;
15
+ --color-fd-card-foreground: #171a18;
16
+ --color-fd-popover: #fff;
17
+ --color-fd-popover-foreground: #171a18;
18
+ --color-fd-secondary: #f6f8f7;
19
+ --color-fd-secondary-foreground: #171a18;
20
+ --color-fd-muted: #f6f8f7;
21
+ --color-fd-muted-foreground: #505351;
22
+ --color-fd-accent: #f0f5f3;
23
+ --color-fd-accent-foreground: #171a18;
24
+ --color-fd-border: #dfe1e0;
25
+ }
26
+
27
+ .dark {
28
+ --color-fd-primary: #26bd6c;
29
+ --color-fd-primary-foreground: #0a0d0d;
30
+ --color-fd-ring: #26bd6c;
31
+
32
+ --color-fd-background: #0a0d0d;
33
+ --color-fd-foreground: #e5e7e6;
34
+ --color-fd-card: #111413;
35
+ --color-fd-card-foreground: #e5e7e6;
36
+ --color-fd-popover: #111413;
37
+ --color-fd-popover-foreground: #e5e7e6;
38
+ --color-fd-secondary: #1a1d1c;
39
+ --color-fd-secondary-foreground: #e5e7e6;
40
+ --color-fd-muted: #1a1d1c;
41
+ --color-fd-muted-foreground: #8a8d8b;
42
+ --color-fd-accent: #1a1d1c;
43
+ --color-fd-accent-foreground: #e5e7e6;
44
+ --color-fd-border: #2a2d2c;
45
+ }
46
+
47
+ /* ─── Typography — Inter, Mintlify-style values ──────────────── */
48
+
49
+ h1 {
50
+ letter-spacing: -0.025em;
51
+ font-weight: 500;
52
+ line-height: 1.2;
53
+ }
54
+
55
+ h2 {
56
+ letter-spacing: -0.02em;
57
+ font-weight: 600;
58
+ line-height: 1.25;
59
+ }
60
+
61
+ h3 {
62
+ letter-spacing: -0.01em;
63
+ font-weight: 600;
64
+ line-height: 1.3;
65
+ }
66
+
67
+ .fd-docs-content p {
68
+ font-size: 1rem;
69
+ line-height: 1.7;
70
+ }
71
+
72
+ /* ═══════════════════════════════════════════════════════════════════
73
+ * SIDEBAR — GreenTree: no border, green active background
74
+ * ═══════════════════════════════════════════════════════════════════ */
75
+
76
+ aside,
77
+ #nd-sidebar,
78
+ aside#nd-sidebar,
79
+ #nd-docs-layout aside {
80
+ border: none;
81
+ border-right: none;
82
+ border-left: none;
83
+ border-color: transparent;
84
+ box-shadow: none;
85
+ background: var(--color-fd-background);
86
+ }
87
+
88
+ aside a[data-active] {
89
+ font-size: 0.875rem;
90
+ line-height: 1.5;
91
+ font-weight: 500;
92
+ padding: 6px 10px;
93
+ border-radius: 8px;
94
+ color: var(--color-fd-muted-foreground);
95
+ transition:
96
+ color 150ms,
97
+ background-color 150ms;
98
+ }
99
+
100
+ aside a[data-active]:hover {
101
+ color: var(--color-fd-foreground);
102
+ background: var(--color-fd-accent);
103
+ }
104
+
105
+ aside a[data-active="true"] {
106
+ color: var(--color-fd-primary);
107
+ font-weight: 600;
108
+ background: rgba(13, 147, 115, 0.08);
109
+ background-color: rgba(13, 147, 115, 0.08);
110
+ }
111
+
112
+ .dark aside a[data-active="true"] {
113
+ background: rgba(38, 189, 108, 0.1);
114
+ background-color: rgba(38, 189, 108, 0.1);
115
+ color: var(--color-fd-primary);
116
+ }
117
+
118
+ aside a[data-active="true"]::before {
119
+ background-color: transparent;
120
+ width: 0;
121
+ }
122
+
123
+ aside a[data-active].w-full {
124
+ font-weight: 600;
125
+ font-size: 0.875rem;
126
+ color: var(--color-fd-foreground);
127
+ padding-top: 1rem;
128
+ padding-bottom: 0.25rem;
129
+ margin-top: 0.5rem;
130
+ background: transparent !important;
131
+ }
132
+
133
+ aside a[data-active].w-full:first-child {
134
+ margin-top: 0;
135
+ }
136
+
137
+ aside a[data-active="true"].w-full {
138
+ color: var(--color-fd-primary);
139
+ }
140
+
141
+ aside div.w-full:not([role]) {
142
+ font-weight: 600;
143
+ font-size: 0.875rem;
144
+ color: var(--color-fd-foreground);
145
+ padding-top: 1rem;
146
+ padding-bottom: 0.25rem;
147
+ margin-top: 0.5rem;
148
+ }
149
+
150
+ aside button[class*="bg-fd-secondary"] {
151
+ background: transparent;
152
+ border: 1px solid var(--color-fd-border);
153
+ border-radius: 8px;
154
+ font-size: 0.875rem;
155
+ }
156
+
157
+ aside .border-t,
158
+ aside [class*="border-t"] {
159
+ border-top-color: transparent;
160
+ }
161
+
162
+ /* ═══════════════════════════════════════════════════════════════════
163
+ * HEADER — clean, no heavy border
164
+ * ═══════════════════════════════════════════════════════════════════ */
165
+
166
+ header,
167
+ [role="banner"],
168
+ #nd-docs-layout > header,
169
+ nav[class*="header"] {
170
+ border-bottom: 1px solid var(--color-fd-border);
171
+ }
172
+
173
+ /* ═══════════════════════════════════════════════════════════════════
174
+ * CONTENT — links, code, tables, etc.
175
+ * ═══════════════════════════════════════════════════════════════════ */
176
+
177
+ .fd-docs-content a:not(.fd-page-nav-card):not([class]) {
178
+ text-decoration: underline;
179
+ text-underline-offset: 3px;
180
+ text-decoration-color: rgba(13, 147, 115, 0.3);
181
+ text-decoration-thickness: 1px;
182
+ font-weight: 500;
183
+ color: var(--color-fd-primary);
184
+ transition: text-decoration-color 150ms;
185
+ }
186
+
187
+ .fd-docs-content a:not(.fd-page-nav-card):not([class]):hover {
188
+ text-decoration-color: var(--color-fd-primary);
189
+ }
190
+
191
+ .fd-docs-content :not(pre) > code {
192
+ padding: 2px 5px;
193
+ border: 1px solid var(--color-fd-border);
194
+ font-size: 0.875rem;
195
+ border-radius: 6px;
196
+ background: var(--color-fd-muted);
197
+ color: var(--color-fd-foreground);
198
+ font-weight: 400;
199
+ }
200
+
201
+ .fd-docs-content table {
202
+ border-collapse: separate;
203
+ border-spacing: 0;
204
+ background: var(--color-fd-card);
205
+ border-radius: 8px;
206
+ border: 1px solid var(--color-fd-border);
207
+ overflow: hidden;
208
+ width: 100%;
209
+ }
210
+
211
+ .fd-docs-content th {
212
+ background: var(--color-fd-muted);
213
+ font-weight: 500;
214
+ font-size: 0.8125rem;
215
+ color: var(--color-fd-muted-foreground);
216
+ text-transform: none;
217
+ letter-spacing: normal;
218
+ }
219
+
220
+ .fd-docs-content th,
221
+ .fd-docs-content td {
222
+ padding: 0.75rem 1rem;
223
+ border-bottom: 1px solid var(--color-fd-border);
224
+ font-size: 0.875rem;
225
+ }
226
+
227
+ .fd-docs-content tr:last-child td {
228
+ border-bottom: none;
229
+ }
230
+
231
+ .fd-docs-content blockquote {
232
+ border-left: 3px solid var(--color-fd-primary);
233
+ padding-left: 1rem;
234
+ color: var(--color-fd-muted-foreground);
235
+ font-style: normal;
236
+ margin: 1rem 0;
237
+ }
238
+
239
+ .fd-docs-content hr {
240
+ border-color: var(--color-fd-border);
241
+ }
242
+
243
+ /* ═══════════════════════════════════════════════════════════════════
244
+ * CARDS
245
+ * ═══════════════════════════════════════════════════════════════════ */
246
+
247
+ .fd-card {
248
+ display: block;
249
+ border-radius: 12px;
250
+ border: 1px solid var(--color-fd-border);
251
+ background: var(--color-fd-card);
252
+ padding: 1.25rem;
253
+ font-size: 0.875rem;
254
+ color: var(--color-fd-card-foreground);
255
+ box-shadow: none;
256
+ transition:
257
+ background-color 150ms,
258
+ border-color 150ms;
259
+ }
260
+
261
+ .fd-card:hover {
262
+ border-color: var(--color-fd-primary);
263
+ box-shadow: none;
264
+ }
265
+
266
+ .fd-card-icon {
267
+ margin-bottom: 0.5rem;
268
+ width: fit-content;
269
+ border-radius: 8px;
270
+ border: 1px solid var(--color-fd-border);
271
+ padding: 0.5rem;
272
+ color: var(--color-fd-primary);
273
+ background: rgba(13, 147, 115, 0.06);
274
+ }
275
+
276
+ .dark .fd-card-icon {
277
+ background: rgba(38, 189, 108, 0.08);
278
+ }
279
+
280
+ .fd-card-title {
281
+ font-weight: 500;
282
+ font-size: 0.9375rem;
283
+ }
284
+
285
+ .fd-card-description {
286
+ color: var(--color-fd-muted-foreground);
287
+ margin-top: 0.25rem;
288
+ font-size: 0.8125rem;
289
+ line-height: 1.5;
290
+ }
291
+
292
+ .fd-cards {
293
+ display: grid;
294
+ grid-template-columns: 1fr;
295
+ gap: 0.75rem;
296
+ }
297
+
298
+ @media (min-width: 640px) {
299
+ .fd-cards {
300
+ grid-template-columns: repeat(2, 1fr);
301
+ }
302
+ }
303
+
304
+ .fd-page-nav-card {
305
+ border-radius: 12px;
306
+ }
307
+
308
+ /* ═══════════════════════════════════════════════════════════════════
309
+ * CODE BLOCKS, TABS, CALLOUT, TOC, etc.
310
+ * ═══════════════════════════════════════════════════════════════════ */
311
+
312
+ figure.shiki {
313
+ border-radius: 10px;
314
+ overflow: hidden;
315
+ border: 1px solid var(--color-fd-border);
316
+ }
317
+
318
+ [role="tablist"] {
319
+ border-bottom: 1px solid var(--color-fd-border);
320
+ }
321
+
322
+ [role="tab"] {
323
+ font-size: 0.875rem;
324
+ font-weight: 400;
325
+ padding: 0.5rem 0.75rem;
326
+ border-radius: 0;
327
+ color: var(--color-fd-muted-foreground);
328
+ border-bottom: 2px solid transparent;
329
+ transition:
330
+ color 150ms,
331
+ border-color 150ms;
332
+ }
333
+
334
+ [role="tab"][aria-selected="true"],
335
+ [role="tab"][data-state="active"] {
336
+ color: var(--color-fd-primary);
337
+ border-bottom-color: var(--color-fd-primary);
338
+ font-weight: 500;
339
+ }
340
+
341
+ [style*="--callout-color"] {
342
+ border-radius: 10px;
343
+ border-width: 1px;
344
+ }
345
+
346
+ details {
347
+ border: 1px solid var(--color-fd-border);
348
+ border-radius: 10px;
349
+ padding: 0;
350
+ margin: 0.75rem 0;
351
+ overflow: hidden;
352
+ }
353
+
354
+ details summary {
355
+ padding: 0.75rem 1rem;
356
+ font-weight: 500;
357
+ font-size: 0.9375rem;
358
+ cursor: pointer;
359
+ color: var(--color-fd-foreground);
360
+ background: var(--color-fd-secondary);
361
+ transition: background 150ms;
362
+ }
363
+
364
+ details summary:hover {
365
+ background: var(--color-fd-accent);
366
+ }
367
+
368
+ details[open] summary {
369
+ border-bottom: 1px solid var(--color-fd-border);
370
+ }
371
+
372
+ details > :not(summary) {
373
+ padding: 0.75rem 1rem;
374
+ }
375
+
376
+ #nd-toc a[data-active="true"] {
377
+ color: var(--color-fd-primary);
378
+ font-weight: 500;
379
+ }
380
+
381
+ #nd-toc a[data-active="false"] {
382
+ color: var(--color-fd-muted-foreground);
383
+ }
384
+
385
+ #nd-toc a {
386
+ font-size: 0.875rem;
387
+ line-height: 1.3;
388
+ }
389
+
390
+ #nd-toc h3 {
391
+ font-size: 0.875rem;
392
+ font-weight: 500;
393
+ }
394
+
395
+ .omni-content {
396
+ border-radius: 12px;
397
+ border: 1px solid var(--color-fd-border);
398
+ background: var(--color-fd-popover);
399
+ box-shadow: 0 16px 70px rgba(0, 0, 0, 0.1);
400
+ }
401
+
402
+ .omni-item {
403
+ border-radius: 8px;
404
+ }
405
+
406
+ .omni-item-active {
407
+ background: var(--color-fd-accent);
408
+ }
409
+
410
+ .omni-highlight {
411
+ background: rgba(13, 147, 115, 0.1);
412
+ color: var(--color-fd-primary);
413
+ }
414
+
415
+ .dark .omni-highlight {
416
+ background: rgba(38, 189, 108, 0.15);
417
+ }
418
+
419
+ .omni-search-input:focus {
420
+ caret-color: var(--color-fd-primary);
421
+ }
422
+
423
+ .fd-page-footer {
424
+ border-top: 1px solid var(--color-fd-border);
425
+ }
426
+
427
+ .fd-page-description {
428
+ margin-bottom: 1rem;
429
+ font-size: 1rem;
430
+ line-height: 1.7;
431
+ color: var(--color-fd-muted-foreground);
432
+ }
433
+
434
+ .fd-page-action-btn {
435
+ border-radius: 8px;
436
+ font-size: 0.8125rem;
437
+ }
438
+
439
+ .fd-page-action-menu {
440
+ border-radius: 10px;
441
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
442
+ }
443
+
444
+ .fd-page-action-menu-item {
445
+ border-radius: 6px;
446
+ }
447
+
448
+ .fd-ai-dialog {
449
+ border-radius: 14px;
450
+ box-shadow: 0 16px 70px rgba(0, 0, 0, 0.1);
451
+ }
452
+
453
+ .fd-ai-bubble-user {
454
+ border-radius: 16px 16px 4px 16px;
455
+ }
456
+
457
+ .fd-ai-bubble-ai {
458
+ border-radius: 16px 16px 16px 4px;
459
+ }
460
+
461
+ .fd-ai-input-wrap {
462
+ border-radius: 10px;
463
+ }
464
+
465
+ .fd-ai-send-btn {
466
+ border-radius: 10px;
467
+ }
468
+
469
+ .dark .fd-ai-floating-btn {
470
+ border-radius: 999px;
471
+ background: var(--color-fd-primary);
472
+ color: #fff;
473
+ box-shadow: 0 2px 8px rgba(38, 189, 108, 0.25);
474
+ border: none;
475
+ }
476
+
477
+ .dark .fd-ai-floating-btn:hover {
478
+ filter: brightness(1.1);
479
+ }
480
+
481
+ :root:not(.dark) .fd-ai-floating-btn {
482
+ border-radius: 999px;
483
+ background: var(--color-fd-primary);
484
+ color: #fff;
485
+ box-shadow: 0 2px 8px rgba(13, 147, 115, 0.2);
486
+ border: none;
487
+ }
488
+
489
+ :root:not(.dark) .fd-ai-floating-btn:hover {
490
+ filter: brightness(1.1);
491
+ }
492
+
493
+ .fd-ai-suggestion,
494
+ .fd-ai-result {
495
+ border-radius: 10px;
496
+ }
497
+
498
+ .fd-sidebar-search-ai-row {
499
+ display: flex;
500
+ gap: 8px;
501
+ align-items: stretch;
502
+ width: 100%;
503
+ }
504
+
505
+ .fd-sidebar-search-btn {
506
+ flex: 1;
507
+ min-width: 0;
508
+ display: flex;
509
+ align-items: center;
510
+ gap: 8px;
511
+ padding: 8px 10px;
512
+ font-size: 0.875rem;
513
+ color: var(--color-fd-muted-foreground);
514
+ background: transparent;
515
+ border: 1px solid var(--color-fd-border);
516
+ border-radius: 8px;
517
+ cursor: pointer;
518
+ transition: background-color 150ms;
519
+ }
520
+
521
+ .fd-sidebar-search-btn:hover {
522
+ background: var(--color-fd-accent);
523
+ }
524
+
525
+ .fd-sidebar-search-btn svg {
526
+ flex-shrink: 0;
527
+ }
528
+
529
+ .fd-sidebar-search-kbd kbd {
530
+ font-family: inherit;
531
+ font-size: 0.7rem;
532
+ padding: 1px 4px;
533
+ border: 1px solid var(--color-fd-border);
534
+ border-radius: 4px;
535
+ background: var(--color-fd-muted);
536
+ }
537
+
538
+ .fd-sidebar-ai-btn {
539
+ display: inline-flex;
540
+ align-items: center;
541
+ justify-content: center;
542
+ width: 38px;
543
+ min-width: 38px;
544
+ border-radius: 8px;
545
+ border: 1px solid var(--color-fd-border);
546
+ background: transparent;
547
+ color: var(--color-fd-muted-foreground);
548
+ cursor: pointer;
549
+ transition:
550
+ background-color 150ms,
551
+ color 150ms,
552
+ border-color 150ms;
553
+ }
554
+
555
+ .fd-sidebar-ai-btn:hover {
556
+ background: var(--color-fd-accent);
557
+ color: var(--color-fd-primary);
558
+ border-color: var(--color-fd-primary);
559
+ }
560
+
561
+ .fd-sidebar-ai-btn svg {
562
+ width: 16px;
563
+ height: 16px;
564
+ }
565
+
566
+ .fd-page-actions {
567
+ display: flex;
568
+ gap: 0;
569
+ align-items: stretch;
570
+ }
571
+
572
+ .fd-page-action-btn {
573
+ display: inline-flex;
574
+ align-items: center;
575
+ gap: 6px;
576
+ padding: 6px 12px;
577
+ font-size: 0.8125rem;
578
+ font-weight: 500;
579
+ color: var(--color-fd-muted-foreground);
580
+ background: transparent;
581
+ border: 1px solid var(--color-fd-border);
582
+ cursor: pointer;
583
+ transition:
584
+ background-color 150ms,
585
+ color 150ms;
586
+ white-space: nowrap;
587
+ }
588
+
589
+ .fd-page-action-btn:hover {
590
+ background: var(--color-fd-accent);
591
+ color: var(--color-fd-foreground);
592
+ }
593
+
594
+ .fd-page-actions .fd-page-action-btn:first-child {
595
+ border-radius: 8px 0 0 8px;
596
+ border-right: none;
597
+ }
598
+
599
+ .fd-page-actions .fd-page-action-dropdown:last-child .fd-page-action-btn,
600
+ .fd-page-actions > .fd-page-action-btn:last-child {
601
+ border-radius: 0 8px 8px 0;
602
+ border-left: 1px solid var(--color-fd-border);
603
+ padding: 6px 8px;
604
+ }
605
+
606
+ .fd-page-actions .fd-page-action-btn:only-child {
607
+ border-radius: 8px;
608
+ border: 1px solid var(--color-fd-border);
609
+ }
610
+
611
+ .fd-page-action-dropdown {
612
+ position: relative;
613
+ }
614
+
615
+ .fd-sidebar::-webkit-scrollbar {
616
+ width: 4px;
617
+ }
618
+
619
+ .fd-sidebar::-webkit-scrollbar-thumb {
620
+ background: var(--color-fd-border);
621
+ border-radius: 4px;
622
+ }
623
+
624
+ .fd-sidebar::-webkit-scrollbar-track {
625
+ background: transparent;
626
+ }