@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/README.md +11 -1
- package/dist/browser.d.ts +747 -15
- package/dist/browser.js +1015 -53
- package/dist/build.d.ts +62 -55
- package/dist/build.js +100 -53
- package/dist/{capture-scene-D6soWztE.d.ts → capture-scene-BaAJjGq7.d.ts} +11 -1
- package/dist/capture.d.ts +1 -1
- package/dist/capture.js +12 -0
- package/dist/config-reference.json +1411 -1367
- package/dist/{icon-composition-BiOTwrvD.d.ts → icon-composition-Befmn-zZ.d.ts} +40 -32
- package/dist/index.d.ts +13 -11
- package/dist/index.js +108 -53
- package/dist/{manifest-types-CTT2eLbp.d.ts → manifest-types-E7m23eXL.d.ts} +18 -1
- package/dist/manifest.d.ts +2 -2
- package/dist/native-profile.d.ts +25 -11
- package/dist/native-profile.js +21 -1
- package/dist/native.d.ts +134 -1
- package/dist/native.js +691 -1
- package/dist/runtime.d.ts +1 -1
- package/docs/authoring-model.md +20 -4
- package/docs/capture-scenes.md +1 -1
- package/docs/compiled-style-performance.md +4 -1
- package/docs/data-is-separate-from-design.md +103 -9
- package/docs/dynamic-style-images.md +100 -0
- package/docs/map-emphasis.md +89 -0
- package/docs/native-artifact-profile.md +5 -3
- package/docs/shared-visual-primitives.md +20 -0
- package/docs/style-states.md +73 -0
- package/docs/theme-transitions-and-blends.md +100 -5
- package/package.json +1 -1
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:
|
|
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
|
|
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 };
|