Not in the top 1,000 by GitHub stars

hopechen067/MapStage

MapStage: a narrative map stage for historical videos. MapLibre engine + agent skill, antique parchment look, routes, place names, seek(t) frame capture.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

mapstage/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

de55c81d1aa3 → de55c81d1aa3

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → de55c81d1aa3

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit de55c81d1aa3f2ada429a1c3d5eb920a74e4c36a

git clone --filter=blob:none --no-checkout https://github.com/hopechen067/MapStage.git .hotskills/hopechen067-mapstage && git -C .hotskills/hopechen067-mapstage checkout --detach de55c81d1aa3f2ada429a1c3d5eb920a74e4c36a # Copy each selected skill directory from .hotskills/hopechen067-mapstage into .claude/skills/<skill-name>/
git clone --filter=blob:none --no-checkout https://github.com/hopechen067/MapStage.git .hotskills/hopechen067-mapstage && git -C .hotskills/hopechen067-mapstage checkout --detach de55c81d1aa3f2ada429a1c3d5eb920a74e4c36a # Copy each selected skill directory from .hotskills/hopechen067-mapstage into .agents/skills/<skill-name>/
515GitHub stars
14stars in 7 days
1skill in this repository
15commits in 30 days

Heat

7.5
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Nov 7, 2026515

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

mapstage

When your agent uses it

MapStage — 历史视频的叙事地图舞台(MapLibre GL JS 5.6)。古卷底图 preset、路线行进、地名三态、按口播自动取景、平台合规(不画省界国界、无雾无暗角、台湾海南南海完整)、seek(t) 逐帧时间契约,供 HyperFrames / Remotion / Playwright 截帧。用户说「/mapstage」「做一段 X 从 A 到 B 的路线移动」「出一张全国定位图」「调古卷底图」「地图镜头」时使用。

What it loads into context

Frontmatter

141 tokens

Always available to the agent

SKILL.md

2,762 tokens

When the skill is activated

Reference documents

55,229 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 何时用
  2. 工作流(「/mapstage 做一段 X 从 A 到 B 的路线移动」)
  3. 硬规则
  4. 参考
  5. 校验

Scripts executed separately

  • install-skill.mjs
  • runtime/benchmark-vector-tuning.mjs
  • runtime/benchmark-vector-tuning.test.mjs
  • runtime/check-hillshade.mjs
  • runtime/compare-vector-screenshots.mjs
  • runtime/diag-rise-btn.mjs
  • runtime/diag-terrain.mjs
  • runtime/lib/fingerprint.mjs
  • runtime/lib/pw.mjs
  • runtime/lib/tuner-source.mjs
  • runtime/lib/tuner-ui.mjs
  • runtime/measure-perf.mjs
  • runtime/measure-warm-perf.mjs
  • runtime/qa.mjs
  • runtime/render.mjs
  • runtime/shoot.mjs
  • runtime/site-thumbs.mjs
  • runtime/verify-chips-layout.mjs
  • runtime/verify-fx.mjs
  • runtime/verify-gansu-inlet.mjs
  • runtime/verify-gansu-zhangye.mjs
  • runtime/verify-hillshade.mjs
  • runtime/verify-island-beijing.mjs
  • runtime/verify-island-look.mjs
  • runtime/verify-island-rca.mjs
  • runtime/verify-island-walls.mjs
  • runtime/verify-isolate-chips.mjs
  • runtime/verify-isolate-edge.mjs
  • runtime/verify-isolate-rise.mjs
  • runtime/verify-perf-gating.mjs
  • runtime/verify-preset-guard.mjs
  • runtime/verify-qa.mjs
  • runtime/verify-qilian-terrain.mjs
  • runtime/verify-render.mjs
  • runtime/verify-rise.mjs
  • runtime/verify-shoot.mjs
  • runtime/verify-showcase.mjs
  • runtime/verify-slab-look.mjs
  • runtime/verify-slider-uncapped.mjs
  • runtime/verify-story-hexi.mjs
  • runtime/verify-story-night.mjs
  • runtime/verify-terrain-island.mjs
  • runtime/verify-tile-stack.mjs
  • runtime/verify-tuner-bugs.mjs
  • runtime/verify-tuner-chrome.mjs
  • runtime/verify-tuner-vector.mjs
  • runtime/verify-vector-layers.mjs
  • runtime/verify-vector-overlay.mjs
  • site/assets/md.js
  • site/assets/md.test.mjs
  • site/assets/site.js
  • site/assets/stage-kit.js
  • site/assets/stage-kit.test.mjs
  • site/build.mjs
  • site/examples/examples.js
  • site/serve.mjs
  • templates/remotion/MapStageScene.tsx
  • tuner/_serve.test.cjs
  • tuner/assets/han-city-3d.js
  • tuner/assets/isolate-skirt-seam.test.mjs
  • tuner/assets/isolate-workbench.js
  • tuner/assets/map-fx.js
  • tuner/assets/map-fx.test.mjs
  • tuner/assets/mapstage-board.js
  • tuner/assets/mapstage-board.test.mjs
  • tuner/assets/mapstage-hosts.js
  • tuner/assets/mapstage-look.test.mjs
  • tuner/assets/mapstage-play.js
  • tuner/assets/mapstage-play.test.mjs
  • tuner/assets/mapstage-story.js
  • tuner/assets/mapstage-story.test.mjs
  • tuner/assets/region-isolate-data.js
  • tuner/assets/region-isolate-data.test.mjs
  • tuner/assets/region-isolate.js
  • tuner/assets/region-isolate.test.mjs
  • tuner/assets/site-nav.js
  • tuner/assets/terrain-island.js
  • tuner/assets/terrain-island.test.mjs
  • tuner/assets/tuner-app.js
  • tuner/assets/tuner-modules.test.mjs
  • tuner/assets/tuner-params.js
  • tuner/assets/tuner-shell.js
  • tuner/assets/tuner-util.js
  • tuner/assets/tuner-vector.js
  • tuner/assets/tuner-vector.test.mjs
  • tuner/assets/vector-paint.js
  • tuner/map-tiles.config.example.js
  • tuner/map-tiles.config.js
  • tuner/scripts/bake-night-lights.mjs
  • tuner/scripts/build-polar-ice.mjs
  • tuner/scripts/build-region-isolate.mjs
  • tuner/scripts/city-catalog.mjs
  • tuner/scripts/fetch-city-catalog.mjs
  • tuner/scripts/patch-china-boundaries.mjs
  • tuner/scripts/patch-maplibre-terrain-clip.mjs
  • tuner/scripts/patch-maritime-islands.mjs
  • tuner/scripts/province-catalog.mjs
  • tuner/scripts/simplify-landcover-globe.mjs
  • tuner/vendor/maplibre-contour.min.js
  • tuner/vendor/maplibre-gl.js
  • tuner/verify.mjs

