sdocs 0.0.3 → 0.0.4

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 (194) hide show
  1. package/bin/sdocs.js +1 -1
  2. package/dist/app-gen.d.ts +10 -0
  3. package/dist/app-gen.js +147 -0
  4. package/dist/cli.js +71 -0
  5. package/dist/client/App.svelte +151 -0
  6. package/dist/client/App.svelte.d.ts +14 -0
  7. package/dist/client/CollapsiblePanel.svelte +63 -0
  8. package/dist/client/CollapsiblePanel.svelte.d.ts +9 -0
  9. package/dist/client/ComponentView.svelte +321 -0
  10. package/dist/client/ComponentView.svelte.d.ts +10 -0
  11. package/dist/client/ControlsPanel.svelte +191 -0
  12. package/dist/client/ControlsPanel.svelte.d.ts +13 -0
  13. package/dist/client/DataTable.svelte +78 -0
  14. package/dist/client/DataTable.svelte.d.ts +11 -0
  15. package/dist/client/HomePage.svelte +92 -0
  16. package/dist/client/HomePage.svelte.d.ts +8 -0
  17. package/dist/client/LayoutView.svelte +27 -0
  18. package/dist/client/LayoutView.svelte.d.ts +8 -0
  19. package/dist/client/PageView.svelte +130 -0
  20. package/dist/client/PageView.svelte.d.ts +8 -0
  21. package/dist/client/PreviewFrame.svelte +100 -0
  22. package/dist/client/PreviewFrame.svelte.d.ts +10 -0
  23. package/dist/client/Sidebar.svelte +329 -0
  24. package/dist/client/Sidebar.svelte.d.ts +16 -0
  25. package/dist/client/controls/CheckboxControl.svelte +37 -0
  26. package/dist/client/controls/CheckboxControl.svelte.d.ts +8 -0
  27. package/dist/client/controls/ColorControl.svelte +47 -0
  28. package/dist/client/controls/ColorControl.svelte.d.ts +8 -0
  29. package/dist/client/controls/DimensionControl.svelte +56 -0
  30. package/dist/client/controls/DimensionControl.svelte.d.ts +8 -0
  31. package/dist/client/controls/NumberControl.svelte +44 -0
  32. package/dist/client/controls/NumberControl.svelte.d.ts +8 -0
  33. package/dist/client/controls/SelectControl.svelte +48 -0
  34. package/dist/client/controls/SelectControl.svelte.d.ts +9 -0
  35. package/dist/client/controls/TextControl.svelte +43 -0
  36. package/dist/client/controls/TextControl.svelte.d.ts +8 -0
  37. package/dist/client/router.svelte.d.ts +11 -0
  38. package/dist/client/router.svelte.js +45 -0
  39. package/dist/client/theme.css +34 -0
  40. package/dist/client/tree-builder.d.ts +30 -0
  41. package/dist/client/tree-builder.js +162 -0
  42. package/dist/commands/build.d.ts +1 -0
  43. package/dist/commands/build.js +38 -0
  44. package/dist/commands/dev.d.ts +1 -0
  45. package/dist/commands/dev.js +40 -0
  46. package/dist/commands/init.d.ts +1 -0
  47. package/dist/commands/init.js +41 -0
  48. package/dist/commands/preview.d.ts +1 -0
  49. package/dist/commands/preview.js +25 -0
  50. package/dist/config.d.ts +7 -0
  51. package/dist/config.js +57 -0
  52. package/dist/index.d.ts +2 -2
  53. package/dist/index.js +1 -4
  54. package/dist/server/discovery.d.ts +6 -0
  55. package/dist/server/discovery.js +24 -0
  56. package/dist/server/highlighter.d.ts +4 -0
  57. package/dist/server/highlighter.js +31 -0
  58. package/dist/server/meta-parser.d.ts +11 -0
  59. package/dist/server/meta-parser.js +107 -0
  60. package/dist/server/prop-parser.d.ts +5 -0
  61. package/dist/server/prop-parser.js +275 -0
  62. package/dist/server/sdocx-parser.d.ts +11 -0
  63. package/dist/server/sdocx-parser.js +197 -0
  64. package/dist/server/snippet-compiler.d.ts +27 -0
  65. package/dist/server/snippet-compiler.js +145 -0
  66. package/dist/server/snippet-extractor.d.ts +11 -0
  67. package/dist/server/snippet-extractor.js +37 -0
  68. package/dist/server/toc-extractor.d.ts +5 -0
  69. package/dist/server/toc-extractor.js +37 -0
  70. package/dist/types.d.ts +100 -148
  71. package/dist/vite.d.ts +5 -2
  72. package/dist/vite.js +266 -2
  73. package/package.json +50 -74
  74. package/README.md +0 -43
  75. package/dist/Sdocs.svelte +0 -1210
  76. package/dist/Sdocs.svelte.d.ts +0 -5
  77. package/dist/cli/app-plugin.d.ts +0 -7
  78. package/dist/cli/app-plugin.js +0 -69
  79. package/dist/cli/config.d.ts +0 -12
  80. package/dist/cli/config.js +0 -34
  81. package/dist/cli/index.js +0 -72
  82. package/dist/cli/server.d.ts +0 -2
  83. package/dist/cli/server.js +0 -64
  84. package/dist/docgen.d.ts +0 -47
  85. package/dist/docgen.js +0 -463
  86. package/dist/internal/ComponentPreview.svelte +0 -58
  87. package/dist/internal/ComponentPreview.svelte.d.ts +0 -17
  88. package/dist/internal/CssPropsTable.svelte +0 -239
  89. package/dist/internal/CssPropsTable.svelte.d.ts +0 -11
  90. package/dist/internal/Home.svelte +0 -92
  91. package/dist/internal/Home.svelte.d.ts +0 -9
  92. package/dist/internal/MethodsTable.svelte +0 -72
  93. package/dist/internal/MethodsTable.svelte.d.ts +0 -7
  94. package/dist/internal/PropsTable.svelte +0 -342
  95. package/dist/internal/PropsTable.svelte.d.ts +0 -12
  96. package/dist/internal/Showcase.svelte +0 -130
  97. package/dist/internal/Showcase.svelte.d.ts +0 -21
  98. package/dist/ui/Badge/Badge.docs.svelte +0 -46
  99. package/dist/ui/Badge/Badge.docs.svelte.d.ts +0 -26
  100. package/dist/ui/Badge/Badge.svelte +0 -59
  101. package/dist/ui/Badge/Badge.svelte.d.ts +0 -17
  102. package/dist/ui/Badge/index.d.ts +0 -1
  103. package/dist/ui/Badge/index.js +0 -1
  104. package/dist/ui/Checkbox/Checkbox.docs.svelte +0 -51
  105. package/dist/ui/Checkbox/Checkbox.docs.svelte.d.ts +0 -27
  106. package/dist/ui/Checkbox/Checkbox.svelte +0 -169
  107. package/dist/ui/Checkbox/Checkbox.svelte.d.ts +0 -18
  108. package/dist/ui/Checkbox/index.d.ts +0 -1
  109. package/dist/ui/Checkbox/index.js +0 -1
  110. package/dist/ui/CodeBlock/CodeBlock.docs.svelte +0 -28
  111. package/dist/ui/CodeBlock/CodeBlock.docs.svelte.d.ts +0 -24
  112. package/dist/ui/CodeBlock/CodeBlock.svelte +0 -101
  113. package/dist/ui/CodeBlock/CodeBlock.svelte.d.ts +0 -7
  114. package/dist/ui/CodeBlock/index.d.ts +0 -1
  115. package/dist/ui/CodeBlock/index.js +0 -1
  116. package/dist/ui/Frame/Frame.docs.svelte +0 -140
  117. package/dist/ui/Frame/Frame.docs.svelte.d.ts +0 -26
  118. package/dist/ui/Frame/Frame.svelte +0 -88
  119. package/dist/ui/Frame/Frame.svelte.d.ts +0 -15
  120. package/dist/ui/Frame/index.d.ts +0 -1
  121. package/dist/ui/Frame/index.js +0 -1
  122. package/dist/ui/InputNumber/InputNumber.docs.svelte +0 -50
  123. package/dist/ui/InputNumber/InputNumber.docs.svelte.d.ts +0 -26
  124. package/dist/ui/InputNumber/InputNumber.svelte +0 -275
  125. package/dist/ui/InputNumber/InputNumber.svelte.d.ts +0 -26
  126. package/dist/ui/InputNumber/index.d.ts +0 -1
  127. package/dist/ui/InputNumber/index.js +0 -1
  128. package/dist/ui/InputText/InputText.docs.svelte +0 -43
  129. package/dist/ui/InputText/InputText.docs.svelte.d.ts +0 -26
  130. package/dist/ui/InputText/InputText.svelte +0 -116
  131. package/dist/ui/InputText/InputText.svelte.d.ts +0 -22
  132. package/dist/ui/InputText/index.d.ts +0 -1
  133. package/dist/ui/InputText/index.js +0 -1
  134. package/dist/ui/Panel/CollapsiblePanel.docs.svelte +0 -45
  135. package/dist/ui/Panel/CollapsiblePanel.docs.svelte.d.ts +0 -25
  136. package/dist/ui/Panel/CollapsiblePanel.svelte +0 -93
  137. package/dist/ui/Panel/CollapsiblePanel.svelte.d.ts +0 -14
  138. package/dist/ui/Panel/index.d.ts +0 -1
  139. package/dist/ui/Panel/index.js +0 -1
  140. package/dist/ui/Placeholder/Placeholder.docs.svelte +0 -49
  141. package/dist/ui/Placeholder/Placeholder.docs.svelte.d.ts +0 -26
  142. package/dist/ui/Placeholder/Placeholder.svelte +0 -99
  143. package/dist/ui/Placeholder/Placeholder.svelte.d.ts +0 -21
  144. package/dist/ui/Placeholder/index.d.ts +0 -1
  145. package/dist/ui/Placeholder/index.js +0 -1
  146. package/dist/ui/Radio/Radio.docs.svelte +0 -67
  147. package/dist/ui/Radio/Radio.docs.svelte.d.ts +0 -27
  148. package/dist/ui/Radio/Radio.svelte +0 -165
  149. package/dist/ui/Radio/Radio.svelte.d.ts +0 -22
  150. package/dist/ui/Radio/RadioGroup.docs.svelte +0 -70
  151. package/dist/ui/Radio/RadioGroup.docs.svelte.d.ts +0 -27
  152. package/dist/ui/Radio/RadioGroup.svelte +0 -98
  153. package/dist/ui/Radio/RadioGroup.svelte.d.ts +0 -27
  154. package/dist/ui/Radio/index.d.ts +0 -2
  155. package/dist/ui/Radio/index.js +0 -2
  156. package/dist/ui/SegmentControl/SegmentControl.docs.svelte +0 -54
  157. package/dist/ui/SegmentControl/SegmentControl.docs.svelte.d.ts +0 -25
  158. package/dist/ui/SegmentControl/SegmentControl.svelte +0 -120
  159. package/dist/ui/SegmentControl/SegmentControl.svelte.d.ts +0 -18
  160. package/dist/ui/SegmentControl/index.d.ts +0 -1
  161. package/dist/ui/SegmentControl/index.js +0 -1
  162. package/dist/ui/Stack/Stack.docs.svelte +0 -63
  163. package/dist/ui/Stack/Stack.docs.svelte.d.ts +0 -26
  164. package/dist/ui/Stack/Stack.svelte +0 -45
  165. package/dist/ui/Stack/Stack.svelte.d.ts +0 -19
  166. package/dist/ui/Stack/index.d.ts +0 -1
  167. package/dist/ui/Stack/index.js +0 -1
  168. package/dist/ui/Table/Body.svelte +0 -17
  169. package/dist/ui/Table/Body.svelte.d.ts +0 -11
  170. package/dist/ui/Table/Caption.svelte +0 -17
  171. package/dist/ui/Table/Caption.svelte.d.ts +0 -11
  172. package/dist/ui/Table/Cell.svelte +0 -24
  173. package/dist/ui/Table/Cell.svelte.d.ts +0 -15
  174. package/dist/ui/Table/Foot.svelte +0 -17
  175. package/dist/ui/Table/Foot.svelte.d.ts +0 -11
  176. package/dist/ui/Table/Head.svelte +0 -17
  177. package/dist/ui/Table/Head.svelte.d.ts +0 -11
  178. package/dist/ui/Table/Header.svelte +0 -27
  179. package/dist/ui/Table/Header.svelte.d.ts +0 -17
  180. package/dist/ui/Table/Row.svelte +0 -19
  181. package/dist/ui/Table/Row.svelte.d.ts +0 -13
  182. package/dist/ui/Table/Table.docs.svelte +0 -197
  183. package/dist/ui/Table/Table.docs.svelte.d.ts +0 -28
  184. package/dist/ui/Table/Table.svelte +0 -140
  185. package/dist/ui/Table/Table.svelte.d.ts +0 -27
  186. package/dist/ui/Table/index.js +0 -10
  187. package/dist/ui/css/colors.css +0 -377
  188. package/dist/ui/css/global.css +0 -10
  189. package/dist/ui/index.d.ts +0 -12
  190. package/dist/ui/index.js +0 -12
  191. package/dist/virtual-sdocs.d.ts +0 -20
  192. package/dist/vite-plugin.d.ts +0 -18
  193. package/dist/vite-plugin.js +0 -206
  194. /package/dist/{cli/index.d.ts → cli.d.ts} +0 -0
