@tileflow/core 0.1.0-alpha.30 → 0.1.0-alpha.32

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.
package/dist/browser.d.ts CHANGED
@@ -1,3 +1,46 @@
1
+ /** Inputs to one fixed-size, application-owned RGBA image. */
2
+ type TileflowDynamicImageContext = Readonly<{
3
+ theme: string;
4
+ blend?: Readonly<{
5
+ position: number;
6
+ themes: readonly string[];
7
+ }>;
8
+ states: Readonly<Record<string, boolean | number | string | null | undefined>>;
9
+ /** Physical pixel dimensions, fixed for this registration. */
10
+ width: number;
11
+ height: number;
12
+ pixelRatio: number;
13
+ }>;
14
+ type TileflowDynamicImage = Readonly<{
15
+ /** Physical pixel dimensions, each from 1 through 2048. */
16
+ width: number;
17
+ height: number;
18
+ /** Physical pixels per logical pixel. Defaults to 1; fixed until disposal. */
19
+ pixelRatio?: number;
20
+ /** Controller states that invalidate this image, including interpolated values. */
21
+ states?: readonly string[];
22
+ /** Synchronous RGBA pixels; undefined keeps the previous pixels (initially transparent). */
23
+ render(context: TileflowDynamicImageContext): Uint8Array | Uint8ClampedArray | undefined;
24
+ /** Later render/restore failures retain good pixels. Defaults to console.error. */
25
+ onError?(error: Error): void;
26
+ }>;
27
+ type TileflowDynamicImageHandle = {
28
+ /** Refresh external inputs at the next frame. Repeated requests coalesce. */
29
+ refresh(): void;
30
+ /** Cancel queued work, release the name and remove only this resource's image. */
31
+ dispose(): void;
32
+ };
33
+ type TileflowDynamicImageMap = {
34
+ addImage?: unknown;
35
+ getCanvas?: unknown;
36
+ getImage?: unknown;
37
+ getStyle?: unknown;
38
+ removeImage?: unknown;
39
+ updateImage?: unknown;
40
+ on(event: string, listener: () => void): unknown;
41
+ off(event: string, listener: () => void): unknown;
42
+ };
43
+
1
44
  type TileflowFairUseNoticeState = 'GRACE' | 'MANAGED_REQUIRED';
