@cfasim-ui/docs 0.3.11

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 (60) hide show
  1. package/LICENSE +201 -0
  2. package/charts/ChartMenu/ChartMenu.vue +140 -0
  3. package/charts/ChartMenu/download.ts +44 -0
  4. package/charts/ChartTooltip/ChartTooltip.vue +97 -0
  5. package/charts/ChoroplethMap/ChoroplethMap.md +398 -0
  6. package/charts/ChoroplethMap/ChoroplethMap.vue +777 -0
  7. package/charts/ChoroplethMap/hsaMapping.ts +4116 -0
  8. package/charts/DataTable/DataTable.md +143 -0
  9. package/charts/DataTable/DataTable.vue +277 -0
  10. package/charts/LineChart/LineChart.md +472 -0
  11. package/charts/LineChart/LineChart.vue +1216 -0
  12. package/charts/index.ts +23 -0
  13. package/charts/tooltip-position.ts +49 -0
  14. package/components/Box/Box.md +49 -0
  15. package/components/Box/Box.vue +52 -0
  16. package/components/Button/Button.md +67 -0
  17. package/components/Button/Button.vue +81 -0
  18. package/components/Expander/Expander.md +34 -0
  19. package/components/Expander/Expander.vue +95 -0
  20. package/components/Hint/Hint.md +29 -0
  21. package/components/Hint/Hint.vue +83 -0
  22. package/components/Icon/Icon.md +67 -0
  23. package/components/Icon/Icon.vue +112 -0
  24. package/components/LightDarkToggle/LightDarkToggle.vue +49 -0
  25. package/components/NumberInput/NumberInput.md +305 -0
  26. package/components/NumberInput/NumberInput.vue +531 -0
  27. package/components/SelectBox/SelectBox.md +110 -0
  28. package/components/SelectBox/SelectBox.vue +195 -0
  29. package/components/SidebarLayout/SidebarLayout.md +104 -0
  30. package/components/SidebarLayout/SidebarLayout.vue +466 -0
  31. package/components/Spinner/Spinner.md +51 -0
  32. package/components/Spinner/Spinner.vue +55 -0
  33. package/components/TextInput/TextInput.md +82 -0
  34. package/components/TextInput/TextInput.vue +94 -0
  35. package/components/Toggle/Toggle.md +81 -0
  36. package/components/Toggle/Toggle.vue +81 -0
  37. package/components/index.ts +15 -0
  38. package/index.json +121 -0
  39. package/package.json +24 -0
  40. package/pyodide/index.ts +7 -0
  41. package/pyodide/pyodide.worker.ts +233 -0
  42. package/pyodide/pyodideWorkerApi.ts +102 -0
  43. package/pyodide/useModel.ts +86 -0
  44. package/pyodide/vitePlugin.js +51 -0
  45. package/shared/ModelOutput.ts +88 -0
  46. package/shared/csv.ts +22 -0
  47. package/shared/index.ts +24 -0
  48. package/shared/transferUtils.ts +126 -0
  49. package/shared/useUrlParams.ts +296 -0
  50. package/theme/all.js +5 -0
  51. package/theme/base.css +176 -0
  52. package/theme/cfasim.css +3 -0
  53. package/theme/theme.css +113 -0
  54. package/theme/themes/cdc.css +22 -0
  55. package/theme/utilities.css +518 -0
  56. package/wasm/index.ts +2 -0
  57. package/wasm/useModel.ts +53 -0
  58. package/wasm/vitePlugin.js +35 -0
  59. package/wasm/wasm.worker.ts +74 -0
  60. package/wasm/wasmWorkerApi.ts +38 -0
