gis-view-webgl2 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +13 -1
  2. package/dist/gis-view.css +1 -1
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.ts +255 -3
  5. package/dist/index.js +1 -1
  6. package/docs/AI/345/257/271/350/257/235/346/261/207/346/200/273.md +65 -0
  7. package/docs/GisView.md +1 -1
  8. package/docs/ai/06-/344/274/232/350/257/235/347/264/242/345/274/225/344/270/216/345/244/215/346/237/245/346/226/271/346/263/225.md +58 -0
  9. package/docs/demos/ChannelDemo.vue +566 -6
  10. package/docs/demos/CopyMergeDemo.vue +57 -6
  11. package/docs/demos/LabelDemo.vue +67 -11
  12. package/docs/demos/api-index.js +13 -3
  13. package/docs/format/03-/346/213/220/347/202/271/350/243/205/351/245/260/344/270/216/346/240/267/345/274/217.md +4 -2
  14. package/docs/format/04-/351/200/232/351/201/223/344/270/216/346/240/207/347/255/276.md +5 -4
  15. package/docs/manual/02-/345/235/220/346/240/207/344/270/216/346/225/260/346/215/256.md +7 -2
  16. package/docs/manual/03-/351/205/215/347/275/256/351/241/271.md +21 -5
  17. package/docs/manual/06-/346/225/260/346/215/256/344/270/216/345/234/272/346/231/257/346/233/264/346/226/260.md +100 -0
  18. package/docs/manual/07-/346/214/207/351/222/210/344/270/216/350/246/201/347/264/240/347/274/226/350/276/221.md +38 -0
  19. package/docs/manual/08-/351/200/211/344/270/255/344/270/216/346/213/220/347/202/271.md +5 -5
  20. package/docs/manual/09-/351/200/232/351/201/223/344/270/216/345/244/232/345/233/236/347/272/277.md +58 -8
  21. package/docs/manual/10-/351/200/232/351/201/223/347/274/226/350/276/221/344/270/216/346/226/260/345/242/236.md +27 -2
  22. package/docs/manual/12-/346/240/207/347/255/276/344/270/216/350/243/205/351/245/260.md +45 -1
  23. package/docs/manual/16-/345/256/236/344/276/213/346/226/271/346/263/225/346/200/273/350/241/250.md +7 -1
  24. package/docs/manual/17-/345/217/202/346/225/260/351/200/237/346/237/245.md +8 -0
  25. package/docs/manual/18-/351/200/220/346/226/271/346/263/225/347/244/272/344/276/213.md +28 -0
  26. package/docs/manual/20-/346/200/247/350/203/275/344/270/216/345/244/247/346/225/260/346/215/256.md +3 -0
  27. package/docs/manual/21-/350/257/264/346/230/216/344/270/216/345/270/270/350/247/201/351/227/256/351/242/230.md +1 -1
  28. package/docs/steps/README.md +8 -6
  29. package/docs/steps/selftest-demos.html +194 -29
  30. package/docs/steps/selftest-docs.html +7 -6
  31. package/docs/steps/selftest-features.html +213 -1
  32. package/docs/steps/selftest-labels.html +249 -4
  33. package/docs//346/216/245/345/217/243/345/215/217/350/256/256.md +17 -11
  34. package/package.json +2 -2
package/README.md CHANGED
@@ -27,7 +27,7 @@ npm run dev
27
27
 
28
28
  源码本身就是 JS:`src/gis-view/*.js` 逐文件带中文注释,对外类型集中在 `src/gis-view/types.d.ts`(构建时复制成 `dist/index.d.ts`),不用先编译就能直接读。想照着从零写一遍看 [从 0 到完整的实现](docs/从0到完整的实现.md),里面有一份可以照抄的 mini 实现与验收清单。
29
29
 
