web-mojo 2.4.7 → 2.4.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/admin-models.cjs.js +1 -1
- package/dist/admin-models.cjs.js.map +1 -1
- package/dist/admin-models.es.js +1 -1
- package/dist/admin-models.es.js.map +1 -1
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +1 -1
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.es.js +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +1 -1
- package/dist/chunks/{ChatView-D2WOSxPu.js → ChatView-C_2dRLAY.js} +2 -2
- package/dist/chunks/{ChatView-D2WOSxPu.js.map → ChatView-C_2dRLAY.js.map} +1 -1
- package/dist/chunks/{ChatView-kWguc444.js → ChatView-DVb2Ufq_.js} +2 -2
- package/dist/chunks/{ChatView-kWguc444.js.map → ChatView-DVb2Ufq_.js.map} +1 -1
- package/dist/chunks/{Collection-DNmr743A.js → Collection-Bq_EMAqK.js} +2 -2
- package/dist/chunks/{Collection-DNmr743A.js.map → Collection-Bq_EMAqK.js.map} +1 -1
- package/dist/chunks/{Collection-C0pHSKDH.js → Collection-tgvDhyz_.js} +2 -2
- package/dist/chunks/{Collection-C0pHSKDH.js.map → Collection-tgvDhyz_.js.map} +1 -1
- package/dist/chunks/{ContextMenu-T3yDdsIe.js → ContextMenu-BL_sdgIw.js} +2 -2
- package/dist/chunks/{ContextMenu-T3yDdsIe.js.map → ContextMenu-BL_sdgIw.js.map} +1 -1
- package/dist/chunks/{ContextMenu-BeveGkJr.js → ContextMenu-fIy3upEy.js} +2 -2
- package/dist/chunks/{ContextMenu-BeveGkJr.js.map → ContextMenu-fIy3upEy.js.map} +1 -1
- package/dist/chunks/{DataView-VZIXSsZa.js → DataView-DRQ2yFRz.js} +2 -2
- package/dist/chunks/{DataView-VZIXSsZa.js.map → DataView-DRQ2yFRz.js.map} +1 -1
- package/dist/chunks/{DataView-z2rxXk4L.js → DataView-DW_ufpQo.js} +2 -2
- package/dist/chunks/{DataView-z2rxXk4L.js.map → DataView-DW_ufpQo.js.map} +1 -1
- package/dist/chunks/{FormView-COIPtbrd.js → FormView-eWUWw8oL.js} +2 -2
- package/dist/chunks/{FormView-COIPtbrd.js.map → FormView-eWUWw8oL.js.map} +1 -1
- package/dist/chunks/{FormView-DUXQruUZ.js → FormView-xl_w506t.js} +2 -2
- package/dist/chunks/{FormView-DUXQruUZ.js.map → FormView-xl_w506t.js.map} +1 -1
- package/dist/chunks/{ListView-BjsNHuZ1.js → ListView-Bj4ONQFG.js} +2 -2
- package/dist/chunks/{ListView-BjsNHuZ1.js.map → ListView-Bj4ONQFG.js.map} +1 -1
- package/dist/chunks/{ListView-BxcxIwC3.js → ListView-jyIVhCN3.js} +2 -2
- package/dist/chunks/{ListView-BxcxIwC3.js.map → ListView-jyIVhCN3.js.map} +1 -1
- package/dist/chunks/MetricsCountryMapView-D_666qlW.js +2 -0
- package/dist/chunks/MetricsCountryMapView-D_666qlW.js.map +1 -0
- package/dist/chunks/MetricsCountryMapView-U3xr0QXD.js +2 -0
- package/dist/chunks/MetricsCountryMapView-U3xr0QXD.js.map +1 -0
- package/dist/chunks/Modal-CCVJefEX.js +3 -0
- package/dist/chunks/{Modal-Bm1OQ8Ou.js.map → Modal-CCVJefEX.js.map} +1 -1
- package/dist/chunks/Modal-Uwt-GBgJ.js +3 -0
- package/dist/chunks/{Modal-KnJhNZ1E.js.map → Modal-Uwt-GBgJ.js.map} +1 -1
- package/dist/chunks/Passkeys-DScGUF6p.js +2 -0
- package/dist/chunks/{Passkeys-BlHx11-5.js.map → Passkeys-DScGUF6p.js.map} +1 -1
- package/dist/chunks/{Passkeys-B1-Z4-16.js → Passkeys-c4amXO03.js} +2 -2
- package/dist/chunks/{Passkeys-B1-Z4-16.js.map → Passkeys-c4amXO03.js.map} +1 -1
- package/dist/chunks/{TokenManager-CiNtJclo.js → TokenManager-BRx2U5w4.js} +2 -2
- package/dist/chunks/{TokenManager-CiNtJclo.js.map → TokenManager-BRx2U5w4.js.map} +1 -1
- package/dist/chunks/{TokenManager-6atX9uKB.js → TokenManager-DZP2Lcnz.js} +2 -2
- package/dist/chunks/{TokenManager-6atX9uKB.js.map → TokenManager-DZP2Lcnz.js.map} +1 -1
- package/dist/chunks/{User-9qvKV7G6.js → User-DR-2VJcv.js} +2 -2
- package/dist/chunks/{User-9qvKV7G6.js.map → User-DR-2VJcv.js.map} +1 -1
- package/dist/chunks/{User-BM76Ughk.js → User-e9aOjdHv.js} +2 -2
- package/dist/chunks/{User-BM76Ughk.js.map → User-e9aOjdHv.js.map} +1 -1
- package/dist/chunks/{UserProfileView-DDflzpTa.js → UserProfileView-CCNcNT-M.js} +2 -2
- package/dist/chunks/{UserProfileView-DDflzpTa.js.map → UserProfileView-CCNcNT-M.js.map} +1 -1
- package/dist/chunks/{UserProfileView-cUF8ED9n.js → UserProfileView-PmerV2tC.js} +2 -2
- package/dist/chunks/{UserProfileView-cUF8ED9n.js.map → UserProfileView-PmerV2tC.js.map} +1 -1
- package/dist/chunks/{View-CPWwS19u.js → View-CLWMWXbO.js} +2 -2
- package/dist/chunks/{View-CPWwS19u.js.map → View-CLWMWXbO.js.map} +1 -1
- package/dist/chunks/{View-BxlKR1IW.js → View-DADtcBcb.js} +2 -2
- package/dist/chunks/{View-BxlKR1IW.js.map → View-DADtcBcb.js.map} +1 -1
- package/dist/chunks/{WebApp-BdxhRnnT.js → WebApp-BBrvjnnH.js} +2 -2
- package/dist/chunks/{WebApp-BdxhRnnT.js.map → WebApp-BBrvjnnH.js.map} +1 -1
- package/dist/chunks/{WebApp-Bo_egO0c.js → WebApp-wMWf0qkm.js} +2 -2
- package/dist/chunks/{WebApp-Bo_egO0c.js.map → WebApp-wMWf0qkm.js.map} +1 -1
- package/dist/chunks/exportChart-DVnTgKP0.js +2 -0
- package/dist/chunks/exportChart-DVnTgKP0.js.map +1 -0
- package/dist/chunks/exportChart-DYWi1WFJ.js +2 -0
- package/dist/chunks/exportChart-DYWi1WFJ.js.map +1 -0
- package/dist/chunks/{index-DsID1QpB.js → index-B312g4f-.js} +2 -2
- package/dist/chunks/{index-DsID1QpB.js.map → index-B312g4f-.js.map} +1 -1
- package/dist/chunks/{index-Cxffar1o.js → index-D7ITRVln.js} +2 -2
- package/dist/chunks/{index-Cxffar1o.js.map → index-D7ITRVln.js.map} +1 -1
- package/dist/chunks/version-B1_7ymBC.js +2 -0
- package/dist/chunks/version-B1_7ymBC.js.map +1 -0
- package/dist/chunks/version-CQGpN0qh.js +2 -0
- package/dist/chunks/version-CQGpN0qh.js.map +1 -0
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +1 -1
- package/dist/map.cjs.js +1 -1
- package/dist/map.es.js +1 -1
- package/dist/timeline.cjs.js +1 -1
- package/dist/timeline.es.js +1 -1
- package/dist/user-profile.cjs.js +1 -1
- package/dist/user-profile.es.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/AssistantPanelView-DmlaVMvK.js +0 -2
- package/dist/chunks/AssistantPanelView-DmlaVMvK.js.map +0 -1
- package/dist/chunks/AssistantPanelView-rkVX6wky.js +0 -2
- package/dist/chunks/AssistantPanelView-rkVX6wky.js.map +0 -1
- package/dist/chunks/MetricsCountryMapView-Bp3qoVHp.js +0 -2
- package/dist/chunks/MetricsCountryMapView-Bp3qoVHp.js.map +0 -1
- package/dist/chunks/MetricsCountryMapView-CWjIEBJB.js +0 -2
- package/dist/chunks/MetricsCountryMapView-CWjIEBJB.js.map +0 -1
- package/dist/chunks/Modal-Bm1OQ8Ou.js +0 -3
- package/dist/chunks/Modal-KnJhNZ1E.js +0 -3
- package/dist/chunks/Passkeys-BlHx11-5.js +0 -2
- package/dist/chunks/TicketPanelView-BGQZ6q2B.js +0 -2
- package/dist/chunks/TicketPanelView-BGQZ6q2B.js.map +0 -1
- package/dist/chunks/TicketPanelView-BZ8e66o1.js +0 -2
- package/dist/chunks/TicketPanelView-BZ8e66o1.js.map +0 -1
- package/dist/chunks/admin-CmyeTstQ.js +0 -2
- package/dist/chunks/admin-CmyeTstQ.js.map +0 -1
- package/dist/chunks/admin-D6gHOojO.js +0 -2
- package/dist/chunks/admin-D6gHOojO.js.map +0 -1
- package/dist/chunks/admin-models-CkHjtMHf.js +0 -2
- package/dist/chunks/admin-models-CkHjtMHf.js.map +0 -1
- package/dist/chunks/admin-models-DLtFboxy.js +0 -2
- package/dist/chunks/admin-models-DLtFboxy.js.map +0 -1
- package/dist/chunks/exportChart-BTrEOM9j.js +0 -2
- package/dist/chunks/exportChart-BTrEOM9j.js.map +0 -1
- package/dist/chunks/exportChart-BfzZUb1j.js +0 -2
- package/dist/chunks/exportChart-BfzZUb1j.js.map +0 -1
- package/dist/chunks/version-DdqQDDOW.js +0 -2
- package/dist/chunks/version-DdqQDDOW.js.map +0 -1
- package/dist/chunks/version-NEBZhkhG.js +0 -2
- package/dist/chunks/version-NEBZhkhG.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantPanelView-rkVX6wky.js","sources":["../../src/extensions/admin/assistant/AssistantPanelView.js"],"sourcesContent":["import View from '@core/View.js';\nimport ChatView from '@core/views/chat/ChatView.js';\nimport { AssistantConversation, AssistantConversationList } from '@ext/admin/models/Assistant.js';\nimport AssistantMessageView from './AssistantMessageView.js';\nimport AssistantConversationListView from './AssistantConversationListView.js';\nimport AssistantView from './AssistantView.js';\n\n/**\n * AssistantPanelView - Chat-only sidebar panel for the admin assistant\n *\n * Compact layout for the right sidebar panel. No conversation list by default —\n * a hamburger toggle switches between chat and conversation history.\n *\n * Emits:\n * panel:close — when the close button is clicked\n */\nclass AssistantPanelView extends View {\n constructor(options = {}) {\n super({\n className: 'assistant-panel-view',\n ...options\n });\n\n this.app = options.app;\n this.ws = this.app?.ws;\n this.conversationId = options.conversationId || this.app?._assistantConversationId || null;\n this._wsHandlers = {};\n this._messageIdCounter = 0;\n this._hasMessages = false;\n this._activePlans = {};\n this._requestStartTime = null;\n this._showingHistory = false;\n }\n\n getTemplate() {\n const userName = this._escapeHtml(\n this.app?.activeUser?.get('first_name') || 'there'\n );\n\n return `\n <div class=\"assistant-panel-resize-handle\" data-ref=\"resize-handle\"></div>\n <div class=\"assistant-panel-layout\">\n <div class=\"assistant-panel-header\">\n <button class=\"assistant-panel-header-btn\" data-action=\"toggle-history\" type=\"button\" title=\"Conversation history\">\n <i class=\"bi bi-list\"></i>\n </button>\n <span class=\"assistant-panel-title text-truncate\" data-ref=\"panel-title\">New conversation</span>\n <div class=\"d-flex gap-1 ms-auto\">\n <button class=\"assistant-panel-header-btn\" data-action=\"new-conversation\" type=\"button\" title=\"New conversation\">\n <i class=\"bi bi-plus-lg\"></i>\n </button>\n <button class=\"assistant-panel-header-btn\" data-action=\"fullscreen\" type=\"button\" title=\"Open fullscreen\">\n <i class=\"bi bi-arrows-fullscreen\"></i>\n </button>\n <button class=\"assistant-panel-header-btn\" data-action=\"pop-out\" type=\"button\" title=\"Open in popup window\">\n <i class=\"bi bi-box-arrow-up-right\"></i>\n </button>\n <button class=\"assistant-panel-header-btn\" data-action=\"close-panel\" type=\"button\" title=\"Close\">\n <i class=\"bi bi-x-lg\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"assistant-panel-history d-none\" data-ref=\"history\" data-container=\"conversation-list\"></div>\n\n <div class=\"assistant-panel-chat\" data-ref=\"chat-wrapper\">\n <div class=\"assistant-welcome\" data-ref=\"welcome\">\n <div class=\"assistant-welcome-content\">\n <div class=\"assistant-welcome-icon\">\n <img src=\"https://mojo-verify.s3.amazonaws.com/signatures/14e7aab75c2749cb846f7d57298691ac/mojo_ai_7c0322e9.png\" alt=\"Mojo\">\n </div>\n <h3 class=\"assistant-welcome-title\">Hi ${userName}</h3>\n <p class=\"assistant-welcome-subtitle\">How can I help you today?</p>\n <div class=\"assistant-suggestions\">\n <button class=\"assistant-suggestion\" data-action=\"use-suggestion\" data-text=\"Show me a summary of recent activity\">\n <i class=\"bi bi-activity\"></i>\n <span>Recent activity summary</span>\n </button>\n <button class=\"assistant-suggestion\" data-action=\"use-suggestion\" data-text=\"How many active users are there?\">\n <i class=\"bi bi-people\"></i>\n <span>Active user count</span>\n </button>\n </div>\n </div>\n </div>\n <div class=\"assistant-chat-area\" data-container=\"chat-area\"></div>\n <div class=\"assistant-input-wrapper\">\n <div class=\"assistant-input-status d-none\" data-ref=\"input-status\"></div>\n <div class=\"assistant-input-box\">\n <textarea class=\"assistant-input\" placeholder=\"Message Mojo...\" rows=\"1\" data-ref=\"input\"></textarea>\n <button class=\"assistant-send-btn\" data-action=\"send\" type=\"button\" title=\"Send message\" data-ref=\"send-btn\">\n <i class=\"bi bi-arrow-up\"></i>\n </button>\n <button class=\"assistant-stop-btn d-none\" data-action=\"stop\" type=\"button\" title=\"Stop generating\" data-ref=\"stop-btn\">\n <i class=\"bi bi-stop-fill\"></i>\n </button>\n </div>\n <div class=\"assistant-input-footer\">\n <span class=\"assistant-connection-indicator\" data-ref=\"status\">\n <span class=\"status-dot connected\"></span>\n </span>\n <span class=\"text-muted\">Enter to send</span>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n async onInit() {\n // Conversation list for history panel\n this.conversations = new AssistantConversationList();\n this.conversations.params.user = this.app?.activeUser?.id;\n this.conversationListView = new AssistantConversationListView({\n containerId: 'conversation-list',\n collection: this.conversations\n });\n this.addChild(this.conversationListView);\n\n // Chat view\n this.chatView = new ChatView({\n containerId: 'chat-area',\n theme: 'compact',\n messageViewClass: AssistantMessageView,\n currentUserId: this.app?.activeUser?.id,\n showFileInput: false,\n showInput: false,\n adapter: this._createAdapter()\n });\n this.addChild(this.chatView);\n\n // Safety net: re-enable input on assistant message\n const origAddMessage = this.chatView.addMessage.bind(this.chatView);\n this.chatView.addMessage = (msg, scroll) => {\n origAddMessage(msg, scroll);\n if (msg.role === 'assistant' && (msg.content || msg.blocks?.length)) {\n this.chatView.hideThinking();\n this._setInputEnabled(true);\n }\n };\n\n // Wire conversation list events\n this.conversationListView.on('conversation:select', (data) => {\n this._onConversationSelect(data);\n this._toggleHistory(false);\n });\n this.conversationListView.on('conversation:new', () => {\n this._onNewConversation();\n this._toggleHistory(false);\n });\n this.conversationListView.on('conversation:deleted', (data) => this._onConversationDeleted(data));\n\n this._subscribeWS();\n }\n\n async onAfterRender() {\n await super.onAfterRender();\n\n const textarea = this.element.querySelector('[data-ref=\"input\"]');\n if (textarea) {\n textarea.addEventListener('input', () => this._autoResize(textarea));\n textarea.addEventListener('keydown', (e) => this._handleKeydown(e));\n setTimeout(() => textarea.focus(), 100);\n }\n\n // Load existing conversation after DOM is ready\n if (this.conversationId) {\n this._showChatArea();\n await this.chatView.refresh();\n }\n\n this._updateConnectionStatus();\n this._updateTitle();\n this._setupResizeHandle();\n }\n\n // ── Resize Handle ────────────────────────────────────────\n\n _setupResizeHandle() {\n const handle = this.element?.querySelector('[data-ref=\"resize-handle\"]');\n if (!handle) return;\n\n const MIN_WIDTH = 300;\n const MAX_WIDTH = 700;\n const STORAGE_KEY = 'mojo:assistant_panel_width';\n\n // Restore saved width\n const saved = localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const w = parseInt(saved, 10);\n if (w >= MIN_WIDTH && w <= MAX_WIDTH) {\n const panelEl = document.getElementById('assistant-panel');\n if (panelEl) panelEl.style.width = w + 'px';\n }\n }\n\n let startX, startWidth;\n\n const onMouseMove = (e) => {\n const delta = startX - e.clientX;\n const newWidth = Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, startWidth + delta));\n const panelEl = document.getElementById('assistant-panel');\n if (panelEl) panelEl.style.width = newWidth + 'px';\n };\n\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n\n // Save width\n const panelEl = document.getElementById('assistant-panel');\n if (panelEl) {\n localStorage.setItem(STORAGE_KEY, parseInt(panelEl.style.width, 10));\n }\n };\n\n handle.addEventListener('mousedown', (e) => {\n e.preventDefault();\n startX = e.clientX;\n const panelEl = document.getElementById('assistant-panel');\n startWidth = panelEl ? panelEl.offsetWidth : 500;\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n }\n\n // ── Actions ──────────────────────────────────────────────\n\n onActionToggleHistory() {\n this._toggleHistory(!this._showingHistory);\n }\n\n onActionNewConversation() {\n this._onNewConversation();\n if (this._showingHistory) this._toggleHistory(false);\n }\n\n onActionClosePanel() {\n this.emit('panel:close');\n }\n\n onActionFullscreen() {\n this.emit('panel:fullscreen', { conversationId: this.conversationId });\n }\n\n onActionPopOut() {\n this.emit('panel:popout', { conversationId: this.conversationId });\n }\n\n onActionUseSuggestion(_event, element) {\n const text = element.dataset.text || element.closest('[data-text]')?.dataset.text;\n if (!text) return;\n\n const textarea = this.element.querySelector('[data-ref=\"input\"]');\n if (textarea) {\n textarea.value = text;\n this._autoResize(textarea);\n }\n this._sendMessage();\n }\n\n onActionSend() {\n this._sendMessage();\n }\n\n onActionStop() {\n this.chatView.hideThinking();\n this._setInputEnabled(true);\n this._showSystemMessage('Response cancelled.');\n const textarea = this.element?.querySelector('[data-ref=\"input\"]');\n if (textarea) textarea.focus();\n }\n\n // ── History Toggle ───────────────────────────────────────\n\n _toggleHistory(show) {\n this._showingHistory = show;\n const history = this.element?.querySelector('[data-ref=\"history\"]');\n const chat = this.element?.querySelector('[data-ref=\"chat-wrapper\"]');\n const toggleBtn = this.element?.querySelector('[data-action=\"toggle-history\"] i');\n\n if (history) history.classList.toggle('d-none', !show);\n if (chat) chat.classList.toggle('d-none', show);\n if (toggleBtn) toggleBtn.className = show ? 'bi bi-chat-dots' : 'bi bi-list';\n\n if (show) {\n this.conversationListView.refresh();\n }\n }\n\n // ── Input Handling ───────────────────────────────────────\n\n _autoResize(textarea) {\n textarea.style.height = 'auto';\n textarea.style.height = Math.min(textarea.scrollHeight, 200) + 'px';\n }\n\n _handleKeydown(e) {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this._sendMessage();\n }\n }\n\n async _sendMessage() {\n const textarea = this.element.querySelector('[data-ref=\"input\"]');\n if (!textarea) return;\n\n const text = textarea.value.trim();\n if (!text) return;\n\n textarea.value = '';\n textarea.style.height = 'auto';\n this._showChatArea();\n await this.chatView.adapter.addNote({ text, files: [] });\n }\n\n _showChatArea() {\n if (this._hasMessages) return;\n this._hasMessages = true;\n\n const welcome = this.element.querySelector('[data-ref=\"welcome\"]');\n const chatArea = this.element.querySelector('[data-container=\"chat-area\"]');\n if (welcome) welcome.classList.add('d-none');\n if (chatArea) chatArea.classList.remove('d-none');\n }\n\n _showWelcome() {\n this._hasMessages = false;\n\n const welcome = this.element.querySelector('[data-ref=\"welcome\"]');\n const chatArea = this.element.querySelector('[data-container=\"chat-area\"]');\n if (welcome) welcome.classList.remove('d-none');\n if (chatArea) chatArea.classList.add('d-none');\n }\n\n _setInputEnabled(enabled, reason) {\n const textarea = this.element?.querySelector('[data-ref=\"input\"]');\n const sendBtn = this.element?.querySelector('[data-ref=\"send-btn\"]');\n const stopBtn = this.element?.querySelector('[data-ref=\"stop-btn\"]');\n\n if (textarea) textarea.disabled = !enabled;\n if (sendBtn) sendBtn.classList.toggle('d-none', !enabled);\n if (stopBtn) stopBtn.classList.toggle('d-none', enabled);\n\n this._setInputStatus(enabled ? null : reason);\n\n if (this._responseTimeout) clearTimeout(this._responseTimeout);\n if (!enabled) {\n this._responseTimeout = setTimeout(() => this._onResponseTimeout(), 60000);\n } else {\n this._requestStartTime = null;\n }\n }\n\n _setInputStatus(message) {\n const el = this.element?.querySelector('[data-ref=\"input-status\"]');\n if (!el) return;\n if (message) {\n el.innerHTML = `${this._escapeHtml(message)} <span class=\"assistant-input-status-dismiss\">Click to dismiss</span>`;\n el.classList.remove('d-none');\n if (!el._hasDismiss) {\n el._hasDismiss = true;\n el.addEventListener('click', () => {\n this.chatView.hideThinking();\n this._setInputEnabled(true);\n const textarea = this.element?.querySelector('[data-ref=\"input\"]');\n if (textarea) textarea.focus();\n });\n }\n } else {\n el.classList.add('d-none');\n el.innerHTML = '';\n }\n }\n\n _onResponseTimeout() {\n this._responseTimeout = null;\n this.chatView.hideThinking();\n this._setInputEnabled(true);\n this._showSystemMessage('Request timed out. Please try again.');\n }\n\n // ── Title ────────────────────────────────────────────────\n\n _updateTitle(title) {\n const el = this.element?.querySelector('[data-ref=\"panel-title\"]');\n if (!el) return;\n el.textContent = title || (this.conversationId ? 'Mojo' : 'New conversation');\n }\n\n // ── Chat Adapter ─────────────────────────────────────────\n\n _createAdapter() {\n return {\n fetch: async () => {\n if (!this.conversationId) return [];\n try {\n const conversation = new AssistantConversation({ id: this.conversationId });\n await conversation.fetch({ graph: 'detail' });\n const title = conversation.get('title') || conversation.get('summary');\n if (title) this._updateTitle(title);\n const messages = conversation.get('messages') || [];\n const transformed = messages.map(msg => this._transformMessage(msg)).filter(Boolean);\n return AssistantView._collapseMessages(transformed);\n } catch (_err) {\n if (_err.status === 404) {\n this._onNewConversation();\n this._showSystemMessage('Conversation not found.');\n }\n return [];\n }\n },\n addNote: async (data) => {\n if (!data.text || !data.text.trim()) return { success: false };\n\n const userMsg = {\n id: `local-${++this._messageIdCounter}`,\n role: 'user',\n author: {\n id: this.app?.activeUser?.id,\n name: this.app?.activeUser?.get('display_name') || 'You'\n },\n content: data.text,\n timestamp: new Date().toISOString()\n };\n this.chatView.addMessage(userMsg);\n\n this.chatView.showThinking('Thinking...');\n this._requestStartTime = Date.now();\n this._setInputEnabled(false, 'Waiting for response…');\n\n if (this.ws && this.ws.isConnected) {\n this.ws.send({\n type: 'assistant_message',\n message: data.text,\n conversation_id: this.conversationId\n });\n } else {\n try {\n const resp = await this.app.rest.post('/api/assistant', {\n message: data.text,\n conversation_id: this.conversationId\n });\n const respData = resp?.data?.data || resp?.data || resp;\n if (respData.conversation_id) {\n this.conversationId = respData.conversation_id;\n this.app._assistantConversationId = this.conversationId;\n }\n if (respData.response) {\n this.chatView.addMessage(this._transformMessage(respData.response));\n }\n this._setInputEnabled(true);\n } catch (_err) {\n this._handleAPIError(_err);\n }\n }\n\n return { success: true };\n }\n };\n }\n\n // ── WebSocket Subscriptions ───────────────────────────────\n\n _subscribeWS() {\n if (!this.ws) return;\n\n this._wsHandlers = {\n thinking: (data) => this._onThinking(data),\n text: (data) => this._onText(data),\n tool_call: (data) => this._onToolCall(data),\n response: (data) => this._onResponse(data),\n error: (data) => this._onError(data),\n plan: (data) => this._onPlan(data),\n plan_update: (data) => this._onPlanUpdate(data),\n message: (envelope) => this._dispatchWSMessage(envelope),\n connected: () => this._updateConnectionStatus(),\n disconnected: () => this._updateConnectionStatus(),\n reconnecting: () => this._updateConnectionStatus()\n };\n\n this.ws.on('message:assistant_thinking', this._wsHandlers.thinking);\n this.ws.on('message:assistant_text', this._wsHandlers.text);\n this.ws.on('message:assistant_tool_call', this._wsHandlers.tool_call);\n this.ws.on('message:assistant_response', this._wsHandlers.response);\n this.ws.on('message:assistant_error', this._wsHandlers.error);\n this.ws.on('message:assistant_plan', this._wsHandlers.plan);\n this.ws.on('message:assistant_plan_update', this._wsHandlers.plan_update);\n this.ws.on('message:message', this._wsHandlers.message);\n this.ws.on('connected', this._wsHandlers.connected);\n this.ws.on('disconnected', this._wsHandlers.disconnected);\n this.ws.on('reconnecting', this._wsHandlers.reconnecting);\n }\n\n _unsubscribeWS() {\n if (!this.ws || !this._wsHandlers) return;\n\n this.ws.off('message:assistant_thinking', this._wsHandlers.thinking);\n this.ws.off('message:assistant_text', this._wsHandlers.text);\n this.ws.off('message:assistant_tool_call', this._wsHandlers.tool_call);\n this.ws.off('message:assistant_response', this._wsHandlers.response);\n this.ws.off('message:assistant_error', this._wsHandlers.error);\n this.ws.off('message:assistant_plan', this._wsHandlers.plan);\n this.ws.off('message:assistant_plan_update', this._wsHandlers.plan_update);\n this.ws.off('message:message', this._wsHandlers.message);\n this.ws.off('connected', this._wsHandlers.connected);\n this.ws.off('disconnected', this._wsHandlers.disconnected);\n this.ws.off('reconnecting', this._wsHandlers.reconnecting);\n\n this._wsHandlers = {};\n }\n\n // ── WS Event Handlers ────────────────────────────────────\n\n _dispatchWSMessage(envelope) {\n const inner = envelope?.data;\n if (!inner?.type) return;\n\n switch (inner.type) {\n case 'assistant_thinking': this._onThinking(inner); break;\n case 'assistant_text': this._onText(inner); break;\n case 'assistant_tool_call': this._onToolCall(inner); break;\n case 'assistant_response': this._onResponse(inner); break;\n case 'assistant_error': this._onError(inner); break;\n case 'assistant_plan': this._onPlan(inner); break;\n case 'assistant_plan_update': this._onPlanUpdate(inner); break;\n }\n }\n\n _isMyConversation(data) {\n if (!data.conversation_id) return true;\n if (!this.conversationId) return true;\n return String(data.conversation_id) === String(this.conversationId);\n }\n\n _adoptConversationId(data) {\n if (data.conversation_id && !this.conversationId) {\n this.conversationId = data.conversation_id;\n this.app._assistantConversationId = this.conversationId;\n }\n }\n\n _onThinking(data) {\n if (!this._isMyConversation(data)) return;\n this._adoptConversationId(data);\n this._showChatArea();\n this.chatView.showThinking('Thinking...');\n this._setInputEnabled(false, 'Assistant is thinking…');\n }\n\n /**\n * Intermediate prose alongside tool calls in the same turn. Renders as\n * an assistant bubble, but does NOT clear the thinking indicator or\n * re-enable input — `assistant_response` remains the terminal signal.\n * @private\n */\n _onText(data) {\n if (!this._isMyConversation(data)) return;\n this._adoptConversationId(data);\n // Server is still working — refresh the safety timeout.\n this._resetResponseTimeout();\n\n const msg = this._transformMessage({\n id: data.message_id || `text-${++this._messageIdCounter}`,\n role: 'assistant',\n content: data.text || '',\n blocks: data.blocks || [],\n tool_calls: [],\n created: data.created || data.timestamp || new Date().toISOString()\n });\n\n if (msg && (msg.content || msg.blocks?.length)) {\n this.chatView.addMessage(msg);\n }\n }\n\n _onToolCall(data) {\n if (!this._isMyConversation(data)) return;\n this.chatView.showThinking(`Using ${data.tool || data.name || 'tool'}...`);\n this._resetResponseTimeout();\n }\n\n _resetResponseTimeout() {\n if (this._responseTimeout) {\n if (this._requestStartTime && (Date.now() - this._requestStartTime) >= 300000) {\n this._onResponseTimeout();\n return;\n }\n clearTimeout(this._responseTimeout);\n this._responseTimeout = setTimeout(() => this._onResponseTimeout(), 60000);\n }\n }\n\n _onResponse(data) {\n if (!this._isMyConversation(data)) return;\n\n this.chatView.hideThinking();\n this._setInputEnabled(true);\n this._adoptConversationId(data);\n\n const textarea = this.element?.querySelector('[data-ref=\"input\"]');\n if (textarea) textarea.focus();\n\n const msg = this._transformMessage({\n id: data.message_id || `resp-${++this._messageIdCounter}`,\n role: 'assistant',\n content: data.response || data.content || data.message || '',\n blocks: data.blocks || [],\n tool_calls: data.tool_calls_made || data.tool_calls || [],\n created: data.created || data.timestamp || new Date().toISOString()\n });\n\n if (msg && (msg.content || msg.blocks?.length || msg.tool_calls?.length)) {\n this.chatView.addMessage(msg);\n }\n }\n\n _onError(data) {\n if (!this._isMyConversation(data)) return;\n\n this.chatView.hideThinking();\n this._setInputEnabled(true);\n this._adoptConversationId(data);\n\n const errorText = data.error || data.message || 'An error occurred';\n this._showSystemMessage(errorText);\n }\n\n _onPlan(data) {\n if (!this._isMyConversation(data)) return;\n this._adoptConversationId(data);\n this._showChatArea();\n\n const plan = data.plan;\n if (!plan) return;\n\n this._activePlans[plan.plan_id] = plan;\n\n this.chatView.addMessage({\n id: `plan-${plan.plan_id}`,\n role: 'assistant',\n author: { name: 'Mojo' },\n content: '',\n timestamp: new Date().toISOString(),\n blocks: [{ type: 'progress', ...plan }],\n tool_calls: []\n });\n }\n\n _onPlanUpdate(data) {\n if (!this._isMyConversation(data)) return;\n\n const plan = this._activePlans[data.plan_id];\n if (plan) {\n const step = plan.steps.find(s => s.id === data.step_id);\n if (step) {\n step.status = data.status;\n step.summary = data.summary;\n }\n }\n\n const msgView = this.chatView.messageViews.get(`plan-${data.plan_id}`);\n if (msgView?.updateProgressStep) {\n msgView.updateProgressStep(data.plan_id, data.step_id, data.status, data.summary);\n }\n this._resetResponseTimeout();\n }\n\n // ── Conversation Management ──────────────────────────────\n\n async _onConversationSelect(data) {\n this.conversationId = data.id;\n this.app._assistantConversationId = this.conversationId;\n this.conversationListView.setActive(data.id);\n this._showChatArea();\n this._updateTitle(data.model?.get('title') || data.model?.get('summary'));\n await this.chatView.refresh();\n }\n\n _onNewConversation() {\n this.conversationId = null;\n this.app._assistantConversationId = null;\n this.conversationListView.setActive(null);\n this.chatView.clearMessages();\n this._setInputEnabled(true);\n this._showWelcome();\n this._updateTitle();\n\n const textarea = this.element?.querySelector('[data-ref=\"input\"]');\n if (textarea) textarea.focus();\n }\n\n _onConversationDeleted(data) {\n if (String(data.id) === String(this.conversationId)) {\n this._onNewConversation();\n }\n }\n\n // ── Helpers ──────────────────────────────────────────────\n\n _transformMessage(msg) {\n if (msg.role === 'tool_result') return null;\n\n let content = msg.content || msg.text || '';\n let blocks = msg.blocks || [];\n let toolCalls = msg.tool_calls || [];\n\n if (toolCalls.length > 0) {\n // Normalize WS `tool_calls_made` shape `{ tool, input }` → Anthropic `{ type, name, input }`\n toolCalls = toolCalls.map(tc =>\n (!tc.type && tc.tool)\n ? { type: 'tool_use', name: tc.tool, input: tc.input }\n : tc\n );\n const textParts = toolCalls\n .filter(tc => tc.type === 'text' && tc.text)\n .map(tc => tc.text);\n if (!content && textParts.length > 0) {\n content = textParts.join('\\n\\n');\n }\n toolCalls = toolCalls\n .filter(tc => tc.type === 'tool_use')\n .filter(tc => !AssistantView.INTERNAL_TOOLS.has(tc.name));\n }\n\n if (blocks.length === 0 && content.includes('assistant_block')) {\n const parsed = AssistantView._parseBlocks(content);\n content = parsed.content;\n blocks = parsed.blocks;\n }\n\n const currentUserId = this.app?.activeUser?.id;\n\n return {\n id: msg.id,\n role: msg.role || 'user',\n author: msg.role === 'assistant'\n ? { name: 'Mojo' }\n : msg.author || {\n name: msg.user?.display_name || this.app?.activeUser?.get('display_name') || 'You',\n id: msg.user?.id || currentUserId\n },\n content,\n timestamp: msg.created || msg.timestamp,\n blocks,\n tool_calls: toolCalls,\n _conversationId: this.conversationId\n };\n }\n\n _showSystemMessage(text) {\n this._showChatArea();\n this.chatView.addMessage({\n id: `sys-${++this._messageIdCounter}`,\n type: 'system_event',\n content: text,\n timestamp: new Date().toISOString()\n });\n }\n\n _handleAPIError(_err) {\n if (_err.status === 404) {\n this._showSystemMessage('Assistant is not enabled on this server.');\n } else if (_err.status === 503) {\n this._showSystemMessage('LLM API key not configured. Contact your administrator.');\n } else {\n this._showSystemMessage('Failed to send message. Please try again.');\n }\n this._setInputEnabled(true);\n }\n\n _updateConnectionStatus() {\n const dot = this.element?.querySelector('.status-dot');\n if (!dot) return;\n\n if (this.ws?.isConnected) {\n dot.className = 'status-dot connected';\n dot.title = 'Connected';\n if (!this._responseTimeout) {\n this._setInputEnabled(true);\n } else {\n this._setInputEnabled(false, 'Waiting for response…');\n }\n } else if (this.ws?.isReconnecting) {\n dot.className = 'status-dot reconnecting';\n dot.title = 'Reconnecting...';\n this._setInputEnabled(false, 'Reconnecting…');\n if (this._responseTimeout) {\n clearTimeout(this._responseTimeout);\n this._responseTimeout = null;\n }\n } else {\n dot.className = 'status-dot disconnected';\n dot.title = 'Disconnected';\n this._setInputEnabled(false, 'Disconnected — reconnecting…');\n if (this._responseTimeout) {\n clearTimeout(this._responseTimeout);\n this._responseTimeout = null;\n }\n }\n }\n\n _escapeHtml(text) {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n }\n\n /**\n * Focus the input textarea — called externally when reopening the panel.\n */\n focusInput() {\n const textarea = this.element?.querySelector('[data-ref=\"input\"]');\n if (textarea) textarea.focus();\n }\n\n async onBeforeDestroy() {\n this._unsubscribeWS();\n if (this._responseTimeout) {\n clearTimeout(this._responseTimeout);\n this._responseTimeout = null;\n }\n }\n}\n\nexport default AssistantPanelView;\n"],"names":["AssistantPanelView","View","constructor","options","super","className","this","app","ws","conversationId","_assistantConversationId","_wsHandlers","_messageIdCounter","_hasMessages","_activePlans","_requestStartTime","_showingHistory","getTemplate","_escapeHtml","activeUser","get","onInit","conversations","AssistantConversationList","params","user","id","conversationListView","AssistantConversationListView","containerId","collection","addChild","chatView","ChatView","theme","messageViewClass","AssistantMessageView","currentUserId","showFileInput","showInput","adapter","_createAdapter","origAddMessage","addMessage","bind","msg","scroll","role","content","blocks","length","hideThinking","_setInputEnabled","on","data","_onConversationSelect","_toggleHistory","_onNewConversation","_onConversationDeleted","_subscribeWS","onAfterRender","textarea","element","querySelector","addEventListener","_autoResize","e","_handleKeydown","setTimeout","focus","_showChatArea","refresh","_updateConnectionStatus","_updateTitle","_setupResizeHandle","handle","STORAGE_KEY","saved","localStorage","getItem","w","parseInt","panelEl","document","getElementById","style","width","startX","startWidth","onMouseMove","delta","clientX","newWidth","Math","min","max","onMouseUp","removeEventListener","body","cursor","userSelect","setItem","preventDefault","offsetWidth","onActionToggleHistory","onActionNewConversation","onActionClosePanel","emit","onActionFullscreen","onActionPopOut","onActionUseSuggestion","_event","text","dataset","closest","value","_sendMessage","onActionSend","onActionStop","_showSystemMessage","show","history","chat","toggleBtn","classList","toggle","height","scrollHeight","key","shiftKey","trim","addNote","files","welcome","chatArea","add","remove","_showWelcome","enabled","reason","sendBtn","stopBtn","disabled","_setInputStatus","_responseTimeout","clearTimeout","_onResponseTimeout","message","el","innerHTML","_hasDismiss","title","textContent","fetch","async","conversation","AssistantConversation","graph","transformed","map","_transformMessage","filter","Boolean","AssistantView","_collapseMessages","_err","status","success","userMsg","author","name","timestamp","Date","toISOString","showThinking","now","isConnected","send","type","conversation_id","resp","rest","post","respData","response","_handleAPIError","thinking","_onThinking","_onText","tool_call","_onToolCall","_onResponse","error","_onError","plan","_onPlan","plan_update","_onPlanUpdate","envelope","_dispatchWSMessage","connected","disconnected","reconnecting","_unsubscribeWS","off","inner","_isMyConversation","String","_adoptConversationId","_resetResponseTimeout","message_id","tool_calls","created","tool","tool_calls_made","errorText","plan_id","step","steps","find","s","step_id","summary","msgView","messageViews","updateProgressStep","setActive","model","clearMessages","toolCalls","tc","input","textParts","join","INTERNAL_TOOLS","has","includes","parsed","_parseBlocks","display_name","_conversationId","dot","isReconnecting","div","createElement","focusInput","onBeforeDestroy"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{V as a}from"./View-BxlKR1IW.js";class MapView extends a{constructor(a={}){super({className:"map-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.showZoomControl=!1!==a.showZoomControl,this.tileLayer=a.tileLayer||"osm",this.showLeafletBranding=!0===a.showLeafletBranding,this.showLayerControl=!0===a.showLayerControl,this.layerOptions=a.layerOptions||{osm:"OSM",satellite:"Satellite",terrain:"Terrain",dark:"Dark",light:"Light",watercolor:"Watercolor",bw:"B/W",streets:"Streets"};const t=!1!==a.interactive;this.interactive=t,this.scrollZoom=void 0!==a.scrollZoom?!!a.scrollZoom:t,this.dragPan=void 0!==a.dragPan?!!a.dragPan:t,this.doubleClickZoom=void 0!==a.doubleClickZoom?!!a.doubleClickZoom:t,this.keyboard=void 0!==a.keyboard?!!a.keyboard:t,this.touchZoom=void 0!==a.touchZoom?!!a.touchZoom:t,this.map=null,this.leafletMarkers=[],this._tileLayer=null,this.template='\n <div class="map-container">\n <div id="map-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadLeaflet(),await this.initializeMap()}async loadLeaflet(){if(window.L)return;const a=new Promise(a=>{const t=document.createElement("link");t.rel="stylesheet",t.href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css",t.onload=a,t.onerror=a,document.head.appendChild(t)}),t=new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js",e.onload=a,e.onerror=t,document.head.appendChild(e)});await Promise.all([a,t])}getTileLayerUrl(){const a={osm:{url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",attribution:"© OpenStreetMap contributors",maxZoom:19},satellite:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attribution:"© Esri",maxZoom:19},terrain:{url:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",attribution:"© OpenTopoMap contributors",maxZoom:17},dark:{url:"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},light:{url:"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},watercolor:{url:"https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg",attribution:"© Stadia Maps © Stamen Design © OpenStreetMap contributors",maxZoom:16},bw:{url:"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},streets:{url:"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20}};return a[this.tileLayer]||a.osm}async initializeMap(){const a=this.element.querySelector(`#map-${this.id}`);if(!a||!window.L)return;let t=this.center;if(!t&&this.markers.length>0&&(t=[this.markers[0].lat,this.markers[0].lng]),t||(t=[0,0]),this.map=window.L.map(a,{center:t,zoom:this.zoom,zoomControl:this.showZoomControl,scrollWheelZoom:this.scrollZoom,dragging:this.dragPan,doubleClickZoom:this.doubleClickZoom,keyboard:this.keyboard,touchZoom:this.touchZoom,boxZoom:this.interactive,tap:this.interactive}),this.map&&this.map.attributionControl&&!1===this.showLeafletBranding)try{this.map.attributionControl.setPrefix("")}catch(n){}const e=this.getTileLayerUrl();if(this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.showLayerControl){const t=a.parentElement||this.element.querySelector(".map-container");if(t){t.style.position=t.style.position||"relative";const a=document.createElement("select");a.className="form-select form-select-sm",a.style.position="absolute",a.style.top="8px",a.style.right="8px",a.style.zIndex="1000",a.style.maxWidth="180px",a.setAttribute("aria-label","Map tile layer"),Object.entries(this.layerOptions||{}).forEach(([t,e])=>{const n=document.createElement("option");n.value=t,n.textContent=e,t===this.tileLayer&&(n.selected=!0),a.appendChild(n)}),a.addEventListener("change",()=>this.setTileLayer(a.value)),t.appendChild(a)}}this.addMarkers(this.markers),this.markers.length>1&&this.fitBounds(),setTimeout(()=>{this.map&&this.map.invalidateSize()},300)}addMarkers(a){this.map&&Array.isArray(a)&&a.forEach(a=>{const{lat:t,lng:e,popup:n,icon:l}=a;if(!t||!e)return;const i={};l&&(i.icon=window.L.icon(l));const s=window.L.marker([t,e],i).addTo(this.map);n&&s.bindPopup(n),this.leafletMarkers.push(s)})}fitBounds(){if(!this.map||0===this.leafletMarkers.length)return;const a=new window.L.featureGroup(this.leafletMarkers);this.map.fitBounds(a.getBounds().pad(.1))}updateMarkers(a){this.clearMarkers(),this.markers=a,this.addMarkers(a),a.length>1?this.fitBounds():1===a.length&&this.map.setView([a[0].lat,a[0].lng],this.zoom)}clearMarkers(){this.leafletMarkers.forEach(a=>{this.map.removeLayer(a)}),this.leafletMarkers=[]}setView(a,t,e=null){this.map&&this.map.setView([a,t],e||this.zoom)}setZoom(a){this.map&&this.map.setZoom(a)}setTileLayer(a){if(!this.map)return;const t=this.tileLayer;this.tileLayer=a||this.tileLayer;const e=this.getTileLayerUrl();try{this._tileLayer&&this.map.removeLayer(this._tileLayer)}catch(n){}this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.tileLayer=a||t,setTimeout(()=>{try{this.map.invalidateSize()}catch(n){}},150)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}static async showAsDialog(a={}){const t=new MapView(a),e={title:"Map View",header:!0,body:t,size:"lg",centered:!1,...a.dialogOptions||{}};await t.init(),await t.getApp().showDialog(e)}}const t=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,default:MapView},Symbol.toStringTag,{value:"Module"}));class MapLibreView extends a{constructor(a={}){super({className:"maplibre-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.pitch=a.pitch||0,this.bearing=a.bearing||0,this.mapStyle=a.style||"streets",this.showNavigationControl=!1!==a.showNavigationControl,this.autoFitBounds=!1!==a.autoFitBounds;const t=!1!==a.interactive;this.interactive=t,this.scrollZoom=void 0!==a.scrollZoom?!!a.scrollZoom:t,this.dragPan=void 0!==a.dragPan?!!a.dragPan:t,this.doubleClickZoom=void 0!==a.doubleClickZoom?!!a.doubleClickZoom:t,this.keyboard=void 0!==a.keyboard?!!a.keyboard:t,this.touchZoom=void 0!==a.touchZoom?!!a.touchZoom:t,this.map=null,this.mapMarkers=[],this.pendingMarkers=[...this.markers],this.lineSources=a.lineSources||[],this.pendingLineData=/* @__PURE__ */new Map,this.template='\n <div class="maplibre-container">\n <div id="maplibre-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadMapLibre(),await this.initializeMap()}async loadMapLibre(){if(window.maplibregl)return;const a=document.createElement("link");return a.rel="stylesheet",a.href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css",document.head.appendChild(a),new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js",e.onload=a,e.onerror=t,document.head.appendChild(e)})}getMapStyle(){const a={streets:"https://demotiles.maplibre.org/style.json",dark:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},light:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},satellite:{version:8,sources:{satellite:{type:"raster",tiles:["https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"],tileSize:256,attribution:"© Esri"}},layers:[{id:"satellite",type:"raster",source:"satellite"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},terrain:{version:8,sources:{terrain:{type:"raster",tiles:["https://a.tile.opentopomap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenTopoMap contributors"}},layers:[{id:"terrain",type:"raster",source:"terrain"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"}};return a[this.mapStyle]||a.streets}async initializeMap(){const a=this.element.querySelector(`#maplibre-${this.id}`);if(!a||!window.maplibregl)return;let t=this.center;!t&&this.markers.length>0&&(t=[this.markers[0].lng,this.markers[0].lat]),t||(t=[0,0]),this.map=new window.maplibregl.Map({container:a,style:this.getMapStyle(),center:t,zoom:this.zoom,pitch:this.pitch,bearing:this.bearing,interactive:this.interactive,scrollZoom:this.scrollZoom,dragPan:this.dragPan,doubleClickZoom:this.doubleClickZoom,keyboard:this.keyboard,touchZoomRotate:this.touchZoom}),this.showNavigationControl&&this.map.addControl(new window.maplibregl.NavigationControl,"top-right"),this.map.on("load",()=>{const a=this.pendingMarkers.length?this.pendingMarkers:this.markers;this.updateMarkers(a),this.lineSources.forEach(a=>this.addLineSource(a)),this.pendingLineData.forEach(a=>this.addLineSource(a)),this.pendingLineData.clear()})}addMarkers(a){this.map&&Array.isArray(a)?a.forEach(a=>{const{lng:t,lat:e,popup:n,color:l,icon:i,size:s}=a;if(!t||!e)return;const r=document.createElement("div");r.className="maplibre-marker";const o=Number(s)||30;r.style.width=`${o}px`,r.style.height=`${o}px`,r.style.borderRadius="50%",r.style.backgroundColor=l||"#3b82f6",r.style.border="3px solid white",r.style.boxShadow="0 2px 4px rgba(0,0,0,0.3)",r.style.cursor="pointer",r.style.display="flex",r.style.alignItems="center",r.style.justifyContent="center",i&&(r.innerHTML=`<i class="${i}" style="color: white;"></i>`);const m=new window.maplibregl.Marker({element:r}).setLngLat([t,e]).addTo(this.map);if(n){const a=new window.maplibregl.Popup({offset:25}).setHTML(n);m.setPopup(a)}this.mapMarkers.push(m)}):this.pendingMarkers=Array.isArray(a)?a:[]}fitBounds(){if(!this.map||0===this.markers.length)return;const a=new window.maplibregl.LngLatBounds;this.markers.forEach(t=>{a.extend([t.lng,t.lat])}),this.map.fitBounds(a,{padding:50,maxZoom:15})}updateMarkers(a){const t=Array.isArray(a)?a:[];this.markers=t,this.pendingMarkers=t,this.map&&(this.clearMarkers(),this.addMarkers(t),this.autoFitBounds&&t.length>1?this.fitBounds():1===t.length&&this.map&&this.map.flyTo({center:[t[0].lng,t[0].lat],zoom:this.zoom}))}clearMarkers(){this.mapMarkers.forEach(a=>{a.remove()}),this.mapMarkers=[]}addLineSource({id:a,data:t,paint:e,layout:n}){if(!a||!t)return;const l=`${a}-source`;this.map?(this.map.getLayer(a)&&this.map.removeLayer(a),this.map.getSource(l)&&this.map.removeSource(l),this.map.addSource(l,{type:"geojson",data:t}),this.map.addLayer({id:a,type:"line",source:l,paint:{"line-color":"#3b82f6","line-width":2,"line-opacity":.6,...e},layout:{"line-cap":"round","line-join":"round",...n}})):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}updateLineSource(a,{data:t,paint:e,layout:n}={}){if(!a||!t)return;const l=`${a}-source`;this.map?this.map.getSource(l)?(this.map.getSource(l).setData(t),(e||n)&&(e&&Object.entries(e).forEach(([t,e])=>{this.map.setPaintProperty(a,t,e)}),n&&Object.entries(n).forEach(([t,e])=>{this.map.setLayoutProperty(a,t,e)}))):this.addLineSource({id:a,data:t,paint:e,layout:n}):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}setView(a,t,e=null){this.map&&this.map.flyTo({center:[a,t],zoom:e||this.zoom})}setZoom(a){this.map&&this.map.setZoom(a)}setPitch(a){this.map&&this.map.setPitch(a)}setBearing(a){this.map&&this.map.setBearing(a)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}}const e=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,default:MapLibreView},Symbol.toStringTag,{value:"Module"})),n={AD:{name:"Andorra",lat:42.54859834854764,lng:1.5802243611232873},AE:{name:"United Arab Emirates",lat:24.18250292309135,lng:54.27920525789581},AF:{name:"Afghanistan",lat:34.13402601376932,lng:66.59216131095278},AG:{name:"Antigua and Barbuda",lat:17.07146759372967,lng:-61.78530823226373},AI:{name:"Anguilla",lat:18.222874004219086,lng:-63.06008343771806},AL:{name:"Albania",lat:41.14165894891656,lng:20.061082767269493},AM:{name:"Armenia",lat:40.17841274230679,lng:45.05490831965259},AO:{name:"Angola",lat:-12.167424062667942,lng:17.651768783079},AQ:{name:"Antarctica",lat:-77.16987521415838,lng:-177.56451613408842},AR:{name:"Argentina",lat:-35.697270518120085,lng:-64.53238503843076},AS:{name:"American Samoa",lat:-14.305711987770538,lng:-170.7007316174498},AT:{name:"Austria",lat:47.631858269895794,lng:13.797778364631036},AU:{name:"Australia",lat:-25.697337673983082,lng:134.02277170916162},AW:{name:"Aruba",lat:12.515625722992898,lng:-69.97564014284046},AZ:{name:"Azerbaijan",lat:40.3920509942049,lng:48.634592670644324},BA:{name:"Bosnia and Herzegovina",lat:44.14415356126429,lng:17.83467240787538},BB:{name:"Barbados",lat:13.183219369337529,lng:-59.557383949150285},BD:{name:"Bangladesh",lat:23.673728665121,lng:90.43212562608613},BE:{name:"Belgium",lat:50.6182138854095,lng:4.675010154696485},BF:{name:"Burkina Faso",lat:12.108709036312737,lng:-1.6932816211842325},BG:{name:"Bulgaria",lat:42.82043677302438,lng:25.251739122561908},BH:{name:"Bahrain",lat:26.04798501537066,lng:50.540695402276775},BI:{name:"Burundi",lat:-3.261251993278643,lng:29.88518227845293},BJ:{name:"Benin",lat:9.503013199615893,lng:2.305714528830206},BL:{name:"Saint Barthelemy",lat:17.90561691241738,lng:-62.83051610005156},BM:{name:"Bermuda",lat:32.315067430740726,lng:-64.7458500599169},BN:{name:"Brunei Darussalam",lat:4.543205889917609,lng:114.6430958360464},BO:{name:"Bolivia",lat:-16.7312488393574,lng:-64.45209597511206},BQ:{name:"Bonaire",lat:12.180844982440338,lng:-68.29350445958761},BQ:{name:"Saba",lat:17.632512616389718,lng:-63.23739481909494},BQ:{name:"Saint Eustatius",lat:17.4919042294197,lng:-62.978230589445026},BR:{name:"Brazil",lat:-11.524630416426652,lng:-54.355206608256424},BS:{name:"Bahamas",lat:24.72162633646784,lng:-78.07275370060313},BT:{name:"Bhutan",lat:27.42163933959824,lng:90.46716647173861},BV:{name:"Bouvet Island",lat:-54.42316679395248,lng:3.411969465057627},BW:{name:"Botswana",lat:-22.236609002062902,lng:23.85779956995608},BY:{name:"Belarus",lat:53.46791374543163,lng:27.964252054715104},BZ:{name:"Belize",lat:17.24252476647155,lng:-88.68273510023441},CA:{name:"Canada",lat:57.550480044655636,lng:-98.41680517868062},CC:{name:"Cocos Islands",lat:-12.171249450199545,lng:96.83688767323002},CD:{name:"Congo DRC",lat:-3.338629596207896,lng:23.419827574282188},CF:{name:"Central African Republic",lat:6.331390033944319,lng:20.520743419397256},CG:{name:"Congo",lat:-.7294391595233845,lng:14.879732849491393},CH:{name:"Switzerland",lat:46.73678128684938,lng:8.286928794895285},CI:{name:"Côte d'Ivoire",lat:7.536779279421307,lng:-5.571710194917734},CK:{name:"Cook Islands",lat:-21.222613253399842,lng:-159.78768870952257},CL:{name:"Chile",lat:-37.82938283049967,lng:-70.76863431739216},CM:{name:"Cameroon",lat:6.294168487480992,lng:12.948474142398263},CN:{name:"China",lat:38.07325481105728,lng:104.69113855849604},CO:{name:"Colombia",lat:4.187753877352739,lng:-72.6445066243485},CR:{name:"Costa Rica",lat:9.863467407406214,lng:-84.14673625701816},CU:{name:"Cuba",lat:21.476176522869448,lng:-79.69817857618705},CV:{name:"Cabo Verde",lat:15.076411518651643,lng:-23.63401005900474},CW:{name:"Curacao",lat:12.199996647939832,lng:-68.96939768599042},CX:{name:"Christmas Island",lat:-10.446440802183416,lng:105.70209512200549},CY:{name:"Cyprus",lat:35.11700416345239,lng:33.375346009199205},CZ:{name:"Czech Republic",lat:49.74917370930982,lng:15.383273292023533},DE:{name:"Germany",lat:51.08304539800482,lng:10.426171427430804},DJ:{name:"Djibouti",lat:11.750235727618804,lng:42.613496898789506},DK:{name:"Denmark",lat:56.00118817971057,lng:9.378670542409406},DM:{name:"Dominica",lat:15.429269860940513,lng:-61.360471946942994},DO:{name:"Dominican Republic",lat:18.77954818522993,lng:-70.43495198520012},DZ:{name:"Algeria",lat:28.350969744889056,lng:2.6558464719769135},EC:{name:"Ecuador",lat:-1.5642721388853116,lng:-78.4630326109714},EE:{name:"Estonia",lat:58.648108311231034,lng:25.916870250633806},EG:{name:"Egypt",lat:26.60517034450628,lng:30.240135435012338},ER:{name:"Eritrea",lat:15.005533147667684,lng:39.2672401449901},ES:{name:"Spain",lat:40.365008336683836,lng:-3.6516251409956983},ES:{name:"Canarias",lat:28.297665106525546,lng:-16.53799441021647},ET:{name:"Ethiopia",lat:8.729389557048396,lng:39.914902886544276},FI:{name:"Finland",lat:65.01578959749911,lng:25.65738433454702},FJ:{name:"Fiji",lat:-17.822470952336204,lng:177.98144613732626},FK:{name:"Falkland Islands",lat:-51.75901312766726,lng:-58.746646363799854},FM:{name:"Micronesia",lat:6.8789448129255435,lng:158.2291899444527},FO:{name:"Faroe Islands",lat:62.130896281495346,lng:-6.9811060913122835},FR:{name:"France",lat:46.6423682169416,lng:2.1940236627886227},GA:{name:"Gabon",lat:-.628448459921234,lng:11.839410898545754},GB:{name:"United Kingdom",lat:53.97844735080214,lng:-2.852943909329258},GD:{name:"Grenada",lat:12.112926656338907,lng:-61.67937937204098},GE:{name:"Georgia",lat:42.17986277737226,lng:43.378866534112234},GF:{name:"French Guiana",lat:3.857429742497078,lng:-53.32232307156624},GG:{name:"Guernsey",lat:49.45870771378872,lng:-2.576392582891568},GH:{name:"Ghana",lat:7.94530467243628,lng:-1.219233362526581},GI:{name:"Gibraltar",lat:36.14022671336082,lng:-5.345549484594358},GL:{name:"Greenland",lat:74.16847218965994,lng:-42.07567788066985},GM:{name:"Gambia",lat:13.428617959189328,lng:-15.383380385869662},GN:{name:"Guinea",lat:10.255986541378112,lng:-10.986948848040218},GP:{name:"Guadeloupe",lat:16.24420002705553,lng:-61.54382262282755},GQ:{name:"Equatorial Guinea",lat:1.5954643936590733,lng:10.425456672353823},GR:{name:"Greece",lat:39.42012261727978,lng:23.110368936161876},GS:{name:"South Georgia and South Sandwich Islands",lat:-54.37666443862139,lng:-36.77509575898928},GT:{name:"Guatemala",lat:15.820878515352684,lng:-90.31219349119617},GU:{name:"Guam",lat:13.445430479945276,lng:144.78024458298802},GW:{name:"Guinea-Bissau",lat:11.980075324820504,lng:-14.980186756910847},GY:{name:"Guyana",lat:4.68211981385056,lng:-58.91352612754667},HM:{name:"Heard Island and McDonald Islands",lat:-53.084170035513736,lng:73.49298560844045},HN:{name:"Honduras",lat:14.740370695750006,lng:-86.49251679006962},HR:{name:"Croatia",lat:44.91192100856702,lng:16.625761129583374},HT:{name:"Haiti",lat:18.883520486983567,lng:-72.89291379842},HU:{name:"Hungary",lat:47.22527332486294,lng:19.39620048366142},ID:{name:"Indonesia",lat:.15591979959037652,lng:113.96538246847302},IE:{name:"Ireland",lat:53.30489539816495,lng:-8.241128545554096},IL:{name:"Israel",lat:31.513542220043195,lng:35.027923472437024},IM:{name:"Isle of Man",lat:54.22855301008011,lng:-4.532995055468449},IN:{name:"India",lat:23.586300567746722,lng:81.17300408530181},IO:{name:"British Indian Ocean Territory",lat:-7.323548444385743,lng:72.43501618476016},IQ:{name:"Iraq",lat:33.105075667527906,lng:43.832529181056884},IR:{name:"Iran",lat:32.906023742890056,lng:54.237077001065444},IS:{name:"Iceland",lat:65.12360920205514,lng:-19.05682967106099},IT:{name:"Italy",lat:42.98201127614267,lng:12.763657166123137},JE:{name:"Jersey",lat:49.215396925724306,lng:-2.1291601162653575},JM:{name:"Jamaica",lat:18.12207889341651,lng:-77.30358894542778},JO:{name:"Jordan",lat:31.387064884449156,lng:36.95728884547246},JP:{name:"Japan",lat:36.76738832597829,lng:137.46934234351835},KE:{name:"Kenya",lat:.6899182318376179,lng:37.95309411262371},KG:{name:"Kyrgyzstan",lat:41.35698905438358,lng:74.17532903468319},KH:{name:"Cambodia",lat:12.699186865507775,lng:105.03973078680701},KI:{name:"Kiribati",lat:1.8676673749241066,lng:-157.39024189323504},KM:{name:"Comoros",lat:-11.658861474508491,lng:43.34826587429403},KN:{name:"Saint Kitts and Nevis",lat:17.314736299587768,lng:-62.74560385895787},KP:{name:"North Korea",lat:40.19198091470839,lng:127.3379805653744},KR:{name:"South Korea",lat:36.402386712544114,lng:127.76224551357649},KW:{name:"Kuwait",lat:29.281360965443092,lng:47.56311109320184},KY:{name:"Cayman Islands",lat:19.311231805620288,lng:-81.25203208977878},KZ:{name:"Kazakhstan",lat:47.641465195176835,lng:66.3759193479301},LA:{name:"Laos",lat:18.117282736873282,lng:103.76375899026448},LB:{name:"Lebanon",lat:33.91160170722086,lng:35.89651946324749},LC:{name:"Saint Lucia",lat:13.895749185129906,lng:-60.9689510935251},LI:{name:"Liechtenstein",lat:47.14627562133036,lng:9.547674672376376},LK:{name:"Sri Lanka",lat:7.696630939329944,lng:80.66931169770622},LR:{name:"Liberia",lat:6.52012979398834,lng:-9.258988935497618},LS:{name:"Lesotho",lat:-29.60168116924817,lng:28.24475317864227},LT:{name:"Lithuania",lat:55.29437393417175,lng:23.946021605013534},LU:{name:"Luxembourg",lat:49.77523454542369,lng:6.103230338458876},LV:{name:"Latvia",lat:56.813853047554154,lng:24.693671325654403},LY:{name:"Libya",lat:27.202915771690794,lng:17.91133392454237},MA:{name:"Morocco",lat:28.687598134979325,lng:-8.817212587250811},MC:{name:"Monaco",lat:43.74798224995656,lng:7.412820873271196},MD:{name:"Moldova",lat:47.0725674580696,lng:28.391111865941348},ME:{name:"Montenegro",lat:42.73694835210454,lng:19.29505087156758},MF:{name:"Saint Martin",lat:18.078012113224464,lng:-63.06678525361946},MG:{name:"Madagascar",lat:-19.04163612493041,lng:46.68493466832544},MH:{name:"Marshall Islands",lat:7.307929900994344,lng:168.72016025351076},MK:{name:"North Macedonia",lat:41.59402890143112,lng:21.70998923872772},ML:{name:"Mali",lat:17.168146208584837,lng:-4.346399841781153},MM:{name:"Myanmar",lat:19.901227931399873,lng:97.08892285397344},MN:{name:"Mongolia",lat:47.08644454604851,lng:103.3987360327455},MP:{name:"Northern Mariana Islands",lat:15.178063516432115,lng:145.74119737203134},MQ:{name:"Martinique",lat:14.642697353597645,lng:-61.01432380875083},MR:{name:"Mauritania",lat:20.466731212820022,lng:-10.495079045035716},MS:{name:"Montserrat",lat:16.735363391460357,lng:-62.18693281256255},MT:{name:"Malta",lat:35.890522650899314,lng:14.441922442508494},MU:{name:"Mauritius",lat:-20.28142317475198,lng:57.56415671066546},MV:{name:"Maldives",lat:-.6065577168009924,lng:73.10076245140479},MW:{name:"Malawi",lat:-13.128986464184024,lng:34.23441182298881},MX:{name:"Mexico",lat:23.87436068093592,lng:-101.55399731630118},MY:{name:"Malaysia",lat:3.6716608556387857,lng:114.63330303992869},MZ:{name:"Mozambique",lat:-17.525230309488748,lng:35.208577031290176},NA:{name:"Namibia",lat:-21.90858163281473,lng:18.16451345845268},NC:{name:"New Caledonia",lat:-21.33003372660827,lng:165.50767040438612},NE:{name:"Niger",lat:17.08105392407292,lng:8.86863247002646},NF:{name:"Norfolk Island",lat:-29.037654445046282,lng:167.95259597483337},NG:{name:"Nigeria",lat:9.61029352034213,lng:8.147714845256194},NI:{name:"Nicaragua",lat:12.893566631930554,lng:-85.016088327669},NL:{name:"Netherlands",lat:52.134054128923886,lng:5.554136426128487},NO:{name:"Norway",lat:64.97775882947745,lng:16.670259272390894},NP:{name:"Nepal",lat:28.300920699755657,lng:84.1338898313567},NR:{name:"Nauru",lat:-.5221021440668993,lng:166.92937633139178},NU:{name:"Niue",lat:-19.05230921680393,lng:-169.86878106699083},NZ:{name:"New Zealand",lat:-43.82765432544426,lng:170.69035541428696},OM:{name:"Oman",lat:20.7242833183209,lng:55.841088119829},PA:{name:"Panama",lat:8.439536749576892,lng:-80.14428761482796},PE:{name:"Peru",lat:-8.522717984240291,lng:-74.11416196781884},PF:{name:"French Polynesia",lat:-17.674684080120677,lng:-149.40041671099763},PG:{name:"Papua New Guinea",lat:-7.156912819152135,lng:144.8348942994695},PH:{name:"Philippines",lat:15.586542251094242,lng:121.82208941416745},PK:{name:"Pakistan",lat:30.116188371410882,lng:69.08835090769651},PL:{name:"Poland",lat:52.06848055692473,lng:19.43573279234468},PM:{name:"Saint Pierre and Miquelon",lat:46.95153913615198,lng:-56.32465353437558},PN:{name:"Pitcairn",lat:-24.366121747565458,lng:-128.3149848627581},PR:{name:"Puerto Rico",lat:18.216224086610914,lng:-66.49425339593509},PS:{name:"Palestinian Territory",lat:31.930818736453883,lng:35.24251184154588},PT:{name:"Portugal",lat:39.67529214702138,lng:-7.933662183874006},PW:{name:"Palau",lat:7.534775852547396,lng:134.57965086721052},PY:{name:"Paraguay",lat:-23.42190559259428,lng:-58.38906357428651},QA:{name:"Qatar",lat:25.318528486425386,lng:51.19794918743203},RE:{name:"Réunion",lat:-21.119825460665105,lng:55.54393506194689},RO:{name:"Romania",lat:45.82454894397586,lng:25.094158201563292},RS:{name:"Serbia",lat:44.02679870131969,lng:20.85677444395745},RU:{name:"Russian Federation",lat:59.039434214106194,lng:98.6704990698032},RW:{name:"Rwanda",lat:-2.014687460047154,lng:29.919439681764082},SA:{name:"Saudi Arabia",lat:24.136038144757897,lng:44.600958178225596},SB:{name:"Solomon Islands",lat:-9.613104734596515,lng:160.16475795033884},SC:{name:"Seychelles",lat:-4.660002318822744,lng:55.47250789595527},SD:{name:"Sudan",lat:15.67060230984256,lng:29.951458283594064},SE:{name:"Sweden",lat:62.73420986108448,lng:17.062431988004956},SG:{name:"Singapore",lat:1.3528251890006349,lng:103.81025757634053},SH:{name:"Saint Helena",lat:-15.962963318340398,lng:-5.717391620813109},SI:{name:"Slovenia",lat:46.13759229564504,lng:14.890636899973781},SJ:{name:"Svalbard",lat:78.57318936469626,lng:16.036378851505283},SK:{name:"Slovakia",lat:48.69808390520484,lng:19.581015362490966},SL:{name:"Sierra Leone",lat:8.561330384750587,lng:-11.78656695731115},SM:{name:"San Marino",lat:43.942820729097896,lng:12.461278349581722},SN:{name:"Senegal",lat:14.228861491763402,lng:-14.610875368352305},SO:{name:"Somalia",lat:6.524534573103924,lng:45.40037867243972},SR:{name:"Suriname",lat:4.098723595920171,lng:-55.855514311561286},SS:{name:"South Sudan",lat:7.657782041763295,lng:30.3851856901788},ST:{name:"Sao Tome and Principe",lat:.22744704294793774,lng:6.606158796857607},SV:{name:"El Salvador",lat:13.758041517055418,lng:-88.85911489238985},SX:{name:"Sint Maarten",lat:18.03942608463078,lng:-63.06883135915303},SY:{name:"Syria",lat:35.09751106058316,lng:38.5117323139514},SZ:{name:"Eswatini",lat:-26.562540935608702,lng:31.510685746082007},TC:{name:"Turks and Caicos Islands",lat:21.799865427483745,lng:-71.74058946811508},TD:{name:"Chad",lat:15.283493546654503,lng:18.427113900363025},TF:{name:"Juan De Nova Island",lat:-17.06449193630804,lng:42.74374761089645},TF:{name:"French Southern Territories",lat:-49.26329687105643,lng:69.54686984724839},TF:{name:"Glorioso Islands",lat:-11.566224871643417,lng:47.290948081543384},TG:{name:"Togo",lat:8.660743037717811,lng:.8990857571109684},TH:{name:"Thailand",lat:13.66222784745538,lng:101.08675116214552},TJ:{name:"Tajikistan",lat:38.56933138382972,lng:70.94215281065698},TK:{name:"Tokelau",lat:-9.195174767256544,lng:-171.85265950722743},TL:{name:"Timor-Leste",lat:-8.809894630601962,lng:125.95024049562659},TM:{name:"Turkmenistan",lat:39.06069118001429,lng:58.4577357627054},TN:{name:"Tunisia",lat:34.08636179565723,lng:9.65587551697984},TO:{name:"Tonga",lat:-21.15927212823853,lng:-175.20415878511247},TR:{name:"Turkey",lat:38.93207363123396,lng:35.56886764076691},TT:{name:"Trinidad and Tobago",lat:10.415515638298093,lng:-61.37236579976247},TV:{name:"Tuvalu",lat:-8.514701506447222,lng:179.217833977593},TZ:{name:"Tanzania",lat:-6.355794440041147,lng:34.81832206060381},UA:{name:"Ukraine",lat:48.657532515563794,lng:31.27377208442636},UG:{name:"Uganda",lat:1.2821729218416205,lng:32.34371768463123},UM:{name:"United States Minor Outlying Islands",lat:19.302045812215958,lng:166.63800339749642},US:{name:"United States",lat:38.8208089190304,lng:-96.33161660829639},UY:{name:"Uruguay",lat:-32.78195043831093,lng:-56.01919523458085},UZ:{name:"Uzbekistan",lat:41.4879065244633,lng:63.8548297593985},VA:{name:"Vatican City",lat:41.90402351316735,lng:12.451312917026133},VC:{name:"Saint Vincent and the Grenadines",lat:13.254808122970651,lng:-61.193766354393034},VE:{name:"Venezuela",lat:7.148324760507107,lng:-66.36492135985132},VG:{name:"British Virgin Islands",lat:18.42195819619707,lng:-64.62406519257699},VI:{name:"US Virgin Islands",lat:17.738009708772523,lng:-64.76155341409797},VN:{name:"Vietnam",lat:16.517347170839393,lng:105.91338832758704},VU:{name:"Vanuatu",lat:-15.189132121699332,lng:166.84912735669738},WF:{name:"Wallis and Futuna",lat:-14.283442307826677,lng:-178.12735555777184},WS:{name:"Samoa",lat:-13.634252953274622,lng:-172.44107655740137},YE:{name:"Yemen",lat:16.001392616307445,lng:47.46815793206386},YT:{name:"Mayotte",lat:-12.824468416301052,lng:45.128142327031064},ZA:{name:"South Africa",lat:-28.55361930679731,lng:24.75252746489084},ZM:{name:"Zambia",lat:-13.162832953186246,lng:27.75521363430896},ZW:{name:"Zimbabwe",lat:-18.92700121981475,lng:29.717829640720844}};class MetricsCountryMapView extends a{constructor(a={}){const t=a.height||320;super({className:"metrics-country-map-view",...a}),this.endpoint=a.endpoint||"/api/metrics/fetch",this.account=a.account||"global",this.category=a.category||null,this.slugs=a.slugs||null,this.granularity=a.granularity||"days",this.maxCountries=a.maxCountries||12,this.metricLabel=a.metricLabel||"Events",this.height=t,this.mapStyle=a.mapStyle||"dark",this.mapOptions=a.mapOptions||{},this.showRoutes=!1!==a.showRoutes,this.routeOrigin=a.routeOrigin||{lng:-77.346,lat:38.958,name:"Reston, VA"},this._refreshing=!1}async getTemplate(){return`\n <div class="metrics-country-map">\n <div class="map-container mb-3" data-container="${this.id}-map" style="height:${this.height}px"></div>\n <div class="map-legend small" data-region="legend"></div>\n </div>\n `}async onInit(){this.statusEl=document.createElement("div"),this.statusEl.className="text-muted small px-3 pb-2",this.element.appendChild(this.statusEl),this.mapView=new MapLibreView({containerId:`${this.id}-map`,height:this.height,style:this.mapStyle,zoom:this.mapOptions.zoom??1.3,center:this.mapOptions.center||[10,20],pitch:this.mapOptions.pitch??20,bearing:this.mapOptions.bearing??0,showNavigationControl:this.mapOptions.showNavigationControl??!0,autoFitBounds:this.mapOptions.autoFitBounds??!1,interactive:this.mapOptions.interactive,scrollZoom:this.mapOptions.scrollZoom,dragPan:this.mapOptions.dragPan,doubleClickZoom:this.mapOptions.doubleClickZoom,keyboard:this.mapOptions.keyboard,touchZoom:this.mapOptions.touchZoom}),this.addChild(this.mapView),await this.refresh()}async refresh(){if(!this._refreshing){this._refreshing=!0,this.setStatus("Loading hotspots…");try{const a=await this.fetchMetrics();await this.applyMetrics(a),this.setStatus("")}catch(a){console.error("MetricsCountryMapView refresh error",a),this.setStatus("Unable to load country metrics.")}finally{this._refreshing=!1}}}async fetchMetrics(){const a=this.getApp()?.rest;if(!a)throw new Error("REST client unavailable");const t={account:this.account,granularity:this.granularity,with_labels:!0};if(this.category&&(t.category=this.category),this.slugs){const a=Array.isArray(this.slugs)?this.slugs:[this.slugs];t["slugs[]"]=a}const e=await a.GET(this.endpoint,t);if(!e.success||!e.data?.status)throw new Error(e.data?.error||"Metrics API error");return e.data.data}async applyMetrics(a){const t=a?.data||{},e=a?.labels||[],l=[];if(Object.entries(t).forEach(([a,t])=>{const e=t.reduce((a,t)=>a+(Number(t)||0),0);if(!e)return;const i=n[a.toUpperCase()];i&&l.push({code:a.toUpperCase(),total:e,values:t,centroid:i})}),!l.length)return this.mapView.updateMarkers([]),this.renderLegend([]),void this.setStatus("No country data available for the selected range.");l.sort((a,t)=>t.total-a.total);const i=l.slice(0,this.maxCountries),s=i[0]?.total||1,r=i.map(a=>{const t=a.total/s,e=Math.round(18+24*t);return{lng:a.centroid.lng,lat:a.centroid.lat,size:e,color:this.getMarkerColor(t),popup:`\n <div class="text-center">\n <strong>${a.centroid.name}</strong><br/>\n <span class="text-muted">${a.total.toLocaleString()} ${this.metricLabel}</span>\n </div>\n `}});this.showRoutes&&this.routeOrigin?.lng&&this.routeOrigin?.lat&&r.push({lng:this.routeOrigin.lng,lat:this.routeOrigin.lat,size:26,color:"#0d6efd",icon:"bi bi-broadcast-pin",popup:`\n <div class="text-center">\n <strong>${this.routeOrigin.name||"Operations Hub"}</strong><br/>\n <span class="text-muted">Origin</span>\n </div>\n `}),this.mapView.updateMarkers(r),this.renderLegend(i,e),this.showRoutes&&this.renderRoutes(i,s)}getMarkerColor(a){const t=[255,193,7],e=[32,201,151].map((e,n)=>Math.round(e+(t[n]-e)*a));return`rgba(${e[0]}, ${e[1]}, ${e[2]}, 0.9)`}renderLegend(a){const t=this.element.querySelector('[data-region="legend"]');if(!t)return;if(!a.length)return void(t.innerHTML="");const e=a[0]?.total||1,n=a.map(a=>{const t=(a.total/e*100).toFixed(0);return`\n <div class="d-flex justify-content-between align-items-center py-1 border-top">\n <div>\n <span class="fw-semibold">${a.centroid.name}</span>\n <span class="text-muted ms-1">(${a.code})</span>\n </div>\n <div class="text-end">\n <div class="fw-semibold">${a.total.toLocaleString()}</div>\n <small class="text-muted">${t}% of top</small>\n </div>\n </div>\n `}).join("");t.innerHTML=n}renderRoutes(a,t){const e=this.routeOrigin||null;if(!(e&&e.lng&&e.lat&&this.mapView))return;const n={type:"FeatureCollection",features:a.map(a=>({type:"Feature",geometry:{type:"LineString",coordinates:[[e.lng,e.lat],[a.centroid.lng,a.centroid.lat]]},properties:{total:a.total,intensity:a.total/t}}))};this.mapView.lineSources=this.mapView.lineSources.filter(a=>a.id!==`${this.id}-routes`),this.mapView.updateLineSource(`${this.id}-routes`,{data:n,paint:{"line-color":["interpolate",["linear"],["get","intensity"],0,"rgba(32, 201, 151, 0.6)",1,"rgba(255, 193, 7, 0.95)"],"line-width":["interpolate",["linear"],["get","intensity"],0,1.75,1,6],"line-opacity":["interpolate",["linear"],["get","intensity"],0,.45,1,.95]}})}setStatus(a){this.statusEl&&(this.statusEl.textContent=a||"",this.statusEl.style.display=a?"block":"none")}}export{MapView as M,MapLibreView as a,MetricsCountryMapView as b,t as c,e as d};
|
|
2
|
-
//# sourceMappingURL=MetricsCountryMapView-Bp3qoVHp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCountryMapView-Bp3qoVHp.js","sources":["../../src/extensions/map/MapView.js","../../src/extensions/map/MapLibreView.js","../../src/extensions/map/countryCentroids.js","../../src/extensions/map/MetricsCountryMapView.js"],"sourcesContent":["/**\n * MapView - Interactive map component using Leaflet\n *\n * Features:\n * - Display single or multiple markers\n * - Auto-zoom to fit markers\n * - Customizable marker popups\n * - Support for different tile layers\n *\n * @example\n * const mapView = new MapView({\n * markers: [\n * { lat: 37.422, lng: -122.084, popup: 'Mountain View, CA' }\n * ],\n * zoom: 10,\n * height: 400\n * });\n */\n\nimport View from '@core/View.js';\n\nclass MapView extends View {\n constructor(options = {}) {\n super({\n className: 'map-view',\n ...options\n });\n\n this.markers = options.markers || [];\n this.center = options.center || null;\n this.zoom = options.zoom || 13;\n this.height = options.height || 400;\n this.showZoomControl = options.showZoomControl !== false;\n this.tileLayer = options.tileLayer || 'osm'; // 'osm', 'satellite', 'terrain'\n this.showLeafletBranding = options.showLeafletBranding === true;\n this.showLayerControl = options.showLayerControl === true;\n this.layerOptions = options.layerOptions || {\n osm: 'OSM',\n satellite: 'Satellite',\n terrain: 'Terrain',\n dark: 'Dark',\n light: 'Light',\n watercolor: 'Watercolor',\n bw: 'B/W',\n streets: 'Streets'\n };\n\n // Interaction toggles. `interactive` is the master switch; granular\n // flags override individual handlers when set.\n const interactive = options.interactive !== false;\n this.interactive = interactive;\n this.scrollZoom = options.scrollZoom !== undefined ? !!options.scrollZoom : interactive;\n this.dragPan = options.dragPan !== undefined ? !!options.dragPan : interactive;\n this.doubleClickZoom = options.doubleClickZoom !== undefined ? !!options.doubleClickZoom : interactive;\n this.keyboard = options.keyboard !== undefined ? !!options.keyboard : interactive;\n this.touchZoom = options.touchZoom !== undefined ? !!options.touchZoom : interactive;\n\n this.map = null;\n this.leafletMarkers = [];\n this._tileLayer = null;\n\n this.template = `\n <div class=\"map-container\">\n <div id=\"map-{{id}}\" style=\"height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;\"></div>\n </div>\n `;\n }\n\n async onAfterRender() {\n await this.loadLeaflet();\n await this.initializeMap();\n }\n\n async loadLeaflet() {\n // Check if Leaflet is already loaded\n if (window.L) return;\n\n // Load Leaflet CSS and wait for it\n const cssLoaded = new Promise((resolve) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css';\n link.onload = resolve;\n link.onerror = resolve; // Continue even if CSS fails\n document.head.appendChild(link);\n });\n\n // Load Leaflet JS\n const jsLoaded = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js';\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n\n // Wait for both CSS and JS to load\n await Promise.all([cssLoaded, jsLoaded]);\n }\n\n getTileLayerUrl() {\n const tileLayers = {\n // Standard street maps\n osm: {\n url: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n attribution: '© OpenStreetMap contributors',\n maxZoom: 19\n },\n\n // Satellite imagery\n satellite: {\n url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n attribution: '© Esri',\n maxZoom: 19\n },\n\n // Terrain and topographic\n terrain: {\n url: 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',\n attribution: '© OpenTopoMap contributors',\n maxZoom: 17\n },\n\n // Dark mode styles\n dark: {\n url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap contributors © CARTO',\n maxZoom: 20\n },\n\n // Light/minimal styles\n light: {\n url: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap contributors © CARTO',\n maxZoom: 20\n },\n\n // Watercolor artistic style\n watercolor: {\n url: 'https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg',\n attribution: '© Stadia Maps © Stamen Design © OpenStreetMap contributors',\n maxZoom: 16\n },\n\n // Black and white\n bw: {\n url: 'https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap contributors © CARTO',\n maxZoom: 20\n },\n\n // Streets with labels\n streets: {\n url: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png',\n attribution: '© OpenStreetMap contributors © CARTO',\n maxZoom: 20\n }\n };\n\n return tileLayers[this.tileLayer] || tileLayers.osm;\n }\n\n async initializeMap() {\n const mapElement = this.element.querySelector(`#map-${this.id}`);\n if (!mapElement || !window.L) return;\n\n // Determine map center\n let mapCenter = this.center;\n if (!mapCenter && this.markers.length > 0) {\n // Use first marker as center\n mapCenter = [this.markers[0].lat, this.markers[0].lng];\n }\n if (!mapCenter) {\n // Default to world view\n mapCenter = [0, 0];\n }\n\n // Create map\n this.map = window.L.map(mapElement, {\n center: mapCenter,\n zoom: this.zoom,\n zoomControl: this.showZoomControl,\n scrollWheelZoom: this.scrollZoom,\n dragging: this.dragPan,\n doubleClickZoom: this.doubleClickZoom,\n keyboard: this.keyboard,\n touchZoom: this.touchZoom,\n boxZoom: this.interactive,\n tap: this.interactive\n });\n // Optionally hide Leaflet branding/prefix (removes Leaflet link/flag in attribution control)\n if (this.map && this.map.attributionControl && this.showLeafletBranding === false) {\n try { this.map.attributionControl.setPrefix(''); } catch (e) {}\n }\n\n // Add tile layer\n const tileConfig = this.getTileLayerUrl();\n this._tileLayer = window.L.tileLayer(tileConfig.url, {\n attribution: tileConfig.attribution,\n maxZoom: tileConfig.maxZoom\n }).addTo(this.map);\n\n // Optional built-in tile layer selector UI\n if (this.showLayerControl) {\n const container = mapElement.parentElement || this.element.querySelector('.map-container');\n if (container) {\n container.style.position = container.style.position || 'relative';\n const selector = document.createElement('select');\n selector.className = 'form-select form-select-sm';\n selector.style.position = 'absolute';\n selector.style.top = '8px';\n selector.style.right = '8px';\n selector.style.zIndex = '1000';\n selector.style.maxWidth = '180px';\n selector.setAttribute('aria-label', 'Map tile layer');\n\n // Populate options\n Object.entries(this.layerOptions || {}).forEach(([key, label]) => {\n const opt = document.createElement('option');\n opt.value = key;\n opt.textContent = label;\n if (key === this.tileLayer) opt.selected = true;\n selector.appendChild(opt);\n });\n\n selector.addEventListener('change', () => this.setTileLayer(selector.value));\n container.appendChild(selector);\n }\n }\n\n // Add markers\n this.addMarkers(this.markers);\n\n // Auto-fit bounds if multiple markers\n if (this.markers.length > 1) {\n this.fitBounds();\n }\n\n // Fix tile rendering issues by invalidating size after a delay\n // This ensures the container has proper dimensions and CSS is applied\n setTimeout(() => {\n if (this.map) {\n this.map.invalidateSize();\n }\n }, 300);\n }\n\n addMarkers(markers) {\n if (!this.map || !Array.isArray(markers)) return;\n\n markers.forEach(markerData => {\n const { lat, lng, popup, icon } = markerData;\n\n if (!lat || !lng) return;\n\n const markerOptions = {};\n\n // Custom icon if provided\n if (icon) {\n markerOptions.icon = window.L.icon(icon);\n }\n\n const marker = window.L.marker([lat, lng], markerOptions).addTo(this.map);\n\n // Add popup if provided\n if (popup) {\n marker.bindPopup(popup);\n }\n\n this.leafletMarkers.push(marker);\n });\n }\n\n fitBounds() {\n if (!this.map || this.leafletMarkers.length === 0) return;\n\n const group = new window.L.featureGroup(this.leafletMarkers);\n this.map.fitBounds(group.getBounds().pad(0.1));\n }\n\n updateMarkers(newMarkers) {\n // Clear existing markers\n this.clearMarkers();\n\n // Add new markers\n this.markers = newMarkers;\n this.addMarkers(newMarkers);\n\n // Fit bounds if multiple markers\n if (newMarkers.length > 1) {\n this.fitBounds();\n } else if (newMarkers.length === 1) {\n this.map.setView([newMarkers[0].lat, newMarkers[0].lng], this.zoom);\n }\n }\n\n clearMarkers() {\n this.leafletMarkers.forEach(marker => {\n this.map.removeLayer(marker);\n });\n this.leafletMarkers = [];\n }\n\n setView(lat, lng, zoom = null) {\n if (!this.map) return;\n this.map.setView([lat, lng], zoom || this.zoom);\n }\n\n setZoom(zoom) {\n if (!this.map) return;\n this.map.setZoom(zoom);\n }\n\n setTileLayer(key) {\n if (!this.map) return;\n // Resolve tile layer config using the same logic as getTileLayerUrl\n const original = this.tileLayer;\n this.tileLayer = key || this.tileLayer;\n const tileConfig = this.getTileLayerUrl();\n try {\n if (this._tileLayer) {\n this.map.removeLayer(this._tileLayer);\n }\n } catch (e) {\n // ignore if layer already removed\n }\n this._tileLayer = window.L.tileLayer(tileConfig.url, {\n attribution: tileConfig.attribution,\n maxZoom: tileConfig.maxZoom\n }).addTo(this.map);\n // Keep property in sync\n this.tileLayer = key || original;\n\n // Nudge map to ensure proper redraw\n setTimeout(() => {\n try { this.map.invalidateSize(); } catch (e) {}\n }, 150);\n }\n\n async onBeforeDestroy() {\n if (this.map) {\n this.map.remove();\n this.map = null;\n }\n await super.onBeforeDestroy();\n }\n\n static async showAsDialog(options = {}) {\n const view = new MapView(options);\n const dopts = options.dialogOptions || {};\n const dialogOptions = {\n title: \"Map View\",\n header: true,\n body: view,\n size: 'lg',\n centered: false,\n ...dopts\n }\n await view.init();\n await view.getApp().showDialog(dialogOptions);\n }\n}\n\nexport default MapView;\n","/**\n * MapLibreView - Interactive vector map component using MapLibre GL JS\n * \n * MapLibre GL is better for:\n * - Vector tiles and custom styling\n * - 3D terrain and buildings\n * - High-performance rendering\n * - Heat maps and data visualizations\n * - Complex animations\n * \n * Use MapView (Leaflet) for simple marker maps.\n * Use MapLibreView for advanced visualizations.\n * \n * @example\n * const mapView = new MapLibreView({\n * markers: [\n * { lng: -122.084, lat: 37.422, popup: 'Mountain View, CA' }\n * ],\n * style: 'streets', // 'streets', 'satellite', 'dark', 'light'\n * zoom: 10,\n * height: 400\n * });\n */\n\nimport View from '@core/View.js';\n\nclass MapLibreView extends View {\n constructor(options = {}) {\n super({\n className: 'maplibre-view',\n ...options\n });\n\n this.markers = options.markers || [];\n this.center = options.center || null;\n this.zoom = options.zoom || 13;\n this.height = options.height || 400;\n this.pitch = options.pitch || 0; // 0-60 degrees (3D tilt)\n this.bearing = options.bearing || 0; // 0-360 degrees (rotation)\n this.mapStyle = options.style || 'streets'; // 'streets', 'satellite', 'dark', 'light', 'terrain'\n this.showNavigationControl = options.showNavigationControl !== false;\n this.autoFitBounds = options.autoFitBounds !== false;\n\n // Interaction toggles. `interactive` is the master switch; granular\n // flags override individual handlers when set.\n const interactive = options.interactive !== false;\n this.interactive = interactive;\n this.scrollZoom = options.scrollZoom !== undefined ? !!options.scrollZoom : interactive;\n this.dragPan = options.dragPan !== undefined ? !!options.dragPan : interactive;\n this.doubleClickZoom = options.doubleClickZoom !== undefined ? !!options.doubleClickZoom : interactive;\n this.keyboard = options.keyboard !== undefined ? !!options.keyboard : interactive;\n this.touchZoom = options.touchZoom !== undefined ? !!options.touchZoom : interactive;\n \n this.map = null;\n this.mapMarkers = [];\n this.pendingMarkers = [...this.markers];\n this.lineSources = options.lineSources || [];\n this.pendingLineData = new Map();\n\n this.template = `\n <div class=\"maplibre-container\">\n <div id=\"maplibre-{{id}}\" style=\"height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;\"></div>\n </div>\n `;\n }\n\n async onAfterRender() {\n await this.loadMapLibre();\n await this.initializeMap();\n }\n\n async loadMapLibre() {\n // Check if MapLibre is already loaded\n if (window.maplibregl) return;\n\n // Load MapLibre CSS\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = 'https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css';\n document.head.appendChild(link);\n\n // Load MapLibre JS\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js';\n script.onload = resolve;\n script.onerror = reject;\n document.head.appendChild(script);\n });\n }\n\n getMapStyle() {\n const styles = {\n streets: 'https://demotiles.maplibre.org/style.json',\n dark: {\n version: 8,\n sources: {\n osm: {\n type: 'raster',\n tiles: ['https://a.tile.openstreetmap.org/{z}/{x}/{y}.png'],\n tileSize: 256,\n attribution: '© OpenStreetMap contributors'\n }\n },\n layers: [{\n id: 'osm',\n type: 'raster',\n source: 'osm'\n }],\n glyphs: 'https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf'\n },\n light: {\n version: 8,\n sources: {\n osm: {\n type: 'raster',\n tiles: ['https://a.tile.openstreetmap.org/{z}/{x}/{y}.png'],\n tileSize: 256,\n attribution: '© OpenStreetMap contributors'\n }\n },\n layers: [{\n id: 'osm',\n type: 'raster',\n source: 'osm'\n }],\n glyphs: 'https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf'\n },\n satellite: {\n version: 8,\n sources: {\n satellite: {\n type: 'raster',\n tiles: ['https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'],\n tileSize: 256,\n attribution: '© Esri'\n }\n },\n layers: [{\n id: 'satellite',\n type: 'raster',\n source: 'satellite'\n }],\n glyphs: 'https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf'\n },\n terrain: {\n version: 8,\n sources: {\n terrain: {\n type: 'raster',\n tiles: ['https://a.tile.opentopomap.org/{z}/{x}/{y}.png'],\n tileSize: 256,\n attribution: '© OpenTopoMap contributors'\n }\n },\n layers: [{\n id: 'terrain',\n type: 'raster',\n source: 'terrain'\n }],\n glyphs: 'https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf'\n }\n };\n\n return styles[this.mapStyle] || styles.streets;\n }\n\n async initializeMap() {\n const mapElement = this.element.querySelector(`#maplibre-${this.id}`);\n if (!mapElement || !window.maplibregl) return;\n\n // Determine map center\n let mapCenter = this.center;\n if (!mapCenter && this.markers.length > 0) {\n // Use first marker as center (MapLibre uses [lng, lat])\n mapCenter = [this.markers[0].lng, this.markers[0].lat];\n }\n if (!mapCenter) {\n // Default to world view\n mapCenter = [0, 0];\n }\n\n // Create map\n this.map = new window.maplibregl.Map({\n container: mapElement,\n style: this.getMapStyle(),\n center: mapCenter,\n zoom: this.zoom,\n pitch: this.pitch,\n bearing: this.bearing,\n interactive: this.interactive,\n scrollZoom: this.scrollZoom,\n dragPan: this.dragPan,\n doubleClickZoom: this.doubleClickZoom,\n keyboard: this.keyboard,\n touchZoomRotate: this.touchZoom\n });\n\n // Add navigation control\n if (this.showNavigationControl) {\n this.map.addControl(new window.maplibregl.NavigationControl(), 'top-right');\n }\n\n // Wait for map to load before adding markers\n this.map.on('load', () => {\n const initialMarkers = this.pendingMarkers.length ? this.pendingMarkers : this.markers;\n this.updateMarkers(initialMarkers);\n this.lineSources.forEach(source => this.addLineSource(source));\n this.pendingLineData.forEach(source => this.addLineSource(source));\n this.pendingLineData.clear();\n });\n }\n\n addMarkers(markers) {\n if (!this.map || !Array.isArray(markers)) {\n this.pendingMarkers = Array.isArray(markers) ? markers : [];\n return;\n }\n\n markers.forEach(markerData => {\n const { lng, lat, popup, color, icon, size } = markerData;\n \n if (!lng || !lat) return;\n\n // Create marker element\n const el = document.createElement('div');\n el.className = 'maplibre-marker';\n const markerSize = Number(size) || 30;\n el.style.width = `${markerSize}px`;\n el.style.height = `${markerSize}px`;\n el.style.borderRadius = '50%';\n el.style.backgroundColor = color || '#3b82f6';\n el.style.border = '3px solid white';\n el.style.boxShadow = '0 2px 4px rgba(0,0,0,0.3)';\n el.style.cursor = 'pointer';\n el.style.display = 'flex';\n el.style.alignItems = 'center';\n el.style.justifyContent = 'center';\n\n // Optional icon\n if (icon) {\n el.innerHTML = `<i class=\"${icon}\" style=\"color: white;\"></i>`;\n }\n\n // Create marker\n const marker = new window.maplibregl.Marker({ element: el })\n .setLngLat([lng, lat])\n .addTo(this.map);\n\n // Add popup if provided\n if (popup) {\n const mapPopup = new window.maplibregl.Popup({ offset: 25 })\n .setHTML(popup);\n marker.setPopup(mapPopup);\n }\n\n this.mapMarkers.push(marker);\n });\n }\n\n fitBounds() {\n if (!this.map || this.markers.length === 0) return;\n\n const bounds = new window.maplibregl.LngLatBounds();\n \n this.markers.forEach(marker => {\n bounds.extend([marker.lng, marker.lat]);\n });\n\n this.map.fitBounds(bounds, {\n padding: 50,\n maxZoom: 15\n });\n }\n\n updateMarkers(newMarkers) {\n const markers = Array.isArray(newMarkers) ? newMarkers : [];\n this.markers = markers;\n this.pendingMarkers = markers;\n if (!this.map) return;\n\n this.clearMarkers();\n this.addMarkers(markers);\n\n if (this.autoFitBounds && markers.length > 1) {\n this.fitBounds();\n } else if (markers.length === 1 && this.map) {\n this.map.flyTo({\n center: [markers[0].lng, markers[0].lat],\n zoom: this.zoom\n });\n }\n }\n\n clearMarkers() {\n this.mapMarkers.forEach(marker => {\n marker.remove();\n });\n this.mapMarkers = [];\n }\n\n addLineSource({ id, data, paint, layout }) {\n if (!id || !data) return;\n\n const sourceId = `${id}-source`;\n\n if (!this.map) {\n this.pendingLineData.set(id, { id, data, paint, layout });\n return;\n }\n\n if (this.map.getLayer(id)) {\n this.map.removeLayer(id);\n }\n if (this.map.getSource(sourceId)) {\n this.map.removeSource(sourceId);\n }\n\n this.map.addSource(sourceId, {\n type: 'geojson',\n data\n });\n\n this.map.addLayer({\n id,\n type: 'line',\n source: sourceId,\n paint: {\n 'line-color': '#3b82f6',\n 'line-width': 2,\n 'line-opacity': 0.6,\n ...paint\n },\n layout: {\n 'line-cap': 'round',\n 'line-join': 'round',\n ...layout\n }\n });\n }\n\n updateLineSource(id, { data, paint, layout } = {}) {\n if (!id || !data) return;\n const sourceId = `${id}-source`;\n if (!this.map) {\n this.pendingLineData.set(id, { id, data, paint, layout });\n return;\n }\n if (this.map.getSource(sourceId)) {\n this.map.getSource(sourceId).setData(data);\n if (paint || layout) {\n if (paint) {\n Object.entries(paint).forEach(([key, value]) => {\n this.map.setPaintProperty(id, key, value);\n });\n }\n if (layout) {\n Object.entries(layout).forEach(([key, value]) => {\n this.map.setLayoutProperty(id, key, value);\n });\n }\n }\n } else {\n this.addLineSource({ id, data, paint, layout });\n }\n }\n\n setView(lng, lat, zoom = null) {\n if (!this.map) return;\n this.map.flyTo({\n center: [lng, lat],\n zoom: zoom || this.zoom\n });\n }\n\n setZoom(zoom) {\n if (!this.map) return;\n this.map.setZoom(zoom);\n }\n\n setPitch(pitch) {\n if (!this.map) return;\n this.map.setPitch(pitch);\n }\n\n setBearing(bearing) {\n if (!this.map) return;\n this.map.setBearing(bearing);\n }\n\n async onBeforeDestroy() {\n if (this.map) {\n this.map.remove();\n this.map = null;\n }\n await super.onBeforeDestroy();\n }\n}\n\nexport default MapLibreView;\n","// Auto-generated from countries.geojson - do not edit manually.\nexport const COUNTRY_CENTROIDS = {\n \"AD\": { name: \"Andorra\", lat: 42.54859834854764, lng: 1.5802243611232873 },\n \"AE\": { name: \"United Arab Emirates\", lat: 24.18250292309135, lng: 54.27920525789581 },\n \"AF\": { name: \"Afghanistan\", lat: 34.13402601376932, lng: 66.59216131095278 },\n \"AG\": { name: \"Antigua and Barbuda\", lat: 17.07146759372967, lng: -61.78530823226373 },\n \"AI\": { name: \"Anguilla\", lat: 18.222874004219086, lng: -63.06008343771806 },\n \"AL\": { name: \"Albania\", lat: 41.14165894891656, lng: 20.061082767269493 },\n \"AM\": { name: \"Armenia\", lat: 40.17841274230679, lng: 45.05490831965259 },\n \"AO\": { name: \"Angola\", lat: -12.167424062667942, lng: 17.651768783079 },\n \"AQ\": { name: \"Antarctica\", lat: -77.16987521415838, lng: -177.56451613408842 },\n \"AR\": { name: \"Argentina\", lat: -35.697270518120085, lng: -64.53238503843076 },\n \"AS\": { name: \"American Samoa\", lat: -14.305711987770538, lng: -170.7007316174498 },\n \"AT\": { name: \"Austria\", lat: 47.631858269895794, lng: 13.797778364631036 },\n \"AU\": { name: \"Australia\", lat: -25.697337673983082, lng: 134.02277170916162 },\n \"AW\": { name: \"Aruba\", lat: 12.515625722992898, lng: -69.97564014284046 },\n \"AZ\": { name: \"Azerbaijan\", lat: 40.3920509942049, lng: 48.634592670644324 },\n \"BA\": { name: \"Bosnia and Herzegovina\", lat: 44.14415356126429, lng: 17.83467240787538 },\n \"BB\": { name: \"Barbados\", lat: 13.183219369337529, lng: -59.557383949150285 },\n \"BD\": { name: \"Bangladesh\", lat: 23.673728665121, lng: 90.43212562608613 },\n \"BE\": { name: \"Belgium\", lat: 50.6182138854095, lng: 4.675010154696485 },\n \"BF\": { name: \"Burkina Faso\", lat: 12.108709036312737, lng: -1.6932816211842325 },\n \"BG\": { name: \"Bulgaria\", lat: 42.82043677302438, lng: 25.251739122561908 },\n \"BH\": { name: \"Bahrain\", lat: 26.04798501537066, lng: 50.540695402276775 },\n \"BI\": { name: \"Burundi\", lat: -3.261251993278643, lng: 29.88518227845293 },\n \"BJ\": { name: \"Benin\", lat: 9.503013199615893, lng: 2.305714528830206 },\n \"BL\": { name: \"Saint Barthelemy\", lat: 17.90561691241738, lng: -62.83051610005156 },\n \"BM\": { name: \"Bermuda\", lat: 32.315067430740726, lng: -64.7458500599169 },\n \"BN\": { name: \"Brunei Darussalam\", lat: 4.543205889917609, lng: 114.6430958360464 },\n \"BO\": { name: \"Bolivia\", lat: -16.7312488393574, lng: -64.45209597511206 },\n \"BQ\": { name: \"Bonaire\", lat: 12.180844982440338, lng: -68.29350445958761 },\n \"BQ\": { name: \"Saba\", lat: 17.632512616389718, lng: -63.23739481909494 },\n \"BQ\": { name: \"Saint Eustatius\", lat: 17.4919042294197, lng: -62.978230589445026 },\n \"BR\": { name: \"Brazil\", lat: -11.524630416426652, lng: -54.355206608256424 },\n \"BS\": { name: \"Bahamas\", lat: 24.72162633646784, lng: -78.07275370060313 },\n \"BT\": { name: \"Bhutan\", lat: 27.42163933959824, lng: 90.46716647173861 },\n \"BV\": { name: \"Bouvet Island\", lat: -54.42316679395248, lng: 3.411969465057627 },\n \"BW\": { name: \"Botswana\", lat: -22.236609002062902, lng: 23.85779956995608 },\n \"BY\": { name: \"Belarus\", lat: 53.46791374543163, lng: 27.964252054715104 },\n \"BZ\": { name: \"Belize\", lat: 17.24252476647155, lng: -88.68273510023441 },\n \"CA\": { name: \"Canada\", lat: 57.550480044655636, lng: -98.41680517868062 },\n \"CC\": { name: \"Cocos Islands\", lat: -12.171249450199545, lng: 96.83688767323002 },\n \"CD\": { name: \"Congo DRC\", lat: -3.338629596207896, lng: 23.419827574282188 },\n \"CF\": { name: \"Central African Republic\", lat: 6.331390033944319, lng: 20.520743419397256 },\n \"CG\": { name: \"Congo\", lat: -0.7294391595233845, lng: 14.879732849491393 },\n \"CH\": { name: \"Switzerland\", lat: 46.73678128684938, lng: 8.286928794895285 },\n \"CI\": { name: \"Côte d'Ivoire\", lat: 7.536779279421307, lng: -5.571710194917734 },\n \"CK\": { name: \"Cook Islands\", lat: -21.222613253399842, lng: -159.78768870952257 },\n \"CL\": { name: \"Chile\", lat: -37.82938283049967, lng: -70.76863431739216 },\n \"CM\": { name: \"Cameroon\", lat: 6.294168487480992, lng: 12.948474142398263 },\n \"CN\": { name: \"China\", lat: 38.07325481105728, lng: 104.69113855849604 },\n \"CO\": { name: \"Colombia\", lat: 4.187753877352739, lng: -72.6445066243485 },\n \"CR\": { name: \"Costa Rica\", lat: 9.863467407406214, lng: -84.14673625701816 },\n \"CU\": { name: \"Cuba\", lat: 21.476176522869448, lng: -79.69817857618705 },\n \"CV\": { name: \"Cabo Verde\", lat: 15.076411518651643, lng: -23.63401005900474 },\n \"CW\": { name: \"Curacao\", lat: 12.199996647939832, lng: -68.96939768599042 },\n \"CX\": { name: \"Christmas Island\", lat: -10.446440802183416, lng: 105.70209512200549 },\n \"CY\": { name: \"Cyprus\", lat: 35.11700416345239, lng: 33.375346009199205 },\n \"CZ\": { name: \"Czech Republic\", lat: 49.74917370930982, lng: 15.383273292023533 },\n \"DE\": { name: \"Germany\", lat: 51.08304539800482, lng: 10.426171427430804 },\n \"DJ\": { name: \"Djibouti\", lat: 11.750235727618804, lng: 42.613496898789506 },\n \"DK\": { name: \"Denmark\", lat: 56.00118817971057, lng: 9.378670542409406 },\n \"DM\": { name: \"Dominica\", lat: 15.429269860940513, lng: -61.360471946942994 },\n \"DO\": { name: \"Dominican Republic\", lat: 18.77954818522993, lng: -70.43495198520012 },\n \"DZ\": { name: \"Algeria\", lat: 28.350969744889056, lng: 2.6558464719769135 },\n \"EC\": { name: \"Ecuador\", lat: -1.5642721388853116, lng: -78.4630326109714 },\n \"EE\": { name: \"Estonia\", lat: 58.648108311231034, lng: 25.916870250633806 },\n \"EG\": { name: \"Egypt\", lat: 26.60517034450628, lng: 30.240135435012338 },\n \"ER\": { name: \"Eritrea\", lat: 15.005533147667684, lng: 39.2672401449901 },\n \"ES\": { name: \"Spain\", lat: 40.365008336683836, lng: -3.6516251409956983 },\n \"ES\": { name: \"Canarias\", lat: 28.297665106525546, lng: -16.53799441021647 },\n \"ET\": { name: \"Ethiopia\", lat: 8.729389557048396, lng: 39.914902886544276 },\n \"FI\": { name: \"Finland\", lat: 65.01578959749911, lng: 25.65738433454702 },\n \"FJ\": { name: \"Fiji\", lat: -17.822470952336204, lng: 177.98144613732626 },\n \"FK\": { name: \"Falkland Islands\", lat: -51.75901312766726, lng: -58.746646363799854 },\n \"FM\": { name: \"Micronesia\", lat: 6.8789448129255435, lng: 158.2291899444527 },\n \"FO\": { name: \"Faroe Islands\", lat: 62.130896281495346, lng: -6.9811060913122835 },\n \"FR\": { name: \"France\", lat: 46.6423682169416, lng: 2.1940236627886227 },\n \"GA\": { name: \"Gabon\", lat: -0.628448459921234, lng: 11.839410898545754 },\n \"GB\": { name: \"United Kingdom\", lat: 53.97844735080214, lng: -2.852943909329258 },\n \"GD\": { name: \"Grenada\", lat: 12.112926656338907, lng: -61.67937937204098 },\n \"GE\": { name: \"Georgia\", lat: 42.17986277737226, lng: 43.378866534112234 },\n \"GF\": { name: \"French Guiana\", lat: 3.857429742497078, lng: -53.32232307156624 },\n \"GG\": { name: \"Guernsey\", lat: 49.45870771378872, lng: -2.576392582891568 },\n \"GH\": { name: \"Ghana\", lat: 7.94530467243628, lng: -1.219233362526581 },\n \"GI\": { name: \"Gibraltar\", lat: 36.14022671336082, lng: -5.345549484594358 },\n \"GL\": { name: \"Greenland\", lat: 74.16847218965994, lng: -42.07567788066985 },\n \"GM\": { name: \"Gambia\", lat: 13.428617959189328, lng: -15.383380385869662 },\n \"GN\": { name: \"Guinea\", lat: 10.255986541378112, lng: -10.986948848040218 },\n \"GP\": { name: \"Guadeloupe\", lat: 16.24420002705553, lng: -61.54382262282755 },\n \"GQ\": { name: \"Equatorial Guinea\", lat: 1.5954643936590733, lng: 10.425456672353823 },\n \"GR\": { name: \"Greece\", lat: 39.42012261727978, lng: 23.110368936161876 },\n \"GS\": { name: \"South Georgia and South Sandwich Islands\", lat: -54.37666443862139, lng: -36.77509575898928 },\n \"GT\": { name: \"Guatemala\", lat: 15.820878515352684, lng: -90.31219349119617 },\n \"GU\": { name: \"Guam\", lat: 13.445430479945276, lng: 144.78024458298802 },\n \"GW\": { name: \"Guinea-Bissau\", lat: 11.980075324820504, lng: -14.980186756910847 },\n \"GY\": { name: \"Guyana\", lat: 4.68211981385056, lng: -58.91352612754667 },\n \"HM\": { name: \"Heard Island and McDonald Islands\", lat: -53.084170035513736, lng: 73.49298560844045 },\n \"HN\": { name: \"Honduras\", lat: 14.740370695750006, lng: -86.49251679006962 },\n \"HR\": { name: \"Croatia\", lat: 44.91192100856702, lng: 16.625761129583374 },\n \"HT\": { name: \"Haiti\", lat: 18.883520486983567, lng: -72.89291379842 },\n \"HU\": { name: \"Hungary\", lat: 47.22527332486294, lng: 19.39620048366142 },\n \"ID\": { name: \"Indonesia\", lat: 0.15591979959037652, lng: 113.96538246847302 },\n \"IE\": { name: \"Ireland\", lat: 53.30489539816495, lng: -8.241128545554096 },\n \"IL\": { name: \"Israel\", lat: 31.513542220043195, lng: 35.027923472437024 },\n \"IM\": { name: \"Isle of Man\", lat: 54.22855301008011, lng: -4.532995055468449 },\n \"IN\": { name: \"India\", lat: 23.586300567746722, lng: 81.17300408530181 },\n \"IO\": { name: \"British Indian Ocean Territory\", lat: -7.323548444385743, lng: 72.43501618476016 },\n \"IQ\": { name: \"Iraq\", lat: 33.105075667527906, lng: 43.832529181056884 },\n \"IR\": { name: \"Iran\", lat: 32.906023742890056, lng: 54.237077001065444 },\n \"IS\": { name: \"Iceland\", lat: 65.12360920205514, lng: -19.05682967106099 },\n \"IT\": { name: \"Italy\", lat: 42.98201127614267, lng: 12.763657166123137 },\n \"JE\": { name: \"Jersey\", lat: 49.215396925724306, lng: -2.1291601162653575 },\n \"JM\": { name: \"Jamaica\", lat: 18.12207889341651, lng: -77.30358894542778 },\n \"JO\": { name: \"Jordan\", lat: 31.387064884449156, lng: 36.95728884547246 },\n \"JP\": { name: \"Japan\", lat: 36.76738832597829, lng: 137.46934234351835 },\n \"KE\": { name: \"Kenya\", lat: 0.6899182318376179, lng: 37.95309411262371 },\n \"KG\": { name: \"Kyrgyzstan\", lat: 41.35698905438358, lng: 74.17532903468319 },\n \"KH\": { name: \"Cambodia\", lat: 12.699186865507775, lng: 105.03973078680701 },\n \"KI\": { name: \"Kiribati\", lat: 1.8676673749241066, lng: -157.39024189323504 },\n \"KM\": { name: \"Comoros\", lat: -11.658861474508491, lng: 43.34826587429403 },\n \"KN\": { name: \"Saint Kitts and Nevis\", lat: 17.314736299587768, lng: -62.74560385895787 },\n \"KP\": { name: \"North Korea\", lat: 40.19198091470839, lng: 127.3379805653744 },\n \"KR\": { name: \"South Korea\", lat: 36.402386712544114, lng: 127.76224551357649 },\n \"KW\": { name: \"Kuwait\", lat: 29.281360965443092, lng: 47.56311109320184 },\n \"KY\": { name: \"Cayman Islands\", lat: 19.311231805620288, lng: -81.25203208977878 },\n \"KZ\": { name: \"Kazakhstan\", lat: 47.641465195176835, lng: 66.3759193479301 },\n \"LA\": { name: \"Laos\", lat: 18.117282736873282, lng: 103.76375899026448 },\n \"LB\": { name: \"Lebanon\", lat: 33.91160170722086, lng: 35.89651946324749 },\n \"LC\": { name: \"Saint Lucia\", lat: 13.895749185129906, lng: -60.9689510935251 },\n \"LI\": { name: \"Liechtenstein\", lat: 47.14627562133036, lng: 9.547674672376376 },\n \"LK\": { name: \"Sri Lanka\", lat: 7.696630939329944, lng: 80.66931169770622 },\n \"LR\": { name: \"Liberia\", lat: 6.52012979398834, lng: -9.258988935497618 },\n \"LS\": { name: \"Lesotho\", lat: -29.60168116924817, lng: 28.24475317864227 },\n \"LT\": { name: \"Lithuania\", lat: 55.29437393417175, lng: 23.946021605013534 },\n \"LU\": { name: \"Luxembourg\", lat: 49.77523454542369, lng: 6.103230338458876 },\n \"LV\": { name: \"Latvia\", lat: 56.813853047554154, lng: 24.693671325654403 },\n \"LY\": { name: \"Libya\", lat: 27.202915771690794, lng: 17.91133392454237 },\n \"MA\": { name: \"Morocco\", lat: 28.687598134979325, lng: -8.817212587250811 },\n \"MC\": { name: \"Monaco\", lat: 43.74798224995656, lng: 7.412820873271196 },\n \"MD\": { name: \"Moldova\", lat: 47.0725674580696, lng: 28.391111865941348 },\n \"ME\": { name: \"Montenegro\", lat: 42.73694835210454, lng: 19.29505087156758 },\n \"MF\": { name: \"Saint Martin\", lat: 18.078012113224464, lng: -63.06678525361946 },\n \"MG\": { name: \"Madagascar\", lat: -19.04163612493041, lng: 46.68493466832544 },\n \"MH\": { name: \"Marshall Islands\", lat: 7.307929900994344, lng: 168.72016025351076 },\n \"MK\": { name: \"North Macedonia\", lat: 41.59402890143112, lng: 21.70998923872772 },\n \"ML\": { name: \"Mali\", lat: 17.168146208584837, lng: -4.346399841781153 },\n \"MM\": { name: \"Myanmar\", lat: 19.901227931399873, lng: 97.08892285397344 },\n \"MN\": { name: \"Mongolia\", lat: 47.08644454604851, lng: 103.3987360327455 },\n \"MP\": { name: \"Northern Mariana Islands\", lat: 15.178063516432115, lng: 145.74119737203134 },\n \"MQ\": { name: \"Martinique\", lat: 14.642697353597645, lng: -61.01432380875083 },\n \"MR\": { name: \"Mauritania\", lat: 20.466731212820022, lng: -10.495079045035716 },\n \"MS\": { name: \"Montserrat\", lat: 16.735363391460357, lng: -62.18693281256255 },\n \"MT\": { name: \"Malta\", lat: 35.890522650899314, lng: 14.441922442508494 },\n \"MU\": { name: \"Mauritius\", lat: -20.28142317475198, lng: 57.56415671066546 },\n \"MV\": { name: \"Maldives\", lat: -0.6065577168009924, lng: 73.10076245140479 },\n \"MW\": { name: \"Malawi\", lat: -13.128986464184024, lng: 34.23441182298881 },\n \"MX\": { name: \"Mexico\", lat: 23.87436068093592, lng: -101.55399731630118 },\n \"MY\": { name: \"Malaysia\", lat: 3.6716608556387857, lng: 114.63330303992869 },\n \"MZ\": { name: \"Mozambique\", lat: -17.525230309488748, lng: 35.208577031290176 },\n \"NA\": { name: \"Namibia\", lat: -21.90858163281473, lng: 18.16451345845268 },\n \"NC\": { name: \"New Caledonia\", lat: -21.33003372660827, lng: 165.50767040438612 },\n \"NE\": { name: \"Niger\", lat: 17.08105392407292, lng: 8.86863247002646 },\n \"NF\": { name: \"Norfolk Island\", lat: -29.037654445046282, lng: 167.95259597483337 },\n \"NG\": { name: \"Nigeria\", lat: 9.61029352034213, lng: 8.147714845256194 },\n \"NI\": { name: \"Nicaragua\", lat: 12.893566631930554, lng: -85.016088327669 },\n \"NL\": { name: \"Netherlands\", lat: 52.134054128923886, lng: 5.554136426128487 },\n \"NO\": { name: \"Norway\", lat: 64.97775882947745, lng: 16.670259272390894 },\n \"NP\": { name: \"Nepal\", lat: 28.300920699755657, lng: 84.1338898313567 },\n \"NR\": { name: \"Nauru\", lat: -0.5221021440668993, lng: 166.92937633139178 },\n \"NU\": { name: \"Niue\", lat: -19.05230921680393, lng: -169.86878106699083 },\n \"NZ\": { name: \"New Zealand\", lat: -43.82765432544426, lng: 170.69035541428696 },\n \"OM\": { name: \"Oman\", lat: 20.7242833183209, lng: 55.841088119829 },\n \"PA\": { name: \"Panama\", lat: 8.439536749576892, lng: -80.14428761482796 },\n \"PE\": { name: \"Peru\", lat: -8.522717984240291, lng: -74.11416196781884 },\n \"PF\": { name: \"French Polynesia\", lat: -17.674684080120677, lng: -149.40041671099763 },\n \"PG\": { name: \"Papua New Guinea\", lat: -7.156912819152135, lng: 144.8348942994695 },\n \"PH\": { name: \"Philippines\", lat: 15.586542251094242, lng: 121.82208941416745 },\n \"PK\": { name: \"Pakistan\", lat: 30.116188371410882, lng: 69.08835090769651 },\n \"PL\": { name: \"Poland\", lat: 52.06848055692473, lng: 19.43573279234468 },\n \"PM\": { name: \"Saint Pierre and Miquelon\", lat: 46.95153913615198, lng: -56.32465353437558 },\n \"PN\": { name: \"Pitcairn\", lat: -24.366121747565458, lng: -128.3149848627581 },\n \"PR\": { name: \"Puerto Rico\", lat: 18.216224086610914, lng: -66.49425339593509 },\n \"PS\": { name: \"Palestinian Territory\", lat: 31.930818736453883, lng: 35.24251184154588 },\n \"PT\": { name: \"Portugal\", lat: 39.67529214702138, lng: -7.933662183874006 },\n \"PW\": { name: \"Palau\", lat: 7.534775852547396, lng: 134.57965086721052 },\n \"PY\": { name: \"Paraguay\", lat: -23.42190559259428, lng: -58.38906357428651 },\n \"QA\": { name: \"Qatar\", lat: 25.318528486425386, lng: 51.19794918743203 },\n \"RE\": { name: \"Réunion\", lat: -21.119825460665105, lng: 55.54393506194689 },\n \"RO\": { name: \"Romania\", lat: 45.82454894397586, lng: 25.094158201563292 },\n \"RS\": { name: \"Serbia\", lat: 44.02679870131969, lng: 20.85677444395745 },\n \"RU\": { name: \"Russian Federation\", lat: 59.039434214106194, lng: 98.6704990698032 },\n \"RW\": { name: \"Rwanda\", lat: -2.014687460047154, lng: 29.919439681764082 },\n \"SA\": { name: \"Saudi Arabia\", lat: 24.136038144757897, lng: 44.600958178225596 },\n \"SB\": { name: \"Solomon Islands\", lat: -9.613104734596515, lng: 160.16475795033884 },\n \"SC\": { name: \"Seychelles\", lat: -4.660002318822744, lng: 55.47250789595527 },\n \"SD\": { name: \"Sudan\", lat: 15.67060230984256, lng: 29.951458283594064 },\n \"SE\": { name: \"Sweden\", lat: 62.73420986108448, lng: 17.062431988004956 },\n \"SG\": { name: \"Singapore\", lat: 1.3528251890006349, lng: 103.81025757634053 },\n \"SH\": { name: \"Saint Helena\", lat: -15.962963318340398, lng: -5.717391620813109 },\n \"SI\": { name: \"Slovenia\", lat: 46.13759229564504, lng: 14.890636899973781 },\n \"SJ\": { name: \"Svalbard\", lat: 78.57318936469626, lng: 16.036378851505283 },\n \"SK\": { name: \"Slovakia\", lat: 48.69808390520484, lng: 19.581015362490966 },\n \"SL\": { name: \"Sierra Leone\", lat: 8.561330384750587, lng: -11.78656695731115 },\n \"SM\": { name: \"San Marino\", lat: 43.942820729097896, lng: 12.461278349581722 },\n \"SN\": { name: \"Senegal\", lat: 14.228861491763402, lng: -14.610875368352305 },\n \"SO\": { name: \"Somalia\", lat: 6.524534573103924, lng: 45.40037867243972 },\n \"SR\": { name: \"Suriname\", lat: 4.098723595920171, lng: -55.855514311561286 },\n \"SS\": { name: \"South Sudan\", lat: 7.657782041763295, lng: 30.3851856901788 },\n \"ST\": { name: \"Sao Tome and Principe\", lat: 0.22744704294793774, lng: 6.606158796857607 },\n \"SV\": { name: \"El Salvador\", lat: 13.758041517055418, lng: -88.85911489238985 },\n \"SX\": { name: \"Sint Maarten\", lat: 18.03942608463078, lng: -63.06883135915303 },\n \"SY\": { name: \"Syria\", lat: 35.09751106058316, lng: 38.5117323139514 },\n \"SZ\": { name: \"Eswatini\", lat: -26.562540935608702, lng: 31.510685746082007 },\n \"TC\": { name: \"Turks and Caicos Islands\", lat: 21.799865427483745, lng: -71.74058946811508 },\n \"TD\": { name: \"Chad\", lat: 15.283493546654503, lng: 18.427113900363025 },\n \"TF\": { name: \"Juan De Nova Island\", lat: -17.06449193630804, lng: 42.74374761089645 },\n \"TF\": { name: \"French Southern Territories\", lat: -49.26329687105643, lng: 69.54686984724839 },\n \"TF\": { name: \"Glorioso Islands\", lat: -11.566224871643417, lng: 47.290948081543384 },\n \"TG\": { name: \"Togo\", lat: 8.660743037717811, lng: 0.8990857571109684 },\n \"TH\": { name: \"Thailand\", lat: 13.66222784745538, lng: 101.08675116214552 },\n \"TJ\": { name: \"Tajikistan\", lat: 38.56933138382972, lng: 70.94215281065698 },\n \"TK\": { name: \"Tokelau\", lat: -9.195174767256544, lng: -171.85265950722743 },\n \"TL\": { name: \"Timor-Leste\", lat: -8.809894630601962, lng: 125.95024049562659 },\n \"TM\": { name: \"Turkmenistan\", lat: 39.06069118001429, lng: 58.4577357627054 },\n \"TN\": { name: \"Tunisia\", lat: 34.08636179565723, lng: 9.65587551697984 },\n \"TO\": { name: \"Tonga\", lat: -21.15927212823853, lng: -175.20415878511247 },\n \"TR\": { name: \"Turkey\", lat: 38.93207363123396, lng: 35.56886764076691 },\n \"TT\": { name: \"Trinidad and Tobago\", lat: 10.415515638298093, lng: -61.37236579976247 },\n \"TV\": { name: \"Tuvalu\", lat: -8.514701506447222, lng: 179.217833977593 },\n \"TZ\": { name: \"Tanzania\", lat: -6.355794440041147, lng: 34.81832206060381 },\n \"UA\": { name: \"Ukraine\", lat: 48.657532515563794, lng: 31.27377208442636 },\n \"UG\": { name: \"Uganda\", lat: 1.2821729218416205, lng: 32.34371768463123 },\n \"UM\": { name: \"United States Minor Outlying Islands\", lat: 19.302045812215958, lng: 166.63800339749642 },\n \"US\": { name: \"United States\", lat: 38.8208089190304, lng: -96.33161660829639 },\n \"UY\": { name: \"Uruguay\", lat: -32.78195043831093, lng: -56.01919523458085 },\n \"UZ\": { name: \"Uzbekistan\", lat: 41.4879065244633, lng: 63.8548297593985 },\n \"VA\": { name: \"Vatican City\", lat: 41.90402351316735, lng: 12.451312917026133 },\n \"VC\": { name: \"Saint Vincent and the Grenadines\", lat: 13.254808122970651, lng: -61.193766354393034 },\n \"VE\": { name: \"Venezuela\", lat: 7.148324760507107, lng: -66.36492135985132 },\n \"VG\": { name: \"British Virgin Islands\", lat: 18.42195819619707, lng: -64.62406519257699 },\n \"VI\": { name: \"US Virgin Islands\", lat: 17.738009708772523, lng: -64.76155341409797 },\n \"VN\": { name: \"Vietnam\", lat: 16.517347170839393, lng: 105.91338832758704 },\n \"VU\": { name: \"Vanuatu\", lat: -15.189132121699332, lng: 166.84912735669738 },\n \"WF\": { name: \"Wallis and Futuna\", lat: -14.283442307826677, lng: -178.12735555777184 },\n \"WS\": { name: \"Samoa\", lat: -13.634252953274622, lng: -172.44107655740137 },\n \"YE\": { name: \"Yemen\", lat: 16.001392616307445, lng: 47.46815793206386 },\n \"YT\": { name: \"Mayotte\", lat: -12.824468416301052, lng: 45.128142327031064 },\n \"ZA\": { name: \"South Africa\", lat: -28.55361930679731, lng: 24.75252746489084 },\n \"ZM\": { name: \"Zambia\", lat: -13.162832953186246, lng: 27.75521363430896 },\n \"ZW\": { name: \"Zimbabwe\", lat: -18.92700121981475, lng: 29.717829640720844 },\n};\n\nexport function getCountryCentroid(code) {\n if (!code) return null;\n return COUNTRY_CENTROIDS[code.toUpperCase()] || null;\n}\n\nexport function getCountryCentroids() {\n return COUNTRY_CENTROIDS;\n}","import View from '@core/View.js';\nimport MapLibreView from './MapLibreView.js';\nimport { COUNTRY_CENTROIDS } from './countryCentroids.js';\n\nclass MetricsCountryMapView extends View {\n constructor(options = {}) {\n const mapHeight = options.height || 320;\n super({\n className: 'metrics-country-map-view',\n ...options\n });\n\n this.endpoint = options.endpoint || '/api/metrics/fetch';\n this.account = options.account || 'global';\n this.category = options.category || null;\n this.slugs = options.slugs || null;\n this.granularity = options.granularity || 'days';\n this.maxCountries = options.maxCountries || 12;\n this.metricLabel = options.metricLabel || 'Events';\n this.height = mapHeight;\n this.mapStyle = options.mapStyle || 'dark';\n this.mapOptions = options.mapOptions || {};\n this.showRoutes = options.showRoutes !== false;\n this.routeOrigin = options.routeOrigin || { lng: -77.346, lat: 38.958, name: 'Reston, VA' };\n this._refreshing = false;\n }\n\n async getTemplate() {\n return `\n <div class=\"metrics-country-map\">\n <div class=\"map-container mb-3\" data-container=\"${this.id}-map\" style=\"height:${this.height}px\"></div>\n <div class=\"map-legend small\" data-region=\"legend\"></div>\n </div>\n `;\n }\n\n async onInit() {\n this.statusEl = document.createElement('div');\n this.statusEl.className = 'text-muted small px-3 pb-2';\n this.element.appendChild(this.statusEl);\n\n this.mapView = new MapLibreView({\n containerId: `${this.id}-map`,\n height: this.height,\n style: this.mapStyle,\n zoom: this.mapOptions.zoom ?? 1.3,\n center: this.mapOptions.center || [10, 20],\n pitch: this.mapOptions.pitch ?? 20,\n bearing: this.mapOptions.bearing ?? 0,\n showNavigationControl: this.mapOptions.showNavigationControl ?? true,\n autoFitBounds: this.mapOptions.autoFitBounds ?? false,\n interactive: this.mapOptions.interactive,\n scrollZoom: this.mapOptions.scrollZoom,\n dragPan: this.mapOptions.dragPan,\n doubleClickZoom: this.mapOptions.doubleClickZoom,\n keyboard: this.mapOptions.keyboard,\n touchZoom: this.mapOptions.touchZoom\n });\n this.addChild(this.mapView);\n await this.refresh();\n }\n\n async refresh() {\n if (this._refreshing) return;\n this._refreshing = true;\n this.setStatus('Loading hotspots…');\n try {\n const metrics = await this.fetchMetrics();\n await this.applyMetrics(metrics);\n this.setStatus('');\n } catch (error) {\n console.error('MetricsCountryMapView refresh error', error);\n this.setStatus('Unable to load country metrics.');\n } finally {\n this._refreshing = false;\n }\n }\n\n async fetchMetrics() {\n const rest = this.getApp()?.rest;\n if (!rest) {\n throw new Error('REST client unavailable');\n }\n const params = {\n account: this.account,\n granularity: this.granularity,\n with_labels: true\n };\n if (this.category) params.category = this.category;\n if (this.slugs) {\n const slugsArray = Array.isArray(this.slugs) ? this.slugs : [this.slugs];\n params['slugs[]'] = slugsArray;\n }\n\n const response = await rest.GET(this.endpoint, params);\n if (!response.success || !response.data?.status) {\n throw new Error(response.data?.error || 'Metrics API error');\n }\n return response.data.data;\n }\n\n async applyMetrics(data) {\n const metrics = data?.data || {};\n const labels = data?.labels || [];\n const entries = [];\n\n Object.entries(metrics).forEach(([iso, series]) => {\n const total = series.reduce((sum, value) => sum + (Number(value) || 0), 0);\n if (!total) return;\n const centroid = COUNTRY_CENTROIDS[iso.toUpperCase()];\n if (!centroid) return;\n entries.push({\n code: iso.toUpperCase(),\n total,\n values: series,\n centroid\n });\n });\n\n if (!entries.length) {\n this.mapView.updateMarkers([]);\n this.renderLegend([]);\n this.setStatus('No country data available for the selected range.');\n return;\n }\n\n entries.sort((a, b) => b.total - a.total);\n const topEntries = entries.slice(0, this.maxCountries);\n const maxValue = topEntries[0]?.total || 1;\n\n const markers = topEntries.map(entry => {\n const intensity = entry.total / maxValue;\n const markerSize = Math.round(18 + intensity * 24);\n return {\n lng: entry.centroid.lng,\n lat: entry.centroid.lat,\n size: markerSize,\n color: this.getMarkerColor(intensity),\n popup: `\n <div class=\"text-center\">\n <strong>${entry.centroid.name}</strong><br/>\n <span class=\"text-muted\">${entry.total.toLocaleString()} ${this.metricLabel}</span>\n </div>\n `\n };\n });\n\n if (this.showRoutes && this.routeOrigin?.lng && this.routeOrigin?.lat) {\n markers.push({\n lng: this.routeOrigin.lng,\n lat: this.routeOrigin.lat,\n size: 26,\n color: '#0d6efd',\n icon: 'bi bi-broadcast-pin',\n popup: `\n <div class=\"text-center\">\n <strong>${this.routeOrigin.name || 'Operations Hub'}</strong><br/>\n <span class=\"text-muted\">Origin</span>\n </div>\n `\n });\n }\n\n this.mapView.updateMarkers(markers);\n this.renderLegend(topEntries, labels);\n if (this.showRoutes) {\n this.renderRoutes(topEntries, maxValue);\n }\n }\n\n getMarkerColor(intensity) {\n const start = [32, 201, 151]; // teal\n const end = [255, 193, 7]; // amber\n const mix = start.map((value, idx) =>\n Math.round(value + (end[idx] - value) * intensity)\n );\n return `rgba(${mix[0]}, ${mix[1]}, ${mix[2]}, 0.9)`;\n }\n\n renderLegend(entries) {\n const legendEl = this.element.querySelector('[data-region=\"legend\"]');\n if (!legendEl) return;\n if (!entries.length) {\n legendEl.innerHTML = '';\n return;\n }\n\n const maxValue = entries[0]?.total || 1;\n const rows = entries.map(entry => {\n const percent = ((entry.total / maxValue) * 100).toFixed(0);\n return `\n <div class=\"d-flex justify-content-between align-items-center py-1 border-top\">\n <div>\n <span class=\"fw-semibold\">${entry.centroid.name}</span>\n <span class=\"text-muted ms-1\">(${entry.code})</span>\n </div>\n <div class=\"text-end\">\n <div class=\"fw-semibold\">${entry.total.toLocaleString()}</div>\n <small class=\"text-muted\">${percent}% of top</small>\n </div>\n </div>\n `;\n }).join('');\n\n legendEl.innerHTML = rows;\n }\n\n renderRoutes(entries, maxValue) {\n const origin = this.routeOrigin || null;\n if (!origin || !origin.lng || !origin.lat || !this.mapView) return;\n\n const features = entries.map(entry => ({\n type: 'Feature',\n geometry: {\n type: 'LineString',\n coordinates: [\n [origin.lng, origin.lat],\n [entry.centroid.lng, entry.centroid.lat]\n ]\n },\n properties: {\n total: entry.total,\n intensity: entry.total / maxValue\n }\n }));\n\n const geojson = {\n type: 'FeatureCollection',\n features\n };\n\n const paint = {\n 'line-color': [\n 'interpolate',\n ['linear'],\n ['get', 'intensity'],\n 0,\n 'rgba(32, 201, 151, 0.6)',\n 1,\n 'rgba(255, 193, 7, 0.95)'\n ],\n 'line-width': [\n 'interpolate',\n ['linear'],\n ['get', 'intensity'],\n 0,\n 1.75,\n 1,\n 6\n ],\n 'line-opacity': [\n 'interpolate',\n ['linear'],\n ['get', 'intensity'],\n 0,\n 0.45,\n 1,\n 0.95\n ]\n };\n\n this.mapView.lineSources = this.mapView.lineSources.filter(src => src.id !== `${this.id}-routes`);\n this.mapView.updateLineSource(`${this.id}-routes`, {\n data: geojson,\n paint\n });\n }\n\n setStatus(message) {\n if (!this.statusEl) return;\n this.statusEl.textContent = message || '';\n this.statusEl.style.display = message ? 'block' : 'none';\n }\n\n}\n\nexport default MetricsCountryMapView;\n"],"names":["MapView","View","constructor","options","super","className","this","markers","center","zoom","height","showZoomControl","tileLayer","showLeafletBranding","showLayerControl","layerOptions","osm","satellite","terrain","dark","light","watercolor","bw","streets","interactive","scrollZoom","dragPan","doubleClickZoom","keyboard","touchZoom","map","leafletMarkers","_tileLayer","template","onAfterRender","loadLeaflet","initializeMap","window","L","cssLoaded","Promise","resolve","link","document","createElement","rel","href","onload","onerror","head","appendChild","jsLoaded","reject","script","src","all","getTileLayerUrl","tileLayers","url","attribution","maxZoom","mapElement","element","querySelector","id","mapCenter","length","lat","lng","zoomControl","scrollWheelZoom","dragging","boxZoom","tap","attributionControl","setPrefix","e","tileConfig","addTo","container","parentElement","style","position","selector","top","right","zIndex","maxWidth","setAttribute","Object","entries","forEach","key","label","opt","value","textContent","selected","addEventListener","setTileLayer","addMarkers","fitBounds","setTimeout","invalidateSize","Array","isArray","markerData","popup","icon","markerOptions","marker","bindPopup","push","group","featureGroup","getBounds","pad","updateMarkers","newMarkers","clearMarkers","setView","removeLayer","setZoom","original","onBeforeDestroy","remove","showAsDialog","view","dialogOptions","title","header","body","size","centered","init","getApp","showDialog","MapLibreView","pitch","bearing","mapStyle","showNavigationControl","autoFitBounds","mapMarkers","pendingMarkers","lineSources","pendingLineData","Map","loadMapLibre","maplibregl","getMapStyle","styles","version","sources","type","tiles","tileSize","layers","source","glyphs","touchZoomRotate","addControl","NavigationControl","on","initialMarkers","addLineSource","clear","color","el","markerSize","Number","width","borderRadius","backgroundColor","border","boxShadow","cursor","display","alignItems","justifyContent","innerHTML","Marker","setLngLat","mapPopup","Popup","offset","setHTML","setPopup","bounds","LngLatBounds","extend","padding","flyTo","data","paint","layout","sourceId","getLayer","getSource","removeSource","addSource","addLayer","set","updateLineSource","setData","setPaintProperty","setLayoutProperty","setPitch","setBearing","COUNTRY_CENTROIDS","AD","name","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW","MetricsCountryMapView","mapHeight","endpoint","account","category","slugs","granularity","maxCountries","metricLabel","mapOptions","showRoutes","routeOrigin","_refreshing","getTemplate","onInit","statusEl","mapView","containerId","addChild","refresh","setStatus","metrics","fetchMetrics","applyMetrics","error","console","rest","Error","params","with_labels","slugsArray","response","GET","success","status","labels","iso","series","total","reduce","sum","centroid","toUpperCase","code","values","renderLegend","sort","a","b","topEntries","slice","maxValue","entry","intensity","Math","round","getMarkerColor","toLocaleString","renderRoutes","end","mix","idx","legendEl","rows","percent","toFixed","join","origin","geojson","features","geometry","coordinates","properties","filter","message"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const a=require("./View-CPWwS19u.js");class MapView extends a.View{constructor(a={}){super({className:"map-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.showZoomControl=!1!==a.showZoomControl,this.tileLayer=a.tileLayer||"osm",this.showLeafletBranding=!0===a.showLeafletBranding,this.showLayerControl=!0===a.showLayerControl,this.layerOptions=a.layerOptions||{osm:"OSM",satellite:"Satellite",terrain:"Terrain",dark:"Dark",light:"Light",watercolor:"Watercolor",bw:"B/W",streets:"Streets"};const t=!1!==a.interactive;this.interactive=t,this.scrollZoom=void 0!==a.scrollZoom?!!a.scrollZoom:t,this.dragPan=void 0!==a.dragPan?!!a.dragPan:t,this.doubleClickZoom=void 0!==a.doubleClickZoom?!!a.doubleClickZoom:t,this.keyboard=void 0!==a.keyboard?!!a.keyboard:t,this.touchZoom=void 0!==a.touchZoom?!!a.touchZoom:t,this.map=null,this.leafletMarkers=[],this._tileLayer=null,this.template='\n <div class="map-container">\n <div id="map-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadLeaflet(),await this.initializeMap()}async loadLeaflet(){if(window.L)return;const a=new Promise(a=>{const t=document.createElement("link");t.rel="stylesheet",t.href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css",t.onload=a,t.onerror=a,document.head.appendChild(t)}),t=new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js",e.onload=a,e.onerror=t,document.head.appendChild(e)});await Promise.all([a,t])}getTileLayerUrl(){const a={osm:{url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",attribution:"© OpenStreetMap contributors",maxZoom:19},satellite:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attribution:"© Esri",maxZoom:19},terrain:{url:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",attribution:"© OpenTopoMap contributors",maxZoom:17},dark:{url:"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},light:{url:"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},watercolor:{url:"https://tiles.stadiamaps.com/tiles/stamen_watercolor/{z}/{x}/{y}.jpg",attribution:"© Stadia Maps © Stamen Design © OpenStreetMap contributors",maxZoom:16},bw:{url:"https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20},streets:{url:"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png",attribution:"© OpenStreetMap contributors © CARTO",maxZoom:20}};return a[this.tileLayer]||a.osm}async initializeMap(){const a=this.element.querySelector(`#map-${this.id}`);if(!a||!window.L)return;let t=this.center;if(!t&&this.markers.length>0&&(t=[this.markers[0].lat,this.markers[0].lng]),t||(t=[0,0]),this.map=window.L.map(a,{center:t,zoom:this.zoom,zoomControl:this.showZoomControl,scrollWheelZoom:this.scrollZoom,dragging:this.dragPan,doubleClickZoom:this.doubleClickZoom,keyboard:this.keyboard,touchZoom:this.touchZoom,boxZoom:this.interactive,tap:this.interactive}),this.map&&this.map.attributionControl&&!1===this.showLeafletBranding)try{this.map.attributionControl.setPrefix("")}catch(n){}const e=this.getTileLayerUrl();if(this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.showLayerControl){const t=a.parentElement||this.element.querySelector(".map-container");if(t){t.style.position=t.style.position||"relative";const a=document.createElement("select");a.className="form-select form-select-sm",a.style.position="absolute",a.style.top="8px",a.style.right="8px",a.style.zIndex="1000",a.style.maxWidth="180px",a.setAttribute("aria-label","Map tile layer"),Object.entries(this.layerOptions||{}).forEach(([t,e])=>{const n=document.createElement("option");n.value=t,n.textContent=e,t===this.tileLayer&&(n.selected=!0),a.appendChild(n)}),a.addEventListener("change",()=>this.setTileLayer(a.value)),t.appendChild(a)}}this.addMarkers(this.markers),this.markers.length>1&&this.fitBounds(),setTimeout(()=>{this.map&&this.map.invalidateSize()},300)}addMarkers(a){this.map&&Array.isArray(a)&&a.forEach(a=>{const{lat:t,lng:e,popup:n,icon:i}=a;if(!t||!e)return;const l={};i&&(l.icon=window.L.icon(i));const s=window.L.marker([t,e],l).addTo(this.map);n&&s.bindPopup(n),this.leafletMarkers.push(s)})}fitBounds(){if(!this.map||0===this.leafletMarkers.length)return;const a=new window.L.featureGroup(this.leafletMarkers);this.map.fitBounds(a.getBounds().pad(.1))}updateMarkers(a){this.clearMarkers(),this.markers=a,this.addMarkers(a),a.length>1?this.fitBounds():1===a.length&&this.map.setView([a[0].lat,a[0].lng],this.zoom)}clearMarkers(){this.leafletMarkers.forEach(a=>{this.map.removeLayer(a)}),this.leafletMarkers=[]}setView(a,t,e=null){this.map&&this.map.setView([a,t],e||this.zoom)}setZoom(a){this.map&&this.map.setZoom(a)}setTileLayer(a){if(!this.map)return;const t=this.tileLayer;this.tileLayer=a||this.tileLayer;const e=this.getTileLayerUrl();try{this._tileLayer&&this.map.removeLayer(this._tileLayer)}catch(n){}this._tileLayer=window.L.tileLayer(e.url,{attribution:e.attribution,maxZoom:e.maxZoom}).addTo(this.map),this.tileLayer=a||t,setTimeout(()=>{try{this.map.invalidateSize()}catch(n){}},150)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}static async showAsDialog(a={}){const t=new MapView(a),e={title:"Map View",header:!0,body:t,size:"lg",centered:!1,...a.dialogOptions||{}};await t.init(),await t.getApp().showDialog(e)}}const t=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,default:MapView},Symbol.toStringTag,{value:"Module"}));class MapLibreView extends a.View{constructor(a={}){super({className:"maplibre-view",...a}),this.markers=a.markers||[],this.center=a.center||null,this.zoom=a.zoom||13,this.height=a.height||400,this.pitch=a.pitch||0,this.bearing=a.bearing||0,this.mapStyle=a.style||"streets",this.showNavigationControl=!1!==a.showNavigationControl,this.autoFitBounds=!1!==a.autoFitBounds;const t=!1!==a.interactive;this.interactive=t,this.scrollZoom=void 0!==a.scrollZoom?!!a.scrollZoom:t,this.dragPan=void 0!==a.dragPan?!!a.dragPan:t,this.doubleClickZoom=void 0!==a.doubleClickZoom?!!a.doubleClickZoom:t,this.keyboard=void 0!==a.keyboard?!!a.keyboard:t,this.touchZoom=void 0!==a.touchZoom?!!a.touchZoom:t,this.map=null,this.mapMarkers=[],this.pendingMarkers=[...this.markers],this.lineSources=a.lineSources||[],this.pendingLineData=/* @__PURE__ */new Map,this.template='\n <div class="maplibre-container">\n <div id="maplibre-{{id}}" style="height: {{height}}px; width: 100%; border-radius: 0.375rem; border: 1px solid #dee2e6;"></div>\n </div>\n '}async onAfterRender(){await this.loadMapLibre(),await this.initializeMap()}async loadMapLibre(){if(window.maplibregl)return;const a=document.createElement("link");return a.rel="stylesheet",a.href="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.css",document.head.appendChild(a),new Promise((a,t)=>{const e=document.createElement("script");e.src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js",e.onload=a,e.onerror=t,document.head.appendChild(e)})}getMapStyle(){const a={streets:"https://demotiles.maplibre.org/style.json",dark:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},light:{version:8,sources:{osm:{type:"raster",tiles:["https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenStreetMap contributors"}},layers:[{id:"osm",type:"raster",source:"osm"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},satellite:{version:8,sources:{satellite:{type:"raster",tiles:["https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"],tileSize:256,attribution:"© Esri"}},layers:[{id:"satellite",type:"raster",source:"satellite"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"},terrain:{version:8,sources:{terrain:{type:"raster",tiles:["https://a.tile.opentopomap.org/{z}/{x}/{y}.png"],tileSize:256,attribution:"© OpenTopoMap contributors"}},layers:[{id:"terrain",type:"raster",source:"terrain"}],glyphs:"https://demotiles.maplibre.org/font/{fontstack}/{range}.pbf"}};return a[this.mapStyle]||a.streets}async initializeMap(){const a=this.element.querySelector(`#maplibre-${this.id}`);if(!a||!window.maplibregl)return;let t=this.center;!t&&this.markers.length>0&&(t=[this.markers[0].lng,this.markers[0].lat]),t||(t=[0,0]),this.map=new window.maplibregl.Map({container:a,style:this.getMapStyle(),center:t,zoom:this.zoom,pitch:this.pitch,bearing:this.bearing,interactive:this.interactive,scrollZoom:this.scrollZoom,dragPan:this.dragPan,doubleClickZoom:this.doubleClickZoom,keyboard:this.keyboard,touchZoomRotate:this.touchZoom}),this.showNavigationControl&&this.map.addControl(new window.maplibregl.NavigationControl,"top-right"),this.map.on("load",()=>{const a=this.pendingMarkers.length?this.pendingMarkers:this.markers;this.updateMarkers(a),this.lineSources.forEach(a=>this.addLineSource(a)),this.pendingLineData.forEach(a=>this.addLineSource(a)),this.pendingLineData.clear()})}addMarkers(a){this.map&&Array.isArray(a)?a.forEach(a=>{const{lng:t,lat:e,popup:n,color:i,icon:l,size:s}=a;if(!t||!e)return;const r=document.createElement("div");r.className="maplibre-marker";const o=Number(s)||30;r.style.width=`${o}px`,r.style.height=`${o}px`,r.style.borderRadius="50%",r.style.backgroundColor=i||"#3b82f6",r.style.border="3px solid white",r.style.boxShadow="0 2px 4px rgba(0,0,0,0.3)",r.style.cursor="pointer",r.style.display="flex",r.style.alignItems="center",r.style.justifyContent="center",l&&(r.innerHTML=`<i class="${l}" style="color: white;"></i>`);const m=new window.maplibregl.Marker({element:r}).setLngLat([t,e]).addTo(this.map);if(n){const a=new window.maplibregl.Popup({offset:25}).setHTML(n);m.setPopup(a)}this.mapMarkers.push(m)}):this.pendingMarkers=Array.isArray(a)?a:[]}fitBounds(){if(!this.map||0===this.markers.length)return;const a=new window.maplibregl.LngLatBounds;this.markers.forEach(t=>{a.extend([t.lng,t.lat])}),this.map.fitBounds(a,{padding:50,maxZoom:15})}updateMarkers(a){const t=Array.isArray(a)?a:[];this.markers=t,this.pendingMarkers=t,this.map&&(this.clearMarkers(),this.addMarkers(t),this.autoFitBounds&&t.length>1?this.fitBounds():1===t.length&&this.map&&this.map.flyTo({center:[t[0].lng,t[0].lat],zoom:this.zoom}))}clearMarkers(){this.mapMarkers.forEach(a=>{a.remove()}),this.mapMarkers=[]}addLineSource({id:a,data:t,paint:e,layout:n}){if(!a||!t)return;const i=`${a}-source`;this.map?(this.map.getLayer(a)&&this.map.removeLayer(a),this.map.getSource(i)&&this.map.removeSource(i),this.map.addSource(i,{type:"geojson",data:t}),this.map.addLayer({id:a,type:"line",source:i,paint:{"line-color":"#3b82f6","line-width":2,"line-opacity":.6,...e},layout:{"line-cap":"round","line-join":"round",...n}})):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}updateLineSource(a,{data:t,paint:e,layout:n}={}){if(!a||!t)return;const i=`${a}-source`;this.map?this.map.getSource(i)?(this.map.getSource(i).setData(t),(e||n)&&(e&&Object.entries(e).forEach(([t,e])=>{this.map.setPaintProperty(a,t,e)}),n&&Object.entries(n).forEach(([t,e])=>{this.map.setLayoutProperty(a,t,e)}))):this.addLineSource({id:a,data:t,paint:e,layout:n}):this.pendingLineData.set(a,{id:a,data:t,paint:e,layout:n})}setView(a,t,e=null){this.map&&this.map.flyTo({center:[a,t],zoom:e||this.zoom})}setZoom(a){this.map&&this.map.setZoom(a)}setPitch(a){this.map&&this.map.setPitch(a)}setBearing(a){this.map&&this.map.setBearing(a)}async onBeforeDestroy(){this.map&&(this.map.remove(),this.map=null),await super.onBeforeDestroy()}}const e=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,default:MapLibreView},Symbol.toStringTag,{value:"Module"})),n={AD:{name:"Andorra",lat:42.54859834854764,lng:1.5802243611232873},AE:{name:"United Arab Emirates",lat:24.18250292309135,lng:54.27920525789581},AF:{name:"Afghanistan",lat:34.13402601376932,lng:66.59216131095278},AG:{name:"Antigua and Barbuda",lat:17.07146759372967,lng:-61.78530823226373},AI:{name:"Anguilla",lat:18.222874004219086,lng:-63.06008343771806},AL:{name:"Albania",lat:41.14165894891656,lng:20.061082767269493},AM:{name:"Armenia",lat:40.17841274230679,lng:45.05490831965259},AO:{name:"Angola",lat:-12.167424062667942,lng:17.651768783079},AQ:{name:"Antarctica",lat:-77.16987521415838,lng:-177.56451613408842},AR:{name:"Argentina",lat:-35.697270518120085,lng:-64.53238503843076},AS:{name:"American Samoa",lat:-14.305711987770538,lng:-170.7007316174498},AT:{name:"Austria",lat:47.631858269895794,lng:13.797778364631036},AU:{name:"Australia",lat:-25.697337673983082,lng:134.02277170916162},AW:{name:"Aruba",lat:12.515625722992898,lng:-69.97564014284046},AZ:{name:"Azerbaijan",lat:40.3920509942049,lng:48.634592670644324},BA:{name:"Bosnia and Herzegovina",lat:44.14415356126429,lng:17.83467240787538},BB:{name:"Barbados",lat:13.183219369337529,lng:-59.557383949150285},BD:{name:"Bangladesh",lat:23.673728665121,lng:90.43212562608613},BE:{name:"Belgium",lat:50.6182138854095,lng:4.675010154696485},BF:{name:"Burkina Faso",lat:12.108709036312737,lng:-1.6932816211842325},BG:{name:"Bulgaria",lat:42.82043677302438,lng:25.251739122561908},BH:{name:"Bahrain",lat:26.04798501537066,lng:50.540695402276775},BI:{name:"Burundi",lat:-3.261251993278643,lng:29.88518227845293},BJ:{name:"Benin",lat:9.503013199615893,lng:2.305714528830206},BL:{name:"Saint Barthelemy",lat:17.90561691241738,lng:-62.83051610005156},BM:{name:"Bermuda",lat:32.315067430740726,lng:-64.7458500599169},BN:{name:"Brunei Darussalam",lat:4.543205889917609,lng:114.6430958360464},BO:{name:"Bolivia",lat:-16.7312488393574,lng:-64.45209597511206},BQ:{name:"Bonaire",lat:12.180844982440338,lng:-68.29350445958761},BQ:{name:"Saba",lat:17.632512616389718,lng:-63.23739481909494},BQ:{name:"Saint Eustatius",lat:17.4919042294197,lng:-62.978230589445026},BR:{name:"Brazil",lat:-11.524630416426652,lng:-54.355206608256424},BS:{name:"Bahamas",lat:24.72162633646784,lng:-78.07275370060313},BT:{name:"Bhutan",lat:27.42163933959824,lng:90.46716647173861},BV:{name:"Bouvet Island",lat:-54.42316679395248,lng:3.411969465057627},BW:{name:"Botswana",lat:-22.236609002062902,lng:23.85779956995608},BY:{name:"Belarus",lat:53.46791374543163,lng:27.964252054715104},BZ:{name:"Belize",lat:17.24252476647155,lng:-88.68273510023441},CA:{name:"Canada",lat:57.550480044655636,lng:-98.41680517868062},CC:{name:"Cocos Islands",lat:-12.171249450199545,lng:96.83688767323002},CD:{name:"Congo DRC",lat:-3.338629596207896,lng:23.419827574282188},CF:{name:"Central African Republic",lat:6.331390033944319,lng:20.520743419397256},CG:{name:"Congo",lat:-.7294391595233845,lng:14.879732849491393},CH:{name:"Switzerland",lat:46.73678128684938,lng:8.286928794895285},CI:{name:"Côte d'Ivoire",lat:7.536779279421307,lng:-5.571710194917734},CK:{name:"Cook Islands",lat:-21.222613253399842,lng:-159.78768870952257},CL:{name:"Chile",lat:-37.82938283049967,lng:-70.76863431739216},CM:{name:"Cameroon",lat:6.294168487480992,lng:12.948474142398263},CN:{name:"China",lat:38.07325481105728,lng:104.69113855849604},CO:{name:"Colombia",lat:4.187753877352739,lng:-72.6445066243485},CR:{name:"Costa Rica",lat:9.863467407406214,lng:-84.14673625701816},CU:{name:"Cuba",lat:21.476176522869448,lng:-79.69817857618705},CV:{name:"Cabo Verde",lat:15.076411518651643,lng:-23.63401005900474},CW:{name:"Curacao",lat:12.199996647939832,lng:-68.96939768599042},CX:{name:"Christmas Island",lat:-10.446440802183416,lng:105.70209512200549},CY:{name:"Cyprus",lat:35.11700416345239,lng:33.375346009199205},CZ:{name:"Czech Republic",lat:49.74917370930982,lng:15.383273292023533},DE:{name:"Germany",lat:51.08304539800482,lng:10.426171427430804},DJ:{name:"Djibouti",lat:11.750235727618804,lng:42.613496898789506},DK:{name:"Denmark",lat:56.00118817971057,lng:9.378670542409406},DM:{name:"Dominica",lat:15.429269860940513,lng:-61.360471946942994},DO:{name:"Dominican Republic",lat:18.77954818522993,lng:-70.43495198520012},DZ:{name:"Algeria",lat:28.350969744889056,lng:2.6558464719769135},EC:{name:"Ecuador",lat:-1.5642721388853116,lng:-78.4630326109714},EE:{name:"Estonia",lat:58.648108311231034,lng:25.916870250633806},EG:{name:"Egypt",lat:26.60517034450628,lng:30.240135435012338},ER:{name:"Eritrea",lat:15.005533147667684,lng:39.2672401449901},ES:{name:"Spain",lat:40.365008336683836,lng:-3.6516251409956983},ES:{name:"Canarias",lat:28.297665106525546,lng:-16.53799441021647},ET:{name:"Ethiopia",lat:8.729389557048396,lng:39.914902886544276},FI:{name:"Finland",lat:65.01578959749911,lng:25.65738433454702},FJ:{name:"Fiji",lat:-17.822470952336204,lng:177.98144613732626},FK:{name:"Falkland Islands",lat:-51.75901312766726,lng:-58.746646363799854},FM:{name:"Micronesia",lat:6.8789448129255435,lng:158.2291899444527},FO:{name:"Faroe Islands",lat:62.130896281495346,lng:-6.9811060913122835},FR:{name:"France",lat:46.6423682169416,lng:2.1940236627886227},GA:{name:"Gabon",lat:-.628448459921234,lng:11.839410898545754},GB:{name:"United Kingdom",lat:53.97844735080214,lng:-2.852943909329258},GD:{name:"Grenada",lat:12.112926656338907,lng:-61.67937937204098},GE:{name:"Georgia",lat:42.17986277737226,lng:43.378866534112234},GF:{name:"French Guiana",lat:3.857429742497078,lng:-53.32232307156624},GG:{name:"Guernsey",lat:49.45870771378872,lng:-2.576392582891568},GH:{name:"Ghana",lat:7.94530467243628,lng:-1.219233362526581},GI:{name:"Gibraltar",lat:36.14022671336082,lng:-5.345549484594358},GL:{name:"Greenland",lat:74.16847218965994,lng:-42.07567788066985},GM:{name:"Gambia",lat:13.428617959189328,lng:-15.383380385869662},GN:{name:"Guinea",lat:10.255986541378112,lng:-10.986948848040218},GP:{name:"Guadeloupe",lat:16.24420002705553,lng:-61.54382262282755},GQ:{name:"Equatorial Guinea",lat:1.5954643936590733,lng:10.425456672353823},GR:{name:"Greece",lat:39.42012261727978,lng:23.110368936161876},GS:{name:"South Georgia and South Sandwich Islands",lat:-54.37666443862139,lng:-36.77509575898928},GT:{name:"Guatemala",lat:15.820878515352684,lng:-90.31219349119617},GU:{name:"Guam",lat:13.445430479945276,lng:144.78024458298802},GW:{name:"Guinea-Bissau",lat:11.980075324820504,lng:-14.980186756910847},GY:{name:"Guyana",lat:4.68211981385056,lng:-58.91352612754667},HM:{name:"Heard Island and McDonald Islands",lat:-53.084170035513736,lng:73.49298560844045},HN:{name:"Honduras",lat:14.740370695750006,lng:-86.49251679006962},HR:{name:"Croatia",lat:44.91192100856702,lng:16.625761129583374},HT:{name:"Haiti",lat:18.883520486983567,lng:-72.89291379842},HU:{name:"Hungary",lat:47.22527332486294,lng:19.39620048366142},ID:{name:"Indonesia",lat:.15591979959037652,lng:113.96538246847302},IE:{name:"Ireland",lat:53.30489539816495,lng:-8.241128545554096},IL:{name:"Israel",lat:31.513542220043195,lng:35.027923472437024},IM:{name:"Isle of Man",lat:54.22855301008011,lng:-4.532995055468449},IN:{name:"India",lat:23.586300567746722,lng:81.17300408530181},IO:{name:"British Indian Ocean Territory",lat:-7.323548444385743,lng:72.43501618476016},IQ:{name:"Iraq",lat:33.105075667527906,lng:43.832529181056884},IR:{name:"Iran",lat:32.906023742890056,lng:54.237077001065444},IS:{name:"Iceland",lat:65.12360920205514,lng:-19.05682967106099},IT:{name:"Italy",lat:42.98201127614267,lng:12.763657166123137},JE:{name:"Jersey",lat:49.215396925724306,lng:-2.1291601162653575},JM:{name:"Jamaica",lat:18.12207889341651,lng:-77.30358894542778},JO:{name:"Jordan",lat:31.387064884449156,lng:36.95728884547246},JP:{name:"Japan",lat:36.76738832597829,lng:137.46934234351835},KE:{name:"Kenya",lat:.6899182318376179,lng:37.95309411262371},KG:{name:"Kyrgyzstan",lat:41.35698905438358,lng:74.17532903468319},KH:{name:"Cambodia",lat:12.699186865507775,lng:105.03973078680701},KI:{name:"Kiribati",lat:1.8676673749241066,lng:-157.39024189323504},KM:{name:"Comoros",lat:-11.658861474508491,lng:43.34826587429403},KN:{name:"Saint Kitts and Nevis",lat:17.314736299587768,lng:-62.74560385895787},KP:{name:"North Korea",lat:40.19198091470839,lng:127.3379805653744},KR:{name:"South Korea",lat:36.402386712544114,lng:127.76224551357649},KW:{name:"Kuwait",lat:29.281360965443092,lng:47.56311109320184},KY:{name:"Cayman Islands",lat:19.311231805620288,lng:-81.25203208977878},KZ:{name:"Kazakhstan",lat:47.641465195176835,lng:66.3759193479301},LA:{name:"Laos",lat:18.117282736873282,lng:103.76375899026448},LB:{name:"Lebanon",lat:33.91160170722086,lng:35.89651946324749},LC:{name:"Saint Lucia",lat:13.895749185129906,lng:-60.9689510935251},LI:{name:"Liechtenstein",lat:47.14627562133036,lng:9.547674672376376},LK:{name:"Sri Lanka",lat:7.696630939329944,lng:80.66931169770622},LR:{name:"Liberia",lat:6.52012979398834,lng:-9.258988935497618},LS:{name:"Lesotho",lat:-29.60168116924817,lng:28.24475317864227},LT:{name:"Lithuania",lat:55.29437393417175,lng:23.946021605013534},LU:{name:"Luxembourg",lat:49.77523454542369,lng:6.103230338458876},LV:{name:"Latvia",lat:56.813853047554154,lng:24.693671325654403},LY:{name:"Libya",lat:27.202915771690794,lng:17.91133392454237},MA:{name:"Morocco",lat:28.687598134979325,lng:-8.817212587250811},MC:{name:"Monaco",lat:43.74798224995656,lng:7.412820873271196},MD:{name:"Moldova",lat:47.0725674580696,lng:28.391111865941348},ME:{name:"Montenegro",lat:42.73694835210454,lng:19.29505087156758},MF:{name:"Saint Martin",lat:18.078012113224464,lng:-63.06678525361946},MG:{name:"Madagascar",lat:-19.04163612493041,lng:46.68493466832544},MH:{name:"Marshall Islands",lat:7.307929900994344,lng:168.72016025351076},MK:{name:"North Macedonia",lat:41.59402890143112,lng:21.70998923872772},ML:{name:"Mali",lat:17.168146208584837,lng:-4.346399841781153},MM:{name:"Myanmar",lat:19.901227931399873,lng:97.08892285397344},MN:{name:"Mongolia",lat:47.08644454604851,lng:103.3987360327455},MP:{name:"Northern Mariana Islands",lat:15.178063516432115,lng:145.74119737203134},MQ:{name:"Martinique",lat:14.642697353597645,lng:-61.01432380875083},MR:{name:"Mauritania",lat:20.466731212820022,lng:-10.495079045035716},MS:{name:"Montserrat",lat:16.735363391460357,lng:-62.18693281256255},MT:{name:"Malta",lat:35.890522650899314,lng:14.441922442508494},MU:{name:"Mauritius",lat:-20.28142317475198,lng:57.56415671066546},MV:{name:"Maldives",lat:-.6065577168009924,lng:73.10076245140479},MW:{name:"Malawi",lat:-13.128986464184024,lng:34.23441182298881},MX:{name:"Mexico",lat:23.87436068093592,lng:-101.55399731630118},MY:{name:"Malaysia",lat:3.6716608556387857,lng:114.63330303992869},MZ:{name:"Mozambique",lat:-17.525230309488748,lng:35.208577031290176},NA:{name:"Namibia",lat:-21.90858163281473,lng:18.16451345845268},NC:{name:"New Caledonia",lat:-21.33003372660827,lng:165.50767040438612},NE:{name:"Niger",lat:17.08105392407292,lng:8.86863247002646},NF:{name:"Norfolk Island",lat:-29.037654445046282,lng:167.95259597483337},NG:{name:"Nigeria",lat:9.61029352034213,lng:8.147714845256194},NI:{name:"Nicaragua",lat:12.893566631930554,lng:-85.016088327669},NL:{name:"Netherlands",lat:52.134054128923886,lng:5.554136426128487},NO:{name:"Norway",lat:64.97775882947745,lng:16.670259272390894},NP:{name:"Nepal",lat:28.300920699755657,lng:84.1338898313567},NR:{name:"Nauru",lat:-.5221021440668993,lng:166.92937633139178},NU:{name:"Niue",lat:-19.05230921680393,lng:-169.86878106699083},NZ:{name:"New Zealand",lat:-43.82765432544426,lng:170.69035541428696},OM:{name:"Oman",lat:20.7242833183209,lng:55.841088119829},PA:{name:"Panama",lat:8.439536749576892,lng:-80.14428761482796},PE:{name:"Peru",lat:-8.522717984240291,lng:-74.11416196781884},PF:{name:"French Polynesia",lat:-17.674684080120677,lng:-149.40041671099763},PG:{name:"Papua New Guinea",lat:-7.156912819152135,lng:144.8348942994695},PH:{name:"Philippines",lat:15.586542251094242,lng:121.82208941416745},PK:{name:"Pakistan",lat:30.116188371410882,lng:69.08835090769651},PL:{name:"Poland",lat:52.06848055692473,lng:19.43573279234468},PM:{name:"Saint Pierre and Miquelon",lat:46.95153913615198,lng:-56.32465353437558},PN:{name:"Pitcairn",lat:-24.366121747565458,lng:-128.3149848627581},PR:{name:"Puerto Rico",lat:18.216224086610914,lng:-66.49425339593509},PS:{name:"Palestinian Territory",lat:31.930818736453883,lng:35.24251184154588},PT:{name:"Portugal",lat:39.67529214702138,lng:-7.933662183874006},PW:{name:"Palau",lat:7.534775852547396,lng:134.57965086721052},PY:{name:"Paraguay",lat:-23.42190559259428,lng:-58.38906357428651},QA:{name:"Qatar",lat:25.318528486425386,lng:51.19794918743203},RE:{name:"Réunion",lat:-21.119825460665105,lng:55.54393506194689},RO:{name:"Romania",lat:45.82454894397586,lng:25.094158201563292},RS:{name:"Serbia",lat:44.02679870131969,lng:20.85677444395745},RU:{name:"Russian Federation",lat:59.039434214106194,lng:98.6704990698032},RW:{name:"Rwanda",lat:-2.014687460047154,lng:29.919439681764082},SA:{name:"Saudi Arabia",lat:24.136038144757897,lng:44.600958178225596},SB:{name:"Solomon Islands",lat:-9.613104734596515,lng:160.16475795033884},SC:{name:"Seychelles",lat:-4.660002318822744,lng:55.47250789595527},SD:{name:"Sudan",lat:15.67060230984256,lng:29.951458283594064},SE:{name:"Sweden",lat:62.73420986108448,lng:17.062431988004956},SG:{name:"Singapore",lat:1.3528251890006349,lng:103.81025757634053},SH:{name:"Saint Helena",lat:-15.962963318340398,lng:-5.717391620813109},SI:{name:"Slovenia",lat:46.13759229564504,lng:14.890636899973781},SJ:{name:"Svalbard",lat:78.57318936469626,lng:16.036378851505283},SK:{name:"Slovakia",lat:48.69808390520484,lng:19.581015362490966},SL:{name:"Sierra Leone",lat:8.561330384750587,lng:-11.78656695731115},SM:{name:"San Marino",lat:43.942820729097896,lng:12.461278349581722},SN:{name:"Senegal",lat:14.228861491763402,lng:-14.610875368352305},SO:{name:"Somalia",lat:6.524534573103924,lng:45.40037867243972},SR:{name:"Suriname",lat:4.098723595920171,lng:-55.855514311561286},SS:{name:"South Sudan",lat:7.657782041763295,lng:30.3851856901788},ST:{name:"Sao Tome and Principe",lat:.22744704294793774,lng:6.606158796857607},SV:{name:"El Salvador",lat:13.758041517055418,lng:-88.85911489238985},SX:{name:"Sint Maarten",lat:18.03942608463078,lng:-63.06883135915303},SY:{name:"Syria",lat:35.09751106058316,lng:38.5117323139514},SZ:{name:"Eswatini",lat:-26.562540935608702,lng:31.510685746082007},TC:{name:"Turks and Caicos Islands",lat:21.799865427483745,lng:-71.74058946811508},TD:{name:"Chad",lat:15.283493546654503,lng:18.427113900363025},TF:{name:"Juan De Nova Island",lat:-17.06449193630804,lng:42.74374761089645},TF:{name:"French Southern Territories",lat:-49.26329687105643,lng:69.54686984724839},TF:{name:"Glorioso Islands",lat:-11.566224871643417,lng:47.290948081543384},TG:{name:"Togo",lat:8.660743037717811,lng:.8990857571109684},TH:{name:"Thailand",lat:13.66222784745538,lng:101.08675116214552},TJ:{name:"Tajikistan",lat:38.56933138382972,lng:70.94215281065698},TK:{name:"Tokelau",lat:-9.195174767256544,lng:-171.85265950722743},TL:{name:"Timor-Leste",lat:-8.809894630601962,lng:125.95024049562659},TM:{name:"Turkmenistan",lat:39.06069118001429,lng:58.4577357627054},TN:{name:"Tunisia",lat:34.08636179565723,lng:9.65587551697984},TO:{name:"Tonga",lat:-21.15927212823853,lng:-175.20415878511247},TR:{name:"Turkey",lat:38.93207363123396,lng:35.56886764076691},TT:{name:"Trinidad and Tobago",lat:10.415515638298093,lng:-61.37236579976247},TV:{name:"Tuvalu",lat:-8.514701506447222,lng:179.217833977593},TZ:{name:"Tanzania",lat:-6.355794440041147,lng:34.81832206060381},UA:{name:"Ukraine",lat:48.657532515563794,lng:31.27377208442636},UG:{name:"Uganda",lat:1.2821729218416205,lng:32.34371768463123},UM:{name:"United States Minor Outlying Islands",lat:19.302045812215958,lng:166.63800339749642},US:{name:"United States",lat:38.8208089190304,lng:-96.33161660829639},UY:{name:"Uruguay",lat:-32.78195043831093,lng:-56.01919523458085},UZ:{name:"Uzbekistan",lat:41.4879065244633,lng:63.8548297593985},VA:{name:"Vatican City",lat:41.90402351316735,lng:12.451312917026133},VC:{name:"Saint Vincent and the Grenadines",lat:13.254808122970651,lng:-61.193766354393034},VE:{name:"Venezuela",lat:7.148324760507107,lng:-66.36492135985132},VG:{name:"British Virgin Islands",lat:18.42195819619707,lng:-64.62406519257699},VI:{name:"US Virgin Islands",lat:17.738009708772523,lng:-64.76155341409797},VN:{name:"Vietnam",lat:16.517347170839393,lng:105.91338832758704},VU:{name:"Vanuatu",lat:-15.189132121699332,lng:166.84912735669738},WF:{name:"Wallis and Futuna",lat:-14.283442307826677,lng:-178.12735555777184},WS:{name:"Samoa",lat:-13.634252953274622,lng:-172.44107655740137},YE:{name:"Yemen",lat:16.001392616307445,lng:47.46815793206386},YT:{name:"Mayotte",lat:-12.824468416301052,lng:45.128142327031064},ZA:{name:"South Africa",lat:-28.55361930679731,lng:24.75252746489084},ZM:{name:"Zambia",lat:-13.162832953186246,lng:27.75521363430896},ZW:{name:"Zimbabwe",lat:-18.92700121981475,lng:29.717829640720844}};class MetricsCountryMapView extends a.View{constructor(a={}){const t=a.height||320;super({className:"metrics-country-map-view",...a}),this.endpoint=a.endpoint||"/api/metrics/fetch",this.account=a.account||"global",this.category=a.category||null,this.slugs=a.slugs||null,this.granularity=a.granularity||"days",this.maxCountries=a.maxCountries||12,this.metricLabel=a.metricLabel||"Events",this.height=t,this.mapStyle=a.mapStyle||"dark",this.mapOptions=a.mapOptions||{},this.showRoutes=!1!==a.showRoutes,this.routeOrigin=a.routeOrigin||{lng:-77.346,lat:38.958,name:"Reston, VA"},this._refreshing=!1}async getTemplate(){return`\n <div class="metrics-country-map">\n <div class="map-container mb-3" data-container="${this.id}-map" style="height:${this.height}px"></div>\n <div class="map-legend small" data-region="legend"></div>\n </div>\n `}async onInit(){this.statusEl=document.createElement("div"),this.statusEl.className="text-muted small px-3 pb-2",this.element.appendChild(this.statusEl),this.mapView=new MapLibreView({containerId:`${this.id}-map`,height:this.height,style:this.mapStyle,zoom:this.mapOptions.zoom??1.3,center:this.mapOptions.center||[10,20],pitch:this.mapOptions.pitch??20,bearing:this.mapOptions.bearing??0,showNavigationControl:this.mapOptions.showNavigationControl??!0,autoFitBounds:this.mapOptions.autoFitBounds??!1,interactive:this.mapOptions.interactive,scrollZoom:this.mapOptions.scrollZoom,dragPan:this.mapOptions.dragPan,doubleClickZoom:this.mapOptions.doubleClickZoom,keyboard:this.mapOptions.keyboard,touchZoom:this.mapOptions.touchZoom}),this.addChild(this.mapView),await this.refresh()}async refresh(){if(!this._refreshing){this._refreshing=!0,this.setStatus("Loading hotspots…");try{const a=await this.fetchMetrics();await this.applyMetrics(a),this.setStatus("")}catch(a){console.error("MetricsCountryMapView refresh error",a),this.setStatus("Unable to load country metrics.")}finally{this._refreshing=!1}}}async fetchMetrics(){const a=this.getApp()?.rest;if(!a)throw new Error("REST client unavailable");const t={account:this.account,granularity:this.granularity,with_labels:!0};if(this.category&&(t.category=this.category),this.slugs){const a=Array.isArray(this.slugs)?this.slugs:[this.slugs];t["slugs[]"]=a}const e=await a.GET(this.endpoint,t);if(!e.success||!e.data?.status)throw new Error(e.data?.error||"Metrics API error");return e.data.data}async applyMetrics(a){const t=a?.data||{},e=a?.labels||[],i=[];if(Object.entries(t).forEach(([a,t])=>{const e=t.reduce((a,t)=>a+(Number(t)||0),0);if(!e)return;const l=n[a.toUpperCase()];l&&i.push({code:a.toUpperCase(),total:e,values:t,centroid:l})}),!i.length)return this.mapView.updateMarkers([]),this.renderLegend([]),void this.setStatus("No country data available for the selected range.");i.sort((a,t)=>t.total-a.total);const l=i.slice(0,this.maxCountries),s=l[0]?.total||1,r=l.map(a=>{const t=a.total/s,e=Math.round(18+24*t);return{lng:a.centroid.lng,lat:a.centroid.lat,size:e,color:this.getMarkerColor(t),popup:`\n <div class="text-center">\n <strong>${a.centroid.name}</strong><br/>\n <span class="text-muted">${a.total.toLocaleString()} ${this.metricLabel}</span>\n </div>\n `}});this.showRoutes&&this.routeOrigin?.lng&&this.routeOrigin?.lat&&r.push({lng:this.routeOrigin.lng,lat:this.routeOrigin.lat,size:26,color:"#0d6efd",icon:"bi bi-broadcast-pin",popup:`\n <div class="text-center">\n <strong>${this.routeOrigin.name||"Operations Hub"}</strong><br/>\n <span class="text-muted">Origin</span>\n </div>\n `}),this.mapView.updateMarkers(r),this.renderLegend(l,e),this.showRoutes&&this.renderRoutes(l,s)}getMarkerColor(a){const t=[255,193,7],e=[32,201,151].map((e,n)=>Math.round(e+(t[n]-e)*a));return`rgba(${e[0]}, ${e[1]}, ${e[2]}, 0.9)`}renderLegend(a){const t=this.element.querySelector('[data-region="legend"]');if(!t)return;if(!a.length)return void(t.innerHTML="");const e=a[0]?.total||1,n=a.map(a=>{const t=(a.total/e*100).toFixed(0);return`\n <div class="d-flex justify-content-between align-items-center py-1 border-top">\n <div>\n <span class="fw-semibold">${a.centroid.name}</span>\n <span class="text-muted ms-1">(${a.code})</span>\n </div>\n <div class="text-end">\n <div class="fw-semibold">${a.total.toLocaleString()}</div>\n <small class="text-muted">${t}% of top</small>\n </div>\n </div>\n `}).join("");t.innerHTML=n}renderRoutes(a,t){const e=this.routeOrigin||null;if(!(e&&e.lng&&e.lat&&this.mapView))return;const n={type:"FeatureCollection",features:a.map(a=>({type:"Feature",geometry:{type:"LineString",coordinates:[[e.lng,e.lat],[a.centroid.lng,a.centroid.lat]]},properties:{total:a.total,intensity:a.total/t}}))};this.mapView.lineSources=this.mapView.lineSources.filter(a=>a.id!==`${this.id}-routes`),this.mapView.updateLineSource(`${this.id}-routes`,{data:n,paint:{"line-color":["interpolate",["linear"],["get","intensity"],0,"rgba(32, 201, 151, 0.6)",1,"rgba(255, 193, 7, 0.95)"],"line-width":["interpolate",["linear"],["get","intensity"],0,1.75,1,6],"line-opacity":["interpolate",["linear"],["get","intensity"],0,.45,1,.95]}})}setStatus(a){this.statusEl&&(this.statusEl.textContent=a||"",this.statusEl.style.display=a?"block":"none")}}exports.MapLibreView=MapLibreView,exports.MapLibreView$1=e,exports.MapView=MapView,exports.MapView$1=t,exports.MetricsCountryMapView=MetricsCountryMapView;
|
|
2
|
-
//# sourceMappingURL=MetricsCountryMapView-CWjIEBJB.js.map
|