@mieweb/ui 0.10.0-dev.24 → 0.10.0-dev.26

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 (147) hide show
  1. package/dist/brands/bluehive.cjs +3 -3
  2. package/dist/brands/bluehive.css +3 -0
  3. package/dist/brands/bluehive.js +1 -1
  4. package/dist/brands/index.cjs +9 -9
  5. package/dist/brands/index.js +3 -3
  6. package/dist/{chunk-YQDA366U.js → chunk-33DEVA3P.js} +2 -2
  7. package/dist/{chunk-YQDA366U.js.map → chunk-33DEVA3P.js.map} +1 -1
  8. package/dist/{chunk-WNJRS7Y7.cjs → chunk-3ZWCIPFT.cjs} +4 -2
  9. package/dist/chunk-3ZWCIPFT.cjs.map +1 -0
  10. package/dist/{chunk-J5CSLNCN.cjs → chunk-6VFDHJSO.cjs} +2 -2
  11. package/dist/{chunk-J5CSLNCN.cjs.map → chunk-6VFDHJSO.cjs.map} +1 -1
  12. package/dist/{chunk-ZTW4KODY.js → chunk-6ZPTZTKN.js} +3 -3
  13. package/dist/{chunk-ZTW4KODY.js.map → chunk-6ZPTZTKN.js.map} +1 -1
  14. package/dist/{chunk-SQ2D7AON.cjs → chunk-AAYXCZMV.cjs} +6 -6
  15. package/dist/{chunk-SQ2D7AON.cjs.map → chunk-AAYXCZMV.cjs.map} +1 -1
  16. package/dist/{chunk-WCDJFMZO.cjs → chunk-ADW7ZYCY.cjs} +1235 -495
  17. package/dist/chunk-ADW7ZYCY.cjs.map +1 -0
  18. package/dist/{chunk-2G75X6TS.cjs → chunk-AHHFFXJR.cjs} +3 -3
  19. package/dist/{chunk-2G75X6TS.cjs.map → chunk-AHHFFXJR.cjs.map} +1 -1
  20. package/dist/{chunk-HQ4CGVWX.cjs → chunk-B2X732V3.cjs} +7 -7
  21. package/dist/{chunk-HQ4CGVWX.cjs.map → chunk-B2X732V3.cjs.map} +1 -1
  22. package/dist/{chunk-UAMXCMST.cjs → chunk-CFI3TQMA.cjs} +3 -3
  23. package/dist/{chunk-UAMXCMST.cjs.map → chunk-CFI3TQMA.cjs.map} +1 -1
  24. package/dist/{chunk-2ABWFQQH.js → chunk-CRS2CQWM.js} +4 -4
  25. package/dist/{chunk-2ABWFQQH.js.map → chunk-CRS2CQWM.js.map} +1 -1
  26. package/dist/{chunk-MZNCLXXU.js → chunk-D22GE27K.js} +3 -3
  27. package/dist/{chunk-MZNCLXXU.js.map → chunk-D22GE27K.js.map} +1 -1
  28. package/dist/{chunk-IH55BEB3.js → chunk-DZFGTWYF.js} +6 -6
  29. package/dist/{chunk-IH55BEB3.js.map → chunk-DZFGTWYF.js.map} +1 -1
  30. package/dist/{chunk-TF7YWJHU.js → chunk-E2PBPQGS.js} +3 -3
  31. package/dist/{chunk-TF7YWJHU.js.map → chunk-E2PBPQGS.js.map} +1 -1
  32. package/dist/chunk-FBCDYTWM.js +385 -0
  33. package/dist/chunk-FBCDYTWM.js.map +1 -0
  34. package/dist/{chunk-R2O72G6Z.cjs → chunk-HC3NAN55.cjs} +7 -7
  35. package/dist/{chunk-R2O72G6Z.cjs.map → chunk-HC3NAN55.cjs.map} +1 -1
  36. package/dist/{chunk-DSB4DKWG.js → chunk-K34DXMLZ.js} +2 -2
  37. package/dist/{chunk-DSB4DKWG.js.map → chunk-K34DXMLZ.js.map} +1 -1
  38. package/dist/{chunk-Z5V7SAZ4.js → chunk-KFEN2SRZ.js} +3 -3
  39. package/dist/{chunk-Z5V7SAZ4.js.map → chunk-KFEN2SRZ.js.map} +1 -1
  40. package/dist/{chunk-MQPG3KVK.cjs → chunk-KGKBZN3T.cjs} +2 -2
  41. package/dist/{chunk-MQPG3KVK.cjs.map → chunk-KGKBZN3T.cjs.map} +1 -1
  42. package/dist/{chunk-G45FBKKV.js → chunk-P4VGVJVI.js} +4 -4
  43. package/dist/{chunk-G45FBKKV.js.map → chunk-P4VGVJVI.js.map} +1 -1
  44. package/dist/{chunk-3T7QGLNB.js → chunk-PJEL5ZZV.js} +4 -2
  45. package/dist/chunk-PJEL5ZZV.js.map +1 -0
  46. package/dist/{chunk-LJZKEMAH.cjs → chunk-R5Z7AOVU.cjs} +10 -10
  47. package/dist/{chunk-LJZKEMAH.cjs.map → chunk-R5Z7AOVU.cjs.map} +1 -1
  48. package/dist/{chunk-RJ6NTJHC.js → chunk-SRMTRD7F.js} +3 -3
  49. package/dist/{chunk-RJ6NTJHC.js.map → chunk-SRMTRD7F.js.map} +1 -1
  50. package/dist/{chunk-KHSFJTEX.js → chunk-T4JYUICS.js} +1177 -444
  51. package/dist/chunk-T4JYUICS.js.map +1 -0
  52. package/dist/{chunk-NJ6MY6V5.js → chunk-T5BBZQ66.js} +3 -3
  53. package/dist/{chunk-NJ6MY6V5.js.map → chunk-T5BBZQ66.js.map} +1 -1
  54. package/dist/{chunk-VYPPQPSZ.cjs → chunk-TJCX4OML.cjs} +3 -3
  55. package/dist/{chunk-VYPPQPSZ.cjs.map → chunk-TJCX4OML.cjs.map} +1 -1
  56. package/dist/{chunk-TAXD5ADA.cjs → chunk-UEDTZYGI.cjs} +3 -3
  57. package/dist/{chunk-TAXD5ADA.cjs.map → chunk-UEDTZYGI.cjs.map} +1 -1
  58. package/dist/{chunk-UQ3VVR6A.cjs → chunk-UPWIJC6I.cjs} +3 -3
  59. package/dist/{chunk-UQ3VVR6A.cjs.map → chunk-UPWIJC6I.cjs.map} +1 -1
  60. package/dist/{chunk-QNDP6PE5.cjs → chunk-VCCGR4J3.cjs} +92 -3
  61. package/dist/chunk-VCCGR4J3.cjs.map +1 -0
  62. package/dist/{chunk-S7WCHDBO.js → chunk-VCI2Y7ST.js} +3 -3
  63. package/dist/{chunk-S7WCHDBO.js.map → chunk-VCI2Y7ST.js.map} +1 -1
  64. package/dist/{chunk-Z4JR23IB.cjs → chunk-VOQJHSXN.cjs} +9 -9
  65. package/dist/{chunk-Z4JR23IB.cjs.map → chunk-VOQJHSXN.cjs.map} +1 -1
  66. package/dist/{chunk-EK3BCET6.js → chunk-WFVE36PO.js} +92 -3
  67. package/dist/chunk-WFVE36PO.js.map +1 -0
  68. package/dist/chunk-XI74P5F2.cjs +424 -0
  69. package/dist/chunk-XI74P5F2.cjs.map +1 -0
  70. package/dist/components/BoardView/index.d.cts +2 -90
  71. package/dist/components/BoardView/index.d.ts +2 -90
  72. package/dist/components/CalendarView/index.d.cts +1 -1
  73. package/dist/components/CalendarView/index.d.ts +1 -1
  74. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  75. package/dist/components/CountryCodeDropdown/index.js +2 -2
  76. package/dist/components/Dropdown/index.cjs +9 -9
  77. package/dist/components/Dropdown/index.js +2 -2
  78. package/dist/components/GanttView/index.d.cts +1 -1
  79. package/dist/components/GanttView/index.d.ts +1 -1
  80. package/dist/components/GlossaryTooltip/index.cjs +3 -3
  81. package/dist/components/GlossaryTooltip/index.js +2 -2
  82. package/dist/components/Markdown/index.cjs +15 -15
  83. package/dist/components/Markdown/index.js +3 -3
  84. package/dist/components/MediaEditor/index.cjs +10 -10
  85. package/dist/components/MediaEditor/index.js +5 -5
  86. package/dist/components/RadialExplorer/index.cjs +1 -1
  87. package/dist/components/RadialExplorer/index.js +1 -1
  88. package/dist/components/RichTextEditor/index.cjs +6 -6
  89. package/dist/components/RichTextEditor/index.js +3 -3
  90. package/dist/components/Select/index.cjs +4 -4
  91. package/dist/components/Select/index.js +2 -2
  92. package/dist/components/SourceTip/index.cjs +3 -3
  93. package/dist/components/SourceTip/index.js +2 -2
  94. package/dist/components/SuperChat/index.cjs +11 -11
  95. package/dist/components/SuperChat/index.js +4 -4
  96. package/dist/components/SuperChat/plugins/index.cjs +5 -5
  97. package/dist/components/SuperChat/plugins/index.js +4 -4
  98. package/dist/components/ViewSet/index.d.cts +1 -101
  99. package/dist/components/ViewSet/index.d.ts +1 -101
  100. package/dist/components/ViewSwitcher/index.d.cts +4 -57
  101. package/dist/components/ViewSwitcher/index.d.ts +4 -57
  102. package/dist/datavis.cjs +1 -1
  103. package/dist/datavis.js +1 -1
  104. package/dist/deck.cjs +3360 -0
  105. package/dist/deck.cjs.map +1 -0
  106. package/dist/deck.d.cts +712 -0
  107. package/dist/deck.d.ts +712 -0
  108. package/dist/deck.js +3316 -0
  109. package/dist/deck.js.map +1 -0
  110. package/dist/esheet.cjs +10 -10
  111. package/dist/esheet.js +7 -7
  112. package/dist/hooks/index.cjs +15 -15
  113. package/dist/hooks/index.js +3 -3
  114. package/dist/icons-wBacj6BW.d.cts +142 -0
  115. package/dist/icons-wBacj6BW.d.ts +142 -0
  116. package/dist/index-DoYYWsNc.d.cts +127 -0
  117. package/dist/index-DoYYWsNc.d.ts +127 -0
  118. package/dist/index.cjs +604 -551
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.cts +313 -4
  121. package/dist/index.d.ts +313 -4
  122. package/dist/index.js +60 -59
  123. package/dist/index.js.map +1 -1
  124. package/dist/maps.cjs +160 -0
  125. package/dist/maps.cjs.map +1 -0
  126. package/dist/maps.d.cts +42 -0
  127. package/dist/maps.d.ts +42 -0
  128. package/dist/maps.js +138 -0
  129. package/dist/maps.js.map +1 -0
  130. package/dist/styles/effects.css +100 -0
  131. package/dist/styles/init.css +3 -0
  132. package/dist/styles.css +1 -1
  133. package/dist/tailwind-preset.cjs +4 -4
  134. package/dist/tailwind-preset.js +1 -1
  135. package/dist/templates.cjs +82 -29
  136. package/dist/templates.d.cts +316 -142
  137. package/dist/templates.d.ts +316 -142
  138. package/dist/templates.js +2 -1
  139. package/dist/{types-C3HQe74F.d.cts → types-DsdZvEI1.d.cts} +7 -1
  140. package/dist/{types-C3HQe74F.d.ts → types-DsdZvEI1.d.ts} +7 -1
  141. package/package.json +27 -1
  142. package/dist/chunk-3T7QGLNB.js.map +0 -1
  143. package/dist/chunk-EK3BCET6.js.map +0 -1
  144. package/dist/chunk-KHSFJTEX.js.map +0 -1
  145. package/dist/chunk-QNDP6PE5.cjs.map +0 -1
  146. package/dist/chunk-WCDJFMZO.cjs.map +0 -1
  147. package/dist/chunk-WNJRS7Y7.cjs.map +0 -1
