@farming-labs/svelte-theme 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/svelte-theme",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "Svelte UI components for @farming-labs/docs — layout, sidebar, TOC, search, and theme toggle",
5
5
  "keywords": [
6
6
  "docs",
@@ -122,8 +122,8 @@
122
122
  "dependencies": {
123
123
  "gray-matter": "^4.0.3",
124
124
  "sugar-high": "^0.9.5",
125
- "@farming-labs/docs": "0.2.6",
126
- "@farming-labs/svelte": "0.2.6"
125
+ "@farming-labs/docs": "0.2.7",
126
+ "@farming-labs/svelte": "0.2.7"
127
127
  },
128
128
  "peerDependencies": {
129
129
  "svelte": ">=5.0.0"
@@ -194,7 +194,7 @@
194
194
  vars.push(`${COLOR_MAP[key]}: ${value};`);
195
195
  }
196
196
  if (vars.length === 0) return "";
197
- return `.dark {\n ${vars.join("\n ")}\n}`;
197
+ return `html.dark body:has(#nd-docs-layout),\nbody.dark:has(#nd-docs-layout),\nbody:has(#nd-docs-layout.dark),\n:is(html.dark, body.dark) #nd-docs-layout,\n#nd-docs-layout.dark {\n ${vars.join("\n ")}\n}`;
198
198
  }
199
199
 
200
200
  function buildFontStyleVars(prefix, style) {
@@ -221,7 +221,7 @@
221
221
  }
222
222
  }
223
223
  if (vars.length === 0) return "";
224
- return `:root {\n ${vars.join("\n ")}\n}`;
224
+ return `body:has(#nd-docs-layout),\n#nd-docs-layout {\n ${vars.join("\n ")}\n}`;
225
225
  }
226
226
 
227
227
  function buildLayoutCSS(layout) {
@@ -233,8 +233,8 @@
233
233
  if (layout.tocWidth) desktopVars.push(`--fd-toc-width: ${layout.tocWidth}px;`);
234
234
  if (rootVars.length === 0 && desktopVars.length === 0) return "";
235
235
  const parts = [];
236
- if (rootVars.length > 0) parts.push(`:root {\n ${rootVars.join("\n ")}\n}`);
237
- if (desktopVars.length > 0) parts.push(`@media (min-width: 1024px) {\n :root {\n ${desktopVars.join("\n ")}\n }\n}`);
236
+ if (rootVars.length > 0) parts.push(`#nd-docs-layout {\n ${rootVars.join("\n ")}\n}`);
237
+ if (desktopVars.length > 0) parts.push(`@media (min-width: 1024px) {\n #nd-docs-layout {\n ${desktopVars.join("\n ")}\n }\n}`);
238
238
  return parts.join("\n");
239
239
  }
240
240
 
@@ -259,7 +259,7 @@
259
259
  {/if}
260
260
  </svelte:head>
261
261
 
262
- <div class="fd-layout">
262
+ <div id="nd-docs-layout" class="fd-layout">
263
263
  <!-- Mobile header -->
264
264
  <header class="fd-header">
265
265
  <button class="fd-menu-btn" onclick={toggleSidebar} aria-label="Toggle sidebar">
@@ -505,19 +505,19 @@
505
505
  <main class="fd-main">
506
506
  {@render children()}
507
507
  </main>
508
- </div>
509
508
 