@@ -0,0 +1,329 @@
1
+ <script lang="ts">
2
+ import { SvelteSet } from 'svelte/reactivity';
3
+ import type { TreeNode } from './tree-builder.js';
4
+ import { pathToHash } from './router.svelte.js';
5
+
6
+ type ThemeMode = 'light' | 'dark' | 'system';
7
+
8
+ interface Props {
9
+ tree: TreeNode[];
10
+ currentPath: string[];
11
+ logo: string;
12
+ cssNames?: string[];
13
+ activeStylesheet?: string;
14
+ theme?: ThemeMode;
15
+ onToggleFullscreen?: () => void;
16
+ onStylesheetChange?: (name: string) => void;
17
+ onThemeChange?: (theme: ThemeMode) => void;
18
+ }
19
+
20
+ let { tree, currentPath, logo, cssNames = [], activeStylesheet, theme = 'system', onToggleFullscreen, onStylesheetChange, onThemeChange }: Props = $props();
21
+
22
+ const themeIcons: Record<ThemeMode, string> = { light: '\u2600', dark: '\u263D', system: '\u25D1' };
23
+ const themeLabels: Record<ThemeMode, string> = { light: 'Light', dark: 'Dark', system: 'System' };
24
+ const themeCycle: Record<ThemeMode, ThemeMode> = { light: 'dark', dark: 'system', system: 'light' };
25
+
26
+ function cycleTheme() {
27
+ onThemeChange?.(themeCycle[theme]);
28
+ }
29
+ let searchQuery = $state('');
30
+
31
+ // Track expanded state by path key (SvelteSet for reactivity)
32
+ let expandedSet = new SvelteSet<string>();
33
+ let initialized = false;
34
+
35
+ // Initialize expanded state from tree defaults
36
+ $effect(() => {
37
+ if (!initialized && tree.length > 0) {
38
+ collectDefaults(tree, expandedSet);
39
+ initialized = true;
40
+ }
41
+ });
42
+
43
+ function collectDefaults(nodes: TreeNode[], set: SvelteSet<string>) {
44
+ for (const node of nodes) {
45
+ if (node.defaultExpanded || node.type === 'group') {
46
+ set.add(node.path.join('/'));
47
+ }
48
+ if (node.children.length > 0) {
49
+ collectDefaults(node.children, set);
50
+ }
51
+ }
52
+ }
53
+
54
+ function toggleExpanded(pathKey: string) {
55
+ if (expandedSet.has(pathKey)) {
56
+ expandedSet.delete(pathKey);
57
+ } else {
58
+ expandedSet.add(pathKey);
59
+ }
60
+ }
61
+
62
+ function isExpanded(pathKey: string): boolean {
63
+ if (searchQuery.trim()) return true; // Auto-expand when searching
64
+ return expandedSet.has(pathKey);
65
+ }
66
+
67
+ const filteredTree = $derived(
68
+ searchQuery.trim() ? filterTree(tree, searchQuery.trim().toLowerCase()) : tree,
69
+ );
70
+
71
+ function filterTree(nodes: TreeNode[], query: string): TreeNode[] {
72
+ const result: TreeNode[] = [];
73
+ for (const node of nodes) {
74
+ if (node.name.toLowerCase().includes(query)) {
75
+ result.push(node);
76
+ } else if (node.children.length > 0) {
77
+ const filtered = filterTree(node.children, query);
78
+ if (filtered.length > 0) {
79
+ result.push({ ...node, children: filtered });
80
+ }
81
+ }
82
+ }
83
+ return result;
84
+ }
85
+
86
+ function isActive(nodePath: string[]): boolean {
87
+ if (nodePath.length > currentPath.length) return false;
88
+ return nodePath.every((seg, i) => seg === currentPath[i]);
89
+ }
90
+
91
+ function isExactActive(nodePath: string[]): boolean {
92
+ return nodePath.length === currentPath.length && nodePath.every((seg, i) => seg === currentPath[i]);
93
+ }
94
+
95
+ function nodeIcon(node: TreeNode): string {
96
+ switch (node.type) {
97
+ case 'component': return '◆';
98
+ case 'page': return '◇';
99
+ case 'layout': return '▣';
100
+ case 'folder': return '▸';
101
+ default: return '';
102
+ }
103
+ }
104
+ </script>
105
+
106
+ <aside class="sdocs-sidebar">
107
+ <div class="sdocs-sidebar-header">
108
+ <span class="sdocs-logo">{logo}</span>
109
+ <div class="sdocs-header-actions">
110
+ {#if cssNames.length > 1}
111
+ <select
112
+ class="sdocs-css-picker"
113
+ value={activeStylesheet}
114
+ onchange={(e) => onStylesheetChange?.(e.currentTarget.value)}
115
+ >
116
+ {#each cssNames as name (name)}
117
+ <option value={name}>{name}</option>
118
+ {/each}
119
+ </select>
120
+ {/if}
121
+ <button class="sdocs-theme-btn" onclick={cycleTheme} title="{themeLabels[theme]} theme">
122
+ {themeIcons[theme]}
123
+ </button>
124
+ <button class="sdocs-fullscreen-btn" onclick={() => onToggleFullscreen?.()} title="Fullscreen">
125
+ &#x26F6;
126
+ </button>
127
+ </div>
128
+ </div>
129
+
130
+ <div class="sdocs-sidebar-search">
131
+ <input
132
+ type="text"
133
+ placeholder="Search..."
134
+ bind:value={searchQuery}
135
+ class="sdocs-search-input"
136
+ />
137
+ </div>
138
+
139
+ <nav class="sdocs-sidebar-tree">
140
+ {#each filteredTree as node (node.path.join('/'))}
141
+ {@render treeItem(node, 0)}
142
+ {/each}
143
+ </nav>
144
+ </aside>
145
+
146
+ {#snippet treeItem(node: TreeNode, depth: number)}
147
+ {@const pathKey = node.path.join('/')}
148
+ {@const isExpandable = node.type === 'folder' || node.type === 'group' || (node.type === 'component' && node.children.length > 0)}
149
+ {@const isGroup = node.type === 'group'}
150
+ {@const isSelectable = node.type === 'page' || node.type === 'layout' || (node.type === 'component' && node.children.length === 0)}
151
+ {@const activeExact = isExactActive(node.path)}
152
+ {@const activeContains = isActive(node.path)}
153
+
154
+ <div class="sdocs-tree-item" style:--depth={depth}>
155
+ {#if isGroup}
156
+ <div class="sdocs-group-label">{node.name.toUpperCase()}</div>
157
+ {:else if isExpandable}
158
+ <button
159
+ class="sdocs-tree-btn"
160
+ class:sdocs-active={activeContains}
161
+ onclick={() => toggleExpanded(pathKey)}
162
+ >
163
+ <span class="sdocs-tree-arrow" class:expanded={isExpanded(pathKey)}>&#9654;</span>
164
+ <span class="sdocs-tree-icon">{nodeIcon(node)}</span>
165
+ <span>{node.name}</span>
166
+ </button>
167
+ {:else if isSelectable}
168
+ <a
169
+ href={pathToHash(node.path)}
170
+ class="sdocs-tree-link"
171
+ class:sdocs-active={activeExact}
172
+ >
173
+ <span class="sdocs-tree-icon">{nodeIcon(node)}</span>
174
+ <span>{node.name}</span>
175
+ </a>
176
+ {:else}
177
+ <a
178
+ href={pathToHash(node.path)}
179
+ class="sdocs-tree-link"
180
+ class:sdocs-active={activeExact}
181
+ >
182
+ <span>{node.name}</span>
183
+ </a>
184
+ {/if}
185
+
186
+ {#if (isExpandable || isGroup) && isExpanded(pathKey)}
187
+ <div class="sdocs-tree-children">
188
+ {#each node.children as child (child.path.join('/'))}
189
+ {@render treeItem(child, depth + 1)}
190
+ {/each}
191
+ </div>
192
+ {/if}
193
+ </div>
194
+ {/snippet}
195
+
196
+ <style>
197
+ .sdocs-sidebar {
198
+ width: 260px;
199
+ height: 100vh;
200
+ overflow-y: auto;
201
+ border-right: 1px solid var(--sdocs-border);
202
+ background: var(--sdocs-bg-subtle);
203
+ display: flex;
204
+ flex-direction: column;
205
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
206
+ font-size: 13px;
207
+ }
208
+ .sdocs-sidebar-header {
209
+ padding: 12px 16px;
210
+ border-bottom: 1px solid var(--sdocs-border);
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: space-between;
214
+ }
215
+ .sdocs-logo {
216
+ font-weight: 700;
217
+ font-size: 16px;
218
+ color: var(--sdocs-text-heading);
219
+ }
220
+ .sdocs-header-actions {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: 6px;
224
+ }
225
+ .sdocs-css-picker {
226
+ font-size: 12px;
227
+ padding: 2px 4px;
228
+ border: 1px solid var(--sdocs-border);
229
+ border-radius: 4px;
230
+ background: var(--sdocs-bg);
231
+ color: var(--sdocs-text);
232
+ }
233
+ .sdocs-theme-btn {
234
+ padding: 2px 6px;
235
+ border: 1px solid var(--sdocs-border);
236
+ border-radius: 4px;
237
+ background: var(--sdocs-bg);
238
+ color: var(--sdocs-text);
239
+ cursor: pointer;
240
+ font-size: 14px;
241
+ line-height: 1;
242
+ }
243
+ .sdocs-theme-btn:hover {
244
+ background: var(--sdocs-bg-hover);
245
+ }
246
+ .sdocs-fullscreen-btn {
247
+ padding: 2px 6px;
248
+ border: 1px solid var(--sdocs-border);
249
+ border-radius: 4px;
250
+ background: var(--sdocs-bg);
251
+ color: var(--sdocs-text);
252
+ cursor: pointer;
253
+ font-size: 14px;
254
+ line-height: 1;
255
+ }
256
+ .sdocs-fullscreen-btn:hover {
257
+ background: var(--sdocs-bg-hover);
258
+ }
259
+ .sdocs-sidebar-search {
260
+ padding: 8px 16px;
261
+ }
262
+ .sdocs-search-input {
263
+ width: 100%;
264
+ padding: 6px 10px;
265
+ border: 1px solid var(--sdocs-border);
266
+ border-radius: 6px;
267
+ font-size: 13px;
268
+ outline: none;
269
+ box-sizing: border-box;
270
+ background: var(--sdocs-bg);
271
+ color: var(--sdocs-text);
272
+ }
273
+ .sdocs-search-input:focus {
274
+ border-color: var(--sdocs-primary);
275
+ box-shadow: 0 0 0 2px var(--sdocs-primary-bg);
276
+ }
277
+ .sdocs-sidebar-tree {
278
+ flex: 1;
279
+ overflow-y: auto;
280
+ padding: 8px 0;
281
+ }
282
+ .sdocs-tree-item {
283
+ padding-left: calc(var(--depth, 0) * 16px);
284
+ }
285
+ .sdocs-group-label {
286
+ padding: 12px 16px 4px;
287
+ font-size: 11px;
288
+ font-weight: 600;
289
+ color: var(--sdocs-text-muted);
290
+ letter-spacing: 0.05em;
291
+ }
292
+ .sdocs-tree-btn,
293
+ .sdocs-tree-link {
294
+ display: flex;
295
+ align-items: center;
296
+ gap: 6px;
297
+ width: 100%;
298
+ padding: 4px 16px;
299
+ border: none;
300
+ background: none;
301
+ font: inherit;
302
+ color: var(--sdocs-text);
303
+ text-decoration: none;
304
+ cursor: pointer;
305
+ text-align: left;
306
+ }
307
+ .sdocs-tree-btn:hover,
308
+ .sdocs-tree-link:hover {
309
+ background: var(--sdocs-border);
310
+ }
311
+ .sdocs-active {
312
+ color: var(--sdocs-primary);
313
+ font-weight: 500;
314
+ }
315
+ .sdocs-tree-arrow {
316
+ font-size: 8px;
317
+ transition: transform 0.15s;
318
+ display: inline-block;
319
+ width: 10px;
320
+ }
321
+ .sdocs-tree-arrow.expanded {
322
+ transform: rotate(90deg);
323
+ }
324
+ .sdocs-tree-icon {
325
+ font-size: 10px;
326
+ width: 14px;
327
+ text-align: center;
328
+ }
329
+ </style>
@@ -0,0 +1,16 @@
1
+ import type { TreeNode } from './tree-builder.js';
2
+ type ThemeMode = 'light' | 'dark' | 'system';
3
+ interface Props {
4
+ tree: TreeNode[];
5
+ currentPath: string[];
6
+ logo: string;
7
+ cssNames?: string[];
8
+ activeStylesheet?: string;
9
+ theme?: ThemeMode;
10
+ onToggleFullscreen?: () => void;
11
+ onStylesheetChange?: (name: string) => void;
12
+ onThemeChange?: (theme: ThemeMode) => void;
13
+ }
14
+ declare const Sidebar: import("svelte").Component<Props, {}, "">;
15
+ type Sidebar = ReturnType<typeof Sidebar>;
16
+ export default Sidebar;
@@ -0,0 +1,37 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ label: string;
4
+ value: boolean;
5
+ onchange: (value: boolean) => void;
6
+ }
7
+
8
+ let { label, value, onchange }: Props = $props();
9
+ </script>
10
+
11
+ <label class="sdocs-control">
12
+ <span class="sdocs-control-label">{label}</span>
13
+ <input
14
+ type="checkbox"
15
+ checked={value}
16
+ onchange={(e) => onchange(e.currentTarget.checked)}
17
+ class="sdocs-control-checkbox"
18
+ />
19
+ </label>
20
+
21
+ <style>
22
+ .sdocs-control {
23
+ display: flex;
24
+ align-items: center;
25
+ gap: 8px;
26
+ font-size: 13px;
27
+ }
28
+ .sdocs-control-label {
29
+ min-width: 100px;
30
+ color: var(--sdocs-text);
31
+ font-weight: 500;
32
+ }
33
+ .sdocs-control-checkbox {
34
+ width: 16px;
35
+ height: 16px;
36
+ }
37
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ label: string;
3
+ value: boolean;
4
+ onchange: (value: boolean) => void;
5
+ }
6
+ declare const CheckboxControl: import("svelte").Component<Props, {}, "">;
7
+ type CheckboxControl = ReturnType<typeof CheckboxControl>;
8
+ export default CheckboxControl;
@@ -0,0 +1,47 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ label: string;
4
+ value: string;
5
+ onchange: (value: string) => void;
6
+ }
7
+
8
+ let { label, value, onchange }: Props = $props();
9
+ </script>
10
+
11
+ <label class="sdocs-control">
12
+ <span class="sdocs-control-label">{label}</span>
13
+ <input
14
+ type="color"
15
+ {value}
16
+ oninput={(e) => onchange(e.currentTarget.value)}
17
+ class="sdocs-control-color"
18
+ />
19
+ <span class="sdocs-control-value">{value}</span>
20
+ </label>
21
+
22
+ <style>
23
+ .sdocs-control {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: 8px;
27
+ font-size: 13px;
28
+ }
29
+ .sdocs-control-label {
30
+ min-width: 100px;
31
+ color: var(--sdocs-text);
32
+ font-weight: 500;
33
+ }
34
+ .sdocs-control-color {
35
+ width: 32px;
36
+ height: 24px;
37
+ padding: 0;
38
+ border: 1px solid var(--sdocs-border);
39
+ border-radius: 4px;
40
+ cursor: pointer;
41
+ }
42
+ .sdocs-control-value {
43
+ color: var(--sdocs-text-secondary);
44
+ font-family: monospace;
45
+ font-size: 12px;
46
+ }
47
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ label: string;
3
+ value: string;
4
+ onchange: (value: string) => void;
5
+ }
6
+ declare const ColorControl: import("svelte").Component<Props, {}, "">;
7
+ type ColorControl = ReturnType<typeof ColorControl>;
8
+ export default ColorControl;
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ label: string;
4
+ value: string;
5
+ onchange: (value: string) => void;
6
+ }
7
+
8
+ let { label, value, onchange }: Props = $props();
9
+ const numericValue = $derived(parseInt(value) || 0);
10
+ </script>
11
+
12
+ <label class="sdocs-control">
13
+ <span class="sdocs-control-label">{label}</span>
14
+ <div class="sdocs-control-dimension">
15
+ <input
16
+ type="number"
17
+ value={numericValue}
18
+ oninput={(e) => onchange(e.currentTarget.value + 'px')}
19
+ class="sdocs-control-input"
20
+ />
21
+ <span class="sdocs-control-unit">px</span>
22
+ </div>
23
+ </label>
24
+
25
+ <style>
26
+ .sdocs-control {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 8px;
30
+ font-size: 13px;
31
+ }
32
+ .sdocs-control-label {
33
+ min-width: 100px;
34
+ color: var(--sdocs-text);
35
+ font-weight: 500;
36
+ }
37
+ .sdocs-control-dimension {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 4px;
41
+ }
42
+ .sdocs-control-input {
43
+ width: 80px;
44
+ padding: 4px 8px;
45
+ border: 1px solid var(--sdocs-border);
46
+ border-radius: 4px;
47
+ font: inherit;
48
+ font-size: 13px;
49
+ background: var(--sdocs-bg);
50
+ color: var(--sdocs-text);
51
+ }
52
+ .sdocs-control-unit {
53
+ color: var(--sdocs-text-muted);
54
+ font-size: 12px;
55
+ }
56
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ label: string;
3
+ value: string;
4
+ onchange: (value: string) => void;
5
+ }
6
+ declare const DimensionControl: import("svelte").Component<Props, {}, "">;
7
+ type DimensionControl = ReturnType<typeof DimensionControl>;
8
+ export default DimensionControl;
@@ -0,0 +1,44 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ label: string;
4
+ value: number;
5
+ onchange: (value: number) => void;
6
+ }
7
+
8
+ let { label, value, onchange }: Props = $props();
9
+ </script>
10
+
11
+ <label class="sdocs-control">
12
+ <span class="sdocs-control-label">{label}</span>
13
+ <input
14
+ type="number"
15
+ {value}
16
+ oninput={(e) => onchange(Number(e.currentTarget.value))}
17
+ class="sdocs-control-input"
18
+ />
19
+ </label>
20
+
21
+ <style>
22
+ .sdocs-control {
23
+ display: flex;
24
+ align-items: center;
25
+ gap: 8px;
26
+ font-size: 13px;
27
+ }
28
+ .sdocs-control-label {
29
+ min-width: 100px;
30
+ color: var(--sdocs-text);
31
+ font-weight: 500;
32
+ }
33
+ .sdocs-control-input {
34
+ flex: 1;
35
+ padding: 4px 8px;
36
+ border: 1px solid var(--sdocs-border);
37
+ background: var(--sdocs-bg);
38
+ color: var(--sdocs-text);
39
+ border-radius: 4px;
40
+ font: inherit;
41
+ font-size: 13px;
42
+ max-width: 120px;
43
+ }
44
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ label: string;
3
+ value: number;
4
+ onchange: (value: number) => void;
5
+ }
6
+ declare const NumberControl: import("svelte").Component<Props, {}, "">;
7
+ type NumberControl = ReturnType<typeof NumberControl>;
8
+ export default NumberControl;
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ label: string;
4
+ value: string;
5
+ options: string[];
6
+ onchange: (value: string) => void;
7
+ }
8
+
9
+ let { label, value, options, onchange }: Props = $props();
10
+ </script>
11
+
12
+ <label class="sdocs-control">
13
+ <span class="sdocs-control-label">{label}</span>
14
+ <select
15
+ class="sdocs-control-select"
16
+ {value}
17
+ onchange={(e) => onchange(e.currentTarget.value)}
18
+ >
19
+ {#each options as opt (opt)}
20
+ <option value={opt} selected={opt === value}>{opt}</option>
21
+ {/each}
22
+ </select>
23
+ </label>
24
+
25
+ <style>
26
+ .sdocs-control {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: 8px;
30
+ font-size: 13px;
31
+ }
32
+ .sdocs-control-label {
33
+ min-width: 100px;
34
+ color: var(--sdocs-text);
35
+ font-weight: 500;
36
+ }
37
+ .sdocs-control-select {
38
+ flex: 1;
39
+ padding: 4px 8px;
40
+ border: 1px solid var(--sdocs-border);
41
+ border-radius: 4px;
42
+ font: inherit;
43
+ font-size: 13px;
44
+ background: var(--sdocs-bg);
45
+ color: var(--sdocs-text);
46
+ max-width: 200px;
47
+ }
48
+ </style>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ label: string;
3
+ value: string;
4
+ options: string[];
5
+ onchange: (value: string) => void;
6
+ }
7
+ declare const SelectControl: import("svelte").Component<Props, {}, "">;
8
+ type SelectControl = ReturnType<typeof SelectControl>;
9
+ export default SelectControl;
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ label: string;
4
+ value: string;
5
+ onchange: (value: string) => void;
6
+ }
7
+
8
+ let { label, value, onchange }: Props = $props();
9
+ </script>
10
+
11
+ <label class="sdocs-control">
12
+ <span class="sdocs-control-label">{label}</span>
13
+ <input
14
+ type="text"
15
+ {value}
16
+ oninput={(e) => onchange(e.currentTarget.value)}
17
+ class="sdocs-control-input"
18
+ />
19
+ </label>
20
+
21
+ <style>
22
+ .sdocs-control {
23
+ display: flex;
24
+ align-items: center;
25
+ gap: 8px;
26
+ font-size: 13px;
27
+ }
28
+ .sdocs-control-label {
29
+ min-width: 100px;
30
+ color: var(--sdocs-text);
31
+ font-weight: 500;
32
+ }
33
+ .sdocs-control-input {
34
+ flex: 1;
35
+ padding: 4px 8px;
36
+ border: 1px solid var(--sdocs-border);
37
+ background: var(--sdocs-bg);
38
+ color: var(--sdocs-text);
39
+ border-radius: 4px;
40
+ font: inherit;
41
+ font-size: 13px;
42
+ }
43
+ </style>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ label: string;
3
+ value: string;
4
+ onchange: (value: string) => void;
5
+ }
6
+ declare const TextControl: import("svelte").Component<Props, {}, "">;
7
+ type TextControl = ReturnType<typeof TextControl>;
8
+ export default TextControl;
@@ -0,0 +1,11 @@
1
+ /** Hash-based router for sdocs. Uses #/Segment/Segment/... format. */
2
+ /** Get the current path segments */
3
+ export declare function getPath(): string[];
4
+ /** Navigate to a path */
5
+ export declare function navigate(segments: string[]): void;
6
+ /** Initialize the router — call once on app startup */
7
+ export declare function initRouter(): void;
8
+ /** Build a title path from meta.title (e.g. 'Demo / Button' → ['Demo', 'Button']) */
9
+ export declare function titleToPath(title: string): string[];
10
+ /** Build a hash string from a title path (for href attributes) */
11
+ export declare function pathToHash(segments: string[]): string;