footprint-globe 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/auto.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/config/defaults.ts","../src/config/validate.ts","../src/config/normalize.ts","../src/data/loader.ts","../src/fallback/list-view.ts","../src/legend-view.ts","../src/map-controller.ts","../src/marker-layer.ts","../src/popup-manager.ts","../src/privacy.ts","../src/theme-manager.ts","../src/globe.ts","../src/web/attributes.ts","../src/web/styles.ts","../src/web/element.ts","../src/web/auto-init.ts","../src/web/auto-entry.ts"],"names":["isObject","raw","DEFAULT_MAPLIBRE_URL","Map"],"mappings":"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","file":"auto.cjs","sourcesContent":["/**\n * 足迹地球 · 错误体系\n * 契约:每个错误码有对应中文 userMessage,可直接展示给用户。\n */\n\nexport type FootprintErrorCode =\n | 'CONFIG_INVALID'\n | 'DATA_LOAD_FAILED'\n | 'WEBGL_UNSUPPORTED'\n | 'MAPLIBRE_MISSING'\n | 'RENDER_FAILED';\n\nconst USER_MESSAGES: Record<FootprintErrorCode, string> = {\n CONFIG_INVALID: '配置格式有误,请检查数据后重试。',\n DATA_LOAD_FAILED: '数据加载失败,请检查链接或网络后重试。',\n WEBGL_UNSUPPORTED: '当前浏览器不支持 3D 渲染,已切换为列表视图。',\n MAPLIBRE_MISSING: '地图引擎加载失败,已切换为列表视图。',\n RENDER_FAILED: '地图渲染失败,请刷新页面后重试。',\n};\n\nexport class FootprintError extends Error {\n readonly code: FootprintErrorCode;\n readonly detail?: unknown;\n readonly userMessage: string;\n\n constructor(code: FootprintErrorCode, detail?: unknown, overrideMessage?: string) {\n const message = overrideMessage ?? USER_MESSAGES[code];\n super(`[${code}] ${message}`);\n this.name = 'FootprintError';\n this.code = code;\n this.detail = detail;\n this.userMessage = message;\n }\n}\n\nexport function isFootprintError(e: unknown): e is FootprintError {\n return e instanceof FootprintError;\n}\n\nexport function configError(field: string, reason: string): FootprintError {\n return new FootprintError(\n 'CONFIG_INVALID',\n { field, reason },\n `配置字段 \"${field}\" 无效:${reason}`,\n );\n}\n\nexport function dataError(reason: string, detail?: unknown): FootprintError {\n return new FootprintError('DATA_LOAD_FAILED', detail ?? reason, `数据加载失败:${reason}`);\n}\n","/**\n * 足迹地球 · 默认值常量\n */\n\nimport type { FogConfig } from './schema';\n\nexport const DEFAULT_STYLE = 'https://tiles.openfreemap.org/styles/positron';\n\nexport const DEFAULT_MAPLIBRE_URL =\n 'https://cdn.jsdelivr.net/npm/maplibre-gl@5/dist/maplibre-gl.js';\n\nexport const DEFAULT_CENTER: [number, number] = [100, 30];\nexport const DEFAULT_ZOOM = 1.2;\n\nexport const DEFAULT_FOG: FogConfig = {\n color: 'rgba(0,0,0,0)',\n 'high-color': 'rgba(255,255,255,0.1)',\n 'space-color': 'rgba(0,0,0,0)',\n 'horizon-blend': 0,\n};\n\n/** 已知分类的默认颜色(用于旧格式转换 / CSV / GeoJSON) */\nexport const DEFAULT_CATEGORY_COLORS: Record<string, string> = {\n residence: '#2563eb',\n travel: '#f97316',\n default: '#6b7280',\n};\n\n/** 已知分类的默认标签 */\nexport const DEFAULT_CATEGORY_LABELS: Record<string, string> = {\n residence: '居住',\n travel: '旅行',\n default: '其他',\n};\n\n/** 数据边界(ADR-0001 决策 6) */\nexport const LIMITS = {\n MAX_PINS: 1000,\n MAX_FILE_SIZE: 1024 * 1024, // 1MB\n MAX_NAME_LEN: 200,\n MAX_NOTE_LEN: 500,\n MAX_PHOTOS: 5,\n MAX_CATEGORIES: 8,\n} as const;\n","/**\n * 足迹地球 · 配置校验\n * 契约依据:ADR-0001 决策 6、《Sprint 1 执行方案》§6 S1-2\n */\n\nimport { configError, type FootprintError } from '../errors';\nimport { LIMITS } from './defaults';\nimport type { Category, FootprintConfig, Pin } from './schema';\n\nconst CATEGORY_ID_RE = /^[a-z][a-z0-9-]*$/;\nconst HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\nconst DATA_ID_RE = /^[0-9a-zA-Z_-]{8}$/;\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === 'number' && Number.isFinite(v);\n}\n\nfunction validatePin(pin: unknown, categoryId: string, index: number): FootprintError[] {\n const errs: FootprintError[] = [];\n const path = `categories[${categoryId}].pins[${index}]`;\n\n if (!isObject(pin)) {\n errs.push(configError(path, '必须是对象'));\n return errs;\n }\n\n if (typeof pin.name !== 'string' || pin.name.length === 0) {\n errs.push(configError(`${path}.name`, '必须是非空字符串'));\n } else if (pin.name.length > LIMITS.MAX_NAME_LEN) {\n errs.push(configError(`${path}.name`, `长度不得超过 ${LIMITS.MAX_NAME_LEN}`));\n }\n\n if (!Array.isArray(pin.coords) || pin.coords.length !== 2) {\n errs.push(configError(`${path}.coords`, '必须是 [经度, 纬度] 数组'));\n } else {\n const [lng, lat] = pin.coords;\n if (!isFiniteNumber(lng) || lng < -180 || lng > 180) {\n errs.push(configError(`${path}.coords[0]`, '经度必须在 [-180, 180]'));\n }\n if (!isFiniteNumber(lat) || lat < -90 || lat > 90) {\n errs.push(configError(`${path}.coords[1]`, '纬度必须在 [-90, 90]'));\n }\n }\n\n if (pin.note !== undefined) {\n if (typeof pin.note !== 'string') {\n errs.push(configError(`${path}.note`, '必须是字符串'));\n } else if (pin.note.length > LIMITS.MAX_NOTE_LEN) {\n errs.push(configError(`${path}.note`, `长度不得超过 ${LIMITS.MAX_NOTE_LEN}`));\n }\n }\n\n if (pin.photos !== undefined) {\n if (!Array.isArray(pin.photos)) {\n errs.push(configError(`${path}.photos`, '必须是数组'));\n } else if (pin.photos.length > LIMITS.MAX_PHOTOS) {\n errs.push(configError(`${path}.photos`, `最多 ${LIMITS.MAX_PHOTOS} 张`));\n } else if (!pin.photos.every((p) => typeof p === 'string')) {\n errs.push(configError(`${path}.photos`, '数组元素必须是字符串'));\n }\n }\n\n return errs;\n}\n\nfunction validateCategory(cat: unknown, index: number): FootprintError[] {\n const errs: FootprintError[] = [];\n const path = `categories[${index}]`;\n\n if (!isObject(cat)) {\n errs.push(configError(path, '必须是对象'));\n return errs;\n }\n\n if (typeof cat.id !== 'string' || !CATEGORY_ID_RE.test(cat.id)) {\n errs.push(configError(`${path}.id`, '必须匹配 ^[a-z][a-z0-9-]*$'));\n }\n\n if (typeof cat.label !== 'string' || cat.label.length === 0) {\n errs.push(configError(`${path}.label`, '必须是非空字符串'));\n }\n\n if (typeof cat.color !== 'string' || !HEX_COLOR_RE.test(cat.color)) {\n errs.push(configError(`${path}.color`, '必须是 #RGB 或 #RRGGBB'));\n }\n\n if (cat.icon !== undefined) {\n const valid = ['dot', 'pin', 'star'];\n if (typeof cat.icon !== 'string' || !valid.includes(cat.icon)) {\n errs.push(configError(`${path}.icon`, `必须是 ${valid.join(' / ')}`));\n }\n }\n\n if (!Array.isArray(cat.pins)) {\n errs.push(configError(`${path}.pins`, '必须是数组'));\n } else {\n const catId = typeof cat.id === 'string' ? cat.id : String(index);\n cat.pins.forEach((p: unknown, i: number) => {\n errs.push(...validatePin(p, catId, i));\n });\n }\n\n return errs;\n}\n\nfunction validateRenderConfig(rc: unknown): FootprintError[] {\n const errs: FootprintError[] = [];\n if (!isObject(rc)) return errs;\n\n if (rc.projection !== undefined) {\n if (rc.projection !== 'globe' && rc.projection !== 'mercator') {\n errs.push(configError('config.projection', '必须是 globe 或 mercator'));\n }\n }\n if (rc.theme !== undefined) {\n const valid = ['light', 'dark', 'auto'];\n if (typeof rc.theme !== 'string' || !valid.includes(rc.theme)) {\n errs.push(configError('config.theme', `必须是 ${valid.join(' / ')}`));\n }\n }\n if (rc.style !== undefined && typeof rc.style !== 'string') {\n errs.push(configError('config.style', '必须是字符串'));\n }\n if (rc.maplibreUrl !== undefined && typeof rc.maplibreUrl !== 'string') {\n errs.push(configError('config.maplibreUrl', '必须是字符串'));\n }\n if (rc.zoom !== undefined && !isFiniteNumber(rc.zoom)) {\n errs.push(configError('config.zoom', '必须是数字'));\n }\n if (rc.legend !== undefined && typeof rc.legend !== 'boolean') {\n errs.push(configError('config.legend', '必须是布尔值'));\n }\n if (rc.autorotate !== undefined && typeof rc.autorotate !== 'boolean') {\n errs.push(configError('config.autorotate', '必须是布尔值'));\n }\n if (rc.privacy !== undefined && isObject(rc.privacy)) {\n if (rc.privacy.blur !== undefined && !isFiniteNumber(rc.privacy.blur)) {\n errs.push(configError('config.privacy.blur', '必须是数字'));\n }\n if (rc.privacy.cityOnly !== undefined && typeof rc.privacy.cityOnly !== 'boolean') {\n errs.push(configError('config.privacy.cityOnly', '必须是布尔值'));\n }\n }\n\n return errs;\n}\n\n/**\n * 校验配置对象,返回所有错误。空数组表示通过。\n */\nexport function validateConfig(input: unknown): FootprintError[] {\n const errs: FootprintError[] = [];\n\n if (!isObject(input)) {\n errs.push(configError('root', '必须是对象'));\n return errs;\n }\n\n if (input.version !== 1) {\n errs.push(configError('version', '必须为 1'));\n }\n\n if (input.dataId !== undefined) {\n if (typeof input.dataId !== 'string' || !DATA_ID_RE.test(input.dataId)) {\n errs.push(configError('dataId', '必须是 8 位 [0-9a-zA-Z_-]'));\n }\n }\n\n if (!Array.isArray(input.categories)) {\n errs.push(configError('categories', '必须是数组'));\n } else {\n if (input.categories.length === 0) {\n errs.push(configError('categories', '至少 1 个分类'));\n }\n if (input.categories.length > LIMITS.MAX_CATEGORIES) {\n errs.push(configError('categories', `最多 ${LIMITS.MAX_CATEGORIES} 个分类`));\n }\n input.categories.forEach((c: unknown, i: number) => {\n errs.push(...validateCategory(c, i));\n });\n\n // 检查总 pin 数\n const total = input.categories.reduce((sum: number, c: unknown) => {\n if (isObject(c) && Array.isArray(c.pins)) return sum + c.pins.length;\n return sum;\n }, 0);\n if (total > LIMITS.MAX_PINS) {\n errs.push(configError('categories.pins', `总标记数不得超过 ${LIMITS.MAX_PINS}`));\n }\n }\n\n if (input.config !== undefined) {\n errs.push(...validateRenderConfig(input.config));\n }\n\n return errs;\n}\n\n/** 断言配置合法,否则抛出第一个错误 */\nexport function assertValidConfig(input: unknown): asserts input is FootprintConfig {\n const errs = validateConfig(input);\n if (errs.length > 0) {\n throw errs[0]!;\n }\n}\n\n// 供外部引用类型(避免 TS 未使用告警)\nexport type { FootprintConfig, Category, Pin };\n","/**\n * 足迹地球 · 配置归一化\n * 契约依据:PRD v1.1 §4.5、《Sprint 1 执行方案》§6 S1-3\n */\n\nimport {\n DEFAULT_CATEGORY_COLORS,\n DEFAULT_CATEGORY_LABELS,\n DEFAULT_CENTER,\n DEFAULT_FOG,\n DEFAULT_MAPLIBRE_URL,\n DEFAULT_STYLE,\n DEFAULT_ZOOM,\n} from './defaults';\nimport type { Category, FootprintConfig, Pin, RenderConfig } from './schema';\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/** 检测旧格式 { residence: [], travel: [] } */\nfunction isLegacyFormat(input: unknown): input is { residence?: unknown; travel?: unknown } {\n if (!isObject(input)) return false;\n if (input.version === 1) return false;\n if (Array.isArray(input.categories)) return false;\n return Array.isArray(input.residence) || Array.isArray(input.travel);\n}\n\n/** 将旧格式的 pins 归一化为 Pin[] */\nfunction normalizePins(raw: unknown): Pin[] {\n if (!Array.isArray(raw)) return [];\n const out: Pin[] = [];\n for (const item of raw) {\n if (!isObject(item)) continue;\n if (typeof item.name !== 'string') continue;\n if (!Array.isArray(item.coords) || item.coords.length !== 2) continue;\n const [lng, lat] = item.coords;\n if (typeof lng !== 'number' || typeof lat !== 'number') continue;\n const pin: Pin = { name: item.name, coords: [lng, lat] };\n if (typeof item.date === 'string') pin.date = item.date;\n if (typeof item.note === 'string') pin.note = item.note;\n if (Array.isArray(item.photos)) {\n pin.photos = item.photos.filter((p): p is string => typeof p === 'string');\n }\n out.push(pin);\n }\n return out;\n}\n\n/** 旧格式 → v1 categories */\nfunction normalizeLegacy(input: { residence?: unknown; travel?: unknown }): Category[] {\n const cats: Category[] = [];\n if (Array.isArray(input.residence) && input.residence.length > 0) {\n cats.push({\n id: 'residence',\n label: DEFAULT_CATEGORY_LABELS.residence!,\n color: DEFAULT_CATEGORY_COLORS.residence!,\n pins: normalizePins(input.residence),\n });\n }\n if (Array.isArray(input.travel) && input.travel.length > 0) {\n cats.push({\n id: 'travel',\n label: DEFAULT_CATEGORY_LABELS.travel!,\n color: DEFAULT_CATEGORY_COLORS.travel!,\n pins: normalizePins(input.travel),\n });\n }\n return cats;\n}\n\n/** 将 v1 分类补全为完整 Category */\nfunction normalizeCategory(raw: unknown): Category | null {\n if (!isObject(raw)) return null;\n if (typeof raw.id !== 'string' || typeof raw.label !== 'string') return null;\n if (typeof raw.color !== 'string') return null;\n const cat: Category = {\n id: raw.id,\n label: raw.label,\n color: raw.color,\n pins: normalizePins(raw.pins),\n };\n if (raw.icon === 'dot' || raw.icon === 'pin' || raw.icon === 'star') {\n cat.icon = raw.icon;\n }\n return cat;\n}\n\n/** 填充 RenderConfig 默认值 */\nfunction normalizeRenderConfig(raw: unknown): RenderConfig {\n const rc: RenderConfig = isObject(raw) ? { ...raw } : {};\n rc.projection ??= 'globe';\n rc.theme ??= 'light';\n rc.style ??= DEFAULT_STYLE;\n rc.maplibreUrl ??= DEFAULT_MAPLIBRE_URL;\n rc.center ??= DEFAULT_CENTER;\n rc.zoom ??= DEFAULT_ZOOM;\n rc.pitch ??= 0;\n rc.bearing ??= 0;\n rc.legend ??= true;\n rc.autorotate ??= false;\n rc.attribution ??= false;\n rc.fog ??= DEFAULT_FOG;\n rc.privacy ??= { blur: 0, cityOnly: false };\n return rc;\n}\n\n/**\n * 将任意输入归一化为 v1 FootprintConfig。\n * - 已 v1:补默认值\n * - 旧格式:转换 + 补默认值\n * - 其他:尽力转换(交给 validate 兜底)\n */\nexport function normalizeConfig(input: unknown): FootprintConfig {\n if (isLegacyFormat(input)) {\n return {\n version: 1,\n categories: normalizeLegacy(input),\n config: normalizeRenderConfig(undefined),\n };\n }\n\n if (isObject(input) && Array.isArray(input.categories)) {\n const cfg: FootprintConfig = {\n version: 1,\n categories: input.categories.map(normalizeCategory).filter((c): c is Category => c !== null),\n config: normalizeRenderConfig(input.config),\n };\n if (typeof input.dataId === 'string') cfg.dataId = input.dataId;\n if (Array.isArray(input.routes)) cfg.routes = input.routes as FootprintConfig['routes'];\n return cfg;\n }\n\n return {\n version: 1,\n categories: [],\n config: normalizeRenderConfig(undefined),\n };\n}\n","/**\n * 足迹地球 · 数据加载\n * 契约依据:ADR-0001 决策 2、《Sprint 1 执行方案》§6 S1-4\n */\n\nimport { normalizeConfig } from '../config/normalize';\nimport type { FootprintConfig, LoadOptions, LoadResult } from '../config/schema';\nimport { validateConfig } from '../config/validate';\nimport { dataError, FootprintError } from '../errors';\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * 校验数据源 URL:\n * - 相对路径先按当前页面地址解析(文档用法 data-src=\"./pins.json\")\n * - 放行 https: 任意地址\n * - 放行 http: 的本地开发主机(localhost / 127.0.0.1 / ::1,含任意端口)\n * - 其余(http://外网、file:、ftp: 等)一律拒绝\n */\nfunction assertAllowedUrl(url: string): URL {\n let u: URL;\n try {\n const base = typeof location !== 'undefined' ? location.href : undefined;\n u = new URL(url, base);\n } catch {\n throw dataError('数据源 URL 无效');\n }\n if (u.protocol === 'https:') return u;\n const isLocal = /^(localhost|127\\.0\\.0\\.1|::1|\\[::1\\])$/.test(u.hostname);\n if (u.protocol === 'http:' && isLocal) return u;\n throw dataError('数据源必须使用 HTTPS(本地开发环境 http://localhost 除外)');\n}\n\nasync function fetchJson(url: string): Promise<unknown> {\n const resolved = assertAllowedUrl(url);\n let res: Response;\n try {\n res = await fetch(resolved.href);\n } catch (e) {\n throw dataError('网络请求失败', e);\n }\n if (!res.ok) {\n throw dataError(`请求失败:HTTP ${res.status}`, res.status);\n }\n try {\n return await res.json();\n } catch (e) {\n throw dataError('响应不是有效的 JSON', e);\n }\n}\n\n/**\n * 加载并归一化数据。\n * 优先级:id > src > data > globalVar(ADR-0001 决策 2)\n */\nexport async function loadData(options: LoadOptions = {}): Promise<LoadResult> {\n const warnings: string[] = [];\n\n // 1. id(v1.1 托管)\n if (options.id) {\n throw dataError('短链托管尚未实现(计划 v1.1 提供)');\n }\n\n // 2. src\n if (options.src) {\n const raw = await fetchJson(options.src);\n return finalize(raw, warnings);\n }\n\n // 3. data(inline JSON)\n if (options.data) {\n let raw: unknown;\n try {\n raw = JSON.parse(options.data);\n } catch (e) {\n throw dataError('inline JSON 解析失败', e);\n }\n return finalize(raw, warnings);\n }\n\n // 4. 全局变量\n const varName = options.globalVar ?? 'FOOTPRINT_PINS';\n const g = globalThis as unknown as Record<string, unknown>;\n const raw = g[varName];\n if (raw === undefined) {\n throw dataError(`未找到全局变量 window.${varName}`);\n }\n\n return finalize(raw, warnings);\n}\n\nfunction finalize(raw: unknown, warnings: string[]): LoadResult {\n const config = normalizeConfig(raw);\n\n // 截断保护\n let total = 0;\n for (const cat of config.categories) total += cat.pins.length;\n if (total > 1000) {\n warnings.push(`标记总数 ${total} 超过 1000,已截断`);\n let kept = 0;\n for (const cat of config.categories) {\n const room = 1000 - kept;\n if (cat.pins.length > room) {\n cat.pins = cat.pins.slice(0, Math.max(0, room));\n }\n kept += cat.pins.length;\n }\n }\n\n const errs = validateConfig(config);\n if (errs.length > 0) {\n const first = errs[0]!;\n throw new FootprintError(\n first.code,\n { ...(isObject(first.detail) ? first.detail : {}), all: errs },\n first.userMessage,\n );\n }\n\n return { config, warnings };\n}\n\nexport type { FootprintConfig, LoadResult };\n","/**\n * 足迹地球 · 降级列表视图\n * 契约依据:ADR-0001 决策 3、《Sprint 1 执行方案》§7 S1-21\n * WebGL 不可用或 MapLibre 缺失时渲染。\n */\n\nimport type { Category } from '../config/schema';\n\nexport interface ListViewOptions {\n container: HTMLElement;\n categories: Category[];\n reason: string;\n}\n\nexport class ListView {\n private container: HTMLElement;\n private categories: Category[];\n private reason: string;\n private root: HTMLElement | null = null;\n\n constructor(opts: ListViewOptions) {\n this.container = opts.container;\n this.categories = opts.categories;\n this.reason = opts.reason;\n }\n\n render(): void {\n this.destroy();\n\n const root = document.createElement('div');\n root.className = 'footprint-list';\n root.setAttribute('role', 'region');\n root.setAttribute('aria-label', '足迹列表');\n root.setAttribute('part', 'list'); // S3-0a\n\n const notice = document.createElement('p');\n notice.className = 'footprint-list__notice';\n notice.textContent = this.reason;\n root.appendChild(notice);\n\n for (const cat of this.categories) {\n if (cat.pins.length === 0) continue;\n\n const group = document.createElement('section');\n group.className = 'footprint-list__group';\n group.style.setProperty('--fp-marker-color', cat.color);\n\n const heading = document.createElement('h3');\n heading.className = 'footprint-list__heading';\n\n const dot = document.createElement('i');\n dot.className = 'footprint-legend__dot';\n dot.setAttribute('aria-hidden', 'true');\n\n heading.appendChild(dot);\n heading.appendChild(document.createTextNode(cat.label));\n group.appendChild(heading);\n\n const ul = document.createElement('ul');\n ul.className = 'footprint-list__items';\n\n for (const pin of cat.pins) {\n const li = document.createElement('li');\n li.className = 'footprint-list__item';\n li.textContent = pin.name;\n if (pin.note) {\n li.title = pin.note;\n }\n ul.appendChild(li);\n }\n\n group.appendChild(ul);\n root.appendChild(group);\n }\n\n this.container.appendChild(root);\n this.root = root;\n }\n\n destroy(): void {\n if (this.root) {\n this.root.remove();\n this.root = null;\n }\n }\n}\n","/**\n * 足迹地球 · 图例\n * 契约依据:《Sprint 1 执行方案》§7 S1-10、《Sprint 3 执行方案》§6 S3-0a\n */\n\nimport type { Category } from './config/schema';\n\nexport class LegendView {\n private container: HTMLElement;\n private root: HTMLElement | null = null;\n\n constructor(container: HTMLElement) {\n this.container = container;\n }\n\n render(categories: Category[]): void {\n this.destroy();\n\n const root = document.createElement('div');\n root.className = 'footprint-legend';\n root.setAttribute('role', 'list');\n root.setAttribute('part', 'legend'); // S3-0a\n root.setAttribute('aria-label', '图例');\n\n for (const cat of categories) {\n const item = document.createElement('span');\n item.className = 'footprint-legend__item';\n item.setAttribute('role', 'listitem');\n\n const dot = document.createElement('i');\n dot.className = 'footprint-legend__dot';\n dot.setAttribute('aria-hidden', 'true');\n dot.style.setProperty('--fp-marker-color', cat.color);\n\n const label = document.createElement('span');\n label.textContent = cat.label;\n\n item.appendChild(dot);\n item.appendChild(label);\n root.appendChild(item);\n }\n\n this.container.appendChild(root);\n this.root = root;\n }\n\n destroy(): void {\n if (this.root) {\n this.root.remove();\n this.root = null;\n }\n }\n}\n","/**\n * 足迹地球 · MapLibre 封装\n * 契约依据:ADR-0001 决策 7、《Sprint 1 执行方案》§7 S1-7\n * 唯一直接调用 maplibregl 的模块。\n */\n\nimport { DEFAULT_FOG } from './config/defaults';\nimport type { RenderConfig } from './config/schema';\nimport { FootprintError } from './errors';\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\n\ninterface FootprintGlobeOptionsLike {\n maplibre?: MaplibreModule;\n maplibreUrl?: string;\n}\n\nconst DEFAULT_MAPLIBRE_URL = 'https://cdn.jsdelivr.net/npm/maplibre-gl@5/dist/maplibre-gl.js';\n\nconst MAPLIBRE_CSS_URL = 'https://cdn.jsdelivr.net/npm/maplibre-gl@5/dist/maplibre-gl.css';\n\n/** 动态加载 maplibre-gl CSS(仅一次) */\nfunction ensureMaplibreCss(url = MAPLIBRE_CSS_URL): void {\n const marker = 'data-fp-maplibre-css';\n if (document.querySelector(`link[${marker}]`)) return;\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.setAttribute(marker, '1');\n document.head.appendChild(link);\n}\n\n/** 动态加载 maplibre-gl JS */\nfunction loadMaplibreFromUrl(url: string): Promise<MaplibreModule> {\n const g = globalThis as unknown as { maplibregl?: MaplibreModule };\n if (g.maplibregl) {\n ensureMaplibreCss();\n return Promise.resolve(g.maplibregl);\n }\n\n return new Promise((resolve, reject) => {\n const marker = 'data-fp-maplibre-js';\n const existing = document.querySelector<HTMLScriptElement>(`script[${marker}]`);\n\n const done = () => {\n if (g.maplibregl) {\n ensureMaplibreCss();\n resolve(g.maplibregl);\n } else {\n reject(new FootprintError('MAPLIBRE_MISSING', 'maplibregl 未挂载到 window'));\n }\n };\n\n if (existing) {\n existing.addEventListener('load', done, { once: true });\n existing.addEventListener(\n 'error',\n () => reject(new FootprintError('MAPLIBRE_MISSING', 'script 加载失败')),\n { once: true },\n );\n return;\n }\n\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n script.setAttribute(marker, '1');\n script.addEventListener('load', done, { once: true });\n script.addEventListener(\n 'error',\n () => reject(new FootprintError('MAPLIBRE_MISSING', 'script 加载失败')),\n { once: true },\n );\n document.head.appendChild(script);\n });\n}\n\n/**\n * 运行时解析 MapLibre 模块。\n * 优先级(ADR-0001 决策 7):\n * 1. options.maplibre(显式传入)\n * 2. window.maplibregl(全局)\n * 3. options.maplibreUrl / config.maplibreUrl(CDN)\n * 4. 失败 → 抛出 MAPLIBRE_MISSING\n */\nexport async function resolveMaplibre(\n options: FootprintGlobeOptionsLike,\n config: RenderConfig = {},\n): Promise<MaplibreModule> {\n if (options.maplibre) {\n ensureMaplibreCss();\n return options.maplibre;\n }\n const g = globalThis as unknown as { maplibregl?: MaplibreModule };\n if (g.maplibregl) {\n ensureMaplibreCss();\n return g.maplibregl;\n }\n const url = options.maplibreUrl ?? config.maplibreUrl ?? DEFAULT_MAPLIBRE_URL;\n return loadMaplibreFromUrl(url);\n}\n\nexport class MapController {\n private container: HTMLElement;\n private maplibre: MaplibreModule;\n private config: RenderConfig;\n private map: unknown = null;\n\n constructor(container: HTMLElement, maplibre: MaplibreModule, config: RenderConfig) {\n this.container = container;\n this.maplibre = maplibre;\n this.config = config;\n }\n\n init(): void {\n const Map = this.maplibre.Map;\n const map = new Map({\n container: this.container,\n style: this.config.style!,\n center: this.config.center!,\n zoom: this.config.zoom!,\n pitch: this.config.pitch ?? 0,\n bearing: this.config.bearing ?? 0,\n dragRotate: true,\n touchPitch: true,\n attributionControl: { compact: true },\n });\n\n this.map = map;\n\n // style.load 后再设置投影与 fog\n (map as { on: (ev: string, cb: () => void) => void }).on('style.load', () => {\n this.applyProjection(this.config.projection ?? 'globe');\n this.applyFog(this.config.fog ?? DEFAULT_FOG);\n });\n }\n\n applyProjection(type: 'globe' | 'mercator'): void {\n if (!this.map) return;\n (this.map as { setProjection: (o: { type: string }) => void }).setProjection({ type });\n }\n\n applyFog(fog: RenderConfig['fog']): void {\n if (!this.map || !fog) return;\n // MapLibre GL v5 移除了 setFog(大气效果改由 setSky 承担),且两者属性名不同:\n // fog: color / high-color / space-color / horizon-blend\n // sky: horizon-color / sky-color / fog-color / horizon-fog-blend\n // 能力探测:优先 setFog(v4 及兼容层),降级 setSky(v5,做属性名映射),均无则跳过。\n const m = this.map as unknown as {\n setFog?: (o: unknown) => void;\n setSky?: (o: unknown) => void;\n };\n try {\n if (typeof m.setFog === 'function') {\n m.setFog({\n color: fog.color ?? 'rgba(0,0,0,0)',\n 'high-color': fog['high-color'] ?? 'rgba(255,255,255,0.1)',\n 'space-color': fog['space-color'] ?? 'rgba(0,0,0,0)',\n 'horizon-blend': fog['horizon-blend'] ?? 0,\n });\n } else if (typeof m.setSky === 'function') {\n m.setSky({\n 'horizon-color': fog.color ?? 'rgba(0,0,0,0)',\n 'sky-color': fog['high-color'] ?? 'rgba(0,0,0,0)',\n 'fog-color': fog['space-color'] ?? 'rgba(0,0,0,0)',\n 'horizon-fog-blend': fog['horizon-blend'] ?? 0,\n });\n }\n } catch {\n // 大气效果失败不阻断地图初始化\n }\n }\n\n getMap(): unknown {\n return this.map;\n }\n\n destroy(): void {\n if (!this.map) return;\n try {\n (this.map as { remove: () => void }).remove();\n } catch {\n /* noop */\n }\n this.map = null;\n }\n}\n","/**\n * 足迹地球 · 标记渲染与交互\n * 契约依据:《Sprint 1 执行方案》§7 S1-8、§15 S1-Q4(使用 <button>)\n */\n\nimport type { Category, Pin } from './config/schema';\nimport type { PopupManager } from './popup-manager';\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\n\ninterface MarkerLayerOptions {\n maplibre: MaplibreModule;\n map: unknown;\n popup: PopupManager;\n onPinClick?: (pin: Pin, category: Category) => void;\n}\n\ninterface MarkerHandle {\n el: HTMLButtonElement;\n destroy: () => void;\n}\n\nexport class MarkerLayer {\n private maplibre: MaplibreModule;\n private map: unknown;\n private popup: PopupManager;\n private onPinClick?: (pin: Pin, category: Category) => void;\n private handles: MarkerHandle[] = [];\n\n constructor(opts: MarkerLayerOptions) {\n this.maplibre = opts.maplibre;\n this.map = opts.map;\n this.popup = opts.popup;\n this.onPinClick = opts.onPinClick;\n }\n\n render(categories: Category[]): void {\n this.clear();\n\n for (const category of categories) {\n for (const pin of category.pins) {\n this.addMarker(pin, category);\n }\n }\n }\n\n private addMarker(pin: Pin, category: Category): void {\n const el = document.createElement('button');\n el.type = 'button';\n el.className = 'footprint-marker';\n el.style.setProperty('--fp-marker-color', category.color);\n el.setAttribute('aria-label', pin.name);\n el.dataset.category = category.id;\n\n const open = () => {\n this.popup.open(this.map, pin.coords, pin.name);\n };\n const close = () => {\n this.popup.close();\n };\n const onClick = (e: MouseEvent) => {\n e.stopPropagation();\n open();\n this.onPinClick?.(pin, category);\n };\n\n el.addEventListener('mouseenter', open);\n el.addEventListener('mouseleave', close);\n el.addEventListener('focus', open);\n el.addEventListener('blur', close);\n el.addEventListener('click', onClick);\n\n const marker = new this.maplibre.Marker({ element: el, anchor: 'center' });\n marker.setLngLat(pin.coords).addTo(this.map as never);\n\n this.handles.push({\n el,\n destroy: () => {\n el.removeEventListener('mouseenter', open);\n el.removeEventListener('mouseleave', close);\n el.removeEventListener('focus', open);\n el.removeEventListener('blur', close);\n el.removeEventListener('click', onClick);\n el.remove();\n },\n });\n }\n\n clear(): void {\n for (const h of this.handles) h.destroy();\n this.handles = [];\n }\n\n /** 当前渲染的 marker 元素(测试用) */\n getElements(): HTMLButtonElement[] {\n return this.handles.map((h) => h.el);\n }\n\n destroy(): void {\n this.clear();\n }\n}\n","/**\n * 足迹地球 · 弹窗单例管理\n * 契约依据:《Sprint 1 执行方案》§7 S1-9\n */\n\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\ntype PopupInstance = {\n remove: () => void;\n setLngLat: (c: [number, number]) => unknown;\n setText: (t: string) => unknown;\n addTo: (m: unknown) => unknown;\n};\n\nexport class PopupManager {\n private maplibre: MaplibreModule;\n private active: PopupInstance | null = null;\n\n constructor(maplibre: MaplibreModule) {\n this.maplibre = maplibre;\n }\n\n open(map: unknown, coords: [number, number], text: string): void {\n this.close();\n const popup = new this.maplibre.Popup({\n offset: 8,\n closeButton: false,\n closeOnMove: false,\n focusAfterOpen: false,\n }) as unknown as PopupInstance;\n popup.setLngLat(coords);\n popup.setText(text);\n popup.addTo(map);\n this.active = popup;\n }\n\n close(): void {\n if (!this.active) return;\n try {\n this.active.remove();\n } catch {\n /* noop */\n }\n this.active = null;\n }\n\n destroy(): void {\n this.close();\n }\n}\n","/**\n * 足迹地球 · 隐私处理\n * 契约依据:《Sprint 1 执行方案》§7 S1-12、§15 S1-Q1(固定 seed 保证可复现)\n */\n\nimport type { Pin, PrivacyConfig } from './config/schema';\n\n/** FNV-1a 字符串哈希,作为确定性种子 */\nfunction hashString(s: string): number {\n let h = 2166136261;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return h >>> 0;\n}\n\n/** Mulberry32 PRNG,返回 [0, 1) */\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nconst KM_PER_DEG_LAT = 111.32;\n\n/** 四舍五入到 2 位小数(约 1km 精度,城市级) */\nfunction roundTo2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/**\n * 对 pins 应用隐私处理。\n * - blur:在 km 为单位的半径内做确定性随机偏移\n * - cityOnly:坐标保留 2 位小数\n * 两者可叠加。\n */\nexport function applyPrivacy(pins: Pin[], options: PrivacyConfig): Pin[] {\n const blur = options.blur ?? 0;\n const cityOnly = options.cityOnly ?? false;\n\n if (blur <= 0 && !cityOnly) return pins;\n\n return pins.map((pin) => {\n let [lng, lat] = pin.coords;\n\n if (blur > 0) {\n const seed = hashString(`${pin.name}:${lng}:${lat}`);\n const rand = mulberry32(seed);\n const angle = rand() * Math.PI * 2;\n const radius = Math.sqrt(rand()) * blur; // 均匀分布\n\n const dLat = (radius * Math.cos(angle)) / KM_PER_DEG_LAT;\n const cosLat = Math.max(Math.cos((lat * Math.PI) / 180), 0.01);\n const dLng = (radius * Math.sin(angle)) / (KM_PER_DEG_LAT * cosLat);\n\n lat = lat + dLat;\n lng = lng + dLng;\n\n // clamp\n lng = Math.max(-180, Math.min(180, lng));\n lat = Math.max(-90, Math.min(90, lat));\n }\n\n if (cityOnly) {\n lng = roundTo2(lng);\n lat = roundTo2(lat);\n }\n\n return { ...pin, coords: [lng, lat] };\n });\n}\n","/**\n * 足迹地球 · 主题\n * 契约依据:《Sprint 1 执行方案》§7 S1-11、§15 S1-Q2 / S1-Q9\n */\n\nexport type ThemeName = 'light' | 'dark' | 'auto';\n\nconst DARK_STYLE = 'https://tiles.openfreemap.org/styles/dark-matter';\nconst LIGHT_STYLE = 'https://tiles.openfreemap.org/styles/positron';\n\nexport class ThemeManager {\n private container: HTMLElement;\n private mediaQuery: MediaQueryList | null = null;\n private mediaHandler: ((e: MediaQueryListEvent) => void) | null = null;\n\n constructor(container: HTMLElement) {\n this.container = container;\n }\n\n apply(theme: ThemeName): void {\n this.detachMedia();\n\n if (theme === 'auto') {\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const sync = () => {\n const dark = this.mediaQuery!.matches;\n this.container.setAttribute('data-fp-theme', dark ? 'dark' : 'light');\n };\n sync();\n this.mediaHandler = sync;\n this.mediaQuery.addEventListener('change', this.mediaHandler);\n } else {\n this.container.setAttribute('data-fp-theme', 'light');\n }\n return;\n }\n\n this.container.setAttribute('data-fp-theme', theme);\n }\n\n private detachMedia(): void {\n if (this.mediaQuery && this.mediaHandler) {\n this.mediaQuery.removeEventListener('change', this.mediaHandler);\n }\n this.mediaQuery = null;\n this.mediaHandler = null;\n }\n\n destroy(): void {\n this.detachMedia();\n this.container.removeAttribute('data-fp-theme');\n }\n}\n\n/** 提供按主题取底图样式的辅助 */\nexport function styleForTheme(theme: ThemeName): string {\n return theme === 'dark' ? DARK_STYLE : LIGHT_STYLE;\n}\n","/**\n * 足迹地球 · 主类\n * 契约依据:《Sprint 1 执行方案》§4.2、§7 S1-14\n */\n\nimport { normalizeConfig } from './config/normalize';\nimport type { Category, FootprintConfig, Pin, RenderConfig } from './config/schema';\nimport { validateConfig } from './config/validate';\nimport { FootprintError } from './errors';\nimport { ListView } from './fallback/list-view';\nimport { LegendView } from './legend-view';\nimport { MapController, resolveMaplibre } from './map-controller';\nimport { MarkerLayer } from './marker-layer';\nimport { PopupManager } from './popup-manager';\nimport { applyPrivacy } from './privacy';\nimport { ThemeManager } from './theme-manager';\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\n\nexport interface FootprintGlobeOptions {\n config: FootprintConfig;\n maplibre?: MaplibreModule;\n maplibreUrl?: string;\n onError?: (err: FootprintError) => void;\n onReady?: (instance: FootprintGlobe) => void;\n}\n\ntype EventName = 'ready' | 'error' | 'marker:click';\ntype Handler = (...args: never[]) => void;\n\n/** 检测 WebGL 支持 */\nfunction detectWebGL(): boolean {\n try {\n const canvas = document.createElement('canvas');\n const g = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n return !!g;\n } catch {\n return false;\n }\n}\n\nexport class FootprintGlobe {\n private container: HTMLElement;\n private options: FootprintGlobeOptions;\n private config: FootprintConfig | null = null;\n\n private mapController: MapController | null = null;\n private markerLayer: MarkerLayer | null = null;\n private popupManager: PopupManager | null = null;\n private legendView: LegendView | null = null;\n private themeManager: ThemeManager | null = null;\n private listView: ListView | null = null;\n\n private listeners = new Map<EventName, Set<Handler>>();\n private destroyed = false;\n private ready = false;\n\n constructor(container: HTMLElement, options: FootprintGlobeOptions) {\n this.container = container;\n this.options = options;\n void this.init();\n }\n\n private async init(): Promise<void> {\n try {\n const errs = validateConfig(this.options.config);\n if (errs.length > 0) {\n this.fail(errs[0]!);\n return;\n }\n\n let config = normalizeConfig(this.options.config);\n\n // 应用隐私\n const privacy = config.config?.privacy;\n if (privacy && ((privacy.blur ?? 0) > 0 || privacy.cityOnly)) {\n config = {\n ...config,\n categories: config.categories.map((c) => ({\n ...c,\n pins: applyPrivacy(c.pins, privacy),\n })),\n };\n }\n this.config = config;\n\n // WebGL 检测\n if (!detectWebGL()) {\n this.renderFallback('当前浏览器不支持 3D 渲染,已切换为列表视图。');\n this.emitError(new FootprintError('WEBGL_UNSUPPORTED'));\n return;\n }\n\n // 解析 MapLibre\n let maplibre: MaplibreModule;\n try {\n maplibre = await resolveMaplibre(\n { maplibre: this.options.maplibre, maplibreUrl: this.options.maplibreUrl },\n config.config ?? {},\n );\n } catch (e) {\n const err = e instanceof FootprintError ? e : new FootprintError('MAPLIBRE_MISSING', e);\n this.renderFallback('地图引擎加载失败,已切换为列表视图。');\n this.emitError(err);\n return;\n }\n\n if (this.destroyed) return;\n\n // 初始化地图\n this.mapController = new MapController(this.container, maplibre, config.config ?? {});\n this.mapController.init();\n\n // 主题\n this.themeManager = new ThemeManager(this.container);\n this.themeManager.apply(config.config?.theme ?? 'light');\n\n // Popup\n this.popupManager = new PopupManager(maplibre);\n\n // 标记\n this.markerLayer = new MarkerLayer({\n maplibre,\n map: this.mapController.getMap(),\n popup: this.popupManager,\n onPinClick: (pin, category) => this.emit('marker:click', pin, category),\n });\n this.markerLayer.render(config.categories);\n\n // 图例\n if (config.config?.legend !== false) {\n this.legendView = new LegendView(this.container);\n this.legendView.render(config.categories);\n }\n\n // 点击空白关闭\n const map = this.mapController.getMap() as { on?: (ev: string, cb: () => void) => void };\n map?.on?.('click', () => this.popupManager?.close());\n\n // 底图/瓦片加载失败诊断(如网络不可达 tiles.openfreemap.org)\n let styleErrorReported = false;\n map?.on?.('error', (...args: unknown[]) => {\n if (styleErrorReported) return;\n const e = args[0] as { error?: Error } | undefined;\n const msg = e?.error?.message ?? '';\n if (!/style|tile|fetch|network|Failed/i.test(msg)) return;\n styleErrorReported = true;\n this.emitError(\n new FootprintError(\n 'DATA_LOAD_FAILED',\n e?.error ?? new Error(msg),\n `底图加载失败:当前网络可能无法访问默认瓦片源(tiles.openfreemap.org)。可在配置 config.style 中切换为可访问的瓦片样式,或自托管瓦片。`,\n ),\n );\n });\n\n this.ready = true;\n this.emit('ready');\n this.options.onReady?.(this);\n\n // 首帧后校正一次画布尺寸:\n // 容器若在初始化瞬间被浏览器缩放/字体加载等影响而误测,\n // canvas 会残留错误的内联 px 尺寸,这里强制对齐当前容器。\n requestAnimationFrame(() => {\n if (this.destroyed) return;\n try {\n (map as { resize?: () => void }).resize?.();\n } catch {\n /* noop */\n }\n });\n } catch (e) {\n this.fail(e);\n }\n }\n\n private renderFallback(reason: string): void {\n if (!this.config) return;\n this.listView = new ListView({\n container: this.container,\n categories: this.config.categories,\n reason,\n });\n this.listView.render();\n }\n\n private fail(e: unknown): void {\n const err = e instanceof FootprintError ? e : new FootprintError('RENDER_FAILED', e);\n console.error('[footprint-globe]', err);\n this.emitError(err);\n }\n\n /** 触发 error 事件并回调 onError */\n private emitError(err: FootprintError): void {\n this.emit('error', err);\n this.options.onError?.(err);\n }\n\n update(partial: Partial<FootprintConfig>): void {\n if (this.destroyed || !this.config) return;\n if (!this.ready) return;\n\n const merged: FootprintConfig = {\n version: 1,\n dataId: partial.dataId ?? this.config.dataId,\n categories: partial.categories ?? this.config.categories,\n config: { ...(this.config.config ?? {}), ...(partial.config ?? {}) },\n routes: partial.routes ?? this.config.routes,\n };\n\n const errs = validateConfig(merged);\n if (errs.length > 0) {\n this.fail(errs[0]!);\n return;\n }\n\n let next = normalizeConfig(merged);\n const privacy = next.config?.privacy;\n if (privacy && ((privacy.blur ?? 0) > 0 || privacy.cityOnly)) {\n next = {\n ...next,\n categories: next.categories.map((c) => ({\n ...c,\n pins: applyPrivacy(c.pins, privacy),\n })),\n };\n }\n this.config = next;\n\n // 重渲染\n this.markerLayer?.render(next.categories);\n if (this.legendView) {\n this.legendView.render(next.categories);\n } else if (next.config?.legend !== false) {\n this.legendView = new LegendView(this.container);\n this.legendView.render(next.categories);\n } else {\n this.legendView = null;\n }\n\n const theme = next.config?.theme ?? 'light';\n this.themeManager?.apply(theme);\n\n const projection = next.config?.projection ?? 'globe';\n this.mapController?.applyProjection(projection);\n this.mapController?.applyFog(next.config?.fog);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n this.markerLayer?.destroy();\n this.markerLayer = null;\n\n this.legendView?.destroy();\n this.legendView = null;\n\n this.popupManager?.destroy();\n this.popupManager = null;\n\n this.themeManager?.destroy();\n this.themeManager = null;\n\n this.listView?.destroy();\n this.listView = null;\n\n this.mapController?.destroy();\n this.mapController = null;\n\n this.listeners.clear();\n this.ready = false;\n }\n\n getMap(): unknown {\n return this.mapController?.getMap() ?? null;\n }\n\n getConfig(): Readonly<FootprintConfig> {\n if (!this.ready || !this.config) throw new Error('FootprintGlobe not initialized');\n return this.config;\n }\n\n on(event: 'ready', handler: () => void): () => void;\n on(event: 'error', handler: (err: FootprintError) => void): () => void;\n on(event: 'marker:click', handler: (pin: Pin, category: Category) => void): () => void;\n on(event: EventName, handler: Handler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n return () => {\n this.listeners.get(event)?.delete(handler);\n };\n }\n\n private emit(event: EventName, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((h) => {\n try {\n (h as (...a: unknown[]) => void)(...args);\n } catch (e) {\n console.error('[footprint-globe] listener error', e);\n }\n });\n }\n}\n\nexport type { RenderConfig };\n","/**\n * 足迹地球 · Web Component 属性解析\n * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-3\n */\n\nimport type { FootprintConfig, RenderConfig } from '../index';\n\nexport interface ParsedAttributes {\n id?: string;\n pins?: string;\n src?: string;\n maplibreUrl?: string;\n config?: Partial<RenderConfig>;\n height?: string;\n}\n\nfunction parseBool(v: string | null): boolean | undefined {\n if (v === null) return undefined;\n if (v === 'true' || v === '1' || v === '') return true;\n if (v === 'false' || v === '0') return false;\n return undefined;\n}\n\nfunction parseNumber(v: string | null): number | undefined {\n if (v === null) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseCenter(v: string | null): [number, number] | undefined {\n if (!v) return undefined;\n const parts = v.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 2) return undefined;\n const [lng, lat] = parts;\n if (!Number.isFinite(lng) || !Number.isFinite(lat)) return undefined;\n return [lng!, lat!];\n}\n\n/**\n * 从宿主元素读取所有 footprint-globe 相关属性。\n * 非法值静默忽略,由 core 使用默认值兜底。\n */\nexport function parseAttributes(el: HTMLElement): ParsedAttributes {\n const out: ParsedAttributes = {};\n\n const id = el.getAttribute('data-id');\n if (id) out.id = id;\n\n const pins = el.getAttribute('data-pins');\n if (pins) out.pins = pins;\n\n const src = el.getAttribute('data-src');\n if (src) out.src = src;\n\n const maplibreUrl = el.getAttribute('maplibre-url');\n if (maplibreUrl) out.maplibreUrl = maplibreUrl;\n\n const height = el.getAttribute('height');\n if (height) out.height = height;\n\n const cfg: Partial<RenderConfig> = {};\n\n const theme = el.getAttribute('theme');\n if (theme === 'light' || theme === 'dark' || theme === 'auto') cfg.theme = theme;\n\n const projection = el.getAttribute('projection');\n if (projection === 'globe' || projection === 'mercator') cfg.projection = projection;\n\n const center = parseCenter(el.getAttribute('center'));\n if (center) cfg.center = center;\n\n const zoom = parseNumber(el.getAttribute('zoom'));\n if (zoom !== undefined) cfg.zoom = zoom;\n\n const legend = parseBool(el.getAttribute('legend'));\n if (legend !== undefined) cfg.legend = legend;\n\n const autorotate = parseBool(el.getAttribute('autorotate'));\n if (autorotate !== undefined) cfg.autorotate = autorotate;\n\n const attribution = parseBool(el.getAttribute('attribution'));\n if (attribution !== undefined) cfg.attribution = attribution;\n\n const privacy: { blur?: number; cityOnly?: boolean } = {};\n const blur = parseNumber(el.getAttribute('privacy-blur'));\n if (blur !== undefined) privacy.blur = blur;\n const cityOnly = parseBool(el.getAttribute('privacy-city-only'));\n if (cityOnly !== undefined) privacy.cityOnly = cityOnly;\n if (Object.keys(privacy).length > 0) cfg.privacy = privacy;\n\n if (Object.keys(cfg).length > 0) out.config = cfg;\n\n return out;\n}\n\n/** 合并属性 config 到已有 config(属性优先) */\nexport function mergeAttributeConfig(\n base: FootprintConfig,\n attrs: ParsedAttributes,\n): FootprintConfig {\n if (!attrs.config) return base;\n return {\n ...base,\n config: { ...(base.config ?? {}), ...attrs.config },\n };\n}\n","/**\n * 足迹地球 · Shadow DOM 样式注入\n * 契约依据:《Sprint 2 执行方案》§6 S2-2\n *\n * 构建时通过 tsup define 把 core 的 CSS 注入为 __FP_SHADOW_CSS__。\n * 运行时把 `:root` 改写为 `:host, :root`,使变量在 Shadow DOM 内生效。\n */\n\ndeclare const __FP_SHADOW_CSS__: string | undefined;\n\nconst RAW: string = typeof __FP_SHADOW_CSS__ !== 'undefined' ? __FP_SHADOW_CSS__ : '';\n\n/** 把顶层 `:root` 选择器改写为 `:host, :root`,兼容 Shadow DOM */\nfunction adaptRootSelector(css: string): string {\n return css.replace(/(^|[^\\w-]):root(\\b)/g, '$1:host, :root$2');\n}\n\nexport const SHADOW_CSS: string = adaptRootSelector(RAW);\n\n/** 额外补充:Shadow DOM 内的容器基础样式(core CSS 里给的是 .footprint-globe,这里补 :host) */\nconst HOST_CSS = `\n:host {\n display: block;\n width: 100%;\n min-height: var(--fp-globe-height, 400px);\n border-radius: var(--fp-globe-radius, 12px);\n overflow: hidden;\n background: var(--fp-globe-bg, #eef2f7);\n}\n`;\n\nexport function getShadowStyle(): string {\n return HOST_CSS + '\\n' + SHADOW_CSS;\n}\n","/**\n * 足迹地球 · 自定义元素 <footprint-globe>\n * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-1 / S2-4、§8 S2-12\n * 决策:S2-Q1 Shadow DOM open;S2-Q9 disconnect 自动 destroy\n */\n\nimport { FootprintGlobe, loadData, validateConfig, type FootprintConfig } from '../index';\nimport { mergeAttributeConfig, parseAttributes } from './attributes';\nimport { getShadowStyle } from './styles';\n\nconst DEFAULT_ARIA_LABEL = '足迹地球';\n\nexport class FootprintGlobeElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\n 'data-id',\n 'data-pins',\n 'data-src',\n 'maplibre-url',\n 'theme',\n 'projection',\n 'center',\n 'zoom',\n 'height',\n 'legend',\n 'autorotate',\n 'attribution',\n 'privacy-blur',\n 'privacy-city-only',\n ];\n }\n\n private root: ShadowRoot;\n private container: HTMLElement;\n private instance: FootprintGlobe | null = null;\n private initToken = 0;\n private ready = false;\n\n constructor() {\n super();\n\n this.root = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = getShadowStyle();\n this.root.appendChild(style);\n\n this.container = document.createElement('div');\n this.container.className = 'footprint-globe';\n this.container.setAttribute('part', 'globe');\n this.root.appendChild(this.container);\n }\n\n connectedCallback(): void {\n // a11y:默认 role 与 aria-label(可被宿主覆盖)\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'region');\n }\n if (!this.hasAttribute('aria-label')) {\n this.setAttribute('aria-label', DEFAULT_ARIA_LABEL);\n }\n void this.init();\n }\n\n disconnectedCallback(): void {\n this.destroy();\n }\n\n attributeChangedCallback(): void {\n if (!this.instance || !this.ready) return;\n // 简化:属性变更时只同步 config(数据源变更需手动重挂载)\n const attrs = parseAttributes(this);\n if (attrs.config) {\n this.instance.update({ config: attrs.config });\n }\n if (attrs.height) {\n this.container.style.setProperty('--fp-globe-height', attrs.height);\n }\n }\n\n private async init(): Promise<void> {\n if (this.ready || this.instance) return;\n const token = ++this.initToken;\n\n try {\n const attrs = parseAttributes(this);\n let baseConfig: FootprintConfig;\n\n if (attrs.id || attrs.src || attrs.pins) {\n const r = await loadData({\n id: attrs.id,\n src: attrs.src,\n data: attrs.pins,\n });\n baseConfig = r.config;\n } else {\n const g = (globalThis as { FOOTPRINT_PINS?: unknown }).FOOTPRINT_PINS;\n if (!g) {\n this.renderError('未提供数据源:请设置 data-pins、data-src 或 window.FOOTPRINT_PINS');\n return;\n }\n const r = await loadData({ globalVar: 'FOOTPRINT_PINS' });\n baseConfig = r.config;\n }\n\n if (token !== this.initToken) return; // 已取消\n\n const config = mergeAttributeConfig(baseConfig, attrs);\n\n const errs = validateConfig(config);\n if (errs.length > 0) {\n this.renderError(errs[0]!.userMessage);\n return;\n }\n\n if (attrs.height) {\n this.container.style.setProperty('--fp-globe-height', attrs.height);\n }\n\n this.instance = new FootprintGlobe(this.container, {\n config,\n maplibreUrl: attrs.maplibreUrl,\n onReady: () => {\n this.ready = true;\n this.dispatchEvent(new CustomEvent('fp-ready', { bubbles: true }));\n },\n onError: (err) => {\n this.dispatchEvent(new CustomEvent('fp-error', { detail: err, bubbles: true }));\n },\n });\n } catch (e) {\n if (token !== this.initToken) return;\n const msg = e instanceof Error ? e.message : String(e);\n this.renderError(msg);\n }\n }\n\n private renderError(msg: string): void {\n this.container.innerHTML = '';\n const div = document.createElement('div');\n div.className = 'footprint-error';\n div.setAttribute('part', 'error');\n div.setAttribute('role', 'alert');\n div.textContent = msg;\n this.container.appendChild(div);\n }\n\n // ===== 对外方法(S2-4) =====\n\n update(config: Partial<FootprintConfig>): void {\n this.instance?.update(config);\n }\n\n destroy(): void {\n this.initToken++;\n this.ready = false;\n this.instance?.destroy();\n this.instance = null;\n }\n\n getInstance(): FootprintGlobe | null {\n return this.instance;\n }\n}\n\nexport function register(): void {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get('footprint-globe')) {\n customElements.define('footprint-globe', FootprintGlobeElement);\n }\n}\n","/**\n * 足迹地球 · auto-init 扫描\n * 契约依据:《Sprint 2 执行方案》§4.3、§7 S2-5\n *\n * 用法:\n * <script type=\"module\" src=\".../embed.js\"></script>\n * <div class=\"footprint-globe\" data-pins=\"...\"></div>\n *\n * 行为:\n * - 扫描 .footprint-globe\n * - 若为 <footprint-globe>,跳过(由自定义元素接管)\n * - 否则作为容器挂载 FootprintGlobe 实例\n * - 用 data-fp-bound 防止重复初始化\n * - 不监听 DOM 变化(v1.1 加 MutationObserver)\n */\n\nimport { FootprintGlobe, loadData, validateConfig, type FootprintConfig } from '../index';\nimport { mergeAttributeConfig, parseAttributes } from './attributes';\nimport { register } from './element';\n\nconst BOUND_ATTR = 'data-fp-bound';\nconst SELECTOR = '.footprint-globe';\n\nfunction isCustomElement(el: Element): boolean {\n return el.tagName.toLowerCase() === 'footprint-globe';\n}\n\nfunction renderError(container: HTMLElement, msg: string): void {\n container.innerHTML = '';\n const div = document.createElement('div');\n div.className = 'footprint-error';\n div.textContent = msg;\n container.appendChild(div);\n}\n\nasync function initOne(el: HTMLElement): Promise<void> {\n if (el.hasAttribute(BOUND_ATTR)) return;\n el.setAttribute(BOUND_ATTR, '1');\n\n if (isCustomElement(el)) return;\n\n try {\n const attrs = parseAttributes(el);\n let baseConfig: FootprintConfig;\n\n if (attrs.id || attrs.src || attrs.pins) {\n const r = await loadData({\n id: attrs.id,\n src: attrs.src,\n data: attrs.pins,\n });\n baseConfig = r.config;\n } else {\n const g = (globalThis as { FOOTPRINT_PINS?: unknown }).FOOTPRINT_PINS;\n if (!g) {\n renderError(el, '未提供数据源:请设置 data-pins、data-src 或 window.FOOTPRINT_PINS');\n return;\n }\n const r = await loadData({ globalVar: 'FOOTPRINT_PINS' });\n baseConfig = r.config;\n }\n\n const config = mergeAttributeConfig(baseConfig, attrs);\n\n const errs = validateConfig(config);\n if (errs.length > 0) {\n renderError(el, errs[0]!.userMessage);\n return;\n }\n\n if (attrs.height) {\n el.style.setProperty('--fp-globe-height', attrs.height);\n }\n\n new FootprintGlobe(el, {\n config,\n maplibreUrl: attrs.maplibreUrl,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n renderError(el, msg);\n }\n}\n\n/** 扫描并初始化所有未绑定的 .footprint-globe */\nexport function autoInit(root: ParentNode = document): void {\n const nodes = root.querySelectorAll<HTMLElement>(SELECTOR);\n nodes.forEach((el) => void initOne(el));\n}\n\n/** 引导入口:注册自定义元素 + 自动扫描 */\nexport function boot(): void {\n register();\n\n if (typeof document === 'undefined') return;\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => autoInit(), { once: true });\n } else {\n autoInit();\n }\n}\n","/**\n * 足迹地球 · auto 入口\n * 只做一件事:boot()\n * 用法:\n * <script type=\"module\" src=\"https://cdn.jsdelivr.net/npm/footprint-globe@1/dist/auto.js\"></script>\n */\n\nimport { boot } from './auto-init';\n\nboot();\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/config/defaults.ts","../src/config/validate.ts","../src/config/normalize.ts","../src/data/loader.ts","../src/fallback/list-view.ts","../src/legend-view.ts","../src/map-controller.ts","../src/marker-layer.ts","../src/popup-manager.ts","../src/privacy.ts","../src/theme-manager.ts","../src/globe.ts","../src/web/attributes.ts","../src/web/styles.ts","../src/web/element.ts","../src/web/auto-init.ts","../src/web/auto-entry.ts"],"names":["isObject","raw","DEFAULT_MAPLIBRE_URL","Map"],"mappings":"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","file":"auto.cjs","sourcesContent":["/**\n * 足迹地球 · 错误体系\n * 契约:每个错误码有对应中文 userMessage,可直接展示给用户。\n */\n\nexport type FootprintErrorCode =\n | 'CONFIG_INVALID'\n | 'DATA_LOAD_FAILED'\n | 'WEBGL_UNSUPPORTED'\n | 'MAPLIBRE_MISSING'\n | 'RENDER_FAILED';\n\nconst USER_MESSAGES: Record<FootprintErrorCode, string> = {\n CONFIG_INVALID: '配置格式有误,请检查数据后重试。',\n DATA_LOAD_FAILED: '数据加载失败,请检查链接或网络后重试。',\n WEBGL_UNSUPPORTED: '当前浏览器不支持 3D 渲染,已切换为列表视图。',\n MAPLIBRE_MISSING: '地图引擎加载失败,已切换为列表视图。',\n RENDER_FAILED: '地图渲染失败,请刷新页面后重试。',\n};\n\nexport class FootprintError extends Error {\n readonly code: FootprintErrorCode;\n readonly detail?: unknown;\n readonly userMessage: string;\n\n constructor(code: FootprintErrorCode, detail?: unknown, overrideMessage?: string) {\n const message = overrideMessage ?? USER_MESSAGES[code];\n super(`[${code}] ${message}`);\n this.name = 'FootprintError';\n this.code = code;\n this.detail = detail;\n this.userMessage = message;\n }\n}\n\nexport function isFootprintError(e: unknown): e is FootprintError {\n return e instanceof FootprintError;\n}\n\nexport function configError(field: string, reason: string): FootprintError {\n return new FootprintError(\n 'CONFIG_INVALID',\n { field, reason },\n `配置字段 \"${field}\" 无效:${reason}`,\n );\n}\n\nexport function dataError(reason: string, detail?: unknown): FootprintError {\n return new FootprintError('DATA_LOAD_FAILED', detail ?? reason, `数据加载失败:${reason}`);\n}\n","/**\n * 足迹地球 · 默认值常量\n */\n\nimport type { FogConfig } from './schema';\n\nexport const DEFAULT_STYLE = 'https://tiles.openfreemap.org/styles/positron';\n\nexport const DEFAULT_MAPLIBRE_URL =\n 'https://cdn.jsdelivr.net/npm/maplibre-gl@5/dist/maplibre-gl.js';\n\nexport const DEFAULT_CENTER: [number, number] = [100, 30];\nexport const DEFAULT_ZOOM = 1.2;\n\nexport const DEFAULT_FOG: FogConfig = {\n color: 'rgba(0,0,0,0)',\n 'high-color': 'rgba(255,255,255,0.1)',\n 'space-color': 'rgba(0,0,0,0)',\n 'horizon-blend': 0,\n};\n\n/** 已知分类的默认颜色(用于旧格式转换 / CSV / GeoJSON) */\nexport const DEFAULT_CATEGORY_COLORS: Record<string, string> = {\n residence: '#2563eb',\n travel: '#f97316',\n default: '#6b7280',\n};\n\n/** 已知分类的默认标签 */\nexport const DEFAULT_CATEGORY_LABELS: Record<string, string> = {\n residence: '居住',\n travel: '旅行',\n default: '其他',\n};\n\n/** 数据边界(ADR-0001 决策 6) */\nexport const LIMITS = {\n MAX_PINS: 1000,\n MAX_FILE_SIZE: 1024 * 1024, // 1MB\n MAX_NAME_LEN: 200,\n MAX_NOTE_LEN: 500,\n MAX_PHOTOS: 5,\n MAX_CATEGORIES: 8,\n} as const;\n","/**\n * 足迹地球 · 配置校验\n * 契约依据:ADR-0001 决策 6、《Sprint 1 执行方案》§6 S1-2\n */\n\nimport { configError, type FootprintError } from '../errors';\nimport { LIMITS } from './defaults';\nimport type { Category, FootprintConfig, Pin } from './schema';\n\nconst CATEGORY_ID_RE = /^[a-z][a-z0-9-]*$/;\nconst HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\nconst DATA_ID_RE = /^[0-9a-zA-Z_-]{8}$/;\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === 'number' && Number.isFinite(v);\n}\n\nfunction validatePin(pin: unknown, categoryId: string, index: number): FootprintError[] {\n const errs: FootprintError[] = [];\n const path = `categories[${categoryId}].pins[${index}]`;\n\n if (!isObject(pin)) {\n errs.push(configError(path, '必须是对象'));\n return errs;\n }\n\n if (typeof pin.name !== 'string' || pin.name.length === 0) {\n errs.push(configError(`${path}.name`, '必须是非空字符串'));\n } else if (pin.name.length > LIMITS.MAX_NAME_LEN) {\n errs.push(configError(`${path}.name`, `长度不得超过 ${LIMITS.MAX_NAME_LEN}`));\n }\n\n if (!Array.isArray(pin.coords) || pin.coords.length !== 2) {\n errs.push(configError(`${path}.coords`, '必须是 [经度, 纬度] 数组'));\n } else {\n const [lng, lat] = pin.coords;\n if (!isFiniteNumber(lng) || lng < -180 || lng > 180) {\n errs.push(configError(`${path}.coords[0]`, '经度必须在 [-180, 180]'));\n }\n if (!isFiniteNumber(lat) || lat < -90 || lat > 90) {\n errs.push(configError(`${path}.coords[1]`, '纬度必须在 [-90, 90]'));\n }\n }\n\n if (pin.note !== undefined) {\n if (typeof pin.note !== 'string') {\n errs.push(configError(`${path}.note`, '必须是字符串'));\n } else if (pin.note.length > LIMITS.MAX_NOTE_LEN) {\n errs.push(configError(`${path}.note`, `长度不得超过 ${LIMITS.MAX_NOTE_LEN}`));\n }\n }\n\n if (pin.photos !== undefined) {\n if (!Array.isArray(pin.photos)) {\n errs.push(configError(`${path}.photos`, '必须是数组'));\n } else if (pin.photos.length > LIMITS.MAX_PHOTOS) {\n errs.push(configError(`${path}.photos`, `最多 ${LIMITS.MAX_PHOTOS} 张`));\n } else if (!pin.photos.every((p) => typeof p === 'string')) {\n errs.push(configError(`${path}.photos`, '数组元素必须是字符串'));\n }\n }\n\n return errs;\n}\n\nfunction validateCategory(cat: unknown, index: number): FootprintError[] {\n const errs: FootprintError[] = [];\n const path = `categories[${index}]`;\n\n if (!isObject(cat)) {\n errs.push(configError(path, '必须是对象'));\n return errs;\n }\n\n if (typeof cat.id !== 'string' || !CATEGORY_ID_RE.test(cat.id)) {\n errs.push(configError(`${path}.id`, '必须匹配 ^[a-z][a-z0-9-]*$'));\n }\n\n if (typeof cat.label !== 'string' || cat.label.length === 0) {\n errs.push(configError(`${path}.label`, '必须是非空字符串'));\n }\n\n if (typeof cat.color !== 'string' || !HEX_COLOR_RE.test(cat.color)) {\n errs.push(configError(`${path}.color`, '必须是 #RGB 或 #RRGGBB'));\n }\n\n if (cat.icon !== undefined) {\n const valid = ['dot', 'pin', 'star'];\n if (typeof cat.icon !== 'string' || !valid.includes(cat.icon)) {\n errs.push(configError(`${path}.icon`, `必须是 ${valid.join(' / ')}`));\n }\n }\n\n if (!Array.isArray(cat.pins)) {\n errs.push(configError(`${path}.pins`, '必须是数组'));\n } else {\n const catId = typeof cat.id === 'string' ? cat.id : String(index);\n cat.pins.forEach((p: unknown, i: number) => {\n errs.push(...validatePin(p, catId, i));\n });\n }\n\n return errs;\n}\n\nfunction validateRenderConfig(rc: unknown): FootprintError[] {\n const errs: FootprintError[] = [];\n if (!isObject(rc)) return errs;\n\n if (rc.projection !== undefined) {\n if (rc.projection !== 'globe' && rc.projection !== 'mercator') {\n errs.push(configError('config.projection', '必须是 globe 或 mercator'));\n }\n }\n if (rc.theme !== undefined) {\n const valid = ['light', 'dark', 'auto'];\n if (typeof rc.theme !== 'string' || !valid.includes(rc.theme)) {\n errs.push(configError('config.theme', `必须是 ${valid.join(' / ')}`));\n }\n }\n if (rc.style !== undefined && typeof rc.style !== 'string') {\n errs.push(configError('config.style', '必须是字符串'));\n }\n if (rc.maplibreUrl !== undefined && typeof rc.maplibreUrl !== 'string') {\n errs.push(configError('config.maplibreUrl', '必须是字符串'));\n }\n if (rc.zoom !== undefined && !isFiniteNumber(rc.zoom)) {\n errs.push(configError('config.zoom', '必须是数字'));\n }\n if (rc.legend !== undefined && typeof rc.legend !== 'boolean') {\n errs.push(configError('config.legend', '必须是布尔值'));\n }\n if (rc.autorotate !== undefined && typeof rc.autorotate !== 'boolean') {\n errs.push(configError('config.autorotate', '必须是布尔值'));\n }\n if (rc.privacy !== undefined && isObject(rc.privacy)) {\n if (rc.privacy.blur !== undefined && !isFiniteNumber(rc.privacy.blur)) {\n errs.push(configError('config.privacy.blur', '必须是数字'));\n }\n if (rc.privacy.cityOnly !== undefined && typeof rc.privacy.cityOnly !== 'boolean') {\n errs.push(configError('config.privacy.cityOnly', '必须是布尔值'));\n }\n }\n\n return errs;\n}\n\n/**\n * 校验配置对象,返回所有错误。空数组表示通过。\n */\nexport function validateConfig(input: unknown): FootprintError[] {\n const errs: FootprintError[] = [];\n\n if (!isObject(input)) {\n errs.push(configError('root', '必须是对象'));\n return errs;\n }\n\n if (input.version !== 1) {\n errs.push(configError('version', '必须为 1'));\n }\n\n if (input.dataId !== undefined) {\n if (typeof input.dataId !== 'string' || !DATA_ID_RE.test(input.dataId)) {\n errs.push(configError('dataId', '必须是 8 位 [0-9a-zA-Z_-]'));\n }\n }\n\n if (!Array.isArray(input.categories)) {\n errs.push(configError('categories', '必须是数组'));\n } else {\n if (input.categories.length === 0) {\n errs.push(configError('categories', '至少 1 个分类'));\n }\n if (input.categories.length > LIMITS.MAX_CATEGORIES) {\n errs.push(configError('categories', `最多 ${LIMITS.MAX_CATEGORIES} 个分类`));\n }\n input.categories.forEach((c: unknown, i: number) => {\n errs.push(...validateCategory(c, i));\n });\n\n // 检查总 pin 数\n const total = input.categories.reduce((sum: number, c: unknown) => {\n if (isObject(c) && Array.isArray(c.pins)) return sum + c.pins.length;\n return sum;\n }, 0);\n if (total > LIMITS.MAX_PINS) {\n errs.push(configError('categories.pins', `总标记数不得超过 ${LIMITS.MAX_PINS}`));\n }\n }\n\n if (input.config !== undefined) {\n errs.push(...validateRenderConfig(input.config));\n }\n\n return errs;\n}\n\n/** 断言配置合法,否则抛出第一个错误 */\nexport function assertValidConfig(input: unknown): asserts input is FootprintConfig {\n const errs = validateConfig(input);\n if (errs.length > 0) {\n throw errs[0]!;\n }\n}\n\n// 供外部引用类型(避免 TS 未使用告警)\nexport type { FootprintConfig, Category, Pin };\n","/**\n * 足迹地球 · 配置归一化\n * 契约依据:PRD v1.1 §4.5、《Sprint 1 执行方案》§6 S1-3\n */\n\nimport {\n DEFAULT_CATEGORY_COLORS,\n DEFAULT_CATEGORY_LABELS,\n DEFAULT_CENTER,\n DEFAULT_FOG,\n DEFAULT_MAPLIBRE_URL,\n DEFAULT_STYLE,\n DEFAULT_ZOOM,\n} from './defaults';\nimport type { Category, FootprintConfig, Pin, RenderConfig } from './schema';\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/** 检测旧格式 { residence: [], travel: [] } */\nfunction isLegacyFormat(input: unknown): input is { residence?: unknown; travel?: unknown } {\n if (!isObject(input)) return false;\n if (input.version === 1) return false;\n if (Array.isArray(input.categories)) return false;\n return Array.isArray(input.residence) || Array.isArray(input.travel);\n}\n\n/** 将旧格式的 pins 归一化为 Pin[] */\nfunction normalizePins(raw: unknown): Pin[] {\n if (!Array.isArray(raw)) return [];\n const out: Pin[] = [];\n for (const item of raw) {\n if (!isObject(item)) continue;\n if (typeof item.name !== 'string') continue;\n if (!Array.isArray(item.coords) || item.coords.length !== 2) continue;\n const [lng, lat] = item.coords;\n if (typeof lng !== 'number' || typeof lat !== 'number') continue;\n const pin: Pin = { name: item.name, coords: [lng, lat] };\n if (typeof item.date === 'string') pin.date = item.date;\n if (typeof item.note === 'string') pin.note = item.note;\n if (Array.isArray(item.photos)) {\n pin.photos = item.photos.filter((p): p is string => typeof p === 'string');\n }\n out.push(pin);\n }\n return out;\n}\n\n/** 旧格式 → v1 categories */\nfunction normalizeLegacy(input: { residence?: unknown; travel?: unknown }): Category[] {\n const cats: Category[] = [];\n if (Array.isArray(input.residence) && input.residence.length > 0) {\n cats.push({\n id: 'residence',\n label: DEFAULT_CATEGORY_LABELS.residence!,\n color: DEFAULT_CATEGORY_COLORS.residence!,\n pins: normalizePins(input.residence),\n });\n }\n if (Array.isArray(input.travel) && input.travel.length > 0) {\n cats.push({\n id: 'travel',\n label: DEFAULT_CATEGORY_LABELS.travel!,\n color: DEFAULT_CATEGORY_COLORS.travel!,\n pins: normalizePins(input.travel),\n });\n }\n return cats;\n}\n\n/** 将 v1 分类补全为完整 Category */\nfunction normalizeCategory(raw: unknown): Category | null {\n if (!isObject(raw)) return null;\n if (typeof raw.id !== 'string' || typeof raw.label !== 'string') return null;\n if (typeof raw.color !== 'string') return null;\n const cat: Category = {\n id: raw.id,\n label: raw.label,\n color: raw.color,\n pins: normalizePins(raw.pins),\n };\n if (raw.icon === 'dot' || raw.icon === 'pin' || raw.icon === 'star') {\n cat.icon = raw.icon;\n }\n return cat;\n}\n\n/** 填充 RenderConfig 默认值 */\nfunction normalizeRenderConfig(raw: unknown): RenderConfig {\n const rc: RenderConfig = isObject(raw) ? { ...raw } : {};\n rc.projection ??= 'globe';\n rc.theme ??= 'light';\n rc.style ??= DEFAULT_STYLE;\n rc.maplibreUrl ??= DEFAULT_MAPLIBRE_URL;\n rc.center ??= DEFAULT_CENTER;\n rc.zoom ??= DEFAULT_ZOOM;\n rc.pitch ??= 0;\n rc.bearing ??= 0;\n rc.legend ??= true;\n rc.autorotate ??= false;\n rc.attribution ??= false;\n rc.fog ??= DEFAULT_FOG;\n rc.privacy ??= { blur: 0, cityOnly: false };\n return rc;\n}\n\n/**\n * 将任意输入归一化为 v1 FootprintConfig。\n * - 已 v1:补默认值\n * - 旧格式:转换 + 补默认值\n * - 其他:尽力转换(交给 validate 兜底)\n */\nexport function normalizeConfig(input: unknown): FootprintConfig {\n if (isLegacyFormat(input)) {\n return {\n version: 1,\n categories: normalizeLegacy(input),\n config: normalizeRenderConfig(undefined),\n };\n }\n\n if (isObject(input) && Array.isArray(input.categories)) {\n const cfg: FootprintConfig = {\n version: 1,\n categories: input.categories.map(normalizeCategory).filter((c): c is Category => c !== null),\n config: normalizeRenderConfig(input.config),\n };\n if (typeof input.dataId === 'string') cfg.dataId = input.dataId;\n if (Array.isArray(input.routes)) cfg.routes = input.routes as FootprintConfig['routes'];\n return cfg;\n }\n\n return {\n version: 1,\n categories: [],\n config: normalizeRenderConfig(undefined),\n };\n}\n","/**\n * 足迹地球 · 数据加载\n * 契约依据:ADR-0001 决策 2、《Sprint 1 执行方案》§6 S1-4\n */\n\nimport { normalizeConfig } from '../config/normalize';\nimport type { FootprintConfig, LoadOptions, LoadResult } from '../config/schema';\nimport { validateConfig } from '../config/validate';\nimport { dataError, FootprintError } from '../errors';\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * 校验数据源 URL:\n * - 相对路径先按当前页面地址解析(文档用法 data-src=\"./pins.json\")\n * - 放行 https: 任意地址\n * - 放行 http: 的本地开发主机(localhost / 127.0.0.1 / ::1,含任意端口)\n * - 其余(http://外网、file:、ftp: 等)一律拒绝\n */\nfunction assertAllowedUrl(url: string): URL {\n let u: URL;\n try {\n const base = typeof location !== 'undefined' ? location.href : undefined;\n u = new URL(url, base);\n } catch {\n throw dataError('数据源 URL 无效');\n }\n if (u.protocol === 'https:') return u;\n const isLocal = /^(localhost|127\\.0\\.0\\.1|::1|\\[::1\\])$/.test(u.hostname);\n if (u.protocol === 'http:' && isLocal) return u;\n throw dataError('数据源必须使用 HTTPS(本地开发环境 http://localhost 除外)');\n}\n\nasync function fetchJson(url: string): Promise<unknown> {\n const resolved = assertAllowedUrl(url);\n let res: Response;\n try {\n res = await fetch(resolved.href);\n } catch (e) {\n throw dataError('网络请求失败', e);\n }\n if (!res.ok) {\n throw dataError(`请求失败:HTTP ${res.status}`, res.status);\n }\n try {\n return await res.json();\n } catch (e) {\n throw dataError('响应不是有效的 JSON', e);\n }\n}\n\n/**\n * 加载并归一化数据。\n * 优先级:id > src > data > globalVar(ADR-0001 决策 2)\n */\nexport async function loadData(options: LoadOptions = {}): Promise<LoadResult> {\n const warnings: string[] = [];\n\n // 1. id(v1.1 托管)\n if (options.id) {\n throw dataError('短链托管尚未实现(计划 v1.1 提供)');\n }\n\n // 2. src\n if (options.src) {\n const raw = await fetchJson(options.src);\n return finalize(raw, warnings);\n }\n\n // 3. data(inline JSON)\n if (options.data) {\n let raw: unknown;\n try {\n raw = JSON.parse(options.data);\n } catch (e) {\n throw dataError('inline JSON 解析失败', e);\n }\n return finalize(raw, warnings);\n }\n\n // 4. 全局变量\n const varName = options.globalVar ?? 'FOOTPRINT_PINS';\n const g = globalThis as unknown as Record<string, unknown>;\n const raw = g[varName];\n if (raw === undefined) {\n throw dataError(`未找到全局变量 window.${varName}`);\n }\n\n return finalize(raw, warnings);\n}\n\nfunction finalize(raw: unknown, warnings: string[]): LoadResult {\n const config = normalizeConfig(raw);\n\n // 截断保护\n let total = 0;\n for (const cat of config.categories) total += cat.pins.length;\n if (total > 1000) {\n warnings.push(`标记总数 ${total} 超过 1000,已截断`);\n let kept = 0;\n for (const cat of config.categories) {\n const room = 1000 - kept;\n if (cat.pins.length > room) {\n cat.pins = cat.pins.slice(0, Math.max(0, room));\n }\n kept += cat.pins.length;\n }\n }\n\n const errs = validateConfig(config);\n if (errs.length > 0) {\n const first = errs[0]!;\n throw new FootprintError(\n first.code,\n { ...(isObject(first.detail) ? first.detail : {}), all: errs },\n first.userMessage,\n );\n }\n\n return { config, warnings };\n}\n\nexport type { FootprintConfig, LoadResult };\n","/**\n * 足迹地球 · 降级列表视图\n * 契约依据:ADR-0001 决策 3、《Sprint 1 执行方案》§7 S1-21\n * WebGL 不可用或 MapLibre 缺失时渲染。\n */\n\nimport type { Category } from '../config/schema';\n\nexport interface ListViewOptions {\n container: HTMLElement;\n categories: Category[];\n reason: string;\n}\n\nexport class ListView {\n private container: HTMLElement;\n private categories: Category[];\n private reason: string;\n private root: HTMLElement | null = null;\n\n constructor(opts: ListViewOptions) {\n this.container = opts.container;\n this.categories = opts.categories;\n this.reason = opts.reason;\n }\n\n render(): void {\n this.destroy();\n\n const root = document.createElement('div');\n root.className = 'footprint-list';\n root.setAttribute('role', 'region');\n root.setAttribute('aria-label', '足迹列表');\n root.setAttribute('part', 'list'); // S3-0a\n\n const notice = document.createElement('p');\n notice.className = 'footprint-list__notice';\n notice.textContent = this.reason;\n root.appendChild(notice);\n\n for (const cat of this.categories) {\n if (cat.pins.length === 0) continue;\n\n const group = document.createElement('section');\n group.className = 'footprint-list__group';\n group.style.setProperty('--fp-marker-color', cat.color);\n\n const heading = document.createElement('h3');\n heading.className = 'footprint-list__heading';\n\n const dot = document.createElement('i');\n dot.className = 'footprint-legend__dot';\n dot.setAttribute('aria-hidden', 'true');\n\n heading.appendChild(dot);\n heading.appendChild(document.createTextNode(cat.label));\n group.appendChild(heading);\n\n const ul = document.createElement('ul');\n ul.className = 'footprint-list__items';\n\n for (const pin of cat.pins) {\n const li = document.createElement('li');\n li.className = 'footprint-list__item';\n li.textContent = pin.name;\n if (pin.note) {\n li.title = pin.note;\n }\n ul.appendChild(li);\n }\n\n group.appendChild(ul);\n root.appendChild(group);\n }\n\n this.container.appendChild(root);\n this.root = root;\n }\n\n destroy(): void {\n if (this.root) {\n this.root.remove();\n this.root = null;\n }\n }\n}\n","/**\n * 足迹地球 · 图例\n * 契约依据:《Sprint 1 执行方案》§7 S1-10、《Sprint 3 执行方案》§6 S3-0a\n */\n\nimport type { Category } from './config/schema';\n\nexport class LegendView {\n private container: HTMLElement;\n private root: HTMLElement | null = null;\n\n constructor(container: HTMLElement) {\n this.container = container;\n }\n\n render(categories: Category[]): void {\n this.destroy();\n\n const root = document.createElement('div');\n root.className = 'footprint-legend';\n root.setAttribute('role', 'list');\n root.setAttribute('part', 'legend'); // S3-0a\n root.setAttribute('aria-label', '图例');\n\n for (const cat of categories) {\n const item = document.createElement('span');\n item.className = 'footprint-legend__item';\n item.setAttribute('role', 'listitem');\n\n const dot = document.createElement('i');\n dot.className = 'footprint-legend__dot';\n dot.setAttribute('aria-hidden', 'true');\n dot.style.setProperty('--fp-marker-color', cat.color);\n\n const label = document.createElement('span');\n label.textContent = cat.label;\n\n item.appendChild(dot);\n item.appendChild(label);\n root.appendChild(item);\n }\n\n this.container.appendChild(root);\n this.root = root;\n }\n\n destroy(): void {\n if (this.root) {\n this.root.remove();\n this.root = null;\n }\n }\n}\n","/**\n * 足迹地球 · MapLibre 封装\n * 契约依据:ADR-0001 决策 7、《Sprint 1 执行方案》§7 S1-7\n * 唯一直接调用 maplibregl 的模块。\n */\n\nimport { DEFAULT_FOG } from './config/defaults';\nimport type { RenderConfig } from './config/schema';\nimport { FootprintError } from './errors';\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\n\ninterface FootprintGlobeOptionsLike {\n maplibre?: MaplibreModule;\n maplibreUrl?: string;\n}\n\nconst DEFAULT_MAPLIBRE_URL = 'https://cdn.jsdelivr.net/npm/maplibre-gl@5/dist/maplibre-gl.js';\n\nconst MAPLIBRE_CSS_URL = 'https://cdn.jsdelivr.net/npm/maplibre-gl@5/dist/maplibre-gl.css';\n\n// auto 产物构建时内联的 maplibre-gl CSS(压缩后全文);index 产物中为空串。\n// 由 tsup define 注入,源码/测试环境中未定义,故用 typeof 守卫。\ndeclare const __FP_MAPLIBRE_CSS_BUNDLED__: string;\n\n/** 动态加载 maplibre-gl CSS(仅一次):优先注入内联 <style>,否则回退 CDN <link> */\nfunction ensureMaplibreCss(url = MAPLIBRE_CSS_URL): void {\n const marker = 'data-fp-maplibre-css';\n if (document.querySelector(`[${marker}]`)) return;\n\n const bundled =\n typeof __FP_MAPLIBRE_CSS_BUNDLED__ === 'string' ? __FP_MAPLIBRE_CSS_BUNDLED__ : '';\n if (bundled) {\n const style = document.createElement('style');\n style.setAttribute(marker, '1');\n style.textContent = bundled;\n document.head.appendChild(style);\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.setAttribute(marker, '1');\n document.head.appendChild(link);\n}\n\n/** 动态加载 maplibre-gl JS */\nfunction loadMaplibreFromUrl(url: string): Promise<MaplibreModule> {\n const g = globalThis as unknown as { maplibregl?: MaplibreModule };\n if (g.maplibregl) {\n ensureMaplibreCss();\n return Promise.resolve(g.maplibregl);\n }\n\n return new Promise((resolve, reject) => {\n const marker = 'data-fp-maplibre-js';\n const existing = document.querySelector<HTMLScriptElement>(`script[${marker}]`);\n\n const done = () => {\n if (g.maplibregl) {\n ensureMaplibreCss();\n resolve(g.maplibregl);\n } else {\n reject(new FootprintError('MAPLIBRE_MISSING', 'maplibregl 未挂载到 window'));\n }\n };\n\n if (existing) {\n existing.addEventListener('load', done, { once: true });\n existing.addEventListener(\n 'error',\n () => reject(new FootprintError('MAPLIBRE_MISSING', 'script 加载失败')),\n { once: true },\n );\n return;\n }\n\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n script.setAttribute(marker, '1');\n script.addEventListener('load', done, { once: true });\n script.addEventListener(\n 'error',\n () => reject(new FootprintError('MAPLIBRE_MISSING', 'script 加载失败')),\n { once: true },\n );\n document.head.appendChild(script);\n });\n}\n\n/**\n * 运行时解析 MapLibre 模块。\n * 优先级(ADR-0001 决策 7):\n * 1. options.maplibre(显式传入)\n * 2. window.maplibregl(全局)\n * 3. options.maplibreUrl / config.maplibreUrl(CDN)\n * 4. 失败 → 抛出 MAPLIBRE_MISSING\n */\nexport async function resolveMaplibre(\n options: FootprintGlobeOptionsLike,\n config: RenderConfig = {},\n): Promise<MaplibreModule> {\n if (options.maplibre) {\n ensureMaplibreCss();\n return options.maplibre;\n }\n const g = globalThis as unknown as { maplibregl?: MaplibreModule };\n if (g.maplibregl) {\n ensureMaplibreCss();\n return g.maplibregl;\n }\n const url = options.maplibreUrl ?? config.maplibreUrl ?? DEFAULT_MAPLIBRE_URL;\n return loadMaplibreFromUrl(url);\n}\n\nexport class MapController {\n private container: HTMLElement;\n private maplibre: MaplibreModule;\n private config: RenderConfig;\n private map: unknown = null;\n\n constructor(container: HTMLElement, maplibre: MaplibreModule, config: RenderConfig) {\n this.container = container;\n this.maplibre = maplibre;\n this.config = config;\n }\n\n init(): void {\n const Map = this.maplibre.Map;\n const map = new Map({\n container: this.container,\n style: this.config.style!,\n center: this.config.center!,\n zoom: this.config.zoom!,\n pitch: this.config.pitch ?? 0,\n bearing: this.config.bearing ?? 0,\n dragRotate: true,\n touchPitch: true,\n attributionControl: { compact: true },\n });\n\n this.map = map;\n\n // style.load 后再设置投影与 fog\n (map as { on: (ev: string, cb: () => void) => void }).on('style.load', () => {\n this.applyProjection(this.config.projection ?? 'globe');\n this.applyFog(this.config.fog ?? DEFAULT_FOG);\n });\n }\n\n applyProjection(type: 'globe' | 'mercator'): void {\n if (!this.map) return;\n (this.map as { setProjection: (o: { type: string }) => void }).setProjection({ type });\n }\n\n applyFog(fog: RenderConfig['fog']): void {\n if (!this.map || !fog) return;\n // MapLibre GL v5 移除了 setFog(大气效果改由 setSky 承担),且两者属性名不同:\n // fog: color / high-color / space-color / horizon-blend\n // sky: horizon-color / sky-color / fog-color / horizon-fog-blend\n // 能力探测:优先 setFog(v4 及兼容层),降级 setSky(v5,做属性名映射),均无则跳过。\n const m = this.map as unknown as {\n setFog?: (o: unknown) => void;\n setSky?: (o: unknown) => void;\n };\n try {\n if (typeof m.setFog === 'function') {\n m.setFog({\n color: fog.color ?? 'rgba(0,0,0,0)',\n 'high-color': fog['high-color'] ?? 'rgba(255,255,255,0.1)',\n 'space-color': fog['space-color'] ?? 'rgba(0,0,0,0)',\n 'horizon-blend': fog['horizon-blend'] ?? 0,\n });\n } else if (typeof m.setSky === 'function') {\n m.setSky({\n 'horizon-color': fog.color ?? 'rgba(0,0,0,0)',\n 'sky-color': fog['high-color'] ?? 'rgba(0,0,0,0)',\n 'fog-color': fog['space-color'] ?? 'rgba(0,0,0,0)',\n 'horizon-fog-blend': fog['horizon-blend'] ?? 0,\n });\n }\n } catch {\n // 大气效果失败不阻断地图初始化\n }\n }\n\n getMap(): unknown {\n return this.map;\n }\n\n destroy(): void {\n if (!this.map) return;\n try {\n (this.map as { remove: () => void }).remove();\n } catch {\n /* noop */\n }\n this.map = null;\n }\n}\n","/**\n * 足迹地球 · 标记渲染与交互\n * 契约依据:《Sprint 1 执行方案》§7 S1-8、§15 S1-Q4(使用 <button>)\n */\n\nimport type { Category, Pin } from './config/schema';\nimport type { PopupManager } from './popup-manager';\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\n\ninterface MarkerLayerOptions {\n maplibre: MaplibreModule;\n map: unknown;\n popup: PopupManager;\n onPinClick?: (pin: Pin, category: Category) => void;\n}\n\ninterface MarkerHandle {\n el: HTMLButtonElement;\n destroy: () => void;\n}\n\nexport class MarkerLayer {\n private maplibre: MaplibreModule;\n private map: unknown;\n private popup: PopupManager;\n private onPinClick?: (pin: Pin, category: Category) => void;\n private handles: MarkerHandle[] = [];\n\n constructor(opts: MarkerLayerOptions) {\n this.maplibre = opts.maplibre;\n this.map = opts.map;\n this.popup = opts.popup;\n this.onPinClick = opts.onPinClick;\n }\n\n render(categories: Category[]): void {\n this.clear();\n\n for (const category of categories) {\n for (const pin of category.pins) {\n this.addMarker(pin, category);\n }\n }\n }\n\n private addMarker(pin: Pin, category: Category): void {\n const el = document.createElement('button');\n el.type = 'button';\n el.className = 'footprint-marker';\n el.style.setProperty('--fp-marker-color', category.color);\n el.setAttribute('aria-label', pin.name);\n el.dataset.category = category.id;\n\n const open = () => {\n this.popup.open(this.map, pin.coords, pin.name);\n };\n const close = () => {\n this.popup.close();\n };\n const onClick = (e: MouseEvent) => {\n e.stopPropagation();\n open();\n this.onPinClick?.(pin, category);\n };\n\n el.addEventListener('mouseenter', open);\n el.addEventListener('mouseleave', close);\n el.addEventListener('focus', open);\n el.addEventListener('blur', close);\n el.addEventListener('click', onClick);\n\n const marker = new this.maplibre.Marker({ element: el, anchor: 'center' });\n marker.setLngLat(pin.coords).addTo(this.map as never);\n\n this.handles.push({\n el,\n destroy: () => {\n el.removeEventListener('mouseenter', open);\n el.removeEventListener('mouseleave', close);\n el.removeEventListener('focus', open);\n el.removeEventListener('blur', close);\n el.removeEventListener('click', onClick);\n el.remove();\n },\n });\n }\n\n clear(): void {\n for (const h of this.handles) h.destroy();\n this.handles = [];\n }\n\n /** 当前渲染的 marker 元素(测试用) */\n getElements(): HTMLButtonElement[] {\n return this.handles.map((h) => h.el);\n }\n\n destroy(): void {\n this.clear();\n }\n}\n","/**\n * 足迹地球 · 弹窗单例管理\n * 契约依据:《Sprint 1 执行方案》§7 S1-9\n */\n\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\ntype PopupInstance = {\n remove: () => void;\n setLngLat: (c: [number, number]) => unknown;\n setText: (t: string) => unknown;\n addTo: (m: unknown) => unknown;\n};\n\nexport class PopupManager {\n private maplibre: MaplibreModule;\n private active: PopupInstance | null = null;\n\n constructor(maplibre: MaplibreModule) {\n this.maplibre = maplibre;\n }\n\n open(map: unknown, coords: [number, number], text: string): void {\n this.close();\n const popup = new this.maplibre.Popup({\n offset: 8,\n closeButton: false,\n closeOnMove: false,\n focusAfterOpen: false,\n }) as unknown as PopupInstance;\n popup.setLngLat(coords);\n popup.setText(text);\n popup.addTo(map);\n this.active = popup;\n }\n\n close(): void {\n if (!this.active) return;\n try {\n this.active.remove();\n } catch {\n /* noop */\n }\n this.active = null;\n }\n\n destroy(): void {\n this.close();\n }\n}\n","/**\n * 足迹地球 · 隐私处理\n * 契约依据:《Sprint 1 执行方案》§7 S1-12、§15 S1-Q1(固定 seed 保证可复现)\n */\n\nimport type { Pin, PrivacyConfig } from './config/schema';\n\n/** FNV-1a 字符串哈希,作为确定性种子 */\nfunction hashString(s: string): number {\n let h = 2166136261;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return h >>> 0;\n}\n\n/** Mulberry32 PRNG,返回 [0, 1) */\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nconst KM_PER_DEG_LAT = 111.32;\n\n/** 四舍五入到 2 位小数(约 1km 精度,城市级) */\nfunction roundTo2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/**\n * 对 pins 应用隐私处理。\n * - blur:在 km 为单位的半径内做确定性随机偏移\n * - cityOnly:坐标保留 2 位小数\n * 两者可叠加。\n */\nexport function applyPrivacy(pins: Pin[], options: PrivacyConfig): Pin[] {\n const blur = options.blur ?? 0;\n const cityOnly = options.cityOnly ?? false;\n\n if (blur <= 0 && !cityOnly) return pins;\n\n return pins.map((pin) => {\n let [lng, lat] = pin.coords;\n\n if (blur > 0) {\n const seed = hashString(`${pin.name}:${lng}:${lat}`);\n const rand = mulberry32(seed);\n const angle = rand() * Math.PI * 2;\n const radius = Math.sqrt(rand()) * blur; // 均匀分布\n\n const dLat = (radius * Math.cos(angle)) / KM_PER_DEG_LAT;\n const cosLat = Math.max(Math.cos((lat * Math.PI) / 180), 0.01);\n const dLng = (radius * Math.sin(angle)) / (KM_PER_DEG_LAT * cosLat);\n\n lat = lat + dLat;\n lng = lng + dLng;\n\n // clamp\n lng = Math.max(-180, Math.min(180, lng));\n lat = Math.max(-90, Math.min(90, lat));\n }\n\n if (cityOnly) {\n lng = roundTo2(lng);\n lat = roundTo2(lat);\n }\n\n return { ...pin, coords: [lng, lat] };\n });\n}\n","/**\n * 足迹地球 · 主题\n * 契约依据:《Sprint 1 执行方案》§7 S1-11、§15 S1-Q2 / S1-Q9\n */\n\nexport type ThemeName = 'light' | 'dark' | 'auto';\n\nconst DARK_STYLE = 'https://tiles.openfreemap.org/styles/dark-matter';\nconst LIGHT_STYLE = 'https://tiles.openfreemap.org/styles/positron';\n\nexport class ThemeManager {\n private container: HTMLElement;\n private mediaQuery: MediaQueryList | null = null;\n private mediaHandler: ((e: MediaQueryListEvent) => void) | null = null;\n\n constructor(container: HTMLElement) {\n this.container = container;\n }\n\n apply(theme: ThemeName): void {\n this.detachMedia();\n\n if (theme === 'auto') {\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const sync = () => {\n const dark = this.mediaQuery!.matches;\n this.container.setAttribute('data-fp-theme', dark ? 'dark' : 'light');\n };\n sync();\n this.mediaHandler = sync;\n this.mediaQuery.addEventListener('change', this.mediaHandler);\n } else {\n this.container.setAttribute('data-fp-theme', 'light');\n }\n return;\n }\n\n this.container.setAttribute('data-fp-theme', theme);\n }\n\n private detachMedia(): void {\n if (this.mediaQuery && this.mediaHandler) {\n this.mediaQuery.removeEventListener('change', this.mediaHandler);\n }\n this.mediaQuery = null;\n this.mediaHandler = null;\n }\n\n destroy(): void {\n this.detachMedia();\n this.container.removeAttribute('data-fp-theme');\n }\n}\n\n/** 提供按主题取底图样式的辅助 */\nexport function styleForTheme(theme: ThemeName): string {\n return theme === 'dark' ? DARK_STYLE : LIGHT_STYLE;\n}\n","/**\n * 足迹地球 · 主类\n * 契约依据:《Sprint 1 执行方案》§4.2、§7 S1-14\n */\n\nimport { normalizeConfig } from './config/normalize';\nimport type { Category, FootprintConfig, Pin, RenderConfig } from './config/schema';\nimport { validateConfig } from './config/validate';\nimport { FootprintError } from './errors';\nimport { ListView } from './fallback/list-view';\nimport { LegendView } from './legend-view';\nimport { MapController, resolveMaplibre } from './map-controller';\nimport { MarkerLayer } from './marker-layer';\nimport { PopupManager } from './popup-manager';\nimport { applyPrivacy } from './privacy';\nimport { ThemeManager } from './theme-manager';\nimport type * as maplibregl from 'maplibre-gl';\n\ntype MaplibreModule = typeof maplibregl;\n\nexport interface FootprintGlobeOptions {\n config: FootprintConfig;\n maplibre?: MaplibreModule;\n maplibreUrl?: string;\n onError?: (err: FootprintError) => void;\n onReady?: (instance: FootprintGlobe) => void;\n}\n\ntype EventName = 'ready' | 'error' | 'marker:click';\ntype Handler = (...args: never[]) => void;\n\n/** 检测 WebGL 支持 */\nfunction detectWebGL(): boolean {\n try {\n const canvas = document.createElement('canvas');\n const g = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n return !!g;\n } catch {\n return false;\n }\n}\n\nexport class FootprintGlobe {\n private container: HTMLElement;\n private options: FootprintGlobeOptions;\n private config: FootprintConfig | null = null;\n\n private mapController: MapController | null = null;\n private markerLayer: MarkerLayer | null = null;\n private popupManager: PopupManager | null = null;\n private legendView: LegendView | null = null;\n private themeManager: ThemeManager | null = null;\n private listView: ListView | null = null;\n\n private listeners = new Map<EventName, Set<Handler>>();\n private destroyed = false;\n private ready = false;\n\n constructor(container: HTMLElement, options: FootprintGlobeOptions) {\n this.container = container;\n this.options = options;\n void this.init();\n }\n\n private async init(): Promise<void> {\n try {\n const errs = validateConfig(this.options.config);\n if (errs.length > 0) {\n this.fail(errs[0]!);\n return;\n }\n\n let config = normalizeConfig(this.options.config);\n\n // 应用隐私\n const privacy = config.config?.privacy;\n if (privacy && ((privacy.blur ?? 0) > 0 || privacy.cityOnly)) {\n config = {\n ...config,\n categories: config.categories.map((c) => ({\n ...c,\n pins: applyPrivacy(c.pins, privacy),\n })),\n };\n }\n this.config = config;\n\n // WebGL 检测\n if (!detectWebGL()) {\n this.renderFallback('当前浏览器不支持 3D 渲染,已切换为列表视图。');\n this.emitError(new FootprintError('WEBGL_UNSUPPORTED'));\n return;\n }\n\n // 解析 MapLibre\n let maplibre: MaplibreModule;\n try {\n maplibre = await resolveMaplibre(\n { maplibre: this.options.maplibre, maplibreUrl: this.options.maplibreUrl },\n config.config ?? {},\n );\n } catch (e) {\n const err = e instanceof FootprintError ? e : new FootprintError('MAPLIBRE_MISSING', e);\n this.renderFallback('地图引擎加载失败,已切换为列表视图。');\n this.emitError(err);\n return;\n }\n\n if (this.destroyed) return;\n\n // 初始化地图\n this.mapController = new MapController(this.container, maplibre, config.config ?? {});\n this.mapController.init();\n\n // 主题\n this.themeManager = new ThemeManager(this.container);\n this.themeManager.apply(config.config?.theme ?? 'light');\n\n // Popup\n this.popupManager = new PopupManager(maplibre);\n\n // 标记\n this.markerLayer = new MarkerLayer({\n maplibre,\n map: this.mapController.getMap(),\n popup: this.popupManager,\n onPinClick: (pin, category) => this.emit('marker:click', pin, category),\n });\n this.markerLayer.render(config.categories);\n\n // 图例\n if (config.config?.legend !== false) {\n this.legendView = new LegendView(this.container);\n this.legendView.render(config.categories);\n }\n\n // 点击空白关闭\n const map = this.mapController.getMap() as { on?: (ev: string, cb: () => void) => void };\n map?.on?.('click', () => this.popupManager?.close());\n\n // 底图/瓦片加载失败诊断(如网络不可达 tiles.openfreemap.org)\n let styleErrorReported = false;\n map?.on?.('error', (...args: unknown[]) => {\n if (styleErrorReported) return;\n const e = args[0] as { error?: Error } | undefined;\n const msg = e?.error?.message ?? '';\n if (!/style|tile|fetch|network|Failed/i.test(msg)) return;\n styleErrorReported = true;\n this.emitError(\n new FootprintError(\n 'DATA_LOAD_FAILED',\n e?.error ?? new Error(msg),\n `底图加载失败:当前网络可能无法访问默认瓦片源(tiles.openfreemap.org)。可在配置 config.style 中切换为可访问的瓦片样式,或自托管瓦片。`,\n ),\n );\n });\n\n this.ready = true;\n this.emit('ready');\n this.options.onReady?.(this);\n\n // 首帧后校正一次画布尺寸:\n // 容器若在初始化瞬间被浏览器缩放/字体加载等影响而误测,\n // canvas 会残留错误的内联 px 尺寸,这里强制对齐当前容器。\n requestAnimationFrame(() => {\n if (this.destroyed) return;\n try {\n (map as { resize?: () => void }).resize?.();\n } catch {\n /* noop */\n }\n });\n } catch (e) {\n this.fail(e);\n }\n }\n\n private renderFallback(reason: string): void {\n if (!this.config) return;\n this.listView = new ListView({\n container: this.container,\n categories: this.config.categories,\n reason,\n });\n this.listView.render();\n }\n\n private fail(e: unknown): void {\n const err = e instanceof FootprintError ? e : new FootprintError('RENDER_FAILED', e);\n console.error('[footprint-globe]', err);\n this.emitError(err);\n }\n\n /** 触发 error 事件并回调 onError */\n private emitError(err: FootprintError): void {\n this.emit('error', err);\n this.options.onError?.(err);\n }\n\n update(partial: Partial<FootprintConfig>): void {\n if (this.destroyed || !this.config) return;\n if (!this.ready) return;\n\n const merged: FootprintConfig = {\n version: 1,\n dataId: partial.dataId ?? this.config.dataId,\n categories: partial.categories ?? this.config.categories,\n config: { ...(this.config.config ?? {}), ...(partial.config ?? {}) },\n routes: partial.routes ?? this.config.routes,\n };\n\n const errs = validateConfig(merged);\n if (errs.length > 0) {\n this.fail(errs[0]!);\n return;\n }\n\n let next = normalizeConfig(merged);\n const privacy = next.config?.privacy;\n if (privacy && ((privacy.blur ?? 0) > 0 || privacy.cityOnly)) {\n next = {\n ...next,\n categories: next.categories.map((c) => ({\n ...c,\n pins: applyPrivacy(c.pins, privacy),\n })),\n };\n }\n this.config = next;\n\n // 重渲染\n this.markerLayer?.render(next.categories);\n if (this.legendView) {\n this.legendView.render(next.categories);\n } else if (next.config?.legend !== false) {\n this.legendView = new LegendView(this.container);\n this.legendView.render(next.categories);\n } else {\n this.legendView = null;\n }\n\n const theme = next.config?.theme ?? 'light';\n this.themeManager?.apply(theme);\n\n const projection = next.config?.projection ?? 'globe';\n this.mapController?.applyProjection(projection);\n this.mapController?.applyFog(next.config?.fog);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n this.markerLayer?.destroy();\n this.markerLayer = null;\n\n this.legendView?.destroy();\n this.legendView = null;\n\n this.popupManager?.destroy();\n this.popupManager = null;\n\n this.themeManager?.destroy();\n this.themeManager = null;\n\n this.listView?.destroy();\n this.listView = null;\n\n this.mapController?.destroy();\n this.mapController = null;\n\n this.listeners.clear();\n this.ready = false;\n }\n\n getMap(): unknown {\n return this.mapController?.getMap() ?? null;\n }\n\n getConfig(): Readonly<FootprintConfig> {\n if (!this.ready || !this.config) throw new Error('FootprintGlobe not initialized');\n return this.config;\n }\n\n on(event: 'ready', handler: () => void): () => void;\n on(event: 'error', handler: (err: FootprintError) => void): () => void;\n on(event: 'marker:click', handler: (pin: Pin, category: Category) => void): () => void;\n on(event: EventName, handler: Handler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n return () => {\n this.listeners.get(event)?.delete(handler);\n };\n }\n\n private emit(event: EventName, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((h) => {\n try {\n (h as (...a: unknown[]) => void)(...args);\n } catch (e) {\n console.error('[footprint-globe] listener error', e);\n }\n });\n }\n}\n\nexport type { RenderConfig };\n","/**\n * 足迹地球 · Web Component 属性解析\n * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-3\n */\n\nimport type { FootprintConfig, RenderConfig } from '../index';\n\nexport interface ParsedAttributes {\n id?: string;\n pins?: string;\n src?: string;\n maplibreUrl?: string;\n config?: Partial<RenderConfig>;\n height?: string;\n}\n\nfunction parseBool(v: string | null): boolean | undefined {\n if (v === null) return undefined;\n if (v === 'true' || v === '1' || v === '') return true;\n if (v === 'false' || v === '0') return false;\n return undefined;\n}\n\nfunction parseNumber(v: string | null): number | undefined {\n if (v === null) return undefined;\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseCenter(v: string | null): [number, number] | undefined {\n if (!v) return undefined;\n const parts = v.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 2) return undefined;\n const [lng, lat] = parts;\n if (!Number.isFinite(lng) || !Number.isFinite(lat)) return undefined;\n return [lng!, lat!];\n}\n\n/**\n * 从宿主元素读取所有 footprint-globe 相关属性。\n * 非法值静默忽略,由 core 使用默认值兜底。\n */\nexport function parseAttributes(el: HTMLElement): ParsedAttributes {\n const out: ParsedAttributes = {};\n\n const id = el.getAttribute('data-id');\n if (id) out.id = id;\n\n const pins = el.getAttribute('data-pins');\n if (pins) out.pins = pins;\n\n const src = el.getAttribute('data-src');\n if (src) out.src = src;\n\n const maplibreUrl = el.getAttribute('maplibre-url');\n if (maplibreUrl) out.maplibreUrl = maplibreUrl;\n\n const height = el.getAttribute('height');\n if (height) out.height = height;\n\n const cfg: Partial<RenderConfig> = {};\n\n const theme = el.getAttribute('theme');\n if (theme === 'light' || theme === 'dark' || theme === 'auto') cfg.theme = theme;\n\n const projection = el.getAttribute('projection');\n if (projection === 'globe' || projection === 'mercator') cfg.projection = projection;\n\n const center = parseCenter(el.getAttribute('center'));\n if (center) cfg.center = center;\n\n const zoom = parseNumber(el.getAttribute('zoom'));\n if (zoom !== undefined) cfg.zoom = zoom;\n\n const legend = parseBool(el.getAttribute('legend'));\n if (legend !== undefined) cfg.legend = legend;\n\n const autorotate = parseBool(el.getAttribute('autorotate'));\n if (autorotate !== undefined) cfg.autorotate = autorotate;\n\n const attribution = parseBool(el.getAttribute('attribution'));\n if (attribution !== undefined) cfg.attribution = attribution;\n\n const privacy: { blur?: number; cityOnly?: boolean } = {};\n const blur = parseNumber(el.getAttribute('privacy-blur'));\n if (blur !== undefined) privacy.blur = blur;\n const cityOnly = parseBool(el.getAttribute('privacy-city-only'));\n if (cityOnly !== undefined) privacy.cityOnly = cityOnly;\n if (Object.keys(privacy).length > 0) cfg.privacy = privacy;\n\n if (Object.keys(cfg).length > 0) out.config = cfg;\n\n return out;\n}\n\n/** 合并属性 config 到已有 config(属性优先) */\nexport function mergeAttributeConfig(\n base: FootprintConfig,\n attrs: ParsedAttributes,\n): FootprintConfig {\n if (!attrs.config) return base;\n return {\n ...base,\n config: { ...(base.config ?? {}), ...attrs.config },\n };\n}\n","/**\n * 足迹地球 · Shadow DOM 样式注入\n * 契约依据:《Sprint 2 执行方案》§6 S2-2\n *\n * 构建时通过 tsup define 把 core 的 CSS 注入为 __FP_SHADOW_CSS__。\n * 运行时把 `:root` 改写为 `:host, :root`,使变量在 Shadow DOM 内生效。\n */\n\ndeclare const __FP_SHADOW_CSS__: string | undefined;\n\nconst RAW: string = typeof __FP_SHADOW_CSS__ !== 'undefined' ? __FP_SHADOW_CSS__ : '';\n\n/** 把顶层 `:root` 选择器改写为 `:host, :root`,兼容 Shadow DOM */\nfunction adaptRootSelector(css: string): string {\n return css.replace(/(^|[^\\w-]):root(\\b)/g, '$1:host, :root$2');\n}\n\nexport const SHADOW_CSS: string = adaptRootSelector(RAW);\n\n/** 额外补充:Shadow DOM 内的容器基础样式(core CSS 里给的是 .footprint-globe,这里补 :host) */\nconst HOST_CSS = `\n:host {\n display: block;\n width: 100%;\n min-height: var(--fp-globe-height, 400px);\n border-radius: var(--fp-globe-radius, 12px);\n overflow: hidden;\n background: var(--fp-globe-bg, #eef2f7);\n}\n`;\n\nexport function getShadowStyle(): string {\n return HOST_CSS + '\\n' + SHADOW_CSS;\n}\n","/**\n * 足迹地球 · 自定义元素 <footprint-globe>\n * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-1 / S2-4、§8 S2-12\n * 决策:S2-Q1 Shadow DOM open;S2-Q9 disconnect 自动 destroy\n */\n\nimport { FootprintGlobe, loadData, validateConfig, type FootprintConfig } from '../index';\nimport { mergeAttributeConfig, parseAttributes } from './attributes';\nimport { getShadowStyle } from './styles';\n\nconst DEFAULT_ARIA_LABEL = '足迹地球';\n\nexport class FootprintGlobeElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return [\n 'data-id',\n 'data-pins',\n 'data-src',\n 'maplibre-url',\n 'theme',\n 'projection',\n 'center',\n 'zoom',\n 'height',\n 'legend',\n 'autorotate',\n 'attribution',\n 'privacy-blur',\n 'privacy-city-only',\n ];\n }\n\n private root: ShadowRoot;\n private container: HTMLElement;\n private instance: FootprintGlobe | null = null;\n private initToken = 0;\n private ready = false;\n\n constructor() {\n super();\n\n this.root = this.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = getShadowStyle();\n this.root.appendChild(style);\n\n this.container = document.createElement('div');\n this.container.className = 'footprint-globe';\n this.container.setAttribute('part', 'globe');\n this.root.appendChild(this.container);\n }\n\n connectedCallback(): void {\n // a11y:默认 role 与 aria-label(可被宿主覆盖)\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'region');\n }\n if (!this.hasAttribute('aria-label')) {\n this.setAttribute('aria-label', DEFAULT_ARIA_LABEL);\n }\n void this.init();\n }\n\n disconnectedCallback(): void {\n this.destroy();\n }\n\n attributeChangedCallback(): void {\n if (!this.instance || !this.ready) return;\n // 简化:属性变更时只同步 config(数据源变更需手动重挂载)\n const attrs = parseAttributes(this);\n if (attrs.config) {\n this.instance.update({ config: attrs.config });\n }\n if (attrs.height) {\n this.container.style.setProperty('--fp-globe-height', attrs.height);\n }\n }\n\n private async init(): Promise<void> {\n if (this.ready || this.instance) return;\n const token = ++this.initToken;\n\n try {\n const attrs = parseAttributes(this);\n let baseConfig: FootprintConfig;\n\n if (attrs.id || attrs.src || attrs.pins) {\n const r = await loadData({\n id: attrs.id,\n src: attrs.src,\n data: attrs.pins,\n });\n baseConfig = r.config;\n } else {\n const g = (globalThis as { FOOTPRINT_PINS?: unknown }).FOOTPRINT_PINS;\n if (!g) {\n this.renderError('未提供数据源:请设置 data-pins、data-src 或 window.FOOTPRINT_PINS');\n return;\n }\n const r = await loadData({ globalVar: 'FOOTPRINT_PINS' });\n baseConfig = r.config;\n }\n\n if (token !== this.initToken) return; // 已取消\n\n const config = mergeAttributeConfig(baseConfig, attrs);\n\n const errs = validateConfig(config);\n if (errs.length > 0) {\n this.renderError(errs[0]!.userMessage);\n return;\n }\n\n if (attrs.height) {\n this.container.style.setProperty('--fp-globe-height', attrs.height);\n }\n\n this.instance = new FootprintGlobe(this.container, {\n config,\n maplibreUrl: attrs.maplibreUrl,\n onReady: () => {\n this.ready = true;\n this.dispatchEvent(new CustomEvent('fp-ready', { bubbles: true }));\n },\n onError: (err) => {\n this.dispatchEvent(new CustomEvent('fp-error', { detail: err, bubbles: true }));\n },\n });\n } catch (e) {\n if (token !== this.initToken) return;\n const msg = e instanceof Error ? e.message : String(e);\n this.renderError(msg);\n }\n }\n\n private renderError(msg: string): void {\n this.container.innerHTML = '';\n const div = document.createElement('div');\n div.className = 'footprint-error';\n div.setAttribute('part', 'error');\n div.setAttribute('role', 'alert');\n div.textContent = msg;\n this.container.appendChild(div);\n }\n\n // ===== 对外方法(S2-4) =====\n\n update(config: Partial<FootprintConfig>): void {\n this.instance?.update(config);\n }\n\n destroy(): void {\n this.initToken++;\n this.ready = false;\n this.instance?.destroy();\n this.instance = null;\n }\n\n getInstance(): FootprintGlobe | null {\n return this.instance;\n }\n}\n\nexport function register(): void {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get('footprint-globe')) {\n customElements.define('footprint-globe', FootprintGlobeElement);\n }\n}\n","/**\n * 足迹地球 · auto-init 扫描\n * 契约依据:《Sprint 2 执行方案》§4.3、§7 S2-5\n *\n * 用法:\n * <script type=\"module\" src=\".../embed.js\"></script>\n * <div class=\"footprint-globe\" data-pins=\"...\"></div>\n *\n * 行为:\n * - 扫描 .footprint-globe\n * - 若为 <footprint-globe>,跳过(由自定义元素接管)\n * - 否则作为容器挂载 FootprintGlobe 实例\n * - 用 data-fp-bound 防止重复初始化\n * - 不监听 DOM 变化(v1.1 加 MutationObserver)\n */\n\nimport { FootprintGlobe, loadData, validateConfig, type FootprintConfig } from '../index';\nimport { mergeAttributeConfig, parseAttributes } from './attributes';\nimport { register } from './element';\n\nconst BOUND_ATTR = 'data-fp-bound';\nconst SELECTOR = '.footprint-globe';\n\nfunction isCustomElement(el: Element): boolean {\n return el.tagName.toLowerCase() === 'footprint-globe';\n}\n\nfunction renderError(container: HTMLElement, msg: string): void {\n container.innerHTML = '';\n const div = document.createElement('div');\n div.className = 'footprint-error';\n div.textContent = msg;\n container.appendChild(div);\n}\n\nasync function initOne(el: HTMLElement): Promise<void> {\n if (el.hasAttribute(BOUND_ATTR)) return;\n el.setAttribute(BOUND_ATTR, '1');\n\n if (isCustomElement(el)) return;\n\n try {\n const attrs = parseAttributes(el);\n let baseConfig: FootprintConfig;\n\n if (attrs.id || attrs.src || attrs.pins) {\n const r = await loadData({\n id: attrs.id,\n src: attrs.src,\n data: attrs.pins,\n });\n baseConfig = r.config;\n } else {\n const g = (globalThis as { FOOTPRINT_PINS?: unknown }).FOOTPRINT_PINS;\n if (!g) {\n renderError(el, '未提供数据源:请设置 data-pins、data-src 或 window.FOOTPRINT_PINS');\n return;\n }\n const r = await loadData({ globalVar: 'FOOTPRINT_PINS' });\n baseConfig = r.config;\n }\n\n const config = mergeAttributeConfig(baseConfig, attrs);\n\n const errs = validateConfig(config);\n if (errs.length > 0) {\n renderError(el, errs[0]!.userMessage);\n return;\n }\n\n if (attrs.height) {\n el.style.setProperty('--fp-globe-height', attrs.height);\n }\n\n new FootprintGlobe(el, {\n config,\n maplibreUrl: attrs.maplibreUrl,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n renderError(el, msg);\n }\n}\n\n/** 扫描并初始化所有未绑定的 .footprint-globe */\nexport function autoInit(root: ParentNode = document): void {\n const nodes = root.querySelectorAll<HTMLElement>(SELECTOR);\n nodes.forEach((el) => void initOne(el));\n}\n\n/** 引导入口:注册自定义元素 + 自动扫描 */\nexport function boot(): void {\n register();\n\n if (typeof document === 'undefined') return;\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => autoInit(), { once: true });\n } else {\n autoInit();\n }\n}\n","/**\n * 足迹地球 · auto 入口\n * 只做一件事:boot()\n * 用法:\n * <script type=\"module\" src=\"https://cdn.jsdelivr.net/npm/footprint-globe@1/dist/auto.js\"></script>\n */\n\nimport { boot } from './auto-init';\n\nboot();\n"]}