@chrtco/sdk 0.10.39 → 0.10.41

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/index.d.ts CHANGED
@@ -265,6 +265,35 @@ declare function styleModeBand(mode: ChrtStyleMode): ScaleBand$1 | null;
265
265
  * band code(s) by extracting the band character from `_cell_id`.
266
266
  */
267
267
  declare function bandFilterExpression(codes: BandCode | readonly BandCode[]): unknown[];
268
+ /**
269
+ * Cell-id band characters that are NOT NOAA usage bands but are exported
270
+ * under one of them, keyed by the band they stand in for.
271
+ *
272
+ * USACE Inland ENC cell ids are `U37…` — the third character is `7` on every
273
+ * one of the 109 cells and means nothing (`sources.ts` `cellIdCarriesBand:
274
+ * false`). The pipeline assigns the whole product to band 5 (`layers.ts`
275
+ * `USACE_IENC_BAND = 5`: 1:5,000 compilation scale sits inside NOAA's
276
+ * Harbour band) and exports it with band 5's zoom policy and dominance tags.
277
+ * So a band-5 gate on `slice(_cell_id, 2, 3)` is exactly the gate those
278
+ * features were built for — it just never matched the character `7`. Every
279
+ * band-5 gate in the style therefore also admits `7`, and nothing else
280
+ * changes: no seventh band, no new draw order, no new zoom range.
281
+ *
282
+ * CHRTsail friction #269: the offline USACE_IENC bundle downloaded, verified
283
+ * and served, and the style drew none of it — 1,250 of 1,251 layers gated on
284
+ * bands 1–6.
285
+ */
286
+ declare const BAND_CODE_ALIASES: Readonly<Partial<Record<BandCode, readonly string[]>>>;
287
+ /** A band code plus every character that stands in for it. */
288
+ declare function cellBandCharacters(code: BandCode): readonly string[];
289
+ /**
290
+ * Match `cellBandExpr` (an expression yielding the cell id's band character)
291
+ * against one or more bands, aliases included. `==` when exactly one
292
+ * character qualifies, `in` otherwise — the shape a consumer reads, so a
293
+ * single-band filter stays the same expression it has always been unless the
294
+ * band has an alias.
295
+ */
296
+ declare function cellBandMatch(cellBandExpr: unknown, codes: BandCode | readonly BandCode[]): unknown[];
268
297
  /**
269
298
  * Combine a base filter (may be undefined) with a band filter via `["all"]`.
270
299
  * If the base filter is itself an `["all", ...]`, flatten so we don't end
@@ -896,6 +925,12 @@ interface MarineConditionsOptions {
896
925
  * asked for.
897
926
  */
898
927
  station?: string;
928
+ /**
929
+ * Add the chosen station's last `hours` hours of readings as `series`.
930
+ * A whole number, 1–1080 (45 days — all NDBC's per-station file holds).
931
+ * Omit it and the response is unchanged.
932
+ */
933
+ hours?: number;
899
934
  signal?: AbortSignal;
900
935
  }