30
- 想知道组件到底有哪些属性和方法:[GisView 文档](docs/GisView.md) 的「实例方法」一节把 241 个实例成员(方法 + `el` / `canvas` / `gl` 这类属性)与 90 个 `options` 键逐个列全;demo 的「视图 · 交互」页签里有同一份清单(`?demo=full`,可搜索、点一条就对当前视图求值);`node docs/steps/check-doc-coverage.mjs` 负责 10 项双向对账,改完源码或文档先跑 `node docs/steps/gen-api-index.mjs` 重生成 demo 读的那一份(三类查询的口径见 [docs/steps/README.md](docs/steps/README.md) 的「怎么查全部属性与方法」)。
30
+ 想知道组件到底有哪些属性和方法:[GisView 文档](docs/GisView.md) 的「实例方法」一节把 249 个实例成员(方法 + `el` / `canvas` / `gl` 这类属性)与 92 个 `options` 键逐个列全;demo 的「视图 · 交互」页签里有同一份清单(`?demo=full`,可搜索、点一条就对当前视图求值);`node docs/steps/check-doc-coverage.mjs` 负责 10 项双向对账,改完源码或文档先跑 `node docs/steps/gen-api-index.mjs` 重生成 demo 读的那一份(三类查询的口径见 [docs/steps/README.md](docs/steps/README.md) 的「怎么查全部属性与方法」)。
31
31
 
32
32
  ## 构建 npm 包
33
33
 
@@ -215,6 +215,8 @@ const rows = view.exportData({ parts: ['station'], labels: true }).points
215
215
  view.setFilter(null)
216
216
  ```
217
217
 
218
+ 关于 `html: false`:它只关闭字符串 `content` 的 HTML 解析,标签容器仍然是逐条的 `.gis-view__label`(默认 `div`),所以单靠它不会减少 DOM —— 几万条纯文本标签仍会建几万个节点。顶层 `labelRender` 控制这个容器,缺省 `'auto'`:在强制显示档(`labelOptimize` 未开、`denseMode` 未激活)下,节点层或线路层里能画布的纯文本标签达到 1024 条时,该层自动改画到一张 Canvas,不再逐条建 `div`;`html: true`、函数返回元素、可拖拽 / 可编辑及 Canvas 画不全的样式仍留在 DOM。要求保持旧行为可写 `labelRender: 'dom'`,运行时用 `updateOptions({ labelRender })` 切换。
219
+
218
220
  搜索与相机定位(搜索只找不藏,筛选才负责隐藏):
219
221
 
220
222
  ```js
@@ -375,3 +377,13 @@ view.zoomTo(12).zoomToBounds({ minX: 116, minY: 39, maxX: 117, maxY: 40 }, 60)
375
377
  - 这一轮(「修改.txt」两条:装饰吸附分级 / 继续简化优化):① 动态装饰器的节点吸附改成两级:先选「跟随 / 固定」,固定档再选「固定位置 / 鼠标位置」;API 仍对应 `placement: offset / fixed / pointer`,鼠标位置档不传 `at`。② 合并 13 个重复的单项 / 清空快捷入口:`setEffects` / `setPointSize` / `setPointSymbol` / `setPointColor` / `setLineWidth` / `setLineColor` / `setChannelWidth` / `setChannelNodeWidth` / `setChannelInset` / `setChannelTangentInset` / `setChannelName` / `clearFilter` / `clearDropPreview` 从实例删除,分别统一到 `updateOptions({ effects })` / `updatePoint` / `updateLine` / `updateChannel` / `setFilter(null)` / `setDropPreview(null)`。③ `getChannel()` 改走引擎窄查询 `getChannel(channelId, index)`,不再复制全部通道再查找。实例成员 254 → **241**(方法 251 → **238**,属性仍为 3),数据字段 / options / 功能开关 / 分组保持 **238 / 90 / 18 / 16**。验证:14 个自测页 **2022** 条 0 FAIL(`selftest-features` 582、`selftest-demos` 283、`selftest-docs` 130);`npx tsc --noEmit`、`npm run check:docs`、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。
376
378
 
377
379
  - 这一轮(「修改.txt」两条:装饰 Demo 的吸附方式与位置解耦 / 继续简化优化):① 节点草稿的 `placement` 收窄为**位置来源**(`offset` 相对节点 / `fixed` 固定坐标 / `pointer` 鼠标位置),新增 `anchor` 表示**落地关系**(`follow` 跟随节点 / `fixed` 钉在世界坐标);两者自由组合,所以「跟随 / 固定」与三种位置来源的笛卡尔积都可用,缺省仍是 `offset → follow`、`fixed / pointer → fixed`。`DecorationDraftDemo.vue` 的「吸附方式」只留跟随 / 固定,「位置来源」三档始终显示,日志与确认文案同时显示当前组合。② 删除 `GisViewPointDecoration.placement` 这个与 `anchor` 重叠的旧别名,节点数据只保留 `anchor: 'offset' | 'fixed'`;草稿候选对象去掉未使用的 `placement` / `at` 临时字段,只留 `anchor` / `offset` / `world` / `screen`。实例成员 / 数据字段 / options / 功能开关 / 分组计数保持 **241 / 238 / 90 / 18 / 16**。验证:14 个自测页 **2031** 条 0 FAIL(`selftest-decoration` 75、`selftest-demos` 286,新增 9 条正交组合断言);`npx tsc --noEmit`、`npm run check:docs`、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。
