choropleth-kit 0.0.0-stage → 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.
@@ -0,0 +1,417 @@
1
+ /* src/react/styles.css */
2
+ @media (prefers-reduced-motion: reduce) {
3
+ .cm-root {
4
+ --cm-transition-duration: 0ms;
5
+ }
6
+ }
7
+ :where(.cm-root:not([data-unstyled])) {
8
+ background: var(--cm-background, transparent);
9
+ color: var(--cm-label-color, inherit);
10
+ font-family: var(--cm-font-family, inherit);
11
+ font-size: var(--cm-font-size, 12px);
12
+ }
13
+ :where(.cm-root:not([data-unstyled])) .cm-region {
14
+ transition: fill var(--cm-transition-duration, 250ms), opacity var(--cm-transition-duration, 250ms);
15
+ }
16
+ :where(.cm-root:not([data-unstyled])) .cm-regions[data-outlined] .cm-region {
17
+ stroke: var(--cm-border-color, #ffffff);
18
+ stroke-width: var(--cm-border-width, 0.5px);
19
+ vector-effect: non-scaling-stroke;
20
+ }
21
+ :where(.cm-root:not([data-unstyled])) .cm-borders {
22
+ fill: none;
23
+ stroke: var(--cm-border-color, #ffffff);
24
+ stroke-width: var(--cm-border-width, 0.5px);
25
+ vector-effect: non-scaling-stroke;
26
+ }
27
+ :where(.cm-root:not([data-unstyled])) .cm-selection :is(path, circle) {
28
+ fill: none;
29
+ vector-effect: non-scaling-stroke;
30
+ }
31
+ :where(.cm-root:not([data-unstyled])) .cm-selection [data-selection=hover] {
32
+ stroke: var(--cm-hover-stroke, #000000);
33
+ stroke-width: var(--cm-hover-stroke-width, 1.5px);
34
+ }
35
+ :where(.cm-root:not([data-unstyled])) .cm-selection [data-selection=selected] {
36
+ stroke: var(--cm-selected-stroke, #0b5fff);
37
+ stroke-width: var(--cm-selected-stroke-width, 2px);
38
+ }
39
+ :where(.cm-root:not([data-unstyled])) .cm-bubble {
40
+ stroke: var(--cm-bubble-stroke, #ffffff);
41
+ stroke-width: 0.5px;
42
+ fill-opacity: var(--cm-bubble-opacity, 0.75);
43
+ transform: scale(var(--cm-bubble-scale, 1));
44
+ transform-box: fill-box;
45
+ transform-origin: center;
46
+ vector-effect: non-scaling-stroke;
47
+ transition: r var(--cm-transition-duration, 250ms), fill var(--cm-transition-duration, 250ms);
48
+ }
49
+ :where(.cm-root:not([data-unstyled])) .cm-region[data-drillable] {
50
+ cursor: zoom-in;
51
+ }
52
+ :where(.cm-root:not([data-unstyled])) .cm-fallback-point {
53
+ stroke: var(--cm-bubble-stroke, #ffffff);
54
+ stroke-width: 1px;
55
+ vector-effect: non-scaling-stroke;
56
+ }
57
+ :where(.cm-root:not([data-unstyled]))[data-zoomed] .cm-svg {
58
+ cursor: grab;
59
+ }
60
+ :where(.cm-root:not([data-unstyled]))[data-interacting] .cm-svg {
61
+ cursor: grabbing;
62
+ }
63
+ :where(.cm-root:not([data-unstyled]))[data-interacting] :is(.cm-regions, .cm-bubbles, .cm-fallback-points) {
64
+ pointer-events: none;
65
+ }
66
+ :where(.cm-root:not([data-unstyled]))[data-interacting] .cm-region {
67
+ transition: none;
68
+ }
69
+ :where(.cm-root:not([data-unstyled]))[data-interacting] .cm-tooltip {
70
+ display: none;
71
+ }
72
+ :where(.cm-root:not([data-unstyled])) .cm-svg:focus-visible {
73
+ outline: var(--cm-focus-ring-width, 2px) solid var(--cm-focus-ring, #0b5fff);
74
+ outline-offset: -2px;
75
+ }
76
+ :where(.cm-root:not([data-unstyled])) .cm-zoom-controls {
77
+ display: flex;
78
+ flex-direction: column;
79
+ background: var(--cm-control-bg, #ffffff);
80
+ border: 1px solid var(--cm-control-border, #cccccc);
81
+ border-radius: var(--cm-control-radius, 6px);
82
+ overflow: hidden;
83
+ box-shadow: 0 1px 3px rgb(0 0 0 / 0.15);
84
+ }
85
+ :where(.cm-root:not([data-unstyled])) .cm-zoom-button {
86
+ width: 32px;
87
+ height: 32px;
88
+ padding: 0;
89
+ border: 0;
90
+ background: transparent;
91
+ color: var(--cm-control-color, #111111);
92
+ font: inherit;
93
+ font-size: 18px;
94
+ line-height: 1;
95
+ cursor: pointer;
96
+ }
97
+ :where(.cm-root:not([data-unstyled])) .cm-zoom-button + .cm-zoom-button {
98
+ border-top: 1px solid var(--cm-control-border, #cccccc);
99
+ }
100
+ :where(.cm-root:not([data-unstyled])) .cm-zoom-button:hover:not(:disabled) {
101
+ background: var( --cm-control-hover-bg, color-mix(in srgb, var(--cm-control-bg, #ffffff), var(--cm-control-color, #111111) 10%) );
102
+ }
103
+ :where(.cm-root:not([data-unstyled])) .cm-zoom-button:focus-visible {
104
+ outline: var(--cm-focus-ring-width, 2px) solid var(--cm-focus-ring, #0b5fff);
105
+ outline-offset: -2px;
106
+ }
107
+ :where(.cm-root:not([data-unstyled])) .cm-zoom-button:disabled {
108
+ opacity: 0.35;
109
+ cursor: default;
110
+ }
111
+ :where(.cm-root:not([data-unstyled])) .cm-gesture-hint {
112
+ position: absolute;
113
+ top: 50%;
114
+ left: 50%;
115
+ transform: translate(-50%, -50%);
116
+ padding: 8px 14px;
117
+ border-radius: 6px;
118
+ background: var(--cm-hint-bg, rgb(17 24 39 / 0.85));
119
+ color: var(--cm-hint-color, #ffffff);
120
+ pointer-events: none;
121
+ white-space: nowrap;
122
+ opacity: 0;
123
+ transition: opacity 200ms;
124
+ }
125
+ :where(.cm-root:not([data-unstyled])) .cm-gesture-hint[data-visible] {
126
+ opacity: 1;
127
+ }
128
+ @media (prefers-reduced-motion: reduce) {
129
+ :where(.cm-root:not([data-unstyled])) .cm-gesture-hint {
130
+ transition: none;
131
+ }
132
+ }
133
+ :where(.cm-root:not([data-unstyled]))[data-dim=selection][data-has-selection] .cm-regions,
134
+ :where(.cm-root:not([data-unstyled]))[data-dim=hover-and-selection][data-has-selection] .cm-regions,
135
+ :where(.cm-root:not([data-unstyled]))[data-dim=hover-and-selection] .cm-svg:has(path[data-selection=hover]) .cm-regions {
136
+ opacity: var(--cm-dim-opacity, 0.45);
137
+ }
138
+ :where(.cm-root:not([data-unstyled])) .cm-regions {
139
+ transition: opacity var(--cm-transition-duration, 250ms);
140
+ }
141
+ :where(.cm-root:not([data-unstyled])) .cm-skeleton {
142
+ width: 100%;
143
+ border-radius: 6px;
144
+ background:
145
+ linear-gradient(
146
+ 90deg,
147
+ var(--cm-skeleton-color, #e5e5e5) 25%,
148
+ color-mix(in srgb, var(--cm-skeleton-color, #e5e5e5), #ffffff 55%) 50%,
149
+ var(--cm-skeleton-color, #e5e5e5) 75%);
150
+ background-size: 200% 100%;
151
+ animation: cm-shimmer 1.5s linear infinite;
152
+ }
153
+ :where(.cm-root:not([data-unstyled])) .cm-error {
154
+ display: grid;
155
+ place-items: center;
156
+ width: 100%;
157
+ background: var(--cm-skeleton-color, #e5e5e5);
158
+ border-radius: 6px;
159
+ }
160
+ :where(.cm-root:not([data-unstyled]))[data-loading] .cm-regions {
161
+ animation: cm-pulse 1.5s ease-in-out infinite;
162
+ }
163
+ @keyframes cm-shimmer {
164
+ to {
165
+ background-position: -200% 0;
166
+ }
167
+ }
168
+ @keyframes cm-pulse {
169
+ 50% {
170
+ opacity: 0.55;
171
+ }
172
+ }
173
+ @media (prefers-reduced-motion: reduce) {
174
+ :where(.cm-root:not([data-unstyled])) .cm-skeleton,
175
+ :where(.cm-root:not([data-unstyled]))[data-loading] .cm-regions {
176
+ animation: none;
177
+ }
178
+ }
179
+ :where(.cm-root:not([data-unstyled])) .cm-legend__title {
180
+ font-weight: 600;
181
+ margin-bottom: 4px;
182
+ }
183
+ :where(.cm-root:not([data-unstyled])) .cm-legend__items {
184
+ list-style: none;
185
+ margin: 0;
186
+ padding: 0;
187
+ }
188
+ :where(.cm-root:not([data-unstyled])) .cm-legend__item {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 6px;
192
+ }
193
+ :where(.cm-root:not([data-unstyled])) .cm-legend__swatch {
194
+ display: inline-block;
195
+ width: 12px;
196
+ height: 12px;
197
+ }
198
+ :where(.cm-root:not([data-unstyled])) .cm-legend__count {
199
+ opacity: 0.6;
200
+ }
201
+ :where(.cm-root:not([data-unstyled])) .cm-legend__gradient {
202
+ width: 160px;
203
+ height: 10px;
204
+ }
205
+ :where(.cm-root:not([data-unstyled])) .cm-legend__range {
206
+ display: flex;
207
+ justify-content: space-between;
208
+ width: 160px;
209
+ }
210
+ :where(.cm-root:not([data-unstyled])) .cm-legend__sizes {
211
+ list-style: none;
212
+ margin: 6px 0 0;
213
+ padding: 0;
214
+ }
215
+ :where(.cm-root:not([data-unstyled])) .cm-legend__size {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 6px;
219
+ }
220
+ :where(.cm-root:not([data-unstyled])) .cm-legend__circle circle {
221
+ fill: none;
222
+ stroke: currentColor;
223
+ }
224
+ :where(.cm-root:not([data-unstyled])) .cm-tooltip--default {
225
+ background: var(--cm-tooltip-bg, #ffffff);
226
+ color: var(--cm-tooltip-color, #111111);
227
+ border: 1px solid var(--cm-tooltip-border, #cccccc);
228
+ border-radius: var(--cm-tooltip-radius, 4px);
229
+ box-shadow: var(--cm-tooltip-shadow, none);
230
+ padding: 4px 8px;
231
+ white-space: nowrap;
232
+ }
233
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=context] .cm-context-region {
234
+ fill: var(--cm-context-fill, #e5e5e5);
235
+ stroke: var(--cm-context-border-color, #ffffff);
236
+ stroke-width: 0.5px;
237
+ vector-effect: non-scaling-stroke;
238
+ transition: fill var(--cm-transition-duration, 250ms);
239
+ }
240
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=context] .cm-context-region[data-focus] {
241
+ stroke: none;
242
+ }
243
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=context] .cm-context-region[data-drillable] {
244
+ cursor: zoom-in;
245
+ }
246
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=context] .cm-context-region[data-drillable]:hover {
247
+ fill: var( --cm-context-hover-fill, color-mix(in srgb, var(--cm-context-fill, #e5e5e5), var(--cm-hover-stroke, #000000) 12%) );
248
+ }
249
+ :where(.cm-root:not([data-unstyled]))[data-interacting] .cm-layer[data-role=context] {
250
+ pointer-events: none;
251
+ }
252
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=exiting] .cm-context-region {
253
+ fill: var(--cm-context-fill, #e5e5e5);
254
+ stroke: var(--cm-context-border-color, #ffffff);
255
+ stroke-width: 0.5px;
256
+ vector-effect: non-scaling-stroke;
257
+ }
258
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=exiting] {
259
+ animation: cm-fade-out var(--cm-reveal-duration, 200ms) ease-out both;
260
+ }
261
+ :where(.cm-root:not([data-unstyled]))[data-drill-phase=flying] .cm-region:not([data-drill-target]),
262
+ :where(.cm-root:not([data-unstyled]))[data-drill-phase=loading] .cm-region:not([data-drill-target]) {
263
+ opacity: var(--cm-drill-dim-opacity, 0.35);
264
+ transition: opacity var(--cm-reveal-duration, 200ms);
265
+ }
266
+ :where(.cm-root:not([data-unstyled]))[data-drill-phase=loading] .cm-region[data-drill-target] {
267
+ animation: cm-breathe 1.2s ease-in-out infinite alternate;
268
+ }
269
+ :where(.cm-root:not([data-unstyled]))[data-drill-phase=revealing] .cm-regions .cm-region {
270
+ animation: cm-fade-in var(--cm-reveal-duration, 200ms) ease-out both;
271
+ animation-delay: calc(var(--cm-wave, 0) * var(--cm-reveal-stagger, 250ms));
272
+ }
273
+ @keyframes cm-fade-in {
274
+ from {
275
+ opacity: 0;
276
+ }
277
+ to {
278
+ opacity: 1;
279
+ }
280
+ }
281
+ @keyframes cm-fade-out {
282
+ from {
283
+ opacity: 1;
284
+ }
285
+ to {
286
+ opacity: 0;
287
+ }
288
+ }
289
+ @keyframes cm-breathe {
290
+ from {
291
+ opacity: 1;
292
+ }
293
+ to {
294
+ opacity: 0.55;
295
+ }
296
+ }
297
+ @media (prefers-reduced-motion: reduce) {
298
+ :where(.cm-root:not([data-unstyled]))[data-drill-phase=revealing] .cm-regions .cm-region,
299
+ :where(.cm-root:not([data-unstyled]))[data-drill-phase=loading] .cm-region[data-drill-target],
300
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=exiting] {
301
+ animation: none;
302
+ }
303
+ :where(.cm-root:not([data-unstyled])) .cm-layer[data-role=exiting] {
304
+ display: none;
305
+ }
306
+ }
307
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb {
308
+ display: flex;
309
+ align-items: center;
310
+ gap: 4px;
311
+ max-width: calc(100% - 24px);
312
+ padding: 2px 6px;
313
+ border: 1px solid var(--cm-control-border, #cccccc);
314
+ border-radius: var(--cm-control-radius, 6px);
315
+ background: var(--cm-control-bg, #ffffff);
316
+ color: var(--cm-control-color, #111111);
317
+ font-family: var(--cm-font-family, inherit);
318
+ font-size: var(--cm-font-size, 12px);
319
+ }
320
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb__list {
321
+ display: flex;
322
+ flex-wrap: wrap;
323
+ align-items: center;
324
+ margin: 0;
325
+ padding: 0;
326
+ list-style: none;
327
+ }
328
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb__item + .cm-breadcrumb__item::before {
329
+ content: "\203a";
330
+ padding: 0 4px;
331
+ opacity: 0.55;
332
+ }
333
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb button {
334
+ padding: 2px 4px;
335
+ border: 0;
336
+ border-radius: 4px;
337
+ background: transparent;
338
+ color: inherit;
339
+ font: inherit;
340
+ cursor: pointer;
341
+ }
342
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb button:hover {
343
+ background: var( --cm-control-hover-bg, color-mix(in srgb, var(--cm-control-bg, #ffffff), var(--cm-control-color, #111111) 10%) );
344
+ }
345
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb button:focus-visible {
346
+ outline: var(--cm-focus-ring-width, 2px) solid var(--cm-focus-ring, #0b5fff);
347
+ }
348
+ :where(.cm-root:not([data-unstyled])) .cm-breadcrumb__current {
349
+ padding: 2px 4px;
350
+ font-weight: 600;
351
+ }
352
+ :where(.cm-root:not([data-unstyled])) .cm-tooltip__hint {
353
+ margin-top: 2px;
354
+ opacity: 0.7;
355
+ font-size: 0.9em;
356
+ }
357
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="0"] .cm-region:not([data-class="0"]),
358
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="1"] .cm-region:not([data-class="1"]),
359
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="2"] .cm-region:not([data-class="2"]),
360
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="3"] .cm-region:not([data-class="3"]),
361
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="4"] .cm-region:not([data-class="4"]),
362
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="5"] .cm-region:not([data-class="5"]),
363
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="6"] .cm-region:not([data-class="6"]),
364
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="7"] .cm-region:not([data-class="7"]),
365
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="8"] .cm-region:not([data-class="8"]),
366
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="9"] .cm-region:not([data-class="9"]),
367
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="10"] .cm-region:not([data-class="10"]),
368
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class="11"] .cm-region:not([data-class="11"]),
369
+ :where(.cm-root:not([data-unstyled]))[data-highlight-class=empty] .cm-region:not([data-class=empty]) {
370
+ opacity: var(--cm-dim-opacity, 0.45);
371
+ }
372
+ :where(.cm-root:not([data-unstyled])) .cm-legend [data-class] {
373
+ cursor: default;
374
+ }
375
+ :where(.cm-root:not([data-unstyled])) .cm-legend__bar-wrap {
376
+ width: 280px;
377
+ }
378
+ :where(.cm-root:not([data-unstyled])) .cm-legend__bar {
379
+ display: flex;
380
+ height: 10px;
381
+ border-radius: 2px;
382
+ overflow: hidden;
383
+ }
384
+ :where(.cm-root:not([data-unstyled])) .cm-legend__segment {
385
+ flex: 1 1 0;
386
+ }
387
+ :where(.cm-root:not([data-unstyled])) .cm-legend__ticks {
388
+ position: relative;
389
+ height: 1.4em;
390
+ margin-bottom: 4px;
391
+ font-size: 0.9em;
392
+ }
393
+ :where(.cm-root:not([data-unstyled])) .cm-legend__tick {
394
+ position: absolute;
395
+ top: 2px;
396
+ transform: translateX(-50%);
397
+ white-space: nowrap;
398
+ opacity: 0.75;
399
+ }
400
+ :where(.cm-root:not([data-unstyled])) .cm-legend__tick:first-child {
401
+ transform: none;
402
+ }
403
+ :where(.cm-root:not([data-unstyled])) .cm-legend__tick:last-child {
404
+ transform: translateX(-100%);
405
+ }
406
+ :where(.cm-root:not([data-unstyled])) .cm-legend__swatch[data-pattern=hatch] {
407
+ background-image:
408
+ repeating-linear-gradient(
409
+ 45deg,
410
+ var(--cm-pattern-color, color-mix(in srgb, var(--cm-label-color, #111111) 45%, transparent)) 0 1.5px,
411
+ transparent 1.5px 4px);
412
+ }
413
+ :where(.cm-root:not([data-unstyled])) .cm-legend__swatch[data-pattern=dots] {
414
+ background-image: radial-gradient(var(--cm-pattern-color, color-mix(in srgb, var(--cm-label-color, #111111) 45%, transparent)) 1px, transparent 1.2px);
415
+ background-size: 4px 4px;
416
+ }
417
+ /*# sourceMappingURL=styles.css.map */
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/package.json CHANGED
@@ -1,6 +1,141 @@
1
1
  {
2
2
  "name": "choropleth-kit",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Choropleth (thematic) maps for React: zoom, drill-down, legends, theming. Three API levels, d3-geo under the hood.",
5
+ "author": "Manuel Martín",
6
+ "keywords": [
7
+ "choropleth",
8
+ "map",
9
+ "react",
10
+ "svg",
11
+ "d3",
12
+ "d3-geo",
13
+ "topojson",
14
+ "geojson",
15
+ "thematic-map",
16
+ "drill-down",
17
+ "data-visualization"
18
+ ],
19
+ "license": "MIT",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/Manoplo/choropleth-kit.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/Manoplo/choropleth-kit/issues"
26
+ },
27
+ "homepage": "https://github.com/Manoplo/choropleth-kit#readme",
28
+ "type": "module",
29
+ "sideEffects": [
30
+ "**/*.css"
31
+ ],
32
+ "files": [
33
+ "dist",
34
+ "!dist/**/*.map",
35
+ "README.md",
36
+ "LICENSE"
37
+ ],
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "main": "./dist/index.js",
42
+ "types": "./dist/index.d.ts",
43
+ "exports": {
44
+ ".": {
45
+ "types": "./dist/index.d.ts",
46
+ "import": "./dist/index.js"
47
+ },
48
+ "./styles.css": "./dist/styles.css",
49
+ "./core": {
50
+ "types": "./dist/core.d.ts",
51
+ "import": "./dist/core.js"
52
+ },
53
+ "./geo": {
54
+ "types": "./dist/geo.d.ts",
55
+ "import": "./dist/geo.js"
56
+ }
57
+ },
58
+ "typesVersions": {
59
+ "*": {
60
+ "core": [
61
+ "./dist/core.d.ts"
62
+ ],
63
+ "geo": [
64
+ "./dist/geo.d.ts"
65
+ ]
66
+ }
67
+ },
68
+ "peerDependencies": {
69
+ "react": ">=18",
70
+ "react-dom": ">=18"
71
+ },
72
+ "devDependencies": {
73
+ "@arethetypeswrong/cli": "^0.18.5",
74
+ "@size-limit/esbuild": "^14.3.0",
75
+ "@size-limit/file": "^14.3.0",
76
+ "@storybook/react-vite": "^10.6.5",
77
+ "@testing-library/jest-dom": "^7.0.1",
78
+ "@testing-library/react": "^16.3.3",
79
+ "@testing-library/user-event": "^14.6.8",
80
+ "@types/d3-ease": "^3.0.2",
81
+ "@types/d3-scale": "^4.0.9",
82
+ "@types/d3-selection": "^3.0.12",
83
+ "@types/d3-transition": "^3.0.9",
84
+ "@types/d3-zoom": "^3.0.9",
85
+ "@types/node": "^26.6.6",
86
+ "@types/polylabel": "^2.0.0",
87
+ "@types/react": "^19.3.0",
88
+ "@types/react-dom": "^19.3.0",
89
+ "@types/topojson-client": "^3.1.5",
90
+ "@vitejs/plugin-react": "^6.2.1",
91
+ "@vitest/coverage-v8": "^5.1.0",
92
+ "i18n-iso-countries": "^7.14.0",
93
+ "jsdom": "^27.0.1",
94
+ "oxlint": "^1.91.0",
95
+ "prettier": "^3.9.10",
96
+ "publint": "^0.3.25",
97
+ "react": "^19.3.1",
98
+ "react-dom": "^19.3.1",
99
+ "size-limit": "^14.3.0",
100
+ "storybook": "^10.6.5",
101
+ "tsup": "^8.5.1",
102
+ "typescript": "~5.9.3",
103
+ "vite": "^8.3.5",
104
+ "vitest": "^5.1.0",
105
+ "world-atlas": "^2.0.2"
106
+ },
107
+ "dependencies": {
108
+ "@types/d3-geo": "^3.1.1",
109
+ "@types/d3-interpolate": "^3.0.4",
110
+ "@types/d3-scale-chromatic": "^3.1.0",
111
+ "@types/geojson": "^7946.0.16",
112
+ "@types/topojson-specification": "^1.0.5",
113
+ "d3-ease": "^3.0.2",
114
+ "d3-geo": "^3.1.2",
115
+ "d3-interpolate": "^3.0.2",
116
+ "d3-scale": "^4.0.3",
117
+ "d3-scale-chromatic": "^3.1.1",
118
+ "d3-selection": "^3.0.1",
119
+ "d3-transition": "^3.0.2",
120
+ "d3-zoom": "^3.0.1",
121
+ "polylabel": "^2.1.0",
122
+ "topojson-client": "^3.1.0"
123
+ },
124
+ "scripts": {
125
+ "build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsup",
126
+ "dev": "tsup --watch",
127
+ "typecheck": "tsc --noEmit",
128
+ "lint": "oxlint .",
129
+ "lint:fix": "oxlint --fix .",
130
+ "format": "prettier --write .",
131
+ "format:check": "prettier --check .",
132
+ "test": "vitest run",
133
+ "test:coverage": "vitest run --coverage",
134
+ "storybook": "storybook dev -p 6006",
135
+ "build-storybook": "storybook build",
136
+ "size": "pnpm build && size-limit",
137
+ "smoke:package": "node scripts/smoke-package.mjs",
138
+ "check:package": "publint && attw --pack . --ignore-rules cjs-resolves-to-esm no-resolution --profile esm-only",
139
+ "verify": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm test && pnpm build && size-limit && pnpm check:package"
140
+ }
6
141
  }