@geogdev/styles 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/languages.json","../../src/language.ts","../../src/config/features.json","../../src/config/poi.json","../../src/config/zoom.json","../../src/constants.ts","../../src/layers/background.ts","../../src/layers/boundaries.ts","../../src/layers/buildings.ts","../../src/layers/labels.ts","../../src/layers/landcover.ts","../../src/layers/pois.ts","../../src/layers/roads.ts","../../src/layers/transit.ts","../../src/layers/index.ts","../../src/config/styles/dark.json","../../src/config/styles/gray.json","../../src/config/styles/light.json","../../src/config/styles/warm.json","../../src/styles.ts","../../src/index.ts"],"sourcesContent":["[\n {\n \"lang\": \"ar\",\n \"full_name\": \"Arabic\",\n \"script\": \"Arabic\"\n },\n {\n \"lang\": \"cs\",\n \"full_name\": \"Czech\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"bg\",\n \"full_name\": \"Bulgarian\",\n \"script\": \"Cyrillic\"\n },\n {\n \"lang\": \"da\",\n \"full_name\": \"Danish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"de\",\n \"full_name\": \"German\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"el\",\n \"full_name\": \"Greek\",\n \"script\": \"Greek\"\n },\n {\n \"lang\": \"en\",\n \"full_name\": \"English\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"es\",\n \"full_name\": \"Spanish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"et\",\n \"full_name\": \"Estonian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"fa\",\n \"full_name\": \"Persian\",\n \"script\": \"Arabic\"\n },\n {\n \"lang\": \"fi\",\n \"full_name\": \"Finnish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"fr\",\n \"full_name\": \"French\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"ga\",\n \"full_name\": \"Irish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"he\",\n \"full_name\": \"Hebrew\",\n \"script\": \"Hebrew\"\n },\n {\n \"lang\": \"hi\",\n \"full_name\": \"Hindi\",\n \"script\": \"Devanagari\"\n },\n {\n \"lang\": \"hr\",\n \"full_name\": \"Croatian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"hu\",\n \"full_name\": \"Hungarian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"id\",\n \"full_name\": \"Indonesian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"it\",\n \"full_name\": \"Italian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"ja\",\n \"full_name\": \"Japanese\",\n \"script\": \"\"\n },\n {\n \"lang\": \"ko\",\n \"full_name\": \"Korean\",\n \"script\": \"Hangul\"\n },\n {\n \"lang\": \"lt\",\n \"full_name\": \"Lithuanian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"lv\",\n \"full_name\": \"Latvian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"ne\",\n \"full_name\": \"Nepali\",\n \"script\": \"Devanagari\"\n },\n {\n \"lang\": \"nl\",\n \"full_name\": \"Dutch\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"no\",\n \"full_name\": \"Norwegian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"mr\",\n \"full_name\": \"Marathi\",\n \"script\": \"Devanagari\"\n },\n {\n \"lang\": \"mt\",\n \"full_name\": \"Maltese\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"pl\",\n \"full_name\": \"Polish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"pt\",\n \"full_name\": \"Portuguese\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"ro\",\n \"full_name\": \"Romanian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"ru\",\n \"full_name\": \"Russian\",\n \"script\": \"Cyrillic\"\n },\n {\n \"lang\": \"sk\",\n \"full_name\": \"Slovak\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"sl\",\n \"full_name\": \"Slovenian\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"sv\",\n \"full_name\": \"Swedish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"tr\",\n \"full_name\": \"Turkish\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"uk\",\n \"full_name\": \"Ukrainian\",\n \"script\": \"Cyrillic\"\n },\n {\n \"lang\": \"ur\",\n \"full_name\": \"Urdu\",\n \"script\": \"Arabic\"\n },\n {\n \"lang\": \"vi\",\n \"full_name\": \"Vietnamese\",\n \"script\": \"Latin\"\n },\n {\n \"lang\": \"zh-Hans\",\n \"full_name\": \"Chinese (Simplified)\",\n \"script\": \"Han\"\n },\n {\n \"lang\": \"zh-Hant\",\n \"full_name\": \"Chinese (Traditional)\",\n \"script\": \"Han\"\n }\n]\n","import languagesConfig from \"./config/languages.json\";\n\n// Type definition for language entries\ninterface LanguageScriptPair {\n lang: string;\n full_name: string;\n script: string;\n}\n\n// Export the language/script pairs from JSON config\nexport const LANGUAGE_SCRIPT_PAIRS: LanguageScriptPair[] = languagesConfig;\n\nfunction get_name_block(\n script_segment: \"name\" | \"name2\" | \"name3\",\n regular?: string,\n) {\n let script = \"script\";\n\n if (script_segment === \"name\") {\n script = \"script\";\n } else if (script_segment === \"name2\") {\n script = \"script2\";\n } else if (script_segment === \"name3\") {\n script = \"script3\";\n }\n\n return [\n [\"coalesce\", [\"get\", `pgf:${script_segment}`], [\"get\", script_segment]],\n {\n \"text-font\": [\n \"case\",\n [\"==\", [\"get\", script], \"Devanagari\"],\n [\"literal\", [\"Noto Sans Devanagari Regular v1\"]],\n [\"literal\", [regular || \"Noto Sans Regular\"]],\n ],\n },\n ];\n}\n\nfunction is_not_in_target_script(\n lang: string,\n script: string,\n script_segment: \"name\" | \"name2\" | \"name3\",\n) {\n let suffix = \"name\";\n if (script_segment === \"name\") {\n suffix = \"\";\n } else if (script_segment === \"name2\") {\n suffix = \"2\";\n } else if (script_segment === \"name3\") {\n suffix = \"3\";\n }\n\n if (script === \"Latin\") {\n return [\"has\", `script${suffix}`];\n }\n\n if (lang === \"ja\") {\n return [\n \"all\",\n [\"!=\", [\"get\", `script${suffix}`], \"Han\"],\n [\"!=\", [\"get\", `script${suffix}`], \"Hiragana\"],\n [\"!=\", [\"get\", `script${suffix}`], \"Katakana\"],\n [\"!=\", [\"get\", `script${suffix}`], \"Mixed-Japanese\"],\n ];\n }\n\n return [\"!=\", [\"get\", `script${suffix}`], script];\n}\n\nfunction get_font_formatting(script: string) {\n if (script === \"Devanagari\") {\n return {\n \"text-font\": [\"literal\", [\"Noto Sans Devanagari Regular v1\"]],\n };\n }\n return {};\n}\n\nfunction getDefaultScript(lang: string) {\n const pair = LANGUAGE_SCRIPT_PAIRS.find((d) => d.lang === lang);\n return pair === undefined ? \"Latin\" : pair.script;\n}\n\nexport function getCountryName(lang: string, script?: string) {\n const _script = script || getDefaultScript(lang);\n let name_prefix: string;\n if (_script === \"Devanagari\") {\n name_prefix = \"pgf:\";\n } else {\n name_prefix = \"\";\n }\n return [\n \"format\",\n [\"coalesce\", [\"get\", `${name_prefix}name:${lang}`], [\"get\", \"name:en\"]],\n get_font_formatting(_script),\n ];\n}\n\nexport function getMultilineName(\n lang: string,\n script?: string,\n regular?: string,\n) {\n const _script = script || getDefaultScript(lang);\n let name_prefix: string;\n if (_script === \"Devanagari\") {\n name_prefix = \"pgf:\";\n } else {\n name_prefix = \"\";\n }\n\n const result = [\n \"case\",\n [\n \"all\",\n [\"any\", [\"has\", \"name\"], [\"has\", \"pgf:name\"]],\n [\"!\", [\"any\", [\"has\", \"name2\"], [\"has\", \"pgf:name2\"]]],\n [\"!\", [\"any\", [\"has\", \"name3\"], [\"has\", \"pgf:name3\"]]],\n ],\n // The local name has 1 script segment: `name`\n [\n \"case\",\n is_not_in_target_script(lang, _script, \"name\"),\n // `name` is not in the target script\n [\n \"case\",\n [\"any\", [\"is-supported-script\", [\"get\", \"name\"]], [\"has\", \"pgf:name\"]],\n // `name` can be rendered correctly\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"name:en\"], // Always fallback to English\n ],\n get_font_formatting(_script),\n \"\\n\",\n {},\n [\n \"case\",\n [\n \"all\",\n [\"!\", [\"has\", `${name_prefix}name:${lang}`]],\n [\"has\", \"name:en\"],\n [\"!\", [\"has\", \"script\"]],\n ],\n // We did fallback to English in the first line and `name` is Latin\n \"\",\n [\"coalesce\", [\"get\", \"pgf:name\"], [\"get\", \"name\"]],\n ],\n {\n \"text-font\": [\n \"case\",\n [\"==\", [\"get\", \"script\"], \"Devanagari\"],\n [\"literal\", [\"Noto Sans Devanagari Regular v1\"]],\n [\"literal\", [regular || \"Noto Sans Regular\"]],\n ],\n },\n ],\n // `name` cannot be rendered correctly, fallback to `name:en`\n [\"get\", \"name:en\"],\n ],\n // `name` is in the target script\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"pgf:name\"],\n [\"get\", \"name\"],\n ],\n get_font_formatting(_script),\n ],\n ],\n [\n \"all\",\n [\"any\", [\"has\", \"name\"], [\"has\", \"pgf:name\"]],\n [\"any\", [\"has\", \"name2\"], [\"has\", \"pgf:name2\"]],\n [\"!\", [\"any\", [\"has\", \"name3\"], [\"has\", \"pgf:name3\"]]],\n ],\n // The local name has 2 script segments: `name` and `name2`\n [\n \"case\",\n [\n \"all\",\n is_not_in_target_script(lang, _script, \"name\"),\n is_not_in_target_script(lang, _script, \"name2\"),\n ],\n // Both `name` and `name2` are not in the target script\n [\n \"format\",\n [\"get\", `${name_prefix}name:${lang}`],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name\", regular),\n \"\\n\",\n {},\n ...get_name_block(\"name2\", regular),\n ],\n // Either `name` or `name2` is in the target script\n [\n \"case\",\n is_not_in_target_script(lang, _script, \"name2\"),\n // `name2` is not in the target script, therefore `name` is in the target script\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"pgf:name\"],\n [\"get\", \"name\"],\n ],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name2\", regular),\n ],\n // `name2` is in the target script, therefore `name` is not in the target script\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"pgf:name2\"],\n [\"get\", \"name2\"],\n ],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name\", regular),\n ],\n ],\n ],\n // The local name has 3 script segments: `name`, `name2`, and `name3`\n [\n \"case\",\n [\n \"all\",\n is_not_in_target_script(lang, _script, \"name\"),\n is_not_in_target_script(lang, _script, \"name2\"),\n is_not_in_target_script(lang, _script, \"name3\"),\n ],\n // All three `name`, `name2`, and `name3` are not in the target script\n [\n \"format\",\n [\"get\", `${name_prefix}name:${lang}`],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name\", regular),\n \"\\n\",\n {},\n ...get_name_block(\"name2\", regular),\n \"\\n\",\n {},\n ...get_name_block(\"name3\", regular),\n ],\n // Exactly one of the 3 script segments `name`, `name2`, or `name3` is in the target script\n [\n \"case\",\n [\"!\", is_not_in_target_script(lang, _script, \"name\")],\n // `name` is in the target script, and `name2` and `name3` are not\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"pgf:name\"],\n [\"get\", \"name\"],\n ],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name2\", regular),\n \"\\n\",\n {},\n ...get_name_block(\"name3\", regular),\n ],\n [\"!\", is_not_in_target_script(lang, _script, \"name2\")],\n // `name2` is in the target script, and `name` and `name3` are not\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"pgf:name2\"],\n [\"get\", \"name2\"],\n ],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name\", regular),\n \"\\n\",\n {},\n ...get_name_block(\"name3\", regular),\n ],\n // `name3` is in the target script, and `name` and `name2` are not\n [\n \"format\",\n [\n \"coalesce\",\n [\"get\", `${name_prefix}name:${lang}`],\n [\"get\", \"pgf:name3\"],\n [\"get\", \"name3\"],\n ],\n get_font_formatting(_script),\n \"\\n\",\n {},\n ...get_name_block(\"name\", regular),\n \"\\n\",\n {},\n ...get_name_block(\"name2\", regular),\n ],\n ],\n ],\n ];\n return result;\n}\n","{\n \"roadClasses\": {\n \"OTHER\": [\"track\", \"path\"],\n \"MINOR\": [\"minor\", \"residential\", \"unclassified\"],\n \"MAJOR\": [\"primary\", \"secondary\", \"tertiary\"],\n \"HIGHWAY\": [\"motorway\", \"trunk\"],\n \"ALL_MAJOR\": [\"motorway\", \"trunk\", \"primary\", \"secondary\", \"tertiary\"],\n \"ALL_MINOR\": [\n \"minor\",\n \"residential\",\n \"unclassified\",\n \"service\",\n \"track\",\n \"path\"\n ]\n },\n \"landcoverSubclasses\": {\n \"GREEN\": [\n \"park\",\n \"garden\",\n \"golf_course\",\n \"allotments\",\n \"village_green\",\n \"recreation_ground\"\n ],\n \"MEADOW\": [\"meadow\", \"grassland\", \"grass\"]\n },\n \"landuseClasses\": {\n \"GREEN\": [\n \"cemetery\",\n \"pitch\",\n \"playground\",\n \"stadium\",\n \"track\",\n \"theme_park\"\n ],\n \"EDUCATION\": [\"school\", \"university\", \"college\"],\n \"PEDESTRIAN\": [\"pedestrian\", \"dam\"]\n },\n \"placeClasses\": {\n \"SUBPLACE\": [\"neighbourhood\", \"quarter\", \"suburb\"],\n \"LOCALITY\": [\"city\", \"town\", \"village\", \"hamlet\"]\n },\n \"waterClasses\": {\n \"OCEAN\": [\"sea\", \"ocean\"],\n \"WATERWAY\": [\"river\", \"stream\"]\n }\n}\n","{\n \"tiers\": {\n \"TIER_1\": [\"aerodrome\"],\n \"TIER_2\": [\n \"station\",\n \"ferry_terminal\",\n \"hospital\",\n \"park\",\n \"zoo\",\n \"stadium\",\n \"cemetery\",\n \"university\",\n \"college\"\n ],\n \"TIER_3\": [\n \"halt\",\n \"tram_stop\",\n \"subway\",\n \"subway_entrance\",\n \"bicycle\",\n \"car_repair\",\n \"charging_station\",\n \"school\",\n \"kindergarten\",\n \"library\",\n \"clinic\",\n \"doctors\",\n \"dentist\",\n \"pharmacy\",\n \"veterinary\",\n \"police\",\n \"fire_station\",\n \"post_office\",\n \"townhall\",\n \"courthouse\",\n \"community_centre\",\n \"bank\",\n \"atm\",\n \"museum\",\n \"theatre\",\n \"cinema\",\n \"gallery\",\n \"artwork\",\n \"attraction\",\n \"information\",\n \"hotel\",\n \"hostel\",\n \"guest_house\",\n \"castle\",\n \"ruins\",\n \"memorial\",\n \"monument\",\n \"beach\",\n \"marina\",\n \"viewpoint\",\n \"picnic_site\",\n \"camp_site\",\n \"church\",\n \"mosque\",\n \"synagogue\",\n \"temple\"\n ],\n \"TIER_4\": [\n \"restaurant\",\n \"fast_food\",\n \"cafe\",\n \"bar\",\n \"pub\",\n \"biergarten\",\n \"ice_cream\",\n \"supermarket\",\n \"convenience\",\n \"bakery\",\n \"butcher\",\n \"greengrocer\",\n \"clothes\",\n \"shoes\",\n \"beauty\",\n \"electronics\",\n \"furniture\",\n \"hardware\",\n \"florist\",\n \"books\",\n \"gift\",\n \"jewelry\",\n \"optician\",\n \"mobile_phone\",\n \"sports\",\n \"fuel\"\n ],\n \"TIER_5\": [\n \"playground\",\n \"bus_stop\",\n \"bus_station\",\n \"post_box\",\n \"parking\",\n \"toilets\",\n \"drinking_water\"\n ],\n \"TIER_5B_ACCESS\": [\"swimming_pool\", \"garden\"]\n },\n \"categories\": {\n \"GREEN\": [\n \"park\",\n \"garden\",\n \"playground\",\n \"swimming_pool\",\n \"beach\",\n \"marina\",\n \"zoo\",\n \"viewpoint\",\n \"picnic_site\",\n \"camp_site\"\n ],\n \"LAPIS\": [\n \"bus_stop\",\n \"bus_station\",\n \"station\",\n \"halt\",\n \"tram_stop\",\n \"subway\",\n \"subway_entrance\",\n \"aerodrome\",\n \"ferry_terminal\",\n \"fuel\",\n \"parking\",\n \"bicycle\",\n \"car_repair\",\n \"charging_station\"\n ],\n \"SLATEGRAY\": [\n \"school\",\n \"kindergarten\",\n \"college\",\n \"university\",\n \"library\",\n \"hospital\",\n \"clinic\",\n \"doctors\",\n \"dentist\",\n \"pharmacy\",\n \"veterinary\",\n \"police\",\n \"fire_station\",\n \"post_office\",\n \"post_box\",\n \"townhall\",\n \"courthouse\",\n \"community_centre\",\n \"toilets\",\n \"drinking_water\",\n \"bank\",\n \"atm\",\n \"church\",\n \"mosque\",\n \"synagogue\",\n \"temple\"\n ],\n \"BLUE\": [\n \"supermarket\",\n \"convenience\",\n \"bakery\",\n \"butcher\",\n \"greengrocer\",\n \"clothes\",\n \"shoes\",\n \"beauty\",\n \"electronics\",\n \"furniture\",\n \"hardware\",\n \"florist\",\n \"books\",\n \"gift\",\n \"jewelry\",\n \"optician\",\n \"mobile_phone\",\n \"sports\"\n ],\n \"TANGERINE\": [\n \"restaurant\",\n \"fast_food\",\n \"cafe\",\n \"bar\",\n \"pub\",\n \"biergarten\",\n \"ice_cream\"\n ],\n \"PINK\": [\n \"museum\",\n \"theatre\",\n \"cinema\",\n \"gallery\",\n \"artwork\",\n \"attraction\",\n \"information\",\n \"hotel\",\n \"hostel\",\n \"guest_house\",\n \"castle\",\n \"ruins\",\n \"memorial\",\n \"monument\"\n ]\n }\n}\n","{\n \"LANDCOVER_FADE_START\": 5,\n \"LANDCOVER_FADE_END\": 7,\n \"LANDCOVER_GREEN_START\": 5,\n \"LANDCOVER_GREEN_END\": 8,\n\n \"PARK_FADE_START\": 5,\n \"PARK_FADE_END\": 8,\n \"LANDUSE_FADE_START\": 6,\n \"LANDUSE_FADE_END\": 11,\n\n \"AEROWAY_MIN\": 11,\n\n \"WATERWAY_STREAM_MIN\": 14,\n \"WATERWAY_RIVER_MIN\": 9,\n\n \"ROADS_MINOR_SERVICE_MIN\": 16,\n \"ROADS_LINK_MIN\": 13,\n \"ROADS_MAJOR_CASING_LATE_MIN\": 12,\n \"ROADS_MAJOR_CASING_EARLY_MAX\": 12,\n \"ROADS_HIGHWAY_CASING_LATE_MIN\": 12,\n \"ROADS_HIGHWAY_CASING_EARLY_MAX\": 12,\n \"ROADS_BRIDGES_MIN\": 12,\n\n \"TRANSIT_PASSENGER_RAIL_MIN\": 10,\n \"TRANSIT_FREIGHT_RAIL_MIN\": 11,\n \"TRANSIT_URBAN_RAIL_MIN\": 11,\n \"TRANSIT_MIXED_RAIL_MIN\": 11,\n \"TRANSIT_HERITAGE_MIN\": 13,\n \"TRANSIT_BUS_MIN\": 13,\n \"TRANSIT_SERVICE_TRACKS_MIN\": 14,\n \"TRANSIT_FERRY_MIN\": 4,\n\n \"LABELS_ADDRESS_MIN\": 18,\n \"LABELS_WATERWAY_MIN\": 13,\n \"LABELS_ROADS_ONEWAY_MIN\": 16,\n \"LABELS_ROADS_MINOR_MIN\": 15,\n \"LABELS_ROADS_MAJOR_MIN\": 11,\n \"LABELS_POI_MIN\": 10\n}\n","import type { ExpressionSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport featuresConfig from \"./config/features.json\";\nimport poiConfig from \"./config/poi.json\";\nimport zoomConfig from \"./config/zoom.json\";\n\n// ============================================\n// ZOOM LEVEL CONSTANTS (from JSON config)\n// ============================================\n\nexport const ZOOM = zoomConfig;\n\n// ============================================\n// ROAD CLASS CONSTANTS (from JSON config)\n// ============================================\n\nexport const ROAD_CLASSES = featuresConfig.roadClasses;\n\n// ============================================\n// POI TIER CONSTANTS (from JSON config)\n// For progressive disclosure based on zoom level\n// ============================================\n\nexport const POI_TIERS = poiConfig.tiers;\n\n// ============================================\n// POI COLOR CATEGORIES (from JSON config)\n// For matching subclasses to colors\n// ============================================\n\nexport const POI_CATEGORIES = poiConfig.categories;\n\n// ============================================\n// COMMON FILTER PATTERNS\n// ============================================\n\nexport const FILTERS = {\n // Brunnel (bridge/tunnel) filters\n IS_TUNNEL: [\"==\", [\"get\", \"brunnel\"], \"tunnel\"] as ExpressionSpecification,\n IS_BRIDGE: [\"==\", [\"get\", \"brunnel\"], \"bridge\"] as ExpressionSpecification,\n NOT_BRUNNEL: [\"!\", [\"has\", \"brunnel\"]] as ExpressionSpecification,\n\n // Ramp (link roads) filter\n IS_RAMP: [\"==\", [\"get\", \"ramp\"], 1] as ExpressionSpecification,\n NOT_RAMP: [\"!=\", [\"get\", \"ramp\"], 1] as ExpressionSpecification,\n\n // Geometry type filters\n IS_POLYGON: [\"==\", \"$type\", \"Polygon\"] as ExpressionSpecification,\n IS_LINESTRING: [\n \"==\",\n [\"geometry-type\"],\n \"LineString\",\n ] as ExpressionSpecification,\n IS_POINT: [\"==\", [\"geometry-type\"], \"Point\"] as ExpressionSpecification,\n} as const;\n\n// ============================================\n// LINE WIDTH INTERPOLATIONS\n// Common patterns for road widths\n// ============================================\n\nexport const LINE_WIDTHS = {\n // Other/path roads\n OTHER: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 14,\n 0,\n 20,\n 7,\n ] as ExpressionSpecification,\n\n // Minor roads\n MINOR: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 11,\n 0,\n 12.5,\n 0.5,\n 15,\n 2,\n 18,\n 11,\n ] as ExpressionSpecification,\n\n // Link roads\n LINK: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 13,\n 0,\n 13.5,\n 1,\n 18,\n 11,\n ] as ExpressionSpecification,\n\n // Major roads\n MAJOR: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 6,\n 0,\n 12,\n 1.6,\n 15,\n 3,\n 18,\n 13,\n ] as ExpressionSpecification,\n\n // Highway\n HIGHWAY: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 3,\n 0,\n 6,\n 1.1,\n 12,\n 1.6,\n 15,\n 5,\n 18,\n 15,\n ] as ExpressionSpecification,\n\n // Minor casing gap\n MINOR_CASING_GAP: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 11,\n 0,\n 12.5,\n 0.5,\n 15,\n 2,\n 18,\n 11,\n ] as ExpressionSpecification,\n\n // Link casing gap\n LINK_CASING_GAP: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 13,\n 0,\n 13.5,\n 1,\n 18,\n 11,\n ] as ExpressionSpecification,\n\n // Major casing gap\n MAJOR_CASING_GAP: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 7,\n 0,\n 7.5,\n 0.5,\n 18,\n 13,\n ] as ExpressionSpecification,\n\n // Highway casing gap\n HIGHWAY_CASING_GAP: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 3,\n 0,\n 3.5,\n 0.5,\n 18,\n 15,\n ] as ExpressionSpecification,\n\n // Casing width (thin outline)\n CASING_THIN: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 12,\n 0,\n 12.5,\n 1,\n ] as ExpressionSpecification,\n\n CASING_MEDIUM: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 9,\n 0,\n 9.5,\n 1,\n ] as ExpressionSpecification,\n\n CASING_THICK: [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 7,\n 0,\n 7.5,\n 1,\n 20,\n 15,\n ] as ExpressionSpecification,\n} as const;\n\n// ============================================\n// LANDCOVER SUBCLASSES (from JSON config)\n// ============================================\n\nexport const LANDCOVER_SUBCLASSES = featuresConfig.landcoverSubclasses;\n\n// ============================================\n// LANDUSE CLASSES (from JSON config)\n// ============================================\n\nexport const LANDUSE_CLASSES = featuresConfig.landuseClasses;\n\n// ============================================\n// PLACE CLASSES (from JSON config)\n// ============================================\n\nexport const PLACE_CLASSES = featuresConfig.placeClasses;\n\n// ============================================\n// WATER CLASSES (from JSON config)\n// ============================================\n\nexport const WATER_CLASSES = featuresConfig.waterClasses;\n","import type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport { FILTERS, ZOOM } from \"../constants\";\nimport type { Style } from \"../styles\";\n\n/**\n * Creates background and base terrain layers\n */\nexport function createBackgroundLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // Background color\n {\n id: \"background\",\n type: \"background\",\n paint: {\n \"background-color\": style.background,\n },\n },\n // Earth (land) polygons\n {\n id: \"earth\",\n type: \"fill\",\n filter: FILTERS.IS_POLYGON,\n source,\n \"source-layer\": \"earth\",\n paint: {\n \"fill-color\": style.earth,\n },\n },\n ];\n}\n\n/**\n * Creates water layers (polygons and waterways)\n */\nexport function createWaterLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // Water polygons\n {\n id: \"water\",\n type: \"fill\",\n filter: FILTERS.IS_POLYGON,\n source,\n \"source-layer\": \"water\",\n paint: {\n \"fill-color\": style.water,\n },\n },\n // Stream waterways\n {\n id: \"water_stream\",\n type: \"line\",\n source,\n \"source-layer\": \"waterway\",\n minzoom: ZOOM.WATERWAY_STREAM_MIN,\n filter: [\"==\", \"class\", \"stream\"],\n paint: {\n \"line-color\": style.water,\n \"line-width\": 0.5,\n },\n },\n // River waterways\n {\n id: \"water_river\",\n type: \"line\",\n source,\n \"source-layer\": \"waterway\",\n minzoom: ZOOM.WATERWAY_RIVER_MIN,\n filter: [\"==\", \"class\", \"river\"],\n paint: {\n \"line-color\": style.water,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 9,\n 0,\n 9.5,\n 1.0,\n 18,\n 12,\n ],\n },\n },\n ];\n}\n","import type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport type { Style } from \"../styles\";\n\n/**\n * Creates administrative boundary layers\n */\nexport function createBoundaryLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // Country boundaries (admin_level <= 2)\n {\n id: \"boundaries_country\",\n type: \"line\",\n source,\n \"source-layer\": \"boundary\",\n filter: [\"<=\", \"admin_level\", 2],\n paint: {\n \"line-color\": style.boundaries,\n \"line-width\": 0.7,\n \"line-dasharray\": [\n \"step\",\n [\"zoom\"],\n [\"literal\", [2, 0]],\n 4,\n [\"literal\", [2, 1]],\n ],\n },\n },\n // Other administrative boundaries (admin_level > 2)\n {\n id: \"boundaries\",\n type: \"line\",\n source,\n \"source-layer\": \"boundary\",\n filter: [\">\", \"admin_level\", 2],\n paint: {\n \"line-color\": style.boundaries,\n \"line-width\": 0.4,\n \"line-dasharray\": [\n \"step\",\n [\"zoom\"],\n [\"literal\", [2, 0]],\n 4,\n [\"literal\", [2, 1]],\n ],\n },\n },\n ];\n}\n","import type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport type { Style } from \"../styles\";\n\n/**\n * Creates building layers\n */\nexport function createBuildingLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n {\n id: \"buildings\",\n type: \"fill\",\n source,\n \"source-layer\": \"building\",\n paint: {\n \"fill-color\": style.buildings,\n \"fill-opacity\": 0.5,\n },\n },\n ];\n}\n","import type {\n DataDrivenPropertyValueSpecification,\n ExpressionSpecification,\n FilterSpecification,\n LayerSpecification,\n SymbolLayerSpecification,\n} from \"@maplibre/maplibre-gl-style-spec\";\nimport { getCountryName, getMultilineName } from \"../language\";\nimport type { Style } from \"../styles\";\n\n// ============================================\n// TYPES\n// ============================================\n\ntype FontStyle = \"regular\" | \"italic\" | \"bold\" | \"medium\";\n\ninterface LabelLayerConfig {\n id: string;\n source: string;\n sourceLayer: string;\n style: Style;\n lang: string;\n script?: string;\n filter?: FilterSpecification;\n minzoom?: number;\n maxzoom?: number;\n fontStyle?: FontStyle;\n textSize?: number | ExpressionSpecification;\n textColor: string;\n haloColor: string;\n haloWidth?: number;\n letterSpacing?: number;\n maxWidth?: number;\n textTransform?: \"uppercase\" | \"lowercase\" | \"none\";\n symbolPlacement?: \"point\" | \"line\" | \"line-center\";\n useCountryName?: boolean;\n}\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\nfunction getFont(style: Style, fontStyle: FontStyle): string {\n switch (fontStyle) {\n case \"regular\":\n return style.regular || \"Noto Sans Regular\";\n case \"italic\":\n return style.italic || \"Noto Sans Italic\";\n case \"bold\":\n return style.bold || \"Noto Sans Medium\";\n case \"medium\":\n return style.medium || \"Noto Sans Medium\";\n }\n}\n\n// ============================================\n// FACTORY FUNCTION\n// ============================================\n\nexport function createLabelLayer(\n config: LabelLayerConfig,\n): SymbolLayerSpecification {\n const {\n id,\n source,\n sourceLayer,\n style,\n lang,\n script,\n filter,\n minzoom,\n maxzoom,\n fontStyle = \"regular\",\n textSize = 12,\n textColor,\n haloColor,\n haloWidth = 1,\n letterSpacing,\n maxWidth,\n textTransform,\n symbolPlacement = \"point\",\n useCountryName = false,\n } = config;\n\n const font = getFont(style, fontStyle);\n const textField = useCountryName\n ? getCountryName(lang, script)\n : getMultilineName(lang, script, style.regular);\n\n const layout: SymbolLayerSpecification[\"layout\"] = {\n \"text-font\": [font],\n \"text-field\": textField as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": textSize,\n };\n\n if (symbolPlacement !== \"point\") {\n layout[\"symbol-placement\"] = symbolPlacement;\n }\n\n if (letterSpacing !== undefined) {\n layout[\"text-letter-spacing\"] = letterSpacing;\n }\n\n if (maxWidth !== undefined) {\n layout[\"text-max-width\"] = maxWidth;\n }\n\n if (textTransform) {\n layout[\"text-transform\"] = textTransform;\n }\n\n const layer: SymbolLayerSpecification = {\n id,\n type: \"symbol\",\n source,\n \"source-layer\": sourceLayer,\n layout,\n paint: {\n \"text-color\": textColor,\n \"text-halo-color\": haloColor,\n \"text-halo-width\": haloWidth,\n },\n };\n\n if (filter) layer.filter = filter;\n if (minzoom !== undefined) layer.minzoom = minzoom;\n if (maxzoom !== undefined) layer.maxzoom = maxzoom;\n\n return layer;\n}\n\n// ============================================\n// SPECIALIZED LABEL CREATORS\n// ============================================\n\n/**\n * Creates water label layers (ocean, lakes, waterways)\n */\nexport function createWaterLabels(\n source: string,\n style: Style,\n lang: string,\n script?: string,\n): LayerSpecification[] {\n return [\n // Waterway labels (rivers, streams)\n createLabelLayer({\n id: \"water_waterway_label\",\n source,\n sourceLayer: \"water_name\",\n style,\n lang,\n script,\n minzoom: 13,\n filter: [\"in\", \"class\", \"river\", \"stream\"],\n fontStyle: \"italic\",\n textColor: style.ocean_label,\n haloColor: style.water,\n symbolPlacement: \"line\",\n letterSpacing: 0.2,\n }),\n // Ocean labels\n {\n id: \"water_label_ocean\",\n type: \"symbol\",\n source,\n \"source-layer\": \"water_name\",\n filter: [\"in\", [\"get\", \"class\"], [\"literal\", [\"sea\", \"ocean\"]]],\n layout: {\n \"text-font\": [style.italic || \"Noto Sans Italic\"],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.regular,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 3, 10, 10, 12],\n \"text-letter-spacing\": 0.1,\n \"text-max-width\": 9,\n \"text-transform\": \"uppercase\",\n },\n paint: {\n \"text-color\": style.ocean_label,\n \"text-halo-width\": 1,\n \"text-halo-color\": style.water,\n },\n },\n // Lake labels (Point geometry)\n {\n id: \"water_label_lakes_point\",\n type: \"symbol\",\n source,\n \"source-layer\": \"water_name\",\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"lake\"],\n [\"==\", [\"geometry-type\"], \"Point\"],\n ],\n layout: {\n \"text-font\": [style.italic || \"Noto Sans Italic\"],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.regular,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 3,\n 10,\n 6,\n 12,\n 10,\n 12,\n ],\n \"text-letter-spacing\": 0.1,\n \"text-max-width\": 9,\n },\n paint: {\n \"text-color\": style.ocean_label,\n \"text-halo-color\": style.water,\n \"text-halo-width\": 1,\n },\n },\n // Lake labels (LineString geometry)\n {\n id: \"water_label_lakes_line\",\n type: \"symbol\",\n source,\n \"source-layer\": \"water_name\",\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"lake\"],\n [\"==\", [\"geometry-type\"], \"LineString\"],\n ],\n layout: {\n \"symbol-placement\": \"line-center\",\n \"text-rotation-alignment\": \"viewport\",\n \"text-font\": [style.italic || \"Noto Sans Italic\"],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.regular,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 3,\n 10,\n 6,\n 12,\n 10,\n 12,\n ],\n \"text-letter-spacing\": 0.1,\n \"text-max-width\": 9,\n },\n paint: {\n \"text-color\": style.ocean_label,\n \"text-halo-color\": style.water,\n \"text-halo-width\": 1,\n },\n },\n ];\n}\n\n/**\n * Creates road label layers\n */\nexport function createRoadLabels(\n source: string,\n style: Style,\n lang: string,\n script?: string,\n): LayerSpecification[] {\n return [\n // Oneway arrows\n {\n id: \"roads_oneway\",\n type: \"symbol\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: 16,\n filter: [\"==\", [\"get\", \"oneway\"], \"yes\"],\n layout: {\n \"symbol-placement\": \"line\",\n \"icon-image\": \"arrow_right\",\n \"icon-rotate\": 0,\n \"symbol-spacing\": 100,\n },\n },\n // Minor road labels\n {\n id: \"roads_labels_minor\",\n type: \"symbol\",\n source,\n \"source-layer\": \"transportation_name\",\n minzoom: 15,\n filter: [\n \"in\",\n [\"get\", \"class\"],\n [\n \"literal\",\n [\"minor\", \"residential\", \"unclassified\", \"service\", \"track\", \"path\"],\n ],\n ],\n layout: {\n \"symbol-sort-key\": [\"coalesce\", [\"get\", \"min_zoom\"], 20],\n \"symbol-placement\": \"line\",\n \"text-font\": [style.regular || \"Noto Sans Regular\"],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.regular,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": 12,\n },\n paint: {\n \"text-color\": style.roads_label_minor,\n \"text-halo-color\": style.roads_label_minor_halo,\n \"text-halo-width\": 1,\n },\n },\n // Road shields\n {\n id: \"roads_shields\",\n type: \"symbol\",\n source,\n \"source-layer\": \"transportation_name\",\n filter: [\n \"all\",\n [\n \"in\",\n [\"get\", \"class\"],\n [\n \"literal\",\n [\"motorway\", \"trunk\", \"primary\", \"secondary\", \"tertiary\"],\n ],\n ],\n [\"has\", \"ref\"],\n [\"<=\", [\"length\", [\"get\", \"ref\"]], 5],\n ],\n layout: {\n \"icon-image\": [\n \"concat\",\n \"shield|\",\n [\"coalesce\", [\"get\", \"network\"], \"default\"],\n \"=\",\n [\"get\", \"ref\"],\n \"|\",\n [\"coalesce\", [\"get\", \"name\"], \"\"],\n ],\n \"text-field\": [\"get\", \"ref\"],\n \"text-font\": [style.bold || \"Noto Sans Medium\"],\n \"text-size\": 8,\n \"icon-size\": 0.8,\n \"symbol-placement\": \"line\",\n \"icon-rotation-alignment\": \"viewport\",\n \"text-rotation-alignment\": \"viewport\",\n },\n paint: {\n \"text-color\": style.roads_label_major,\n \"text-opacity\": 0,\n },\n },\n // Major road labels\n {\n id: \"roads_labels_major\",\n type: \"symbol\",\n source,\n \"source-layer\": \"transportation_name\",\n minzoom: 11,\n filter: [\n \"in\",\n [\"get\", \"class\"],\n [\"literal\", [\"motorway\", \"trunk\", \"primary\", \"secondary\", \"tertiary\"]],\n ],\n layout: {\n \"symbol-sort-key\": [\"coalesce\", [\"get\", \"min_zoom\"], 20],\n \"symbol-placement\": \"line\",\n \"text-font\": [style.regular || \"Noto Sans Regular\"],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.regular,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": 12,\n },\n paint: {\n \"text-color\": style.roads_label_major,\n \"text-halo-color\": style.roads_label_major_halo,\n \"text-halo-width\": 1,\n },\n },\n ];\n}\n\n/**\n * Creates place label layers (countries, states, cities, subplaces)\n */\nexport function createPlaceLabels(\n source: string,\n style: Style,\n lang: string,\n script?: string,\n): LayerSpecification[] {\n return [\n // Subplace labels (neighbourhood, quarter, suburb)\n {\n id: \"places_subplace\",\n type: \"symbol\",\n source,\n \"source-layer\": \"place\",\n filter: [\n \"in\",\n [\"get\", \"class\"],\n [\"literal\", [\"neighbourhood\", \"quarter\", \"suburb\"]],\n ],\n layout: {\n \"symbol-sort-key\": [\n \"case\",\n [\"has\", \"sort_key\"],\n [\"get\", \"sort_key\"],\n [\"coalesce\", [\"get\", \"min_zoom\"], 20],\n ],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.medium,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-font\": [style.medium || \"Noto Sans Medium\"],\n \"text-max-width\": 7,\n \"text-letter-spacing\": 0.1,\n \"text-padding\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 5,\n 2,\n 8,\n 4,\n 12,\n 18,\n 15,\n 20,\n ],\n \"text-size\": [\n \"interpolate\",\n [\"exponential\", 1.2],\n [\"zoom\"],\n 11,\n 8,\n 14,\n 14,\n 18,\n 24,\n ],\n },\n paint: {\n \"text-color\": style.subplace_label,\n \"text-halo-color\": style.subplace_label_halo,\n \"text-halo-width\": 1,\n },\n },\n // Region/state labels\n {\n id: \"places_region\",\n type: \"symbol\",\n source,\n \"source-layer\": \"place\",\n filter: [\"==\", [\"get\", \"class\"], \"state\"],\n layout: {\n \"symbol-sort-key\": [\"get\", \"sort_key\"],\n \"text-field\": [\n \"step\",\n [\"zoom\"],\n [\"coalesce\", [\"get\", \"ref:en\"], [\"get\", \"ref\"]],\n 6,\n getMultilineName(\n lang,\n script,\n style.regular,\n ) as ExpressionSpecification,\n ],\n \"text-font\": [style.regular || \"Noto Sans Regular\"],\n \"text-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 3, 11, 7, 16],\n \"text-radial-offset\": 0.2,\n \"text-anchor\": \"center\",\n },\n paint: {\n \"text-color\": style.state_label,\n \"text-halo-color\": style.state_label_halo,\n \"text-halo-width\": 1,\n },\n },\n // Locality labels (city, town, village, hamlet)\n {\n id: \"places_locality\",\n type: \"symbol\",\n source,\n \"source-layer\": \"place\",\n filter: [\n \"in\",\n [\"get\", \"class\"],\n [\"literal\", [\"city\", \"town\", \"village\", \"hamlet\"]],\n ],\n layout: {\n \"icon-image\": [\n \"step\",\n [\"zoom\"],\n [\n \"case\",\n // Capital cities get star\n [\"==\", [\"get\", \"capital\"], \"yes\"],\n \"circle-star\",\n // Cities get scrubber\n [\"==\", [\"get\", \"class\"], \"city\"],\n \"scrubber\",\n // Towns, villages, hamlets get circle\n \"circle\",\n ],\n 8,\n \"\",\n ],\n \"icon-size\": 0.7,\n \"text-field\": getMultilineName(\n lang,\n script,\n style.medium,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-font\": [\n \"case\",\n [\"<=\", [\"coalesce\", [\"get\", \"min_zoom\"], 20], 5],\n [\"literal\", [style.bold || \"Noto Sans Medium\"]],\n [\"literal\", [style.medium || \"Noto Sans Medium\"]],\n ],\n \"symbol-sort-key\": [\n \"case\",\n [\"has\", \"sort_key\"],\n [\"get\", \"sort_key\"],\n [\"coalesce\", [\"get\", \"min_zoom\"], 20],\n ],\n \"text-padding\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 5,\n 3,\n 8,\n 7,\n 12,\n 11,\n ],\n \"text-size\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 2,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 13],\n 8,\n [\">=\", [\"get\", \"population_rank\"], 13],\n 13,\n 0,\n ],\n 4,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 13],\n 10,\n [\">=\", [\"get\", \"population_rank\"], 13],\n 15,\n 0,\n ],\n 6,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 12],\n 11,\n [\">=\", [\"get\", \"population_rank\"], 12],\n 17,\n 0,\n ],\n 8,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 11],\n 11,\n [\">=\", [\"get\", \"population_rank\"], 11],\n 18,\n 0,\n ],\n 10,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 9],\n 12,\n [\">=\", [\"get\", \"population_rank\"], 9],\n 20,\n 0,\n ],\n 15,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 8],\n 12,\n [\">=\", [\"get\", \"population_rank\"], 8],\n 22,\n 0,\n ],\n ],\n \"icon-padding\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 0,\n 0,\n 8,\n 4,\n 10,\n 8,\n 12,\n 6,\n 22,\n 2,\n ],\n \"text-justify\": \"auto\",\n \"text-variable-anchor\": [\n \"step\",\n [\"zoom\"],\n [\"literal\", [\"bottom\", \"left\", \"right\", \"top\"]],\n 8,\n [\"literal\", [\"center\"]],\n ],\n \"text-radial-offset\": 0.3,\n },\n paint: {\n \"text-color\": style.city_label,\n \"text-halo-color\": style.city_label_halo,\n \"text-halo-width\": 1,\n },\n },\n // Country labels\n {\n id: \"places_country\",\n type: \"symbol\",\n source,\n \"source-layer\": \"place\",\n filter: [\"==\", [\"get\", \"class\"], \"country\"],\n layout: {\n \"symbol-sort-key\": [\n \"case\",\n [\"has\", \"sort_key\"],\n [\"get\", \"sort_key\"],\n [\"coalesce\", [\"get\", \"min_zoom\"], 20],\n ],\n \"text-field\": getCountryName(\n lang,\n script,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-font\": [style.bold || \"Noto Sans Medium\"],\n \"text-size\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 2,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 10],\n 8,\n [\">=\", [\"get\", \"population_rank\"], 10],\n 12,\n 0,\n ],\n 6,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 8],\n 10,\n [\">=\", [\"get\", \"population_rank\"], 8],\n 18,\n 0,\n ],\n 8,\n [\n \"case\",\n [\"<\", [\"get\", \"population_rank\"], 7],\n 11,\n [\">=\", [\"get\", \"population_rank\"], 7],\n 20,\n 0,\n ],\n ],\n \"icon-padding\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 0,\n 2,\n 14,\n 2,\n 16,\n 20,\n 17,\n 2,\n 22,\n 2,\n ],\n },\n paint: {\n \"text-color\": style.country_label,\n \"text-halo-color\": style.earth,\n \"text-halo-width\": 1,\n },\n },\n ];\n}\n\n/**\n * Creates address and island labels\n */\nexport function createMiscLabels(\n source: string,\n style: Style,\n lang: string,\n script?: string,\n): LayerSpecification[] {\n return [\n // Address labels\n {\n id: \"address_label\",\n type: \"symbol\",\n source,\n \"source-layer\": \"housenumber\",\n minzoom: 18,\n layout: {\n \"symbol-placement\": \"point\",\n \"text-font\": [style.italic || \"Noto Sans Italic\"],\n \"text-field\": [\"get\", \"housenumber\"],\n \"text-size\": 12,\n },\n paint: {\n \"text-color\": style.address_label,\n \"text-halo-color\": style.address_label_halo,\n \"text-halo-width\": 1,\n },\n },\n // Island labels\n {\n id: \"earth_label_islands\",\n type: \"symbol\",\n source,\n \"source-layer\": \"place\",\n filter: [\"==\", [\"get\", \"class\"], \"island\"],\n layout: {\n \"text-font\": [style.italic || \"Noto Sans Italic\"],\n \"text-field\": getMultilineName(\n lang,\n script,\n style.regular,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": 10,\n \"text-letter-spacing\": 0.1,\n \"text-max-width\": 8,\n },\n paint: {\n \"text-color\": style.subplace_label,\n \"text-halo-color\": style.subplace_label_halo,\n \"text-halo-width\": 1,\n },\n },\n ];\n}\n","import type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport { LANDCOVER_SUBCLASSES, LANDUSE_CLASSES, ZOOM } from \"../constants\";\nimport type { Style } from \"../styles\";\n\n/**\n * Creates landcover layers (natural features)\n */\nexport function createLandcoverLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n // Return empty array if landcover is not defined in style\n if (!style.landcover) {\n return [];\n }\n\n return [\n // Main landcover (fades out at higher zoom)\n {\n id: \"landcover\",\n type: \"fill\",\n source,\n \"source-layer\": \"landcover\",\n paint: {\n \"fill-color\": [\n \"match\",\n [\"get\", \"class\"],\n \"grass\",\n style.landcover.grassland,\n \"sand\",\n style.landcover.barren,\n \"farmland\",\n style.landcover.farmland,\n \"ice\",\n style.landcover.glacier,\n \"wood\",\n style.landcover.forest,\n \"rock\",\n style.landcover.rock,\n \"wetland\",\n style.landcover.wetland,\n style.landcover.forest, // default\n ],\n \"fill-opacity\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ZOOM.LANDCOVER_FADE_START,\n 1,\n ZOOM.LANDCOVER_FADE_END,\n 0,\n ],\n },\n },\n // Green areas (parks, gardens, golf courses, etc.)\n {\n id: \"landcover_green\",\n type: \"fill\",\n source,\n \"source-layer\": \"landcover\",\n filter: [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [...LANDCOVER_SUBCLASSES.GREEN]],\n ],\n paint: {\n \"fill-color\": style.park_b,\n \"fill-opacity\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ZOOM.LANDCOVER_GREEN_START,\n 0,\n ZOOM.LANDCOVER_GREEN_END,\n 0.5,\n ],\n },\n },\n // Meadow and grassland\n {\n id: \"landcover_meadow\",\n type: \"fill\",\n source,\n \"source-layer\": \"landcover\",\n filter: [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [...LANDCOVER_SUBCLASSES.MEADOW]],\n ],\n paint: {\n \"fill-color\": style.landcover.grassland,\n \"fill-opacity\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ZOOM.LANDCOVER_GREEN_START,\n 0,\n ZOOM.LANDCOVER_GREEN_END,\n 1,\n ],\n },\n },\n ];\n}\n\n/**\n * Creates park layers\n */\nexport function createParkLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n {\n id: \"park\",\n type: \"fill\",\n source,\n \"source-layer\": \"park\",\n paint: {\n \"fill-opacity\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ZOOM.PARK_FADE_START,\n 0,\n ZOOM.PARK_FADE_END,\n 1,\n ],\n \"fill-color\": [\n \"match\",\n [\"get\", \"class\"],\n \"national_park\",\n style.park_a,\n \"nature_reserve\",\n style.park_a,\n \"protected_area\",\n style.park_a,\n style.park_b, // default\n ],\n },\n },\n ];\n}\n\n/**\n * Creates landuse layers (human-made features)\n */\nexport function createLanduseLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // Green landuse (cemeteries, playgrounds, stadiums, etc.)\n {\n id: \"landuse_green\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"in\", \"class\", ...LANDUSE_CLASSES.GREEN],\n paint: {\n \"fill-opacity\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n ZOOM.LANDUSE_FADE_START,\n 0,\n ZOOM.LANDUSE_FADE_END,\n 1,\n ],\n \"fill-color\": style.park_b,\n },\n },\n // Hospital\n {\n id: \"landuse_hospital\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"==\", \"class\", \"hospital\"],\n paint: {\n \"fill-color\": style.hospital,\n },\n },\n // Industrial\n {\n id: \"landuse_industrial\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"==\", \"class\", \"industrial\"],\n paint: {\n \"fill-color\": style.industrial,\n },\n },\n // Schools and universities\n {\n id: \"landuse_school\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"in\", \"class\", ...LANDUSE_CLASSES.EDUCATION],\n paint: {\n \"fill-color\": style.school,\n },\n },\n // Zoo\n {\n id: \"landuse_zoo\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"==\", \"class\", \"zoo\"],\n paint: {\n \"fill-color\": style.zoo,\n },\n },\n // Aerodrome\n {\n id: \"landuse_aerodrome\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"==\", \"class\", \"aerodrome\"],\n paint: {\n \"fill-color\": style.aerodrome,\n },\n },\n // Pedestrian areas\n {\n id: \"landuse_pedestrian\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"in\", \"class\", ...LANDUSE_CLASSES.PEDESTRIAN],\n paint: {\n \"fill-color\": style.pedestrian,\n },\n },\n // Pier\n {\n id: \"landuse_pier\",\n type: \"fill\",\n source,\n \"source-layer\": \"landuse\",\n filter: [\"==\", \"class\", \"pier\"],\n paint: {\n \"fill-color\": style.pier,\n },\n },\n ];\n}\n\n/**\n * Creates aeroway layers\n */\nexport function createAerowayLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // Aeroway fill (aprons, helipads)\n {\n id: \"aeroway_fill\",\n type: \"fill\",\n source,\n \"source-layer\": \"aeroway\",\n filter: [\n \"all\",\n [\"==\", \"$type\", \"Polygon\"],\n [\"in\", \"class\", \"apron\", \"helipad\"],\n ],\n paint: {\n \"fill-color\": style.runway,\n },\n },\n // Runway\n {\n id: \"aeroway_runway\",\n type: \"line\",\n source,\n \"source-layer\": \"aeroway\",\n minzoom: ZOOM.AEROWAY_MIN,\n filter: [\"all\", [\"==\", \"$type\", \"LineString\"], [\"==\", \"class\", \"runway\"]],\n paint: {\n \"line-color\": style.runway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.2],\n [\"zoom\"],\n 11,\n 3,\n 20,\n 48,\n ],\n },\n },\n // Taxiway\n {\n id: \"aeroway_taxiway\",\n type: \"line\",\n source,\n \"source-layer\": \"aeroway\",\n minzoom: ZOOM.AEROWAY_MIN,\n filter: [\n \"all\",\n [\"==\", \"$type\", \"LineString\"],\n [\"==\", \"class\", \"taxiway\"],\n ],\n paint: {\n \"line-color\": style.runway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.2],\n [\"zoom\"],\n 11,\n 1,\n 20,\n 24,\n ],\n },\n },\n ];\n}\n","import type {\n DataDrivenPropertyValueSpecification,\n LayerSpecification,\n} from \"@maplibre/maplibre-gl-style-spec\";\nimport { POI_CATEGORIES, POI_TIERS, ZOOM } from \"../constants\";\nimport { getMultilineName } from \"../language\";\nimport type { Style } from \"../styles\";\n\n/**\n * Creates POI (points of interest) layers\n * Uses tiered zoom levels for progressive disclosure\n */\nexport function createPoiLayers(\n source: string,\n style: Style,\n lang: string,\n script?: string,\n): LayerSpecification[] {\n // Return empty array if POIs are not defined in style\n if (!style.pois) {\n return [];\n }\n\n return [\n {\n id: \"pois\",\n type: \"symbol\",\n source,\n \"source-layer\": \"poi\",\n minzoom: ZOOM.LABELS_POI_MIN,\n filter: [\n \"any\",\n // Tier 1: z10+ - Airports\n [\"all\", [\">=\", [\"zoom\"], 10], [\"==\", [\"get\", \"subclass\"], \"aerodrome\"]],\n // Tier 2: z12+ - Major infrastructure\n [\n \"all\",\n [\">=\", [\"zoom\"], 12],\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_TIERS.TIER_2]]],\n ],\n // Tier 3: z14+ - Standard POIs (civic, tourism, religion)\n [\n \"all\",\n [\">=\", [\"zoom\"], 14],\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_TIERS.TIER_3]]],\n // Rank filter for density control\n [\n \"<=\",\n [\"coalesce\", [\"get\", \"rank\"], 999],\n [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n 14,\n 15,\n 15,\n 50,\n 16,\n 100,\n 17,\n 200,\n ],\n ],\n ],\n // Tier 4: z15+ - Food, drink, retail, and fuel\n [\n \"all\",\n [\">=\", [\"zoom\"], 15],\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_TIERS.TIER_4]]],\n // Rank filter\n [\n \"<=\",\n [\"coalesce\", [\"get\", \"rank\"], 999],\n [\"interpolate\", [\"linear\"], [\"zoom\"], 15, 30, 16, 75, 17, 150],\n ],\n ],\n // Tier 5: z17+ - Minor POIs\n [\n \"all\",\n [\">=\", [\"zoom\"], 17],\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_TIERS.TIER_5]]],\n ],\n // Tier 5b: z17+ - Public access only (pools, gardens)\n [\n \"all\",\n [\">=\", [\"zoom\"], 17],\n [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [...POI_TIERS.TIER_5B_ACCESS]],\n ],\n // Only show publicly accessible (not private/customers)\n [\n \"!\",\n [\n \"in\",\n [\"coalesce\", [\"get\", \"access\"], \"yes\"],\n [\"literal\", [\"private\", \"customers\", \"no\"]],\n ],\n ],\n ],\n ],\n layout: {\n \"icon-image\": [\n \"match\",\n [\"get\", \"subclass\"],\n // Map subclass names to sprite names where they differ\n \"station\",\n \"train_station\",\n \"gallery\",\n \"art_gallery\",\n // Default: use subclass name directly\n [\"get\", \"subclass\"],\n ],\n \"icon-size\": 0.5, // Scale 48px Phosphor icons to ~24px\n \"text-font\": [style.medium || \"Noto Sans Medium\"],\n \"text-justify\": \"auto\",\n \"text-field\": getMultilineName(\n lang,\n script,\n style.medium,\n ) as DataDrivenPropertyValueSpecification<string>,\n \"text-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 17, 11, 19, 18],\n \"text-max-width\": 8,\n \"text-offset\": [1.1, 0],\n \"text-variable-anchor\": [\"left\", \"right\"],\n },\n paint: {\n \"text-color\": [\n \"case\",\n // Nature/Parks - green\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_CATEGORIES.GREEN]]],\n style.pois.green,\n // Transport - lapis\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_CATEGORIES.LAPIS]]],\n style.pois.lapis,\n // Civic/Services - slategray\n [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [...POI_CATEGORIES.SLATEGRAY]],\n ],\n style.pois.slategray,\n // Shopping - blue\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_CATEGORIES.BLUE]]],\n style.pois.blue,\n // Food & Drink - tangerine\n [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [...POI_CATEGORIES.TANGERINE]],\n ],\n style.pois.tangerine,\n // Tourism/Culture - pink\n [\"in\", [\"get\", \"subclass\"], [\"literal\", [...POI_CATEGORIES.PINK]]],\n style.pois.pink,\n // Default\n style.earth,\n ],\n \"text-halo-color\": style.earth,\n \"text-halo-width\": 1,\n },\n },\n ];\n}\n","import type {\n ExpressionSpecification,\n FilterSpecification,\n LayerSpecification,\n LineLayerSpecification,\n} from \"@maplibre/maplibre-gl-style-spec\";\nimport { FILTERS, LINE_WIDTHS, ROAD_CLASSES, ZOOM } from \"../constants\";\nimport type { Style } from \"../styles\";\n\n// ============================================\n// TYPES\n// ============================================\n\ntype RoadCategory = \"other\" | \"minor\" | \"link\" | \"major\" | \"highway\";\ntype BrunnelType = \"tunnel\" | \"bridge\" | null;\n\ninterface RoadLayerConfig {\n source: string;\n style: Style;\n brunnel: BrunnelType;\n category: RoadCategory;\n isCasing: boolean;\n minzoom?: number;\n maxzoom?: number;\n}\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\nfunction getRoadClasses(category: RoadCategory): readonly string[] {\n switch (category) {\n case \"other\":\n return ROAD_CLASSES.OTHER;\n case \"minor\":\n return ROAD_CLASSES.MINOR;\n case \"major\":\n return ROAD_CLASSES.MAJOR;\n case \"highway\":\n return ROAD_CLASSES.HIGHWAY;\n case \"link\":\n return []; // Link uses ramp filter, not class filter\n }\n}\n\nfunction buildFilter(\n brunnel: BrunnelType,\n category: RoadCategory,\n): FilterSpecification {\n const conditions: ExpressionSpecification[] = [];\n\n // Brunnel condition\n if (brunnel === \"tunnel\") {\n conditions.push(FILTERS.IS_TUNNEL);\n } else if (brunnel === \"bridge\") {\n conditions.push(FILTERS.IS_BRIDGE);\n } else {\n conditions.push(FILTERS.NOT_BRUNNEL);\n }\n\n // Road class condition\n if (category === \"link\") {\n conditions.push(FILTERS.IS_RAMP);\n } else {\n const classes = getRoadClasses(category);\n if (classes.length > 0) {\n conditions.push([\n \"in\",\n [\"get\", \"class\"],\n [\"literal\", classes as unknown as string[]],\n ]);\n }\n // Highway excludes ramps\n if (category === \"highway\") {\n conditions.push(FILTERS.NOT_RAMP);\n }\n }\n\n return conditions.length === 1\n ? conditions[0]\n : ([\"all\", ...conditions] as FilterSpecification);\n}\n\nfunction getLayerId(\n brunnel: BrunnelType,\n category: RoadCategory,\n isCasing: boolean,\n): string {\n const prefix =\n brunnel === \"tunnel\"\n ? \"roads_tunnels\"\n : brunnel === \"bridge\"\n ? \"roads_bridges\"\n : \"roads\";\n\n const suffix = isCasing ? \"_casing\" : \"\";\n return `${prefix}_${category}${suffix}`;\n}\n\nfunction getCasingColor(\n style: Style,\n brunnel: BrunnelType,\n category: RoadCategory,\n): string {\n if (brunnel === \"tunnel\") {\n switch (category) {\n case \"other\":\n return style.tunnel_other_casing;\n case \"minor\":\n return style.tunnel_minor_casing;\n case \"link\":\n return style.tunnel_link_casing;\n case \"major\":\n return style.tunnel_major_casing;\n case \"highway\":\n return style.tunnel_highway_casing;\n }\n }\n if (brunnel === \"bridge\") {\n switch (category) {\n case \"other\":\n return style.bridges_other_casing;\n case \"minor\":\n return style.bridges_minor_casing;\n case \"link\":\n return style.bridges_minor_casing; // Uses minor casing color\n case \"major\":\n return style.bridges_major_casing;\n case \"highway\":\n return style.bridges_highway_casing;\n }\n }\n // Regular roads (no brunnel)\n switch (category) {\n case \"other\":\n return style.minor_casing; // No dedicated other casing\n case \"minor\":\n return style.minor_casing;\n case \"link\":\n return style.minor_casing;\n case \"major\":\n return style.major_casing_late;\n case \"highway\":\n return style.highway_casing_late;\n }\n}\n\nfunction getFillColor(\n style: Style,\n brunnel: BrunnelType,\n category: RoadCategory,\n): string | ExpressionSpecification {\n if (brunnel === \"tunnel\") {\n switch (category) {\n case \"other\":\n return style.tunnel_other;\n case \"minor\":\n return style.tunnel_minor;\n case \"link\":\n return style.tunnel_minor; // Uses minor color\n case \"major\":\n return style.tunnel_major;\n case \"highway\":\n return style.tunnel_highway;\n }\n }\n if (brunnel === \"bridge\") {\n switch (category) {\n case \"other\":\n return style.bridges_other;\n case \"minor\":\n return style.bridges_minor;\n case \"link\":\n return style.bridges_minor; // Uses minor color\n case \"major\":\n return style.bridges_major;\n case \"highway\":\n return style.bridges_highway;\n }\n }\n // Regular roads (no brunnel)\n switch (category) {\n case \"other\":\n return style.other;\n case \"minor\":\n return [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 11,\n style.minor_a,\n 16,\n style.minor_b,\n ] as ExpressionSpecification;\n case \"link\":\n return style.link;\n case \"major\":\n return style.major;\n case \"highway\":\n return style.highway;\n }\n}\n\nfunction getLineWidth(category: RoadCategory): ExpressionSpecification {\n switch (category) {\n case \"other\":\n return LINE_WIDTHS.OTHER;\n case \"minor\":\n return LINE_WIDTHS.MINOR;\n case \"link\":\n return LINE_WIDTHS.LINK;\n case \"major\":\n return LINE_WIDTHS.MAJOR;\n case \"highway\":\n return LINE_WIDTHS.HIGHWAY;\n }\n}\n\nfunction getCasingGapWidth(category: RoadCategory): ExpressionSpecification {\n switch (category) {\n case \"other\":\n return LINE_WIDTHS.OTHER;\n case \"minor\":\n return LINE_WIDTHS.MINOR_CASING_GAP;\n case \"link\":\n return LINE_WIDTHS.LINK_CASING_GAP;\n case \"major\":\n return LINE_WIDTHS.MAJOR_CASING_GAP;\n case \"highway\":\n return LINE_WIDTHS.HIGHWAY_CASING_GAP;\n }\n}\n\nfunction getCasingWidth(category: RoadCategory): ExpressionSpecification {\n switch (category) {\n case \"other\":\n // Other roads don't have explicit casing width\n return LINE_WIDTHS.CASING_THIN;\n case \"minor\":\n return LINE_WIDTHS.CASING_THIN;\n case \"link\":\n return LINE_WIDTHS.CASING_THIN;\n case \"major\":\n return LINE_WIDTHS.CASING_MEDIUM;\n case \"highway\":\n return LINE_WIDTHS.CASING_THICK;\n }\n}\n\nfunction getDasharray(\n brunnel: BrunnelType,\n category: RoadCategory,\n isCasing: boolean,\n): number[] | undefined {\n if (brunnel === \"tunnel\") {\n if (isCasing) {\n // Tunnel casings have dashed outlines\n if (category === \"highway\") return [6, 0.5];\n if (category !== \"other\") return [3, 2];\n } else {\n // Tunnel fills for other roads\n if (category === \"other\") return [4.5, 0.5];\n }\n } else if (brunnel === \"bridge\") {\n // Bridge other roads have dash\n if (!isCasing && category === \"other\") return [2, 1];\n } else {\n // Regular other roads have dash\n if (!isCasing && category === \"other\") return [3, 1];\n }\n return undefined;\n}\n\n// ============================================\n// FACTORY FUNCTION\n// ============================================\n\nexport function createRoadLayer(\n config: RoadLayerConfig,\n): LineLayerSpecification {\n const { source, style, brunnel, category, isCasing, minzoom, maxzoom } =\n config;\n\n const layer: LineLayerSpecification = {\n id: getLayerId(brunnel, category, isCasing),\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n filter: buildFilter(brunnel, category),\n paint: {},\n };\n\n if (minzoom !== undefined) layer.minzoom = minzoom;\n if (maxzoom !== undefined) layer.maxzoom = maxzoom;\n\n if (isCasing) {\n layer.paint = {\n \"line-color\": getCasingColor(style, brunnel, category),\n \"line-gap-width\": getCasingGapWidth(category),\n \"line-width\": getCasingWidth(category),\n };\n const dasharray = getDasharray(brunnel, category, true);\n if (dasharray) {\n layer.paint[\"line-dasharray\"] = dasharray;\n }\n } else {\n layer.paint = {\n \"line-color\": getFillColor(style, brunnel, category),\n \"line-width\": getLineWidth(category),\n };\n const dasharray = getDasharray(brunnel, category, false);\n if (dasharray) {\n layer.paint[\"line-dasharray\"] = dasharray;\n }\n }\n\n return layer;\n}\n\n// ============================================\n// BATCH CREATION FUNCTIONS\n// ============================================\n\n/**\n * Creates all tunnel road layers (casing + fill for each category)\n */\nexport function createTunnelLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n const categories: RoadCategory[] = [\n \"other\",\n \"minor\",\n \"link\",\n \"major\",\n \"highway\",\n ];\n const layers: LayerSpecification[] = [];\n\n // Casing layers first\n for (const category of categories) {\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: \"tunnel\",\n category,\n isCasing: true,\n }),\n );\n }\n\n // Fill layers\n for (const category of categories) {\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: \"tunnel\",\n category,\n isCasing: false,\n }),\n );\n }\n\n return layers;\n}\n\n/**\n * Creates all regular (non-tunnel, non-bridge) road layers\n */\nexport function createRoadLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n const layers: LayerSpecification[] = [];\n\n // Minor service casing (z16+)\n layers.push({\n id: \"roads_minor_service_casing\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.ROADS_MINOR_SERVICE_MIN,\n filter: [\"all\", FILTERS.NOT_BRUNNEL, [\"==\", [\"get\", \"class\"], \"service\"]],\n paint: {\n \"line-color\": style.minor_service_casing,\n \"line-gap-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 13,\n 0,\n 18,\n 8,\n ],\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 13,\n 0,\n 13.5,\n 0.8,\n ],\n },\n });\n\n // Minor casing\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"minor\",\n isCasing: true,\n }),\n );\n\n // Link casing (z13+)\n layers.push({\n ...createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"link\",\n isCasing: true,\n minzoom: ZOOM.ROADS_LINK_MIN,\n }),\n // Override filter to remove NOT_BRUNNEL (link casing shows everywhere)\n filter: FILTERS.IS_RAMP,\n });\n\n // Major casing late (z12+)\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"major\",\n isCasing: true,\n minzoom: ZOOM.ROADS_MAJOR_CASING_LATE_MIN,\n }),\n );\n\n // Highway casing late (z12+)\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"highway\",\n isCasing: true,\n minzoom: ZOOM.ROADS_HIGHWAY_CASING_LATE_MIN,\n }),\n );\n\n // Other roads fill\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"other\",\n isCasing: false,\n }),\n );\n\n // Link roads fill\n layers.push({\n ...createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"link\",\n isCasing: false,\n }),\n // Override filter to remove NOT_BRUNNEL\n filter: FILTERS.IS_RAMP,\n });\n\n // Minor service fill\n layers.push({\n id: \"roads_minor_service\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n filter: [\"all\", FILTERS.NOT_BRUNNEL, [\"==\", [\"get\", \"class\"], \"service\"]],\n paint: {\n \"line-color\": style.minor_service,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 13,\n 0,\n 18,\n 8,\n ],\n },\n });\n\n // Minor roads fill\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"minor\",\n isCasing: false,\n }),\n );\n\n // Major casing early (maxzoom 12)\n layers.push({\n id: \"roads_major_casing_early\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n maxzoom: ZOOM.ROADS_MAJOR_CASING_EARLY_MAX,\n filter: [\n \"all\",\n FILTERS.NOT_BRUNNEL,\n [\"in\", [\"get\", \"class\"], [\"literal\", [...ROAD_CLASSES.MAJOR]]],\n ],\n paint: {\n \"line-color\": style.major_casing_early,\n \"line-gap-width\": LINE_WIDTHS.MAJOR_CASING_GAP,\n \"line-width\": LINE_WIDTHS.CASING_MEDIUM,\n },\n });\n\n // Major roads fill\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"major\",\n isCasing: false,\n }),\n );\n\n // Highway casing early (maxzoom 12)\n layers.push({\n id: \"roads_highway_casing_early\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n maxzoom: ZOOM.ROADS_HIGHWAY_CASING_EARLY_MAX,\n filter: [\n \"all\",\n FILTERS.NOT_BRUNNEL,\n [\"in\", [\"get\", \"class\"], [\"literal\", [...ROAD_CLASSES.HIGHWAY]]],\n FILTERS.NOT_RAMP,\n ],\n paint: {\n \"line-color\": style.highway_casing_early,\n \"line-gap-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 3,\n 0,\n 3.5,\n 0.5,\n 18,\n 10,\n ],\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 7,\n 0,\n 7.5,\n 1,\n ],\n },\n });\n\n // Highway fill\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: null,\n category: \"highway\",\n isCasing: false,\n }),\n );\n\n return layers;\n}\n\n/**\n * Creates all bridge road layers (casing + fill for each category)\n */\nexport function createBridgeLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n const categories: RoadCategory[] = [\"other\", \"link\", \"minor\", \"major\"];\n const layers: LayerSpecification[] = [];\n\n // Casing layers first (all at z12+)\n for (const category of categories) {\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: \"bridge\",\n category,\n isCasing: true,\n minzoom: ZOOM.ROADS_BRIDGES_MIN,\n }),\n );\n }\n\n // Fill layers\n for (const category of categories) {\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: \"bridge\",\n category,\n isCasing: false,\n minzoom: ZOOM.ROADS_BRIDGES_MIN,\n }),\n );\n }\n\n // Highway casing (z12+)\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: \"bridge\",\n category: \"highway\",\n isCasing: true,\n minzoom: ZOOM.ROADS_BRIDGES_MIN,\n }),\n );\n\n // Highway fill (no minzoom in original)\n layers.push(\n createRoadLayer({\n source,\n style,\n brunnel: \"bridge\",\n category: \"highway\",\n isCasing: false,\n }),\n );\n\n return layers;\n}\n\n/**\n * Creates pier layer (special road type)\n */\nexport function createPierLayer(\n source: string,\n style: Style,\n): LayerSpecification {\n return {\n id: \"roads_pier\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n filter: [\"==\", \"subclass\", \"pier\"],\n paint: {\n \"line-color\": style.pier,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.6],\n [\"zoom\"],\n 12,\n 0,\n 12.5,\n 0.5,\n 20,\n 16,\n ],\n },\n };\n}\n","import type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport { ZOOM } from \"../constants\";\nimport type { Style } from \"../styles\";\n\n/**\n * Creates transit infrastructure layers (rail, bus, ferry)\n * Progressive disclosure: main rail z10, freight z11, heritage/bus z13\n */\nexport function createTransitLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // 1. Freight rail - darker, wider, dashed (z11+)\n {\n id: \"transit_freight_rail\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_FREIGHT_RAIL_MIN,\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"rail\"],\n [\"==\", [\"get\", \"usage\"], \"freight\"],\n [\"!\", [\"has\", \"service\"]], // Exclude service tracks\n ],\n paint: {\n \"line-color\":\n style.transit_freight || style.transit_rail || style.railway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.4],\n [\"zoom\"],\n 11,\n 1.5,\n 13,\n 2.5,\n 16,\n 4.5,\n ],\n \"line-dasharray\": [0.5, 1.5],\n \"line-opacity\": 0.6,\n },\n },\n\n // 2. Bus infrastructure - orange, dashed, subtle (z13+)\n {\n id: \"transit_bus_infrastructure\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_BUS_MIN,\n filter: [\"==\", [\"get\", \"class\"], \"bus\"],\n paint: {\n \"line-color\": style.transit_bus || style.transit_rail || style.railway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.4],\n [\"zoom\"],\n 13,\n 1.2,\n 15,\n 2.0,\n 18,\n 4.0,\n ],\n \"line-dasharray\": [2, 1],\n \"line-opacity\": 0.6,\n },\n },\n\n // 3. Heritage/tourist rail - decorative dotted pattern (z13+)\n {\n id: \"transit_heritage_rail\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_HERITAGE_MIN,\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"rail\"],\n [\"==\", [\"get\", \"usage\"], \"heritage\"],\n ],\n paint: {\n \"line-color\":\n style.transit_heritage || style.transit_rail || style.railway,\n \"line-width\": 1.8,\n \"line-dasharray\": [0.5, 0.5],\n \"line-opacity\": 0.5,\n },\n },\n\n // 4. Mixed-use rail corridors - intermediate styling (z11+)\n {\n id: \"transit_mixed_rail\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_MIXED_RAIL_MIN,\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"rail\"],\n [\"==\", [\"get\", \"usage\"], \"mixed\"],\n ],\n paint: {\n \"line-color\": style.transit_rail || style.railway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.4],\n [\"zoom\"],\n 11,\n 1.5,\n 13,\n 2.2,\n 16,\n 4.0,\n ],\n \"line-dasharray\": [0.4, 0.4],\n \"line-opacity\": 0.6,\n },\n },\n\n // 5. Urban transit (subway, light_rail, tram, monorail) - z11+\n {\n id: \"transit_urban_rail\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_URBAN_RAIL_MIN,\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"rail\"],\n [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [\"subway\", \"light_rail\", \"tram\", \"monorail\"]],\n ],\n ],\n paint: {\n \"line-color\": style.transit_rail || style.railway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.4],\n [\"zoom\"],\n 11,\n 1.5,\n 14,\n 2.5,\n 18,\n 4.0,\n ],\n \"line-dasharray\": [0.4, 1.2],\n \"line-opacity\": 0.6,\n },\n },\n\n // 6. Passenger rail (default) - standard styling (z10+)\n {\n id: \"transit_passenger_rail\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_PASSENGER_RAIL_MIN,\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"rail\"],\n [\"!\", [\"has\", \"usage\"]], // No usage attribute = passenger default\n // Exclude urban transit types (handled above)\n [\n \"!\",\n [\n \"in\",\n [\"get\", \"subclass\"],\n [\"literal\", [\"subway\", \"light_rail\", \"tram\", \"monorail\"]],\n ],\n ],\n ],\n paint: {\n \"line-color\": style.transit_rail || style.railway,\n \"line-width\": [\n \"interpolate\",\n [\"exponential\", 1.4],\n [\"zoom\"],\n 10,\n 1.5,\n 13,\n 2.2,\n 16,\n 3.5,\n ],\n \"line-dasharray\": [0.4, 1.2],\n \"line-opacity\": 0.5,\n },\n },\n\n // 7. Service tracks (yards, sidings) - very subtle, z14+ only\n {\n id: \"transit_service_tracks\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_SERVICE_TRACKS_MIN,\n filter: [\n \"all\",\n [\"==\", [\"get\", \"class\"], \"rail\"],\n [\"has\", \"service\"], // Only service tracks\n ],\n paint: {\n \"line-color\": style.transit_rail || style.railway,\n \"line-width\": 1.0,\n \"line-dasharray\": [0.3, 2.0],\n \"line-opacity\": 0.3,\n },\n },\n\n // 8. Ferry routes\n {\n id: \"transit_ferry\",\n type: \"line\",\n source,\n \"source-layer\": \"transportation\",\n minzoom: ZOOM.TRANSIT_FERRY_MIN,\n filter: [\"==\", [\"get\", \"class\"], \"ferry\"],\n paint: {\n \"line-color\": style.railway,\n \"line-width\": 1.5,\n \"line-dasharray\": [4, 2],\n \"line-opacity\": 0.6,\n },\n },\n ];\n}\n","/**\n * Layer generation module\n *\n * This module coordinates the creation of all MapLibre GL layers\n * from the component modules.\n */\n\nimport type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport type { Style } from \"../styles\";\n\n// Import layer creators from component modules\nimport { createBackgroundLayers, createWaterLayers } from \"./background\";\nimport { createBoundaryLayers } from \"./boundaries\";\nimport { createBuildingLayers } from \"./buildings\";\nimport {\n createMiscLabels,\n createPlaceLabels,\n createRoadLabels,\n createWaterLabels,\n} from \"./labels\";\nimport {\n createAerowayLayers,\n createLandcoverLayers,\n createLanduseLayers,\n createParkLayers,\n} from \"./landcover\";\nimport { createPoiLayers } from \"./pois\";\nimport {\n createBridgeLayers,\n createPierLayer,\n createRoadLayers,\n createTunnelLayers,\n} from \"./roads\";\nimport { createTransitLayers } from \"./transit\";\n\n/**\n * Creates all non-label layers (fills, lines, symbols without text)\n */\nexport function nolabelsLayers(\n source: string,\n style: Style,\n): LayerSpecification[] {\n return [\n // Background and earth\n ...createBackgroundLayers(source, style),\n\n // Natural features\n ...createLandcoverLayers(source, style),\n ...createParkLayers(source, style),\n ...createLanduseLayers(source, style),\n ...createAerowayLayers(source, style),\n\n // Water\n ...createWaterLayers(source, style),\n\n // Roads - tunnels (below other features)\n ...createTunnelLayers(source, style),\n\n // Buildings\n ...createBuildingLayers(source, style),\n\n // Roads - surface level\n createPierLayer(source, style),\n ...createRoadLayers(source, style),\n\n // Transit\n ...createTransitLayers(source, style),\n\n // Boundaries\n ...createBoundaryLayers(source, style),\n\n // Roads - bridges (above other features)\n ...createBridgeLayers(source, style),\n ];\n}\n\n/**\n * Creates all label layers (text symbols)\n */\nexport function labelsLayers(\n source: string,\n style: Style,\n lang: string,\n script?: string,\n): LayerSpecification[] {\n return [\n // Misc labels (addresses, islands)\n ...createMiscLabels(source, style, lang, script),\n\n // Water labels\n ...createWaterLabels(source, style, lang, script),\n\n // Road labels\n ...createRoadLabels(source, style, lang, script),\n\n // POI labels\n ...createPoiLayers(source, style, lang, script),\n\n // Place labels (subplaces, cities, regions, countries)\n ...createPlaceLabels(source, style, lang, script),\n ];\n}\n\n// Re-export component modules for direct access if needed\nexport {\n createBackgroundLayers,\n createWaterLayers,\n} from \"./background\";\nexport { createBoundaryLayers } from \"./boundaries\";\nexport { createBuildingLayers } from \"./buildings\";\nexport {\n createLabelLayer,\n createMiscLabels,\n createPlaceLabels,\n createRoadLabels,\n createWaterLabels,\n} from \"./labels\";\nexport {\n createAerowayLayers,\n createLandcoverLayers,\n createLanduseLayers,\n createParkLayers,\n} from \"./landcover\";\nexport { createPoiLayers } from \"./pois\";\nexport {\n createBridgeLayers,\n createPierLayer,\n createRoadLayer,\n createRoadLayers,\n createTunnelLayers,\n} from \"./roads\";\nexport { createTransitLayers } from \"./transit\";\n","{\n \"background\": \"#1a1d1e\",\n \"earth\": \"#252829\",\n \"park_a\": \"#3a5f44\",\n \"park_b\": \"#325a3c\",\n \"hospital\": \"#3d2d2d\",\n \"industrial\": \"#2d3335\",\n \"school\": \"#3d3530\",\n \"wood_a\": \"#2d4a35\",\n \"wood_b\": \"#254432\",\n \"pedestrian\": \"#3a4f40\",\n \"scrub_a\": \"#385540\",\n \"scrub_b\": \"#305038\",\n \"glacier\": \"#2b2b2b\",\n \"sand\": \"#3d3620\",\n \"beach\": \"#3a3428\",\n \"aerodrome\": \"#303030\",\n \"runway\": \"#606060\",\n \"water\": \"#1e5070\",\n \"zoo\": \"#3a5f44\",\n \"military\": \"#2d2d2d\",\n\n \"tunnel_other_casing\": \"#0d0e0f\",\n \"tunnel_minor_casing\": \"#0d0e0f\",\n \"tunnel_link_casing\": \"#0a0a0a\",\n \"tunnel_major_casing\": \"#080808\",\n \"tunnel_highway_casing\": \"#060606\",\n \"tunnel_other\": \"#3a3a3a\",\n \"tunnel_minor\": \"#484848\",\n \"tunnel_link\": \"#606060\",\n \"tunnel_major\": \"#707070\",\n \"tunnel_highway\": \"#808080\",\n\n \"pier\": \"#3d3d3d\",\n \"buildings\": \"#484848\",\n\n \"minor_service_casing\": \"#0d0e0f\",\n \"minor_casing\": \"#0d0e0f\",\n \"link_casing\": \"#0a0a0a\",\n \"major_casing_late\": \"#080808\",\n \"highway_casing_late\": \"#060606\",\n \"other\": \"#3a3a3a\",\n \"minor_service\": \"#484848\",\n \"minor_a\": \"#484848\",\n \"minor_b\": \"#484848\",\n \"link\": \"#606060\",\n \"major_casing_early\": \"#080808\",\n \"major\": \"#707070\",\n \"highway_casing_early\": \"#060606\",\n \"highway\": \"#808080\",\n\n \"railway\": \"#404040\",\n \"boundaries\": \"#5a3e42\",\n\n \"bridges_other_casing\": \"#0d0e0f\",\n \"bridges_minor_casing\": \"#0d0e0f\",\n \"bridges_link_casing\": \"#0a0a0a\",\n \"bridges_major_casing\": \"#080808\",\n \"bridges_highway_casing\": \"#060606\",\n \"bridges_other\": \"#3a3a3a\",\n \"bridges_minor\": \"#484848\",\n \"bridges_link\": \"#606060\",\n \"bridges_major\": \"#707070\",\n \"bridges_highway\": \"#808080\",\n\n \"roads_label_minor\": \"#9ca3af\",\n \"roads_label_minor_halo\": \"#1a1d1e\",\n \"roads_label_major\": \"#e5e7eb\",\n \"roads_label_major_halo\": \"#1a1d1e\",\n \"ocean_label\": \"#7a9aa9\",\n \"subplace_label\": \"#d1d5db\",\n \"subplace_label_halo\": \"#1a1d1e\",\n \"city_label\": \"#f3f4f6\",\n \"city_label_halo\": \"#1a1d1e\",\n \"state_label\": \"#b8bfc7\",\n \"state_label_halo\": \"#1a1d1e\",\n \"country_label\": \"#e5e7eb\",\n\n \"address_label\": \"#9ca3af\",\n \"address_label_halo\": \"#1a1d1e\",\n\n \"pois\": {\n \"blue\": \"#5dade2\",\n \"green\": \"#52be80\",\n \"lapis\": \"#c39bd3\",\n \"pink\": \"#e685b5\",\n \"red\": \"#ec7063\",\n \"slategray\": \"#95a5a6\",\n \"tangerine\": \"#f4a261\",\n \"turquoise\": \"#3dd5c5\"\n },\n\n \"landcover\": {\n \"grassland\": \"#3a5440\",\n \"barren\": \"#3d3620\",\n \"urban_area\": \"#252829\",\n \"farmland\": \"#385442\",\n \"glacier\": \"#2b2b2b\",\n \"scrub\": \"#385540\",\n \"forest\": \"#2d4a35\",\n \"rock\": \"#3a3835\",\n \"wetland\": \"#2a4040\"\n },\n\n \"transit_rail\": \"#9ca3af\",\n \"transit_freight\": \"#6a6a6a\",\n \"transit_bus\": \"#f4a261\",\n \"transit_heritage\": \"#a0a0c0\",\n\n \"shields\": {\n \"interstate_fill\": \"#1e3a5f\",\n \"interstate_stroke\": \"#7a8fa8\",\n \"interstate_text\": \"#e5e7eb\",\n \"us_highway_fill\": \"#2d3748\",\n \"us_highway_stroke\": \"#4a5568\",\n \"us_highway_text\": \"#e5e7eb\",\n \"state_fill\": \"#2d3748\",\n \"state_stroke\": \"#4a5568\",\n \"state_text\": \"#e5e7eb\",\n \"county_fill\": \"#4a4522\",\n \"county_stroke\": \"#6b6b3a\",\n \"county_text\": \"#e5e7eb\",\n \"default_fill\": \"#2d3748\",\n \"default_stroke\": \"#4a5568\",\n \"default_text\": \"#e5e7eb\",\n \"banner_text\": \"#e5e7eb\",\n \"banner_text_halo\": \"#1a1d1e\"\n }\n}\n","{\n \"background\": \"#e8e8e8\",\n \"earth\": \"#d5d5d5\",\n \"park_a\": \"#c8c8c8\",\n \"park_b\": \"#bebebe\",\n \"hospital\": \"#d0d0d0\",\n \"industrial\": \"#c2c2c2\",\n \"school\": \"#cecece\",\n \"wood_a\": \"#bfbfbf\",\n \"wood_b\": \"#b5b5b5\",\n \"pedestrian\": \"#d0d0d0\",\n \"scrub_a\": \"#c4c4c4\",\n \"scrub_b\": \"#bababa\",\n \"glacier\": \"#e5e5e5\",\n \"sand\": \"#d8d8d8\",\n \"beach\": \"#d2d2d2\",\n \"aerodrome\": \"#c9c9c9\",\n \"runway\": \"#b0b0b0\",\n \"water\": \"#a8a8a8\",\n \"zoo\": \"#c8c8c8\",\n \"military\": \"#c0c0c0\",\n\n \"tunnel_other_casing\": \"#d0d0d0\",\n \"tunnel_minor_casing\": \"#d0d0d0\",\n \"tunnel_link_casing\": \"#cccccc\",\n \"tunnel_major_casing\": \"#c8c8c8\",\n \"tunnel_highway_casing\": \"#c4c4c4\",\n \"tunnel_other\": \"#b0b0b0\",\n \"tunnel_minor\": \"#a8a8a8\",\n \"tunnel_link\": \"#a0a0a0\",\n \"tunnel_major\": \"#989898\",\n \"tunnel_highway\": \"#909090\",\n\n \"pier\": \"#b8b8b8\",\n \"buildings\": \"#a0a0a0\",\n\n \"minor_service_casing\": \"#d0d0d0\",\n \"minor_casing\": \"#d0d0d0\",\n \"link_casing\": \"#cccccc\",\n \"major_casing_late\": \"#c8c8c8\",\n \"highway_casing_late\": \"#c4c4c4\",\n \"other\": \"#b0b0b0\",\n \"minor_service\": \"#a8a8a8\",\n \"minor_a\": \"#a8a8a8\",\n \"minor_b\": \"#a8a8a8\",\n \"link\": \"#a0a0a0\",\n \"major_casing_early\": \"#c8c8c8\",\n \"major\": \"#989898\",\n \"highway_casing_early\": \"#c4c4c4\",\n \"highway\": \"#909090\",\n\n \"railway\": \"#c0c0c0\",\n \"boundaries\": \"#a8a8a8\",\n\n \"bridges_other_casing\": \"#d0d0d0\",\n \"bridges_minor_casing\": \"#d0d0d0\",\n \"bridges_link_casing\": \"#cccccc\",\n \"bridges_major_casing\": \"#c8c8c8\",\n \"bridges_highway_casing\": \"#c4c4c4\",\n \"bridges_other\": \"#b0b0b0\",\n \"bridges_minor\": \"#a8a8a8\",\n \"bridges_link\": \"#a0a0a0\",\n \"bridges_major\": \"#989898\",\n \"bridges_highway\": \"#909090\",\n\n \"roads_label_minor\": \"#787878\",\n \"roads_label_minor_halo\": \"#ffffff\",\n \"roads_label_major\": \"#505050\",\n \"roads_label_major_halo\": \"#ffffff\",\n \"ocean_label\": \"#707070\",\n \"subplace_label\": \"#787878\",\n \"subplace_label_halo\": \"#ffffff\",\n \"city_label\": \"#505050\",\n \"city_label_halo\": \"#ffffff\",\n \"state_label\": \"#787878\",\n \"state_label_halo\": \"#ffffff\",\n \"country_label\": \"#505050\",\n\n \"address_label\": \"#787878\",\n \"address_label_halo\": \"#ffffff\",\n\n \"pois\": {\n \"blue\": \"#707070\",\n \"green\": \"#888888\",\n \"lapis\": \"#606060\",\n \"pink\": \"#858585\",\n \"red\": \"#757575\",\n \"slategray\": \"#505050\",\n \"tangerine\": \"#808080\",\n \"turquoise\": \"#6a6a6a\"\n },\n\n \"landcover\": {\n \"grassland\": \"#c0c0c0\",\n \"barren\": \"#d0d0d0\",\n \"urban_area\": \"#d5d5d5\",\n \"farmland\": \"#c4c4c4\",\n \"glacier\": \"#e5e5e5\",\n \"scrub\": \"#c4c4c4\",\n \"forest\": \"#b5b5b5\",\n \"rock\": \"#b0b0b0\",\n \"wetland\": \"#aaaaaa\"\n },\n\n \"transit_rail\": \"#787878\",\n \"transit_freight\": \"#606060\",\n \"transit_bus\": \"#787878\",\n \"transit_heritage\": \"#888888\",\n\n \"shields\": {\n \"interstate_fill\": \"#505050\",\n \"interstate_stroke\": \"#707070\",\n \"interstate_text\": \"#ffffff\",\n \"us_highway_fill\": \"#707070\",\n \"us_highway_stroke\": \"#505050\",\n \"us_highway_text\": \"#ffffff\",\n \"state_fill\": \"#888888\",\n \"state_stroke\": \"#606060\",\n \"state_text\": \"#ffffff\",\n \"county_fill\": \"#a0a0a0\",\n \"county_stroke\": \"#707070\",\n \"county_text\": \"#303030\",\n \"default_fill\": \"#b8b8b8\",\n \"default_stroke\": \"#808080\",\n \"default_text\": \"#303030\",\n \"banner_text\": \"#505050\",\n \"banner_text_halo\": \"#ffffff\"\n }\n}\n","{\n \"background\": \"#f8f9f7\",\n \"earth\": \"#e9e9e6\",\n \"park_a\": \"#b8d9b8\",\n \"park_b\": \"#a8d4a8\",\n \"hospital\": \"#e4dad9\",\n \"industrial\": \"#d1dde1\",\n \"school\": \"#e4ded7\",\n \"wood_a\": \"#b0d0b0\",\n \"wood_b\": \"#a0c8a0\",\n \"pedestrian\": \"#d8ead8\",\n \"scrub_a\": \"#c0dcc0\",\n \"scrub_b\": \"#b0d4b0\",\n \"glacier\": \"#f0f8ff\",\n \"sand\": \"#f5e8d0\",\n \"beach\": \"#f0e4c8\",\n \"aerodrome\": \"#dadbdf\",\n \"runway\": \"#e0e0e0\",\n \"water\": \"#88c5e0\",\n \"zoo\": \"#b8d9b8\",\n \"military\": \"#dcdcdc\",\n\n \"tunnel_other_casing\": \"#e5e5e2\",\n \"tunnel_minor_casing\": \"#e5e5e2\",\n \"tunnel_link_casing\": \"#e0e0dd\",\n \"tunnel_major_casing\": \"#dcdcd9\",\n \"tunnel_highway_casing\": \"#d8d8d5\",\n \"tunnel_other\": \"#d0d0d0\",\n \"tunnel_minor\": \"#c8c8c8\",\n \"tunnel_link\": \"#c0c0c0\",\n \"tunnel_major\": \"#b8b8b8\",\n \"tunnel_highway\": \"#b0b0b0\",\n\n \"pier\": \"#d0d0d0\",\n \"buildings\": \"#c0bcb8\",\n\n \"minor_service_casing\": \"#e5e5e2\",\n \"minor_casing\": \"#e5e5e2\",\n \"link_casing\": \"#e0e0dd\",\n \"major_casing_late\": \"#dcdcd9\",\n \"highway_casing_late\": \"#d8d8d5\",\n \"other\": \"#d0d0d0\",\n \"minor_service\": \"#c8c8c8\",\n \"minor_a\": \"#c8c8c8\",\n \"minor_b\": \"#c8c8c8\",\n \"link\": \"#c0c0c0\",\n \"major_casing_early\": \"#dcdcd9\",\n \"major\": \"#b8b8b8\",\n \"highway_casing_early\": \"#d8d8d5\",\n \"highway\": \"#b0b0b0\",\n\n \"railway\": \"#d5d5d5\",\n \"boundaries\": \"#d4b8bc\",\n\n \"bridges_other_casing\": \"#e5e5e2\",\n \"bridges_minor_casing\": \"#e5e5e2\",\n \"bridges_link_casing\": \"#e0e0dd\",\n \"bridges_major_casing\": \"#dcdcd9\",\n \"bridges_highway_casing\": \"#d8d8d5\",\n \"bridges_other\": \"#d0d0d0\",\n \"bridges_minor\": \"#c8c8c8\",\n \"bridges_link\": \"#c0c0c0\",\n \"bridges_major\": \"#b8b8b8\",\n \"bridges_highway\": \"#b0b0b0\",\n\n \"roads_label_minor\": \"#8a9299\",\n \"roads_label_minor_halo\": \"#ffffff\",\n \"roads_label_major\": \"#5a6570\",\n \"roads_label_major_halo\": \"#ffffff\",\n \"ocean_label\": \"#7a8a92\",\n \"subplace_label\": \"#8a9299\",\n \"subplace_label_halo\": \"#ffffff\",\n \"city_label\": \"#5a6570\",\n \"city_label_halo\": \"#ffffff\",\n \"state_label\": \"#8a9299\",\n \"state_label_halo\": \"#ffffff\",\n \"country_label\": \"#5a6570\",\n\n \"address_label\": \"#8a9299\",\n \"address_label_halo\": \"#ffffff\",\n\n \"pois\": {\n \"blue\": \"#3498db\",\n \"green\": \"#27ae60\",\n \"lapis\": \"#9b59b6\",\n \"pink\": \"#d63384\",\n \"red\": \"#e74c3c\",\n \"slategray\": \"#5a6570\",\n \"tangerine\": \"#e76f51\",\n \"turquoise\": \"#2a9d8f\"\n },\n\n \"landcover\": {\n \"grassland\": \"#c8e0c8\",\n \"barren\": \"#f5ddb8\",\n \"urban_area\": \"#e9e9e6\",\n \"farmland\": \"#d0e8d0\",\n \"glacier\": \"#f0f8ff\",\n \"scrub\": \"#c0dcc0\",\n \"forest\": \"#a8d0a8\",\n \"rock\": \"#d0ccc8\",\n \"wetland\": \"#b8d8d0\"\n },\n\n \"transit_rail\": \"#888888\",\n \"transit_freight\": \"#666666\",\n \"transit_bus\": \"#cc7700\",\n \"transit_heritage\": \"#9999bb\",\n\n \"shields\": {\n \"interstate_fill\": \"#5a7090\",\n \"interstate_stroke\": \"#907070\",\n \"interstate_text\": \"#f0f0ee\",\n \"us_highway_fill\": \"#f0f0ee\",\n \"us_highway_stroke\": \"#808080\",\n \"us_highway_text\": \"#505050\",\n \"state_fill\": \"#f0f0ee\",\n \"state_stroke\": \"#808080\",\n \"state_text\": \"#505050\",\n \"county_fill\": \"#d8d8a0\",\n \"county_stroke\": \"#808080\",\n \"county_text\": \"#505050\",\n \"default_fill\": \"#f0f0ee\",\n \"default_stroke\": \"#808080\",\n \"default_text\": \"#505050\",\n \"banner_text\": \"#505050\",\n \"banner_text_halo\": \"#f0f0ee\"\n }\n}\n","{\n \"background\": \"#f8f4f0\",\n \"earth\": \"#e9e4df\",\n \"park_a\": \"#c8e6c9\",\n \"park_b\": \"#c8e6c9\",\n \"hospital\": \"#f0e8e8\",\n \"industrial\": \"#e0e0e0\",\n \"school\": \"#e4ded7\",\n \"wood_a\": \"#b8d4a8\",\n \"wood_b\": \"#b8d4a8\",\n \"pedestrian\": \"#e8e8e8\",\n \"scrub_a\": \"#c8d9a8\",\n \"scrub_b\": \"#c8d9a8\",\n \"glacier\": \"#f0f8ff\",\n \"sand\": \"#f4e4c8\",\n \"beach\": \"#f4e4c8\",\n \"aerodrome\": \"#dadbdf\",\n \"runway\": \"#d0ccc8\",\n \"water\": \"#a8d5f2\",\n \"zoo\": \"#c8e6c9\",\n \"military\": \"#dcdcdc\",\n\n \"tunnel_other_casing\": \"#e5e5e2\",\n \"tunnel_minor_casing\": \"#e5e5e2\",\n \"tunnel_link_casing\": \"#e0e0dd\",\n \"tunnel_major_casing\": \"#dcdcd9\",\n \"tunnel_highway_casing\": \"#d8d8d5\",\n \"tunnel_other\": \"#cccccc\",\n \"tunnel_minor\": \"#ffffff\",\n \"tunnel_link\": \"#ffa94d\",\n \"tunnel_major\": \"#ffa94d\",\n \"tunnel_highway\": \"#ff6b6b\",\n\n \"pier\": \"#d0d0d0\",\n \"buildings\": \"#d0d0d0\",\n\n \"minor_service_casing\": \"#e5e5e2\",\n \"minor_casing\": \"#e5e5e2\",\n \"link_casing\": \"#e0e0dd\",\n \"major_casing_late\": \"#dcdcd9\",\n \"highway_casing_late\": \"#d8d8d5\",\n \"other\": \"#888888\",\n \"minor_service\": \"#ffffff\",\n \"minor_a\": \"#ffffff\",\n \"minor_b\": \"#ffffff\",\n \"link\": \"#ffa94d\",\n \"major_casing_early\": \"#dcdcd9\",\n \"major\": \"#ffa94d\",\n \"highway_casing_early\": \"#d8d8d5\",\n \"highway\": \"#ff6b6b\",\n\n \"railway\": \"#d5d5d5\",\n \"boundaries\": \"#d4b8bc\",\n\n \"bridges_other_casing\": \"#e5e5e2\",\n \"bridges_minor_casing\": \"#e5e5e2\",\n \"bridges_link_casing\": \"#e0e0dd\",\n \"bridges_major_casing\": \"#dcdcd9\",\n \"bridges_highway_casing\": \"#d8d8d5\",\n \"bridges_other\": \"#cccccc\",\n \"bridges_minor\": \"#ffffff\",\n \"bridges_link\": \"#ffa94d\",\n \"bridges_major\": \"#ffa94d\",\n \"bridges_highway\": \"#ff6b6b\",\n\n \"roads_label_minor\": \"#8a9299\",\n \"roads_label_minor_halo\": \"#ffffff\",\n \"roads_label_major\": \"#5a6570\",\n \"roads_label_major_halo\": \"#ffffff\",\n \"ocean_label\": \"#7a8a92\",\n \"subplace_label\": \"#333333\",\n \"subplace_label_halo\": \"#ffffff\",\n \"city_label\": \"#333333\",\n \"city_label_halo\": \"#ffffff\",\n \"state_label\": \"#8a9299\",\n \"state_label_halo\": \"#ffffff\",\n \"country_label\": \"#5a6570\",\n\n \"address_label\": \"#8a9299\",\n \"address_label_halo\": \"#ffffff\",\n\n \"pois\": {\n \"blue\": \"#5a7a9a\",\n \"green\": \"#6b8e23\",\n \"lapis\": \"#8b668b\",\n \"pink\": \"#cd5c5c\",\n \"red\": \"#b22222\",\n \"slategray\": \"#7a6a5a\",\n \"tangerine\": \"#d2691e\",\n \"turquoise\": \"#5f9ea0\"\n },\n\n \"landcover\": {\n \"grassland\": \"#d4e7b8\",\n \"barren\": \"#f4e4c8\",\n \"urban_area\": \"#e9e4df\",\n \"farmland\": \"#d4e7b8\",\n \"glacier\": \"#f0f8ff\",\n \"scrub\": \"#c8d9a8\",\n \"forest\": \"#b8d4a8\",\n \"rock\": \"#d8d0c8\",\n \"wetland\": \"#c0e0d8\"\n },\n\n \"transit_rail\": \"#888888\",\n \"transit_freight\": \"#666666\",\n \"transit_bus\": \"#cc7700\",\n \"transit_heritage\": \"#9999bb\",\n\n \"shields\": {\n \"interstate_fill\": \"#4a7090\",\n \"interstate_stroke\": \"#e07050\",\n \"interstate_text\": \"#fff8f0\",\n \"us_highway_fill\": \"#fff8f0\",\n \"us_highway_stroke\": \"#c06030\",\n \"us_highway_text\": \"#5a3020\",\n \"state_fill\": \"#fff8f0\",\n \"state_stroke\": \"#c06030\",\n \"state_text\": \"#5a3020\",\n \"county_fill\": \"#ffd060\",\n \"county_stroke\": \"#a05020\",\n \"county_text\": \"#5a3020\",\n \"default_fill\": \"#fff8f0\",\n \"default_stroke\": \"#c06030\",\n \"default_text\": \"#5a3020\",\n \"banner_text\": \"#5a3020\",\n \"banner_text_halo\": \"#fff8f0\"\n }\n}\n","// ============================================\n// JSON CONFIG IMPORTS\n// ============================================\n\nimport darkConfig from \"./config/styles/dark.json\";\nimport grayConfig from \"./config/styles/gray.json\";\nimport lightConfig from \"./config/styles/light.json\";\nimport warmConfig from \"./config/styles/warm.json\";\n\n// ============================================\n// STYLE NAME TYPE\n// ============================================\n\n/**\n * Valid style name strings\n */\nexport const STYLE_NAMES = [\"light\", \"dark\", \"gray\", \"warm\"] as const;\n\n/**\n * Type for valid style names\n */\nexport type StyleName = (typeof STYLE_NAMES)[number];\n\n/**\n * Type guard to check if a string is a valid style name\n */\nexport function isValidStyleName(name: string): name is StyleName {\n return STYLE_NAMES.includes(name as StyleName);\n}\n\n// ============================================\n// STYLE INTERFACES\n// ============================================\n\nexport interface Style {\n background: string;\n earth: string;\n park_a: string;\n park_b: string;\n hospital: string;\n industrial: string;\n school: string;\n wood_a: string;\n wood_b: string;\n pedestrian: string;\n scrub_a: string;\n scrub_b: string;\n glacier: string;\n sand: string;\n beach: string;\n aerodrome: string;\n runway: string;\n water: string;\n zoo: string;\n military: string;\n\n tunnel_other_casing: string;\n tunnel_minor_casing: string;\n tunnel_link_casing: string;\n tunnel_major_casing: string;\n tunnel_highway_casing: string;\n tunnel_other: string;\n tunnel_minor: string;\n tunnel_link: string;\n tunnel_major: string;\n tunnel_highway: string;\n\n pier: string;\n buildings: string;\n\n minor_service_casing: string;\n minor_casing: string;\n link_casing: string;\n major_casing_late: string;\n highway_casing_late: string;\n other: string;\n minor_service: string;\n minor_a: string;\n minor_b: string;\n link: string;\n major_casing_early: string;\n major: string;\n highway_casing_early: string;\n highway: string;\n\n railway: string;\n boundaries: string;\n\n bridges_other_casing: string;\n bridges_minor_casing: string;\n bridges_link_casing: string;\n bridges_major_casing: string;\n bridges_highway_casing: string;\n bridges_other: string;\n bridges_minor: string;\n bridges_link: string;\n bridges_major: string;\n bridges_highway: string;\n\n roads_label_minor: string;\n roads_label_minor_halo: string;\n roads_label_major: string;\n roads_label_major_halo: string;\n ocean_label: string;\n subplace_label: string;\n subplace_label_halo: string;\n city_label: string;\n city_label_halo: string;\n state_label: string;\n state_label_halo: string;\n country_label: string;\n\n address_label: string;\n address_label_halo: string;\n\n regular?: string;\n bold?: string;\n italic?: string;\n medium?: string;\n\n pois?: Pois;\n landcover?: Landcover;\n shields?: Shields;\n\n // Transit (optional for backward compatibility)\n transit_rail?: string;\n transit_freight?: string; // Darker gray for freight rail\n transit_bus?: string; // Orange/warm for bus infrastructure\n transit_heritage?: string; // Lighter/decorative for heritage\n}\n\nexport interface Pois {\n blue: string;\n green: string;\n lapis: string;\n pink: string;\n red: string;\n slategray: string;\n tangerine: string;\n turquoise: string;\n}\n\nexport interface Landcover {\n barren: string;\n farmland: string;\n forest: string;\n glacier: string;\n grassland: string;\n scrub: string;\n urban_area: string;\n rock: string;\n wetland: string;\n}\n\nexport interface Shields {\n interstate_fill: string;\n interstate_stroke: string;\n interstate_text: string;\n us_highway_fill: string;\n us_highway_stroke: string;\n us_highway_text: string;\n state_fill: string;\n state_stroke: string;\n state_text: string;\n county_fill: string;\n county_stroke: string;\n county_text: string;\n default_fill: string;\n default_stroke: string;\n default_text: string;\n banner_text: string;\n banner_text_halo: string;\n}\n\n// ============================================\n// STYLE INSTANCES (from JSON configs)\n// ============================================\n\nexport const LIGHT: Style = lightConfig as Style;\nexport const DARK: Style = darkConfig as Style;\nexport const GRAY: Style = grayConfig as Style;\nexport const WARM: Style = warmConfig as Style;\n","import type { LayerSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport {\n LANGUAGE_SCRIPT_PAIRS,\n getCountryName,\n getMultilineName,\n} from \"./language\";\nimport { labelsLayers, nolabelsLayers } from \"./layers\";\nimport {\n DARK,\n GRAY,\n LIGHT,\n type Landcover,\n type Pois,\n STYLE_NAMES,\n type Shields,\n type Style,\n type StyleName,\n WARM,\n isValidStyleName,\n} from \"./styles\";\n\n// Re-export language utilities\nexport { LANGUAGE_SCRIPT_PAIRS, getMultilineName, getCountryName };\n\n// Re-export style types and constants\nexport type { Landcover, Pois, Shields, Style, StyleName };\nexport { LIGHT, DARK, GRAY, WARM, STYLE_NAMES, isValidStyleName };\n\n// Re-export layer factories for advanced usage\nexport { labelsLayers, nolabelsLayers } from \"./layers\";\nexport * from \"./layers\";\n\n/**\n * Returns a named style by string identifier\n * @throws Error if style name is not found\n */\nexport function namedStyle(name: string): Style {\n if (isValidStyleName(name)) {\n switch (name) {\n case \"light\":\n return LIGHT;\n case \"dark\":\n return DARK;\n case \"gray\":\n return GRAY;\n case \"warm\":\n return WARM;\n }\n }\n throw new Error(\n `Style not found: ${name}. Valid styles are: ${STYLE_NAMES.join(\", \")}`,\n );\n}\n\n/**\n * Generates all MapLibre GL layers for a given style\n * @param source - The source ID to use for layers\n * @param style - The style theme to apply\n * @param options - Optional configuration\n * @param options.labelsOnly - If true, only generate label layers\n * @param options.lang - Language code for labels (required for label layers)\n */\nexport function layers(\n source: string,\n style: Style,\n options?: { labelsOnly?: boolean; lang?: string },\n): LayerSpecification[] {\n let result: LayerSpecification[] = [];\n if (!options?.labelsOnly) {\n result = nolabelsLayers(source, style);\n }\n if (options?.lang) {\n result = result.concat(labelsLayers(source, style, options.lang));\n }\n return result;\n}\n"],"mappings":"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AC,MAAO,OAAO,CACjB,EACAE,EAAoBK,CAAO,EAC3B;AAAA,EACA,CAAC,EACD,GAAGb,EAAe,OAAQE,CAAO,EACjC;AAAA,EACA,CAAC,EACD,GAAGF,EAAe,QAASE,CAAO,CACpC,CACF,CACF,CACF,CAEF,CA5NgBE,EAAAW,EAAA,oBCnGhB,IAAAC,EAAA,CACE,YAAe,CACb,MAAS,CAAC,QAAS,MAAM,EACzB,MAAS,CAAC,QAAS,cAAe,cAAc,EAChD,MAAS,CAAC,UAAW,YAAa,UAAU,EAC5C,QAAW,CAAC,WAAY,OAAO,EAC/B,UAAa,CAAC,WAAY,QAAS,UAAW,YAAa,UAAU,EACrE,UAAa,CACX,QACA,cACA,eACA,UACA,QACA,MACF,CACF,EACA,oBAAuB,CACrB,MAAS,CACP,OACA,SACA,cACA,aACA,gBACA,mBACF,EACA,OAAU,CAAC,SAAU,YAAa,OAAO,CAC3C,EACA,eAAkB,CAChB,MAAS,CACP,WACA,QACA,aACA,UACA,QACA,YACF,EACA,UAAa,CAAC,SAAU,aAAc,SAAS,EAC/C,WAAc,CAAC,aAAc,KAAK,CACpC,EACA,aAAgB,CACd,SAAY,CAAC,gBAAiB,UAAW,QAAQ,EACjD,SAAY,CAAC,OAAQ,OAAQ,UAAW,QAAQ,CAClD,EACA,aAAgB,CACd,MAAS,CAAC,MAAO,OAAO,EACxB,SAAY,CAAC,QAAS,QAAQ,CAChC,CACF,EC/CA,IAAAC,EAAA,CACE,MAAS,CACP,OAAU,CAAC,WAAW,EACtB,OAAU,CACR,UACA,iBACA,WACA,OACA,MACA,UACA,WACA,aACA,SACF,EACA,OAAU,CACR,OACA,YACA,SACA,kBACA,UACA,aACA,mBACA,SACA,eACA,UACA,SACA,UACA,UACA,WACA,aACA,SACA,eACA,cACA,WACA,aACA,mBACA,OACA,MACA,SACA,UACA,SACA,UACA,UACA,aACA,cACA,QACA,SACA,cACA,SACA,QACA,WACA,WACA,QACA,SACA,YACA,cACA,YACA,SACA,SACA,YACA,QACF,EACA,OAAU,CACR,aACA,YACA,OACA,MACA,MACA,aACA,YACA,cACA,cACA,SACA,UACA,cACA,UACA,QACA,SACA,cACA,YACA,WACA,UACA,QACA,OACA,UACA,WACA,eACA,SACA,MACF,EACA,OAAU,CACR,aACA,WACA,cACA,WACA,UACA,UACA,gBACF,EACA,eAAkB,CAAC,gBAAiB,QAAQ,CAC9C,EACA,WAAc,CACZ,MAAS,CACP,OACA,SACA,aACA,gBACA,QACA,SACA,MACA,YACA,cACA,WACF,EACA,MAAS,CACP,WACA,cACA,UACA,OACA,YACA,SACA,kBACA,YACA,iBACA,OACA,UACA,UACA,aACA,kBACF,EACA,UAAa,CACX,SACA,eACA,UACA,aACA,UACA,WACA,SACA,UACA,UACA,WACA,aACA,SACA,eACA,cACA,WACA,WACA,aACA,mBACA,UACA,iBACA,OACA,MACA,SACA,SACA,YACA,QACF,EACA,KAAQ,CACN,cACA,cACA,SACA,UACA,cACA,UACA,QACA,SACA,cACA,YACA,WACA,UACA,QACA,OACA,UACA,WACA,eACA,QACF,EACA,UAAa,CACX,aACA,YACA,OACA,MACA,MACA,aACA,WACF,EACA,KAAQ,CACN,SACA,UACA,SACA,UACA,UACA,aACA,cACA,QACA,SACA,cACA,SACA,QACA,WACA,UACF,CACF,CACF,EC5MA,IAAAC,GAAA,CACE,qBAAwB,EACxB,mBAAsB,EACtB,sBAAyB,EACzB,oBAAuB,EAEvB,gBAAmB,EACnB,cAAiB,EACjB,mBAAsB,EACtB,iBAAoB,GAEpB,YAAe,GAEf,oBAAuB,GACvB,mBAAsB,EAEtB,wBAA2B,GAC3B,eAAkB,GAClB,4BAA+B,GAC/B,6BAAgC,GAChC,8BAAiC,GACjC,+BAAkC,GAClC,kBAAqB,GAErB,2BAA8B,GAC9B,yBAA4B,GAC5B,uBAA0B,GAC1B,uBAA0B,GAC1B,qBAAwB,GACxB,gBAAmB,GACnB,2BAA8B,GAC9B,kBAAqB,EAErB,mBAAsB,GACtB,oBAAuB,GACvB,wBAA2B,GAC3B,uBAA0B,GAC1B,uBAA0B,GAC1B,eAAkB,EACpB,EC9BO,IAAMC,EAAOC,GAMPC,EAAeC,EAAe,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","names":["languages_default","LANGUAGE_SCRIPT_PAIRS","languages_default","get_name_block","script_segment","regular","script","__name","is_not_in_target_script","lang","suffix","get_font_formatting","getDefaultScript","pair","d","getCountryName","_script","name_prefix","getMultilineName","features_default","poi_default","zoom_default","ZOOM","zoom_default","ROAD_CLASSES","features_default","POI_TIERS","poi_default","POI_CATEGORIES","FILTERS","LINE_WIDTHS","LANDCOVER_SUBCLASSES","LANDUSE_CLASSES","PLACE_CLASSES","WATER_CLASSES","createBackgroundLayers","source","style","FILTERS","__name","createWaterLayers","ZOOM","createBoundaryLayers","source","style","__name","createBuildingLayers","source","style","__name","getFont","style","fontStyle","__name","createLabelLayer","config","id","source","sourceLayer","lang","script","filter","minzoom","maxzoom","textSize","textColor","haloColor","haloWidth","letterSpacing","maxWidth","textTransform","symbolPlacement","useCountryName","font","textField","getCountryName","getMultilineName","layout","layer","createWaterLabels","createRoadLabels","createPlaceLabels","createMiscLabels","createLandcoverLayers","source","style","ZOOM","LANDCOVER_SUBCLASSES","__name","createParkLayers","createLanduseLayers","LANDUSE_CLASSES","createAerowayLayers","createPoiLayers","source","style","lang","script","ZOOM","POI_TIERS","getMultilineName","POI_CATEGORIES","__name","getRoadClasses","category","ROAD_CLASSES","__name","buildFilter","brunnel","conditions","FILTERS","classes","getLayerId","isCasing","getCasingColor","style","getFillColor","getLineWidth","LINE_WIDTHS","getCasingGapWidth","getCasingWidth","getDasharray","createRoadLayer","config","source","minzoom","maxzoom","layer","dasharray","createTunnelLayers","categories","layers","createRoadLayers","ZOOM","__spreadProps","__spreadValues","createBridgeLayers","createPierLayer","createTransitLayers","source","style","ZOOM","__name","nolabelsLayers","source","style","createBackgroundLayers","createLandcoverLayers","createParkLayers","createLanduseLayers","createAerowayLayers","createWaterLayers","createTunnelLayers","createBuildingLayers","createPierLayer","createRoadLayers","createTransitLayers","createBoundaryLayers","createBridgeLayers","__name","labelsLayers","lang","script","createMiscLabels","createWaterLabels","createRoadLabels","createPoiLayers","createPlaceLabels","dark_default","gray_default","light_default","warm_default","STYLE_NAMES","isValidStyleName","name","__name","LIGHT","light_default","DARK","dark_default","GRAY","gray_default","WARM","warm_default","namedStyle","name","isValidStyleName","LIGHT","DARK","GRAY","WARM","STYLE_NAMES","__name","layers","source","style","options","result","nolabelsLayers","labelsLayers"]}