@motion-proto/live-tokens 0.1.1 → 0.3.2

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 (224) hide show
  1. package/README.md +168 -21
  2. package/dist-plugin/index.cjs +823 -336
  3. package/dist-plugin/index.d.cts +9 -7
  4. package/dist-plugin/index.d.ts +9 -7
  5. package/dist-plugin/index.js +822 -335
  6. package/package.json +46 -20
  7. package/src/assets/newspaper.webp +0 -0
  8. package/src/assets/offering.webp +0 -0
  9. package/src/component-editor/BadgeEditor.svelte +170 -0
  10. package/src/component-editor/CalloutEditor.svelte +103 -0
  11. package/src/component-editor/CardEditor.svelte +184 -0
  12. package/src/component-editor/CollapsibleSectionEditor.svelte +167 -0
  13. package/src/component-editor/CornerBadgeEditor.svelte +207 -0
  14. package/src/component-editor/DialogEditor.svelte +172 -0
  15. package/src/component-editor/ImageEditor.svelte +72 -0
  16. package/src/component-editor/InlineEditActionsEditor.svelte +83 -0
  17. package/src/component-editor/NotificationEditor.svelte +160 -0
  18. package/src/component-editor/ProgressBarEditor.svelte +124 -0
  19. package/src/component-editor/RadioButtonEditor.svelte +140 -0
  20. package/src/component-editor/SectionDividerEditor.svelte +263 -0
  21. package/src/component-editor/SegmentedControlEditor.svelte +154 -0
  22. package/src/component-editor/StandardButtonsEditor.svelte +178 -0
  23. package/src/component-editor/TabBarEditor.svelte +137 -0
  24. package/src/component-editor/TableEditor.svelte +128 -0
  25. package/src/component-editor/TooltipEditor.svelte +122 -0
  26. package/src/component-editor/editorTokens.test.ts +93 -0
  27. package/src/component-editor/groupKeySlots.test.ts +67 -0
  28. package/src/component-editor/groupKeySnapshot.test.ts +52 -0
  29. package/src/component-editor/index.ts +5 -0
  30. package/src/component-editor/registry.ts +246 -0
  31. package/src/component-editor/scaffolding/AngleDial.svelte +185 -0
  32. package/src/component-editor/scaffolding/ComponentEditorBase.svelte +96 -0
  33. package/src/component-editor/scaffolding/ComponentFileManager.svelte +682 -0
  34. package/src/component-editor/scaffolding/ComponentFileMenu.svelte +312 -0
  35. package/src/component-editor/scaffolding/ComponentsTab.svelte +69 -0
  36. package/src/component-editor/scaffolding/CopyFromMenu.svelte +246 -0
  37. package/src/component-editor/scaffolding/DemoHeader.svelte +21 -0
  38. package/src/component-editor/scaffolding/DividerEditor.svelte +81 -0
  39. package/src/component-editor/scaffolding/FieldsetWrapper.svelte +46 -0
  40. package/src/component-editor/scaffolding/GradientCard.svelte +291 -0
  41. package/src/component-editor/scaffolding/LinkageChart.svelte +297 -0
  42. package/src/component-editor/scaffolding/LinkedBlock.svelte +418 -0
  43. package/src/component-editor/scaffolding/NonStylableConfig.svelte +57 -0
  44. package/src/component-editor/scaffolding/SaveAsDialog.svelte +177 -0
  45. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +25 -0
  46. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +56 -0
  47. package/src/component-editor/scaffolding/StateBlock.svelte +115 -0
  48. package/src/component-editor/scaffolding/TokenLayout.svelte +511 -0
  49. package/src/component-editor/scaffolding/TypeEditor.svelte +82 -0
  50. package/src/component-editor/scaffolding/VariantGroup.svelte +277 -0
  51. package/src/component-editor/scaffolding/buildTypeGroupTokens.ts +97 -0
  52. package/src/component-editor/scaffolding/componentSectionType.ts +8 -0
  53. package/src/component-editor/scaffolding/componentSources.ts +9 -0
  54. package/src/component-editor/scaffolding/defaultSections.ts +16 -0
  55. package/src/component-editor/scaffolding/editorContext.ts +44 -0
  56. package/src/component-editor/scaffolding/linkedBlock.ts +226 -0
  57. package/src/component-editor/scaffolding/siblings.ts +33 -0
  58. package/src/component-editor/scaffolding/types.ts +39 -0
  59. package/src/components/Badge.svelte +231 -42
  60. package/src/components/Button.svelte +324 -124
  61. package/src/components/Callout.svelte +145 -0
  62. package/src/components/Card.svelte +123 -25
  63. package/src/components/CollapsibleSection.svelte +213 -35
  64. package/src/components/CornerBadge.svelte +224 -0
  65. package/src/components/Dialog.svelte +137 -114
  66. package/src/components/Image.svelte +43 -0
  67. package/src/components/InlineEditActions.svelte +74 -14
  68. package/src/components/Notification.svelte +184 -163
  69. package/src/components/ProgressBar.svelte +216 -22
  70. package/src/components/RadioButton.svelte +110 -40
  71. package/src/components/SectionDivider.svelte +428 -74
  72. package/src/components/SegmentedControl.svelte +203 -0
  73. package/src/components/TabBar.svelte +146 -21
  74. package/src/components/Table.svelte +102 -0
  75. package/src/components/Tooltip.svelte +45 -19
  76. package/src/components/types.ts +51 -0
  77. package/src/data/google-fonts.json +75 -0
  78. package/src/lib/ColumnsOverlay.svelte +20 -7
  79. package/src/lib/LiveEditorOverlay.svelte +257 -78
  80. package/src/lib/columnsOverlay.ts +21 -17
  81. package/src/lib/componentConfig.test.ts +204 -0
  82. package/src/lib/componentConfigKeys.ts +19 -0
  83. package/src/lib/componentConfigService.ts +88 -0
  84. package/src/lib/copyPopover.ts +30 -0
  85. package/src/lib/cssVarSync.ts +59 -7
  86. package/src/lib/editorConfigStore.ts +0 -10
  87. package/src/lib/editorCore.ts +402 -0
  88. package/src/lib/editorKeybindings.ts +52 -0
  89. package/src/lib/editorPersistence.ts +106 -0
  90. package/src/lib/editorRenderer.ts +74 -0
  91. package/src/lib/editorStore.test.ts +328 -0
  92. package/src/lib/editorStore.ts +412 -0
  93. package/src/lib/editorTypes.ts +100 -0
  94. package/src/lib/editorViewStore.ts +55 -0
  95. package/src/lib/files/versionedFileResource.ts +140 -0
  96. package/src/lib/fontLoader.ts +130 -0
  97. package/src/lib/fontMigration.ts +140 -0
  98. package/src/lib/fontParse.ts +168 -0
  99. package/src/lib/index.ts +48 -30
  100. package/src/lib/lazyConfig.test.ts +54 -0
  101. package/src/lib/migrations/2026-04-24-component-prefix-and-suffix-renames.ts +64 -0
  102. package/src/lib/migrations/2026-04-24-legacy-keys-and-bg-to-canvas.ts +71 -0
  103. package/src/lib/migrations/2026-04-27-segmentedcontrol-disabled-flatten.ts +43 -0
  104. package/src/lib/migrations/2026-05-08-collapsiblesection-frame-and-cleanup.ts +68 -0
  105. package/src/lib/migrations/2026-05-08-collapsiblesection-variant-namespace.ts +35 -0
  106. package/src/lib/migrations/2026-05-10-sectiondivider-gradient-stops.ts +50 -0
  107. package/src/lib/migrations/2026-05-13-primary-to-brand.ts +90 -0
  108. package/src/lib/migrations/index.ts +93 -0
  109. package/src/lib/migrations/migrations.test.ts +341 -0
  110. package/src/lib/navLinkTypes.ts +1 -0
  111. package/src/lib/overlayState.ts +3 -0
  112. package/src/lib/paletteDerivation.ts +300 -0
  113. package/src/lib/parentRouteStore.ts +42 -0
  114. package/src/lib/parsers/globalRootBlock.ts +32 -0
  115. package/src/lib/presetService.ts +94 -0
  116. package/src/lib/router.ts +42 -10
  117. package/src/lib/scrollSection.ts +45 -0
  118. package/src/lib/slices/columns.ts +59 -0
  119. package/src/lib/slices/components.ts +362 -0
  120. package/src/lib/slices/domainVars.ts +15 -0
  121. package/src/lib/slices/fonts.ts +30 -0
  122. package/src/lib/slices/gradients.ts +153 -0
  123. package/src/lib/slices/overlays.ts +132 -0
  124. package/src/lib/slices/palettes.ts +26 -0
  125. package/src/lib/slices/shadows.ts +123 -0
  126. package/src/lib/storage.ts +88 -0
  127. package/src/lib/themeInit.ts +74 -0
  128. package/src/lib/themeService.ts +101 -0
  129. package/src/lib/themeTypes.ts +146 -0
  130. package/src/lib/tokenRegistry.ts +148 -0
  131. package/src/pages/ComponentEditorPage.svelte +384 -0
  132. package/src/pages/ComponentEditorPage.svelte.d.ts +2 -0
  133. package/src/pages/Editor.svelte +98 -0
  134. package/src/pages/Editor.svelte.d.ts +2 -0
  135. package/src/pages/EditorShell.svelte +348 -0
  136. package/src/styles/_padding.scss +34 -0
  137. package/src/styles/fonts/Fraunces/Fraunces-italic-latin-ext.woff2 +0 -0
  138. package/src/styles/fonts/Fraunces/Fraunces-italic-latin.woff2 +0 -0
  139. package/src/styles/fonts/Fraunces/Fraunces-roman-latin-ext.woff2 +0 -0
  140. package/src/styles/fonts/Fraunces/Fraunces-roman-latin.woff2 +0 -0
  141. package/src/styles/fonts/Manrope/Manrope-latin-ext.woff2 +0 -0
  142. package/src/styles/fonts/Manrope/Manrope-latin.woff2 +0 -0
  143. package/src/styles/fonts.css +22 -10
  144. package/src/styles/form-controls.css +14 -16
  145. package/src/styles/tokens.css +1322 -0
  146. package/src/styles/ui-editor.css +126 -0
  147. package/src/{showcase → ui}/BezierCurveEditor.svelte +14 -14
  148. package/src/{showcase → ui}/ColorEditPanel.svelte +42 -36
  149. package/src/ui/EditorViewSwitcher.svelte +180 -0
  150. package/src/ui/FontStackEditor.svelte +360 -0
  151. package/src/ui/GradientEditor.svelte +461 -0
  152. package/src/ui/GradientStopPicker.svelte +74 -0
  153. package/src/ui/PaletteEditor.svelte +1590 -0
  154. package/src/ui/PaletteEditor.test.ts +108 -0
  155. package/src/ui/PresetFileManager.svelte +567 -0
  156. package/src/ui/ProjectFontsSection.svelte +645 -0
  157. package/src/{showcase → ui}/SurfacesTab.svelte +39 -39
  158. package/src/{showcase → ui}/TextTab.svelte +27 -27
  159. package/src/{showcase/TokenFileManager.svelte → ui/ThemeFileManager.svelte} +196 -112
  160. package/src/ui/Toggle.svelte +108 -0
  161. package/src/ui/UICopyPopover.svelte +78 -0
  162. package/src/{showcase/EditorDialog.svelte → ui/UIDialog.svelte} +66 -25
  163. package/src/ui/UIFontFamilySelector.svelte +309 -0
  164. package/src/ui/UIFontSizeSelector.svelte +165 -0
  165. package/src/ui/UIFontWeightSelector.svelte +52 -0
  166. package/src/ui/UILineHeightSelector.svelte +47 -0
  167. package/src/ui/UILinkToggle.svelte +60 -0
  168. package/src/ui/UIOptionItem.svelte +74 -0
  169. package/src/ui/UIOptionList.svelte +27 -0
  170. package/src/ui/UIPaddingSelector.svelte +661 -0
  171. package/src/ui/UIPaletteSelector.svelte +1084 -0
  172. package/src/ui/UIRadio.svelte +72 -0
  173. package/src/ui/UIRadioGroup.svelte +59 -0
  174. package/src/ui/UIRelinkConfirmPopover.svelte +235 -0
  175. package/src/ui/UITokenSelector.svelte +509 -0
  176. package/src/ui/UIVariantSelector.svelte +145 -0
  177. package/src/ui/VariablesTab.svelte +252 -0
  178. package/src/ui/index.ts +31 -0
  179. package/src/ui/keepInViewport.ts +84 -0
  180. package/src/ui/palette/GradientStopEditor.svelte +482 -0
  181. package/src/ui/palette/OverridesPanel.svelte +526 -0
  182. package/src/ui/palette/PaletteBase.svelte +165 -0
  183. package/src/ui/palette/ScaleCurveEditor.svelte +38 -0
  184. package/src/ui/palette/paletteEditorState.ts +89 -0
  185. package/src/ui/sections/ColumnsSection.svelte +273 -0
  186. package/src/ui/sections/GradientsSection.svelte +147 -0
  187. package/src/ui/sections/OverlaysSection.svelte +670 -0
  188. package/src/ui/sections/ShadowsSection.svelte +1250 -0
  189. package/src/ui/sections/TokenScaleTable.svelte +332 -0
  190. package/src/ui/sections/tokenScales.ts +81 -0
  191. package/src/ui/variantScales.ts +108 -0
  192. package/src/components/DetailNav.svelte +0 -78
  193. package/src/components/Toggle.svelte +0 -86
  194. package/src/lib/tokenInit.ts +0 -29
  195. package/src/lib/tokenService.ts +0 -144
  196. package/src/lib/tokenTypes.ts +0 -45
  197. package/src/pages/Admin.svelte +0 -100
  198. package/src/pages/ShowcasePage.svelte +0 -144
  199. package/src/showcase/BackupBrowser.svelte +0 -617
  200. package/src/showcase/ComponentsTab.svelte +0 -105
  201. package/src/showcase/PaletteEditor.svelte +0 -2579
  202. package/src/showcase/PaletteSelector.svelte +0 -627
  203. package/src/showcase/TokenMap.svelte +0 -54
  204. package/src/showcase/VariablesTab.svelte +0 -2655
  205. package/src/showcase/VisualsTab.svelte +0 -231
  206. package/src/showcase/demos/BadgeDemo.svelte +0 -56
  207. package/src/showcase/demos/CardDemo.svelte +0 -50
  208. package/src/showcase/demos/ChoiceButtonsDemo.svelte +0 -192
  209. package/src/showcase/demos/CollapsibleSectionDemo.svelte +0 -54
  210. package/src/showcase/demos/DialogDemo.svelte +0 -42
  211. package/src/showcase/demos/InlineEditActionsDemo.svelte +0 -25
  212. package/src/showcase/demos/NotificationDemo.svelte +0 -147
  213. package/src/showcase/demos/ProgressBarDemo.svelte +0 -54
  214. package/src/showcase/demos/RadioButtonDemo.svelte +0 -56
  215. package/src/showcase/demos/SectionDividerDemo.svelte +0 -77
  216. package/src/showcase/demos/StandardButtonsDemo.svelte +0 -455
  217. package/src/showcase/demos/TabBarDemo.svelte +0 -58
  218. package/src/showcase/demos/TooltipDemo.svelte +0 -52
  219. package/src/showcase/editor.css +0 -93
  220. package/src/showcase/index.ts +0 -17
  221. package/src/styles/fonts/Domine/Domine-VariableFont_wght.ttf +0 -0
  222. package/src/styles/fonts/Domine/OFL.txt +0 -97
  223. package/src/styles/fonts/Domine/README.txt +0 -66
  224. /package/src/{showcase → ui}/curveEngine.ts +0 -0
