@motion-proto/live-tokens 0.1.0

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 (68) hide show
  1. package/README.md +41 -0
  2. package/dist-plugin/index.cjs +444 -0
  3. package/dist-plugin/index.d.cts +12 -0
  4. package/dist-plugin/index.d.ts +12 -0
  5. package/dist-plugin/index.js +407 -0
  6. package/package.json +86 -0
  7. package/src/components/Badge.svelte +82 -0
  8. package/src/components/Button.svelte +333 -0
  9. package/src/components/Card.svelte +83 -0
  10. package/src/components/CollapsibleSection.svelte +82 -0
  11. package/src/components/DetailNav.svelte +78 -0
  12. package/src/components/Dialog.svelte +269 -0
  13. package/src/components/InlineEditActions.svelte +73 -0
  14. package/src/components/Notification.svelte +308 -0
  15. package/src/components/ProgressBar.svelte +99 -0
  16. package/src/components/RadioButton.svelte +87 -0
  17. package/src/components/SectionDivider.svelte +121 -0
  18. package/src/components/TabBar.svelte +92 -0
  19. package/src/components/Toggle.svelte +86 -0
  20. package/src/components/Tooltip.svelte +64 -0
  21. package/src/lib/ColumnsOverlay.svelte +120 -0
  22. package/src/lib/LiveEditorOverlay.svelte +467 -0
  23. package/src/lib/columnsOverlay.ts +26 -0
  24. package/src/lib/cssVarSync.ts +72 -0
  25. package/src/lib/editorConfig.ts +9 -0
  26. package/src/lib/editorConfigStore.ts +14 -0
  27. package/src/lib/index.ts +51 -0
  28. package/src/lib/oklch.ts +129 -0
  29. package/src/lib/pageSource.ts +6 -0
  30. package/src/lib/tokenInit.ts +29 -0
  31. package/src/lib/tokenService.ts +144 -0
  32. package/src/lib/tokenTypes.ts +45 -0
  33. package/src/pages/Admin.svelte +100 -0
  34. package/src/pages/ShowcasePage.svelte +146 -0
  35. package/src/showcase/BackupBrowser.svelte +617 -0
  36. package/src/showcase/BezierCurveEditor.svelte +648 -0
  37. package/src/showcase/ColorEditPanel.svelte +498 -0
  38. package/src/showcase/ComponentsTab.svelte +107 -0
  39. package/src/showcase/EditorDialog.svelte +137 -0
  40. package/src/showcase/PaletteEditor.svelte +2579 -0
  41. package/src/showcase/PaletteSelector.svelte +627 -0
  42. package/src/showcase/SurfacesTab.svelte +409 -0
  43. package/src/showcase/TextTab.svelte +205 -0
  44. package/src/showcase/TokenFileManager.svelte +683 -0
  45. package/src/showcase/TokenMap.svelte +54 -0
  46. package/src/showcase/VariablesTab.svelte +2657 -0
  47. package/src/showcase/VisualsTab.svelte +233 -0
  48. package/src/showcase/curveEngine.ts +190 -0
  49. package/src/showcase/demos/BadgeDemo.svelte +58 -0
  50. package/src/showcase/demos/CardDemo.svelte +52 -0
  51. package/src/showcase/demos/ChoiceButtonsDemo.svelte +194 -0
  52. package/src/showcase/demos/CollapsibleSectionDemo.svelte +56 -0
  53. package/src/showcase/demos/DialogDemo.svelte +42 -0
  54. package/src/showcase/demos/InlineEditActionsDemo.svelte +27 -0
  55. package/src/showcase/demos/NotificationDemo.svelte +149 -0
  56. package/src/showcase/demos/ProgressBarDemo.svelte +56 -0
  57. package/src/showcase/demos/RadioButtonDemo.svelte +58 -0
  58. package/src/showcase/demos/SectionDividerDemo.svelte +79 -0
  59. package/src/showcase/demos/StandardButtonsDemo.svelte +457 -0
  60. package/src/showcase/demos/TabBarDemo.svelte +60 -0
  61. package/src/showcase/demos/TooltipDemo.svelte +54 -0
  62. package/src/showcase/editor.css +93 -0
  63. package/src/showcase/index.ts +17 -0
  64. package/src/styles/fonts/Domine/Domine-VariableFont_wght.ttf +0 -0
  65. package/src/styles/fonts/Domine/OFL.txt +97 -0
  66. package/src/styles/fonts/Domine/README.txt +66 -0
  67. package/src/styles/fonts.css +18 -0
  68. package/src/styles/form-controls.css +190 -0
