diff --git a/apps/api/src/maps/maps.controller.ts b/apps/api/src/maps/maps.controller.ts index 941b8e3..62c19f3 100644 --- a/apps/api/src/maps/maps.controller.ts +++ b/apps/api/src/maps/maps.controller.ts @@ -1,5 +1,8 @@ -import { Controller, Get, Query, UseGuards } from '@nestjs/common'; +import { Controller, Get, Query, UseGuards, Res } from '@nestjs/common'; import { ApiTags, ApiOperation } from '@nestjs/swagger'; +import type { Response } from 'express'; +import * as fs from 'fs'; +import * as path from 'path'; import { MapsService } from './maps.service'; import { ApiKeyGuard } from '../common/guards/api-key.guard'; @@ -7,13 +10,72 @@ import { ApiKeyGuard } from '../common/guards/api-key.guard'; @Controller('maps') @UseGuards(ApiKeyGuard) export class MapsController { - constructor(private readonly mapsService: MapsService) {} + constructor(private readonly mapsService: MapsService) { } + + @Get('style.json') + @ApiOperation({ summary: 'Get MapLibre style JSON 🎨' }) + async getStyleJson(@Query('theme') theme: string, @Res() res: Response) { + // Determine filenames based on theme + const isDark = theme === 'obsidian'; + const filename = isDark ? 'style-dark.json' : 'style.json'; + const fallbackFilename = 'style.json'; + + // Paths to check + const pathsToCheck = [ + path.join('/data', filename), + path.join(process.cwd(), '../../', filename), + path.join(process.cwd(), filename), + // Fallbacks to light style if dark is missing + path.join('/data', fallbackFilename), + path.join(process.cwd(), '../../', fallbackFilename), + path.join(process.cwd(), fallbackFilename), + ]; + + let stylePath = ''; + for (const p of pathsToCheck) { + if (fs.existsSync(p)) { + stylePath = p; + break; + } + } + + if (!stylePath) { + return res.status(404).send('Style not found'); + } + + try { + const styleRaw = fs.readFileSync(stylePath, 'utf8'); + const styleObj = JSON.parse(styleRaw); + + // Dynamic Theme support (Safety overrides or fine-tuning) + if (theme === 'light') { + styleObj.layers.forEach((layer: any) => { + if (layer.id === 'background') { + layer.paint['background-color'] = '#FFFFFF'; + } + }); + } else if (theme === 'obsidian') { + // If we found style-dark.json, we don't strictly need this, + // but keeping it as a helper or if it fell back to style.json + styleObj.layers.forEach((layer: any) => { + if (layer.id === 'background') { + layer.paint['background-color'] = '#101014'; // Dark tone + } + }); + } + + res.setHeader('Content-Type', 'application/json'); + res.send(styleObj); + } catch (e) { + res.status(500).send('Error parsing style.json'); + } + } @Get('route') @ApiOperation({ summary: 'Calculate a route with dynamic waypoints πŸš—' }) async getRoute(@Query() query: any) { const waypoints: [number, number][] = []; - + // 1. Extract Origin (fromLat, fromLng) if (query.fromLat && query.fromLng) { waypoints.push([parseFloat(query.fromLat), parseFloat(query.fromLng)]); @@ -45,7 +107,7 @@ export class MapsController { const profile = query.profile || 'car'; const steps = query.steps === 'true'; const locale = query.locale || 'en'; - + return this.mapsService.getRoute(waypoints, profile, steps, locale); } diff --git a/apps/dashboard/index.html b/apps/dashboard/index.html index 984e31d..ebde065 100644 --- a/apps/dashboard/index.html +++ b/apps/dashboard/index.html @@ -1,13 +1,374 @@ - - - - - - - dashboard - - -
- - + + + + + + Jordan Map Platform | Developer Dashboard + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ System Operational +
+ +
+
+

Loading...

+

developer@intaleq.com

+
+
+ +
+
+
+ +
+ + +
+
+

Welcome back...

+

Everything you need to build with premium Jordan Map Platform API

+
+ + +
+
+
+
+ +
+ +12.5% +
+

Total Requests

+
42,891
+
+
+
+
+ +
+ +0.01% +
+

Success Rate

+
99.98%
+
+
+
+
+ +
+ Stable +
+

Active Keys

+
...
+
+
+
+
+ +
+ -12ms +
+

Map Load Speed

+
342ms
+
+
+ +
+ +
+
+
+

Request Traffic

+

Live traffic across all API endpoints

+
+ + Full Analytics + +
+
+ +
+
+ + +
+

Quick Start

+

Get started with our lightweight SDK in seconds.

+
+
+

# Install with npm

+

npm install @intaleq/maps-gl

+
+ + + + Try Maps Playground + +
+
+
+ + +
+
+
+

Your API Keys

+

Manage keys for your applications

+
+ +
+ +
+ + + + + + + + + + + + + + + + +
NameAPI KeyStatusRestrictionsActions
+
+ +

Fetching your secure keys...

+
+
+
+
+
+ + +
+
+

Maps Playground

+

Test your API keys and visualize vector tiles in real-time

+
+ +
+ +
+
+

Configuration

+
+
+ + +
+
+ +
+ + +
+
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+ + +
+
+

Analytics

+

Deep insights into your API performance

+
+ +
+
+

Request Volume (Last 7 Days)

+
+
+
+

Service Latency (ms)

+
+
+
+
+ +
+
+ + + + + + + + + diff --git a/apps/dashboard/js/analytics.js b/apps/dashboard/js/analytics.js new file mode 100644 index 0000000..f8b4274 --- /dev/null +++ b/apps/dashboard/js/analytics.js @@ -0,0 +1,63 @@ +/** + * Analytics Logic (Simple CSS Charts) + */ + +const analytics = { + mockData: [ + { name: 'Mon', requests: 4000, latency: 240 }, + { name: 'Tue', requests: 3000, latency: 198 }, + { name: 'Wed', requests: 2000, latency: 310 }, + { name: 'Thu', requests: 2780, latency: 208 }, + { name: 'Fri', requests: 1890, latency: 250 }, + { name: 'Sat', requests: 2390, latency: 210 }, + { name: 'Sun', requests: 3490, latency: 225 }, + ], + + init: () => { + console.log('πŸ“ˆ Initializing Analytics...'); + analytics.renderVolumeChart(); + analytics.renderLatencyChart(); + }, + + renderVolumeChart: () => { + const container = document.getElementById('v-chart'); + if (!container) return; + + const max = Math.max(...analytics.mockData.map(d => d.requests)); + + container.innerHTML = analytics.mockData.map(d => ` +
+
+
+
+
+ ${d.requests} +
+
+ ${d.name} +
+ `).join(''); + }, + + renderLatencyChart: () => { + const container = document.getElementById('l-chart'); + if (!container) return; + + const max = Math.max(...analytics.mockData.map(d => d.latency)); + + container.innerHTML = analytics.mockData.map(d => ` +
+
+
+
+
+ ${d.latency}ms +
+
+ ${d.name} +
+ `).join(''); + } +}; diff --git a/apps/dashboard/js/app.js b/apps/dashboard/js/app.js new file mode 100644 index 0000000..a9ac2ca --- /dev/null +++ b/apps/dashboard/js/app.js @@ -0,0 +1,221 @@ +/** + * Main App Logic for Intaleq Dashboard (Vanilla Version) + */ + +const app = { + state: { + tenant: null, + keys: [], + showKeys: {}, // { id: boolean } + activePage: 'home' + }, + + init: async () => { + console.log('πŸš€ Dashboard Initializing...'); + app.bindEvents(); + app.handleRouting(); + await app.fetchData(); + lucide.createIcons(); + }, + + bindEvents: () => { + window.addEventListener('hashchange', app.handleRouting); + + // Form submission for new key + const createKeyForm = document.getElementById('create-key-form'); + if (createKeyForm) { + createKeyForm.addEventListener('submit', async (e) => { + e.preventDefault(); + await app.createKey(); + }); + } + }, + + handleRouting: () => { + const hash = window.location.hash.replace('#', '') || 'home'; + app.state.activePage = hash; + + // Update UI + document.querySelectorAll('.page-section').forEach(s => s.classList.remove('active')); + const activeSection = document.getElementById(hash); + if (activeSection) activeSection.classList.add('active'); + + // Update Nav + document.querySelectorAll('.nav-link').forEach(l => l.classList.remove('active')); + const activeLink = document.getElementById(`nav-${hash}`); + if (activeLink) activeLink.classList.add('active'); + + // Specialized page logic + if (hash === 'playground') { + playground.init(app.state.keys); + } else if (hash === 'analytics') { + analytics.init(); + } + }, + + fetchData: async () => { + try { + // Fetch Tenant + const tenantRes = await fetch('/api/auth/management/me'); + if (tenantRes.ok) { + app.state.tenant = await tenantRes.data || await tenantRes.json(); + app.updateHeader(); + } + + // Fetch Keys + if (app.state.tenant && app.state.tenant.id) { + const keysRes = await fetch(`/api/auth/management/keys/${app.state.tenant.id}`); + if (keysRes.ok) { + app.state.keys = await keysRes.json(); + app.renderKeysTable(); + app.updateStats(); + } + } + } catch (error) { + console.error('Failed to fetch dashboard data', error); + } + }, + + updateHeader: () => { + if (!app.state.tenant) return; + document.getElementById('tenant-name').textContent = app.state.tenant.name; + document.getElementById('tenant-email').textContent = app.state.tenant.email; + document.getElementById('welcome-msg').textContent = `Welcome back, ${app.state.tenant.name}`; + }, + + updateStats: () => { + document.getElementById('active-keys-count').textContent = app.state.keys.length; + + // Inject random bars for traffic + const container = document.getElementById('traffic-bars'); + if (container) { + container.innerHTML = ''; + const values = [40, 60, 55, 80, 70, 45, 90, 85, 60, 40, 30, 55, 75, 40, 60, 55, 80, 70, 45, 90]; + values.forEach(h => { + const bar = document.createElement('div'); + bar.className = 'flex-1 bg-gradient-to-t from-blue-600/20 to-blue-400/80 rounded-t-sm relative group hover:to-blue-300 transition-all'; + bar.style.height = `${h}%`; + bar.innerHTML = `
${h}k
`; + container.appendChild(bar); + }); + } + }, + + renderKeysTable: () => { + const tbody = document.getElementById('keys-table-body'); + const createBtn = document.getElementById('create-key-btn'); + + if (!tbody) return; + + if (app.state.keys.length === 0) { + tbody.innerHTML = `No API keys found. Create one to get started.`; + return; + } + + // Disable create button if limit reached (per React logic) + if (app.state.keys.length >= 1) { + createBtn.disabled = true; + createBtn.title = "Limit of 1 API key per developer reached"; + createBtn.innerHTML = ' Limit Reached'; + } + + tbody.innerHTML = app.state.keys.map(key => { + const isVisible = app.state.showKeys[key.id]; + const maskedKey = isVisible ? key.key : "in_β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’"; + const eyeIcon = isVisible ? 'eye-off' : 'eye'; + + return ` + + ${key.name} + +
+ ${maskedKey} +
+ + +
+
+ + + +
+ ${key.isActive ? 'Active' : 'Inactive'} +
+ + +
+ ${(key.allowedOrigins && key.allowedOrigins.length > 0) ? + key.allowedOrigins.map(org => ` ${org}`).join('') : + ` Universal` + } +
+ + + + + + `; + }).join(''); + + lucide.createIcons(); + }, + + toggleKeyVisibility: (id) => { + app.state.showKeys[id] = !app.state.showKeys[id]; + app.renderKeysTable(); + }, + + copyToClipboard: (text) => { + navigator.clipboard.writeText(text); + // Simple toast or just feedback + console.log('Copied to clipboard'); + }, + + toggleModal: (id, show) => { + const modal = document.getElementById(id); + if (modal) { + if (show) modal.classList.remove('hidden'); + else modal.classList.add('hidden'); + } + }, + + createKey: async () => { + const name = document.getElementById('new-key-name').value; + const btn = document.getElementById('btn-submit-key'); + + if (!app.state.tenant) return; + + try { + btn.disabled = true; + btn.textContent = 'Creating...'; + + const res = await fetch(`/api/auth/management/keys/${app.state.tenant.id}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, rateLimit: 100 }) + }); + + if (res.ok) { + app.toggleModal('create-key-modal', false); + await app.fetchData(); + document.getElementById('new-key-name').value = ''; + } else { + alert('Failed to create key'); + } + } catch (error) { + console.error(error); + } finally { + btn.disabled = false; + btn.textContent = 'Create Key'; + } + } +}; + +// Start app +document.addEventListener('DOMContentLoaded', app.init); diff --git a/apps/dashboard/js/playground.js b/apps/dashboard/js/playground.js new file mode 100644 index 0000000..30530e8 --- /dev/null +++ b/apps/dashboard/js/playground.js @@ -0,0 +1,123 @@ +/** + * Playground Logic (Map Integration) + */ + +const playground = { + map: null, + currentStyle: 'obsidian', + selectedKey: '', + + init: (keys) => { + if (playground.map) return; + console.log('πŸ—ΊοΈ Initializing Playground...'); + + playground.renderKeySelect(keys); + playground.bindEvents(); + + if (keys.length > 0) { + playground.selectedKey = keys[0].key; + playground.loadMap(); + } + }, + + renderKeySelect: (keys) => { + const select = document.getElementById('pg-key-select'); + if (!select) return; + select.innerHTML = keys.map(k => ``).join(''); + if (keys.length === 0) select.innerHTML = ''; + }, + + bindEvents: () => { + const select = document.getElementById('pg-key-select'); + if (select) { + select.addEventListener('change', (e) => { + playground.selectedKey = e.target.value; + playground.updateMap(); + }); + } + + const searchInput = document.getElementById('pg-search'); + if (searchInput) { + searchInput.addEventListener('keydown', async (e) => { + if (e.key === 'Enter' && searchInput.value) { + await playground.handleSearch(searchInput.value); + } + }); + } + }, + + loadMap: async () => { + const container = document.getElementById('map'); + if (!container || !playground.selectedKey) return; + + try { + // Set RTL Text Plugin + if (maplibregl.getRTLTextPluginStatus() === 'unavailable') { + maplibregl.setRTLTextPlugin( + 'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.2.3/mapbox-gl-rtl-text.js', + null, + true + ); + } + + const styleUrl = `/api/maps/style.json?api_key=${playground.selectedKey}&theme=${playground.currentStyle}`; + const res = await fetch(styleUrl); + const styleData = await res.json(); + + playground.map = new maplibregl.Map({ + container: 'map', + style: styleData, + center: [35.91, 31.95], // Amman, Jordan + zoom: 12, + attributionControl: false + }); + + playground.map.addControl(new maplibregl.NavigationControl(), 'top-right'); + + playground.map.on('load', () => { + console.log('Map loaded!'); + playground.map.resize(); + }); + + } catch (error) { + console.error('Failed to init map', error); + } + }, + + updateMap: async () => { + if (!playground.map) return; + try { + const styleUrl = `/api/maps/style.json?api_key=${playground.selectedKey}&theme=${playground.currentStyle}`; + const res = await fetch(styleUrl); + const styleData = await res.json(); + playground.map.setStyle(styleData); + } catch (error) { + console.error('Failed to update style', error); + } + }, + + setStyle: (style) => { + playground.currentStyle = style; + // Update UI buttons + document.getElementById('style-obsidian').className = (style === 'obsidian') ? 'flex-1 py-3 text-xs font-bold rounded-xl bg-blue-600 text-white shadow-lg shadow-blue-500/20' : 'flex-1 py-3 text-xs font-bold rounded-xl bg-slate-900 text-slate-500'; + document.getElementById('style-light').className = (style === 'light') ? 'flex-1 py-3 text-xs font-bold rounded-xl bg-blue-600 text-white shadow-lg shadow-blue-500/20' : 'flex-1 py-3 text-xs font-bold rounded-xl bg-slate-900 text-slate-500'; + + playground.updateMap(); + }, + + handleSearch: async (query) => { + try { + const res = await fetch(`/api/geocoding/search?q=${encodeURIComponent(query)}`, { + headers: { 'x-api-key': playground.selectedKey } + }); + if (res.ok) { + const data = await res.json(); + if (data && data.length > 0) { + playground.map.flyTo({ center: [data[0].longitude, data[0].latitude], zoom: 14 }); + } + } + } catch (err) { + console.error("Search failed", err); + } + } +}; diff --git a/apps/dashboard/src/pages/Playground.tsx b/apps/dashboard/src/pages/Playground.tsx index cc55dbc..3b5776d 100644 --- a/apps/dashboard/src/pages/Playground.tsx +++ b/apps/dashboard/src/pages/Playground.tsx @@ -1,10 +1,10 @@ import { useEffect, useRef, useState } from 'react'; import maplibregl from 'maplibre-gl'; import 'maplibre-gl/dist/maplibre-gl.css'; -import { - Maximize2, - Map as MapIcon, - Search, +import { + Maximize2, + Map as MapIcon, + Search, Info, ChevronDown } from 'lucide-react'; @@ -17,34 +17,132 @@ const Playground = ({ apiKeys }: PlaygroundProps) => { const mapContainer = useRef(null); const map = useRef(null); const [selectedKey, setSelectedKey] = useState(apiKeys[0]?.key || ''); + const [mapStyle, setMapStyle] = useState('light'); const [lng] = useState(35.91); const [lat] = useState(31.95); const [zoom] = useState(12); + const [searchQuery, setSearchQuery] = useState(''); + const [mapError, setMapError] = useState(null); + const isInitializing = useRef(false); + + // Sync selectedKey when apiKeys load asynchronously + useEffect(() => { + if (!selectedKey && apiKeys.length > 0) { + setSelectedKey(apiKeys[0].key); + } + }, [apiKeys, selectedKey]); useEffect(() => { - if (map.current) return; - if (!mapContainer.current) return; + if (map.current || isInitializing.current) return; + if (!mapContainer.current || !selectedKey) return; - // Use a relative URL for the style to use the Vite proxy - const styleUrl = `/api/maps/style.json?api_key=${selectedKey}`; + isInitializing.current = true; + + const initMap = async () => { + try { + if (maplibregl.getRTLTextPluginStatus() === 'unavailable') { + maplibregl.setRTLTextPlugin( + 'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.2.3/mapbox-gl-rtl-text.js', + true // Lazy load + ); + } + + setMapError(null); + const styleUrl = `/api/maps/style.json?api_key=${selectedKey}&theme=${mapStyle}`; + + + console.log("Fetching map style from API..."); + const res = await fetch(styleUrl); + if (!res.ok) { + const errText = await res.text(); + throw new Error(`HTTP ${res.status}: ${errText}`); + } + const styleData = await res.json(); + console.log("Map style loaded successfully!", styleData.name); + + map.current = new maplibregl.Map({ + container: mapContainer.current!, + style: styleData, + center: [lng, lat], + zoom: zoom, + attributionControl: false + }); + + map.current.addControl(new maplibregl.NavigationControl(), 'top-right'); + + map.current.on('load', () => { + map.current?.resize(); + }); + + map.current.on('error', (e) => { + console.error('MapLibre internal error:', e); + if (e && e.error && e.error.message) { + setMapError(e.error.message); + } + }); + + } catch (e: any) { + console.error("Failed to initialize MapLibre:", e); + setMapError(e.message || 'Error occurred initializing MapLibre.'); + } finally { + isInitializing.current = false; + } + }; + + initMap(); + }, [selectedKey, mapStyle]); - map.current = new maplibregl.Map({ - container: mapContainer.current, - style: styleUrl, - center: [lng, lat], - zoom: zoom, - attributionControl: false - }); - map.current.addControl(new maplibregl.NavigationControl(), 'top-right'); - }, [selectedKey]); useEffect(() => { - if (!map.current) return; - // Update style when key changes - const styleUrl = `/api/maps/style.json?api_key=${selectedKey}`; - map.current.setStyle(styleUrl); - }, [selectedKey]); + if (!map.current || !selectedKey) return; + const updateStyle = async () => { + try { + // Update style when key or theme changes + const styleUrl = `/api/maps/style.json?api_key=${selectedKey}&theme=${mapStyle}`; + const response = await fetch(styleUrl); + if (response.ok) { + const styleObj = await response.json(); + map.current?.setStyle(styleObj); + } + } catch (e) { + console.error("Failed to update map style", e); + } + }; + updateStyle(); + }, [selectedKey, mapStyle]); + + const toggleFullScreen = () => { + if (!document.fullscreenElement) { + mapContainer.current?.requestFullscreen().catch(err => { + console.error(`Error attempting to enable full-screen mode: ${err.message}`); + }); + } else { + document.exitFullscreen(); + } + }; + + const resetMap = () => { + map.current?.flyTo({ center: [lng, lat], zoom, pitch: 0, bearing: 0 }); + }; + + const handleSearch = async (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && searchQuery) { + try { + const res = await fetch(`/api/geocoding/search?q=${encodeURIComponent(searchQuery)}`, { + headers: { 'x-api-key': selectedKey } + }); + if (res.ok) { + const data = await res.json(); + if (data && data.length > 0) { + map.current?.flyTo({ center: [data[0].longitude, data[0].latitude], zoom: 14 }); + } + } + } catch (err) { + console.error("Search failed", err); + } + } + }; return (
@@ -58,12 +156,12 @@ const Playground = ({ apiKeys }: PlaygroundProps) => {

Configuration

- +
- setSearchQuery(e.target.value)} + onKeyDown={handleSearch} />
{/* Bottom Controls */}
- -
diff --git a/apps/web/public/map-demo.html b/apps/web/public/map-demo.html index 446867c..5277170 100644 --- a/apps/web/public/map-demo.html +++ b/apps/web/public/map-demo.html @@ -378,7 +378,7 @@ container: 'map', center: ROUTES.LEVANT.center, zoom: ROUTES.LEVANT.zoom, - style: './style.json', // ← style.json fixed (no duplicate IDs) + style: `${API_BASE}/api/maps/style.json?api_key=${API_KEY}`, pitch: 0, bearing: 0, attributionControl: false diff --git a/docker-compose.yml b/docker-compose.yml index 36924b9..0300074 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -158,7 +158,7 @@ services: - api - martin - # Commercial Dashboard: React/Vite + # Commercial Dashboard: Vanilla HTML/CSS/JS (High Performance) dashboard: build: context: . @@ -166,9 +166,7 @@ services: container_name: map-dashboard platform: linux/amd64 ports: - - "3204:5173" - environment: - - VITE_API_URL=http://api:3200 + - "3204:80" depends_on: - api diff --git a/infrastructure/docker/dashboard/Dockerfile b/infrastructure/docker/dashboard/Dockerfile index 928d278..10cc73f 100644 --- a/infrastructure/docker/dashboard/Dockerfile +++ b/infrastructure/docker/dashboard/Dockerfile @@ -1,18 +1,21 @@ -FROM node:20-alpine +FROM nginx:alpine -WORKDIR /app +# Remove default nginx static assets +RUN rm -rf /usr/share/nginx/html/* -# Install dependencies placeholder -COPY apps/dashboard/package*.json ./ -RUN npm install +# Copy static assets into nginx +COPY apps/dashboard/index.html /usr/share/nginx/html/ +COPY apps/dashboard/js /usr/share/nginx/html/js/ +COPY apps/dashboard/css /usr/share/nginx/html/css/ -# Copy source -COPY apps/dashboard/ . +# Fix networking issues by adding a simple redirect for spa if needed +# But for hash-based routing, default index.html is enough. +# We also need to handle the API proxy if we want to avoid CORS issues +# However, the user's docker-compose has the API and Dashboard on different ports. +# In a real production, we'd use Nginx to proxy /api to the backend. -# Build for production -RUN npm run build +COPY infrastructure/docker/dashboard/nginx.conf /etc/nginx/conf.d/default.conf -# We use a simple static server or just serve from Vite for demo -# For production, we can use nginx, but let's stick to dev/preview mode for now -# per user request to see "what happens" -CMD ["npm", "run", "preview", "--", "--host", "--port", "5173"] +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/infrastructure/docker/dashboard/nginx.conf b/infrastructure/docker/dashboard/nginx.conf new file mode 100644 index 0000000..d23540b --- /dev/null +++ b/infrastructure/docker/dashboard/nginx.conf @@ -0,0 +1,30 @@ +server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri $uri/ /index.html; + } + + # Proxy API requests to the api service in docker + location /api/ { + proxy_pass http://api:3200/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + # Proxy Martin Vector Tiles (if accessed via dashboard directly) + location /tiles/ { + proxy_pass http://martin:3000/; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/style-dark.json b/style-dark.json new file mode 100644 index 0000000..000a1c4 --- /dev/null +++ b/style-dark.json @@ -0,0 +1,2862 @@ +{ + "version": 8, + "name": "Intaleq Premium β€” Obsidian v2.9", + "metadata": { + "brand": "Intaleq", + "version": "2.10.0-obsidian", + "description": "Intaleq dark (obsidian) theme β€” buildings at close zoom only, on-road labels, improved arrows" + }, + "center": [ + 36.276008, + 33.513685 + ], + "zoom": 15, + "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", + "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", + "sources": { + "local-osm-polygons": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" + ], + "maxzoom": 14, + "attribution": "Β© Intaleq | Β© OpenStreetMap contributors" + }, + "local-osm-lines": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "local-osm-points": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_egypt": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_syria": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_jordan": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_buildings": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_segments": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" + ], + "maxzoom": 14 + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#101014" + } + }, + { + "id": "landuse-residential", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "residential" + ], + "paint": { + "fill-color": "#151A22", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-commercial", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "commercial" + ], + "paint": { + "fill-color": "#1C1C24", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-cemetery", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "cemetery" + ], + "paint": { + "fill-color": "#1D231E", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-military", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "military" + ], + "paint": { + "fill-color": "#2A251F", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-industrial", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "in", + "landuse", + "industrial", + "railway" + ], + "paint": { + "fill-color": "#181C22", + "fill-opacity": 1 + } + }, + { + "id": "park-layer", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "leisure", + "park", + "garden", + "nature_reserve", + "pitch", + "playground" + ], + [ + "in", + "landuse", + "grass", + "meadow", + "forest" + ], + [ + "in", + "natural", + "wood", + "scrub", + "heath" + ] + ], + "paint": { + "fill-color": [ + "match", + [ + "get", + "leisure" + ], + "pitch", + "#1A2B1A", + "playground", + "#1E2E1E", + "#1A281A" + ], + "fill-opacity": 0.6 + } + }, + { + "id": "park-outline", + "type": "line", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "in", + "leisure", + "park", + "garden", + "nature_reserve" + ], + "paint": { + "line-color": "#1A2B1A", + "line-width": 0.8, + "line-opacity": 0.4 + } + }, + { + "id": "water-polygon", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "natural", + "water", + "lake", + "bay" + ], + [ + "==", + "waterway", + "riverbank" + ], + [ + "in", + "landuse", + "basin", + "reservoir" + ], + [ + "==", + "amenity", + "fountain" + ] + ], + "paint": { + "fill-color": "#0E2A3A", + "fill-opacity": 0.85 + } + }, + { + "id": "water-polygon-outline", + "type": "line", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "natural", + "water", + "lake", + "bay" + ], + [ + "==", + "waterway", + "riverbank" + ], + [ + "in", + "landuse", + "basin", + "reservoir" + ] + ], + "paint": { + "line-color": "#1A3A4A", + "line-width": 0.8, + "line-opacity": 0.6 + } + }, + { + "id": "waterway-river", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "river", + "canal" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "!=", + "seasonal", + "yes" + ], + [ + "!=", + "tunnel", + "yes" + ] + ], + "paint": { + "line-color": "#1A3A4A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1.5, + 14, + 4, + 16, + 7 + ], + "line-opacity": 0.95 + } + }, + { + "id": "waterway-stream-drain", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "stream", + "drain", + "ditch" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "!=", + "seasonal", + "yes" + ], + [ + "!=", + "tunnel", + "yes" + ] + ], + "minzoom": 13, + "paint": { + "line-color": "#1A3A4A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 0.8, + 16, + 2.5 + ], + "line-opacity": 0.85 + } + }, + { + "id": "railway-area", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "railway" + ], + "paint": { + "fill-color": "#DDE2EA", + "fill-opacity": 0.9 + } + }, + { + "id": "railway-rail-casing", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "railway", + "rail", + "narrow_gauge", + "preserved" + ], + [ + "!=", + "service", + "yard" + ], + [ + "!=", + "service", + "siding" + ] + ], + "minzoom": 8, + "paint": { + "line-color": "#B0B8C5", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 2, + 12, + 4, + 16, + 8 + ] + } + }, + { + "id": "railway-rail-core", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "railway", + "rail", + "narrow_gauge", + "preserved" + ], + [ + "!=", + "service", + "yard" + ], + [ + "!=", + "service", + "siding" + ] + ], + "minzoom": 8, + "paint": { + "line-color": "#6B7A8E", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 2.5, + 16, + 5 + ], + "line-dasharray": [ + 6, + 4 + ] + } + }, + { + "id": "railway-subway-casing", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "subway", + "light_rail", + "tram", + "monorail" + ], + "minzoom": 10, + "paint": { + "line-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#CC2233", + "light_rail", + "#0066CC", + "tram", + "#8833BB", + "monorail", + "#008855", + "#BB3344" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 3, + 14, + 6, + 16, + 10 + ] + } + }, + { + "id": "railway-subway-core", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "subway", + "light_rail", + "tram", + "monorail" + ], + "minzoom": 10, + "paint": { + "line-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#FF3347", + "light_rail", + "#2288FF", + "tram", + "#AA44EE", + "monorail", + "#00BB66", + "#FF4455" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1.5, + 14, + 3.5, + 16, + 6 + ] + } + }, + { + "id": "road-casing-track-path", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "track", + "path", + "footway", + "cycleway", + "steps" + ], + "minzoom": 14, + "paint": { + "line-color": "#D4D8DF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 16, + 4 + ], + "line-dasharray": [ + 4, + 3 + ] + } + }, + { + "id": "road-casing-minor", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street", + "pedestrian" + ], + "paint": { + "line-color": "#D4D8DF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1.5, + 16, + 10 + ], + "line-opacity": 0.7 + } + }, + { + "id": "road-core-minor", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street", + "pedestrian" + ], + "paint": { + "line-color": "#FFFFFF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0.8, + 16, + 8 + ] + } + }, + { + "id": "road-casing-tertiary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "tertiary", + "tertiary_link" + ], + "paint": { + "line-color": "#000000", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 2, + 16, + 14 + ], + "line-opacity": 0.75 + } + }, + { + "id": "road-core-tertiary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "tertiary", + "tertiary_link" + ], + "paint": { + "line-color": "#FFFFFF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 1.2, + 16, + 11 + ] + } + }, + { + "id": "road-casing-secondary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "secondary", + "secondary_link" + ], + "paint": { + "line-color": "#000000", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 2.5, + 16, + 16 + ], + "line-opacity": 0.8 + } + }, + { + "id": "road-core-secondary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "secondary", + "secondary_link" + ], + "paint": { + "line-color": "#232B38", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 1.8, + 16, + 13 + ] + } + }, + { + "id": "road-casing-primary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "primary_link" + ], + "paint": { + "line-color": "#1A1A1A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 3, + 16, + 18 + ], + "line-opacity": 0.7 + } + }, + { + "id": "road-core-primary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "primary_link" + ], + "paint": { + "line-color": "#4A4A2A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 2, + 16, + 14 + ] + } + }, + { + "id": "road-casing-motorway", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + "paint": { + "line-color": "#1A1A1A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 4, + 16, + 20 + ], + "line-opacity": 0.75 + } + }, + { + "id": "road-core-motorway", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + "paint": { + "line-color": "#5A4A1A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 2.5, + 16, + 16 + ] + } + }, + { + "id": "road-direction-arrows", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "minzoom": 15, + "filter": [ + "all", + [ + "in", + "highway", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "residential", + "unclassified", + "living_street" + ], + [ + "==", + "oneway", + "yes" + ] + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 120, + "text-field": "β†’", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 16, + 17, + 22, + 19, + 28 + ], + "text-keep-upright": false, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-allow-overlap": true, + "text-ignore-placement": true, + "text-padding": 0, + "text-letter-spacing": -0.1 + }, + "paint": { + "text-color": "rgba(100,200,255,0.45)", + "text-halo-color": "rgba(0,0,0,0.5)", + "text-halo-width": 1 + } + }, + { + "id": "building-fill-flat", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "has", + "building" + ], + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#1A1D24", + "fill-opacity": 0.85, + "fill-outline-color": "#000000" + } + }, + { + "id": "building-3d", + "type": "fill-extrusion", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 16, + "filter": [ + "has", + "building" + ], + "paint": { + "fill-extrusion-color": "#2A2F3A", + "fill-extrusion-height": [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "to-number", + [ + "get", + "building:levels" + ], + 2 + ], + 3.5 + ], + 7 + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": 0.8, + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "building-3d-overture", + "type": "fill-extrusion", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 16, + "paint": { + "fill-extrusion-color": [ + "match", + [ + "get", + "subtype" + ], + "commercial", + "#D8D0C0", + "retail", + "#E0D0B8", + "industrial", + "#C8D0DC", + "religious", + "#C8D4EC", + "education", + "#D4E0C4", + "medical", + "#E8D4D4", + "#DDD8D0" + ], + "fill-extrusion-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 9 + ], + 18, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 12 + ] + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + 0.6, + 17, + 0.88 + ], + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "overture-building-footprint", + "type": "fill", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#1A1D24", + "fill-opacity": 0.82, + "fill-outline-color": "#000000" + } + }, + { + "id": "railway-label", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "rail", + "subway", + "light_rail", + "tram" + ], + "minzoom": 13, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "symbol-placement": "line", + "text-padding": 6, + "text-allow-overlap": false + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#E53E3E", + "light_rail", + "#63B3ED", + "tram", + "#B794F4", + "#A0AEC0" + ], + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "river", + "canal" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "has", + "name" + ] + ], + "minzoom": 12, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "symbol-placement": "line", + "text-letter-spacing": 0.1 + }, + "paint": { + "text-color": "#4FD1C5", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "building-number-polygon", + "type": "symbol", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 17, + "filter": [ + "has", + "addr:housenumber" + ], + "layout": { + "text-field": "{addr:housenumber}", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#CBD5E0", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "building-number-point", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 17, + "filter": [ + "has", + "addr:housenumber" + ], + "layout": { + "text-field": "{addr:housenumber}", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#5A5048", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "overture-building-names", + "type": "symbol", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 17, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-anchor": "center", + "text-allow-overlap": false, + "text-max-width": 8 + }, + "paint": { + "text-color": "#5A5048", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "road-labels-minor", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street" + ], + "minzoom": 16, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 10, + 18, + 13 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 25, + "symbol-spacing": 300, + "text-letter-spacing": 0.04, + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#CBD5E0", + "text-halo-color": "#101014", + "text-halo-width": 1.8 + } + }, + { + "id": "road-labels-major", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "secondary", + "tertiary", + "motorway", + "trunk" + ], + "minzoom": 12, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 10, + 14, + 13, + 18, + 16 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 22, + "symbol-spacing": 350, + "text-letter-spacing": 0.05, + "text-padding": 12, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#E2E8F0", + "text-halo-color": "#101014", + "text-halo-width": 2.5 + } + }, + { + "id": "overture-street-names", + "type": "symbol", + "source": "overture_segments", + "source-layer": "overture_segment", + "minzoom": 14, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 9, + 16, + 12, + 18, + 14 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 28, + "symbol-spacing": 280, + "text-letter-spacing": 0.04, + "text-padding": 15, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#A0AEC0", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "poi-hospital", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 13, + "filter": [ + "==", + "amenity", + "hospital" + ], + "layout": { + "icon-image": "hospital_11", + "icon-size": 1.0, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#FC8181", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "poi-doctor-clinic", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "clinic", + "doctors", + "dentist" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "dentist", + "dentist_11", + "doctor_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#C0392B", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-pharmacy", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "pharmacy" + ], + "layout": { + "icon-image": "pharmacy_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#68D391", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "poi-place-of-worship", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "place_of_worship" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "religion" + ], + "muslim", + "religious_muslim_11", + "christian", + "religious_christian_11", + "jewish", + "religious_jewish_11", + "place_of_worship_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#48BB78", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "poi-school", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "amenity", + "school", + "university", + "college" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "school", + "school_11", + "college_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#D6BCFA", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "poi-restaurant", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "restaurant", + "fast_food" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "fast_food", + "fast_food_11", + "restaurant_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#F6AD55", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-cafe", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "cafe" + ], + "layout": { + "icon-image": "cafe_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#F6AD55", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-bakery", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "in", + "shop", + "bakery", + "pastry" + ], + "layout": { + "icon-image": "bakery_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#B794F4", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-shopping", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "any", + [ + "in", + "shop", + "mall", + "department_store", + "supermarket", + "clothes", + "shoes", + "jewelry", + "electronics", + "mobile_phone", + "furniture", + "convenience", + "general", + "variety_store" + ], + [ + "in", + "amenity", + "marketplace" + ] + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "shop" + ], + "clothes", + "clothing_store_11", + "shoes", + "clothing_store_11", + "supermarket", + "grocery_11", + "convenience", + "grocery_11", + "shop_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#B794F4", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-fuel", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "fuel" + ], + "layout": { + "icon-image": "fuel_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4FD1C5", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-bank", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "bank", + "atm" + ], + "layout": { + "icon-image": "bank_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#63B3ED", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-police", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "police" + ], + "layout": { + "icon-image": "police_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4299E1", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-fire-station", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "fire_station" + ], + "layout": { + "icon-image": "fire_station_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#F56565", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-hotel", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "tourism", + "hotel", + "motel", + "hostel", + "guest_house" + ], + "layout": { + "icon-image": "lodging_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#ED8936", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-parking", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "==", + "amenity", + "parking" + ], + "layout": { + "icon-image": "car_11", + "icon-size": 0.7, + "text-field": "", + "text-optional": true + }, + "paint": { + "icon-opacity": 0.7 + } + }, + { + "id": "poi-toilets", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "==", + "amenity", + "toilets" + ], + "layout": { + "icon-image": "toilet_11", + "icon-size": 0.7, + "text-field": "", + "text-optional": true + }, + "paint": { + "icon-opacity": 0.7 + } + }, + { + "id": "poi-post-office", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "post_office" + ], + "layout": { + "icon-image": "post_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-library", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "library" + ], + "layout": { + "icon-image": "library_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-cinema", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "cinema", + "theatre" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "theatre", + "theatre_11", + "cinema_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#B794F4", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-museum", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "tourism", + "museum", + "gallery" + ], + "layout": { + "icon-image": "museum_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#F6AD55", + "text-halo-color": "#101014", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-transit-station", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 12, + "filter": [ + "any", + [ + "==", + "railway", + "station" + ], + [ + "==", + "railway", + "halt" + ], + [ + "==", + "railway", + "tram_stop" + ], + [ + "==", + "station", + "subway" + ], + [ + "==", + "amenity", + "bus_station" + ] + ], + "layout": { + "icon-image": "railway_11", + "icon-size": 1, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.4 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#FC8181", + "text-halo-color": "#101014", + "text-halo-width": 2 + } + }, + { + "id": "place-labels-area", + "type": "symbol", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 10, + "filter": [ + "has", + "name" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 10, + 14, + 13 + ], + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#34495E", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "place-labels-point", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 10, + "filter": [ + "any", + [ + "in", + "place", + "city", + "town", + "village", + "suburb", + "neighbourhood", + "hamlet", + "locality", + "quarter" + ], + [ + "in", + "natural", + "peak", + "spring" + ] + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + [ + "match", + [ + "get", + "place" + ], + "city", + 16, + "town", + 14, + 11 + ], + 14, + [ + "match", + [ + "get", + "place" + ], + "city", + 20, + "town", + 16, + 13 + ], + 17, + 14 + ], + "text-letter-spacing": [ + "match", + [ + "get", + "place" + ], + "city", + 0.08, + "town", + 0.05, + 0.02 + ], + "text-anchor": "center", + "text-padding": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "place" + ], + "city", + "#1A2740", + "town", + "#2C3E50", + "suburb", + "#34495E", + "neighbourhood", + "#34495E", + "#34495E" + ], + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": [ + "match", + [ + "get", + "place" + ], + "city", + 3, + "town", + 2.5, + 2 + ] + } + }, + { + "id": "places-egypt-labels", + "type": "symbol", + "source": "places_egypt", + "source-layer": "places_egypt", + "minzoom": 12, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "places-syria-labels", + "type": "symbol", + "source": "places_syria", + "source-layer": "places_syria", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "places-jordan-labels", + "type": "symbol", + "source": "places_jordan", + "source-layer": "places_jordan", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + } + ] +} \ No newline at end of file diff --git a/style.json b/style.json index 880fe53..3dc0c91 100644 --- a/style.json +++ b/style.json @@ -1,10 +1,10 @@ { "version": 8, - "name": "Intaleq Premium Map Style", + "name": "Intaleq Premium β€” Light v2.9", "metadata": { "brand": "Intaleq", - "version": "2.0.0", - "description": "Google + OSM hybrid style with 3D buildings, railways, subway, waterways, and Intaleq brand palette" + "version": "2.10.0-light", + "description": "Intaleq light theme β€” buildings at close zoom only, on-road labels, improved arrows" }, "center": [ 36.276008, @@ -42,6 +42,34 @@ "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" ], "maxzoom": 14 + }, + "places_syria": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_jordan": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_buildings": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_segments": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" + ], + "maxzoom": 14 } }, "layers": [ @@ -64,7 +92,7 @@ ], "paint": { "fill-color": "#F0F4F8", - "fill-opacity": 1 + "fill-opacity": 1.0 } }, { @@ -79,7 +107,37 @@ ], "paint": { "fill-color": "#FAF5EE", - "fill-opacity": 1 + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-cemetery", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "cemetery" + ], + "paint": { + "fill-color": "#B8D4BA", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-military", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "military" + ], + "paint": { + "fill-color": "#E2D9CC", + "fill-opacity": 1.0 } }, { @@ -98,36 +156,6 @@ "fill-opacity": 1 } }, - { - "id": "landuse-cemetery", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "cemetery" - ], - "paint": { - "fill-color": "#B8D4BA", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-military", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "military" - ], - "paint": { - "fill-color": "#E2D9CC", - "fill-opacity": 0.8 - } - }, { "id": "park-layer", "type": "fill", @@ -188,9 +216,9 @@ "nature_reserve" ], "paint": { - "line-color": "#94D4A0", + "line-color": "#9ED4A0", "line-width": 0.8, - "line-opacity": 0.7 + "line-opacity": 0.6 } }, { @@ -580,7 +608,7 @@ ], "minzoom": 14, "paint": { - "line-color": "#C8CDD6", + "line-color": "#D4D8DF", "line-width": [ "interpolate", [ @@ -835,7 +863,7 @@ } }, { - "id": "road-casing-motorway-trunk", + "id": "road-casing-motorway", "type": "line", "source": "local-osm-lines", "source-layer": "planet_osm_line", @@ -866,7 +894,7 @@ } }, { - "id": "road-core-motorway-trunk", + "id": "road-core-motorway", "type": "line", "source": "local-osm-lines", "source-layer": "planet_osm_line", @@ -895,6 +923,68 @@ ] } }, + { + "id": "road-direction-arrows", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "minzoom": 15, + "filter": [ + "all", + [ + "in", + "highway", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "residential", + "unclassified", + "living_street" + ], + [ + "==", + "oneway", + "yes" + ] + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 120, + "text-field": "β†’", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 16, + 17, + 22, + 19, + 28 + ], + "text-keep-upright": false, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-allow-overlap": true, + "text-ignore-placement": true, + "text-padding": 0, + "text-letter-spacing": -0.1 + }, + "paint": { + "text-color": "rgba(80,96,120,0.55)", + "text-halo-color": "rgba(255,255,255,0.25)", + "text-halo-width": 1 + } + }, { "id": "building-fill-flat", "type": "fill", @@ -904,7 +994,8 @@ "has", "building" ], - "maxzoom": 14, + "minzoom": 15, + "maxzoom": 16, "paint": { "fill-color": "#DDD8D0", "fill-opacity": 0.85, @@ -916,39 +1007,77 @@ "type": "fill-extrusion", "source": "local-osm-polygons", "source-layer": "planet_osm_polygon", - "minzoom": 14, + "minzoom": 16, "filter": [ "has", "building" ], + "paint": { + "fill-extrusion-color": "#DDD8D0", + "fill-extrusion-height": [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "to-number", + [ + "get", + "building:levels" + ], + 2 + ], + 3.5 + ], + 7 + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": 0.8, + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "building-3d-overture", + "type": "fill-extrusion", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 16, "paint": { "fill-extrusion-color": [ "match", [ "get", - "building" + "subtype" ], "commercial", - "#DDD5C5", + "#D8D0C0", "retail", - "#E5D8C8", + "#E0D0B8", "industrial", - "#D2D8E0", - "church", - "#DDD4EE", - "mosque", - "#CCE4D0", - "hospital", - "#EDD8D8", - "school", - "#E0E6CC", - "university", - "#D8E0C8", - "hotel", - "#D8DCF0", - "apartments", - "#E0DCD4", - "#DDD8D2" + "#C8D0DC", + "religious", + "#C8D4EC", + "education", + "#D4E0C4", + "medical", + "#E8D4D4", + "#DDD8D0" ], "fill-extrusion-height": [ "interpolate", @@ -958,24 +1087,7 @@ [ "zoom" ], - 14, - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "building:levels" - ], - null - ], - 3 - ], - 2.5 - ], - 17, + 16, [ "coalesce", [ @@ -983,16 +1095,45 @@ [ "get", "height" - ], - null + ] ], [ "*", [ - "to-number", + "coalesce", [ - "get", - "building:levels" + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 9 + ], + 18, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] ], 3 ], @@ -1008,8 +1149,7 @@ [ "get", "min_height" - ], - null + ] ], 0 ], @@ -1021,14 +1161,29 @@ [ "zoom" ], - 14, - 0.6, + 15, + 0, 16, + 0.6, + 17, 0.88 ], "fill-extrusion-vertical-gradient": true } }, + { + "id": "overture-building-footprint", + "type": "fill", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#DDD8D0", + "fill-opacity": 0.82, + "fill-outline-color": "#C4BEB4" + } + }, { "id": "railway-label", "type": "symbol", @@ -1079,7 +1234,7 @@ "#7722AA", "#4A5568" ], - "text-halo-color": "rgba(255,255,255,0.9)", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, @@ -1129,7 +1284,7 @@ }, "paint": { "text-color": "#2E86AB", - "text-halo-color": "rgba(255,255,255,0.85)", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, @@ -1149,12 +1304,11 @@ "Noto Sans Regular" ], "text-size": 10, - "text-allow-overlap": false, - "text-ignore-placement": false + "text-allow-overlap": false }, "paint": { "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.95)", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 1.5 } }, @@ -1178,7 +1332,40 @@ }, "paint": { "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.95)", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "overture-building-names", + "type": "symbol", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 17, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-anchor": "center", + "text-allow-overlap": false, + "text-max-width": 8 + }, + "paint": { + "text-color": "#5A5048", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 1.5 } }, @@ -1212,16 +1399,33 @@ "text-font": [ "Noto Sans Regular" ], - "text-size": 11, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 10, + 18, + 13 + ], "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 25, + "symbol-spacing": 300, "text-letter-spacing": 0.04, - "text-padding": 4, + "text-padding": 8, "text-allow-overlap": false }, "paint": { "text-color": "#4A5568", - "text-halo-color": "rgba(255,255,255,0.85)", - "text-halo-width": 1.5 + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.8 } }, { @@ -1238,7 +1442,7 @@ "motorway", "trunk" ], - "minzoom": 13, + "minzoom": 12, "layout": { "text-field": [ "coalesce", @@ -1252,6 +1456,59 @@ ], "" ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 10, + 14, + 13, + 18, + 16 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 22, + "symbol-spacing": 350, + "text-letter-spacing": 0.05, + "text-padding": 12, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#1A2332", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2.5 + } + }, + { + "id": "overture-street-names", + "type": "symbol", + "source": "overture_segments", + "source-layer": "overture_segment", + "minzoom": 14, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], "text-font": [ "Noto Sans Regular" ], @@ -1263,19 +1520,26 @@ [ "zoom" ], - 13, - 11, + 14, + 9, 16, + 12, + 18, 14 ], "symbol-placement": "line", - "text-letter-spacing": 0.05, - "text-padding": 5, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 28, + "symbol-spacing": 280, + "text-letter-spacing": 0.04, + "text-padding": 15, "text-allow-overlap": false }, "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.9)", + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, @@ -1291,8 +1555,8 @@ "hospital" ], "layout": { - "icon-image": "hospital", - "icon-size": 1, + "icon-image": "hospital_11", + "icon-size": 1.0, "text-field": [ "coalesce", [ @@ -1318,23 +1582,34 @@ }, "paint": { "text-color": "#C0392B", - "text-halo-color": "white", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, { - "id": "poi-pharmacy", + "id": "poi-doctor-clinic", "type": "symbol", "source": "local-osm-points", "source-layer": "planet_osm_point", "minzoom": 15, "filter": [ - "==", + "in", "amenity", - "pharmacy" + "clinic", + "doctors", + "dentist" ], "layout": { - "icon-image": "pharmacy", + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "dentist", + "dentist_11", + "doctor_11" + ], "icon-size": 0.8, "text-field": [ "coalesce", @@ -1356,27 +1631,28 @@ 0, 1.2 ], - "text-anchor": "top" + "text-anchor": "top", + "text-allow-overlap": false }, "paint": { - "text-color": "#1A7A3C", - "text-halo-color": "white", + "text-color": "#C0392B", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 1.5 } }, { - "id": "poi-place-of-worship", + "id": "poi-pharmacy", "type": "symbol", "source": "local-osm-points", "source-layer": "planet_osm_point", - "minzoom": 14, + "minzoom": 15, "filter": [ "==", "amenity", - "place_of_worship" + "pharmacy" ], "layout": { - "icon-image": "tourist", + "icon-image": "pharmacy_11", "icon-size": 0.8, "text-field": [ "coalesce", @@ -1398,37 +1674,40 @@ 0, 1.2 ], - "text-anchor": "top" + "text-anchor": "top", + "text-allow-overlap": false }, "paint": { - "text-color": "#1A6B3A", - "text-halo-color": "white", + "text-color": "#1A7A3C", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, { - "id": "poi-restaurant-cafe", + "id": "poi-place-of-worship", "type": "symbol", "source": "local-osm-points", "source-layer": "planet_osm_point", - "minzoom": 16, + "minzoom": 14, "filter": [ - "in", + "==", "amenity", - "restaurant", - "cafe", - "fast_food" + "place_of_worship" ], "layout": { "icon-image": [ "match", [ "get", - "amenity" + "religion" ], - "cafe", - "cafe", - "restaurant" + "muslim", + "religious_muslim_11", + "christian", + "religious_christian_11", + "jewish", + "religious_jewish_11", + "place_of_worship_11" ], "icon-size": 0.8, "text-field": [ @@ -1446,17 +1725,18 @@ "text-font": [ "Noto Sans Regular" ], - "text-size": 10, + "text-size": 11, "text-offset": [ 0, 1.2 ], - "text-anchor": "top" + "text-anchor": "top", + "text-allow-overlap": false }, "paint": { - "text-color": "#3D4A5C", - "text-halo-color": "white", - "text-halo-width": 1.5 + "text-color": "#1A6B3A", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 } }, { @@ -1473,7 +1753,16 @@ "college" ], "layout": { - "icon-image": "college", + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "school", + "school_11", + "college_11" + ], "icon-size": 0.8, "text-field": [ "coalesce", @@ -1495,14 +1784,676 @@ 0, 1.2 ], - "text-anchor": "top" + "text-anchor": "top", + "text-allow-overlap": false }, "paint": { "text-color": "#5A4A8A", - "text-halo-color": "white", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, + { + "id": "poi-restaurant", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "restaurant", + "fast_food" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "fast_food", + "fast_food_11", + "restaurant_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#B8530A", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-cafe", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "cafe" + ], + "layout": { + "icon-image": "cafe_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#7B4F2A", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-bakery", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "in", + "shop", + "bakery", + "pastry" + ], + "layout": { + "icon-image": "bakery_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#8B6B3D", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-shopping", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "any", + [ + "in", + "shop", + "mall", + "department_store", + "supermarket", + "clothes", + "shoes", + "jewelry", + "electronics", + "mobile_phone", + "furniture", + "convenience", + "general", + "variety_store" + ], + [ + "in", + "amenity", + "marketplace" + ] + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "shop" + ], + "clothes", + "clothing_store_11", + "shoes", + "clothing_store_11", + "supermarket", + "grocery_11", + "convenience", + "grocery_11", + "shop_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#6A3D9A", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-fuel", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "fuel" + ], + "layout": { + "icon-image": "fuel_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D6A4F", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-bank", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "bank", + "atm" + ], + "layout": { + "icon-image": "bank_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2C5282", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-police", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "police" + ], + "layout": { + "icon-image": "police_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2B6CB0", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-fire-station", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "fire_station" + ], + "layout": { + "icon-image": "fire_station_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#E53E3E", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-hotel", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "tourism", + "hotel", + "motel", + "hostel", + "guest_house" + ], + "layout": { + "icon-image": "lodging_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#744210", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-parking", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "==", + "amenity", + "parking" + ], + "layout": { + "icon-image": "car_11", + "icon-size": 0.7, + "text-field": "", + "text-optional": true + }, + "paint": { + "icon-opacity": 0.7 + } + }, + { + "id": "poi-toilets", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "==", + "amenity", + "toilets" + ], + "layout": { + "icon-image": "toilet_11", + "icon-size": 0.7, + "text-field": "", + "text-optional": true + }, + "paint": { + "icon-opacity": 0.7 + } + }, + { + "id": "poi-post-office", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "post_office" + ], + "layout": { + "icon-image": "post_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-library", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "library" + ], + "layout": { + "icon-image": "library_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-cinema", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "in", + "amenity", + "cinema", + "theatre" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "theatre", + "theatre_11", + "cinema_11" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#805AD5", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-museum", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "tourism", + "museum", + "gallery" + ], + "layout": { + "icon-image": "museum_11", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#6B4C3B", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, { "id": "poi-transit-station", "type": "symbol", @@ -1538,7 +2489,7 @@ ] ], "layout": { - "icon-image": "rail", + "icon-image": "railway_11", "icon-size": 1, "text-field": [ "coalesce", @@ -1565,7 +2516,7 @@ }, "paint": { "text-color": "#CC2233", - "text-halo-color": "rgba(255,255,255,0.95)", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, @@ -1609,12 +2560,11 @@ 13 ], "text-padding": 8, - "text-allow-overlap": false, - "text-ignore-placement": false + "text-allow-overlap": false }, "paint": { "text-color": "#34495E", - "text-halo-color": "rgba(255,255,255,0.85)", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } }, @@ -1725,15 +2675,13 @@ "#1A2740", "town", "#2C3E50", - "village", - "#3D4F62", "suburb", - "#4A5568", + "#34495E", "neighbourhood", - "#556677", - "#607080" + "#34495E", + "#34495E" ], - "text-halo-color": "rgba(255,255,255,0.92)", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": [ "match", [ @@ -1754,6 +2702,11 @@ "source": "places_egypt", "source-layer": "places_egypt", "minzoom": 12, + "filter": [ + "!in", + "category", + "street" + ], "layout": { "text-field": [ "coalesce", @@ -1793,7 +2746,115 @@ }, "paint": { "text-color": "#2D3748", - "text-halo-color": "rgba(255, 255, 255, 0.9)", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "places-syria-labels", + "type": "symbol", + "source": "places_syria", + "source-layer": "places_syria", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "places-jordan-labels", + "type": "symbol", + "source": "places_jordan", + "source-layer": "places_jordan", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", "text-halo-width": 2 } } diff --git a/sync_to_server.sh b/sync_to_server.sh index 884eba1..e5900e0 100755 --- a/sync_to_server.sh +++ b/sync_to_server.sh @@ -29,6 +29,8 @@ rsync -avz --progress -e "ssh -o StrictHostKeyChecking=no" $KEY_FLAG \ docker-compose.yml \ docker-compose.map2.yml \ setup_map2.sh \ + style.json \ + style-dark.json \ apps \ packages \ infrastructure \