svedocs 0.1.0-beta.2

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.
Files changed (192) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +38 -0
  3. package/dist/ai/openai-compatible.d.ts +13 -0
  4. package/dist/ai/openai-compatible.d.ts.map +1 -0
  5. package/dist/ai/openai-compatible.js +92 -0
  6. package/dist/ai/providers.d.ts +19 -0
  7. package/dist/ai/providers.d.ts.map +1 -0
  8. package/dist/ai/providers.js +185 -0
  9. package/dist/ai/rate-limit.d.ts +18 -0
  10. package/dist/ai/rate-limit.d.ts.map +1 -0
  11. package/dist/ai/rate-limit.js +52 -0
  12. package/dist/ai/response.d.ts +4 -0
  13. package/dist/ai/response.d.ts.map +1 -0
  14. package/dist/ai/response.js +151 -0
  15. package/dist/ai/runtime.d.ts +30 -0
  16. package/dist/ai/runtime.d.ts.map +1 -0
  17. package/dist/ai/runtime.js +105 -0
  18. package/dist/ai/types.d.ts +93 -0
  19. package/dist/ai/types.d.ts.map +1 -0
  20. package/dist/ai/types.js +1 -0
  21. package/dist/ai.d.ts +7 -0
  22. package/dist/ai.d.ts.map +1 -0
  23. package/dist/ai.js +6 -0
  24. package/dist/ambient.d.ts +5 -0
  25. package/dist/cloudflare.d.ts +27 -0
  26. package/dist/cloudflare.d.ts.map +1 -0
  27. package/dist/cloudflare.js +146 -0
  28. package/dist/config.d.ts +311 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +243 -0
  31. package/dist/core/checks.d.ts +4 -0
  32. package/dist/core/checks.d.ts.map +1 -0
  33. package/dist/core/checks.js +252 -0
  34. package/dist/core/config.d.ts +5 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +182 -0
  37. package/dist/core/content.d.ts +7 -0
  38. package/dist/core/content.d.ts.map +1 -0
  39. package/dist/core/content.js +211 -0
  40. package/dist/core/links.d.ts +8 -0
  41. package/dist/core/links.d.ts.map +1 -0
  42. package/dist/core/links.js +94 -0
  43. package/dist/core/navigation.d.ts +5 -0
  44. package/dist/core/navigation.d.ts.map +1 -0
  45. package/dist/core/navigation.js +144 -0
  46. package/dist/core/search.d.ts +5 -0
  47. package/dist/core/search.d.ts.map +1 -0
  48. package/dist/core/search.js +41 -0
  49. package/dist/core/types.d.ts +269 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/core/types.js +4 -0
  52. package/dist/core/utils.d.ts +12 -0
  53. package/dist/core/utils.d.ts.map +1 -0
  54. package/dist/core/utils.js +52 -0
  55. package/dist/core.d.ts +8 -0
  56. package/dist/core.d.ts.map +1 -0
  57. package/dist/core.js +7 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +3 -0
  61. package/dist/mdx/ast.d.ts +32 -0
  62. package/dist/mdx/ast.d.ts.map +1 -0
  63. package/dist/mdx/ast.js +148 -0
  64. package/dist/mdx/code.d.ts +14 -0
  65. package/dist/mdx/code.d.ts.map +1 -0
  66. package/dist/mdx/code.js +315 -0
  67. package/dist/mdx/compile.d.ts +26 -0
  68. package/dist/mdx/compile.d.ts.map +1 -0
  69. package/dist/mdx/compile.js +63 -0
  70. package/dist/mdx/diff.d.ts +5 -0
  71. package/dist/mdx/diff.d.ts.map +1 -0
  72. package/dist/mdx/diff.js +160 -0
  73. package/dist/mdx/utils.d.ts +10 -0
  74. package/dist/mdx/utils.d.ts.map +1 -0
  75. package/dist/mdx/utils.js +64 -0
  76. package/dist/og/image.d.ts +21 -0
  77. package/dist/og/image.d.ts.map +1 -0
  78. package/dist/og/image.js +216 -0
  79. package/dist/og/metadata.d.ts +7 -0
  80. package/dist/og/metadata.d.ts.map +1 -0
  81. package/dist/og/metadata.js +160 -0
  82. package/dist/og/types.d.ts +59 -0
  83. package/dist/og/types.d.ts.map +1 -0
  84. package/dist/og/types.js +1 -0
  85. package/dist/og.d.ts +4 -0
  86. package/dist/og.d.ts.map +1 -0
  87. package/dist/og.js +3 -0
  88. package/dist/search/algolia.d.ts +10 -0
  89. package/dist/search/algolia.d.ts.map +1 -0
  90. package/dist/search/algolia.js +82 -0
  91. package/dist/search/cloudflare-sync.d.ts +5 -0
  92. package/dist/search/cloudflare-sync.d.ts.map +1 -0
  93. package/dist/search/cloudflare-sync.js +169 -0
  94. package/dist/search/cloudflare.d.ts +9 -0
  95. package/dist/search/cloudflare.d.ts.map +1 -0
  96. package/dist/search/cloudflare.js +115 -0
  97. package/dist/search/local.d.ts +9 -0
  98. package/dist/search/local.d.ts.map +1 -0
  99. package/dist/search/local.js +122 -0
  100. package/dist/search/runtime.d.ts +41 -0
  101. package/dist/search/runtime.d.ts.map +1 -0
  102. package/dist/search/runtime.js +151 -0
  103. package/dist/search/types.d.ts +172 -0
  104. package/dist/search/types.d.ts.map +1 -0
  105. package/dist/search/types.js +1 -0
  106. package/dist/search/typesense.d.ts +11 -0
  107. package/dist/search/typesense.d.ts.map +1 -0
  108. package/dist/search/typesense.js +91 -0
  109. package/dist/search/utils.d.ts +10 -0
  110. package/dist/search/utils.d.ts.map +1 -0
  111. package/dist/search/utils.js +55 -0
  112. package/dist/search.d.ts +8 -0
  113. package/dist/search.d.ts.map +1 -0
  114. package/dist/search.js +7 -0
  115. package/dist/svelte.d.ts +24 -0
  116. package/dist/svelte.d.ts.map +1 -0
  117. package/dist/svelte.js +51 -0
  118. package/dist/testing.d.ts +3 -0
  119. package/dist/testing.d.ts.map +1 -0
  120. package/dist/testing.js +23 -0
  121. package/dist/theme/AskAiPanel.svelte +433 -0
  122. package/dist/theme/AskAiPanel.svelte.d.ts +27 -0
  123. package/dist/theme/AskAiPanel.svelte.d.ts.map +1 -0
  124. package/dist/theme/Button.svelte +34 -0
  125. package/dist/theme/Button.svelte.d.ts +41 -0
  126. package/dist/theme/Button.svelte.d.ts.map +1 -0
  127. package/dist/theme/Checkbox.svelte +63 -0
  128. package/dist/theme/Checkbox.svelte.d.ts +45 -0
  129. package/dist/theme/Checkbox.svelte.d.ts.map +1 -0
  130. package/dist/theme/CodeBlock.svelte +6 -0
  131. package/dist/theme/CodeBlock.svelte.d.ts +22 -0
  132. package/dist/theme/CodeBlock.svelte.d.ts.map +1 -0
  133. package/dist/theme/DocPage.svelte +121 -0
  134. package/dist/theme/DocPage.svelte.d.ts +33 -0
  135. package/dist/theme/DocPage.svelte.d.ts.map +1 -0
  136. package/dist/theme/DocsApp.svelte +78 -0
  137. package/dist/theme/DocsApp.svelte.d.ts +63 -0
  138. package/dist/theme/DocsApp.svelte.d.ts.map +1 -0
  139. package/dist/theme/DocsLayout.svelte +167 -0
  140. package/dist/theme/DocsLayout.svelte.d.ts +40 -0
  141. package/dist/theme/DocsLayout.svelte.d.ts.map +1 -0
  142. package/dist/theme/FloatingToolbar.svelte +73 -0
  143. package/dist/theme/FloatingToolbar.svelte.d.ts +22 -0
  144. package/dist/theme/FloatingToolbar.svelte.d.ts.map +1 -0
  145. package/dist/theme/FormField.svelte +41 -0
  146. package/dist/theme/FormField.svelte.d.ts +35 -0
  147. package/dist/theme/FormField.svelte.d.ts.map +1 -0
  148. package/dist/theme/HomePage.svelte +228 -0
  149. package/dist/theme/HomePage.svelte.d.ts +58 -0
  150. package/dist/theme/HomePage.svelte.d.ts.map +1 -0
  151. package/dist/theme/Input.svelte +36 -0
  152. package/dist/theme/Input.svelte.d.ts +34 -0
  153. package/dist/theme/Input.svelte.d.ts.map +1 -0
  154. package/dist/theme/PageLayout.svelte +36 -0
  155. package/dist/theme/PageLayout.svelte.d.ts +31 -0
  156. package/dist/theme/PageLayout.svelte.d.ts.map +1 -0
  157. package/dist/theme/RootLayout.svelte +330 -0
  158. package/dist/theme/RootLayout.svelte.d.ts +40 -0
  159. package/dist/theme/RootLayout.svelte.d.ts.map +1 -0
  160. package/dist/theme/ScopeSwitcher.svelte +103 -0
  161. package/dist/theme/ScopeSwitcher.svelte.d.ts +24 -0
  162. package/dist/theme/ScopeSwitcher.svelte.d.ts.map +1 -0
  163. package/dist/theme/SearchDialog.svelte +253 -0
  164. package/dist/theme/SearchDialog.svelte.d.ts +28 -0
  165. package/dist/theme/SearchDialog.svelte.d.ts.map +1 -0
  166. package/dist/theme/Select.svelte +37 -0
  167. package/dist/theme/Select.svelte.d.ts +42 -0
  168. package/dist/theme/Select.svelte.d.ts.map +1 -0
  169. package/dist/theme/SidebarTree.svelte +136 -0
  170. package/dist/theme/SidebarTree.svelte.d.ts +24 -0
  171. package/dist/theme/SidebarTree.svelte.d.ts.map +1 -0
  172. package/dist/theme/Textarea.svelte +33 -0
  173. package/dist/theme/Textarea.svelte.d.ts +33 -0
  174. package/dist/theme/Textarea.svelte.d.ts.map +1 -0
  175. package/dist/theme/ThemeToggle.svelte +39 -0
  176. package/dist/theme/ThemeToggle.svelte.d.ts +21 -0
  177. package/dist/theme/ThemeToggle.svelte.d.ts.map +1 -0
  178. package/dist/theme/forms.d.ts +4 -0
  179. package/dist/theme/forms.d.ts.map +1 -0
  180. package/dist/theme/forms.js +3 -0
  181. package/dist/theme/index.d.ts +21 -0
  182. package/dist/theme/index.d.ts.map +1 -0
  183. package/dist/theme/index.js +19 -0
  184. package/dist/theme/portal.d.ts +5 -0
  185. package/dist/theme/portal.d.ts.map +1 -0
  186. package/dist/theme/portal.js +19 -0
  187. package/dist/theme/styles.css +3697 -0
  188. package/dist/virtual.d.ts +59 -0
  189. package/dist/vite.d.ts +10 -0
  190. package/dist/vite.d.ts.map +1 -0
  191. package/dist/vite.js +304 -0
  192. package/package.json +118 -0