@@ -1,231 +0,0 @@
1
- <script lang="ts">
2
- import { tick } from 'svelte';
3
- import VariablesTab from './VariablesTab.svelte';
4
- import TokenFileManager from './TokenFileManager.svelte';
5
- import type { TokenFile } from '../lib/tokenTypes';
6
- import {
7
- saveTokenFile,
8
- loadTokenFile,
9
- setActiveFile,
10
- scrapeCssVariables,
11
- clearAllCssVarOverrides,
12
- applyCssVariables,
13
- } from '../lib/tokenService';
14
- import { editorConfigs, activeFileName, configsLoadedFromFile } from '../lib/editorConfigStore';
15
- import { get } from 'svelte/store';
16
-
17
- const tokenNavItems = [
18
- { id: 'palette-editor', label: 'Palette Editor' },
19
- { id: 'spacing', label: 'Spacing' },
20
- { id: 'columns', label: 'Columns' },
21
- { id: 'border-radius', label: 'Border Radius' },
22
- { id: 'typography', label: 'Typography' },
23
- { id: 'shadows', label: 'Shadows' },
24
- { id: 'overlays', label: 'Overlays' },
25
- { id: 'gradients', label: 'Gradients' },
26
- { id: 'utility-tokens', label: 'Utility Tokens' }
27
- ];
28
-
29
- let selectedTokenSection: string | null = null;
30
-
31
- function scrollToSection(sectionId: string) {
32
- selectedTokenSection = sectionId;
33
- document.getElementById(sectionId)?.scrollIntoView({ behavior: 'smooth' });
34
- }
35
-
36
- let saveSignal = 0;
37
- let saveStatus: 'idle' | 'saving' | 'saved' | 'error' = 'idle';
38
-
39
- async function handleSave(e: CustomEvent<{ fileName: string; displayName: string }>) {
40
- const { fileName, displayName } = e.detail;
41
- if (!get(configsLoadedFromFile)) {
42
- saveStatus = 'error';
43
- console.warn('Save blocked: editor configs were not loaded from a token file.');
44
- setTimeout(() => { saveStatus = 'idle'; }, 3000);
45
- return;
46
- }
47
- saveStatus = 'saving';
48
- try {
49
- // Flush pending Svelte reactive updates so inline CSS vars are current
50
- await tick();
51
- const cssVariables = scrapeCssVariables();
52
- const configs = get(editorConfigs);
53
- const now = new Date().toISOString();
54
- const tokenFile: TokenFile = {
55
- name: displayName,
56
- createdAt: now,
57
- updatedAt: now,
58
- editorConfigs: configs,
59
- cssVariables,
60
- };
61
- await saveTokenFile(fileName, tokenFile);
62
- await setActiveFile(fileName);
63
- $activeFileName = fileName;
64
- // Also trigger localStorage save in all PaletteEditors
65
- saveSignal++;
66
- saveStatus = 'saved';
67
- setTimeout(() => { saveStatus = 'idle'; }, 2000);
68
- } catch {
69
- saveStatus = 'error';
70
- setTimeout(() => { saveStatus = 'idle'; }, 3000);
71
- }
72
- }
73
-
74
- let variablesTab: VariablesTab;
75
-
76
- async function handleLoad(e: CustomEvent<{ fileName: string }>) {
77
- const { fileName } = e.detail;
78
- try {
79
- const tokenFile = await loadTokenFile(fileName);
80
- // Clear current inline CSS vars so stale values don't linger
81
- clearAllCssVarOverrides();
82
- // Immediately apply the file's pre-computed CSS variables so the site
83
- // updates in one shot (shadows, overlays, and all palette vars).
84
- if (tokenFile.cssVariables && Object.keys(tokenFile.cssVariables).length > 0) {
85
- applyCssVariables(tokenFile.cssVariables);
86
- }
87
- // Directly push configs to each PaletteEditor via method call
88
- if (tokenFile.editorConfigs && Object.keys(tokenFile.editorConfigs).length > 0) {
89
- variablesTab.loadAllConfigs(tokenFile.editorConfigs);
90
- configsLoadedFromFile.set(true);
91
- }
92
- } catch {
93
- // silent — the UI still shows current state
94
- }
95
- }
96
- </script>
97
-
98
- <div class="layout">
99
- <nav class="sidebar">
100
- <div class="sidebar-header">Variables &amp; Tokens</div>
101
-
102
- <div class="nav-items">
103
- {#each tokenNavItems as item}
104
- <button
105
- class="nav-item"
106
- class:active={selectedTokenSection === item.id}
107
- on:click={() => scrollToSection(item.id)}
108
- >
109
- <span>{item.label}</span>
110
- </button>
111
- {/each}
112
- </div>
113
-
114
- <div class="sidebar-footer">
115
- <TokenFileManager {saveStatus} on:save={handleSave} on:load={handleLoad} />
116
- </div>
117
- </nav>
118
-
119
- <main class="content">
120
- <VariablesTab bind:this={variablesTab} {saveSignal} />
121
- </main>
122
- </div>
123
-
124
- <style>
125
- .layout {
126
- display: grid;
127
- grid-template-columns: 240px minmax(0, 1fr);
128
- min-height: 100vh;
129
- width: 100%;
130
- max-width: 1920px;
131
- box-sizing: border-box;
132
- }
133
-
134
- .sidebar {
135
- position: sticky;
136
- top: 0;
137
- height: calc(100vh - 52px);
138
- overflow: hidden;
139
- background: black;
140
- border-right: 1px solid var(--ui-border-faint);
141
- display: flex;
142
- z-index: 1;
143
- flex-direction: column;
144
- min-width: 0;
145
- }
146
-
147
- .sidebar-header {
148
- padding: var(--space-16) var(--space-16) var(--space-12);
149
- font-size: var(--font-lg);
150
- font-weight: var(--font-weight-bold);
151
- color: var(--ui-text-primary);
152
- }
153
-
154
- .nav-items {
155
- display: flex;
156
- flex-direction: column;
157
- gap: var(--space-2);
158
- padding: 0 var(--space-8);
159
- flex-shrink: 0;
160
- }
161
-
162
- .nav-item {
163
- display: flex;
164
- align-items: center;
165
- gap: var(--space-8);
166
- width: 100%;
167
- padding: var(--space-6) var(--space-12) var(--space-6) var(--space-24);
168
- background: none;
169
- border: none;
170
- border-radius: var(--radius-md);
171
- color: var(--ui-text-tertiary);
172
- font-size: var(--font-md);
173
- cursor: pointer;
174
- text-align: left;
175
- transition: all var(--transition-fast);
176
- }
177
-
178
- .nav-item:hover {
179
- color: var(--ui-text-secondary);
180
- background: var(--ui-hover);
181
- }
182
-
183
- .nav-item.active {
184
- color: var(--ui-text-primary);
185
- background: var(--ui-surface-high);
186
- }
187
-
188
- .content {
189
- padding: var(--space-24) var(--space-32);
190
- overflow-y: auto;
191
- background: black;
192
- min-width: 0;
193
- isolation: isolate;
194
- }
195
-
196
- /* Narrow desktop: side-by-side windows, ~1280px and below */
197
- @media (max-width: 1280px) {
198
- .layout {
199
- grid-template-columns: 200px minmax(0, 1fr);
200
- }
201
- .content {
202
- padding: var(--space-20) var(--space-20);
203
- }
204
- .nav-item {
205
- padding: var(--space-6) var(--space-8) var(--space-6) var(--space-16);
206
- }
207
- .sidebar-header {
208
- padding: var(--space-12) var(--space-12) var(--space-8);
209
- }
210
- }
211
-
212
- /* Tight desktop: very narrow, ~1024px and below */
213
- @media (max-width: 1024px) {
214
- .layout {
215
- grid-template-columns: 180px minmax(0, 1fr);
216
- }
217
- .content {
218
- padding: var(--space-16) var(--space-12);
219
- }
220
- .nav-item span {
221
- font-size: var(--font-sm);
222
- }
223
- }
224
-
225
- .sidebar-footer {
226
- flex-shrink: 0;
227
- margin-top: auto;
228
- padding: var(--space-12) var(--space-8) var(--space-16);
229
- border-top: 1px solid var(--ui-border-faint);
230
- }
231
- </style>
@@ -1,56 +0,0 @@
1
- <script lang="ts">
2
- import Badge from '../../components/Badge.svelte';
3
- import TokenMap from '../TokenMap.svelte';
4
- </script>
5
-
6
- <div class="demo-block">
7
- <h2 class="component-title">Badge Component</h2>
8
- <p class="demo-description">
9
- Pill-shaped badges with variant support. Import from <code>components/Badge.svelte</code>
10
- </p>
11
-
12
- <div class="demo-section">
13
- <div class="trait-demo-row">
14
- <Badge variant="trait">arcane</Badge>
15
- <Badge variant="trait">divine</Badge>
16
- <Badge variant="trait">primal</Badge>
17
- <Badge variant="accent">scenes</Badge>
18
- <Badge icon="fa-solid fa-dice-d20">System Agnostic</Badge>
19
- </div>
20
- </div>
21
-
22
- <div class="demo-section">
23
- <h3 class="demo-subtitle">Tokens</h3>
24
- <div class="token-sections">
25
- <TokenMap title="info" tokens={[
26
- { label: 'BG', variable: '--surface-neutral-higher' },
27
- { label: 'Border', variable: '--border-neutral-default' },
28
- { label: 'Text', variable: '--text-primary' },
29
- ]} />
30
- <TokenMap title="accent" tokens={[
31
- { label: 'BG', variable: '--surface-neutral-higher' },
32
- { label: 'Border', variable: '--border-accent' },
33
- { label: 'Text', variable: '--color-accent-300' },
34
- ]} />
35
- <TokenMap title="trait" tokens={[
36
- { label: 'BG', variable: '--surface-primary-high' },
37
- { label: 'Border', variable: '--border-primary-strong' },
38
- { label: 'Text', variable: '--text-primary' },
39
- ]} />
40
- </div>
41
- </div>
42
- </div>
43
-
44
- <style>
45
- .trait-demo-row {
46
- display: flex;
47
- gap: var(--space-8);
48
- flex-wrap: wrap;
49
- }
50
-
51
- .token-sections {
52
- display: flex;
53
- flex-direction: column;
54
- gap: var(--space-16);
55
- }
56
- </style>
@@ -1,50 +0,0 @@
1
- <script lang="ts">
2
- import Card from '../../components/Card.svelte';
3
- import TokenMap from '../TokenMap.svelte';
4
- </script>
5
-
6
- <div class="demo-block">
7
- <h2 class="component-title">Card Component</h2>
8
- <p class="demo-description">
9
- Generic card with icon, title, and slotted body. Import from <code>components/Card.svelte</code>
10
- </p>
11
-
12
- <div class="demo-section">
13
- <div class="card-demo-grid">
14
- <Card icon="fas fa-star" iconColor="var(--text-accent)" title="Featured">
15
- <p style="margin: 0;">A highlighted card with amber accent.</p>
16
- </Card>
17
-
18
- <Card icon="fas fa-shield-alt" iconColor="var(--text-info)" title="Security">
19
- <p style="margin: 0;">Card with blue icon color on hover border.</p>
20
- </Card>
21
-
22
- <Card icon="fas fa-leaf" iconColor="var(--text-success)" title="Compact" size="compact">
23
- <p style="margin: 0;">A compact-sized card variant.</p>
24
- </Card>
25
-
26
- <Card title="No Icon">
27
- <p style="margin: 0;">Cards work without icons too.</p>
28
- </Card>
29
- </div>
30
- </div>
31
-
32
- <div class="demo-section">
33
- <h3 class="demo-subtitle">Tokens</h3>
34
- <TokenMap tokens={[
35
- { label: 'Background', variable: '--surface-neutral-high' },
36
- { label: 'Border', variable: '--border-neutral-default' },
37
- { label: 'Hover Border', variable: '--border-neutral-strong' },
38
- { label: 'Title', variable: '--text-primary' },
39
- { label: 'Body', variable: '--text-secondary' },
40
- ]} />
41
- </div>
42
- </div>
43
-
44
- <style>
45
- .card-demo-grid {
46
- display: grid;
47
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
48
- gap: var(--space-16);
49
- }
50
- </style>
@@ -1,192 +0,0 @@
1
- <script lang="ts">
2
- let selectedChoice = 'option-2';
3
- function handleChoiceClick(choice: string) {
4
- selectedChoice = choice;
5
- }
6
- </script>
7
-
8
- <div class="demo-block">
9
- <h2 class="component-title">Button-Based Choice Sets</h2>
10
- <p class="demo-description">
11
- Interactive example showing all 4 visual states. Click buttons to see selection state.
12
- </p>
13
-
14
- <div class="demo-section">
15
- <h3 class="demo-subtitle">Interactive Example</h3>
16
- <div class="choice-buttons-container">
17
- <button
18
- class="choice-button"
19
- class:selected={selectedChoice === 'option-1'}
20
- on:click={() => handleChoiceClick('option-1')}
21
- >
22
- <i class="fas fa-star"></i>
23
- <span>Default/Hover</span>
24
- </button>
25
-
26
- <button
27
- class="choice-button"
28
- class:selected={selectedChoice === 'option-2'}
29
- on:click={() => handleChoiceClick('option-2')}
30
- >
31
- <i class="fas fa-check"></i>
32
- <span>Selected</span>
33
- </button>
34
-
35
- <button
36
- class="choice-button"
37
- class:selected={selectedChoice === 'option-3'}
38
- on:click={() => handleChoiceClick('option-3')}
39
- >
40
- <i class="fas fa-heart"></i>
41
- <span>Clickable</span>
42
- </button>
43
-
44
- <button
45
- class="choice-button"
46
- disabled
47
- >
48
- <i class="fas fa-ban"></i>
49
- <span>Disabled</span>
50
- </button>
51
- </div>
52
- </div>
53
-
54
- <div class="demo-section">
55
- <h3 class="demo-subtitle">State Reference</h3>
56
- <div class="state-reference">
57
- <div class="state-item">
58
- <div class="state-label">Default</div>
59
- <div class="state-details">
60
- <code>background: --surface-neutral-high</code>
61
- <code>border: 1px --border-neutral-default</code>
62
- </div>
63
- </div>
64
-
65
- <div class="state-item">
66
- <div class="state-label">Hover</div>
67
- <div class="state-details">
68
- <code>background: --surface-neutral-higher</code>
69
- <code>border-color: --border-neutral-strong</code>
70
- </div>
71
- </div>
72
-
73
- <div class="state-item">
74
- <div class="state-label">Selected</div>
75
- <div class="state-details">
76
- <code>background: --surface-success-high</code>
77
- <code>outline: 2px --border-success</code>
78
- </div>
79
- </div>
80
-
81
- <div class="state-item">
82
- <div class="state-label">Disabled</div>
83
- <div class="state-details">
84
- <code>opacity: 0.4</code>
85
- <code>cursor: not-allowed</code>
86
- </div>
87
- </div>
88
- </div>
89
- </div>
90
- </div>
91
-
92
- <style>
93
- .choice-buttons-container {
94
- display: flex;
95
- flex-wrap: wrap;
96
- gap: var(--space-10);
97
- }
98
-
99
- .choice-button {
100
- display: flex;
101
- align-items: center;
102
- gap: var(--space-8);
103
- padding: var(--space-10) var(--space-16);
104
- background: var(--ui-surface-high);
105
- border: 1px solid var(--ui-border-default);
106
- border-radius: var(--radius-lg);
107
- outline: 2px solid transparent;
108
- outline-offset: -1px;
109
- font-size: var(--font-md);
110
- font-weight: 500;
111
- color: var(--ui-text-primary);
112
- cursor: pointer;
113
- transition: all 0.2s;
114
- position: relative;
115
- overflow: hidden;
116
- }
117
-
118
- .choice-button::before {
119
- content: '';
120
- position: absolute;
121
- top: 0;
122
- left: -100%;
123
- width: 100%;
124
- height: 100%;
125
- background: linear-gradient(90deg, transparent, var(--ui-hover), transparent);
126
- transition: left 0.5s ease;
127
- }
128
-
129
- .choice-button:hover::before {
130
- left: 100%;
131
- }
132
-
133
- .choice-button i {
134
- font-size: var(--font-lg);
135
- color: var(--ui-text-secondary);
136
- transition: color 0.2s;
137
- }
138
-
139
- .choice-button:hover:not(:disabled):not(.selected) {
140
- background: var(--ui-surface-higher);
141
- border-color: var(--ui-border-strong);
142
- transform: translateY(-0.0625rem);
143
- box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.3);
144
- }
145
-
146
- .choice-button.selected {
147
- background: var(--ui-surface-highest);
148
- outline-color: var(--ui-border-strong);
149
- }
150
-
151
- .choice-button:disabled {
152
- opacity: 0.4;
153
- cursor: not-allowed;
154
- }
155
-
156
- .state-reference {
157
- display: grid;
158
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
159
- gap: var(--space-12);
160
- }
161
-
162
- .state-item {
163
- background: var(--ui-surface-low);
164
- border: 1px solid var(--ui-border-subtle);
165
- border-radius: var(--radius-md);
166
- padding: var(--space-12);
167
- display: flex;
168
- flex-direction: column;
169
- gap: var(--space-8);
170
- }
171
-
172
- .state-label {
173
- font-size: var(--font-sm);
174
- font-weight: var(--font-weight-semibold);
175
- color: var(--ui-text-primary);
176
- }
177
-
178
- .state-details {
179
- display: flex;
180
- flex-direction: column;
181
- gap: var(--space-4);
182
- }
183
-
184
- .state-details code {
185
- font-size: var(--font-xs);
186
- color: var(--ui-text-tertiary);
187
- background: var(--ui-surface-lowest);
188
- padding: var(--space-2) var(--space-4);
189
- border-radius: var(--radius-sm);
190
- font-family: var(--ui-font-mono);
191
- }
192
- </style>
@@ -1,54 +0,0 @@
1
- <script lang="ts">
2
- import CollapsibleSection from '../../components/CollapsibleSection.svelte';
3
- import TokenMap from '../TokenMap.svelte';
4
-
5
- let demoExpanded = false;
6
- </script>
7
-
8
- <div class="demo-block">
9
- <h2 class="component-title">Collapsible Section Component</h2>
10
- <p class="demo-description">
11
- Expandable section with chevron toggle. Import from <code>components/CollapsibleSection.svelte</code>
12
- </p>
13
-
14
- <div class="demo-section">
15
- <div class="collapsible-demo-wrapper">
16
- <CollapsibleSection
17
- label="Click to expand"
18
- expanded={demoExpanded}
19
- on:toggle={() => demoExpanded = !demoExpanded}
20
- />
21
- {#if demoExpanded}
22
- <div class="collapsible-demo-content">
23
- <p style="margin: 0; color: var(--text-secondary);">
24
- This content is revealed when the section is expanded. Any content can go here.
25
- </p>
26
- </div>
27
- {/if}
28
- </div>
29
- </div>
30
-
31
- <div class="demo-section">
32
- <h3 class="demo-subtitle">Tokens</h3>
33
- <TokenMap tokens={[
34
- { label: 'Active BG', variable: '--surface-primary-lowest' },
35
- { label: 'Active Border', variable: '--color-primary-400' },
36
- { label: 'Label', variable: '--text-primary' },
37
- { label: 'Toggle Icon', variable: '--text-muted' },
38
- ]} />
39
- </div>
40
- </div>
41
-
42
- <style>
43
- .collapsible-demo-wrapper {
44
- border: 1px solid var(--ui-border-subtle);
45
- border-radius: var(--radius-md);
46
- overflow: hidden;
47
- }
48
-
49
- .collapsible-demo-content {
50
- padding: var(--space-12) var(--space-16);
51
- background: var(--ui-surface-low);
52
- border-top: 1px solid var(--ui-border-faint);
53
- }
54
- </style>
@@ -1,42 +0,0 @@
1
- <script lang="ts">
2
- import Button from '../../components/Button.svelte';
3
- import Dialog from '../../components/Dialog.svelte';
4
- import TokenMap from '../TokenMap.svelte';
5
-
6
- let showDialog = false;
7
- </script>
8
-
9
- <div class="demo-block">
10
- <h2 class="component-title">Dialog Component</h2>
11
- <p class="demo-description">
12
- Modal dialog with focus management and slide-in animation. Import from <code>components/Dialog.svelte</code>
13
- </p>
14
-
15
- <div class="demo-section">
16
- <Button variant="secondary" icon="fas fa-external-link-alt" on:click={() => showDialog = true}>
17
- Open Dialog
18
- </Button>
19
-
20
- <Dialog
21
- bind:show={showDialog}
22
- title="Sample Dialog"
23
- confirmLabel="Save"
24
- cancelLabel="Cancel"
25
- on:confirm={() => showDialog = false}
26
- >
27
- <p style="color: var(--text-secondary); margin: 0;">This is the dialog body content. It supports any slotted content including forms, lists, or other components.</p>
28
- </Dialog>
29
- </div>
30
-
31
- <div class="demo-section">
32
- <h3 class="demo-subtitle">Tokens</h3>
33
- <TokenMap tokens={[
34
- { label: 'Surface', variable: '--surface-neutral-lowest' },
35
- { label: 'Border', variable: '--border-neutral-strong' },
36
- { label: 'Header BG', variable: '--empty' },
37
- { label: 'Header Border', variable: '--border-neutral-subtle' },
38
- { label: 'Title', variable: '--text-primary' },
39
- { label: 'Close Icon', variable: '--text-secondary' },
40
- ]} />
41
- </div>
42
- </div>
@@ -1,25 +0,0 @@
1
- <script lang="ts">
2
- import InlineEditActions from '../../components/InlineEditActions.svelte';
3
- </script>
4
-
5
- <div class="demo-block">
6
- <h2 class="component-title">Inline Edit Actions</h2>
7
- <p class="demo-description">
8
- Confirm/cancel button pair for inline editing. Import from <code>components/InlineEditActions.svelte</code>
9
- </p>
10
-
11
- <div class="demo-section">
12
- <div class="inline-edit-demo-row">
13
- <span style="color: var(--text-secondary);">Editing value...</span>
14
- <InlineEditActions onSave={() => {}} onCancel={() => {}} />
15
- </div>
16
- </div>
17
- </div>
18
-
19
- <style>
20
- .inline-edit-demo-row {
21
- display: flex;
22
- align-items: center;
23
- gap: var(--space-12);
24
- }
25
- </style>