package/dist/maps.cjs ADDED
@@ -0,0 +1,160 @@
1
+ 'use strict';
2
+
3
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
+ require('./chunk-EUAMEVVI.cjs');
5
+ var React = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ var OSM = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
29
+ var OSM_ATTRIBUTION = "© OpenStreetMap contributors";
30
+ var PointMap = React__namespace.forwardRef(
31
+ ({
32
+ points,
33
+ label,
34
+ center = [39.8, -98.6],
35
+ zoom = 3,
36
+ minZoom = 2,
37
+ maxZoom = 10,
38
+ height = 320,
39
+ tileUrl = OSM,
40
+ attribution = OSM_ATTRIBUTION,
41
+ outlineUrl,
42
+ sizeBy = "value",
43
+ showValues,
44
+ hideList,
45
+ className,
46
+ ...rest
47
+ }, ref) => {
48
+ const mapEl = React__namespace.useRef(null);
49
+ const [failed, setFailed] = React__namespace.useState(false);
50
+ const max = Math.max(1, ...points.map((p) => p.value ?? 0));
51
+ React__namespace.useEffect(() => {
52
+ const el = mapEl.current;
53
+ if (!el) return;
54
+ let map;
55
+ let cancelled = false;
56
+ import('leaflet').then(async (mod) => {
57
+ const leaflet = mod.default ?? mod;
58
+ if (cancelled) return;
59
+ const styles = getComputedStyle(el);
60
+ const colour = styles.getPropertyValue("--mieweb-primary-500").trim() || "#27aae1";
61
+ const line = styles.getPropertyValue("--mieweb-border").trim() || "#94a3b8";
62
+ map = leaflet.map(el, {
63
+ center,
64
+ zoom,
65
+ minZoom,
66
+ maxZoom,
67
+ scrollWheelZoom: false
68
+ });
69
+ leaflet.tileLayer(tileUrl, { attribution }).addTo(map);
70
+ if (outlineUrl) {
71
+ const data = await fetch(outlineUrl).then((r) => r.ok ? r.json() : null).catch(() => null);
72
+ if (data && !cancelled && map)
73
+ leaflet.geoJSON(data, {
74
+ style: { color: line, weight: 0.6, fillOpacity: 0 }
75
+ }).addTo(map);
76
+ }
77
+ if (cancelled || !map) return;
78
+ for (const p of points) {
79
+ const radius = sizeBy === "value" && p.value != null ? 6 + p.value / max * 22 : 6;
80
+ const marker = leaflet.circleMarker([p.lat, p.lng], {
81
+ radius,
82
+ color: colour,
83
+ weight: 2,
84
+ fillColor: colour,
85
+ fillOpacity: 0.35
86
+ }).addTo(map);
87
+ const text = [
88
+ p.label,
89
+ p.value != null ? String(p.value) : "",
90
+ p.detail ?? ""
91
+ ].filter(Boolean).join(" \xB7 ");
92
+ if (showValues && p.value != null)
93
+ marker.bindTooltip(String(p.value), {
94
+ permanent: true,
95
+ direction: "center",
96
+ className: "mie-map-value"
97
+ });
98
+ else marker.bindTooltip(text);
99
+ }
100
+ }).catch(() => setFailed(true));
101
+ return () => {
102
+ cancelled = true;
103
+ map?.remove();
104
+ };
105
+ }, [points, tileUrl, attribution, outlineUrl, sizeBy, showValues]);
106
+ return /* @__PURE__ */ jsxRuntime.jsxs(
107
+ "div",
108
+ {
109
+ ref,
110
+ "data-slot": "point-map",
111
+ className: chunkS5RVSXDV_cjs.cn("w-full", className),
112
+ ...rest,
113
+ children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx(
115
+ "div",
116
+ {
117
+ ref: mapEl,
118
+ role: "group",
119
+ "aria-roledescription": "map",
120
+ "aria-label": label,
121
+ className: "bg-muted isolate w-full overflow-hidden rounded-xl",
122
+ style: { height },
123
+ children: failed && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground flex h-full items-center justify-center p-4 text-center text-sm", children: label })
124
+ }
125
+ ),
126
+ !hideList && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-3 flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs", children: points.map((p) => /* @__PURE__ */ jsxRuntime.jsxs(
127
+ "li",
128
+ {
129
+ className: "flex items-center gap-1.5",
130
+ children: [
131
+ /* @__PURE__ */ jsxRuntime.jsx(
132
+ "span",
133
+ {
134
+ "aria-hidden": "true",
135
+ className: "bg-primary-500 size-2 rounded-full",
136
+ style: {
137
+ opacity: sizeBy === "value" && p.value != null ? 0.4 + p.value / max * 0.6 : 1
138
+ }
139
+ }
140
+ ),
141
+ p.label,
142
+ p.value != null && `: ${p.value}`,
143
+ p.detail && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "opacity-70", children: [
144
+ " \xB7 ",
145
+ p.detail
146
+ ] })
147
+ ]
148
+ },
149
+ `${p.label}-${p.lat}-${p.lng}`
150
+ )) })
151
+ ]
152
+ }
153
+ );
154
+ }
155
+ );
156
+ PointMap.displayName = "PointMap";
157
+
158
+ exports.PointMap = PointMap;
159
+ //# sourceMappingURL=maps.cjs.map
160
+ //# sourceMappingURL=maps.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/PointMap/PointMap.tsx"],"names":["React","jsxs","cn","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,IAAM,GAAA,GAAM,oDAAA;AACZ,IAAM,eAAA,GAAkB,mCAAA;AAOjB,IAAM,QAAA,GAAiBA,gBAAA,CAAA,UAAA;AAAA,EAC5B,CACE;AAAA,IACE,MAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,GAAS,CAAC,IAAA,EAAM,KAAK,CAAA;AAAA,IACrB,IAAA,GAAO,CAAA;AAAA,IACP,OAAA,GAAU,CAAA;AAAA,IACV,OAAA,GAAU,EAAA;AAAA,IACV,MAAA,GAAS,GAAA;AAAA,IACT,OAAA,GAAU,GAAA;AAAA,IACV,WAAA,GAAc,eAAA;AAAA,IACd,UAAA;AAAA,IACA,MAAA,GAAS,OAAA;AAAA,IACT,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,KAAA,GAAcA,wBAAuB,IAAI,CAAA;AAC/C,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,0BAAS,KAAK,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,IAAS,CAAC,CAAC,CAAA;AAE1D,IAAMA,2BAAU,MAAM;AACpB,MAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,OAAO,SAAS,CAAA,CACb,IAAA,CAAK,OAAO,GAAA,KAAQ;AACnB,QAAA,MAAM,OAAA,GACH,IAA0C,OAAA,IAC1C,GAAA;AACH,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAM,MAAA,GAAS,iBAAiB,EAAE,CAAA;AAClC,QAAA,MAAM,SACJ,MAAA,CAAO,gBAAA,CAAiB,sBAAsB,CAAA,CAAE,MAAK,IAAK,SAAA;AAC5D,QAAA,MAAM,OACJ,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,MAAK,IAAK,SAAA;AACvD,QAAA,GAAA,GAAM,OAAA,CAAQ,IAAI,EAAA,EAAI;AAAA,UACpB,MAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA,eAAA,EAAiB;AAAA,SAClB,CAAA;AACD,QAAA,OAAA,CAAQ,UAAU,OAAA,EAAS,EAAE,aAAa,CAAA,CAAE,MAAM,GAAG,CAAA;AACrD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,OAAO,MAAM,KAAA,CAAM,UAAU,CAAA,CAChC,KAAK,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,GAAK,EAAE,IAAA,EAAK,GAAI,IAAK,CAAA,CACpC,KAAA,CAAM,MAAM,IAAI,CAAA;AACnB,UAAA,IAAI,IAAA,IAAQ,CAAC,SAAA,IAAa,GAAA;AACxB,YAAA,OAAA,CACG,QAAQ,IAAA,EAAM;AAAA,cACb,OAAO,EAAE,KAAA,EAAO,MAAM,MAAA,EAAQ,GAAA,EAAK,aAAa,CAAA;AAAE,aACnD,CAAA,CACA,KAAA,CAAM,GAAG,CAAA;AAAA,QAChB;AACA,QAAA,IAAI,SAAA,IAAa,CAAC,GAAA,EAAK;AACvB,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,UAAA,MAAM,MAAA,GACJ,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,KAAA,IAAS,OAC7B,CAAA,GAAK,CAAA,CAAE,KAAA,GAAQ,GAAA,GAAO,EAAA,GACtB,CAAA;AACN,UAAA,MAAM,MAAA,GAAS,QACZ,YAAA,CAAa,CAAC,EAAE,GAAA,EAAK,CAAA,CAAE,GAAG,CAAA,EAAG;AAAA,YAC5B,MAAA;AAAA,YACA,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAW,MAAA;AAAA,YACX,WAAA,EAAa;AAAA,WACd,CAAA,CACA,KAAA,CAAM,GAAG,CAAA;AACZ,UAAA,MAAM,IAAA,GAAO;AAAA,YACX,CAAA,CAAE,KAAA;AAAA,YACF,EAAE,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA;AAAA,YACpC,EAAE,MAAA,IAAU;AAAA,WACd,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,QAAU,CAAA;AAClB,UAAA,IAAI,UAAA,IAAc,EAAE,KAAA,IAAS,IAAA;AAC3B,YAAA,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAG;AAAA,cAClC,SAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,QAAA;AAAA,cACX,SAAA,EAAW;AAAA,aACZ,CAAA;AAAA,eACE,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,GAAA,EAAK,MAAA,EAAO;AAAA,MACd,CAAA;AAAA,IAGF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,aAAa,UAAA,EAAY,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEjE,IAAA,uBACEC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAWC,oBAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,QAChC,GAAG,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,KAAA;AAAA,cACL,IAAA,EAAK,OAAA;AAAA,cACL,sBAAA,EAAqB,KAAA;AAAA,cACrB,YAAA,EAAY,KAAA;AAAA,cACZ,SAAA,EAAU,oDAAA;AAAA,cACV,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,cAEf,QAAA,EAAA,MAAA,oBACCA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yFACV,QAAA,EAAA,KAAA,EACH;AAAA;AAAA,WAEJ;AAAA,UACC,CAAC,4BACAA,cAAA,CAAC,IAAA,EAAA,EAAG,WAAU,4DAAA,EACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXF,eAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,2BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAE,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAY,MAAA;AAAA,oBACZ,SAAA,EAAU,oCAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,OAAA,EACE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,KAAA,IAAS,OAC7B,GAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,GAAA,GAAO,GAAA,GACxB;AAAA;AACR;AAAA,iBACF;AAAA,gBACC,CAAA,CAAE,KAAA;AAAA,gBACF,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,CAAA;AAAA,gBAC/B,CAAA,CAAE,MAAA,oBAAUF,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,YAAA,EAAa,QAAA,EAAA;AAAA,kBAAA,QAAA;AAAA,kBAAI,CAAA,CAAE;AAAA,iBAAA,EAAO;AAAA;AAAA,aAAA;AAAA,YAflD,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA;AAAA,WAiBpC,CAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"maps.cjs","sourcesContent":["import * as React from 'react';\nimport type * as L from 'leaflet';\nimport { cn } from '../../utils/cn';\n\nexport interface MapPoint {\n lat: number;\n lng: number;\n label: string;\n /** Sizes the marker when `sizeBy=\"value\"`, and is shown on it. */\n value?: number;\n /** Extra line in the marker's tooltip and the list, e.g. `Austin, TX \\u00b7 Mar 2026`. */\n detail?: string;\n}\n\nexport interface PointMapProps extends React.HTMLAttributes<HTMLDivElement> {\n points: MapPoint[];\n /** Accessible name of the map; the points are also listed as text beneath it. */\n label: string;\n center?: [number, number];\n zoom?: number;\n minZoom?: number;\n maxZoom?: number;\n /** Map height in px. */\n height?: number;\n /** Raster tile template. Defaults to OpenStreetMap; use a tile service you are licensed for. */\n tileUrl?: string;\n /** Tile attribution, as the tile provider requires. */\n attribution?: string;\n /** GeoJSON URL for region outlines drawn over the tiles, e.g. US states. */\n outlineUrl?: string;\n /** `value` scales markers by `value`; `none` draws equal dots. */\n sizeBy?: 'value' | 'none';\n /** Show each point's value on its marker. */\n showValues?: boolean;\n /** Hide the text list of points under the map. */\n hideList?: boolean;\n}\n\nconst OSM = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\nconst OSM_ATTRIBUTION = '&copy; OpenStreetMap contributors';\n\n/**\n * Points on a Leaflet map, sized by value, with a text list of the same points\n * for screen readers and print. Needs the optional `leaflet` peer and its CSS\n * (`import 'leaflet/dist/leaflet.css'`). Client-only.\n */\nexport const PointMap = React.forwardRef<HTMLDivElement, PointMapProps>(\n (\n {\n points,\n label,\n center = [39.8, -98.6],\n zoom = 3,\n minZoom = 2,\n maxZoom = 10,\n height = 320,\n tileUrl = OSM,\n attribution = OSM_ATTRIBUTION,\n outlineUrl,\n sizeBy = 'value',\n showValues,\n hideList,\n className,\n ...rest\n },\n ref\n ) => {\n const mapEl = React.useRef<HTMLDivElement>(null);\n const [failed, setFailed] = React.useState(false);\n const max = Math.max(1, ...points.map((p) => p.value ?? 0));\n\n React.useEffect(() => {\n const el = mapEl.current;\n if (!el) return;\n let map: L.Map | undefined;\n let cancelled = false;\n import('leaflet')\n .then(async (mod) => {\n const leaflet =\n (mod as unknown as { default?: typeof L }).default ??\n (mod as typeof L);\n if (cancelled) return;\n const styles = getComputedStyle(el);\n const colour =\n styles.getPropertyValue('--mieweb-primary-500').trim() || '#27aae1';\n const line =\n styles.getPropertyValue('--mieweb-border').trim() || '#94a3b8';\n map = leaflet.map(el, {\n center,\n zoom,\n minZoom,\n maxZoom,\n scrollWheelZoom: false,\n });\n leaflet.tileLayer(tileUrl, { attribution }).addTo(map);\n if (outlineUrl) {\n const data = await fetch(outlineUrl)\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null);\n if (data && !cancelled && map)\n leaflet\n .geoJSON(data, {\n style: { color: line, weight: 0.6, fillOpacity: 0 },\n })\n .addTo(map);\n }\n if (cancelled || !map) return;\n for (const p of points) {\n const radius =\n sizeBy === 'value' && p.value != null\n ? 6 + (p.value / max) * 22\n : 6;\n const marker = leaflet\n .circleMarker([p.lat, p.lng], {\n radius,\n color: colour,\n weight: 2,\n fillColor: colour,\n fillOpacity: 0.35,\n })\n .addTo(map);\n const text = [\n p.label,\n p.value != null ? String(p.value) : '',\n p.detail ?? '',\n ]\n .filter(Boolean)\n .join(' \\u00b7 ');\n if (showValues && p.value != null)\n marker.bindTooltip(String(p.value), {\n permanent: true,\n direction: 'center',\n className: 'mie-map-value',\n });\n else marker.bindTooltip(text);\n }\n })\n .catch(() => setFailed(true));\n return () => {\n cancelled = true;\n map?.remove();\n };\n // Rebuild when the data changes; the view props only seed the map.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [points, tileUrl, attribution, outlineUrl, sizeBy, showValues]);\n\n return (\n <div\n ref={ref}\n data-slot=\"point-map\"\n className={cn('w-full', className)}\n {...rest}\n >\n <div\n ref={mapEl}\n role=\"group\"\n aria-roledescription=\"map\"\n aria-label={label}\n className=\"bg-muted isolate w-full overflow-hidden rounded-xl\"\n style={{ height }}\n >\n {failed && (\n <p className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-center text-sm\">\n {label}\n </p>\n )}\n </div>\n {!hideList && (\n <ul className=\"mt-3 flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs\">\n {points.map((p) => (\n <li\n key={`${p.label}-${p.lat}-${p.lng}`}\n className=\"flex items-center gap-1.5\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-500 size-2 rounded-full\"\n style={{\n opacity:\n sizeBy === 'value' && p.value != null\n ? 0.4 + (p.value / max) * 0.6\n : 1,\n }}\n />\n {p.label}\n {p.value != null && `: ${p.value}`}\n {p.detail && <span className=\"opacity-70\"> · {p.detail}</span>}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n }\n);\nPointMap.displayName = 'PointMap';\n"]}
@@ -0,0 +1,42 @@
1
+ import * as React from 'react';
2
+
3
+ interface MapPoint {
4
+ lat: number;
5
+ lng: number;
6
+ label: string;
7
+ /** Sizes the marker when `sizeBy="value"`, and is shown on it. */
8
+ value?: number;
9
+ /** Extra line in the marker's tooltip and the list, e.g. `Austin, TX \u00b7 Mar 2026`. */
10
+ detail?: string;
11
+ }
12
+ interface PointMapProps extends React.HTMLAttributes<HTMLDivElement> {
13
+ points: MapPoint[];
14
+ /** Accessible name of the map; the points are also listed as text beneath it. */
15
+ label: string;
16
+ center?: [number, number];
17
+ zoom?: number;
18
+ minZoom?: number;
19
+ maxZoom?: number;
20
+ /** Map height in px. */
21
+ height?: number;
22
+ /** Raster tile template. Defaults to OpenStreetMap; use a tile service you are licensed for. */
23
+ tileUrl?: string;
24
+ /** Tile attribution, as the tile provider requires. */
25
+ attribution?: string;
26
+ /** GeoJSON URL for region outlines drawn over the tiles, e.g. US states. */
27
+ outlineUrl?: string;
28
+ /** `value` scales markers by `value`; `none` draws equal dots. */
29
+ sizeBy?: 'value' | 'none';
30
+ /** Show each point's value on its marker. */
31
+ showValues?: boolean;
32
+ /** Hide the text list of points under the map. */
33
+ hideList?: boolean;
34
+ }
35
+ /**
36
+ * Points on a Leaflet map, sized by value, with a text list of the same points
37
+ * for screen readers and print. Needs the optional `leaflet` peer and its CSS
38
+ * (`import 'leaflet/dist/leaflet.css'`). Client-only.
39
+ */
40
+ declare const PointMap: React.ForwardRefExoticComponent<PointMapProps & React.RefAttributes<HTMLDivElement>>;
41
+
42
+ export { type MapPoint, PointMap, type PointMapProps };
package/dist/maps.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ import * as React from 'react';
2
+
3
+ interface MapPoint {
4
+ lat: number;
5
+ lng: number;
6
+ label: string;
7
+ /** Sizes the marker when `sizeBy="value"`, and is shown on it. */
8
+ value?: number;
9
+ /** Extra line in the marker's tooltip and the list, e.g. `Austin, TX \u00b7 Mar 2026`. */
10
+ detail?: string;
11
+ }
12
+ interface PointMapProps extends React.HTMLAttributes<HTMLDivElement> {
13
+ points: MapPoint[];
14
+ /** Accessible name of the map; the points are also listed as text beneath it. */
15
+ label: string;
16
+ center?: [number, number];
17
+ zoom?: number;
18
+ minZoom?: number;
19
+ maxZoom?: number;
20
+ /** Map height in px. */
21
+ height?: number;
22
+ /** Raster tile template. Defaults to OpenStreetMap; use a tile service you are licensed for. */
23
+ tileUrl?: string;
24
+ /** Tile attribution, as the tile provider requires. */
25
+ attribution?: string;
26
+ /** GeoJSON URL for region outlines drawn over the tiles, e.g. US states. */
27
+ outlineUrl?: string;
28
+ /** `value` scales markers by `value`; `none` draws equal dots. */
29
+ sizeBy?: 'value' | 'none';
30
+ /** Show each point's value on its marker. */
31
+ showValues?: boolean;
32
+ /** Hide the text list of points under the map. */
33
+ hideList?: boolean;
34
+ }
35
+ /**
36
+ * Points on a Leaflet map, sized by value, with a text list of the same points
37
+ * for screen readers and print. Needs the optional `leaflet` peer and its CSS
38
+ * (`import 'leaflet/dist/leaflet.css'`). Client-only.
39
+ */
40
+ declare const PointMap: React.ForwardRefExoticComponent<PointMapProps & React.RefAttributes<HTMLDivElement>>;
41
+
42
+ export { type MapPoint, PointMap, type PointMapProps };
package/dist/maps.js ADDED
@@ -0,0 +1,138 @@
1
+ import { cn } from './chunk-TQONQSJO.js';
2
+ import './chunk-PX6F3LHL.js';
3
+ import * as React from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var OSM = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
7
+ var OSM_ATTRIBUTION = "&copy; OpenStreetMap contributors";
8
+ var PointMap = React.forwardRef(
9
+ ({
10
+ points,
11
+ label,
12
+ center = [39.8, -98.6],
13
+ zoom = 3,
14
+ minZoom = 2,
15
+ maxZoom = 10,
16
+ height = 320,
17
+ tileUrl = OSM,
18
+ attribution = OSM_ATTRIBUTION,
19
+ outlineUrl,
20
+ sizeBy = "value",
21
+ showValues,
22
+ hideList,
23
+ className,
24
+ ...rest
25
+ }, ref) => {
26
+ const mapEl = React.useRef(null);
27
+ const [failed, setFailed] = React.useState(false);
28
+ const max = Math.max(1, ...points.map((p) => p.value ?? 0));
29
+ React.useEffect(() => {
30
+ const el = mapEl.current;
31
+ if (!el) return;
32
+ let map;
33
+ let cancelled = false;
34
+ import('leaflet').then(async (mod) => {
35
+ const leaflet = mod.default ?? mod;
36
+ if (cancelled) return;
37
+ const styles = getComputedStyle(el);
38
+ const colour = styles.getPropertyValue("--mieweb-primary-500").trim() || "#27aae1";
39
+ const line = styles.getPropertyValue("--mieweb-border").trim() || "#94a3b8";
40
+ map = leaflet.map(el, {
41
+ center,
42
+ zoom,
43
+ minZoom,
44
+ maxZoom,
45
+ scrollWheelZoom: false
46
+ });
47
+ leaflet.tileLayer(tileUrl, { attribution }).addTo(map);
48
+ if (outlineUrl) {
49
+ const data = await fetch(outlineUrl).then((r) => r.ok ? r.json() : null).catch(() => null);
50
+ if (data && !cancelled && map)
51
+ leaflet.geoJSON(data, {
52
+ style: { color: line, weight: 0.6, fillOpacity: 0 }
53
+ }).addTo(map);
54
+ }
55
+ if (cancelled || !map) return;
56
+ for (const p of points) {
57
+ const radius = sizeBy === "value" && p.value != null ? 6 + p.value / max * 22 : 6;
58
+ const marker = leaflet.circleMarker([p.lat, p.lng], {
59
+ radius,
60
+ color: colour,
61
+ weight: 2,
62
+ fillColor: colour,
63
+ fillOpacity: 0.35
64
+ }).addTo(map);
65
+ const text = [
66
+ p.label,
67
+ p.value != null ? String(p.value) : "",
68
+ p.detail ?? ""
69
+ ].filter(Boolean).join(" \xB7 ");
70
+ if (showValues && p.value != null)
71
+ marker.bindTooltip(String(p.value), {
72
+ permanent: true,
73
+ direction: "center",
74
+ className: "mie-map-value"
75
+ });
76
+ else marker.bindTooltip(text);
77
+ }
78
+ }).catch(() => setFailed(true));
79
+ return () => {
80
+ cancelled = true;
81
+ map?.remove();
82
+ };
83
+ }, [points, tileUrl, attribution, outlineUrl, sizeBy, showValues]);
84
+ return /* @__PURE__ */ jsxs(
85
+ "div",
86
+ {
87
+ ref,
88
+ "data-slot": "point-map",
89
+ className: cn("w-full", className),
90
+ ...rest,
91
+ children: [
92
+ /* @__PURE__ */ jsx(
93
+ "div",
94
+ {
95
+ ref: mapEl,
96
+ role: "group",
97
+ "aria-roledescription": "map",
98
+ "aria-label": label,
99
+ className: "bg-muted isolate w-full overflow-hidden rounded-xl",
100
+ style: { height },
101
+ children: failed && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground flex h-full items-center justify-center p-4 text-center text-sm", children: label })
102
+ }
103
+ ),
104
+ !hideList && /* @__PURE__ */ jsx("ul", { className: "mt-3 flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs", children: points.map((p) => /* @__PURE__ */ jsxs(
105
+ "li",
106
+ {
107
+ className: "flex items-center gap-1.5",
108
+ children: [
109
+ /* @__PURE__ */ jsx(
110
+ "span",
111
+ {
112
+ "aria-hidden": "true",
113
+ className: "bg-primary-500 size-2 rounded-full",
114
+ style: {
115
+ opacity: sizeBy === "value" && p.value != null ? 0.4 + p.value / max * 0.6 : 1
116
+ }
117
+ }
118
+ ),
119
+ p.label,
120
+ p.value != null && `: ${p.value}`,
121
+ p.detail && /* @__PURE__ */ jsxs("span", { className: "opacity-70", children: [
122
+ " \xB7 ",
123
+ p.detail
124
+ ] })
125
+ ]
126
+ },
127
+ `${p.label}-${p.lat}-${p.lng}`
128
+ )) })
129
+ ]
130
+ }
131
+ );
132
+ }
133
+ );
134
+ PointMap.displayName = "PointMap";
135
+
136
+ export { PointMap };
137
+ //# sourceMappingURL=maps.js.map
138
+ //# sourceMappingURL=maps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/PointMap/PointMap.tsx"],"names":[],"mappings":";;;;;AAsCA,IAAM,GAAA,GAAM,oDAAA;AACZ,IAAM,eAAA,GAAkB,mCAAA;AAOjB,IAAM,QAAA,GAAiB,KAAA,CAAA,UAAA;AAAA,EAC5B,CACE;AAAA,IACE,MAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA,GAAS,CAAC,IAAA,EAAM,KAAK,CAAA;AAAA,IACrB,IAAA,GAAO,CAAA;AAAA,IACP,OAAA,GAAU,CAAA;AAAA,IACV,OAAA,GAAU,EAAA;AAAA,IACV,MAAA,GAAS,GAAA;AAAA,IACT,OAAA,GAAU,GAAA;AAAA,IACV,WAAA,GAAc,eAAA;AAAA,IACd,UAAA;AAAA,IACA,MAAA,GAAS,OAAA;AAAA,IACT,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,KAAA,GAAc,aAAuB,IAAI,CAAA;AAC/C,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,KAAK,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,IAAS,CAAC,CAAC,CAAA;AAE1D,IAAM,gBAAU,MAAM;AACpB,MAAA,MAAM,KAAK,KAAA,CAAM,OAAA;AACjB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,OAAO,SAAS,CAAA,CACb,IAAA,CAAK,OAAO,GAAA,KAAQ;AACnB,QAAA,MAAM,OAAA,GACH,IAA0C,OAAA,IAC1C,GAAA;AACH,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAM,MAAA,GAAS,iBAAiB,EAAE,CAAA;AAClC,QAAA,MAAM,SACJ,MAAA,CAAO,gBAAA,CAAiB,sBAAsB,CAAA,CAAE,MAAK,IAAK,SAAA;AAC5D,QAAA,MAAM,OACJ,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,MAAK,IAAK,SAAA;AACvD,QAAA,GAAA,GAAM,OAAA,CAAQ,IAAI,EAAA,EAAI;AAAA,UACpB,MAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA,eAAA,EAAiB;AAAA,SAClB,CAAA;AACD,QAAA,OAAA,CAAQ,UAAU,OAAA,EAAS,EAAE,aAAa,CAAA,CAAE,MAAM,GAAG,CAAA;AACrD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,OAAO,MAAM,KAAA,CAAM,UAAU,CAAA,CAChC,KAAK,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,GAAK,EAAE,IAAA,EAAK,GAAI,IAAK,CAAA,CACpC,KAAA,CAAM,MAAM,IAAI,CAAA;AACnB,UAAA,IAAI,IAAA,IAAQ,CAAC,SAAA,IAAa,GAAA;AACxB,YAAA,OAAA,CACG,QAAQ,IAAA,EAAM;AAAA,cACb,OAAO,EAAE,KAAA,EAAO,MAAM,MAAA,EAAQ,GAAA,EAAK,aAAa,CAAA;AAAE,aACnD,CAAA,CACA,KAAA,CAAM,GAAG,CAAA;AAAA,QAChB;AACA,QAAA,IAAI,SAAA,IAAa,CAAC,GAAA,EAAK;AACvB,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,UAAA,MAAM,MAAA,GACJ,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,KAAA,IAAS,OAC7B,CAAA,GAAK,CAAA,CAAE,KAAA,GAAQ,GAAA,GAAO,EAAA,GACtB,CAAA;AACN,UAAA,MAAM,MAAA,GAAS,QACZ,YAAA,CAAa,CAAC,EAAE,GAAA,EAAK,CAAA,CAAE,GAAG,CAAA,EAAG;AAAA,YAC5B,MAAA;AAAA,YACA,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAW,MAAA;AAAA,YACX,WAAA,EAAa;AAAA,WACd,CAAA,CACA,KAAA,CAAM,GAAG,CAAA;AACZ,UAAA,MAAM,IAAA,GAAO;AAAA,YACX,CAAA,CAAE,KAAA;AAAA,YACF,EAAE,KAAA,IAAS,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA;AAAA,YACpC,EAAE,MAAA,IAAU;AAAA,WACd,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,QAAU,CAAA;AAClB,UAAA,IAAI,UAAA,IAAc,EAAE,KAAA,IAAS,IAAA;AAC3B,YAAA,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA,EAAG;AAAA,cAClC,SAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,QAAA;AAAA,cACX,SAAA,EAAW;AAAA,aACZ,CAAA;AAAA,eACE,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,GAAA,EAAK,MAAA,EAAO;AAAA,MACd,CAAA;AAAA,IAGF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,aAAa,UAAA,EAAY,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEjE,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,QAChC,GAAG,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,KAAA;AAAA,cACL,IAAA,EAAK,OAAA;AAAA,cACL,sBAAA,EAAqB,KAAA;AAAA,cACrB,YAAA,EAAY,KAAA;AAAA,cACZ,SAAA,EAAU,oDAAA;AAAA,cACV,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,cAEf,QAAA,EAAA,MAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yFACV,QAAA,EAAA,KAAA,EACH;AAAA;AAAA,WAEJ;AAAA,UACC,CAAC,4BACA,GAAA,CAAC,IAAA,EAAA,EAAG,WAAU,4DAAA,EACX,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACX,IAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,2BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAY,MAAA;AAAA,oBACZ,SAAA,EAAU,oCAAA;AAAA,oBACV,KAAA,EAAO;AAAA,sBACL,OAAA,EACE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,KAAA,IAAS,OAC7B,GAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,GAAA,GAAO,GAAA,GACxB;AAAA;AACR;AAAA,iBACF;AAAA,gBACC,CAAA,CAAE,KAAA;AAAA,gBACF,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,CAAA;AAAA,gBAC/B,CAAA,CAAE,MAAA,oBAAU,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,YAAA,EAAa,QAAA,EAAA;AAAA,kBAAA,QAAA;AAAA,kBAAI,CAAA,CAAE;AAAA,iBAAA,EAAO;AAAA;AAAA,aAAA;AAAA,YAflD,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA;AAAA,WAiBpC,CAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"maps.js","sourcesContent":["import * as React from 'react';\nimport type * as L from 'leaflet';\nimport { cn } from '../../utils/cn';\n\nexport interface MapPoint {\n lat: number;\n lng: number;\n label: string;\n /** Sizes the marker when `sizeBy=\"value\"`, and is shown on it. */\n value?: number;\n /** Extra line in the marker's tooltip and the list, e.g. `Austin, TX \\u00b7 Mar 2026`. */\n detail?: string;\n}\n\nexport interface PointMapProps extends React.HTMLAttributes<HTMLDivElement> {\n points: MapPoint[];\n /** Accessible name of the map; the points are also listed as text beneath it. */\n label: string;\n center?: [number, number];\n zoom?: number;\n minZoom?: number;\n maxZoom?: number;\n /** Map height in px. */\n height?: number;\n /** Raster tile template. Defaults to OpenStreetMap; use a tile service you are licensed for. */\n tileUrl?: string;\n /** Tile attribution, as the tile provider requires. */\n attribution?: string;\n /** GeoJSON URL for region outlines drawn over the tiles, e.g. US states. */\n outlineUrl?: string;\n /** `value` scales markers by `value`; `none` draws equal dots. */\n sizeBy?: 'value' | 'none';\n /** Show each point's value on its marker. */\n showValues?: boolean;\n /** Hide the text list of points under the map. */\n hideList?: boolean;\n}\n\nconst OSM = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\nconst OSM_ATTRIBUTION = '&copy; OpenStreetMap contributors';\n\n/**\n * Points on a Leaflet map, sized by value, with a text list of the same points\n * for screen readers and print. Needs the optional `leaflet` peer and its CSS\n * (`import 'leaflet/dist/leaflet.css'`). Client-only.\n */\nexport const PointMap = React.forwardRef<HTMLDivElement, PointMapProps>(\n (\n {\n points,\n label,\n center = [39.8, -98.6],\n zoom = 3,\n minZoom = 2,\n maxZoom = 10,\n height = 320,\n tileUrl = OSM,\n attribution = OSM_ATTRIBUTION,\n outlineUrl,\n sizeBy = 'value',\n showValues,\n hideList,\n className,\n ...rest\n },\n ref\n ) => {\n const mapEl = React.useRef<HTMLDivElement>(null);\n const [failed, setFailed] = React.useState(false);\n const max = Math.max(1, ...points.map((p) => p.value ?? 0));\n\n React.useEffect(() => {\n const el = mapEl.current;\n if (!el) return;\n let map: L.Map | undefined;\n let cancelled = false;\n import('leaflet')\n .then(async (mod) => {\n const leaflet =\n (mod as unknown as { default?: typeof L }).default ??\n (mod as typeof L);\n if (cancelled) return;\n const styles = getComputedStyle(el);\n const colour =\n styles.getPropertyValue('--mieweb-primary-500').trim() || '#27aae1';\n const line =\n styles.getPropertyValue('--mieweb-border').trim() || '#94a3b8';\n map = leaflet.map(el, {\n center,\n zoom,\n minZoom,\n maxZoom,\n scrollWheelZoom: false,\n });\n leaflet.tileLayer(tileUrl, { attribution }).addTo(map);\n if (outlineUrl) {\n const data = await fetch(outlineUrl)\n .then((r) => (r.ok ? r.json() : null))\n .catch(() => null);\n if (data && !cancelled && map)\n leaflet\n .geoJSON(data, {\n style: { color: line, weight: 0.6, fillOpacity: 0 },\n })\n .addTo(map);\n }\n if (cancelled || !map) return;\n for (const p of points) {\n const radius =\n sizeBy === 'value' && p.value != null\n ? 6 + (p.value / max) * 22\n : 6;\n const marker = leaflet\n .circleMarker([p.lat, p.lng], {\n radius,\n color: colour,\n weight: 2,\n fillColor: colour,\n fillOpacity: 0.35,\n })\n .addTo(map);\n const text = [\n p.label,\n p.value != null ? String(p.value) : '',\n p.detail ?? '',\n ]\n .filter(Boolean)\n .join(' \\u00b7 ');\n if (showValues && p.value != null)\n marker.bindTooltip(String(p.value), {\n permanent: true,\n direction: 'center',\n className: 'mie-map-value',\n });\n else marker.bindTooltip(text);\n }\n })\n .catch(() => setFailed(true));\n return () => {\n cancelled = true;\n map?.remove();\n };\n // Rebuild when the data changes; the view props only seed the map.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [points, tileUrl, attribution, outlineUrl, sizeBy, showValues]);\n\n return (\n <div\n ref={ref}\n data-slot=\"point-map\"\n className={cn('w-full', className)}\n {...rest}\n >\n <div\n ref={mapEl}\n role=\"group\"\n aria-roledescription=\"map\"\n aria-label={label}\n className=\"bg-muted isolate w-full overflow-hidden rounded-xl\"\n style={{ height }}\n >\n {failed && (\n <p className=\"text-muted-foreground flex h-full items-center justify-center p-4 text-center text-sm\">\n {label}\n </p>\n )}\n </div>\n {!hideList && (\n <ul className=\"mt-3 flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs\">\n {points.map((p) => (\n <li\n key={`${p.label}-${p.lat}-${p.lng}`}\n className=\"flex items-center gap-1.5\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-primary-500 size-2 rounded-full\"\n style={{\n opacity:\n sizeBy === 'value' && p.value != null\n ? 0.4 + (p.value / max) * 0.6\n : 1,\n }}\n />\n {p.label}\n {p.value != null && `: ${p.value}`}\n {p.detail && <span className=\"opacity-70\"> · {p.detail}</span>}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n }\n);\nPointMap.displayName = 'PointMap';\n"]}
@@ -159,3 +159,103 @@
159
159
  display: none;