380
+
381
+ - 这一轮(「修改.txt」三条:标签 HTML 为什么总按 HTML 渲染 / 继续排查隐藏性能问题与 bug / 可以破坏原有语义换性能):① HTML 开关并不是永远为真:默认 `false`,全局 `label.html` / `lineLabel.html`、数据 `labels[].html` 的逐条覆盖与 `updateLabel` 双向切换都生效;观察到「回灌后总变 HTML」的直接原因是导出只写 `html: true`,全局开、某条显式 `false` 被导出再导入后丢掉了覆盖 —— 现在显式 `true / false` 都保留,`labelClick` / `labelDrag` 载荷也带 `html`,HTML 内容回报 `innerHTML`,编辑面板不会再把 `<b>` / `<span>` 洗成纯文本。② 模板 `{field}` 在 HTML 模式按纯文本转义,`field` 与默认名称也转义,只有 `content` 模板和函数返回内容由使用方掌控;`getLabels()` 改为优先回报运行时拖出来的偏移,不再被默认 `[0, 0]` 洗掉。③ 渲染缓存拆成 class / 样式 / 内容 / 尺寸四份签名:只改样式不重写 `innerHTML`,只换位置不重写内容与样式,尺寸缓存去掉 index / labelId / 锚点,同内容标签在同批量测中直接复用;120 条同内容 HTML 标签首轮布局读取 **127 → 7** 次,只改样式 **121 次布局读 + 120 次 `innerHTML` → 3 次 + 0 次**,改内容仍逐条写 `innerHTML`,这是内容真的全变时的必要成本。
382
+
383
+ - 这一轮(「问题.txt」四条:要素显隐 / 节点拆分 / 标签逐条交互 / 通道变化对账):① 新增 `setFeatureVisible(kind, refs, visible)` / `hideFeatures` / `showFeatures`,统一处理 `point` / `line` / `channel` 的 `visible`;`refs` 收单个 / 批量 / 下标 / `{ id }` / `{ index }` / `'selection'`,整次调用只记一条历史、只发一条 `batch`。通道收起后成员、分组、骨架与编辑状态都保留;节点收起时绑定线路退回自身 `path` / `start` / `end`,以它为端点的通道整条退场,恢复后重新接上。② 新增 `splitPoint(source, parts, options?)`:至少两份,第一份沿用原下标与 id、其余追加;`lines` 分配线路,未分配的跟第一份;通道端点默认跟第一条被分配过的成员回线,也可用 `channels` / `channelFrom` / `channelTo` 显式指定;拆完删除自环 / 零长度线路、两端相同的通道与成员全空的通道,整次一步历史、一条 `splitPoint` 数据变更,`changes` 可直接给后端事务。③ 逐条标签新增 `draggable` / `editable`,并补上 `avoidOverlap` 类型声明;每条标签都能单独覆盖全局交互与避让开关。④ 新增 `getChangedChannels()` / `clearChangedChannels(refs?)`,按分组 / 成员 / 拐点 / 端点 / 可见性 / 其它字段报最近变化:新通道只补基准、删除通道清账、整份换声明重设基准,读取本身不重置。三个 demo 同步:`ChannelDemo` 演节点 / 线路 / 通道显隐与通道对账,`CopyMergeDemo` 演节点拆分,`LabelDemo` 演逐条标签交互。实例成员 / 方法 / 数据字段 / options 更新为 **247 / 244 / 242 / 91**。验证:4 个相关自测页 **1178** 条 0 失败(features 595、demos 292、labels 161、docs 130);`npx tsc --noEmit`、`npm run build`、`npm run check:docs`、`node docs/steps/gen-api-index.mjs --check`、`node --check` 与 `git diff --check` 全部通过。
384
+
385
+ - 这一轮(「修改.txt」三条:通道筛选 / 线路对账 / 继续优化):① `getChangedChannels(options?)` 加 `reasons` 白名单与 `ignoreGroups`。`reasons: ['waypoints']` 只返回拐点变化并同步收窄 `*Changed` / `fields`,空数组直接返回空表、不扫数据;`ignoreGroups: true` 忽略分组新增 / 删除 / 重排,只比较基准与当前都存在的分组 `path`,已有分组真改拐点仍报 `waypoints`。缺省 `path` 与空数组统一成「没有拐点」,分组声明刚落数据不会误报。② 新增 `getChangedLines(options?)` / `clearChangedLines(refs?)`,给只有节点和线路、没有通道的场景独立对账:原因分 `path`(`path` / `start` / `end`)、`endpoints`(`from` / `to`)、`visibility`、`fields`;新线路只补账、删除线路同步清账,通道骨架变化不重复算进线路账本。③ 通道 / 线路删除都会清账:`removeChannel`、`removeLines` 与线路删除带走的通道 / 回线不会再出现在下一次查询里。实例成员 / 方法更新为 **249 / 246**,数据字段 / options 保持 **242 / 91**。验证:4 个相关自测页 **1186** 条 0 失败(features 603、demos 292、labels 161、docs 130);`node --check`、`npx tsc --noEmit`、`npm run check:docs`、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。
386
+
387
+ - 这一轮(「修改.txt」:channelDemo 分组弹框参考图片改为整组编辑):`docs/demos/ChannelDemo.vue` 新增居中的「线路分组」弹框,按分组卡片列出回线与「分组 N / N 条线路」,入口在通道分组面板和右键交互框;每行可连续选择目标组并「确认移入」,行内操作只改本地草稿,取消 / Esc / 点遮罩都不写组件数据;底部「确定分组」才调用一次 `splitChannelGroups(channelId, groups)`,整份 groups 一次落地,避免逐条请求与多步历史。右键框原有的逐条分配 / `moveChannelLine` 保留。`selftest-demos.html` 补 4 条断言(弹框分组与副标题、行内移入只改草稿、取消不写数据、确定只调用一次整组方法),292 → **296** 条;四页共 **1190** 条 0 失败,`npx tsc --noEmit`、`npm run check:docs`、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全通过;实例成员 / 方法 / 数据字段 / options 保持 **249 / 246 / 242 / 91**。
388
+
389
+ - 这一轮(「修改.txt」两条:Ctrl 加点高亮范围 / 分组拐点拖动类型):① `channelSelectMode` 现在同时管普通点选和 Ctrl / ⌘ + 点击线路加点后的选中集,`line` 只高亮被加点回线、`group` 连所在分组、`channel` 连整条通道;切换仍只重画、不重排。② 新增 `channelWaypointDragMode`(缺省 `parallel`,可选 `vertex`):`vertex` 拖动只把当前分组同一 `pathIndex` 的拐点按相同世界增量平移,相邻顶点与其它分组不动,结果写进 `groups[].waypointOffsets`(键按含首尾端点的骨架序号,值支持 `[dx, dy]` / `{ x, y }`)。`getChannelGroups()` / `getChannelGroupWaypoints()` / `getChannels()` 带偏移,`getParallelGroups()` 与 `exportData` 的 `group_route` 已叠成实际路由;增删拐点时偏移序号同步平移,切回 `parallel` 不会清空已有偏移。③ `ChannelDemo` 加模式下拉与「准备两分组拐点」,拐点后端请求同时带 `path` 和 `waypointOffsets`。自测 `selftest-features` 603 → **611**、`selftest-demos` 296 → **297**,四页共 **1199** 条 0 失败;`node --check`、`npx tsc --noEmit`、`npm run check:docs`(249 个成员 / 246 个方法 / 245 个数据字段 / 92 个 options)、`node docs/steps/gen-api-index.mjs --check`、`npm run build` 与 `git diff --check` 全部通过。
package/dist/gis-view.css CHANGED
@@ -1 +1 @@
1
- .gis-view{box-sizing:border-box;--gis-view-cursor-grab:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23ffffff' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%2325313f'/></svg>") 12 12, grab;--gis-view-cursor-grabbing:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23ffffff' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%232f6fd0'/></svg>") 12 12, grabbing;--gis-view-cursor-move:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23ffffff' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23c2761b'/></svg>") 12 12, move;--gis-view-cursor-box:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 3.5V9M12 15v5.5M3.5 12H9M15 12h5.5' fill='none' stroke='%23ffffff' stroke-width='4.6' stroke-linecap='round'/><circle cx='12' cy='12' r='2.8' fill='%23ffffff'/><path d='M12 3.5V9M12 15v5.5M3.5 12H9M15 12h5.5' fill='none' stroke='%2325313f' stroke-width='1.8' stroke-linecap='round'/><circle cx='12' cy='12' r='1.4' fill='%2325313f'/></svg>") 12 12, crosshair;--gis-view-cursor-copy:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><g fill='none' stroke-linejoin='round'><rect x='4' y='4' width='11' height='11' rx='2' stroke='%23ffffff' stroke-width='5.4'/><rect x='9' y='9' width='11' height='11' rx='2' stroke='%23ffffff' stroke-width='5.4'/><rect x='4' y='4' width='11' height='11' rx='2' stroke='%2325313f' stroke-width='2'/><rect x='9' y='9' width='11' height='11' rx='2' stroke='%2325313f' stroke-width='2'/></g></svg>") 12 12, copy;--gis-view-cursor-point:pointer;--gis-view-cursor-line:pointer;--gis-view-cursor-channel:pointer;--gis-view-cursor-waypoint:pointer;outline:none;width:100%;height:100%;position:relative;overflow:hidden}.gis-view__canvas{touch-action:none;width:100%;height:100%;display:block}.gis-view__graphics{pointer-events:none;z-index:1;isolation:isolate;position:absolute;inset:0;overflow:hidden}.gis-view__graphic{pointer-events:none;will-change:transform, left, top, width, height;position:absolute;top:0;left:0}.gis-view__graphic-image{pointer-events:none;-webkit-user-select:none;user-select:none}.gis-view__labels{pointer-events:none;z-index:2;contain:layout style paint;isolation:isolate;transform-origin:0 0;will-change:transform;position:absolute;inset:0;overflow:hidden}.gis-view__label-layer{position:absolute;inset:0}.gis-view__label-layer--hidden{visibility:hidden}.gis-view__label{white-space:nowrap;color:#1f3550;background:#ffffffe0;border-radius:4px;padding:1px 6px;font-size:12px;line-height:16px;position:absolute;top:0;left:0}.gis-view__label--draggable,.gis-view__label--editable{pointer-events:auto;touch-action:none}.gis-view__label--draggable{cursor:grab}.gis-view__label--editable{cursor:pointer}.gis-view__label--dragging{cursor:grabbing;z-index:2;-webkit-user-select:none;user-select:none}.gis-view__background-label{white-space:nowrap;pointer-events:none;text-shadow:0 1px 2px #ffffffe6,0 0 2px #fffc;position:absolute;top:0;left:0}.gis-view__tooltip{color:#f3f7fc;white-space:pre-line;pointer-events:none;will-change:transform;background:#172436eb;border-radius:6px;max-width:280px;padding:6px 10px;font-size:12px;line-height:18px;position:absolute;top:0;left:0}.gis-view__tooltip[hidden]{display:none}.gis-view__minimap{z-index:2;box-sizing:border-box;contain:layout paint;isolation:isolate;touch-action:none;cursor:default;position:absolute;overflow:hidden}.gis-view__minimap[hidden]{display:none}.gis-view__minimap-canvas{width:100%;height:100%;display:block}.gis-view__minimap-box{box-sizing:border-box;pointer-events:none;will-change:transform;position:absolute;top:0;left:0}.gis-view__minimap-select{box-sizing:border-box;pointer-events:none;will-change:transform;background:#3678bf1f;border:1px dashed #3678bf;display:none;position:absolute;top:0;left:0}
1
+ .gis-view{box-sizing:border-box;--gis-view-cursor-grab:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23ffffff' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%2325313f'/></svg>") 12 12, grab;--gis-view-cursor-grabbing:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23ffffff' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%232f6fd0'/></svg>") 12 12, grabbing;--gis-view-cursor-move:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23ffffff' stroke='%23ffffff' stroke-width='3' stroke-linejoin='round'/><path d='M12 2 16 6 13 6 13 11 18 11 18 8 22 12 18 16 18 13 13 13 13 18 16 18 12 22 8 18 11 18 11 13 6 13 6 16 2 12 6 8 6 11 11 11 11 6 8 6Z' fill='%23c2761b'/></svg>") 12 12, move;--gis-view-cursor-box:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><path d='M12 3.5V9M12 15v5.5M3.5 12H9M15 12h5.5' fill='none' stroke='%23ffffff' stroke-width='4.6' stroke-linecap='round'/><circle cx='12' cy='12' r='2.8' fill='%23ffffff'/><path d='M12 3.5V9M12 15v5.5M3.5 12H9M15 12h5.5' fill='none' stroke='%2325313f' stroke-width='1.8' stroke-linecap='round'/><circle cx='12' cy='12' r='1.4' fill='%2325313f'/></svg>") 12 12, crosshair;--gis-view-cursor-copy:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><g fill='none' stroke-linejoin='round'><rect x='4' y='4' width='11' height='11' rx='2' stroke='%23ffffff' stroke-width='5.4'/><rect x='9' y='9' width='11' height='11' rx='2' stroke='%23ffffff' stroke-width='5.4'/><rect x='4' y='4' width='11' height='11' rx='2' stroke='%2325313f' stroke-width='2'/><rect x='9' y='9' width='11' height='11' rx='2' stroke='%2325313f' stroke-width='2'/></g></svg>") 12 12, copy;--gis-view-cursor-point:pointer;--gis-view-cursor-line:pointer;--gis-view-cursor-channel:pointer;--gis-view-cursor-waypoint:pointer;outline:none;width:100%;height:100%;position:relative;overflow:hidden}.gis-view__canvas{touch-action:none;width:100%;height:100%;display:block}.gis-view__graphics{pointer-events:none;z-index:1;isolation:isolate;position:absolute;inset:0;overflow:hidden}.gis-view__graphic{pointer-events:none;will-change:transform, left, top, width, height;position:absolute;top:0;left:0}.gis-view__graphic-image{pointer-events:none;-webkit-user-select:none;user-select:none}.gis-view__labels{pointer-events:none;z-index:2;contain:layout style paint;isolation:isolate;transform-origin:0 0;will-change:transform;position:absolute;inset:0;overflow:hidden}.gis-view__label-layer{position:absolute;inset:0}.gis-view__label-layer--hidden{visibility:hidden}.gis-view__label-canvas{pointer-events:none;position:absolute;top:0;left:0}.gis-view__label{white-space:nowrap;color:#1f3550;background:#ffffffe0;border-radius:4px;padding:1px 6px;font-size:12px;line-height:16px;position:absolute;top:0;left:0}.gis-view__label--draggable,.gis-view__label--editable{pointer-events:auto;touch-action:none}.gis-view__label--draggable{cursor:grab}.gis-view__label--editable{cursor:pointer}.gis-view__label--dragging{cursor:grabbing;z-index:2;-webkit-user-select:none;user-select:none}.gis-view__background-label{white-space:nowrap;pointer-events:none;text-shadow:0 1px 2px #ffffffe6,0 0 2px #fffc;position:absolute;top:0;left:0}.gis-view__tooltip{color:#f3f7fc;white-space:pre-line;pointer-events:none;will-change:transform;background:#172436eb;border-radius:6px;max-width:280px;padding:6px 10px;font-size:12px;line-height:18px;position:absolute;top:0;left:0}.gis-view__tooltip[hidden]{display:none}.gis-view__minimap{z-index:2;box-sizing:border-box;contain:layout paint;isolation:isolate;touch-action:none;cursor:default;position:absolute;overflow:hidden}.gis-view__minimap[hidden]{display:none}.gis-view__minimap-canvas{width:100%;height:100%;display:block}.gis-view__minimap-box{box-sizing:border-box;pointer-events:none;will-change:transform;position:absolute;top:0;left:0}.gis-view__minimap-select{box-sizing:border-box;pointer-events:none;will-change:transform;background:#3678bf1f;border:1px dashed #3678bf;display:none;position:absolute;top:0;left:0}