|
1 | 1 | import { generateKeyBetween } from "fractional-indexing"; |
2 | 2 | import { mount } from "svelte"; |
3 | 3 | import "prismjs/themes/prism-tomorrow.min.css"; |
4 | | -import App from "./app.svelte"; |
5 | 4 | import "./app.css"; |
| 5 | +import App from "./app.svelte"; |
6 | 6 | import { parseDesignTokens } from "./tokens"; |
| 7 | +import { |
| 8 | + isResolverFormat, |
| 9 | + parseTokenResolver, |
| 10 | + serializeTokenResolver, |
| 11 | +} from "./resolver"; |
| 12 | +import { setDataInUrl, getDataFromUrl } from "./url-data"; |
7 | 13 | import { treeState, type SetMeta } from "./state.svelte"; |
8 | | -import { getDataFromUrl } from "./url-data"; |
9 | 14 | import type { TreeNode } from "./store"; |
10 | | -import { isResolverFormat, parseTokenResolver } from "./resolver"; |
11 | 15 | import type { Preset } from "./new-project.svelte"; |
| 16 | +import type { TreeNodeMeta } from "./state.svelte"; |
12 | 17 |
|
13 | 18 | const presets: Preset[] = [ |
14 | 19 | { |
@@ -96,7 +101,21 @@ if (parsedResult.errors.length > 0) { |
96 | 101 |
|
97 | 102 | console.info(`Loaded design tokens: ${parsedResult.nodes.length} nodes`); |
98 | 103 |
|
99 | | -// Enable URL sync after initial load |
100 | | -treeState.enableUrlSync(); |
| 104 | +// Set up debounced URL sync after initial load |
| 105 | +const URL_SYNC_DEBOUNCE_MS = 300; |
| 106 | +let urlUpdateTimeout: ReturnType<typeof setTimeout> | undefined; |
| 107 | + |
| 108 | +treeState.subscribe(() => { |
| 109 | + if (urlUpdateTimeout) { |
| 110 | + clearTimeout(urlUpdateTimeout); |
| 111 | + } |
| 112 | + urlUpdateTimeout = setTimeout(() => { |
| 113 | + const allNodes = treeState.nodes() as Map<string, TreeNode<TreeNodeMeta>>; |
| 114 | + const serialized = serializeTokenResolver(allNodes); |
| 115 | + setDataInUrl(serialized).catch((error: unknown) => { |
| 116 | + console.error("Failed to sync design tokens to URL:", error); |
| 117 | + }); |
| 118 | + }, URL_SYNC_DEBOUNCE_MS); |
| 119 | +}); |
101 | 120 |
|
102 | 121 | mount(App, { target: document.body, props: { presets } }); |
0 commit comments