@footprint-studio/web-component 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/attributes.ts","../src/styles.ts","../src/element.ts","../src/auto-init.ts","../src/index.ts"],"names":["loadData","validateConfig","FootprintGlobe"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 足迹地球 · Web Component 属性解析\n * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-3\n */\n\nimport type { FootprintConfig, RenderConfig } from 'footprint-globe';\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 'footprint-globe';\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 'footprint-globe';\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 * 足迹地球 · Web Component 包入口\n * 契约依据:《Sprint 2 执行方案》§6 / §7\n *\n * 使用:\n * // 仅注册自定义元素\n * import { register } from '@footprint-studio/web-component';\n * register();\n *\n * // 或:注册 + 自动扫描 .footprint-globe\n * import '@footprint-studio/web-component/auto';\n */\n\nexport { FootprintGlobeElement, register } from './element';\nexport { autoInit, boot } from './auto-init';\nexport { parseAttributes, mergeAttributeConfig } from './attributes';\nexport { getShadowStyle, SHADOW_CSS } from './styles';\n\nexport const WC_VERSION = '0.0.0';\n"]}
@@ -0,0 +1,94 @@
1
+ import { FootprintConfig, FootprintGlobe, RenderConfig } from 'footprint-globe';
2
+
3
+ /**
4
+ * 足迹地球 · 自定义元素 <footprint-globe>
5
+ * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-1 / S2-4、§8 S2-12
6
+ * 决策:S2-Q1 Shadow DOM open;S2-Q9 disconnect 自动 destroy
7
+ */
8
+
9
+ declare class FootprintGlobeElement extends HTMLElement {
10
+ static get observedAttributes(): string[];
11
+ private root;
12
+ private container;
13
+ private instance;
14
+ private initToken;
15
+ private ready;
16
+ constructor();
17
+ connectedCallback(): void;
18
+ disconnectedCallback(): void;
19
+ attributeChangedCallback(): void;
20
+ private init;
21
+ private renderError;
22
+ update(config: Partial<FootprintConfig>): void;
23
+ destroy(): void;
24
+ getInstance(): FootprintGlobe | null;
25
+ }
26
+ declare function register(): void;
27
+
28
+ /**
29
+ * 足迹地球 · auto-init 扫描
30
+ * 契约依据:《Sprint 2 执行方案》§4.3、§7 S2-5
31
+ *
32
+ * 用法:
33
+ * <script type="module" src=".../embed.js"></script>
34
+ * <div class="footprint-globe" data-pins="..."></div>
35
+ *
36
+ * 行为:
37
+ * - 扫描 .footprint-globe
38
+ * - 若为 <footprint-globe>,跳过(由自定义元素接管)
39
+ * - 否则作为容器挂载 FootprintGlobe 实例
40
+ * - 用 data-fp-bound 防止重复初始化
41
+ * - 不监听 DOM 变化(v1.1 加 MutationObserver)
42
+ */
43
+ /** 扫描并初始化所有未绑定的 .footprint-globe */
44
+ declare function autoInit(root?: ParentNode): void;
45
+ /** 引导入口:注册自定义元素 + 自动扫描 */
46
+ declare function boot(): void;
47
+
48
+ /**
49
+ * 足迹地球 · Web Component 属性解析
50
+ * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-3
51
+ */
52
+
53
+ interface ParsedAttributes {
54
+ id?: string;
55
+ pins?: string;
56
+ src?: string;
57
+ maplibreUrl?: string;
58
+ config?: Partial<RenderConfig>;
59
+ height?: string;
60
+ }
61
+ /**
62
+ * 从宿主元素读取所有 footprint-globe 相关属性。
63
+ * 非法值静默忽略,由 core 使用默认值兜底。
64
+ */
65
+ declare function parseAttributes(el: HTMLElement): ParsedAttributes;
66
+ /** 合并属性 config 到已有 config(属性优先) */
67
+ declare function mergeAttributeConfig(base: FootprintConfig, attrs: ParsedAttributes): FootprintConfig;
68
+
69
+ /**
70
+ * 足迹地球 · Shadow DOM 样式注入
71
+ * 契约依据:《Sprint 2 执行方案》§6 S2-2
72
+ *
73
+ * 构建时通过 tsup define 把 core 的 CSS 注入为 __FP_SHADOW_CSS__。
74
+ * 运行时把 `:root` 改写为 `:host, :root`,使变量在 Shadow DOM 内生效。
75
+ */
76
+ declare const SHADOW_CSS: string;
77
+ declare function getShadowStyle(): string;
78
+
79
+ /**
80
+ * 足迹地球 · Web Component 包入口
81
+ * 契约依据:《Sprint 2 执行方案》§6 / §7
82
+ *
83
+ * 使用:
84
+ * // 仅注册自定义元素
85
+ * import { register } from '@footprint-studio/web-component';
86
+ * register();
87
+ *
88
+ * // 或:注册 + 自动扫描 .footprint-globe
89
+ * import '@footprint-studio/web-component/auto';
90
+ */
91
+
92
+ declare const WC_VERSION = "0.0.0";
93
+
94
+ export { FootprintGlobeElement, SHADOW_CSS, WC_VERSION, autoInit, boot, getShadowStyle, mergeAttributeConfig, parseAttributes, register };
@@ -0,0 +1,94 @@
1
+ import { FootprintConfig, FootprintGlobe, RenderConfig } from 'footprint-globe';
2
+
3
+ /**
4
+ * 足迹地球 · 自定义元素 <footprint-globe>
5
+ * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-1 / S2-4、§8 S2-12
6
+ * 决策:S2-Q1 Shadow DOM open;S2-Q9 disconnect 自动 destroy
7
+ */
8
+
9
+ declare class FootprintGlobeElement extends HTMLElement {
10
+ static get observedAttributes(): string[];
11
+ private root;
12
+ private container;
13
+ private instance;
14
+ private initToken;
15
+ private ready;
16
+ constructor();
17
+ connectedCallback(): void;
18
+ disconnectedCallback(): void;
19
+ attributeChangedCallback(): void;
20
+ private init;
21
+ private renderError;
22
+ update(config: Partial<FootprintConfig>): void;
23
+ destroy(): void;
24
+ getInstance(): FootprintGlobe | null;
25
+ }
26
+ declare function register(): void;
27
+
28
+ /**
29
+ * 足迹地球 · auto-init 扫描
30
+ * 契约依据:《Sprint 2 执行方案》§4.3、§7 S2-5
31
+ *
32
+ * 用法:
33
+ * <script type="module" src=".../embed.js"></script>
34
+ * <div class="footprint-globe" data-pins="..."></div>
35
+ *
36
+ * 行为:
37
+ * - 扫描 .footprint-globe
38
+ * - 若为 <footprint-globe>,跳过(由自定义元素接管)
39
+ * - 否则作为容器挂载 FootprintGlobe 实例
40
+ * - 用 data-fp-bound 防止重复初始化
41
+ * - 不监听 DOM 变化(v1.1 加 MutationObserver)
42
+ */
43
+ /** 扫描并初始化所有未绑定的 .footprint-globe */
44
+ declare function autoInit(root?: ParentNode): void;
45
+ /** 引导入口:注册自定义元素 + 自动扫描 */
46
+ declare function boot(): void;
47
+
48
+ /**
49
+ * 足迹地球 · Web Component 属性解析
50
+ * 契约依据:《Sprint 2 执行方案》§4.1、§6 S2-3
51
+ */
52
+
53
+ interface ParsedAttributes {
54
+ id?: string;
55
+ pins?: string;
56
+ src?: string;
57
+ maplibreUrl?: string;
58
+ config?: Partial<RenderConfig>;
59
+ height?: string;
60
+ }
61
+ /**
62
+ * 从宿主元素读取所有 footprint-globe 相关属性。
63
+ * 非法值静默忽略,由 core 使用默认值兜底。
64
+ */
65
+ declare function parseAttributes(el: HTMLElement): ParsedAttributes;
66
+ /** 合并属性 config 到已有 config(属性优先) */
67
+ declare function mergeAttributeConfig(base: FootprintConfig, attrs: ParsedAttributes): FootprintConfig;
68
+
69
+ /**
70
+ * 足迹地球 · Shadow DOM 样式注入
71
+ * 契约依据:《Sprint 2 执行方案》§6 S2-2
72
+ *
73
+ * 构建时通过 tsup define 把 core 的 CSS 注入为 __FP_SHADOW_CSS__。
74
+ * 运行时把 `:root` 改写为 `:host, :root`,使变量在 Shadow DOM 内生效。
75
+ */
76
+ declare const SHADOW_CSS: string;
77
+ declare function getShadowStyle(): string;
78
+
79
+ /**
80
+ * 足迹地球 · Web Component 包入口
81
+ * 契约依据:《Sprint 2 执行方案》§6 / §7
82
+ *
83
+ * 使用:
84
+ * // 仅注册自定义元素
85
+ * import { register } from '@footprint-studio/web-component';
86
+ * register();
87
+ *
88
+ * // 或:注册 + 自动扫描 .footprint-globe
89
+ * import '@footprint-studio/web-component/auto';
90
+ */
91
+
92
+ declare const WC_VERSION = "0.0.0";
93
+
94
+ export { FootprintGlobeElement, SHADOW_CSS, WC_VERSION, autoInit, boot, getShadowStyle, mergeAttributeConfig, parseAttributes, register };
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { FootprintGlobeElement, SHADOW_CSS, autoInit, boot, getShadowStyle, mergeAttributeConfig, parseAttributes, register } from './chunk-Y7DEBPPV.js';
2
+
3
+ // src/index.ts
4
+ var WC_VERSION = "0.0.0";
5
+
6
+ export { WC_VERSION };
7
+ //# sourceMappingURL=index.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;AAkBO,IAAM,UAAA,GAAa","file":"index.js","sourcesContent":["/**\n * 足迹地球 · Web Component 包入口\n * 契约依据:《Sprint 2 执行方案》§6 / §7\n *\n * 使用:\n * // 仅注册自定义元素\n * import { register } from '@footprint-studio/web-component';\n * register();\n *\n * // 或:注册 + 自动扫描 .footprint-globe\n * import '@footprint-studio/web-component/auto';\n */\n\nexport { FootprintGlobeElement, register } from './element';\nexport { autoInit, boot } from './auto-init';\nexport { parseAttributes, mergeAttributeConfig } from './attributes';\nexport { getShadowStyle, SHADOW_CSS } from './styles';\n\nexport const WC_VERSION = '0.0.0';\n"]}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@footprint-studio/web-component",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Web Component wrapper for footprint-globe",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/footprint-studio/footprint-studio.git",
10
+ "directory": "packages/web-component"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs"
23
+ },
24
+ "./auto": {
25
+ "types": "./dist/auto.d.ts",
26
+ "import": "./dist/auto.js",
27
+ "require": "./dist/auto.cjs"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsup",
35
+ "dev": "tsup --watch",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest",
38
+ "test:coverage": "vitest run --coverage",
39
+ "lint": "eslint src test vitest.config.ts",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "dependencies": {
43
+ "footprint-globe": "workspace:*"
44
+ },
45
+ "peerDependencies": {
46
+ "maplibre-gl": "^5.0.0"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "maplibre-gl": {
50
+ "optional": true
51
+ }
52
+ },
53
+ "devDependencies": {
54
+ "@vitest/coverage-v8": "^2.0.5",
55
+ "jsdom": "^24.1.1",
56
+ "maplibre-gl": "^5.4.0",
57
+ "tsup": "^8.2.4",
58
+ "vitest": "^2.0.5"
59
+ }
60
+ }