@element-editor/adapter-leaflet 0.0.0-stage → 0.2.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 (119) hide show
  1. package/AGENTS.md +80 -0
  2. package/LICENSE +21 -0
  3. package/README.md +45 -2
  4. package/dist/ElementEditorControls.d.cts +111 -0
  5. package/dist/ElementEditorControls.d.ts +111 -0
  6. package/dist/adapter-leaflet.css +1 -0
  7. package/dist/components/BoundaryLayer.d.cts +5 -0
  8. package/dist/components/BoundaryLayer.d.ts +5 -0
  9. package/dist/components/DrawingLayer.d.cts +3 -0
  10. package/dist/components/DrawingLayer.d.ts +3 -0
  11. package/dist/components/DrawingPreviewLayer.d.cts +1 -0
  12. package/dist/components/DrawingPreviewLayer.d.ts +1 -0
  13. package/dist/components/FeatureInteractionLayer.d.cts +6 -0
  14. package/dist/components/FeatureInteractionLayer.d.ts +6 -0
  15. package/dist/components/GeometryProcessingPreview.d.cts +1 -0
  16. package/dist/components/GeometryProcessingPreview.d.ts +1 -0
  17. package/dist/components/MeasurePreviewLayer.d.cts +1 -0
  18. package/dist/components/MeasurePreviewLayer.d.ts +1 -0
  19. package/dist/components/MeasurementTooltip.d.cts +1 -0
  20. package/dist/components/MeasurementTooltip.d.ts +1 -0
  21. package/dist/components/PendingPointMarker.d.cts +2 -0
  22. package/dist/components/PendingPointMarker.d.ts +2 -0
  23. package/dist/components/RoutePreviewLayer.d.cts +1 -0
  24. package/dist/components/RoutePreviewLayer.d.ts +1 -0
  25. package/dist/components/SnapController.d.cts +1 -0
  26. package/dist/components/SnapController.d.ts +1 -0
  27. package/dist/components/TextLabelLayer.d.cts +10 -0
  28. package/dist/components/TextLabelLayer.d.ts +10 -0
  29. package/dist/components/TransformControls.d.cts +1 -0
  30. package/dist/components/TransformControls.d.ts +1 -0
  31. package/dist/components/featureLayers/FeatureElements.d.cts +28 -0
  32. package/dist/components/featureLayers/FeatureElements.d.ts +28 -0
  33. package/dist/components/featureLayers/GeometryCollectionLayer.d.cts +13 -0
  34. package/dist/components/featureLayers/GeometryCollectionLayer.d.ts +13 -0
  35. package/dist/components/featureLayers/LineLayer.d.cts +14 -0
  36. package/dist/components/featureLayers/LineLayer.d.ts +14 -0
  37. package/dist/components/featureLayers/MultiLineLayer.d.cts +13 -0
  38. package/dist/components/featureLayers/MultiLineLayer.d.ts +13 -0
  39. package/dist/components/featureLayers/MultiPointLayer.d.cts +12 -0
  40. package/dist/components/featureLayers/MultiPointLayer.d.ts +12 -0
  41. package/dist/components/featureLayers/MultiPolygonLayer.d.cts +13 -0
  42. package/dist/components/featureLayers/MultiPolygonLayer.d.ts +13 -0
  43. package/dist/components/featureLayers/POIMarker.d.cts +13 -0
  44. package/dist/components/featureLayers/POIMarker.d.ts +13 -0
  45. package/dist/components/featureLayers/PolygonLayer.d.cts +14 -0
  46. package/dist/components/featureLayers/PolygonLayer.d.ts +14 -0
  47. package/dist/components/featureLayers/mountQueue.d.cts +41 -0
  48. package/dist/components/featureLayers/mountQueue.d.ts +41 -0
  49. package/dist/components/featureLayers/renderer.d.cts +25 -0
  50. package/dist/components/featureLayers/renderer.d.ts +25 -0
  51. package/dist/components/featureLayers/shared.d.cts +44 -0
  52. package/dist/components/featureLayers/shared.d.ts +44 -0
  53. package/dist/components/featureLayers/useProgressiveMount.d.cts +30 -0
  54. package/dist/components/featureLayers/useProgressiveMount.d.ts +30 -0
  55. package/dist/components/previews/CirclePreview.d.cts +1 -0
  56. package/dist/components/previews/CirclePreview.d.ts +1 -0
  57. package/dist/components/previews/LinePreview.d.cts +1 -0
  58. package/dist/components/previews/LinePreview.d.ts +1 -0
  59. package/dist/components/previews/PolygonPreview.d.cts +1 -0
  60. package/dist/components/previews/PolygonPreview.d.ts +1 -0
  61. package/dist/components/previews/RectPreview.d.cts +1 -0
  62. package/dist/components/previews/RectPreview.d.ts +1 -0
  63. package/dist/components/tools/BoxSelectHandler.d.cts +16 -0
  64. package/dist/components/tools/BoxSelectHandler.d.ts +16 -0
  65. package/dist/components/tools/MapClickHandler.d.cts +6 -0
  66. package/dist/components/tools/MapClickHandler.d.ts +6 -0
  67. package/dist/components/tools/MultiDragHandler.d.cts +9 -0
  68. package/dist/components/tools/MultiDragHandler.d.ts +9 -0
  69. package/dist/components/tools/OsmTraceHandler.d.cts +1 -0
  70. package/dist/components/tools/OsmTraceHandler.d.ts +1 -0
  71. package/dist/components/tools/VertexEditor.d.cts +13 -0
  72. package/dist/components/tools/VertexEditor.d.ts +13 -0
  73. package/dist/contexts/FeatureStyleContext.d.cts +15 -0
  74. package/dist/contexts/FeatureStyleContext.d.ts +15 -0
  75. package/dist/contexts/MapControllerContext.d.cts +2 -0
  76. package/dist/contexts/MapControllerContext.d.ts +2 -0
  77. package/dist/hooks/lastPointer.d.cts +13 -0
  78. package/dist/hooks/lastPointer.d.ts +13 -0
  79. package/dist/hooks/useCursorWhileMode.d.cts +23 -0
  80. package/dist/hooks/useCursorWhileMode.d.ts +23 -0
  81. package/dist/hooks/useDuplicateDrag.d.cts +9 -0
  82. package/dist/hooks/useDuplicateDrag.d.ts +9 -0
  83. package/dist/hooks/useFeatureDrag.d.cts +20 -0
  84. package/dist/hooks/useFeatureDrag.d.ts +20 -0
  85. package/dist/hooks/useMapInteractionMachine.d.cts +13 -0
  86. package/dist/hooks/useMapInteractionMachine.d.ts +13 -0
  87. package/dist/hooks/useModifierDragCursor.d.cts +9 -0
  88. package/dist/hooks/useModifierDragCursor.d.ts +9 -0
  89. package/dist/hooks/usePartDrag.d.cts +23 -0
  90. package/dist/hooks/usePartDrag.d.ts +23 -0
  91. package/dist/index.cjs +52 -0
  92. package/dist/index.d.cts +27 -0
  93. package/dist/index.d.ts +27 -0
  94. package/dist/index.es.js +4246 -0
  95. package/dist/store/StoreContext.d.cts +1 -0
  96. package/dist/store/StoreContext.d.ts +1 -0
  97. package/dist/utils/boxSelect.d.cts +4 -0
  98. package/dist/utils/boxSelect.d.ts +4 -0
  99. package/dist/utils/dragUtils.d.cts +12 -0
  100. package/dist/utils/dragUtils.d.ts +12 -0
  101. package/dist/utils/featureTooltip.d.cts +19 -0
  102. package/dist/utils/featureTooltip.d.ts +19 -0
  103. package/dist/utils/freehandCommitFlag.d.cts +2 -0
  104. package/dist/utils/freehandCommitFlag.d.ts +2 -0
  105. package/dist/utils/freshFeature.d.cts +17 -0
  106. package/dist/utils/freshFeature.d.ts +17 -0
  107. package/dist/utils/geojson.d.cts +3 -0
  108. package/dist/utils/geojson.d.ts +3 -0
  109. package/dist/utils/measureClickFlag.d.cts +2 -0
  110. package/dist/utils/measureClickFlag.d.ts +2 -0
  111. package/dist/utils/modifierDragFlag.d.cts +2 -0
  112. package/dist/utils/modifierDragFlag.d.ts +2 -0
  113. package/dist/utils/pinPath.d.cts +2 -0
  114. package/dist/utils/pinPath.d.ts +2 -0
  115. package/dist/utils/rafThrottle.d.cts +11 -0
  116. package/dist/utils/rafThrottle.d.ts +11 -0
  117. package/dist/utils/snapping.d.cts +25 -0
  118. package/dist/utils/snapping.d.ts +25 -0
  119. package/package.json +98 -3
