maplibre-gl-layers 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  import { EasingFunction, SpriteInterpolationMode, SpriteInterpolationOptions, SpriteLocation } from './types';
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  import { SpriteLocation } from './types';
package/dist/math.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  import { SpriteAnchor, SpriteImageOffset, SpriteLocation, SpriteScalingOptions } from './types';
@@ -30,11 +30,6 @@ export declare const RAD2DEG: number;
30
30
  * @constant
31
31
  */
32
32
  export declare const TILE_SIZE = 512;
33
- /**
34
- * Default values that fill in missing {@link SpriteScalingOptions} fields supplied by callers.
35
- * @constant
36
- */
37
- export declare const DEFAULT_SPRITE_SCALING_OPTIONS: SpriteScalingOptions;
38
33
  /**
39
34
  * Structure holding resolved sprite scaling options.
40
35
  * @property {number} metersPerPixel - Effective number of meters represented by each rendered pixel.
@@ -45,7 +40,7 @@ export declare const DEFAULT_SPRITE_SCALING_OPTIONS: SpriteScalingOptions;
45
40
  * @property {number} spriteMinPixel - Lower clamp for sprite size in pixels.
46
41
  * @property {number} spriteMaxPixel - Upper clamp for sprite size in pixels.
47
42
  */
48
- export type ResolvedSpriteScalingOptions = {
43
+ export interface ResolvedSpriteScalingOptions {
49
44
  metersPerPixel: number;
50
45
  zoomMin: number;
51
46
  zoomMax: number;
@@ -53,7 +48,7 @@ export type ResolvedSpriteScalingOptions = {
53
48
  scaleMax: number;
54
49
  spriteMinPixel: number;
55
50
  spriteMaxPixel: number;
56
- };
51
+ }
57
52
  /**
58
53
  * Fills missing {@link SpriteScalingOptions} values with defaults so downstream math can assume a complete object.
59
54
  * @param options Optional scaling configuration from the caller.
@@ -140,7 +135,11 @@ export declare const calculateBillboardAnchorShiftPixels: (halfWidth: number, ha
140
135
  * @param {number} zoomScaleFactor - Zoom-dependent scale multiplier.
141
136
  * @returns {{ width: number; height: number }} Dimensions expressed as world-space meters.
142
137
  */
143
- export declare const calculateSurfaceWorldDimensions: (imageWidth: number | undefined, imageHeight: number | undefined, baseMetersPerPixel: number, imageScale: number, zoomScaleFactor: number) => {
138
+ export declare const calculateSurfaceWorldDimensions: (imageWidth: number | undefined, imageHeight: number | undefined, baseMetersPerPixel: number, imageScale: number, zoomScaleFactor: number, options?: {
139
+ effectivePixelsPerMeter?: number;
140
+ spriteMinPixel?: number;
141
+ spriteMaxPixel?: number;
142
+ }) => {
144
143
  width: number;
145
144
  height: number;
146
145
  };
@@ -160,9 +159,10 @@ export declare const calculateSurfaceAnchorShiftMeters: (halfWidthMeters: number
160
159
  * Calculates surface image offsets in meters.
161
160
  * @param {SpriteImageOffset | undefined} offset - Offset configuration for the surface sprite.
162
161
  * @param {number} imageScale - User-provided scale multiplier applied to the offset distance.
162
+ * @param {number} zoomScaleFactor - Zoom-dependent scale multiplier.
163
163
  * @returns {{ east: number; north: number }} Offset vector in meters.
164
164
  */
165
- export declare const calculateSurfaceOffsetMeters: (offset: SpriteImageOffset | undefined, imageScale: number) => {
165
+ export declare const calculateSurfaceOffsetMeters: (offset: SpriteImageOffset | undefined, imageScale: number, zoomScaleFactor: number) => {
166
166
  east: number;
167
167
  north: number;
168
168
  };
@@ -399,6 +399,9 @@ export declare const calculateBillboardCornerScreenPositions: (params: Billboard
399
399
  * @property {number} totalRotateDeg - Rotation applied to the sprite in degrees.
400
400
  * @property {SpriteAnchor} [anchor] - Anchor definition normalized between -1 and 1.
401
401
  * @property {SpriteImageOffset} [offset] - Offset definition applied in meters/deg.
402
+ * @property {number} [effectivePixelsPerMeter] - Conversion rate from meters to on-screen pixels.
403
+ * @property {number} [spriteMinPixel] - Lower clamp for the sprite's largest pixel dimension.
404
+ * @property {number} [spriteMaxPixel] - Upper clamp for the sprite's largest pixel dimension.
402
405
  * @property {ProjectLngLatFn} [project] - Projection function mapping longitude/latitude to screen space.
403
406
  * @property {ProjectToClipSpaceFn} [projectToClipSpace] - Projection into clip space when available.
404
407
  * @property {number} [drawingBufferWidth] - WebGL drawing buffer width in device pixels.
@@ -417,6 +420,9 @@ export type SurfaceCenterParams = {
417
420
  totalRotateDeg: number;
418
421
  anchor?: SpriteAnchor;
419
422
  offset?: SpriteImageOffset;
423
+ effectivePixelsPerMeter?: number;
424
+ spriteMinPixel?: number;
425
+ spriteMaxPixel?: number;
420
426
  project?: ProjectLngLatFn;
421
427
  projectToClipSpace?: ProjectToClipSpaceFn;
422
428
  drawingBufferWidth?: number;
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  import { EasingFunction, SpriteNumericInterpolationOptions } from './types';
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  import { SpriteNumericInterpolationOptions } from './types';
package/dist/types.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  import { CustomLayerInterface } from 'maplibre-gl';
@@ -326,14 +326,9 @@ export interface SpriteUpdateEntry<TTag> extends SpriteUpdateEntryBase<TTag> {
326
326
  /** Optional set of image updates. */
327
327
  images?: SpriteImageDefinitionUpdateEntry[];
328
328
  }
329
- /**
330
- * Entry consumed by updateBulk to target a specific sprite.
331
- *
332
- * @template T Tag type stored on the sprite.
333
- * @property {string} spriteId - Identifier of the sprite to update.
334
- */
329
+ /** @deprecated Scheduled for removal in a future release. Use {@link SpriteLayerInterface.mutateSprites} instead. */
335
330
  export interface SpriteUpdateBulkEntry<T> extends SpriteUpdateEntry<T> {
336
- /** Identifier of the sprite to update. */
331
+ /** @deprecated Scheduled for removal in a future release. Use {@link SpriteLayerInterface.mutateSprites} instead. */
337
332
  spriteId: string;
338
333
  }
339
334
  /**
@@ -355,6 +350,44 @@ export interface SpriteUpdaterEntry<TTag> extends SpriteUpdateEntryBase<TTag> {
355
350
  /** Removes an image slot. */
356
351
  readonly removeImage: (subLayer: number, order: number) => boolean;
357
352
  }
353
+ /**
354
+ * Result flags returned by `mutateSprites` callbacks.
355
+ * - `'notremove'`: Keep the sprite after applying any modifications.
356
+ * - `'remove'`: Remove the sprite from the layer.
357
+ */
358
+ export type SpriteModifierResult = 'notremove' | 'remove';
359
+ /** Source items supplied to `mutateSprites` must expose the target sprite ID. */
360
+ export interface SpriteMutateSourceItem {
361
+ /** Identifier of the sprite targeted by the source item. */
362
+ readonly spriteId: string;
363
+ }
364
+ /**
365
+ * Callbacks invoked by `mutateSprites` for each source item.
366
+ *
367
+ * @template TTag Sprite tag type stored by the layer.
368
+ * @template TSourceItem Source item type that satisfies {@link SpriteMutateSourceItem}.
369
+ */
370
+ export interface SpriteMutateCallbacks<TTag, TSourceItem extends SpriteMutateSourceItem> {
371
+ /**
372
+ * Invoked when the sprite ID from the source item does not yet exist.
373
+ * Return a populated {@link SpriteInit} when the sprite should be added; return `undefined`
374
+ * (or `null`) to skip creation.
375
+ *
376
+ * @param sourceItem Source item that produced the sprite ID.
377
+ * @returns Sprite initialiser to insert, or `undefined`/`null` to skip.
378
+ */
379
+ add: (sourceItem: TSourceItem) => SpriteInit<TTag> | null | undefined;
380
+ /**
381
+ * Invoked when the sprite ID already exists on the layer.
382
+ * Use `update` to mutate sprite properties or images; return `'remove'` to delete the sprite instead.
383
+ *
384
+ * @param sourceItem Source item that produced the sprite ID.
385
+ * @param sprite Current sprite state snapshot.
386
+ * @param update Helper exposing the same operations as {@link SpriteUpdaterEntry}.
387
+ * @returns `'remove'` to delete the sprite; otherwise `'notremove'`.
388
+ */
389
+ modify: (sourceItem: TSourceItem, sprite: SpriteCurrentState<TTag>, update: SpriteUpdaterEntry<TTag>) => SpriteModifierResult;
390
+ }
358
391
  /**
359
392
  * Represents a point in screen space.
360
393
  *
@@ -416,11 +449,14 @@ export type SpriteLayerEventListener<T, K extends keyof SpriteLayerEventMap<T>>
416
449
  * @property {number | undefined} zoomMax - Maximum zoom level before scaling adjustments apply.
417
450
  * @property {number | undefined} scaleMin - Lower limit for scale clamping.
418
451
  * @property {number | undefined} scaleMax - Upper limit for scale clamping.
419
- * @property {number | undefined} spriteMinPixel - Minimum on-screen pixel size for sprites.
420
- * @property {number | undefined} spriteMaxPixel - Maximum on-screen pixel size for sprites.
452
+ * @property {number | undefined} spriteMinPixel - Minimum on-screen pixel size for sprites (0 disables the lower clamp).
453
+ * @property {number | undefined} spriteMaxPixel - Maximum on-screen pixel size for sprites (0 disables the upper clamp).
421
454
  */
422
455
  export interface SpriteScalingOptions {
423
- /** Overrides the baseline meters-per-pixel ratio. */
456
+ /**
457
+ * Overrides the baseline meters-per-pixel ratio.
458
+ * We strongly recommend specifying the default value of 1, as this value affects all calculations.
459
+ */
424
460
  metersPerPixel?: number;
425
461
  /** Minimum zoom level before scaling adjustments apply. */
426
462
  zoomMin?: number;
@@ -430,16 +466,26 @@ export interface SpriteScalingOptions {
430
466
  scaleMin?: number;
431
467
  /** Upper limit for scale clamping. */
432
468
  scaleMax?: number;
433
- /** Minimum on-screen pixel size for sprites. */
469
+ /** Minimum on-screen pixel size for sprites (0 disables the lower clamp). */
434
470
  spriteMinPixel?: number;
435
- /** Maximum on-screen pixel size for sprites. */
471
+ /** Maximum on-screen pixel size for sprites (0 disables the upper clamp). */
436
472
  spriteMaxPixel?: number;
437
473
  }
474
+ /**
475
+ * Unlimited (default) values that fill in missing {@link SpriteScalingOptions} fields supplied by callers.
476
+ * metersPerPixel is 1.
477
+ */
478
+ export declare const UNLIMITED_SPRITE_SCALING_OPTIONS: SpriteScalingOptions;
479
+ /**
480
+ * Standard values that fill in missing {@link SpriteScalingOptions} fields supplied by callers.
481
+ * metersPerPixel is 1.
482
+ */
483
+ export declare const STANDARD_SPRITE_SCALING_OPTIONS: SpriteScalingOptions;
438
484
  /**
439
485
  * Options accepted when creating a SpriteLayer.
440
486
  *
441
487
  * @property {string | undefined} id - Optional layer identifier supplied to MapLibre.
442
- * @property {SpriteScalingOptions | undefined} spriteScaling - Optional scaling controls.
488
+ * @property {SpriteScalingOptions | undefined} spriteScaling - Optional scaling controls. Default is UNLIMITED_SPRITE_SCALING_OPTIONS.
443
489
  */
444
490
  export interface SpriteLayerOptions {
445
491
  /** Optional layer identifier supplied to MapLibre. */
@@ -456,6 +502,8 @@ export type SpriteTextGlyphPaddingPixel = number | {
456
502
  bottom?: number;
457
503
  left?: number;
458
504
  };
505
+ /** Border sides that can be rendered for a text glyph outline. */
506
+ export type SpriteTextGlyphBorderSide = 'top' | 'right' | 'bottom' | 'left';
459
507
  /** Additional size options accepted by registerTextGlyph. */
460
508
  export type SpriteTextGlyphDimensions = {
461
509
  readonly lineHeightPixel: number;
@@ -468,7 +516,6 @@ export type SpriteTextGlyphDimensions = {
468
516
  * Text glyph appearance options.
469
517
  *
470
518
  * @property {string | undefined} fontFamily - Font family name.
471
- * @property {number | undefined} fontSizePixel - Font size in pixels.
472
519
  * @property {string | undefined} fontWeight - CSS font-weight value.
473
520
  * @property {'normal' | 'italic' | undefined} fontStyle - CSS font-style value.
474
521
  * @property {string | undefined} color - Text fill color.
@@ -477,15 +524,15 @@ export type SpriteTextGlyphDimensions = {
477
524
  * @property {SpriteTextGlyphPaddingPixel | undefined} paddingPixel - Padding around the glyph.
478
525
  * @property {string | undefined} borderColor - Outline color.
479
526
  * @property {number | undefined} borderWidthPixel - Outline width in pixels.
527
+ * @property {SpriteTextGlyphBorderSide[] | undefined} borderSides - Border sides to draw (defaults to all four).
480
528
  * @property {number | undefined} borderRadiusPixel - Border radius in pixels.
481
529
  * @property {SpriteTextGlyphHorizontalAlign | undefined} textAlign - Horizontal alignment of multiline text.
482
- * @property {number | undefined} renderPixelRatio - Pixel ratio used when rendering the glyph.
530
+ * @property {number | undefined} fontSizePixelHint - It is not specified normally. Preferred font size in pixels before dimension constraints are enforced.
531
+ * @property {number | undefined} renderPixelRatio - Canvas pixel ratio multiplier (defaults to 1) applied before the glyph is resampled to its logical size.
483
532
  */
484
533
  export interface SpriteTextGlyphOptions {
485
534
  /** Font family name. */
486
535
  fontFamily?: string;
487
- /** Font size in pixels. */
488
- fontSizePixel?: number;
489
536
  /** CSS font-weight value. */
490
537
  fontWeight?: string;
491
538
  /** CSS font-style value. */
@@ -502,11 +549,15 @@ export interface SpriteTextGlyphOptions {
502
549
  borderColor?: string;
503
550
  /** Outline width in pixels. */
504
551
  borderWidthPixel?: number;
552
+ /** Border sides to draw; defaults to all four sides when omitted. */
553
+ borderSides?: readonly SpriteTextGlyphBorderSide[];
505
554
  /** Border radius in pixels. */
506
555
  borderRadiusPixel?: number;
507
556
  /** Horizontal alignment of multiline text. */
508
557
  textAlign?: SpriteTextGlyphHorizontalAlign;
509
- /** Pixel ratio used when rendering the glyph. */
558
+ /** It is not specified normally. Preferred font size in pixels; may shrink automatically to satisfy provided dimensions. */
559
+ fontSizePixelHint?: number;
560
+ /** Pixel ratio used when rendering the glyph; defaults to 1 and values > 1 render at higher resolution before downscaling. */
510
561
  renderPixelRatio?: number;
511
562
  }
512
563
  /**
@@ -640,12 +691,18 @@ export interface SpriteLayerInterface<TTag = any> extends CustomLayerInterface {
640
691
  */
641
692
  readonly updateSprite: (spriteId: string, update: SpriteUpdateEntry<TTag>) => boolean;
642
693
  /**
643
- * Applies a batch of sprite updates.
644
- *
645
- * @param {SpriteUpdateBulkEntry<TTag>[]} updateBulkList - List of sprite updates.
646
- * @returns {number} Number of sprites that were updated.
694
+ * @deprecated Use {@link SpriteLayerInterface.mutateSprites} instead for clearer mutation flows.
647
695
  */
648
696
  readonly updateBulk: (updateBulkList: SpriteUpdateBulkEntry<TTag>[]) => number;
697
+ /**
698
+ * Adds, updates, or removes sprites based on an arbitrary collection of source items.
699
+ *
700
+ * @param {readonly TSourceItem[]} sourceItems - Source items that describe desired sprite state.
701
+ * @param {SpriteMutateCallbacks<TTag, TSourceItem>} mutator - Callbacks responsible for creation and modification.
702
+ * @returns {number} Number of sprites that changed. Counts each `add` that returns a non-null
703
+ * initialiser and each `modify` that either invoked the updater helper or returned `'remove'`.
704
+ */
705
+ readonly mutateSprites: <TSourceItem extends SpriteMutateSourceItem>(sourceItems: readonly TSourceItem[], mutator: SpriteMutateCallbacks<TTag, TSourceItem>) => number;
649
706
  /**
650
707
  * Iterates over each sprite and allows modifications through a callback.
651
708
  *
package/dist/utils.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.2.0
3
+ * version: 0.4.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 4fe3389ad068a5950d4f01e01ec9d3b34c049fb2
8
+ * git.commit.hash: 366a9e1190bfe770b4002a06284ff627188b5c76
9
9
  */
10
10
 
11
11
  /**
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "git": {
3
3
  "tags": [
4
- "0.2.0"
4
+ "0.4.0"
5
5
  ],
6
6
  "branches": [
7
7
  "main"
8
8
  ],
9
- "version": "0.2.0",
9
+ "version": "0.4.0",
10
10
  "commit": {
11
- "hash": "4fe3389ad068a5950d4f01e01ec9d3b34c049fb2",
12
- "shortHash": "4fe3389",
13
- "date": "2025-10-28T17:25:52+09:00Z",
11
+ "hash": "366a9e1190bfe770b4002a06284ff627188b5c76",
12
+ "shortHash": "366a9e1",
13
+ "date": "2025-10-29T22:23:19+09:00Z",
14
14
  "message": "Merge branch 'develop'"
15
15
  }
16
16
  },
17
- "version": "0.2.0",
17
+ "version": "0.4.0",
18
18
  "description": "MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images",
19
19
  "author": "Kouji Matsui (@kekyo@mi.kekyo.net)",
20
20
  "license": "MIT",
@@ -54,7 +54,7 @@
54
54
  ],
55
55
  "scripts": {
56
56
  "build": "vite build",
57
- "dev": "echo \"maplibre-gl-layers does not have dev rule.\"",
57
+ "dev": "npm run build",
58
58
  "test": "npm run build && vitest run",
59
59
  "test:e2e": "npm run build && playwright test",
60
60
  "pack": "npm run build && screw-up pack --pack-destination ../artifacts"