@chrtco/sdk 0.10.47 → 0.10.49

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
@@ -44,6 +44,12 @@ __export(index_exports, {
44
44
  CHART_BAND_CODES: () => CHART_BAND_CODES,
45
45
  CHART_CASCADE_CODES: () => CHART_CASCADE_CODES,
46
46
  CHART_SECTIONS: () => CHART_SECTIONS,
47
+ CHART_SOUNDINGS_RULE: () => CHART_SOUNDINGS_RULE,
48
+ CHART_SYMBOL_SCALE: () => CHART_SYMBOL_SCALE,
49
+ CHART_SYMBOL_SIZES: () => CHART_SYMBOL_SIZES,
50
+ CHART_SYMBOL_SIZE_LABELS: () => CHART_SYMBOL_SIZE_LABELS,
51
+ CHART_SYMBOL_SIZE_REACH: () => CHART_SYMBOL_SIZE_REACH,
52
+ CHART_SYMBOL_SIZE_WIRE: () => CHART_SYMBOL_SIZE_WIRE,
47
53
  CHRTRASTER_REF_CROPS: () => CHRTRASTER_REF_CROPS,
48
54
  CHRTRASTER_SVGS: () => CHRTRASTER_SVGS,
49
55
  CHRT_ATON_COLORS: () => CHRT_ATON_COLORS,
@@ -57,7 +63,6 @@ __export(index_exports, {
57
63
  ChrtError: () => ChrtError,
58
64
  DEFAULT_CLICK_TOLERANCE: () => DEFAULT_CLICK_TOLERANCE,
59
65
  DEFAULT_CUSTOM_STYLE_CONFIG: () => DEFAULT_CUSTOM_STYLE_CONFIG,
60
- DEFAULT_DEPTH_LABEL_SIZE: () => DEFAULT_DEPTH_LABEL_SIZE,
61
66
  DEFAULT_INSPECT_CLASS_RANK: () => DEFAULT_INSPECT_CLASS_RANK,
62
67
  DEFAULT_LABEL_SETTINGS: () => DEFAULT_LABEL_SETTINGS,
63
68
  DEFAULT_NAV_AID_SETTINGS: () => DEFAULT_NAV_AID_SETTINGS,
@@ -69,14 +74,14 @@ __export(index_exports, {
69
74
  DEFAULT_WATER_BODY_SETTINGS: () => DEFAULT_WATER_BODY_SETTINGS,
70
75
  DEPARE_FILL_BRANCH_TOKENS: () => DEPARE_FILL_BRANCH_TOKENS,
71
76
  DEPARE_FILL_FALLBACK_TOKEN: () => DEPARE_FILL_FALLBACK_TOKEN,
72
- DEPTH_LABEL_CLASSES: () => DEPTH_LABEL_CLASSES,
73
- DEPTH_LABEL_SIZES: () => DEPTH_LABEL_SIZES,
77
+ DEPTH_FIGURE_CLASSES: () => DEPTH_FIGURE_CLASSES,
74
78
  DRAPEABLE_LAYER_TYPES: () => DRAPEABLE_LAYER_TYPES,
75
79
  EINK_COLOR_TABLES: () => EINK_COLOR_TABLES,
76
80
  EINK_DANGER_PATTERN: () => EINK_DANGER_PATTERN,
77
81
  EINK_DOTS_PATTERN: () => EINK_DOTS_PATTERN,
78
82
  EINK_HATCH_PATTERN: () => EINK_HATCH_PATTERN,
79
83
  EINK_MONO_GREYS: () => EINK_MONO_GREYS,
84
+ HAZARD_LABEL_PRIORITY: () => HAZARD_LABEL_PRIORITY,
80
85
  INSPECT_CLASS_RANK: () => INSPECT_CLASS_RANK,
81
86
  INSPECT_RANK_DEVIATIONS: () => INSPECT_RANK_DEVIATIONS,
82
87
  InteractClient: () => InteractClient,
@@ -92,7 +97,8 @@ __export(index_exports, {
92
97
  LAND_ATTRIBUTION: () => LAND_ATTRIBUTION,
93
98
  LAND_BUILD_MAXZOOM: () => LAND_BUILD_MAXZOOM,
94
99
  LAND_REGION: () => LAND_REGION,
95
- LARGE_SOUNDING_PADDING_PX: () => LARGE_SOUNDING_PADDING_PX,
100
+ LAND_TEXT_CLASSES: () => LAND_TEXT_CLASSES,
101
+ MAPLIBRE_DEFAULT_TEXT_PADDING_PX: () => MAPLIBRE_DEFAULT_TEXT_PADDING_PX,
96
102
  NAUTICAL_SYMBOLS: () => NAUTICAL_SYMBOLS,
97
103
  NAV_AID_LAYER_GROUPS: () => NAV_AID_LAYER_GROUPS,
98
104
  NAV_AID_QUERY_LAYERS: () => NAV_AID_QUERY_LAYERS,
@@ -101,6 +107,7 @@ __export(index_exports, {
101
107
  NON_SOLAS_DISCLAIMER: () => NON_SOLAS_DISCLAIMER,
102
108
  NON_SOLAS_DISCLAIMER_SHORT: () => NON_SOLAS_DISCLAIMER_SHORT,
103
109
  OPAQUE_SPLIT_OF: () => OPAQUE_SPLIT_OF,
110
+ OUTRANK_LABELS: () => OUTRANK_LABELS,
104
111
  OfflineError: () => OfflineError,
105
112
  OfflineStyleError: () => OfflineStyleError,
106
113
  PLACENAME_LAND_CLASSES: () => PLACENAME_LAND_CLASSES,
@@ -135,9 +142,14 @@ __export(index_exports, {
135
142
  S52_LOOKUP: () => S52_LOOKUP,
136
143
  S52_NIGHT: () => S52_NIGHT,
137
144
  S52_PATTERN_SPRITE_PREFIX: () => S52_PATTERN_SPRITE_PREFIX,
145
+ SERVED_FONT_STACKS: () => SERVED_FONT_STACKS,
146
+ SERVED_SOUNDING_PADDING_PX: () => SERVED_SOUNDING_PADDING_PX,
138
147
  SIGPER_TOLERANCE_SECONDS: () => SIGPER_TOLERANCE_SECONDS,
139
148
  SIGSEQ_MAX_TERMS: () => SIGSEQ_MAX_TERMS,
140
149
  SOUNDING_LAYERS: () => SOUNDING_LAYERS,
150
+ SOUNDING_PADDING_PER_FACTOR: () => SOUNDING_PADDING_PER_FACTOR,
151
+ STANDARD_CHART_SYMBOL_SCALES: () => STANDARD_CHART_SYMBOL_SCALES,
152
+ SYMBOL_ANNOTATION_TEXT_CLASSES: () => SYMBOL_ANNOTATION_TEXT_CLASSES,
141
153
  SYMBOL_FAMILIES: () => SYMBOL_FAMILIES,
142
154
  SYMBOL_FAMILY_META: () => SYMBOL_FAMILY_META,
143
155
  SYMBOL_GROUPS: () => SYMBOL_GROUPS,
@@ -145,12 +157,14 @@ __export(index_exports, {
145
157
  TileAuth: () => TileAuth,
146
158
  TileTokenError: () => TileTokenError,
147
159
  WATER_BODY_LAYER_GROUPS: () => WATER_BODY_LAYER_GROUPS,
160
+ WATER_TEXT_CLASSES: () => WATER_TEXT_CLASSES,
148
161
  WeatherEndpoint: () => WeatherEndpoint,
149
162
  applyBaseBundle: () => applyBaseBundle,
163
+ applyChartSymbolScales: () => applyChartSymbolScales,
164
+ applyChartSymbolScalesToLayer: () => applyChartSymbolScalesToLayer,
150
165
  applyChrtSymbolSet: () => applyChrtSymbolSet,
151
166
  applyColorTheme: () => applyColorTheme,
152
167
  applyCustomStyleSettings: () => applyCustomStyleSettings,
153
- applyDepthLabelSize: () => applyDepthLabelSize,
154
168
  applyEinkPortrayal: () => applyEinkPortrayal,
155
169
  applyRasterSymbolSet: () => applyRasterSymbolSet,
156
170
  applyS101SymbolSet: () => applyS101SymbolSet,
@@ -177,19 +191,24 @@ __export(index_exports, {
177
191
  capLuminance: () => capLuminance,
178
192
  cellBandCharacters: () => cellBandCharacters,
179
193
  cellBandMatch: () => cellBandMatch,
194
+ chartSymbolSizingCensus: () => chartSymbolSizingCensus,
180
195
  chrtAtonTintExpression: () => chrtAtonTintExpression,
181
196
  chrtHouseColor: () => chrtHouseColor,
182
197
  chrtLightTintExpression: () => chrtLightTintExpression,
198
+ clampChartSymbolScale: () => clampChartSymbolScale,
183
199
  collectCandidates: () => collectCandidates,
184
200
  collectClickCandidates: () => collectClickCandidates,
185
201
  combineWithBandFilter: () => combineWithBandFilter,
202
+ contourValueFactor: () => contourValueFactor,
186
203
  contrastRatio: () => contrastRatio,
187
204
  daymarkColor: () => daymarkColor,
188
205
  decimateFeatures: () => decimateFeatures,
189
206
  decodeAreaFeatureProps: () => decodeAreaFeatureProps,
190
207
  decodeBridgeProps: () => decodeBridgeProps,
191
208
  decodeCandidate: () => decodeCandidate,
209
+ decodeChartSymbolScale: () => decodeChartSymbolScale,
192
210
  decodeNavAidProps: () => decodeNavAidProps,
211
+ demotedBelowSoundings: () => demotedBelowSoundings,
193
212
  depareColor: () => depareColor,
194
213
  depareFillExpression: () => depareFillExpression,
195
214
  depthAreaClassLayerId: () => depthAreaClassLayerId,
@@ -199,6 +218,7 @@ __export(index_exports, {
199
218
  drapedFirst: () => drapedFirst,
200
219
  extractNavAidDesignation: () => extractNavAidDesignation,
201
220
  featureIdentity: () => featureIdentity,
221
+ fromZoom: () => fromZoom,
202
222
  generateCustomStyle: () => generateCustomStyle,
203
223
  generateSpriteManifest: () => generateSpriteManifest,
204
224
  generateSpriteSheet: () => generateSpriteSheet,
@@ -226,9 +246,11 @@ __export(index_exports, {
226
246
  getThemedS101Svg: () => getThemedS101Svg,
227
247
  getThemedS52Svg: () => getThemedS52Svg,
228
248
  getTopmarkMeaning: () => getTopmarkMeaning,
249
+ haloFactor: () => haloFactor,
229
250
  hazardColor: () => hazardColor,
230
251
  hazardFillExpression: () => hazardFillExpression,
231
252
  iconExpressionForFamily: () => iconExpressionForFamily,
253
+ iconSliderFor: () => iconSliderFor,
232
254
  isDepthAreaClassLayerId: () => isDepthAreaClassLayerId,
233
255
  isDrapeable: () => isDrapeable,
234
256
  isEinkColorTable: () => isEinkColorTable,
@@ -240,6 +262,7 @@ __export(index_exports, {
240
262
  isSoundingLayerVisible: () => isSoundingLayerVisible,
241
263
  isVisibleInMode: () => isVisibleInMode,
242
264
  isWaterBodyLayerVisible: () => isWaterBodyLayerVisible,
265
+ keptAboveSoundings: () => keptAboveSoundings,
243
266
  labelSortKey: () => labelSortKey,
244
267
  lampRhythmColour: () => lampRhythmColour,
245
268
  lampRhythmOpacity: () => lampRhythmOpacity,
@@ -252,7 +275,6 @@ __export(index_exports, {
252
275
  normalizeTheme: () => normalizeTheme,
253
276
  opaqueSplitBaseOf: () => opaqueSplitBaseOf,
254
277
  paginate: () => paginate,
255
- parseDepthLabelSize: () => parseDepthLabelSize,
256
278
  parseListCodes: () => parseListCodes,
257
279
  parseSigseqTerms: () => parseSigseqTerms,
258
280
  parseSymbolFamily: () => parseSymbolFamily,
@@ -275,12 +297,19 @@ __export(index_exports, {
275
297
  safetyContourValues: () => safetyContourValues,
276
298
  sanitizeCustomStyleConfig: () => sanitizeCustomStyleConfig,
277
299
  scaleLinearLight: () => scaleLinearLight,
300
+ scaleSizeExpression: () => scaleSizeExpression,
278
301
  scaleSizeValue: () => scaleSizeValue,
279
302
  scaminToMinZoom: () => scaminToMinZoom,
280
303
  sectorLimitToArcBearing: () => sectorLimitToArcBearing,
304
+ semiboldFontStack: () => semiboldFontStack,
305
+ snapChartSymbolScale: () => snapChartSymbolScale,
306
+ soundingPadding: () => soundingPadding,
307
+ soundingPaddingValue: () => soundingPaddingValue,
281
308
  splitOpaqueDepthAreas: () => splitOpaqueDepthAreas,
309
+ stepChartSymbolScale: () => stepChartSymbolScale,
282
310
  styleModeBand: () => styleModeBand,
283
311
  terrainStackCount: () => terrainStackCount,
312
+ textSliderFor: () => textSliderFor,
284
313
  themeChrtGlyph: () => themeChrtGlyph,
285
314
  tileTemplate: () => tileTemplate,
286
315
  uncoveredSectorArcs: () => uncoveredSectorArcs,
@@ -25677,15 +25706,46 @@ function getLabelConfig(layerName, opts = {}) {
25677
25706
  // UWTROC/OBSTRN/WRECKS are dominance-PARTICIPATING classes —
25678
25707
  // exactly one band's copy renders at any zoom, so anchor-shifting
25679
25708
  // can't split a cross-band duplicate pair into two visible labels.
25680
- // Shallowest (most dangerous) hazard wins within-class contests;
25681
- // VALSOU-less hazards (awash / unsounded) rank first of all.
25682
25709
  layout: {
25683
25710
  "text-variable-anchor": ["top-left", "bottom-left", "top-right", "bottom-right"],
25684
25711
  "text-radial-offset": 0.9,
25685
25712
  "text-justify": "auto",
25686
- "text-allow-overlap": false,
25713
+ // ⚠ A DANGER DEPTH IS NEVER DROPPED (owner, 2026-10-06). Before,
25714
+ // a callout with no free corner was culled and the rock, wreck or
25715
+ // obstruction drew with no depth beside it: 15 of 136 at Boston
25716
+ // z12.3. ALLOW-OVERLAP ONLY, and that is the whole point:
25717
+ // - the variable anchors still fan out first — MapLibre 5.24
25718
+ // tries every corner without overlap and overlaps, at the
25719
+ // first corner, only when none is free (`placement.ts`,
25720
+ // `placementPasses`), so only the callouts that used to vanish
25721
+ // draw over something;
25722
+ // - `text-ignore-placement` stays false, so a callout keeps its
25723
+ // collision space and blocks what it blocked before. Ignoring
25724
+ // placement as well freed that space for buoy and place names,
25725
+ // which then pushed shallow soundings off: 11 shoals uncovered
25726
+ // at z12.3 on the bench. This form: 0.
25727
+ // The census and its numbers: `scripts/chart-bench/
25728
+ // danger-depth-census.ts` and `.chrt/standards/s-52.md` §8a.
25729
+ "text-allow-overlap": true,
25687
25730
  "text-optional": true,
25688
25731
  "text-padding": 2,
25732
+ // ⚠ THE DEPTH SORT KEY IS LOAD-BEARING — do not "optimise" it to a
25733
+ // constant. It costs draw calls: MapLibre 5.24 draws an overlapping
25734
+ // layer with a data-driven key one segment per distinct key, twice
25735
+ // with a halo over 1 px (`drawLayerSymbols`, `hasSortKey &&
25736
+ // bucket.canOverlap`), so at 100 % the chart issues +14 % draw calls
25737
+ // at z12.3 against 0.10.3 (R6's 0.10.4 gate). But the key is also
25738
+ // the PLACEMENT order, and a callout keeps its collision box, so the
25739
+ // order decides which corner each callout takes and therefore which
25740
+ // soundings and buoy names survive beneath it. Measured with each
25741
+ // form booted fresh (2026-10-06, Boston and Salem Sound, z11.5–16,
25742
+ // at 1280×800 and the Pi's 1920×1185): a constant key, 3/4/5 depth
25743
+ // bands and whole metres ALL uncover shoals that 0.10.3 drew (a
25744
+ // constant key: 5 at z12.3 on the Pi's canvas, a 0.6 m one at
25745
+ // 1280×800) and change buoy names; only this key matches 0.10.4's
25746
+ // census. `danger-depth-census.ts --form <json>` re-runs that gate
25747
+ // for any candidate. A 1 px halo (one pass, not two) halves the
25748
+ // cost with placement byte-identical — a portrayal call, not taken.
25689
25749
  "symbol-sort-key": labelSortKey(100, ["*", 10, valsou])
25690
25750
  }
25691
25751
  };
@@ -28969,65 +29029,364 @@ function iconExpressionForFamily(objectClass2, family) {
28969
29029
  }
28970
29030
  }
28971
29031
 
28972
- // src/atlas/depth-label-size.ts
28973
- var DEPTH_LABEL_SIZES = ["standard", "large"];
28974
- var DEFAULT_DEPTH_LABEL_SIZE = "standard";
28975
- function parseDepthLabelSize(raw) {
28976
- if (!raw) return null;
28977
- const lower = raw.toLowerCase();
28978
- return DEPTH_LABEL_SIZES.find((s) => s === lower) ?? null;
28979
- }
28980
- var DEPTH_LABEL_CLASSES = /* @__PURE__ */ new Set([
28981
- "SOUNDG",
28982
- "DEPCNT",
28983
- "UWTROC",
28984
- "OBSTRN",
28985
- "WRECKS"
28986
- ]);
28987
- var SEMIBOLD = ["Open Sans Semibold"];
28988
- var HAZARD_DEPTH = {
28989
- textSize: ["interpolate", ["linear"], ["zoom"], 12, 12, 16, 15],
28990
- haloWidth: 1.4,
28991
- font: SEMIBOLD
29032
+ // src/atlas/chart-symbol-sizing.ts
29033
+ var CHART_SYMBOL_SIZES = ["landLabels", "waterLabels", "depthNumbers", "waypoints", "chartIcons"];
29034
+ var CHART_SYMBOL_SIZE_WIRE = {
29035
+ landLabels: "chart.landLabelScale",
29036
+ waterLabels: "chart.waterLabelScale",
29037
+ /** Proposed for CHRTKit; aligned with sail's ChartSymbolSizing before release. */
29038
+ depthNumbers: "chart.depthNumberScale",
29039
+ waypoints: "chart.waypointScale",
29040
+ chartIcons: "chart.chartIconScale"
28992
29041
  };
28993
- var LARGE = {
28994
- // Standard: 7 / 8 / 10 / 12 at z8 / 11 / 14 / 16, halo 1.0, Semibold.
28995
- SOUNDG: {
28996
- textSize: ["interpolate", ["linear"], ["zoom"], 8, 10, 11, 11, 14, 14, 16, 17],
28997
- haloWidth: 1.2,
28998
- font: SEMIBOLD
28999
- },
29000
- // Standard: 8 / 10 at z10 / 14, halo 1.2, Regular.
29001
- //
29002
- // ⚠ ~1.2x, NOT 1.4x, AND SEMIBOLD CARRIES THE REST. A contour value rides
29003
- // its line (`symbol-placement: line`) and needs a straight-enough run to fit;
29004
- // it also shares rank 300 with the soundings, which place first. At 1.4x the
29005
- // Boston harbour view kept 15 of Standard's 20 contour labels; at 1.2x, 18.
29006
- DEPCNT: {
29007
- textSize: ["interpolate", ["linear"], ["zoom"], 10, 10, 14, 12],
29008
- haloWidth: 1.2,
29009
- font: SEMIBOLD
29010
- },
29011
- UWTROC: HAZARD_DEPTH,
29012
- OBSTRN: HAZARD_DEPTH,
29013
- WRECKS: HAZARD_DEPTH
29042
+ var CHART_SYMBOL_SIZE_LABELS = {
29043
+ landLabels: "Land labels",
29044
+ waterLabels: "Water labels",
29045
+ depthNumbers: "Depth numbers",
29046
+ waypoints: "Waypoints",
29047
+ chartIcons: "Chart icons"
29014
29048
  };
29015
- var LARGE_SOUNDING_PADDING_PX = 3.5;
29016
- function applyDepthLabelSize(objectClass2, layer, size) {
29017
- if (size !== "large") return layer;
29018
- const large = LARGE[objectClass2];
29019
- if (large === void 0) return layer;
29020
- const layout = {
29021
- ...layer.layout ?? {},
29022
- "text-size": large.textSize,
29023
- "text-font": [...large.font]
29024
- };
29025
- if (objectClass2 === "SOUNDG") layout["text-padding"] = LARGE_SOUNDING_PADDING_PX;
29026
- return {
29027
- ...layer,
29028
- layout,
29029
- paint: { ...layer.paint, "text-halo-width": large.haloWidth }
29030
- };
29049
+ var CHART_SYMBOL_SIZE_REACH = {
29050
+ landLabels: "Towns, landmarks, buildings and land areas.",
29051
+ waterLabels: "Sea, channel, lake and river names, and clearances.",
29052
+ depthNumbers: "Soundings, contour values, and the depths beside rocks, wrecks and obstructions.",
29053
+ waypoints: "Your waypoints and route marks, and how far a tap reaches them.",
29054
+ chartIcons: "Buoys, beacons, lights, wrecks, rocks and their names."
29055
+ };
29056
+ var CHART_SYMBOL_SCALE = {
29057
+ min: 50,
29058
+ max: 200,
29059
+ standard: 100,
29060
+ /** The − / + step. */
29061
+ buttonStep: 10,
29062
+ /** The slider's snap. */
29063
+ sliderStep: 5
29064
+ };
29065
+ var STANDARD_CHART_SYMBOL_SCALES = {
29066
+ landLabels: 100,
29067
+ waterLabels: 100,
29068
+ depthNumbers: 100,
29069
+ waypoints: 100,
29070
+ chartIcons: 100
29071
+ };
29072
+ function clampChartSymbolScale(percent) {
29073
+ if (!Number.isFinite(percent)) return CHART_SYMBOL_SCALE.standard;
29074
+ return Math.min(Math.max(Math.round(percent), CHART_SYMBOL_SCALE.min), CHART_SYMBOL_SCALE.max);
29075
+ }
29076
+ function snapChartSymbolScale(value) {
29077
+ if (!Number.isFinite(value)) return CHART_SYMBOL_SCALE.standard;
29078
+ const step = CHART_SYMBOL_SCALE.sliderStep;
29079
+ return clampChartSymbolScale(Math.round(value / step) * step);
29080
+ }
29081
+ function stepChartSymbolScale(percent, presses) {
29082
+ return clampChartSymbolScale(percent + presses * CHART_SYMBOL_SCALE.buttonStep);
29083
+ }
29084
+ function decodeChartSymbolScale(raw) {
29085
+ if (typeof raw === "number") return Number.isFinite(raw) ? clampChartSymbolScale(raw) : null;
29086
+ if (typeof raw === "string" && /^\s*-?\d+(\.\d+)?\s*$/.test(raw)) return clampChartSymbolScale(Number(raw));
29087
+ return null;
29088
+ }
29089
+ var LAND_TEXT_CLASSES = /* @__PURE__ */ new Set([
29090
+ "BUAARE",
29091
+ "LNDARE",
29092
+ "LNDRGN",
29093
+ "AIRARE",
29094
+ "PRDARE",
29095
+ "LNDMRK",
29096
+ "BUISGL",
29097
+ "SLCONS",
29098
+ "HRBFAC",
29099
+ "BRIDGE"
29100
+ ]);
29101
+ var WATER_TEXT_CLASSES = /* @__PURE__ */ new Set([
29102
+ "SEAARE",
29103
+ "DRGNOTE",
29104
+ "SBDARE",
29105
+ "WEDKLP",
29106
+ "ACHARE",
29107
+ "LAKARE",
29108
+ "RIVERS",
29109
+ "CANALS",
29110
+ "CBLOHD",
29111
+ "PIPOHD"
29112
+ ]);
29113
+ var SYMBOL_ANNOTATION_TEXT_CLASSES = /* @__PURE__ */ new Set([
29114
+ "LIGHTS",
29115
+ "FOGSIG",
29116
+ "BOYCAR",
29117
+ "BOYINB",
29118
+ "BOYISD",
29119
+ "BOYLAT",
29120
+ "BOYSAW",
29121
+ "BOYSPP",
29122
+ "BCNCAR",
29123
+ "BCNISD",
29124
+ "BCNLAT",
29125
+ "BCNSAW",
29126
+ "BCNSPP",
29127
+ "MORFAC",
29128
+ "PILPNT"
29129
+ ]);
29130
+ var BASEMAP_LAND_TEXT = /* @__PURE__ */ new Set([
29131
+ "CHRT_LAND/land_town",
29132
+ "CHRT_LAND/land_summit",
29133
+ "CHRT_LAND/land_poi",
29134
+ "CHRT_BASE/state_label"
29135
+ ]);
29136
+ var BASEMAP_WATER_TEXT = /* @__PURE__ */ new Set([
29137
+ "CHRT_BASE/inland_water_label",
29138
+ "CHRT_BASE/inland_water_label_detail"
29139
+ ]);
29140
+ var BASEMAP_SOURCES = /* @__PURE__ */ new Set(["CHRT_LAND", "CHRT_BASE"]);
29141
+ var HAZARD_LABEL_PRIORITY = 100;
29142
+ var DEPTH_FIGURE_CLASSES = /* @__PURE__ */ new Set(["SOUNDG", "DEPCNT", "UWTROC", "OBSTRN", "WRECKS"]);
29143
+ function contourValueFactor(depthNumbersFactor) {
29144
+ return 1 + (depthNumbersFactor - 1) / 2;
29145
+ }
29146
+ var SERVED_FONT_STACKS = ["Open Sans Regular", "Open Sans Italic", "Open Sans Semibold"];
29147
+ function semiboldFontStack(font) {
29148
+ if (!Array.isArray(font) || !font.every((face) => typeof face === "string")) return font;
29149
+ return font.map((face) => {
29150
+ const semibold = face.replace(/ Regular$/, " Semibold");
29151
+ return SERVED_FONT_STACKS.includes(semibold) ? semibold : face;
29152
+ });
29153
+ }
29154
+ function factsOf(layer) {
29155
+ const l = layer;
29156
+ const source = typeof l.source === "string" ? l.source : void 0;
29157
+ const sourceLayer = typeof l["source-layer"] === "string" ? l["source-layer"] : void 0;
29158
+ const meta = l.metadata ?? {};
29159
+ const isBasemap = source !== void 0 && BASEMAP_SOURCES.has(source);
29160
+ const cls = meta["s52:objectClass"];
29161
+ const objectClass2 = isBasemap ? void 0 : (typeof cls === "string" ? cls : sourceLayer)?.toUpperCase();
29162
+ const p = meta["chrt:labelPriority"];
29163
+ return { source, sourceLayer, objectClass: objectClass2, labelPriority: typeof p === "number" ? p : void 0 };
29164
+ }
29165
+ function textSliderFor(layer) {
29166
+ const f = factsOf(layer);
29167
+ if (f.source !== void 0 && BASEMAP_SOURCES.has(f.source)) {
29168
+ const key = `${f.source}/${f.sourceLayer ?? ""}`;
29169
+ if (BASEMAP_LAND_TEXT.has(key)) return "landLabels";
29170
+ if (BASEMAP_WATER_TEXT.has(key)) return "waterLabels";
29171
+ return null;
29172
+ }
29173
+ const cls = f.objectClass;
29174
+ if (cls === void 0) return null;
29175
+ if (DEPTH_FIGURE_CLASSES.has(cls)) return "depthNumbers";
29176
+ if (LAND_TEXT_CLASSES.has(cls)) return "landLabels";
29177
+ if (WATER_TEXT_CLASSES.has(cls)) return "waterLabels";
29178
+ if (SYMBOL_ANNOTATION_TEXT_CLASSES.has(cls)) return "chartIcons";
29179
+ return null;
29180
+ }
29181
+ function iconSliderFor(layer) {
29182
+ const f = factsOf(layer);
29183
+ if (f.source !== void 0 && BASEMAP_SOURCES.has(f.source)) return null;
29184
+ return f.objectClass === void 0 ? null : "chartIcons";
29185
+ }
29186
+ function mentionsZoom(v) {
29187
+ if (Array.isArray(v)) {
29188
+ if (v.length === 1 && v[0] === "zoom") return true;
29189
+ return v.some(mentionsZoom);
29190
+ }
29191
+ if (v !== null && typeof v === "object") return Object.values(v).some(mentionsZoom);
29192
+ return false;
29193
+ }
29194
+ function scaledOutput(v, factor) {
29195
+ return typeof v === "number" ? round(v * factor) : ["*", v, factor];
29196
+ }
29197
+ function round(n) {
29198
+ return Math.round(n * 1e3) / 1e3;
29199
+ }
29200
+ function scaleSizeExpression(value, factor, fallback) {
29201
+ if (!Number.isFinite(factor) || factor <= 0) return null;
29202
+ if (value === void 0) return round(fallback * factor);
29203
+ if (factor === 1) return value;
29204
+ if (typeof value === "number") return round(value * factor);
29205
+ if (Array.isArray(value)) {
29206
+ const op = value[0];
29207
+ if (typeof op !== "string") return null;
29208
+ if (op === "interpolate" || op === "interpolate-hcl" || op === "interpolate-lab") {
29209
+ if (value.length < 5 || value.length % 2 !== 1) return null;
29210
+ const out = [...value];
29211
+ for (let i = 4; i < out.length; i += 2) out[i] = scaledOutput(out[i], factor);
29212
+ return out;
29213
+ }
29214
+ if (op === "step") {
29215
+ if (value.length < 3 || value.length % 2 !== 1) return null;
29216
+ const out = [...value];
29217
+ for (let i = 2; i < out.length; i += 2) out[i] = scaledOutput(out[i], factor);
29218
+ return out;
29219
+ }
29220
+ return mentionsZoom(value) ? null : ["*", value, factor];
29221
+ }
29222
+ if (value !== null && typeof value === "object") {
29223
+ const stops = value.stops;
29224
+ if (!Array.isArray(stops)) return null;
29225
+ const outStops = [];
29226
+ for (const stop of stops) {
29227
+ if (!Array.isArray(stop) || stop.length !== 2 || typeof stop[1] !== "number") return null;
29228
+ outStops.push([stop[0], round(stop[1] * factor)]);
29229
+ }
29230
+ return { ...value, stops: outStops };
29231
+ }
29232
+ return null;
29233
+ }
29234
+ function haloFactor(factor) {
29235
+ return factor > 1 ? 1 + (factor - 1) / 2 : 1;
29236
+ }
29237
+ var SERVED_SOUNDING_PADDING_PX = 6;
29238
+ var SOUNDING_PADDING_PER_FACTOR = 6.25;
29239
+ function soundingPadding(factor, served = SERVED_SOUNDING_PADDING_PX) {
29240
+ if (factor <= 1) return served;
29241
+ return round(Math.max(0, served - SOUNDING_PADDING_PER_FACTOR * (factor - 1)));
29242
+ }
29243
+ var MAPLIBRE_DEFAULT_TEXT_PADDING_PX = 2;
29244
+ function soundingPaddingValue(served, factor) {
29245
+ if (factor <= 1) return served;
29246
+ if (served === void 0) return soundingPadding(factor, MAPLIBRE_DEFAULT_TEXT_PADDING_PX);
29247
+ if (typeof served === "number") return soundingPadding(factor, served);
29248
+ if (!Array.isArray(served) || typeof served[0] !== "string") return served;
29249
+ const first = served[0] === "interpolate" ? 4 : served[0] === "step" ? 2 : null;
29250
+ if (first === null) return served;
29251
+ const out = [...served];
29252
+ for (let i = first; i < out.length; i += 2) {
29253
+ if (typeof out[i] !== "number") return served;
29254
+ out[i] = soundingPadding(factor, out[i]);
29255
+ }
29256
+ return out;
29257
+ }
29258
+ function factorOf(scales, size) {
29259
+ return clampChartSymbolScale(scales[size]) / 100;
29260
+ }
29261
+ var OUTRANK_LABELS = { kind: "outrankLabels" };
29262
+ var CHART_SOUNDINGS_RULE = { kind: "zoomSplit", harbourFrom: 14 };
29263
+ var KEPT_ABOVE_SOUNDINGS_CLASSES = /* @__PURE__ */ new Set(["SEAARE", "LNDARE", "LNDRGN"]);
29264
+ function keptAboveSoundings(layer, splittingLights = false) {
29265
+ const facts = factsOf(layer);
29266
+ if (splittingLights && facts.objectClass === "LIGHTS") return false;
29267
+ if (facts.labelPriority === HAZARD_LABEL_PRIORITY) return true;
29268
+ if (facts.source !== void 0 && BASEMAP_SOURCES.has(facts.source)) return true;
29269
+ return KEPT_ABOVE_SOUNDINGS_CLASSES.has(facts.objectClass ?? "");
29270
+ }
29271
+ function fromZoom(z, value) {
29272
+ return ["step", ["zoom"], value ?? false, z, true];
29273
+ }
29274
+ function labelSlidersOffStandard(scales) {
29275
+ return ["landLabels", "waterLabels", "depthNumbers", "chartIcons"].some((s) => clampChartSymbolScale(scales[s]) !== 100);
29276
+ }
29277
+ function applyChartSymbolScalesToLayer(layer, scales, yieldText = false) {
29278
+ if (layer.type !== "symbol") return layer;
29279
+ const layout = layer.layout ?? {};
29280
+ const hasText = layout["text-field"] !== void 0;
29281
+ const hasIcon = layout["icon-image"] !== void 0;
29282
+ if (!hasText && !hasIcon) return layer;
29283
+ const facts = factsOf(layer);
29284
+ const nextLayout = { ...layout };
29285
+ let nextPaint = null;
29286
+ let touched = false;
29287
+ if (hasText) {
29288
+ const slider = textSliderFor(layer);
29289
+ const isDepthFigure = slider === "depthNumbers";
29290
+ const sliderFactor = slider === null ? 1 : factorOf(scales, slider);
29291
+ const f = isDepthFigure && facts.objectClass === "DEPCNT" ? contourValueFactor(sliderFactor) : sliderFactor;
29292
+ const size = f === 1 ? null : scaleSizeExpression(layout["text-size"], f, 16);
29293
+ if (size !== null) {
29294
+ touched = true;
29295
+ nextLayout["text-size"] = size;
29296
+ if (f > 1) {
29297
+ if (isDepthFigure) {
29298
+ const semibold = semiboldFontStack(layout["text-font"]);
29299
+ if (JSON.stringify(semibold) !== JSON.stringify(layout["text-font"])) nextLayout["text-font"] = semibold;
29300
+ if (facts.objectClass === "SOUNDG") {
29301
+ const padding = soundingPaddingValue(layout["text-padding"], f);
29302
+ if (padding !== void 0) nextLayout["text-padding"] = padding;
29303
+ } else if (facts.labelPriority === HAZARD_LABEL_PRIORITY) {
29304
+ nextLayout["text-ignore-placement"] = true;
29305
+ nextLayout["text-allow-overlap"] = true;
29306
+ }
29307
+ } else {
29308
+ nextLayout["text-ignore-placement"] = true;
29309
+ if (facts.labelPriority === HAZARD_LABEL_PRIORITY) nextLayout["text-allow-overlap"] = true;
29310
+ }
29311
+ const halo = layer.paint?.["text-halo-width"];
29312
+ if (isDepthFigure && halo !== void 0) {
29313
+ const wider = scaleSizeExpression(halo, haloFactor(sliderFactor), 0);
29314
+ if (wider !== null) nextPaint = { ...layer.paint ?? {}, "text-halo-width": wider };
29315
+ }
29316
+ }
29317
+ }
29318
+ if (yieldText && facts.objectClass !== "SOUNDG") {
29319
+ touched = true;
29320
+ nextLayout["text-ignore-placement"] = true;
29321
+ }
29322
+ }
29323
+ if (hasIcon) {
29324
+ const slider = iconSliderFor(layer);
29325
+ const f = slider === null ? 1 : factorOf(scales, slider);
29326
+ const size = f === 1 ? null : scaleSizeExpression(layout["icon-size"], f, 1);
29327
+ if (size !== null) {
29328
+ touched = true;
29329
+ nextLayout["icon-size"] = size;
29330
+ if (f > 1) nextLayout["icon-ignore-placement"] = true;
29331
+ }
29332
+ }
29333
+ if (!touched) return layer;
29334
+ return { ...layer, layout: nextLayout, ...nextPaint ? { paint: nextPaint } : {} };
29335
+ }
29336
+ var isSoundingText = (l) => l.type === "symbol" && l.layout?.["text-field"] !== void 0 && factsOf(l).objectClass === "SOUNDG";
29337
+ function applyChartSymbolScales(layers, scales, rule = CHART_SOUNDINGS_RULE) {
29338
+ if (scales === void 0 || ["landLabels", "waterLabels", "depthNumbers", "chartIcons"].every((s) => clampChartSymbolScale(scales[s]) === 100)) {
29339
+ return layers;
29340
+ }
29341
+ const outrank = labelSlidersOffStandard(scales);
29342
+ const soundingsAt = layers.findIndex(isSoundingText);
29343
+ const split = rule.kind === "zoomSplit" ? rule : null;
29344
+ const demoted = [];
29345
+ const kept = [];
29346
+ layers.forEach((l, i) => {
29347
+ const above = outrank && soundingsAt !== -1 && i > soundingsAt;
29348
+ const hasText = l.type === "symbol" && l.layout?.["text-field"] !== void 0;
29349
+ if (split !== null && above && hasText && !isSoundingText(l) && !keptAboveSoundings(l, split.splitLights === true)) {
29350
+ const own = applyChartSymbolScalesToLayer(l, scales, false);
29351
+ const layout = own.layout ?? {};
29352
+ demoted.push({
29353
+ ...own,
29354
+ layout: {
29355
+ ...layout,
29356
+ "text-allow-overlap": fromZoom(split.harbourFrom, layout["text-allow-overlap"]),
29357
+ "text-ignore-placement": fromZoom(split.harbourFrom, layout["text-ignore-placement"])
29358
+ }
29359
+ });
29360
+ return;
29361
+ }
29362
+ kept.push(applyChartSymbolScalesToLayer(l, scales, above));
29363
+ });
29364
+ if (demoted.length === 0) return kept;
29365
+ const at = kept.findIndex(isSoundingText);
29366
+ return [...kept.slice(0, at), ...demoted, ...kept.slice(at)];
29367
+ }
29368
+ function demotedBelowSoundings(layers, scales, rule = CHART_SOUNDINGS_RULE) {
29369
+ if (scales === void 0 || rule.kind !== "zoomSplit" || !labelSlidersOffStandard(scales)) return [];
29370
+ const soundingsAt = layers.findIndex(isSoundingText);
29371
+ if (soundingsAt === -1) return [];
29372
+ return layers.filter((l, i) => i > soundingsAt && l.type === "symbol" && l.layout?.["text-field"] !== void 0 && !isSoundingText(l) && !keptAboveSoundings(l, rule.splitLights === true)).map((l) => l.id);
29373
+ }
29374
+ function chartSymbolSizingCensus(layers) {
29375
+ const unclassified = [];
29376
+ const unscalable = [];
29377
+ for (const l of layers) {
29378
+ if (l.type !== "symbol") continue;
29379
+ const layout = l.layout ?? {};
29380
+ if (layout["text-field"] !== void 0) {
29381
+ if (textSliderFor(l) === null) unclassified.push(`${l.id} text`);
29382
+ else if (scaleSizeExpression(layout["text-size"], 2, 16) === null) unscalable.push(`${l.id} text`);
29383
+ }
29384
+ if (layout["icon-image"] !== void 0) {
29385
+ if (iconSliderFor(l) === null) unclassified.push(`${l.id} icon`);
29386
+ else if (scaleSizeExpression(layout["icon-size"], 2, 1) === null) unscalable.push(`${l.id} icon`);
29387
+ }
29388
+ }
29389
+ return { unclassified, unscalable };
29031
29390
  }
29032
29391
 
29033
29392
  // src/atlas/base-bundle.ts
@@ -30370,7 +30729,7 @@ function buildLabelLayer2(objectClass2, ct, sourceId = DEFAULT_REGION, depthUnit
30370
30729
  if (getLabelBehavior(objectClass2) === "orientation-cross-band") {
30371
30730
  layer.filter = LABEL_ANCHOR_FILTER;
30372
30731
  }
30373
- return applyDepthLabelSize(objectClass2, layer, labelOpts.depthLabelSize);
30732
+ return layer;
30374
30733
  }
30375
30734
  function getGeomTypesForClass(objectClass2, defaultType) {
30376
30735
  if (SYMBOL_MAP[objectClass2] && defaultType === "symbol") {
@@ -31525,8 +31884,7 @@ function generateStyle(palette = "DAY", opts = {}) {
31525
31884
  label: buildLabelLayer2(objectClass2, palette, sourceId, opts.depthUnits ?? "meters", {
31526
31885
  safetyContour: opts.safetyContour,
31527
31886
  twoShadeSoundings: opts.twoShadeSoundings,
31528
- soundingFontWeight: opts.soundingFontWeight,
31529
- depthLabelSize: opts.depthLabelSize
31887
+ soundingFontWeight: opts.soundingFontWeight
31530
31888
  })
31531
31889
  });
31532
31890
  }
@@ -31951,7 +32309,9 @@ function generateStyle(palette = "DAY", opts = {}) {
31951
32309
  layers: finalLayers
31952
32310
  };
31953
32311
  const familyStyle = symbolSet === "s101" ? applyS101SymbolSet(style) : symbolSet === "chrt" ? applyChrtSymbolSet(style, palette) : symbolSet === "raster" ? applyRasterSymbolSet(style) : style;
31954
- return applyEinkPortrayal(familyStyle, palette, { safetyContour: opts.safetyContour });
32312
+ const portrayed = applyEinkPortrayal(familyStyle, palette, { safetyContour: opts.safetyContour });
32313
+ const sized = applyChartSymbolScales(portrayed.layers, opts.symbolScales, opts.soundingsRule);
32314
+ return sized === portrayed.layers ? portrayed : { ...portrayed, layers: sized };
31955
32315
  }
31956
32316
  function generateStyleJSON(palette = "DAY", opts = {}) {
31957
32317
  return JSON.stringify(generateStyle(palette, opts), null, 2);
@@ -32858,6 +33218,12 @@ var Chrt = class {
32858
33218
  CHART_BAND_CODES,
32859
33219
  CHART_CASCADE_CODES,
32860
33220
  CHART_SECTIONS,
33221
+ CHART_SOUNDINGS_RULE,
33222
+ CHART_SYMBOL_SCALE,
33223
+ CHART_SYMBOL_SIZES,
33224
+ CHART_SYMBOL_SIZE_LABELS,
33225
+ CHART_SYMBOL_SIZE_REACH,
33226
+ CHART_SYMBOL_SIZE_WIRE,
32861
33227
  CHRTRASTER_REF_CROPS,
32862
33228
  CHRTRASTER_SVGS,
32863
33229
  CHRT_ATON_COLORS,
@@ -32871,7 +33237,6 @@ var Chrt = class {
32871
33237
  ChrtError,
32872
33238
  DEFAULT_CLICK_TOLERANCE,
32873
33239
  DEFAULT_CUSTOM_STYLE_CONFIG,
32874
- DEFAULT_DEPTH_LABEL_SIZE,
32875
33240
  DEFAULT_INSPECT_CLASS_RANK,
32876
33241
  DEFAULT_LABEL_SETTINGS,
32877
33242
  DEFAULT_NAV_AID_SETTINGS,
@@ -32883,14 +33248,14 @@ var Chrt = class {
32883
33248
  DEFAULT_WATER_BODY_SETTINGS,
32884
33249
  DEPARE_FILL_BRANCH_TOKENS,
32885
33250
  DEPARE_FILL_FALLBACK_TOKEN,
32886
- DEPTH_LABEL_CLASSES,
32887
- DEPTH_LABEL_SIZES,
33251
+ DEPTH_FIGURE_CLASSES,
32888
33252
  DRAPEABLE_LAYER_TYPES,
32889
33253
  EINK_COLOR_TABLES,
32890
33254
  EINK_DANGER_PATTERN,
32891
33255
  EINK_DOTS_PATTERN,
32892
33256
  EINK_HATCH_PATTERN,
32893
33257
  EINK_MONO_GREYS,
33258
+ HAZARD_LABEL_PRIORITY,
32894
33259
  INSPECT_CLASS_RANK,
32895
33260
  INSPECT_RANK_DEVIATIONS,
32896
33261
  InteractClient,
@@ -32906,7 +33271,8 @@ var Chrt = class {
32906
33271
  LAND_ATTRIBUTION,
32907
33272
  LAND_BUILD_MAXZOOM,
32908
33273
  LAND_REGION,
32909
- LARGE_SOUNDING_PADDING_PX,
33274
+ LAND_TEXT_CLASSES,
33275
+ MAPLIBRE_DEFAULT_TEXT_PADDING_PX,
32910
33276
  NAUTICAL_SYMBOLS,
32911
33277
  NAV_AID_LAYER_GROUPS,
32912
33278
  NAV_AID_QUERY_LAYERS,
@@ -32915,6 +33281,7 @@ var Chrt = class {
32915
33281
  NON_SOLAS_DISCLAIMER,
32916
33282
  NON_SOLAS_DISCLAIMER_SHORT,
32917
33283
  OPAQUE_SPLIT_OF,
33284
+ OUTRANK_LABELS,
32918
33285
  OfflineError,
32919
33286
  OfflineStyleError,
32920
33287
  PLACENAME_LAND_CLASSES,
@@ -32949,9 +33316,14 @@ var Chrt = class {
32949
33316
  S52_LOOKUP,
32950
33317
  S52_NIGHT,
32951
33318
  S52_PATTERN_SPRITE_PREFIX,
33319
+ SERVED_FONT_STACKS,
33320
+ SERVED_SOUNDING_PADDING_PX,
32952
33321
  SIGPER_TOLERANCE_SECONDS,
32953
33322
  SIGSEQ_MAX_TERMS,
32954
33323
  SOUNDING_LAYERS,
33324
+ SOUNDING_PADDING_PER_FACTOR,
33325
+ STANDARD_CHART_SYMBOL_SCALES,
33326
+ SYMBOL_ANNOTATION_TEXT_CLASSES,
32955
33327
  SYMBOL_FAMILIES,
32956
33328
  SYMBOL_FAMILY_META,
32957
33329
  SYMBOL_GROUPS,
@@ -32959,12 +33331,14 @@ var Chrt = class {
32959
33331
  TileAuth,
32960
33332
  TileTokenError,
32961
33333
  WATER_BODY_LAYER_GROUPS,
33334
+ WATER_TEXT_CLASSES,
32962
33335
  WeatherEndpoint,
32963
33336
  applyBaseBundle,
33337
+ applyChartSymbolScales,
33338
+ applyChartSymbolScalesToLayer,
32964
33339
  applyChrtSymbolSet,
32965
33340
  applyColorTheme,
32966
33341
  applyCustomStyleSettings,
32967
- applyDepthLabelSize,
32968
33342
  applyEinkPortrayal,
32969
33343
  applyRasterSymbolSet,
32970
33344
  applyS101SymbolSet,
@@ -32991,19 +33365,24 @@ var Chrt = class {
32991
33365
  capLuminance,
32992
33366
  cellBandCharacters,
32993
33367
  cellBandMatch,
33368
+ chartSymbolSizingCensus,
32994
33369
  chrtAtonTintExpression,
32995
33370
  chrtHouseColor,
32996
33371
  chrtLightTintExpression,
33372
+ clampChartSymbolScale,
32997
33373
  collectCandidates,
32998
33374
  collectClickCandidates,
32999
33375
  combineWithBandFilter,
33376
+ contourValueFactor,
33000
33377
  contrastRatio,
33001
33378
  daymarkColor,
33002
33379
  decimateFeatures,
33003
33380
  decodeAreaFeatureProps,
33004
33381
  decodeBridgeProps,
33005
33382
  decodeCandidate,
33383
+ decodeChartSymbolScale,
33006
33384
  decodeNavAidProps,
33385
+ demotedBelowSoundings,
33007
33386
  depareColor,
33008
33387
  depareFillExpression,
33009
33388
  depthAreaClassLayerId,
@@ -33013,6 +33392,7 @@ var Chrt = class {
33013
33392
  drapedFirst,
33014
33393
  extractNavAidDesignation,
33015
33394
  featureIdentity,
33395
+ fromZoom,
33016
33396
  generateCustomStyle,
33017
33397
  generateSpriteManifest,
33018
33398
  generateSpriteSheet,
@@ -33040,9 +33420,11 @@ var Chrt = class {
33040
33420
  getThemedS101Svg,
33041
33421
  getThemedS52Svg,
33042
33422
  getTopmarkMeaning,
33423
+ haloFactor,
33043
33424
  hazardColor,
33044
33425
  hazardFillExpression,
33045
33426
  iconExpressionForFamily,
33427
+ iconSliderFor,
33046
33428
  isDepthAreaClassLayerId,
33047
33429
  isDrapeable,
33048
33430
  isEinkColorTable,
@@ -33054,6 +33436,7 @@ var Chrt = class {
33054
33436
  isSoundingLayerVisible,
33055
33437
  isVisibleInMode,
33056
33438
  isWaterBodyLayerVisible,
33439
+ keptAboveSoundings,
33057
33440
  labelSortKey,
33058
33441
  lampRhythmColour,
33059
33442
  lampRhythmOpacity,
@@ -33066,7 +33449,6 @@ var Chrt = class {
33066
33449
  normalizeTheme,
33067
33450
  opaqueSplitBaseOf,
33068
33451
  paginate,
33069
- parseDepthLabelSize,
33070
33452
  parseListCodes,
33071
33453
  parseSigseqTerms,
33072
33454
  parseSymbolFamily,
@@ -33089,12 +33471,19 @@ var Chrt = class {
33089
33471
  safetyContourValues,
33090
33472
  sanitizeCustomStyleConfig,
33091
33473
  scaleLinearLight,
33474
+ scaleSizeExpression,
33092
33475
  scaleSizeValue,
33093
33476
  scaminToMinZoom,
33094
33477
  sectorLimitToArcBearing,
33478
+ semiboldFontStack,
33479
+ snapChartSymbolScale,
33480
+ soundingPadding,
33481
+ soundingPaddingValue,
33095
33482
  splitOpaqueDepthAreas,
33483
+ stepChartSymbolScale,
33096
33484
  styleModeBand,
33097
33485
  terrainStackCount,
33486
+ textSliderFor,
33098
33487
  themeChrtGlyph,
33099
33488
  tileTemplate,
33100
33489
  uncoveredSectorArcs,