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,171 @@
1
+ import { escapeAttribute, escapeHtml } from './utils.js';
2
+ export function createDiffRows(raw) {
3
+ let oldLine = 0;
4
+ let newLine = 0;
5
+ return raw.replace(/\r?\n$/, '').split(/\r?\n/).map((line) => {
6
+ const hunk = /^@@\s+-(\d+)(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@/.exec(line);
7
+ if (hunk) {
8
+ oldLine = Number(hunk[1]) - 1;
9
+ newLine = Number(hunk[2]) - 1;
10
+ return {
11
+ kind: 'meta',
12
+ content: line
13
+ };
14
+ }
15
+ if (line.startsWith('+++') || line.startsWith('---')) {
16
+ return {
17
+ kind: 'meta',
18
+ content: line
19
+ };
20
+ }
21
+ if (line.startsWith('+')) {
22
+ newLine += 1;
23
+ return {
24
+ kind: 'add',
25
+ newLine,
26
+ content: line.slice(1)
27
+ };
28
+ }
29
+ if (line.startsWith('-')) {
30
+ oldLine += 1;
31
+ return {
32
+ kind: 'remove',
33
+ oldLine,
34
+ content: line.slice(1)
35
+ };
36
+ }
37
+ oldLine += 1;
38
+ newLine += 1;
39
+ return {
40
+ kind: 'context',
41
+ oldLine,
42
+ newLine,
43
+ content: line.startsWith(' ') ? line.slice(1) : line
44
+ };
45
+ });
46
+ }
47
+ export function createDiffSplitRows(rows) {
48
+ const splitRows = [];
49
+ let index = 0;
50
+ while (index < rows.length) {
51
+ const row = rows[index];
52
+ if (!row)
53
+ break;
54
+ if (row.kind === 'meta') {
55
+ splitRows.push({ kind: 'meta', content: row.content });
56
+ index += 1;
57
+ continue;
58
+ }
59
+ if (row.kind === 'context') {
60
+ splitRows.push({ kind: 'context', old: row, new: row });
61
+ index += 1;
62
+ continue;
63
+ }
64
+ if (row.kind === 'remove') {
65
+ const oldRows = [];
66
+ const newRows = [];
67
+ while (rows[index]?.kind === 'remove') {
68
+ oldRows.push(rows[index]);
69
+ index += 1;
70
+ }
71
+ while (rows[index]?.kind === 'add') {
72
+ newRows.push(rows[index]);
73
+ index += 1;
74
+ }
75
+ pushPairedChangeRows(splitRows, oldRows, newRows);
76
+ continue;
77
+ }
78
+ const newRows = [];
79
+ while (rows[index]?.kind === 'add') {
80
+ newRows.push(rows[index]);
81
+ index += 1;
82
+ }
83
+ pushPairedChangeRows(splitRows, [], newRows);
84
+ }
85
+ return splitRows;
86
+ }
87
+ export function renderSplitDiffHtml(block, options = {}) {
88
+ const title = block.title ?? options.messages?.['diff.label'] ?? 'Diff';
89
+ const rows = block.splitRows.length > 0 ? block.splitRows : createDiffSplitRows(block.diffRows);
90
+ const counts = [
91
+ block.addedLines > 0 ? `+${block.addedLines}` : '',
92
+ block.removedLines > 0 ? `-${block.removedLines}` : ''
93
+ ].filter(Boolean).join(' ');
94
+ return `<div class="sd-diff sd-diff-split sd-code" data-language="${escapeAttribute(block.language)}"${block.title ? ` data-title="${escapeAttribute(block.title)}"` : ''} data-diff="true" data-diff-mode="split"${block.addedLines > 0 ? ` data-added-lines="${block.addedLines}"` : ''}${block.removedLines > 0 ? ` data-removed-lines="${block.removedLines}"` : ''} data-copy="${escapeAttribute(block.raw)}">
95
+ ${renderDiffHeader(title, counts, { copyButton: options.copyButton !== false, messages: options.messages })}
96
+ <div class="sd-diff-panes" role="table" aria-label="${escapeAttribute(formatMessage(options.messages?.['diff.aria'] ?? '{title} diff', { title }))}">
97
+ ${renderPane(rows, 'old', options.messages?.['diff.before'] ?? 'Before')}
98
+ ${renderPane(rows, 'new', options.messages?.['diff.after'] ?? 'After')}
99
+ </div>
100
+ </div>`;
101
+ }
102
+ function pushPairedChangeRows(target, oldRows, newRows) {
103
+ const length = Math.max(oldRows.length, newRows.length);
104
+ for (let index = 0; index < length; index += 1) {
105
+ target.push({
106
+ kind: 'change',
107
+ ...(oldRows[index] ? { old: oldRows[index] } : {}),
108
+ ...(newRows[index] ? { new: newRows[index] } : {})
109
+ });
110
+ }
111
+ }
112
+ function renderDiffHeader(title, counts, options) {
113
+ const stats = counts
114
+ ? `<span class="sd-code-stats">${counts.split(' ').map(renderDiffStat).join('')}</span>`
115
+ : '';
116
+ const copyLabel = options.messages?.['code.copyDiff'] ?? 'Copy diff';
117
+ const diffLabel = options.messages?.['diff.label'] ?? 'Diff';
118
+ const copyButton = options.copyButton
119
+ ? `<button type="button" class="sd-code-copy" data-sd-copy="" aria-label="${escapeAttribute(copyLabel)}" title="${escapeAttribute(copyLabel)}"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9 5h9v14H9zM6 8v12h10"/></svg></button>`
120
+ : '';
121
+ return `<div class="sd-code-header">
122
+ <span class="sd-code-language" data-language="diff">${escapeHtml(diffLabel)}</span>
123
+ <span class="sd-code-title">${escapeHtml(title)}</span>
124
+ ${stats}
125
+ ${copyButton}
126
+ </div>`;
127
+ }
128
+ function formatMessage(message, values) {
129
+ return message.replace(/\{([A-Za-z0-9_.-]+)\}/g, (match, key) => {
130
+ const value = values[key];
131
+ return value === undefined ? match : String(value);
132
+ });
133
+ }
134
+ function renderDiffStat(count) {
135
+ const className = count.startsWith('+') ? 'sd-code-stat-add' : 'sd-code-stat-remove';
136
+ return `<span class="${className}">${escapeHtml(count)}</span>`;
137
+ }
138
+ function renderPane(rows, side, label) {
139
+ return `<section class="sd-diff-pane" data-side="${side}" role="rowgroup" aria-label="${escapeAttribute(label)}">
140
+ <div class="sd-diff-column-label" role="columnheader" data-side="${side}">${escapeHtml(label)}</div>
141
+ <div class="sd-diff-scroll" role="presentation" tabindex="0">
142
+ <div class="sd-diff-lines">
143
+ ${rows.map((row) => renderPaneRow(row, side)).join('')}
144
+ </div>
145
+ </div>
146
+ </section>`;
147
+ }
148
+ function renderPaneRow(row, side) {
149
+ if (row.kind === 'meta') {
150
+ return `<div class="sd-diff-row sd-diff-meta" role="row">
151
+ <div class="sd-diff-cell sd-diff-meta-cell" role="cell" data-side="${side}">
152
+ <span class="sd-diff-line-no" aria-hidden="true"></span>
153
+ <span class="sd-diff-code">${escapeHtml(row.content ?? '')}</span>
154
+ </div>
155
+ </div>`;
156
+ }
157
+ return `<div class="sd-diff-row ${row.kind === 'change' ? 'sd-diff-change' : 'sd-diff-context'}" role="row">
158
+ ${renderSideCell(side === 'old' ? row.old : row.new, side)}
159
+ </div>`;
160
+ }
161
+ function renderSideCell(row, side) {
162
+ if (!row) {
163
+ return `<div class="sd-diff-cell sd-diff-empty" role="cell" data-side="${side}" aria-hidden="true"></div>`;
164
+ }
165
+ const line = side === 'old' ? row.oldLine : row.newLine;
166
+ const kind = row.kind === 'remove' ? 'remove' : row.kind === 'add' ? 'add' : 'context';
167
+ return `<div class="sd-diff-cell sd-diff-${kind}" role="cell" data-side="${side}" data-line="${line ?? ''}">
168
+ <span class="sd-diff-line-no">${line ?? ''}</span>
169
+ <span class="sd-diff-code">${escapeHtml(row.content)}</span>
170
+ </div>`;
171
+ }
@@ -0,0 +1,4 @@
1
+ export declare function rehypeSvedocsHeadingAnchors(options?: {
2
+ label?: string;
3
+ }): (tree: unknown) => void;
4
+ //# sourceMappingURL=headings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings.d.ts","sourceRoot":"","sources":["../../src/mdx/headings.ts"],"names":[],"mappings":"AAEA,wBAAgB,2BAA2B,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,IAElE,MAAM,OAAO,UAoCtB"}
@@ -0,0 +1,42 @@
1
+ import { visit } from 'unist-util-visit';
2
+ export function rehypeSvedocsHeadingAnchors(options = {}) {
3
+ const label = options.label ?? 'Link to this section';
4
+ return (tree) => {
5
+ visit(tree, 'element', (node) => {
6
+ if (!['h2', 'h3', 'h4'].includes(node.tagName))
7
+ return;
8
+ const id = typeof node.properties?.id === 'string' ? node.properties.id : '';
9
+ if (!id)
10
+ return;
11
+ node.children = [
12
+ ...(node.children ?? []),
13
+ {
14
+ type: 'element',
15
+ tagName: 'a',
16
+ properties: {
17
+ className: ['sd-heading-anchor'],
18
+ href: `#${id}`,
19
+ ariaLabel: label
20
+ },
21
+ children: [{
22
+ type: 'element',
23
+ tagName: 'svg',
24
+ properties: {
25
+ ariaHidden: 'true',
26
+ viewBox: '0 0 24 24',
27
+ fill: 'none',
28
+ stroke: 'currentColor',
29
+ strokeWidth: 2,
30
+ strokeLinecap: 'round',
31
+ strokeLinejoin: 'round'
32
+ },
33
+ children: [
34
+ { type: 'element', tagName: 'path', properties: { d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71' }, children: [] },
35
+ { type: 'element', tagName: 'path', properties: { d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71' }, children: [] }
36
+ ]
37
+ }]
38
+ }
39
+ ];
40
+ });
41
+ };
42
+ }
@@ -0,0 +1,4 @@
1
+ export declare function rehypeSvedocsLinks(options?: {
2
+ resolveHref?: (href: string) => string;
3
+ }): (tree: unknown) => void;
4
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/mdx/links.ts"],"names":[],"mappings":"AAuBA,wBAAgB,kBAAkB,CAAC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,IACjF,MAAM,OAAO,UAiEtB"}
@@ -0,0 +1,144 @@
1
+ import { visit } from 'unist-util-visit';
2
+ import { mergeClassNames } from './utils.js';
3
+ const externalLinkIcon = {
4
+ type: 'element',
5
+ tagName: 'svg',
6
+ properties: {
7
+ className: ['sd-external-link-icon'],
8
+ viewBox: '0 0 24 24',
9
+ ariaHidden: 'true',
10
+ fill: 'none',
11
+ stroke: 'currentColor',
12
+ strokeWidth: 1.8,
13
+ strokeLinecap: 'round',
14
+ strokeLinejoin: 'round'
15
+ },
16
+ children: [
17
+ { type: 'element', tagName: 'path', properties: { d: 'M7 17L17 7' }, children: [] },
18
+ { type: 'element', tagName: 'path', properties: { d: 'M9 7h8v8' }, children: [] },
19
+ { type: 'element', tagName: 'path', properties: { d: 'M13 17H7V7' }, children: [] }
20
+ ]
21
+ };
22
+ export function rehypeSvedocsLinks(options = {}) {
23
+ return (tree) => {
24
+ visit(tree, 'element', (node, index, parent) => {
25
+ if (node.tagName !== 'a')
26
+ return;
27
+ const originalHref = typeof node.properties?.href === 'string' ? node.properties.href : '';
28
+ const href = originalHref ? options.resolveHref?.(originalHref) ?? originalHref : '';
29
+ if (!href)
30
+ return;
31
+ if (href !== originalHref)
32
+ node.properties.href = href;
33
+ if (isInternalHref(href) && shouldRenderAsLinkCard(node, parent)) {
34
+ const label = nodeToText(node).trim() || href;
35
+ const description = parseCardDescription(node.properties?.title);
36
+ const { title: _title, ...properties } = node.properties ?? {};
37
+ node.properties = {
38
+ ...properties,
39
+ className: mergeClassNames(properties.className, 'sd-link-card')
40
+ };
41
+ node.children = [
42
+ {
43
+ type: 'element',
44
+ tagName: 'span',
45
+ properties: { className: ['sd-link-card-content'] },
46
+ children: [
47
+ {
48
+ type: 'element',
49
+ tagName: 'span',
50
+ properties: { className: ['sd-link-card-title'] },
51
+ children: node.children ?? [{ type: 'text', value: label }]
52
+ },
53
+ ...(description
54
+ ? [{
55
+ type: 'element',
56
+ tagName: 'span',
57
+ properties: { className: ['sd-link-card-description'] },
58
+ children: [{ type: 'text', value: description }]
59
+ }]
60
+ : [])
61
+ ]
62
+ },
63
+ {
64
+ type: 'element',
65
+ tagName: 'span',
66
+ properties: { className: ['sd-link-card-arrow'], ariaHidden: 'true' },
67
+ children: [{ type: 'text', value: '→' }]
68
+ }
69
+ ];
70
+ if (parent?.tagName === 'p' && typeof index === 'number') {
71
+ parent.properties = {
72
+ ...parent.properties,
73
+ className: mergeClassNames(parent.properties?.className, 'sd-link-card-row')
74
+ };
75
+ }
76
+ return;
77
+ }
78
+ if (isExternalWebHref(href) && !hasClass(node, 'sd-no-external-icon')) {
79
+ const target = typeof node.properties?.target === 'string' ? node.properties.target : undefined;
80
+ node.properties = {
81
+ ...node.properties,
82
+ className: mergeClassNames(node.properties?.className, 'sd-external-link'),
83
+ ...(target === '_blank' ? { rel: mergeRel(node.properties?.rel) } : {})
84
+ };
85
+ node.children = [...(node.children ?? []), cloneExternalLinkIcon()];
86
+ }
87
+ });
88
+ };
89
+ }
90
+ function isExternalHref(href) {
91
+ return /^(https?:)?\/\//.test(href) || /^[a-z][a-z0-9+.-]*:/i.test(href);
92
+ }
93
+ function isInternalHref(href) {
94
+ return !href.startsWith('#') && !isExternalHref(href) && !href.startsWith('mailto:') && !href.startsWith('tel:');
95
+ }
96
+ function isExternalWebHref(href) {
97
+ return /^(https?:)?\/\//.test(href);
98
+ }
99
+ function shouldRenderAsLinkCard(node, parent) {
100
+ const title = typeof node.properties?.title === 'string' ? node.properties.title.trim() : '';
101
+ if (!/^card(?::|\s|$)/i.test(title))
102
+ return false;
103
+ if (!parent || parent.tagName !== 'p')
104
+ return true;
105
+ return (parent.children ?? []).filter((child) => isMeaningfulNode(child)).length === 1;
106
+ }
107
+ function parseCardDescription(title) {
108
+ if (typeof title !== 'string')
109
+ return undefined;
110
+ const match = /^card(?::\s*(.*)|\s+(.*))?$/i.exec(title.trim());
111
+ const description = (match?.[1] ?? match?.[2] ?? '').trim();
112
+ return description || undefined;
113
+ }
114
+ function mergeRel(value) {
115
+ const rel = new Set((Array.isArray(value) ? value.join(' ') : typeof value === 'string' ? value : '')
116
+ .split(/\s+/)
117
+ .filter(Boolean));
118
+ rel.add('noreferrer');
119
+ rel.add('noopener');
120
+ return [...rel].join(' ');
121
+ }
122
+ function hasClass(node, className) {
123
+ const classes = node.properties?.className;
124
+ return Array.isArray(classes)
125
+ ? classes.includes(className)
126
+ : typeof classes === 'string'
127
+ ? classes.split(/\s+/).includes(className)
128
+ : false;
129
+ }
130
+ function cloneExternalLinkIcon() {
131
+ return JSON.parse(JSON.stringify(externalLinkIcon));
132
+ }
133
+ function isMeaningfulNode(node) {
134
+ if (node.type === 'text')
135
+ return Boolean(node.value?.trim());
136
+ return node.type !== 'text';
137
+ }
138
+ function nodeToText(node) {
139
+ if (!node)
140
+ return '';
141
+ if (typeof node.value === 'string')
142
+ return node.value;
143
+ return (node.children ?? []).map(nodeToText).join('');
144
+ }
@@ -0,0 +1,10 @@
1
+ export declare function markdownToPlainText(markdown: string): string;
2
+ export declare function stripInlineMarkdown(value: string): string;
3
+ export declare function parseLineSet(value: string | undefined): number[];
4
+ export declare function readQuotedMeta(meta: string, key: string): string | undefined;
5
+ export declare function mergeHtmlClass(attrs: string, className: string): string;
6
+ export declare function mergeClassNames(value: unknown, className: string): string[];
7
+ export declare function normalizeShikiLanguage(language: string): string;
8
+ export declare function escapeHtml(value: string): string;
9
+ export declare function escapeAttribute(value: string): string;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/mdx/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAahE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAG3E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,64 @@
1
+ export function markdownToPlainText(markdown) {
2
+ return markdown
3
+ .replace(/```[\s\S]*?```/g, ' ')
4
+ .replace(/`([^`]+)`/g, '$1')
5
+ .replace(/<[^>]+>/g, ' ')
6
+ .replace(/!\[[^\]]*\]\([^)]+\)/g, ' ')
7
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
8
+ .replace(/[#>*_\-|~]/g, ' ')
9
+ .replace(/\s+/g, ' ')
10
+ .trim();
11
+ }
12
+ export function stripInlineMarkdown(value) {
13
+ return value
14
+ .replace(/`([^`]+)`/g, '$1')
15
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
16
+ .replace(/[*_~]/g, '')
17
+ .trim();
18
+ }
19
+ export function parseLineSet(value) {
20
+ if (!value)
21
+ return [];
22
+ const lines = new Set();
23
+ for (const part of value.split(',')) {
24
+ const [startRaw, endRaw] = part.trim().split('-');
25
+ const start = Number(startRaw);
26
+ const end = Number(endRaw ?? startRaw);
27
+ if (!Number.isInteger(start) || !Number.isInteger(end))
28
+ continue;
29
+ for (let line = Math.min(start, end); line <= Math.max(start, end); line += 1) {
30
+ if (line > 0)
31
+ lines.add(line);
32
+ }
33
+ }
34
+ return [...lines].sort((a, b) => a - b);
35
+ }
36
+ export function readQuotedMeta(meta, key) {
37
+ const match = new RegExp(`${key}=("[^"]+"|'[^']+'|[^\\s]+)`).exec(meta);
38
+ return match?.[1]?.replace(/^["']|["']$/g, '');
39
+ }
40
+ export function mergeHtmlClass(attrs, className) {
41
+ const match = /class="([^"]*)"/.exec(attrs);
42
+ const classes = new Set([...(match?.[1]?.split(/\s+/).filter(Boolean) ?? []), className]);
43
+ return [...classes].join(' ');
44
+ }
45
+ export function mergeClassNames(value, className) {
46
+ const classes = Array.isArray(value) ? value.map(String) : typeof value === 'string' ? value.split(/\s+/) : [];
47
+ return [...new Set([...classes, className])];
48
+ }
49
+ export function normalizeShikiLanguage(language) {
50
+ if (language === 'txt')
51
+ return 'text';
52
+ if (language === 'sh' || language === 'shell')
53
+ return 'bash';
54
+ return language || 'text';
55
+ }
56
+ export function escapeHtml(value) {
57
+ return value
58
+ .replace(/&/g, '&amp;')
59
+ .replace(/</g, '&lt;')
60
+ .replace(/>/g, '&gt;');
61
+ }
62
+ export function escapeAttribute(value) {
63
+ return escapeHtml(value).replace(/"/g, '&quot;');
64
+ }
@@ -0,0 +1,25 @@
1
+ import type { SvedocsPage, SvedocsResolvedConfig } from '../core.js';
2
+ import type { OgImageInput, OgImageOptions, OgRenderer, OgRenderOptions, OgTemplate, OgTemplateNode } from './types.js';
3
+ export declare const defaultOgTemplate: {
4
+ readonly name: "default";
5
+ readonly render: typeof createDefaultOgTemplateNode;
6
+ };
7
+ export declare function createPageOgImagePath(page: SvedocsPage, format?: 'svg' | 'png'): string;
8
+ export declare function createConfiguredOgImageFormat(config: SvedocsResolvedConfig): 'svg' | 'png';
9
+ export declare function createConfiguredOgImageRenderer(config: SvedocsResolvedConfig): OgRenderer;
10
+ export declare function createConfiguredOgImageTemplate(config: SvedocsResolvedConfig): OgTemplate | undefined;
11
+ export declare function isOgImageEnabled(config: SvedocsResolvedConfig): boolean;
12
+ export declare function createPageOgImageEntries(pages: SvedocsPage[], format?: 'svg' | 'png'): Array<{
13
+ path: string;
14
+ }>;
15
+ export declare function createConfiguredPageOgImageEntries(config: SvedocsResolvedConfig, pages: SvedocsPage[]): Array<{
16
+ path: string;
17
+ }>;
18
+ export declare function createPageOgImageResponse(config: SvedocsResolvedConfig, page: SvedocsPage, options?: OgImageOptions): Promise<Response>;
19
+ export declare function createOgImageInput(config: SvedocsResolvedConfig, page: SvedocsPage): OgImageInput;
20
+ export declare function createOgSvg(input: OgImageInput): string;
21
+ export declare function createDefaultOgTemplateNode(input: OgImageInput): OgTemplateNode;
22
+ export declare function createSatoriOgSvg(input: OgImageInput, options: OgRenderOptions): Promise<string>;
23
+ export declare function createOgImage(input: OgImageInput, options?: OgImageOptions): Promise<string | Uint8Array>;
24
+ export declare function createOgPng(input: OgImageInput, options?: OgRenderOptions): Promise<Uint8Array>;
25
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/og/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,GAAE,KAAK,GAAG,KAAa,GAAG,MAAM,CAG9F;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,GAAG,KAAK,GAAG,KAAK,CAE1F;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,CAEzF;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,GAAG,SAAS,CAIrG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAEvE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,GAAE,KAAK,GAAG,KAAa,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrH;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAG/H;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,WAAW,GAAG,YAAY,CAMjG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAYvD;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CA2D/E;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAYtG;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC,CAEnH;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CASzG"}