{"_id":"@bimangle/cesium-scene-tree","_rev":"5-ad659bdb7ae586882493739cd0aedd68","name":"@bimangle/cesium-scene-tree","dist-tags":{"latest":"2.1.6"},"versions":{"1.0.0":{"name":"@bimangle/cesium-scene-tree","version":"1.0.0","keywords":["cesium","3dtiles","scene-tree","bim","gis"],"author":{"name":"BimAngle"},"license":"MIT","_id":"@bimangle/cesium-scene-tree@1.0.0","maintainers":[{"name":"bimangle.liu","email":"liuyongsheng@msn.com"}],"dist":{"shasum":"e58cade82dfbcc3f015a44480815294f9f666350","tarball":"https://registry.npmjs.org/@bimangle/cesium-scene-tree/-/cesium-scene-tree-1.0.0.tgz","fileCount":6,"integrity":"sha512-qfDzZRsZMknK+EPA3siK82Am2x9ySikqYl7jkrsw4jqG6NfcWSCCW0tijXK+gxRzB3o8GayLte9oxnbWROTxWQ==","signatures":[{"sig":"MEUCIH4Llv8ZY19n/8xG+6/eA17BLUr223K5E+20CLlwfVOMAiEAs0eRKORNmwh9lf0Di6zms/gGy2ZZuQFdlrQmmwyB4ME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159289},"main":"dist/cesium-scene-tree.js","module":"src/cesium-scene-tree.js","scripts":{"build":"rollup -c","prepare":"npm run build"},"_npmUser":{"name":"bimangle.liu","email":"liuyongsheng@msn.com"},"_npmVersion":"11.6.1","description":"A Cesium plugin providing a scene tree panel for BimAngle-exported 3D Tiles datasets.","directories":{},"_nodeVersion":"24.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^2.79.2","@rollup/plugin-commonjs":"^22.0.2","@rollup/plugin-node-resolve":"^13.3.0"},"peerDependencies":{"cesium":"^1.110.0"},"_npmOperationalInternal":{"tmp":"tmp/cesium-scene-tree_1.0.0_1783508821485_0.8972251933126645","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bimangle/cesium-scene-tree","version":"2.0.0","keywords":["cesium","3dtiles","scene-tree","bim","gis"],"author":{"name":"BimAngle"},"license":"MIT","_id":"@bimangle/cesium-scene-tree@2.0.0","maintainers":[{"name":"bimangle.liu","email":"liuyongsheng@msn.com"}],"dist":{"shasum":"610b86a8802a7eb1313affef3353061f407efd6d","tarball":"https://registry.npmjs.org/@bimangle/cesium-scene-tree/-/cesium-scene-tree-2.0.0.tgz","fileCount":8,"integrity":"sha512-YNotjCgHTIUe2Ic3/fPSmCkBNi4KaFBavYPCOMFqgH27hPpsW5yKV0Km7C7F2Evz1dOXKiv5U2VdFfguPYMM3w==","signatures":[{"sig":"MEQCIG47HuG9aFrUfXkj7+kZBeJcrg+HibPvTCT8l05gXxerAiB4xvOuVkJqnZr+3YFR+FN4JuSAYL0sZcSe4Tquhi6Bfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213879},"main":"dist/cesium-scene-tree.js","module":"src/cesium-scene-tree.js","gitHead":"2bb8237f0961e8d7db7b11b6c8912c9d8fb4a521","scripts":{"build":"rollup -c","prepare":"npm run build"},"_npmUser":{"name":"bimangle.liu","email":"liuyongsheng@msn.com"},"_npmVersion":"11.6.1","description":"A Cesium plugin providing a scene tree panel for BimAngle-exported 3D Tiles datasets.","directories":{},"_nodeVersion":"24.11.0","dependencies":{"@bimangle/cesium-ui":"file:../cesium-ui"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^2.79.2","@rollup/plugin-commonjs":"^22.0.2","@rollup/plugin-node-resolve":"^13.3.0"},"peerDependencies":{"cesium":"^1.110.0"},"_npmOperationalInternal":{"tmp":"tmp/cesium-scene-tree_2.0.0_1783759830387_0.7695220049213127","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@bimangle/cesium-scene-tree","version":"2.1.0","keywords":["cesium","3dtiles","scene-tree","bim","gis"],"author":{"name":"BimAngle"},"license":"MIT","_id":"@bimangle/cesium-scene-tree@2.1.0","maintainers":[{"name":"bimangle.liu","email":"liuyongsheng@msn.com"}],"dist":{"shasum":"a61cd376c1c21dd0b5f3b72f0d4b17b0b480c226","tarball":"https://registry.npmjs.org/@bimangle/cesium-scene-tree/-/cesium-scene-tree-2.1.0.tgz","fileCount":7,"integrity":"sha512-ZmiQFG6u5pE1+UvqXXBfsXfBLSj+4VLIDdUP+X6YvweV5wcvJLDjaJGJFvJhDLjgHHe0aoEXTNnbGXm2yGVypw==","signatures":[{"sig":"MEQCIG8w/Qe+Jx9Pp0T4LfI+9sm7lWLtfuP0/e2KxLfw+pjzAiBOnij53NvQV9OzK2zlTV1DmIRG5Cz3rXcyoYCXNwI+SQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188744},"main":"dist/cesium-scene-tree.js","module":"src/cesium-scene-tree.js","gitHead":"c2b7a8ed8a4eab549ae27ab53ec1f4bbb9e11bd3","scripts":{"build":"rollup -c","prepare":"npm run build"},"_npmUser":{"name":"bimangle.liu","email":"liuyongsheng@msn.com"},"_npmVersion":"11.6.1","description":"A Cesium plugin providing a scene tree panel and tileset configuration for 3D Tiles datasets.","directories":{},"_nodeVersion":"24.11.0","dependencies":{"@bimangle/cesium-ui":"file:../cesium-ui"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^2.79.2","@rollup/plugin-commonjs":"^22.0.2","@rollup/plugin-node-resolve":"^13.3.0"},"peerDependencies":{"cesium":"^1.110.0"},"_npmOperationalInternal":{"tmp":"tmp/cesium-scene-tree_2.1.0_1785486472527_0.16169297060976007","host":"s3://npm-registry-packages-npm-production"}},"2.1.5":{"name":"@bimangle/cesium-scene-tree","version":"2.1.5","keywords":["cesium","3dtiles","scene-tree","bim","gis"],"author":{"name":"BimAngle"},"license":"MIT","_id":"@bimangle/cesium-scene-tree@2.1.5","maintainers":[{"name":"bimangle.liu","email":"liuyongsheng@msn.com"}],"dist":{"shasum":"7f5709d5641a5f7ef0e225237f8d4d9f2496c808","tarball":"https://registry.npmjs.org/@bimangle/cesium-scene-tree/-/cesium-scene-tree-2.1.5.tgz","fileCount":7,"integrity":"sha512-rRqIadDFHpH/eXh3fEJ6np1AWc9TJDJmN7NyjV2GHR4KgjjK0vO503swhh5hqzRGjNTSvuhjhAQ954iL+JdmkA==","signatures":[{"sig":"MEQCICMZLkWWh5YFzA6mYERpIlXFmkqAREvA7xPoJMu33LqYAiBE1ngLsuh7Te5zRMxnkCVr8/9IhIjXSKeTyB5DgEjdOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193687},"main":"dist/cesium-scene-tree.js","module":"src/cesium-scene-tree.js","gitHead":"c2b7a8ed8a4eab549ae27ab53ec1f4bbb9e11bd3","scripts":{"build":"rollup -c","prepare":"npm run build"},"_npmUser":{"name":"bimangle.liu","email":"liuyongsheng@msn.com"},"_npmVersion":"11.6.1","description":"A Cesium plugin providing a scene tree panel and tileset configuration for 3D Tiles datasets.","directories":{},"_nodeVersion":"24.11.0","dependencies":{"@bimangle/cesium-ui":"file:../cesium-ui"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^2.79.2","@rollup/plugin-commonjs":"^22.0.2","@rollup/plugin-node-resolve":"^13.3.0"},"peerDependencies":{"cesium":"^1.110.0"},"_npmOperationalInternal":{"tmp":"tmp/cesium-scene-tree_2.1.5_1786677299141_0.7280028165219687","host":"s3://npm-registry-packages-npm-production"}},"2.1.6":{"name":"@bimangle/cesium-scene-tree","version":"2.1.6","description":"A Cesium plugin providing a scene tree panel and tileset configuration for 3D Tiles datasets.","main":"dist/cesium-scene-tree.js","module":"src/cesium-scene-tree.js","scripts":{"build":"rollup -c","prepare":"npm run build"},"keywords":["cesium","3dtiles","scene-tree","bim","gis"],"author":{"name":"BimAngle"},"license":"MIT","publishConfig":{"access":"public"},"peerDependencies":{"cesium":"^1.110.0"},"dependencies":{"@bimangle/cesium-ui":"file:../cesium-ui"},"devDependencies":{"@rollup/plugin-commonjs":"^22.0.2","@rollup/plugin-node-resolve":"^13.3.0","rollup":"^2.79.2"},"gitHead":"de69b73cf94e2c4c025f9e0b04c820d1ae51844b","_id":"@bimangle/cesium-scene-tree@2.1.6","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-ae85Vz0lD2pASPgDw5MJCTeyzhSNNC5LMpRTZCk4I4lExkeQzBd89jsevkz41aIWxmscN1PrJeqgFeATAf4d3A==","shasum":"51d57a432b53ed753c0812f53ceb844b6ba5b161","tarball":"https://registry.npmjs.org/@bimangle/cesium-scene-tree/-/cesium-scene-tree-2.1.6.tgz","fileCount":7,"unpackedSize":218337,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCKaePd+HrXNMmH/QjSQaW48JbWG8vORdJlijkGAHldhAIhAISRXYQLwQTldYab0ZHP1hc/YYsKx1ZCec1HPm26M3Ai"}]},"_npmUser":{"name":"bimangle.liu","email":"liuyongsheng@msn.com"},"directories":{},"maintainers":[{"name":"bimangle.liu","email":"liuyongsheng@msn.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cesium-scene-tree_2.1.6_1787019879754_0.2094137829040954"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-08T11:07:01.226Z","modified":"2026-08-18T02:24:40.091Z","1.0.0":"2026-07-08T11:07:01.738Z","2.0.0":"2026-07-11T08:50:30.530Z","2.1.0":"2026-07-31T08:27:52.668Z","2.1.5":"2026-08-14T03:14:59.296Z","2.1.6":"2026-08-18T02:24:39.894Z"},"author":{"name":"BimAngle"},"license":"MIT","keywords":["cesium","3dtiles","scene-tree","bim","gis"],"description":"A Cesium plugin providing a scene tree panel and tileset configuration for 3D Tiles datasets.","maintainers":[{"name":"bimangle.liu","email":"liuyongsheng@msn.com"}],"readme":"# cesium-scene-tree\n\nA CesiumJS plugin that provides an interactive scene tree panel for BimAngle-exported 3D Tiles datasets.\n\n基于 CesiumJS 的场景树扩展插件，用于在 Cesium Viewer 中加载和管理 **BimAngle 导出的 3D Tiles 数据集**时提供可交互的场景树面板。\n\n---\n\n## Features / 特性\n\n- 🔍 **Auto-detect** BimAngle 3D Tiles datasets via `asset.extras.engine.info`  \n  **自动识别** BimAngle 3D Tiles 数据集\n- 🌲 **Floating scene tree panel** — collapsible, draggable, resizable  \n  **悬浮场景树面板** — 可折叠、可拖拽、可调整大小\n- ⚡ **Virtual scrolling** — DOM rows capped at ~50, supports datasets with tens of thousands of nodes  \n  **虚拟滚动** — DOM 行上限约 50，支持数万节点的大型数据集\n- 🔀 **Multi-dataset switching** — dropdown selector manages multiple simultaneous tilesets  \n  **多数据集切换** — 下拉选择器管理多个同时加载的 tileset\n- 👁 **Node visibility toggle** — checkbox cascades to all descendants  \n  **节点显示/隐藏** — 勾选框级联控制子孙节点\n- 📍 **Zoom to node** — double-click flies the camera to the node's bounding sphere  \n  **缩放定位** — 双击飞行至节点包围盒（兼容 ECEF 和 ENU 坐标模式）\n- 🔗 **Bidirectional sync with `cesium-info-accessor`** — click a tree node to show properties; pick a feature in the viewport to highlight the tree node  \n  **与 `cesium-info-accessor` 双向联动** — 点击树节点显示属性；在 Cesium 画面点选构件后场景树自动高亮对应节点\n- 🌐 **Bilingual UI** — automatically uses Simplified Chinese or English based on `navigator.language`  \n  **双语界面** — 根据 `navigator.language` 自动切换简体中文或英文\n- 🚫 **Zero runtime dependencies** — only peer-depends on Cesium  \n  **零运行时依赖** — 仅依赖 Cesium\n\n---\n\n## Installation / 安装\n\n### NPM\n\n```bash\nnpm install @bimangle/cesium-scene-tree\n```\n\n### CDN\n\n```html\n<!-- Cesium must be loaded first / 必须先加载 Cesium -->\n<script src=\"https://cesium.com/downloads/cesiumjs/releases/1.120/Build/Cesium/Cesium.js\"></script>\n<link href=\"https://cesium.com/downloads/cesiumjs/releases/1.120/Build/Cesium/Widgets/widgets.css\" rel=\"stylesheet\">\n\n<!-- Then include cesium-scene-tree -->\n<script src=\"https://unpkg.com/@bimangle/cesium-scene-tree/dist/cesium-scene-tree.js\"></script>\n```\n\n---\n\n## Quick Start / 快速开始\n\n### Browser (CDN)\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <script src=\"https://cesium.com/downloads/cesiumjs/releases/1.120/Build/Cesium/Cesium.js\"></script>\n  <link href=\"https://cesium.com/downloads/cesiumjs/releases/1.120/Build/Cesium/Widgets/widgets.css\" rel=\"stylesheet\">\n  <script src=\"https://unpkg.com/@bimangle/cesium-info-accessor/dist/cesium-info-accessor.js\"></script>\n  <script src=\"https://unpkg.com/@bimangle/cesium-scene-tree/dist/cesium-scene-tree.js\"></script>\n  <style>\n    html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; }\n  </style>\n</head>\n<body>\n  <div id=\"cesiumContainer\"></div>\n  <script type=\"module\">\n    const viewer = new Cesium.Viewer('cesiumContainer');\n\n    // Step 1: Load cesium-info-accessor FIRST.\n    // SceneTreeMixin will auto-detect viewer.infoAccessor at init time\n    // and subscribe to its selectionChanged event — no extra wiring needed.\n    viewer.extend(InfoAccessorMixin, { autoAttach: true });\n\n    // Step 2: Load the scene tree plugin.\n    // onNodeSelect is optional; bidirectional sync with infoAccessor is automatic.\n    viewer.extend(CesiumSceneTree.SceneTreeMixin, {\n      onNodeSelect: (tileset, dbId, name) => {\n        console.log('Node selected:', name, 'dbId:', dbId);\n      }\n    });\n\n    // Step 3: Add a BimAngle 3D Tiles dataset — auto-detected by both plugins.\n    const tileset = await Cesium.Cesium3DTileset.fromUrl('./tileset.json');\n    viewer.scene.primitives.add(tileset);\n    viewer.zoomTo(tileset);\n  </script>\n</body>\n</html>\n```\n\n### NPM / ES Modules\n\n```javascript\nimport * as Cesium from 'cesium';\nimport { SceneTreeMixin } from '@bimangle/cesium-scene-tree';\n\nconst viewer = new Cesium.Viewer('cesiumContainer');\n\nviewer.extend(SceneTreeMixin, {\n  onNodeSelect: (tileset, dbId, name) => {\n    console.log('Selected:', name, dbId);\n  },\n  // showInfoNodes: true  // show nodes that have no geometry (property-only nodes)\n});\n```\n\n---\n\n## API Reference\n\n### `SceneTreeMixin(viewer, options?)`\n\nMixin function to be called via `viewer.extend(SceneTreeMixin, options)`.  \nAfter calling, `viewer.sceneTree` exposes the `SceneTree` instance.\n\n#### Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `onNodeSelect` | `function` | — | Callback fired when a tree node is clicked: `(tileset, dbId, name) => void` |\n| `showInfoNodes` | `boolean` | `false` | Show nodes whose `boundingBoxes[dbId]` is `null` (pure property/info nodes with no geometry) |\n\n---\n\n### `viewer.sceneTree` — `SceneTree`\n\n#### Methods\n\n##### `destroy() → void`\n\nDestroy the plugin: removes the DOM panel, unregisters all event listeners, and clears internal state.\n\n```javascript\nviewer.sceneTree.destroy();\n```\n\n---\n\n## Behavior Details\n\n### Auto-detection\n\nA tileset is recognized as a BimAngle dataset when:\n\n1. `tileset.asset.extras.engine.info === true`\n2. `info/index.json` is present under the tileset root directory\n\n### Reverse Sync (Cesium → Scene Tree)\n\nWhen a component is picked in the Cesium viewport via `cesium-info-accessor`:\n\n- **If the scene tree panel is collapsed** → the sync event is ignored entirely (no panel auto-expansion).\n- **If the picked component belongs to a different dataset** → the plugin switches datasets first and shows a status message (\"Switching dataset...\" / \"正在切换数据集...\") with a **60-second timeout**.\n- Once the target dataset is ready, the tree expands the path to the node, scrolls it into view, and highlights it.\n\n### Visibility Toggle\n\nChecking/unchecking a node's checkbox cascades the visibility change to all descendant nodes. The actual `feature.show` property on each `Cesium3DTileFeature` is updated as tiles load/unload.\n\n### Zoom to Node\n\nDouble-clicking a tree node flies the camera to the node's bounding sphere. The bounding box stored in `index.json` is automatically transformed to ECEF using `tileset.root.computedTransform`, so both ECEF and ENU export modes are handled correctly.\n\n### Bounding Box Coordinate System\n\n`db.boundingBoxes[dbId]` coordinates depend on the export mode chosen at BimAngle export time:\n\n- **ECEF mode**: coordinates are world-space ECEF (metres)\n- **ENU local mode**: coordinates are model-local; the plugin applies `tileset.root.computedTransform` automatically\n\nNo extra configuration is needed — the plugin handles both cases transparently.\n\n### Info Nodes\n\nWhen `db.boundingBoxes[dbId] === null`, the node is an **info node**:\n- It and all its descendants have no 3D geometry\n- Hidden by default; enable with `showInfoNodes: true`\n- Displayed with a distinct icon (◈) when visible\n\n---\n\n## Integration with `cesium-info-accessor`\n\n`cesium-scene-tree` is designed to work alongside [`cesium-info-accessor`](https://www.npmjs.com/package/@bimangle/cesium-info-accessor) v2.0+.  \nNo extra wiring is required — the scene tree subscribes to `infoAccessor.selectionChanged` automatically when both plugins are mounted on the same viewer.\n\n```javascript\n// Mount both plugins — order matters: info-accessor first\nviewer.extend(InfoAccessorMixin,  { autoAttach: true });\nviewer.extend(SceneTreeMixin,     { showInfoNodes: false });\n\n// Bidirectional sync works out of the box:\n// • Click tree node  → property panel opens\n// • Pick in viewport → tree node highlighted (panel must be expanded)\n```\n\n---\n\n## Dataset Requirements / 数据集要求\n\nThe loaded 3D Tiles must include a valid `info/index.json` file in BimAngle format:\n\n```\n<tileset root>/\n├── tileset.json          ← must have asset.extras.engine.info = true\n├── info/\n│   ├── index.json        ← scene tree descriptor\n│   └── 0.json, 1.json …  ← property chunk files\n├── attachments/           ← optional; required when attachments = true\n│   ├── attachments.json  ← attachment manifest\n│   └── *.html, …          ← attachment files\n└── 0/\n    └── …                 ← tile geometry\n```\n\n`attachments.json` schema:\n\n```json\n{\n  \"version\": 1,\n  \"attachments\": [\n    { \"title\": \"附件标题\", \"fileName\": \"file.html\", \"fileFormat\": \"Html_Custom\" }\n  ]\n}\n```\n\nOnly entries whose `fileFormat` starts with `Html_` are shown; other types are silently ignored.\n\n`index.json` schema (v1.4):\n\n```json\n{\n  \"version\": \"1.4\",\n  \"schema\": \"3D Tiles\",\n  \"db\": {\n    \"rootDbId\": 1,\n    \"parentIds\":    [-1, -1, 1, 1, 3],\n    \"names\":        [null, \"Project\", \"SubSet\", \"LayerA\", \"Column-1\"],\n    \"types\":        [-1, 5, 4, 2, 0],\n    \"boundingBoxes\": [null, [x1,y1,z1,x2,y2,z2], null, \"...\"]\n  }\n}\n```\n\n| `db.types` value | Meaning |\n|-----------------|---------|\n| `5` | Model (root) |\n| `4` | Composite / assembly |\n| `3` | Collection |\n| `2` | Layer |\n| `1` / `0` | Leaf component (has geometry) |\n\n---\n\n## Compatibility / 兼容性\n\n- Cesium ≥ 1.110.0\n- Chrome 90+, Firefox 88+, Edge 90+\n\n---\n\n## CSS Class Reference / CSS 命名规范\n\nAll CSS classes use the `ba-cst-` prefix (`ba` = BimAngle, `cst` = cesium-scene-tree).  \n所有 CSS 类名采用 `ba-cst-` 前缀（`ba` = BimAngle，`cst` = cesium-scene-tree）。\n\n> ⚠️ **v2.0.0 Breaking Change**: All class names were renamed from the `cst-` prefix to `ba-cst-`. If your project overrides any `cst-*` styles with external CSS, those rules must be updated.  \n> **v2.0.0 破坏性变更**：所有类名由 `cst-` 前缀统一更名为 `ba-cst-`。如有外部 CSS 引用 `cst-*` 类名，需同步更新。\n\n| Class / 类名 | Purpose / 用途 |\n|-------------|---------------|\n| `.ba-cst-panel` | Scene tree floating panel / 场景树浮动面板 |\n| `.ba-cst-panel--hidden` | Panel hidden state / 面板隐藏态 |\n| `.ba-cst-panel-header` | Panel title bar (draggable) / 面板标题栏（可拖拽） |\n| `.ba-cst-panel-title` | Title text / 标题文字 |\n| `.ba-cst-panel-close` | Panel close button / 面板关闭按钮 |\n| `.ba-cst-panel-toolbar` | Panel toolbar area (dataset selector) / 面板工具栏（数据集选择器） |\n| `.ba-cst-dataset-select` | Dataset dropdown selector / 数据集下拉选择框 |\n| `.ba-cst-panel-body` | Panel content area / 面板内容区 |\n| `.ba-cst-status-msg` | Status message (loading, empty, etc.) / 状态提示（加载中、无数据等） |\n| `.ba-cst-error-msg` | Error message / 错误提示 |\n| `.ba-cst-retry-btn` | Retry button / 重试按钮 |\n| `.ba-cst-resize-handle` | Resize drag handle (bottom-right) / 调整大小句柄（右下角） |\n| `.ba-cst-scroller` | Virtual-scroll container / 虚拟滚动容器 |\n| `.ba-cst-row-container` | Absolute-positioned row wrapper / 绝对定位行容器 |\n| `.ba-cst-row` | Single tree row / 单条树行 |\n| `.ba-cst-row--selected` | Selected row state / 选中行 |\n| `.ba-cst-row--info` | Info node row (dimmed) / Info 节点行（半透明） |\n| `.ba-cst-indent` | Indentation spacer / 缩进占位 |\n| `.ba-cst-expand-icon` | Expand/collapse icon / 展开收起图标 |\n| `.ba-cst-expand-icon--leaf` | Leaf node icon (invisible) / 叶节点图标（不可见） |\n| `.ba-cst-checkbox` | Visibility checkbox / 可见性复选框 |\n| `.ba-cst-node-icon` | Node type icon / 节点类型图标 |\n| `.ba-cst-node-name` | Node name label / 节点名称 |\n| `.ba-cst-node-name--info` | Info node name style / Info 节点名称样式 |\n| `.ba-cst-zoom-btn` | Zoom-to-node button (hover visible) / 缩放定位按钮（悬停显示） |\n| `.ba-cst-zoom-btn--disabled` | Disabled zoom button / 禁用的缩放按钮 |\n\n---\n\n## Build / 构建\n\n```bash\nnpm install\nnpm run build\n# Output: dist/cesium-scene-tree.js\n```\n\n---\n\n## Changelog\n\n### v2.1.5\n- **Bug fix**: 修复 tileset URL 为 `./tileset.json` 等相对路径时下拉框显示 `.` 或 `..` 的问题\n\n### v2.1.4\n- **Improvement**: 优化数据集下拉框名称规则：优先用 `asset.extras.title`，其次取 URL 上一级路径段（文件名为 `tileset.json` 时）\n\n### v2.1.3\n- **Bug fix**: 修复数据集无场景树信息时「无场景树」提示文字被 `_scroller` 遮盖不可见的问题\n\n### v2.1.2\n- **Bug fix**: 修复手动调整面板大小后虚拟滚动不自动补充渲染新增可视行的问题（`ResizeObserver` + RAF）\n\n### v2.1.1\n- **Bug fix**: 修复虚拟滚动场景下，取消勾选父节点后向下滚动时子节点勾选框状态未同步的问题\n\n### v1.0.0\n- Initial release\n- Virtual-scrolling scene tree panel with drag/resize support\n- Multi-dataset dropdown switching\n- Node visibility toggle (cascading)\n- Double-click zoom to node bounding sphere (ECEF + ENU)\n- Bidirectional sync with `cesium-info-accessor` v2.0+ via `selectionChanged` event\n- Panel-collapsed reverse-sync ignore rule\n- Dataset switching with 60-second timeout and status message\n- Bilingual UI (Simplified Chinese / English)\n\n---\n\n## License\n\nMIT © BimAngle\n","readmeFilename":"README.md"}