@farming-labs/astro-theme 0.0.2-beta.21 → 0.0.2-beta.23

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,8 +1,36 @@
1
1
  {
2
2
  "name": "@farming-labs/astro-theme",
3
- "version": "0.0.2-beta.21",
3
+ "version": "0.0.2-beta.23",
4
4
  "description": "Astro UI components for @farming-labs/docs — layout, sidebar, TOC, search, and theme toggle",
5
+ "keywords": [
6
+ "astro",
7
+ "docs",
8
+ "documentation",
9
+ "theme"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "Farming Labs",
13
+ "files": [
14
+ "src",
15
+ "styles"
16
+ ],
5
17
  "type": "module",
18
+ "typesVersions": {
19
+ "*": {
20
+ "pixel-border": [
21
+ "./src/themes/pixel-border.d.ts"
22
+ ],
23
+ "darksharp": [
24
+ "./src/themes/darksharp.d.ts"
25
+ ],
26
+ "fumadocs": [
27
+ "./src/themes/default.d.ts"
28
+ ],
29
+ ".": [
30
+ "./src/index.d.ts"
31
+ ]
32
+ }
33
+ },
6
34
  "exports": {
7
35
  ".": {
8
36
  "types": "./src/index.d.ts",
@@ -39,38 +67,10 @@
39
67
  "./styles/colorful.css": "./styles/colorful.css",
40
68
  "./colorful/css": "./styles/colorful-bundle.css"
41
69
  },
42
- "typesVersions": {
43
- "*": {
44
- "pixel-border": [
45
- "./src/themes/pixel-border.d.ts"
46
- ],
47
- "darksharp": [
48
- "./src/themes/darksharp.d.ts"
49
- ],
50
- "fumadocs": [
51
- "./src/themes/default.d.ts"
52
- ],
53
- ".": [
54
- "./src/index.d.ts"
55
- ]
56
- }
57
- },
58
- "files": [
59
- "src",
60
- "styles"
61
- ],
62
- "keywords": [
63
- "docs",
64
- "astro",
65
- "theme",
66
- "documentation"
67
- ],
68
- "author": "Farming Labs",
69
- "license": "MIT",
70
70
  "dependencies": {
71
71
  "sugar-high": "^0.9.5",
72
- "@farming-labs/docs": "0.0.2-beta.21",
73
- "@farming-labs/astro": "0.0.2-beta.21"
72
+ "@farming-labs/docs": "0.0.2-beta.23",
73
+ "@farming-labs/astro": "0.0.2-beta.23"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "astro": ">=4.0.0"
@@ -20,6 +20,13 @@ const breadcrumbEnabled = (() => {
20
20
 
21
21
  const showEditOnGithub = !!config?.github && !!data.editOnGithub;
22
22
  const showLastModified = !!data.lastModified;
23
+
24
+ const llmsTxtEnabled = (() => {
25
+ const cfg = config?.llmsTxt;
26
+ if (cfg === true) return true;
27
+ if (typeof cfg === "object" && cfg !== null) return cfg.enabled !== false;
28
+ return false;
29
+ })();
23
30
  ---
24
31
 
25
32
  <head>
@@ -36,6 +43,7 @@ const showLastModified = !!data.lastModified;
36
43
  nextPage={data.nextPage}
37
44
  editOnGithub={showEditOnGithub ? data.editOnGithub : null}
38
45
  lastModified={showLastModified ? data.lastModified : null}
46
+ llmsTxtEnabled={llmsTxtEnabled}
39
47
  >
40
48
  {data.description && <p class="fd-page-description">{data.description}</p>}
41
49
  <Fragment set:html={data.html} />
@@ -8,6 +8,7 @@ const {
8
8
  nextPage = null,
9
9
  editOnGithub = null,
10
10
  lastModified = null,
11
+ llmsTxtEnabled = false,
11
12
  } = Astro.props;
12
13
 
13
14
  const pathname = Astro.url.pathname;
@@ -38,7 +39,7 @@ const parentUrl = segments.length >= 2
38
39
  </div>
39
40
 
40
41
  <footer class="fd-page-footer">
41
- {(editOnGithub || lastModified) && (
42
+ {(editOnGithub || lastModified || llmsTxtEnabled) && (
42
43
  <div class="fd-edit-on-github">
43
44
  {editOnGithub && (
44
45
  <a href={editOnGithub} target="_blank" rel="noopener noreferrer">
@@ -49,6 +50,12 @@ const parentUrl = segments.length >= 2
49
50
  Edit on GitHub
50
51
  </a>
51
52
  )}
53
+ {llmsTxtEnabled && (
54
+ <span class="fd-llms-txt-links">
55
+ <a href="/api/docs?format=llms" target="_blank" rel="noopener noreferrer" class="fd-llms-txt-link">llms.txt</a>
56
+ <a href="/api/docs?format=llms-full" target="_blank" rel="noopener noreferrer" class="fd-llms-txt-link">llms-full.txt</a>
57
+ </span>
58
+ )}
52
59
  {lastModified && (
53
60
  <span class="fd-last-modified">Last updated: {lastModified}</span>
54
61
  )}
@@ -16,10 +16,12 @@ function buildCodeBlock(lang, code) {
16
16
  const highlighted = highlight(trimmed).replace(/<\/span>\n<span/g, "</span><span");
17
17
  const langLabel = lang ? `<div class="fd-ai-code-lang">${escapeHtml(lang)}</div>` : "";
18
18
  const copyBtn = `<button class="fd-ai-code-copy" onclick="(function(btn){var code=btn.closest('.fd-ai-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code).then(function(){btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},1500)})})(this)">Copy</button>`;
19
- return `<div class="fd-ai-code-block">`
20
- + `<div class="fd-ai-code-header">${langLabel}${copyBtn}</div>`
21
- + `<pre><code>${highlighted}</code></pre>`
22
- + `</div>`;
19
+ return (
20
+ `<div class="fd-ai-code-block">` +
21
+ `<div class="fd-ai-code-header">${langLabel}${copyBtn}</div>` +
22
+ `<pre><code>${highlighted}</code></pre>` +
23
+ `</div>`
24
+ );
23
25
  }
24
26
 
25
27
  function isTableRow(line) {
@@ -33,15 +35,23 @@ function isTableSeparator(line) {
33
35
 
34
36
  function renderTable(rows) {
35
37
  const parseRow = (row) =>
36
- row.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map(c => c.trim());
38
+ row
39
+ .trim()
40
+ .replace(/^\|/, "")
41
+ .replace(/\|$/, "")
42
+ .split("|")
43
+ .map((c) => c.trim());
37
44
 
38
45
  const headerCells = parseRow(rows[0]);
39
- const thead = `<thead><tr>${headerCells.map(c => `<th>${c}</th>`).join("")}</tr></thead>`;
40
-
41
- const bodyRows = rows.slice(1).map(row => {
42
- const cells = parseRow(row);
43
- return `<tr>${cells.map(c => `<td>${c}</td>`).join("")}</tr>`;
44
- }).join("");
46
+ const thead = `<thead><tr>${headerCells.map((c) => `<th>${c}</th>`).join("")}</tr></thead>`;
47
+
48
+ const bodyRows = rows
49
+ .slice(1)
50
+ .map((row) => {
51
+ const cells = parseRow(row);
52
+ return `<tr>${cells.map((c) => `<td>${c}</td>`).join("")}</tr>`;
53
+ })
54
+ .join("");
45
55
 
46
56
  return `<table>${thead}<tbody>${bodyRows}</tbody></table>`;
47
57
  }
@@ -1,2 +1,4 @@
1
- export declare const colorful: (overrides?: { ui?: Record<string, unknown> }) => import("@farming-labs/docs").DocsTheme;
1
+ export declare const colorful: (overrides?: {
2
+ ui?: Record<string, unknown>;
3
+ }) => import("@farming-labs/docs").DocsTheme;
2
4
  export declare const ColorfulUIDefaults: Record<string, unknown>;
@@ -45,7 +45,9 @@
45
45
  font-size: 0.875rem;
46
46
  color: var(--color-fd-card-foreground);
47
47
  box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1);
48
- transition: background-color 150ms, border-color 150ms;
48
+ transition:
49
+ background-color 150ms,
50
+ border-color 150ms;
49
51
  }
50
52
 
51
53
  .fd-card:hover {
package/styles/docs.css CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
  /* ─── CSS Reset ──────────────────────────────────────────────────────── */
10
10
 
11
- *, *::before, *::after {
11
+ *,
12
+ *::before,
13
+ *::after {
12
14
  box-sizing: border-box;
13
15
  margin: 0;
14
16
  }
@@ -76,8 +78,18 @@ body {
76
78
  -moz-osx-font-smoothing: grayscale;
77
79
  }
78
80
 
79
- code, kbd, pre, samp {
80
- font-family: var(--fd-font-mono, ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, monospace);
81
+ code,
82
+ kbd,
83
+ pre,
84
+ samp {
85
+ font-family: var(
86
+ --fd-font-mono,
87
+ ui-monospace,
88
+ "Cascadia Code",
89
+ "Source Code Pro",
90
+ Menlo,
91
+ monospace
92
+ );
81
93
  }
82
94
 
83
95
  /* ─── Layout (sidebar + content, TOC lives inside content area) ──────── */
@@ -123,7 +135,9 @@ code, kbd, pre, samp {
123
135
  border-radius: 8px;
124
136
  color: var(--color-fd-muted-foreground);
125
137
  cursor: pointer;
126
- transition: background 0.15s, color 0.15s;
138
+ transition:
139
+ background 0.15s,
140
+ color 0.15s;
127
141
  }
128
142
 
129
143
  .fd-menu-btn:hover,
@@ -196,7 +210,9 @@ code, kbd, pre, samp {
196
210
  border-radius: 6px;
197
211
  color: var(--color-fd-muted-foreground);
198
212
  cursor: pointer;
199
- transition: background 0.15s, color 0.15s;
213
+ transition:
214
+ background 0.15s,
215
+ color 0.15s;
200
216
  flex-shrink: 0;
201
217
  }
202
218
 
@@ -224,7 +240,9 @@ code, kbd, pre, samp {
224
240
  border: 1px solid var(--color-fd-border);
225
241
  border-radius: 8px;
226
242
  cursor: pointer;
227
- transition: border-color 0.15s, background 0.15s;
243
+ transition:
244
+ border-color 0.15s,
245
+ background 0.15s;
228
246
  }
229
247
 
230
248
  .fd-sidebar-search-btn:hover {
@@ -270,7 +288,9 @@ code, kbd, pre, samp {
270
288
  text-decoration: none;
271
289
  border-radius: 8px;
272
290
  position: relative;
273
- transition: color 0.15s, background 0.15s;
291
+ transition:
292
+ color 0.15s,
293
+ background 0.15s;
274
294
  }
275
295
 
276
296
  .fd-sidebar-link:hover {
@@ -287,7 +307,7 @@ code, kbd, pre, samp {
287
307
  }
288
308
 
289
309
  .fd-sidebar-folder-content .fd-sidebar-link-active::before {
290
- content: '';
310
+ content: "";
291
311
  position: absolute;
292
312
  left: -9px;
293
313
  top: 25%;
@@ -346,7 +366,7 @@ code, kbd, pre, samp {
346
366
  }
347
367
 
348
368
  .fd-sidebar-folder-content::before {
349
- content: '';
369
+ content: "";
350
370
  position: absolute;
351
371
  left: 4px;
352
372
  top: 4px;
@@ -464,7 +484,9 @@ code, kbd, pre, samp {
464
484
  text-decoration: none;
465
485
  border-left: 2px solid transparent;
466
486
  margin-left: -1px;
467
- transition: color 0.15s, border-color 0.15s;
487
+ transition:
488
+ color 0.15s,
489
+ border-color 0.15s;
468
490
  }
469
491
 
470
492
  .fd-toc-link:hover {
@@ -568,7 +590,9 @@ code, kbd, pre, samp {
568
590
  color: inherit;
569
591
  text-decoration: none;
570
592
  cursor: pointer;
571
- transition: opacity 0.15s, color 0.15s;
593
+ transition:
594
+ opacity 0.15s,
595
+ color 0.15s;
572
596
  }
573
597
 
574
598
  .fd-breadcrumb-link:hover {
@@ -595,7 +619,9 @@ code, kbd, pre, samp {
595
619
  border-radius: 8px;
596
620
  color: var(--color-fd-muted-foreground);
597
621
  cursor: pointer;
598
- transition: color 0.15s, background 0.15s;
622
+ transition:
623
+ color 0.15s,
624
+ background 0.15s;
599
625
  }
600
626
 
601
627
  .fd-theme-toggle:hover {
@@ -771,7 +797,8 @@ code, kbd, pre, samp {
771
797
  margin: 0 0 16px;
772
798
  }
773
799
 
774
- .fd-page-body ul, .fd-page-body ol {
800
+ .fd-page-body ul,
801
+ .fd-page-body ol {
775
802
  margin: 0 0 16px;
776
803
  padding-left: 24px;
777
804
  }
@@ -904,7 +931,10 @@ html.dark pre.shiki {
904
931
  color: var(--color-fd-muted-foreground);
905
932
  cursor: pointer;
906
933
  opacity: 0;
907
- transition: opacity 0.15s, color 0.15s, background 0.15s;
934
+ transition:
935
+ opacity 0.15s,
936
+ color 0.15s,
937
+ background 0.15s;
908
938
  }
909
939
 
910
940
  .fd-codeblock:hover .fd-copy-btn {
@@ -949,7 +979,9 @@ html.dark pre.shiki {
949
979
  border: none;
950
980
  border-bottom: 2px solid transparent;
951
981
  cursor: pointer;
952
- transition: color 0.15s, border-color 0.15s;
982
+ transition:
983
+ color 0.15s,
984
+ border-color 0.15s;
953
985
  white-space: nowrap;
954
986
  }
955
987
 
@@ -1059,13 +1091,23 @@ html.dark pre.shiki {
1059
1091
  }
1060
1092
 
1061
1093
  @keyframes fd-fade-in {
1062
- from { opacity: 0; }
1063
- to { opacity: 1; }
1094
+ from {
1095
+ opacity: 0;
1096
+ }
1097
+ to {
1098
+ opacity: 1;
1099
+ }
1064
1100
  }
1065
1101
 
1066
1102
  @keyframes fd-slide-up {
1067
- from { opacity: 0; transform: translateY(8px) scale(0.98); }
1068
- to { opacity: 1; transform: translateY(0) scale(1); }
1103
+ from {
1104
+ opacity: 0;
1105
+ transform: translateY(8px) scale(0.98);
1106
+ }
1107
+ to {
1108
+ opacity: 1;
1109
+ transform: translateY(0) scale(1);
1110
+ }
1069
1111
  }
1070
1112
 
1071
1113
  /* ─── Callout / Admonition ──────────────────────────────────────────── */
@@ -1093,22 +1135,42 @@ html.dark pre.shiki {
1093
1135
  border-radius: 8px 0 0 8px;
1094
1136
  }
1095
1137
 
1096
- .fd-callout-note .fd-callout-indicator { background: hsl(221, 83%, 53%); }
1097
- .fd-callout-warning .fd-callout-indicator { background: hsl(38, 92%, 50%); }
1098
- .fd-callout-tip .fd-callout-indicator { background: hsl(142, 71%, 45%); }
1099
- .fd-callout-important .fd-callout-indicator { background: hsl(262, 83%, 58%); }
1100
- .fd-callout-caution .fd-callout-indicator { background: hsl(0, 72%, 51%); }
1138
+ .fd-callout-note .fd-callout-indicator {
1139
+ background: hsl(221, 83%, 53%);
1140
+ }
1141
+ .fd-callout-warning .fd-callout-indicator {
1142
+ background: hsl(38, 92%, 50%);
1143
+ }
1144
+ .fd-callout-tip .fd-callout-indicator {
1145
+ background: hsl(142, 71%, 45%);
1146
+ }
1147
+ .fd-callout-important .fd-callout-indicator {
1148
+ background: hsl(262, 83%, 58%);
1149
+ }
1150
+ .fd-callout-caution .fd-callout-indicator {
1151
+ background: hsl(0, 72%, 51%);
1152
+ }
1101
1153
 
1102
1154
  .fd-callout-icon {
1103
1155
  flex-shrink: 0;
1104
1156
  margin-top: 2px;
1105
1157
  }
1106
1158
 
1107
- .fd-callout-note .fd-callout-icon { color: hsl(221, 83%, 53%); }
1108
- .fd-callout-warning .fd-callout-icon { color: hsl(38, 92%, 50%); }
1109
- .fd-callout-tip .fd-callout-icon { color: hsl(142, 71%, 45%); }
1110
- .fd-callout-important .fd-callout-icon { color: hsl(262, 83%, 58%); }
1111
- .fd-callout-caution .fd-callout-icon { color: hsl(0, 72%, 51%); }
1159
+ .fd-callout-note .fd-callout-icon {
1160
+ color: hsl(221, 83%, 53%);
1161
+ }
1162
+ .fd-callout-warning .fd-callout-icon {
1163
+ color: hsl(38, 92%, 50%);
1164
+ }
1165
+ .fd-callout-tip .fd-callout-icon {
1166
+ color: hsl(142, 71%, 45%);
1167
+ }
1168
+ .fd-callout-important .fd-callout-icon {
1169
+ color: hsl(262, 83%, 58%);
1170
+ }
1171
+ .fd-callout-caution .fd-callout-icon {
1172
+ color: hsl(0, 72%, 51%);
1173
+ }
1112
1174
 
1113
1175
  .fd-callout-content {
1114
1176
  flex: 1;
@@ -1120,11 +1182,21 @@ html.dark pre.shiki {
1120
1182
  font-size: 13px;
1121
1183
  }
1122
1184
 
1123
- .fd-callout-note .fd-callout-title { color: hsl(221, 83%, 53%); }
1124
- .fd-callout-warning .fd-callout-title { color: hsl(38, 92%, 50%); }
1125
- .fd-callout-tip .fd-callout-title { color: hsl(142, 71%, 45%); }
1126
- .fd-callout-important .fd-callout-title { color: hsl(262, 83%, 58%); }
1127
- .fd-callout-caution .fd-callout-title { color: hsl(0, 72%, 51%); }
1185
+ .fd-callout-note .fd-callout-title {
1186
+ color: hsl(221, 83%, 53%);
1187
+ }
1188
+ .fd-callout-warning .fd-callout-title {
1189
+ color: hsl(38, 92%, 50%);
1190
+ }
1191
+ .fd-callout-tip .fd-callout-title {
1192
+ color: hsl(142, 71%, 45%);
1193
+ }
1194
+ .fd-callout-important .fd-callout-title {
1195
+ color: hsl(262, 83%, 58%);
1196
+ }
1197
+ .fd-callout-caution .fd-callout-title {
1198
+ color: hsl(0, 72%, 51%);
1199
+ }
1128
1200
 
1129
1201
  .fd-callout-content p:last-child {
1130
1202
  margin-bottom: 0;
@@ -1165,6 +1237,29 @@ html.dark pre.shiki {
1165
1237
  font-size: 12px;
1166
1238
  }
1167
1239
 
1240
+ .fd-llms-txt-links {
1241
+ display: inline-flex;
1242
+ align-items: center;
1243
+ gap: 0.5rem;
1244
+ }
1245
+
1246
+ .fd-llms-txt-link {
1247
+ color: var(--color-fd-muted-foreground);
1248
+ font-size: 0.75rem;
1249
+ font-family: var(--fd-font-mono, ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace);
1250
+ text-decoration: none;
1251
+ padding: 0.125rem 0.375rem;
1252
+ border-radius: 0.25rem;
1253
+ border: 1px solid var(--color-fd-border, hsl(0 0% 80% / 50%));
1254
+ transition: color 150ms, border-color 150ms;
1255
+ }
1256
+
1257
+ .fd-llms-txt-link:hover {
1258
+ color: var(--color-fd-foreground);
1259
+ border-color: var(--color-fd-foreground);
1260
+ text-decoration: none;
1261
+ }
1262
+
1168
1263
  /* ─── Previous / Next Navigation ────────────────────────────────────── */
1169
1264
 
1170
1265
  .fd-page-nav {
@@ -1185,7 +1280,9 @@ html.dark pre.shiki {
1185
1280
  border-radius: 8px;
1186
1281
  text-decoration: none;
1187
1282
  color: var(--color-fd-foreground);
1188
- transition: background-color 0.15s, border-color 0.15s;
1283
+ transition:
1284
+ background-color 0.15s,
1285
+ border-color 0.15s;
1189
1286
  }
1190
1287
 
1191
1288
  .fd-page-nav-card:hover {
@@ -1233,28 +1330,58 @@ html.dark pre.shiki {
1233
1330
  * ═══════════════════════════════════════════════════════════════════════ */
1234
1331
 
1235
1332
  @keyframes fd-ai-dot {
1236
- 0%, 80%, 100% { transform: scale(0); opacity: 0.5; }
1237
- 40% { transform: scale(1); opacity: 1; }
1333
+ 0%,
1334
+ 80%,
1335
+ 100% {
1336
+ transform: scale(0);
1337
+ opacity: 0.5;
1338
+ }
1339
+ 40% {
1340
+ transform: scale(1);
1341
+ opacity: 1;
1342
+ }
1238
1343
  }
1239
1344
 
1240
1345
  @keyframes fd-ai-fade-in {
1241
- from { opacity: 0; }
1242
- to { opacity: 1; }
1346
+ from {
1347
+ opacity: 0;
1348
+ }
1349
+ to {
1350
+ opacity: 1;
1351
+ }
1243
1352
  }
1244
1353
 
1245
1354
  @keyframes fd-ai-slide-up {
1246
- from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
1247
- to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
1355
+ from {
1356
+ opacity: 0;
1357
+ transform: translate(-50%, -48%) scale(0.96);
1358
+ }
1359
+ to {
1360
+ opacity: 1;
1361
+ transform: translate(-50%, -50%) scale(1);
1362
+ }
1248
1363
  }
1249
1364
 
1250
1365
  @keyframes fd-ai-float-in {
1251
- from { opacity: 0; transform: translateY(12px) scale(0.95); }
1252
- to { opacity: 1; transform: translateY(0) scale(1); }
1366
+ from {
1367
+ opacity: 0;
1368
+ transform: translateY(12px) scale(0.95);
1369
+ }
1370
+ to {
1371
+ opacity: 1;
1372
+ transform: translateY(0) scale(1);
1373
+ }
1253
1374
  }
1254
1375
 
1255
1376
  @keyframes fd-ai-float-center-in {
1256
- from { opacity: 0; transform: translate(-50%, -48%) scale(0.96); }
1257
- to { opacity: 1; transform: translate(-50%, -50%) scale(1); }
1377
+ from {
1378
+ opacity: 0;
1379
+ transform: translate(-50%, -48%) scale(0.96);
1380
+ }
1381
+ to {
1382
+ opacity: 1;
1383
+ transform: translate(-50%, -50%) scale(1);
1384
+ }
1258
1385
  }
1259
1386
 
1260
1387
  .fd-ai-overlay {
@@ -1303,7 +1430,10 @@ html.dark pre.shiki {
1303
1430
  border: none;
1304
1431
  border-bottom: 2px solid transparent;
1305
1432
  cursor: pointer;
1306
- transition: color 150ms, border-color 150ms, background-color 150ms;
1433
+ transition:
1434
+ color 150ms,
1435
+ border-color 150ms,
1436
+ background-color 150ms;
1307
1437
  background: transparent;
1308
1438
  color: var(--color-fd-muted-foreground);
1309
1439
  font-family: inherit;
@@ -1425,7 +1555,9 @@ html.dark pre.shiki {
1425
1555
  text-align: left;
1426
1556
  font-size: 14px;
1427
1557
  font-family: inherit;
1428
- transition: background 100ms, color 100ms;
1558
+ transition:
1559
+ background 100ms,
1560
+ color 100ms;
1429
1561
  color: var(--color-fd-foreground);
1430
1562
  background: transparent;
1431
1563
  color: var(--color-fd-foreground);
@@ -1638,8 +1770,12 @@ html.dark pre.shiki {
1638
1770
  animation: fd-ai-dot 1.4s infinite ease-in-out both;
1639
1771
  }
1640
1772
 
1641
- .fd-ai-loading-dot:nth-child(2) { animation-delay: 0.16s; }
1642
- .fd-ai-loading-dot:nth-child(3) { animation-delay: 0.32s; }
1773
+ .fd-ai-loading-dot:nth-child(2) {
1774
+ animation-delay: 0.16s;
1775
+ }
1776
+ .fd-ai-loading-dot:nth-child(3) {
1777
+ animation-delay: 0.32s;
1778
+ }
1643
1779
 
1644
1780
  /* ─── Markdown in AI responses ───────────────────────────────── */
1645
1781
 
@@ -1738,7 +1874,11 @@ html.dark pre.shiki {
1738
1874
 
1739
1875
  .fd-ai-code-copy:hover {
1740
1876
  color: var(--color-fd-foreground, #e4e4e7);
1741
- background: color-mix(in srgb, var(--color-fd-accent, rgba(255,255,255,0.05)) 60%, transparent);
1877
+ background: color-mix(
1878
+ in srgb,
1879
+ var(--color-fd-accent, rgba(255, 255, 255, 0.05)) 60%,
1880
+ transparent
1881
+ );
1742
1882
  }
1743
1883
 
1744
1884
  .fd-ai-code-block pre {
@@ -1759,7 +1899,10 @@ html.dark pre.shiki {
1759
1899
  border-radius: 0;
1760
1900
  }
1761
1901
 
1762
- .fd-ai-code-block .sh__line { display: block; min-height: 1.2em; }
1902
+ .fd-ai-code-block .sh__line {
1903
+ display: block;
1904
+ min-height: 1.2em;
1905
+ }
1763
1906
 
1764
1907
  /* ═══════════════════════════════════════════════════════════════
1765
1908
  Default theme AI overrides — rounded, soft, indigo
@@ -1768,7 +1911,9 @@ html.dark pre.shiki {
1768
1911
 
1769
1912
  .fd-ai-dialog {
1770
1913
  border-radius: 12px;
1771
- box-shadow: 0 20px 60px rgba(99, 102, 241, 0.08), 0 8px 24px rgba(0, 0, 0, 0.12);
1914
+ box-shadow:
1915
+ 0 20px 60px rgba(99, 102, 241, 0.08),
1916
+ 0 8px 24px rgba(0, 0, 0, 0.12);
1772
1917
  }
1773
1918
 
1774
1919
  .fd-ai-bubble-user {
@@ -1851,7 +1996,10 @@ html.dark pre.shiki {
1851
1996
  cursor: pointer;
1852
1997
  font-size: 14px;
1853
1998
  box-shadow: 0 1px 3px color-mix(in srgb, var(--color-fd-background, #000) 20%, transparent);
1854
- transition: transform 150ms, background 150ms, color 150ms;
1999
+ transition:
2000
+ transform 150ms,
2001
+ background 150ms,
2002
+ color 150ms;
1855
2003
  animation: fd-ai-fade-in 300ms ease-out;
1856
2004
  }
1857
2005
 
@@ -1927,8 +2075,20 @@ html.dark pre.shiki {
1927
2075
  overflow-y: auto;
1928
2076
  width: min(800px, 100%);
1929
2077
  padding: 24px 0 120px;
1930
- mask-image: linear-gradient(to bottom, transparent, white 3rem, white calc(100% - 8rem), transparent 100%);
1931
- -webkit-mask-image: linear-gradient(to bottom, transparent, white 3rem, white calc(100% - 8rem), transparent 100%);
2078
+ mask-image: linear-gradient(
2079
+ to bottom,
2080
+ transparent,
2081
+ white 3rem,
2082
+ white calc(100% - 8rem),
2083
+ transparent 100%
2084
+ );
2085
+ -webkit-mask-image: linear-gradient(
2086
+ to bottom,
2087
+ transparent,
2088
+ white 3rem,
2089
+ white calc(100% - 8rem),
2090
+ transparent 100%
2091
+ );
1932
2092
  }
1933
2093
 
1934
2094
  .fd-ai-fm-messages-inner {
@@ -2022,12 +2182,24 @@ html.dark pre.shiki {
2022
2182
  animation: fd-ai-fm-bounce 1s infinite ease-in-out;
2023
2183
  }
2024
2184
 
2025
- .fd-ai-fm-thinking-dot:nth-child(2) { animation-delay: 150ms; }
2026
- .fd-ai-fm-thinking-dot:nth-child(3) { animation-delay: 300ms; }
2185
+ .fd-ai-fm-thinking-dot:nth-child(2) {
2186
+ animation-delay: 150ms;
2187
+ }
2188
+ .fd-ai-fm-thinking-dot:nth-child(3) {
2189
+ animation-delay: 300ms;
2190
+ }
2027
2191
 
2028
2192
  @keyframes fd-ai-fm-bounce {
2029
- 0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
2030
- 40% { transform: scale(1); opacity: 1; }
2193
+ 0%,
2194
+ 80%,
2195
+ 100% {
2196
+ transform: scale(0.6);
2197
+ opacity: 0.4;
2198
+ }
2199
+ 40% {
2200
+ transform: scale(1);
2201
+ opacity: 1;
2202
+ }
2031
2203
  }
2032
2204
 
2033
2205
  /* ─── Bottom input bar ───────────────────────────────────────── */
@@ -2035,9 +2207,10 @@ html.dark pre.shiki {
2035
2207
  .fd-ai-fm-input-bar {
2036
2208
  position: fixed;
2037
2209
  z-index: 9999;
2038
- transition: width 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
2039
- height 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
2040
- transform 200ms ease-out;
2210
+ transition:
2211
+ width 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
2212
+ height 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
2213
+ transform 200ms ease-out;
2041
2214
  }
2042
2215
 
2043
2216
  .fd-ai-fm-input-bar--closed {
@@ -2125,8 +2298,20 @@ html.dark pre.shiki {
2125
2298
  gap: 8px;
2126
2299
  overflow-x: auto;
2127
2300
  padding-bottom: 4px;
2128
- mask-image: linear-gradient(to right, transparent 0%, black 1rem, black calc(100% - 1rem), transparent 100%);
2129
- -webkit-mask-image: linear-gradient(to right, transparent 0%, black 1rem, black calc(100% - 1rem), transparent 100%);
2301
+ mask-image: linear-gradient(
2302
+ to right,
2303
+ transparent 0%,
2304
+ black 1rem,
2305
+ black calc(100% - 1rem),
2306
+ transparent 100%
2307
+ );
2308
+ -webkit-mask-image: linear-gradient(
2309
+ to right,
2310
+ transparent 0%,
2311
+ black 1rem,
2312
+ black calc(100% - 1rem),
2313
+ transparent 100%
2314
+ );
2130
2315
  }
2131
2316
 
2132
2317
  .fd-ai-fm-suggestion {
@@ -2136,15 +2321,16 @@ html.dark pre.shiki {
2136
2321
  font-size: 12px;
2137
2322
  font-family: inherit;
2138
2323
  border-radius: 9999px;
2139
- border: 1px solid color-mix(in srgb, var(--color-fd-border, rgba(255,255,255,0.1)) 50%, transparent);
2140
- background: color-mix(in srgb, var(--color-fd-muted, rgba(255,255,255,0.04)) 30%, transparent);
2324
+ border: 1px solid
2325
+ color-mix(in srgb, var(--color-fd-border, rgba(255, 255, 255, 0.1)) 50%, transparent);
2326
+ background: color-mix(in srgb, var(--color-fd-muted, rgba(255, 255, 255, 0.04)) 30%, transparent);
2141
2327
  color: var(--color-fd-muted-foreground, #71717a);
2142
2328
  cursor: pointer;
2143
2329
  transition: all 200ms;
2144
2330
  }
2145
2331
 
2146
2332
  .fd-ai-fm-suggestion:hover {
2147
- background: color-mix(in srgb, var(--color-fd-muted, rgba(255,255,255,0.04)) 50%, transparent);
2333
+ background: color-mix(in srgb, var(--color-fd-muted, rgba(255, 255, 255, 0.04)) 50%, transparent);
2148
2334
  color: var(--color-fd-foreground, #e4e4e7);
2149
2335
  border-color: var(--color-fd-border, rgba(255, 255, 255, 0.1));
2150
2336
  }
@@ -2157,7 +2343,11 @@ html.dark pre.shiki {
2157
2343
  gap: 4px;
2158
2344
  padding: 8px 16px;
2159
2345
  border-top: 1px solid var(--color-fd-border, rgba(255, 255, 255, 0.06));
2160
- background: color-mix(in srgb, var(--color-fd-accent, rgba(255,255,255,0.03)) 40%, transparent);
2346
+ background: color-mix(
2347
+ in srgb,
2348
+ var(--color-fd-accent, rgba(255, 255, 255, 0.03)) 40%,
2349
+ transparent
2350
+ );
2161
2351
  font-size: 12px;
2162
2352
  color: var(--color-fd-muted-foreground, #71717a);
2163
2353
  }
@@ -2207,7 +2397,10 @@ html.dark pre.shiki {
2207
2397
  font-size: 14px;
2208
2398
  cursor: pointer;
2209
2399
  box-shadow: 0 1px 3px color-mix(in srgb, var(--color-fd-background, #000) 20%, transparent);
2210
- transition: transform 150ms, background 150ms, color 150ms;
2400
+ transition:
2401
+ transform 150ms,
2402
+ background 150ms,
2403
+ color 150ms;
2211
2404
  animation: fd-ai-fade-in 300ms ease-out;
2212
2405
  white-space: nowrap;
2213
2406
  }
@@ -81,7 +81,7 @@
81
81
  }
82
82
 
83
83
  .fd-sidebar-folder-content::before {
84
- content: '';
84
+ content: "";
85
85
  position: absolute;
86
86
  left: 4px;
87
87
  top: 4px;
@@ -100,7 +100,7 @@
100
100
  border-bottom: 1px solid var(--color-fd-border);
101
101
  }
102
102
  .fd-sidebar-folder-content::before {
103
- content: '';
103
+ content: "";
104
104
  position: absolute;
105
105
  left: -4px;
106
106
  top: 3px;
@@ -213,7 +213,7 @@
213
213
 
214
214
  /* Active indicator bar for child links */
215
215
  .fd-sidebar-folder-content .fd-sidebar-link-active::before {
216
- content: '';
216
+ content: "";
217
217
  position: absolute;
218
218
  left: -16px;
219
219
  top: 25%;
@@ -246,7 +246,6 @@
246
246
  border-top: 1px solid var(--color-fd-border) !important;
247
247
  border-bottom: 1px solid var(--color-fd-border) !important;
248
248
  border-radius: 0 !important;
249
-
250
249
  }
251
250
 
252
251
  .fd-sidebar-search {