@chrtco/sdk 0.10.55 → 0.10.57

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.cjs CHANGED
@@ -42,8 +42,11 @@ __export(index_exports, {
42
42
  BUILD_MAXZOOM: () => BUILD_MAXZOOM,
43
43
  BUILD_MINZOOM: () => BUILD_MINZOOM,
44
44
  BUILD_PARAM: () => BUILD_PARAM,
45
+ CHART_ARCHIVE_MAXZOOM: () => CHART_ARCHIVE_MAXZOOM,
45
46
  CHART_BAND_CODES: () => CHART_BAND_CODES,
46
47
  CHART_CASCADE_CODES: () => CHART_CASCADE_CODES,
48
+ CHART_LOCK_BANDS: () => CHART_LOCK_BANDS,
49
+ CHART_LOCK_PARAMS: () => CHART_LOCK_PARAMS,
47
50
  CHART_LOOKS: () => CHART_LOOKS,
48
51
  CHART_SECTIONS: () => CHART_SECTIONS,
49
52
  CHART_SOUNDINGS_RULE: () => CHART_SOUNDINGS_RULE,
@@ -72,6 +75,7 @@ __export(index_exports, {
72
75
  DANGER_DEPTH_PLACER_ID: () => DANGER_DEPTH_PLACER_ID,
73
76
  DANGER_DEPTH_PLACER_LAYOUT: () => DANGER_DEPTH_PLACER_LAYOUT,
74
77
  DANGER_DEPTH_VISIBLE_LAYOUT: () => DANGER_DEPTH_VISIBLE_LAYOUT,
78
+ DEFAULT_CHART_LOCK_BAND: () => DEFAULT_CHART_LOCK_BAND,
75
79
  DEFAULT_CLICK_TOLERANCE: () => DEFAULT_CLICK_TOLERANCE,
76
80
  DEFAULT_CUSTOM_STYLE_CONFIG: () => DEFAULT_CUSTOM_STYLE_CONFIG,
77
81
  DEFAULT_INSPECT_CLASS_RANK: () => DEFAULT_INSPECT_CLASS_RANK,
@@ -93,6 +97,7 @@ __export(index_exports, {
93
97
  EINK_HATCH_PATTERN: () => EINK_HATCH_PATTERN,
94
98
  EINK_MONO_GREYS: () => EINK_MONO_GREYS,
95
99
  ENGRAVED_LOOKS: () => ENGRAVED_LOOKS,
100
+ FINER_DATA_DECISION_OFFSET: () => FINER_DATA_DECISION_OFFSET,
96
101
  HAZARD_LABEL_PRIORITY: () => HAZARD_LABEL_PRIORITY,
97
102
  INSPECT_CLASS_RANK: () => INSPECT_CLASS_RANK,
98
103
  INSPECT_RANK_DEVIATIONS: () => INSPECT_RANK_DEVIATIONS,
@@ -120,6 +125,7 @@ __export(index_exports, {
120
125
  LOOK_TONES: () => LOOK_TONES,
121
126
  LOOK_WATERLINES_SOURCE: () => LOOK_WATERLINES_SOURCE,
122
127
  MAPLIBRE_DEFAULT_TEXT_PADDING_PX: () => MAPLIBRE_DEFAULT_TEXT_PADDING_PX,
128
+ MAX_REDUCTION_LEVELS: () => MAX_REDUCTION_LEVELS,
123
129
  NAUTICAL_SYMBOLS: () => NAUTICAL_SYMBOLS,
124
130
  NAV_AID_LAYER_GROUPS: () => NAV_AID_LAYER_GROUPS,
125
131
  NAV_AID_QUERY_LAYERS: () => NAV_AID_QUERY_LAYERS,
@@ -137,6 +143,7 @@ __export(index_exports, {
137
143
  RASTER_ATON_CLASSES: () => RASTER_ATON_CLASSES,
138
144
  RASTER_GLYPH_NAMES: () => RASTER_GLYPH_NAMES,
139
145
  RASTER_ICON_PREFIX: () => RASTER_ICON_PREFIX,
146
+ REDUCED_SIZE_PROPERTIES: () => REDUCED_SIZE_PROPERTIES,
140
147
  RELIEF_ATTRIBUTION: () => RELIEF_ATTRIBUTION,
141
148
  RELIEF_ENCODING: () => RELIEF_ENCODING,
142
149
  RELIEF_REGION: () => RELIEF_REGION,
@@ -232,6 +239,14 @@ __export(index_exports, {
232
239
  capLuminance: () => capLuminance,
233
240
  cellBandCharacters: () => cellBandCharacters,
234
241
  cellBandMatch: () => cellBandMatch,
242
+ chartLockBandInfo: () => chartLockBandInfo,
243
+ chartLockDecisionZoom: () => chartLockDecisionZoom,
244
+ chartLockFloor: () => chartLockFloor,
245
+ chartLockGeneratorOptions: () => chartLockGeneratorOptions,
246
+ chartLockMinZoom: () => chartLockMinZoom,
247
+ chartLockParam: () => chartLockParam,
248
+ chartLockSourceMaxzoom: () => chartLockSourceMaxzoom,
249
+ chartLockStyleMode: () => chartLockStyleMode,
235
250
  chartSymbolSizingCensus: () => chartSymbolSizingCensus,
236
251
  chrtAtonTintExpression: () => chrtAtonTintExpression,
237
252
  chrtHouseColor: () => chrtHouseColor,
@@ -271,6 +286,7 @@ __export(index_exports, {
271
286
  extinguishedLightExpression: () => extinguishedLightExpression,
272
287
  extractNavAidDesignation: () => extractNavAidDesignation,
273
288
  featureIdentity: () => featureIdentity,
289
+ filterAtFloor: () => filterAtFloor,
274
290
  formatDayboard: () => formatDayboard,
275
291
  formatLightDescription: () => formatLightDescription,
276
292
  formatLightRhythm: () => formatLightRhythm,
@@ -307,6 +323,7 @@ __export(index_exports, {
307
323
  hazardFillExpression: () => hazardFillExpression,
308
324
  iconExpressionForFamily: () => iconExpressionForFamily,
309
325
  iconSliderFor: () => iconSliderFor,
326
+ isChartLockBand: () => isChartLockBand,
310
327
  isDangerDepthPlacer: () => isDangerDepthPlacer,
311
328
  isDepthAreaClassLayerId: () => isDepthAreaClassLayerId,
312
329
  isDrapeable: () => isDrapeable,
@@ -345,6 +362,7 @@ __export(index_exports, {
345
362
  normalizeTheme: () => normalizeTheme,
346
363
  opaqueSplitBaseOf: () => opaqueSplitBaseOf,
347
364
  paginate: () => paginate,
365
+ parseChartLock: () => parseChartLock,
348
366
  parseChartLook: () => parseChartLook,
349
367
  parseListCodes: () => parseListCodes,
350
368
  parseSigseqTerms: () => parseSigseqTerms,
@@ -374,6 +392,7 @@ __export(index_exports, {
374
392
  seafloorLayers: () => seafloorLayers,
375
393
  sectorLimitToArcBearing: () => sectorLimitToArcBearing,
376
394
  semiboldFontStack: () => semiboldFontStack,
395
+ servedChartLockMetadata: () => servedChartLockMetadata,
377
396
  snapChartSymbolScale: () => snapChartSymbolScale,
378
397
  soundingPadding: () => soundingPadding,
379
398
  soundingPaddingValue: () => soundingPaddingValue,
@@ -386,8 +405,10 @@ __export(index_exports, {
386
405
  themeChrtGlyph: () => themeChrtGlyph,
387
406
  tileTemplate: () => tileTemplate,
388
407
  uncoveredSectorArcs: () => uncoveredSectorArcs,
408
+ withChartReduction: () => withChartReduction,
389
409
  withClassicMarks: () => withClassicMarks,
390
410
  withLook: () => withLook,
411
+ withServedChartLock: () => withServedChartLock,
391
412
  withWaterLines: () => withWaterLines,
392
413
  withinBboxFilter: () => withinBboxFilter,
393
414
  worldMinusBboxPolygon: () => worldMinusBboxPolygon
@@ -861,7 +882,9 @@ var TilesEndpoint = class {
861
882
  const params = new URLSearchParams();
862
883
  if (opts.theme) params.set("theme", opts.theme);
863
884
  if (opts.symbols) params.set("symbols", opts.symbols);
885
+ if (opts.look) params.set("look", opts.look);
864
886
  if (opts.mode) params.set("mode", opts.mode);
887
+ if (opts.lock) params.set("lock", opts.lock);
865
888
  if (opts.land) params.set("land", "1");
866
889
  if (opts.relief) params.set("relief", "1");
867
890
  if (opts.units === "imperial") params.set("units", "imperial");
@@ -32332,8 +32355,11 @@ function washTint(cls, id, tints) {
32332
32355
  if (cls === "LAKARE" || id === "chrtland-water" || id === "paper-base-lakes") return tints.lake;
32333
32356
  return null;
32334
32357
  }
32358
+ function lookSprite(style, look) {
32359
+ return typeof style.sprite === "string" ? { sprite: style.sprite.replace(/-day$/, `-look_${look}`) } : {};
32360
+ }
32335
32361
  function withLook(style, look, opts = {}) {
32336
- if (look === "paper") return withClassic(style);
32362
+ if (look === "paper") return { ...withClassic(style), ...lookSprite(style, look) };
32337
32363
  const tone = LOOK_TONES[look];
32338
32364
  const ink = tone.ink;
32339
32365
  const tints = look === "handcolored" && opts.tints !== false ? WASH_TINTS : null;
@@ -32433,10 +32459,7 @@ function withLook(style, look, opts = {}) {
32433
32459
  });
32434
32460
  return {
32435
32461
  ...style,
32436
- // The black & white sheet's symbols, the same INT-1 shapes in black, on
32437
- // both looks: the day sheet's magenta anchors and light flares read as a
32438
- // modern chart under the wash.
32439
- ...typeof style.sprite === "string" ? { sprite: style.sprite.replace(/-day$/, "-eink_mono") } : {},
32462
+ ...lookSprite(style, look),
32440
32463
  sources: {
32441
32464
  ...style.sources,
32442
32465
  [LOOK_WATERLINES_SOURCE]: { type: "geojson", data: { type: "FeatureCollection", features: [] } }
@@ -34041,8 +34064,8 @@ var SYMBOL_SET_LABELS = {
34041
34064
  var SPRITE_SHEET_FAMILY = {
34042
34065
  s52: "s52",
34043
34066
  chrt: "chrt",
34044
- int1: "raster",
34045
- uschart1: "raster"
34067
+ int1: "int1",
34068
+ uschart1: "uschart1"
34046
34069
  };
34047
34070
  function applySymbolFamily(style, family, palette) {
34048
34071
  switch (family) {
@@ -35265,7 +35288,7 @@ function applyCustomStyleSettings(style, config) {
35265
35288
  }
35266
35289
  function generateCustomStyle(config, opts = {}) {
35267
35290
  const { theme, ...generatorOpts } = opts;
35268
- const { palette, themeFellBack } = resolveCustomTheme(config, theme ?? null);
35291
+ const { palette, themeFellBack } = generatorOpts.look !== void 0 ? { palette: "DAY", themeFellBack: theme != null && theme !== "DAY" } : resolveCustomTheme(config, theme ?? null);
35269
35292
  const style = generateStyle(palette, {
35270
35293
  ...generatorOpts,
35271
35294
  safetyContour: config.sounding_settings.safetyContour,
@@ -35339,6 +35362,301 @@ function splitOpaqueDepthAreas(layers) {
35339
35362
  return out;
35340
35363
  }
35341
35364
 
35365
+ // src/atlas/chart-reduction.ts
35366
+ var CHART_LOCK_BANDS = [
35367
+ { band: 1, name: "Overview", floor: 5 },
35368
+ { band: 2, name: "General", floor: 7 },
35369
+ { band: 3, name: "Coastal", floor: 9 },
35370
+ { band: 4, name: "Approach", floor: 11 },
35371
+ { band: 5, name: "Harbor", floor: 13 },
35372
+ { band: 6, name: "Berthing", floor: 14 }
35373
+ ];
35374
+ var DEFAULT_CHART_LOCK_BAND = 5;
35375
+ var MAX_REDUCTION_LEVELS = 2;
35376
+ var CHART_ARCHIVE_MAXZOOM = 14;
35377
+ function isChartLockBand(v) {
35378
+ return v === 1 || v === 2 || v === 3 || v === 4 || v === 5 || v === 6;
35379
+ }
35380
+ function chartLockBandInfo(band) {
35381
+ return CHART_LOCK_BANDS[band - 1];
35382
+ }
35383
+ function chartLockFloor(band) {
35384
+ return chartLockBandInfo(band).floor;
35385
+ }
35386
+ function chartLockMinZoom(band) {
35387
+ return chartLockFloor(band) - MAX_REDUCTION_LEVELS;
35388
+ }
35389
+ function chartLockStyleMode(band) {
35390
+ const name = chartLockBandInfo(band).name;
35391
+ return { band: name === "Berthing" ? "Harbor" : name, finestBand: String(band) };
35392
+ }
35393
+ var FINER_DATA_DECISION_OFFSET = 1e-3;
35394
+ function chartLockDecisionZoom(band, bandOnly) {
35395
+ const floor = chartLockFloor(band);
35396
+ return bandOnly ? floor : floor - FINER_DATA_DECISION_OFFSET;
35397
+ }
35398
+ function chartLockSourceMaxzoom(band, archiveMax = CHART_ARCHIVE_MAXZOOM) {
35399
+ return Math.min(archiveMax, chartLockFloor(band));
35400
+ }
35401
+ var REDUCED_SIZE_PROPERTIES = /* @__PURE__ */ new Set([
35402
+ "text-size",
35403
+ "icon-size",
35404
+ "text-padding",
35405
+ "icon-padding",
35406
+ "icon-text-fit-padding",
35407
+ "symbol-spacing",
35408
+ "line-width",
35409
+ "line-gap-width",
35410
+ "line-offset",
35411
+ "line-blur",
35412
+ "circle-radius",
35413
+ "circle-stroke-width",
35414
+ "text-halo-width",
35415
+ "text-halo-blur",
35416
+ "icon-halo-width",
35417
+ "icon-halo-blur",
35418
+ "text-translate",
35419
+ "icon-translate",
35420
+ "line-translate",
35421
+ "fill-translate",
35422
+ "circle-translate"
35423
+ ]);
35424
+ var REDUCTION_STOPS_PER_LEVEL = 4;
35425
+ var STEP_RAMP = 1e-3;
35426
+ var isZoom = (e) => Array.isArray(e) && e.length === 1 && e[0] === "zoom";
35427
+ function round2(n) {
35428
+ return Math.round(n * 1e4) / 1e4;
35429
+ }
35430
+ function mentionsZoom2(v) {
35431
+ if (Array.isArray(v)) {
35432
+ if (v[0] === "literal") return false;
35433
+ if (isZoom(v)) return true;
35434
+ return v.some(mentionsZoom2);
35435
+ }
35436
+ if (v !== null && typeof v === "object") return Object.values(v).some(mentionsZoom2);
35437
+ return false;
35438
+ }
35439
+ function isNumArray(v) {
35440
+ return Array.isArray(v) && v.length > 0 && v.every((n) => typeof n === "number");
35441
+ }
35442
+ function numArrayOf(v) {
35443
+ if (isNumArray(v)) return v;
35444
+ if (Array.isArray(v) && v.length === 2 && v[0] === "literal" && isNumArray(v[1])) return v[1];
35445
+ return null;
35446
+ }
35447
+ function asOutput(v) {
35448
+ return isNumArray(v) ? ["literal", v] : v;
35449
+ }
35450
+ function zoomCurveOf(v) {
35451
+ if (Array.isArray(v)) {
35452
+ if (v[0] === "interpolate" && isZoom(v[2])) {
35453
+ const stops = [];
35454
+ for (let i = 3; i + 1 < v.length; i += 2) {
35455
+ if (typeof v[i] !== "number") return null;
35456
+ stops.push([v[i], v[i + 1]]);
35457
+ }
35458
+ return stops.length > 0 ? { kind: "interpolate", type: v[1], first: void 0, stops } : null;
35459
+ }
35460
+ if (v[0] === "step" && isZoom(v[1])) {
35461
+ const stops = [];
35462
+ for (let i = 3; i + 1 < v.length; i += 2) {
35463
+ if (typeof v[i] !== "number") return null;
35464
+ stops.push([v[i], v[i + 1]]);
35465
+ }
35466
+ return { kind: "step", type: null, first: v[2], stops };
35467
+ }
35468
+ return null;
35469
+ }
35470
+ if (v !== null && typeof v === "object") {
35471
+ const f = v;
35472
+ if (f.property !== void 0 || !Array.isArray(f.stops) || f.stops.length === 0) return null;
35473
+ const stops = [];
35474
+ for (const s of f.stops) {
35475
+ if (!Array.isArray(s) || s.length !== 2 || typeof s[0] !== "number") return null;
35476
+ stops.push([s[0], s[1]]);
35477
+ }
35478
+ if (f.type === "interval") return { kind: "step", type: null, first: stops[0][1], stops: stops.slice(1) };
35479
+ if (f.type !== void 0 && f.type !== "exponential") return null;
35480
+ const base = typeof f.base === "number" ? f.base : 1;
35481
+ return { kind: "interpolate", type: base === 1 ? ["linear"] : ["exponential", base], first: void 0, stops };
35482
+ }
35483
+ return null;
35484
+ }
35485
+ function interpolationT(type, z, z0, z1) {
35486
+ if (Array.isArray(type) && type[0] === "exponential" && typeof type[1] === "number" && type[1] !== 1) {
35487
+ const b = type[1];
35488
+ return (b ** (z - z0) - 1) / (b ** (z1 - z0) - 1);
35489
+ }
35490
+ return (z - z0) / (z1 - z0);
35491
+ }
35492
+ function blend(a, b, t, numeric) {
35493
+ if (t <= 0) return a;
35494
+ if (t >= 1) return b;
35495
+ if (typeof a === "number" && typeof b === "number") return round2(a + (b - a) * t);
35496
+ const aa = numArrayOf(a);
35497
+ const bb = numArrayOf(b);
35498
+ if (aa && bb) return aa.length === bb.length ? aa.map((x, i) => round2(x + (bb[i] - x) * t)) : void 0;
35499
+ if (numeric && !aa && !bb && (typeof a === "number" || Array.isArray(a)) && (typeof b === "number" || Array.isArray(b))) {
35500
+ return ["+", ["*", a, round2(1 - t)], ["*", b, round2(t)]];
35501
+ }
35502
+ return void 0;
35503
+ }
35504
+ function valueAt(c, z, numeric) {
35505
+ if (c.kind === "step") {
35506
+ let out = c.first;
35507
+ for (const [sz, o] of c.stops) if (sz <= z) out = o;
35508
+ return out;
35509
+ }
35510
+ const s = c.stops;
35511
+ if (z <= s[0][0]) return s[0][1];
35512
+ if (z >= s[s.length - 1][0]) return s[s.length - 1][1];
35513
+ for (let j = 0; j + 1 < s.length; j++) {
35514
+ const [z0, o0] = s[j];
35515
+ const [z1, o1] = s[j + 1];
35516
+ if (z === z0) return o0;
35517
+ if (z0 < z && z < z1) return blend(o0, o1, interpolationT(c.type, z, z0, z1), numeric);
35518
+ }
35519
+ return void 0;
35520
+ }
35521
+ function scaled3(v, f) {
35522
+ if (typeof v === "number") return round2(v * f);
35523
+ const arr = numArrayOf(v);
35524
+ if (arr) return arr.map((n) => round2(n * f));
35525
+ if (Array.isArray(v) && typeof v[0] === "string") return ["*", v, round2(f)];
35526
+ return void 0;
35527
+ }
35528
+ function reducedSize(value, floor, levels) {
35529
+ const curve = zoomCurveOf(value);
35530
+ if (curve === null && mentionsZoom2(value)) return void 0;
35531
+ const atFloor = curve ? valueAt(curve, floor, true) : value;
35532
+ if (atFloor === void 0) return void 0;
35533
+ const out = [];
35534
+ for (let i = levels * REDUCTION_STOPS_PER_LEVEL; i >= 1; i--) {
35535
+ const dz = i / REDUCTION_STOPS_PER_LEVEL;
35536
+ const v = scaled3(atFloor, 2 ** -dz);
35537
+ if (v === void 0) return void 0;
35538
+ out.push(round2(floor - dz), asOutput(v));
35539
+ }
35540
+ out.push(floor, asOutput(atFloor));
35541
+ if (curve === null) return ["interpolate", ["linear"], ["zoom"], ...out];
35542
+ if (curve.kind === "interpolate") {
35543
+ for (const [z, o] of curve.stops) if (z > floor) out.push(z, o);
35544
+ return ["interpolate", curve.type, ["zoom"], ...out];
35545
+ }
35546
+ let prev = atFloor;
35547
+ for (const [z, o] of curve.stops) {
35548
+ if (z <= floor) continue;
35549
+ if (z - STEP_RAMP > floor) out.push(z - STEP_RAMP, asOutput(prev));
35550
+ out.push(z, asOutput(o));
35551
+ prev = o;
35552
+ }
35553
+ return ["interpolate", ["linear"], ["zoom"], ...out];
35554
+ }
35555
+ function heldAtFloor(value, floor) {
35556
+ const curve = zoomCurveOf(value);
35557
+ if (curve === null) return void 0;
35558
+ const atFloor = valueAt(curve, floor, false);
35559
+ if (atFloor === void 0) return void 0;
35560
+ const above = curve.stops.filter(([z]) => z > floor).flatMap(([z, o]) => [z, o]);
35561
+ if (above.length === 0) return atFloor;
35562
+ return curve.kind === "step" ? ["step", ["zoom"], atFloor, ...above] : ["interpolate", curve.type, ["zoom"], floor, asOutput(atFloor), ...above];
35563
+ }
35564
+ function filterAtFloor(filter, floor) {
35565
+ if (!Array.isArray(filter)) return filter;
35566
+ if (filter[0] === "literal") return filter;
35567
+ if (isZoom(filter)) return ["max", ["zoom"], floor];
35568
+ return filter.map((e) => filterAtFloor(e, floor));
35569
+ }
35570
+ function propsReduced(props, floor, decideAt, levels) {
35571
+ if (!props) return props;
35572
+ let next = null;
35573
+ for (const [name, value] of Object.entries(props)) {
35574
+ if (name === "visibility") continue;
35575
+ const moved = REDUCED_SIZE_PROPERTIES.has(name) ? reducedSize(value, floor, levels) : heldAtFloor(value, decideAt);
35576
+ if (moved === void 0) continue;
35577
+ next ??= { ...props };
35578
+ next[name] = moved;
35579
+ }
35580
+ return next ?? props;
35581
+ }
35582
+ function withChartReduction(layers, floor, options = {}) {
35583
+ const levels = options.levels ?? MAX_REDUCTION_LEVELS;
35584
+ const at = Math.min(floor, options.decideAt ?? floor);
35585
+ const lo = floor - levels;
35586
+ return layers.map((layer) => {
35587
+ const next = { ...layer };
35588
+ const min = layer.minzoom ?? 0;
35589
+ const max = layer.maxzoom ?? 24;
35590
+ if (min <= at && at < max) {
35591
+ if (min > lo) next.minzoom = lo;
35592
+ } else if (max <= at) {
35593
+ next.maxzoom = Math.max(min, Math.min(max, lo));
35594
+ }
35595
+ if (layer.filter !== void 0) next.filter = filterAtFloor(layer.filter, at);
35596
+ const paint = propsReduced(layer.paint, floor, at, levels);
35597
+ if (paint !== void 0) next.paint = paint;
35598
+ const layout = propsReduced(layer.layout, floor, at, levels);
35599
+ if (layout !== void 0) next.layout = layout;
35600
+ return next;
35601
+ });
35602
+ }
35603
+
35604
+ // src/atlas/served-chart-lock.ts
35605
+ var ONLY_SUFFIX = ":only";
35606
+ var CHART_LOCK_PARAMS = CHART_LOCK_BANDS.flatMap(({ name }) => {
35607
+ const band = name.toLowerCase();
35608
+ return [band, `${band}${ONLY_SUFFIX}`];
35609
+ });
35610
+ function chartLockParam(lock) {
35611
+ const band = chartLockBandInfo(lock.band).name.toLowerCase();
35612
+ return lock.bandOnly ? `${band}${ONLY_SUFFIX}` : band;
35613
+ }
35614
+ function parseChartLock(raw) {
35615
+ const lower = raw.toLowerCase();
35616
+ const bandOnly = lower.endsWith(ONLY_SUFFIX);
35617
+ const name = bandOnly ? lower.slice(0, -ONLY_SUFFIX.length) : lower;
35618
+ const info = CHART_LOCK_BANDS.find((b) => b.name.toLowerCase() === name);
35619
+ return info ? { band: info.band, bandOnly } : null;
35620
+ }
35621
+ function chartLockGeneratorOptions(lock) {
35622
+ return lock?.bandOnly ? { chartMode: chartLockStyleMode(lock.band) } : {};
35623
+ }
35624
+ function servedChartLockMetadata(lock) {
35625
+ const info = chartLockBandInfo(lock.band);
35626
+ return {
35627
+ "chrt:lock": chartLockParam(lock),
35628
+ "chrt:lock-band": info.name,
35629
+ "chrt:lock-floor": info.floor,
35630
+ "chrt:lock-min-zoom": chartLockMinZoom(lock.band),
35631
+ "chrt:lock-band-only": lock.bandOnly
35632
+ };
35633
+ }
35634
+ function withServedChartLock(style, lock, chartSource) {
35635
+ const info = chartLockBandInfo(lock.band);
35636
+ const param = chartLockParam(lock);
35637
+ const layers = withChartReduction(style.layers, info.floor, {
35638
+ decideAt: chartLockDecisionZoom(lock.band, lock.bandOnly)
35639
+ });
35640
+ let sources = style.sources;
35641
+ const chart = style.sources[chartSource];
35642
+ if (lock.bandOnly && chart !== null && typeof chart === "object") {
35643
+ const current = chart.maxzoom;
35644
+ const maxzoom = chartLockSourceMaxzoom(lock.band, typeof current === "number" ? current : CHART_ARCHIVE_MAXZOOM);
35645
+ sources = { ...style.sources, [chartSource]: { ...chart, maxzoom } };
35646
+ }
35647
+ return {
35648
+ ...style,
35649
+ name: `${style.name.replace(/ — chart:[A-Za-z]+$/, "")} \u2014 lock:${param}`,
35650
+ metadata: {
35651
+ ...style.metadata,
35652
+ "chrt:render-mode": "continuous",
35653
+ ...servedChartLockMetadata(lock)
35654
+ },
35655
+ sources,
35656
+ layers
35657
+ };
35658
+ }
35659
+
35342
35660
  // src/pagination.ts
35343
35661
  async function* paginate(fetchPage, getItems, getTotalCount, options) {
35344
35662
  const pageSize = options?.pageSize ?? 100;
@@ -35785,8 +36103,11 @@ var Chrt = class {
35785
36103
  BUILD_MAXZOOM,
35786
36104
  BUILD_MINZOOM,
35787
36105
  BUILD_PARAM,
36106
+ CHART_ARCHIVE_MAXZOOM,
35788
36107
  CHART_BAND_CODES,
35789
36108
  CHART_CASCADE_CODES,
36109
+ CHART_LOCK_BANDS,
36110
+ CHART_LOCK_PARAMS,
35790
36111
  CHART_LOOKS,
35791
36112
  CHART_SECTIONS,
35792
36113
  CHART_SOUNDINGS_RULE,
@@ -35815,6 +36136,7 @@ var Chrt = class {
35815
36136
  DANGER_DEPTH_PLACER_ID,
35816
36137
  DANGER_DEPTH_PLACER_LAYOUT,
35817
36138
  DANGER_DEPTH_VISIBLE_LAYOUT,
36139
+ DEFAULT_CHART_LOCK_BAND,
35818
36140
  DEFAULT_CLICK_TOLERANCE,
35819
36141
  DEFAULT_CUSTOM_STYLE_CONFIG,
35820
36142
  DEFAULT_INSPECT_CLASS_RANK,
@@ -35836,6 +36158,7 @@ var Chrt = class {
35836
36158
  EINK_HATCH_PATTERN,
35837
36159
  EINK_MONO_GREYS,
35838
36160
  ENGRAVED_LOOKS,
36161
+ FINER_DATA_DECISION_OFFSET,
35839
36162
  HAZARD_LABEL_PRIORITY,
35840
36163
  INSPECT_CLASS_RANK,
35841
36164
  INSPECT_RANK_DEVIATIONS,
@@ -35863,6 +36186,7 @@ var Chrt = class {
35863
36186
  LOOK_TONES,
35864
36187
  LOOK_WATERLINES_SOURCE,
35865
36188
  MAPLIBRE_DEFAULT_TEXT_PADDING_PX,
36189
+ MAX_REDUCTION_LEVELS,
35866
36190
  NAUTICAL_SYMBOLS,
35867
36191
  NAV_AID_LAYER_GROUPS,
35868
36192
  NAV_AID_QUERY_LAYERS,
@@ -35880,6 +36204,7 @@ var Chrt = class {
35880
36204
  RASTER_ATON_CLASSES,
35881
36205
  RASTER_GLYPH_NAMES,
35882
36206
  RASTER_ICON_PREFIX,
36207
+ REDUCED_SIZE_PROPERTIES,
35883
36208
  RELIEF_ATTRIBUTION,
35884
36209
  RELIEF_ENCODING,
35885
36210
  RELIEF_REGION,
@@ -35975,6 +36300,14 @@ var Chrt = class {
35975
36300
  capLuminance,
35976
36301
  cellBandCharacters,
35977
36302
  cellBandMatch,
36303
+ chartLockBandInfo,
36304
+ chartLockDecisionZoom,
36305
+ chartLockFloor,
36306
+ chartLockGeneratorOptions,
36307
+ chartLockMinZoom,
36308
+ chartLockParam,
36309
+ chartLockSourceMaxzoom,
36310
+ chartLockStyleMode,
35978
36311
  chartSymbolSizingCensus,
35979
36312
  chrtAtonTintExpression,
35980
36313
  chrtHouseColor,
@@ -36014,6 +36347,7 @@ var Chrt = class {
36014
36347
  extinguishedLightExpression,
36015
36348
  extractNavAidDesignation,
36016
36349
  featureIdentity,
36350
+ filterAtFloor,
36017
36351
  formatDayboard,
36018
36352
  formatLightDescription,
36019
36353
  formatLightRhythm,
@@ -36050,6 +36384,7 @@ var Chrt = class {
36050
36384
  hazardFillExpression,
36051
36385
  iconExpressionForFamily,
36052
36386
  iconSliderFor,
36387
+ isChartLockBand,
36053
36388
  isDangerDepthPlacer,
36054
36389
  isDepthAreaClassLayerId,
36055
36390
  isDrapeable,
@@ -36088,6 +36423,7 @@ var Chrt = class {
36088
36423
  normalizeTheme,
36089
36424
  opaqueSplitBaseOf,
36090
36425
  paginate,
36426
+ parseChartLock,
36091
36427
  parseChartLook,
36092
36428
  parseListCodes,
36093
36429
  parseSigseqTerms,
@@ -36117,6 +36453,7 @@ var Chrt = class {
36117
36453
  seafloorLayers,
36118
36454
  sectorLimitToArcBearing,
36119
36455
  semiboldFontStack,
36456
+ servedChartLockMetadata,
36120
36457
  snapChartSymbolScale,
36121
36458
  soundingPadding,
36122
36459
  soundingPaddingValue,
@@ -36129,8 +36466,10 @@ var Chrt = class {
36129
36466
  themeChrtGlyph,
36130
36467
  tileTemplate,
36131
36468
  uncoveredSectorArcs,
36469
+ withChartReduction,
36132
36470
  withClassicMarks,
36133
36471
  withLook,
36472
+ withServedChartLock,
36134
36473
  withWaterLines,
36135
36474
  withinBboxFilter,
36136
36475
  worldMinusBboxPolygon