@react-x11/components 0.4.0 → 0.5.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 (219) hide show
  1. package/README.md +125 -4
  2. package/dist/charts/components.d.ts +3 -1
  3. package/dist/charts/components.d.ts.map +1 -1
  4. package/dist/charts/components.js +8 -4
  5. package/dist/charts/components.js.map +1 -1
  6. package/dist/charts/node.d.ts +13 -6
  7. package/dist/charts/node.d.ts.map +1 -1
  8. package/dist/charts/node.js +75 -24
  9. package/dist/charts/node.js.map +1 -1
  10. package/dist/charts/render.d.ts +4 -0
  11. package/dist/charts/render.d.ts.map +1 -1
  12. package/dist/charts/render.js +11 -6
  13. package/dist/charts/render.js.map +1 -1
  14. package/dist/code-editor/node.d.ts +47 -16
  15. package/dist/code-editor/node.d.ts.map +1 -1
  16. package/dist/code-editor/node.js +121 -51
  17. package/dist/code-editor/node.js.map +1 -1
  18. package/dist/flow/draw.d.ts +19 -1
  19. package/dist/flow/draw.d.ts.map +1 -1
  20. package/dist/flow/draw.js +64 -35
  21. package/dist/flow/draw.js.map +1 -1
  22. package/dist/flow/index.d.ts.map +1 -1
  23. package/dist/flow/index.js +24 -8
  24. package/dist/flow/index.js.map +1 -1
  25. package/dist/flow/model.d.ts +4 -2
  26. package/dist/flow/model.d.ts.map +1 -1
  27. package/dist/flow/model.js +4 -2
  28. package/dist/flow/model.js.map +1 -1
  29. package/dist/flow/node.d.ts +40 -9
  30. package/dist/flow/node.d.ts.map +1 -1
  31. package/dist/flow/node.js +142 -53
  32. package/dist/flow/node.js.map +1 -1
  33. package/dist/flow/types.d.ts +46 -21
  34. package/dist/flow/types.d.ts.map +1 -1
  35. package/dist/formula/index.d.ts +4 -2
  36. package/dist/formula/index.d.ts.map +1 -1
  37. package/dist/formula/index.js.map +1 -1
  38. package/dist/formula/node.d.ts +5 -1
  39. package/dist/formula/node.d.ts.map +1 -1
  40. package/dist/formula/node.js +19 -3
  41. package/dist/formula/node.js.map +1 -1
  42. package/dist/html/controls.d.ts +4 -1
  43. package/dist/html/controls.d.ts.map +1 -1
  44. package/dist/html/controls.js.map +1 -1
  45. package/dist/html/css/cascade.d.ts +11 -5
  46. package/dist/html/css/cascade.d.ts.map +1 -1
  47. package/dist/html/css/cascade.js +18 -8
  48. package/dist/html/css/cascade.js.map +1 -1
  49. package/dist/html/css/parse.d.ts +15 -10
  50. package/dist/html/css/parse.d.ts.map +1 -1
  51. package/dist/html/css/parse.js +41 -16
  52. package/dist/html/css/parse.js.map +1 -1
  53. package/dist/html/css/style.d.ts +3 -0
  54. package/dist/html/css/style.d.ts.map +1 -1
  55. package/dist/html/css/style.js +3 -1
  56. package/dist/html/css/style.js.map +1 -1
  57. package/dist/html/css/values.d.ts +14 -1
  58. package/dist/html/css/values.d.ts.map +1 -1
  59. package/dist/html/css/values.js +11 -8
  60. package/dist/html/css/values.js.map +1 -1
  61. package/dist/html/index.d.ts.map +1 -1
  62. package/dist/html/index.js +1 -0
  63. package/dist/html/index.js.map +1 -1
  64. package/dist/html/layout/boxes.d.ts +12 -5
  65. package/dist/html/layout/boxes.d.ts.map +1 -1
  66. package/dist/html/layout/boxes.js +7 -4
  67. package/dist/html/layout/boxes.js.map +1 -1
  68. package/dist/html/layout/inline.d.ts.map +1 -1
  69. package/dist/html/layout/inline.js +22 -1
  70. package/dist/html/layout/inline.js.map +1 -1
  71. package/dist/html/node.d.ts +22 -8
  72. package/dist/html/node.d.ts.map +1 -1
  73. package/dist/html/node.js +97 -15
  74. package/dist/html/node.js.map +1 -1
  75. package/dist/html/paint.d.ts +3 -0
  76. package/dist/html/paint.d.ts.map +1 -1
  77. package/dist/html/paint.js +2 -2
  78. package/dist/html/paint.js.map +1 -1
  79. package/dist/index.d.ts +7 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +21 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/maps/clip.d.ts +43 -0
  84. package/dist/maps/clip.d.ts.map +1 -0
  85. package/dist/maps/clip.js +171 -0
  86. package/dist/maps/clip.js.map +1 -0
  87. package/dist/maps/gzip.d.ts +15 -0
  88. package/dist/maps/gzip.d.ts.map +1 -0
  89. package/dist/maps/gzip.js +56 -0
  90. package/dist/maps/gzip.js.map +1 -0
  91. package/dist/maps/index.d.ts +55 -0
  92. package/dist/maps/index.d.ts.map +1 -0
  93. package/dist/maps/index.js +141 -0
  94. package/dist/maps/index.js.map +1 -0
  95. package/dist/maps/labels.d.ts +123 -0
  96. package/dist/maps/labels.d.ts.map +1 -0
  97. package/dist/maps/labels.js +323 -0
  98. package/dist/maps/labels.js.map +1 -0
  99. package/dist/maps/mvt.d.ts +244 -0
  100. package/dist/maps/mvt.d.ts.map +1 -0
  101. package/dist/maps/mvt.js +820 -0
  102. package/dist/maps/mvt.js.map +1 -0
  103. package/dist/maps/node.d.ts +278 -0
  104. package/dist/maps/node.d.ts.map +1 -0
  105. package/dist/maps/node.js +1459 -0
  106. package/dist/maps/node.js.map +1 -0
  107. package/dist/maps/overlay.d.ts +157 -0
  108. package/dist/maps/overlay.d.ts.map +1 -0
  109. package/dist/maps/overlay.js +472 -0
  110. package/dist/maps/overlay.js.map +1 -0
  111. package/dist/maps/paint.d.ts +226 -0
  112. package/dist/maps/paint.d.ts.map +1 -0
  113. package/dist/maps/paint.js +705 -0
  114. package/dist/maps/paint.js.map +1 -0
  115. package/dist/maps/proj.d.ts +281 -0
  116. package/dist/maps/proj.d.ts.map +1 -0
  117. package/dist/maps/proj.js +451 -0
  118. package/dist/maps/proj.js.map +1 -0
  119. package/dist/maps/sources.d.ts +256 -0
  120. package/dist/maps/sources.d.ts.map +1 -0
  121. package/dist/maps/sources.js +210 -0
  122. package/dist/maps/sources.js.map +1 -0
  123. package/dist/maps/style.d.ts +141 -0
  124. package/dist/maps/style.d.ts.map +1 -0
  125. package/dist/maps/style.js +147 -0
  126. package/dist/maps/style.js.map +1 -0
  127. package/dist/maps/styles.d.ts +82 -0
  128. package/dist/maps/styles.d.ts.map +1 -0
  129. package/dist/maps/styles.js +898 -0
  130. package/dist/maps/styles.js.map +1 -0
  131. package/dist/maps/tiles.d.ts +283 -0
  132. package/dist/maps/tiles.d.ts.map +1 -0
  133. package/dist/maps/tiles.js +469 -0
  134. package/dist/maps/tiles.js.map +1 -0
  135. package/dist/maps/types.d.ts +244 -0
  136. package/dist/maps/types.d.ts.map +1 -0
  137. package/dist/maps/types.js +2 -0
  138. package/dist/maps/types.js.map +1 -0
  139. package/dist/reorder/hx.d.ts +18 -0
  140. package/dist/reorder/hx.d.ts.map +1 -0
  141. package/dist/reorder/hx.js +10 -0
  142. package/dist/reorder/hx.js.map +1 -0
  143. package/dist/reorder/index.d.ts +314 -0
  144. package/dist/reorder/index.d.ts.map +1 -0
  145. package/dist/reorder/index.js +1539 -0
  146. package/dist/reorder/index.js.map +1 -0
  147. package/dist/reorder/model.d.ts +107 -0
  148. package/dist/reorder/model.d.ts.map +1 -0
  149. package/dist/reorder/model.js +162 -0
  150. package/dist/reorder/model.js.map +1 -0
  151. package/dist/richtext/node.d.ts +15 -5
  152. package/dist/richtext/node.d.ts.map +1 -1
  153. package/dist/richtext/node.js +40 -11
  154. package/dist/richtext/node.js.map +1 -1
  155. package/dist/richtext/runs.d.ts +35 -13
  156. package/dist/richtext/runs.d.ts.map +1 -1
  157. package/dist/richtext/runs.js +83 -27
  158. package/dist/richtext/runs.js.map +1 -1
  159. package/dist/tabs/index.d.ts +17 -0
  160. package/dist/tabs/index.d.ts.map +1 -1
  161. package/dist/tabs/index.js +849 -186
  162. package/dist/tabs/index.js.map +1 -1
  163. package/dist/terminal/vt/fonts.d.ts +45 -15
  164. package/dist/terminal/vt/fonts.d.ts.map +1 -1
  165. package/dist/terminal/vt/fonts.js +89 -19
  166. package/dist/terminal/vt/fonts.js.map +1 -1
  167. package/dist/terminal/vt/node.d.ts +42 -0
  168. package/dist/terminal/vt/node.d.ts.map +1 -1
  169. package/dist/terminal/vt/node.js +95 -11
  170. package/dist/terminal/vt/node.js.map +1 -1
  171. package/dist/terminal/vt/renderer.d.ts.map +1 -1
  172. package/dist/terminal/vt/renderer.js +13 -3
  173. package/dist/terminal/vt/renderer.js.map +1 -1
  174. package/package.json +13 -3
  175. package/src/charts/components.ts +14 -7
  176. package/src/charts/node.ts +81 -26
  177. package/src/charts/render.ts +16 -6
  178. package/src/code-editor/node.ts +147 -53
  179. package/src/flow/draw.ts +104 -35
  180. package/src/flow/index.ts +33 -13
  181. package/src/flow/model.ts +4 -2
  182. package/src/flow/node.ts +158 -59
  183. package/src/flow/types.ts +46 -21
  184. package/src/formula/index.ts +4 -2
  185. package/src/formula/node.ts +24 -5
  186. package/src/html/controls.ts +4 -1
  187. package/src/html/css/cascade.ts +18 -7
  188. package/src/html/css/parse.ts +46 -21
  189. package/src/html/css/style.ts +6 -1
  190. package/src/html/css/values.ts +25 -9
  191. package/src/html/index.ts +1 -0
  192. package/src/html/layout/boxes.ts +19 -9
  193. package/src/html/layout/inline.ts +23 -1
  194. package/src/html/node.ts +110 -17
  195. package/src/html/paint.ts +17 -2
  196. package/src/index.ts +98 -0
  197. package/src/maps/clip.ts +184 -0
  198. package/src/maps/gzip.ts +66 -0
  199. package/src/maps/index.ts +316 -0
  200. package/src/maps/labels.ts +442 -0
  201. package/src/maps/mvt.ts +857 -0
  202. package/src/maps/node.ts +1819 -0
  203. package/src/maps/overlay.ts +639 -0
  204. package/src/maps/paint.ts +978 -0
  205. package/src/maps/proj.ts +641 -0
  206. package/src/maps/sources.ts +425 -0
  207. package/src/maps/style.ts +309 -0
  208. package/src/maps/styles.ts +1040 -0
  209. package/src/maps/tiles.ts +676 -0
  210. package/src/maps/types.ts +260 -0
  211. package/src/reorder/hx.ts +31 -0
  212. package/src/reorder/index.ts +2223 -0
  213. package/src/reorder/model.ts +232 -0
  214. package/src/richtext/node.ts +49 -14
  215. package/src/richtext/runs.ts +115 -30
  216. package/src/tabs/index.ts +1040 -204
  217. package/src/terminal/vt/fonts.ts +128 -36
  218. package/src/terminal/vt/node.ts +105 -12
  219. package/src/terminal/vt/renderer.ts +13 -3
