@bendyline/squisq-react 1.3.1 → 1.4.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 (215) hide show
  1. package/dist/index.d.ts +766 -35
  2. package/dist/index.js +4793 -33
  3. package/dist/index.js.map +1 -1
  4. package/dist/squisq-player.css +1 -1
  5. package/dist/squisq-player.css.map +1 -1
  6. package/dist/squisq-player.global.js +17 -13
  7. package/dist/squisq-player.global.js.map +1 -1
  8. package/dist/standalone-source.js +1 -1
  9. package/package.json +3 -2
  10. package/src/BlockRenderer.tsx +15 -7
  11. package/src/DocPlayer.tsx +65 -12
  12. package/src/DocProgressBar.tsx +21 -3
  13. package/src/LinearDocView.tsx +11 -197
  14. package/src/MarkdownRenderer.tsx +165 -41
  15. package/src/MediaClipLayer.tsx +135 -0
  16. package/src/__tests__/DocPlayer.test.tsx +51 -0
  17. package/src/__tests__/DocProgressBar.test.tsx +76 -0
  18. package/src/__tests__/MarkdownRenderer.test.tsx +95 -1
  19. package/src/__tests__/PathLayer.test.tsx +73 -0
  20. package/src/__tests__/fillStyle.test.tsx +112 -0
  21. package/src/__tests__/transitionStyles.test.ts +125 -0
  22. package/src/__tests__/useDocPlayback.transition.test.ts +70 -0
  23. package/src/hooks/useAudioSync.ts +14 -1
  24. package/src/hooks/useDocPlayback.ts +81 -100
  25. package/src/hooks/useMediaSchedule.ts +39 -0
  26. package/src/index.ts +7 -0
  27. package/src/layers/ImageLayer.tsx +11 -1
  28. package/src/layers/PathLayer.tsx +146 -0
  29. package/src/layers/ShapeLayer.tsx +27 -5
  30. package/src/layers/TextLayer.tsx +395 -22
  31. package/src/layers/VideoLayer.tsx +16 -9
  32. package/src/layers/index.ts +1 -0
  33. package/src/styles/doc-animations.css +1857 -2
  34. package/src/utils/fillStyle.tsx +148 -0
  35. package/dist/BlockRenderer.d.ts +0 -37
  36. package/dist/BlockRenderer.d.ts.map +0 -1
  37. package/dist/BlockRenderer.js +0 -54
  38. package/dist/BlockRenderer.js.map +0 -1
  39. package/dist/CaptionOverlay.d.ts +0 -33
  40. package/dist/CaptionOverlay.d.ts.map +0 -1
  41. package/dist/CaptionOverlay.js +0 -44
  42. package/dist/CaptionOverlay.js.map +0 -1
  43. package/dist/DocControlsBottom.d.ts +0 -28
  44. package/dist/DocControlsBottom.d.ts.map +0 -1
  45. package/dist/DocControlsBottom.js +0 -27
  46. package/dist/DocControlsBottom.js.map +0 -1
  47. package/dist/DocControlsOverlay.d.ts +0 -28
  48. package/dist/DocControlsOverlay.d.ts.map +0 -1
  49. package/dist/DocControlsOverlay.js +0 -80
  50. package/dist/DocControlsOverlay.js.map +0 -1
  51. package/dist/DocControlsSidebar.d.ts +0 -27
  52. package/dist/DocControlsSidebar.d.ts.map +0 -1
  53. package/dist/DocControlsSidebar.js +0 -10
  54. package/dist/DocControlsSidebar.js.map +0 -1
  55. package/dist/DocControlsSlideshow.d.ts +0 -20
  56. package/dist/DocControlsSlideshow.d.ts.map +0 -1
  57. package/dist/DocControlsSlideshow.js +0 -69
  58. package/dist/DocControlsSlideshow.js.map +0 -1
  59. package/dist/DocPlayer.d.ts +0 -97
  60. package/dist/DocPlayer.d.ts.map +0 -1
  61. package/dist/DocPlayer.js +0 -657
  62. package/dist/DocPlayer.js.map +0 -1
  63. package/dist/DocPlayerWithSidebar.d.ts +0 -41
  64. package/dist/DocPlayerWithSidebar.d.ts.map +0 -1
  65. package/dist/DocPlayerWithSidebar.js +0 -69
  66. package/dist/DocPlayerWithSidebar.js.map +0 -1
  67. package/dist/DocProgressBar.d.ts +0 -31
  68. package/dist/DocProgressBar.d.ts.map +0 -1
  69. package/dist/DocProgressBar.js +0 -122
  70. package/dist/DocProgressBar.js.map +0 -1
  71. package/dist/InlineAudioPlayer.d.ts +0 -15
  72. package/dist/InlineAudioPlayer.d.ts.map +0 -1
  73. package/dist/InlineAudioPlayer.js +0 -22
  74. package/dist/InlineAudioPlayer.js.map +0 -1
  75. package/dist/InlineVideoPlayer.d.ts +0 -21
  76. package/dist/InlineVideoPlayer.d.ts.map +0 -1
  77. package/dist/InlineVideoPlayer.js +0 -29
  78. package/dist/InlineVideoPlayer.js.map +0 -1
  79. package/dist/LinearDocView.d.ts +0 -73
  80. package/dist/LinearDocView.d.ts.map +0 -1
  81. package/dist/LinearDocView.js +0 -451
  82. package/dist/LinearDocView.js.map +0 -1
  83. package/dist/MarkdownRenderer.d.ts +0 -32
  84. package/dist/MarkdownRenderer.d.ts.map +0 -1
  85. package/dist/MarkdownRenderer.js +0 -259
  86. package/dist/MarkdownRenderer.js.map +0 -1
  87. package/dist/SocialCaptionOverlay.d.ts +0 -27
  88. package/dist/SocialCaptionOverlay.d.ts.map +0 -1
  89. package/dist/SocialCaptionOverlay.js +0 -185
  90. package/dist/SocialCaptionOverlay.js.map +0 -1
  91. package/dist/__tests__/BlockRenderer.test.d.ts +0 -2
  92. package/dist/__tests__/BlockRenderer.test.d.ts.map +0 -1
  93. package/dist/__tests__/BlockRenderer.test.js +0 -82
  94. package/dist/__tests__/BlockRenderer.test.js.map +0 -1
  95. package/dist/__tests__/DocControlsSlideshow.test.d.ts +0 -2
  96. package/dist/__tests__/DocControlsSlideshow.test.d.ts.map +0 -1
  97. package/dist/__tests__/DocControlsSlideshow.test.js +0 -89
  98. package/dist/__tests__/DocControlsSlideshow.test.js.map +0 -1
  99. package/dist/__tests__/JsonView.test.d.ts +0 -2
  100. package/dist/__tests__/JsonView.test.d.ts.map +0 -1
  101. package/dist/__tests__/JsonView.test.js +0 -93
  102. package/dist/__tests__/JsonView.test.js.map +0 -1
  103. package/dist/__tests__/LinearDocView.test.d.ts +0 -2
  104. package/dist/__tests__/LinearDocView.test.d.ts.map +0 -1
  105. package/dist/__tests__/LinearDocView.test.js +0 -250
  106. package/dist/__tests__/LinearDocView.test.js.map +0 -1
  107. package/dist/__tests__/MarkdownRenderer.test.d.ts +0 -2
  108. package/dist/__tests__/MarkdownRenderer.test.d.ts.map +0 -1
  109. package/dist/__tests__/MarkdownRenderer.test.js +0 -208
  110. package/dist/__tests__/MarkdownRenderer.test.js.map +0 -1
  111. package/dist/__tests__/TableLayer.test.d.ts +0 -2
  112. package/dist/__tests__/TableLayer.test.d.ts.map +0 -1
  113. package/dist/__tests__/TableLayer.test.js +0 -121
  114. package/dist/__tests__/TableLayer.test.js.map +0 -1
  115. package/dist/__tests__/exports.test.d.ts +0 -2
  116. package/dist/__tests__/exports.test.d.ts.map +0 -1
  117. package/dist/__tests__/exports.test.js +0 -48
  118. package/dist/__tests__/exports.test.js.map +0 -1
  119. package/dist/hooks/AudioProvider.d.ts +0 -71
  120. package/dist/hooks/AudioProvider.d.ts.map +0 -1
  121. package/dist/hooks/AudioProvider.js +0 -52
  122. package/dist/hooks/AudioProvider.js.map +0 -1
  123. package/dist/hooks/MediaContext.d.ts +0 -35
  124. package/dist/hooks/MediaContext.d.ts.map +0 -1
  125. package/dist/hooks/MediaContext.js +0 -72
  126. package/dist/hooks/MediaContext.js.map +0 -1
  127. package/dist/hooks/index.d.ts +0 -6
  128. package/dist/hooks/index.d.ts.map +0 -1
  129. package/dist/hooks/index.js +0 -5
  130. package/dist/hooks/index.js.map +0 -1
  131. package/dist/hooks/useAudioSync.d.ts +0 -18
  132. package/dist/hooks/useAudioSync.d.ts.map +0 -1
  133. package/dist/hooks/useAudioSync.js +0 -340
  134. package/dist/hooks/useAudioSync.js.map +0 -1
  135. package/dist/hooks/useAutoSurface.d.ts +0 -11
  136. package/dist/hooks/useAutoSurface.d.ts.map +0 -1
  137. package/dist/hooks/useAutoSurface.js +0 -24
  138. package/dist/hooks/useAutoSurface.js.map +0 -1
  139. package/dist/hooks/useDocPlayback.d.ts +0 -47
  140. package/dist/hooks/useDocPlayback.d.ts.map +0 -1
  141. package/dist/hooks/useDocPlayback.js +0 -179
  142. package/dist/hooks/useDocPlayback.js.map +0 -1
  143. package/dist/hooks/useViewportOrientation.d.ts +0 -31
  144. package/dist/hooks/useViewportOrientation.d.ts.map +0 -1
  145. package/dist/hooks/useViewportOrientation.js +0 -92
  146. package/dist/hooks/useViewportOrientation.js.map +0 -1
  147. package/dist/index.d.ts.map +0 -1
  148. package/dist/jsonView/JsonView.d.ts +0 -26
  149. package/dist/jsonView/JsonView.d.ts.map +0 -1
  150. package/dist/jsonView/JsonView.js +0 -12
  151. package/dist/jsonView/JsonView.js.map +0 -1
  152. package/dist/jsonView/RenderNode.d.ts +0 -22
  153. package/dist/jsonView/RenderNode.d.ts.map +0 -1
  154. package/dist/jsonView/RenderNode.js +0 -30
  155. package/dist/jsonView/RenderNode.js.map +0 -1
  156. package/dist/jsonView/index.d.ts +0 -3
  157. package/dist/jsonView/index.d.ts.map +0 -1
  158. package/dist/jsonView/index.js +0 -2
  159. package/dist/jsonView/index.js.map +0 -1
  160. package/dist/jsonView/useJsonViewTokens.d.ts +0 -14
  161. package/dist/jsonView/useJsonViewTokens.d.ts.map +0 -1
  162. package/dist/jsonView/useJsonViewTokens.js +0 -34
  163. package/dist/jsonView/useJsonViewTokens.js.map +0 -1
  164. package/dist/jsonView/viewers.d.ts +0 -30
  165. package/dist/jsonView/viewers.d.ts.map +0 -1
  166. package/dist/jsonView/viewers.js +0 -226
  167. package/dist/jsonView/viewers.js.map +0 -1
  168. package/dist/layers/ImageLayer.d.ts +0 -23
  169. package/dist/layers/ImageLayer.d.ts.map +0 -1
  170. package/dist/layers/ImageLayer.js +0 -104
  171. package/dist/layers/ImageLayer.js.map +0 -1
  172. package/dist/layers/MapLayer.d.ts +0 -29
  173. package/dist/layers/MapLayer.d.ts.map +0 -1
  174. package/dist/layers/MapLayer.js +0 -97
  175. package/dist/layers/MapLayer.js.map +0 -1
  176. package/dist/layers/ShapeLayer.d.ts +0 -20
  177. package/dist/layers/ShapeLayer.d.ts.map +0 -1
  178. package/dist/layers/ShapeLayer.js +0 -39
  179. package/dist/layers/ShapeLayer.js.map +0 -1
  180. package/dist/layers/TableLayer.d.ts +0 -23
  181. package/dist/layers/TableLayer.d.ts.map +0 -1
  182. package/dist/layers/TableLayer.js +0 -58
  183. package/dist/layers/TableLayer.js.map +0 -1
  184. package/dist/layers/TextLayer.d.ts +0 -23
  185. package/dist/layers/TextLayer.d.ts.map +0 -1
  186. package/dist/layers/TextLayer.js +0 -126
  187. package/dist/layers/TextLayer.js.map +0 -1
  188. package/dist/layers/VideoLayer.d.ts +0 -40
  189. package/dist/layers/VideoLayer.d.ts.map +0 -1
  190. package/dist/layers/VideoLayer.js +0 -105
  191. package/dist/layers/VideoLayer.js.map +0 -1
  192. package/dist/layers/index.d.ts +0 -6
  193. package/dist/layers/index.d.ts.map +0 -1
  194. package/dist/layers/index.js +0 -6
  195. package/dist/layers/index.js.map +0 -1
  196. package/dist/standalone-entry.d.ts +0 -69
  197. package/dist/standalone-entry.d.ts.map +0 -1
  198. package/dist/standalone-entry.js +0 -185
  199. package/dist/standalone-entry.js.map +0 -1
  200. package/dist/types.d.ts +0 -154
  201. package/dist/types.d.ts.map +0 -1
  202. package/dist/types.js +0 -21
  203. package/dist/types.js.map +0 -1
  204. package/dist/utils/animationUtils.d.ts +0 -8
  205. package/dist/utils/animationUtils.d.ts.map +0 -1
  206. package/dist/utils/animationUtils.js +0 -8
  207. package/dist/utils/animationUtils.js.map +0 -1
  208. package/dist/utils/layerUtils.d.ts +0 -17
  209. package/dist/utils/layerUtils.d.ts.map +0 -1
  210. package/dist/utils/layerUtils.js +0 -37
  211. package/dist/utils/layerUtils.js.map +0 -1
  212. package/dist/utils/mapTileUtils.d.ts +0 -105
  213. package/dist/utils/mapTileUtils.d.ts.map +0 -1
  214. package/dist/utils/mapTileUtils.js +0 -268
  215. package/dist/utils/mapTileUtils.js.map +0 -1