Files

  • SKILL.mdcore8,936 bytes
  • SKILL.mdcore8,936 bytes
  • SKILL.mdcore8,936 bytes
  • agents/openai.yamlasset927 bytes
  • install-skill.mjsruns2,444 bytes
  • references/api-board.mddoc5,166 bytes
  • references/api-look.mddoc4,874 bytes
  • references/api-story.mddoc11,980 bytes
  • references/api.mddoc2,745 bytes
  • references/camera.mddoc3,955 bytes
  • references/city-tier-schema.mddoc2,291 bytes
  • references/compliance.mddoc5,347 bytes
  • references/examples-guide.mddoc5,747 bytes
  • references/hosts.mddoc9,764 bytes
  • references/install.mddoc2,060 bytes
  • references/lessons-long-march.mddoc11,474 bytes
  • references/look.mddoc10,417 bytes
  • references/maplibre-official-gap.mddoc16,870 bytes
  • references/maplibre-optimization-and-enablement.mddoc18,059 bytes
  • references/overview.mddoc2,843 bytes
  • references/play.mddoc7,351 bytes
  • references/quickstart.mddoc3,780 bytes
  • references/region-isolate.mddoc8,744 bytes
  • references/roadmap.mddoc10,050 bytes
  • references/runtime-perf.mddoc4,791 bytes
  • references/story-spec.mddoc9,617 bytes
  • references/tested-config.mddoc4,127 bytes
  • references/tuner-workflow.mddoc3,966 bytes
  • references/water-overlay.mddoc1,893 bytes
  • references/参数列表说明.mddoc5,514 bytes
  • runtime/benchmark-vector-tuning.mjsruns66,033 bytes
  • runtime/benchmark-vector-tuning.test.mjsruns6,193 bytes
  • runtime/check-hillshade.mjsruns3,591 bytes
  • runtime/compare-vector-screenshots.mjsruns17,067 bytes
  • runtime/diag-rise-btn.mjsruns1,930 bytes
  • runtime/diag-terrain.mjsruns3,923 bytes
  • runtime/lib/fingerprint.mjsruns1,357 bytes
  • runtime/lib/pw.mjsruns5,318 bytes
  • runtime/lib/tuner-source.mjsruns1,645 bytes
  • runtime/lib/tuner-ui.mjsruns2,003 bytes
  • runtime/measure-perf.mjsruns5,165 bytes
  • runtime/measure-warm-perf.mjsruns2,294 bytes
  • runtime/qa.mjsruns15,901 bytes
  • runtime/render.mjsruns8,232 bytes
  • runtime/shoot.mjsruns9,495 bytes
  • runtime/site-thumbs.mjsruns5,498 bytes
  • runtime/verify-chips-layout.mjsruns3,269 bytes
  • runtime/verify-fx.mjsruns9,344 bytes
  • runtime/verify-gansu-inlet.mjsruns2,617 bytes
  • runtime/verify-gansu-zhangye.mjsruns5,748 bytes
  • runtime/verify-hillshade.mjsruns2,296 bytes
  • runtime/verify-island-beijing.mjsruns2,694 bytes
  • runtime/verify-island-look.mjsruns2,798 bytes
  • runtime/verify-island-rca.mjsruns10,490 bytes
  • runtime/verify-island-walls.mjsruns4,126 bytes
  • runtime/verify-isolate-chips.mjsruns5,180 bytes
  • runtime/verify-isolate-edge.mjsruns5,169 bytes
  • runtime/verify-isolate-rise.mjsruns4,860 bytes
  • runtime/verify-perf-gating.mjsruns4,632 bytes
  • runtime/verify-preset-guard.mjsruns1,876 bytes
  • runtime/verify-qa.mjsruns7,907 bytes
  • runtime/verify-qilian-terrain.mjsruns4,961 bytes
  • runtime/verify-render.mjsruns2,856 bytes
  • runtime/verify-rise.mjsruns3,481 bytes
  • runtime/verify-shoot.mjsruns4,098 bytes
  • runtime/verify-showcase.mjsruns3,091 bytes
  • runtime/verify-slab-look.mjsruns2,790 bytes
  • runtime/verify-slider-uncapped.mjsruns1,458 bytes
  • runtime/verify-story-hexi.mjsruns2,576 bytes
  • runtime/verify-story-night.mjsruns8,868 bytes
  • runtime/verify-terrain-island.mjsruns7,059 bytes
  • runtime/verify-tile-stack.mjsruns4,126 bytes
  • runtime/verify-tuner-bugs.mjsruns6,980 bytes
  • runtime/verify-tuner-chrome.mjsruns13,101 bytes
  • runtime/verify-tuner-vector.mjsruns4,945 bytes
  • runtime/verify-vector-layers.mjsruns74,693 bytes
  • runtime/verify-vector-overlay.mjsruns18,871 bytes
  • schemas/map-preset.schema.jsonasset9,540 bytes
  • schemas/sample-sites.schema.jsonasset1,547 bytes
  • schemas/story.schema.jsonasset5,996 bytes
  • site/assets/contour.svgasset25,935 bytes
  • site/assets/favicon.svgasset337 bytes
  • site/assets/logo-lockup.svgasset687 bytes
  • site/assets/logo.svgasset396 bytes
  • site/assets/md.jsruns7,731 bytes
  • site/assets/md.test.mjsruns2,478 bytes
  • site/assets/site.cssasset20,297 bytes
  • site/assets/site.jsruns10,981 bytes
  • site/assets/stage-kit.jsruns13,137 bytes
  • site/assets/stage-kit.test.mjsruns2,008 bytes
  • site/build.mjsruns3,839 bytes
  • site/docs/index.htmlasset9,491 bytes
  • site/examples/board-basic.htmlasset3,998 bytes
  • site/examples/board-cities.htmlasset6,691 bytes
  • site/examples/board-hover.htmlasset4,388 bytes
  • site/examples/board-links.htmlasset3,899 bytes
  • site/examples/board-march.htmlasset3,957 bytes
  • site/examples/camera-fit.htmlasset4,396 bytes
  • site/examples/camera-manual.htmlasset4,602 bytes
  • site/examples/camera-push.htmlasset3,806 bytes
  • site/examples/camera-route.htmlasset4,068 bytes
  • site/examples/cards-basic.htmlasset3,683 bytes
  • site/examples/cards-doc-photo.htmlasset4,100 bytes
  • site/examples/cards-table.htmlasset3,443 bytes
  • site/examples/cards-telegram.htmlasset3,259 bytes
  • site/examples/compliance-full.htmlasset3,905 bytes
  • site/examples/compliance.htmlasset2,221 bytes
  • site/examples/examples.jsruns14,747 bytes
  • site/examples/globe.htmlasset2,196 bytes
  • site/examples/index.htmlasset3,364 bytes
  • site/examples/labels-approx.htmlasset3,478 bytes
  • site/examples/labels-tiers.htmlasset2,666 bytes
  • site/examples/labels.htmlasset4,094 bytes
  • site/examples/look-basemap.htmlasset4,296 bytes
  • site/examples/look-basic.htmlasset1,770 bytes
  • site/examples/look-layers.htmlasset2,603 bytes
  • site/examples/look-preset.htmlasset3,109 bytes
  • site/examples/play-sanguo.htmlasset13,852 bytes
  • site/examples/play-sanguo.jsonasset4,210 bytes
  • site/examples/precache.htmlasset4,154 bytes
  • site/examples/route-curve.htmlasset3,655 bytes
  • site/examples/route-hold.htmlasset4,076 bytes
  • site/examples/route-march.htmlasset3,531 bytes
  • site/examples/route-roles.htmlasset4,459 bytes
  • site/examples/route-sides.htmlasset4,780 bytes
  • site/examples/route-slice.htmlasset4,235 bytes
  • site/examples/seek-contract.htmlasset4,571 bytes
  • site/examples/skins.htmlasset3,064 bytes
  • site/examples/stage-check.htmlasset4,570 bytes
  • site/examples/story-hexi.htmlasset5,986 bytes
  • site/examples/story-hexi.jsonasset2,940 bytes
  • site/examples/terrain.htmlasset2,387 bytes
  • site/examples/thumbs/board-basic.jpgasset134,265 bytes
  • site/examples/thumbs/board-cities.jpgasset133,908 bytes
  • site/examples/thumbs/board-hover.jpgasset134,266 bytes
  • site/examples/thumbs/board-links.jpgasset135,235 bytes
  • site/examples/thumbs/board-march.jpgasset133,691 bytes
  • site/examples/thumbs/camera-fit.jpgasset104,330 bytes
  • site/examples/thumbs/camera-manual.jpgasset143,994 bytes
  • site/examples/thumbs/camera-push.jpgasset182,486 bytes
  • site/examples/thumbs/camera-route.jpgasset94,473 bytes
  • site/examples/thumbs/cards-basic.jpgasset106,458 bytes
  • site/examples/thumbs/cards-doc-photo.jpgasset100,429 bytes
  • site/examples/thumbs/cards-table.jpgasset102,050 bytes
  • site/examples/thumbs/cards-telegram.jpgasset101,657 bytes
  • site/examples/thumbs/compliance-full.jpgasset76,783 bytes
  • site/examples/thumbs/compliance.jpgasset75,578 bytes
  • site/examples/thumbs/globe.jpgasset32,163 bytes
  • site/examples/thumbs/labels-approx.jpgasset37,007 bytes
  • site/examples/thumbs/labels-tiers.jpgasset94,696 bytes
  • site/examples/thumbs/labels.jpgasset103,996 bytes
  • site/examples/thumbs/look-basemap.jpgasset127,767 bytes
  • site/examples/thumbs/look-basic.jpgasset118,566 bytes
  • site/examples/thumbs/look-layers.jpgasset142,800 bytes
  • site/examples/thumbs/look-preset.jpgasset120,241 bytes
  • site/examples/thumbs/play-sanguo.jpgasset140,953 bytes
  • site/examples/thumbs/precache.jpgasset95,329 bytes
  • site/examples/thumbs/route-curve.jpgasset87,333 bytes
  • site/examples/thumbs/route-hold.jpgasset94,825 bytes
  • site/examples/thumbs/route-march.jpgasset107,652 bytes
  • site/examples/thumbs/route-roles.jpgasset92,158 bytes
  • site/examples/thumbs/route-sides.jpgasset92,867 bytes
  • site/examples/thumbs/route-slice.jpgasset82,626 bytes
  • site/examples/thumbs/seek-contract.jpgasset95,420 bytes
  • site/examples/thumbs/skins.jpgasset184,959 bytes
  • site/examples/thumbs/stage-check.jpgasset125,220 bytes
  • site/examples/thumbs/story-hexi.jpgasset105,092 bytes
  • site/examples/thumbs/terrain.jpgasset124,087 bytes
  • site/examples/thumbs/validate.jpgasset104,922 bytes
  • site/examples/validate.htmlasset5,244 bytes
  • site/examples/view.htmlasset6,742 bytes
  • site/host.htmlasset4,435 bytes
  • site/index.htmlasset23,893 bytes
  • site/media/long-march-ep14-demo.mp4asset1,771,036 bytes
  • site/media/long-march-ep14-poster.jpgasset60,211 bytes
  • site/serve.mjsruns2,602 bytes
  • templates/hyperframes/index.htmlasset2,128 bytes
  • templates/remotion/MapStageScene.tsxruns4,235 bytes
  • tuner/.nojekyllasset0 bytes
  • tuner/README.mddoc3,189 bytes
  • tuner/_serve.test.cjsruns7,316 bytes
  • tuner/assets/han-city-3d.jsruns38,577 bytes
  • tuner/assets/isolate-skirt-seam.test.mjsruns56,675 bytes
  • tuner/assets/isolate-workbench.jsruns22,191 bytes
  • tuner/assets/landcover-globe.geojsonasset1,044,070 bytes
  • tuner/assets/landcover-lowzoom.geojsonasset10,633,407 bytes
  • tuner/assets/map-fx.jsruns19,143 bytes
  • tuner/assets/map-fx.test.mjsruns7,102 bytes
  • tuner/assets/mapstage-board.jsruns13,413 bytes
  • tuner/assets/mapstage-board.test.mjsruns3,304 bytes
  • tuner/assets/mapstage-hosts.jsruns2,279 bytes
  • tuner/assets/mapstage-look.test.mjsruns11,432 bytes
  • tuner/assets/mapstage-play.jsruns12,515 bytes
  • tuner/assets/mapstage-play.test.mjsruns5,726 bytes
  • tuner/assets/mapstage-story.jsruns70,853 bytes
  • tuner/assets/mapstage-story.test.mjsruns12,272 bytes
  • tuner/assets/night-lights.pngasset1,068,562 bytes
  • tuner/assets/polar-ice.geojsonasset37,846 bytes
  • tuner/assets/region-isolate-data.jsruns2,125,295 bytes
  • tuner/assets/region-isolate-data.test.mjsruns6,264 bytes
  • tuner/assets/region-isolate.jsruns34,874 bytes
  • tuner/assets/region-isolate.test.mjsruns12,505 bytes
  • tuner/assets/sample-sites.jsonasset752 bytes
  • tuner/assets/site-nav.jsruns2,928 bytes
  • tuner/assets/terrain-island.jsruns83,993 bytes
  • tuner/assets/terrain-island.test.mjsruns10,485 bytes
  • tuner/assets/tuner-app.jsruns89,485 bytes
  • tuner/assets/tuner-modules.test.mjsruns8,808 bytes
  • tuner/assets/tuner-params.jsruns10,518 bytes
  • tuner/assets/tuner-shell.jsruns4,951 bytes
  • tuner/assets/tuner-util.jsruns4,660 bytes
  • tuner/assets/tuner-vector.jsruns28,656 bytes
  • tuner/assets/tuner-vector.test.mjsruns9,107 bytes
  • tuner/assets/tuner.cssasset20,778 bytes
  • tuner/assets/vector-paint.jsruns49,549 bytes
  • tuner/hexi-map-shot.htmlasset11,391 bytes
  • tuner/index.htmlasset26,745 bytes
  • tuner/map-tiles.config.example.jsruns2,482 bytes
  • tuner/map-tiles.config.jsruns1,998 bytes
  • tuner/media/hexi-ep07-demo-480p.mp4asset645,045 bytes
  • tuner/preset-antique-default.jsonasset1,457 bytes
  • tuner/presets/antique-default.jsonasset1,457 bytes
  • tuner/scenes.jsonasset2,643 bytes
  • tuner/scripts/bake-night-lights.mjsruns10,700 bytes
  • tuner/scripts/build-polar-ice.mjsruns4,381 bytes
  • tuner/scripts/build-region-isolate.mjsruns16,500 bytes
  • tuner/scripts/city-catalog.mjsruns22,791 bytes
  • tuner/scripts/fetch-city-catalog.mjsruns4,010 bytes
  • tuner/scripts/patch-china-boundaries.mjsruns17,900 bytes
  • tuner/scripts/patch-maplibre-terrain-clip.mjsruns90,260 bytes
  • tuner/scripts/patch-maritime-islands.mjsruns6,996 bytes
  • tuner/scripts/province-catalog.mjsruns3,947 bytes
  • tuner/scripts/simplify-landcover-globe.mjsruns11,032 bytes
  • tuner/vector-layers.htmlasset45,154 bytes
  • tuner/vendor/README.mddoc305 bytes
  • tuner/vendor/maplibre-contour.min.jsruns31,196 bytes
  • tuner/vendor/maplibre-gl.jsruns2,765,159 bytes
  • tuner/verify.mjsruns19,236 bytes
Read SKILL.md

# MapStage · 历史视频的地图舞台

给历史 / 地理 / 战役视频做**可逐帧复现**的地图镜头。三层,各一份规范:

| 层 | 文件 | 规范 |
|---|---|---|
| Look 底图 | `preset.json` v3(调参台导出) | [references/look.md](references/look.md) |
| Story 叙事 | `story.json` v1(地点 / 路线 / 地名节拍 / 镜头 / 字卡) | [references/story-spec.md](references/story-spec.md)、[references/camera.md](references/camera.md) |
| Stage 舞台 | `window.__mapstageSeek(t)` | [references/hosts.md](references/hosts.md) |

官网(文档即本目录 `references/`):https://hopechen067.github.io/MapStage/

## 何时用
View the complete source on GitHub

Skills included

  • mapstage

Repository facts

License
MIT
Created
Aug 11, 2026
Last pushed
Oct 25, 2026
Forks
73
Open issues
1
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 14 notes
  • mapstage/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • mapstage/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • mapstage/site/assets/contour.svg:1 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/assets/landcover-globe.geojson:1 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/assets/landcover-lowzoom.geojson:1 Analysis incomplete: Blob exceeds size or total-read limit; file skipped
  • mapstage/tuner/assets/polar-ice.geojson:1 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/assets/region-isolate-data.js:1 Analysis incomplete: file exceeds text byte budget
  • mapstage/tuner/assets/region-isolate-data.js:2 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/scripts/city-catalog.mjs:8 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/scripts/city-catalog.mjs:6 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/vendor/maplibre-contour.min.js:15 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/vendor/maplibre-contour.min.js:13 Analysis incomplete: physical or joined line exceeds character limit
  • mapstage/tuner/vendor/maplibre-gl.js:1 Analysis incomplete: file exceeds text byte budget
  • mapstage/tuner/vendor/maplibre-gl.js:10492 Analysis incomplete: regex work limit reached
Show all 741 signals by file

mapstage/SKILL.md

  • Network accessline 16
    官网(文档即本目录 `references/`):https://hopechen067.github.io/MapStage/
  • Network accessline 90
    在 `tuner/` 下 `node verify.mjs`,末尾应为 `verify ok`(必需文件、单测、UTF-8 / 内联脚本解析)。官网单测:`node site/assets/md.test.mjs`、`node site/assets/stage-kit.test.mjs`。浏览器冒烟:起 `site/serve.mjs` 后 `node runtime/site-thumbs.mjs http://127.0.0.1:8770`。

mapstage/install-skill.mjs

  • Executable scriptline 1
    Executable file