@@ -0,0 +1,472 @@
1
+ // What the application puts on the map: markers, and the lines, areas and
2
+ // circles that carry a route, a traffic segment, a transit shape or a
3
+ // GeoJSON layer.
4
+ //
5
+ // All of it is drawn **into the frame**, not into a tile surface, for the
6
+ // reason the labels are: it is application state that changes on its own
7
+ // clock, and baking it into a tile would mean re-rasterizing a tile every
8
+ // time a vehicle moved. It rides the pan blit like everything else on the
9
+ // map, because it is anchored to geography.
10
+ //
11
+ // The vocabulary is deliberately small and deliberately geometric — a line
12
+ // is a line whether it came from a routing engine, a GTFS shape or a
13
+ // traffic feed — with the format adapters ({@link decodePolyline},
14
+ // {@link geoJsonOverlays}) kept as pure functions beside it rather than as
15
+ // props of the map. `docs/prd-maps.md` surveys what the real feeds look
16
+ // like and why this is the shape they all reduce to.
17
+ import { clipOf, clipRing, clipSegment } from './clip.js';
18
+ import { projectLngLat } from './proj.js';
19
+ function byZ(items) {
20
+ // A stable sort — the language guarantees it — so items with no `zIndex`
21
+ // keep the order the application listed them in.
22
+ return [...items].sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));
23
+ }
24
+ /**
25
+ * Draw the overlays.
26
+ *
27
+ * Under the markers, because a marker is a thing the user aims at and an
28
+ * overlay is context for it.
29
+ */
30
+ export function drawOverlays(ctx, overlays, transform, pane, scale, palette) {
31
+ const clip = clipOf(pane, scale);
32
+ for (const overlay of byZ(overlays)) {
33
+ const opacity = overlay.opacity ?? 1;
34
+ if (opacity <= 0)
35
+ continue;
36
+ ctx.save();
37
+ if (ctx.globalAlpha !== undefined && opacity < 1)
38
+ ctx.globalAlpha = opacity;
39
+ if (overlay.kind === 'line') {
40
+ const points = projectPath(overlay.path, transform, pane, scale);
41
+ const width = (overlay.width ?? 3) * scale;
42
+ if (overlay.casing !== undefined) {
43
+ ctx.strokeStyle = overlay.casing;
44
+ ctx.lineWidth = Math.max(width + 2 * scale, (overlay.casingWidth ?? 0) * scale);
45
+ ctx.lineCap = overlay.cap ?? 'round';
46
+ ctx.lineJoin = overlay.join ?? 'round';
47
+ strokeClipped(ctx, points, clip);
48
+ }
49
+ ctx.strokeStyle = overlay.color ?? palette.accent;
50
+ ctx.lineWidth = width;
51
+ ctx.lineCap = overlay.cap ?? 'round';
52
+ ctx.lineJoin = overlay.join ?? 'round';
53
+ if (overlay.dash && ctx.setLineDash) {
54
+ ctx.setLineDash(overlay.dash.map((d) => d * scale));
55
+ }
56
+ strokeClipped(ctx, points, clip);
57
+ if (overlay.dash && ctx.setLineDash)
58
+ ctx.setLineDash([]);
59
+ }
60
+ else if (overlay.kind === 'polygon') {
61
+ ctx.beginPath();
62
+ let any = false;
63
+ for (const ring of overlay.rings) {
64
+ const clipped = clipRing(projectPath(ring, transform, pane, scale), clip);
65
+ if (appendRing(ctx, clipped))
66
+ any = true;
67
+ }
68
+ if (any) {
69
+ ctx.fillStyle = overlay.fill ?? palette.accent;
70
+ ctx.fill();
71
+ if (overlay.outline !== undefined) {
72
+ ctx.strokeStyle = overlay.outline;
73
+ ctx.lineWidth = (overlay.outlineWidth ?? 1) * scale;
74
+ ctx.stroke();
75
+ }
76
+ }
77
+ }
78
+ else {
79
+ // A circle in ground metres is an ellipse on a Mercator map, and at
80
+ // the sizes an application draws one it is close enough to a circle
81
+ // that the difference is under a pixel — except near the poles, where
82
+ // it is not. So the radius is computed from the *projection* rather
83
+ // than from a metres-per-pixel constant: one degree of latitude
84
+ // either side of the centre, projected, is exactly the scale factor
85
+ // this circle should be drawn at.
86
+ const centre = projectLngLat(transform, overlay.center);
87
+ const north = projectLngLat(transform, {
88
+ lon: overlay.center.lon,
89
+ lat: Math.min(85, overlay.center.lat + 0.01),
90
+ });
91
+ const metresPerDegree = 111_319.9;
92
+ const pixelsPerMetre = Math.abs(centre.y - north.y) / (0.01 * metresPerDegree);
93
+ const radius = overlay.radiusMetres * pixelsPerMetre * scale;
94
+ const cx = (pane.x + centre.x) * scale;
95
+ const cy = (pane.y + centre.y) * scale;
96
+ const outside = cx + radius < clip.minX ||
97
+ cx - radius > clip.maxX ||
98
+ cy + radius < clip.minY ||
99
+ cy - radius > clip.maxY;
100
+ if (radius > 0.5 && !outside) {
101
+ ctx.fillStyle = overlay.fill ?? palette.accent;
102
+ if (radius <= MAX_ARC_RADIUS) {
103
+ ctx.beginPath();
104
+ ctx.moveTo(cx + radius, cy);
105
+ ctx.arc(cx, cy, radius, 0, Math.PI * 2);
106
+ ctx.fill();
107
+ if (overlay.outline !== undefined) {
108
+ ctx.strokeStyle = overlay.outline;
109
+ ctx.lineWidth = (overlay.outlineWidth ?? 1) * scale;
110
+ ctx.stroke();
111
+ }
112
+ }
113
+ else {
114
+ // Past the arc's safe range the circle becomes a ring and is
115
+ // clipped like any other polygon. The segment count keeps the
116
+ // sagitta under half a pixel, and for a circle this large the
117
+ // visible arc is very nearly straight anyway.
118
+ ctx.beginPath();
119
+ if (appendRing(ctx, clipRing(circleRing(cx, cy, radius), clip))) {
120
+ ctx.fill();
121
+ if (overlay.outline !== undefined) {
122
+ ctx.strokeStyle = overlay.outline;
123
+ ctx.lineWidth = (overlay.outlineWidth ?? 1) * scale;
124
+ ctx.stroke();
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ ctx.restore();
131
+ }
132
+ }
133
+ /**
134
+ * Everything below this line exists because **an overlay's coordinates are
135
+ * unbounded and the renderer's are not.**
136
+ *
137
+ * A route is geography, so its far end stays where it is when the camera
138
+ * zooms in on one corner of it. World pixels are `512 · 2^zoom`, which at
139
+ * zoom 20 is 134 million, so a vertex a fraction of a degree outside the
140
+ * pane is already tens of thousands of pixels away — and ntk hands a
141
+ * stroke's geometry to XRender as 16.16 fixed point, which overflows a
142
+ * signed 32-bit word at 32,768. The symptom is a `RangeError` out of
143
+ * `x11/lib/ext/render.js` a few zoom steps in, from inside `paint`, which
144
+ * is not a place an application can catch it.
145
+ *
146
+ * So geometry is clipped to the viewport before it reaches the context.
147
+ * That is the fix; the fact that it also stops the renderer rasterizing
148
+ * megametres of off-screen line is a bonus rather than the reason.
149
+ */
150
+ /** A path projected into target pixels, as a flat `[x0, y0, x1, y1, …]`. */
151
+ function projectPath(path, transform, pane, scale) {
152
+ const out = [];
153
+ for (const position of path) {
154
+ const point = projectLngLat(transform, position);
155
+ out.push((pane.x + point.x) * scale, (pane.y + point.y) * scale);
156
+ }
157
+ return out;
158
+ }
159
+ /**
160
+ * Stroke a projected path, clipped.
161
+ *
162
+ * A polyline that leaves and re-enters the window becomes several subpaths,
163
+ * which is why this cannot be a `ctx.clip()` and a single path: the clip
164
+ * would keep the coordinates, and the coordinates are the problem.
165
+ */
166
+ function strokeClipped(ctx, points, clip) {
167
+ if (points.length < 4)
168
+ return;
169
+ ctx.beginPath();
170
+ let open = false;
171
+ let drew = false;
172
+ for (let i = 0; i + 3 < points.length; i += 2) {
173
+ const piece = clipSegment(points[i], points[i + 1], points[i + 2], points[i + 3], clip);
174
+ if (!piece) {
175
+ open = false;
176
+ continue;
177
+ }
178
+ const [x0, y0, x1, y1] = piece;
179
+ // A new subpath unless this segment continues exactly where the last
180
+ // one ended — which is the whole-segment-visible case, and the one that
181
+ // has to keep its joins.
182
+ if (!open) {
183
+ ctx.moveTo(x0, y0);
184
+ open = true;
185
+ }
186
+ ctx.lineTo(x1, y1);
187
+ drew = true;
188
+ // The segment was cut short at the far end, so the next one does not
189
+ // continue from here.
190
+ if (x1 !== points[i + 2] || y1 !== points[i + 3])
191
+ open = false;
192
+ }
193
+ if (drew)
194
+ ctx.stroke();
195
+ }
196
+ function appendRing(ctx, ring) {
197
+ if (ring.length < 6)
198
+ return false;
199
+ ctx.moveTo(ring[0], ring[1]);
200
+ for (let i = 2; i < ring.length; i += 2)
201
+ ctx.lineTo(ring[i], ring[i + 1]);
202
+ ctx.closePath();
203
+ return true;
204
+ }
205
+ /** Where a marker's ink lands, in pane-local logical pixels. Shared by the
206
+ * drawing and the hit test, so the two cannot disagree — the bug that
207
+ * makes a marker unclickable a few pixels from where it looks. */
208
+ export function markerRect(marker, transform) {
209
+ const point = projectLngLat(transform, marker.position);
210
+ const size = marker.size ?? 14;
211
+ if ((marker.shape ?? 'pin') === 'circle') {
212
+ return {
213
+ x: point.x - size / 2,
214
+ y: point.y - size / 2,
215
+ width: size,
216
+ height: size,
217
+ tipX: point.x,
218
+ tipY: point.y,
219
+ };
220
+ }
221
+ // A pin *stands on* its position: the point is the tip, and the head is
222
+ // above it. Getting this the other way round puts every marker half its
223
+ // own height north of where it belongs, which on a city map is a street.
224
+ const height = size * 1.4;
225
+ return {
226
+ x: point.x - size / 2,
227
+ y: point.y - height,
228
+ width: size,
229
+ height,
230
+ tipX: point.x,
231
+ tipY: point.y,
232
+ };
233
+ }
234
+ /** Draw the markers, lowest `zIndex` first. */
235
+ export function drawMarkers(ctx, markers, transform, pane, scale, palette) {
236
+ let drawn = 0;
237
+ for (const marker of byZ(markers)) {
238
+ const rect = markerRect(marker, transform);
239
+ if (rect.x + rect.width < 0 ||
240
+ rect.y + rect.height < 0 ||
241
+ rect.x > pane.width ||
242
+ rect.y > pane.height) {
243
+ continue;
244
+ }
245
+ const size = marker.size ?? 14;
246
+ const fill = marker.color ?? palette.accent;
247
+ const ring = marker.outline ?? palette.background;
248
+ const x = (pane.x + rect.tipX) * scale;
249
+ const y = (pane.y + rect.tipY) * scale;
250
+ const r = (size / 2) * scale;
251
+ ctx.save();
252
+ ctx.lineWidth = Math.max(1, (marker.selected ? 2.5 : 1.5) * scale);
253
+ ctx.strokeStyle = marker.selected ? palette.text : ring;
254
+ ctx.fillStyle = fill;
255
+ if ((marker.shape ?? 'pin') === 'circle') {
256
+ ctx.beginPath();
257
+ ctx.moveTo(x + r, y);
258
+ ctx.arc(x, y, r, 0, Math.PI * 2);
259
+ ctx.fill();
260
+ ctx.stroke();
261
+ }
262
+ else {
263
+ // A teardrop: a circle for the head and two lines down to the tip.
264
+ // The tangent angle is where the straight sides meet the circle, so
265
+ // the outline is smooth rather than two lines crossing an arc.
266
+ const cy = y - size * 1.4 * scale + r;
267
+ const d = y - cy;
268
+ const angle = Math.asin(Math.min(1, r / d));
269
+ ctx.beginPath();
270
+ ctx.arc(x, cy, r, Math.PI / 2 + angle, Math.PI / 2 - angle);
271
+ ctx.lineTo(x, y);
272
+ ctx.closePath();
273
+ ctx.fill();
274
+ ctx.stroke();
275
+ }
276
+ ctx.restore();
277
+ drawn++;
278
+ }
279
+ return drawn;
280
+ }
281
+ /** The marker under a pane-local logical point, topmost first, or null. */
282
+ export function markerAt(markers, transform, x, y, slop = 2) {
283
+ const ordered = byZ(markers);
284
+ for (let i = ordered.length - 1; i >= 0; i--) {
285
+ const marker = ordered[i];
286
+ if (marker.interactive === false)
287
+ continue;
288
+ const rect = markerRect(marker, transform);
289
+ if (x >= rect.x - slop &&
290
+ x <= rect.x + rect.width + slop &&
291
+ y >= rect.y - slop &&
292
+ y <= rect.y + rect.height + slop) {
293
+ return marker;
294
+ }
295
+ }
296
+ return null;
297
+ }
298
+ /**
299
+ * Decode Google's Encoded Polyline Algorithm Format.
300
+ *
301
+ * Here because it is what every routing engine on the open web answers
302
+ * with — Google Directions, OSRM, Valhalla, GraphHopper, Mapbox Directions
303
+ * — so a route arrives as one of these strings far more often than as
304
+ * GeoJSON. `precision` is 5 for Google and OSRM's default, 6 for Valhalla
305
+ * and OSRM's `polyline6`; passing the wrong one puts the route in the
306
+ * Atlantic, which is the standard way to discover this.
307
+ */
308
+ export function decodePolyline(encoded, precision = 5) {
309
+ const factor = Math.pow(10, precision);
310
+ const out = [];
311
+ let index = 0;
312
+ let lat = 0;
313
+ let lon = 0;
314
+ while (index < encoded.length) {
315
+ let result = 0;
316
+ let shift = 0;
317
+ let byte;
318
+ do {
319
+ byte = encoded.charCodeAt(index++) - 63;
320
+ result |= (byte & 0x1f) << shift;
321
+ shift += 5;
322
+ } while (byte >= 0x20 && index < encoded.length);
323
+ lat += result & 1 ? ~(result >> 1) : result >> 1;
324
+ result = 0;
325
+ shift = 0;
326
+ do {
327
+ byte = encoded.charCodeAt(index++) - 63;
328
+ result |= (byte & 0x1f) << shift;
329
+ shift += 5;
330
+ } while (byte >= 0x20 && index < encoded.length);
331
+ lon += result & 1 ? ~(result >> 1) : result >> 1;
332
+ out.push({ lat: lat / factor, lon: lon / factor });
333
+ }
334
+ return out;
335
+ }
336
+ /**
337
+ * GeoJSON to overlays.
338
+ *
339
+ * Points become markers and everything else becomes an overlay, which is
340
+ * the split the drawing makes. `style` is asked once per feature so an
341
+ * application can colour by a property — a traffic feed's congestion, a
342
+ * transit feed's route colour — without this function growing an
343
+ * expression language.
344
+ *
345
+ * Coordinates are `[lon, lat]`, which is GeoJSON's order and the opposite
346
+ * of how most people say it.
347
+ */
348
+ export function geoJsonOverlays(geojson, style) {
349
+ const overlays = [];
350
+ const markers = [];
351
+ let counter = 0;
352
+ const positions = (value) => Array.isArray(value)
353
+ ? value
354
+ .filter((pair) => Array.isArray(pair) &&
355
+ typeof pair[0] === 'number' &&
356
+ typeof pair[1] === 'number')
357
+ .map(([lon, lat]) => ({ lon, lat }))
358
+ : [];
359
+ const walk = (node, owner) => {
360
+ const id = String(owner.id ?? `geojson-${counter++}`);
361
+ const extra = style?.(owner) ?? {};
362
+ switch (node.type) {
363
+ case 'FeatureCollection':
364
+ for (const feature of node.features ?? [])
365
+ walk(feature, feature);
366
+ return;
367
+ case 'Feature':
368
+ if (node.geometry)
369
+ walk(node.geometry, node);
370
+ return;
371
+ case 'GeometryCollection':
372
+ for (const geometry of node.geometries ?? [])
373
+ walk(geometry, owner);
374
+ return;
375
+ case 'Point': {
376
+ const [point] = positions([node.coordinates]);
377
+ if (point)
378
+ markers.push({ id, position: point, data: owner.properties });
379
+ return;
380
+ }
381
+ case 'MultiPoint':
382
+ for (const point of positions(node.coordinates)) {
383
+ markers.push({
384
+ id: `${id}-${counter++}`,
385
+ position: point,
386
+ data: owner.properties,
387
+ });
388
+ }
389
+ return;
390
+ case 'LineString': {
391
+ const path = positions(node.coordinates);
392
+ if (path.length >= 2) {
393
+ overlays.push({
394
+ kind: 'line',
395
+ id,
396
+ path,
397
+ data: owner.properties,
398
+ ...extra,
399
+ });
400
+ }
401
+ return;
402
+ }
403
+ case 'MultiLineString':
404
+ for (const part of node.coordinates ?? []) {
405
+ const path = positions(part);
406
+ if (path.length >= 2) {
407
+ overlays.push({
408
+ kind: 'line',
409
+ id: `${id}-${counter++}`,
410
+ path,
411
+ data: owner.properties,
412
+ ...extra,
413
+ });
414
+ }
415
+ }
416
+ return;
417
+ case 'Polygon': {
418
+ const rings = (node.coordinates ?? []).map(positions);
419
+ if (rings.length > 0) {
420
+ overlays.push({
421
+ kind: 'polygon',
422
+ id,
423
+ rings,
424
+ data: owner.properties,
425
+ ...extra,
426
+ });
427
+ }
428
+ return;
429
+ }
430
+ case 'MultiPolygon':
431
+ for (const polygon of node.coordinates ?? []) {
432
+ const rings = (polygon ?? []).map(positions);
433
+ if (rings.length > 0) {
434
+ overlays.push({
435
+ kind: 'polygon',
436
+ id: `${id}-${counter++}`,
437
+ rings,
438
+ data: owner.properties,
439
+ ...extra,
440
+ });
441
+ }
442
+ }
443
+ return;
444
+ default:
445
+ return;
446
+ }
447
+ };
448
+ walk(geojson, geojson);
449
+ return { overlays, markers };
450
+ }
451
+ /**
452
+ * Beyond this radius in target pixels a circle is drawn as a clipped ring
453
+ * rather than an arc.
454
+ *
455
+ * The bound is the renderer's rather than the geometry's: ntk hands a
456
+ * stroke's geometry to XRender in 16.16 fixed point, which overflows a
457
+ * signed 32-bit word at 32,768, so an arc whose control geometry reaches
458
+ * that far is a `RangeError` from inside `paint`. Comfortably under it.
459
+ */
460
+ const MAX_ARC_RADIUS = 8192;
461
+ /** A circle as a ring, with the sagitta held under half a pixel. */
462
+ function circleRing(cx, cy, radius) {
463
+ const step = 2 * Math.acos(Math.max(-1, 1 - 0.5 / radius));
464
+ const segments = Math.min(4096, Math.max(24, Math.ceil((Math.PI * 2) / step)));
465
+ const out = [];
466
+ for (let i = 0; i < segments; i++) {
467
+ const angle = (i / segments) * Math.PI * 2;
468
+ out.push(cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius);
469
+ }
470
+ return out;
471
+ }
472
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/maps/overlay.ts"],"names":[],"mappings":"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"}