@@ -0,0 +1,253 @@
1
+ <script lang="ts">
2
+ import { goto } from '$app/navigation';
3
+ import { onMount, tick } from 'svelte';
4
+ import type { SvedocsSearchRecord } from '../core/types.js';
5
+ import { filterSearchRecords, searchRecords } from '../search/local.js';
6
+ import type { SearchResult, SearchScope } from '../search/types.js';
7
+ import { portal } from './portal.js';
8
+
9
+ export let records: SvedocsSearchRecord[] = [];
10
+ export let loadRecords: (() => Promise<SvedocsSearchRecord[]>) | undefined = undefined;
11
+ export let scope: SearchScope = {};
12
+ export let provider = 'local';
13
+ export let endpoint = '/api/search';
14
+ export let buildMode = 'edge';
15
+
16
+ let open = false;
17
+ let query = '';
18
+ let activeIndex = 0;
19
+ let trigger: HTMLButtonElement | undefined;
20
+ let input: HTMLInputElement | undefined;
21
+ let dialog: HTMLDivElement | undefined;
22
+ let previousFocus: HTMLElement | undefined;
23
+ let remoteResults: SearchResult[] = [];
24
+ let remoteStatus: 'idle' | 'loading' | 'ready' | 'error' = 'idle';
25
+ let remoteError = '';
26
+ let remoteKey = '';
27
+ let remoteRequestId = 0;
28
+ let loadedRecords: SvedocsSearchRecord[] = records;
29
+ let recordsStatus: 'idle' | 'loading' | 'ready' | 'error' = records.length > 0 ? 'ready' : 'idle';
30
+ let recordsRequest: Promise<SvedocsSearchRecord[]> | undefined;
31
+
32
+ $: if (records.length > 0 && loadedRecords !== records) {
33
+ loadedRecords = records;
34
+ recordsStatus = 'ready';
35
+ }
36
+ $: usesRemoteSearch = buildMode === 'edge' && provider !== 'local' && provider !== 'local-json';
37
+ $: localResults = query.trim()
38
+ ? searchRecords(loadedRecords, { query, limit: 8, ...scope })
39
+ : createDefaultResults(loadedRecords, scope);
40
+ $: results = usesRemoteSearch && query.trim()
41
+ ? remoteStatus === 'error' ? localResults : remoteResults
42
+ : localResults;
43
+ $: activeIndex = Math.min(activeIndex, Math.max(results.length - 1, 0));
44
+ $: if (usesRemoteSearch && open && query.trim()) {
45
+ const nextKey = createRemoteKey(provider, endpoint, query, scope);
46
+ if (nextKey !== remoteKey) {
47
+ remoteKey = nextKey;
48
+ void loadRemoteResults(query, scope, ++remoteRequestId);
49
+ }
50
+ }
51
+ $: if (!query.trim()) {
52
+ remoteResults = [];
53
+ remoteStatus = 'idle';
54
+ remoteError = '';
55
+ remoteKey = '';
56
+ }
57
+
58
+ function show() {
59
+ previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : undefined;
60
+ open = true;
61
+ void ensureRecords();
62
+ tick().then(() => input?.focus());
63
+ }
64
+
65
+ function hide() {
66
+ open = false;
67
+ query = '';
68
+ activeIndex = 0;
69
+ tick().then(() => (previousFocus ?? trigger)?.focus());
70
+ }
71
+
72
+ function handleKeydown(event: KeyboardEvent) {
73
+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {
74
+ event.preventDefault();
75
+ show();
76
+ }
77
+ if (event.key === 'Escape' && open) hide();
78
+ }
79
+
80
+ function handleDialogKeydown(event: KeyboardEvent) {
81
+ if (event.key === 'Tab') {
82
+ trapFocus(event, dialog);
83
+ }
84
+ if (event.key === 'Escape') {
85
+ hide();
86
+ }
87
+ if (event.key === 'ArrowDown') {
88
+ event.preventDefault();
89
+ activeIndex = Math.min(activeIndex + 1, results.length - 1);
90
+ }
91
+ if (event.key === 'ArrowUp') {
92
+ event.preventDefault();
93
+ activeIndex = Math.max(activeIndex - 1, 0);
94
+ }
95
+ if (event.key === 'Enter' && results[activeIndex]) {
96
+ void goto(results[activeIndex].url, { keepFocus: false });
97
+ hide();
98
+ }
99
+ }
100
+
101
+ onMount(() => {
102
+ window.addEventListener('keydown', handleKeydown);
103
+ window.addEventListener('svedocs:open-search', show);
104
+ return () => {
105
+ window.removeEventListener('keydown', handleKeydown);
106
+ window.removeEventListener('svedocs:open-search', show);
107
+ };
108
+ });
109
+
110
+ async function ensureRecords(): Promise<SvedocsSearchRecord[]> {
111
+ if (loadedRecords.length > 0 || !loadRecords) return loadedRecords;
112
+ if (!recordsRequest) {
113
+ recordsStatus = 'loading';
114
+ recordsRequest = loadRecords()
115
+ .then((nextRecords) => {
116
+ loadedRecords = nextRecords;
117
+ recordsStatus = 'ready';
118
+ return nextRecords;
119
+ })
120
+ .catch((error) => {
121
+ recordsStatus = 'error';
122
+ recordsRequest = undefined;
123
+ throw error;
124
+ });
125
+ }
126
+ try {
127
+ return await recordsRequest;
128
+ } catch {
129
+ return loadedRecords;
130
+ }
131
+ }
132
+
133
+ async function loadRemoteResults(query: string, scope: SearchScope, requestId: number) {
134
+ remoteResults = [];
135
+ remoteStatus = 'loading';
136
+ remoteError = '';
137
+ try {
138
+ const response = await fetch(createSearchUrl(endpoint, query, scope, provider));
139
+ if (!response.ok) throw new Error(`Search returned ${response.status}.`);
140
+ const payload = await response.json() as { results?: SearchResult[] };
141
+ if (requestId !== remoteRequestId) return;
142
+ remoteResults = payload.results ?? [];
143
+ remoteStatus = 'ready';
144
+ } catch (error) {
145
+ if (requestId !== remoteRequestId) return;
146
+ remoteResults = [];
147
+ remoteError = error instanceof Error ? error.message : 'Search failed.';
148
+ remoteStatus = 'error';
149
+ }
150
+ }
151
+
152
+ function createDefaultResults(records: SvedocsSearchRecord[], scope: SearchScope): SearchResult[] {
153
+ return filterSearchRecords(records, scope).slice(0, 6).map((record) => ({
154
+ id: record.id,
155
+ title: record.title,
156
+ url: record.url,
157
+ ...(record.section ? { section: record.section } : {}),
158
+ excerpt: record.content.slice(0, 150),
159
+ score: 0.1,
160
+ metadata: record.metadata
161
+ }));
162
+ }
163
+
164
+ function createSearchUrl(endpoint: string, query: string, scope: SearchScope, provider: string): string {
165
+ const url = new URL(endpoint, window.location.origin);
166
+ url.searchParams.set('q', query);
167
+ url.searchParams.set('limit', '8');
168
+ url.searchParams.set('provider', provider);
169
+ if (scope.locale) url.searchParams.set('locale', scope.locale);
170
+ if (scope.kind) url.searchParams.set('kind', scope.kind);
171
+ return url.toString();
172
+ }
173
+
174
+ function createRemoteKey(provider: string, endpoint: string, query: string, scope: SearchScope): string {
175
+ return JSON.stringify([provider, endpoint, query.trim(), scope.locale, scope.kind]);
176
+ }
177
+
178
+ function trapFocus(event: KeyboardEvent, root: HTMLElement | undefined) {
179
+ if (!root) return;
180
+ const focusable = Array.from(
181
+ root.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')
182
+ ).filter((element) => !element.hasAttribute('disabled') && element.offsetParent !== null);
183
+ const first = focusable[0];
184
+ const last = focusable.at(-1);
185
+ if (!first || !last) return;
186
+ if (event.shiftKey && document.activeElement === first) {
187
+ event.preventDefault();
188
+ last.focus();
189
+ } else if (!event.shiftKey && document.activeElement === last) {
190
+ event.preventDefault();
191
+ first.focus();
192
+ }
193
+ }
194
+ </script>
195
+
196
+ <button bind:this={trigger} class="sd-search-trigger" type="button" aria-label="Search documentation" aria-haspopup="dialog" aria-expanded={open} on:click={show}>
197
+ <span>Search</span>
198
+ <kbd>⌘K</kbd>
199
+ </button>
200
+
201
+ {#if open}
202
+ <div class="sd-dialog-portal" use:portal>
203
+ <div class="sd-dialog-backdrop" role="presentation" on:click={hide}></div>
204
+ <div
205
+ bind:this={dialog}
206
+ class="sd-search-dialog"
207
+ role="dialog"
208
+ aria-modal="true"
209
+ aria-label="Search documentation"
210
+ tabindex="-1"
211
+ on:keydown={handleDialogKeydown}
212
+ >
213
+ <label class="sd-search-box">
214
+ <span class="sd-visually-hidden">Search query</span>
215
+ <input bind:this={input} bind:value={query} placeholder="Search docs" />
216
+ </label>
217
+ <div class="sd-search-results" role="listbox" aria-label="Search results">
218
+ {#if remoteStatus === 'loading'}
219
+ <p class="sd-empty-state">Searching...</p>
220
+ {/if}
221
+ {#if recordsStatus === 'loading' && !usesRemoteSearch}
222
+ <p class="sd-empty-state">Loading search index...</p>
223
+ {/if}
224
+ {#if recordsStatus === 'error' && !usesRemoteSearch}
225
+ <p class="sd-empty-state">Search index could not be loaded.</p>
226
+ {/if}
227
+ {#if remoteError}
228
+ <p class="sd-empty-state">{remoteError} Showing local results.</p>
229
+ {/if}
230
+ {#if results.length > 0}
231
+ {#each results as result, index}
232
+ <a
233
+ class:sd-active={index === activeIndex}
234
+ href={result.url}
235
+ role="option"
236
+ aria-selected={index === activeIndex}
237
+ on:mouseenter={() => (activeIndex = index)}
238
+ on:click={hide}
239
+ >
240
+ <span>{result.section ?? result.title}</span>
241
+ {#if result.section}
242
+ <small>{result.title}</small>
243
+ {/if}
244
+ <p>{result.excerpt}</p>
245
+ </a>
246
+ {/each}
247
+ {:else if remoteStatus !== 'loading' && recordsStatus !== 'loading'}
248
+ <p class="sd-empty-state">No matching docs yet.</p>
249
+ {/if}
250
+ </div>
251
+ </div>
252
+ </div>
253
+ {/if}
@@ -0,0 +1,28 @@
1
+ import type { SvedocsSearchRecord } from '../core/types.js';
2
+ import type { SearchScope } from '../search/types.js';
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ declare const SearchDialog: $$__sveltets_2_IsomorphicComponent<{
17
+ records?: SvedocsSearchRecord[];
18
+ loadRecords?: (() => Promise<SvedocsSearchRecord[]>) | undefined;
19
+ scope?: SearchScope;
20
+ provider?: string;
21
+ endpoint?: string;
22
+ buildMode?: string;
23
+ }, {
24
+ [evt: string]: CustomEvent<any>;
25
+ }, {}, {}, string>;
26
+ type SearchDialog = InstanceType<typeof SearchDialog>;
27
+ export default SearchDialog;
28
+ //# sourceMappingURL=SearchDialog.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchDialog.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/SearchDialog.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAoPpE,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,YAAY;cAV0I,mBAAmB,EAAE;kBAAgB,CAAC,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,GAAG,SAAS;YAAU,WAAW;;;;;;kBAUvK,CAAC;AAChF,KAAK,YAAY,GAAG,YAAY,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,37 @@
1
+ <script lang="ts">
2
+ import type { HTMLSelectAttributes } from 'svelte/elements';
3
+ import { classNames, type SvedocsControlDensity } from './forms.js';
4
+
5
+ interface $$Props extends Omit<HTMLSelectAttributes, 'class' | 'value'> {
6
+ class?: string;
7
+ density?: SvedocsControlDensity;
8
+ invalid?: boolean;
9
+ value?: HTMLSelectAttributes['value'];
10
+ }
11
+
12
+ export let value: HTMLSelectAttributes['value'] = '';
13
+ export let invalid = false;
14
+ export let density: SvedocsControlDensity = 'md';
15
+
16
+ let className = '';
17
+
18
+ export { className as class };
19
+ </script>
20
+
21
+ <span class={classNames('sd-select', className)} data-density={density}>
22
+ <select
23
+ {...$$restProps}
24
+ class="sd-select-control"
25
+ aria-invalid={invalid ? 'true' : undefined}
26
+ bind:value
27
+ on:blur
28
+ on:change
29
+ on:focus
30
+ on:input
31
+ on:keydown
32
+ on:keyup
33
+ >
34
+ <slot />
35
+ </select>
36
+ <span class="sd-select-icon" aria-hidden="true"></span>
37
+ </span>
@@ -0,0 +1,42 @@
1
+ import type { HTMLSelectAttributes } from 'svelte/elements';
2
+ import { type SvedocsControlDensity } from './forms.js';
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
17
+ default: any;
18
+ } ? Props extends Record<string, never> ? any : {
19
+ children?: any;
20
+ } : {});
21
+ declare const Select: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<Omit<HTMLSelectAttributes, "value" | "class"> & {
22
+ class?: string;
23
+ density?: SvedocsControlDensity;
24
+ invalid?: boolean;
25
+ value?: HTMLSelectAttributes["value"];
26
+ }, {
27
+ default: {};
28
+ }>, {
29
+ blur: FocusEvent;
30
+ change: Event;
31
+ focus: FocusEvent;
32
+ input: InputEvent;
33
+ keydown: KeyboardEvent;
34
+ keyup: KeyboardEvent;
35
+ } & {
36
+ [evt: string]: CustomEvent<any>;
37
+ }, {
38
+ default: {};
39
+ }, {}, string>;
40
+ type Select = InstanceType<typeof Select>;
41
+ export default Select;
42
+ //# sourceMappingURL=Select.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/Select.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAc,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA+BpE,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AACD,KAAK,gCAAgC,CAAC,KAAK,EAAE,KAAK,IAAI,KAAK,GACvD,CAAC,KAAK,SAAS;IAAE,OAAO,EAAE,GAAG,CAAA;CAAE,GACzB,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GACnC,GAAG,GACH;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,GAClB,EAAE,CAAC,CAAC;AAId,QAAA,MAAM,MAAM;YAtCA,MAAM;cACJ,qBAAqB;cACrB,OAAO;YACT,oBAAoB,CAAC,OAAO,CAAC;;;;;;;;;;;;;;cAmCwD,CAAC;AAChF,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC;AAC5C,eAAe,MAAM,CAAC"}
@@ -0,0 +1,136 @@
1
+ <script lang="ts">
2
+ import { goto } from '$app/navigation';
3
+ import type { SvedocsTreeItem } from '../core/types.js';
4
+
5
+ export let items: SvedocsTreeItem[] = [];
6
+ export let currentPath = '';
7
+ export let depth = 0;
8
+
9
+ function isActive(item: SvedocsTreeItem): boolean {
10
+ return item.path === currentPath;
11
+ }
12
+
13
+ function isActiveBranch(item: SvedocsTreeItem): boolean {
14
+ return isActive(item) || Boolean(item.children?.some((child) => isActiveBranch(child)));
15
+ }
16
+
17
+ function shouldOpen(item: SvedocsTreeItem): boolean {
18
+ if (isActiveBranch(item)) return true;
19
+ return item.collapsed !== true;
20
+ }
21
+
22
+ function handleSummaryLinkClick(event: MouseEvent, href: string | undefined) {
23
+ if (!href) return;
24
+ if (event.button !== 0) return;
25
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
26
+ event.preventDefault();
27
+ void goto(href, { keepFocus: false });
28
+ }
29
+
30
+ $: sections = depth === 0 ? splitIntoSections(items) : null;
31
+
32
+ function splitIntoSections(items: SvedocsTreeItem[]): { heading?: SvedocsTreeItem; items: SvedocsTreeItem[] }[] {
33
+ const hasSections = items.some((item) => item.section === true);
34
+ if (!hasSections) return [{ items }];
35
+ const out: { heading?: SvedocsTreeItem; items: SvedocsTreeItem[] }[] = [];
36
+ let current: { heading?: SvedocsTreeItem; items: SvedocsTreeItem[] } = { items: [] };
37
+ for (const item of items) {
38
+ if (item.section === true) {
39
+ if (current.items.length > 0 || current.heading) out.push(current);
40
+ current = { heading: item, items: [] };
41
+ } else {
42
+ current.items.push(item);
43
+ }
44
+ }
45
+ if (current.items.length > 0 || current.heading) out.push(current);
46
+ return out;
47
+ }
48
+ </script>
49
+
50
+ {#if depth === 0 && sections}
51
+ <div class="sd-sidebar-root">
52
+ {#each sections as section, sectionIndex}
53
+ {#if section.heading}
54
+ <div class="sd-sidebar-section-heading" class:sd-first={sectionIndex === 0} class:sd-active={section.items.some((item) => isActiveBranch(item))}>
55
+ {#if section.heading.icon}
56
+ <span class="sd-sidebar-section-icon" aria-hidden="true">{section.heading.icon}</span>
57
+ {/if}
58
+ <span>{section.heading.title}</span>
59
+ </div>
60
+ {/if}
61
+ <ul class="sd-sidebar-list" data-depth={depth}>
62
+ {#each section.items as item}
63
+ {@const hasChildren = Boolean(item.children?.length)}
64
+ {@const active = isActive(item)}
65
+ {@const branchActive = isActiveBranch(item)}
66
+ <li class="sd-sidebar-item" class:sd-has-children={hasChildren} class:sd-branch-active={branchActive}>
67
+ {#if hasChildren}
68
+ <details class="sd-sidebar-group" open={shouldOpen(item)}>
69
+ <summary class="sd-sidebar-summary" class:sd-active={active}>
70
+ {#if item.icon}
71
+ <span class="sd-sidebar-icon" aria-hidden="true">{item.icon}</span>
72
+ {/if}
73
+ <span class="sd-sidebar-summary-label">
74
+ {#if item.path}
75
+ <a class="sd-sidebar-summary-link" href={item.path} on:click={(event) => handleSummaryLinkClick(event, item.path)}>{item.title}</a>
76
+ {:else}
77
+ <span>{item.title}</span>
78
+ {/if}
79
+ </span>
80
+ <span class="sd-sidebar-chevron" aria-hidden="true">
81
+ <svg viewBox="0 0 24 24"><path d="M9 6l6 6-6 6" /></svg>
82
+ </span>
83
+ </summary>
84
+ <div class="sd-sidebar-group-body">
85
+ <svelte:self items={item.children} {currentPath} depth={depth + 1} />
86
+ </div>
87
+ </details>
88
+ {:else if item.path}
89
+ <a class="sd-sidebar-link" class:sd-active={active} href={item.path}>
90
+ {#if item.icon}
91
+ <span class="sd-sidebar-icon" aria-hidden="true">{item.icon}</span>
92
+ {/if}
93
+ <span>{item.title}</span>
94
+ </a>
95
+ {:else}
96
+ <span class="sd-sidebar-section-label">{item.title}</span>
97
+ {/if}
98
+ </li>
99
+ {/each}
100
+ </ul>
101
+ {/each}
102
+ </div>
103
+ {:else}
104
+ <ul class="sd-sidebar-list" data-depth={depth}>
105
+ {#each items as item}
106
+ {@const hasChildren = Boolean(item.children?.length)}
107
+ {@const active = isActive(item)}
108
+ {@const branchActive = isActiveBranch(item)}
109
+ <li class="sd-sidebar-item" class:sd-has-children={hasChildren} class:sd-branch-active={branchActive}>
110
+ {#if hasChildren}
111
+ <details class="sd-sidebar-group" open={shouldOpen(item)}>
112
+ <summary class="sd-sidebar-summary" class:sd-active={active}>
113
+ <span class="sd-sidebar-chevron" aria-hidden="true">
114
+ <svg viewBox="0 0 24 24"><path d="M9 6l6 6-6 6" /></svg>
115
+ </span>
116
+ {#if item.path}
117
+ <a class="sd-sidebar-summary-link" href={item.path} on:click={(event) => handleSummaryLinkClick(event, item.path)}>{item.title}</a>
118
+ {:else}
119
+ <span class="sd-sidebar-summary-text">{item.title}</span>
120
+ {/if}
121
+ </summary>
122
+ <div class="sd-sidebar-group-body">
123
+ <svelte:self items={item.children} {currentPath} depth={depth + 1} />
124
+ </div>
125
+ </details>
126
+ {:else if item.path}
127
+ <a class="sd-sidebar-link" class:sd-active={active} href={item.path}>
128
+ <span>{item.title}</span>
129
+ </a>
130
+ {:else}
131
+ <span class="sd-sidebar-section-label">{item.title}</span>
132
+ {/if}
133
+ </li>
134
+ {/each}
135
+ </ul>
136
+ {/if}
@@ -0,0 +1,24 @@
1
+ import type { SvedocsTreeItem } from '../core/types.js';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const SidebarTree: $$__sveltets_2_IsomorphicComponent<{
16
+ items?: SvedocsTreeItem[];
17
+ currentPath?: string;
18
+ depth?: number;
19
+ }, {
20
+ [evt: string]: CustomEvent<any>;
21
+ }, {}, {}, string>;
22
+ type SidebarTree = InstanceType<typeof SidebarTree>;
23
+ export default SidebarTree;
24
+ //# sourceMappingURL=SidebarTree.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarTree.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/SidebarTree.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA6IxD,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,WAAW;YAVoE,eAAe,EAAE;;;;;kBAUN,CAAC;AAC/E,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
3
+ import { classNames, type SvedocsControlDensity } from './forms.js';
4
+
5
+ interface $$Props extends Omit<HTMLTextareaAttributes, 'class' | 'value'> {
6
+ class?: string;
7
+ density?: SvedocsControlDensity;
8
+ invalid?: boolean;
9
+ value?: HTMLTextareaAttributes['value'];
10
+ }
11
+
12
+ export let value: HTMLTextareaAttributes['value'] = '';
13
+ export let invalid = false;
14
+ export let density: SvedocsControlDensity = 'md';
15
+
16
+ let className = '';
17
+
18
+ export { className as class };
19
+ </script>
20
+
21
+ <textarea
22
+ {...$$restProps}
23
+ class={classNames('sd-textarea', className)}
24
+ data-density={density}
25
+ aria-invalid={invalid ? 'true' : undefined}
26
+ bind:value
27
+ on:blur
28
+ on:change
29
+ on:focus
30
+ on:input
31
+ on:keydown
32
+ on:keyup
33
+ ></textarea>
@@ -0,0 +1,33 @@
1
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
2
+ import { type SvedocsControlDensity } from './forms.js';
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ declare const Textarea: $$__sveltets_2_IsomorphicComponent<Omit<HTMLTextareaAttributes, "value" | "class"> & {
17
+ class?: string;
18
+ density?: SvedocsControlDensity;
19
+ invalid?: boolean;
20
+ value?: HTMLTextareaAttributes["value"];
21
+ }, {
22
+ blur: FocusEvent;
23
+ change: Event;
24
+ focus: FocusEvent;
25
+ input: InputEvent;
26
+ keydown: KeyboardEvent;
27
+ keyup: KeyboardEvent;
28
+ } & {
29
+ [evt: string]: CustomEvent<any>;
30
+ }, {}, {}, string>;
31
+ type Textarea = InstanceType<typeof Textarea>;
32
+ export default Textarea;
33
+ //# sourceMappingURL=Textarea.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Textarea.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/Textarea.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAc,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA0BpE,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,QAAQ;YA5BF,MAAM;cACJ,qBAAqB;cACrB,OAAO;YACT,sBAAsB,CAAC,OAAO,CAAC;;;;;;;;;;kBAyBkD,CAAC;AAC5E,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;AAChD,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+
4
+ export let defaultMode: 'light' | 'dark' | 'system' = 'system';
5
+
6
+ let mode: 'light' | 'dark' = 'light';
7
+
8
+ function apply(next: 'light' | 'dark') {
9
+ mode = next;
10
+ document.documentElement.dataset.theme = next;
11
+ document.documentElement.style.colorScheme = next;
12
+ localStorage.setItem('svedocs-theme', next);
13
+ }
14
+
15
+ onMount(() => {
16
+ const current = document.documentElement.dataset.theme;
17
+ if (current === 'dark' || current === 'light') {
18
+ mode = current;
19
+ return;
20
+ }
21
+ const stored = localStorage.getItem('svedocs-theme');
22
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
23
+ const configured = defaultMode === 'system' ? prefersDark ? 'dark' : 'light' : defaultMode;
24
+ apply(stored === 'dark' || stored === 'light' ? stored : configured);
25
+ });
26
+ </script>
27
+
28
+ <button class="sd-theme-toggle" type="button" aria-label={`Switch to ${mode === 'dark' ? 'light' : 'dark'} theme`} title={`Switch to ${mode === 'dark' ? 'light' : 'dark'} theme`} on:click={() => apply(mode === 'dark' ? 'light' : 'dark')}>
29
+ {#if mode === 'dark'}
30
+ <svg aria-hidden="true" viewBox="0 0 24 24">
31
+ <path d="M12 4V2m0 20v-2m8-8h2M2 12h2m13.66-5.66 1.42-1.42M4.92 19.08l1.42-1.42m11.32 0 1.42 1.42M4.92 4.92l1.42 1.42" />
32
+ <circle cx="12" cy="12" r="4" />
33
+ </svg>
34
+ {:else}
35
+ <svg aria-hidden="true" viewBox="0 0 24 24">
36
+ <path d="M20 14.2A7.8 7.8 0 0 1 9.8 4a8 8 0 1 0 10.2 10.2Z" />
37
+ </svg>
38
+ {/if}
39
+ </button>
@@ -0,0 +1,21 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: Props & {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const ThemeToggle: $$__sveltets_2_IsomorphicComponent<{
15
+ defaultMode?: "light" | "dark" | "system";
16
+ }, {
17
+ [evt: string]: CustomEvent<any>;
18
+ }, {}, {}, string>;
19
+ type ThemeToggle = InstanceType<typeof ThemeToggle>;
20
+ export default ThemeToggle;
21
+ //# sourceMappingURL=ThemeToggle.svelte.d.ts.map