@@ -0,0 +1,333 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte';
3
+
4
+ export let disabled: boolean = false;
5
+ export let type: 'button' | 'submit' | 'reset' = 'button';
6
+ export let variant: 'primary' | 'secondary' | 'outline' | 'small_secondary' | 'success' | 'danger' | 'warning' = 'primary';
7
+ export let size: 'default' | 'small' = 'default';
8
+ export let ariaLabel: string | undefined = undefined;
9
+ export let tooltip: string | undefined = undefined;
10
+ export let icon: string | undefined = undefined;
11
+ export let iconPosition: 'left' | 'right' = 'left';
12
+ export let fullWidth: boolean = false;
13
+
14
+ const dispatch = createEventDispatcher();
15
+
16
+ function handleClick(event: MouseEvent) {
17
+ if (!disabled) {
18
+ dispatch('click', event);
19
+ }
20
+ }
21
+ </script>
22
+
23
+ <button
24
+ {type}
25
+ class="button {variant}"
26
+ class:small={size === 'small'}
27
+ class:full-width={fullWidth}
28
+ {disabled}
29
+ aria-label={ariaLabel}
30
+ data-tooltip={tooltip}
31
+ on:click={handleClick}
32
+ >
33
+ {#if icon && iconPosition === 'left'}
34
+ <i class={icon}></i>
35
+ {/if}
36
+ <slot />
37
+ {#if icon && iconPosition === 'right'}
38
+ <i class={icon}></i>
39
+ {/if}
40
+ </button>
41
+
42
+ <style lang="scss">
43
+ .button {
44
+ padding: var(--space-8) var(--space-16);
45
+ border-radius: var(--radius-md);
46
+ cursor: pointer;
47
+ font-size: var(--font-sm);
48
+ font-weight: var(--font-weight-medium);
49
+ line-height: 1.2;
50
+ letter-spacing: 0.0125rem;
51
+ display: inline-flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ gap: var(--space-8);
55
+ transition: all var(--transition-fast);
56
+ position: relative;
57
+ overflow: hidden;
58
+
59
+ &.full-width {
60
+ width: 100%;
61
+ display: flex;
62
+ }
63
+
64
+ // Shimmer effect
65
+ &::before {
66
+ content: '';
67
+ position: absolute;
68
+ top: 0;
69
+ left: -100%;
70
+ width: 100%;
71
+ height: 100%;
72
+ transition: left 0.5s ease;
73
+ }
74
+
75
+ &:hover:not(:disabled)::before {
76
+ left: 100%;
77
+ }
78
+
79
+ &:hover:not(:disabled) {
80
+ transform: translateY(-0.0625rem);
81
+ box-shadow: var(--shadow-md);
82
+ }
83
+
84
+ &:active:not(:disabled) {
85
+ transform: translateY(0);
86
+ }
87
+
88
+ &:disabled {
89
+ opacity: var(--opacity-disabled);
90
+ cursor: not-allowed;
91
+
92
+ &::before {
93
+ display: none;
94
+ }
95
+ }
96
+
97
+ // Small size modifier (applies to any variant)
98
+ &.small {
99
+ padding: var(--space-6) var(--space-12);
100
+ font-size: var(--font-xs);
101
+ font-weight: var(--font-weight-semibold);
102
+ line-height: 1.2;
103
+
104
+ :global(i) {
105
+ font-size: var(--font-xs);
106
+ font-weight: var(--font-weight-bold);
107
+ }
108
+ }
109
+
110
+ // Primary variant (default)
111
+ &.primary {
112
+ background: var(--surface-primary-high);
113
+ color: var(--text-primary);
114
+ border: 1px solid var(--border-primary);
115
+
116
+ &::before {
117
+ background: linear-gradient(90deg,
118
+ transparent,
119
+ rgba(255, 255, 255, 0.2),
120
+ transparent);
121
+ }
122
+
123
+ &:hover:not(:disabled) {
124
+ background: var(--surface-primary-higher);
125
+ border-color: var(--border-primary-strong);
126
+ }
127
+
128
+ &:active:not(:disabled) {
129
+ box-shadow: var(--shadow-sm);
130
+ }
131
+
132
+ &:disabled {
133
+ background: var(--color-neutral-700);
134
+ border-color: var(--border-neutral-faint);
135
+ color: var(--text-tertiary);
136
+ }
137
+ }
138
+
139
+ // Secondary variant
140
+ &.secondary {
141
+ background: var(--surface-neutral-high);
142
+ color: var(--text-primary);
143
+ border: 1px solid var(--border-neutral-default);
144
+
145
+ &::before {
146
+ background: linear-gradient(90deg,
147
+ transparent,
148
+ var(--hover),
149
+ transparent);
150
+ }
151
+
152
+ &:hover:not(:disabled) {
153
+ background: var(--surface-neutral-higher);
154
+ border-color: var(--border-neutral-strong);
155
+ }
156
+
157
+ &:disabled {
158
+ background: var(--color-neutral-700);
159
+ border-color: var(--border-neutral-faint);
160
+ color: var(--text-tertiary);
161
+ }
162
+ }
163
+
164
+ // Outline variant
165
+ &.outline {
166
+ background: transparent;
167
+ color: var(--text-primary);
168
+ border: 1px solid var(--border-neutral-default);
169
+
170
+ &::before {
171
+ background: linear-gradient(90deg,
172
+ transparent,
173
+ var(--hover),
174
+ transparent);
175
+ }
176
+
177
+ &:hover:not(:disabled) {
178
+ background: var(--hover-low);
179
+ border-color: var(--border-neutral-strong);
180
+ }
181
+
182
+ &:active:not(:disabled) {
183
+ background: rgba(255, 255, 255, 0.08);
184
+ }
185
+
186
+ &:disabled {
187
+ background: transparent;
188
+ border-color: var(--border-neutral-faint);
189
+ color: var(--text-tertiary);
190
+ }
191
+ }
192
+
193
+ // Small Secondary variant (matches add-structure-button)
194
+ &.small_secondary {
195
+ padding: var(--space-8) var(--space-16);
196
+ background: var(--hover);
197
+ color: var(--text-primary);
198
+ border: 1px solid var(--border-neutral-default);
199
+ font-size: var(--font-sm);
200
+ font-weight: var(--font-weight-semibold);
201
+ line-height: 1.2;
202
+
203
+ &::before {
204
+ background: linear-gradient(90deg,
205
+ transparent,
206
+ var(--hover),
207
+ transparent);
208
+ }
209
+
210
+ &:hover:not(:disabled) {
211
+ background: var(--hover-high);
212
+ border-color: var(--border-neutral-strong);
213
+ }
214
+
215
+ &:active:not(:disabled) {
216
+ background: rgba(255, 255, 255, 0.18);
217
+ }
218
+
219
+ &:disabled {
220
+ background: transparent;
221
+ border-color: var(--border-neutral-faint);
222
+ color: var(--text-tertiary);
223
+ }
224
+
225
+ :global(i) {
226
+ font-size: var(--font-sm);
227
+ font-weight: var(--font-weight-bold);
228
+
229
+ }
230
+ }
231
+
232
+ // Success variant
233
+ &.success {
234
+ background: var(--surface-success-low);
235
+ border: 2px solid var(--border-success);
236
+ color: var(--text-success);
237
+
238
+ &::before {
239
+ background: linear-gradient(90deg,
240
+ transparent,
241
+ rgba(255, 255, 255, 0.2),
242
+ transparent);
243
+ }
244
+
245
+ &:hover:not(:disabled) {
246
+ background: var(--surface-success-higher);
247
+ border-color: var(--border-success-strong);
248
+ color: var(--text-primary);
249
+ }
250
+
251
+ &:disabled {
252
+ background: var(--color-neutral-700);
253
+ border-color: var(--border-neutral-faint);
254
+ color: var(--text-tertiary);
255
+ }
256
+ }
257
+
258
+ // Danger variant
259
+ &.danger {
260
+ background: var(--surface-danger-low);
261
+ border: 2px solid var(--border-danger);
262
+ color: var(--text-danger);
263
+
264
+ &::before {
265
+ background: linear-gradient(90deg,
266
+ transparent,
267
+ rgba(0, 0, 0, 0.15),
268
+ transparent);
269
+ }
270
+
271
+ &:hover:not(:disabled) {
272
+ background: var(--surface-danger-high);
273
+ border-color: var(--border-danger-medium);
274
+ color: var(--text-primary);
275
+ }
276
+
277
+ &:disabled {
278
+ background: var(--color-neutral-700);
279
+ border-color: var(--border-neutral-faint);
280
+ color: var(--text-tertiary);
281
+ }
282
+ }
283
+
284
+ // Warning variant
285
+ &.warning {
286
+ background: var(--surface-warning-low);
287
+ border: 2px solid var(--border-warning);
288
+ color: var(--text-warning);
289
+
290
+ &::before {
291
+ background: linear-gradient(90deg,
292
+ transparent,
293
+ rgba(255, 255, 255, 0.2),
294
+ transparent);
295
+ }
296
+
297
+ &:hover:not(:disabled) {
298
+ background: var(--surface-warning-high);
299
+ border-color: var(--border-warning-medium);
300
+ color: var(--text-primary);
301
+ }
302
+
303
+ &:disabled {
304
+ background: var(--color-neutral-700);
305
+ border-color: var(--border-neutral-faint);
306
+ color: var(--text-tertiary);
307
+ }
308
+ }
309
+
310
+ :global(i) {
311
+ font-size: var(--font-sm);
312
+
313
+ &.spinning {
314
+ animation: spin 1s linear infinite;
315
+ }
316
+ }
317
+
318
+ @keyframes spin {
319
+ from { transform: rotate(0deg); }
320
+ to { transform: rotate(360deg); }
321
+ }
322
+
323
+ // Support for slotted content with special styles
324
+ :global(.badge), :global(.count), :global(.fame-count) {
325
+ font-size: var(--font-sm);
326
+ opacity: 0.9;
327
+ padding: var(--space-2) var(--space-6);
328
+ background: var(--overlay-low);
329
+ border-radius: var(--radius-sm);
330
+ margin-left: var(--space-4);
331
+ }
332
+ }
333
+ </style>
@@ -0,0 +1,83 @@
1
+ <script lang="ts">
2
+ export let icon: string = '';
3
+ export let iconColor: string = 'var(--text-secondary)';
4
+ export let title: string = '';
5
+ export let size: 'default' | 'compact' = 'default';
6
+ </script>
7
+
8
+ <div
9
+ class="card"
10
+ class:compact={size === 'compact'}
11
+ style="--card-color: {iconColor};"
12
+ >
13
+ {#if icon || title}
14
+ <div class="card-header">
15
+ {#if icon}
16
+ <i class="{icon} card-icon"></i>
17
+ {/if}
18
+ {#if title}
19
+ <span class="card-title">{title}</span>
20
+ {/if}
21
+ </div>
22
+ {/if}
23
+ <div class="card-body">
24
+ <slot />
25
+ </div>
26
+ </div>
27
+
28
+ <style>
29
+ .card {
30
+ background: var(--surface-neutral-high);
31
+ border: 1px solid var(--border-neutral-default);
32
+ border-radius: var(--radius-lg);
33
+ padding: var(--space-16);
34
+ transition: all var(--transition-fast);
35
+ display: flex;
36
+ flex-direction: column;
37
+ gap: var(--space-12);
38
+ }
39
+
40
+ .card:hover {
41
+ border-color: var(--card-color, var(--border-neutral-strong));
42
+ box-shadow: var(--shadow-md);
43
+ }
44
+
45
+ .card.compact {
46
+ padding: var(--space-8) var(--space-12);
47
+ gap: var(--space-8);
48
+ }
49
+
50
+ .card-header {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: var(--space-8);
54
+ }
55
+
56
+ .card-icon {
57
+ font-size: var(--font-lg);
58
+ color: var(--card-color, var(--text-secondary));
59
+ }
60
+
61
+ .card.compact .card-icon {
62
+ font-size: var(--font-md);
63
+ }
64
+
65
+ .card-title {
66
+ font-size: var(--font-lg);
67
+ font-weight: var(--font-weight-semibold);
68
+ color: var(--text-primary);
69
+ }
70
+
71
+ .card.compact .card-title {
72
+ font-size: var(--font-md);
73
+ }
74
+
75
+ .card-body {
76
+ color: var(--text-secondary);
77
+ font-size: var(--font-md);
78
+ }
79
+
80
+ .card.compact .card-body {
81
+ font-size: var(--font-sm);
82
+ }
83
+ </style>
@@ -0,0 +1,82 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte';
3
+
4
+ // Props
5
+ export let label: string;
6
+ export let expanded: boolean = false;
7
+ export let href: string | undefined = undefined;
8
+ export let active: boolean = false;
9
+
10
+ const dispatch = createEventDispatcher<{
11
+ toggle: void;
12
+ }>();
13
+
14
+ function handleHeaderClick(e: MouseEvent) {
15
+ if (href && active) {
16
+ e.preventDefault();
17
+ dispatch('toggle');
18
+ }
19
+ }
20
+ </script>
21
+
22
+ {#if href}
23
+ <a {href} class="section-header" class:expanded class:active on:click={handleHeaderClick}>
24
+ <div class="section-toggle">
25
+ <i class="fas fa-chevron-right toggle-icon"></i>
26
+ <span class="section-label">{label}</span>
27
+ </div>
28
+ <slot name="summary" />
29
+ </a>
30
+ {:else}
31
+ <!-- svelte-ignore a11y-click-events-have-key-events a11y-no-noninteractive-element-interactions -->
32
+ <div class="section-header" class:expanded on:click={() => dispatch('toggle')}>
33
+ <div class="section-toggle">
34
+ <i class="fas fa-chevron-right toggle-icon"></i>
35
+ <span class="section-label">{label}</span>
36
+ </div>
37
+ <slot name="summary" />
38
+ </div>
39
+ {/if}
40
+
41
+ <style lang="scss">
42
+ .section-header {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--space-12);
46
+ padding: var(--space-4) var(--space-8);
47
+ border-left: 3px solid transparent;
48
+ cursor: pointer;
49
+ text-decoration: none;
50
+ color: inherit;
51
+ transition: all var(--transition-fast);
52
+
53
+ &:hover {
54
+ background: var(--surface-bg);
55
+ }
56
+
57
+ &.expanded .toggle-icon {
58
+ transform: rotate(90deg);
59
+ }
60
+
61
+ &.active {
62
+ background: var(--surface-bg-low);
63
+ border-left-color: var(--color-primary-400);
64
+ }
65
+ }
66
+
67
+ .section-toggle {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: var(--space-8);
71
+ flex-shrink: 0;
72
+ color: var(--text-primary);
73
+ font-size: var(--font-md);
74
+ font-weight: var(--font-weight-semibold);
75
+
76
+ .toggle-icon {
77
+ font-size: var(--font-xs);
78
+ color: var(--text-muted);
79
+ transition: transform 0.15s ease;
80
+ }
81
+ }
82
+ </style>
@@ -0,0 +1,78 @@
1
+ <script lang="ts">
2
+ export let backHref: string = '/';
3
+ export let backLabel: string = 'All Modules';
4
+ </script>
5
+
6
+ <nav class="detail-nav">
7
+ <div class="nav-left">
8
+ <a href={backHref} class="back-link">
9
+ <i class="fa-solid fa-arrow-left"></i>
10
+ <span>{backLabel}</span>
11
+ </a>
12
+ </div>
13
+
14
+ {#if $$slots.default}
15
+ <div class="nav-right">
16
+ <slot />
17
+ </div>
18
+ {/if}
19
+ </nav>
20
+
21
+ <style lang="scss">
22
+ .detail-nav {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ gap: 12px;
27
+ margin-bottom: 24px;
28
+ flex-wrap: wrap;
29
+ position: sticky;
30
+ top: 96px;
31
+ z-index: 50;
32
+ background: var(--empty);
33
+ padding: 12px 0;
34
+ }
35
+
36
+ .nav-left {
37
+ flex-shrink: 0;
38
+ }
39
+
40
+ .back-link {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ gap: 8px;
44
+ font-family: var(--font-sans);
45
+ font-size: var(--font-lg);
46
+ font-weight: var(--font-weight-semibold);
47
+ color: var(--text-primary);
48
+ text-decoration: none;
49
+ transition: color var(--transition-fast);
50
+ letter-spacing: 0.02em;
51
+
52
+ &:hover {
53
+ color: var(--text-primary-color);
54
+ }
55
+
56
+ :global(i) {
57
+ font-size: 11px;
58
+ transition: transform var(--transition-fast);
59
+ }
60
+
61
+ &:hover :global(i) {
62
+ transform: translateX(-3px);
63
+ }
64
+ }
65
+
66
+ .nav-right {
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 6px;
70
+ flex-shrink: 0;
71
+ }
72
+
73
+ @media (max-width: 600px) {
74
+ .detail-nav {
75
+ top: 48px;
76
+ }
77
+ }
78
+ </style>