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.
Files changed (134) hide show
  1. package/bin/sdocs.js +1 -1
  2. package/dist/client/App.svelte +16 -39
  3. package/dist/client/App.svelte.d.ts +1 -1
  4. package/dist/client/favicon.png +0 -0
  5. package/dist/client/tree-builder.js +57 -14
  6. package/dist/client/{CollapsiblePanel.svelte → views/CollapsiblePanel.svelte} +5 -5
  7. package/dist/client/{ComponentView.svelte → views/ComponentView.svelte} +39 -13
  8. package/dist/client/{ComponentView.svelte.d.ts → views/ComponentView.svelte.d.ts} +1 -1
  9. package/dist/client/{ControlsPanel.svelte → views/ControlsPanel.svelte} +10 -15
  10. package/dist/client/{ControlsPanel.svelte.d.ts → views/ControlsPanel.svelte.d.ts} +1 -1
  11. package/dist/client/{DataTable.svelte → views/DataTable.svelte} +8 -8
  12. package/dist/client/{HomePage.svelte → views/HomePage.svelte} +10 -8
  13. package/dist/client/{HomePage.svelte.d.ts → views/HomePage.svelte.d.ts} +1 -1
  14. package/dist/client/{LayoutView.svelte → views/LayoutView.svelte} +1 -1
  15. package/dist/client/{LayoutView.svelte.d.ts → views/LayoutView.svelte.d.ts} +1 -1
  16. package/dist/client/{PageView.svelte → views/PageView.svelte} +7 -7
  17. package/dist/client/{PageView.svelte.d.ts → views/PageView.svelte.d.ts} +1 -1
  18. package/dist/client/{PreviewFrame.svelte → views/PreviewFrame.svelte} +10 -3
  19. package/dist/client/views/Sidebar.svelte +369 -0
  20. package/dist/client/{Sidebar.svelte.d.ts → views/Sidebar.svelte.d.ts} +2 -2
  21. package/dist/commands/build.js +2 -2
  22. package/dist/commands/dev.js +2 -2
  23. package/dist/commands/init.js +4 -4
  24. package/dist/commands/preview.js +1 -1
  25. package/dist/{app-gen.d.ts → server/app-gen.d.ts} +1 -1
  26. package/dist/{app-gen.js → server/app-gen.js} +4 -4
  27. package/dist/{cli.js → server/cli.js} +4 -4
  28. package/dist/{config.d.ts → server/config.d.ts} +1 -1
  29. package/dist/{config.js → server/config.js} +7 -2
  30. package/dist/server/discovery.d.ts +1 -1
  31. package/dist/server/discovery.js +1 -1
  32. package/dist/server/meta-parser.js +1 -1
  33. package/dist/server/prop-parser.js +12 -4
  34. package/dist/server/snippet-compiler.js +8 -0
  35. package/dist/server/snippet-extractor.d.ts +1 -1
  36. package/dist/server/snippet-extractor.js +40 -5
  37. package/dist/server/toc-extractor.d.ts +0 -2
  38. package/dist/server/toc-extractor.js +0 -14
  39. package/dist/types.d.ts +3 -3
  40. package/dist/ui/About.page.sdoc +37 -0
  41. package/dist/ui/Button/Button.sdoc +51 -0
  42. package/dist/ui/Button/Button.svelte +90 -0
  43. package/dist/ui/Button/Button.svelte.d.ts +27 -0
  44. package/dist/ui/Button/index.d.ts +1 -0
  45. package/dist/ui/Button/index.js +1 -0
  46. package/dist/ui/Control/Checkbox.sdoc +17 -0
  47. package/dist/{client/controls/CheckboxControl.svelte → ui/Control/Checkbox.svelte} +1 -1
  48. package/dist/ui/Control/Checkbox.svelte.d.ts +8 -0
  49. package/dist/ui/Control/Color.sdoc +17 -0
  50. package/dist/{client/controls/ColorControl.svelte → ui/Control/Color.svelte} +4 -4
  51. package/dist/ui/Control/Color.svelte.d.ts +8 -0
  52. package/dist/ui/Control/Dimension.sdoc +17 -0
  53. package/dist/{client/controls/DimensionControl.svelte → ui/Control/Dimension.svelte} +5 -5
  54. package/dist/ui/Control/Dimension.svelte.d.ts +8 -0
  55. package/dist/ui/Control/Number.sdoc +17 -0
  56. package/dist/{client/controls/NumberControl.svelte → ui/Control/Number.svelte} +4 -4
  57. package/dist/ui/Control/Number.svelte.d.ts +8 -0
  58. package/dist/ui/Control/Select.sdoc +18 -0
  59. package/dist/{client/controls/SelectControl.svelte → ui/Control/Select.svelte} +4 -4
  60. package/dist/ui/Control/Select.svelte.d.ts +9 -0
  61. package/dist/ui/Control/Text.sdoc +17 -0
  62. package/dist/{client/controls/TextControl.svelte → ui/Control/Text.svelte} +4 -4
  63. package/dist/ui/Control/Text.svelte.d.ts +8 -0
  64. package/dist/ui/Control/index.d.ts +6 -0
  65. package/dist/ui/Control/index.js +6 -0
  66. package/dist/ui/Dashboard.layout.sdoc +60 -0
  67. package/dist/ui/Frame/Frame.sdoc +54 -0
  68. package/dist/ui/Frame/Frame.svelte +88 -0
  69. package/dist/ui/Frame/Frame.svelte.d.ts +15 -0
  70. package/dist/ui/Frame/index.d.ts +1 -0
  71. package/dist/ui/Frame/index.js +1 -0
  72. package/dist/ui/Icon/Icon.sdoc +45 -0
  73. package/dist/ui/Icon/Icon.svelte +47 -0
  74. package/dist/ui/Icon/Icon.svelte.d.ts +16 -0
  75. package/dist/ui/Icon/icons/bookmark.svg +1 -0
  76. package/dist/ui/Icon/icons/chevron-down.svg +1 -0
  77. package/dist/ui/Icon/icons/chevron-left.svg +1 -0
  78. package/dist/ui/Icon/icons/chevron-right.svg +1 -0
  79. package/dist/ui/Icon/icons/chevron-up.svg +1 -0
  80. package/dist/ui/Icon/icons/code.svg +1 -0
  81. package/dist/ui/Icon/icons/component.svg +1 -0
  82. package/dist/ui/Icon/icons/copy.svg +1 -0
  83. package/dist/ui/Icon/icons/diamond.svg +1 -0
  84. package/dist/ui/Icon/icons/file-code.svg +1 -0
  85. package/dist/ui/Icon/icons/file-text.svg +1 -0
  86. package/dist/ui/Icon/icons/folder-open.svg +1 -0
  87. package/dist/ui/Icon/icons/folder.svg +1 -0
  88. package/dist/ui/Icon/icons/panels-top-left.svg +1 -0
  89. package/dist/ui/Icon/icons/sdocs.svg +8 -0
  90. package/dist/ui/Icon/index.d.ts +1 -0
  91. package/dist/ui/Icon/index.js +1 -0
  92. package/dist/ui/NavTree/Group.sdoc +46 -0
  93. package/dist/ui/NavTree/Group.svelte +82 -0
  94. package/dist/ui/NavTree/Group.svelte.d.ts +11 -0
  95. package/dist/ui/NavTree/Item.sdoc +70 -0
  96. package/dist/ui/NavTree/Item.svelte +164 -0
  97. package/dist/ui/NavTree/Item.svelte.d.ts +33 -0
  98. package/dist/ui/NavTree/NavTree.sdoc +119 -0
  99. package/dist/ui/NavTree/NavTree.svelte +31 -0
  100. package/dist/ui/NavTree/NavTree.svelte.d.ts +8 -0
  101. package/dist/ui/NavTree/index.js +6 -0
  102. package/dist/ui/Stack/Stack.sdoc +44 -0
  103. package/dist/ui/Stack/Stack.svelte +41 -0
  104. package/dist/ui/Stack/Stack.svelte.d.ts +19 -0
  105. package/dist/ui/Stack/index.d.ts +1 -0
  106. package/dist/ui/Stack/index.js +1 -0
  107. package/dist/ui/index.d.ts +6 -0
  108. package/dist/ui/index.js +6 -0
  109. package/dist/ui/styles/fonts/jetbrains-mono-italic-latin-ext.woff2 +0 -0
  110. package/dist/ui/styles/fonts/jetbrains-mono-italic-latin.woff2 +0 -0
  111. package/dist/ui/styles/fonts/jetbrains-mono-latin-ext.woff2 +0 -0
  112. package/dist/ui/styles/fonts/jetbrains-mono-latin.woff2 +0 -0
  113. package/dist/ui/styles/fonts.css +87 -0
  114. package/dist/ui/styles/theme.css +910 -0
  115. package/dist/vite.js +47 -51
  116. package/package.json +5 -2
  117. package/dist/client/Sidebar.svelte +0 -329
  118. package/dist/client/controls/CheckboxControl.svelte.d.ts +0 -8
  119. package/dist/client/controls/ColorControl.svelte.d.ts +0 -8
  120. package/dist/client/controls/DimensionControl.svelte.d.ts +0 -8
  121. package/dist/client/controls/NumberControl.svelte.d.ts +0 -8
  122. package/dist/client/controls/SelectControl.svelte.d.ts +0 -9
  123. package/dist/client/controls/TextControl.svelte.d.ts +0 -8
  124. package/dist/client/theme.css +0 -80
  125. package/dist/server/sdocx-parser.d.ts +0 -11
  126. package/dist/server/sdocx-parser.js +0 -197
  127. /package/dist/client/{CollapsiblePanel.svelte.d.ts → views/CollapsiblePanel.svelte.d.ts} +0 -0
  128. /package/dist/client/{DataTable.svelte.d.ts → views/DataTable.svelte.d.ts} +0 -0
  129. /package/dist/client/{PreviewFrame.svelte.d.ts → views/PreviewFrame.svelte.d.ts} +0 -0
  130. /package/dist/{cli.d.ts → server/cli.d.ts} +0 -0
  131. /package/dist/{client → ui/styles}/fonts/figtree-italic-latin-ext.woff2 +0 -0
  132. /package/dist/{client → ui/styles}/fonts/figtree-italic-latin.woff2 +0 -0
  133. /package/dist/{client → ui/styles}/fonts/figtree-latin-ext.woff2 +0 -0
  134. /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';