@@ -0,0 +1,398 @@
1
+ # ChoroplethMap
2
+
3
+ A US choropleth map using D3's Albers USA projection, which repositions Alaska and Hawaii to the bottom left. Supports state-level, county-level, and HSA-level (Health Service Areas) rendering via the `geoType` prop.
4
+
5
+ You must provide your own TopoJSON topology data via the `topology` prop. We recommend the [`us-atlas`](https://github.com/topojson/us-atlas) package:
6
+
7
+ ```sh
8
+ npm install us-atlas
9
+ ```
10
+
11
+ - **State-level maps**: use `us-atlas/states-10m.json`
12
+ - **County or HSA maps**: use `us-atlas/counties-10m.json` (includes both county and state boundaries)
13
+
14
+ ```vue
15
+ <script setup>
16
+ import { ChoroplethMap } from "@cfasim-ui/charts";
17
+ import statesTopo from "us-atlas/states-10m.json";
18
+ import countiesTopo from "us-atlas/counties-10m.json";
19
+ </script>
20
+
21
+ <!-- State map -->
22
+ <ChoroplethMap :topology="statesTopo" :data="stateData" />
23
+
24
+ <!-- County map -->
25
+ <ChoroplethMap
26
+ :topology="countiesTopo"
27
+ geo-type="counties"
28
+ :data="countyData"
29
+ />
30
+ ```
31
+
32
+ ## Examples
33
+
34
+ ### Basic with state data
35
+
36
+ <ComponentDemo>
37
+ <ChoroplethMap
38
+ :topology="statesTopo"
39
+ :data="[
40
+ { id: '06', value: 100 },
41
+ { id: '36', value: 80 },
42
+ { id: '48', value: 90 },
43
+ { id: '12', value: 70 },
44
+ { id: '17', value: 60 },
45
+ { id: '37', value: 50 },
46
+ { id: '42', value: 55 },
47
+ { id: '39', value: 45 },
48
+ { id: '13', value: 40 },
49
+ { id: '26', value: 35 },
50
+ ]"
51
+ title="Cases by State"
52
+ :legend-title="'Cases'"
53
+ :height="400"
54
+ />
55
+
56
+ <template #code>
57
+
58
+ ```vue
59
+ <script setup>
60
+ import statesTopo from "us-atlas/states-10m.json";
61
+ </script>
62
+
63
+ <ChoroplethMap
64
+ :topology="statesTopo"
65
+ :data="[
66
+ { id: '06', value: 100 },
67
+ { id: '36', value: 80 },
68
+ { id: '48', value: 90 },
69
+ { id: '12', value: 70 },
70
+ { id: '17', value: 60 },
71
+ ]"
72
+ title="Cases by State"
73
+ :legend-title="'Cases'"
74
+ :height="400"
75
+ />
76
+ ```
77
+
78
+ </template>
79
+ </ComponentDemo>
80
+
81
+ ### Custom color scale
82
+
83
+ <ComponentDemo>
84
+ <ChoroplethMap
85
+ :topology="statesTopo"
86
+ :data="[
87
+ { id: 'California', value: 100 },
88
+ { id: 'Texas', value: 85 },
89
+ { id: 'Florida', value: 70 },
90
+ { id: 'New York', value: 90 },
91
+ { id: 'Pennsylvania', value: 50 },
92
+ { id: 'Illinois', value: 60 },
93
+ { id: 'Ohio', value: 40 },
94
+ { id: 'Georgia', value: 55 },
95
+ { id: 'North Carolina', value: 45 },
96
+ { id: 'Michigan', value: 35 },
97
+ ]"
98
+ :color-scale="{ min: '#fff5f0', max: '#a50f15' }"
99
+ :legend-title="'Severity'"
100
+ :height="400"
101
+ />
102
+
103
+ <template #code>
104
+
105
+ ```vue
106
+ <ChoroplethMap
107
+ :topology="statesTopo"
108
+ :data="[
109
+ { id: 'California', value: 100 },
110
+ { id: 'Texas', value: 85 },
111
+ { id: 'Florida', value: 70 },
112
+ { id: 'New York', value: 90 },
113
+ ]"
114
+ :color-scale="{ min: '#fff5f0', max: '#a50f15' }"
115
+ :legend-title="'Severity'"
116
+ :height="400"
117
+ />
118
+ ```
119
+
120
+ </template>
121
+ </ComponentDemo>
122
+
123
+ ### Threshold color scale
124
+
125
+ Use an array of `ThresholdStop` objects instead of a linear scale. Each stop defines a `min` threshold — values at or above that threshold get the stop's color. The highest matching stop wins.
126
+
127
+ <ComponentDemo>
128
+ <ChoroplethMap
129
+ :topology="statesTopo"
130
+ :data="[
131
+ { id: 'California', value: 80 },
132
+ { id: 'Texas', value: 45 },
133
+ { id: 'Florida', value: 60 },
134
+ { id: 'New York', value: 25 },
135
+ { id: 'Pennsylvania', value: 8 },
136
+ { id: 'Illinois', value: 55 },
137
+ { id: 'Ohio', value: 30 },
138
+ { id: 'Georgia', value: 70 },
139
+ { id: 'North Carolina', value: 15 },
140
+ { id: 'Michigan', value: 3 },
141
+ ]"
142
+ :color-scale="[
143
+ { min: 0, color: '#fee5d9', label: 'Low' },
144
+ { min: 10, color: '#fcae91', label: 'Some' },
145
+ { min: 30, color: '#fb6a4a', label: 'Moderate' },
146
+ { min: 60, color: '#cb181d', label: 'High' },
147
+ ]"
148
+ title="Risk Level"
149
+ :legend-title="'Risk'"
150
+ :height="400"
151
+ />
152
+
153
+ <template #code>
154
+
155
+ ```vue
156
+ <ChoroplethMap
157
+ :topology="statesTopo"
158
+ :data="stateData"
159
+ :color-scale="[
160
+ { min: 0, color: '#fee5d9', label: 'Low' },
161
+ { min: 10, color: '#fcae91', label: 'Some' },
162
+ { min: 30, color: '#fb6a4a', label: 'Moderate' },
163
+ { min: 60, color: '#cb181d', label: 'High' },
164
+ ]"
165
+ title="Risk Level"
166
+ :legend-title="'Risk'"
167
+ :height="400"
168
+ />
169
+ ```
170
+
171
+ </template>
172
+ </ComponentDemo>
173
+
174
+ ### Categorical color scale
175
+
176
+ Use an array of `CategoricalStop` objects to map string values to colors. Each stop defines a `value` to match and a `color` to apply.
177
+
178
+ <ComponentDemo>
179
+ <ChoroplethMap
180
+ :topology="statesTopo"
181
+ :data="[
182
+ { id: 'California', value: 'high' },
183
+ { id: 'Texas', value: 'medium' },
184
+ { id: 'Florida', value: 'high' },
185
+ { id: 'New York', value: 'low' },
186
+ { id: 'Pennsylvania', value: 'low' },
187
+ { id: 'Illinois', value: 'medium' },
188
+ { id: 'Ohio', value: 'low' },
189
+ { id: 'Georgia', value: 'high' },
190
+ { id: 'North Carolina', value: 'medium' },
191
+ { id: 'Michigan', value: 'low' },
192
+ ]"
193
+ :color-scale="[
194
+ { value: 'low', color: '#fee5d9' },
195
+ { value: 'medium', color: '#fb6a4a' },
196
+ { value: 'high', color: '#cb181d' },
197
+ ]"
198
+ title="Risk Category"
199
+ :legend-title="'Risk'"
200
+ :height="400"
201
+ />
202
+
203
+ <template #code>
204
+
205
+ ```vue
206
+ <ChoroplethMap
207
+ :topology="statesTopo"
208
+ :data="stateData"
209
+ :color-scale="[
210
+ { value: 'low', color: '#fee5d9' },
211
+ { value: 'medium', color: '#fb6a4a' },
212
+ { value: 'high', color: '#cb181d' },
213
+ ]"
214
+ title="Risk Category"
215
+ :legend-title="'Risk'"
216
+ :height="400"
217
+ />
218
+ ```
219
+
220
+ </template>
221
+ </ComponentDemo>
222
+
223
+ ### County-level map with pan and zoom
224
+
225
+ Set `geoType="counties"` to render county-level data using 5-digit FIPS codes. State borders are drawn on top for context. Use `pan` and `zoom` props to enable interactive navigation — useful for dense county data.
226
+
227
+ <ComponentDemo>
228
+ <ChoroplethMap
229
+ :topology="countiesTopo"
230
+ geo-type="counties"
231
+ :pan="true"
232
+ :zoom="true"
233
+ :data="[
234
+ { id: '06037', value: 100 },
235
+ { id: '06073', value: 80 },
236
+ { id: '06059', value: 70 },
237
+ { id: '36061', value: 90 },
238
+ { id: '36047', value: 75 },
239
+ { id: '17031', value: 85 },
240
+ { id: '48201', value: 65 },
241
+ { id: '04013', value: 60 },
242
+ { id: '12086', value: 55 },
243
+ { id: '53033', value: 50 },
244
+ ]"
245
+ title="Cases by County"
246
+ :legend-title="'Cases'"
247
+ :height="400"
248
+ />
249
+
250
+ <template #code>
251
+
252
+ ```vue
253
+ <ChoroplethMap
254
+ :topology="countiesTopo"
255
+ geo-type="counties"
256
+ pan
257
+ zoom
258
+ :data="[
259
+ { id: '06037', value: 100 },
260
+ { id: '36061', value: 90 },
261
+ { id: '17031', value: 85 },
262
+ { id: '48201', value: 65 },
263
+ { id: '04013', value: 60 },
264
+ ]"
265
+ title="Cases by County"
266
+ :legend-title="'Cases'"
267
+ :height="400"
268
+ />
269
+ ```
270
+
271
+ </template>
272
+ </ComponentDemo>
273
+
274
+ ### HSA-level map
275
+
276
+ Set `geoType="hsas"` to render Health Service Area boundaries. HSAs are dissolved from county boundaries using a built-in FIPS-to-HSA mapping. Use 6-digit HSA codes as IDs. State borders are overlaid for context.
277
+
278
+ <ComponentDemo>
279
+ <ChoroplethMap
280
+ :topology="countiesTopo"
281
+ geo-type="hsas"
282
+ :pan="true"
283
+ :zoom="true"
284
+ :data="[
285
+ { id: '010259', value: 100 },
286
+ { id: '060766', value: 90 },
287
+ { id: '120159', value: 85 },
288
+ { id: '090121', value: 70 },
289
+ { id: '110061', value: 60 },
290
+ { id: '040765', value: 55 },
291
+ { id: '080731', value: 50 },
292
+ { id: '050527', value: 45 },
293
+ { id: '100075', value: 40 },
294
+ { id: '020820', value: 35 },
295
+ ]"
296
+ title="Cases by HSA"
297
+ :legend-title="'Cases'"
298
+ :height="400"
299
+ />
300
+
301
+ <template #code>
302
+
303
+ ```vue
304
+ <ChoroplethMap
305
+ :topology="countiesTopo"
306
+ geo-type="hsas"
307
+ pan
308
+ zoom
309
+ :data="[
310
+ { id: '010259', value: 100 },
311
+ { id: '060766', value: 90 },
312
+ { id: '120159', value: 85 },
313
+ { id: '090121', value: 70 },
314
+ { id: '110061', value: 60 },
315
+ ]"
316
+ title="Cases by HSA"
317
+ :legend-title="'Cases'"
318
+ :height="400"
319
+ />
320
+ ```
321
+
322
+ </template>
323
+ </ComponentDemo>
324
+
325
+ ## Props
326
+
327
+ | Prop | Type | Required | Default |
328
+ |------|------|----------|---------|
329
+ | `topology` | `Topology` | Yes | — |
330
+ | `data` | `StateData[]` | No | — |
331
+ | `geoType` | `GeoType` | No | `"states"` |
332
+ | `width` | `number` | No | — |
333
+ | `height` | `number` | No | — |
334
+ | `colorScale` | `ChoroplethColorScale \| ThresholdStop[] \| CategoricalStop[]` | No | — |
335
+ | `title` | `string` | No | — |
336
+ | `noDataColor` | `string` | No | `"#ddd"` |
337
+ | `strokeColor` | `string` | No | `"#fff"` |
338
+ | `strokeWidth` | `number` | No | `0.5` |
339
+ | `menu` | `boolean \| string` | No | `true` |
340
+ | `legend` | `boolean` | No | `true` |
341
+ | `legendTitle` | `string` | No | — |
342
+ | `zoom` | `boolean` | No | `false` |
343
+ | `pan` | `boolean` | No | `false` |
344
+ | `tooltipTrigger` | `"hover" \| "click"` | No | — |
345
+ | `tooltipFormat` | `(data: {
346
+ id: string` | No | — |
347
+ | `name` | `string` | Yes | — |
348
+ | `value` | `number \| string` | No | — |
349
+ | `tooltipClamp` | `"none" \| "chart" \| "window"` | No | `"chart"` |
350
+
351
+
352
+ ### StateData
353
+
354
+ ```ts
355
+ interface StateData {
356
+ /** FIPS code (e.g. "06" for California, "06037" for LA County) or name */
357
+ id: string;
358
+ value: number | string;
359
+ }
360
+ ```
361
+
362
+ ### ChoroplethColorScale
363
+
364
+ ```ts
365
+ interface ChoroplethColorScale {
366
+ /** Minimum color (CSS color string). Default: "#e5f0fa" */
367
+ min?: string;
368
+ /** Maximum color (CSS color string). Default: "#08519c" */
369
+ max?: string;
370
+ }
371
+ ```
372
+
373
+ ### ThresholdStop
374
+
375
+ Pass an array of `ThresholdStop` as `colorScale` for discrete color buckets instead of a linear gradient. The highest matching `min` wins.
376
+
377
+ ```ts
378
+ interface ThresholdStop {
379
+ /** Lower bound (inclusive). Values at or above this get this color. */
380
+ min: number;
381
+ color: string;
382
+ /** Optional label for the legend (defaults to the min value) */
383
+ label?: string;
384
+ }
385
+ ```
386
+
387
+ ### CategoricalStop
388
+
389
+ Pass an array of `CategoricalStop` as `colorScale` to map string values to colors. States whose `value` matches a stop's `value` get that color; unmatched values get `noDataColor`.
390
+
391
+ ```ts
392
+ interface CategoricalStop {
393
+ /** The categorical value to match */
394
+ value: string;
395
+ /** CSS color string */
396
+ color: string;
397
+ }
398
+ ```