sdocs 0.0.14 → 0.0.16
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.
- package/bin/sdocs.js +1 -1
- package/dist/client/App.svelte +16 -39
- package/dist/client/App.svelte.d.ts +1 -1
- package/dist/client/favicon.png +0 -0
- package/dist/client/tree-builder.js +57 -14
- package/dist/client/{CollapsiblePanel.svelte → views/CollapsiblePanel.svelte} +5 -5
- package/dist/client/{ComponentView.svelte → views/ComponentView.svelte} +39 -13
- package/dist/client/{ComponentView.svelte.d.ts → views/ComponentView.svelte.d.ts} +1 -1
- package/dist/client/{ControlsPanel.svelte → views/ControlsPanel.svelte} +10 -15
- package/dist/client/{ControlsPanel.svelte.d.ts → views/ControlsPanel.svelte.d.ts} +1 -1
- package/dist/client/{DataTable.svelte → views/DataTable.svelte} +8 -8
- package/dist/client/{HomePage.svelte → views/HomePage.svelte} +10 -8
- package/dist/client/{HomePage.svelte.d.ts → views/HomePage.svelte.d.ts} +1 -1
- package/dist/client/{LayoutView.svelte → views/LayoutView.svelte} +1 -1
- package/dist/client/{LayoutView.svelte.d.ts → views/LayoutView.svelte.d.ts} +1 -1
- package/dist/client/{PageView.svelte → views/PageView.svelte} +7 -7
- package/dist/client/{PageView.svelte.d.ts → views/PageView.svelte.d.ts} +1 -1
- package/dist/client/{PreviewFrame.svelte → views/PreviewFrame.svelte} +10 -3
- package/dist/client/views/Sidebar.svelte +369 -0
- package/dist/client/{Sidebar.svelte.d.ts → views/Sidebar.svelte.d.ts} +2 -2
- package/dist/commands/build.js +2 -2
- package/dist/commands/dev.js +2 -2
- package/dist/commands/init.js +4 -4
- package/dist/commands/preview.js +1 -1
- package/dist/{app-gen.d.ts → server/app-gen.d.ts} +1 -1
- package/dist/{app-gen.js → server/app-gen.js} +4 -4
- package/dist/{cli.js → server/cli.js} +4 -4
- package/dist/{config.d.ts → server/config.d.ts} +1 -1
- package/dist/{config.js → server/config.js} +7 -2
- package/dist/server/discovery.d.ts +1 -1
- package/dist/server/discovery.js +1 -1
- package/dist/server/meta-parser.js +1 -1
- package/dist/server/prop-parser.js +12 -4
- package/dist/server/snippet-compiler.js +8 -0
- package/dist/server/snippet-extractor.d.ts +1 -1
- package/dist/server/snippet-extractor.js +40 -5
- package/dist/server/toc-extractor.d.ts +0 -2
- package/dist/server/toc-extractor.js +0 -14
- package/dist/types.d.ts +3 -3
- package/dist/ui/About.page.sdoc +37 -0
- package/dist/ui/Button/Button.sdoc +51 -0
- package/dist/ui/Button/Button.svelte +90 -0
- package/dist/ui/Button/Button.svelte.d.ts +27 -0
- package/dist/ui/Button/index.d.ts +1 -0
- package/dist/ui/Button/index.js +1 -0
- package/dist/ui/Control/Checkbox.sdoc +17 -0
- package/dist/{client/controls/CheckboxControl.svelte → ui/Control/Checkbox.svelte} +1 -1
- package/dist/ui/Control/Checkbox.svelte.d.ts +8 -0
- package/dist/ui/Control/Color.sdoc +17 -0
- package/dist/{client/controls/ColorControl.svelte → ui/Control/Color.svelte} +4 -4
- package/dist/ui/Control/Color.svelte.d.ts +8 -0
- package/dist/ui/Control/Dimension.sdoc +17 -0
- package/dist/{client/controls/DimensionControl.svelte → ui/Control/Dimension.svelte} +5 -5
- package/dist/ui/Control/Dimension.svelte.d.ts +8 -0
- package/dist/ui/Control/Number.sdoc +17 -0
- package/dist/{client/controls/NumberControl.svelte → ui/Control/Number.svelte} +4 -4
- package/dist/ui/Control/Number.svelte.d.ts +8 -0
- package/dist/ui/Control/Select.sdoc +18 -0
- package/dist/{client/controls/SelectControl.svelte → ui/Control/Select.svelte} +4 -4
- package/dist/ui/Control/Select.svelte.d.ts +9 -0
- package/dist/ui/Control/Text.sdoc +17 -0
- package/dist/{client/controls/TextControl.svelte → ui/Control/Text.svelte} +4 -4
- package/dist/ui/Control/Text.svelte.d.ts +8 -0
- package/dist/ui/Control/index.d.ts +6 -0
- package/dist/ui/Control/index.js +6 -0
- package/dist/ui/Dashboard.layout.sdoc +60 -0
- package/dist/ui/Frame/Frame.sdoc +54 -0
- package/dist/ui/Frame/Frame.svelte +88 -0
- package/dist/ui/Frame/Frame.svelte.d.ts +15 -0
- package/dist/ui/Frame/index.d.ts +1 -0
- package/dist/ui/Frame/index.js +1 -0
- package/dist/ui/Icon/Icon.sdoc +45 -0
- package/dist/ui/Icon/Icon.svelte +47 -0
- package/dist/ui/Icon/Icon.svelte.d.ts +16 -0
- package/dist/ui/Icon/icons/bookmark.svg +1 -0
- package/dist/ui/Icon/icons/chevron-down.svg +1 -0
- package/dist/ui/Icon/icons/chevron-left.svg +1 -0
- package/dist/ui/Icon/icons/chevron-right.svg +1 -0
- package/dist/ui/Icon/icons/chevron-up.svg +1 -0
- package/dist/ui/Icon/icons/code.svg +1 -0
- package/dist/ui/Icon/icons/component.svg +1 -0
- package/dist/ui/Icon/icons/copy.svg +1 -0
- package/dist/ui/Icon/icons/diamond.svg +1 -0
- package/dist/ui/Icon/icons/file-code.svg +1 -0
- package/dist/ui/Icon/icons/file-text.svg +1 -0
- package/dist/ui/Icon/icons/folder-open.svg +1 -0
- package/dist/ui/Icon/icons/folder.svg +1 -0
- package/dist/ui/Icon/icons/panels-top-left.svg +1 -0
- package/dist/ui/Icon/icons/sdocs.svg +8 -0
- package/dist/ui/Icon/index.d.ts +1 -0
- package/dist/ui/Icon/index.js +1 -0
- package/dist/ui/NavTree/Group.sdoc +46 -0
- package/dist/ui/NavTree/Group.svelte +82 -0
- package/dist/ui/NavTree/Group.svelte.d.ts +11 -0
- package/dist/ui/NavTree/Item.sdoc +70 -0
- package/dist/ui/NavTree/Item.svelte +164 -0
- package/dist/ui/NavTree/Item.svelte.d.ts +33 -0
- package/dist/ui/NavTree/NavTree.sdoc +119 -0
- package/dist/ui/NavTree/NavTree.svelte +31 -0
- package/dist/ui/NavTree/NavTree.svelte.d.ts +8 -0
- package/dist/ui/NavTree/index.js +6 -0
- package/dist/ui/Stack/Stack.sdoc +44 -0
- package/dist/ui/Stack/Stack.svelte +41 -0
- package/dist/ui/Stack/Stack.svelte.d.ts +19 -0
- package/dist/ui/Stack/index.d.ts +1 -0
- package/dist/ui/Stack/index.js +1 -0
- package/dist/ui/index.d.ts +6 -0
- package/dist/ui/index.js +6 -0
- package/dist/ui/styles/fonts/jetbrains-mono-italic-latin-ext.woff2 +0 -0
- package/dist/ui/styles/fonts/jetbrains-mono-italic-latin.woff2 +0 -0
- package/dist/ui/styles/fonts/jetbrains-mono-latin-ext.woff2 +0 -0
- package/dist/ui/styles/fonts/jetbrains-mono-latin.woff2 +0 -0
- package/dist/ui/styles/fonts.css +87 -0
- package/dist/ui/styles/theme.css +910 -0
- package/dist/vite.js +47 -51
- package/package.json +5 -2
- package/dist/client/Sidebar.svelte +0 -329
- package/dist/client/controls/CheckboxControl.svelte.d.ts +0 -8
- package/dist/client/controls/ColorControl.svelte.d.ts +0 -8
- package/dist/client/controls/DimensionControl.svelte.d.ts +0 -8
- package/dist/client/controls/NumberControl.svelte.d.ts +0 -8
- package/dist/client/controls/SelectControl.svelte.d.ts +0 -9
- package/dist/client/controls/TextControl.svelte.d.ts +0 -8
- package/dist/client/theme.css +0 -80
- package/dist/server/sdocx-parser.d.ts +0 -11
- package/dist/server/sdocx-parser.js +0 -197
- /package/dist/client/{CollapsiblePanel.svelte.d.ts → views/CollapsiblePanel.svelte.d.ts} +0 -0
- /package/dist/client/{DataTable.svelte.d.ts → views/DataTable.svelte.d.ts} +0 -0
- /package/dist/client/{PreviewFrame.svelte.d.ts → views/PreviewFrame.svelte.d.ts} +0 -0
- /package/dist/{cli.d.ts → server/cli.d.ts} +0 -0
- /package/dist/{client → ui/styles}/fonts/figtree-italic-latin-ext.woff2 +0 -0
- /package/dist/{client → ui/styles}/fonts/figtree-italic-latin.woff2 +0 -0
- /package/dist/{client → ui/styles}/fonts/figtree-latin-ext.woff2 +0 -0
- /package/dist/{client → ui/styles}/fonts/figtree-latin.woff2 +0 -0
package/bin/sdocs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import '../dist/cli.js';
|
|
2
|
+
import '../dist/server/cli.js';
|
package/dist/client/App.svelte
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
import type { DocEntry } from '../types.js';
|
|
3
3
|
import { initRouter, getPath } from './router.svelte.js';
|
|
4
4
|
import { buildTree, findDocByPath } from './tree-builder.js';
|
|
5
|
-
import Sidebar from './Sidebar.svelte';
|
|
6
|
-
import ComponentView from './ComponentView.svelte';
|
|
7
|
-
import PageView from './PageView.svelte';
|
|
8
|
-
import LayoutView from './LayoutView.svelte';
|
|
9
|
-
import HomePage from './HomePage.svelte';
|
|
5
|
+
import Sidebar from './views/Sidebar.svelte';
|
|
6
|
+
import ComponentView from './views/ComponentView.svelte';
|
|
7
|
+
import PageView from './views/PageView.svelte';
|
|
8
|
+
import LayoutView from './views/LayoutView.svelte';
|
|
9
|
+
import HomePage from './views/HomePage.svelte';
|
|
10
10
|
import { onMount } from 'svelte';
|
|
11
|
-
import '
|
|
11
|
+
import '../ui/styles/theme.css';
|
|
12
12
|
|
|
13
|
-
type ThemeMode = 'light' | 'dark'
|
|
13
|
+
type ThemeMode = 'light' | 'dark';
|
|
14
14
|
|
|
15
15
|
interface Props {
|
|
16
16
|
docs: DocEntry[];
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
let sidebarHidden = $state(false);
|
|
28
28
|
let activeStylesheet = $state<string | undefined>(undefined);
|
|
29
|
-
let theme = $state<ThemeMode>('
|
|
29
|
+
let theme = $state<ThemeMode>('light');
|
|
30
30
|
|
|
31
31
|
// Initialize active stylesheet to first named CSS (if any)
|
|
32
32
|
$effect(() => {
|
|
@@ -37,9 +37,8 @@
|
|
|
37
37
|
|
|
38
38
|
onMount(() => {
|
|
39
39
|
initRouter();
|
|
40
|
-
// Read saved theme preference
|
|
41
40
|
const saved = localStorage.getItem('sdocs-theme') as ThemeMode | null;
|
|
42
|
-
if (saved &&
|
|
41
|
+
if (saved && (saved === 'light' || saved === 'dark')) {
|
|
43
42
|
theme = saved;
|
|
44
43
|
}
|
|
45
44
|
});
|
|
@@ -48,31 +47,10 @@
|
|
|
48
47
|
$effect(() => {
|
|
49
48
|
const root = document.querySelector('.sdocs-app');
|
|
50
49
|
if (!root) return;
|
|
51
|
-
|
|
52
|
-
let resolved: 'light' | 'dark';
|
|
53
|
-
if (theme === 'system') {
|
|
54
|
-
resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
55
|
-
} else {
|
|
56
|
-
resolved = theme;
|
|
57
|
-
}
|
|
58
|
-
root.setAttribute('data-sdocs-theme', resolved);
|
|
50
|
+
root.setAttribute('data-sdocs-theme', theme);
|
|
59
51
|
localStorage.setItem('sdocs-theme', theme);
|
|
60
52
|
});
|
|
61
53
|
|
|
62
|
-
// Listen for OS theme changes when in system mode
|
|
63
|
-
$effect(() => {
|
|
64
|
-
if (theme !== 'system') return;
|
|
65
|
-
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
66
|
-
const handler = () => {
|
|
67
|
-
const root = document.querySelector('.sdocs-app');
|
|
68
|
-
if (root) {
|
|
69
|
-
root.setAttribute('data-sdocs-theme', mq.matches ? 'dark' : 'light');
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
mq.addEventListener('change', handler);
|
|
73
|
-
return () => mq.removeEventListener('change', handler);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
54
|
const currentPath = $derived(getPath());
|
|
77
55
|
const tree = $derived(buildTree(docs, sidebarConfig));
|
|
78
56
|
const resolved = $derived(findDocByPath(docs, currentPath));
|
|
@@ -125,7 +103,7 @@
|
|
|
125
103
|
.sdocs-main {
|
|
126
104
|
flex: 1;
|
|
127
105
|
overflow-y: auto;
|
|
128
|
-
background: var(--
|
|
106
|
+
background: var(--color-base-0);
|
|
129
107
|
}
|
|
130
108
|
.sdocs-main-fullscreen {
|
|
131
109
|
overflow-y: auto;
|
|
@@ -136,16 +114,15 @@
|
|
|
136
114
|
left: 12px;
|
|
137
115
|
z-index: 100;
|
|
138
116
|
padding: 6px 12px;
|
|
139
|
-
border: 1px solid var(--
|
|
117
|
+
border: 1px solid var(--color-base-200);
|
|
140
118
|
border-radius: 6px;
|
|
141
|
-
background: var(--
|
|
119
|
+
background: var(--color-base-0);
|
|
142
120
|
font-size: 12px;
|
|
143
|
-
color: var(--
|
|
121
|
+
color: var(--color-base-600);
|
|
144
122
|
cursor: pointer;
|
|
145
|
-
|
|
146
|
-
font-family: var(--sdocs-font-sans);
|
|
123
|
+
font-family: var(--sans);
|
|
147
124
|
}
|
|
148
125
|
.sdocs-exit-fullscreen:hover {
|
|
149
|
-
background: var(--
|
|
126
|
+
background: var(--color-base-100);
|
|
150
127
|
}
|
|
151
128
|
</style>
|
package/dist/client/favicon.png
CHANGED
|
Binary file
|
|
@@ -22,15 +22,22 @@ export function buildTree(docs, sidebar) {
|
|
|
22
22
|
const key = currentPath.join('/');
|
|
23
23
|
let folder = folderMap.get(key);
|
|
24
24
|
if (!folder) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
// Check if a node with this name already exists (e.g. a component node)
|
|
26
|
+
const existing = parent.find((n) => n.name === segName);
|
|
27
|
+
if (existing) {
|
|
28
|
+
folder = existing;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
folder = {
|
|
32
|
+
name: segName,
|
|
33
|
+
type: isGroup ? 'group' : 'folder',
|
|
34
|
+
path: [...currentPath],
|
|
35
|
+
children: [],
|
|
36
|
+
defaultExpanded: isGroup || sidebar?.open?.includes(segName),
|
|
37
|
+
};
|
|
38
|
+
parent.push(folder);
|
|
39
|
+
}
|
|
32
40
|
folderMap.set(key, folder);
|
|
33
|
-
parent.push(folder);
|
|
34
41
|
}
|
|
35
42
|
parent = folder.children;
|
|
36
43
|
}
|
|
@@ -40,16 +47,20 @@ export function buildTree(docs, sidebar) {
|
|
|
40
47
|
const examples = doc.snippets
|
|
41
48
|
?.filter((s) => s.name !== 'Default')
|
|
42
49
|
.map((s) => s.name) ?? [];
|
|
43
|
-
|
|
50
|
+
// Check if a folder node with this name already exists (created by a child doc)
|
|
51
|
+
const existing = parent.find((n) => n.name === itemName);
|
|
52
|
+
const componentNode = existing ?? {
|
|
44
53
|
name: itemName,
|
|
45
54
|
type: 'component',
|
|
46
55
|
path: itemPath,
|
|
47
56
|
children: [],
|
|
48
|
-
doc,
|
|
49
|
-
examples,
|
|
50
57
|
};
|
|
58
|
+
// Upgrade folder to component and attach doc data
|
|
59
|
+
componentNode.type = 'component';
|
|
60
|
+
componentNode.doc = doc;
|
|
61
|
+
componentNode.examples = examples;
|
|
51
62
|
// Add "Docs" child
|
|
52
|
-
componentNode.children.
|
|
63
|
+
componentNode.children.unshift({
|
|
53
64
|
name: 'Docs',
|
|
54
65
|
type: 'component',
|
|
55
66
|
path: itemPath,
|
|
@@ -66,7 +77,9 @@ export function buildTree(docs, sidebar) {
|
|
|
66
77
|
doc,
|
|
67
78
|
});
|
|
68
79
|
}
|
|
69
|
-
|
|
80
|
+
if (!existing) {
|
|
81
|
+
parent.push(componentNode);
|
|
82
|
+
}
|
|
70
83
|
}
|
|
71
84
|
else {
|
|
72
85
|
parent.push({
|
|
@@ -78,12 +91,41 @@ export function buildTree(docs, sidebar) {
|
|
|
78
91
|
});
|
|
79
92
|
}
|
|
80
93
|
}
|
|
94
|
+
// Reorder component children: Docs → examples → sub-components (sorted by name)
|
|
95
|
+
reorderComponentChildren(root);
|
|
81
96
|
// Apply ordering
|
|
82
97
|
if (sidebar?.order) {
|
|
83
98
|
applyOrder(root, 'root', sidebar.order);
|
|
84
99
|
}
|
|
85
100
|
return root;
|
|
86
101
|
}
|
|
102
|
+
/** Reorder component children: Docs first, then examples, then sub-components sorted by name */
|
|
103
|
+
function reorderComponentChildren(nodes) {
|
|
104
|
+
for (const node of nodes) {
|
|
105
|
+
if (node.type === 'component' && node.doc && node.children.length > 0) {
|
|
106
|
+
const docs = [];
|
|
107
|
+
const examples = [];
|
|
108
|
+
const subComponents = [];
|
|
109
|
+
for (const child of node.children) {
|
|
110
|
+
if (child.name === 'Docs') {
|
|
111
|
+
docs.push(child);
|
|
112
|
+
}
|
|
113
|
+
else if (child.doc === node.doc) {
|
|
114
|
+
examples.push(child);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
subComponents.push(child);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
subComponents.sort((a, b) => a.name.localeCompare(b.name));
|
|
121
|
+
node.children.length = 0;
|
|
122
|
+
node.children.push(...docs, ...examples, ...subComponents);
|
|
123
|
+
}
|
|
124
|
+
if (node.children.length > 0) {
|
|
125
|
+
reorderComponentChildren(node.children);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
87
129
|
/** Apply sort order to children at each level */
|
|
88
130
|
function applyOrder(nodes, folderKey, orderConfig) {
|
|
89
131
|
const order = orderConfig[folderKey];
|
|
@@ -144,7 +186,8 @@ export function findDocByPath(docs, path) {
|
|
|
144
186
|
return null;
|
|
145
187
|
for (const doc of docs) {
|
|
146
188
|
const title = doc.meta.title ?? '';
|
|
147
|
-
const segments = title.split('/').map((s) => s.trim()).filter(Boolean)
|
|
189
|
+
const segments = title.split('/').map((s) => s.trim()).filter(Boolean)
|
|
190
|
+
.map((s) => s.startsWith(':') ? s.slice(1) : s);
|
|
148
191
|
// Exact match → component docs view
|
|
149
192
|
if (segments.length === path.length && segments.every((s, i) => s === path[i])) {
|
|
150
193
|
return { doc };
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
<style>
|
|
27
27
|
.sdocs-panel {
|
|
28
|
-
border: 1px solid var(--
|
|
28
|
+
border: 1px solid var(--color-base-200);
|
|
29
29
|
border-radius: 8px;
|
|
30
30
|
overflow: hidden;
|
|
31
31
|
}
|
|
@@ -36,16 +36,16 @@
|
|
|
36
36
|
width: 100%;
|
|
37
37
|
padding: 10px 14px;
|
|
38
38
|
border: none;
|
|
39
|
-
background: var(--
|
|
39
|
+
background: var(--color-base-50);
|
|
40
40
|
font: inherit;
|
|
41
41
|
font-size: 13px;
|
|
42
42
|
font-weight: 600;
|
|
43
|
-
color: var(--
|
|
43
|
+
color: var(--color-base-900);
|
|
44
44
|
cursor: pointer;
|
|
45
45
|
text-align: left;
|
|
46
46
|
}
|
|
47
47
|
.sdocs-panel-header:hover {
|
|
48
|
-
background: var(--
|
|
48
|
+
background: var(--color-base-100);
|
|
49
49
|
}
|
|
50
50
|
.sdocs-panel-arrow {
|
|
51
51
|
font-size: 8px;
|
|
@@ -58,6 +58,6 @@
|
|
|
58
58
|
}
|
|
59
59
|
.sdocs-panel-body {
|
|
60
60
|
padding: 14px;
|
|
61
|
-
border-top: 1px solid var(--
|
|
61
|
+
border-top: 1px solid var(--color-base-200);
|
|
62
62
|
}
|
|
63
63
|
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { DocEntry } from '
|
|
2
|
+
import type { DocEntry } from '../../types.js';
|
|
3
3
|
import CollapsiblePanel from './CollapsiblePanel.svelte';
|
|
4
4
|
import PreviewFrame from './PreviewFrame.svelte';
|
|
5
5
|
import ControlsPanel from './ControlsPanel.svelte';
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
const meta = $derived(doc.meta);
|
|
18
18
|
const cd = $derived(doc.componentData);
|
|
19
|
+
const componentName = $derived(
|
|
20
|
+
typeof meta.component === 'string'
|
|
21
|
+
? meta.component
|
|
22
|
+
: (meta.title ?? '').split('/').pop()?.trim() ?? 'Component',
|
|
23
|
+
);
|
|
19
24
|
const snippets = $derived(doc.snippets ?? []);
|
|
20
25
|
const defaultSnippet = $derived(snippets.find((s) => s.name === 'Default'));
|
|
21
26
|
const exampleSnippets = $derived(snippets.filter((s) => s.name !== 'Default'));
|
|
@@ -45,6 +50,29 @@
|
|
|
45
50
|
cssValues = { ...cssValues, [name]: value };
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
function generateUsageCode(name: string, props: Record<string, unknown>, css: Record<string, string>): string {
|
|
54
|
+
const attrs: string[] = [];
|
|
55
|
+
for (const [key, value] of Object.entries(props)) {
|
|
56
|
+
if (value === undefined || value === null || value === '') continue;
|
|
57
|
+
if (typeof value === 'string') {
|
|
58
|
+
attrs.push(`${key}="${value}"`);
|
|
59
|
+
} else if (typeof value === 'boolean') {
|
|
60
|
+
attrs.push(value ? key : `${key}={false}`);
|
|
61
|
+
} else {
|
|
62
|
+
attrs.push(`${key}={${JSON.stringify(value)}}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const [key, value] of Object.entries(css)) {
|
|
66
|
+
if (value === undefined || value === '') continue;
|
|
67
|
+
attrs.push(`${key}="${value}"`);
|
|
68
|
+
}
|
|
69
|
+
if (attrs.length === 0) return `<${name} />`;
|
|
70
|
+
if (attrs.length <= 2) return `<${name} ${attrs.join(' ')} />`;
|
|
71
|
+
return `<${name}\n ${attrs.join('\n ')}\n/>`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const usageCode = $derived(generateUsageCode(componentName, propValues, cssValues));
|
|
75
|
+
|
|
48
76
|
function handleReset() {
|
|
49
77
|
propValues = { ...(meta.args ?? {}) };
|
|
50
78
|
const newCss: Record<string, string> = {};
|
|
@@ -144,6 +172,10 @@
|
|
|
144
172
|
{activeStylesheet}
|
|
145
173
|
/>
|
|
146
174
|
</CollapsiblePanel>
|
|
175
|
+
|
|
176
|
+
<CollapsiblePanel title="Preview Code">
|
|
177
|
+
<div class="sdocs-code-block"><pre><code>{usageCode}</code></pre></div>
|
|
178
|
+
</CollapsiblePanel>
|
|
147
179
|
{/if}
|
|
148
180
|
|
|
149
181
|
{#if cd && ((cd.props.filter((p) => p.category === 'prop').length > 0) || cd.cssProps.length > 0)}
|
|
@@ -230,12 +262,6 @@
|
|
|
230
262
|
/>
|
|
231
263
|
</CollapsiblePanel>
|
|
232
264
|
|
|
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
265
|
<!-- Examples -->
|
|
240
266
|
{#if exampleSnippets.length > 0}
|
|
241
267
|
<h2 class="sdocs-section-title">Examples</h2>
|
|
@@ -266,7 +292,7 @@
|
|
|
266
292
|
.sdocs-component-view {
|
|
267
293
|
padding: 24px 32px;
|
|
268
294
|
max-width: 960px;
|
|
269
|
-
font-family: var(--
|
|
295
|
+
font-family: var(--sans);
|
|
270
296
|
}
|
|
271
297
|
.sdocs-view-header {
|
|
272
298
|
margin-bottom: 24px;
|
|
@@ -274,12 +300,12 @@
|
|
|
274
300
|
.sdocs-view-title {
|
|
275
301
|
font-size: 24px;
|
|
276
302
|
font-weight: 700;
|
|
277
|
-
color: var(--
|
|
303
|
+
color: var(--color-base-900);
|
|
278
304
|
margin: 0;
|
|
279
305
|
}
|
|
280
306
|
.sdocs-view-description {
|
|
281
307
|
font-size: 14px;
|
|
282
|
-
color: var(--
|
|
308
|
+
color: var(--color-base-500);
|
|
283
309
|
margin: 6px 0 0;
|
|
284
310
|
}
|
|
285
311
|
.sdocs-panels {
|
|
@@ -290,7 +316,7 @@
|
|
|
290
316
|
.sdocs-section-title {
|
|
291
317
|
font-size: 18px;
|
|
292
318
|
font-weight: 600;
|
|
293
|
-
color: var(--
|
|
319
|
+
color: var(--color-base-900);
|
|
294
320
|
margin: 24px 0 8px;
|
|
295
321
|
}
|
|
296
322
|
.sdocs-example {
|
|
@@ -301,7 +327,7 @@
|
|
|
301
327
|
.sdocs-example-title {
|
|
302
328
|
font-size: 15px;
|
|
303
329
|
font-weight: 600;
|
|
304
|
-
color: var(--
|
|
330
|
+
color: var(--color-base-800);
|
|
305
331
|
margin: 0;
|
|
306
332
|
}
|
|
307
333
|
.sdocs-code-block {
|
|
@@ -316,6 +342,6 @@
|
|
|
316
342
|
overflow-x: auto;
|
|
317
343
|
}
|
|
318
344
|
.sdocs-code-block :global(code) {
|
|
319
|
-
font-family: var(--
|
|
345
|
+
font-family: var(--mono);
|
|
320
346
|
}
|
|
321
347
|
</style>
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { ParsedProp, ParsedCssProp } from '
|
|
3
|
-
import TextControl from '
|
|
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';
|
|
2
|
+
import type { ParsedProp, ParsedCssProp } from '../../types.js';
|
|
3
|
+
import { Text as TextControl, Number as NumberControl, Checkbox as CheckboxControl, Color as ColorControl, Dimension as DimensionControl, Select as SelectControl } from '../../ui/Control/index.js';
|
|
9
4
|
|
|
10
5
|
interface Props {
|
|
11
6
|
componentProps: ParsedProp[];
|
|
@@ -154,7 +149,7 @@
|
|
|
154
149
|
.sdocs-controls-section-title {
|
|
155
150
|
font-size: 11px;
|
|
156
151
|
font-weight: 600;
|
|
157
|
-
color: var(--
|
|
152
|
+
color: var(--color-base-400);
|
|
158
153
|
text-transform: uppercase;
|
|
159
154
|
letter-spacing: 0.05em;
|
|
160
155
|
}
|
|
@@ -166,26 +161,26 @@
|
|
|
166
161
|
}
|
|
167
162
|
.sdocs-control-label {
|
|
168
163
|
min-width: 100px;
|
|
169
|
-
color: var(--
|
|
164
|
+
color: var(--color-base-600);
|
|
170
165
|
font-weight: 500;
|
|
171
166
|
}
|
|
172
167
|
.sdocs-control-type {
|
|
173
|
-
color: var(--
|
|
174
|
-
font-family: var(--
|
|
168
|
+
color: var(--color-base-400);
|
|
169
|
+
font-family: var(--mono);
|
|
175
170
|
font-size: 12px;
|
|
176
171
|
}
|
|
177
172
|
.sdocs-reset-btn {
|
|
178
173
|
align-self: flex-start;
|
|
179
174
|
padding: 4px 12px;
|
|
180
|
-
border: 1px solid var(--
|
|
175
|
+
border: 1px solid var(--color-base-200);
|
|
181
176
|
border-radius: 4px;
|
|
182
|
-
background: var(--
|
|
177
|
+
background: var(--color-base-0);
|
|
183
178
|
font: inherit;
|
|
184
179
|
font-size: 12px;
|
|
185
|
-
color: var(--
|
|
180
|
+
color: var(--color-base-600);
|
|
186
181
|
cursor: pointer;
|
|
187
182
|
}
|
|
188
183
|
.sdocs-reset-btn:hover {
|
|
189
|
-
background: var(--
|
|
184
|
+
background: var(--color-base-100);
|
|
190
185
|
}
|
|
191
186
|
</style>
|
|
@@ -50,28 +50,28 @@
|
|
|
50
50
|
.sdocs-table th {
|
|
51
51
|
text-align: left;
|
|
52
52
|
padding: 6px 12px;
|
|
53
|
-
border-bottom: 2px solid var(--
|
|
53
|
+
border-bottom: 2px solid var(--color-base-200);
|
|
54
54
|
font-weight: 600;
|
|
55
|
-
color: var(--
|
|
55
|
+
color: var(--color-base-600);
|
|
56
56
|
font-size: 12px;
|
|
57
57
|
}
|
|
58
58
|
.sdocs-table td {
|
|
59
59
|
padding: 6px 12px;
|
|
60
|
-
border-bottom: 1px solid var(--
|
|
61
|
-
color: var(--
|
|
60
|
+
border-bottom: 1px solid var(--color-base-100);
|
|
61
|
+
color: var(--color-base-800);
|
|
62
62
|
}
|
|
63
63
|
.sdocs-table code {
|
|
64
|
-
font-family: var(--
|
|
64
|
+
font-family: var(--mono);
|
|
65
65
|
font-size: 12px;
|
|
66
|
-
background: var(--
|
|
66
|
+
background: var(--color-base-100);
|
|
67
67
|
padding: 1px 4px;
|
|
68
68
|
border-radius: 3px;
|
|
69
69
|
}
|
|
70
70
|
.sdocs-table-empty {
|
|
71
|
-
color: var(--
|
|
71
|
+
color: var(--color-base-300);
|
|
72
72
|
}
|
|
73
73
|
.sdocs-table-none {
|
|
74
|
-
color: var(--
|
|
74
|
+
color: var(--color-base-400);
|
|
75
75
|
font-size: 13px;
|
|
76
76
|
font-style: italic;
|
|
77
77
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { DocEntry } from '
|
|
2
|
+
import type { DocEntry } from '../../types.js';
|
|
3
|
+
import { Icon } from '../../ui/Icon/index.js';
|
|
3
4
|
|
|
4
5
|
interface Props {
|
|
5
6
|
docs: DocEntry[];
|
|
@@ -15,6 +16,7 @@
|
|
|
15
16
|
|
|
16
17
|
<div class="sdocs-home">
|
|
17
18
|
<div class="sdocs-home-brand">
|
|
19
|
+
<Icon name="sdocs" --w="160px" --h="160px" --fill="#FC1D29" />
|
|
18
20
|
<h1 class="sdocs-home-logo">{logo}</h1>
|
|
19
21
|
<p class="sdocs-home-tagline">A lightweight documentation tool for Svelte 5 components.</p>
|
|
20
22
|
</div>
|
|
@@ -52,20 +54,20 @@
|
|
|
52
54
|
height: 100%;
|
|
53
55
|
min-height: 400px;
|
|
54
56
|
gap: 32px;
|
|
55
|
-
font-family: var(--
|
|
57
|
+
font-family: var(--sans);
|
|
56
58
|
}
|
|
57
59
|
.sdocs-home-brand {
|
|
58
60
|
text-align: center;
|
|
59
61
|
}
|
|
60
62
|
.sdocs-home-logo {
|
|
61
63
|
font-size: 36px;
|
|
62
|
-
font-weight:
|
|
63
|
-
color: var(--
|
|
64
|
+
font-weight: 700;
|
|
65
|
+
color: var(--color-base-900);
|
|
64
66
|
margin: 0;
|
|
65
67
|
}
|
|
66
68
|
.sdocs-home-tagline {
|
|
67
69
|
font-size: 16px;
|
|
68
|
-
color: var(--
|
|
70
|
+
color: var(--color-base-500);
|
|
69
71
|
margin: 8px 0 0;
|
|
70
72
|
}
|
|
71
73
|
.sdocs-home-stats {
|
|
@@ -79,14 +81,14 @@
|
|
|
79
81
|
display: block;
|
|
80
82
|
font-size: 28px;
|
|
81
83
|
font-weight: 700;
|
|
82
|
-
color: var(--
|
|
84
|
+
color: var(--color-action-500);
|
|
83
85
|
}
|
|
84
86
|
.sdocs-stat-label {
|
|
85
87
|
font-size: 13px;
|
|
86
|
-
color: var(--
|
|
88
|
+
color: var(--color-base-400);
|
|
87
89
|
}
|
|
88
90
|
.sdocs-home-hint {
|
|
89
91
|
font-size: 14px;
|
|
90
|
-
color: var(--
|
|
92
|
+
color: var(--color-base-400);
|
|
91
93
|
}
|
|
92
94
|
</style>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { DocEntry } from '
|
|
2
|
+
import type { DocEntry } from '../../types.js';
|
|
3
3
|
import PreviewFrame from './PreviewFrame.svelte';
|
|
4
4
|
|
|
5
5
|
interface Props {
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
display: flex;
|
|
67
67
|
gap: 24px;
|
|
68
68
|
padding: 24px 32px;
|
|
69
|
-
font-family: var(--
|
|
69
|
+
font-family: var(--sans);
|
|
70
70
|
}
|
|
71
71
|
.sdocs-page-main {
|
|
72
72
|
flex: 1;
|
|
@@ -78,12 +78,12 @@
|
|
|
78
78
|
.sdocs-view-title {
|
|
79
79
|
font-size: 24px;
|
|
80
80
|
font-weight: 700;
|
|
81
|
-
color: var(--
|
|
81
|
+
color: var(--color-base-900);
|
|
82
82
|
margin: 0;
|
|
83
83
|
}
|
|
84
84
|
.sdocs-view-description {
|
|
85
85
|
font-size: 14px;
|
|
86
|
-
color: var(--
|
|
86
|
+
color: var(--color-base-500);
|
|
87
87
|
margin: 6px 0 0;
|
|
88
88
|
}
|
|
89
89
|
.sdocs-page-content {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
font-weight: 600;
|
|
102
102
|
text-transform: uppercase;
|
|
103
103
|
letter-spacing: 0.05em;
|
|
104
|
-
color: var(--
|
|
104
|
+
color: var(--color-base-400);
|
|
105
105
|
margin: 0 0 8px;
|
|
106
106
|
}
|
|
107
107
|
.sdocs-toc-list {
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
display: block;
|
|
117
117
|
padding: 4px 0;
|
|
118
118
|
font-size: 13px;
|
|
119
|
-
color: var(--
|
|
119
|
+
color: var(--color-base-500);
|
|
120
120
|
text-decoration: none;
|
|
121
121
|
background: none;
|
|
122
122
|
border: none;
|
|
@@ -125,6 +125,6 @@
|
|
|
125
125
|
width: 100%;
|
|
126
126
|
}
|
|
127
127
|
.sdocs-toc-link:hover {
|
|
128
|
-
color: var(--
|
|
128
|
+
color: var(--color-action-500);
|
|
129
129
|
}
|
|
130
130
|
</style>
|