@@ -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 './theme.css';
11
+ import '../ui/styles/theme.css';
12
12
 
13
- type ThemeMode = 'light' | 'dark' | 'system';
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>('system');
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 && ['light', 'dark', 'system'].includes(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(--sdocs-bg);
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(--sdocs-border);
117
+ border: 1px solid var(--color-base-200);
140
118
  border-radius: 6px;
141
- background: var(--sdocs-bg);
119
+ background: var(--color-base-0);
142
120
  font-size: 12px;
143
- color: var(--sdocs-text);
121
+ color: var(--color-base-600);
144
122
  cursor: pointer;
145
- box-shadow: 0 1px 3px var(--sdocs-shadow);
146
- font-family: var(--sdocs-font-sans);
123
+ font-family: var(--sans);
147
124
  }
148
125
  .sdocs-exit-fullscreen:hover {
149
- background: var(--sdocs-bg-hover);
126
+ background: var(--color-base-100);
150
127
  }
151
128
  </style>
@@ -1,5 +1,5 @@
1
1
  import type { DocEntry } from '../types.js';
2
- import './theme.css';
2
+ import '../ui/styles/theme.css';
3
3
  interface Props {
4
4
  docs: DocEntry[];
5
5
  logo?: string;
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
- folder = {
26
- name: segName,
27
- type: isGroup ? 'group' : 'folder',
28
- path: [...currentPath],
29
- children: [],
30
- defaultExpanded: isGroup || sidebar?.open?.includes(segName),
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
- const componentNode = {
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.push({
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
- parent.push(componentNode);
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(--sdocs-border);
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(--sdocs-bg-subtle);
39
+ background: var(--color-base-50);
40
40
  font: inherit;
41
41
  font-size: 13px;
42
42
  font-weight: 600;
43
- color: var(--sdocs-text-heading);
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(--sdocs-bg-hover);
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(--sdocs-border);
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 '../types.js';
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(--sdocs-font-sans);
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(--sdocs-text-heading);
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(--sdocs-text-secondary);
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(--sdocs-text-heading);
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(--sdocs-text-strong);
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(--sdocs-font-mono);
345
+ font-family: var(--mono);
320
346
  }
321
347
  </style>
@@ -1,4 +1,4 @@
1
- import type { DocEntry } from '../types.js';
1
+ import type { DocEntry } from '../../types.js';
2
2
  interface Props {
3
3
  doc: DocEntry;
4
4
  /** If set, show only this example (full-page view) */
@@ -1,11 +1,6 @@
1
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';
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(--sdocs-text-muted);
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(--sdocs-text);
164
+ color: var(--color-base-600);
170
165
  font-weight: 500;
171
166
  }
172
167
  .sdocs-control-type {
173
- color: var(--sdocs-text-muted);
174
- font-family: var(--sdocs-font-mono);
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(--sdocs-border);
175
+ border: 1px solid var(--color-base-200);
181
176
  border-radius: 4px;
182
- background: var(--sdocs-bg);
177
+ background: var(--color-base-0);
183
178
  font: inherit;
184
179
  font-size: 12px;
185
- color: var(--sdocs-text);
180
+ color: var(--color-base-600);
186
181
  cursor: pointer;
187
182
  }
188
183
  .sdocs-reset-btn:hover {
189
- background: var(--sdocs-bg-hover);
184
+ background: var(--color-base-100);
190
185
  }
191
186
  </style>
@@ -1,4 +1,4 @@
1
- import type { ParsedProp, ParsedCssProp } from '../types.js';
1
+ import type { ParsedProp, ParsedCssProp } from '../../types.js';
2
2
  interface Props {
3
3
  componentProps: ParsedProp[];
4
4
  cssProps: ParsedCssProp[];
@@ -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(--sdocs-border);
53
+ border-bottom: 2px solid var(--color-base-200);
54
54
  font-weight: 600;
55
- color: var(--sdocs-text);
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(--sdocs-bg-hover);
61
- color: var(--sdocs-text-strong);
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(--sdocs-font-mono);
64
+ font-family: var(--mono);
65
65
  font-size: 12px;
66
- background: var(--sdocs-bg-hover);
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(--sdocs-border-muted);
71
+ color: var(--color-base-300);
72
72
  }
73
73
  .sdocs-table-none {
74
- color: var(--sdocs-text-muted);
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 '../types.js';
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(--sdocs-font-sans);
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: 800;
63
- color: var(--sdocs-text-heading);
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(--sdocs-text-secondary);
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(--sdocs-primary);
84
+ color: var(--color-action-500);
83
85
  }
84
86
  .sdocs-stat-label {
85
87
  font-size: 13px;
86
- color: var(--sdocs-text-muted);
88
+ color: var(--color-base-400);
87
89
  }
88
90
  .sdocs-home-hint {
89
91
  font-size: 14px;
90
- color: var(--sdocs-text-muted);
92
+ color: var(--color-base-400);
91
93
  }
92
94
  </style>
@@ -1,4 +1,4 @@
1
- import type { DocEntry } from '../types.js';
1
+ import type { DocEntry } from '../../types.js';
2
2
  interface Props {
3
3
  docs: DocEntry[];
4
4
  logo: string;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { DocEntry } from '../types.js';
2
+ import type { DocEntry } from '../../types.js';
3
3
  import PreviewFrame from './PreviewFrame.svelte';
4
4
 
5
5
  interface Props {
@@ -1,4 +1,4 @@
1
- import type { DocEntry } from '../types.js';
1
+ import type { DocEntry } from '../../types.js';
2
2
  interface Props {
3
3
  doc: DocEntry;
4
4
  activeStylesheet?: string;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { DocEntry } from '../types.js';
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(--sdocs-font-sans);
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(--sdocs-text-heading);
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(--sdocs-text-secondary);
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(--sdocs-text-muted);
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(--sdocs-text-secondary);
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(--sdocs-primary);
128
+ color: var(--color-action-500);
129
129
  }
130
130
  </style>
@@ -1,4 +1,4 @@
1
- import type { DocEntry } from '../types.js';
1
+ import type { DocEntry } from '../../types.js';
2
2
  interface Props {
3
3
  doc: DocEntry;
4
4
  activeStylesheet?: string;