svedocs 0.1.0-beta.10

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 (286) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +85 -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 +20 -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 +32 -0
  16. package/dist/ai/runtime.d.ts.map +1 -0
  17. package/dist/ai/runtime.js +111 -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 +29 -0
  26. package/dist/cloudflare.d.ts.map +1 -0
  27. package/dist/cloudflare.js +149 -0
  28. package/dist/config.d.ts +373 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +299 -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 +267 -0
  34. package/dist/core/config.d.ts +6 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +178 -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 +340 -0
  40. package/dist/core/i18n.d.ts +5 -0
  41. package/dist/core/i18n.d.ts.map +1 -0
  42. package/dist/core/i18n.js +117 -0
  43. package/dist/core/links.d.ts +5 -0
  44. package/dist/core/links.d.ts.map +1 -0
  45. package/dist/core/links.js +60 -0
  46. package/dist/core/messages.d.ts +149 -0
  47. package/dist/core/messages.d.ts.map +1 -0
  48. package/dist/core/messages.js +163 -0
  49. package/dist/core/navigation.d.ts +5 -0
  50. package/dist/core/navigation.d.ts.map +1 -0
  51. package/dist/core/navigation.js +144 -0
  52. package/dist/core/routes.d.ts +36 -0
  53. package/dist/core/routes.d.ts.map +1 -0
  54. package/dist/core/routes.js +152 -0
  55. package/dist/core/search.d.ts +5 -0
  56. package/dist/core/search.d.ts.map +1 -0
  57. package/dist/core/search.js +41 -0
  58. package/dist/core/types.d.ts +468 -0
  59. package/dist/core/types.d.ts.map +1 -0
  60. package/dist/core/types.js +4 -0
  61. package/dist/core/utils.d.ts +13 -0
  62. package/dist/core/utils.d.ts.map +1 -0
  63. package/dist/core/utils.js +60 -0
  64. package/dist/core.d.ts +9 -0
  65. package/dist/core.d.ts.map +1 -0
  66. package/dist/core.js +8 -0
  67. package/dist/index.d.ts +6 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +3 -0
  70. package/dist/mdx/ast.d.ts +32 -0
  71. package/dist/mdx/ast.d.ts.map +1 -0
  72. package/dist/mdx/ast.js +148 -0
  73. package/dist/mdx/code.d.ts +17 -0
  74. package/dist/mdx/code.d.ts.map +1 -0
  75. package/dist/mdx/code.js +327 -0
  76. package/dist/mdx/compile.d.ts +29 -0
  77. package/dist/mdx/compile.d.ts.map +1 -0
  78. package/dist/mdx/compile.js +59 -0
  79. package/dist/mdx/diff.d.ts +9 -0
  80. package/dist/mdx/diff.d.ts.map +1 -0
  81. package/dist/mdx/diff.js +171 -0
  82. package/dist/mdx/headings.d.ts +4 -0
  83. package/dist/mdx/headings.d.ts.map +1 -0
  84. package/dist/mdx/headings.js +42 -0
  85. package/dist/mdx/links.d.ts +4 -0
  86. package/dist/mdx/links.d.ts.map +1 -0
  87. package/dist/mdx/links.js +144 -0
  88. package/dist/mdx/utils.d.ts +10 -0
  89. package/dist/mdx/utils.d.ts.map +1 -0
  90. package/dist/mdx/utils.js +64 -0
  91. package/dist/og/image.d.ts +25 -0
  92. package/dist/og/image.d.ts.map +1 -0
  93. package/dist/og/image.js +224 -0
  94. package/dist/og/metadata.d.ts +7 -0
  95. package/dist/og/metadata.d.ts.map +1 -0
  96. package/dist/og/metadata.js +198 -0
  97. package/dist/og/response.d.ts +4 -0
  98. package/dist/og/response.d.ts.map +1 -0
  99. package/dist/og/response.js +49 -0
  100. package/dist/og/rss.d.ts +4 -0
  101. package/dist/og/rss.d.ts.map +1 -0
  102. package/dist/og/rss.js +96 -0
  103. package/dist/og/sitemap.d.ts +7 -0
  104. package/dist/og/sitemap.d.ts.map +1 -0
  105. package/dist/og/sitemap.js +90 -0
  106. package/dist/og/types.d.ts +65 -0
  107. package/dist/og/types.d.ts.map +1 -0
  108. package/dist/og/types.js +1 -0
  109. package/dist/og.d.ts +6 -0
  110. package/dist/og.d.ts.map +1 -0
  111. package/dist/og.js +5 -0
  112. package/dist/routes.d.ts +2 -0
  113. package/dist/routes.d.ts.map +1 -0
  114. package/dist/routes.js +1 -0
  115. package/dist/search/algolia.d.ts +10 -0
  116. package/dist/search/algolia.d.ts.map +1 -0
  117. package/dist/search/algolia.js +82 -0
  118. package/dist/search/cloudflare-sync.d.ts +5 -0
  119. package/dist/search/cloudflare-sync.d.ts.map +1 -0
  120. package/dist/search/cloudflare-sync.js +169 -0
  121. package/dist/search/cloudflare.d.ts +11 -0
  122. package/dist/search/cloudflare.d.ts.map +1 -0
  123. package/dist/search/cloudflare.js +126 -0
  124. package/dist/search/local.d.ts +9 -0
  125. package/dist/search/local.d.ts.map +1 -0
  126. package/dist/search/local.js +165 -0
  127. package/dist/search/runtime.d.ts +41 -0
  128. package/dist/search/runtime.d.ts.map +1 -0
  129. package/dist/search/runtime.js +152 -0
  130. package/dist/search/types.d.ts +172 -0
  131. package/dist/search/types.d.ts.map +1 -0
  132. package/dist/search/types.js +1 -0
  133. package/dist/search/typesense.d.ts +11 -0
  134. package/dist/search/typesense.d.ts.map +1 -0
  135. package/dist/search/typesense.js +91 -0
  136. package/dist/search/utils.d.ts +11 -0
  137. package/dist/search/utils.d.ts.map +1 -0
  138. package/dist/search/utils.js +93 -0
  139. package/dist/search.d.ts +8 -0
  140. package/dist/search.d.ts.map +1 -0
  141. package/dist/search.js +7 -0
  142. package/dist/svelte.d.ts +27 -0
  143. package/dist/svelte.d.ts.map +1 -0
  144. package/dist/svelte.js +45 -0
  145. package/dist/testing.d.ts +3 -0
  146. package/dist/testing.d.ts.map +1 -0
  147. package/dist/testing.js +23 -0
  148. package/dist/theme/Article.svelte +145 -0
  149. package/dist/theme/Article.svelte.d.ts +36 -0
  150. package/dist/theme/Article.svelte.d.ts.map +1 -0
  151. package/dist/theme/AskAiPanel.svelte +241 -0
  152. package/dist/theme/AskAiPanel.svelte.d.ts +31 -0
  153. package/dist/theme/AskAiPanel.svelte.d.ts.map +1 -0
  154. package/dist/theme/Brand.svelte +19 -0
  155. package/dist/theme/Brand.svelte.d.ts +22 -0
  156. package/dist/theme/Brand.svelte.d.ts.map +1 -0
  157. package/dist/theme/Button.svelte +34 -0
  158. package/dist/theme/Button.svelte.d.ts +41 -0
  159. package/dist/theme/Button.svelte.d.ts.map +1 -0
  160. package/dist/theme/Checkbox.svelte +63 -0
  161. package/dist/theme/Checkbox.svelte.d.ts +45 -0
  162. package/dist/theme/Checkbox.svelte.d.ts.map +1 -0
  163. package/dist/theme/CodeBlock.svelte +6 -0
  164. package/dist/theme/CodeBlock.svelte.d.ts +22 -0
  165. package/dist/theme/CodeBlock.svelte.d.ts.map +1 -0
  166. package/dist/theme/DocPage.svelte +15 -0
  167. package/dist/theme/DocPage.svelte.d.ts +33 -0
  168. package/dist/theme/DocPage.svelte.d.ts.map +1 -0
  169. package/dist/theme/DocsApp.svelte +194 -0
  170. package/dist/theme/DocsApp.svelte.d.ts +60 -0
  171. package/dist/theme/DocsApp.svelte.d.ts.map +1 -0
  172. package/dist/theme/DocsLayout.svelte +99 -0
  173. package/dist/theme/DocsLayout.svelte.d.ts +39 -0
  174. package/dist/theme/DocsLayout.svelte.d.ts.map +1 -0
  175. package/dist/theme/DocsShell.svelte +91 -0
  176. package/dist/theme/DocsShell.svelte.d.ts +34 -0
  177. package/dist/theme/DocsShell.svelte.d.ts.map +1 -0
  178. package/dist/theme/ErrorPage.svelte +113 -0
  179. package/dist/theme/ErrorPage.svelte.d.ts +34 -0
  180. package/dist/theme/ErrorPage.svelte.d.ts.map +1 -0
  181. package/dist/theme/FloatingToolbar.svelte +8 -0
  182. package/dist/theme/FloatingToolbar.svelte.d.ts +22 -0
  183. package/dist/theme/FloatingToolbar.svelte.d.ts.map +1 -0
  184. package/dist/theme/Footer.svelte +18 -0
  185. package/dist/theme/Footer.svelte.d.ts +24 -0
  186. package/dist/theme/Footer.svelte.d.ts.map +1 -0
  187. package/dist/theme/FooterLinks.svelte +37 -0
  188. package/dist/theme/FooterLinks.svelte.d.ts +22 -0
  189. package/dist/theme/FooterLinks.svelte.d.ts.map +1 -0
  190. package/dist/theme/FormField.svelte +41 -0
  191. package/dist/theme/FormField.svelte.d.ts +35 -0
  192. package/dist/theme/FormField.svelte.d.ts.map +1 -0
  193. package/dist/theme/HomePage.svelte +284 -0
  194. package/dist/theme/HomePage.svelte.d.ts +65 -0
  195. package/dist/theme/HomePage.svelte.d.ts.map +1 -0
  196. package/dist/theme/Input.svelte +36 -0
  197. package/dist/theme/Input.svelte.d.ts +34 -0
  198. package/dist/theme/Input.svelte.d.ts.map +1 -0
  199. package/dist/theme/LayoutShell.svelte +120 -0
  200. package/dist/theme/LayoutShell.svelte.d.ts +43 -0
  201. package/dist/theme/LayoutShell.svelte.d.ts.map +1 -0
  202. package/dist/theme/LocalizedLink.svelte +21 -0
  203. package/dist/theme/LocalizedLink.svelte.d.ts +38 -0
  204. package/dist/theme/LocalizedLink.svelte.d.ts.map +1 -0
  205. package/dist/theme/MobileNav.svelte +20 -0
  206. package/dist/theme/MobileNav.svelte.d.ts +26 -0
  207. package/dist/theme/MobileNav.svelte.d.ts.map +1 -0
  208. package/dist/theme/Navbar.svelte +69 -0
  209. package/dist/theme/Navbar.svelte.d.ts +29 -0
  210. package/dist/theme/Navbar.svelte.d.ts.map +1 -0
  211. package/dist/theme/PageLayout.svelte +49 -0
  212. package/dist/theme/PageLayout.svelte.d.ts +34 -0
  213. package/dist/theme/PageLayout.svelte.d.ts.map +1 -0
  214. package/dist/theme/PageShell.svelte +98 -0
  215. package/dist/theme/PageShell.svelte.d.ts +35 -0
  216. package/dist/theme/PageShell.svelte.d.ts.map +1 -0
  217. package/dist/theme/PageTools.svelte +87 -0
  218. package/dist/theme/PageTools.svelte.d.ts +25 -0
  219. package/dist/theme/PageTools.svelte.d.ts.map +1 -0
  220. package/dist/theme/RenderError.svelte +62 -0
  221. package/dist/theme/RenderError.svelte.d.ts +31 -0
  222. package/dist/theme/RenderError.svelte.d.ts.map +1 -0
  223. package/dist/theme/RootLayout.svelte +274 -0
  224. package/dist/theme/RootLayout.svelte.d.ts +47 -0
  225. package/dist/theme/RootLayout.svelte.d.ts.map +1 -0
  226. package/dist/theme/RouteRenderError.svelte +53 -0
  227. package/dist/theme/RouteRenderError.svelte.d.ts +34 -0
  228. package/dist/theme/RouteRenderError.svelte.d.ts.map +1 -0
  229. package/dist/theme/SafeRenderError.svelte +49 -0
  230. package/dist/theme/SafeRenderError.svelte.d.ts +33 -0
  231. package/dist/theme/SafeRenderError.svelte.d.ts.map +1 -0
  232. package/dist/theme/ScopeSwitcher.svelte +107 -0
  233. package/dist/theme/ScopeSwitcher.svelte.d.ts +26 -0
  234. package/dist/theme/ScopeSwitcher.svelte.d.ts.map +1 -0
  235. package/dist/theme/SearchDialog.svelte +200 -0
  236. package/dist/theme/SearchDialog.svelte.d.ts +31 -0
  237. package/dist/theme/SearchDialog.svelte.d.ts.map +1 -0
  238. package/dist/theme/Select.svelte +37 -0
  239. package/dist/theme/Select.svelte.d.ts +42 -0
  240. package/dist/theme/Select.svelte.d.ts.map +1 -0
  241. package/dist/theme/SidebarTree.svelte +148 -0
  242. package/dist/theme/SidebarTree.svelte.d.ts +24 -0
  243. package/dist/theme/SidebarTree.svelte.d.ts.map +1 -0
  244. package/dist/theme/SocialNav.svelte +17 -0
  245. package/dist/theme/SocialNav.svelte.d.ts +22 -0
  246. package/dist/theme/SocialNav.svelte.d.ts.map +1 -0
  247. package/dist/theme/TableOfContents.svelte +73 -0
  248. package/dist/theme/TableOfContents.svelte.d.ts +25 -0
  249. package/dist/theme/TableOfContents.svelte.d.ts.map +1 -0
  250. package/dist/theme/Textarea.svelte +33 -0
  251. package/dist/theme/Textarea.svelte.d.ts +33 -0
  252. package/dist/theme/Textarea.svelte.d.ts.map +1 -0
  253. package/dist/theme/ThemeInit.svelte +16 -0
  254. package/dist/theme/ThemeInit.svelte.d.ts +23 -0
  255. package/dist/theme/ThemeInit.svelte.d.ts.map +1 -0
  256. package/dist/theme/ThemeToggle.svelte +37 -0
  257. package/dist/theme/ThemeToggle.svelte.d.ts +23 -0
  258. package/dist/theme/ThemeToggle.svelte.d.ts.map +1 -0
  259. package/dist/theme/TopNav.svelte +23 -0
  260. package/dist/theme/TopNav.svelte.d.ts +22 -0
  261. package/dist/theme/TopNav.svelte.d.ts.map +1 -0
  262. package/dist/theme/base.css +240 -0
  263. package/dist/theme/defaults.d.ts +4 -0
  264. package/dist/theme/defaults.d.ts.map +1 -0
  265. package/dist/theme/defaults.js +55 -0
  266. package/dist/theme/forms.d.ts +4 -0
  267. package/dist/theme/forms.d.ts.map +1 -0
  268. package/dist/theme/forms.js +3 -0
  269. package/dist/theme/headless.d.ts +62 -0
  270. package/dist/theme/headless.d.ts.map +1 -0
  271. package/dist/theme/headless.js +1064 -0
  272. package/dist/theme/index.d.ts +41 -0
  273. package/dist/theme/index.d.ts.map +1 -0
  274. package/dist/theme/index.js +38 -0
  275. package/dist/theme/portal.d.ts +6 -0
  276. package/dist/theme/portal.d.ts.map +1 -0
  277. package/dist/theme/portal.js +59 -0
  278. package/dist/theme/styles.css +4232 -0
  279. package/dist/theme/types.d.ts +363 -0
  280. package/dist/theme/types.d.ts.map +1 -0
  281. package/dist/theme/types.js +1 -0
  282. package/dist/virtual.d.ts +65 -0
  283. package/dist/vite.d.ts +16 -0
  284. package/dist/vite.d.ts.map +1 -0
  285. package/dist/vite.js +386 -0
  286. package/package.json +132 -0