@@ -1,268 +0,0 @@
1
- /**
2
- * Map Tile Utilities
3
- *
4
- * Functions for fetching and composing map tiles from free/open-source providers.
5
- * Converts lat/lng to tile coordinates and composites multiple tiles into a
6
- * single image for SVG embedding.
7
- *
8
- * Supported Providers (all free with attribution):
9
- * - terrain: OpenTopoMap (CC-BY-SA)
10
- * - road: OpenStreetMap (ODbL)
11
- * - satellite: ESRI World Imagery (free with attribution)
12
- * - toner: Stadia/Stamen Toner (free tier)
13
- * - watercolor: Stadia/Stamen Watercolor (free tier)
14
- *
15
- * See docs/MAP_TILES.md for full provider details and terms.
16
- */
17
- /**
18
- * Free tile providers for each map style.
19
- * All require attribution to be displayed.
20
- */
21
- export const TILE_PROVIDERS = {
22
- terrain: {
23
- url: 'https://tile.opentopomap.org/{z}/{x}/{y}.png',
24
- attribution: 'Map: OpenTopoMap (CC-BY-SA)',
25
- maxZoom: 17,
26
- },
27
- road: {
28
- url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
29
- attribution: '© OpenStreetMap contributors',
30
- maxZoom: 19,
31
- },
32
- satellite: {
33
- url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
34
- attribution: 'Imagery: Esri, Maxar, Earthstar',
35
- maxZoom: 18,
36
- },
37
- toner: {
38
- url: 'https://tiles.stadiamaps.com/tiles/stamen_toner/{z}/{x}/{y}.png',
39
- attribution: 'Map: Stadia Maps, Stamen Design',
40
- maxZoom: 20,
41
- },
42
- watercolor: {
43
- url: 'https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg',
44
- attribution: 'Map: Stadia Maps, Stamen Design',
45
- maxZoom: 16,
46
- },
47
- };
48
- /**
49
- * Convert latitude/longitude to tile coordinates at a given zoom level.
50
- * Uses Web Mercator projection (EPSG:3857).
51
- */
52
- export function latLngToTile(lat, lng, zoom) {
53
- const n = Math.pow(2, zoom);
54
- const x = Math.floor(((lng + 180) / 360) * n);
55
- const latRad = (lat * Math.PI) / 180;
56
- const y = Math.floor(((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * n);
57
- return { x, y };
58
- }
59
- /**
60
- * Convert tile coordinates back to lat/lng (top-left corner of tile).
61
- */
62
- export function tileToLatLng(x, y, zoom) {
63
- const n = Math.pow(2, zoom);
64
- const lng = (x / n) * 360 - 180;
65
- const latRad = Math.atan(Math.sinh(Math.PI * (1 - (2 * y) / n)));
66
- const lat = (latRad * 180) / Math.PI;
67
- return { lat, lng };
68
- }
69
- /**
70
- * Get the pixel offset within a tile for a given lat/lng.
71
- */
72
- export function getPixelOffset(lat, lng, zoom, tileSize = 256) {
73
- const n = Math.pow(2, zoom);
74
- const xTile = ((lng + 180) / 360) * n;
75
- const latRad = (lat * Math.PI) / 180;
76
- const yTile = ((1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2) * n;
77
- return {
78
- x: (xTile - Math.floor(xTile)) * tileSize,
79
- y: (yTile - Math.floor(yTile)) * tileSize,
80
- };
81
- }
82
- /**
83
- * Calculate which tiles are needed to cover a viewport centered on lat/lng.
84
- */
85
- export function getTilesForViewport(centerLat, centerLng, zoom, viewportWidth, viewportHeight, tileSize = 256) {
86
- const centerTile = latLngToTile(centerLat, centerLng, zoom);
87
- const pixelOffset = getPixelOffset(centerLat, centerLng, zoom, tileSize);
88
- // How many tiles we need in each direction
89
- const tilesX = Math.ceil(viewportWidth / tileSize) + 1;
90
- const tilesY = Math.ceil(viewportHeight / tileSize) + 1;
91
- // Start tile offset
92
- const startX = centerTile.x - Math.floor(tilesX / 2);
93
- const startY = centerTile.y - Math.floor(tilesY / 2);
94
- // Screen position of the center tile
95
- const centerScreenX = viewportWidth / 2 - pixelOffset.x;
96
- const centerScreenY = viewportHeight / 2 - pixelOffset.y;
97
- const tiles = [];
98
- for (let dy = 0; dy < tilesY; dy++) {
99
- for (let dx = 0; dx < tilesX; dx++) {
100
- const tileX = startX + dx;
101
- const tileY = startY + dy;
102
- const screenX = centerScreenX + (tileX - centerTile.x) * tileSize;
103
- const screenY = centerScreenY + (tileY - centerTile.y) * tileSize;
104
- tiles.push({ x: tileX, y: tileY, screenX, screenY });
105
- }
106
- }
107
- return tiles;
108
- }
109
- /**
110
- * Build a tile URL from the provider template.
111
- */
112
- export function buildTileUrl(provider, x, y, z) {
113
- return provider.url.replace('{z}', String(z)).replace('{x}', String(x)).replace('{y}', String(y));
114
- }
115
- /**
116
- * Fetch a single tile image as an HTMLImageElement.
117
- */
118
- async function fetchTileImage(url) {
119
- return new Promise((resolve, reject) => {
120
- const img = new Image();
121
- img.crossOrigin = 'anonymous';
122
- img.onload = () => resolve(img);
123
- img.onerror = () => reject(new Error(`Failed to load tile: ${url}`));
124
- img.src = url;
125
- });
126
- }
127
- /**
128
- * Compose map tiles into a single data URL image.
129
- *
130
- * This is the main function for generating map images for blocks.
131
- * It fetches all needed tiles, composites them on a canvas, and
132
- * returns a data URL that can be used in an SVG <image> element.
133
- */
134
- export async function composeMapImage(options) {
135
- const { center, zoom, style, width, height, markers = [], showAttribution = true } = options;
136
- const provider = TILE_PROVIDERS[style];
137
- const tileSize = provider.tileSize || 256;
138
- const clampedZoom = Math.min(zoom, provider.maxZoom);
139
- // Create canvas
140
- const canvas = document.createElement('canvas');
141
- canvas.width = width;
142
- canvas.height = height;
143
- const ctx = canvas.getContext('2d');
144
- if (!ctx)
145
- throw new Error('Failed to get canvas context');
146
- // Fill with a neutral background in case tiles fail to load
147
- ctx.fillStyle = style === 'toner' ? '#ffffff' : '#e5e7eb';
148
- ctx.fillRect(0, 0, width, height);
149
- // Get tiles needed
150
- const tiles = getTilesForViewport(center.lat, center.lng, clampedZoom, width, height, tileSize);
151
- // Fetch and draw tiles
152
- const tilePromises = tiles.map(async (tile) => {
153
- const url = buildTileUrl(provider, tile.x, tile.y, clampedZoom);
154
- try {
155
- const img = await fetchTileImage(url);
156
- ctx.drawImage(img, tile.screenX, tile.screenY, tileSize, tileSize);
157
- }
158
- catch (err) {
159
- // Tile failed to load - leave background color
160
- console.warn(`Tile load failed: ${url}`, err);
161
- }
162
- });
163
- await Promise.all(tilePromises);
164
- // Draw markers
165
- for (const marker of markers) {
166
- drawMarker(ctx, marker, center, clampedZoom, width, height, tileSize);
167
- }
168
- // Draw attribution
169
- if (showAttribution) {
170
- drawAttribution(ctx, provider.attribution, width, height);
171
- }
172
- return canvas.toDataURL('image/png');
173
- }
174
- /**
175
- * Draw a marker on the canvas.
176
- */
177
- function drawMarker(ctx, marker, center, zoom, width, height, tileSize) {
178
- // Calculate screen position of marker relative to center
179
- const centerTile = latLngToTile(center.lat, center.lng, zoom);
180
- const markerTile = latLngToTile(marker.lat, marker.lng, zoom);
181
- const centerOffset = getPixelOffset(center.lat, center.lng, zoom, tileSize);
182
- const markerOffset = getPixelOffset(marker.lat, marker.lng, zoom, tileSize);
183
- const dx = (markerTile.x - centerTile.x) * tileSize + (markerOffset.x - centerOffset.x);
184
- const dy = (markerTile.y - centerTile.y) * tileSize + (markerOffset.y - centerOffset.y);
185
- const screenX = width / 2 + dx;
186
- const screenY = height / 2 + dy;
187
- // Draw marker
188
- const color = marker.color || '#ef4444';
189
- const icon = marker.icon || 'pin';
190
- ctx.save();
191
- if (icon === 'pin') {
192
- // Draw pin shape
193
- ctx.fillStyle = color;
194
- ctx.beginPath();
195
- ctx.arc(screenX, screenY - 12, 8, Math.PI, 0, false);
196
- ctx.lineTo(screenX, screenY);
197
- ctx.closePath();
198
- ctx.fill();
199
- // White dot in center
200
- ctx.fillStyle = '#ffffff';
201
- ctx.beginPath();
202
- ctx.arc(screenX, screenY - 12, 3, 0, Math.PI * 2);
203
- ctx.fill();
204
- }
205
- else if (icon === 'circle') {
206
- ctx.fillStyle = color;
207
- ctx.beginPath();
208
- ctx.arc(screenX, screenY, 8, 0, Math.PI * 2);
209
- ctx.fill();
210
- ctx.strokeStyle = '#ffffff';
211
- ctx.lineWidth = 2;
212
- ctx.stroke();
213
- }
214
- else if (icon === 'star') {
215
- ctx.fillStyle = color;
216
- drawStar(ctx, screenX, screenY, 5, 10, 5);
217
- ctx.fill();
218
- }
219
- // Draw label if present
220
- if (marker.label) {
221
- ctx.fillStyle = '#1f2937';
222
- ctx.font = 'bold 12px system-ui, sans-serif';
223
- ctx.textAlign = 'center';
224
- ctx.fillText(marker.label, screenX, screenY + 20);
225
- }
226
- ctx.restore();
227
- }
228
- /**
229
- * Draw a star shape.
230
- */
231
- function drawStar(ctx, cx, cy, spikes, outerRadius, innerRadius) {
232
- let rot = (Math.PI / 2) * 3;
233
- const step = Math.PI / spikes;
234
- ctx.beginPath();
235
- ctx.moveTo(cx, cy - outerRadius);
236
- for (let i = 0; i < spikes; i++) {
237
- ctx.lineTo(cx + Math.cos(rot) * outerRadius, cy + Math.sin(rot) * outerRadius);
238
- rot += step;
239
- ctx.lineTo(cx + Math.cos(rot) * innerRadius, cy + Math.sin(rot) * innerRadius);
240
- rot += step;
241
- }
242
- ctx.lineTo(cx, cy - outerRadius);
243
- ctx.closePath();
244
- }
245
- /**
246
- * Draw attribution text on the canvas.
247
- */
248
- function drawAttribution(ctx, text, width, height) {
249
- ctx.save();
250
- // Semi-transparent background
251
- ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';
252
- const padding = 4;
253
- ctx.font = '10px system-ui, sans-serif';
254
- const textWidth = ctx.measureText(text).width;
255
- ctx.fillRect(width - textWidth - padding * 2 - 4, height - 16, textWidth + padding * 2, 14);
256
- // Text
257
- ctx.fillStyle = '#374151';
258
- ctx.textAlign = 'right';
259
- ctx.fillText(text, width - padding - 4, height - 5);
260
- ctx.restore();
261
- }
262
- /**
263
- * Get attribution text for a map style.
264
- */
265
- export function getAttribution(style) {
266
- return TILE_PROVIDERS[style].attribution;
267
- }
268
- //# sourceMappingURL=mapTileUtils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mapTileUtils.js","sourceRoot":"","sources":["../../src/utils/mapTileUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkBH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAuC;IAChE,OAAO,EAAE;QACP,GAAG,EAAE,8CAA8C;QACnD,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,EAAE;KACZ;IACD,IAAI,EAAE;QACJ,GAAG,EAAE,gDAAgD;QACrD,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,EAAE;KACZ;IACD,SAAS,EAAE;QACT,GAAG,EAAE,+FAA+F;QACpG,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,EAAE;KACZ;IACD,KAAK,EAAE;QACL,GAAG,EAAE,iEAAiE;QACtE,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,EAAE;KACZ;IACD,UAAU,EAAE;QACV,GAAG,EAAE,sEAAsE;QAC3E,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,EAAE;KACZ;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,GAAW,EAAE,IAAY;IACjE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClG,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS,EAAE,IAAY;IAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACrC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,GAAW,EACX,IAAY,EACZ,WAAmB,GAAG;IAEtB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAE1F,OAAO;QACL,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ;QACzC,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ;KAC1C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,SAAiB,EACjB,IAAY,EACZ,aAAqB,EACrB,cAAsB,EACtB,WAAmB,GAAG;IAEtB,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEzE,2CAA2C;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAExD,oBAAoB;IACpB,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErD,qCAAqC;IACrC,MAAM,aAAa,GAAG,aAAa,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,cAAc,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAsE,EAAE,CAAC;IAEpF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;YAClE,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;YAElE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAsB,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IAClF,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;QAC9B,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC,CAAC;QACrE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAsBD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA0B;IAC9D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7F,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAErD,gBAAgB;IAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE1D,4DAA4D;IAC5D,GAAG,CAAC,SAAS,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAElC,mBAAmB;IACnB,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEhG,uBAAuB;IACvB,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;YACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,+CAA+C;YAC/C,OAAO,CAAC,IAAI,CAAC,qBAAqB,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEhC,eAAe;IACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,mBAAmB;IACnB,IAAI,eAAe,EAAE,CAAC;QACpB,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CACjB,GAA6B,EAC7B,MAAiB,EACjB,MAAoC,EACpC,IAAY,EACZ,KAAa,EACb,MAAc,EACd,QAAgB;IAEhB,yDAAyD;IACzD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAE9D,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5E,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;IAEhC,cAAc;IACd,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;IAElC,GAAG,CAAC,IAAI,EAAE,CAAC;IAEX,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,iBAAiB;QACjB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,EAAE,CAAC;QAEX,sBAAsB;QACtB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAClD,GAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;QAC5B,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,wBAAwB;IACxB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1B,GAAG,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC7C,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC;QACzB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,GAAG,CAAC,OAAO,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CACf,GAA6B,EAC7B,EAAU,EACV,EAAU,EACV,MAAc,EACd,WAAmB,EACnB,WAAmB;IAEnB,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;IAE9B,GAAG,CAAC,SAAS,EAAE,CAAC;IAChB,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;QAC/E,GAAG,IAAI,IAAI,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;QAC/E,GAAG,IAAI,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC;IACjC,GAAG,CAAC,SAAS,EAAE,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,GAA6B,EAC7B,IAAY,EACZ,KAAa,EACb,MAAc;IAEd,GAAG,CAAC,IAAI,EAAE,CAAC;IAEX,8BAA8B;IAC9B,GAAG,CAAC,SAAS,GAAG,0BAA0B,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,CAAC;IAClB,GAAG,CAAC,IAAI,GAAG,4BAA4B,CAAC;IACxC,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IAC9C,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5F,OAAO;IACP,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IAEpD,GAAG,CAAC,OAAO,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;AAC3C,CAAC"}