@f-ewald/components 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.
Files changed (102) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +147 -0
  3. package/custom-elements.json +3398 -0
  4. package/dist/address-autocomplete.d.ts +75 -0
  5. package/dist/address-autocomplete.d.ts.map +1 -0
  6. package/dist/address-autocomplete.js +342 -0
  7. package/dist/address-autocomplete.js.map +1 -0
  8. package/dist/animate-confetti.d.ts +53 -0
  9. package/dist/animate-confetti.d.ts.map +1 -0
  10. package/dist/animate-confetti.js +180 -0
  11. package/dist/animate-confetti.js.map +1 -0
  12. package/dist/autocomplete-input.d.ts +73 -0
  13. package/dist/autocomplete-input.d.ts.map +1 -0
  14. package/dist/autocomplete-input.js +309 -0
  15. package/dist/autocomplete-input.js.map +1 -0
  16. package/dist/confirm-dialog.d.ts +36 -0
  17. package/dist/confirm-dialog.d.ts.map +1 -0
  18. package/dist/confirm-dialog.js +191 -0
  19. package/dist/confirm-dialog.js.map +1 -0
  20. package/dist/copy-link-button.d.ts +27 -0
  21. package/dist/copy-link-button.d.ts.map +1 -0
  22. package/dist/copy-link-button.js +84 -0
  23. package/dist/copy-link-button.js.map +1 -0
  24. package/dist/distance-value.d.ts +24 -0
  25. package/dist/distance-value.d.ts.map +1 -0
  26. package/dist/distance-value.js +50 -0
  27. package/dist/distance-value.js.map +1 -0
  28. package/dist/distribution-chart.d.ts +52 -0
  29. package/dist/distribution-chart.d.ts.map +1 -0
  30. package/dist/distribution-chart.js +299 -0
  31. package/dist/distribution-chart.js.map +1 -0
  32. package/dist/icons.d.ts +32 -0
  33. package/dist/icons.d.ts.map +1 -0
  34. package/dist/icons.js +35 -0
  35. package/dist/icons.js.map +1 -0
  36. package/dist/index.d.ts +18 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +18 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/percent-bar-chart.d.ts +29 -0
  41. package/dist/percent-bar-chart.d.ts.map +1 -0
  42. package/dist/percent-bar-chart.js +92 -0
  43. package/dist/percent-bar-chart.js.map +1 -0
  44. package/dist/price-history-chart.d.ts +39 -0
  45. package/dist/price-history-chart.d.ts.map +1 -0
  46. package/dist/price-history-chart.js +217 -0
  47. package/dist/price-history-chart.js.map +1 -0
  48. package/dist/relative-time.d.ts +26 -0
  49. package/dist/relative-time.d.ts.map +1 -0
  50. package/dist/relative-time.js +64 -0
  51. package/dist/relative-time.js.map +1 -0
  52. package/dist/reveal-button.d.ts +19 -0
  53. package/dist/reveal-button.d.ts.map +1 -0
  54. package/dist/reveal-button.js +62 -0
  55. package/dist/reveal-button.js.map +1 -0
  56. package/dist/roman-numeral.d.ts +18 -0
  57. package/dist/roman-numeral.d.ts.map +1 -0
  58. package/dist/roman-numeral.js +54 -0
  59. package/dist/roman-numeral.js.map +1 -0
  60. package/dist/slide-panel.d.ts +27 -0
  61. package/dist/slide-panel.d.ts.map +1 -0
  62. package/dist/slide-panel.js +149 -0
  63. package/dist/slide-panel.js.map +1 -0
  64. package/dist/toast-notification.d.ts +53 -0
  65. package/dist/toast-notification.d.ts.map +1 -0
  66. package/dist/toast-notification.js +173 -0
  67. package/dist/toast-notification.js.map +1 -0
  68. package/dist/tokens.css +21 -0
  69. package/dist/tokens.d.ts +16 -0
  70. package/dist/tokens.d.ts.map +1 -0
  71. package/dist/tokens.js +79 -0
  72. package/dist/tokens.js.map +1 -0
  73. package/dist/utils/distance.d.ts +11 -0
  74. package/dist/utils/distance.d.ts.map +1 -0
  75. package/dist/utils/distance.js +25 -0
  76. package/dist/utils/distance.js.map +1 -0
  77. package/dist/utils/time.d.ts +10 -0
  78. package/dist/utils/time.d.ts.map +1 -0
  79. package/dist/utils/time.js +33 -0
  80. package/dist/utils/time.js.map +1 -0
  81. package/dist/weight-bar-chart.d.ts +29 -0
  82. package/dist/weight-bar-chart.d.ts.map +1 -0
  83. package/dist/weight-bar-chart.js +96 -0
  84. package/dist/weight-bar-chart.js.map +1 -0
  85. package/docs/address-autocomplete.md +68 -0
  86. package/docs/animate-confetti.md +34 -0
  87. package/docs/autocomplete-input.md +79 -0
  88. package/docs/confirm-dialog.md +65 -0
  89. package/docs/copy-link-button.md +46 -0
  90. package/docs/distance-value.md +38 -0
  91. package/docs/distribution-chart.md +51 -0
  92. package/docs/mcp-evaluation.md +31 -0
  93. package/docs/percent-bar-chart.md +40 -0
  94. package/docs/price-history-chart.md +44 -0
  95. package/docs/relative-time.md +37 -0
  96. package/docs/reveal-button.md +43 -0
  97. package/docs/roman-numeral.md +33 -0
  98. package/docs/slide-panel.md +56 -0
  99. package/docs/toast-notification.md +52 -0
  100. package/docs/weight-bar-chart.md +53 -0
  101. package/llms.txt +361 -0
  102. package/package.json +69 -0