mapstage/references/api-board.md

  • Network accessline 6
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/references/api-story.md

  • Network accessline 6
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/references/api.md

  • Network accessline 31
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 32
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/references/examples-guide.md

  • Network accessline 7
    1. 在 `site/examples/examples.js` 的 `LIST` 里加一行:`id`、`group`、`title`、`blurb`、`api`、`spec`,有时间轴的再加 `thumb`(缩略图 seek 到的秒数)。 2. 写 `site/examples/<id>.html`,骨架照下面抄。 3. 起服后拍缩略图并冒烟:`node runtime/site-thumbs.mjs http://127.0.0.1:8770 <id>`(输出 `site
  • Network accessline 8
    2. 写 `site/examples/<id>.html`,骨架照下面抄。 3. 起服后拍缩略图并冒烟:`node runtime/site-thumbs.mjs http://127.0.0.1:8770 <id>`(输出 `site/examples/thumbs/<id>.jpg`,有 pageerror 会失败)。 4. 在 `tuner/` 下跑 `node verify.mjs`,末尾应为 `verify ok`。
  • Network accessline 9
    3. 起服后拍缩略图并冒烟:`node runtime/site-thumbs.mjs http://127.0.0.1:8770 <id>`(输出 `site/examples/thumbs/<id>.jpg`,有 pageerror 会失败)。
  • Network accessline 21
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>示例标题 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 22
    <title>示例标题 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 23
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 40
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/references/hosts.md

  • Network accessline 49
    <Sequence from={0} durationInFrames={16 * fps}>   <MapStageScene hostUrl="http://127.0.0.1:8770" story="examples/story-hexi.json" />
  • Network accessline 50
    <MapStageScene hostUrl="http://127.0.0.1:8770" story="examples/story-hexi.json" />
  • Network accessline 72
    `--layers map,hud` 用 ffmpeg 把地图层和 HUD 层叠合。`node runtime/verify-render.mjs http://127.0.0.1:8770` 校验这些闸门。
  • Network accessline 96
    - 每帧先写 `.part` 再改名,中途被杀不会留下半张图。 - 截帧前自动 `precache()`;有 seek 触发 12 s idle 超时放行时,结束时会提醒。 - 验收:`node runtime/verify-shoot.mjs http://127.0.0.1:8770`(续拍 / 局部重拍 / 混帧保护 / 分层 / 两次独立会话逐字节一致)。
  • Network accessline 98
    - 验收:`node runtime/verify-shoot.mjs http://127.0.0.1:8770`(续拍 / 局部重拍 / 混帧保护 / 分层 / 两次独立会话逐字节一致)。
  • Network accessline 136
    node runtime/qa.mjs ../out/hexi            # --base 默认 http://127.0.0.1:8770
  • Network accessline 141
    - 露底不靠颜色猜:宿主页把底色层改成品红,逐帧数纯品红(和画布透明、地平线以上)的占比。底图本身是米色 / 沙色,和底色太近,按色匹配会大面积误报。 - 合规是对**每一帧**调 `stage.check(t)`,不只是 `compliance.full` 的逐秒自检。 - 验收:`node runtime/verify-qa.mjs http://127.0.0.1:8770`,用合成帧证明硬切 / 冻帧 / 缺帧 / 露底都抓得到、干净序列不误报,并用 80° 俯仰的真
  • Network accessline 143
    - 验收:`node runtime/verify-qa.mjs http://127.0.0.1:8770`,用合成帧证明硬切 / 冻帧 / 缺帧 / 露底都抓得到、干净序列不误报,并用 80° 俯仰的真地图帧验证露底探针。

mapstage/references/install.md

  • Network accessline 24
    安装 MapStage skill:https://github.com/hopechen067/MapStage

mapstage/references/maplibre-official-gap.md

  • Network accessline 7
    | 写于 | 2026-08-29 | | 官方文档快照 | MapLibre GL JS **6.6.0** 文档站(examples / guides / API / plugins)+ Style Spec | | 入口 | https://maplibre.org/maplibre-gl-js/docs/examples/ |
  • Network accessline 8
    | 官方文档快照 | MapLibre GL JS **6.6.0** 文档站(examples / guides / API / plugins)+ Style Spec | | 入口 | https://maplibre.org/maplibre-gl-js/docs/examples/ | | 本库生产 JS | 调参台:`tuner/vendor/maplibre-gl.js` **patched 5.6.0-dev**;成片模板:unpkg **5.6.0 未打补丁
  • Network accessline 9
    | 入口 | https://maplibre.org/maplibre-gl-js/docs/examples/ |
  • Network accessline 22
    | Introduction | `/docs/` | 官方默认已是 **v6 ESM**(`maplibre-gl.mjs` + worker)。CDN 无 bundler 时 worker 走 Blob URL。我们生产仍是 **v5 UMD 补丁包**。 | | Examples Overview | `/docs/examples/` | 约 140 个示例,六类:Basics / Sources / Layers / Annotations / Interactiv
  • Network accessline 23
    | Examples Overview | `/docs/examples/` | 约 140 个示例,六类:Basics / Sources / Layers / Annotations / Interactivity / 3D·Globe。第 4 节全表分流。 | | Guides | `/docs/guides/` | 真正有用的是 [large-data](https://maplibre.org/maplibre-gl-js/docs/guides/large-da
  • Network accessline 24
    | Guides | `/docs/guides/` | 真正有用的是 [large-data](https://maplibre.org/maplibre-gl-js/docs/guides/large-data/)(大 GeoJSON)和 [v5→v6](https://maplibre.org/maplibre-gl-js/docs/guides/v5-to-v6-migration-guide/)。Leaflet / OpenLayers / Mapbox 迁移与本库
  • Network accessline 238
    [large-data](https://maplibre.org/maplibre-gl-js/docs/guides/large-data/) 对 7.6 MB 水系几乎是逐条打中:

mapstage/references/maplibre-optimization-and-enablement.md

  • Network accessline 7
    | 写于 | 2026-08-29 | | 原则 | 先补齐 **5.6 上已能做且视频要** 的;6.x 只在岛补丁移植后进生产 | | 不做 | 应用级 npm 进 `tuner/`;`flyTo` 当商品;OSM 楼当汉城;成片 `fetch('/license')` |
  • Network accessline 9
    | 不做 | 应用级 npm 进 `tuner/`;`flyTo` 当商品;OSM 楼当汉城;成片 `fetch('/license')` |
  • Network accessline 44
    2. `color-relief`、`hillshade-method`、`style.state` 标在 Spec **5.6 / 5.5**。先在 vendor 5.6 上开,不要拿它们当升 6 的理由。 3. 只有这些才构成升 6 的正当理由:`fill-extrusion-rounded-corner-distance`(6.2)、`symbol-height-offset`(6.6)、`line-layer-opacity`(6.0)、官方 ESM worker 合
  • Network accessline 46
    4. 升 6 时按 [v5-to-v6-migration-guide](https://maplibre.org/maplibre-gl-js/docs/guides/v5-to-v6-migration-guide/):`<script type="module">`、禁止默认 import、嵌套 GeoJSON 不要 `JSON.parse`、缺图用 `setMissingStyleImageResolver`。
  • Network accessline 64
    官方:[Optimising large GeoJSON](https://maplibre.org/maplibre-gl-js/docs/guides/large-data/)。

mapstage/references/overview.md

  • Network accessline 3
    MapStage 是给**历史视频**用的叙事地图引擎,同时也是一个 agent skill。它基于 [MapLibre GL JS](https://maplibre.org/),把「古卷底图 + 路线行进 + 镜头 + 合规」收成三份声明式 JSON,由宿主按时间逐帧取画面。

mapstage/references/play.md

  • Network accessline 24
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 25
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 50
    const preset = await (await fetch('studio/presets/antique-default.json')).json();

mapstage/references/quickstart.md

  • Network accessline 22
    <!doctype html> <meta charset="utf-8"> <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 23
    <meta charset="utf-8"> <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css"> <div id="stage" style="position:absolute;inset:0"></div>
  • Network accessline 24
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 63
    打开 `http://127.0.0.1:8770/`,`/studio/` 是调参台,`/examples/` 是示例。

mapstage/references/roadmap.md

  • Network accessline 37
    本地:`node mapstage/site/serve.mjs` → `http://127.0.0.1:8770/`,布局与 Pages 一致。

mapstage/references/tuner-workflow.md

  • Network accessline 12
    Open `http://localhost:8765/`.

mapstage/runtime/benchmark-vector-tuning.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 27
    const REPO_ROOT = resolve(HERE, '..'); const DEFAULT_OUT_DIR = join(REPO_ROOT, 'out', 'fx-verify'); const DEFAULT_BASE_URL = 'http://127.0.0.1:8780';
  • Network accessline 28
    const DEFAULT_OUT_DIR = join(REPO_ROOT, 'out', 'fx-verify'); const DEFAULT_BASE_URL = 'http://127.0.0.1:8780'; const DEFAULT_VIEWPORT = Object.freeze({ width: 1440, height: 900 });
  • Network accessline 29
    const DEFAULT_BASE_URL = 'http://127.0.0.1:8780';
  • Network accessline 81
    'Options:',     '  --base-url <url>       Base URL or vector-layers.html URL',     '                         Default: http://127.0.0.1:8780',
  • Network accessline 82
    '  --base-url <url>       Base URL or vector-layers.html URL',     '                         Default: http://127.0.0.1:8780',     '  --runs <count>         Measured runs; default: 20',
  • Network accessline 83
    '                         Default: http://127.0.0.1:8780',

mapstage/runtime/benchmark-vector-tuning.test.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 93
    const target = new URL(     buildTargetUrl(       'http://127.0.0.1:8780?keep=yes&perfImages=16&perfCacheZoom=5',
  • Network accessline 94
    buildTargetUrl(       'http://127.0.0.1:8780?keep=yes&perfImages=16&perfCacheZoom=5',       'workerCount',
  • Network accessline 95
    'http://127.0.0.1:8780?keep=yes&perfImages=16&perfCacheZoom=5',

mapstage/runtime/check-hillshade.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 9
    const outDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'out', 'fx-verify'); mkdirSync(outDir, { recursive: true }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');
  • Network accessline 10
    mkdirSync(outDir, { recursive: true }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, ''); const { chromium } = loadPlaywright();
  • Network accessline 11
    const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');

mapstage/runtime/compare-vector-screenshots.mjs

  • Executable scriptline 1
    #!/usr/bin/env node

mapstage/runtime/diag-rise-btn.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 12
    }); const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); await page.goto('http://127.0.0.1:8766/?risebtn=' + Date.now(), {
  • Network accessline 13
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); await page.goto('http://127.0.0.1:8766/?risebtn=' + Date.now(), {   waitUntil: 'domcontentloaded',
  • Network accessline 14
    await page.goto('http://127.0.0.1:8766/?risebtn=' + Date.now(), {

mapstage/runtime/diag-terrain.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); page.on('pageerror', (err) => console.warn('pageerror', err.message)); await page.goto('http://127.0.0.1:8766/?relief=' + Date.now(), {
  • Network accessline 17
    page.on('pageerror', (err) => console.warn('pageerror', err.message)); await page.goto('http://127.0.0.1:8766/?relief=' + Date.now(), {   waitUntil: 'domcontentloaded',
  • Network accessline 18
    await page.goto('http://127.0.0.1:8766/?relief=' + Date.now(), {

mapstage/runtime/lib/fingerprint.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 20
    const root = String(base).replace(/\/$/, '');   const storyUrl = /^(https?|data):/.test(story) ? story : root + '/' + story.replace(/^\//, '');   const storyText = await (await fetch(storyUrl)).text();
  • Network accessline 21
    const storyUrl = /^(https?|data):/.test(story) ? story : root + '/' + story.replace(/^\//, '');   const storyText = await (await fetch(storyUrl)).text();   const parsed = JSON.parse(storyText);
  • Network accessline 22
    const storyText = await (await fetch(storyUrl)).text();
  • Network accessline 23
    const parsed = JSON.parse(storyText);   let presetText = '{}';   if (parsed.preset) presetText = await (await fetch(new URL(parsed.preset, storyUrl))).text();
  • Network accessline 24
    let presetText = '{}';   if (parsed.preset) presetText = await (await fetch(new URL(parsed.preset, storyUrl))).text();   return { hash: fingerprint(storyText + '\n' + presetText), duration: parsed.duration, fps: parsed.fps || 30 };
  • Network accessline 25
    if (parsed.preset) presetText = await (await fetch(new URL(parsed.preset, storyUrl))).text();

mapstage/runtime/lib/pw.mjs

  • Executable scriptline 1
    Executable file

mapstage/runtime/lib/tuner-source.mjs

  • Executable scriptline 1
    Executable file

mapstage/runtime/lib/tuner-ui.mjs

  • Executable scriptline 1
    Executable file

mapstage/runtime/measure-perf.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 20
    } const t0 = Date.now(); await page.goto('http://127.0.0.1:8766/?perf=' + tag + '&t=' + Date.now(), {
  • Network accessline 21
    const t0 = Date.now(); await page.goto('http://127.0.0.1:8766/?perf=' + tag + '&t=' + Date.now(), {   waitUntil: 'domcontentloaded',
  • Network accessline 22
    await page.goto('http://127.0.0.1:8766/?perf=' + tag + '&t=' + Date.now(), {

mapstage/runtime/measure-warm-perf.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    const BASE = (process.argv[2] || 'http://127.0.0.1:8767').replace(/\/$/, '');

mapstage/runtime/qa.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * MapStage 成片 QA:对截帧器的输出目录做硬切 / 冻帧 / 露底 / 合规逐帧检查,并导出四类验收帧。  *  *   node runtime/qa.mjs <frames-dir> [--base http://127.0.0.1:8770]
  • Network accessline 3
    *  *   node runtime/qa.mjs <frames-dir> [--base http://127.0.0.1:8770]  *
  • Network accessline 4
    *   node runtime/qa.mjs <frames-dir> [--base http://127.0.0.1:8770]
  • Network accessline 35
    exports: o.exports !== false,     voidColor: o.voidColor || null,     base: String(o.base || 'http://127.0.0.1:8770').replace(/\/$/, ''),
  • Network accessline 36
    voidColor: o.voidColor || null,     base: String(o.base || 'http://127.0.0.1:8770').replace(/\/$/, ''),     story: o.story || null,
  • Network accessline 37
    base: String(o.base || 'http://127.0.0.1:8770').replace(/\/$/, ''),
  • Network accessline 202
    storyJson = await host.evaluate(() => JSON.parse(JSON.stringify(window.stage.story)));     } else {       storyJson = await (await fetch(o.base + '/' + m.story)).json();
  • Network accessline 203
    } else {       storyJson = await (await fetch(o.base + '/' + m.story)).json();     }
  • Network accessline 204
    storyJson = await (await fetch(o.base + '/' + m.story)).json();

mapstage/runtime/render.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 12
    *           截帧 → QA → mp4 (crf18)。终版 QA 不过也保留成品,但退出码为 1  *  * 选项:--base(默认 http://127.0.0.1:8770)  --layers full|map,hud(map,hud 由 ffmpeg 叠合)
  • Network accessline 13
    *  * 选项:--base(默认 http://127.0.0.1:8770)  --layers full|map,hud(map,hud 由 ffmpeg 叠合)  *       --audio <file>  --story <path>(preview 必填,之后记在 state.json)
  • Network accessline 14
    * 选项:--base(默认 http://127.0.0.1:8770)  --layers full|map,hud(map,hud 由 ffmpeg 叠合)
  • Network accessline 127
    function parse(argv) {   const [cmd, ...rest] = argv;   const o = { cmd, base: 'http://127.0.0.1:8770' };
  • Network accessline 128
    const [cmd, ...rest] = argv;   const o = { cmd, base: 'http://127.0.0.1:8770' };   for (let i = 0; i < rest.length; i++) {
  • Network accessline 129
    const o = { cmd, base: 'http://127.0.0.1:8770' };

mapstage/runtime/shoot.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    *  * 参数  *   --base <url>       站点地址,默认 http://127.0.0.1:8770
  • Network accessline 7
    * 参数  *   --base <url>       站点地址,默认 http://127.0.0.1:8770  *   --story <path>     story JSON,相对站点根,默认 examples/story-hexi.json
  • Network accessline 8
    *   --base <url>       站点地址,默认 http://127.0.0.1:8770
  • Network accessline 53
    const m = MODES[mode];   const o = {     base: String(raw.base || 'http://127.0.0.1:8770').replace(/\/$/, ''),
  • Network accessline 54
    const o = {     base: String(raw.base || 'http://127.0.0.1:8770').replace(/\/$/, ''),     story: raw.story || 'examples/story-hexi.json',
  • Network accessline 55
    base: String(raw.base || 'http://127.0.0.1:8770').replace(/\/$/, ''),

mapstage/runtime/site-thumbs.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * 给官网示例拍缩略图 + 冒烟检查(无 pageerror)。  *   node site/serve.mjs &   # 8770  *   node runtime/site-thumbs.mjs http://127.0.0.1:8770
  • Network accessline 3
    *   node site/serve.mjs &   # 8770  *   node runtime/site-thumbs.mjs http://127.0.0.1:8770  *   node runtime/site-thumbs.mjs http://127.0.0.1:8770 route-march,skins   # 只拍这几个
  • Network accessline 4
    *   node runtime/site-thumbs.mjs http://127.0.0.1:8770
  • Network accessline 5
    *   node runtime/site-thumbs.mjs http://127.0.0.1:8770 route-march,skins   # 只拍这几个
  • Network accessline 15
    const here = dirname(fileURLToPath(import.meta.url)); const pkg = join(here, '..'); const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');
  • Network accessline 16
    const pkg = join(here, '..'); const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, ''); const thumbs = join(pkg, 'site', 'examples', 'thumbs');
  • Network accessline 17
    const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');

mapstage/runtime/verify-chips-layout.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 9
    const BASE = (process.argv[2] || 'http://127.0.0.1:8767').replace(/\/$/, '');

mapstage/runtime/verify-fx.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    * Requires Playwright (not a repo dep). Example:  *   set PLAYWRIGHT_BROWSERS_PATH=0  *   node runtime/verify-fx.mjs http://127.0.0.1:8766
  • Network accessline 4
    *   set PLAYWRIGHT_BROWSERS_PATH=0  *   node runtime/verify-fx.mjs http://127.0.0.1:8766  */
  • Network accessline 5
    *   node runtime/verify-fx.mjs http://127.0.0.1:8766
  • Network accessline 16
    const repo = join(root, '..'); const outDir = join(repo, '..', 'out', 'fx-verify'); const base = process.argv[2] || 'http://127.0.0.1:8766';
  • Network accessline 18
    const base = process.argv[2] || 'http://127.0.0.1:8766';

mapstage/runtime/verify-gansu-inlet.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-gansu-zhangye.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 12
    }); const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');
  • Network accessline 13
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, ''); await page.goto(base + '/?gansu-zhangye=' + Date.now(), {
  • Network accessline 14
    const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');

mapstage/runtime/verify-hillshade.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 10
    const outDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'out', 'fx-verify'); mkdirSync(outDir, { recursive: true }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');
  • Network accessline 11
    mkdirSync(outDir, { recursive: true }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, ''); const { chromium } = loadPlaywright();
  • Network accessline 12
    const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');

mapstage/runtime/verify-island-beijing.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8778').replace(/\/$/, '');

mapstage/runtime/verify-island-look.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8778').replace(/\/$/, '');

mapstage/runtime/verify-island-rca.mjs

  • Network accessline 1
    /**  * Independent-island RCA: dump clip state, tiles, mask, and cameras.  *   node runtime/verify-island-rca.mjs [http://127.0.0.1:8765]
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * Independent-island RCA: dump clip state, tiles, mask, and cameras.  *   node runtime/verify-island-rca.mjs [http://127.0.0.1:8765]  */
  • Network accessline 3
    *   node runtime/verify-island-rca.mjs [http://127.0.0.1:8765]
  • Network accessline 10
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-island-walls.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-isolate-chips.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = process.argv[2] || 'http://127.0.0.1:8766/';

mapstage/runtime/verify-isolate-edge.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 7
    const BASE = (process.argv[2] || 'http://127.0.0.1:8768').replace(/\/$/, '');

mapstage/runtime/verify-isolate-rise.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 13
    }); const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); const BASE = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');
  • Network accessline 14
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); const BASE = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, ''); await page.goto(BASE + '/?isolate-rise=' + Date.now(), {
  • Network accessline 15
    const BASE = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');

mapstage/runtime/verify-perf-gating.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-preset-guard.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    const BASE = (process.argv[2] || 'http://127.0.0.1:8767').replace(/\/$/, '');

mapstage/runtime/verify-qa.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * QA 检测器验收:用合成帧证明每一类缺陷都能被抓到、干净序列不误报。  *   node site/serve.mjs &            # 8770(导出帧要读 story)  *   node runtime/verify-qa.mjs http://127.0.0.1:8770
  • Network accessline 3
    *   node site/serve.mjs &            # 8770(导出帧要读 story)  *   node runtime/verify-qa.mjs http://127.0.0.1:8770  */
  • Network accessline 4
    *   node runtime/verify-qa.mjs http://127.0.0.1:8770
  • Network accessline 14
    const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');
  • Network accessline 18
    assert.deepEqual(runs([]), []); assert.equal(meanAbsDiff([0, 0, 10], [0, 10, 10]), 10 / 3); const story = await (await fetch(base + '/examples/story-hexi.json')).json();
  • Network accessline 19
    assert.equal(meanAbsDiff([0, 0, 10], [0, 10, 10]), 10 / 3); const story = await (await fetch(base + '/examples/story-hexi.json')).json(); const pick = pickExportFrames(story, 10, 160, false);
  • Network accessline 20
    const story = await (await fetch(base + '/examples/story-hexi.json')).json();

mapstage/runtime/verify-qilian-terrain.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * Compare Qilian terrain at real elevation 1.0 vs dramatic 1.6.  *  *   node runtime/verify-qilian-terrain.mjs http://127.0.0.1:8780
  • Network accessline 3
    *  *   node runtime/verify-qilian-terrain.mjs http://127.0.0.1:8780  */
  • Network accessline 4
    *   node runtime/verify-qilian-terrain.mjs http://127.0.0.1:8780
  • Network accessline 12
    const here = dirname(fileURLToPath(import.meta.url)); const repo = join(here, '..'); const base = (process.argv[2] || 'http://127.0.0.1:8780').replace(/\/$/, '');
  • Network accessline 14
    const base = (process.argv[2] || 'http://127.0.0.1:8780').replace(/\/$/, '');

mapstage/runtime/verify-render.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    * 不在这里跑 1080p 终版本身(太慢);终版的截帧参数由 shoot 的 final 模式保证。  *   node site/serve.mjs &            # 8770  *   node runtime/verify-render.mjs http://127.0.0.1:8770
  • Network accessline 4
    *   node site/serve.mjs &            # 8770  *   node runtime/verify-render.mjs http://127.0.0.1:8770  */
  • Network accessline 5
    *   node runtime/verify-render.mjs http://127.0.0.1:8770
  • Network accessline 14
    const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');
  • Network accessline 40
    const st = JSON.parse(readFileSync(stFile, 'utf8'));   assert.equal(st.approved, true);   const edited = JSON.parse(await (await fetch(base + '/' + story)).text());
  • Network accessline 41
    assert.equal(st.approved, true);   const edited = JSON.parse(await (await fetch(base + '/' + story)).text());   edited.sites[0].name = edited.sites[0].name + '(改过)';
  • Network accessline 42
    const edited = JSON.parse(await (await fetch(base + '/' + story)).text());

mapstage/runtime/verify-rise.mjs

  • Network accessline 1
    /**  * Click 「地形隆起」 and capture start / mid / end stills.  *   node runtime/verify-rise.mjs http://127.0.0.1:8766
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * Click 「地形隆起」 and capture start / mid / end stills.  *   node runtime/verify-rise.mjs http://127.0.0.1:8766  */
  • Network accessline 3
    *   node runtime/verify-rise.mjs http://127.0.0.1:8766
  • Network accessline 12
    const outDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'out', 'fx-verify'); mkdirSync(outDir, { recursive: true }); const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');
  • Network accessline 14
    const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');

mapstage/runtime/verify-shoot.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * 截帧器验收:断点续拍、局部重拍、旧帧混入保护、分层输出、重拍逐字节一致。  *   node site/serve.mjs &            # 8770  *   node runtime/verify-shoot.mjs http://127.0.0.1:8770
  • Network accessline 3
    *   node site/serve.mjs &            # 8770  *   node runtime/verify-shoot.mjs http://127.0.0.1:8770  */
  • Network accessline 4
    *   node runtime/verify-shoot.mjs http://127.0.0.1:8770
  • Network accessline 13
    const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');

mapstage/runtime/verify-showcase.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8768').replace(/\/$/, '');

mapstage/runtime/verify-slab-look.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-slider-uncapped.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 5
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); try {   const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');
  • Network accessline 6
    try {   const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');   await page.goto(base + '/?t=' + Date.now(), {
  • Network accessline 7
    const base = (process.argv[2] || 'http://127.0.0.1:8766').replace(/\/$/, '');

mapstage/runtime/verify-story-hexi.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * story-hexi 示例验收:无 pageerror、预缓存后 seek(t) 正序 / 倒序逐像素一致、违规 story 拒绝渲染。  *   node site/serve.mjs &            # 8770  *   node runtime/verify-story-hexi.mjs http://127.0.0.1:8770
  • Network accessline 3
    *   node site/serve.mjs &            # 8770  *   node runtime/verify-story-hexi.mjs http://127.0.0.1:8770  */
  • Network accessline 4
    *   node runtime/verify-story-hexi.mjs http://127.0.0.1:8770
  • Network accessline 11
    const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');

mapstage/runtime/verify-story-night.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 8
    * 截图写到仓库根 out/story-night-*.png。  *   node site/serve.mjs &            # 8770  *   node runtime/verify-story-night.mjs http://127.0.0.1:8770
  • Network accessline 9
    *   node site/serve.mjs &            # 8770  *   node runtime/verify-story-night.mjs http://127.0.0.1:8770  */
  • Network accessline 10
    *   node runtime/verify-story-night.mjs http://127.0.0.1:8770
  • Network accessline 18
    const GL_ARGS = ['--use-angle=swiftshader', '--enable-unsafe-swiftshader', '--ignore-gpu-blocklist']; const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');
  • Network accessline 19
    const base = (process.argv[2] || 'http://127.0.0.1:8770').replace(/\/$/, '');

mapstage/runtime/verify-terrain-island.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-tile-stack.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    const BASE = (process.argv[2] || 'http://127.0.0.1:8767').replace(/\/$/, '');
  • Network accessline 57
    cacheCount = existsSync(cacheDir) ? readdirSync(cacheDir).length : 0;   const probeHit = (url) =>     execSync('curl -s -D - -o NUL "' + url + '"', { shell: 'cmd.exe', encoding: 'utf8' })
  • Network accessline 58
    const probeHit = (url) =>     execSync('curl -s -D - -o NUL "' + url + '"', { shell: 'cmd.exe', encoding: 'utf8' })       .toLowerCase()
  • Network accessline 59
    execSync('curl -s -D - -o NUL "' + url + '"', { shell: 'cmd.exe', encoding: 'utf8' })

mapstage/runtime/verify-tuner-bugs.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');

mapstage/runtime/verify-tuner-chrome.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 9
    *  *   node runtime/verify-tuner-chrome.mjs  *   node runtime/verify-tuner-chrome.mjs http://127.0.0.1:8770/studio
  • Network accessline 10
    *   node runtime/verify-tuner-chrome.mjs  *   node runtime/verify-tuner-chrome.mjs http://127.0.0.1:8770/studio  *
  • Network accessline 11
    *   node runtime/verify-tuner-chrome.mjs http://127.0.0.1:8770/studio

mapstage/runtime/verify-tuner-vector.mjs

  • Network accessline 1
    /**  * Studio 配色分区(皮肤 / 海拔设色 / 等高线 / 图层颜色)真跑:  *   node runtime/verify-tuner-vector.mjs http://127.0.0.1:8770/studio
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    * Studio 配色分区(皮肤 / 海拔设色 / 等高线 / 图层颜色)真跑:  *   node runtime/verify-tuner-vector.mjs http://127.0.0.1:8770/studio  * 断言:默认全关;设色/图层/等高线开关生效;色阶与图层色编辑进入地图 paint 并落盘;
  • Network accessline 3
    *   node runtime/verify-tuner-vector.mjs http://127.0.0.1:8770/studio
  • Network accessline 13
    const BASE = (process.argv[2] || 'http://127.0.0.1:8770/studio').replace(/\/$/, '');

mapstage/runtime/verify-vector-layers.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    *  *   node runtime/verify-vector-layers.mjs  *   node runtime/verify-vector-layers.mjs http://127.0.0.1:8771
  • Network accessline 4
    *   node runtime/verify-vector-layers.mjs  *   node runtime/verify-vector-layers.mjs http://127.0.0.1:8771  */
  • Network accessline 5
    *   node runtime/verify-vector-layers.mjs http://127.0.0.1:8771
  • Network accessline 169
    assert.equal(   VP.absolutizeTileUrl('/t/s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'),   'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'
  • Network accessline 170
    VP.absolutizeTileUrl('/t/s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'),   'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png' );
  • Network accessline 171
    'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'
  • Network accessline 174
    VP.absolutizeTileUrl(     '/t/s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',     'http://127.0.0.1:8780'
  • Network accessline 175
    '/t/s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',     'http://127.0.0.1:8780'   ),
  • Network accessline 176
    'http://127.0.0.1:8780'
  • Network accessline 177
    ),   'http://127.0.0.1:8780/t/s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png' );
  • Network accessline 178
    'http://127.0.0.1:8780/t/s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'
  • Network accessline 1590
    performance.clearResourceTimings();   async function load() {     var response = await fetch(url, { cache: 'force-cache' });
  • Network accessline 1591
    async function load() {     var response = await fetch(url, { cache: 'force-cache' });     var bytes = (await response.arrayBuffer()).byteLength;
  • Network accessline 1592
    var response = await fetch(url, { cache: 'force-cache' });

mapstage/runtime/verify-vector-overlay.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 8
    *   - isolate (island clip and legacy mask) leaves no vector water / road outside the region  *  * Usage: node runtime/verify-vector-overlay.mjs [baseUrl]   (default http://127.0.0.1:8765)
  • Network accessline 9
    *  * Usage: node runtime/verify-vector-overlay.mjs [baseUrl]   (default http://127.0.0.1:8765)  * Needs network access to tiles.openfreemap.org. Screenshots: <repo>/out/vector-overlay/
  • Network accessline 10
    * Usage: node runtime/verify-vector-overlay.mjs [baseUrl]   (default http://127.0.0.1:8765)
  • Network accessline 19
    const BASE = (process.argv[2] || 'http://127.0.0.1:8765').replace(/\/$/, '');
  • Network accessline 30
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); const requests = []; page.on('request', (r) => requests.push(r.url()));
  • Network accessline 31
    const requests = []; page.on('request', (r) => requests.push(r.url())); page.on('pageerror', (e) => {
  • Network accessline 32
    page.on('request', (r) => requests.push(r.url()));
  • Network accessline 232
    check(!requests.some((u) => /water-data\.js/.test(u)), 'water-data.js is never requested');
  • Network accessline 233
    check(requests.some((u) => /tiles\.openfreemap\.org/.test(u)), 'OpenFreeMap tiles are requested');

mapstage/schemas/map-preset.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://skills.local/mapstage/schemas/map-preset.schema.json",

mapstage/schemas/sample-sites.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://skills.local/mapstage/schemas/sample-sites.schema.json",

mapstage/schemas/story.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://skills.local/mapstage/schemas/story.schema.json",

mapstage/site/assets/contour.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 900" preserveAspectRatio="xMidYMid slice"><path d="M1231 300C1232 302 1233 304 1233 307C1233 309 1233 311 1232 314C1231 316 1230 318 1229 320C1228 322 1227 324 1225 326C1224 328 1222

mapstage/site/assets/favicon.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="2" width="60" height="60" rx="12" fill="#241b14"/><path d="M11 48l9-28 12 20 11-18 6 14c1.4 3.6 3 5.6 5.5 6" fill="none" stroke="#f3eee3" stroke-width="6.5" stroke-l

mapstage/site/assets/logo-lockup.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 330 72" role="img" aria-label="MapStage · 历史视频的地图舞台">

mapstage/site/assets/logo.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="MapStage">

mapstage/site/assets/md.js

  • Executable scriptline 1
    Executable file

mapstage/site/assets/md.test.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 47
    {   const { html } = md.render('见 [镜头](camera.md#push) 与 [官网](https://maplibre.org)', {
  • Network accessline 48
    const { html } = md.render('见 [镜头](camera.md#push) 与 [官网](https://maplibre.org)', {

mapstage/site/assets/site.js

  • Executable scriptline 1
    Executable file
  • Network accessline 9
    var script = document.currentScript;   var ROOT = new URL('../', script ? script.src : location.href).href;   var GH = 'https://github.com/hopechen067/MapStage';
  • Network accessline 11
    var GH = 'https://github.com/hopechen067/MapStage';

mapstage/site/assets/stage-kit.js

  • Executable scriptline 1
    Executable file

mapstage/site/assets/stage-kit.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/site/build.mjs

  • Executable scriptline 1
    Executable file

mapstage/site/docs/index.html

  • Network accessline 7
    <meta name="description" content="MapStage 文档:快速上手、安装 skill、Preset / Story 规范、镜头、合规、宿主与渲染、运行时 API、长征系列地图经验与路线图。">   <link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">   <link href="https://fonts.googleapis.com/css2?family=N
  • Network accessline 8
    <link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet" href="../assets/site.css">
  • Network accessline 9
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 83
    if (BY_FILE[file]) return '?p=' + BY_FILE[file] + hash;         if (/^\.\.\/site\/examples\/([\w-]+)\.html$/.test(path)) return RegExp.$1 === 'index' ? '../examples/' : '../examples/view.html?id=' + RegExp.$1;         var resolved = new URL
  • Network accessline 84
    if (/^\.\.\/site\/examples\/([\w-]+)\.html$/.test(path)) return RegExp.$1 === 'index' ? '../examples/' : '../examples/view.html?id=' + RegExp.$1;         var resolved = new URL(path, 'https://x/mapstage/references/').pathname.replace(/^\//,
  • Network accessline 85
    var resolved = new URL(path, 'https://x/mapstage/references/').pathname.replace(/^\//, '');
  • Network accessline 157
    document.title = page.title + ' · MapStage 文档';         var doc = document.getElementById('doc');         fetch(REF + encodeURIComponent(page.file), { cache: 'no-cache' })
  • Network accessline 158
    var doc = document.getElementById('doc');         fetch(REF + encodeURIComponent(page.file), { cache: 'no-cache' })           .then(function (r) { if (!r.ok) throw new Error(r.status + ' ' + page.file); return r.text(); })
  • Network accessline 159
    fetch(REF + encodeURIComponent(page.file), { cache: 'no-cache' })

mapstage/site/examples/board-basic.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>游戏地图最小用法 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>游戏地图最小用法 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/board-cities.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>城池圈、徽标与选中环 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>城池圈、徽标与选中环 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 42
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/board-hover.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>悬停提示与点选 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>悬停提示与点选 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/board-links.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>连线与相邻关系 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>连线与相邻关系 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 26
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/board-march.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>行军动画与镜头 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>行军动画与镜头 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/camera-fit.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>按地点自动取景 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>按地点自动取景 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/camera-manual.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>手写机位 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>手写机位 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 31
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/camera-push.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>一句一动:move / push / tilt · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>一句一动:move / push / tilt · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 29
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/camera-route.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>按路线取景与 maxSpan · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>按路线取景与 maxSpan · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/cards-basic.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>地名卡、名牌、印章、大字 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>地名卡、名牌、印章、大字 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/cards-doc-photo.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>文献 doc 与照片 photo · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>文献 doc 与照片 photo · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 28
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/cards-table.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>速查表 table · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>速查表 table · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/cards-telegram.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>电报 telegram · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>电报 telegram · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/compliance-full.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>全图时段与十段线 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>全图时段与十段线 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 29
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/compliance.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>合规全图 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>合规全图 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 23
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/examples.js

  • Executable scriptline 1
    Executable file

mapstage/site/examples/globe.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>地球视角开场 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>地球视角开场 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 24
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/index.html

  • Network accessline 7
    <meta name="description" content="MapStage 示例库:底图、路线、地名、镜头、字卡、合规、逐帧舞台、游戏地图,每个功能一个能直接复制运行的示例。">   <link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@6
  • Network accessline 8
    <link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet" href="../assets/site.css">
  • Network accessline 9
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">

mapstage/site/examples/labels-approx.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>可信度与「约」 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>可信度与「约」 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 26
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/labels-tiers.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>地点层级 tier · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>地点层级 tier · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 22
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/labels.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>地名三态 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>地名三态 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 32
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/look-basemap.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>底图样式与夜景 · MapStage 示例</title>   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 6
    <title>底图样式与夜景 · MapStage 示例</title>   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.c
  • Network accessline 7
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 8
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 24
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/look-basic.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>加载古卷底图 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>加载古卷底图 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 21
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/look-layers.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>图层开关 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>图层开关 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 26
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/look-preset.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>用 preset.json 定调 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>用 preset.json 定调 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 45
    fetch('../studio/presets/antique-default.json')

mapstage/site/examples/play-sanguo.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>三分天下 · MapStage 示例</title>   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 6
    <title>三分天下 · MapStage 示例</title>   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css"
  • Network accessline 7
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 8
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 72
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 87
    async function boot() {       const scUrl = new URL('./play-sanguo.json', location.href);       sc = await (await fetch(scUrl)).json();
  • Network accessline 88
    const scUrl = new URL('./play-sanguo.json', location.href);       sc = await (await fetch(scUrl)).json();       P.validateScenario(sc);
  • Network accessline 89
    sc = await (await fetch(scUrl)).json();
  • Network accessline 91
    sc.sites.forEach((s) => { site[s.id] = s; });       sc.factions.forEach((f) => { faction[f.id] = f; });       const preset = await (await fetch(new URL(sc.preset, scUrl))).json();
  • Network accessline 92
    sc.factions.forEach((f) => { faction[f.id] = f; });       const preset = await (await fetch(new URL(sc.preset, scUrl))).json();       board = await MapStageBoard.create($('stage'), { preset, sites: sc.sites, links: sc.links, preserve: true 
  • Network accessline 93
    const preset = await (await fetch(new URL(sc.preset, scUrl))).json();

mapstage/site/examples/precache.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>预缓存与正倒序一致 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>预缓存与正倒序一致 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 28
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/route-curve.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>弧线与真实线形 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>弧线与真实线形 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 25
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/route-hold.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>分段 hold 按段末收 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>分段 hold 按段末收 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 29
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/route-march.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>路线行进 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>路线行进 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/route-roles.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>路线角色画法 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>路线角色画法 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 29
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/route-sides.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>四方配色 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>四方配色 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 31
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/route-slice.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>自己画路线 sliceRoute · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>自己画路线 sliceRoute · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 28
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/seek-contract.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>逐帧时间契约 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>逐帧时间契约 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 34
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/skins.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>切换古卷皮肤 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>切换古卷皮肤 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 22
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/stage-check.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>逐时刻自检 stage.check · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>逐时刻自检 stage.check · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 40
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/story-hexi.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>河西走廊 · MapStage 示例</title>   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 6
    <title>河西走廊 · MapStage 示例</title>   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css"
  • Network accessline 7
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 8
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 39
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 48
    async function boot() {       const jsonUrl = new URL('./story-hexi.json', location.href);       const story = await (await fetch(jsonUrl)).json();
  • Network accessline 49
    const jsonUrl = new URL('./story-hexi.json', location.href);       const story = await (await fetch(jsonUrl)).json();       // preset 路径写在 json 里,相对 json 本身解析
  • Network accessline 50
    const story = await (await fetch(jsonUrl)).json();
  • Network accessline 51
    // preset 路径写在 json 里,相对 json 本身解析       const preset = await (await fetch(new URL(story.preset, jsonUrl))).json();       stage = await MapStage.mount($('stage'), { preset, story, preserve: true });
  • Network accessline 52
    const preset = await (await fetch(new URL(story.preset, jsonUrl))).json();

mapstage/site/examples/terrain.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>地形夸张 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>地形夸张 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 25
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/validate.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1">   <title>校验不过就拒绝渲染 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 6
    <title>校验不过就拒绝渲染 · MapStage 示例</title>   <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">   <style>
  • Network accessline 7
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 33
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/examples/view.html

  • Network accessline 6
    <title>示例 · MapStage</title>   <link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 7
    <link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet" href="../assets/site.css">
  • Network accessline 8
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 111
    fetch(file, { cache: 'no-cache' })

mapstage/site/host.html

  • Network accessline 8
    用法:host.html?story=examples/story-hexi.json(相对站点根)        宿主(Playwright / HyperFrames / Remotion)等 window.__mapstageReady,再逐帧调 window.__mapstageSeek(t)。 -->   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;9
  • Network accessline 9
    宿主(Playwright / HyperFrames / Remotion)等 window.__mapstageReady,再逐帧调 window.__mapstageSeek(t)。 -->   <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">   <link rel="stylesheet
  • Network accessline 10
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 11
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 27
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 47
    var q = new URLSearchParams(location.search);       var storyUrl = new URL(q.get('story') || 'examples/story-hexi.json', location.href);       var storyText = await (await fetch(storyUrl)).text();
  • Network accessline 48
    var storyUrl = new URL(q.get('story') || 'examples/story-hexi.json', location.href);       var storyText = await (await fetch(storyUrl)).text();       var story = JSON.parse(storyText);
  • Network accessline 49
    var storyText = await (await fetch(storyUrl)).text();
  • Network accessline 52
    var preset = {};       if (story.preset) {         presetText = await (await fetch(new URL(story.preset, storyUrl))).text();
  • Network accessline 53
    if (story.preset) {         presetText = await (await fetch(new URL(story.preset, storyUrl))).text();         preset = JSON.parse(presetText);
  • Network accessline 54
    presetText = await (await fetch(new URL(story.preset, storyUrl))).text();

mapstage/site/index.html

  • Network accessline 7
    <meta name="description" content="MapStage:基于 MapLibre GL JS 的叙事地图引擎与 agent skill。古卷底图、路线行进、自动取景、合规规则,一份 JSON 驱动,逐帧可复现。">   <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">   <link rel="preconnect" href="https://fonts.google
  • Network accessline 8
    <link rel="icon" href="assets/favicon.svg" type="image/svg+xml">   <link rel="preconnect" href="https://fonts.googleapis.com">   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  • Network accessline 9
    <link rel="preconnect" href="https://fonts.googleapis.com">
  • Network accessline 10
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  • Network accessline 11
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@600;700;900&display=swap" rel="stylesheet">
  • Network accessline 12
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css">
  • Network accessline 182
    <li><h3>逐帧终版</h3><p>确认后 1080p 逐帧截取,断点续拍,局部重拍。</p></li>         </ol>         <div class="code prompt-box wrap-lines" data-title="复制给你的 agent"><pre>安装 MapStage skill:https://github.com/hopechen067/MapStage
  • Network accessline 183
    </ol>         <div class="code prompt-box wrap-lines" data-title="复制给你的 agent"><pre>安装 MapStage skill:https://github.com/hopechen067/MapStage 然后用 /mapstage 做一段河西走廊从武威到敦煌的路线移动,完成后启动本地预览。</pre></div>
  • Network accessline 184
    <div class="code prompt-box wrap-lines" data-title="复制给你的 agent"><pre>安装 MapStage skill:https://github.com/hopechen067/MapStage
  • Network accessline 295
    <script src="assets/site.js"></script>   <script src="examples/examples.js"></script>   <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>
  • Network accessline 296
    <script src="examples/examples.js"></script>   <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>   <script src="studio/assets/vector-paint.js"></script>
  • Network accessline 297
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js"></script>

mapstage/site/serve.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 69
    const port = Number(process.env.PORT || 8770);   createServer(serve).listen(port, '127.0.0.1', () => {     console.log('MapStage site → http://127.0.0.1:' + port + '/');
  • Network accessline 70
    createServer(serve).listen(port, '127.0.0.1', () => {     console.log('MapStage site → http://127.0.0.1:' + port + '/');   });
  • Network accessline 71
    console.log('MapStage site → http://127.0.0.1:' + port + '/');

mapstage/templates/remotion/MapStageScene.tsx

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    * Scene 里的精灵、标签、弹窗、Canvas 特效叠在它上面(zIndex 比它高即可)。  *  *   <MapStageScene hostUrl="http://127.0.0.1:8770" story="examples/story-hexi.json" />
  • Network accessline 7
    *  *   <MapStageScene hostUrl="http://127.0.0.1:8770" story="examples/story-hexi.json" />  *
  • Network accessline 8
    *   <MapStageScene hostUrl="http://127.0.0.1:8770" story="examples/story-hexi.json" />
  • Network accessline 22
    /** MapStage 站点根,例如 http://127.0.0.1:8770 */

mapstage/tuner/README.md

  • Network accessline 12
    Open [http://localhost:8765/](http://localhost:8765/).

mapstage/tuner/_serve.test.cjs

  • Executable scriptline 1
    Executable file
  • Network accessline 134
    const upstream = "https://tiles.maps.eox.at/test/tile.webp?z=1";
  • Network accessline 146
    const legacyUpstream = "https://tiles.maps.eox.at/legacy/tile.png";

mapstage/tuner/assets/han-city-3d.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/isolate-skirt-seam.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/isolate-workbench.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/map-fx.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/map-fx.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/mapstage-board.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/mapstage-board.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/mapstage-hosts.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/mapstage-look.test.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 131
    {   const night = M.nightSpec(undefined, 'http://x/studio/');
  • Network accessline 132
    const night = M.nightSpec(undefined, 'http://x/studio/');
  • Network accessline 168
    {   const d = M.nightSpec(undefined, 'http://x/studio/');
  • Network accessline 169
    const d = M.nightSpec(undefined, 'http://x/studio/');
  • Network accessline 170
    assert.equal(d.type, 'image');   assert.equal(d.url, 'http://x/studio/assets/night-lights.png');   assert.deepEqual(d.coordinates, [[60, 56], [150, 56], [150, -2], [60, -2]]);
  • Network accessline 171
    assert.equal(d.url, 'http://x/studio/assets/night-lights.png');
  • Network accessline 173
    assert.equal(M.nightSpec(false), null);   assert.equal(M.nightSpec({ enabled: false }), null);   assert.equal(M.nightSpec({ image: 'https://e/x.png' }), null, '等经纬图要浏览器重投影,同步版不支持');
  • Network accessline 174
    assert.equal(M.nightSpec({ enabled: false }), null);   assert.equal(M.nightSpec({ image: 'https://e/x.png' }), null, '等经纬图要浏览器重投影,同步版不支持');   const t = M.nightSpec({ tiles: ['https://t/{z}/{y}/{x}.png'] });
  • Network accessline 175
    assert.equal(M.nightSpec({ image: 'https://e/x.png' }), null, '等经纬图要浏览器重投影,同步版不支持');
  • Network accessline 176
    const t = M.nightSpec({ tiles: ['https://t/{z}/{y}/{x}.png'] });

mapstage/tuner/assets/mapstage-play.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/mapstage-play.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/mapstage-story.js

  • Executable scriptline 1
    Executable file
  • Network accessline 946
    applyLookToStyle(style, look, { VP: VP, night: night });     if (style.sources.polarIce) {       style.sources.polarIce.data = new URL(VP.POLAR_ICE_URL, opts.assetBase || SCRIPT_DIR || (typeof location !== 'undefined' ? location.href : 'htt
  • Network accessline 947
    if (style.sources.polarIce) {       style.sources.polarIce.data = new URL(VP.POLAR_ICE_URL, opts.assetBase || SCRIPT_DIR || (typeof location !== 'undefined' ? location.href : 'http://localhost/')).href;     }
  • Network accessline 948
    style.sources.polarIce.data = new URL(VP.POLAR_ICE_URL, opts.assetBase || SCRIPT_DIR || (typeof location !== 'undefined' ? location.href : 'http://localhost/')).href;
  • Network accessline 1181
    function mount(el, opts) {     opts = opts || {};     var base = opts.assetBase || SCRIPT_DIR || (typeof location !== 'undefined' ? location.href : 'http://localhost/');
  • Network accessline 1182
    opts = opts || {};     var base = opts.assetBase || SCRIPT_DIR || (typeof location !== 'undefined' ? location.href : 'http://localhost/');     var needTV = wantsBasemap(opts.preset, opts.story);
  • Network accessline 1183
    var base = opts.assetBase || SCRIPT_DIR || (typeof location !== 'undefined' ? location.href : 'http://localhost/');
  • Network accessline 1195
    : sl.nightLights !== undefined ? sl.nightLights           : root.MAP_TILE_CONFIG && root.MAP_TILE_CONFIG.nightLights;       var nc = tunerVector().resolveNightConfig(cfg);
  • Network accessline 1196
    : root.MAP_TILE_CONFIG && root.MAP_TILE_CONFIG.nightLights;       var nc = tunerVector().resolveNightConfig(cfg);       nightCredit = nc && nc.attribution ? '夜光:' + nc.attribution : '';
  • Network accessline 1197
    var nc = tunerVector().resolveNightConfig(cfg);
  • Network accessline 1198
    nightCredit = nc && nc.attribution ? '夜光:' + nc.attribution : '';

mapstage/tuner/assets/mapstage-story.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/region-isolate-data.js

  • Executable scriptline 1
    Executable file
  • Network accessline 2
    window.REGION_ISOLATE_DATA = {"version":1,"defaultId":"china","regions":[{"id":"china","label":"中国","kind":"nation","group":"","attribution":"Natural Earth 10m China POV (public domain): full PRC land incl. Zangnan, Taiwan/HK/Macao, Diaoyu 

mapstage/tuner/assets/region-isolate-data.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/region-isolate.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/region-isolate.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/site-nav.js

  • Executable scriptline 1
    Executable file
  • Network accessline 8
    var GH = 'https://github.com/hopechen067/MapStage';

mapstage/tuner/assets/terrain-island.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/terrain-island.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/tuner-app.js

  • Executable scriptline 1
    Executable file
  • Network accessline 1614
    ? terIn.tiles.filter(function (u) { return typeof u === 'string' && u.length > 0; })       : [           'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 1615
    : [           'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',           'https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png',
  • Network accessline 1616
    'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 1617
    'https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png',
  • Network accessline 1969
    (params.cities && params.cities.dataFile) || 'assets/sample-sites.json';     try {       var resN = await fetch(sitesUrl);
  • Network accessline 1970
    try {       var resN = await fetch(sitesUrl);       if (resN.ok) {
  • Network accessline 1971
    var resN = await fetch(sitesUrl);
  • Network accessline 2367
    async function loadScenes() {     try {       const res = await fetch('scenes.json');
  • Network accessline 2368
    try {       const res = await fetch('scenes.json');       if (res.ok) {
  • Network accessline 2369
    const res = await fetch('scenes.json');
  • Network accessline 2392
    if (!hasLocal) {       try {         const res = await fetch('preset-antique-default.json');
  • Network accessline 2393
    try {         const res = await fetch('preset-antique-default.json');         if (res.ok) {
  • Network accessline 2394
    const res = await fetch('preset-antique-default.json');

mapstage/tuner/assets/tuner-modules.test.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/tuner-params.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/tuner-shell.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/tuner-util.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/tuner-vector.js

  • Executable scriptline 1
    Executable file

mapstage/tuner/assets/tuner-vector.test.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 10
    terrain: {     enabled: true,     tiles: ['https://example.test/terrarium/{z}/{x}/{y}.png'],
  • Network accessline 11
    enabled: true,     tiles: ['https://example.test/terrarium/{z}/{x}/{y}.png'],     tileSize: 256,
  • Network accessline 12
    tiles: ['https://example.test/terrarium/{z}/{x}/{y}.png'],
  • Network accessline 162
    assert.deepEqual(def.bounds, [60, -2, 150, 56]);   assert.deepEqual(TV.nightSourceSpec(def).coordinates, [[60, 56], [150, 56], [150, -2], [60, -2]]);   const nasa = TV.resolveNightConfig({ image: 'https://x/earth_lights_2048.png' });
  • Network accessline 163
    assert.deepEqual(TV.nightSourceSpec(def).coordinates, [[60, 56], [150, 56], [150, -2], [60, -2]]);   const nasa = TV.resolveNightConfig({ image: 'https://x/earth_lights_2048.png' });   assert.equal(nasa.bounds, null, 'custom image without b
  • Network accessline 164
    const nasa = TV.resolveNightConfig({ image: 'https://x/earth_lights_2048.png' });
  • Network accessline 167
    assert.equal(TV.resolveNightConfig(false), null);   assert.equal(TV.resolveNightConfig({ enabled: false }), null);   const tiled = TV.resolveNightConfig({ tiles: ['https://x/{z}/{y}/{x}.png'], image: 'a.png' });
  • Network accessline 168
    assert.equal(TV.resolveNightConfig({ enabled: false }), null);   const tiled = TV.resolveNightConfig({ tiles: ['https://x/{z}/{y}/{x}.png'], image: 'a.png' });   assert.equal(tiled.image, '', 'tiles win over image');
  • Network accessline 169
    const tiled = TV.resolveNightConfig({ tiles: ['https://x/{z}/{y}/{x}.png'], image: 'a.png' });

mapstage/tuner/assets/vector-paint.js

  • Executable scriptline 1
    Executable file
  • Network accessline 17
    var TILEJSON_URL = 'https://tiles.openfreemap.org/planet';
  • Network accessline 18
    var SOURCE_ID = 'openmaptiles';   var OPENFREEMAP_ATTRIBUTION =     '<a href="https://openfreemap.org">OpenFreeMap</a> © <a href="https://openmaptiles.org">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</
  • Network accessline 20
    '<a href="https://openfreemap.org">OpenFreeMap</a> © <a href="https://openmaptiles.org">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>';
  • Network accessline 56
    var CONTOUR_SOURCE_ID = 'contours';   var CONTOUR_LAYER = 'contours';   var GLYPHS_URL = 'https://tiles.openfreemap.org/fonts/{fontstack}/{range}.pbf';
  • Network accessline 58
    var GLYPHS_URL = 'https://tiles.openfreemap.org/fonts/{fontstack}/{range}.pbf';
  • Network accessline 85
    id: 'mapterhorn',       label: 'Mapterhorn',       tiles: ['https://tiles.mapterhorn.com/{z}/{x}/{y}.webp'],
  • Network accessline 86
    label: 'Mapterhorn',       tiles: ['https://tiles.mapterhorn.com/{z}/{x}/{y}.webp'],       tileSize: 512,
  • Network accessline 87
    tiles: ['https://tiles.mapterhorn.com/{z}/{x}/{y}.webp'],
  • Network accessline 90
    visualMaxzoom: 16,       encoding: 'terrarium',       attribution: '<a href="https://mapterhorn.com/attribution" target="_blank" rel="noopener">© Mapterhorn</a>',
  • Network accessline 91
    encoding: 'terrarium',       attribution: '<a href="https://mapterhorn.com/attribution" target="_blank" rel="noopener">© Mapterhorn</a>',     },
  • Network accessline 92
    attribution: '<a href="https://mapterhorn.com/attribution" target="_blank" rel="noopener">© Mapterhorn</a>',
  • Network accessline 95
    id: 'terrarium',       label: 'Terrarium 30m',       tiles: ['https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'],
  • Network accessline 96
    label: 'Terrarium 30m',       tiles: ['https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'],       tileSize: 256,
  • Network accessline 97
    tiles: ['https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png'],
  • Network accessline 1043
    var t = (tileCfg && tileCfg.terrain) || {};     var raw = Array.isArray(t.tiles) && t.tiles.length ? t.tiles : [       'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 1044
    var raw = Array.isArray(t.tiles) && t.tiles.length ? t.tiles : [       'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',     ];
  • Network accessline 1045
    'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 1134
    buffer: 256,       attribution:         '<a href="https://protomaps.com">Protomaps</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
  • Network accessline 1135
    attribution:         '<a href="https://protomaps.com">Protomaps</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',     };
  • Network accessline 1136
    '<a href="https://protomaps.com">Protomaps</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',

mapstage/tuner/hexi-map-shot.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1" />   <title>汉图古卷 · 河西跳切(precache + jumpTo)</title>   <link rel="preconnect" href="https://unpkg.com" crossorigin />
  • Network accessline 6
    <title>汉图古卷 · 河西跳切(precache + jumpTo)</title>   <link rel="preconnect" href="https://unpkg.com" crossorigin />   <link rel="preconnect" href="https://tiles.maps.eox.at" crossorigin />
  • Network accessline 7
    <link rel="preconnect" href="https://unpkg.com" crossorigin />
  • Network accessline 8
    <link rel="preconnect" href="https://tiles.maps.eox.at" crossorigin />
  • Network accessline 9
    <link rel="preconnect" href="https://s3.amazonaws.com" crossorigin />
  • Network accessline 10
    <link rel="preconnect" href="https://elevation-tiles-prod.s3.amazonaws.com" crossorigin />
  • Network accessline 11
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css" />
  • Network accessline 66
    <script src="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.js" crossorigin="anonymous" integrity="sha384-GfxBM9x46BaAFxtCq39Fxir8fNZ4VDnwgfi6Kzi5/F1tAFsm0amuuV8kd+Pxzuf/"></script>
  • Network accessline 67
    <script src="https://unpkg.com/gsap@3.12.5/dist/gsap.min.js" crossorigin="anonymous" integrity="sha384-g4NTh/Iv5PPU4xPyhEWqPcwtNXOvdaDI8LLnyYfyNZOjKJeYQyjzQ9X5275eBjpt"></script>
  • Network accessline 194
    async function main() {         var preset = await fetch(PRESET_URL).then(function (r) { return r.json(); });
  • Network accessline 195
    var preset = await fetch(PRESET_URL).then(function (r) { return r.json(); });

mapstage/tuner/index.html

  • Network accessline 16
    </script>   <script src="assets/site-nav.js?v=20260829-w2c"></script>   <link rel="preconnect" href="https://unpkg.com" crossorigin />
  • Network accessline 17
    <script src="assets/site-nav.js?v=20260829-w2c"></script>   <link rel="preconnect" href="https://unpkg.com" crossorigin />   <link rel="preconnect" href="https://tiles.maps.eox.at" crossorigin />
  • Network accessline 18
    <link rel="preconnect" href="https://unpkg.com" crossorigin />
  • Network accessline 19
    <link rel="preconnect" href="https://tiles.maps.eox.at" crossorigin />
  • Network accessline 20
    <link rel="preconnect" href="https://s3.amazonaws.com" crossorigin />
  • Network accessline 21
    <link rel="preconnect" href="https://elevation-tiles-prod.s3.amazonaws.com" crossorigin />
  • Network accessline 22
    <link rel="dns-prefetch" href="https://tiles.maps.eox.at" />
  • Network accessline 23
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css" />
  • Network accessline 24
    <link rel="preconnect" href="https://fonts.googleapis.com" />
  • Network accessline 25
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  • Network accessline 26
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@500;600&display=swap" rel="stylesheet" />
  • Network accessline 29
    <script src="assets/vector-paint.js?v=20260929-roadtiers"></script>   <!-- Three.js r160 · 3D 城池 custom layer 依赖 -->   <script src="https://unpkg.com/three@0.160.0/build/three.min.js" crossorigin="anonymous" integrity="sha384-qOkzR5Ke/XkQxu
  • Network accessline 30
    <!-- Three.js r160 · 3D 城池 custom layer 依赖 -->   <script src="https://unpkg.com/three@0.160.0/build/three.min.js" crossorigin="anonymous" integrity="sha384-qOkzR5Ke/XkQxuGVJ9hpFEpDlcoLtWwVYhnJf06cLIZa2vaIptSqaubivErzmD5O"></script>   <scrip
  • Network accessline 31
    <script src="https://unpkg.com/three@0.160.0/build/three.min.js" crossorigin="anonymous" integrity="sha384-qOkzR5Ke/XkQxuGVJ9hpFEpDlcoLtWwVYhnJf06cLIZa2vaIptSqaubivErzmD5O"></script>

mapstage/tuner/map-tiles.config.example.js

  • Executable scriptline 1
    Executable file
  • Network accessline 28
    'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2020_3857/default/g/{z}/{y}/{x}.jpg',
  • Network accessline 31
    maxzoom: 14,     attribution:       'Sentinel-2 cloudless © <a href="https://s2maps.eu">EOX</a> · modified Copernicus Sentinel data 2020',
  • Network accessline 33
    'Sentinel-2 cloudless © <a href="https://s2maps.eu">EOX</a> · modified Copernicus Sentinel data 2020',
  • Network accessline 37
    // Other basemaps (local only): tiles: ['https://YOUR-HOST/{z}/{x}/{y}.png'],
  • Network accessline 47
    enabled: true,     tiles: [       'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 48
    tiles: [       'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',       'https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png',
  • Network accessline 49
    'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 50
    'https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png',

mapstage/tuner/map-tiles.config.js

  • Executable scriptline 1
    Executable file
  • Network accessline 10
    tiles: [       'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2020_3857/default/g/{z}/{y}/{x}.jpg',
  • Network accessline 11
    'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2020_3857/default/g/{z}/{y}/{x}.jpg',
  • Network accessline 14
    maxzoom: 14,     attribution:       'Sentinel-2 cloudless © <a href="https://s2maps.eu">EOX</a> · modified Copernicus Sentinel data 2020',
  • Network accessline 15
    attribution:       'Sentinel-2 cloudless © <a href="https://s2maps.eu">EOX</a> · modified Copernicus Sentinel data 2020',     sourceId: 'basemapRaster',
  • Network accessline 16
    'Sentinel-2 cloudless © <a href="https://s2maps.eu">EOX</a> · modified Copernicus Sentinel data 2020',
  • Network accessline 21
    enabled: true,     tiles: [       'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 22
    tiles: [       'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',       'https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png',
  • Network accessline 23
    'https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png',
  • Network accessline 24
    'https://elevation-tiles-prod.s3.amazonaws.com/terrarium/{z}/{x}/{y}.png',
  • Network accessline 33
    // 墨卡托 PNG(assets/night-lights.png,bounds 与脚本一致)。可换成:   //   NASA 低清城市灯光(等经纬全球图,浏览器里重投影):   //     image: 'https://cdn.jsdelivr.net/gh/mrdoob/three.js@r160/examples/textures/planets/earth_lights_2048.png',
  • Network accessline 34
    //   NASA 低清城市灯光(等经纬全球图,浏览器里重投影):   //     image: 'https://cdn.jsdelivr.net/gh/mrdoob/three.js@r160/examples/textures/planets/earth_lights_2048.png',   //     attribution: 'City lights: NASA Earth Observatory',
  • Network accessline 35
    //     image: 'https://cdn.jsdelivr.net/gh/mrdoob/three.js@r160/examples/textures/planets/earth_lights_2048.png',
  • Network accessline 36
    //     attribution: 'City lights: NASA Earth Observatory',   //   NASA GIBS 高清瓦片(公共领域,maxzoom 8):   //     tiles: ['https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_Black_Marble/default/2016-01-01/GoogleMapsCompatible_Level8/{z}/{y}
  • Network accessline 37
    //   NASA GIBS 高清瓦片(公共领域,maxzoom 8):   //     tiles: ['https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_Black_Marble/default/2016-01-01/GoogleMapsCompatible_Level8/{z}/{y}/{x}.png'],   //     attribution: 'VIIRS Black Marble: NASA',
  • Network accessline 38
    //     tiles: ['https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/VIIRS_Black_Marble/default/2016-01-01/GoogleMapsCompatible_Level8/{z}/{y}/{x}.png'],

mapstage/tuner/scripts/bake-night-lights.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    *   node tuner/scripts/bake-night-lights.mjs <geonames 目录> [输出 png]  *  * <geonames 目录> 里放 https://download.geonames.org/export/dump/ 解压后的
  • Network accessline 5
    *  * <geonames 目录> 里放 https://download.geonames.org/export/dump/ 解压后的  * CN.txt TW.txt HK.txt MO.txt cities500.txt(GeoNames, CC BY 4.0)。
  • Network accessline 6
    * <geonames 目录> 里放 https://download.geonames.org/export/dump/ 解压后的

mapstage/tuner/scripts/build-polar-ice.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/scripts/build-region-isolate.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 21
    const NE_URLS = [   'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_admin_0_countries.geojson',
  • Network accessline 22
    'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_admin_0_countries.geojson',
  • Network accessline 23
    'https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_50m_admin_0_countries.geojson',
  • Network accessline 27
    const OSM_FR = 'https://polygons.openstreetmap.fr/get_geojson.py?id=';
  • Network accessline 64
    for (const url of NE_URLS) {     try {       const res = await fetch(url);
  • Network accessline 65
    try {       const res = await fetch(url);       if (!res.ok) throw new Error('HTTP ' + res.status + ' ' + url);
  • Network accessline 66
    const res = await fetch(url);
  • Network accessline 207
    try {         await new Promise((r) => setTimeout(r, attempt === 0 ? 0 : 800 * (attempt + 1)));         const res = await fetch(url, {
  • Network accessline 208
    await new Promise((r) => setTimeout(r, attempt === 0 ? 0 : 800 * (attempt + 1)));         const res = await fetch(url, {           headers: { 'User-Agent': 'mapstage/region-isolate' },
  • Network accessline 209
    const res = await fetch(url, {
  • Network accessline 252
    '. Simplified isolate silhouette, not an official boundary.',     source: 'OpenStreetMap administrative boundary',     sourceUrl: 'https://www.openstreetmap.org/relation/' + spec.relId,
  • Network accessline 253
    source: 'OpenStreetMap administrative boundary',     sourceUrl: 'https://www.openstreetmap.org/relation/' + spec.relId,     osmRelation: spec.relId,
  • Network accessline 254
    sourceUrl: 'https://www.openstreetmap.org/relation/' + spec.relId,

mapstage/tuner/scripts/city-catalog.mjs

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 8
    export const CITY_RAW = [{"relId":2110265,"label":"阿坝藏族羌族自治州","name":"阿坝藏族羌族自治州 རྔ་བ་བོད་རིགས་ཆ་བ༹ང་རིགས་རང་སྐྱོང་ཁུལ་"},{"relId":2748825,"label":"阿克苏地区","name":"阿克苏地区 ئاقسۇ ۋىلايىتى"},{"relId":2752743,"label":"阿拉善盟","name":"阿拉善盟 ᠠᠯᠠᠱᠠ ᠠᠶᠢᠮ

mapstage/tuner/scripts/fetch-city-catalog.mjs

  • Executable scriptline 1
    Executable file
  • Network accessline 17
    const OVERPASS_ENDPOINTS = [   'https://overpass-api.de/api/interpreter',
  • Network accessline 18
    'https://overpass-api.de/api/interpreter',
  • Network accessline 19
    'https://overpass.kumi.systems/api/interpreter',
  • Network accessline 20
    'https://overpass.private.coffee/api/interpreter',
  • Network accessline 34
    try {       console.log('Trying ' + url);       const res = await fetch(url, {
  • Network accessline 35
    console.log('Trying ' + url);       const res = await fetch(url, {         method: 'POST',
  • Network accessline 36
    const res = await fetch(url, {

mapstage/tuner/scripts/patch-china-boundaries.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 6
    * South-China-Sea islands, and the ten-dash maritime line.  *  * Sources (Natural Earth 10m, https://www.naturalearthdata.com/):
  • Network accessline 7
    *  * Sources (Natural Earth 10m, https://www.naturalearthdata.com/):  *   ne_10m_admin_0_countries_chn                          China POV land
  • Network accessline 8
    * Sources (Natural Earth 10m, https://www.naturalearthdata.com/):
  • Network accessline 38
    const NE_ADMINS = new Set(['China', 'Hong Kong S.A.R.', 'Macao S.A.R']); const NE_SOURCE = 'Natural Earth 10m (public domain), China POV'; const NE_URL = 'https://www.naturalearthdata.com/';
  • Network accessline 40
    const NE_URL = 'https://www.naturalearthdata.com/';

mapstage/tuner/scripts/patch-maplibre-terrain-clip.mjs

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 139
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 141
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 texel=vec2(1.0)/vec2(textureSize(u_clip,0
  • Possible obfuscationline 150
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 152
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 157
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 159
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 165
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 170
    'vec2 p2=a_pos3d.xy;v_skirt=a_pos3d.z;v_clip=1.0;v_drop=0.0;if(u_clip_enabled>0.5){vec2 orig=u_projection_tile_mercator_coords.xy;vec2 sc=max(u_projection_tile_mercator_coords.zw,vec2(1.0e-12));vec2 duv=(sc*64.0)/max(u_clip_size,vec2(1.0e-1
  • Possible obfuscationline 182
    'float g2=dot(g,g);vec2 dir=vec2(0.0);if(g2>1.0e-12){dir=g*inversesqrt(g2);if(inside)dir=-dir;}if(dot(dir,dir)<1.0e-12){vec2 o;float tt;o=vec2(duv.x,0.0);tt=antiqueClipBi(cu+o);if((inside&&tt<0.5)||(!inside&&tt>=0.5))dir=o;o=vec2(-duv.x,0.0
  • Network accessline 1154
    if (!existsSync(src)) {     console.error('Missing ' + src);     console.error('Download https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl-dev.js first.');
  • Network accessline 1155
    console.error('Missing ' + src);     console.error('Download https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl-dev.js first.');     process.exit(1);
  • Network accessline 1156
    console.error('Download https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl-dev.js first.');

mapstage/tuner/scripts/patch-maritime-islands.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 149
    'Extracted from the Natural Earth China POV china MultiPolygon (public domain). Dongsha / Zhongsha / Zengmu Ansha are schematic markers. Narrative isolate silhouette.',     source: 'Natural Earth 10m via china isolate MultiPolygon parts',  
  • Network accessline 150
    source: 'Natural Earth 10m via china isolate MultiPolygon parts',     sourceUrl: 'https://www.naturalearthdata.com/',     simplifyEpsilonDeg: 0.008,
  • Network accessline 151
    sourceUrl: 'https://www.naturalearthdata.com/',
  • Network accessline 184
    'Union of SCS / Diaoyu island parts extracted from the Natural Earth china MultiPolygon. Narrative isolate silhouette.',   source: 'Natural Earth 10m via china isolate MultiPolygon parts',   sourceUrl: 'https://www.naturalearthdata.com/',
  • Network accessline 185
    source: 'Natural Earth 10m via china isolate MultiPolygon parts',   sourceUrl: 'https://www.naturalearthdata.com/',   simplifyEpsilonDeg: 0.008,
  • Network accessline 186
    sourceUrl: 'https://www.naturalearthdata.com/',

mapstage/tuner/scripts/province-catalog.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/scripts/simplify-landcover-globe.mjs

  • Executable scriptline 1
    Executable file

mapstage/tuner/vector-layers.html

  • Network accessline 5
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />   <title>皮肤编辑 · MapStage Studio</title>   <link rel="preconnect" href="https://unpkg.com" crossorigin />
  • Network accessline 6
    <title>皮肤编辑 · MapStage Studio</title>   <link rel="preconnect" href="https://unpkg.com" crossorigin />   <link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
  • Network accessline 7
    <link rel="preconnect" href="https://unpkg.com" crossorigin />
  • Network accessline 8
    <link rel="preconnect" href="https://tiles.openfreemap.org" crossorigin />
  • Network accessline 9
    <link rel="preconnect" href="https://s3.amazonaws.com" crossorigin />
  • Network accessline 10
    <link rel="preconnect" href="https://elevation-tiles-prod.s3.amazonaws.com" crossorigin />
  • Network accessline 11
    <link rel="preconnect" href="https://tiles.mapterhorn.com" crossorigin />
  • Network accessline 12
    <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.6.0/dist/maplibre-gl.css" />
  • Network accessline 13
    <link rel="preconnect" href="https://fonts.googleapis.com" />
  • Network accessline 14
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  • Network accessline 15
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@500;600&family=Roboto+Mono:wght@400;500&display=swap" rel="stylesheet" />
  • Network accessline 210
    <div class="kicker">VECTOR LAYERS · <b id="chrome-proj">GLOBE</b></div>     <div class="nav-right">       <a class="gh" href="https://github.com/hopechen067/MapStage" target="_blank" rel="noopener">GitHub</a>
  • Network accessline 211
    <div class="nav-right">       <a class="gh" href="https://github.com/hopechen067/MapStage" target="_blank" rel="noopener">GitHub</a>     </div>
  • Network accessline 212
    <a class="gh" href="https://github.com/hopechen067/MapStage" target="_blank" rel="noopener">GitHub</a>

mapstage/tuner/vendor/maplibre-contour.min.js

  • Possible obfuscationline 1
    !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).mlcontour=e()}(this,(function(){"use strict";var t,
  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 15
    ***************************************************************************** */function o(t,e){var i={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(i[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPrope

mapstage/tuner/vendor/maplibre-gl.js

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    /**  * MapLibre GL JS  * @license 3-Clause BSD. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v5.6.0/LICENSE.txt
  • Network accessline 4
    * MapLibre GL JS  * @license 3-Clause BSD. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v5.6.0/LICENSE.txt  */
  • Network accessline 5
    * @license 3-Clause BSD. Full text of license: https://github.com/maplibre/maplibre-gl-js/blob/v5.6.0/LICENSE.txt
  • Network accessline 5283
    // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
  • Network accessline 6049
    // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.   // http://projecteuclid.org/euclid.aoms/1177692644;
  • Network accessline 6050
    // http://projecteuclid.org/euclid.aoms/1177692644;
  • Network accessline 6593
    // benchmarks:   //    http://jsperf.com/quaternion-slerp-implementations
  • Network accessline 6594
    //    http://jsperf.com/quaternion-slerp-implementations
  • Network accessline 6644
    // Implementation of http://planning.cs.uiuc.edu/node198.html
  • Network accessline 8709
    // https://mathworld.wolfram.com/Plane-PlaneIntersection.html
  • Network accessline 8751
    // Uses a more precise solution from the book Ray Tracing Gems, chapter 7.     // https://www.realtimerendering.com/raytracinggems/rtg/index.html
  • Network accessline 8752
    // https://www.realtimerendering.com/raytracinggems/rtg/index.html
  • Network accessline 9118
    // https://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/
  • Network accessline 9184
    // Taken from [Wreck](https://github.com/hapijs/wreck)
  • Network accessline 9204
    * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to  * transfer data between WebWorkers and the main thread.  * https://github.com/mapbox/mapbox-gl-js/issues/8771
  • Network accessline 9205
    * transfer data between WebWorkers and the main thread.  * https://github.com/mapbox/mapbox-gl-js/issues/8771  *
  • Network accessline 9206
    * https://github.com/mapbox/mapbox-gl-js/issues/8771
  • Network accessline 9233
    // The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem
  • Possible obfuscationline 9242
    return decodeURIComponent(atob(str).split('').map((c) => {
  • Network accessline 9288
    // prevent image dataURI memory leak in Safari;             // but don't free the image immediately because it might be uploaded in the next frame             // https://github.com/mapbox/mapbox-gl-js/issues/10226
  • Network accessline 9290
    // https://github.com/mapbox/mapbox-gl-js/issues/10226
  • Network accessline 9597
    * // This will fetch a file using the fetch API (this is obviously a non interesting example...)  * addProtocol('custom', async (params, abortController) => {  *      const t = await fetch(`https://${params.url.split("://")[1]}`);
  • Network accessline 9598
    * addProtocol('custom', async (params, abortController) => {  *      const t = await fetch(`https://${params.url.split("://")[1]}`);  *      if (t.status == 200) {
  • Network accessline 9599
    *      const t = await fetch(`https://${params.url.split("://")[1]}`);
  • Network accessline 9683
    let response;         try {             response = yield fetch(request);
  • Network accessline 9684
    try {             response = yield fetch(request);         }
  • Network accessline 9685
    response = yield fetch(request);
  • Network accessline 9916
    // Compatibility with (type: string, properties: Object) signature from previous versions.         // See https://github.com/mapbox/mapbox-gl-js/issues/6522,
  • Network accessline 9917
    // See https://github.com/mapbox/mapbox-gl-js/issues/6522,
  • Network accessline 9918
    //     https://github.com/mapbox/mapbox-gl-draw/issues/766

mapstage/tuner/verify.mjs

  • Executable scriptline 1
    Executable file

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 29 facts
Signal confidence: 454 facts

and 404 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativePath CLAUDE.md.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md mapstage/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md mapstage/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md mapstage/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md mapstage/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.