901
936
  interface MarineStation {
@@ -940,6 +975,39 @@ interface MarineConditionsResponse {
940
975
  dataQuality: "live" | "degraded";
941
976
  attribution: string;
942
977
  disclaimer: string;
978
+ /** Present only when `hours` was passed. */
979
+ series?: MarineConditionsSeries;
980
+ }
981
+ /**
982
+ * One reading, in exactly the shape of the top-level `conditions` /
983
+ * `unavailable` — same units, same rule that a field the buoy did not report is
984
+ * absent from `conditions` and named in `unavailable`.
985
+ */
986
+ interface MarineConditionsObservation {
987
+ time: string;
988
+ conditions: Record<string, WeatherReading | undefined>;
989
+ unavailable: string[];
990
+ }
991
+ /**
992
+ * A station's recent readings. **Never interpolated, smoothed, resampled or
993
+ * gap-filled** — if you draw a line between two observations, it is yours;
994
+ * label it as drawn. Every observation is at or before the top-level
995
+ * `observed.time`.
996
+ */
997
+ interface MarineConditionsSeries {
998
+ /** Start of the window asked for: request time minus `hours`. */
999
+ from: string;
1000
+ /** End of the window asked for: request time. */
1001
+ to: string;
1002
+ order: "oldest-first";
1003
+ /**
1004
+ * The station's normal spacing in this window, in minutes — the most common
1005
+ * interval between consecutive readings. `null` below two readings. Per
1006
+ * station (10, 30 or 60): use it to tell a dropped report from ordinary
1007
+ * spacing.
1008
+ */
1009
+ cadenceMinutes: number | null;
1010
+ observations: MarineConditionsObservation[];
943
1011
  }
944
1012
  interface MarineAlertsOptions {
945
1013
  lat?: number;
@@ -955,6 +1023,12 @@ interface MarineZoneRef {
955
1023
  office?: string;
956
1024
  /** Other zones the same bulletin forecasts for. */
957
1025
  alsoCovers?: string[];
1026
+ /**
1027
+ * `[west, south, east, north]` of the zone, from the same build the `NWS_MARINE_ZONES` tiles
1028
+ * draw. **A camera hint — fit the map to it; never draw it as the zone.** `west > east` means
1029
+ * the box crosses 180°. Absent for a zone that build does not contain. (marine-forecast only)
1030
+ */
1031
+ bbox?: [west: number, south: number, east: number, north: number];
958
1032
  }
959
1033
  interface MarineAlert {
960
1034
  id: string;
@@ -1524,6 +1598,14 @@ interface StyleUrlOptions {
1524
1598
  * so this currently returns 403 for every key. It will start working
1525
1599
  * with no SDK change once that grant ships. */
1526
1600
  relief?: boolean;
1601
+ /** The unit every number in the document prints in — soundings,
1602
+ * depth-contour labels, dredged-channel notes and bridge notes:
1603
+ * `"metric"` (default; S-57's own metres) or `"imperial"` (feet). Same
1604
+ * vocabulary as the weather API's `units`. Send the reader's setting
1605
+ * here rather than converting soundings client-side: a bridge note is
1606
+ * composed text, and a chart whose soundings read feet beside a note
1607
+ * that reads metres is exactly the disagreement this prevents. */
1608
+ units?: "metric" | "imperial";
1527
1609
  }
1528
1610
  interface FetchStyleOptions extends StyleUrlOptions {
1529
1611
  signal?: AbortSignal;
@@ -1637,6 +1719,9 @@ declare class WeatherEndpoint {
1637
1719
  *
1638
1720
  * `unavailable` names every field the station did not report, so absence is
1639
1721
  * stated rather than inferred from a missing key.
1722
+ *
1723
+ * Pass `hours` for the station's recent readings as `series` — NDBC's own
1724
+ * readings at NDBC's own instants, never interpolated.
1640
1725
  */
1641
1726
  conditions(options: MarineConditionsOptions): Promise<MarineConditionsResponse>;
1642
1727
  /**
@@ -1797,6 +1882,22 @@ declare class OfflineEndpoint {
1797
1882
  private persistManifestEntry;
1798
1883
  }
1799
1884
 
1885
+ /**
1886
+ * CHRTinteract decode core — S-57 attribute decoder and flash-pattern
1887
+ * generator for click-to-inspect.
1888
+ *
1889
+ * Framework-free, zero-dependency port of the first-party decode brain
1890
+ * (`src/lib/map/nav-aid-info.ts` in the CHRT platform repo). The platform file
1891
+ * remains the reference implementation; parity between the two is enforced by
1892
+ * `decode-parity.test.ts`, which runs both against shared fixtures. Behavioral
1893
+ * changes must land in both places.
1894
+ *
1895
+ * Translates raw S-57 codes (LITCHR, COLOUR, SIGPER, SIGGRP, CATxxx, …) as
1896
+ * they appear in CHRT vector-tile attributes into human-readable strings,
1897
+ * mariner notation ("Fl(2+1) W 10s"), animated light phase timing, and sector
1898
+ * geometry.
1899
+ */
1900
+
1800
1901
  /** Style-layer ids (CHRT S-52 atlas) that carry point nav-aid features. */
1801
1902
  declare const NAV_AID_QUERY_LAYERS: string[];
1802
1903
  /** Style-layer ids for area / hazard / regulated / infrastructure features. */
@@ -1844,11 +1945,30 @@ interface SectorInfo {
1844
1945
  colourHex: string;
1845
1946
  notation: string;
1846
1947
  nominalRange?: number | null;
1948
+ /** Every charted COLOUR code, in charted order — an alternating sector has two. */
1949
+ colourCodes: number[];
1950
+ /**
1951
+ * S-52 LIGHTS05's arc colour for this sector, as a palette token: LITRD /
1952
+ * LITGN / LITYW (white, yellow and orange all draw yellow — white ink on a
1953
+ * chart is no ink), CHMGD where the colours do not resolve, CHBRN when
1954
+ * obscured. `arcColourHex` is that token resolved in the palette the sectors
1955
+ * were built for.
1956
+ */
1957
+ arcColourToken: SectorArcColourToken;
1958
+ arcColourHex: string;
1959
+ /** LITVIS 3 (faint), 7 (obscured) or 8 (partially obscured): drawn brown, not lit. */
1960
+ obscured: boolean;
1961
+ /** The charted `SIGSEQ` and `SIGPER`, verbatim, for the lamp's rhythm. */
1962
+ sigseq: string | null;
1963
+ sigper: number | null;
1847
1964
  /**
1848
1965
  * True when this entry is DERIVED: an all-round light (no `SECTR1`/`SECTR2`)
1849
- * sharing its position with sectored lights, drawn over the arc the sectors
1850
- * leave uncovered — S-52 LIGHTS05's treatment. Isle au Haut: `Fl R 4s`
1851
- * all-round plus a white sector 034°–060° is red everywhere else.
1966
+ * sharing its position with sectored lights, spread over the arc the
1967
+ * sectors leave uncovered. It is what a reader IN that arc sees, and the
1968
+ * bearing lookup needs it — but it is NOT drawn: S-52 LIGHTS05 gives an
1969
+ * all-round light its flare and no arc, and `buildSectorArcsFC` follows the
1970
+ * procedure. Mirrors `src/lib/map/nav-aid-info.ts`; the parity suite holds
1971
+ * the two together.
1852
1972
  */
1853
1973
  allRound?: boolean;
1854
1974
  }
@@ -1871,6 +1991,8 @@ interface DecodedNavAid {
1871
1991
  lightCharacterFull: string | null;
1872
1992
  period: number | null;
1873
1993
  group: number[] | null;
1994
+ /** The charted on/off sequence, verbatim (`"00.4+(03.6)"`), or null. */
1995
+ sigseq: string | null;
1874
1996
  fogSignal: string | null;
1875
1997
  fogSignalAbbr: string | null;
1876
1998
  radarReflector: boolean;
@@ -1920,6 +2042,8 @@ interface FlashPattern {
1920
2042
  phases: FlashPhase[];
1921
2043
  totalCycle: number;
1922
2044
  notation: string;
2045
+ /** "charted": from the light's own SIGSEQ. "invented": a plausible animation of the character code. */
2046
+ timing: "charted" | "invented";
1923
2047
  }
1924
2048
  declare function buildFlashPattern(decoded: DecodedNavAid): FlashPattern | null;
1925
2049
  /** Minimal GeoJSON shapes for the sector-arc builders (kept dependency-free). */
@@ -1950,21 +2074,10 @@ declare function uncoveredSectorArcs(sectors: ReadonlyArray<{
1950
2074
  start: number;
1951
2075
  end: number;
1952
2076
  }>;
1953
- /**
1954
- * Build all sectors from multiple LIGHTS features at the same position.
1955
- * Each LIGHTS feature with SECTR1/SECTR2 defines one sector.
1956
- *
1957
- * An ALL-ROUND light (no `SECTR1`/`SECTR2`) at the same position as sectored
1958
- * lights is added too, over the arc the sectors leave uncovered — S-52
1959
- * LIGHTS05 draws such a light as an arc so its colour is not lost. Isle au
1960
- * Haut (Robinson Point) is encoded exactly this way: `Fl R 4s` all-round plus
1961
- * a white sector 034°–060°; without this the red never appeared at all. An
1962
- * all-round light with no charted colour, or with no sectored sibling, adds
1963
- * nothing (a plain light is a flare, not a ring).
1964
- */
2077
+ type SectorArcColourToken = "LITRD" | "LITGN" | "LITYW" | "CHMGD" | "CHBRN";
1965
2078
  declare function buildSectorsFromFeatures(features: Array<{
1966
2079
  properties: Record<string, unknown>;
1967
- }>): SectorInfo[];
2080
+ }>, ct?: ColorTableName): SectorInfo[];
1968
2081
  /**
1969
2082
  * Convert a charted sector limit (`SECTR1`/`SECTR2`) into the bearing FROM
1970
2083
  * THE LIGHT at which its limit line is drawn on the chart.
@@ -2527,6 +2640,97 @@ declare function collectClickCandidates(map: InteractMapLike, point: {
2527
2640
  */
2528
2641
  declare function decodeCandidate(map: InteractMapLike, candidate: InspectCandidate, at: ClickAnchor, opts?: AttachOptions): InspectResult;
2529
2642
 
2643
+ /**
2644
+ * `SIGSEQ` — THE RHYTHM A LIGHT ACTUALLY BURNS, for the map as well as the card.
2645
+ *
2646
+ * `SIGSEQ` is the literal on/off timing string the chart carries:
2647
+ * `"00.4+(03.6)"` is 0.4 s lit, 3.6 s dark; parenthesised terms are ECLIPSE.
2648
+ * That is the whole grammar. 44,181 of the 59,331 lights in the national
2649
+ * archive carry one (measured 2026-09-11), and only 17 exceed twelve terms.
2650
+ *
2651
+ * ===========================================================================
2652
+ * ⚠ ONE PARSER. THIS FILE IS IT.
2653
+ * ===========================================================================
2654
+ *
2655
+ * The inspect card's `light-rhythm.ts` had the honest parser — with the
2656
+ * `SIGPER` checksum and the refusal semantics `FlashPattern.swift` settled —
2657
+ * and `nav-aid-info.ts`'s `buildFlashPattern` had the other kind: 400 ms
2658
+ * flashes, 300 ms gaps, a 6 s period when none was charted, `SIGSEQ` never
2659
+ * read. The audit of 2026-09-11 found the popup drawing the invented one.
2660
+ * *"A wrong rhythm on screen is worse than no rhythm, because a skipper
2661
+ * identifies a light BY its rhythm — the pattern is the light's name."*
2662
+ *
2663
+ * So the grammar lives HERE, in the SDK's interact layer, and reaches the
2664
+ * app through `@chrtco/sdk` (`src/lib/map/light-sigseq.ts` re-exports it);
2665
+ * `light-rhythm.ts` delegates to `parseSigseqTerms` and keeps its disclosure
2666
+ * layer, and `buildFlashPattern` reads the chart's timing before it invents.
2667
+ *
2668
+ * ===========================================================================
2669
+ * THE NIGHT VIEW'S LAMPS FLASH FROM THIS TOO
2670
+ * ===========================================================================
2671
+ *
2672
+ * A style expression cannot parse a string, so the canvas parses each light
2673
+ * once (`rhythmProperties`) into cumulative phase ends `r1..rN`, on-flags
2674
+ * `o1..oN` and per-phase colours `c1..cN` on a GeoJSON feature, and a 10 Hz
2675
+ * tick sets ONE paint property — `lampRhythmOpacity(now)` — that every lamp
2676
+ * evaluates for itself on the GPU. Ten repaints a second of a one-stack style
2677
+ * is ~17 ms each (#1769); this is the budget that made flashing affordable.
2678
+ * Ten hertz quantises a VQ (0.2 s on) to two ticks, which reads as quick
2679
+ * flashing rather than as its exact rate; that is the accepted cost.
2680
+ */
2681
+ /** The most terms a `SIGSEQ` may have and still be drawn. Twelve pairs. */
2682
+ declare const SIGSEQ_MAX_TERMS = 24;
2683
+ /**
2684
+ * How far the segment sum may differ from `SIGPER` and still be believed.
2685
+ * `SIGSEQ` is published to 0.1 s per term, so a handful of terms can round
2686
+ * apart by a few hundredths. FlashPattern.swift:117-121.
2687
+ */
2688
+ declare const SIGPER_TOLERANCE_SECONDS = 0.06;
2689
+ /** The lamp tick. */
2690
+ declare const LAMP_TICK_MS = 100;
2691
+ type SigseqRefusal = "malformed" | "nonPositiveDuration" | "sigperMismatch";
2692
+ interface SigseqTerm {
2693
+ readonly seconds: number;
2694
+ /** True for a lit segment, false for an eclipse. */
2695
+ readonly isOn: boolean;
2696
+ }
2697
+ interface ParsedSigseqTerms {
2698
+ readonly phases: readonly SigseqTerm[];
2699
+ readonly periodSeconds: number;
2700
+ /** True when `SIGPER` was present and the sum agreed with it. */
2701
+ readonly checkedAgainstSigper: boolean;
2702
+ }
2703
+ /**
2704
+ * Parse a `SIGSEQ` against its `SIGPER`. Refuses rather than guesses: a
2705
+ * malformed term, a zero-length segment, or a sum that disagrees with the
2706
+ * charted period is a data anomaly and must not be drawn.
2707
+ */
2708
+ declare function parseSigseqTerms(sigseq: unknown, sigper: number | null): ParsedSigseqTerms | {
2709
+ readonly refusal: SigseqRefusal | "absent";
2710
+ };
2711
+ /**
2712
+ * The feature properties a lamp needs to flash on the GPU: `rp` the period,
2713
+ * `rn` the term count, `r{k}` the cumulative end of term k in seconds,
2714
+ * `o{k}` 1 for lit / 0 for eclipse, `c{k}` the colour of a lit term. Lit
2715
+ * terms cycle through `onColoursHex` — that is how `Al WR` alternates.
2716
+ * `rn: 0` is a steady light: `lampRhythmOpacity` treats it as always on.
2717
+ */
2718
+ declare function rhythmProperties(parsed: ParsedSigseqTerms | null, onColoursHex: readonly string[]): Record<string, number | string>;
2719
+ /**
2720
+ * `circle-opacity` at `nowSeconds` for every lamp at once: `base` while the
2721
+ * lamp's current term is lit, 0 in an eclipse, `base` for a steady light.
2722
+ * Terms are tested in order against their cumulative ends; a light with
2723
+ * fewer than `SIGSEQ_MAX_TERMS` terms leaves the later `r{k}` absent, which
2724
+ * `coalesce`s to a sentinel the phase can never reach.
2725
+ */
2726
+ declare function lampRhythmOpacity(nowSeconds: number, base: number): unknown[];
2727
+ /**
2728
+ * `circle-color` at `nowSeconds`: the lit term's colour, so an alternating
2729
+ * light changes colour flash by flash; `fallback` (the light's colour
2730
+ * expression) for a steady light or an eclipse.
2731
+ */
2732
+ declare function lampRhythmColour(nowSeconds: number, fallback: unknown): unknown[];
2733
+
2530
2734
  /**
2531
2735
  * CHRTinteract — productized click-to-inspect for CHRT charts.
2532
2736
  *
@@ -3280,6 +3484,8 @@ interface PmtilesVectorSource {
3280
3484
  tiles: string[];
3281
3485
  minzoom: number;
3282
3486
  maxzoom: number;
3487
+ /** The credit a renderer shows for this source (MapLibre's attribution control). */
3488
+ attribution?: string;
3283
3489
  }
3284
3490
  /**
3285
3491
  * Terrarium elevation, served as PNG from `CHRT_RELIEF`. Separate from the
@@ -3294,6 +3500,8 @@ interface RasterDemSource {
3294
3500
  tileSize: number;
3295
3501
  minzoom: number;
3296
3502
  maxzoom: number;
3503
+ /** The credit a renderer shows for this source (MapLibre's attribution control). */
3504
+ attribution?: string;
3297
3505
  }
3298
3506
  type VectorSourceSpec = MapboxVectorSource | PmtilesVectorSource;
3299
3507
  type AnySourceSpec = VectorSourceSpec | RasterDemSource;
@@ -3314,6 +3522,40 @@ declare const BASE_REGION = "CHRT_BASE";
3314
3522
  */
3315
3523
  declare const BASE_MINZOOM = 0;
3316
3524
  declare const BASE_MAXZOOM = 11;
3525
+ /**
3526
+ * The credit the ONLINE CHRT_BASE source carries (owner wording, 2026-09-16).
3527
+ *
3528
+ * OpenStreetMap is named because the online archive's z9–11 detail tier IS
3529
+ * OSM-derived inland water (ODbL, `public/chrtbase-derivation.json`). The
3530
+ * app-embeddable offline bundle is a z0–6 cut that contains no OSM data and
3531
+ * carries `BASE_BUNDLE_ATTRIBUTION` instead (base-layers.ts) — one credit per
3532
+ * artefact, each naming exactly the data it holds.
3533
+ */
3534
+ declare const BASE_ATTRIBUTION = "\u00A9 CHRT \u00B7 Made with Natural Earth \u00B7 \u00A9 OpenStreetMap contributors";
3535
+ /**
3536
+ * The credit the CHRT_LAND source carries. CHRTland's land, land use, roads,
3537
+ * places, peaks and marinas are OpenStreetMap via the Protomaps planet, and the
3538
+ * ODbL requires this notice wherever the map is shown (.chrt/legal.md
3539
+ * "Required notices"). Its other inputs — the ENC's charted land, USGS 3DEP
3540
+ * contours, GNIS names — are US federal public domain and owe none. Same
3541
+ * string as the offline land bundle's (offline-worker `LAND_PROVENANCE`).
3542
+ */
3543
+ declare const LAND_ATTRIBUTION = "\u00A9 OpenStreetMap contributors";
3544
+ /**
3545
+ * The credit the CHRT_RELIEF source carries. USGS 3DEP elevation, public
3546
+ * domain (17 U.S.C. § 105) — no notice is required, so this is a courtesy that
3547
+ * names the source. There is no OpenStreetMap in it.
3548
+ */
3549
+ declare const RELIEF_ATTRIBUTION = "Elevation: USGS 3D Elevation Program";
3550
+ /** Terrarium tiles are 512 px; the default 256 would halve the apparent relief. */
3551
+ declare const RELIEF_TILE_SIZE = 512;
3552
+ /**
3553
+ * How `CHRT_RELIEF`'s PNGs encode elevation. MapLibre's raster-dem default is
3554
+ * `mapbox`, which decodes terrarium RGB into nonsense heights — so every
3555
+ * surface that describes this source (this registry, the tile-worker's
3556
+ * TileJSON) has to say it.
3557
+ */
3558
+ declare const RELIEF_ENCODING = "terrarium";
3317
3559
  type SourceMode = "mapbox" | "pmtiles";
3318
3560
  /**
3319
3561
  * Query parameter carrying the resolved build id on every tile URL.
@@ -4167,6 +4409,91 @@ declare const BUILD_MAXZOOM = 14;
4167
4409
  */
4168
4410
  declare const LAND_BUILD_MAXZOOM = 14;
4169
4411
 
4412
+ /**
4413
+ * The CHRT_BASE BUNDLE — the app-embeddable world basemap, and the style
4414
+ * surgery that draws a chart over it with no network at all (CHRTsail #814).
4415
+ *
4416
+ * ── What the bundle is ──────────────────────────────────────────────────────
4417
+ *
4418
+ * A z0–6 cut of the CHRT_BASE archive holding FOUR Natural Earth layers:
4419
+ * the landmass, world lakes, the admin-0 outline and land borders. Measured
4420
+ * 2026-09-16: 3,319 tiles, 5.28 MB MBTiles / 4.21 MB PMTiles. An app may ship
4421
+ * it inside its binary (owner, 2026-09-16: any CHRT API key, attribution
4422
+ * shown, no resale as a standalone dataset).
4423
+ *
4424
+ * ── What it deliberately is NOT ─────────────────────────────────────────────
4425
+ *
4426
+ * No `jurisdiction`, no `state_*`, no `inland_water*`, no `base_river`. Owner
4427
+ * decision 2026-09-16, and the reason is sovereignty, not size: every one of
4428
+ * those layers is shaped by WHICH countries CHRT carries charts for
4429
+ * (`JURISDICTION_ISO_BY_SOURCE`), and that list changes when a source goes
4430
+ * live — or is withdrawn. A copy compiled into an app binary cannot heartbeat.
4431
+ * A stale one that still painted a withdrawn country tan would claim coverage
4432
+ * the live service no longer claims. The neutral four layers are geography
4433
+ * only; they assert nothing about CHRT, so a bundled copy can be old without
4434
+ * being wrong, and it never expires.
4435
+ *
4436
+ * The cost is honest and stated in the docs: offline, the "ours, not yet
4437
+ * charted" tan does not exist. Uncharted land and water read as no coverage
4438
+ * (the crosshatch), and charted water still paints its ground from the CHART
4439
+ * bundle's own `M_COVR` — the chart is what claims coverage, never the base.
4440
+ *
4441
+ * ── No OpenStreetMap, by construction ───────────────────────────────────────
4442
+ *
4443
+ * The archive's OSM-derived detail tier is tiled from z9 (`build.mjs`
4444
+ * DETAIL_MINZOOM), so no z≤6 tile can contain it, and none of the four layers
4445
+ * is a detail-tier layer name. `tools/chrtbase-build/chrtbase.test.mjs` pins
4446
+ * both. Hence the bundle credit names Natural Earth only.
4447
+ */
4448
+ /** The bundle id in the offline catalogue — the same string as the source. */
4449
+ declare const BASE_BUNDLE_ID = "CHRT_BASE";
4450
+ /**
4451
+ * The bundle's layer contract version. Bumped only when the SET of layers or
4452
+ * their meaning changes — never per build — so a bundle shipped in an app
4453
+ * keeps rendering under every offline style that declares the same schema.
4454
+ */
4455
+ declare const BASE_BUNDLE_SCHEMA = "chrt.basemap-bundle/1";
4456
+ /** The cut's zoom ceiling. Above it MapLibre overzooms z6 — geography only. */
4457
+ declare const BASE_BUNDLE_MAXZOOM = 6;
4458
+ /**
4459
+ * The only source-layers a bundle holds. Everything jurisdiction-shaped is
4460
+ * absent — see the header. Must equal `BUNDLE_LAYERS` in
4461
+ * `tools/chrtbase-build/bundle.mjs` (gated by chrtbase.test.mjs).
4462
+ */
4463
+ declare const BASE_BUNDLE_SOURCE_LAYERS: readonly string[];
4464
+ /** The bundle's credit (owner wording 2026-09-16). Natural Earth only: the cut holds no OSM. */
4465
+ declare const BASE_BUNDLE_ATTRIBUTION = "\u00A9 CHRT \u00B7 Made with Natural Earth";
4466
+ /**
4467
+ * Where a client's OWN raster (satellite, scanned chart, anything) goes in a
4468
+ * `base=1` style: `map.addLayer(yourRaster, BASE_CLIENT_RASTER_BEFORE_ID)`.
4469
+ *
4470
+ * Directly under the no-coverage crosshatch, so the raster replaces the base
4471
+ * geography but can never hide the absence marker, and the chart's
4472
+ * coverage ground and the chart paint over it wherever a chart exists.
4473
+ */
4474
+ declare const BASE_CLIENT_RASTER_BEFORE_ID = "chrtbase-nocoverage";
4475
+ interface StyleLike {
4476
+ sources: Record<string, unknown>;
4477
+ layers: unknown[];
4478
+ }
4479
+ /**
4480
+ * Point a `generateStyle(…, { base: true })` document at a local CHRT_BASE
4481
+ * bundle, and drop every base layer the bundle cannot feed.
4482
+ *
4483
+ * Mutates and returns `style` (the same convention as `applyS101SymbolSet`).
4484
+ * Order is untouched: the kept layers stay exactly where the online style
4485
+ * puts them, so the offline document is the online one minus the
4486
+ * jurisdiction-shaped layers.
4487
+ *
4488
+ * Layers are dropped rather than left pointing at absent source-layers: a
4489
+ * layer that silently draws nothing is how a style looks complete while it
4490
+ * is not, and a future bundle carrying a layer of that name must not light
4491
+ * one up under an old style.
4492
+ */
4493
+ declare function applyBaseBundle<T extends StyleLike>(style: T, opts: {
4494
+ tiles: string;
4495
+ }): T;
4496
+
4170
4497
  /**
4171
4498
  * CHRTstyle custom styles — the customer-facing map_styles config applied
4172
4499
  * on top of the generated S-52 style.
@@ -4375,6 +4702,193 @@ declare function generateCustomStyle(config: CustomStyleConfig, opts?: GenerateC
4375
4702
  bandFan?: "collapsed" | "legacy";
4376
4703
  }): GeneratedCustomStyle;
4377
4704
 
4705
+ /**
4706
+ * DRAPED LAYERS FIRST — the one ordering rule that makes 3D terrain affordable.
4707
+ *
4708
+ * ===========================================================================
4709
+ * 1 · WHAT MAPLIBRE DOES WITH THE LAYER ORDER WHEN TERRAIN IS ON
4710
+ * ===========================================================================
4711
+ *
4712
+ * With `map.setTerrain(...)` set, MapLibre GL JS (5.24, `render_to_texture.ts`)
4713
+ * cannot draw fills and lines straight to the screen: it renders them into a
4714
+ * texture per terrain tile and drapes that texture over the mesh. Only
4715
+ * `background`, `fill`, `line`, `raster`, `hillshade` and `color-relief` are
4716
+ * drapeable; `symbol`, `circle`, `fill-extrusion` and `heatmap` are drawn
4717
+ * directly, depth-tested against the terrain.
4718
+ *
4719
+ * It walks the style in order and cuts a new "stack" every time a
4720
+ * non-drapeable layer sits between two drapeable ones. Then, per frame, FOR
4721
+ * EVERY STACK it (a) renders that stack's layers into a texture for every
4722
+ * visible terrain tile and (b) draws every tile's full mesh — 128×128×2 =
4723
+ * 32,768 triangles — with that texture. The texture cache is a 30-slot LRU
4724
+ * pool that is freed after every stack, so with two or more stacks NO texture
4725
+ * survives to the next frame: everything is re-rendered, every frame.
4726
+ *
4727
+ * The chart interleaves symbols with fills and lines per band, so at z12+ it
4728
+ * produced **130 stacks** across 1,313 visible layers. Measured 2026-09-11 at
4729
+ * Mount Desert, 1100×800, pitch 45, 6 terrain tiles, a 4 s pan:
4730
+ *
4731
+ * interleaved order 130 stacks 37 ms/frame (1,015 ms cold, while
4732
+ * tiles were still arriving)
4733
+ * draped-first order 1 stack 17 ms/frame — identical to the 2D chart
4734
+ *
4735
+ * The cold figure is the one the owner reported as "SUPER slow" and "crashes
4736
+ * the web app if you try to pan": every arriving tile invalidates its
4737
+ * textures, the frame takes a second, and the browser's GPU watchdog takes
4738
+ * the context. Halving the mesh (`meshSize` 64) and capping tile LOD
4739
+ * (`setSourceTileLodParams`) were measured in the same run and moved nothing;
4740
+ * the multiplier is the stack count, and only the layer order sets it.
4741
+ *
4742
+ * ===========================================================================
4743
+ * 2 · WHY THIS IS SAFE TO APPLY TO THE 2D CHART TOO, AND WHY IT MUST BE
4744
+ * ===========================================================================
4745
+ *
4746
+ * It must be, because the app's layer set is constant after boot
4747
+ * (`constant-layer-set.ts`): layers are added once in style order and never
4748
+ * moved — `moveLayer` forces a full symbol placement and was removed for that
4749
+ * reason. A terrain-only order would mean a remount on every mode switch.
4750
+ *
4751
+ * It is safe because moving every symbol and circle above every fill and line
4752
+ * is what S-52 asks for anyway: display priority draws areas, then lines, then
4753
+ * point symbols, then text. The only pixels that change are where a symbol
4754
+ * used to sit UNDER a later line or fill. Measured on live prod tiles, same
4755
+ * archive, six views: 0.1–0.3 % of pixels at Martha's Vineyard z9.4, Bath
4756
+ * z14.2, the Columbia z9.4, Chicago z13.4 and Mount Desert z12.2, and 2.7 % at
4757
+ * Boston Harbor z11.4 — all antialiasing-scale tone shifts where a symbol's
4758
+ * edge now lies over a magenta line or a black outline. The two Boston frames
4759
+ * are indistinguishable by eye.
4760
+ *
4761
+ * What the partition deliberately preserves:
4762
+ * · relative order WITHIN the drapeable set — so every ground-order rule in
4763
+ * this generator (base block under the chart, relief last over ground, the
4764
+ * repaint clones, the country border on top of the fills) holds unchanged;
4765
+ * · relative order WITHIN the non-drapeable set — a symbol's collision
4766
+ * priority is its array position among symbols, so the major-city and
4767
+ * port-town hoists still place first.
4768
+ *
4769
+ * A stable partition is the whole algorithm. It is applied LAST in
4770
+ * `generateStyle`, after every hoist, so nothing can interleave again behind
4771
+ * its back; `terrain-order.test.ts` pins the single-stack property on the
4772
+ * generated style.
4773
+ */
4774
+ /**
4775
+ * Layer types MapLibre renders to texture under terrain
4776
+ * (`LAYERS_TO_TEXTURES` in `render_to_texture.ts`, 5.24).
4777
+ */
4778
+ declare const DRAPEABLE_LAYER_TYPES: ReadonlySet<string>;
4779
+ /** True for a layer MapLibre drapes over terrain rather than drawing directly. */
4780
+ declare function isDrapeable(layer: {
4781
+ type: string;
4782
+ }): boolean;
4783
+ /**
4784
+ * Stable partition: every drapeable layer, in its existing order, then every
4785
+ * other layer, in its existing order. Returns a new array.
4786
+ */
4787
+ declare function drapedFirst<T extends {
4788
+ type: string;
4789
+ }>(layers: readonly T[]): T[];
4790
+ /**
4791
+ * The number of render-to-texture stacks MapLibre would cut for this order —
4792
+ * the multiplier on every per-frame terrain cost. 1 is the floor; anything
4793
+ * above it means a non-drapeable layer sits between two drapeable ones.
4794
+ */
4795
+ declare function terrainStackCount<T extends {
4796
+ type: string;
4797
+ }>(layers: readonly T[]): number;
4798
+ /**
4799
+ * The two halves the partition produces, for tests that assert an ORDER
4800
+ * invariant. After the partition, cross-half order carries no paint meaning
4801
+ * (every direct layer is above every draped one by construction), so a rule
4802
+ * like "band N+1 after band N" or "the base block under everything" is stated
4803
+ * per half — index positions here are positions WITHIN the half.
4804
+ */
4805
+ declare function drapeHalves<T extends {
4806
+ type: string;
4807
+ }>(layers: readonly T[]): {
4808
+ draped: T[];
4809
+ direct: T[];
4810
+ };
4811
+
4812
+ /**
4813
+ * LAMPS — lighted aids to navigation drawn as the lights they are at night.
4814
+ *
4815
+ * Owner, 2026-09-11: *"when you're in night mode, it will show you the lights
4816
+ * from the lighted AtoNs as they look in front of you all the way to the
4817
+ * horizon"* — the view horizon mode (`chrome/horizon.ts`) was built for.
4818
+ *
4819
+ * ===========================================================================
4820
+ * 1 · WHAT A LAMP IS, AND WHAT IT IS NOT
4821
+ * ===========================================================================
4822
+ *
4823
+ * S-52 draws a light as a magenta FLARE beside its structure — an annotation
4824
+ * that says "there is a light here" and, through LIGHTS05/06, what colour it
4825
+ * is. That is the daytime chart's job and it stays. A lamp is the other
4826
+ * thing: a point of light, the colour the light actually shows, sized by how
4827
+ * far it carries, drawn on top of everything, and — because it is a `circle`
4828
+ * layer and not draped — depth-tested against the terrain, so a light behind a
4829
+ * headland is hidden by the headland exactly as it is from the deck.
4830
+ *
4831
+ * Two circles per light: a wide, soft GLOW at low opacity and a small, hard
4832
+ * CORE at full. That is how a distant light reads to the eye — a halo with a
4833
+ * pinprick in it — and two layers is what MapLibre needs to draw it, since one
4834
+ * circle has one blur.
4835
+ *
4836
+ * ===========================================================================
4837
+ * 2 · COLOUR, SIZE, AND WHAT IS DELIBERATELY NOT MODELLED
4838
+ * ===========================================================================
4839
+ *
4840
+ * · COLOUR is `lightFillExpression` — the same LIGHTS05 reading the flare
4841
+ * uses, so a lamp and its flare cannot disagree about red and green.
4842
+ * · SIZE is the nominal range `VALNMR`, in nautical miles: a 20 nm light is
4843
+ * bigger and brighter than a 4 nm one. It is a monotone ramp and not a
4844
+ * model of luminous intensity, because the chart carries no intensity.
4845
+ * · The CHARACTERISTIC (`LITCHR` / `SIGPER`) is NOT animated here. Every lamp
4846
+ * is steady. Flashing would need a per-frame paint update across the whole
4847
+ * style, and the cost of that is the thing #1769 just removed; it is a
4848
+ * separate decision with its own measurement.
4849
+ * · DISTANCE from the observer is not modelled either: a 4 nm light 12 nm
4850
+ * away still draws. A style expression cannot know where the camera is.
4851
+ *
4852
+ * ===========================================================================
4853
+ * 3 · OFF BY DEFAULT, AND SHOWN BY THE APP
4854
+ * ===========================================================================
4855
+ *
4856
+ * The layers ship in every generated style with `visibility: "none"`, the way
4857
+ * the sector arcs do, so the app can switch them without an `addLayer` — its
4858
+ * layer set is constant after boot. `ChartCanvas` shows them for horizon mode
4859
+ * in the night palette (`lamps` prop). Native clients receive them hidden.
4860
+ *
4861
+ * Every band's lights draw: the fan-out that dedupes overlapping cells is not
4862
+ * applied, because at horizon distances the far tiles are coarse and a
4863
+ * dominance filter would hide a band-4 lighthouse whose band-5 twin is in a
4864
+ * tile that is not loaded. Where two cells carry the same light the glow is
4865
+ * simply brighter, which is the failure to prefer.
4866
+ */
4867
+
4868
+ /**
4869
+ * `s52-LIGHTS-` on purpose: the P6 sector-light z-order guard reads that prefix
4870
+ * as "LIGHTS geometry", which is what a lamp is — it rides on the flares, above
4871
+ * every other feature and below the labels, in both render modes.
4872
+ */
4873
+ declare const LAMP_GLOW_LAYER_ID = "s52-LIGHTS-lamp-glow";
4874
+ declare const LAMP_CORE_LAYER_ID = "s52-LIGHTS-lamp-core";
4875
+ /** The layers the app flips together. Both or neither. */
4876
+ declare const LAMP_LAYER_IDS: readonly ["s52-LIGHTS-lamp-glow", "s52-LIGHTS-lamp-core"];
4877
+ interface LampLayer {
4878
+ readonly id: string;
4879
+ readonly type: "circle";
4880
+ readonly source: string;
4881
+ readonly "source-layer": "LIGHTS";
4882
+ readonly filter: unknown[];
4883
+ readonly layout: {
4884
+ readonly visibility: "none";
4885
+ };
4886
+ readonly paint: Record<string, unknown>;
4887
+ readonly metadata: Record<string, unknown>;
4888
+ }
4889
+ /** The two lamp layers for this source and palette. Glow first, core on top. */
4890
+ declare function buildLampLayers(sourceId: string, ct: ColorTableName): LampLayer[];
4891
+
4378
4892
  /**
4379
4893
  * Generic async auto-pagination generator.
4380
4894
  *
@@ -4765,4 +5279,4 @@ declare class Chrt {
4765
5279
  warmTiles(region?: string): Promise<TileTokenResponse>;
4766
5280
  }
4767
5281
 
4768
- export { ALL_NAV_AID_LAYERS, ALL_WATER_BODY_LAYERS, AREA_QUERY_LAYERS, ATON_EXPRESSION_CLASSES, type AheadCoverageCell, type AheadFeatureProperties, type AheadOptions, type AheadResponse, type AlongRouteFeatureProperties, type AlongRouteOptions, type AlongRouteResponse, type AreaInspectResult, type AtlasStyle, type AttachOptions, BAND_DRAW_ORDER, BAND_PRIORITY_RANGES, BASE_MAXZOOM, BASE_MINZOOM, BASE_REGION, type BBox, BRIDGE_QUERY_LAYERS, BUILD_MAXZOOM, BUILD_MINZOOM, BUILD_PARAM, type BandCode, type BandPriorityRange, type BridgeInspectResult, type BuildOfflineStyleOptions, type BuildSourcesOptions, CHART_BAND_CODES, CHART_CASCADE_CODES, CHART_SECTIONS, CHRTRASTER_REF_CROPS, CHRTRASTER_SVGS, CHRT_ATON_COLORS, CHRT_GLYPH_NAMES, CHRT_GLYPH_SVGS, CHRT_ICON_EXPRESSIONS, CHRT_ICON_PREFIX, CHRT_SDF_GLYPHS, CHRT_STYLE_MODES, type CandidateQueryOptions, type CandidatesEventContext, type CellDeletedEvent, type CellDetail, type CellEventData, type CellNewEvent, type CellUpdatedData, type CellUpdatedEvent, type CellsOptions, type CellsResponse, type ChartSection, Chrt, type ChrtConfig, ChrtError, type ChrtStyleMode, type ChrtStyleOptions, type ChrtStyleTheme, type ChrtSymbolSet, type ClickAnchor, ColorTableName, type CoverageOptions, type CoverageResponse, type CoverageRouteCell, type CoverageRouteOptions, type CoverageRouteResponse, type CoverageSource, type CustomStyleConfig, DEFAULT_CLICK_TOLERANCE, DEFAULT_CUSTOM_STYLE_CONFIG, DEFAULT_INSPECT_CLASS_RANK, DEFAULT_LABEL_SETTINGS, DEFAULT_NAV_AID_SETTINGS, DEFAULT_REGION, DEFAULT_SAFETY_CONTOUR_M, DEFAULT_SOUNDING_SETTINGS, DEFAULT_TILE_BASE_URL, DEFAULT_TILE_REGION, DEFAULT_WATER_BODY_SETTINGS, type DecodedAreaFeature, type DecodedBridge, type DecodedNavAid, type DecodedProperty, type DisplayCategory, type DisplayMode, type FeatureCollection, type FeaturesOptions, type FetchStyleOptions, FileSystemAdapter, type FlashPattern, type FlashPhase, type GenerateCustomStyleOptions, type GeneratedCustomStyle, type GeoJsonFeature, type GeoJsonGeometry, type GeomType, INSPECT_CLASS_RANK, INSPECT_RANK_DEVIATIONS, type InspectCandidate, type InspectCandidateSet, type InspectEnrichment, type InspectEventContext, type InspectNotice, type InspectOptions, type InspectResult, type InspectTargetClass, type InspectableFeature, InteractClient, type InteractEntitlement, InteractError, type InteractErrorCode, type InteractHandle, type InteractMapLike, type InteractMapMouseEvent, LABELED_LAYERS, LABEL_BEHAVIOR, LABEL_LAYER_GROUPS, LABEL_PRIORITY, LAND_BUILD_MAXZOOM, LAND_REGION, type LabelBehavior, type LabelConfigOptions, type LabelLayerConfig, type LabelSettings, type LookupEntry, type MapLibreStyle, type MapboxStyle, type MapboxVectorSource, type MarineAlert, type MarineAlertsOptions, type MarineAlertsResponse, type MarineConditionsOptions, type MarineConditionsResponse, type MarineForecastOptions, type MarineForecastPeriod, type MarineForecastResponse, type MarineSeas, type MarineStation, type MarineSwellTrain, type MarineWind, type MarineZoneRef, NAUTICAL_SYMBOLS, NAV_AID_LAYER_GROUPS, NAV_AID_QUERY_LAYERS, NON_SOLAS_DISCLAIMER, NON_SOLAS_DISCLAIMER_SHORT, type NauticalCategory, type NauticalSymbol, type NavAidInspectResult, type NavAidSettings, type NearbyMarineStation, type OfflineBundleResponse, type OfflineDownloadOptions, type OfflineDownloadProgress, type OfflineDownloadResult, OfflineError, type OfflineErrorCode, type OfflineFetchStyleOptions, type OfflineHeartbeatOptions, type OfflineRegionSummary, type OfflineRemoveOptions, OfflineStyleError, type OfflineStylePlatform, type OfflineStyleResponse, PLACENAME_LAND_CLASSES, PLACENAME_SOURCE_LAYER, PLACENAME_WATER_CLASSES, type PmtilesVectorSource, type Poi, type PoiCoverage, type PoiDataset, type PoiOptions, type PoiResponse, type QueryFeatureProperties, type QueryOptions, type QueryResponse, RASTER_ATON_CLASSES, RASTER_GLYPH_NAMES, RASTER_ICON_PREFIX, RELIEF_REGION, type ResolvedStyle, type ResolvedTheme, type S101ArtworkProvenance, type S101Feature, S101_AREA_FILL_NAMES, S101_CHART_SECTIONS, S101_FEATURES, S101_ICON_PREFIX, S101_LINE_STYLE_NAMES, S101_NEW_SYMBOLS, S101_NO_OFFICIAL_COUNTERPART, S101_SOURCE_COMMIT, S101_SYMBOL_GROUPS, S101_SYMBOL_NAMES, S52_ATON_LOOKUPS, S52_ATON_LOOKUPS_PAPER, S52_DRAW_ORDER, S52_LOOKUP, S52_PATTERN_SPRITE_PREFIX, SOUNDING_LAYERS, SYMBOL_FAMILIES, SYMBOL_FAMILY_META, SYMBOL_GROUPS, SYMBOL_MAP, type ScaleBand, type SearchCoverageNotice, type SearchHit, type SearchOptions, type SearchResponse, type SectorArcFeature, type SectorArcFeatureCollection, type SectorInfo, type SoundingSettings, type SourceMode, type StyleGeneratorOptions, type StyleLayer, type StyleUrlOptions, type SymbolFamily, type SymbolFamilyMeta, type SymbolGroup, TileAuth, type TileGroup, type TileGroupsResponse, TileTokenError, type TileTokenErrorCode, type TileTokenResponse, type TransformRequest, type TransformedRequest, type VectorSourceSpec, type VesselProfile, WATER_BODY_LAYER_GROUPS, type WaterBodySettings, WeatherEndpoint, type WeatherReading, type WebhookEvent, type WebhookEventType, type WebhookPayload, applyChrtSymbolSet, applyColorTheme, applyCustomStyleSettings, applyRasterSymbolSet, applyS101SymbolSet, atonIconExpression, bandFilterExpression, buildAirportTierExpression, buildBuiltUpAreaTierExpression, buildFlashPattern, buildLabelLayer, buildLakeTierExpression, buildLandAreaTierExpression, buildLandRegionTierExpression, buildLayersForClass, buildOfflineStyle, buildPlaceNameLayers, buildRiverTierExpression, buildSeaAreaTierExpression, buildSectorArcGeoJSON, buildSectorArcsFC, buildSectorsFromFeatures, buildSources, candidateRank, chrtAtonTintExpression, chrtLightTintExpression, collectCandidates, collectClickCandidates, combineWithBandFilter, daymarkColor, decimateFeatures, decodeAreaFeatureProps, decodeBridgeProps, decodeCandidate, decodeNavAidProps, depareColor, depareFillExpression, deriveMarinerName, extractNavAidDesignation, featureIdentity, generateCustomStyle, generateSpriteManifest, generateSpriteSheet, generateStyle, generateStyleJSON, getAvailableLineSymbols, getAvailablePatterns, getAvailablePointSymbols, getCollisionSettings, getDrawPriority, getGridSizeForZoom, getIconExpression, getLabelBehavior, getLabelConfig, getLabelPriority, getLookupEntry, getMaxCellsForZoom, getOrderedClasses, getRasterSvg, getS52SvgString, getS52SymbolStats, getStyleStats, getSymbolSvgString, getThemedS101Svg, getThemedS52Svg, getTopmarkMeaning, hazardColor, hazardFillExpression, iconExpressionForFamily, isLabelLayerVisible, isNavAidLayer, isNavAidLayerVisible, isSoundingLayerVisible, isVisibleInMode, isWaterBodyLayerVisible, labelSortKey, lateralColor, lateralFillExpression, lightColor, lightFillExpression, lightsIconExpression, normalizeStyleMode, normalizeTheme, paginate, parseListCodes, parseSymbolFamily, parseWebhook, patternSpriteId, preprocessLights, preprocessNavAids, preprocessSoundings, preprocessWaterBodies, rasterAtonIconExpression, resolveCustomTheme, resolveRasterImage, resolveS101Color, resolveStyle, resolveTargetClass, s101ArtworkProvenance, sanitizeCustomStyleConfig, scaleSizeValue, scaminToMinZoom, sectorLimitToArcBearing, styleModeBand, tileTemplate, uncoveredSectorArcs, withinBboxFilter, worldMinusBboxPolygon };
5282
+ export { ALL_NAV_AID_LAYERS, ALL_WATER_BODY_LAYERS, AREA_QUERY_LAYERS, ATON_EXPRESSION_CLASSES, type AheadCoverageCell, type AheadFeatureProperties, type AheadOptions, type AheadResponse, type AlongRouteFeatureProperties, type AlongRouteOptions, type AlongRouteResponse, type AreaInspectResult, type AtlasStyle, type AttachOptions, BAND_CODE_ALIASES, BAND_DRAW_ORDER, BAND_PRIORITY_RANGES, BASE_ATTRIBUTION, BASE_BUNDLE_ATTRIBUTION, BASE_BUNDLE_ID, BASE_BUNDLE_MAXZOOM, BASE_BUNDLE_SCHEMA, BASE_BUNDLE_SOURCE_LAYERS, BASE_CLIENT_RASTER_BEFORE_ID, BASE_MAXZOOM, BASE_MINZOOM, BASE_REGION, type BBox, BRIDGE_QUERY_LAYERS, BUILD_MAXZOOM, BUILD_MINZOOM, BUILD_PARAM, type BandCode, type BandPriorityRange, type BridgeInspectResult, type BuildOfflineStyleOptions, type BuildSourcesOptions, CHART_BAND_CODES, CHART_CASCADE_CODES, CHART_SECTIONS, CHRTRASTER_REF_CROPS, CHRTRASTER_SVGS, CHRT_ATON_COLORS, CHRT_GLYPH_NAMES, CHRT_GLYPH_SVGS, CHRT_ICON_EXPRESSIONS, CHRT_ICON_PREFIX, CHRT_SDF_GLYPHS, CHRT_STYLE_MODES, type CandidateQueryOptions, type CandidatesEventContext, type CellDeletedEvent, type CellDetail, type CellEventData, type CellNewEvent, type CellUpdatedData, type CellUpdatedEvent, type CellsOptions, type CellsResponse, type ChartSection, Chrt, type ChrtConfig, ChrtError, type ChrtStyleMode, type ChrtStyleOptions, type ChrtStyleTheme, type ChrtSymbolSet, type ClickAnchor, ColorTableName, type CoverageOptions, type CoverageResponse, type CoverageRouteCell, type CoverageRouteOptions, type CoverageRouteResponse, type CoverageSource, type CustomStyleConfig, DEFAULT_CLICK_TOLERANCE, DEFAULT_CUSTOM_STYLE_CONFIG, DEFAULT_INSPECT_CLASS_RANK, DEFAULT_LABEL_SETTINGS, DEFAULT_NAV_AID_SETTINGS, DEFAULT_REGION, DEFAULT_SAFETY_CONTOUR_M, DEFAULT_SOUNDING_SETTINGS, DEFAULT_TILE_BASE_URL, DEFAULT_TILE_REGION, DEFAULT_WATER_BODY_SETTINGS, DRAPEABLE_LAYER_TYPES, type DecodedAreaFeature, type DecodedBridge, type DecodedNavAid, type DecodedProperty, type DisplayCategory, type DisplayMode, type FeatureCollection, type FeaturesOptions, type FetchStyleOptions, FileSystemAdapter, type FlashPattern, type FlashPhase, type GenerateCustomStyleOptions, type GeneratedCustomStyle, type GeoJsonFeature, type GeoJsonGeometry, type GeomType, INSPECT_CLASS_RANK, INSPECT_RANK_DEVIATIONS, type InspectCandidate, type InspectCandidateSet, type InspectEnrichment, type InspectEventContext, type InspectNotice, type InspectOptions, type InspectResult, type InspectTargetClass, type InspectableFeature, InteractClient, type InteractEntitlement, InteractError, type InteractErrorCode, type InteractHandle, type InteractMapLike, type InteractMapMouseEvent, LABELED_LAYERS, LABEL_BEHAVIOR, LABEL_LAYER_GROUPS, LABEL_PRIORITY, LAMP_CORE_LAYER_ID, LAMP_GLOW_LAYER_ID, LAMP_LAYER_IDS, LAMP_TICK_MS, LAND_ATTRIBUTION, LAND_BUILD_MAXZOOM, LAND_REGION, type LabelBehavior, type LabelConfigOptions, type LabelLayerConfig, type LabelSettings, type LampLayer, type LookupEntry, type MapLibreStyle, type MapboxStyle, type MapboxVectorSource, type MarineAlert, type MarineAlertsOptions, type MarineAlertsResponse, type MarineConditionsObservation, type MarineConditionsOptions, type MarineConditionsResponse, type MarineConditionsSeries, type MarineForecastOptions, type MarineForecastPeriod, type MarineForecastResponse, type MarineSeas, type MarineStation, type MarineSwellTrain, type MarineWind, type MarineZoneRef, NAUTICAL_SYMBOLS, NAV_AID_LAYER_GROUPS, NAV_AID_QUERY_LAYERS, NON_SOLAS_DISCLAIMER, NON_SOLAS_DISCLAIMER_SHORT, type NauticalCategory, type NauticalSymbol, type NavAidInspectResult, type NavAidSettings, type NearbyMarineStation, type OfflineBundleResponse, type OfflineDownloadOptions, type OfflineDownloadProgress, type OfflineDownloadResult, OfflineError, type OfflineErrorCode, type OfflineFetchStyleOptions, type OfflineHeartbeatOptions, type OfflineRegionSummary, type OfflineRemoveOptions, OfflineStyleError, type OfflineStylePlatform, type OfflineStyleResponse, PLACENAME_LAND_CLASSES, PLACENAME_SOURCE_LAYER, PLACENAME_WATER_CLASSES, type ParsedSigseqTerms, type PmtilesVectorSource, type Poi, type PoiCoverage, type PoiDataset, type PoiOptions, type PoiResponse, type QueryFeatureProperties, type QueryOptions, type QueryResponse, RASTER_ATON_CLASSES, RASTER_GLYPH_NAMES, RASTER_ICON_PREFIX, RELIEF_ATTRIBUTION, RELIEF_ENCODING, RELIEF_REGION, RELIEF_TILE_SIZE, type ResolvedStyle, type ResolvedTheme, type S101ArtworkProvenance, type S101Feature, S101_AREA_FILL_NAMES, S101_CHART_SECTIONS, S101_FEATURES, S101_ICON_PREFIX, S101_LINE_STYLE_NAMES, S101_NEW_SYMBOLS, S101_NO_OFFICIAL_COUNTERPART, S101_SOURCE_COMMIT, S101_SYMBOL_GROUPS, S101_SYMBOL_NAMES, S52_ATON_LOOKUPS, S52_ATON_LOOKUPS_PAPER, S52_DRAW_ORDER, S52_LOOKUP, S52_PATTERN_SPRITE_PREFIX, SIGPER_TOLERANCE_SECONDS, SIGSEQ_MAX_TERMS, SOUNDING_LAYERS, SYMBOL_FAMILIES, SYMBOL_FAMILY_META, SYMBOL_GROUPS, SYMBOL_MAP, type ScaleBand, type SearchCoverageNotice, type SearchHit, type SearchOptions, type SearchResponse, type SectorArcFeature, type SectorArcFeatureCollection, type SectorInfo, type SigseqRefusal, type SigseqTerm, type SoundingSettings, type SourceMode, type StyleGeneratorOptions, type StyleLayer, type StyleUrlOptions, type SymbolFamily, type SymbolFamilyMeta, type SymbolGroup, TileAuth, type TileGroup, type TileGroupsResponse, TileTokenError, type TileTokenErrorCode, type TileTokenResponse, type TransformRequest, type TransformedRequest, type VectorSourceSpec, type VesselProfile, WATER_BODY_LAYER_GROUPS, type WaterBodySettings, WeatherEndpoint, type WeatherReading, type WebhookEvent, type WebhookEventType, type WebhookPayload, applyBaseBundle, applyChrtSymbolSet, applyColorTheme, applyCustomStyleSettings, applyRasterSymbolSet, applyS101SymbolSet, atonIconExpression, bandFilterExpression, buildAirportTierExpression, buildBuiltUpAreaTierExpression, buildFlashPattern, buildLabelLayer, buildLakeTierExpression, buildLampLayers, buildLandAreaTierExpression, buildLandRegionTierExpression, buildLayersForClass, buildOfflineStyle, buildPlaceNameLayers, buildRiverTierExpression, buildSeaAreaTierExpression, buildSectorArcGeoJSON, buildSectorArcsFC, buildSectorsFromFeatures, buildSources, candidateRank, cellBandCharacters, cellBandMatch, chrtAtonTintExpression, chrtLightTintExpression, collectCandidates, collectClickCandidates, combineWithBandFilter, daymarkColor, decimateFeatures, decodeAreaFeatureProps, decodeBridgeProps, decodeCandidate, decodeNavAidProps, depareColor, depareFillExpression, deriveMarinerName, drapeHalves, drapedFirst, extractNavAidDesignation, featureIdentity, generateCustomStyle, generateSpriteManifest, generateSpriteSheet, generateStyle, generateStyleJSON, getAvailableLineSymbols, getAvailablePatterns, getAvailablePointSymbols, getCollisionSettings, getDrawPriority, getGridSizeForZoom, getIconExpression, getLabelBehavior, getLabelConfig, getLabelPriority, getLookupEntry, getMaxCellsForZoom, getOrderedClasses, getRasterSvg, getS52SvgString, getS52SymbolStats, getStyleStats, getSymbolSvgString, getThemedS101Svg, getThemedS52Svg, getTopmarkMeaning, hazardColor, hazardFillExpression, iconExpressionForFamily, isDrapeable, isLabelLayerVisible, isNavAidLayer, isNavAidLayerVisible, isSoundingLayerVisible, isVisibleInMode, isWaterBodyLayerVisible, labelSortKey, lampRhythmColour, lampRhythmOpacity, lateralColor, lateralFillExpression, lightColor, lightFillExpression, lightsIconExpression, normalizeStyleMode, normalizeTheme, paginate, parseListCodes, parseSigseqTerms, parseSymbolFamily, parseWebhook, patternSpriteId, preprocessLights, preprocessNavAids, preprocessSoundings, preprocessWaterBodies, rasterAtonIconExpression, resolveCustomTheme, resolveRasterImage, resolveS101Color, resolveStyle, resolveTargetClass, rhythmProperties, s101ArtworkProvenance, sanitizeCustomStyleConfig, scaleSizeValue, scaminToMinZoom, sectorLimitToArcBearing, styleModeBand, terrainStackCount, tileTemplate, uncoveredSectorArcs, withinBboxFilter, worldMinusBboxPolygon };