@flesler/cursor-canvas-web 0.0.0-stage → 1.0.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.
- package/LICENSE +21 -0
- package/README.md +211 -2
- package/dist/cursor-canvas.cjs +1 -0
- package/dist/cursor-canvas.js +1406 -0
- package/dist/runtime/index.d.ts +24 -0
- package/dist/runtime.cjs +1 -0
- package/dist/runtime.js +23 -0
- package/dist/shim/charts.d.ts +62 -0
- package/dist/shim/cursor-canvas.d.ts +278 -0
- package/dist/shim/dag.d.ts +55 -0
- package/dist/shim/diff.d.ts +23 -0
- package/dist/shim/theme.d.ts +319 -0
- package/dist/shim/todo.d.ts +22 -0
- package/dist/shim/use-tokens.d.ts +6 -0
- package/package.json +86 -4
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design tokens + tone mappings for the shim.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the real `cursor/canvas` token surface (`canvasPaletteDark/Light`,
|
|
5
|
+
* `canvasTokens`, `colorPalette`, `usageColorSequence`, `Color`) so canvases
|
|
6
|
+
* that read tokens via `useHostTheme()` or import the palettes work unchanged.
|
|
7
|
+
* Values are aligned with the Cursor dark/light themes from the SDK.
|
|
8
|
+
*/
|
|
9
|
+
export declare const canvasPaletteDark: {
|
|
10
|
+
readonly foreground: "#E4E4E4EB";
|
|
11
|
+
readonly foregroundSecondary: "#E4E4E48D";
|
|
12
|
+
readonly foregroundTertiary: "#E4E4E45E";
|
|
13
|
+
readonly foregroundQuaternary: "#E4E4E442";
|
|
14
|
+
readonly editor: "#181818";
|
|
15
|
+
readonly chrome: "#141414";
|
|
16
|
+
readonly sidebar: "#141414";
|
|
17
|
+
readonly elevated: "#181818";
|
|
18
|
+
readonly fillPrimary: "#E4E4E430";
|
|
19
|
+
readonly fillSecondary: "#E4E4E41E";
|
|
20
|
+
readonly fillTertiary: "#E4E4E411";
|
|
21
|
+
readonly fillQuaternary: "#E4E4E40A";
|
|
22
|
+
readonly strokePrimary: "#E4E4E433";
|
|
23
|
+
readonly strokeSecondary: "#E4E4E41F";
|
|
24
|
+
readonly strokeTertiary: "#E4E4E414";
|
|
25
|
+
readonly strokeFocused: "#599CE7";
|
|
26
|
+
readonly accent: "#599CE7";
|
|
27
|
+
readonly buttonBackground: "#599CE7";
|
|
28
|
+
readonly buttonForeground: "#191c22";
|
|
29
|
+
readonly buttonHoverBackground: "#6AABE9";
|
|
30
|
+
readonly link: "#87c3ff";
|
|
31
|
+
readonly diffInsertedLine: "#3FA26633";
|
|
32
|
+
readonly diffRemovedLine: "#B8004933";
|
|
33
|
+
readonly diffStripAdded: "#3FA2668F";
|
|
34
|
+
readonly diffStripRemoved: "#FC6B838F";
|
|
35
|
+
};
|
|
36
|
+
export declare const canvasPaletteLight: {
|
|
37
|
+
readonly foreground: "#141414F0";
|
|
38
|
+
readonly foregroundSecondary: "#141414BD";
|
|
39
|
+
readonly foregroundTertiary: "#1414148A";
|
|
40
|
+
readonly foregroundQuaternary: "#1414145C";
|
|
41
|
+
readonly editor: "#FCFCFC";
|
|
42
|
+
readonly chrome: "#F8F8F8";
|
|
43
|
+
readonly sidebar: "#F3F3F3";
|
|
44
|
+
readonly elevated: "#FCFCFC";
|
|
45
|
+
readonly fillPrimary: "#14141433";
|
|
46
|
+
readonly fillSecondary: "#14141424";
|
|
47
|
+
readonly fillTertiary: "#14141414";
|
|
48
|
+
readonly fillQuaternary: "#1414140F";
|
|
49
|
+
readonly strokePrimary: "#14141433";
|
|
50
|
+
readonly strokeSecondary: "#1414141F";
|
|
51
|
+
readonly strokeTertiary: "#14141414";
|
|
52
|
+
readonly strokeFocused: "#3685BF";
|
|
53
|
+
readonly accent: "#3685BF";
|
|
54
|
+
readonly buttonBackground: "#3685BF";
|
|
55
|
+
readonly buttonForeground: "#FCFCFC";
|
|
56
|
+
readonly buttonHoverBackground: "#2E76AB";
|
|
57
|
+
readonly link: "#3685BF";
|
|
58
|
+
readonly diffInsertedLine: "#1F8A651F";
|
|
59
|
+
readonly diffRemovedLine: "#CF2D5614";
|
|
60
|
+
readonly diffStripAdded: "#1F8A65CC";
|
|
61
|
+
readonly diffStripRemoved: "#CF2D56CC";
|
|
62
|
+
};
|
|
63
|
+
export interface CanvasPalette {
|
|
64
|
+
readonly foreground: string;
|
|
65
|
+
readonly foregroundSecondary: string;
|
|
66
|
+
readonly foregroundTertiary: string;
|
|
67
|
+
readonly foregroundQuaternary: string;
|
|
68
|
+
readonly editor: string;
|
|
69
|
+
readonly chrome: string;
|
|
70
|
+
readonly sidebar: string;
|
|
71
|
+
readonly elevated: string;
|
|
72
|
+
readonly fillPrimary: string;
|
|
73
|
+
readonly fillSecondary: string;
|
|
74
|
+
readonly fillTertiary: string;
|
|
75
|
+
readonly fillQuaternary: string;
|
|
76
|
+
readonly strokePrimary: string;
|
|
77
|
+
readonly strokeSecondary: string;
|
|
78
|
+
readonly strokeTertiary: string;
|
|
79
|
+
readonly strokeFocused: string;
|
|
80
|
+
readonly accent: string;
|
|
81
|
+
readonly buttonBackground: string;
|
|
82
|
+
readonly buttonForeground: string;
|
|
83
|
+
readonly buttonHoverBackground: string;
|
|
84
|
+
readonly link: string;
|
|
85
|
+
readonly diffInsertedLine: string;
|
|
86
|
+
readonly diffRemovedLine: string;
|
|
87
|
+
readonly diffStripAdded: string;
|
|
88
|
+
readonly diffStripRemoved: string;
|
|
89
|
+
}
|
|
90
|
+
export type Color = 'gray' | 'purple' | 'green' | 'yellow' | 'cyan' | 'pink' | 'blue' | 'orange' | 'red';
|
|
91
|
+
export type CategoryPalette = Readonly<Record<Color, string>>;
|
|
92
|
+
export declare const categoryPaletteDark: CategoryPalette;
|
|
93
|
+
export declare const categoryPaletteLight: CategoryPalette;
|
|
94
|
+
declare function buildTokens(palette: CanvasPalette, category: CategoryPalette): {
|
|
95
|
+
bg: {
|
|
96
|
+
editor: string;
|
|
97
|
+
chrome: string;
|
|
98
|
+
elevated: string;
|
|
99
|
+
};
|
|
100
|
+
text: {
|
|
101
|
+
primary: string;
|
|
102
|
+
secondary: string;
|
|
103
|
+
tertiary: string;
|
|
104
|
+
quaternary: string;
|
|
105
|
+
link: string;
|
|
106
|
+
onAccent: string;
|
|
107
|
+
};
|
|
108
|
+
stroke: {
|
|
109
|
+
primary: string;
|
|
110
|
+
secondary: string;
|
|
111
|
+
tertiary: string;
|
|
112
|
+
focused: string;
|
|
113
|
+
};
|
|
114
|
+
fill: {
|
|
115
|
+
primary: string;
|
|
116
|
+
secondary: string;
|
|
117
|
+
tertiary: string;
|
|
118
|
+
quaternary: string;
|
|
119
|
+
};
|
|
120
|
+
accent: {
|
|
121
|
+
primary: string;
|
|
122
|
+
control: string;
|
|
123
|
+
controlHover: string;
|
|
124
|
+
};
|
|
125
|
+
diff: {
|
|
126
|
+
insertedLine: string;
|
|
127
|
+
removedLine: string;
|
|
128
|
+
stripAdded: string;
|
|
129
|
+
stripRemoved: string;
|
|
130
|
+
};
|
|
131
|
+
category: Readonly<Record<Color, string>>;
|
|
132
|
+
};
|
|
133
|
+
export type CanvasTokens = ReturnType<typeof buildTokens>;
|
|
134
|
+
export declare const canvasTokens: {
|
|
135
|
+
bg: {
|
|
136
|
+
editor: string;
|
|
137
|
+
chrome: string;
|
|
138
|
+
elevated: string;
|
|
139
|
+
};
|
|
140
|
+
text: {
|
|
141
|
+
primary: string;
|
|
142
|
+
secondary: string;
|
|
143
|
+
tertiary: string;
|
|
144
|
+
quaternary: string;
|
|
145
|
+
link: string;
|
|
146
|
+
onAccent: string;
|
|
147
|
+
};
|
|
148
|
+
stroke: {
|
|
149
|
+
primary: string;
|
|
150
|
+
secondary: string;
|
|
151
|
+
tertiary: string;
|
|
152
|
+
focused: string;
|
|
153
|
+
};
|
|
154
|
+
fill: {
|
|
155
|
+
primary: string;
|
|
156
|
+
secondary: string;
|
|
157
|
+
tertiary: string;
|
|
158
|
+
quaternary: string;
|
|
159
|
+
};
|
|
160
|
+
accent: {
|
|
161
|
+
primary: string;
|
|
162
|
+
control: string;
|
|
163
|
+
controlHover: string;
|
|
164
|
+
};
|
|
165
|
+
diff: {
|
|
166
|
+
insertedLine: string;
|
|
167
|
+
removedLine: string;
|
|
168
|
+
stripAdded: string;
|
|
169
|
+
stripRemoved: string;
|
|
170
|
+
};
|
|
171
|
+
category: Readonly<Record<Color, string>>;
|
|
172
|
+
};
|
|
173
|
+
export declare const canvasTokensLight: {
|
|
174
|
+
bg: {
|
|
175
|
+
editor: string;
|
|
176
|
+
chrome: string;
|
|
177
|
+
elevated: string;
|
|
178
|
+
};
|
|
179
|
+
text: {
|
|
180
|
+
primary: string;
|
|
181
|
+
secondary: string;
|
|
182
|
+
tertiary: string;
|
|
183
|
+
quaternary: string;
|
|
184
|
+
link: string;
|
|
185
|
+
onAccent: string;
|
|
186
|
+
};
|
|
187
|
+
stroke: {
|
|
188
|
+
primary: string;
|
|
189
|
+
secondary: string;
|
|
190
|
+
tertiary: string;
|
|
191
|
+
focused: string;
|
|
192
|
+
};
|
|
193
|
+
fill: {
|
|
194
|
+
primary: string;
|
|
195
|
+
secondary: string;
|
|
196
|
+
tertiary: string;
|
|
197
|
+
quaternary: string;
|
|
198
|
+
};
|
|
199
|
+
accent: {
|
|
200
|
+
primary: string;
|
|
201
|
+
control: string;
|
|
202
|
+
controlHover: string;
|
|
203
|
+
};
|
|
204
|
+
diff: {
|
|
205
|
+
insertedLine: string;
|
|
206
|
+
removedLine: string;
|
|
207
|
+
stripAdded: string;
|
|
208
|
+
stripRemoved: string;
|
|
209
|
+
};
|
|
210
|
+
category: Readonly<Record<Color, string>>;
|
|
211
|
+
};
|
|
212
|
+
/** Legacy name; prefer `useHostTheme().category`. */
|
|
213
|
+
export declare const colorPalette: Readonly<Record<Color, string>>;
|
|
214
|
+
/** Auto-color rotation for `UsageBar` segments without an explicit color. */
|
|
215
|
+
export declare const usageColorSequence: readonly Color[];
|
|
216
|
+
/** Chart palette keys (IDE `canvas-tokens.d.ts` — not re-exported from SDK `index.d.ts`). */
|
|
217
|
+
export declare const chartPalette: {
|
|
218
|
+
readonly green: "#1F8A65E8";
|
|
219
|
+
readonly darkGreen: "#0D855AE0";
|
|
220
|
+
readonly lightGreen: "#52B896E0";
|
|
221
|
+
readonly mintGreen: "#7DCAB0E0";
|
|
222
|
+
readonly blue: "#2E79B5E0";
|
|
223
|
+
readonly lightBlue: "#70B0D8E0";
|
|
224
|
+
readonly indigo: "#5A6CC0F0";
|
|
225
|
+
readonly lightIndigo: "#9AAADCE0";
|
|
226
|
+
readonly purple: "#7B64B8F0";
|
|
227
|
+
readonly lightPurple: "#AA98D8E0";
|
|
228
|
+
readonly warmPink: "#C85898E0";
|
|
229
|
+
readonly lightPink: "#E8A0C4E0";
|
|
230
|
+
readonly brightOrange: "#F0A040E0";
|
|
231
|
+
readonly deepOrange: "#C06028E0";
|
|
232
|
+
readonly goldenYellow: "#E8C030E0";
|
|
233
|
+
readonly darkAmber: "#C04848E0";
|
|
234
|
+
readonly warmPeach: "#F0A088E0";
|
|
235
|
+
readonly vibrantTeal: "#2A9A8AE0";
|
|
236
|
+
readonly muted: "#8888A8E0";
|
|
237
|
+
readonly neutralLine: "#888899D0";
|
|
238
|
+
};
|
|
239
|
+
export type ChartPalette = typeof chartPalette;
|
|
240
|
+
/** Typography / spacing / radius from IDE `theme.d.ts` (available on `useHostTheme()`). */
|
|
241
|
+
export declare const canvasTypography: {
|
|
242
|
+
readonly h1: {
|
|
243
|
+
readonly fontSize: "24px";
|
|
244
|
+
readonly lineHeight: "30px";
|
|
245
|
+
readonly fontWeight: 590;
|
|
246
|
+
};
|
|
247
|
+
readonly h2: {
|
|
248
|
+
readonly fontSize: "18px";
|
|
249
|
+
readonly lineHeight: "24px";
|
|
250
|
+
readonly fontWeight: 590;
|
|
251
|
+
};
|
|
252
|
+
readonly h3: {
|
|
253
|
+
readonly fontSize: "16px";
|
|
254
|
+
readonly lineHeight: "22px";
|
|
255
|
+
readonly fontWeight: 590;
|
|
256
|
+
};
|
|
257
|
+
readonly body: {
|
|
258
|
+
readonly fontSize: "14px";
|
|
259
|
+
readonly lineHeight: "20px";
|
|
260
|
+
readonly fontWeight: 400;
|
|
261
|
+
};
|
|
262
|
+
readonly small: {
|
|
263
|
+
readonly fontSize: "12px";
|
|
264
|
+
readonly lineHeight: "16px";
|
|
265
|
+
readonly fontWeight: 400;
|
|
266
|
+
};
|
|
267
|
+
};
|
|
268
|
+
export declare const canvasSpacing: {
|
|
269
|
+
readonly '0.5': 2;
|
|
270
|
+
readonly '1': 4;
|
|
271
|
+
readonly '1.5': 6;
|
|
272
|
+
readonly '2': 8;
|
|
273
|
+
readonly '2.5': 10;
|
|
274
|
+
readonly '3': 12;
|
|
275
|
+
readonly '3.5': 14;
|
|
276
|
+
readonly '4': 16;
|
|
277
|
+
readonly '4.5': 18;
|
|
278
|
+
readonly '5': 20;
|
|
279
|
+
readonly '6': 24;
|
|
280
|
+
readonly '7': 28;
|
|
281
|
+
readonly '8': 32;
|
|
282
|
+
readonly '9': 36;
|
|
283
|
+
readonly '10': 40;
|
|
284
|
+
};
|
|
285
|
+
export declare const canvasRadius: {
|
|
286
|
+
readonly none: 0;
|
|
287
|
+
readonly xs: 2;
|
|
288
|
+
readonly sm: 4;
|
|
289
|
+
readonly md: 6;
|
|
290
|
+
readonly lg: 8;
|
|
291
|
+
readonly xl: 12;
|
|
292
|
+
readonly full: 9999;
|
|
293
|
+
};
|
|
294
|
+
/** Ordered hues for automatic chart-series coloring. */
|
|
295
|
+
export declare const chartColorSequence: readonly string[];
|
|
296
|
+
/**
|
|
297
|
+
* Maps every semantic tone literal used across primitives to a hex color, so
|
|
298
|
+
* a `Stat tone="success"` and a `ChartSeries tone="success"` match.
|
|
299
|
+
*/
|
|
300
|
+
export declare const toneHex: Record<string, string>;
|
|
301
|
+
/** Maps a semantic tone to a Mantine color name (for components that use it). */
|
|
302
|
+
export declare const toneColor: Record<string, string>;
|
|
303
|
+
/** Host theme returned by `useHostTheme()`. Extends the token groups. */
|
|
304
|
+
export interface CanvasHostTheme extends CanvasTokens {
|
|
305
|
+
readonly kind: string;
|
|
306
|
+
readonly tokens: CanvasTokens;
|
|
307
|
+
readonly palette: CanvasPalette;
|
|
308
|
+
readonly category: CategoryPalette;
|
|
309
|
+
/** Used by some IDE canvases for custom SVG; see COMPAT.md. */
|
|
310
|
+
readonly chart: {
|
|
311
|
+
readonly palette: ChartPalette;
|
|
312
|
+
readonly sequence: readonly string[];
|
|
313
|
+
};
|
|
314
|
+
readonly radius: typeof canvasRadius;
|
|
315
|
+
readonly typography: typeof canvasTypography;
|
|
316
|
+
readonly spacing: typeof canvasSpacing;
|
|
317
|
+
}
|
|
318
|
+
export declare function buildHostTheme(kind: 'light' | 'dark'): CanvasHostTheme;
|
|
319
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
export type TodoStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled';
|
|
3
|
+
export interface TodoItem {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly content: string;
|
|
6
|
+
readonly status: TodoStatus;
|
|
7
|
+
}
|
|
8
|
+
export type TodoListProps = {
|
|
9
|
+
todos: readonly TodoItem[];
|
|
10
|
+
dimmedTodoIds?: ReadonlySet<string>;
|
|
11
|
+
onTodoClick?: (todo: TodoItem) => void;
|
|
12
|
+
style?: CSSProperties;
|
|
13
|
+
};
|
|
14
|
+
export declare function TodoList({ todos, dimmedTodoIds, onTodoClick, style, }: TodoListProps): import("react").JSX.Element | null;
|
|
15
|
+
export type TodoListCardProps = {
|
|
16
|
+
todos: readonly TodoItem[];
|
|
17
|
+
dimmedTodoIds?: ReadonlySet<string>;
|
|
18
|
+
defaultExpanded?: boolean;
|
|
19
|
+
onTodoClick?: (todo: TodoItem) => void;
|
|
20
|
+
style?: CSSProperties;
|
|
21
|
+
};
|
|
22
|
+
export declare function TodoListCard({ todos, dimmedTodoIds, defaultExpanded, onTodoClick, style, }: TodoListCardProps): import("react").JSX.Element | null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,88 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flesler/cursor-canvas-web",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"repository": "github:flesler/cursor-canvas-web",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"description": "Deploy your Cursor canvases to the web.",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"cursor",
|
|
11
|
+
"canvas",
|
|
12
|
+
"mantine",
|
|
13
|
+
"react",
|
|
14
|
+
"shim"
|
|
15
|
+
],
|
|
16
|
+
"packageManager": "pnpm@11.5.2",
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22"
|
|
19
|
+
},
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"main": "./dist/cursor-canvas.cjs",
|
|
25
|
+
"module": "./dist/cursor-canvas.js",
|
|
26
|
+
"types": "./dist/shim/cursor-canvas.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/shim/cursor-canvas.d.ts",
|
|
30
|
+
"import": "./dist/cursor-canvas.js",
|
|
31
|
+
"require": "./dist/cursor-canvas.cjs"
|
|
32
|
+
},
|
|
33
|
+
"./runtime": {
|
|
34
|
+
"types": "./dist/runtime/index.d.ts",
|
|
35
|
+
"import": "./dist/runtime.js",
|
|
36
|
+
"require": "./dist/runtime.cjs"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"dev": "vite",
|
|
41
|
+
"build": "tsc --noEmit && vite build",
|
|
42
|
+
"build:lib": "vite build --config vite.lib.config.ts",
|
|
43
|
+
"preview": "vite preview",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"lint": "eslint .",
|
|
46
|
+
"format": "prettier --write .",
|
|
47
|
+
"format:check": "prettier --check .",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"test:watch": "vitest",
|
|
50
|
+
"sync:sdk": "bash scripts/sync-cursor-sdk-snapshot.sh",
|
|
51
|
+
"check:sdk-exports": "node scripts/diff-sdk-exports.mjs",
|
|
52
|
+
"test:contract": "pnpm run build:lib && pnpm run sync:sdk && node scripts/generate-contract-consumer.mjs && pnpm run check:sdk-exports && pnpm exec tsc -p test/contract/tsconfig.json",
|
|
53
|
+
"prepublishOnly": "pnpm typecheck && pnpm test && pnpm build:lib"
|
|
54
|
+
},
|
|
55
|
+
"peerDependencies": {
|
|
56
|
+
"@mantine/charts": "^8.3.0",
|
|
57
|
+
"@mantine/core": "^8.3.0",
|
|
58
|
+
"react": "^18.3.1 || ^19.0.0",
|
|
59
|
+
"react-dom": "^18.3.1 || ^19.0.0",
|
|
60
|
+
"recharts": "^2.15.0 || ^3.0.0"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@eslint/js": "^9.20.0",
|
|
64
|
+
"@mantine/charts": "^8.3.1",
|
|
65
|
+
"@mantine/core": "^8.3.1",
|
|
66
|
+
"@mantine/hooks": "^8.3.1",
|
|
67
|
+
"react": "^18.3.1",
|
|
68
|
+
"react-dom": "^18.3.1",
|
|
69
|
+
"recharts": "^2.15.0",
|
|
70
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
71
|
+
"@testing-library/react": "^16.2.0",
|
|
72
|
+
"@types/node": "^22.13.1",
|
|
73
|
+
"@types/react": "^18.3.18",
|
|
74
|
+
"@types/react-dom": "^18.3.5",
|
|
75
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
76
|
+
"eslint": "^9.20.0",
|
|
77
|
+
"eslint-plugin-react-hooks": "^5.1.0",
|
|
78
|
+
"eslint-plugin-react-refresh": "^0.4.18",
|
|
79
|
+
"globals": "^15.14.0",
|
|
80
|
+
"jsdom": "^26.0.0",
|
|
81
|
+
"prettier": "^3.5.1",
|
|
82
|
+
"typescript": "^5.7.3",
|
|
83
|
+
"typescript-eslint": "^8.24.0",
|
|
84
|
+
"vite": "^6.1.0",
|
|
85
|
+
"vite-plugin-dts": "^5.0.2",
|
|
86
|
+
"vitest": "^3.0.5"
|
|
87
|
+
}
|
|
88
|
+
}
|