510
- {#if showFloatingAI}
511
- <FloatingAIChat
512
- api={localizedApi}
513
- suggestedQuestions={config.ai.suggestedQuestions ?? []}
514
- aiLabel={config.ai.aiLabel ?? "AI"}
515
- position={config.ai.position ?? "bottom-right"}
516
- floatingStyle={config.ai.floatingStyle ?? "panel"}
517
- {triggerComponent}
518
- />
519
- {/if}
520
-
521
- {#if showSearch && searchOpen}
522
- <SearchDialog onclose={closeSearch} />
523
- {/if}
509
+ {#if showFloatingAI}
510
+ <FloatingAIChat
511
+ api={localizedApi}
512
+ suggestedQuestions={config.ai.suggestedQuestions ?? []}
513
+ aiLabel={config.ai.aiLabel ?? "AI"}
514
+ position={config.ai.position ?? "bottom-right"}
515
+ floatingStyle={config.ai.floatingStyle ?? "panel"}
516
+ {triggerComponent}
517
+ />
518
+ {/if}
519
+
520
+ {#if showSearch && searchOpen}
521
+ <SearchDialog onclose={closeSearch} />
522
+ {/if}
523
+ </div>
@@ -5,13 +5,18 @@
5
5
 
6
6
  /* ─── Colorful yellow accent overrides ────────────────────────────── */
7
7
 
8
- :root {
8
+ body:has(#nd-docs-layout),
9
+ #nd-docs-layout {
9
10
  --color-fd-primary: hsl(40, 96%, 40%);
10
11
  --color-fd-primary-foreground: hsl(0, 0%, 100%);
11
12
  --color-fd-ring: hsl(40, 80%, 50%);
12
13
  }
13
14
 
14
- .dark {
15
+ html.dark body:has(#nd-docs-layout),
16
+ body.dark:has(#nd-docs-layout),
17
+ body:has(#nd-docs-layout.dark),
18
+ :is(html.dark, body.dark) #nd-docs-layout,
19
+ #nd-docs-layout.dark {
15
20
  --color-fd-primary: hsl(45, 100%, 60%);
16
21
  --color-fd-primary-foreground: hsl(0, 0%, 5%);
17
22
  --color-fd-ring: hsl(45, 90%, 55%);
@@ -19,7 +24,7 @@
19
24
 
20
25
  /* ─── Description under title ──────────────────────────────────────── */
21
26
 
22
- .fd-page-description {
27
+ #nd-docs-layout .fd-page-description {
23
28
  margin-bottom: 1rem;
24
29
  font-size: 1.125rem;
25
30
  line-height: 1.75;
@@ -28,7 +33,8 @@
28
33
 
29
34
  /* ─── Sidebar dark overrides (fumadocs neutral) ────────────────────── */
30
35
 
31
- .dark .fd-sidebar {
36
+ :is(html.dark, body.dark) #nd-docs-layout .fd-sidebar,
37
+ #nd-docs-layout.dark .fd-sidebar {
32
38
  --color-fd-muted: hsl(0, 0%, 16%);
33
39
  --color-fd-secondary: hsl(0, 0%, 18%);
34
40
  --color-fd-muted-foreground: hsl(0, 0%, 72%);
@@ -36,7 +42,7 @@
36
42
 
37
43
  /* ─── Cards (fumadocs style) ────────────────────────────────────────── */
38
44
 
39
- .fd-card {
45
+ #nd-docs-layout .fd-card {
40
46
  display: block;
41
47
  border-radius: 0.75rem;
42
48
  border: 1px solid var(--color-fd-border);
@@ -50,11 +56,11 @@
50
56
  border-color 150ms;
51
57
  }
52
58
 
53
- .fd-card:hover {
59
+ #nd-docs-layout .fd-card:hover {
54
60
  background: var(--color-fd-accent);
55
61
  }
56
62
 
57
- .fd-card-icon {
63
+ #nd-docs-layout .fd-card-icon {
58
64
  margin-bottom: 0.5rem;
59
65
  width: fit-content;
60
66
  border-radius: 0.375rem;
@@ -63,48 +69,48 @@
63
69
  color: var(--color-fd-muted-foreground);
64
70
  }
65
71
 
66
- .fd-card-title {
72
+ #nd-docs-layout .fd-card-title {
67
73
  font-weight: 500;
68
74
  }
69
75
 
70
- .fd-card-description {
76
+ #nd-docs-layout .fd-card-description {
71
77
  color: var(--color-fd-muted-foreground);
72
78
  margin-top: 0.25rem;
73
79
  }
74
80
 
75
- .fd-cards {
81
+ #nd-docs-layout .fd-cards {
76
82
  display: grid;
77
83
  grid-template-columns: 1fr;
78
84
  gap: 1rem;
79
85
  }
80
86
 
81
87
  @media (min-width: 640px) {
82
- .fd-cards {
88
+ #nd-docs-layout .fd-cards {
83
89
  grid-template-columns: repeat(2, 1fr);
84
90
  }
85
91
  }
86
92
 
87
93
  /* ─── Omni Command Palette — colorful theme ────────────────────────── */
88
94
 
89
- .omni-content {
95
+ #nd-docs-layout .omni-content {
90
96
  border-radius: 0.75rem;
91
97
  }
92
98
 
93
- .omni-item-active {
99
+ #nd-docs-layout .omni-item-active {
94
100
  background: color-mix(in srgb, var(--color-fd-primary) 15%, transparent);
95
101
  }
96
102
 
97
- .omni-highlight {
103
+ #nd-docs-layout .omni-highlight {
98
104
  background: color-mix(in srgb, var(--color-fd-primary) 30%, transparent);
99
105
  }
100
106
 
101
- .omni-search-input:focus {
107
+ #nd-docs-layout .omni-search-input:focus {
102
108
  caret-color: var(--color-fd-primary);
103
109
  }
104
110
 
105
111
  /* ─── Sidebar AI trigger (sidebar-icon mode) — search + Ask AI row ───── */
106
112
 
107
- .fd-sidebar-search-ai-row {
113
+ #nd-docs-layout .fd-sidebar-search-ai-row {
108
114
  display: flex;
109
115
  gap: 10px;
110
116
  align-items: stretch;
@@ -112,7 +118,7 @@
112
118
  margin-bottom: 2px;
113
119
  }
114
120
 
115
- .fd-sidebar-search-ai-row .fd-sidebar-search-btn {
121
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-search-btn {
116
122
  flex: 1;
117
123
  min-width: 0;
118
124
  display: flex;
@@ -128,18 +134,18 @@
128
134
  transition: background-color 150ms, border-color 150ms, color 150ms;
129
135
  }
130
136
 
131
- .fd-sidebar-search-ai-row .fd-sidebar-search-btn:hover {
137
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-search-btn:hover {
132
138
  background: var(--color-fd-accent);
133
139
  color: var(--color-fd-foreground);
134
140
  }
135
141
 
136
- .fd-sidebar-search-ai-row .fd-sidebar-search-btn svg {
142
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-search-btn svg {
137
143
  flex-shrink: 0;
138
144
  width: 16px;
139
145
  height: 16px;
140
146
  }
141
147
 
142
- .fd-sidebar-search-ai-row .fd-sidebar-search-kbd {
148
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-search-kbd {
143
149
  display: flex;
144
150
  gap: 2px;
145
151
  margin-left: auto;
@@ -147,7 +153,7 @@
147
153
  opacity: 0.8;
148
154
  }
149
155
 
150
- .fd-sidebar-search-ai-row .fd-sidebar-search-kbd kbd {
156
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-search-kbd kbd {
151
157
  font-family: inherit;
152
158
  font-size: 0.7rem;
153
159
  padding: 2px 5px;
@@ -156,7 +162,7 @@
156
162
  background: var(--color-fd-muted);
157
163
  }
158
164
 
159
- .fd-sidebar-search-ai-row .fd-sidebar-ai-btn {
165
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-ai-btn {
160
166
  display: inline-flex;
161
167
  align-items: center;
162
168
  justify-content: center;
@@ -171,40 +177,45 @@
171
177
  transition: background-color 150ms, color 150ms, border-color 150ms;
172
178
  }
173
179
 
174
- .fd-sidebar-search-ai-row .fd-sidebar-ai-btn:hover {
180
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-ai-btn:hover {
175
181
  background: var(--color-fd-accent);
176
182
  color: var(--color-fd-primary);
177
183
  border-color: var(--color-fd-primary);
178
184
  }
179
185
 
180
- .fd-sidebar-search-ai-row .fd-sidebar-ai-btn svg {
186
+ #nd-docs-layout .fd-sidebar-search-ai-row .fd-sidebar-ai-btn svg {
181
187
  width: 16px;
182
188
  height: 16px;
183
189
  }
184
190
 
185
- .dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-btn {
191
+ :is(html.dark, body.dark) #nd-docs-layout .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-btn,
192
+ #nd-docs-layout.dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-btn {
186
193
  background: var(--color-fd-secondary);
187
194
  border-color: var(--color-fd-border);
188
195
  color: var(--color-fd-muted-foreground);
189
196
  }
190
197
 
191
- .dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-btn:hover {
198
+ :is(html.dark, body.dark) #nd-docs-layout .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-btn:hover,
199
+ #nd-docs-layout.dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-btn:hover {
192
200
  background: var(--color-fd-accent);
193
201
  color: var(--color-fd-foreground);
194
202
  }
195
203
 
196
- .dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-kbd kbd {
204
+ :is(html.dark, body.dark) #nd-docs-layout .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-kbd kbd,
205
+ #nd-docs-layout.dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-search-kbd kbd {
197
206
  background: var(--color-fd-muted);
198
207
  border-color: var(--color-fd-border);
199
208
  }
200
209
 
201
- .dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-ai-btn {
210
+ :is(html.dark, body.dark) #nd-docs-layout .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-ai-btn,
211
+ #nd-docs-layout.dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-ai-btn {
202
212
  background: var(--color-fd-secondary);
203
213
  border-color: var(--color-fd-border);
204
214
  color: var(--color-fd-muted-foreground);
205
215
  }
206
216
 
207
- .dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-ai-btn:hover {
217
+ :is(html.dark, body.dark) #nd-docs-layout .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-ai-btn:hover,
218
+ #nd-docs-layout.dark .fd-sidebar .fd-sidebar-search-ai-row .fd-sidebar-ai-btn:hover {
208
219
  background: var(--color-fd-accent);
209
220
  color: var(--color-fd-primary);
210
221
  border-color: var(--color-fd-primary);
@@ -212,7 +223,7 @@
212
223
 
213
224
  /* ─── Page Actions — colorful theme ────────────────────────────────── */
214
225
 
215
- .fd-page-action-btn {
226
+ #nd-docs-layout .fd-page-action-btn {
216
227
  border-radius: 0.375rem !important;
217
228
  font-size: 0.8125rem !important;
218
229
  letter-spacing: normal !important;
@@ -221,37 +232,37 @@
221
232
  font-family: var(--fd-font-sans, ui-sans-serif, system-ui, sans-serif) !important;
222
233
  }
223
234
 
224
- .fd-page-action-dropdown {
235
+ #nd-docs-layout .fd-page-action-dropdown {
225
236
  position: relative !important;
226
237
  }
227
238
 
228
- .fd-page-action-menu {
239
+ #nd-docs-layout .fd-page-action-menu {
229
240
  border-radius: 0.5rem !important;
230
241
  border: 1px solid var(--color-fd-border) !important;
231
242
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important;
232
243
  background: var(--color-fd-popover) !important;
233
244
  }
234
245
 
235
- .fd-page-action-menu-item {
246
+ #nd-docs-layout .fd-page-action-menu-item {
236
247
  border-radius: 0.25rem !important;
237
248
  font-size: 0.8125rem !important;
238
249
  color: var(--color-fd-foreground) !important;
239
250
  }
240
251
 
241
- .fd-page-action-menu-item:hover {
252
+ #nd-docs-layout .fd-page-action-menu-item:hover {
242
253
  background: var(--color-fd-accent) !important;
243
254
  color: var(--color-fd-accent-foreground) !important;
244
255
  }
245
256
 
246
257
  /* ─── Page nav cards ───────────────────────────────────────────────── */
247
258
 
248
- .fd-page-nav-card {
259
+ #nd-docs-layout .fd-page-nav-card {
249
260
  border-radius: 0.75rem;
250
261
  }
251
262
 
252
263
  /* ─── Inline code ──────────────────────────────────────────────────── */
253
264
 
254
- .fd-docs-content :not(pre) > code {
265
+ #nd-docs-layout .fd-docs-content :not(pre) > code {
255
266
  padding: 3px;
256
267
  border: 1px solid var(--color-fd-border);
257
268
  font-size: 13px;
@@ -261,7 +272,7 @@
261
272
 
262
273
  /* ─── Links in prose ───────────────────────────────────────────────── */
263
274
 
264
- .fd-docs-content a:not(.fd-page-nav-card):not([class]) {
275
+ #nd-docs-layout .fd-docs-content a:not(.fd-page-nav-card):not([class]) {
265
276
  text-decoration: underline;
266
277
  text-underline-offset: 3.5px;
267
278
  text-decoration-color: var(--color-fd-primary);
@@ -271,7 +282,7 @@
271
282
 
272
283
  /* ─── Tables (rounded) ─────────────────────────────────────────────── */
273
284
 
274
- .fd-docs-content table {
285
+ #nd-docs-layout .fd-docs-content table {
275
286
  border-collapse: separate;
276
287
  border-spacing: 0;
277
288
  background: var(--color-fd-card);
@@ -280,66 +291,66 @@
280
291
  overflow: hidden;
281
292
  }
282
293
 
283
- .fd-docs-content th {
294
+ #nd-docs-layout .fd-docs-content th {
284
295
  background: var(--color-fd-muted);
285
296
  font-weight: 600;
286
297
  }
287
298
 
288
- .fd-docs-content th,
289
- .fd-docs-content td {
299
+ #nd-docs-layout .fd-docs-content th,
300
+ #nd-docs-layout .fd-docs-content td {
290
301
  padding: 0.625rem;
291
302
  border-bottom: 1px solid var(--color-fd-border);
292
303
  }
293
304
 
294
- .fd-docs-content tr:last-child td {
305
+ #nd-docs-layout .fd-docs-content tr:last-child td {
295
306
  border-bottom: none;
296
307
  }
297
308
 
298
309
  /* ─── Blockquotes ──────────────────────────────────────────────────── */
299
310
 
300
- .fd-docs-content blockquote {
311
+ #nd-docs-layout .fd-docs-content blockquote {
301
312
  border-left: 2px solid var(--color-fd-primary);
302
313
  padding-left: 1rem;
303
314
  color: var(--color-fd-foreground);
304
315
  font-style: normal;
305
316
  }
306
317
 
307
- .fd-docs-content hr {
318
+ #nd-docs-layout .fd-docs-content hr {
308
319
  border-color: var(--color-fd-border);
309
320
  }
310
321
 
311
322
  /* ─── Ask AI button (floating + custom trigger) — sync with Next.js ───── */
312
323
 
313
- .fd-ai-floating-btn {
324
+ #nd-docs-layout .fd-ai-floating-btn {
314
325
  border-radius: 26px;
315
326
  box-shadow: 0 8px 32px rgba(180, 140, 20, 0.3);
316
327
  }
317
328
 
318
- .fd-ai-floating-btn:hover {
329
+ #nd-docs-layout .fd-ai-floating-btn:hover {
319
330
  box-shadow: 0 10px 40px rgba(180, 140, 20, 0.4);
320
331
  }
321
332
 
322
- .fd-ai-floating-trigger .ask-ai-trigger {
333
+ #nd-docs-layout .fd-ai-floating-trigger .ask-ai-trigger {
323
334
  font-family: var(--fd-font-sans, inherit);
324
335
  border-radius: 26px !important;
325
336
  box-shadow: 0 8px 32px rgba(180, 140, 20, 0.3) !important;
326
337
  }
327
338
 
328
- .fd-ai-floating-trigger .ask-ai-trigger:hover {
339
+ #nd-docs-layout .fd-ai-floating-trigger .ask-ai-trigger:hover {
329
340
  box-shadow: 0 10px 40px rgba(180, 140, 20, 0.4);
330
341
  }
331
342
 
332
343
  /* ─── Feedback (colorful theme) ──────────────────────────────────── */
333
344
 
334
- .fd-feedback-input,
335
- .fd-feedback-submit {
345
+ #nd-docs-layout .fd-feedback-input,
346
+ #nd-docs-layout .fd-feedback-submit {
336
347
  border-radius: 0.5rem;
337
348
  }
338
349
 
339
- .fd-feedback-choice[data-selected="true"] {
350
+ #nd-docs-layout .fd-feedback-choice[data-selected="true"] {
340
351
  background: color-mix(in srgb, var(--color-fd-primary) 12%, var(--color-fd-secondary));
341
352
  }
342
353
 
343
- .fd-feedback-status[data-status="success"] {
354
+ #nd-docs-layout .fd-feedback-status[data-status="success"] {
344
355
  color: var(--color-fd-primary);
345
356
  }