@chrtco/sdk 0.10.25 → 0.10.27

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.cts CHANGED
@@ -1836,12 +1836,21 @@ interface DecodedAreaFeature {
1836
1836
  /** Decode properties for area/hazard/regulated features into a human-readable record. */
1837
1837
  declare function decodeAreaFeatureProps(layerName: string, props: Record<string, unknown>): DecodedAreaFeature;
1838
1838
  interface SectorInfo {
1839
+ /** `SECTR1` as charted: degrees true FROM SEAWARD, looking at the light. */
1839
1840
  sectorStart: number;
1841
+ /** `SECTR2` as charted: degrees true FROM SEAWARD, looking at the light. */
1840
1842
  sectorEnd: number;
1841
1843
  colour: string;
1842
1844
  colourHex: string;
1843
1845
  notation: string;
1844
1846
  nominalRange?: number | null;
1847
+ /**
1848
+ * 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.
1852
+ */
1853
+ allRound?: boolean;
1845
1854
  }
1846
1855
  interface DecodedNavAid {
1847
1856
  name: string;
@@ -1926,25 +1935,67 @@ interface SectorArcFeatureCollection {
1926
1935
  type: "FeatureCollection";
1927
1936
  features: SectorArcFeature[];
1928
1937
  }
1938
+ /**
1939
+ * The arcs (charted from-seaward degrees, clockwise start→end) that a set of
1940
+ * sectors leaves uncovered. Used to draw an all-round light that shares its
1941
+ * position with sectored lights: it shows everywhere the sectors do not.
1942
+ *
1943
+ * Returns `[]` when the sectors already cover the full circle, and a single
1944
+ * `{ start: 0, end: 0 }` (a full 360° sweep) when there are no sectors.
1945
+ */
1946
+ declare function uncoveredSectorArcs(sectors: ReadonlyArray<{
1947
+ sectorStart: number;
1948
+ sectorEnd: number;
1949
+ }>): Array<{
1950
+ start: number;
1951
+ end: number;
1952
+ }>;
1929
1953
  /**
1930
1954
  * Build all sectors from multiple LIGHTS features at the same position.
1931
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).
1932
1964
  */
1933
1965
  declare function buildSectorsFromFeatures(features: Array<{
1934
1966
  properties: Record<string, unknown>;
1935
1967
  }>): SectorInfo[];
1968
+ /**
1969
+ * Convert a charted sector limit (`SECTR1`/`SECTR2`) into the bearing FROM
1970
+ * THE LIGHT at which its limit line is drawn on the chart.
1971
+ *
1972
+ * S-57 (and the USCG Light List) give sector limits as true bearings FROM
1973
+ * SEAWARD — the bearing of the light as observed from a vessel. A vessel that
1974
+ * sees the light bearing 000° is due SOUTH of it, so the arc that vessel sits
1975
+ * in is drawn on the reciprocal: limit + 180°. S-52 LIGHTS05 applies the same
1976
+ * reciprocal before drawing. Adding 180° to both limits preserves the
1977
+ * clockwise SECTR1→SECTR2 sense, so the sweep is unchanged.
1978
+ *
1979
+ * Drawing the raw value put every sector on the opposite side of the light —
1980
+ * the "red where white should be" report from the Maine coast (Hendricks
1981
+ * Head: W 000°–180°, R 180°–000°, painted white over Southport Island and
1982
+ * red over the Sheepscot River).
1983
+ */
1984
+ declare function sectorLimitToArcBearing(limitDegFromSeaward: number): number;
1936
1985
  /**
1937
1986
  * Generate a GeoJSON arc polygon for a sector light.
1938
- * Bearings are TRUE bearings FROM the light (as seen FROM a vessel).
1939
- * S-57 SECTR1/SECTR2 define the arc as seen FROM seaward looking AT the light,
1940
- * so we draw arcs in bearing order from the light's position.
1987
+ *
1988
+ * `startBearing`/`endBearing` are the CHARTED sector limits — S-57 SECTR1 and
1989
+ * SECTR2, degrees true from seaward, clockwise from start to end. The
1990
+ * reciprocal is applied here (see `sectorLimitToArcBearing`) so the polygon
1991
+ * lands on the side of the light the sector is actually visible from.
1941
1992
  *
1942
1993
  * When `innerRadiusNm > 0`, the polygon is an annulus segment (band) —
1943
1994
  * a ring slice between the inner and outer radius — instead of a pie wedge.
1944
1995
  *
1945
1996
  * @param center [lng, lat]
1946
- * @param startBearing degrees true (clockwise from north)
1947
- * @param endBearing degrees true
1997
+ * @param startBearing SECTR1 — degrees true FROM SEAWARD (clockwise from north)
1998
+ * @param endBearing SECTR2 — degrees true FROM SEAWARD
1948
1999
  * @param radiusNm outer radius in nautical miles
1949
2000
  * @param innerRadiusNm inner radius in nautical miles (0 = pie wedge)
1950
2001
  * @param steps number of arc segments
@@ -4696,4 +4747,4 @@ declare class Chrt {
4696
4747
  warmTiles(region?: string): Promise<TileTokenResponse>;
4697
4748
  }
4698
4749
 
4699
- 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_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, styleModeBand, tileTemplate, withinBboxFilter, worldMinusBboxPolygon };
4750
+ 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_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 };
package/dist/index.d.ts CHANGED
@@ -1836,12 +1836,21 @@ interface DecodedAreaFeature {
1836
1836
  /** Decode properties for area/hazard/regulated features into a human-readable record. */
1837
1837
  declare function decodeAreaFeatureProps(layerName: string, props: Record<string, unknown>): DecodedAreaFeature;
1838
1838
  interface SectorInfo {
1839
+ /** `SECTR1` as charted: degrees true FROM SEAWARD, looking at the light. */
1839
1840
  sectorStart: number;
1841
+ /** `SECTR2` as charted: degrees true FROM SEAWARD, looking at the light. */
1840
1842
  sectorEnd: number;
1841
1843
  colour: string;
1842
1844
  colourHex: string;
1843
1845
  notation: string;
1844
1846
  nominalRange?: number | null;
1847
+ /**
1848
+ * 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.
1852
+ */
1853
+ allRound?: boolean;
1845
1854
  }
1846
1855
  interface DecodedNavAid {
1847
1856
  name: string;
@@ -1926,25 +1935,67 @@ interface SectorArcFeatureCollection {
1926
1935
  type: "FeatureCollection";
1927
1936
  features: SectorArcFeature[];
1928
1937
  }
1938
+ /**
1939
+ * The arcs (charted from-seaward degrees, clockwise start→end) that a set of
1940
+ * sectors leaves uncovered. Used to draw an all-round light that shares its
1941
+ * position with sectored lights: it shows everywhere the sectors do not.
1942
+ *
1943
+ * Returns `[]` when the sectors already cover the full circle, and a single
1944
+ * `{ start: 0, end: 0 }` (a full 360° sweep) when there are no sectors.
1945
+ */
1946
+ declare function uncoveredSectorArcs(sectors: ReadonlyArray<{
1947
+ sectorStart: number;
1948
+ sectorEnd: number;
1949
+ }>): Array<{
1950
+ start: number;
1951
+ end: number;
1952
+ }>;
1929
1953
  /**
1930
1954
  * Build all sectors from multiple LIGHTS features at the same position.
1931
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).
1932
1964
  */
1933
1965
  declare function buildSectorsFromFeatures(features: Array<{
1934
1966
  properties: Record<string, unknown>;
1935
1967
  }>): SectorInfo[];
1968
+ /**
1969
+ * Convert a charted sector limit (`SECTR1`/`SECTR2`) into the bearing FROM
1970
+ * THE LIGHT at which its limit line is drawn on the chart.
1971
+ *
1972
+ * S-57 (and the USCG Light List) give sector limits as true bearings FROM
1973
+ * SEAWARD — the bearing of the light as observed from a vessel. A vessel that
1974
+ * sees the light bearing 000° is due SOUTH of it, so the arc that vessel sits
1975
+ * in is drawn on the reciprocal: limit + 180°. S-52 LIGHTS05 applies the same
1976
+ * reciprocal before drawing. Adding 180° to both limits preserves the
1977
+ * clockwise SECTR1→SECTR2 sense, so the sweep is unchanged.
1978
+ *
1979
+ * Drawing the raw value put every sector on the opposite side of the light —
1980
+ * the "red where white should be" report from the Maine coast (Hendricks
1981
+ * Head: W 000°–180°, R 180°–000°, painted white over Southport Island and
1982
+ * red over the Sheepscot River).
1983
+ */
1984
+ declare function sectorLimitToArcBearing(limitDegFromSeaward: number): number;
1936
1985
  /**
1937
1986
  * Generate a GeoJSON arc polygon for a sector light.
1938
- * Bearings are TRUE bearings FROM the light (as seen FROM a vessel).
1939
- * S-57 SECTR1/SECTR2 define the arc as seen FROM seaward looking AT the light,
1940
- * so we draw arcs in bearing order from the light's position.
1987
+ *
1988
+ * `startBearing`/`endBearing` are the CHARTED sector limits — S-57 SECTR1 and
1989
+ * SECTR2, degrees true from seaward, clockwise from start to end. The
1990
+ * reciprocal is applied here (see `sectorLimitToArcBearing`) so the polygon
1991
+ * lands on the side of the light the sector is actually visible from.
1941
1992
  *
1942
1993
  * When `innerRadiusNm > 0`, the polygon is an annulus segment (band) —
1943
1994
  * a ring slice between the inner and outer radius — instead of a pie wedge.
1944
1995
  *
1945
1996
  * @param center [lng, lat]
1946
- * @param startBearing degrees true (clockwise from north)
1947
- * @param endBearing degrees true
1997
+ * @param startBearing SECTR1 — degrees true FROM SEAWARD (clockwise from north)
1998
+ * @param endBearing SECTR2 — degrees true FROM SEAWARD
1948
1999
  * @param radiusNm outer radius in nautical miles
1949
2000
  * @param innerRadiusNm inner radius in nautical miles (0 = pie wedge)
1950
2001
  * @param steps number of arc segments
@@ -4696,4 +4747,4 @@ declare class Chrt {
4696
4747
  warmTiles(region?: string): Promise<TileTokenResponse>;
4697
4748
  }
4698
4749
 
4699
- 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_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, styleModeBand, tileTemplate, withinBboxFilter, worldMinusBboxPolygon };
4750
+ 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_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 };
package/dist/index.js CHANGED
@@ -3166,13 +3166,54 @@ function buildFlashPattern(decoded) {
3166
3166
  const totalCycle = phases.reduce((sum, p) => sum + p.duration, 0);
3167
3167
  return { phases, totalCycle, notation };
3168
3168
  }
3169
+ function uncoveredSectorArcs(sectors) {
3170
+ const norm = (d) => (d % 360 + 360) % 360;
3171
+ const flat = [];
3172
+ for (const sec of sectors) {
3173
+ const a = norm(sec.sectorStart);
3174
+ let sweep = norm(sec.sectorEnd) - a;
3175
+ if (sweep <= 0) sweep += 360;
3176
+ if (sweep >= 360) return [];
3177
+ const b = a + sweep;
3178
+ if (b <= 360) flat.push([a, b]);
3179
+ else {
3180
+ flat.push([a, 360]);
3181
+ flat.push([0, b - 360]);
3182
+ }
3183
+ }
3184
+ if (flat.length === 0) return [{ start: 0, end: 0 }];
3185
+ flat.sort((x, y) => x[0] - y[0]);
3186
+ const merged = [];
3187
+ for (const [a, b] of flat) {
3188
+ const last = merged[merged.length - 1];
3189
+ if (last && a <= last[1]) last[1] = Math.max(last[1], b);
3190
+ else merged.push([a, b]);
3191
+ }
3192
+ const gaps = [];
3193
+ let cursor = 0;
3194
+ for (const [a, b] of merged) {
3195
+ if (a > cursor) gaps.push([cursor, a]);
3196
+ cursor = Math.max(cursor, b);
3197
+ }
3198
+ if (cursor < 360) gaps.push([cursor, 360]);
3199
+ if (gaps.length >= 2 && gaps[0][0] === 0 && gaps[gaps.length - 1][1] === 360) {
3200
+ const first = gaps.shift();
3201
+ const last = gaps.pop();
3202
+ gaps.push([last[0], first[1]]);
3203
+ }
3204
+ return gaps.filter(([a, b]) => Math.abs(b - a) >= 0.05 || b < a).map(([a, b]) => ({ start: norm(a), end: norm(b) }));
3205
+ }
3169
3206
  function buildSectorsFromFeatures(features) {
3170
3207
  const sectors = [];
3208
+ const allRound = [];
3171
3209
  for (const f of features) {
3172
3210
  const props = f.properties ?? {};
3173
3211
  const s1 = props.SECTR1 != null ? Number(props.SECTR1) : null;
3174
3212
  const s2 = props.SECTR2 != null ? Number(props.SECTR2) : null;
3175
- if (s1 == null || s2 == null || isNaN(s1) || isNaN(s2)) continue;
3213
+ if (s1 == null || s2 == null || isNaN(s1) || isNaN(s2)) {
3214
+ if (props.SECTR1 == null && props.SECTR2 == null && parseCode(props.COLOUR) != null) allRound.push(props);
3215
+ continue;
3216
+ }
3176
3217
  const colourCode = parseCode(props.COLOUR);
3177
3218
  const ce = colourCode ? COLOUR_TABLE[colourCode] : null;
3178
3219
  const litchrCode = parseCode(props.LITCHR);
@@ -3191,15 +3232,44 @@ function buildSectorsFromFeatures(features) {
3191
3232
  nominalRange
3192
3233
  });
3193
3234
  }
3235
+ if (sectors.length > 0 && allRound.length > 0) {
3236
+ const gaps = uncoveredSectorArcs(sectors);
3237
+ for (const props of allRound) {
3238
+ const colourCode = parseCode(props.COLOUR);
3239
+ const ce = colourCode ? COLOUR_TABLE[colourCode] : null;
3240
+ if (!ce) continue;
3241
+ const litchrCode = parseCode(props.LITCHR);
3242
+ const le = litchrCode ? LITCHR_TABLE[litchrCode] : null;
3243
+ const sigper = props.SIGPER != null ? Number(props.SIGPER) : null;
3244
+ const group = parseGroup(props.SIGGRP);
3245
+ const notation = buildNotation(le?.abbr ?? null, [ce.abbr], sigper, group);
3246
+ const valnmr = props.VALNMR != null ? Number(props.VALNMR) : null;
3247
+ const nominalRange = valnmr != null && !isNaN(valnmr) && valnmr > 0 ? valnmr : null;
3248
+ for (const gap of gaps) {
3249
+ sectors.push({
3250
+ sectorStart: gap.start,
3251
+ sectorEnd: gap.end,
3252
+ colour: ce.name,
3253
+ colourHex: ce.hex,
3254
+ notation,
3255
+ nominalRange,
3256
+ allRound: true
3257
+ });
3258
+ }
3259
+ }
3260
+ }
3194
3261
  return sectors;
3195
3262
  }
3263
+ function sectorLimitToArcBearing(limitDegFromSeaward) {
3264
+ return ((limitDegFromSeaward + 180) % 360 + 360) % 360;
3265
+ }
3196
3266
  function buildSectorArcGeoJSON(center, startBearing, endBearing, radiusNm = 0.5, innerRadiusNm = 0, steps = 64) {
3197
3267
  const radiusDeg = radiusNm / 60;
3198
3268
  const innerDeg = innerRadiusNm > 0 ? innerRadiusNm / 60 : 0;
3199
3269
  const [lng, lat] = center;
3200
3270
  const cosLat = Math.cos(lat * Math.PI / 180);
3201
- const s = (startBearing % 360 + 360) % 360;
3202
- const e = (endBearing % 360 + 360) % 360;
3271
+ const s = sectorLimitToArcBearing(startBearing);
3272
+ const e = sectorLimitToArcBearing(endBearing);
3203
3273
  let sweep = e - s;
3204
3274
  if (sweep <= 0) sweep += 360;
3205
3275
  const project = (bearingDeg, rDeg) => {
@@ -3254,7 +3324,7 @@ function buildSectorArcsFC(center, sectors, radiusNm = 0.4, innerRadiusFrac = 0.
3254
3324
  const TICK_INNER_OVERHANG = 0.93;
3255
3325
  for (const sec of sectors) {
3256
3326
  for (const bearing of [sec.sectorStart, sec.sectorEnd]) {
3257
- const rad = bearing * Math.PI / 180;
3327
+ const rad = sectorLimitToArcBearing(bearing) * Math.PI / 180;
3258
3328
  const radiusDeg = radiusNm / 60;
3259
3329
  const innerRadiusDeg = innerNm > 0 ? innerNm / 60 : 0;
3260
3330
  const cosLat = Math.cos(center[1] * Math.PI / 180);
@@ -28415,6 +28485,9 @@ function bandVariantMinzoom(layer, B) {
28415
28485
  if (isExemptOpaqueFill(layer) && FILL_FLOOR_FREE_BANDS.has(B)) {
28416
28486
  return classMinzoom;
28417
28487
  }
28488
+ if (isExemptOpaqueFill(layer)) {
28489
+ return BAND_PRIORITY_RANGES[B].minzoom;
28490
+ }
28418
28491
  return Math.max(classMinzoom, BAND_PRIORITY_RANGES[B].minzoom);
28419
28492
  }
28420
28493
  var GENERALISED_AREA_FILL_CLASSES = /* @__PURE__ */ new Set([
@@ -29815,7 +29888,9 @@ function generateStyle(palette = "DAY", opts = {}) {
29815
29888
  }
29816
29889
  }
29817
29890
  {
29818
- const TERMINAL_FILL_RE = /^s52-(?:LNDARE|DEPARE)-fill-band[456]$/;
29891
+ const TERMINAL_FILL_RE = new RegExp(
29892
+ `^s52-(?:${[...DOMINANCE_EXEMPT_FILL_CLASSES].join("|")})-fill-band[456]$`
29893
+ );
29819
29894
  for (const l of layers) {
29820
29895
  const lay = l;
29821
29896
  if (!TERMINAL_FILL_RE.test(lay.id)) continue;
@@ -29953,7 +30028,7 @@ function generateStyle(palette = "DAY", opts = {}) {
29953
30028
  )) {
29954
30029
  const src = l;
29955
30030
  const landClone = {
29956
- ...l,
30031
+ ...asBaseTan(l),
29957
30032
  id: `${src.id}-overpair`,
29958
30033
  metadata: { ...src.metadata ?? {}, "chrt:role": "charted-land-repaint" }
29959
30034
  };
@@ -29989,6 +30064,21 @@ function generateStyle(palette = "DAY", opts = {}) {
29989
30064
  ...restAbove.slice(pairAt + 1)
29990
30065
  ];
29991
30066
  }
30067
+ {
30068
+ const hsAt = restFinal.findIndex(
30069
+ (l) => l.type === "hillshade"
30070
+ );
30071
+ let lastRepaint = -1;
30072
+ restFinal.forEach((l, i) => {
30073
+ if (/-overpair(-|$)/.test(l.id)) lastRepaint = i;
30074
+ });
30075
+ if (hsAt !== -1 && lastRepaint > hsAt) {
30076
+ const reordered = [...restFinal];
30077
+ const [hs] = reordered.splice(hsAt, 1);
30078
+ reordered.splice(lastRepaint, 0, hs);
30079
+ restFinal = reordered;
30080
+ }
30081
+ }
29992
30082
  return [restFinal[0], ...baseBlock, ...seaare, ...ordered, ...restFinal.slice(1)];
29993
30083
  })() : layers;
29994
30084
  for (const id of [
@@ -31069,8 +31159,10 @@ export {
31069
31159
  sanitizeCustomStyleConfig,
31070
31160
  scaleSizeValue,
31071
31161
  scaminToMinZoom,
31162
+ sectorLimitToArcBearing,
31072
31163
  styleModeBand,
31073
31164
  tileTemplate,
31165
+ uncoveredSectorArcs,
31074
31166
  withinBboxFilter,
31075
31167
  worldMinusBboxPolygon
31076
31168
  };