sdocs 0.0.2 → 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 -63
  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,321 @@
1
+ <script lang="ts">
2
+ import type { DocEntry } from '../types.js';
3
+ import CollapsiblePanel from './CollapsiblePanel.svelte';
4
+ import PreviewFrame from './PreviewFrame.svelte';
5
+ import ControlsPanel from './ControlsPanel.svelte';
6
+ import DataTable from './DataTable.svelte';
7
+
8
+ interface Props {
9
+ doc: DocEntry;
10
+ /** If set, show only this example (full-page view) */
11
+ snippetName?: string;
12
+ activeStylesheet?: string;
13
+ }
14
+
15
+ let { doc, snippetName, activeStylesheet }: Props = $props();
16
+
17
+ const meta = $derived(doc.meta);
18
+ const cd = $derived(doc.componentData);
19
+ const snippets = $derived(doc.snippets ?? []);
20
+ const defaultSnippet = $derived(snippets.find((s) => s.name === 'Default'));
21
+ const exampleSnippets = $derived(snippets.filter((s) => s.name !== 'Default'));
22
+ const focusedSnippet = $derived(snippetName ? snippets.find((s) => s.name === snippetName) : null);
23
+
24
+ // Props/CSS controls state
25
+ let propValues = $state<Record<string, unknown>>({});
26
+ let cssValues = $state<Record<string, string>>({});
27
+
28
+ // Initialize from meta.args (build new objects to avoid read+write loop)
29
+ $effect(() => {
30
+ propValues = { ...(meta.args ?? {}) };
31
+ const newCss: Record<string, string> = {};
32
+ if (cd?.cssProps) {
33
+ for (const cp of cd.cssProps) {
34
+ if (cp.default) newCss[cp.name] = cp.default;
35
+ }
36
+ }
37
+ cssValues = newCss;
38
+ });
39
+
40
+ function handlePropChange(name: string, value: unknown) {
41
+ propValues = { ...propValues, [name]: value };
42
+ }
43
+
44
+ function handleCssChange(name: string, value: string) {
45
+ cssValues = { ...cssValues, [name]: value };
46
+ }
47
+
48
+ function handleReset() {
49
+ propValues = { ...(meta.args ?? {}) };
50
+ const newCss: Record<string, string> = {};
51
+ if (cd?.cssProps) {
52
+ for (const cp of cd.cssProps) {
53
+ if (cp.default) newCss[cp.name] = cp.default;
54
+ }
55
+ }
56
+ cssValues = newCss;
57
+ }
58
+
59
+ // Table data builders
60
+ const propsRows = $derived(
61
+ (cd?.props ?? []).filter((p) => p.category === 'prop').map((p) => ({
62
+ name: p.name,
63
+ type: p.type,
64
+ default: p.default,
65
+ required: p.required ? 'Yes' : '',
66
+ description: p.description,
67
+ })),
68
+ );
69
+
70
+ const cssPropsRows = $derived(
71
+ (cd?.cssProps ?? []).map((p) => ({
72
+ name: p.name,
73
+ type: p.type,
74
+ default: p.default,
75
+ description: p.description,
76
+ })),
77
+ );
78
+
79
+ const eventsRows = $derived(
80
+ (cd?.props ?? []).filter((p) => p.category === 'event').map((p) => ({
81
+ name: p.name,
82
+ type: p.type,
83
+ description: p.description,
84
+ })),
85
+ );
86
+
87
+ const snippetsRows = $derived(
88
+ (cd?.props ?? []).filter((p) => p.category === 'snippet').map((p) => ({
89
+ name: p.name,
90
+ type: p.type,
91
+ description: p.description,
92
+ })),
93
+ );
94
+
95
+ const methodsRows = $derived(
96
+ (cd?.methods ?? []).map((m) => ({
97
+ name: m.name,
98
+ params: m.params,
99
+ returns: m.returnType,
100
+ description: m.description,
101
+ })),
102
+ );
103
+
104
+ const stateRows = $derived(
105
+ (cd?.state ?? []).map((s) => ({
106
+ name: s.name,
107
+ type: s.type,
108
+ description: s.description,
109
+ })),
110
+ );
111
+ </script>
112
+
113
+ <div class="sdocs-component-view">
114
+ {#if focusedSnippet}
115
+ <!-- Example full-page view -->
116
+ <div class="sdocs-view-header">
117
+ <h1 class="sdocs-view-title">{meta.title} / {snippetName}</h1>
118
+ </div>
119
+ <div class="sdocs-panels">
120
+ <CollapsiblePanel title="Preview">
121
+ <PreviewFrame src={focusedSnippet.previewUrl} {activeStylesheet} />
122
+ </CollapsiblePanel>
123
+ <CollapsiblePanel title="Code" defaultExpanded={false}>
124
+ <div class="sdocs-code-block">{@html focusedSnippet.highlightedHtml ?? ''}</div>
125
+ </CollapsiblePanel>
126
+ </div>
127
+ {:else}
128
+ <!-- Full component view -->
129
+ <div class="sdocs-view-header">
130
+ <h1 class="sdocs-view-title">{meta.title}</h1>
131
+ {#if meta.description}
132
+ <p class="sdocs-view-description">{meta.description}</p>
133
+ {/if}
134
+ </div>
135
+
136
+ <div class="sdocs-panels">
137
+ <!-- Showcase -->
138
+ {#if defaultSnippet}
139
+ <CollapsiblePanel title="Preview">
140
+ <PreviewFrame
141
+ src={defaultSnippet.previewUrl}
142
+ props={propValues}
143
+ cssVars={cssValues}
144
+ {activeStylesheet}
145
+ />
146
+ </CollapsiblePanel>
147
+ {/if}
148
+
149
+ {#if cd && ((cd.props.filter((p) => p.category === 'prop').length > 0) || cd.cssProps.length > 0)}
150
+ <CollapsiblePanel title="Controls">
151
+ <ControlsPanel
152
+ componentProps={cd.props}
153
+ cssProps={cd.cssProps}
154
+ {propValues}
155
+ {cssValues}
156
+ onPropChange={handlePropChange}
157
+ onCssChange={handleCssChange}
158
+ onReset={handleReset}
159
+ />
160
+ </CollapsiblePanel>
161
+ {/if}
162
+
163
+ <CollapsiblePanel title="Props">
164
+ <DataTable
165
+ columns={[
166
+ { key: 'name', label: 'Name' },
167
+ { key: 'type', label: 'Type' },
168
+ { key: 'default', label: 'Default' },
169
+ { key: 'required', label: 'Required' },
170
+ { key: 'description', label: 'Description' },
171
+ ]}
172
+ rows={propsRows}
173
+ />
174
+ </CollapsiblePanel>
175
+
176
+ <CollapsiblePanel title="CSS Props">
177
+ <DataTable
178
+ columns={[
179
+ { key: 'name', label: 'Name' },
180
+ { key: 'type', label: 'Type' },
181
+ { key: 'default', label: 'Default' },
182
+ { key: 'description', label: 'Description' },
183
+ ]}
184
+ rows={cssPropsRows}
185
+ />
186
+ </CollapsiblePanel>
187
+
188
+ <CollapsiblePanel title="Events">
189
+ <DataTable
190
+ columns={[
191
+ { key: 'name', label: 'Name' },
192
+ { key: 'type', label: 'Type' },
193
+ { key: 'description', label: 'Description' },
194
+ ]}
195
+ rows={eventsRows}
196
+ />
197
+ </CollapsiblePanel>
198
+
199
+ <CollapsiblePanel title="Snippets">
200
+ <DataTable
201
+ columns={[
202
+ { key: 'name', label: 'Name' },
203
+ { key: 'type', label: 'Type' },
204
+ { key: 'description', label: 'Description' },
205
+ ]}
206
+ rows={snippetsRows}
207
+ />
208
+ </CollapsiblePanel>
209
+
210
+ <CollapsiblePanel title="Methods">
211
+ <DataTable
212
+ columns={[
213
+ { key: 'name', label: 'Name' },
214
+ { key: 'params', label: 'Parameters' },
215
+ { key: 'returns', label: 'Returns' },
216
+ { key: 'description', label: 'Description' },
217
+ ]}
218
+ rows={methodsRows}
219
+ />
220
+ </CollapsiblePanel>
221
+
222
+ <CollapsiblePanel title="State">
223
+ <DataTable
224
+ columns={[
225
+ { key: 'name', label: 'Name' },
226
+ { key: 'type', label: 'Type' },
227
+ { key: 'description', label: 'Description' },
228
+ ]}
229
+ rows={stateRows}
230
+ />
231
+ </CollapsiblePanel>
232
+
233
+ {#if defaultSnippet}
234
+ <CollapsiblePanel title="Preview Code" defaultExpanded={false}>
235
+ <div class="sdocs-code-block">{@html defaultSnippet.highlightedHtml ?? ''}</div>
236
+ </CollapsiblePanel>
237
+ {/if}
238
+
239
+ <!-- Examples -->
240
+ {#if exampleSnippets.length > 0}
241
+ <h2 class="sdocs-section-title">Examples</h2>
242
+ {#each exampleSnippets as example (example.name)}
243
+ <div class="sdocs-example">
244
+ <h3 class="sdocs-example-title">{example.name}</h3>
245
+ <CollapsiblePanel title="Preview">
246
+ <PreviewFrame src={example.previewUrl} {activeStylesheet} />
247
+ </CollapsiblePanel>
248
+ <CollapsiblePanel title="Code" defaultExpanded={false}>
249
+ <div class="sdocs-code-block">{@html example.highlightedHtml ?? ''}</div>
250
+ </CollapsiblePanel>
251
+ </div>
252
+ {/each}
253
+ {/if}
254
+
255
+ <!-- Source -->
256
+ {#if doc.highlightedSource}
257
+ <CollapsiblePanel title="Component Source" defaultExpanded={false}>
258
+ <div class="sdocs-code-block">{@html doc.highlightedSource}</div>
259
+ </CollapsiblePanel>
260
+ {/if}
261
+ </div>
262
+ {/if}
263
+ </div>
264
+
265
+ <style>
266
+ .sdocs-component-view {
267
+ padding: 24px 32px;
268
+ max-width: 960px;
269
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
270
+ }
271
+ .sdocs-view-header {
272
+ margin-bottom: 24px;
273
+ }
274
+ .sdocs-view-title {
275
+ font-size: 24px;
276
+ font-weight: 700;
277
+ color: var(--sdocs-text-heading);
278
+ margin: 0;
279
+ }
280
+ .sdocs-view-description {
281
+ font-size: 14px;
282
+ color: var(--sdocs-text-secondary);
283
+ margin: 6px 0 0;
284
+ }
285
+ .sdocs-panels {
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: 12px;
289
+ }
290
+ .sdocs-section-title {
291
+ font-size: 18px;
292
+ font-weight: 600;
293
+ color: var(--sdocs-text-heading);
294
+ margin: 24px 0 8px;
295
+ }
296
+ .sdocs-example {
297
+ display: flex;
298
+ flex-direction: column;
299
+ gap: 8px;
300
+ }
301
+ .sdocs-example-title {
302
+ font-size: 15px;
303
+ font-weight: 600;
304
+ color: var(--sdocs-text-strong);
305
+ margin: 0;
306
+ }
307
+ .sdocs-code-block {
308
+ overflow-x: auto;
309
+ font-size: 13px;
310
+ line-height: 1.5;
311
+ }
312
+ .sdocs-code-block :global(pre) {
313
+ margin: 0;
314
+ padding: 12px;
315
+ border-radius: 6px;
316
+ overflow-x: auto;
317
+ }
318
+ .sdocs-code-block :global(code) {
319
+ font-family: 'SF Mono', Monaco, Consolas, monospace;
320
+ }
321
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { DocEntry } from '../types.js';
2
+ interface Props {
3
+ doc: DocEntry;
4
+ /** If set, show only this example (full-page view) */
5
+ snippetName?: string;
6
+ activeStylesheet?: string;
7
+ }
8
+ declare const ComponentView: import("svelte").Component<Props, {}, "">;
9
+ type ComponentView = ReturnType<typeof ComponentView>;
10
+ export default ComponentView;
@@ -0,0 +1,191 @@
1
+ <script lang="ts">
2
+ import type { ParsedProp, ParsedCssProp } from '../types.js';
3
+ import TextControl from './controls/TextControl.svelte';
4
+ import NumberControl from './controls/NumberControl.svelte';
5
+ import CheckboxControl from './controls/CheckboxControl.svelte';
6
+ import ColorControl from './controls/ColorControl.svelte';
7
+ import DimensionControl from './controls/DimensionControl.svelte';
8
+ import SelectControl from './controls/SelectControl.svelte';
9
+
10
+ interface Props {
11
+ componentProps: ParsedProp[];
12
+ cssProps: ParsedCssProp[];
13
+ propValues: Record<string, unknown>;
14
+ cssValues: Record<string, string>;
15
+ onPropChange: (name: string, value: unknown) => void;
16
+ onCssChange: (name: string, value: string) => void;
17
+ onReset: () => void;
18
+ }
19
+
20
+ let { componentProps, cssProps, propValues, cssValues, onPropChange, onCssChange, onReset }: Props = $props();
21
+
22
+ // Only show controls for regular props (not events or snippets)
23
+ const editableProps = $derived(componentProps.filter((p) => p.category === 'prop'));
24
+
25
+ /** Parse union type strings like "'sm' | 'md' | 'lg'" or "1 | 2 | 3" into option arrays */
26
+ function parseUnionOptions(type: string | null): string[] | null {
27
+ if (!type || !type.includes('|')) return null;
28
+ const parts = type.split('|').map((s) => s.trim());
29
+ const values: string[] = [];
30
+ let allStrings = true;
31
+ let allNumbers = true;
32
+ for (const part of parts) {
33
+ // Quoted string: 'value' or "value"
34
+ const strMatch = part.match(/^['"](.+)['"]$/);
35
+ if (strMatch) {
36
+ values.push(strMatch[1]);
37
+ allNumbers = false;
38
+ continue;
39
+ }
40
+ // Bare number: 1, 2, 3
41
+ if (/^\d+(\.\d+)?$/.test(part)) {
42
+ values.push(part);
43
+ allStrings = false;
44
+ continue;
45
+ }
46
+ // Mixed or unsupported (e.g. 'medium' | number) → null
47
+ return null;
48
+ }
49
+ if (values.length > 0 && (allStrings || allNumbers)) return values;
50
+ return null;
51
+ }
52
+
53
+ function getControlType(prop: ParsedProp): 'text' | 'number' | 'boolean' | 'select' | 'readonly' {
54
+ const t = prop.type?.toLowerCase() ?? '';
55
+ if (t === 'string') return 'text';
56
+ if (t === 'number') return 'number';
57
+ if (t === 'boolean') return 'boolean';
58
+ if (parseUnionOptions(prop.type)) return 'select';
59
+ return 'readonly';
60
+ }
61
+
62
+ function getCssControlType(cssProp: ParsedCssProp): 'color' | 'dimension' | 'text' {
63
+ const t = cssProp.type?.toLowerCase() ?? '';
64
+ if (t === 'color') return 'color';
65
+ if (t === 'dimension') return 'dimension';
66
+ return 'text';
67
+ }
68
+ </script>
69
+
70
+ <div class="sdocs-controls">
71
+ {#if editableProps.length > 0}
72
+ <div class="sdocs-controls-section">
73
+ <div class="sdocs-controls-section-title">Props</div>
74
+ {#each editableProps as prop (prop.name)}
75
+ {@const controlType = getControlType(prop)}
76
+ {#if controlType === 'text'}
77
+ <TextControl
78
+ label={prop.name}
79
+ value={String(propValues[prop.name] ?? prop.default ?? '')}
80
+ onchange={(v) => onPropChange(prop.name, v)}
81
+ />
82
+ {:else if controlType === 'number'}
83
+ <NumberControl
84
+ label={prop.name}
85
+ value={Number(propValues[prop.name] ?? prop.default ?? 0)}
86
+ onchange={(v) => onPropChange(prop.name, v)}
87
+ />
88
+ {:else if controlType === 'boolean'}
89
+ <CheckboxControl
90
+ label={prop.name}
91
+ value={Boolean(propValues[prop.name] ?? (prop.default === 'true'))}
92
+ onchange={(v) => onPropChange(prop.name, v)}
93
+ />
94
+ {:else if controlType === 'select'}
95
+ {@const options = parseUnionOptions(prop.type) ?? []}
96
+ <SelectControl
97
+ label={prop.name}
98
+ value={String(propValues[prop.name] ?? prop.default ?? options[0] ?? '')}
99
+ {options}
100
+ onchange={(v) => onPropChange(prop.name, v)}
101
+ />
102
+ {:else}
103
+ <div class="sdocs-control-readonly">
104
+ <span class="sdocs-control-label">{prop.name}</span>
105
+ <span class="sdocs-control-type">{prop.type ?? 'unknown'}</span>
106
+ </div>
107
+ {/if}
108
+ {/each}
109
+ </div>
110
+ {/if}
111
+
112
+ {#if cssProps.length > 0}
113
+ <div class="sdocs-controls-section">
114
+ <div class="sdocs-controls-section-title">CSS Custom Properties</div>
115
+ {#each cssProps as cssProp (cssProp.name)}
116
+ {@const cssType = getCssControlType(cssProp)}
117
+ {#if cssType === 'color'}
118
+ <ColorControl
119
+ label={cssProp.name}
120
+ value={cssValues[cssProp.name] ?? cssProp.default ?? '#000000'}
121
+ onchange={(v) => onCssChange(cssProp.name, v)}
122
+ />
123
+ {:else if cssType === 'dimension'}
124
+ <DimensionControl
125
+ label={cssProp.name}
126
+ value={cssValues[cssProp.name] ?? cssProp.default ?? '0px'}
127
+ onchange={(v) => onCssChange(cssProp.name, v)}
128
+ />
129
+ {:else}
130
+ <TextControl
131
+ label={cssProp.name}
132
+ value={cssValues[cssProp.name] ?? cssProp.default ?? ''}
133
+ onchange={(v) => onCssChange(cssProp.name, v)}
134
+ />
135
+ {/if}
136
+ {/each}
137
+ </div>
138
+ {/if}
139
+
140
+ <button class="sdocs-reset-btn" onclick={onReset}>Reset</button>
141
+ </div>
142
+
143
+ <style>
144
+ .sdocs-controls {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 12px;
148
+ }
149
+ .sdocs-controls-section {
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: 8px;
153
+ }
154
+ .sdocs-controls-section-title {
155
+ font-size: 11px;
156
+ font-weight: 600;
157
+ color: var(--sdocs-text-muted);
158
+ text-transform: uppercase;
159
+ letter-spacing: 0.05em;
160
+ }
161
+ .sdocs-control-readonly {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 8px;
165
+ font-size: 13px;
166
+ }
167
+ .sdocs-control-label {
168
+ min-width: 100px;
169
+ color: var(--sdocs-text);
170
+ font-weight: 500;
171
+ }
172
+ .sdocs-control-type {
173
+ color: var(--sdocs-text-muted);
174
+ font-family: monospace;
175
+ font-size: 12px;
176
+ }
177
+ .sdocs-reset-btn {
178
+ align-self: flex-start;
179
+ padding: 4px 12px;
180
+ border: 1px solid var(--sdocs-border);
181
+ border-radius: 4px;
182
+ background: var(--sdocs-bg);
183
+ font: inherit;
184
+ font-size: 12px;
185
+ color: var(--sdocs-text);
186
+ cursor: pointer;
187
+ }
188
+ .sdocs-reset-btn:hover {
189
+ background: var(--sdocs-bg-hover);
190
+ }
191
+ </style>
@@ -0,0 +1,13 @@
1
+ import type { ParsedProp, ParsedCssProp } from '../types.js';
2
+ interface Props {
3
+ componentProps: ParsedProp[];
4
+ cssProps: ParsedCssProp[];
5
+ propValues: Record<string, unknown>;
6
+ cssValues: Record<string, string>;
7
+ onPropChange: (name: string, value: unknown) => void;
8
+ onCssChange: (name: string, value: string) => void;
9
+ onReset: () => void;
10
+ }
11
+ declare const ControlsPanel: import("svelte").Component<Props, {}, "">;
12
+ type ControlsPanel = ReturnType<typeof ControlsPanel>;
13
+ export default ControlsPanel;
@@ -0,0 +1,78 @@
1
+ <script lang="ts">
2
+ interface Column {
3
+ key: string;
4
+ label: string;
5
+ }
6
+
7
+ interface Props {
8
+ columns: Column[];
9
+ rows: Record<string, unknown>[];
10
+ }
11
+
12
+ let { columns, rows }: Props = $props();
13
+ </script>
14
+
15
+ {#if rows.length > 0}
16
+ <table class="sdocs-table">
17
+ <thead>
18
+ <tr>
19
+ {#each columns as col (col.key)}
20
+ <th>{col.label}</th>
21
+ {/each}
22
+ </tr>
23
+ </thead>
24
+ <tbody>
25
+ {#each rows as row, i (i)}
26
+ <tr>
27
+ {#each columns as col (col.key)}
28
+ <td>
29
+ {#if row[col.key] != null}
30
+ <code>{row[col.key]}</code>
31
+ {:else}
32
+ <span class="sdocs-table-empty">—</span>
33
+ {/if}
34
+ </td>
35
+ {/each}
36
+ </tr>
37
+ {/each}
38
+ </tbody>
39
+ </table>
40
+ {:else}
41
+ <p class="sdocs-table-none">None</p>
42
+ {/if}
43
+
44
+ <style>
45
+ .sdocs-table {
46
+ width: 100%;
47
+ border-collapse: collapse;
48
+ font-size: 13px;
49
+ }
50
+ .sdocs-table th {
51
+ text-align: left;
52
+ padding: 6px 12px;
53
+ border-bottom: 2px solid var(--sdocs-border);
54
+ font-weight: 600;
55
+ color: var(--sdocs-text);
56
+ font-size: 12px;
57
+ }
58
+ .sdocs-table td {
59
+ padding: 6px 12px;
60
+ border-bottom: 1px solid var(--sdocs-bg-hover);
61
+ color: var(--sdocs-text-strong);
62
+ }
63
+ .sdocs-table code {
64
+ font-family: 'SF Mono', Monaco, Consolas, monospace;
65
+ font-size: 12px;
66
+ background: var(--sdocs-bg-hover);
67
+ padding: 1px 4px;
68
+ border-radius: 3px;
69
+ }
70
+ .sdocs-table-empty {
71
+ color: var(--sdocs-border-muted);
72
+ }
73
+ .sdocs-table-none {
74
+ color: var(--sdocs-text-muted);
75
+ font-size: 13px;
76
+ font-style: italic;
77
+ }
78
+ </style>
@@ -0,0 +1,11 @@
1
+ interface Column {
2
+ key: string;
3
+ label: string;
4
+ }
5
+ interface Props {
6
+ columns: Column[];
7
+ rows: Record<string, unknown>[];
8
+ }
9
+ declare const DataTable: import("svelte").Component<Props, {}, "">;
10
+ type DataTable = ReturnType<typeof DataTable>;
11
+ export default DataTable;