@@ -0,0 +1,3398 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/address-autocomplete.ts",
8
+ "declarations": [
9
+ {
10
+ "kind": "class",
11
+ "description": "Form-associated text input with a suggestion dropdown. Works as a\ndrop-in replacement for a plain `<input name=\"address\">`: consumers keep\nreading `new FormData(form).get(\"address\")` and calling `form.reset()`\nunchanged.\n\nSupports two suggestion sources:\n- **API** (default): fetches from `endpoint`, a Mapbox Geocoding v6-shaped\n forward-geocode URL, debounced as the user types.\n- **Local array**: set `suggestions` to a fixed `AddressSuggestion[]` and\n the component filters it client-side instead of making any network\n request. Useful for small/fixed address lists, offline use, or tests.\n Takes priority over `endpoint` whenever it's non-null.",
12
+ "name": "AddressAutocomplete",
13
+ "members": [
14
+ {
15
+ "kind": "field",
16
+ "name": "formAssociated",
17
+ "type": {
18
+ "text": "boolean"
19
+ },
20
+ "static": true,
21
+ "default": "true"
22
+ },
23
+ {
24
+ "kind": "field",
25
+ "name": "value",
26
+ "type": {
27
+ "text": "string"
28
+ },
29
+ "default": "\"\"",
30
+ "description": "Current input value; also the form-associated value submitted with the form.",
31
+ "attribute": "value"
32
+ },
33
+ {
34
+ "kind": "field",
35
+ "name": "placeholder",
36
+ "type": {
37
+ "text": "string"
38
+ },
39
+ "default": "\"\"",
40
+ "description": "Placeholder text shown when the input is empty.",
41
+ "attribute": "placeholder"
42
+ },
43
+ {
44
+ "kind": "field",
45
+ "name": "required",
46
+ "type": {
47
+ "text": "boolean"
48
+ },
49
+ "default": "false",
50
+ "description": "Marks the input as required for native form validation.",
51
+ "attribute": "required"
52
+ },
53
+ {
54
+ "kind": "field",
55
+ "name": "types",
56
+ "type": {
57
+ "text": "string"
58
+ },
59
+ "default": "\"address\"",
60
+ "description": "Mapbox `types` param, e.g. \"address\" or \"address,poi\".",
61
+ "attribute": "types"
62
+ },
63
+ {
64
+ "kind": "field",
65
+ "name": "endpoint",
66
+ "type": {
67
+ "text": "string"
68
+ },
69
+ "default": "\"https://api.mapbox.com/search/geocode/v6/forward\"",
70
+ "description": "Geocoding endpoint URL. Defaults to the Mapbox Geocoding v6 forward URL.",
71
+ "attribute": "endpoint"
72
+ },
73
+ {
74
+ "kind": "field",
75
+ "name": "accessToken",
76
+ "type": {
77
+ "text": "string"
78
+ },
79
+ "default": "\"\"",
80
+ "description": "Mapbox access token. Required for requests to succeed.",
81
+ "attribute": "access-token"
82
+ },
83
+ {
84
+ "kind": "field",
85
+ "name": "bbox",
86
+ "type": {
87
+ "text": "string"
88
+ },
89
+ "default": "\"\"",
90
+ "description": "Optional bounding box bias, comma-separated `west,south,east,north`.",
91
+ "attribute": "bbox"
92
+ },
93
+ {
94
+ "kind": "field",
95
+ "name": "proximity",
96
+ "type": {
97
+ "text": "string"
98
+ },
99
+ "default": "\"\"",
100
+ "description": "Optional proximity bias, comma-separated `lng,lat`.",
101
+ "attribute": "proximity"
102
+ },
103
+ {
104
+ "kind": "field",
105
+ "name": "debounce",
106
+ "type": {
107
+ "text": "number"
108
+ },
109
+ "default": "300",
110
+ "description": "Debounce delay (ms) before firing a geocode request after typing.",
111
+ "attribute": "debounce"
112
+ },
113
+ {
114
+ "kind": "field",
115
+ "name": "minLength",
116
+ "type": {
117
+ "text": "number"
118
+ },
119
+ "default": "3",
120
+ "description": "Minimum query length before suggestions are fetched.",
121
+ "attribute": "min-length"
122
+ },
123
+ {
124
+ "kind": "field",
125
+ "name": "suggestions",
126
+ "type": {
127
+ "text": "AddressSuggestion[] | null"
128
+ },
129
+ "default": "null",
130
+ "description": "Fixed candidate list to filter locally instead of fetching from\n`endpoint`. When set (non-null), no network request is ever made —\nthis takes priority over the API mode."
131
+ },
132
+ {
133
+ "kind": "field",
134
+ "name": "_suggestions",
135
+ "type": {
136
+ "text": "AddressSuggestion[]"
137
+ },
138
+ "privacy": "private",
139
+ "default": "[]"
140
+ },
141
+ {
142
+ "kind": "field",
143
+ "name": "_open",
144
+ "type": {
145
+ "text": "boolean"
146
+ },
147
+ "privacy": "private",
148
+ "default": "false"
149
+ },
150
+ {
151
+ "kind": "field",
152
+ "name": "_activeIndex",
153
+ "type": {
154
+ "text": "number"
155
+ },
156
+ "privacy": "private",
157
+ "default": "-1"
158
+ },
159
+ {
160
+ "kind": "field",
161
+ "name": "#internals",
162
+ "privacy": "private"
163
+ },
164
+ {
165
+ "kind": "field",
166
+ "name": "#lastPicked",
167
+ "privacy": "private",
168
+ "type": {
169
+ "text": "AddressSuggestion | null"
170
+ },
171
+ "default": "null"
172
+ },
173
+ {
174
+ "kind": "field",
175
+ "name": "#debounceTimer",
176
+ "privacy": "private",
177
+ "type": {
178
+ "text": "ReturnType<typeof setTimeout> | null"
179
+ },
180
+ "default": "null"
181
+ },
182
+ {
183
+ "kind": "field",
184
+ "name": "#abortController",
185
+ "privacy": "private",
186
+ "type": {
187
+ "text": "AbortController | null"
188
+ },
189
+ "default": "null"
190
+ },
191
+ {
192
+ "kind": "field",
193
+ "name": "selectedSuggestion",
194
+ "type": {
195
+ "text": "AddressSuggestion | null"
196
+ },
197
+ "description": "Last-picked suggestion, or null once the input diverges from it.",
198
+ "readonly": true
199
+ },
200
+ {
201
+ "kind": "method",
202
+ "name": "formResetCallback",
203
+ "description": "Resets to empty on `form.reset()`, per the form-associated custom element contract."
204
+ },
205
+ {
206
+ "kind": "method",
207
+ "name": "onInput",
208
+ "privacy": "private",
209
+ "parameters": [
210
+ {
211
+ "name": "e",
212
+ "type": {
213
+ "text": "InputEvent"
214
+ }
215
+ }
216
+ ]
217
+ },
218
+ {
219
+ "kind": "method",
220
+ "name": "#scheduleFetch",
221
+ "privacy": "private",
222
+ "parameters": [
223
+ {
224
+ "name": "query",
225
+ "type": {
226
+ "text": "string"
227
+ }
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "kind": "method",
233
+ "name": "#filterLocalSuggestions",
234
+ "privacy": "private",
235
+ "parameters": [
236
+ {
237
+ "name": "query",
238
+ "type": {
239
+ "text": "string"
240
+ }
241
+ }
242
+ ],
243
+ "description": "Filters the locally-supplied `suggestions` list for `query`, case-insensitively."
244
+ },
245
+ {
246
+ "kind": "method",
247
+ "name": "#fetchSuggestions",
248
+ "privacy": "private",
249
+ "parameters": [
250
+ {
251
+ "name": "query",
252
+ "type": {
253
+ "text": "string"
254
+ }
255
+ }
256
+ ],
257
+ "description": "Fetches suggestions for `query`, cancelling any request still in flight."
258
+ },
259
+ {
260
+ "kind": "method",
261
+ "name": "#buildUrl",
262
+ "privacy": "private",
263
+ "return": {
264
+ "type": {
265
+ "text": "string"
266
+ }
267
+ },
268
+ "parameters": [
269
+ {
270
+ "name": "query",
271
+ "type": {
272
+ "text": "string"
273
+ }
274
+ }
275
+ ]
276
+ },
277
+ {
278
+ "kind": "method",
279
+ "name": "onKeydown",
280
+ "privacy": "private",
281
+ "parameters": [
282
+ {
283
+ "name": "e",
284
+ "type": {
285
+ "text": "KeyboardEvent"
286
+ }
287
+ }
288
+ ]
289
+ },
290
+ {
291
+ "kind": "method",
292
+ "name": "#moveActive",
293
+ "privacy": "private",
294
+ "parameters": [
295
+ {
296
+ "name": "delta",
297
+ "type": {
298
+ "text": "number"
299
+ }
300
+ },
301
+ {
302
+ "name": "e",
303
+ "type": {
304
+ "text": "KeyboardEvent"
305
+ }
306
+ }
307
+ ]
308
+ },
309
+ {
310
+ "kind": "method",
311
+ "name": "#handleEnter",
312
+ "privacy": "private",
313
+ "parameters": [
314
+ {
315
+ "name": "e",
316
+ "type": {
317
+ "text": "KeyboardEvent"
318
+ }
319
+ }
320
+ ]
321
+ },
322
+ {
323
+ "kind": "method",
324
+ "name": "#handleEscape",
325
+ "privacy": "private",
326
+ "parameters": [
327
+ {
328
+ "name": "e",
329
+ "type": {
330
+ "text": "KeyboardEvent"
331
+ }
332
+ }
333
+ ]
334
+ },
335
+ {
336
+ "kind": "method",
337
+ "name": "onBlur",
338
+ "privacy": "private"
339
+ },
340
+ {
341
+ "kind": "method",
342
+ "name": "#selectSuggestion",
343
+ "privacy": "private",
344
+ "parameters": [
345
+ {
346
+ "name": "s",
347
+ "type": {
348
+ "text": "AddressSuggestion"
349
+ }
350
+ }
351
+ ]
352
+ },
353
+ {
354
+ "kind": "method",
355
+ "name": "#onSuggestionMousedown",
356
+ "privacy": "private",
357
+ "parameters": [
358
+ {
359
+ "name": "e",
360
+ "type": {
361
+ "text": "MouseEvent"
362
+ }
363
+ },
364
+ {
365
+ "name": "s",
366
+ "type": {
367
+ "text": "AddressSuggestion"
368
+ }
369
+ }
370
+ ],
371
+ "description": "Selects on mousedown (not click) so it wins over the input's blur, which closes the list."
372
+ },
373
+ {
374
+ "kind": "method",
375
+ "name": "renderSuggestions",
376
+ "privacy": "private"
377
+ }
378
+ ],
379
+ "events": [
380
+ {
381
+ "name": "address-select",
382
+ "type": {
383
+ "text": "CustomEvent"
384
+ },
385
+ "description": "A suggestion was picked; detail: AddressSuggestion."
386
+ }
387
+ ],
388
+ "attributes": [
389
+ {
390
+ "name": "value",
391
+ "type": {
392
+ "text": "string"
393
+ },
394
+ "default": "\"\"",
395
+ "description": "Current input value; also the form-associated value submitted with the form.",
396
+ "fieldName": "value"
397
+ },
398
+ {
399
+ "name": "placeholder",
400
+ "type": {
401
+ "text": "string"
402
+ },
403
+ "default": "\"\"",
404
+ "description": "Placeholder text shown when the input is empty.",
405
+ "fieldName": "placeholder"
406
+ },
407
+ {
408
+ "name": "required",
409
+ "type": {
410
+ "text": "boolean"
411
+ },
412
+ "default": "false",
413
+ "description": "Marks the input as required for native form validation.",
414
+ "fieldName": "required"
415
+ },
416
+ {
417
+ "name": "types",
418
+ "type": {
419
+ "text": "string"
420
+ },
421
+ "default": "\"address\"",
422
+ "description": "Mapbox `types` param, e.g. \"address\" or \"address,poi\".",
423
+ "fieldName": "types"
424
+ },
425
+ {
426
+ "name": "endpoint",
427
+ "type": {
428
+ "text": "string"
429
+ },
430
+ "default": "\"https://api.mapbox.com/search/geocode/v6/forward\"",
431
+ "description": "Geocoding endpoint URL. Defaults to the Mapbox Geocoding v6 forward URL.",
432
+ "fieldName": "endpoint"
433
+ },
434
+ {
435
+ "name": "access-token",
436
+ "type": {
437
+ "text": "string"
438
+ },
439
+ "default": "\"\"",
440
+ "description": "Mapbox access token. Required for requests to succeed.",
441
+ "fieldName": "accessToken"
442
+ },
443
+ {
444
+ "name": "bbox",
445
+ "type": {
446
+ "text": "string"
447
+ },
448
+ "default": "\"\"",
449
+ "description": "Optional bounding box bias, comma-separated `west,south,east,north`.",
450
+ "fieldName": "bbox"
451
+ },
452
+ {
453
+ "name": "proximity",
454
+ "type": {
455
+ "text": "string"
456
+ },
457
+ "default": "\"\"",
458
+ "description": "Optional proximity bias, comma-separated `lng,lat`.",
459
+ "fieldName": "proximity"
460
+ },
461
+ {
462
+ "name": "debounce",
463
+ "type": {
464
+ "text": "number"
465
+ },
466
+ "default": "300",
467
+ "description": "Debounce delay (ms) before firing a geocode request after typing.",
468
+ "fieldName": "debounce"
469
+ },
470
+ {
471
+ "name": "min-length",
472
+ "type": {
473
+ "text": "number"
474
+ },
475
+ "default": "3",
476
+ "description": "Minimum query length before suggestions are fetched.",
477
+ "fieldName": "minLength"
478
+ }
479
+ ],
480
+ "superclass": {
481
+ "name": "LitElement",
482
+ "package": "lit"
483
+ },
484
+ "tagName": "address-autocomplete",
485
+ "customElement": true
486
+ }
487
+ ],
488
+ "exports": [
489
+ {
490
+ "kind": "js",
491
+ "name": "AddressAutocomplete",
492
+ "declaration": {
493
+ "name": "AddressAutocomplete",
494
+ "module": "src/address-autocomplete.ts"
495
+ }
496
+ },
497
+ {
498
+ "kind": "custom-element-definition",
499
+ "name": "address-autocomplete",
500
+ "declaration": {
501
+ "name": "AddressAutocomplete",
502
+ "module": "src/address-autocomplete.ts"
503
+ }
504
+ }
505
+ ]
506
+ },
507
+ {
508
+ "kind": "javascript-module",
509
+ "path": "src/animate-confetti.ts",
510
+ "declarations": [
511
+ {
512
+ "kind": "class",
513
+ "description": "Fullscreen confetti animation overlay, rendered on a fixed-position canvas.\nStarts automatically on first render and stops after `duration` ms.",
514
+ "name": "AnimateConfetti",
515
+ "members": [
516
+ {
517
+ "kind": "field",
518
+ "name": "duration",
519
+ "type": {
520
+ "text": "number"
521
+ },
522
+ "default": "6000",
523
+ "description": "How long the confetti streams before stopping, in ms.",
524
+ "attribute": "duration"
525
+ },
526
+ {
527
+ "kind": "field",
528
+ "name": "maxParticleCount",
529
+ "type": {
530
+ "text": "number"
531
+ },
532
+ "privacy": "private",
533
+ "default": "150"
534
+ },
535
+ {
536
+ "kind": "field",
537
+ "name": "particleSpeed",
538
+ "type": {
539
+ "text": "number"
540
+ },
541
+ "privacy": "private",
542
+ "default": "2"
543
+ },
544
+ {
545
+ "kind": "field",
546
+ "name": "particles",
547
+ "type": {
548
+ "text": "Particle[]"
549
+ },
550
+ "privacy": "private",
551
+ "default": "[]"
552
+ },
553
+ {
554
+ "kind": "field",
555
+ "name": "streamingConfetti",
556
+ "type": {
557
+ "text": "boolean"
558
+ },
559
+ "privacy": "private",
560
+ "default": "false"
561
+ },
562
+ {
563
+ "kind": "field",
564
+ "name": "colors",
565
+ "type": {
566
+ "text": "array"
567
+ },
568
+ "privacy": "private",
569
+ "default": "[ \"DodgerBlue\", \"OliveDrab\", \"Gold\", \"Pink\", \"SlateBlue\", \"LightBlue\", \"Violet\", \"PaleGreen\", \"SteelBlue\", \"SandyBrown\", \"Chocolate\", \"Crimson\", ]"
570
+ },
571
+ {
572
+ "kind": "field",
573
+ "name": "waveAngle",
574
+ "type": {
575
+ "text": "number"
576
+ },
577
+ "privacy": "private",
578
+ "default": "0.0"
579
+ },
580
+ {
581
+ "kind": "field",
582
+ "name": "animationTimer",
583
+ "type": {
584
+ "text": "number | undefined"
585
+ },
586
+ "privacy": "private"
587
+ },
588
+ {
589
+ "kind": "field",
590
+ "name": "_canvas",
591
+ "type": {
592
+ "text": "HTMLCanvasElement"
593
+ },
594
+ "privacy": "private",
595
+ "return": {
596
+ "type": {
597
+ "text": ""
598
+ }
599
+ },
600
+ "readonly": true
601
+ },
602
+ {
603
+ "kind": "field",
604
+ "name": "_handleResize",
605
+ "privacy": "private",
606
+ "description": "Resize canvas to browser size."
607
+ },
608
+ {
609
+ "kind": "method",
610
+ "name": "startConfetti",
611
+ "privacy": "private"
612
+ },
613
+ {
614
+ "kind": "field",
615
+ "name": "runAnimation",
616
+ "privacy": "private"
617
+ },
618
+ {
619
+ "kind": "method",
620
+ "name": "stopConfetti",
621
+ "privacy": "private",
622
+ "description": "Stop confetti and clean up after reasonable time."
623
+ },
624
+ {
625
+ "kind": "method",
626
+ "name": "_cleanup",
627
+ "privacy": "private",
628
+ "return": {
629
+ "type": {
630
+ "text": "void"
631
+ }
632
+ },
633
+ "description": "Removes any associated particle data from internal storage to regain memory."
634
+ },
635
+ {
636
+ "kind": "method",
637
+ "name": "updateParticles",
638
+ "privacy": "private"
639
+ },
640
+ {
641
+ "kind": "method",
642
+ "name": "drawParticles",
643
+ "privacy": "private",
644
+ "parameters": [
645
+ {
646
+ "name": "context",
647
+ "type": {
648
+ "text": "CanvasRenderingContext2D | null"
649
+ }
650
+ }
651
+ ]
652
+ },
653
+ {
654
+ "kind": "method",
655
+ "name": "resetParticle",
656
+ "privacy": "private",
657
+ "return": {
658
+ "type": {
659
+ "text": "Particle"
660
+ }
661
+ },
662
+ "parameters": [
663
+ {
664
+ "name": "particle",
665
+ "type": {
666
+ "text": "Particle"
667
+ }
668
+ },
669
+ {
670
+ "name": "width",
671
+ "type": {
672
+ "text": "number"
673
+ }
674
+ },
675
+ {
676
+ "name": "height",
677
+ "type": {
678
+ "text": "number"
679
+ }
680
+ }
681
+ ]
682
+ }
683
+ ],
684
+ "attributes": [
685
+ {
686
+ "name": "duration",
687
+ "type": {
688
+ "text": "number"
689
+ },
690
+ "default": "6000",
691
+ "description": "How long the confetti streams before stopping, in ms.",
692
+ "fieldName": "duration"
693
+ }
694
+ ],
695
+ "superclass": {
696
+ "name": "LitElement",
697
+ "package": "lit"
698
+ },
699
+ "tagName": "animate-confetti",
700
+ "customElement": true
701
+ }
702
+ ],
703
+ "exports": [
704
+ {
705
+ "kind": "js",
706
+ "name": "AnimateConfetti",
707
+ "declaration": {
708
+ "name": "AnimateConfetti",
709
+ "module": "src/animate-confetti.ts"
710
+ }
711
+ },
712
+ {
713
+ "kind": "custom-element-definition",
714
+ "name": "animate-confetti",
715
+ "declaration": {
716
+ "name": "AnimateConfetti",
717
+ "module": "src/animate-confetti.ts"
718
+ }
719
+ }
720
+ ]
721
+ },
722
+ {
723
+ "kind": "javascript-module",
724
+ "path": "src/autocomplete-input.ts",
725
+ "declarations": [
726
+ {
727
+ "kind": "class",
728
+ "description": "Generic form-associated text input with a suggestion dropdown, for any\n\"type to filter a list of `{key, value}` options\" use case. Works as a\ndrop-in replacement for a plain `<input>` inside a `<form>`: set `name` on\nthe element itself and consumers keep reading\n`new FormData(form).get(name)` and calling `form.reset()` unchanged — the\nsubmitted value is the picked option's `value`, while `key` is available\nvia the `option-select` event and the `selectedOption` getter for cases\nthat need the underlying id rather than the display text.\n\nSupports two suggestion sources:\n- **API**: set `endpoint` to a URL that, given a `?<query-param>=<text>`\n query string, responds with a JSON array of `{key, value}` objects.\n Requests are debounced as the user types.\n- **Local array**: set `options` to a fixed `AutocompleteOption[]` and the\n component filters it client-side instead of making any network\n request. Useful for small/fixed lists, offline use, or tests. Takes\n priority over `endpoint` whenever it's non-null.",
729
+ "name": "AutocompleteInput",
730
+ "members": [
731
+ {
732
+ "kind": "field",
733
+ "name": "formAssociated",
734
+ "type": {
735
+ "text": "boolean"
736
+ },
737
+ "static": true,
738
+ "default": "true"
739
+ },
740
+ {
741
+ "kind": "field",
742
+ "name": "value",
743
+ "type": {
744
+ "text": "string"
745
+ },
746
+ "default": "\"\"",
747
+ "description": "Current input value; also the form-associated value submitted with the form.",
748
+ "attribute": "value"
749
+ },
750
+ {
751
+ "kind": "field",
752
+ "name": "placeholder",
753
+ "type": {
754
+ "text": "string"
755
+ },
756
+ "default": "\"\"",
757
+ "description": "Placeholder text shown when the input is empty.",
758
+ "attribute": "placeholder"
759
+ },
760
+ {
761
+ "kind": "field",
762
+ "name": "required",
763
+ "type": {
764
+ "text": "boolean"
765
+ },
766
+ "default": "false",
767
+ "description": "Marks the input as required for native form validation.",
768
+ "attribute": "required"
769
+ },
770
+ {
771
+ "kind": "field",
772
+ "name": "endpoint",
773
+ "type": {
774
+ "text": "string"
775
+ },
776
+ "default": "\"\"",
777
+ "description": "API endpoint queried in API mode. Ignored when `options` is set.",
778
+ "attribute": "endpoint"
779
+ },
780
+ {
781
+ "kind": "field",
782
+ "name": "queryParam",
783
+ "type": {
784
+ "text": "string"
785
+ },
786
+ "default": "\"q\"",
787
+ "description": "Query string parameter name the current input text is sent under.",
788
+ "attribute": "query-param"
789
+ },
790
+ {
791
+ "kind": "field",
792
+ "name": "debounce",
793
+ "type": {
794
+ "text": "number"
795
+ },
796
+ "default": "300",
797
+ "description": "Debounce delay (ms) before firing a request/filter after typing.",
798
+ "attribute": "debounce"
799
+ },
800
+ {
801
+ "kind": "field",
802
+ "name": "minLength",
803
+ "type": {
804
+ "text": "number"
805
+ },
806
+ "default": "3",
807
+ "description": "Minimum query length before suggestions are shown.",
808
+ "attribute": "min-length"
809
+ },
810
+ {
811
+ "kind": "field",
812
+ "name": "options",
813
+ "type": {
814
+ "text": "AutocompleteOption[] | null"
815
+ },
816
+ "default": "null",
817
+ "description": "Fixed candidate list to filter locally instead of fetching from\n`endpoint`. When set (non-null), no network request is ever made —\nthis takes priority over the API mode."
818
+ },
819
+ {
820
+ "kind": "field",
821
+ "name": "_suggestions",
822
+ "type": {
823
+ "text": "AutocompleteOption[]"
824
+ },
825
+ "privacy": "private",
826
+ "default": "[]"
827
+ },
828
+ {
829
+ "kind": "field",
830
+ "name": "_open",
831
+ "type": {
832
+ "text": "boolean"
833
+ },
834
+ "privacy": "private",
835
+ "default": "false"
836
+ },
837
+ {
838
+ "kind": "field",
839
+ "name": "_activeIndex",
840
+ "type": {
841
+ "text": "number"
842
+ },
843
+ "privacy": "private",
844
+ "default": "-1"
845
+ },
846
+ {
847
+ "kind": "field",
848
+ "name": "#internals",
849
+ "privacy": "private"
850
+ },
851
+ {
852
+ "kind": "field",
853
+ "name": "#lastPicked",
854
+ "privacy": "private",
855
+ "type": {
856
+ "text": "AutocompleteOption | null"
857
+ },
858
+ "default": "null"
859
+ },
860
+ {
861
+ "kind": "field",
862
+ "name": "#debounceTimer",
863
+ "privacy": "private",
864
+ "type": {
865
+ "text": "ReturnType<typeof setTimeout> | null"
866
+ },
867
+ "default": "null"
868
+ },
869
+ {
870
+ "kind": "field",
871
+ "name": "#abortController",
872
+ "privacy": "private",
873
+ "type": {
874
+ "text": "AbortController | null"
875
+ },
876
+ "default": "null"
877
+ },
878
+ {
879
+ "kind": "field",
880
+ "name": "selectedOption",
881
+ "type": {
882
+ "text": "AutocompleteOption | null"
883
+ },
884
+ "description": "Last-picked option, or null once the input diverges from it.",
885
+ "readonly": true
886
+ },
887
+ {
888
+ "kind": "method",
889
+ "name": "formResetCallback",
890
+ "description": "Resets to empty on `form.reset()`, per the form-associated custom element contract."
891
+ },
892
+ {
893
+ "kind": "method",
894
+ "name": "onInput",
895
+ "privacy": "private",
896
+ "parameters": [
897
+ {
898
+ "name": "e",
899
+ "type": {
900
+ "text": "InputEvent"
901
+ }
902
+ }
903
+ ]
904
+ },
905
+ {
906
+ "kind": "method",
907
+ "name": "#scheduleFetch",
908
+ "privacy": "private",
909
+ "parameters": [
910
+ {
911
+ "name": "query",
912
+ "type": {
913
+ "text": "string"
914
+ }
915
+ }
916
+ ]
917
+ },
918
+ {
919
+ "kind": "method",
920
+ "name": "#filterLocalOptions",
921
+ "privacy": "private",
922
+ "parameters": [
923
+ {
924
+ "name": "query",
925
+ "type": {
926
+ "text": "string"
927
+ }
928
+ }
929
+ ],
930
+ "description": "Filters the locally-supplied `options` list for `query`, case-insensitively."
931
+ },
932
+ {
933
+ "kind": "method",
934
+ "name": "#fetchOptions",
935
+ "privacy": "private",
936
+ "parameters": [
937
+ {
938
+ "name": "query",
939
+ "type": {
940
+ "text": "string"
941
+ }
942
+ }
943
+ ],
944
+ "description": "Fetches options for `query` from `endpoint`, cancelling any request still in flight."
945
+ },
946
+ {
947
+ "kind": "method",
948
+ "name": "#buildUrl",
949
+ "privacy": "private",
950
+ "return": {
951
+ "type": {
952
+ "text": "string"
953
+ }
954
+ },
955
+ "parameters": [
956
+ {
957
+ "name": "query",
958
+ "type": {
959
+ "text": "string"
960
+ }
961
+ }
962
+ ]
963
+ },
964
+ {
965
+ "kind": "method",
966
+ "name": "onKeydown",
967
+ "privacy": "private",
968
+ "parameters": [
969
+ {
970
+ "name": "e",
971
+ "type": {
972
+ "text": "KeyboardEvent"
973
+ }
974
+ }
975
+ ]
976
+ },
977
+ {
978
+ "kind": "method",
979
+ "name": "#moveActive",
980
+ "privacy": "private",
981
+ "parameters": [
982
+ {
983
+ "name": "delta",
984
+ "type": {
985
+ "text": "number"
986
+ }
987
+ },
988
+ {
989
+ "name": "e",
990
+ "type": {
991
+ "text": "KeyboardEvent"
992
+ }
993
+ }
994
+ ]
995
+ },
996
+ {
997
+ "kind": "method",
998
+ "name": "#handleEnter",
999
+ "privacy": "private",
1000
+ "parameters": [
1001
+ {
1002
+ "name": "e",
1003
+ "type": {
1004
+ "text": "KeyboardEvent"
1005
+ }
1006
+ }
1007
+ ]
1008
+ },
1009
+ {
1010
+ "kind": "method",
1011
+ "name": "#handleEscape",
1012
+ "privacy": "private",
1013
+ "parameters": [
1014
+ {
1015
+ "name": "e",
1016
+ "type": {
1017
+ "text": "KeyboardEvent"
1018
+ }
1019
+ }
1020
+ ]
1021
+ },
1022
+ {
1023
+ "kind": "method",
1024
+ "name": "onBlur",
1025
+ "privacy": "private"
1026
+ },
1027
+ {
1028
+ "kind": "method",
1029
+ "name": "#selectOption",
1030
+ "privacy": "private",
1031
+ "parameters": [
1032
+ {
1033
+ "name": "o",
1034
+ "type": {
1035
+ "text": "AutocompleteOption"
1036
+ }
1037
+ }
1038
+ ]
1039
+ },
1040
+ {
1041
+ "kind": "method",
1042
+ "name": "#onSuggestionMousedown",
1043
+ "privacy": "private",
1044
+ "parameters": [
1045
+ {
1046
+ "name": "e",
1047
+ "type": {
1048
+ "text": "MouseEvent"
1049
+ }
1050
+ },
1051
+ {
1052
+ "name": "o",
1053
+ "type": {
1054
+ "text": "AutocompleteOption"
1055
+ }
1056
+ }
1057
+ ],
1058
+ "description": "Selects on mousedown (not click) so it wins over the input's blur, which closes the list."
1059
+ },
1060
+ {
1061
+ "kind": "method",
1062
+ "name": "renderSuggestions",
1063
+ "privacy": "private"
1064
+ }
1065
+ ],
1066
+ "events": [
1067
+ {
1068
+ "name": "option-select",
1069
+ "type": {
1070
+ "text": "CustomEvent"
1071
+ },
1072
+ "description": "An option was picked; detail: AutocompleteOption."
1073
+ }
1074
+ ],
1075
+ "attributes": [
1076
+ {
1077
+ "name": "value",
1078
+ "type": {
1079
+ "text": "string"
1080
+ },
1081
+ "default": "\"\"",
1082
+ "description": "Current input value; also the form-associated value submitted with the form.",
1083
+ "fieldName": "value"
1084
+ },
1085
+ {
1086
+ "name": "placeholder",
1087
+ "type": {
1088
+ "text": "string"
1089
+ },
1090
+ "default": "\"\"",
1091
+ "description": "Placeholder text shown when the input is empty.",
1092
+ "fieldName": "placeholder"
1093
+ },
1094
+ {
1095
+ "name": "required",
1096
+ "type": {
1097
+ "text": "boolean"
1098
+ },
1099
+ "default": "false",
1100
+ "description": "Marks the input as required for native form validation.",
1101
+ "fieldName": "required"
1102
+ },
1103
+ {
1104
+ "name": "endpoint",
1105
+ "type": {
1106
+ "text": "string"
1107
+ },
1108
+ "default": "\"\"",
1109
+ "description": "API endpoint queried in API mode. Ignored when `options` is set.",
1110
+ "fieldName": "endpoint"
1111
+ },
1112
+ {
1113
+ "name": "query-param",
1114
+ "type": {
1115
+ "text": "string"
1116
+ },
1117
+ "default": "\"q\"",
1118
+ "description": "Query string parameter name the current input text is sent under.",
1119
+ "fieldName": "queryParam"
1120
+ },
1121
+ {
1122
+ "name": "debounce",
1123
+ "type": {
1124
+ "text": "number"
1125
+ },
1126
+ "default": "300",
1127
+ "description": "Debounce delay (ms) before firing a request/filter after typing.",
1128
+ "fieldName": "debounce"
1129
+ },
1130
+ {
1131
+ "name": "min-length",
1132
+ "type": {
1133
+ "text": "number"
1134
+ },
1135
+ "default": "3",
1136
+ "description": "Minimum query length before suggestions are shown.",
1137
+ "fieldName": "minLength"
1138
+ }
1139
+ ],
1140
+ "superclass": {
1141
+ "name": "LitElement",
1142
+ "package": "lit"
1143
+ },
1144
+ "tagName": "autocomplete-input",
1145
+ "customElement": true
1146
+ }
1147
+ ],
1148
+ "exports": [
1149
+ {
1150
+ "kind": "js",
1151
+ "name": "AutocompleteInput",
1152
+ "declaration": {
1153
+ "name": "AutocompleteInput",
1154
+ "module": "src/autocomplete-input.ts"
1155
+ }
1156
+ },
1157
+ {
1158
+ "kind": "custom-element-definition",
1159
+ "name": "autocomplete-input",
1160
+ "declaration": {
1161
+ "name": "AutocompleteInput",
1162
+ "module": "src/autocomplete-input.ts"
1163
+ }
1164
+ }
1165
+ ]
1166
+ },
1167
+ {
1168
+ "kind": "javascript-module",
1169
+ "path": "src/confirm-dialog.ts",
1170
+ "declarations": [
1171
+ {
1172
+ "kind": "class",
1173
+ "description": "Reusable confirmation dialog: overlay + centered card with a slotted body,\nan optional error line, and Cancel/Confirm actions. Instant `display:none`\n→ `display:flex` toggle (no transitions). Fires `confirm`/`cancel`\n(bubbling, composed) instead of owning any deletion logic itself —\ncallers stay in charge of the request.",
1174
+ "name": "ConfirmDialog",
1175
+ "members": [
1176
+ {
1177
+ "kind": "field",
1178
+ "name": "open",
1179
+ "type": {
1180
+ "text": "boolean"
1181
+ },
1182
+ "default": "false",
1183
+ "description": "Whether the dialog is visible.",
1184
+ "attribute": "open"
1185
+ },
1186
+ {
1187
+ "kind": "field",
1188
+ "name": "confirmLabel",
1189
+ "type": {
1190
+ "text": "string"
1191
+ },
1192
+ "default": "\"Delete\"",
1193
+ "description": "Label for the confirm button.",
1194
+ "attribute": "confirm-label"
1195
+ },
1196
+ {
1197
+ "kind": "field",
1198
+ "name": "cancelLabel",
1199
+ "type": {
1200
+ "text": "string"
1201
+ },
1202
+ "default": "\"Cancel\"",
1203
+ "description": "Label for the cancel button.",
1204
+ "attribute": "cancel-label"
1205
+ },
1206
+ {
1207
+ "kind": "field",
1208
+ "name": "danger",
1209
+ "type": {
1210
+ "text": "boolean"
1211
+ },
1212
+ "default": "true",
1213
+ "description": "Danger (red) vs. primary (indigo) styling for the confirm button.",
1214
+ "attribute": "danger"
1215
+ },
1216
+ {
1217
+ "kind": "field",
1218
+ "name": "busy",
1219
+ "type": {
1220
+ "text": "boolean"
1221
+ },
1222
+ "default": "false",
1223
+ "description": "Shows a spinner and disables both buttons while a request is in flight.",
1224
+ "attribute": "busy"
1225
+ },
1226
+ {
1227
+ "kind": "field",
1228
+ "name": "error",
1229
+ "type": {
1230
+ "text": "string | null"
1231
+ },
1232
+ "default": "null",
1233
+ "description": "Inline error line shown below the body, or null for none.",
1234
+ "attribute": "error"
1235
+ },
1236
+ {
1237
+ "kind": "method",
1238
+ "name": "_confirm",
1239
+ "privacy": "private"
1240
+ },
1241
+ {
1242
+ "kind": "method",
1243
+ "name": "_cancel",
1244
+ "privacy": "private"
1245
+ }
1246
+ ],
1247
+ "events": [
1248
+ {
1249
+ "name": "confirm",
1250
+ "type": {
1251
+ "text": "CustomEvent"
1252
+ },
1253
+ "description": "User clicked the confirm button."
1254
+ },
1255
+ {
1256
+ "name": "cancel",
1257
+ "type": {
1258
+ "text": "CustomEvent"
1259
+ },
1260
+ "description": "User clicked the cancel button."
1261
+ }
1262
+ ],
1263
+ "attributes": [
1264
+ {
1265
+ "name": "open",
1266
+ "type": {
1267
+ "text": "boolean"
1268
+ },
1269
+ "default": "false",
1270
+ "description": "Whether the dialog is visible.",
1271
+ "fieldName": "open"
1272
+ },
1273
+ {
1274
+ "name": "confirm-label",
1275
+ "type": {
1276
+ "text": "string"
1277
+ },
1278
+ "default": "\"Delete\"",
1279
+ "description": "Label for the confirm button.",
1280
+ "fieldName": "confirmLabel"
1281
+ },
1282
+ {
1283
+ "name": "cancel-label",
1284
+ "type": {
1285
+ "text": "string"
1286
+ },
1287
+ "default": "\"Cancel\"",
1288
+ "description": "Label for the cancel button.",
1289
+ "fieldName": "cancelLabel"
1290
+ },
1291
+ {
1292
+ "name": "danger",
1293
+ "type": {
1294
+ "text": "boolean"
1295
+ },
1296
+ "default": "true",
1297
+ "description": "Danger (red) vs. primary (indigo) styling for the confirm button.",
1298
+ "fieldName": "danger"
1299
+ },
1300
+ {
1301
+ "name": "busy",
1302
+ "type": {
1303
+ "text": "boolean"
1304
+ },
1305
+ "default": "false",
1306
+ "description": "Shows a spinner and disables both buttons while a request is in flight.",
1307
+ "fieldName": "busy"
1308
+ },
1309
+ {
1310
+ "name": "error",
1311
+ "type": {
1312
+ "text": "string | null"
1313
+ },
1314
+ "default": "null",
1315
+ "description": "Inline error line shown below the body, or null for none.",
1316
+ "fieldName": "error"
1317
+ }
1318
+ ],
1319
+ "superclass": {
1320
+ "name": "LitElement",
1321
+ "package": "lit"
1322
+ },
1323
+ "tagName": "confirm-dialog",
1324
+ "customElement": true
1325
+ }
1326
+ ],
1327
+ "exports": [
1328
+ {
1329
+ "kind": "js",
1330
+ "name": "ConfirmDialog",
1331
+ "declaration": {
1332
+ "name": "ConfirmDialog",
1333
+ "module": "src/confirm-dialog.ts"
1334
+ }
1335
+ },
1336
+ {
1337
+ "kind": "custom-element-definition",
1338
+ "name": "confirm-dialog",
1339
+ "declaration": {
1340
+ "name": "ConfirmDialog",
1341
+ "module": "src/confirm-dialog.ts"
1342
+ }
1343
+ }
1344
+ ]
1345
+ },
1346
+ {
1347
+ "kind": "javascript-module",
1348
+ "path": "src/copy-link-button.ts",
1349
+ "declarations": [
1350
+ {
1351
+ "kind": "class",
1352
+ "description": "Small icon button that copies `value` to the clipboard and shows a toast\non success/failure (if a `<toast-notification>` element is present), and\nalways dispatches a `copy-success`/`copy-error` CustomEvent so consumers\nwithout a toast element can react. Defaults to the current page URL if\n`value` is unset.",
1353
+ "name": "CopyLinkButton",
1354
+ "members": [
1355
+ {
1356
+ "kind": "field",
1357
+ "name": "value",
1358
+ "type": {
1359
+ "text": "string"
1360
+ },
1361
+ "default": "\"\"",
1362
+ "description": "Text to copy. Defaults to `window.location.href` at click time.",
1363
+ "attribute": "value"
1364
+ },
1365
+ {
1366
+ "kind": "field",
1367
+ "name": "label",
1368
+ "type": {
1369
+ "text": "string"
1370
+ },
1371
+ "default": "\"Copy link\"",
1372
+ "description": "Accessible label / tooltip text.",
1373
+ "attribute": "label"
1374
+ },
1375
+ {
1376
+ "kind": "method",
1377
+ "name": "_onClick",
1378
+ "privacy": "private"
1379
+ }
1380
+ ],
1381
+ "events": [
1382
+ {
1383
+ "name": "copy-success",
1384
+ "type": {
1385
+ "text": "CustomEvent"
1386
+ },
1387
+ "description": "The value was copied to the clipboard."
1388
+ },
1389
+ {
1390
+ "name": "copy-error",
1391
+ "type": {
1392
+ "text": "CustomEvent"
1393
+ },
1394
+ "description": "Copying to the clipboard failed."
1395
+ }
1396
+ ],
1397
+ "attributes": [
1398
+ {
1399
+ "name": "value",
1400
+ "type": {
1401
+ "text": "string"
1402
+ },
1403
+ "default": "\"\"",
1404
+ "description": "Text to copy. Defaults to `window.location.href` at click time.",
1405
+ "fieldName": "value"
1406
+ },
1407
+ {
1408
+ "name": "label",
1409
+ "type": {
1410
+ "text": "string"
1411
+ },
1412
+ "default": "\"Copy link\"",
1413
+ "description": "Accessible label / tooltip text.",
1414
+ "fieldName": "label"
1415
+ }
1416
+ ],
1417
+ "superclass": {
1418
+ "name": "LitElement",
1419
+ "package": "lit"
1420
+ },
1421
+ "tagName": "copy-link-button",
1422
+ "customElement": true
1423
+ }
1424
+ ],
1425
+ "exports": [
1426
+ {
1427
+ "kind": "js",
1428
+ "name": "CopyLinkButton",
1429
+ "declaration": {
1430
+ "name": "CopyLinkButton",
1431
+ "module": "src/copy-link-button.ts"
1432
+ }
1433
+ },
1434
+ {
1435
+ "kind": "custom-element-definition",
1436
+ "name": "copy-link-button",
1437
+ "declaration": {
1438
+ "name": "CopyLinkButton",
1439
+ "module": "src/copy-link-button.ts"
1440
+ }
1441
+ }
1442
+ ]
1443
+ },
1444
+ {
1445
+ "kind": "javascript-module",
1446
+ "path": "src/distance-value.ts",
1447
+ "declarations": [
1448
+ {
1449
+ "kind": "class",
1450
+ "description": "Inline distance display. Renders miles/feet or km/m, switching units at\nsensible thresholds (< 0.25 mi → ft; < 0.5 km → m).\n\nSupply exactly one of `miles` or `km`; the other stays null.\nkm support is present but reserved for future use.",
1451
+ "name": "DistanceValue",
1452
+ "members": [
1453
+ {
1454
+ "kind": "field",
1455
+ "name": "miles",
1456
+ "type": {
1457
+ "text": "number | null"
1458
+ },
1459
+ "default": "null",
1460
+ "description": "Distance in miles (imperial). Switches to feet below 0.25 mi.",
1461
+ "attribute": "miles"
1462
+ },
1463
+ {
1464
+ "kind": "field",
1465
+ "name": "km",
1466
+ "type": {
1467
+ "text": "number | null"
1468
+ },
1469
+ "default": "null",
1470
+ "description": "Distance in kilometers (metric, future). Switches to meters below 0.5 km.",
1471
+ "attribute": "km"
1472
+ }
1473
+ ],
1474
+ "attributes": [
1475
+ {
1476
+ "name": "miles",
1477
+ "type": {
1478
+ "text": "number | null"
1479
+ },
1480
+ "default": "null",
1481
+ "description": "Distance in miles (imperial). Switches to feet below 0.25 mi.",
1482
+ "fieldName": "miles"
1483
+ },
1484
+ {
1485
+ "name": "km",
1486
+ "type": {
1487
+ "text": "number | null"
1488
+ },
1489
+ "default": "null",
1490
+ "description": "Distance in kilometers (metric, future). Switches to meters below 0.5 km.",
1491
+ "fieldName": "km"
1492
+ }
1493
+ ],
1494
+ "superclass": {
1495
+ "name": "LitElement",
1496
+ "package": "lit"
1497
+ },
1498
+ "tagName": "distance-value",
1499
+ "customElement": true
1500
+ }
1501
+ ],
1502
+ "exports": [
1503
+ {
1504
+ "kind": "js",
1505
+ "name": "DistanceValue",
1506
+ "declaration": {
1507
+ "name": "DistanceValue",
1508
+ "module": "src/distance-value.ts"
1509
+ }
1510
+ },
1511
+ {
1512
+ "kind": "custom-element-definition",
1513
+ "name": "distance-value",
1514
+ "declaration": {
1515
+ "name": "DistanceValue",
1516
+ "module": "src/distance-value.ts"
1517
+ }
1518
+ }
1519
+ ]
1520
+ },
1521
+ {
1522
+ "kind": "javascript-module",
1523
+ "path": "src/distribution-chart.ts",
1524
+ "declarations": [
1525
+ {
1526
+ "kind": "class",
1527
+ "description": "Renders a KDE distribution curve for a named metric with one or more value\nmarkers. The SVG viewBox is kept in sync with the element's pixel width via\nResizeObserver so that font sizes and stroke widths are always in real pixels\nregardless of container width.\n\nPass `fontSize` to control all text size (default 11). Pass a single\n`{label:'', value}` for a single-value display or multiple\n`{label:'A'|'B'|...}` entries to compare several values.",
1528
+ "name": "DistributionChart",
1529
+ "members": [
1530
+ {
1531
+ "kind": "field",
1532
+ "name": "metric",
1533
+ "type": {
1534
+ "text": "string"
1535
+ },
1536
+ "default": "\"\"",
1537
+ "description": "Metric name, fetched from `/api/distribution/<metric>` on change.",
1538
+ "attribute": "metric"
1539
+ },
1540
+ {
1541
+ "kind": "field",
1542
+ "name": "values",
1543
+ "type": {
1544
+ "text": "DistributionValue[]"
1545
+ },
1546
+ "default": "[]",
1547
+ "description": "One or more values to mark on the distribution curve."
1548
+ },
1549
+ {
1550
+ "kind": "field",
1551
+ "name": "markerColors",
1552
+ "type": {
1553
+ "text": "string[]"
1554
+ },
1555
+ "default": "[\"#4f46e5\", \"#d97706\", \"#0d9488\", \"#e11d48\"]",
1556
+ "description": "Colors assigned to markers in order. Defaults to indigo/amber/teal/rose 600s."
1557
+ },
1558
+ {
1559
+ "kind": "field",
1560
+ "name": "fontSize",
1561
+ "type": {
1562
+ "text": "number"
1563
+ },
1564
+ "default": "11",
1565
+ "description": "Target font size in CSS pixels (default 11). Always renders at this size regardless of container width.",
1566
+ "attribute": "font-size"
1567
+ },
1568
+ {
1569
+ "kind": "field",
1570
+ "name": "_data",
1571
+ "type": {
1572
+ "text": "DistributionData | null"
1573
+ },
1574
+ "privacy": "private",
1575
+ "default": "null"
1576
+ },
1577
+ {
1578
+ "kind": "field",
1579
+ "name": "_loading",
1580
+ "type": {
1581
+ "text": "boolean"
1582
+ },
1583
+ "privacy": "private",
1584
+ "default": "false"
1585
+ },
1586
+ {
1587
+ "kind": "field",
1588
+ "name": "_error",
1589
+ "type": {
1590
+ "text": "string | null"
1591
+ },
1592
+ "privacy": "private",
1593
+ "default": "null"
1594
+ },
1595
+ {
1596
+ "kind": "field",
1597
+ "name": "_width",
1598
+ "type": {
1599
+ "text": "number"
1600
+ },
1601
+ "privacy": "private",
1602
+ "default": "0",
1603
+ "description": "Measured element width in CSS pixels. 0 until ResizeObserver fires."
1604
+ },
1605
+ {
1606
+ "kind": "field",
1607
+ "name": "_hoverX",
1608
+ "type": {
1609
+ "text": "number | null"
1610
+ },
1611
+ "privacy": "private",
1612
+ "default": "null",
1613
+ "description": "Inner x coordinate (px) of the current hover position, or null when not hovering."
1614
+ },
1615
+ {
1616
+ "kind": "field",
1617
+ "name": "_fetchedFor",
1618
+ "type": {
1619
+ "text": "string"
1620
+ },
1621
+ "privacy": "private",
1622
+ "default": "\"\""
1623
+ },
1624
+ {
1625
+ "kind": "field",
1626
+ "name": "_ro",
1627
+ "type": {
1628
+ "text": "ResizeObserver | null"
1629
+ },
1630
+ "privacy": "private",
1631
+ "default": "null"
1632
+ },
1633
+ {
1634
+ "kind": "method",
1635
+ "name": "_maybeFetch",
1636
+ "privacy": "private"
1637
+ },
1638
+ {
1639
+ "kind": "method",
1640
+ "name": "_renderSvg",
1641
+ "privacy": "private",
1642
+ "parameters": [
1643
+ {
1644
+ "name": "data",
1645
+ "type": {
1646
+ "text": "DistributionData"
1647
+ }
1648
+ }
1649
+ ]
1650
+ },
1651
+ {
1652
+ "kind": "method",
1653
+ "name": "_renderLegend",
1654
+ "privacy": "private",
1655
+ "parameters": [
1656
+ {
1657
+ "name": "data",
1658
+ "type": {
1659
+ "text": "DistributionData"
1660
+ }
1661
+ }
1662
+ ]
1663
+ }
1664
+ ],
1665
+ "attributes": [
1666
+ {
1667
+ "name": "metric",
1668
+ "type": {
1669
+ "text": "string"
1670
+ },
1671
+ "default": "\"\"",
1672
+ "description": "Metric name, fetched from `/api/distribution/<metric>` on change.",
1673
+ "fieldName": "metric"
1674
+ },
1675
+ {
1676
+ "name": "font-size",
1677
+ "type": {
1678
+ "text": "number"
1679
+ },
1680
+ "default": "11",
1681
+ "description": "Target font size in CSS pixels (default 11). Always renders at this size regardless of container width.",
1682
+ "fieldName": "fontSize"
1683
+ }
1684
+ ],
1685
+ "superclass": {
1686
+ "name": "LitElement",
1687
+ "package": "lit"
1688
+ },
1689
+ "tagName": "distribution-chart",
1690
+ "customElement": true
1691
+ }
1692
+ ],
1693
+ "exports": [
1694
+ {
1695
+ "kind": "js",
1696
+ "name": "DistributionChart",
1697
+ "declaration": {
1698
+ "name": "DistributionChart",
1699
+ "module": "src/distribution-chart.ts"
1700
+ }
1701
+ },
1702
+ {
1703
+ "kind": "custom-element-definition",
1704
+ "name": "distribution-chart",
1705
+ "declaration": {
1706
+ "name": "DistributionChart",
1707
+ "module": "src/distribution-chart.ts"
1708
+ }
1709
+ }
1710
+ ]
1711
+ },
1712
+ {
1713
+ "kind": "javascript-module",
1714
+ "path": "src/icons.ts",
1715
+ "declarations": [
1716
+ {
1717
+ "kind": "function",
1718
+ "name": "iconX",
1719
+ "parameters": [
1720
+ {
1721
+ "name": "size",
1722
+ "default": "18"
1723
+ }
1724
+ ]
1725
+ },
1726
+ {
1727
+ "kind": "function",
1728
+ "name": "iconBars3",
1729
+ "parameters": [
1730
+ {
1731
+ "name": "size",
1732
+ "default": "18"
1733
+ }
1734
+ ]
1735
+ },
1736
+ {
1737
+ "kind": "function",
1738
+ "name": "iconChevronLeft",
1739
+ "parameters": [
1740
+ {
1741
+ "name": "size",
1742
+ "default": "16"
1743
+ }
1744
+ ]
1745
+ },
1746
+ {
1747
+ "kind": "function",
1748
+ "name": "iconChevronRight",
1749
+ "parameters": [
1750
+ {
1751
+ "name": "size",
1752
+ "default": "16"
1753
+ }
1754
+ ]
1755
+ },
1756
+ {
1757
+ "kind": "function",
1758
+ "name": "iconCog",
1759
+ "parameters": [
1760
+ {
1761
+ "name": "size",
1762
+ "default": "20"
1763
+ }
1764
+ ]
1765
+ },
1766
+ {
1767
+ "kind": "function",
1768
+ "name": "iconInfo",
1769
+ "parameters": [
1770
+ {
1771
+ "name": "size",
1772
+ "default": "20"
1773
+ }
1774
+ ]
1775
+ },
1776
+ {
1777
+ "kind": "function",
1778
+ "name": "iconQuestionMarkCircle",
1779
+ "parameters": [
1780
+ {
1781
+ "name": "size",
1782
+ "default": "20"
1783
+ }
1784
+ ]
1785
+ },
1786
+ {
1787
+ "kind": "function",
1788
+ "name": "iconPencil",
1789
+ "parameters": [
1790
+ {
1791
+ "name": "size",
1792
+ "default": "16"
1793
+ }
1794
+ ]
1795
+ },
1796
+ {
1797
+ "kind": "function",
1798
+ "name": "iconTrash",
1799
+ "parameters": [
1800
+ {
1801
+ "name": "size",
1802
+ "default": "16"
1803
+ }
1804
+ ]
1805
+ },
1806
+ {
1807
+ "kind": "function",
1808
+ "name": "iconPlus",
1809
+ "parameters": [
1810
+ {
1811
+ "name": "size",
1812
+ "default": "16"
1813
+ }
1814
+ ]
1815
+ },
1816
+ {
1817
+ "kind": "function",
1818
+ "name": "iconListBullet",
1819
+ "parameters": [
1820
+ {
1821
+ "name": "size",
1822
+ "default": "18"
1823
+ }
1824
+ ]
1825
+ },
1826
+ {
1827
+ "kind": "function",
1828
+ "name": "iconCurrencyDollar",
1829
+ "parameters": [
1830
+ {
1831
+ "name": "size",
1832
+ "default": "16"
1833
+ }
1834
+ ]
1835
+ },
1836
+ {
1837
+ "kind": "function",
1838
+ "name": "iconHome",
1839
+ "parameters": [
1840
+ {
1841
+ "name": "size",
1842
+ "default": "16"
1843
+ }
1844
+ ]
1845
+ },
1846
+ {
1847
+ "kind": "function",
1848
+ "name": "iconMapPin",
1849
+ "parameters": [
1850
+ {
1851
+ "name": "size",
1852
+ "default": "16"
1853
+ }
1854
+ ]
1855
+ },
1856
+ {
1857
+ "kind": "function",
1858
+ "name": "iconClock",
1859
+ "parameters": [
1860
+ {
1861
+ "name": "size",
1862
+ "default": "16"
1863
+ }
1864
+ ]
1865
+ },
1866
+ {
1867
+ "kind": "function",
1868
+ "name": "iconTag",
1869
+ "parameters": [
1870
+ {
1871
+ "name": "size",
1872
+ "default": "16"
1873
+ }
1874
+ ]
1875
+ },
1876
+ {
1877
+ "kind": "function",
1878
+ "name": "iconCalendar",
1879
+ "parameters": [
1880
+ {
1881
+ "name": "size",
1882
+ "default": "16"
1883
+ }
1884
+ ]
1885
+ },
1886
+ {
1887
+ "kind": "function",
1888
+ "name": "iconArrowsPointingOut",
1889
+ "parameters": [
1890
+ {
1891
+ "name": "size",
1892
+ "default": "16"
1893
+ }
1894
+ ]
1895
+ },
1896
+ {
1897
+ "kind": "function",
1898
+ "name": "iconMap",
1899
+ "parameters": [
1900
+ {
1901
+ "name": "size",
1902
+ "default": "16"
1903
+ }
1904
+ ]
1905
+ },
1906
+ {
1907
+ "kind": "function",
1908
+ "name": "iconCheckCircle",
1909
+ "parameters": [
1910
+ {
1911
+ "name": "size",
1912
+ "default": "16"
1913
+ }
1914
+ ]
1915
+ },
1916
+ {
1917
+ "kind": "function",
1918
+ "name": "iconSun",
1919
+ "parameters": [
1920
+ {
1921
+ "name": "size",
1922
+ "default": "16"
1923
+ }
1924
+ ]
1925
+ },
1926
+ {
1927
+ "kind": "function",
1928
+ "name": "iconShieldExclamation",
1929
+ "parameters": [
1930
+ {
1931
+ "name": "size",
1932
+ "default": "16"
1933
+ }
1934
+ ]
1935
+ },
1936
+ {
1937
+ "kind": "function",
1938
+ "name": "iconArrowPath",
1939
+ "parameters": [
1940
+ {
1941
+ "name": "size",
1942
+ "default": "12"
1943
+ }
1944
+ ]
1945
+ },
1946
+ {
1947
+ "kind": "function",
1948
+ "name": "iconArrowRight",
1949
+ "parameters": [
1950
+ {
1951
+ "name": "size",
1952
+ "default": "12"
1953
+ }
1954
+ ]
1955
+ },
1956
+ {
1957
+ "kind": "function",
1958
+ "name": "iconLink",
1959
+ "parameters": [
1960
+ {
1961
+ "name": "size",
1962
+ "default": "16"
1963
+ }
1964
+ ]
1965
+ },
1966
+ {
1967
+ "kind": "function",
1968
+ "name": "iconHeart",
1969
+ "parameters": [
1970
+ {
1971
+ "name": "size",
1972
+ "default": "16"
1973
+ }
1974
+ ]
1975
+ },
1976
+ {
1977
+ "kind": "function",
1978
+ "name": "iconHeartSolid",
1979
+ "parameters": [
1980
+ {
1981
+ "name": "size",
1982
+ "default": "16"
1983
+ }
1984
+ ]
1985
+ },
1986
+ {
1987
+ "kind": "function",
1988
+ "name": "iconEye",
1989
+ "parameters": [
1990
+ {
1991
+ "name": "size",
1992
+ "default": "16"
1993
+ }
1994
+ ]
1995
+ },
1996
+ {
1997
+ "kind": "function",
1998
+ "name": "iconEyeSlash",
1999
+ "parameters": [
2000
+ {
2001
+ "name": "size",
2002
+ "default": "16"
2003
+ }
2004
+ ]
2005
+ },
2006
+ {
2007
+ "kind": "function",
2008
+ "name": "iconShieldCheck",
2009
+ "parameters": [
2010
+ {
2011
+ "name": "size",
2012
+ "default": "16"
2013
+ }
2014
+ ]
2015
+ },
2016
+ {
2017
+ "kind": "function",
2018
+ "name": "iconUserCircle",
2019
+ "parameters": [
2020
+ {
2021
+ "name": "size",
2022
+ "default": "20"
2023
+ }
2024
+ ]
2025
+ }
2026
+ ],
2027
+ "exports": [
2028
+ {
2029
+ "kind": "js",
2030
+ "name": "iconX",
2031
+ "declaration": {
2032
+ "name": "iconX",
2033
+ "module": "src/icons.ts"
2034
+ }
2035
+ },
2036
+ {
2037
+ "kind": "js",
2038
+ "name": "iconBars3",
2039
+ "declaration": {
2040
+ "name": "iconBars3",
2041
+ "module": "src/icons.ts"
2042
+ }
2043
+ },
2044
+ {
2045
+ "kind": "js",
2046
+ "name": "iconChevronLeft",
2047
+ "declaration": {
2048
+ "name": "iconChevronLeft",
2049
+ "module": "src/icons.ts"
2050
+ }
2051
+ },
2052
+ {
2053
+ "kind": "js",
2054
+ "name": "iconChevronRight",
2055
+ "declaration": {
2056
+ "name": "iconChevronRight",
2057
+ "module": "src/icons.ts"
2058
+ }
2059
+ },
2060
+ {
2061
+ "kind": "js",
2062
+ "name": "iconCog",
2063
+ "declaration": {
2064
+ "name": "iconCog",
2065
+ "module": "src/icons.ts"
2066
+ }
2067
+ },
2068
+ {
2069
+ "kind": "js",
2070
+ "name": "iconInfo",
2071
+ "declaration": {
2072
+ "name": "iconInfo",
2073
+ "module": "src/icons.ts"
2074
+ }
2075
+ },
2076
+ {
2077
+ "kind": "js",
2078
+ "name": "iconQuestionMarkCircle",
2079
+ "declaration": {
2080
+ "name": "iconQuestionMarkCircle",
2081
+ "module": "src/icons.ts"
2082
+ }
2083
+ },
2084
+ {
2085
+ "kind": "js",
2086
+ "name": "iconPencil",
2087
+ "declaration": {
2088
+ "name": "iconPencil",
2089
+ "module": "src/icons.ts"
2090
+ }
2091
+ },
2092
+ {
2093
+ "kind": "js",
2094
+ "name": "iconTrash",
2095
+ "declaration": {
2096
+ "name": "iconTrash",
2097
+ "module": "src/icons.ts"
2098
+ }
2099
+ },
2100
+ {
2101
+ "kind": "js",
2102
+ "name": "iconPlus",
2103
+ "declaration": {
2104
+ "name": "iconPlus",
2105
+ "module": "src/icons.ts"
2106
+ }
2107
+ },
2108
+ {
2109
+ "kind": "js",
2110
+ "name": "iconListBullet",
2111
+ "declaration": {
2112
+ "name": "iconListBullet",
2113
+ "module": "src/icons.ts"
2114
+ }
2115
+ },
2116
+ {
2117
+ "kind": "js",
2118
+ "name": "iconCurrencyDollar",
2119
+ "declaration": {
2120
+ "name": "iconCurrencyDollar",
2121
+ "module": "src/icons.ts"
2122
+ }
2123
+ },
2124
+ {
2125
+ "kind": "js",
2126
+ "name": "iconHome",
2127
+ "declaration": {
2128
+ "name": "iconHome",
2129
+ "module": "src/icons.ts"
2130
+ }
2131
+ },
2132
+ {
2133
+ "kind": "js",
2134
+ "name": "iconMapPin",
2135
+ "declaration": {
2136
+ "name": "iconMapPin",
2137
+ "module": "src/icons.ts"
2138
+ }
2139
+ },
2140
+ {
2141
+ "kind": "js",
2142
+ "name": "iconClock",
2143
+ "declaration": {
2144
+ "name": "iconClock",
2145
+ "module": "src/icons.ts"
2146
+ }
2147
+ },
2148
+ {
2149
+ "kind": "js",
2150
+ "name": "iconTag",
2151
+ "declaration": {
2152
+ "name": "iconTag",
2153
+ "module": "src/icons.ts"
2154
+ }
2155
+ },
2156
+ {
2157
+ "kind": "js",
2158
+ "name": "iconCalendar",
2159
+ "declaration": {
2160
+ "name": "iconCalendar",
2161
+ "module": "src/icons.ts"
2162
+ }
2163
+ },
2164
+ {
2165
+ "kind": "js",
2166
+ "name": "iconArrowsPointingOut",
2167
+ "declaration": {
2168
+ "name": "iconArrowsPointingOut",
2169
+ "module": "src/icons.ts"
2170
+ }
2171
+ },
2172
+ {
2173
+ "kind": "js",
2174
+ "name": "iconMap",
2175
+ "declaration": {
2176
+ "name": "iconMap",
2177
+ "module": "src/icons.ts"
2178
+ }
2179
+ },
2180
+ {
2181
+ "kind": "js",
2182
+ "name": "iconCheckCircle",
2183
+ "declaration": {
2184
+ "name": "iconCheckCircle",
2185
+ "module": "src/icons.ts"
2186
+ }
2187
+ },
2188
+ {
2189
+ "kind": "js",
2190
+ "name": "iconSun",
2191
+ "declaration": {
2192
+ "name": "iconSun",
2193
+ "module": "src/icons.ts"
2194
+ }
2195
+ },
2196
+ {
2197
+ "kind": "js",
2198
+ "name": "iconShieldExclamation",
2199
+ "declaration": {
2200
+ "name": "iconShieldExclamation",
2201
+ "module": "src/icons.ts"
2202
+ }
2203
+ },
2204
+ {
2205
+ "kind": "js",
2206
+ "name": "iconArrowPath",
2207
+ "declaration": {
2208
+ "name": "iconArrowPath",
2209
+ "module": "src/icons.ts"
2210
+ }
2211
+ },
2212
+ {
2213
+ "kind": "js",
2214
+ "name": "iconArrowRight",
2215
+ "declaration": {
2216
+ "name": "iconArrowRight",
2217
+ "module": "src/icons.ts"
2218
+ }
2219
+ },
2220
+ {
2221
+ "kind": "js",
2222
+ "name": "iconLink",
2223
+ "declaration": {
2224
+ "name": "iconLink",
2225
+ "module": "src/icons.ts"
2226
+ }
2227
+ },
2228
+ {
2229
+ "kind": "js",
2230
+ "name": "iconHeart",
2231
+ "declaration": {
2232
+ "name": "iconHeart",
2233
+ "module": "src/icons.ts"
2234
+ }
2235
+ },
2236
+ {
2237
+ "kind": "js",
2238
+ "name": "iconHeartSolid",
2239
+ "declaration": {
2240
+ "name": "iconHeartSolid",
2241
+ "module": "src/icons.ts"
2242
+ }
2243
+ },
2244
+ {
2245
+ "kind": "js",
2246
+ "name": "iconEye",
2247
+ "declaration": {
2248
+ "name": "iconEye",
2249
+ "module": "src/icons.ts"
2250
+ }
2251
+ },
2252
+ {
2253
+ "kind": "js",
2254
+ "name": "iconEyeSlash",
2255
+ "declaration": {
2256
+ "name": "iconEyeSlash",
2257
+ "module": "src/icons.ts"
2258
+ }
2259
+ },
2260
+ {
2261
+ "kind": "js",
2262
+ "name": "iconShieldCheck",
2263
+ "declaration": {
2264
+ "name": "iconShieldCheck",
2265
+ "module": "src/icons.ts"
2266
+ }
2267
+ },
2268
+ {
2269
+ "kind": "js",
2270
+ "name": "iconUserCircle",
2271
+ "declaration": {
2272
+ "name": "iconUserCircle",
2273
+ "module": "src/icons.ts"
2274
+ }
2275
+ }
2276
+ ]
2277
+ },
2278
+ {
2279
+ "kind": "javascript-module",
2280
+ "path": "src/index.ts",
2281
+ "declarations": [],
2282
+ "exports": [
2283
+ {
2284
+ "kind": "js",
2285
+ "name": "AnimateConfetti",
2286
+ "declaration": {
2287
+ "name": "AnimateConfetti",
2288
+ "module": "./animate-confetti.js"
2289
+ }
2290
+ },
2291
+ {
2292
+ "kind": "js",
2293
+ "name": "RevealButton",
2294
+ "declaration": {
2295
+ "name": "RevealButton",
2296
+ "module": "./reveal-button.js"
2297
+ }
2298
+ },
2299
+ {
2300
+ "kind": "js",
2301
+ "name": "RomanNumeral",
2302
+ "declaration": {
2303
+ "name": "RomanNumeral",
2304
+ "module": "./roman-numeral.js"
2305
+ }
2306
+ },
2307
+ {
2308
+ "kind": "js",
2309
+ "name": "ConfirmDialog",
2310
+ "declaration": {
2311
+ "name": "ConfirmDialog",
2312
+ "module": "./confirm-dialog.js"
2313
+ }
2314
+ },
2315
+ {
2316
+ "kind": "js",
2317
+ "name": "ToastNotification",
2318
+ "declaration": {
2319
+ "name": "ToastNotification",
2320
+ "module": "./toast-notification.js"
2321
+ }
2322
+ },
2323
+ {
2324
+ "kind": "js",
2325
+ "name": "notifySuccess",
2326
+ "declaration": {
2327
+ "name": "notifySuccess",
2328
+ "module": "./toast-notification.js"
2329
+ }
2330
+ },
2331
+ {
2332
+ "kind": "js",
2333
+ "name": "notifyError",
2334
+ "declaration": {
2335
+ "name": "notifyError",
2336
+ "module": "./toast-notification.js"
2337
+ }
2338
+ },
2339
+ {
2340
+ "kind": "js",
2341
+ "name": "notifyInfo",
2342
+ "declaration": {
2343
+ "name": "notifyInfo",
2344
+ "module": "./toast-notification.js"
2345
+ }
2346
+ },
2347
+ {
2348
+ "kind": "js",
2349
+ "name": "ToastVariant",
2350
+ "declaration": {
2351
+ "name": "ToastVariant",
2352
+ "module": "./toast-notification.js"
2353
+ }
2354
+ },
2355
+ {
2356
+ "kind": "js",
2357
+ "name": "SlidePanel",
2358
+ "declaration": {
2359
+ "name": "SlidePanel",
2360
+ "module": "./slide-panel.js"
2361
+ }
2362
+ },
2363
+ {
2364
+ "kind": "js",
2365
+ "name": "CopyLinkButton",
2366
+ "declaration": {
2367
+ "name": "CopyLinkButton",
2368
+ "module": "./copy-link-button.js"
2369
+ }
2370
+ },
2371
+ {
2372
+ "kind": "js",
2373
+ "name": "RelativeTime",
2374
+ "declaration": {
2375
+ "name": "RelativeTime",
2376
+ "module": "./relative-time.js"
2377
+ }
2378
+ },
2379
+ {
2380
+ "kind": "js",
2381
+ "name": "DistanceValue",
2382
+ "declaration": {
2383
+ "name": "DistanceValue",
2384
+ "module": "./distance-value.js"
2385
+ }
2386
+ },
2387
+ {
2388
+ "kind": "js",
2389
+ "name": "PriceHistoryChart",
2390
+ "declaration": {
2391
+ "name": "PriceHistoryChart",
2392
+ "module": "./price-history-chart.js"
2393
+ }
2394
+ },
2395
+ {
2396
+ "kind": "js",
2397
+ "name": "PricePoint",
2398
+ "declaration": {
2399
+ "name": "PricePoint",
2400
+ "module": "./price-history-chart.js"
2401
+ }
2402
+ },
2403
+ {
2404
+ "kind": "js",
2405
+ "name": "DistributionChart",
2406
+ "declaration": {
2407
+ "name": "DistributionChart",
2408
+ "module": "./distribution-chart.js"
2409
+ }
2410
+ },
2411
+ {
2412
+ "kind": "js",
2413
+ "name": "DistributionValue",
2414
+ "declaration": {
2415
+ "name": "DistributionValue",
2416
+ "module": "./distribution-chart.js"
2417
+ }
2418
+ },
2419
+ {
2420
+ "kind": "js",
2421
+ "name": "PercentBarChart",
2422
+ "declaration": {
2423
+ "name": "PercentBarChart",
2424
+ "module": "./percent-bar-chart.js"
2425
+ }
2426
+ },
2427
+ {
2428
+ "kind": "js",
2429
+ "name": "PercentBarGroup",
2430
+ "declaration": {
2431
+ "name": "PercentBarGroup",
2432
+ "module": "./percent-bar-chart.js"
2433
+ }
2434
+ },
2435
+ {
2436
+ "kind": "js",
2437
+ "name": "WeightBarChart",
2438
+ "declaration": {
2439
+ "name": "WeightBarChart",
2440
+ "module": "./weight-bar-chart.js"
2441
+ }
2442
+ },
2443
+ {
2444
+ "kind": "js",
2445
+ "name": "WeightBarItem",
2446
+ "declaration": {
2447
+ "name": "WeightBarItem",
2448
+ "module": "./weight-bar-chart.js"
2449
+ }
2450
+ },
2451
+ {
2452
+ "kind": "js",
2453
+ "name": "AddressAutocomplete",
2454
+ "declaration": {
2455
+ "name": "AddressAutocomplete",
2456
+ "module": "./address-autocomplete.js"
2457
+ }
2458
+ },
2459
+ {
2460
+ "kind": "js",
2461
+ "name": "AddressSuggestion",
2462
+ "declaration": {
2463
+ "name": "AddressSuggestion",
2464
+ "module": "./address-autocomplete.js"
2465
+ }
2466
+ },
2467
+ {
2468
+ "kind": "js",
2469
+ "name": "AutocompleteInput",
2470
+ "declaration": {
2471
+ "name": "AutocompleteInput",
2472
+ "module": "./autocomplete-input.js"
2473
+ }
2474
+ },
2475
+ {
2476
+ "kind": "js",
2477
+ "name": "AutocompleteOption",
2478
+ "declaration": {
2479
+ "name": "AutocompleteOption",
2480
+ "module": "./autocomplete-input.js"
2481
+ }
2482
+ },
2483
+ {
2484
+ "kind": "js",
2485
+ "name": "tokens",
2486
+ "declaration": {
2487
+ "name": "tokens",
2488
+ "module": "./tokens.js"
2489
+ }
2490
+ },
2491
+ {
2492
+ "kind": "js",
2493
+ "name": "tokenValues",
2494
+ "declaration": {
2495
+ "name": "tokenValues",
2496
+ "module": "./tokens.js"
2497
+ }
2498
+ },
2499
+ {
2500
+ "kind": "js",
2501
+ "name": "*",
2502
+ "declaration": {
2503
+ "name": "*",
2504
+ "module": "src/icons.js"
2505
+ }
2506
+ }
2507
+ ]
2508
+ },
2509
+ {
2510
+ "kind": "javascript-module",
2511
+ "path": "src/percent-bar-chart.ts",
2512
+ "declarations": [
2513
+ {
2514
+ "kind": "class",
2515
+ "description": "Horizontal bar chart for labeled percentage rows, using D3's linear scale.\nEach group gets its own labeled row; bars are proportional to percentage of 100.",
2516
+ "name": "PercentBarChart",
2517
+ "members": [
2518
+ {
2519
+ "kind": "field",
2520
+ "name": "groups",
2521
+ "type": {
2522
+ "text": "PercentBarGroup[]"
2523
+ },
2524
+ "default": "[]",
2525
+ "description": "Rows to render, one per group."
2526
+ },
2527
+ {
2528
+ "kind": "field",
2529
+ "name": "_width",
2530
+ "type": {
2531
+ "text": "number"
2532
+ },
2533
+ "privacy": "private",
2534
+ "default": "0"
2535
+ },
2536
+ {
2537
+ "kind": "field",
2538
+ "name": "_ro",
2539
+ "type": {
2540
+ "text": "ResizeObserver | null"
2541
+ },
2542
+ "privacy": "private",
2543
+ "default": "null"
2544
+ }
2545
+ ],
2546
+ "superclass": {
2547
+ "name": "LitElement",
2548
+ "package": "lit"
2549
+ },
2550
+ "tagName": "percent-bar-chart",
2551
+ "customElement": true
2552
+ }
2553
+ ],
2554
+ "exports": [
2555
+ {
2556
+ "kind": "js",
2557
+ "name": "PercentBarChart",
2558
+ "declaration": {
2559
+ "name": "PercentBarChart",
2560
+ "module": "src/percent-bar-chart.ts"
2561
+ }
2562
+ },
2563
+ {
2564
+ "kind": "custom-element-definition",
2565
+ "name": "percent-bar-chart",
2566
+ "declaration": {
2567
+ "name": "PercentBarChart",
2568
+ "module": "src/percent-bar-chart.ts"
2569
+ }
2570
+ }
2571
+ ]
2572
+ },
2573
+ {
2574
+ "kind": "javascript-module",
2575
+ "path": "src/price-history-chart.ts",
2576
+ "declarations": [
2577
+ {
2578
+ "kind": "class",
2579
+ "description": "D3-powered SVG line chart for property price history.\n\nUses scaleTime (X) + scaleLinear (Y) from d3-scale and line/area path\ngenerators from d3-shape. Adapts to container width via ResizeObserver.",
2580
+ "name": "PriceHistoryChart",
2581
+ "members": [
2582
+ {
2583
+ "kind": "field",
2584
+ "name": "history",
2585
+ "type": {
2586
+ "text": "PricePoint[]"
2587
+ },
2588
+ "default": "[]",
2589
+ "description": "Array of price points (points with null price/date are skipped).",
2590
+ "attribute": "history"
2591
+ },
2592
+ {
2593
+ "kind": "field",
2594
+ "name": "yLabels",
2595
+ "type": {
2596
+ "text": "\"auto\" | \"always\" | \"never\""
2597
+ },
2598
+ "default": "\"auto\"",
2599
+ "description": "\"auto\" (default) | \"always\" | \"never\"",
2600
+ "attribute": "y-labels"
2601
+ },
2602
+ {
2603
+ "kind": "field",
2604
+ "name": "maxXLabels",
2605
+ "type": {
2606
+ "text": "number"
2607
+ },
2608
+ "default": "3",
2609
+ "description": "Max X-axis date ticks (default 3).",
2610
+ "attribute": "max-x-labels"
2611
+ },
2612
+ {
2613
+ "kind": "field",
2614
+ "name": "_width",
2615
+ "type": {
2616
+ "text": "number"
2617
+ },
2618
+ "privacy": "private",
2619
+ "default": "0"
2620
+ },
2621
+ {
2622
+ "kind": "field",
2623
+ "name": "_hoveredIdx",
2624
+ "type": {
2625
+ "text": "number | null"
2626
+ },
2627
+ "privacy": "private",
2628
+ "default": "null"
2629
+ },
2630
+ {
2631
+ "kind": "field",
2632
+ "name": "_ro",
2633
+ "type": {
2634
+ "text": "ResizeObserver | null"
2635
+ },
2636
+ "privacy": "private",
2637
+ "default": "null"
2638
+ },
2639
+ {
2640
+ "kind": "field",
2641
+ "name": "validPoints",
2642
+ "type": {
2643
+ "text": "PricePoint[]"
2644
+ },
2645
+ "privacy": "private",
2646
+ "readonly": true
2647
+ },
2648
+ {
2649
+ "kind": "field",
2650
+ "name": "showY",
2651
+ "type": {
2652
+ "text": "boolean"
2653
+ },
2654
+ "privacy": "private",
2655
+ "readonly": true
2656
+ },
2657
+ {
2658
+ "kind": "method",
2659
+ "name": "computeLayout",
2660
+ "privacy": "private"
2661
+ }
2662
+ ],
2663
+ "attributes": [
2664
+ {
2665
+ "name": "history",
2666
+ "type": {
2667
+ "text": "PricePoint[]"
2668
+ },
2669
+ "default": "[]",
2670
+ "description": "Array of price points (points with null price/date are skipped).",
2671
+ "fieldName": "history"
2672
+ },
2673
+ {
2674
+ "name": "y-labels",
2675
+ "type": {
2676
+ "text": "\"auto\" | \"always\" | \"never\""
2677
+ },
2678
+ "default": "\"auto\"",
2679
+ "description": "\"auto\" (default) | \"always\" | \"never\"",
2680
+ "fieldName": "yLabels"
2681
+ },
2682
+ {
2683
+ "name": "max-x-labels",
2684
+ "type": {
2685
+ "text": "number"
2686
+ },
2687
+ "default": "3",
2688
+ "description": "Max X-axis date ticks (default 3).",
2689
+ "fieldName": "maxXLabels"
2690
+ }
2691
+ ],
2692
+ "superclass": {
2693
+ "name": "LitElement",
2694
+ "package": "lit"
2695
+ },
2696
+ "tagName": "price-history-chart",
2697
+ "customElement": true
2698
+ }
2699
+ ],
2700
+ "exports": [
2701
+ {
2702
+ "kind": "js",
2703
+ "name": "PriceHistoryChart",
2704
+ "declaration": {
2705
+ "name": "PriceHistoryChart",
2706
+ "module": "src/price-history-chart.ts"
2707
+ }
2708
+ },
2709
+ {
2710
+ "kind": "custom-element-definition",
2711
+ "name": "price-history-chart",
2712
+ "declaration": {
2713
+ "name": "PriceHistoryChart",
2714
+ "module": "src/price-history-chart.ts"
2715
+ }
2716
+ }
2717
+ ]
2718
+ },
2719
+ {
2720
+ "kind": "javascript-module",
2721
+ "path": "src/relative-time.ts",
2722
+ "declarations": [
2723
+ {
2724
+ "kind": "class",
2725
+ "description": "Inline relative-time display (e.g. \"3 hours ago\"). Accepts either a\nstandard ISO 8601 string or a SQLite `datetime('now')` string\n(\"YYYY-MM-DD HH:MM:SS\", UTC, no zone marker) via `datetime`. Shows the\nfull date/time in the viewer's local timezone as a hover tooltip, and\nre-renders on an interval so the text stays current while visible.",
2726
+ "name": "RelativeTime",
2727
+ "members": [
2728
+ {
2729
+ "kind": "field",
2730
+ "name": "datetime",
2731
+ "type": {
2732
+ "text": "string | null"
2733
+ },
2734
+ "default": "null",
2735
+ "description": "Timestamp to render, relative to now.",
2736
+ "attribute": "datetime"
2737
+ },
2738
+ {
2739
+ "kind": "field",
2740
+ "name": "_now",
2741
+ "privacy": "private"
2742
+ },
2743
+ {
2744
+ "kind": "field",
2745
+ "name": "_timer",
2746
+ "type": {
2747
+ "text": "ReturnType<typeof setInterval> | null"
2748
+ },
2749
+ "privacy": "private",
2750
+ "default": "null"
2751
+ }
2752
+ ],
2753
+ "attributes": [
2754
+ {
2755
+ "name": "datetime",
2756
+ "type": {
2757
+ "text": "string | null"
2758
+ },
2759
+ "default": "null",
2760
+ "description": "Timestamp to render, relative to now.",
2761
+ "fieldName": "datetime"
2762
+ }
2763
+ ],
2764
+ "superclass": {
2765
+ "name": "LitElement",
2766
+ "package": "lit"
2767
+ },
2768
+ "tagName": "relative-time",
2769
+ "customElement": true
2770
+ }
2771
+ ],
2772
+ "exports": [
2773
+ {
2774
+ "kind": "js",
2775
+ "name": "RelativeTime",
2776
+ "declaration": {
2777
+ "name": "RelativeTime",
2778
+ "module": "src/relative-time.ts"
2779
+ }
2780
+ },
2781
+ {
2782
+ "kind": "custom-element-definition",
2783
+ "name": "relative-time",
2784
+ "declaration": {
2785
+ "name": "RelativeTime",
2786
+ "module": "src/relative-time.ts"
2787
+ }
2788
+ }
2789
+ ]
2790
+ },
2791
+ {
2792
+ "kind": "javascript-module",
2793
+ "path": "src/reveal-button.ts",
2794
+ "declarations": [
2795
+ {
2796
+ "kind": "class",
2797
+ "description": "Button that reveals hidden slotted content when clicked.",
2798
+ "name": "RevealButton",
2799
+ "members": [
2800
+ {
2801
+ "kind": "field",
2802
+ "name": "label",
2803
+ "type": {
2804
+ "text": "string"
2805
+ },
2806
+ "default": "\"Reveal hidden content\"",
2807
+ "description": "Label shown on the button before it's clicked.",
2808
+ "attribute": "label"
2809
+ },
2810
+ {
2811
+ "kind": "method",
2812
+ "name": "_reveal",
2813
+ "privacy": "private"
2814
+ }
2815
+ ],
2816
+ "attributes": [
2817
+ {
2818
+ "name": "label",
2819
+ "type": {
2820
+ "text": "string"
2821
+ },
2822
+ "default": "\"Reveal hidden content\"",
2823
+ "description": "Label shown on the button before it's clicked.",
2824
+ "fieldName": "label"
2825
+ }
2826
+ ],
2827
+ "superclass": {
2828
+ "name": "LitElement",
2829
+ "package": "lit"
2830
+ },
2831
+ "tagName": "reveal-button",
2832
+ "customElement": true
2833
+ }
2834
+ ],
2835
+ "exports": [
2836
+ {
2837
+ "kind": "js",
2838
+ "name": "RevealButton",
2839
+ "declaration": {
2840
+ "name": "RevealButton",
2841
+ "module": "src/reveal-button.ts"
2842
+ }
2843
+ },
2844
+ {
2845
+ "kind": "custom-element-definition",
2846
+ "name": "reveal-button",
2847
+ "declaration": {
2848
+ "name": "RevealButton",
2849
+ "module": "src/reveal-button.ts"
2850
+ }
2851
+ }
2852
+ ]
2853
+ },
2854
+ {
2855
+ "kind": "javascript-module",
2856
+ "path": "src/roman-numeral.ts",
2857
+ "declarations": [
2858
+ {
2859
+ "kind": "class",
2860
+ "description": "Converts an integer to a roman numeral inline.",
2861
+ "name": "RomanNumeral",
2862
+ "members": [
2863
+ {
2864
+ "kind": "field",
2865
+ "name": "value",
2866
+ "type": {
2867
+ "text": "number | undefined"
2868
+ },
2869
+ "description": "Integer value to render as a roman numeral.",
2870
+ "attribute": "value"
2871
+ },
2872
+ {
2873
+ "kind": "method",
2874
+ "name": "_convertToRoman",
2875
+ "privacy": "private",
2876
+ "return": {
2877
+ "type": {
2878
+ "text": "string"
2879
+ }
2880
+ },
2881
+ "parameters": [
2882
+ {
2883
+ "name": "num",
2884
+ "optional": true,
2885
+ "type": {
2886
+ "text": "number"
2887
+ }
2888
+ }
2889
+ ]
2890
+ }
2891
+ ],
2892
+ "attributes": [
2893
+ {
2894
+ "name": "value",
2895
+ "type": {
2896
+ "text": "number | undefined"
2897
+ },
2898
+ "description": "Integer value to render as a roman numeral.",
2899
+ "fieldName": "value"
2900
+ }
2901
+ ],
2902
+ "superclass": {
2903
+ "name": "LitElement",
2904
+ "package": "lit"
2905
+ },
2906
+ "tagName": "roman-numeral",
2907
+ "customElement": true
2908
+ }
2909
+ ],
2910
+ "exports": [
2911
+ {
2912
+ "kind": "js",
2913
+ "name": "RomanNumeral",
2914
+ "declaration": {
2915
+ "name": "RomanNumeral",
2916
+ "module": "src/roman-numeral.ts"
2917
+ }
2918
+ },
2919
+ {
2920
+ "kind": "custom-element-definition",
2921
+ "name": "roman-numeral",
2922
+ "declaration": {
2923
+ "name": "RomanNumeral",
2924
+ "module": "src/roman-numeral.ts"
2925
+ }
2926
+ }
2927
+ ]
2928
+ },
2929
+ {
2930
+ "kind": "javascript-module",
2931
+ "path": "src/slide-panel.ts",
2932
+ "declarations": [
2933
+ {
2934
+ "kind": "class",
2935
+ "description": "Generic sliding panel shell. Handles positioning, open/close animation,\nheader chrome, and a close button. Body content is provided via the\ndefault slot; the consumer controls its own padding and overflow.\n\nDesktop: 300 px fixed right-side panel that slides from the right.\nMobile (≤768px): bottom-sheet drawer (60vh) — reserved for future use.",
2936
+ "name": "SlidePanel",
2937
+ "members": [
2938
+ {
2939
+ "kind": "field",
2940
+ "name": "open",
2941
+ "type": {
2942
+ "text": "boolean"
2943
+ },
2944
+ "default": "false",
2945
+ "description": "Whether the panel is currently visible.",
2946
+ "attribute": "open"
2947
+ },
2948
+ {
2949
+ "kind": "field",
2950
+ "name": "heading",
2951
+ "type": {
2952
+ "text": "string"
2953
+ },
2954
+ "default": "\"\"",
2955
+ "description": "Title text shown in the panel header (overridable via slot=\"title\").",
2956
+ "attribute": "heading"
2957
+ },
2958
+ {
2959
+ "kind": "method",
2960
+ "name": "_close",
2961
+ "privacy": "private"
2962
+ }
2963
+ ],
2964
+ "events": [
2965
+ {
2966
+ "name": "panel-close",
2967
+ "type": {
2968
+ "text": "CustomEvent"
2969
+ },
2970
+ "description": "User clicked the close (✕) button."
2971
+ }
2972
+ ],
2973
+ "attributes": [
2974
+ {
2975
+ "name": "open",
2976
+ "type": {
2977
+ "text": "boolean"
2978
+ },
2979
+ "default": "false",
2980
+ "description": "Whether the panel is currently visible.",
2981
+ "fieldName": "open"
2982
+ },
2983
+ {
2984
+ "name": "heading",
2985
+ "type": {
2986
+ "text": "string"
2987
+ },
2988
+ "default": "\"\"",
2989
+ "description": "Title text shown in the panel header (overridable via slot=\"title\").",
2990
+ "fieldName": "heading"
2991
+ }
2992
+ ],
2993
+ "superclass": {
2994
+ "name": "LitElement",
2995
+ "package": "lit"
2996
+ },
2997
+ "tagName": "slide-panel",
2998
+ "customElement": true
2999
+ }
3000
+ ],
3001
+ "exports": [
3002
+ {
3003
+ "kind": "js",
3004
+ "name": "SlidePanel",
3005
+ "declaration": {
3006
+ "name": "SlidePanel",
3007
+ "module": "src/slide-panel.ts"
3008
+ }
3009
+ },
3010
+ {
3011
+ "kind": "custom-element-definition",
3012
+ "name": "slide-panel",
3013
+ "declaration": {
3014
+ "name": "SlidePanel",
3015
+ "module": "src/slide-panel.ts"
3016
+ }
3017
+ }
3018
+ ]
3019
+ },
3020
+ {
3021
+ "kind": "javascript-module",
3022
+ "path": "src/toast-notification.ts",
3023
+ "declarations": [
3024
+ {
3025
+ "kind": "class",
3026
+ "description": "Fixed-position stack of dismissible notifications, anchored top-right\n(top-full-width on mobile). Not wired to any app state yet — callers add\ntoasts imperatively via the `show()` method on a live element reference,\ne.g. `document.querySelector('toast-notification')?.show('Offline', { variant: 'error' })`,\nor via the `notifySuccess`/`notifyError`/`notifyInfo` module-level helpers\nexported from this file. Each toast auto-dismisses after `duration` ms and\ncan also be dismissed via its ✕ button. Appears/disappears instantly — no\nslide/fade transitions.",
3027
+ "name": "ToastNotification",
3028
+ "members": [
3029
+ {
3030
+ "kind": "field",
3031
+ "name": "_toasts",
3032
+ "type": {
3033
+ "text": "Toast[]"
3034
+ },
3035
+ "privacy": "private",
3036
+ "default": "[]"
3037
+ },
3038
+ {
3039
+ "kind": "field",
3040
+ "name": "_nextId",
3041
+ "type": {
3042
+ "text": "number"
3043
+ },
3044
+ "privacy": "private",
3045
+ "default": "0"
3046
+ },
3047
+ {
3048
+ "kind": "field",
3049
+ "name": "_timers",
3050
+ "privacy": "private",
3051
+ "default": "new Map<number, ReturnType<typeof setTimeout>>()"
3052
+ },
3053
+ {
3054
+ "kind": "method",
3055
+ "name": "show",
3056
+ "return": {
3057
+ "type": {
3058
+ "text": ""
3059
+ }
3060
+ },
3061
+ "parameters": [
3062
+ {
3063
+ "name": "message",
3064
+ "type": {
3065
+ "text": "string"
3066
+ },
3067
+ "description": "Text to show."
3068
+ },
3069
+ {
3070
+ "name": "options",
3071
+ "default": "{}",
3072
+ "type": {
3073
+ "text": "ToastOptions"
3074
+ },
3075
+ "description": "Variant + auto-dismiss duration (see {@link ToastOptions}).\n * "
3076
+ }
3077
+ ],
3078
+ "description": "Queues a toast for display."
3079
+ },
3080
+ {
3081
+ "kind": "method",
3082
+ "name": "dismiss",
3083
+ "parameters": [
3084
+ {
3085
+ "name": "id",
3086
+ "type": {
3087
+ "text": "number"
3088
+ },
3089
+ "description": "The id returned by `show()`."
3090
+ }
3091
+ ],
3092
+ "description": "Removes a toast immediately, cancelling its pending auto-dismiss timer if any."
3093
+ }
3094
+ ],
3095
+ "superclass": {
3096
+ "name": "LitElement",
3097
+ "package": "lit"
3098
+ },
3099
+ "tagName": "toast-notification",
3100
+ "customElement": true
3101
+ },
3102
+ {
3103
+ "kind": "function",
3104
+ "name": "notifyError",
3105
+ "parameters": [
3106
+ {
3107
+ "name": "message",
3108
+ "type": {
3109
+ "text": "string"
3110
+ }
3111
+ }
3112
+ ],
3113
+ "description": "Shows an error toast. Use for connection/network failures, not validation errors."
3114
+ },
3115
+ {
3116
+ "kind": "function",
3117
+ "name": "notifySuccess",
3118
+ "parameters": [
3119
+ {
3120
+ "name": "message",
3121
+ "type": {
3122
+ "text": "string"
3123
+ }
3124
+ }
3125
+ ],
3126
+ "description": "Shows a success toast."
3127
+ },
3128
+ {
3129
+ "kind": "function",
3130
+ "name": "notifyInfo",
3131
+ "parameters": [
3132
+ {
3133
+ "name": "message",
3134
+ "type": {
3135
+ "text": "string"
3136
+ }
3137
+ }
3138
+ ],
3139
+ "description": "Shows an info toast."
3140
+ }
3141
+ ],
3142
+ "exports": [
3143
+ {
3144
+ "kind": "js",
3145
+ "name": "ToastNotification",
3146
+ "declaration": {
3147
+ "name": "ToastNotification",
3148
+ "module": "src/toast-notification.ts"
3149
+ }
3150
+ },
3151
+ {
3152
+ "kind": "custom-element-definition",
3153
+ "name": "toast-notification",
3154
+ "declaration": {
3155
+ "name": "ToastNotification",
3156
+ "module": "src/toast-notification.ts"
3157
+ }
3158
+ },
3159
+ {
3160
+ "kind": "js",
3161
+ "name": "notifyError",
3162
+ "declaration": {
3163
+ "name": "notifyError",
3164
+ "module": "src/toast-notification.ts"
3165
+ }
3166
+ },
3167
+ {
3168
+ "kind": "js",
3169
+ "name": "notifySuccess",
3170
+ "declaration": {
3171
+ "name": "notifySuccess",
3172
+ "module": "src/toast-notification.ts"
3173
+ }
3174
+ },
3175
+ {
3176
+ "kind": "js",
3177
+ "name": "notifyInfo",
3178
+ "declaration": {
3179
+ "name": "notifyInfo",
3180
+ "module": "src/toast-notification.ts"
3181
+ }
3182
+ }
3183
+ ]
3184
+ },
3185
+ {
3186
+ "kind": "javascript-module",
3187
+ "path": "src/tokens.ts",
3188
+ "declarations": [
3189
+ {
3190
+ "kind": "variable",
3191
+ "name": "tokenValues",
3192
+ "type": {
3193
+ "text": "Record<string, string>"
3194
+ },
3195
+ "default": "{ // Colors \"--ui-primary\": \"#4f46e5\", // indigo-600 \"--ui-primary-hover\": \"#4338ca\", // indigo-700 \"--ui-danger\": \"#dc2626\", // red-600 \"--ui-danger-hover\": \"#b91c1c\", // red-700 \"--ui-success\": \"#16a34a\", // green-600 \"--ui-text\": \"#0f172a\", // slate-900 \"--ui-text-muted\": \"#64748b\", // slate-500 \"--ui-border\": \"#e2e8f0\", // slate-200 \"--ui-surface\": \"#ffffff\", // white \"--ui-surface-muted\": \"#f8fafc\", // slate-50 \"--ui-overlay\": \"rgb(15 23 42 / 0.45)\", // slate-900 / 45% // Shape / depth \"--ui-radius\": \"0.5rem\", // rounded-lg \"--ui-radius-sm\": \"0.25rem\", // rounded \"--ui-shadow\": \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\", // shadow-md \"--ui-shadow-lg\": \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\", // shadow-xl \"--ui-focus-ring\": \"0 0 0 3px rgb(79 70 229 / 0.35)\", // Type \"--ui-font\": 'ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"', \"--ui-font-size\": \"0.875rem\", \"--ui-font-size-sm\": \"0.75rem\", }",
3196
+ "description": "Design token values, sourced from Tailwind v4's default theme palette.\nEach entry maps a `--ui-*` custom property name to its default value.\nThese are the same values baked in as `var(--ui-*, <fallback>)` fallbacks\nthroughout component styles, so components render correctly with zero\nexternal CSS. Consumers may override any of these by setting the custom\nproperty on `:root` or an ancestor element (see `tokens.css`)."
3197
+ },
3198
+ {
3199
+ "kind": "variable",
3200
+ "name": "tokens",
3201
+ "default": "css` :host { --ui-primary: var(--ui-primary, #4f46e5); --ui-primary-hover: var(--ui-primary-hover, #4338ca); --ui-danger: var(--ui-danger, #dc2626); --ui-danger-hover: var(--ui-danger-hover, #b91c1c); --ui-success: var(--ui-success, #16a34a); --ui-text: var(--ui-text, #0f172a); --ui-text-muted: var(--ui-text-muted, #64748b); --ui-border: var(--ui-border, #e2e8f0); --ui-surface: var(--ui-surface, #ffffff); --ui-surface-muted: var(--ui-surface-muted, #f8fafc); --ui-overlay: var(--ui-overlay, rgb(15 23 42 / 0.45)); --ui-radius: var(--ui-radius, 0.5rem); --ui-radius-sm: var(--ui-radius-sm, 0.25rem); --ui-shadow: var( --ui-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) ); --ui-shadow-lg: var( --ui-shadow-lg, 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1) ); --ui-focus-ring: var(--ui-focus-ring, 0 0 0 3px rgb(79 70 229 / 0.35)); --ui-font: var( --ui-font, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" ); --ui-font-size: var(--ui-font-size, 0.875rem); --ui-font-size-sm: var(--ui-font-size-sm, 0.75rem); } `",
3202
+ "description": "A shared `:host` stylesheet that establishes the token custom properties\nwith their fallback values. Import and include this in every component's\n`static styles` array alongside its component-specific `css` block."
3203
+ }
3204
+ ],
3205
+ "exports": [
3206
+ {
3207
+ "kind": "js",
3208
+ "name": "tokenValues",
3209
+ "declaration": {
3210
+ "name": "tokenValues",
3211
+ "module": "src/tokens.ts"
3212
+ }
3213
+ },
3214
+ {
3215
+ "kind": "js",
3216
+ "name": "tokens",
3217
+ "declaration": {
3218
+ "name": "tokens",
3219
+ "module": "src/tokens.ts"
3220
+ }
3221
+ }
3222
+ ]
3223
+ },
3224
+ {
3225
+ "kind": "javascript-module",
3226
+ "path": "src/weight-bar-chart.ts",
3227
+ "declarations": [
3228
+ {
3229
+ "kind": "class",
3230
+ "description": "Sorted horizontal bar chart of labeled weights (normalized fractions\nsumming to ~1). Bars sort descending — the order IS the priority ranking.\nWidths scale relative to the largest weight (which fills its track); the\npercent labels carry the absolute values. Rows are keyed by item id\n(repeat directive) so a re-render with new weights moves the existing\nrows; bar widths animate via CSS, re-sorting is instant.",
3231
+ "name": "WeightBarChart",
3232
+ "members": [
3233
+ {
3234
+ "kind": "field",
3235
+ "name": "items",
3236
+ "type": {
3237
+ "text": "WeightBarItem[]"
3238
+ },
3239
+ "default": "[]",
3240
+ "description": "Items to render as weighted rows, sorted descending by value."
3241
+ }
3242
+ ],
3243
+ "superclass": {
3244
+ "name": "LitElement",
3245
+ "package": "lit"
3246
+ },
3247
+ "tagName": "weight-bar-chart",
3248
+ "customElement": true
3249
+ }
3250
+ ],
3251
+ "exports": [
3252
+ {
3253
+ "kind": "js",
3254
+ "name": "WeightBarChart",
3255
+ "declaration": {
3256
+ "name": "WeightBarChart",
3257
+ "module": "src/weight-bar-chart.ts"
3258
+ }
3259
+ },
3260
+ {
3261
+ "kind": "custom-element-definition",
3262
+ "name": "weight-bar-chart",
3263
+ "declaration": {
3264
+ "name": "WeightBarChart",
3265
+ "module": "src/weight-bar-chart.ts"
3266
+ }
3267
+ }
3268
+ ]
3269
+ },
3270
+ {
3271
+ "kind": "javascript-module",
3272
+ "path": "src/utils/distance.ts",
3273
+ "declarations": [
3274
+ {
3275
+ "kind": "function",
3276
+ "name": "formatMiles",
3277
+ "return": {
3278
+ "type": {
3279
+ "text": "string"
3280
+ }
3281
+ },
3282
+ "parameters": [
3283
+ {
3284
+ "name": "miles",
3285
+ "type": {
3286
+ "text": "number"
3287
+ }
3288
+ }
3289
+ ],
3290
+ "description": "Formats a distance in miles, switching to feet below 0.25 mi.\nAt ≥10 mi precision drops to whole miles."
3291
+ },
3292
+ {
3293
+ "kind": "function",
3294
+ "name": "formatKm",
3295
+ "return": {
3296
+ "type": {
3297
+ "text": "string"
3298
+ }
3299
+ },
3300
+ "parameters": [
3301
+ {
3302
+ "name": "km",
3303
+ "type": {
3304
+ "text": "number"
3305
+ }
3306
+ }
3307
+ ],
3308
+ "description": "Formats a distance in kilometers, switching to meters below 0.5 km.\nAt ≥10 km precision drops to whole kilometers. (Future use.)"
3309
+ }
3310
+ ],
3311
+ "exports": [
3312
+ {
3313
+ "kind": "js",
3314
+ "name": "formatMiles",
3315
+ "declaration": {
3316
+ "name": "formatMiles",
3317
+ "module": "src/utils/distance.ts"
3318
+ }
3319
+ },
3320
+ {
3321
+ "kind": "js",
3322
+ "name": "formatKm",
3323
+ "declaration": {
3324
+ "name": "formatKm",
3325
+ "module": "src/utils/distance.ts"
3326
+ }
3327
+ }
3328
+ ]
3329
+ },
3330
+ {
3331
+ "kind": "javascript-module",
3332
+ "path": "src/utils/time.ts",
3333
+ "declarations": [
3334
+ {
3335
+ "kind": "function",
3336
+ "name": "parseTimestamp",
3337
+ "return": {
3338
+ "type": {
3339
+ "text": "Date"
3340
+ }
3341
+ },
3342
+ "parameters": [
3343
+ {
3344
+ "name": "s",
3345
+ "type": {
3346
+ "text": "string"
3347
+ }
3348
+ }
3349
+ ],
3350
+ "description": "Parses a timestamp from either SQLite's `datetime('now')` (a space-separated\nUTC string with no zone marker, e.g. \"2026-07-15 10:23:00\") or a standard\nISO 8601 string. JS's `Date` parser treats the space-separated form as\nlocal time, so it's coerced to `T...Z` first to anchor it to UTC."
3351
+ },
3352
+ {
3353
+ "kind": "function",
3354
+ "name": "formatRelativeTime",
3355
+ "return": {
3356
+ "type": {
3357
+ "text": "string"
3358
+ }
3359
+ },
3360
+ "parameters": [
3361
+ {
3362
+ "name": "date",
3363
+ "type": {
3364
+ "text": "Date"
3365
+ }
3366
+ },
3367
+ {
3368
+ "name": "now",
3369
+ "default": "Date.now()",
3370
+ "type": {
3371
+ "text": "number"
3372
+ }
3373
+ }
3374
+ ],
3375
+ "description": "Formats `date` relative to `now` (e.g. \"3 hours ago\", \"in 2 days\")."
3376
+ }
3377
+ ],
3378
+ "exports": [
3379
+ {
3380
+ "kind": "js",
3381
+ "name": "parseTimestamp",
3382
+ "declaration": {
3383
+ "name": "parseTimestamp",
3384
+ "module": "src/utils/time.ts"
3385
+ }
3386
+ },
3387
+ {
3388
+ "kind": "js",
3389
+ "name": "formatRelativeTime",
3390
+ "declaration": {
3391
+ "name": "formatRelativeTime",
3392
+ "module": "src/utils/time.ts"
3393
+ }
3394
+ }
3395
+ ]
3396
+ }
3397
+ ]
3398
+ }