2
45
  type TileflowFairUseNotice = Readonly<{
3
46
  action: string;
@@ -32,7 +75,440 @@ declare function registerTileflowWorldRequestBridge(input: {
32
75
  declare function tileflowFairUseNoticeMessage(state: TileflowFairUseNoticeState): string;
33
76
  declare function attachTileflowFairUseNotice(container: HTMLElement): TileflowFairUseNoticeController;
34
77
 
78
+ declare const expressionBrand: unique symbol;
79
+ declare const themeValueBrand: unique symbol;
80
+ declare const zoomBrand: unique symbol;
81
+ declare const tileflowThemeTokenCategories: readonly ["color", "font", "image", "number"];
82
+ type TileflowThemeTokenCategory = (typeof tileflowThemeTokenCategories)[number];
83
+ type TileflowThemeTokenPrimitive = {
84
+ color: string;
85
+ font: string;
86
+ image: string;
87
+ number: number;
88
+ };
89
+ /** A JSON-safe semantic reference. The category is carried at runtime as well as in its type. */
90
+ type TileflowThemeTokenReference<TCategory extends TileflowThemeTokenCategory = TileflowThemeTokenCategory> = {
91
+ readonly category: TCategory;
92
+ readonly kind: 'theme-token';
93
+ readonly token: string;
94
+ readonly [themeValueBrand]: TileflowThemeTokenPrimitive[TCategory];
95
+ };
96
+ /** An explicit opt-out from theme substitution. A reason is mandatory for auditability. */
97
+ type TileflowFixedValue<T> = {
98
+ readonly kind: 'theme-fixed';
99
+ readonly reason: string;
100
+ readonly value: T;
101
+ readonly [themeValueBrand]: T;
102
+ };
103
+ type TileflowThemeColorMix = {
104
+ readonly amount: TileflowThemeNumberValue;
105
+ readonly from: TileflowThemeColorValue;
106
+ readonly kind: 'theme-color';
107
+ readonly operation: 'mix';
108
+ readonly space: 'oklch';
109
+ readonly to: TileflowThemeColorValue;
110
+ readonly [themeValueBrand]: string;
111
+ };
112
+ type TileflowThemeColorAlpha = {
113
+ readonly color: TileflowThemeColorValue;
114
+ readonly kind: 'theme-color';
115
+ readonly opacity: TileflowThemeNumberValue;
116
+ readonly operation: 'alpha';
117
+ readonly [themeValueBrand]: string;
118
+ };
119
+ type TileflowThemeColorOperation = TileflowThemeColorAlpha | TileflowThemeColorMix;
120
+ type TileflowThemeNumberValue = number | TileflowFixedValue<number> | TileflowThemeTokenReference<'number'>;
121
+ type TileflowThemeColorValue = string | TileflowFixedValue<string> | TileflowThemeColorOperation | TileflowThemeTokenReference<'color'>;
122
+ type TileflowThemeFontValue = string | TileflowFixedValue<string> | TileflowThemeTokenReference<'font'>;
123
+ type TileflowThemeImageValue = string | TileflowFixedValue<string> | TileflowThemeTokenReference<'image'>;
124
+ type TileflowExpression<T> = {
125
+ readonly kind: 'expression';
126
+ readonly value: readonly unknown[];
127
+ /** Opaque result type. Only Tileflow's closed `expr.*` builders expose this brand publicly. */
128
+ readonly [expressionBrand]: T;
129
+ };
130
+ type TileflowZoomValueCommon<T> = {
131
+ readonly kind: 'zoom';
132
+ readonly stops: readonly (readonly [number, T])[];
133
+ readonly [zoomBrand]?: T;
134
+ };
135
+ type TileflowZoomValue<T> = TileflowZoomValueCommon<T> & ({
136
+ readonly base: number;
137
+ readonly interpolation: 'exponential';
138
+ } | {
139
+ readonly base?: never;
140
+ readonly interpolation: 'linear' | 'step';
141
+ });
142
+
143
+ /** A color literal, semantic color token, color operation, expression, or zoom ramp. */
144
+ type TileflowColorStyleValue = TileflowExpression<string> | TileflowThemeColorValue | TileflowZoomValue<TileflowThemeColorValue>;
145
+ /** An image name, semantic image token, expression, or zoom ramp. */
146
+ type TileflowImageStyleValue = TileflowExpression<string> | TileflowThemeImageValue | TileflowZoomValue<TileflowThemeImageValue>;
147
+ /** A number, semantic number token, expression, or zoom ramp. */
148
+ type TileflowNumberStyleValue = TileflowExpression<number> | TileflowThemeNumberValue | TileflowZoomValue<TileflowThemeNumberValue>;
149
+ /** A visual numeric array whose components may be themed, or whose full shape is fixed. */
150
+ type TileflowThemeNumberArrayValue = readonly TileflowThemeNumberValue[] | TileflowFixedValue<readonly number[]>;
151
+ /** A visual numeric array, expression, or zoom ramp with explicit theme intent. */
152
+ type TileflowNumberArrayStyleValue = TileflowExpression<readonly number[]> | TileflowThemeNumberArrayValue | TileflowZoomValue<TileflowThemeNumberArrayValue>;
153
+ /** A two-dimensional visual offset with category-safe numeric components. */
154
+ type TileflowNumberOffsetStyleValue = readonly [TileflowThemeNumberValue, TileflowThemeNumberValue] | TileflowFixedValue<readonly number[]> | TileflowExpression<readonly number[]> | TileflowZoomValue<readonly [TileflowThemeNumberValue, TileflowThemeNumberValue] | TileflowFixedValue<readonly number[]>>;
155
+ /** Top, right, bottom, and left visual insets with category-safe numeric components. */
156
+ type TileflowNumberInsetsStyleValue = readonly [
157
+ TileflowThemeNumberValue,
158
+ TileflowThemeNumberValue,
159
+ TileflowThemeNumberValue,
160
+ TileflowThemeNumberValue
161
+ ] | TileflowFixedValue<readonly [number, number, number, number]> | TileflowExpression<readonly number[]> | TileflowZoomValue<readonly [
162
+ TileflowThemeNumberValue,
163
+ TileflowThemeNumberValue,
164
+ TileflowThemeNumberValue,
165
+ TileflowThemeNumberValue
166
+ ] | TileflowFixedValue<readonly [number, number, number, number]>>;
167
+ /** A structural value that does not participate in semantic theme-token substitution. */
168
+ type TileflowStructuralStyleValue<T> = T | TileflowExpression<T> | TileflowZoomValue<T>;
169
+ /** Structural text, including expressions and zoom-dependent literal strings. */
170
+ type TileflowStringStyleValue = TileflowStructuralStyleValue<string>;
171
+ type TileflowLineCap = 'butt' | 'round' | 'square';
172
+ type TileflowLineJoin = 'bevel' | 'miter' | 'round';
173
+ type TileflowSymbolPlacement = 'line' | 'line-center' | 'point';
174
+ type TileflowSymbolZOrder = 'auto' | 'source' | 'viewport-y';
175
+ type TileflowPriorityOrder = 'higher-first' | 'lower-first';
176
+ type TileflowTextAnchor = 'bottom' | 'bottom-left' | 'bottom-right' | 'center' | 'left' | 'right' | 'top' | 'top-left' | 'top-right';
177
+ type TileflowTextJustify = 'auto' | 'center' | 'left' | 'right';
178
+ type TileflowIconAnchor = TileflowTextAnchor;
179
+ type TileflowAlignment = 'auto' | 'map' | 'viewport';
180
+ type TileflowIconTextFit = 'both' | 'height' | 'none' | 'width';
181
+ /**
182
+ * How a symbol part treats collisions with symbols placed before it. `never` hides it, `always`
183
+ * shows it, and `cooperative` shows it unless the earlier symbol was placed with `never`.
184
+ */
185
+ type TileflowSymbolOverlap = 'always' | 'cooperative' | 'never';
186
+ /** Visibility and zoom bounds shared by every visual primitive. */
187
+ type TileflowLayerRange = {
188
+ maxZoom?: number;
189
+ minZoom?: number;
190
+ visible?: boolean;
191
+ };
192
+ type TileflowBackgroundPaint = {
193
+ color?: TileflowColorStyleValue;
194
+ opacity?: TileflowNumberStyleValue;
195
+ pattern?: TileflowImageStyleValue;
196
+ };
197
+ type TileflowBackgroundStyle = TileflowLayerRange & TileflowBackgroundPaint;
198
+ type TileflowFillPaint = {
199
+ antialias?: boolean;
200
+ color?: TileflowColorStyleValue;
201
+ opacity?: TileflowNumberStyleValue;
202
+ pattern?: TileflowImageStyleValue;
203
+ translate?: TileflowNumberOffsetStyleValue;
204
+ translateAnchor?: 'map' | 'viewport';
205
+ };
206
+ type TileflowFillStyle = TileflowLayerRange & TileflowFillPaint;
207
+ type TileflowLinePaint = {
208
+ blur?: TileflowNumberStyleValue;
209
+ color?: TileflowColorStyleValue;
210
+ dash?: TileflowNumberArrayStyleValue;
211
+ gapWidth?: TileflowNumberStyleValue;
212
+ offset?: TileflowNumberStyleValue;
213
+ opacity?: TileflowNumberStyleValue;
214
+ pattern?: TileflowImageStyleValue;
215
+ translate?: TileflowNumberOffsetStyleValue;
216
+ translateAnchor?: 'map' | 'viewport';
217
+ width?: TileflowNumberStyleValue;
218
+ };
219
+ type TileflowLineLayout = {
220
+ cap?: TileflowStructuralStyleValue<TileflowLineCap>;
221
+ join?: TileflowStructuralStyleValue<TileflowLineJoin>;
222
+ miterLimit?: TileflowNumberStyleValue;
223
+ roundLimit?: TileflowNumberStyleValue;
224
+ };
225
+ type TileflowLineStyle = TileflowLayerRange & TileflowLinePaint & TileflowLineLayout;
226
+ /** Repeated diagonal marks placed along a stroked geographic feature. */
227
+ type TileflowLineHatchStyle = TileflowLayerRange & {
228
+ angle?: TileflowNumberStyleValue;
229
+ color?: TileflowColorStyleValue;
230
+ opacity?: TileflowNumberStyleValue;
231
+ /** Sprite pattern clipped to the line deck; when set, it replaces glyph hatching. */
232
+ pattern?: TileflowImageStyleValue;
233
+ /**
234
+ * Intrinsic pixel heights available as `${pattern}-${width}` sprites. Tileflow
235
+ * selects the closest height to the rendered line width so marks retain a
236
+ * nearly fixed screen-pixel thickness instead of stretching with the road.
237
+ * Requires `pattern` to be a literal sprite-name prefix.
238
+ */
239
+ patternWidths?: TileflowThemeNumberArrayValue;
240
+ size?: TileflowNumberStyleValue;
241
+ spacing?: TileflowNumberStyleValue;
242
+ };
243
+ type TileflowTextPaint = {
244
+ color?: TileflowColorStyleValue;
245
+ haloBlur?: TileflowNumberStyleValue;
246
+ haloColor?: TileflowColorStyleValue;
247
+ haloWidth?: TileflowNumberStyleValue;
248
+ opacity?: TileflowNumberStyleValue;
249
+ };
250
+ /**
251
+ * One opaque strip behind each shaped line of a label. Tileflow lowers it to a derived glyph stack
252
+ * whose cells MapLibre's text halo paints, so placement, wrapping and collision stay native.
253
+ */
254
+ type TileflowTextBackground = {
255
+ /** Strip colour. Cells overlap at their joins, so the colour must be opaque. */
256
+ color: TileflowColorStyleValue;
257
+ /** `lines` fits one strip to each shaped line. */
258
+ fit: 'lines';
259
+ /** Strip extension beyond the first and last glyph of each line, in ems. Defaults to 0.33. */
260
+ padding?: TileflowThemeNumberValue;
261
+ };
262
+ type TileflowTextLayout = {
263
+ allowOverlap?: boolean;
264
+ anchor?: TileflowTextAnchor;
265
+ /**
266
+ * Replaces the text halo with line-fitted strips. Requires a map `glyphs` provider that serves
267
+ * derived stacks, one font without fallbacks, and constant `letterSpacing` and `lineHeight`.
268
+ */
269
+ background?: TileflowTextBackground;
270
+ field?: TileflowStringStyleValue;
271
+ font?: TileflowThemeFontValue;
272
+ fallbacks?: readonly TileflowThemeFontValue[];
273
+ ignorePlacement?: boolean;
274
+ justify?: TileflowTextJustify;
275
+ keepUpright?: boolean;
276
+ letterSpacing?: TileflowNumberStyleValue;
277
+ lineHeight?: TileflowNumberStyleValue;
278
+ maxAngle?: TileflowNumberStyleValue;
279
+ maxWidth?: TileflowNumberStyleValue;
280
+ offset?: TileflowNumberOffsetStyleValue;
281
+ optional?: boolean;
282
+ /**
283
+ * Overlap mode. Takes precedence over `allowOverlap`, so the compiled layer carries only the mode.
284
+ * Native artifacts, whose renderer has no overlap modes, use `allowOverlap: false` for `never`
285
+ * and `true` otherwise.
286
+ */
287
+ overlap?: TileflowSymbolOverlap;
288
+ padding?: TileflowNumberStyleValue;
289
+ pitchAlignment?: TileflowAlignment;
290
+ radialOffset?: TileflowNumberStyleValue;
291
+ rotate?: TileflowNumberStyleValue;
292
+ rotationAlignment?: TileflowAlignment;
293
+ size?: TileflowNumberStyleValue;
294
+ transform?: 'lowercase' | 'none' | 'uppercase';
295
+ variableAnchors?: readonly TileflowTextAnchor[];
296
+ };
297
+ type TileflowTextStyle = TileflowLayerRange & TileflowTextPaint & TileflowTextLayout;
298
+ type TileflowIconPaint = {
299
+ color?: TileflowColorStyleValue;
300
+ haloBlur?: TileflowNumberStyleValue;
301
+ haloColor?: TileflowColorStyleValue;
302
+ haloWidth?: TileflowNumberStyleValue;
303
+ opacity?: TileflowNumberStyleValue;
304
+ };
305
+ type TileflowIconLayout = {
306
+ allowOverlap?: boolean;
307
+ anchor?: TileflowIconAnchor;
308
+ image?: TileflowImageStyleValue;
309
+ ignorePlacement?: boolean;
310
+ keepUpright?: boolean;
311
+ offset?: TileflowNumberOffsetStyleValue;
312
+ optional?: boolean;
313
+ /**
314
+ * Overlap mode. Takes precedence over `allowOverlap`, so the compiled layer carries only the mode.
315
+ * Native artifacts, whose renderer has no overlap modes, use `allowOverlap: false` for `never`
316
+ * and `true` otherwise.
317
+ */
318
+ overlap?: TileflowSymbolOverlap;
319
+ padding?: TileflowNumberStyleValue;
320
+ pitchAlignment?: TileflowAlignment;
321
+ rotate?: TileflowNumberStyleValue;
322
+ rotationAlignment?: TileflowAlignment;
323
+ size?: TileflowNumberStyleValue;
324
+ textFit?: TileflowIconTextFit;
325
+ textFitPadding?: TileflowNumberInsetsStyleValue;
326
+ };
327
+ type TileflowIconStyle = TileflowLayerRange & TileflowIconPaint & TileflowIconLayout;
328
+ type TileflowSymbolPlacementStyle = TileflowLayerRange & {
329
+ placement?: TileflowSymbolPlacement;
330
+ priority?: TileflowStructuralStyleValue<number>;
331
+ /** Collision order for the semantic priority value. Defaults to `higher-first`. */
332
+ priorityOrder?: TileflowPriorityOrder;
333
+ spacing?: TileflowNumberStyleValue;
334
+ zOrder?: TileflowSymbolZOrder;
335
+ };
336
+ type TileflowCirclePaint = {
337
+ blur?: TileflowNumberStyleValue;
338
+ color?: TileflowColorStyleValue;
339
+ opacity?: TileflowNumberStyleValue;
340
+ pitchAlignment?: 'map' | 'viewport';
341
+ pitchScale?: 'map' | 'viewport';
342
+ priority?: TileflowStructuralStyleValue<number>;
343
+ /** Drawing order for the semantic priority value. Defaults to `higher-first`. */
344
+ priorityOrder?: TileflowPriorityOrder;
345
+ radius?: TileflowNumberStyleValue;
346
+ strokeColor?: TileflowColorStyleValue;
347
+ strokeOpacity?: TileflowNumberStyleValue;
348
+ strokeWidth?: TileflowNumberStyleValue;
349
+ translate?: TileflowNumberOffsetStyleValue;
350
+ translateAnchor?: 'map' | 'viewport';
351
+ };
352
+ type TileflowCircleStyle = TileflowLayerRange & TileflowCirclePaint;
353
+ type TileflowExtrusionPaint = {
354
+ base?: TileflowNumberStyleValue;
355
+ color?: TileflowColorStyleValue;
356
+ height?: TileflowNumberStyleValue;
357
+ opacity?: TileflowNumberStyleValue;
358
+ pattern?: TileflowImageStyleValue;
359
+ verticalGradient?: boolean;
360
+ };
361
+ type TileflowExtrusionStyle = TileflowLayerRange & TileflowExtrusionPaint;
362
+ /** A polygon rendered as a fill and, when requested, a separate line layer. */
363
+ type TileflowAreaStyle = {
364
+ fill?: TileflowFillStyle;
365
+ outline?: TileflowLineStyle;
366
+ };
367
+ /** The canonical ordered phases used for roads, aeroways, and other stroked paths. */
368
+ type TileflowLineStackStyle = {
369
+ casing?: TileflowLineStyle;
370
+ fill?: TileflowLineStyle;
371
+ shadow?: TileflowLineStyle;
372
+ };
373
+ /** A symbol layer composed from one placement policy and optional text/icon parts. */
374
+ type TileflowSymbolStyle = TileflowSymbolPlacementStyle & {
375
+ icon?: TileflowIconStyle;
376
+ text?: TileflowTextStyle;
377
+ };
378
+ /** A symbol style that may also materialize a separate circle marker layer. */
379
+ type TileflowMarkerSymbolStyle = TileflowSymbolStyle & {
380
+ marker?: TileflowCircleStyle;
381
+ };
382
+
35
383
  type TileflowColor = `#${string}`;
384
+ type TileflowRoadDetail = 'none' | 'highways' | 'major' | 'streets' | 'all';
385
+ type TileflowRoadClass = 'motorway' | 'trunk' | 'primary' | 'secondary' | 'tertiary' | 'minor' | 'service' | 'track' | 'pathway' | 'footway' | 'cycleway' | 'steps' | 'pedestrian';
386
+ type TileflowRoadHierarchy = 'subtle' | 'clear' | 'strong';
387
+ type TileflowRoadWeight = 'thin' | 'regular' | 'bold';
388
+ type TileflowRoadOutline = 'none' | 'subtle' | 'strong';
389
+ type TileflowRoadStructure = 'bridge' | 'surface' | 'tunnel';
390
+ type TileflowRoadExtras = {
391
+ paths?: boolean;
392
+ };
393
+ type TileflowRoadLayerStyle = TileflowLineStackStyle & {
394
+ hatch?: TileflowLineHatchStyle;
395
+ };
396
+ type TileflowRoadTreatmentLineStyle = Pick<TileflowLinePaint, 'blur' | 'color' | 'dash' | 'gapWidth' | 'offset' | 'opacity' | 'width'>;
397
+ type TileflowRoadTreatmentLayerStyle = {
398
+ casing?: TileflowRoadTreatmentLineStyle;
399
+ fill?: TileflowRoadTreatmentLineStyle;
400
+ shadow?: TileflowRoadTreatmentLineStyle;
401
+ };
402
+ type TileflowRoadTreatmentStyle = Partial<Record<TileflowRoadStructure, TileflowRoadTreatmentLayerStyle>> & {
403
+ enabled?: boolean;
404
+ widthScale?: TileflowThemeNumberValue;
405
+ };
406
+ type TileflowRoadModifier = 'construction' | 'expressway' | 'indoor' | 'official' | 'ramp' | 'unpaved';
407
+ type TileflowRoadRestriction = 'access' | 'bicycle' | 'foot' | 'horse' | 'toll';
408
+ type TileflowMountainBikeScale = '0' | '0+' | '1' | '1+' | '2' | '2+' | '3' | '3+' | '4' | '5' | '6';
409
+ type TileflowRoadServiceType = 'alley' | 'crossover' | 'driveway' | 'parkingAisle' | 'yard';
410
+ type TileflowRoadClassStyle = Partial<Record<TileflowRoadStructure, TileflowRoadLayerStyle>> & {
411
+ enabled?: boolean;
412
+ };
413
+ type TileflowRoadAreaStyle = {
414
+ pedestrian?: TileflowAreaStyle;
415
+ pier?: TileflowAreaStyle;
416
+ road?: TileflowAreaStyle;
417
+ };
418
+ type TileflowRoadCrossingStyle = Omit<TileflowIconStyle, 'image'> & Required<Pick<TileflowIconStyle, 'image'>>;
419
+ type TileflowRoadRoundaboutStyle = {
420
+ casing?: TileflowCircleStyle;
421
+ fill?: TileflowCircleStyle;
422
+ };
423
+ type TileflowRoadSidewalkStyle = {
424
+ outline?: TileflowLineStyle;
425
+ pattern?: TileflowFillStyle;
426
+ surface?: TileflowFillStyle;
427
+ };
428
+ type TileflowRoadsModuleConfig = {
429
+ type: 'roads';
430
+ areas?: TileflowRoadAreaStyle;
431
+ classes?: Partial<Record<TileflowRoadClass, TileflowRoadClassStyle>>;
432
+ crossings?: TileflowRoadCrossingStyle;
433
+ detail?: TileflowRoadDetail;
434
+ extras?: TileflowRoadExtras;
435
+ hierarchy?: TileflowRoadHierarchy;
436
+ modifiers?: Partial<Record<TileflowRoadModifier, TileflowRoadTreatmentStyle>>;
437
+ mountainBike?: Partial<Record<TileflowMountainBikeScale, TileflowRoadTreatmentStyle>>;
438
+ oneWayMarkers?: boolean;
439
+ outline?: TileflowRoadOutline;
440
+ restrictions?: Partial<Record<TileflowRoadRestriction, TileflowRoadTreatmentStyle>>;
441
+ roundabouts?: TileflowRoadRoundaboutStyle;
442
+ serviceTypes?: Partial<Record<TileflowRoadServiceType, TileflowRoadTreatmentStyle>>;
443
+ sidewalks?: TileflowRoadSidewalkStyle;
444
+ structures?: Partial<Record<TileflowRoadStructure, TileflowRoadLayerStyle>>;
445
+ weight?: TileflowRoadWeight;
446
+ widthScale?: Partial<Record<TileflowRoadClass, TileflowThemeNumberValue>>;
447
+ };
448
+ type TileflowLabelDetail = 'none' | 'major' | 'all';
449
+ type TileflowAerodromeCodeDetail = 'none' | 'iata' | 'all';
450
+ type TileflowRoadLabelDetail = TileflowRoadDetail;
451
+ type TileflowLabelLanguage = 'auto' | 'local' | 'en' | (string & {});
452
+ type TileflowPlaceLabelClass = 'city' | 'continent' | 'country' | 'neighborhood' | 'other' | 'state' | 'town' | 'village';
453
+ type TileflowWaterLabelClass = 'line' | 'ocean' | 'other' | 'waterway';
454
+ type TileflowRoadShieldDetail = 'none' | 'major' | 'all';
455
+ type TileflowLabelCollisionPriority = 'balanced' | 'navigation';
456
+ type TileflowRoadShieldStyles = {
457
+ default?: TileflowSymbolStyle;
458
+ detail?: TileflowSymbolStyle;
459
+ kinds?: Record<string, {
460
+ image: TileflowThemeImageValue;
461
+ }>;
462
+ overview?: TileflowSymbolStyle;
463
+ textColors?: Record<string, {
464
+ color: TileflowThemeColorValue;
465
+ }>;
466
+ };
467
+ type TileflowLabelStyles = {
468
+ aerodrome?: TileflowSymbolStyle;
469
+ junctions?: TileflowSymbolStyle;
470
+ places?: Partial<Record<TileflowPlaceLabelClass, TileflowSymbolStyle>>;
471
+ roads?: Partial<Record<TileflowRoadClass, TileflowSymbolStyle>>;
472
+ shields?: TileflowRoadShieldStyles;
473
+ water?: Partial<Record<TileflowWaterLabelClass, TileflowSymbolStyle>>;
474
+ };
475
+ type TileflowLabelsModuleConfig = {
476
+ type: 'labels';
477
+ aerodromeCodes?: TileflowAerodromeCodeDetail;
478
+ collisionPriority?: TileflowLabelCollisionPriority;
479
+ junctions?: boolean;
480
+ language?: TileflowLabelLanguage;
481
+ places?: TileflowLabelDetail;
482
+ roadClasses?: readonly TileflowRoadClass[];
483
+ roads?: TileflowRoadLabelDetail;
484
+ shields?: TileflowRoadShieldDetail;
485
+ styles?: TileflowLabelStyles;
486
+ water?: TileflowLabelDetail;
487
+ };
488
+ /** Closed editorial vocabulary emitted by Tileflow World's canonical POI projection. */
489
+ declare const tileflowPoiCategories: readonly ["arts-entertainment", "education", "food-drink", "landmark", "lodging", "medical", "park-nature", "public-services", "religion", "retail", "sport-leisure", "transport", "visitor-amenity"];
490
+ type TileflowPoiCategory = (typeof tileflowPoiCategories)[number];
491
+ type TileflowPoiDensity = 1 | 2 | 3 | 4 | 5;
492
+ type TileflowPoiColorMode = 'uniform' | 'category';
493
+ type TileflowPoiCategoryStyle = Omit<TileflowMarkerSymbolStyle, 'priority'> & {
494
+ /** Optional category-local cap within the module's canonical density tiers. */
495
+ density?: TileflowPoiDensity;
496
+ };
497
+ type TileflowPoiModuleConfig = {
498
+ type: 'poi';
499
+ categories?: readonly TileflowPoiCategory[];
500
+ color?: TileflowPoiColorMode;
501
+ density?: TileflowPoiDensity;
502
+ icons?: boolean;
503
+ labels?: boolean;
504
+ minZoom?: number;
505
+ placement?: {
506
+ coupleIconAndLabel?: boolean;
507
+ iconPadding?: number;
508
+ textPadding?: number;
509
+ };
510
+ styles?: Partial<Record<TileflowPoiCategory, TileflowPoiCategoryStyle>>;
511
+ };
36
512
  type MapLibreSprite = string | Array<{
37
513
  id: string;
38
514
  url: string;
@@ -93,6 +569,217 @@ type TileflowStyleFontFace = {
93
569
  style?: 'italic' | 'normal' | 'oblique';
94
570
  weight?: '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';
95
571
  };
572
+ /**
573
+ * A continuous blend of named themes of one Tileflow map. `position` places the map between
574
+ * neighbouring themes: 0 is the first, 1 the second, and 1.25 a quarter of the way from the second
575
+ * to the third.
576
+ */
577
+ type TileflowThemeBlendSelection = Readonly<{
578
+ /** From 0 to `themes.length - 1`. */
579
+ position: number;
580
+ /** Two to eight concrete theme names of the map, in blend order. */
581
+ themes: readonly string[];
582
+ }>;
583
+
584
+ type TileflowAddressesModuleOptions = {
585
+ /** Styling for OpenMapTiles point house-number labels. */
586
+ labels?: TileflowSymbolStyle;
587
+ };
588
+ type TileflowAddressesModuleConfig = TileflowAddressesModuleOptions & {
589
+ type: 'addresses';
590
+ };
591
+
592
+ type TileflowAerowaysModuleOptions = {
593
+ area?: TileflowAreaStyle;
594
+ runway?: TileflowLineStackStyle;
595
+ runwayRef?: TileflowSymbolStyle;
596
+ taxiway?: TileflowLineStackStyle;
597
+ };
598
+ type TileflowAerowaysModuleConfig = TileflowAerowaysModuleOptions & {
599
+ type: 'aeroways';
600
+ };
601
+
602
+ type TileflowBoundariesModuleOptions = {
603
+ admin2?: TileflowLineStyle;
604
+ admin4?: TileflowLineStyle;
605
+ disputed?: TileflowLineStyle;
606
+ maritime?: TileflowLineStyle;
607
+ };
608
+ type TileflowBoundariesModuleConfig = TileflowBoundariesModuleOptions & {
609
+ type: 'boundaries';
610
+ };
611
+
612
+ type TileflowBuildingMode = '3d' | 'flat';
613
+ type TileflowBuildingsModuleOptions = {
614
+ businessCorridor?: TileflowAreaStyle;
615
+ extrusion?: TileflowExtrusionStyle;
616
+ flat?: TileflowAreaStyle;
617
+ mode?: TileflowBuildingMode;
618
+ };
619
+ type TileflowBuildingsModuleConfig = TileflowBuildingsModuleOptions & {
620
+ type: 'buildings';
621
+ };
622
+
623
+ type TileflowLanduseClass = 'cemetery' | 'civic' | 'commercial' | 'education' | 'government' | 'industrial' | 'medical' | 'military' | 'parking' | 'railway' | 'recreation' | 'residential';
624
+ type TileflowLandcoverClass = 'farmland' | 'flowerbed' | 'grass' | 'ice' | 'meadow' | 'protected' | 'recreationGround' | 'rock' | 'sand' | 'scrub' | 'urbanPark' | 'villageGreen' | 'wetland' | 'wood';
625
+ type TileflowLandModuleOptions = {
626
+ background?: TileflowBackgroundStyle;
627
+ globalLandcover?: TileflowFillStyle;
628
+ landcover?: Partial<Record<TileflowLandcoverClass, TileflowAreaStyle>>;
629
+ landuse?: Partial<Record<TileflowLanduseClass, TileflowAreaStyle>>;
630
+ };
631
+ type TileflowLandModuleConfig = TileflowLandModuleOptions & {
632
+ type: 'land';
633
+ };
634
+
635
+ declare const tileflowLandformClasses: readonly ["peak", "volcano", "saddle", "ridge", "cliff", "arete"];
636
+ type TileflowLandformClass = (typeof tileflowLandformClasses)[number];
637
+ type TileflowLandformsModuleOptions = {
638
+ classes?: Partial<Record<TileflowLandformClass, TileflowSymbolStyle>>;
639
+ /** Append source elevation in metres when the feature provides it. */
640
+ elevation?: boolean;
641
+ };
642
+ type TileflowLandformsModuleConfig = TileflowLandformsModuleOptions & {
643
+ type: 'landforms';
644
+ };
645
+
646
+ /** Labels anchored inside polygon features; point-feature labels remain on their feature style. */
647
+ type TileflowNauticalAreaLabelStyles = {
648
+ coverage?: TileflowSymbolStyle;
649
+ hazards?: TileflowSymbolStyle;
650
+ navigationAreas?: TileflowSymbolStyle;
651
+ reefs?: TileflowSymbolStyle;
652
+ wrecks?: TileflowSymbolStyle;
653
+ };
654
+ type TileflowNauticalModuleOptions = {
655
+ aids?: TileflowMarkerSymbolStyle;
656
+ coverage?: TileflowAreaStyle;
657
+ hazardAreas?: TileflowAreaStyle;
658
+ hazards?: TileflowMarkerSymbolStyle;
659
+ labels?: TileflowNauticalAreaLabelStyles;
660
+ lighthouses?: TileflowMarkerSymbolStyle;
661
+ lights?: TileflowMarkerSymbolStyle;
662
+ navigationAreas?: TileflowAreaStyle;
663
+ reefs?: TileflowAreaStyle;
664
+ soundings?: TileflowMarkerSymbolStyle;
665
+ wreckAreas?: TileflowAreaStyle;
666
+ wrecks?: TileflowMarkerSymbolStyle;
667
+ };
668
+ type TileflowNauticalModuleConfig = TileflowNauticalModuleOptions & {
669
+ type: 'nautical';
670
+ };
671
+
672
+ type TileflowTransitModuleOptions = {
673
+ cableway?: TileflowLineStyle;
674
+ ferry?: TileflowLineStyle;
675
+ rail?: TileflowTransitRailStyle;
676
+ railHatching?: TileflowTransitRailStyle;
677
+ serviceRail?: TileflowTransitRailStyle;
678
+ };
679
+ type TileflowTransitRailStyle = {
680
+ bridge?: TileflowLineStyle;
681
+ surface?: TileflowLineStyle;
682
+ tunnel?: TileflowLineStyle;
683
+ };
684
+ type TileflowTransitModuleConfig = TileflowTransitModuleOptions & {
685
+ type: 'transit';
686
+ };
687
+
688
+ type TileflowVegetationMode = '3d' | 'flat';
689
+ type TileflowVegetationThreeDimensionalStyle = {
690
+ barkColor?: TileflowThemeColorValue;
691
+ broadleafColors?: readonly TileflowThemeColorValue[];
692
+ coniferColors?: readonly TileflowThemeColorValue[];
693
+ crownScale?: TileflowThemeNumberValue;
694
+ heightScale?: TileflowThemeNumberValue;
695
+ };
696
+ type TileflowVegetationModuleOptions = {
697
+ flat?: TileflowCircleStyle;
698
+ mode?: TileflowVegetationMode;
699
+ threeDimensional?: TileflowVegetationThreeDimensionalStyle;
700
+ };
701
+ type TileflowVegetationModuleConfig = TileflowVegetationModuleOptions & {
702
+ type: 'vegetation';
703
+ };
704
+
705
+ type TileflowWaterwayClass = 'canal' | 'other' | 'river' | 'stream';
706
+ type TileflowWaterModuleOptions = {
707
+ bathymetry?: TileflowFillStyle;
708
+ /** Opt-in approximate contours traced from discrete bathymetry polygon band edges. */
709
+ bathymetryContours?: TileflowLineStyle;
710
+ /** Opt-in labels for bathymetry polygon band floors, not measured survey soundings. */
711
+ bathymetryLabels?: TileflowSymbolStyle;
712
+ bodies?: TileflowAreaStyle;
713
+ intermittent?: {
714
+ bodies?: TileflowAreaStyle;
715
+ waterways?: TileflowLineStyle;
716
+ };
717
+ waterways?: Partial<Record<TileflowWaterwayClass, TileflowLineStyle>>;
718
+ };
719
+ type TileflowWaterModuleConfig = TileflowWaterModuleOptions & {
720
+ type: 'water';
721
+ };
722
+
723
+ type TileflowSemanticModules = {
724
+ addresses?: TileflowAddressesModuleConfig;
725
+ aeroways?: TileflowAerowaysModuleConfig;
726
+ boundaries?: TileflowBoundariesModuleConfig;
727
+ buildings?: TileflowBuildingsModuleConfig;
728
+ labels?: TileflowLabelsModuleConfig;
729
+ land?: TileflowLandModuleConfig;
730
+ landforms?: TileflowLandformsModuleConfig;
731
+ nautical?: TileflowNauticalModuleConfig;
732
+ poi?: TileflowPoiModuleConfig;
733
+ roads?: TileflowRoadsModuleConfig;
734
+ transit?: TileflowTransitModuleConfig;
735
+ vegetation?: TileflowVegetationModuleConfig;
736
+ water?: TileflowWaterModuleConfig;
737
+ };
738
+ type TileflowSemanticModuleName = keyof TileflowSemanticModules;
739
+
740
+ /**
741
+ * Layer metadata naming the semantic module that owns a compiled layer, such as `roads` or `water`.
742
+ * Runtime features that address a module, such as map emphasis, read it instead of physical layer
743
+ * IDs. Layers that a theme blend splits or copies keep it.
744
+ */
745
+ declare const tileflowLayerDomainMetadataKey: "tileflow:domain";
746
+
747
+ type TileflowLayerDomain = TileflowSemanticModuleName | 'terrain';
748
+
749
+ /**
750
+ * Map emphasis lets an application's own content read first: chosen modules of the map recede
751
+ * towards the map's ground colour, and the map's labels and icons fade, except inside an area the
752
+ * application keeps at full strength. It only touches layers that a Tileflow map compiled, which
753
+ * name their module in their metadata; an application's own layers are never changed.
754
+ *
755
+ * This module plans which paint values an emphasis changes and computes each value for a strength
756
+ * from 0 (the map as designed) to 1 (the full emphasis). The browser controller writes them.
757
+ */
758
+ /** A module of a compiled Tileflow map, such as `roads`, `transit`, `boundaries`, or `water`. */
759
+ type TileflowEmphasisModule = TileflowLayerDomain;
760
+ /** A GeoJSON polygon or multipolygon, in longitude and latitude. */
761
+ type TileflowEmphasisArea = Readonly<{
762
+ coordinates: readonly (readonly (readonly number[])[])[];
763
+ type: 'Polygon';
764
+ }> | Readonly<{
765
+ coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
766
+ type: 'MultiPolygon';
767
+ }>;
768
+ /** How the map steps back so an application's content reads first. */
769
+ type TileflowEmphasis = Readonly<{
770
+ /**
771
+ * Modules whose ground recedes towards the map's ground colour, and how far, from 0 (as
772
+ * designed) to 1 (the ground colour itself). Artwork that cannot be recoloured, such as
773
+ * patterns, fades by the same amount instead.
774
+ */
775
+ recede?: Readonly<Partial<Record<TileflowEmphasisModule, number>>>;
776
+ /** The share of their opacity the map's labels and icons keep, from 0 to 1. */
777
+ labels?: number;
778
+ /** An area in which the map's labels and icons keep their full strength. */
779
+ keep?: TileflowEmphasisArea;
780
+ }>;
781
+ /** Why an emphasis cannot be shown, or undefined when it can. */
782
+ declare function validateTileflowEmphasis(value: unknown): TypeError | undefined;
96
783
 
97
784
  /**
98
785
  * Browser helpers for theme transitions and blends. They use only methods that MapLibre GL JS maps
@@ -102,6 +789,8 @@ type TileflowThemeMotionMap = {
102
789
  areTilesLoaded?: unknown;
103
790
  getCanvas?: unknown;
104
791
  getImage?: unknown;
792
+ getLayer?: unknown;
793
+ getStyle?: unknown;
105
794
  isStyleLoaded?: unknown;
106
795
  off(event: string, listener: (event?: unknown) => void): unknown;
107
796
  on(event: string, listener: (event?: unknown) => void): unknown;
@@ -166,7 +855,7 @@ type TileflowPmtilesProtocolHandler = (request: Readonly<{
166
855
  url: string;
167
856
  }>, abortController: AbortController) => Promise<Readonly<{
168
857
  cacheControl?: string;
169
- data: unknown;
858
+ data: object | string;
170
859
  expires?: string;
171
860
  }>>;
172
861
  type TileflowPmtilesProtocolRegistry = Readonly<{
@@ -221,28 +910,78 @@ type TileflowThemeBlendRequest = Readonly<{
221
910
  position: number;
222
911
  /** Two to eight concrete themes of one map, in blend order. */
223
912
  themes: readonly TileflowRuntimeStyle[];
913
+ /**
914
+ * Holds back what would make MapLibre lay tiles out again: the change of nearest theme, with
915
+ * the labels, icons, and values it switches, and mixed pattern artwork. Colours, numbers, the
916
+ * sky, and light keep following the position, so a camera move or a recording never waits on
917
+ * the blend. The next request without `hold` brings what was held back in at once.
918
+ */
919
+ hold?: boolean;
224
920
  }>;
921
+ /**
922
+ * A blend of named themes as the React, Vue, and Svelte maps take it: `hold` holds back what
923
+ * would make MapLibre lay tiles out again, as `TileflowThemeBlendRequest.hold` does, and the next
924
+ * selection without it brings what waited in at once.
925
+ */
926
+ type TileflowBrowserThemeBlendSelection = TileflowThemeBlendSelection & Readonly<{
927
+ hold?: boolean;
928
+ }>;
929
+ declare function validateTileflowBrowserThemeBlendSelection(value: unknown): value is TileflowBrowserThemeBlendSelection;
225
930
  type TileflowThemeBlendState = Readonly<{
931
+ /** Whether changes held back by `hold` are waiting for a request without it. */
932
+ held: boolean;
226
933
  position: number;
934
+ /**
935
+ * Positions where the nearest theme changes over values that make MapLibre lay tiles out
936
+ * again, such as icon names, layout values, and values that read feature data or state. Plan
937
+ * a camera move or a recording around them, or pass `hold` across them.
938
+ */
939
+ relayoutAt: readonly number[];
227
940
  themes: readonly string[];
228
941
  }>;
229
- type TileflowStyleSwitchMap = TileflowThemeMotionMap & {
942
+ type TileflowStyleSwitchMap = TileflowThemeMotionMap & TileflowDynamicImageMap & {
943
+ getGlobalState?: unknown;
230
944
  off(event: string, listener: (event?: unknown) => void): unknown;
231
945
  on(event: string, listener: (event?: unknown) => void): unknown;
946
+ setGlobalStateProperty?: unknown;
232
947
  setStyle: unknown;
233
948
  };
949
+ /** A value an application sets for the whole style, which themes read with `expr.globalState`. */
950
+ type TileflowStyleStateValue = boolean | number | string | null;
234
951
  type TileflowThemeController = {
235
952
  dispose(): void;
953
+ /** Own a fixed-size RGBA image with a stable name across themes, restored after style reloads. */
954
+ registerImage(name: string, image: TileflowDynamicImage): TileflowDynamicImageHandle;
236
955
  /** The active blend, or undefined when the map shows one theme. */
237
956
  getBlend(): TileflowThemeBlendState | undefined;
238
957
  /** The theme the map shows; during a blend, the nearest theme. */
239
958
  getCurrent(): TileflowRuntimeStyle;
959
+ /** The emphasis requested last, or undefined when the map is shown as designed. */
960
+ getEmphasis(): TileflowEmphasis | undefined;
961
+ /** The value a style state was set to last, or undefined when it has not been set. */
962
+ getState(name: string): TileflowStyleStateValue | undefined;
240
963
  /**
241
964
  * Shows a blend of themes. The first request for a set of themes loads their styles and
242
965
  * prepares one style that holds all of them; later requests for the same themes only move the
243
966
  * position and take effect at once, so they can follow an animation or a slider.
244
967
  */
245
968
  setBlend(request: TileflowThemeBlendRequest, options?: TileflowThemeChangeOptions): Promise<TileflowThemeTransitionResult>;
969
+ /**
970
+ * Makes chosen modules of the map recede and its labels and icons fade, so an application's own
971
+ * content reads first; `undefined` returns the map to its design. The change eases over the
972
+ * transition, and the emphasis stays through later theme changes and blend positions. Values
973
+ * that MapLibre evaluates per feature change at once, under a cross-fade.
974
+ */
975
+ setEmphasis(emphasis: TileflowEmphasis | undefined, options?: TileflowThemeChangeOptions): Promise<TileflowThemeTransitionResult>;
976
+ /**
977
+ * Sets a style-wide state that the map's themes read with `expr.globalState(name)`. A number
978
+ * eases from the value it shows to the new one over the transition, so a colour or size that a
979
+ * theme interpolates on it moves smoothly; other values, and a number set for the first time,
980
+ * change at once. A value that also reads feature data or feature state is laid out again by
981
+ * MapLibre at each change, so it follows late and costs more. States stay through theme changes
982
+ * and blends. Needs a MapLibre map with global state (GL JS 5.6 or later).
983
+ */
984
+ setState(name: string, value: TileflowStyleStateValue, options?: TileflowThemeChangeOptions): Promise<TileflowThemeTransitionResult>;
246
985
  setTheme(style: TileflowRuntimeStyle, options?: TileflowThemeChangeOptions): Promise<TileflowThemeTransitionResult>;
247
986
  };
248
987
  /**
@@ -293,7 +1032,6 @@ type TileflowTransformRequestParameters = {
293
1032
  type TileflowComposedRequest<TRequest extends TileflowTransformRequestParameters> = Pick<TRequest, 'url'> & Partial<Omit<TRequest, 'url'>>;
294
1033
  type TileflowTransformRequest<TRequest extends TileflowTransformRequestParameters, TResourceType> = (url: string, resourceType?: TResourceType) => Promise<TileflowComposedRequest<TRequest>> | TileflowComposedRequest<TRequest> | undefined;
295
1034
  type TileflowUserTransformRequest<TRequest extends TileflowTransformRequestParameters, TResourceType> = (url: string, resourceType?: TResourceType) => Promise<TRequest> | TRequest | undefined;
296
- type TileflowAsyncAnalyticsTiming = 'request' | 'resolution';
297
1035
  declare function createTileflowSessionStarter(options: {
298
1036
  getSessionId?: () => string;
299
1037
  sessionId: string;
@@ -312,23 +1050,17 @@ declare function attachTileflowMapLifecycle<TMap, TFrame>(options: {
312
1050
  setState: (state: TileflowMapReadinessState) => void;
313
1051
  subscribe: TileflowMapLifecycleSubscriber<TMap>;
314
1052
  }): TileflowMapLifecycleAttachment;
1053
+ /**
1054
+ * Compose the caller's request transform with Tileflow analytics, the Hosted session, and the
1055
+ * World bridge. Analytics are read when each request starts, so an asynchronous user transform
1056
+ * never attaches analytics that changed while it was pending.
1057
+ */
315
1058
  declare function createTileflowTransformRequest<TRequest extends TileflowTransformRequestParameters = TileflowTransformRequestParameters, TResourceType = unknown>(options: {
316
- always: true;
317
- asyncAnalyticsTiming?: TileflowAsyncAnalyticsTiming;
318
1059
  getAnalytics: () => TileflowAnalytics | undefined;
319
1060
  sessionController?: TileflowSessionController;
320
1061
  sessionId: string;
321
1062
  transformRequest?: TileflowUserTransformRequest<TRequest, TResourceType>;
322
1063
  worldRequestBridge?: TileflowWorldRequestBridge;
323
1064
  }): TileflowTransformRequest<TRequest, TResourceType>;
324
- declare function createTileflowTransformRequest<TRequest extends TileflowTransformRequestParameters = TileflowTransformRequestParameters, TResourceType = unknown>(options: {
325
- always?: boolean;
326
- asyncAnalyticsTiming?: TileflowAsyncAnalyticsTiming;
327
- getAnalytics: () => TileflowAnalytics | undefined;
328
- sessionController?: TileflowSessionController;
329
- sessionId: string;
330
- transformRequest?: TileflowUserTransformRequest<TRequest, TResourceType>;
331
- worldRequestBridge?: TileflowWorldRequestBridge;
332
- }): TileflowTransformRequest<TRequest, TResourceType> | undefined;
333
1065
 
334
- export { type TileflowAsyncAnalyticsTiming, type TileflowAtmosphereMap, type TileflowComposedRequest, type TileflowContourProtocolHandler, type TileflowContourProtocolRegistrationOptions, type TileflowContourProtocolRegistry, type TileflowContourProtocolRequest, type TileflowContourProtocolResponse, type TileflowFairUseNotice, type TileflowFairUseNoticeController, type TileflowFairUseNoticeState, type TileflowFrameScheduler, type TileflowMapLifecycleAttachment, type TileflowMapLifecycleEvent, type TileflowMapLifecycleSubscriber, type TileflowMapReadinessState, type TileflowPmtilesProtocolHandler, type TileflowPmtilesProtocolRegistrationOptions, type TileflowPmtilesProtocolRegistry, type TileflowSessionSender, type TileflowSessionStarter, type TileflowStyleFontLoadOptions, type TileflowStyleSwitchMap, type TileflowThemeBlendRequest, type TileflowThemeBlendState, type TileflowThemeChangeOptions, type TileflowThemeController, type TileflowThemeTransition, type TileflowThemeTransitionOptions, type TileflowThemeTransitionPhase, type TileflowThemeTransitionResult, type TileflowTransformRequest, type TileflowTransformRequestParameters, type TileflowUserTransformRequest, type TileflowWorldProtocolHandler, type TileflowWorldProtocolRequest, type TileflowWorldProtocolResponse, type TileflowWorldRequestBridge, attachTileflowAtmosphere, attachTileflowFairUseNotice, attachTileflowMapLifecycle, createTileflowSessionStarter, createTileflowThemeController, createTileflowTransformRequest, getTileflowSystemColorScheme, loadTileflowStyleFonts, registerTileflowContourProtocol, registerTileflowPmtilesProtocol, registerTileflowWorldRequestBridge, subscribeTileflowSystemColorScheme, tileflowFairUseNoticeMessage, tileflowMaplibreContourVersion, tileflowPmtilesMaximumDirectoryDepth, tileflowPmtilesProtocol };
1066
+ export { type TileflowAtmosphereMap, type TileflowBrowserThemeBlendSelection, type TileflowComposedRequest, type TileflowContourProtocolHandler, type TileflowContourProtocolRegistrationOptions, type TileflowContourProtocolRegistry, type TileflowContourProtocolRequest, type TileflowContourProtocolResponse, type TileflowDynamicImage, type TileflowDynamicImageContext, type TileflowDynamicImageHandle, type TileflowEmphasis, type TileflowEmphasisArea, type TileflowEmphasisModule, type TileflowFairUseNotice, type TileflowFairUseNoticeController, type TileflowFairUseNoticeState, type TileflowFrameScheduler, type TileflowMapLifecycleAttachment, type TileflowMapLifecycleEvent, type TileflowMapLifecycleSubscriber, type TileflowMapReadinessState, type TileflowPmtilesProtocolHandler, type TileflowPmtilesProtocolRegistrationOptions, type TileflowPmtilesProtocolRegistry, type TileflowSessionSender, type TileflowSessionStarter, type TileflowStyleFontLoadOptions, type TileflowStyleStateValue, type TileflowStyleSwitchMap, type TileflowThemeBlendRequest, type TileflowThemeBlendState, type TileflowThemeChangeOptions, type TileflowThemeController, type TileflowThemeTransition, type TileflowThemeTransitionOptions, type TileflowThemeTransitionPhase, type TileflowThemeTransitionResult, type TileflowTransformRequest, type TileflowTransformRequestParameters, type TileflowUserTransformRequest, type TileflowWorldProtocolHandler, type TileflowWorldProtocolRequest, type TileflowWorldProtocolResponse, type TileflowWorldRequestBridge, attachTileflowAtmosphere, attachTileflowFairUseNotice, attachTileflowMapLifecycle, createTileflowSessionStarter, createTileflowThemeController, createTileflowTransformRequest, getTileflowSystemColorScheme, loadTileflowStyleFonts, registerTileflowContourProtocol, registerTileflowPmtilesProtocol, registerTileflowWorldRequestBridge, subscribeTileflowSystemColorScheme, tileflowFairUseNoticeMessage, tileflowLayerDomainMetadataKey, tileflowMaplibreContourVersion, tileflowPmtilesMaximumDirectoryDepth, tileflowPmtilesProtocol, validateTileflowBrowserThemeBlendSelection, validateTileflowEmphasis };