@@ -0,0 +1 @@
1
+ export { GeoStoreProvider, StoreContext, useDataStore, useUIStore, useGeoStore } from '@element-editor/ui';
@@ -0,0 +1 @@
1
+ export { GeoStoreProvider, StoreContext, useDataStore, useUIStore, useGeoStore } from '@element-editor/ui';
@@ -0,0 +1,4 @@
1
+ /** True when bbox [w, s, e, n] lies fully inside the lng/lat box (edges inclusive). */
2
+ export declare function bboxInside([w, s, e, n]: readonly number[], lngMin: number, latMin: number, lngMax: number, latMax: number): boolean;
3
+ /** Order-insensitive equality of two id lists (assumes neither has duplicates). */
4
+ export declare function sameIdSet(a: readonly string[], b: readonly string[]): boolean;
@@ -0,0 +1,4 @@
1
+ /** True when bbox [w, s, e, n] lies fully inside the lng/lat box (edges inclusive). */
2
+ export declare function bboxInside([w, s, e, n]: readonly number[], lngMin: number, latMin: number, lngMax: number, latMax: number): boolean;
3
+ /** Order-insensitive equality of two id lists (assumes neither has duplicates). */
4
+ export declare function sameIdSet(a: readonly string[], b: readonly string[]): boolean;
@@ -0,0 +1,12 @@
1
+ import { PathOptions } from 'leaflet';
2
+ export declare const GHOST_LINE_OPTIONS: PathOptions;
3
+ export declare const GHOST_FILL_OPTIONS: PathOptions;
4
+ /**
5
+ * Computes display and ghost coordinates for drag / duplicate-drag.
6
+ * - Normal drag: display = translated, ghost = null (feature moves)
7
+ * - Duplicate drag: display = original, ghost = translated (ghost follows cursor)
8
+ */
9
+ export declare function computeDragDisplay<T>(coords: T, effectiveDelta: [number, number] | null, isDupDrag: boolean, geometryMode: 'visual' | 'spatial'): {
10
+ display: T;
11
+ ghost: T | null;
12
+ };
@@ -0,0 +1,12 @@
1
+ import { PathOptions } from 'leaflet';
2
+ export declare const GHOST_LINE_OPTIONS: PathOptions;
3
+ export declare const GHOST_FILL_OPTIONS: PathOptions;
4
+ /**
5
+ * Computes display and ghost coordinates for drag / duplicate-drag.
6
+ * - Normal drag: display = translated, ghost = null (feature moves)
7
+ * - Duplicate drag: display = original, ghost = translated (ghost follows cursor)
8
+ */
9
+ export declare function computeDragDisplay<T>(coords: T, effectiveDelta: [number, number] | null, isDupDrag: boolean, geometryMode: 'visual' | 'spatial'): {
10
+ display: T;
11
+ ghost: T | null;
12
+ };
@@ -0,0 +1,19 @@
1
+ import { default as L } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ type UIStoreLike = {
4
+ getState: () => {
5
+ showFeatureNameOnHover: boolean;
6
+ vertexEditActive: boolean;
7
+ };
8
+ };
9
+ export declare function bindFeatureTooltip(layer: L.Layer, feature: GeoJSONFeature, uiStore: UIStoreLike, _latlng?: L.LatLng, originalEvent?: MouseEvent): void;
10
+ /** `layer`: the cursor left that feature (its mouseout), which also ends a fresh
11
+ * feature's quiet hover. `null`: just hide (mode switch, features removed, ...). */
12
+ export declare function unbindFeatureTooltip(layer: L.Layer | null): void;
13
+ /**
14
+ * Call with `true` when a ctrl/cmd/alt feature drag begins, `false` when it
15
+ * ends. While active, `bindFeatureTooltip` is a no-op and any currently
16
+ * visible tooltip is hidden immediately.
17
+ */
18
+ export declare function setFeatureDragActive(active: boolean): void;
19
+ export {};
@@ -0,0 +1,19 @@
1
+ import { default as L } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ type UIStoreLike = {
4
+ getState: () => {
5
+ showFeatureNameOnHover: boolean;
6
+ vertexEditActive: boolean;
7
+ };
8
+ };
9
+ export declare function bindFeatureTooltip(layer: L.Layer, feature: GeoJSONFeature, uiStore: UIStoreLike, _latlng?: L.LatLng, originalEvent?: MouseEvent): void;
10
+ /** `layer`: the cursor left that feature (its mouseout), which also ends a fresh
11
+ * feature's quiet hover. `null`: just hide (mode switch, features removed, ...). */
12
+ export declare function unbindFeatureTooltip(layer: L.Layer | null): void;
13
+ /**
14
+ * Call with `true` when a ctrl/cmd/alt feature drag begins, `false` when it
15
+ * ends. While active, `bindFeatureTooltip` is a no-op and any currently
16
+ * visible tooltip is hidden immediately.
17
+ */
18
+ export declare function setFeatureDragActive(active: boolean): void;
19
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function markFreehandCommit(): void;
2
+ export declare function isFreehandCommitConsumed(): boolean;
@@ -0,0 +1,2 @@
1
+ export declare function markFreehandCommit(): void;
2
+ export declare function isFreehandCommitConsumed(): boolean;
@@ -0,0 +1,17 @@
1
+ import { Map as LeafletMap } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ export declare const freshFeatureId: () => string | null;
4
+ export declare function setFreshFeature(id: string | null): void;
5
+ /** Remember just-added features that sit under the cursor (container point `p`). */
6
+ export declare function markAddedUnderCursor(map: LeafletMap, added: GeoJSONFeature[], p: {
7
+ x: number;
8
+ y: number;
9
+ }): void;
10
+ /** Drop pending features the cursor has moved away from (cheap: a handful of bboxes). */
11
+ export declare function prunePending(map: LeafletMap, p: {
12
+ x: number;
13
+ y: number;
14
+ }): void;
15
+ /** Hovering `id`: true when it's the fresh feature (its first hover may make it so). */
16
+ export declare function claimFresh(id: string): boolean;
17
+ export declare function useIsFreshFeature(id: string): boolean;
@@ -0,0 +1,17 @@
1
+ import { Map as LeafletMap } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ export declare const freshFeatureId: () => string | null;
4
+ export declare function setFreshFeature(id: string | null): void;
5
+ /** Remember just-added features that sit under the cursor (container point `p`). */
6
+ export declare function markAddedUnderCursor(map: LeafletMap, added: GeoJSONFeature[], p: {
7
+ x: number;
8
+ y: number;
9
+ }): void;
10
+ /** Drop pending features the cursor has moved away from (cheap: a handful of bboxes). */
11
+ export declare function prunePending(map: LeafletMap, p: {
12
+ x: number;
13
+ y: number;
14
+ }): void;
15
+ /** Hovering `id`: true when it's the fresh feature (its first hover may make it so). */
16
+ export declare function claimFresh(id: string): boolean;
17
+ export declare function useIsFreshFeature(id: string): boolean;
@@ -0,0 +1,3 @@
1
+ import { Position } from 'geojson';
2
+ export declare function toLeaflet(coord: Position | [number, number]): [number, number];
3
+ export declare function toGeoJSON(coord: Position | [number, number]): [number, number];
@@ -0,0 +1,3 @@
1
+ import { Position } from 'geojson';
2
+ export declare function toLeaflet(coord: Position | [number, number]): [number, number];
3
+ export declare function toGeoJSON(coord: Position | [number, number]): [number, number];
@@ -0,0 +1,2 @@
1
+ export declare function markMeasureClick(): void;
2
+ export declare function isMeasureClickConsumed(): boolean;
@@ -0,0 +1,2 @@
1
+ export declare function markMeasureClick(): void;
2
+ export declare function isMeasureClickConsumed(): boolean;
@@ -0,0 +1,2 @@
1
+ export declare function markModifierDragEnd(): void;
2
+ export declare function isModifierDragConsumed(): boolean;
@@ -0,0 +1,2 @@
1
+ export declare function markModifierDragEnd(): void;
2
+ export declare function isModifierDragConsumed(): boolean;
@@ -0,0 +1,2 @@
1
+ /** Pin outline with a see-through hole near the top; render with fill-rule="evenodd". */
2
+ export declare const PIN_PATH: string;
@@ -0,0 +1,2 @@
1
+ /** Pin outline with a see-through hole near the top; render with fill-rule="evenodd". */
2
+ export declare const PIN_PATH: string;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Coalesces high-frequency calls (mousemove, marker drag) into one call per
3
+ * animation frame, always with the latest arguments. `flush()` runs a pending
4
+ * call synchronously (call it before committing on mouseup so the commit sees
5
+ * the final cursor position); `cancel()` drops it.
6
+ */
7
+ export declare function rafThrottle<A extends unknown[]>(fn: (...args: A) => void): {
8
+ schedule(...args: A): void;
9
+ flush(): void;
10
+ cancel(): void;
11
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Coalesces high-frequency calls (mousemove, marker drag) into one call per
3
+ * animation frame, always with the latest arguments. `flush()` runs a pending
4
+ * call synchronously (call it before committing on mouseup so the commit sees
5
+ * the final cursor position); `cancel()` drops it.
6
+ */
7
+ export declare function rafThrottle<A extends unknown[]>(fn: (...args: A) => void): {
8
+ schedule(...args: A): void;
9
+ flush(): void;
10
+ cancel(): void;
11
+ };
@@ -0,0 +1,25 @@
1
+ import { Map as LeafletMap } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ export interface SnapResult {
4
+ latlng: [number, number];
5
+ isVertex: boolean;
6
+ }
7
+ /**
8
+ * Finds the closest snap point (vertex or edge) among all provided features.
9
+ * Priority is given to vertices over edges if both are within the threshold.
10
+ *
11
+ * @param lng target longitude
12
+ * @param lat target latitude
13
+ * @param map Leaflet map instance (for pixel conversions)
14
+ * @param features All features to snap against
15
+ * @param threshold Pixel distance threshold for snapping
16
+ * @param excludeFeatureIds Feature IDs to ignore (e.g. the one being dragged)
17
+ */
18
+ export declare function findSnapPoint(lng: number, lat: number, map: LeafletMap, features: GeoJSONFeature[], threshold?: number, excludeFeatureIds?: Set<string>): SnapResult | null;
19
+ /**
20
+ * Snaps a cursor coordinate to a 15-degree increment relative to the last point.
21
+ * Uses screen pixels for visual accuracy in vector editors.
22
+ */
23
+ export declare function snapToAngle(map: LeafletMap, lastCoord: [number, number], // [lng, lat]
24
+ cursorCoord: [number, number], // [lng, lat]
25
+ incrementDeg?: number): [number, number];
@@ -0,0 +1,25 @@
1
+ import { Map as LeafletMap } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ export interface SnapResult {
4
+ latlng: [number, number];
5
+ isVertex: boolean;
6
+ }
7
+ /**
8
+ * Finds the closest snap point (vertex or edge) among all provided features.
9
+ * Priority is given to vertices over edges if both are within the threshold.
10
+ *
11
+ * @param lng target longitude
12
+ * @param lat target latitude
13
+ * @param map Leaflet map instance (for pixel conversions)
14
+ * @param features All features to snap against
15
+ * @param threshold Pixel distance threshold for snapping
16
+ * @param excludeFeatureIds Feature IDs to ignore (e.g. the one being dragged)
17
+ */
18
+ export declare function findSnapPoint(lng: number, lat: number, map: LeafletMap, features: GeoJSONFeature[], threshold?: number, excludeFeatureIds?: Set<string>): SnapResult | null;
19
+ /**
20
+ * Snaps a cursor coordinate to a 15-degree increment relative to the last point.
21
+ * Uses screen pixels for visual accuracy in vector editors.
22
+ */
23
+ export declare function snapToAngle(map: LeafletMap, lastCoord: [number, number], // [lng, lat]
24
+ cursorCoord: [number, number], // [lng, lat]
25
+ incrementDeg?: number): [number, number];
package/package.json CHANGED
@@ -1,6 +1,101 @@
1
1
  {
2
2
  "name": "@element-editor/adapter-leaflet",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Add drawing, vertex editing, snapping and GeoJSON data editing to an existing Leaflet / react-leaflet map.",
5
+ "keywords": [
6
+ "element-editor",
7
+ "leaflet",
8
+ "react-leaflet",
9
+ "react",
10
+ "geojson",
11
+ "map-editor",
12
+ "drawing",
13
+ "vertex-editing",
14
+ "snapping",
15
+ "gis"
16
+ ],
17
+ "homepage": "https://elementeditor.dev",
18
+ "bugs": {
19
+ "url": "https://github.com/spatibase/element/issues"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/spatibase/element.git",
24
+ "directory": "packages/adapter-leaflet"
25
+ },
26
+ "license": "MIT",
27
+ "author": "Michal Acler",
28
+ "private": false,
29
+ "type": "module",
30
+ "sideEffects": [
31
+ "*.css"
32
+ ],
33
+ "main": "./dist/index.cjs",
34
+ "module": "./dist/index.es.js",
35
+ "types": "./dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "import": {
39
+ "types": "./dist/index.d.ts",
40
+ "default": "./dist/index.es.js"
41
+ },
42
+ "require": {
43
+ "types": "./dist/index.d.cts",
44
+ "default": "./dist/index.cjs"
45
+ }
46
+ },
47
+ "./style.css": "./dist/adapter-leaflet.css"
48
+ },
49
+ "files": [
50
+ "dist",
51
+ "LICENSE",
52
+ "README.md",
53
+ "AGENTS.md"
54
+ ],
55
+ "engines": {
56
+ "node": ">=18"
57
+ },
58
+ "publishConfig": {
59
+ "access": "public",
60
+ "provenance": true
61
+ },
62
+ "dependencies": {
63
+ "@phosphor-icons/react": "^2.1.7",
64
+ "@turf/area": "^7.3.4",
65
+ "@turf/bbox": "^7.3.4",
66
+ "@turf/boolean-intersects": "^7.3.4",
67
+ "@turf/distance": "^7.3.4",
68
+ "@turf/helpers": "^7.3.4",
69
+ "@turf/length": "^7.3.4",
70
+ "@turf/transform-rotate": "^7.3.4",
71
+ "sonner": "^2.0.7",
72
+ "@element-editor/core": "0.2.0",
73
+ "@element-editor/ui": "0.2.0"
74
+ },
75
+ "devDependencies": {
76
+ "@tailwindcss/vite": "^4.2.2",
77
+ "@types/geojson": "^7946.0.16",
78
+ "@types/leaflet": "^1.9.21",
79
+ "@types/react": "^19.0.2",
80
+ "@types/react-dom": "^19.0.2",
81
+ "@vitejs/plugin-react": "^4.7.0",
82
+ "tailwindcss": "^4.2.2",
83
+ "typescript": "~5.7.2",
84
+ "vite": "^6.4.2",
85
+ "vite-plugin-dts": "^4.5.4",
86
+ "vitest": "^4.1.0"
87
+ },
88
+ "peerDependencies": {
89
+ "leaflet": "^1.9.0",
90
+ "react": "^19.2.0",
91
+ "react-dom": "^19.2.0",
92
+ "react-leaflet": "^5.0.0"
93
+ },
94
+ "scripts": {
95
+ "build": "vite build && node ../../scripts/fix-dts.mjs",
96
+ "dev": "tsc -b --watch",
97
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.test.json",
98
+ "test": "vitest run",
99
+ "test:watch": "vitest"
100
+ }
6
101
  }