@@ -0,0 +1,200 @@
1
+ <script lang="ts">
2
+ import { goto } from '$app/navigation';
3
+ import { onDestroy, onMount, tick } from 'svelte';
4
+ import type { SvedocsSearchRecord } from '../core/types.js';
5
+ import type { SearchResult, SearchScope } from '../search/types.js';
6
+ import { createSearchController, fallbackTranslate } from './headless.js';
7
+ import { lockDocumentScroll, portal } from './portal.js';
8
+ import type { SvedocsSearchController, SvedocsThemeContext } from './types.js';
9
+
10
+ export let records: SvedocsSearchRecord[] = [];
11
+ export let loadRecords: (() => Promise<SvedocsSearchRecord[]>) | undefined = undefined;
12
+ export let scope: SearchScope = {};
13
+ export let provider = 'local';
14
+ export let endpoint = '/api/search';
15
+ export let buildMode = 'edge';
16
+ export let controller: SvedocsSearchController | undefined = undefined;
17
+ export let context: SvedocsThemeContext | undefined = undefined;
18
+
19
+ const internalController = createSearchController({ records, loadRecords, scope, provider, endpoint, buildMode });
20
+ let activeController: SvedocsSearchController = internalController;
21
+ let open = false;
22
+ let query = '';
23
+ let activeIndex = 0;
24
+ let results: SearchResult[] = [];
25
+ let remoteStatus: 'idle' | 'loading' | 'ready' | 'error' = 'idle';
26
+ let remoteError = '';
27
+ let recordsStatus: 'idle' | 'loading' | 'ready' | 'error' = records.length > 0 ? 'ready' : 'idle';
28
+ let trigger: HTMLButtonElement | undefined;
29
+ let input: HTMLInputElement | undefined;
30
+ let dialog: HTMLDivElement | undefined;
31
+ let previousFocus: HTMLElement | undefined;
32
+ let boundController: SvedocsSearchController | undefined;
33
+ let unsubscribeController: (() => void) | undefined;
34
+ let releaseScrollLock: (() => void) | undefined;
35
+
36
+ $: t = context?.t ?? fallbackTranslate;
37
+ $: activeController = controller ?? internalController;
38
+ $: activeController.setOptions({ records, loadRecords, scope, provider, endpoint, buildMode, t });
39
+ $: bindController(activeController);
40
+
41
+ function show() {
42
+ previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : undefined;
43
+ activeController.show();
44
+ tick().then(() => input?.focus());
45
+ }
46
+
47
+ function hide() {
48
+ activeController.hide();
49
+ tick().then(() => (previousFocus ?? trigger)?.focus());
50
+ }
51
+
52
+ function handleKeydown(event: KeyboardEvent) {
53
+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {
54
+ event.preventDefault();
55
+ show();
56
+ }
57
+ if (event.key === 'Escape' && open) hide();
58
+ }
59
+
60
+ function handleDialogKeydown(event: KeyboardEvent) {
61
+ if (event.key === 'Tab') {
62
+ trapFocus(event, dialog);
63
+ }
64
+ if (event.key === 'Escape') {
65
+ hide();
66
+ }
67
+ if (event.key === 'ArrowDown') {
68
+ event.preventDefault();
69
+ activeController.moveActive(1);
70
+ }
71
+ if (event.key === 'ArrowUp') {
72
+ event.preventDefault();
73
+ activeController.moveActive(-1);
74
+ }
75
+ if (event.key === 'Enter') {
76
+ const result = activeController.select();
77
+ if (result) void goto(result.url, { keepFocus: false });
78
+ }
79
+ }
80
+
81
+ function handleInput(event: Event) {
82
+ activeController.setQuery((event.currentTarget as HTMLInputElement).value);
83
+ }
84
+
85
+ function bindController(nextController: SvedocsSearchController): void {
86
+ if (boundController === nextController) return;
87
+ unsubscribeController?.();
88
+ boundController = nextController;
89
+ const unsubscribers = [
90
+ nextController.open.subscribe((value) => {
91
+ open = value;
92
+ if (value && !releaseScrollLock) releaseScrollLock = lockDocumentScroll();
93
+ if (!value && releaseScrollLock) {
94
+ releaseScrollLock();
95
+ releaseScrollLock = undefined;
96
+ }
97
+ }),
98
+ nextController.query.subscribe((value) => (query = value)),
99
+ nextController.activeIndex.subscribe((value) => (activeIndex = value)),
100
+ nextController.results.subscribe((value) => (results = value)),
101
+ nextController.remoteStatus.subscribe((value) => (remoteStatus = value)),
102
+ nextController.remoteError.subscribe((value) => (remoteError = value)),
103
+ nextController.recordsStatus.subscribe((value) => (recordsStatus = value))
104
+ ];
105
+ unsubscribeController = () => {
106
+ for (const unsubscribe of unsubscribers) unsubscribe();
107
+ };
108
+ }
109
+
110
+ onMount(() => {
111
+ window.addEventListener('keydown', handleKeydown);
112
+ window.addEventListener('svedocs:open-search', show);
113
+ return () => {
114
+ window.removeEventListener('keydown', handleKeydown);
115
+ window.removeEventListener('svedocs:open-search', show);
116
+ };
117
+ });
118
+
119
+ onDestroy(() => {
120
+ unsubscribeController?.();
121
+ releaseScrollLock?.();
122
+ });
123
+
124
+ function trapFocus(event: KeyboardEvent, root: HTMLElement | undefined) {
125
+ if (!root) return;
126
+ const focusable = Array.from(
127
+ root.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')
128
+ ).filter((element) => !element.hasAttribute('disabled') && element.offsetParent !== null);
129
+ const first = focusable[0];
130
+ const last = focusable.at(-1);
131
+ if (!first || !last) return;
132
+ if (event.shiftKey && document.activeElement === first) {
133
+ event.preventDefault();
134
+ last.focus();
135
+ } else if (!event.shiftKey && document.activeElement === last) {
136
+ event.preventDefault();
137
+ first.focus();
138
+ }
139
+ }
140
+ </script>
141
+
142
+ <button bind:this={trigger} class="sd-search-trigger" type="button" aria-label={t('search.dialog')} aria-haspopup="dialog" aria-expanded={open} on:click={show} data-theme-component="search-trigger">
143
+ <span>{t('search.trigger')}</span>
144
+ <kbd>⌘K</kbd>
145
+ </button>
146
+
147
+ {#if open}
148
+ <div class="sd-dialog-portal" use:portal>
149
+ <div class="sd-dialog-backdrop" role="presentation" on:click={hide}></div>
150
+ <div
151
+ bind:this={dialog}
152
+ class="sd-search-dialog"
153
+ role="dialog"
154
+ aria-modal="true"
155
+ aria-label={t('search.dialog')}
156
+ tabindex="-1"
157
+ on:keydown={handleDialogKeydown}
158
+ data-theme-component="search"
159
+ >
160
+ <label class="sd-search-box">
161
+ <span class="sd-visually-hidden">{t('search.query')}</span>
162
+ <input value={query} placeholder={t('search.placeholder')} on:input={handleInput} bind:this={input} />
163
+ </label>
164
+ <div class="sd-search-results" role="listbox" aria-label={t('search.results')}>
165
+ {#if remoteStatus === 'loading'}
166
+ <p class="sd-empty-state">{t('search.loading')}</p>
167
+ {/if}
168
+ {#if recordsStatus === 'loading' && !(buildMode === 'edge' && provider !== 'local' && provider !== 'local-json')}
169
+ <p class="sd-empty-state">{t('search.loadingIndex')}</p>
170
+ {/if}
171
+ {#if recordsStatus === 'error' && !(buildMode === 'edge' && provider !== 'local' && provider !== 'local-json')}
172
+ <p class="sd-empty-state">{t('search.indexError')}</p>
173
+ {/if}
174
+ {#if remoteError}
175
+ <p class="sd-empty-state">{t('search.remoteFallback', { error: remoteError })}</p>
176
+ {/if}
177
+ {#if results.length > 0}
178
+ {#each results as result, index}
179
+ <a
180
+ class:sd-active={index === activeIndex}
181
+ href={result.url}
182
+ role="option"
183
+ aria-selected={index === activeIndex}
184
+ on:mouseenter={() => activeController.activate(index)}
185
+ on:click={hide}
186
+ >
187
+ <span>{result.section ?? result.title}</span>
188
+ {#if result.section}
189
+ <small>{result.title}</small>
190
+ {/if}
191
+ <p>{result.excerpt}</p>
192
+ </a>
193
+ {/each}
194
+ {:else if remoteStatus !== 'loading' && recordsStatus !== 'loading'}
195
+ <p class="sd-empty-state">{t('search.empty')}</p>
196
+ {/if}
197
+ </div>
198
+ </div>
199
+ </div>
200
+ {/if}
@@ -0,0 +1,31 @@
1
+ import type { SvedocsSearchRecord } from '../core/types.js';
2
+ import type { SearchScope } from '../search/types.js';
3
+ import type { SvedocsSearchController, SvedocsThemeContext } from './types.js';
4
+ 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> {
5
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
6
+ $$bindings?: Bindings;
7
+ } & Exports;
8
+ (internal: unknown, props: Props & {
9
+ $$events?: Events;
10
+ $$slots?: Slots;
11
+ }): Exports & {
12
+ $set?: any;
13
+ $on?: any;
14
+ };
15
+ z_$$bindings?: Bindings;
16
+ }
17
+ declare const SearchDialog: $$__sveltets_2_IsomorphicComponent<{
18
+ records?: SvedocsSearchRecord[];
19
+ loadRecords?: (() => Promise<SvedocsSearchRecord[]>) | undefined;
20
+ scope?: SearchScope;
21
+ provider?: string;
22
+ endpoint?: string;
23
+ buildMode?: string;
24
+ controller?: SvedocsSearchController | undefined;
25
+ context?: SvedocsThemeContext | undefined;
26
+ }, {
27
+ [evt: string]: CustomEvent<any>;
28
+ }, {}, {}, string>;
29
+ type SearchDialog = InstanceType<typeof SearchDialog>;
30
+ export default SearchDialog;
31
+ //# 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;AAC5D,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGpE,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA6L/E,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;cAVsL,mBAAmB,EAAE;kBAAgB,CAAC,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,GAAG,SAAS;YAAU,WAAW;;;;iBAAqG,uBAAuB,GAAG,SAAS;cAAY,mBAAmB,GAAG,SAAS;;;kBAUtY,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,148 @@
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 normalizeHref(item.path) === normalizeHref(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
+ function normalizeHref(href: string | undefined): string {
31
+ if (!href) return '';
32
+ const [path = ''] = href.split(/[?#]/);
33
+ const normalized = path === '/' ? '/' : path.replace(/\/+$/, '');
34
+ return normalized || '/';
35
+ }
36
+
37
+ $: sections = depth === 0 ? splitIntoSections(items) : null;
38
+
39
+ function splitIntoSections(items: SvedocsTreeItem[]): { heading?: SvedocsTreeItem; items: SvedocsTreeItem[] }[] {
40
+ const hasSections = items.some((item) => item.section === true);
41
+ if (!hasSections) return [{ items }];
42
+ const out: { heading?: SvedocsTreeItem; items: SvedocsTreeItem[] }[] = [];
43
+ let current: { heading?: SvedocsTreeItem; items: SvedocsTreeItem[] } = { items: [] };
44
+ for (const item of items) {
45
+ if (item.section === true) {
46
+ if (current.items.length > 0 || current.heading) out.push(current);
47
+ current = { heading: item, items: [] };
48
+ } else {
49
+ current.items.push(item);
50
+ }
51
+ }
52
+ if (current.items.length > 0 || current.heading) out.push(current);
53
+ return out;
54
+ }
55
+ </script>
56
+
57
+ {#if depth === 0 && sections}
58
+ <div class="sd-sidebar-root">
59
+ {#each sections as section, sectionIndex}
60
+ {#if section.heading}
61
+ {@const sectionActive = isActive(section.heading)}
62
+ <div class="sd-sidebar-section-heading" class:sd-first={sectionIndex === 0} class:sd-active={sectionActive || section.items.some((item) => isActiveBranch(item))}>
63
+ {#if section.heading.icon}
64
+ <span class="sd-sidebar-section-icon" aria-hidden="true">{section.heading.icon}</span>
65
+ {/if}
66
+ {#if section.heading.path}
67
+ <a class="sd-sidebar-section-link" class:sd-active={sectionActive} href={section.heading.path} aria-current={sectionActive ? 'page' : undefined}>{section.heading.title}</a>
68
+ {:else}
69
+ <span>{section.heading.title}</span>
70
+ {/if}
71
+ </div>
72
+ {/if}
73
+ <ul class="sd-sidebar-list" data-depth={depth}>
74
+ {#each section.items as item}
75
+ {@const hasChildren = Boolean(item.children?.length)}
76
+ {@const active = isActive(item)}
77
+ {@const branchActive = isActiveBranch(item)}
78
+ <li class="sd-sidebar-item" class:sd-has-children={hasChildren} class:sd-branch-active={branchActive}>
79
+ {#if hasChildren}
80
+ <details class="sd-sidebar-group" open={shouldOpen(item)}>
81
+ <summary class="sd-sidebar-summary" class:sd-active={active}>
82
+ {#if item.icon}
83
+ <span class="sd-sidebar-icon" aria-hidden="true">{item.icon}</span>
84
+ {/if}
85
+ <span class="sd-sidebar-summary-label">
86
+ {#if item.path}
87
+ <a class="sd-sidebar-summary-link" href={item.path} aria-current={active ? 'page' : undefined} on:click={(event) => handleSummaryLinkClick(event, item.path)}>{item.title}</a>
88
+ {:else}
89
+ <span>{item.title}</span>
90
+ {/if}
91
+ </span>
92
+ <span class="sd-sidebar-chevron" aria-hidden="true">
93
+ <svg viewBox="0 0 24 24"><path d="M9 6l6 6-6 6" /></svg>
94
+ </span>
95
+ </summary>
96
+ <div class="sd-sidebar-group-body">
97
+ <svelte:self items={item.children} {currentPath} depth={depth + 1} />
98
+ </div>
99
+ </details>
100
+ {:else if item.path}
101
+ <a class="sd-sidebar-link" class:sd-active={active} href={item.path} aria-current={active ? 'page' : undefined}>
102
+ {#if item.icon}
103
+ <span class="sd-sidebar-icon" aria-hidden="true">{item.icon}</span>
104
+ {/if}
105
+ <span>{item.title}</span>
106
+ </a>
107
+ {:else}
108
+ <span class="sd-sidebar-section-label">{item.title}</span>
109
+ {/if}
110
+ </li>
111
+ {/each}
112
+ </ul>
113
+ {/each}
114
+ </div>
115
+ {:else}
116
+ <ul class="sd-sidebar-list" data-depth={depth}>
117
+ {#each items as item}
118
+ {@const hasChildren = Boolean(item.children?.length)}
119
+ {@const active = isActive(item)}
120
+ {@const branchActive = isActiveBranch(item)}
121
+ <li class="sd-sidebar-item" class:sd-has-children={hasChildren} class:sd-branch-active={branchActive}>
122
+ {#if hasChildren}
123
+ <details class="sd-sidebar-group" open={shouldOpen(item)}>
124
+ <summary class="sd-sidebar-summary" class:sd-active={active}>
125
+ <span class="sd-sidebar-chevron" aria-hidden="true">
126
+ <svg viewBox="0 0 24 24"><path d="M9 6l6 6-6 6" /></svg>
127
+ </span>
128
+ {#if item.path}
129
+ <a class="sd-sidebar-summary-link" href={item.path} aria-current={active ? 'page' : undefined} on:click={(event) => handleSummaryLinkClick(event, item.path)}>{item.title}</a>
130
+ {:else}
131
+ <span class="sd-sidebar-summary-text">{item.title}</span>
132
+ {/if}
133
+ </summary>
134
+ <div class="sd-sidebar-group-body">
135
+ <svelte:self items={item.children} {currentPath} depth={depth + 1} />
136
+ </div>
137
+ </details>
138
+ {:else if item.path}
139
+ <a class="sd-sidebar-link" class:sd-active={active} href={item.path} aria-current={active ? 'page' : undefined}>
140
+ <span>{item.title}</span>
141
+ </a>
142
+ {:else}
143
+ <span class="sd-sidebar-section-label">{item.title}</span>
144
+ {/if}
145
+ </li>
146
+ {/each}
147
+ </ul>
148
+ {/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;AAyJxD,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,17 @@
1
+ <script lang="ts">
2
+ import { linkRel, resolveLocalizedNavItem } from './headless.js';
3
+ import type { SvedocsThemeContext } from './types.js';
4
+
5
+ export let context: SvedocsThemeContext;
6
+ </script>
7
+
8
+ {#if context.config.theme.social.length > 0}
9
+ <nav class="sd-socialnav" aria-label={context.t('nav.social')} data-theme-component="social-nav">
10
+ {#each context.config.theme.social as item}
11
+ {@const localized = resolveLocalizedNavItem(item, context)}
12
+ <a href={localized.href} rel={linkRel(localized)} target={localized.external ? '_blank' : undefined}>
13
+ {localized.label}
14
+ </a>
15
+ {/each}
16
+ </nav>
17
+ {/if}
@@ -0,0 +1,22 @@
1
+ import type { SvedocsThemeContext } from './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 SocialNav: $$__sveltets_2_IsomorphicComponent<{
16
+ context: SvedocsThemeContext;
17
+ }, {
18
+ [evt: string]: CustomEvent<any>;
19
+ }, {}, {}, string>;
20
+ type SocialNav = InstanceType<typeof SocialNav>;
21
+ export default SocialNav;
22
+ //# sourceMappingURL=SocialNav.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SocialNav.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/SocialNav.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAsBtD,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,SAAS;aAViC,mBAAmB;;;kBAU2B,CAAC;AAC7E,KAAK,SAAS,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,eAAe,SAAS,CAAC"}
@@ -0,0 +1,73 @@
1
+ <script lang="ts">
2
+ import { onDestroy, onMount } from 'svelte';
3
+ import type { SvedocsPage } from '../core/types.js';
4
+ import { createTocController, fallbackTranslate } from './headless.js';
5
+ import type { SvedocsThemeContext, SvedocsTocController } from './types.js';
6
+
7
+ export let page: SvedocsPage;
8
+ export let controller: SvedocsTocController | undefined = undefined;
9
+ export let context: SvedocsThemeContext | undefined = undefined;
10
+
11
+ const internalController = createTocController({ page });
12
+ let activeController: SvedocsTocController = internalController;
13
+ let tocEl: HTMLElement | null = null;
14
+ let activeHeading = page.headings[0]?.id ?? '';
15
+ let indicatorTop = 0;
16
+ let indicatorHeight = 0;
17
+ let indicatorReady = false;
18
+ let boundController: SvedocsTocController | undefined;
19
+ let unsubscribeController: (() => void) | undefined;
20
+
21
+ $: activeController = controller ?? internalController;
22
+ $: t = context?.t ?? fallbackTranslate;
23
+ $: activeController.setPage(page);
24
+ $: activeController.setContainer(tocEl);
25
+ $: bindController(activeController);
26
+
27
+ onMount(() => {
28
+ if (controller) return;
29
+ return internalController.mount();
30
+ });
31
+
32
+ onDestroy(() => {
33
+ unsubscribeController?.();
34
+ });
35
+
36
+ function bindController(nextController: SvedocsTocController): void {
37
+ if (boundController === nextController) return;
38
+ unsubscribeController?.();
39
+ boundController = nextController;
40
+ const unsubscribers = [
41
+ nextController.activeHeading.subscribe((value) => (activeHeading = value)),
42
+ nextController.indicatorTop.subscribe((value) => (indicatorTop = value)),
43
+ nextController.indicatorHeight.subscribe((value) => (indicatorHeight = value)),
44
+ nextController.indicatorReady.subscribe((value) => (indicatorReady = value))
45
+ ];
46
+ unsubscribeController = () => {
47
+ for (const unsubscribe of unsubscribers) unsubscribe();
48
+ };
49
+ }
50
+ </script>
51
+
52
+ <aside
53
+ bind:this={tocEl}
54
+ class="sd-toc"
55
+ class:sd-toc-ready={indicatorReady}
56
+ aria-label={t('toc.label')}
57
+ style={`--toc-indicator-top:${indicatorTop}px;--toc-indicator-height:${indicatorHeight}px;`}
58
+ data-theme-component="toc"
59
+ >
60
+ {#if page.headings.length > 0}
61
+ <div class="sd-toc-title">{t('toc.label')}</div>
62
+ {#each page.headings as heading}
63
+ <a
64
+ class:sd-active={heading.id === activeHeading}
65
+ class="sd-toc-link sd-depth-{heading.depth}"
66
+ href={'#' + heading.id}
67
+ on:click={() => activeController.activate(heading.id)}
68
+ >
69
+ {heading.text}
70
+ </a>
71
+ {/each}
72
+ {/if}
73
+ </aside>
@@ -0,0 +1,25 @@
1
+ import type { SvedocsPage } from '../core/types.js';
2
+ import type { SvedocsThemeContext, SvedocsTocController } from './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 TableOfContents: $$__sveltets_2_IsomorphicComponent<{
17
+ page: SvedocsPage;
18
+ controller?: SvedocsTocController | undefined;
19
+ context?: SvedocsThemeContext | undefined;
20
+ }, {
21
+ [evt: string]: CustomEvent<any>;
22
+ }, {}, {}, string>;
23
+ type TableOfContents = InstanceType<typeof TableOfContents>;
24
+ export default TableOfContents;
25
+ //# sourceMappingURL=TableOfContents.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/TableOfContents.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAkE5E,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,eAAe;UAV8D,WAAW;iBAAe,oBAAoB,GAAG,SAAS;cAAY,mBAAmB,GAAG,SAAS;;;kBAUpF,CAAC;AACnF,KAAK,eAAe,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,eAAe,eAAe,CAAC"}