160
160
  }
161
161
  }
162
+
163
+ /* ── Deck (@mieweb/ui/deck) ──────────────────────────────────────────── */
164
+ /* Content fades up the first time its slide is seen. Hidden only once the
165
+ deck has mounted (`data-ready`), so server HTML and no-JS stay readable. */
166
+ .mie-deck[data-ready] .mie-deck-slide:not([data-seen]) .mie-deck-reveal {
167
+ opacity: 0;
168
+ transform: translateY(1.5rem);
169
+ }
170
+ .mie-deck-reveal {
171
+ transition:
172
+ opacity 0.6s cubic-bezier(0.21, 0.47, 0.32, 0.98),
173
+ transform 0.6s cubic-bezier(0.21, 0.47, 0.32, 0.98);
174
+ transition-delay: calc(var(--mie-reveal-i, 0) * 80ms);
175
+ }
176
+ /* Chart bars grow from the baseline. */
177
+ .mie-deck-grow {
178
+ transform-origin: bottom;
179
+ transition: transform 0.8s cubic-bezier(0.21, 0.47, 0.32, 0.98);
180
+ transition-delay: calc(var(--mie-reveal-i, 0) * 60ms + 200ms);
181
+ }
182
+ .mie-deck[data-ready] .mie-deck-slide:not([data-seen]) .mie-deck-grow {
183
+ transform: scaleY(0);
184
+ }
185
+ @keyframes mie-deck-spin {
186
+ to {
187
+ transform: rotate(360deg);
188
+ }
189
+ }
190
+ .mie-deck-spin {
191
+ animation: mie-deck-spin 60s linear infinite;
192
+ }
193
+ /* A dot travelling along a diagram edge. */
194
+ @keyframes mie-deck-flow {
195
+ from {
196
+ left: var(--mie-from-x);
197
+ top: var(--mie-from-y);
198
+ }
199
+ to {
200
+ left: var(--mie-to-x);
201
+ top: var(--mie-to-y);
202
+ }
203
+ }
204
+ .mie-deck-flow {
205
+ left: var(--mie-from-x);
206
+ top: var(--mie-from-y);
207
+ animation: mie-deck-flow 2.6s linear infinite;
208
+ }
209
+ @media (prefers-reduced-motion: reduce) {
210
+ .mie-deck-reveal,
211
+ .mie-deck-grow {
212
+ transition: none;
213
+ }
214
+ .mie-deck[data-ready] .mie-deck-slide:not([data-seen]) .mie-deck-reveal,
215
+ .mie-deck[data-ready] .mie-deck-slide:not([data-seen]) .mie-deck-grow {
216
+ opacity: 1;
217
+ transform: none;
218
+ }
219
+ .mie-deck-spin,
220
+ .mie-deck-flow {
221
+ animation: none;
222
+ }
223
+ }
224
+ /* PointMap (@mieweb/ui/maps): permanent value labels sit on their markers. */
225
+ .leaflet-tooltip.mie-map-value {
226
+ background: transparent;
227
+ border: 0;
228
+ box-shadow: none;
229
+ font-weight: 700;
230
+ color: var(--mieweb-foreground, #171717);
231
+ }
232
+ .leaflet-tooltip.mie-map-value::before {
233
+ display: none;
234
+ }
235
+
236
+ /* Print: one slide per page, every slide's content visible. */
237
+ @media print {
238
+ .mie-deck {
239
+ height: auto;
240
+ overflow: visible;
241
+ }
242
+ .mie-deck-scroll {
243
+ height: auto;
244
+ overflow: visible;
245
+ }
246
+ .mie-deck-slide {
247
+ min-height: 100vh;
248
+ break-after: page;
249
+ print-color-adjust: exact;
250
+ -webkit-print-color-adjust: exact;
251
+ }
252
+ /* Match the data-ready hide rules' specificity so never-seen slides
253
+ still print their reveal/grow content (equal specificity, later wins). */
254
+ .mie-deck .mie-deck-slide .mie-deck-reveal,
255
+ .mie-deck .mie-deck-slide .mie-deck-grow,
256
+ .mie-deck[data-ready] .mie-deck-slide:not([data-seen]) .mie-deck-reveal,
257
+ .mie-deck[data-ready] .mie-deck-slide:not([data-seen]) .mie-deck-grow {
258
+ opacity: 1;
259
+ transform: none;
260
+ }
261
+ }
@@ -50,6 +50,9 @@
50
50
  --color-ozwell: var(--mieweb-ozwell, #0ba0e0);
51
51
  --color-ozwell-foreground: var(--mieweb-ozwell-foreground, #ffffff);
52
52
 
53
+ /* ── Accent — a brand's highlight colour (EH and BlueHive gold); falls back to primary ── */
54
+ --color-accent: var(--mieweb-accent, var(--mieweb-primary-400));
55
+
53
56
  /* ── Secondary Color Scale ─────────────────────────────────────────── */
54
57
  --color-secondary: var(--mieweb-secondary-500, #6366f1);
55
58
  --color-secondary-50: var(--mieweb-secondary-50, #eef2ff);