@vertexvis/viewer 0.24.4-canary.8 → 0.24.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.template.md +6 -0
- package/dist/cjs/{controller-f032798e.js → controller-4996f10d.js} +2 -2
- package/dist/cjs/{controller-f032798e.js.map → controller-4996f10d.js.map} +1 -1
- package/dist/cjs/{cursors-2dfb0ef3.js → cursors-17ad74ac.js} +2 -2
- package/dist/cjs/{cursors-2dfb0ef3.js.map → cursors-17ad74ac.js.map} +1 -1
- package/dist/cjs/dom-fc408b4c.js.map +1 -1
- package/dist/cjs/{errors-04aa7cf2.js → errors-78196ad4.js} +9 -1
- package/dist/cjs/errors-78196ad4.js.map +1 -0
- package/dist/cjs/{index-5fa5a527.js → index-0abd8b0b.js} +2 -2
- package/dist/cjs/index-0abd8b0b.js.map +1 -0
- package/dist/cjs/index.cjs.js +4 -4
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js.map +1 -1
- package/dist/cjs/{queries-68cd2664.js → queries-4580caa5.js} +9 -3
- package/dist/cjs/queries-4580caa5.js.map +1 -0
- package/dist/cjs/{shadow-css-8962c4a9.js → shadow-css-37297ac8.js} +1 -1
- package/dist/cjs/shadow-css-37297ac8.js.map +1 -0
- package/dist/cjs/{stencil-a3f4e15b.js → stencil-40ef9119.js} +2 -2
- package/dist/cjs/{stencil-a3f4e15b.js.map → stencil-40ef9119.js.map} +1 -1
- package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +8 -2
- package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
- package/dist/cjs/vertex-scene-tree-table-column.cjs.entry.js +1 -1
- package/dist/cjs/vertex-scene-tree-table-header.cjs.entry.js +1 -1
- package/dist/cjs/vertex-scene-tree-table-resize-divider.cjs.entry.js +1 -1
- package/dist/cjs/vertex-scene-tree-toolbar-group.cjs.entry.js +1 -1
- package/dist/cjs/vertex-scene-tree.cjs.entry.js +3 -3
- package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-annotation-callout.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-button_3.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-default-toolbar.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-icon.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-layer.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-markup.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +5 -5
- package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-spinner.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js +4 -4
- package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer.cjs.entry.js +31 -15
- package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
- package/dist/cjs/viewer.cjs.js +1 -1
- package/dist/cjs/viewer.cjs.js.map +1 -1
- package/dist/collection/components/scene-tree/scene-tree.js +1 -1
- package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
- package/dist/collection/components/scene-tree-search/scene-tree-search.js +21 -1
- package/dist/collection/components/scene-tree-search/scene-tree-search.js.map +1 -1
- package/dist/collection/components/viewer/viewer.js +23 -13
- package/dist/collection/components/viewer/viewer.js.map +1 -1
- package/dist/collection/components/viewer-pin-group/viewer-pin-group.css +5 -0
- package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js +3 -3
- package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js.map +1 -1
- package/dist/collection/lib/cursors.js +1 -1
- package/dist/collection/lib/cursors.js.map +1 -1
- package/dist/collection/lib/model-views/controller.js +7 -1
- package/dist/collection/lib/model-views/controller.js.map +1 -1
- package/dist/collection/lib/stream/stream.js +6 -5
- package/dist/collection/lib/stream/stream.js.map +1 -1
- package/dist/collection/testing/viewer.js +2 -2
- package/dist/collection/testing/viewer.js.map +1 -1
- package/dist/components/cursors.js +1 -1
- package/dist/components/cursors.js.map +1 -1
- package/dist/components/errors.js +8 -1
- package/dist/components/errors.js.map +1 -1
- package/dist/components/queries.js +7 -1
- package/dist/components/queries.js.map +1 -1
- package/dist/components/scene-tree-search.js +6 -0
- package/dist/components/scene-tree-search.js.map +1 -1
- package/dist/components/vertex-scene-tree.js.map +1 -1
- package/dist/components/vertex-viewer-walk-mode-tool.js +3 -3
- package/dist/components/vertex-viewer-walk-mode-tool.js.map +1 -1
- package/dist/components/vertex-viewer.js +27 -11
- package/dist/components/vertex-viewer.js.map +1 -1
- package/dist/components/viewer-pin-group.js +1 -1
- package/dist/components/viewer-pin-group.js.map +1 -1
- package/dist/esm/{controller-00b61632.js → controller-8cfb590e.js} +2 -2
- package/dist/esm/{controller-00b61632.js.map → controller-8cfb590e.js.map} +1 -1
- package/dist/esm/{cursors-9e349d61.js → cursors-3806bc04.js} +2 -2
- package/dist/esm/{cursors-9e349d61.js.map → cursors-3806bc04.js.map} +1 -1
- package/dist/esm/dom-dba69343.js.map +1 -1
- package/dist/esm/{errors-0cbe2f60.js → errors-3fccf79a.js} +9 -2
- package/dist/{cjs/errors-04aa7cf2.js.map → esm/errors-3fccf79a.js.map} +1 -1
- package/dist/esm/{index-f3e96c9e.js → index-c12dc0cd.js} +2 -2
- package/dist/esm/index-c12dc0cd.js.map +1 -0
- package/dist/esm/index.js +4 -4
- package/dist/esm/index.mjs +4 -4
- package/dist/esm/loader.js +1 -1
- package/dist/esm/loader.js.map +1 -1
- package/dist/esm/loader.mjs +1 -1
- package/dist/esm/{queries-794dddcf.js → queries-948a88f9.js} +9 -3
- package/dist/esm/queries-948a88f9.js.map +1 -0
- package/dist/esm/{shadow-css-9363884b.js → shadow-css-d5069bdf.js} +1 -1
- package/dist/esm/shadow-css-d5069bdf.js.map +1 -0
- package/dist/esm/{stencil-9d9f090f.js → stencil-38b2fc28.js} +2 -2
- package/dist/esm/{stencil-9d9f090f.js.map → stencil-38b2fc28.js.map} +1 -1
- package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +8 -2
- package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
- package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
- package/dist/esm/vertex-scene-tree-table-column.entry.js +1 -1
- package/dist/esm/vertex-scene-tree-table-header.entry.js +1 -1
- package/dist/esm/vertex-scene-tree-table-resize-divider.entry.js +1 -1
- package/dist/esm/vertex-scene-tree-toolbar-group.entry.js +1 -1
- package/dist/esm/vertex-scene-tree.entry.js +3 -3
- package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-annotation-callout.entry.js +1 -1
- package/dist/esm/vertex-viewer-box-query-tool.entry.js +2 -2
- package/dist/esm/vertex-viewer-button_3.entry.js +1 -1
- package/dist/esm/vertex-viewer-default-toolbar.entry.js +1 -1
- package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
- package/dist/esm/vertex-viewer-dom-group.entry.js +1 -1
- package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +2 -2
- package/dist/esm/vertex-viewer-icon.entry.js +1 -1
- package/dist/esm/vertex-viewer-layer.entry.js +1 -1
- package/dist/esm/vertex-viewer-markup-arrow_3.entry.js +1 -1
- package/dist/esm/vertex-viewer-markup-tool.entry.js +1 -1
- package/dist/esm/vertex-viewer-markup.entry.js +1 -1
- package/dist/esm/vertex-viewer-measurement-details.entry.js +1 -1
- package/dist/esm/vertex-viewer-measurement-distance.entry.js +2 -2
- package/dist/esm/vertex-viewer-measurement-line_2.entry.js +1 -1
- package/dist/esm/vertex-viewer-measurement-precise.entry.js +2 -2
- package/dist/esm/vertex-viewer-pin-group.entry.js +5 -5
- package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-pin-label_2.entry.js +2 -2
- package/dist/esm/vertex-viewer-pin-tool.entry.js +2 -2
- package/dist/esm/vertex-viewer-spinner.entry.js +1 -1
- package/dist/esm/vertex-viewer-teleport-tool.entry.js +1 -1
- package/dist/esm/vertex-viewer-transform-widget.entry.js +2 -2
- package/dist/esm/vertex-viewer-view-cube.entry.js +2 -2
- package/dist/esm/vertex-viewer-walk-mode-tool.entry.js +4 -4
- package/dist/esm/vertex-viewer-walk-mode-tool.entry.js.map +1 -1
- package/dist/esm/vertex-viewer.entry.js +31 -15
- package/dist/esm/vertex-viewer.entry.js.map +1 -1
- package/dist/esm/viewer.js +1 -1
- package/dist/esm/viewer.js.map +1 -1
- package/dist/types/components/scene-tree/scene-tree.d.ts +1 -1
- package/dist/types/components/scene-tree-search/scene-tree-search.d.ts +5 -1
- package/dist/types/components/viewer/viewer.d.ts +3 -2
- package/dist/types/components.d.ts +11 -7
- package/dist/types/lib/stream/stream.d.ts +1 -1
- package/dist/types/testing/viewer.d.ts +2 -2
- package/dist/viewer/index.esm.js +1 -1
- package/dist/viewer/{p-0e0973f0.entry.js → p-03efd0d6.entry.js} +2 -2
- package/dist/viewer/{p-7f0eeb06.entry.js → p-0988832f.entry.js} +2 -2
- package/dist/viewer/{p-78a1be4e.entry.js → p-0aa04328.entry.js} +2 -2
- package/dist/viewer/p-18ce3f3b.entry.js +5 -0
- package/dist/viewer/{p-93960b4f.entry.js.map → p-18ce3f3b.entry.js.map} +1 -1
- package/dist/viewer/{p-2ecdcd5d.entry.js → p-23f0bb30.entry.js} +2 -2
- package/dist/viewer/{p-06b8bca7.entry.js → p-296311d3.entry.js} +2 -2
- package/dist/viewer/{p-2172230d.entry.js → p-2fd66679.entry.js} +2 -2
- package/dist/viewer/{p-5540add8.entry.js → p-362f3e12.entry.js} +2 -2
- package/dist/viewer/{p-110f66c6.js → p-388f809e.js} +2 -2
- package/dist/viewer/p-388f809e.js.map +1 -0
- package/dist/viewer/{p-48b63c5f.entry.js → p-45044ff2.entry.js} +2 -2
- package/dist/viewer/{p-9fc2e56e.entry.js → p-45b5b5ed.entry.js} +2 -2
- package/dist/viewer/{p-f79933ae.entry.js → p-4bd1ea70.entry.js} +2 -2
- package/dist/viewer/{p-842cc51b.entry.js → p-4bf16450.entry.js} +2 -2
- package/dist/viewer/{p-a057d7f2.entry.js → p-56fa8168.entry.js} +2 -2
- package/dist/viewer/{p-8c367e87.entry.js → p-59f204e7.entry.js} +2 -2
- package/dist/viewer/p-59f204e7.entry.js.map +1 -0
- package/dist/viewer/{p-33033b58.entry.js → p-6cf6eb8a.entry.js} +2 -2
- package/dist/viewer/p-715255e1.entry.js +5 -0
- package/dist/viewer/p-715255e1.entry.js.map +1 -0
- package/dist/viewer/{p-5f9352c0.entry.js → p-75f5ae33.entry.js} +2 -2
- package/dist/viewer/{p-7eea3fb3.entry.js → p-7a87ae97.entry.js} +2 -2
- package/dist/viewer/{p-b974c985.entry.js → p-86e1ee86.entry.js} +2 -2
- package/dist/viewer/p-86e1ee86.entry.js.map +1 -0
- package/dist/viewer/p-89d93218.entry.js +5 -0
- package/dist/viewer/p-89d93218.entry.js.map +1 -0
- package/dist/viewer/{p-07325d65.entry.js → p-8c53ed63.entry.js} +2 -2
- package/dist/viewer/p-991f7bac.js.map +1 -1
- package/dist/viewer/{p-983db3dd.entry.js → p-a009c6d9.entry.js} +2 -2
- package/dist/viewer/{p-dcb64250.entry.js → p-a3bc0b79.entry.js} +2 -2
- package/dist/viewer/{p-29318a17.entry.js → p-aece4279.entry.js} +2 -2
- package/dist/viewer/{p-be257155.js → p-b8c0f6ff.js} +1 -1
- package/dist/viewer/p-b8c0f6ff.js.map +1 -0
- package/dist/viewer/{p-2507658c.js → p-ba120f65.js} +2 -2
- package/dist/viewer/p-ba120f65.js.map +1 -0
- package/dist/viewer/p-bab8266e.js +5 -0
- package/dist/viewer/p-bab8266e.js.map +1 -0
- package/dist/viewer/{p-05562c21.entry.js → p-bcddbdb2.entry.js} +2 -2
- package/dist/viewer/{p-40e8a5ea.entry.js → p-c3b071a3.entry.js} +2 -2
- package/dist/viewer/{p-fbfa1e82.entry.js → p-cd3f0870.entry.js} +2 -2
- package/dist/viewer/{p-d2677c13.entry.js → p-d9e75269.entry.js} +2 -2
- package/dist/viewer/p-e1eaedd8.js +5 -0
- package/dist/viewer/{p-a27a9775.entry.js → p-e70e2c04.entry.js} +2 -2
- package/dist/viewer/{p-ffa8a2dd.entry.js → p-ebea8f56.entry.js} +2 -2
- package/dist/viewer/{p-342dac8b.js → p-eda9f5d4.js} +2 -2
- package/dist/viewer/{p-342dac8b.js.map → p-eda9f5d4.js.map} +1 -1
- package/dist/viewer/{p-9d54d593.entry.js → p-f292e8ae.entry.js} +2 -2
- package/dist/viewer/{p-6f1b22f0.js → p-f8951894.js} +2 -2
- package/dist/viewer/{p-d024c250.entry.js → p-f8a9c4d2.entry.js} +2 -2
- package/dist/viewer/viewer.esm.js +1 -1
- package/dist/viewer/viewer.esm.js.map +1 -1
- package/package.json +7 -7
- package/readme.md +10 -4
- package/dist/cjs/index-5fa5a527.js.map +0 -1
- package/dist/cjs/queries-68cd2664.js.map +0 -1
- package/dist/cjs/shadow-css-8962c4a9.js.map +0 -1
- package/dist/esm/errors-0cbe2f60.js.map +0 -1
- package/dist/esm/index-f3e96c9e.js.map +0 -1
- package/dist/esm/queries-794dddcf.js.map +0 -1
- package/dist/esm/shadow-css-9363884b.js.map +0 -1
- package/dist/viewer/p-04bf6b89.js +0 -5
- package/dist/viewer/p-110f66c6.js.map +0 -1
- package/dist/viewer/p-2507658c.js.map +0 -1
- package/dist/viewer/p-2ce9b8f7.entry.js +0 -5
- package/dist/viewer/p-2ce9b8f7.entry.js.map +0 -1
- package/dist/viewer/p-629a5ae7.entry.js +0 -5
- package/dist/viewer/p-629a5ae7.entry.js.map +0 -1
- package/dist/viewer/p-8c367e87.entry.js.map +0 -1
- package/dist/viewer/p-93960b4f.entry.js +0 -5
- package/dist/viewer/p-b974c985.entry.js.map +0 -1
- package/dist/viewer/p-be257155.js.map +0 -1
- package/dist/viewer/p-d9093da4.js +0 -5
- package/dist/viewer/p-d9093da4.js.map +0 -1
- /package/dist/viewer/{p-0e0973f0.entry.js.map → p-03efd0d6.entry.js.map} +0 -0
- /package/dist/viewer/{p-7f0eeb06.entry.js.map → p-0988832f.entry.js.map} +0 -0
- /package/dist/viewer/{p-78a1be4e.entry.js.map → p-0aa04328.entry.js.map} +0 -0
- /package/dist/viewer/{p-2ecdcd5d.entry.js.map → p-23f0bb30.entry.js.map} +0 -0
- /package/dist/viewer/{p-06b8bca7.entry.js.map → p-296311d3.entry.js.map} +0 -0
- /package/dist/viewer/{p-2172230d.entry.js.map → p-2fd66679.entry.js.map} +0 -0
- /package/dist/viewer/{p-5540add8.entry.js.map → p-362f3e12.entry.js.map} +0 -0
- /package/dist/viewer/{p-48b63c5f.entry.js.map → p-45044ff2.entry.js.map} +0 -0
- /package/dist/viewer/{p-9fc2e56e.entry.js.map → p-45b5b5ed.entry.js.map} +0 -0
- /package/dist/viewer/{p-f79933ae.entry.js.map → p-4bd1ea70.entry.js.map} +0 -0
- /package/dist/viewer/{p-842cc51b.entry.js.map → p-4bf16450.entry.js.map} +0 -0
- /package/dist/viewer/{p-a057d7f2.entry.js.map → p-56fa8168.entry.js.map} +0 -0
- /package/dist/viewer/{p-33033b58.entry.js.map → p-6cf6eb8a.entry.js.map} +0 -0
- /package/dist/viewer/{p-5f9352c0.entry.js.map → p-75f5ae33.entry.js.map} +0 -0
- /package/dist/viewer/{p-7eea3fb3.entry.js.map → p-7a87ae97.entry.js.map} +0 -0
- /package/dist/viewer/{p-07325d65.entry.js.map → p-8c53ed63.entry.js.map} +0 -0
- /package/dist/viewer/{p-983db3dd.entry.js.map → p-a009c6d9.entry.js.map} +0 -0
- /package/dist/viewer/{p-dcb64250.entry.js.map → p-a3bc0b79.entry.js.map} +0 -0
- /package/dist/viewer/{p-29318a17.entry.js.map → p-aece4279.entry.js.map} +0 -0
- /package/dist/viewer/{p-05562c21.entry.js.map → p-bcddbdb2.entry.js.map} +0 -0
- /package/dist/viewer/{p-40e8a5ea.entry.js.map → p-c3b071a3.entry.js.map} +0 -0
- /package/dist/viewer/{p-fbfa1e82.entry.js.map → p-cd3f0870.entry.js.map} +0 -0
- /package/dist/viewer/{p-d2677c13.entry.js.map → p-d9e75269.entry.js.map} +0 -0
- /package/dist/viewer/{p-04bf6b89.js.map → p-e1eaedd8.js.map} +0 -0
- /package/dist/viewer/{p-a27a9775.entry.js.map → p-e70e2c04.entry.js.map} +0 -0
- /package/dist/viewer/{p-ffa8a2dd.entry.js.map → p-ebea8f56.entry.js.map} +0 -0
- /package/dist/viewer/{p-9d54d593.entry.js.map → p-f292e8ae.entry.js.map} +0 -0
- /package/dist/viewer/{p-6f1b22f0.js.map → p-f8951894.js.map} +0 -0
- /package/dist/viewer/{p-d024c250.entry.js.map → p-f8a9c4d2.entry.js.map} +0 -0
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2026 Vertex Software LLC. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
import{r as t,c as i,h as s,H as e,g as n}from"./p-110f66c6.js";import{c as o}from"./p-92793987.js";import{d as r,r as h}from"./p-04bf6b89.js";import{n as l,p as a}from"./p-9d26f24e.js";import{a as c}from"./p-490d9553.js";import{i as d}from"./p-e4f95584.js";import{E as u}from"./p-6b00f7cd.js";import"./p-e5cc48b6.js";const v=".notification-banner{background-color:var(--blue-200);padding-top:0px;padding-bottom:0px;padding-right:16px;padding-left:8px;display:flex;justify-content:space-between;font-size:0.875rem;line-height:0.5;color:var(--neutral-600)}.notification-banner-info{display:flex;align-items:center;gap:8px}.notification-banner-info .icon{color:var(--blue-600)}.notification-banner-actions{display:flex;align-items:center}.notification-banner-button{background:none;border:none;padding:0;margin:0;cursor:pointer;color:var(--blue-600);font-size:0.875rem;display:flex;align-items:center}.notification-banner-button:hover{color:var(--blue-800)}";const f=class{constructor(s){t(this,s);this.action=i(this,"action",7)}render(){return s(e,null,s("div",{class:"notification-banner"},s("div",{class:"notification-banner-info"},s("vertex-viewer-icon",{class:"icon",name:"info",size:"sm"}),s("p",null,this.message)),this.actionLabel!=null&&s("div",{class:"notification-banner-actions"},s("button",{class:"notification-banner-button",onClick:()=>this.action.emit()},this.actionLabel))))}};f.style=v;const p="button{border:none;background:transparent;cursor:pointer;margin:0;padding:0}:host{--scene-tree-search-search-icon-offset:8px;--scene-tree-search-clear-button-offset:8px;--scene-tree-search-input-padding:0.5rem 32px;--scene-tree-search-input-border:none;--scene-tree-search-input-border-radius:0.25rem;--scene-tree-search-input-background:none;--scene-tree-search-focused-input-background:var(--neutral-200);--scene-tree-search-focused-input-outline:none;display:block;width:100%;font-size:0.875rem}.root{width:100%;position:relative}.input{background:var(--scene-tree-search-input-background);border:var(--scene-tree-search-input-border);border-radius:var(--scene-tree-search-input-border-radius);box-sizing:border-box;font-size:inherit;padding:var(--scene-tree-search-input-padding);outline:none;width:100%}.input.background{background:var(--scene-tree-search-focused-input-background);outline:var(--scene-tree-search-focused-input-outline)}.overlay{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;pointer-events:none}.overlay-clear{display:none;right:var(--scene-tree-search-clear-button-offset)}.overlay-clear.show{display:flex}.icon{color:var(--neutral-700)}.icon-search{position:absolute;left:var(--scene-tree-search-search-icon-offset);pointer-events:none}.clear-btn{display:flex;align-items:center;justify-content:center;pointer-events:initial;cursor:pointer}.clear-btn:hover{color:var(--neutral-800)}.clear-btn:disabled{pointer-events:none;opacity:0.5}";const m=class{constructor(s){t(this,s);this.search=i(this,"search",7);this.disabled=false;this.placeholder=undefined;this.value="";this.focused=false;this.isSearching=false;this.handleTextInput=t=>{const i=t.target;this.value=i.value;if(this.debounce!=null||this.value===""){this.emitCurrentValue()}};this.handleTextFocus=()=>{this.focused=true};this.handleTextBlur=()=>{var t;this.focused=false;(t=this.searchDisposable)===null||t===void 0?void 0:t.dispose();if(this.value!==this.lastEmittedValue){this.emitCurrentValue()}};this.handleKeyPress=t=>{var i;if(t.key==="Enter"){(i=this.searchDisposable)===null||i===void 0?void 0:i.dispose();this.emitCurrentValue()}};this.handleClear=t=>{var i;t.preventDefault();this.value="";(i=this.searchDisposable)===null||i===void 0?void 0:i.dispose();this.emitCurrentValue();this.setFocus()}}async setFocus(){var t,i;if(typeof((t=this.inputEl)===null||t===void 0?void 0:t.focus)==="function"){(i=this.inputEl)===null||i===void 0?void 0:i.focus()}}controllerChanged(t){this.setupController()}componentDidLoad(){this.handleDebounceChanged();this.setupController()}disconnectedCallback(){var t;(t=this.onStateChangeDisposable)===null||t===void 0?void 0:t.dispose()}clear(){var t;this.value="";(t=this.searchDisposable)===null||t===void 0?void 0:t.dispose();this.emitCurrentValue()}render(){return s(e,null,s("div",{class:"root"},s("div",{class:"overlay icon icon-search"},s("slot",{name:"search-icon"},this.isSearching?s("vertex-viewer-spinner",{slot:"search-icon",size:"xs"}):s("vertex-viewer-icon",{name:"search",size:"sm"}))),s("input",{class:o("input",{background:this.focused||this.value.length>0}),type:"text",ref:t=>this.inputEl=t,placeholder:this.placeholder,disabled:this.disabled,value:this.value,onInput:this.handleTextInput,onFocus:this.handleTextFocus,onBlur:this.handleTextBlur,onKeyPress:this.handleKeyPress}),s("div",{class:o("overlay overlay-clear",{show:this.value.length>0})},s("button",{class:"clear-btn icon",tabIndex:-1,onMouseDown:this.handleClear,disabled:this.disabled},s("slot",{name:"clear-icon"},s("vertex-viewer-icon",{name:"close-circle",size:"sm"}))))))}handleDebounceChanged(){var t,i;(t=this.searchDisposable)===null||t===void 0?void 0:t.dispose();const s=r(this.search,(i=this.debounce)!==null&&i!==void 0?i:0);this.search=s;this.searchDisposable=s}setupController(){var t,i;(t=this.onStateChangeDisposable)===null||t===void 0?void 0:t.dispose();this.onStateChangeDisposable=(i=this.controller)===null||i===void 0?void 0:i.onStateChange.on((t=>{this.isSearching=t.isSearching}))}emitCurrentValue(){this.lastEmittedValue=this.value;this.search.emit(this.value)}static get watchers(){return{controller:["controllerChanged"]}}};m.style=p;function b(t){return t.toLowerCase()}var g=[/([a-z0-9])([A-Z])/g,/([A-Z])([A-Z][a-z])/g];var w=/[^A-Z0-9]+/gi;function y(t,i){if(i===void 0){i={}}var s=i.splitRegexp,e=s===void 0?g:s,n=i.stripRegexp,o=n===void 0?w:n,r=i.transform,h=r===void 0?b:r,l=i.delimiter,a=l===void 0?" ":l;var c=x(x(t,e,"$1\0$2"),o,"\0");var d=0;var u=c.length;while(c.charAt(d)==="\0")d++;while(c.charAt(u-1)==="\0")u--;return c.slice(d,u).split("\0").map(h).join(a)}function x(t,i,s){if(i instanceof RegExp)return t.replace(i,s);return i.reduce((function(t,i){return t.replace(i,s)}),t)}function z(t,i){var s=t.charAt(0);var e=t.substr(1).toLowerCase();if(i>0&&s>="0"&&s<="9"){return"_"+s+e}return""+s.toUpperCase()+e}function C(t,i){if(i===void 0){i={}}return y(t,l({delimiter:"",transform:z},i))}function $(t,i){if(i===0)return t.toLowerCase();return z(t,i)}function R(t,i){if(i===void 0){i={}}return C(t,l({transform:$},i))}const k=/{{(.+)}}/;class D{constructor(t){this.bindings=t}bind(t){this.bindings.forEach((i=>i.bind(t)))}}class _{constructor(t,i){this.node=t;this.expr=i}}class j extends _{constructor(t,i){super(t,i)}bind(t){const i=V(t,this.expr);if(i!==this.node.textContent){this.node.textContent=i}}}class E extends _{constructor(t,i,s){super(t,i);this.attr=s}bind(t){const i=V(t,this.expr);const s=this.node.getAttribute(this.attr);if(s!==i){this.node.setAttribute(this.attr,i)}}}class M extends _{constructor(t,i,s){super(t,i);this.prop=s}bind(t){const i=A(t,this.expr);const s=this.node[this.prop];if(s!==i){this.node[this.prop]=i}}}class L extends _{constructor(t,i,s){super(t,i);this.eventName=s}bind(t){var i;const s=P(this.expr);if(s!=null){(i=this.disposable)===null||i===void 0?void 0:i.dispose();const e=W(t,s,true);this.node.addEventListener(this.eventName,e);this.disposable={dispose:()=>{this.node.removeEventListener(this.eventName,e)}}}}}function T(t){const i=[];if(t.nodeType===Node.ELEMENT_NODE){const s=t;const e=H(s);e.forEach((t=>{if(t.name.startsWith("event:")){const e=R(t.name.replace("event:",""));i.push(new L(s,t.value,e))}else if(t.name.startsWith("attr:")){i.push(new E(s,t.value,t.name.replace("attr:","")))}else if(t.name.startsWith("prop:")){const e=R(t.name.replace("prop:",""));i.push(new M(s,t.value,e))}}))}else if(t.nodeType===Node.TEXT_NODE&&t.textContent!=null&&k.test(t.textContent)){i.push(new j(t,t.textContent))}for(let s=0;s<t.childNodes.length;s++){i.push(...T(t.childNodes[s]))}return i}function H(t){return Array.from(t.attributes).filter((t=>k.test(t.value)))}function P(t){const i=k.exec(t);return i!=null?i[1]:undefined}function V(t,i){const s=P(i);if(s!=null){const e=W(t,s,true);return i.replace(`{{${s}}}`,e===null||e===void 0?void 0:e.toString())}else{return i}}function A(t,i){const s=P(i);if(s!=null){const i=W(t,s,true);return i}else{return i}}function W(t,i,s=false){const[e,...n]=i.split(".");if(s&&n.length===0){return t}else if(s&&n.length>0){return W(t,n.join("."),false)}else{const i=t[e];if(n.length>0){return W(i,n.join("."),false)}else{return i}}}class I{constructor(t,i){this.container=t;this.elementFactory=i;this.instanceMap=new Map;this.elements=[]}swapHeadToTail(t){const i=this.elements.splice(0,t);this.elements.splice(this.elements.length,0,...i);return this.elements.concat()}swapTailToHead(t){const i=this.elements.splice(-t,t);this.elements.splice(0,0,...i);return this.elements.concat()}updateElements(t){const i=t-this.elements.length;if(i>0){for(let t=0;t<i;t++){this.createElement()}}else{for(let t=0;t<-i;t++){this.deleteElement()}}return this.elements.concat()}updateData(t){this.elements.forEach(((i,s)=>{const e=this.instanceMap.get(i);const n=t(s);e===null||e===void 0?void 0:e.bindings.bind(n)}))}updateElementFactory(t){this.elementFactory=t;this.updateElements(0)}iterateElements(t){this.elements.forEach(((i,s)=>{const e=this.instanceMap.get(i);t(i,e.bindings,s)}))}createElement(){const t=this.elementFactory();this.elements.push(t.element);this.instanceMap.set(t.element,t);this.container.append(t.element);return t}deleteElement(){const t=this.elements.pop();if(t!=null){this.instanceMap.delete(t);t.remove()}}}function O(t){const i=t.content.cloneNode(true);const s=i.firstElementChild;const e=new D(T(i));return{element:s,bindings:e}}function N(t){var i;return(i=t.getBoundingClientRect().top)!==null&&i!==void 0?i:0}function Z(t){return t.clientWidth}function F(t,i,s){t.scrollTo(Object.assign({top:i},s))}class U{constructor(){this.onStateChange=new u}setHovered(t){this.onStateChange.emit(t)}stateChanged(t){return this.onStateChange.on(t)}}function B(t,i,s=200){window.clearTimeout(i);return window.setTimeout(t,s)}const K=":host{position:relative;display:flex;flex-direction:column;width:100%;height:100%;overflow:hidden;font-size:0.825rem;--scene-tree-table-row-padding:2px 0px;--scene-tree-table-column-gap:0.5rem;--scene-tree-table-column-resize-cursor:col-resize}.header{position:relative;display:grid;width:100%;border-bottom:var(--scene-tree-toolbar-separator)}.table{position:relative;display:grid;width:100%;height:100%;overflow:auto}.resize-overlay{position:absolute;top:0;cursor:var(--scene-tree-table-column-resize-cursor);z-index:1000;width:100%;height:100%}.divider-overlay{position:absolute;top:0;display:grid;pointer-events:none;z-index:2000;width:100%;height:100%}";const S=class{constructor(s){t(this,s);this.layoutRendered=i(this,"layoutRendered",7);this.columnsResized=i(this,"columnsResized",7);this.rows=[];this.totalRows=0;this.rowHeight=24;this.overScanCount=25;this.layoutOffset=0;this.scrollOffset=0;this.viewportStartIndex=0;this.viewportEndIndex=0;this.columnGridLayout="1fr";this.columnGridFixedLayout="";this.isComputingCellHeight=true;this.isScrolling=false;this.stateMap={viewportRows:[],columnWidths:[],columnWidthPercentages:[]};this.lastStartIndex=0;this.columnElements=[];this.cellHoverController=new U;this.layoutColumns=()=>{const t=this.viewportEndIndex-this.viewportStartIndex+1;const i=this.viewportStartIndex-this.lastStartIndex;this.lastStartIndex=this.viewportStartIndex;this.iterateColumns(((s,e,n)=>{e.updateElements(t);if(i>0){e.swapHeadToTail(i)}else{e.swapTailToHead(-i)}s.style.minHeight=`${this.rowHeight*this.totalRows}px`;const o=n===0?t=>`calc(${t} * 0.5rem)`:()=>`0`;e.iterateElements(((t,i,s)=>{const e=this.stateMap.viewportRows[s];if(d(e)){this.updateCell(e,t,i,s,o)}}))}))};this.updateCell=(t,i,s,e,n)=>{i.style.position="absolute";i.style.top=`${(this.viewportStartIndex+e)*this.rowHeight}px`;i.style.boxSizing="border-box";i.style.height=`${this.rowHeight}px`;i.style.width="100%";i.style.paddingLeft=n(t.node.depth);i.tree=this.tree;i.node=t.node;i.hoverController=this.cellHoverController;i.isScrolling=this.isScrolling;s.bind(t)};this.updateLayoutPosition=()=>{h((()=>{if(this.tableElement!=null){this.layoutOffset=N(this.tableElement)}}))};this.recomputeColumnWidths=()=>{const t=this.getLayoutWidth();if(t!=null&&this.stateMap.columnWidths.length===this.stateMap.columnWidthPercentages.length){this.stateMap.columnWidths=this.stateMap.columnWidthPercentages.map((i=>i*t));this.columnsResized.emit(this.stateMap.columnWidths)}};this.recomputeColumnPercentages=()=>{const t=this.getLayoutWidth();if(t!=null&&this.stateMap.columnWidths.length===this.stateMap.columnWidthPercentages.length){this.stateMap.columnWidthPercentages=this.stateMap.columnWidths.map((i=>i/t))}};this.computeInitialColumnWidths=()=>{this.stateMap.columnWidths=this.columnElements.map((t=>{var i;return(i=t.initialWidth)!==null&&i!==void 0?i:100}));const t=this.getLayoutWidth();if(t!=null){const i=this.stateMap.columnWidths.reduce(((t,i)=>t+i),0);const s=this.stateMap.columnWidths.map((s=>s*(t/i)));this.stateMap.columnWidthPercentages=s.map((i=>i/t));this.stateMap.columnWidths=s}};this.updateColumnElements=()=>{this.columnElements=Array.from(this.hostEl.querySelectorAll("vertex-scene-tree-table-column"))};this.computeCellHeight=async()=>{var t;if(this.isComputingCellHeight&&this.columnElements.length>0){const i={index:0,node:{id:{hex:""},name:"Dummy row",expanded:false,selected:false,visible:false,partiallyVisible:false,isLeaf:false,depth:0,columnsList:[],filterHit:false,phantom:false,endItem:false},metadata:{},data:{}};const{bindings:s,element:e}=this.createColumnCellInstance(this.columnElements[0]);s.bind(i);e.style.visibility="hidden";(t=this.columnElements[0])===null||t===void 0?void 0:t.appendChild(e);if(typeof e.componentOnReady==="function"){await e.componentOnReady()}let n=e.clientHeight;if(n===0){n=await new Promise((t=>{setTimeout((()=>t(e.getBoundingClientRect().height)),5)}))}this.rowHeight=n!==null&&n!==void 0?n:this.rowHeight;e.remove();this.isComputingCellHeight=this.rowHeight===0}};this.computeHeaderHeight=()=>{var t;if(this.stateMap.headerHeight==null){this.stateMap.headerHeight=(t=this.headerElement)===null||t===void 0?void 0:t.getBoundingClientRect().height;this.hostEl.style.setProperty("--header-height",`${this.stateMap.headerHeight}px`)}};this.computeColumnGridLayout=()=>{if(this.stateMap.columnWidths.length===0){this.stateMap.columnWidths=this.columnElements.map((t=>{var i;return(i=t.initialWidth)!==null&&i!==void 0?i:100}))}const t=this.getLayoutWidth();if(t!=null){if(this.stateMap.columnWidthPercentages.length===0){this.stateMap.columnWidthPercentages=this.columnElements.map((i=>{var s;return((s=i.initialWidth)!==null&&s!==void 0?s:100)/t}))}}this.columnGridLayout=`${this.stateMap.columnWidths.slice(0,-1).reduce(((t,i)=>`${t} ${i}px`),"")} 1fr`;this.columnGridFixedLayout=`${this.stateMap.columnWidths.reduce(((t,i)=>`${t} ${i}px`),"")}`};this.bindHeaderData=()=>{if(this.stateMap.headerInstances==null){this.stateMap.headerInstances=this.columnElements.map(((t,i)=>{var s;const e=this.createHeaderInstance(t);if(e!=null){e.element.style.paddingRight=i===this.columnElements.length-1?`0`:`var(--scene-tree-table-column-gap)`;e.element.slot="header";e.element.style.gridColumnStart=`${i+1}`;e.element.style.gridColumnEnd=`${i+2}`;(s=this.hostEl)===null||s===void 0?void 0:s.appendChild(e.element)}return e})).filter((t=>t!=null))}if(this.stateMap.headerDividerInstances==null){this.stateMap.headerDividerInstances=this.columnElements.slice(0,-1).map(((t,i)=>{var s;const e=this.createDividerInstance();e.element.slot="divider";e.element.style.position="absolute";e.element.style.right="0";e.element.style.pointerEvents="auto";e.element.style.gridColumnStart=`${i+1}`;e.element.style.gridColumnEnd=`${i+2}`;(s=this.hostEl)===null||s===void 0?void 0:s.appendChild(e.element);return e}))}};this.rebindHeaderData=()=>{var t,i;this.removeDividerDragListeners();(t=this.stateMap.headerInstances)===null||t===void 0?void 0:t.forEach((t=>t.element.remove()));(i=this.stateMap.headerDividerInstances)===null||i===void 0?void 0:i.forEach((t=>t.element.remove()));this.stateMap.headerInstances=undefined;this.stateMap.headerDividerInstances=undefined;this.bindHeaderData();this.addDividerDragListeners()};this.createDividerPointerDownHandler=t=>i=>{var s,e;i.preventDefault();i.stopPropagation();this.lastDividerPointerPosition=a.create(Math.floor(i.clientX),Math.floor(i.clientY));this.resizingColumnIndex=t;(e=(s=this.stateMap.headerDividerInstances)===null||s===void 0?void 0:s[t])===null||e===void 0?void 0:e.element.classList.add("dragging");window.addEventListener("pointermove",this.handleDividerPointerMove);window.addEventListener("pointerup",this.handleDividerPointerUp)};this.handleDividerPointerMove=t=>{const i=a.create(Math.floor(t.clientX),Math.floor(t.clientY));if(this.lastDividerPointerPosition!=null&&this.resizingColumnIndex!=null){const t=this.resizingColumnIndex;const s=a.subtract(this.lastDividerPointerPosition,i);if(Math.abs(s.x)>=1&&this.isValidResize(s,t)){this.stateMap.columnWidths=this.stateMap.columnWidths.map(((i,e)=>e===t?i-s.x:i));if(t+1<this.stateMap.columnWidths.length){this.stateMap.columnWidths=this.stateMap.columnWidths.map(((i,e)=>e===t+1?i+s.x:i))}this.lastDividerPointerPosition=i;this.computeColumnGridLayout()}}};this.handleDividerPointerUp=()=>{var t,i;if(this.resizingColumnIndex!=null){(i=(t=this.stateMap.headerDividerInstances)===null||t===void 0?void 0:t[this.resizingColumnIndex])===null||i===void 0?void 0:i.element.classList.remove("dragging")}this.lastDividerPointerPosition=undefined;this.resizingColumnIndex=undefined;this.recomputeColumnPercentages();this.recomputeColumnWidths();window.removeEventListener("pointermove",this.handleDividerPointerMove);window.removeEventListener("pointerup",this.handleDividerPointerUp)};this.isValidResize=(t,i)=>{var s,e,n,o;const r=this.columnElements[i];const h=this.columnElements[i+1];const l=this.stateMap.columnWidths[i];const a=this.stateMap.columnWidths[i+1];const c=(s=r.minWidth)!==null&&s!==void 0?s:0;const d=(e=r.maxWidth)!==null&&e!==void 0?e:Number.MAX_SAFE_INTEGER;const u=(n=h.minWidth)!==null&&n!==void 0?n:0;const v=(o=h.maxWidth)!==null&&o!==void 0?o:Number.MAX_SAFE_INTEGER;const f=l-t.x>c&&l-t.x<d;const p=h!=null?a+t.x>u&&a+t.x<v:true;return f&&p};this.handleScrollChanged=async t=>{this.isScrolling=true;this.scrollTimer=B((()=>{this.isScrolling=false}),this.scrollTimer);this.scrollOffset=t.target.scrollTop;await this.computeAndUpdateViewportRows()}}componentWillLoad(){this.updateColumnElements();this.createPools();this.headerResizeObserver=new ResizeObserver((()=>{this.stateMap.headerHeight=undefined;this.computeHeaderHeight();this.updateLayoutPosition()}));this.resizeObserver=new ResizeObserver((()=>{this.updateLayoutPosition();this.clearLayoutHeight();this.clearLayoutWidth();this.recomputeColumnWidths();this.computeColumnGridLayout()}))}async componentDidLoad(){var t,i,s;this.computeInitialColumnWidths();this.computeColumnGridLayout();this.ensureDividerTemplateDefined();this.computeCellHeight();this.computeHeaderHeight();this.rebindHeaderData();(t=this.tableElement)===null||t===void 0?void 0:t.addEventListener("scroll",this.handleScrollChanged,{passive:true});if(this.headerElement!=null){(i=this.headerResizeObserver)===null||i===void 0?void 0:i.observe(this.headerElement)}(s=this.resizeObserver)===null||s===void 0?void 0:s.observe(this.hostEl)}async componentWillRender(){await this.computeAndUpdateViewportRows()}componentDidRender(){this.layoutColumns();this.layoutRendered.emit()}async componentDidUpdate(){if(this.isComputingCellHeight){await this.computeCellHeight()}}disconnectedCallback(){var t,i,s;(t=this.tableElement)===null||t===void 0?void 0:t.removeEventListener("scroll",this.handleScrollChanged);this.removeDividerDragListeners();(i=this.headerResizeObserver)===null||i===void 0?void 0:i.disconnect();(s=this.resizeObserver)===null||s===void 0?void 0:s.disconnect();this.stateMap.columnWidths=[];this.stateMap.columnWidthPercentages=[]}async handleViewportRowsPropsChanged(){await this.computeAndUpdateViewportRows()}async scrollToPosition(t,i){if(this.tableElement!=null){F(this.tableElement,t,i)}}async attemptComputeCellHeight(){this.computeCellHeight()}render(){return s(e,null,s("div",{class:"header",ref:t=>this.headerElement=t,style:{gridTemplateColumns:this.columnGridFixedLayout,display:this.columnElements.length<=1?"none":"grid"}},s("slot",{name:"header"})),s("div",{class:"table",ref:t=>this.tableElement=t,style:{gridTemplateColumns:this.columnGridLayout}},s("slot",{onSlotchange:()=>{this.ensureDividerTemplateDefined();this.updateColumnElements();this.recreateColumnPools();this.computeInitialColumnWidths();this.rebindHeaderData();this.computeColumnGridLayout()}})),s("div",{class:"divider-overlay",style:{gridTemplateColumns:this.columnGridFixedLayout}},s("slot",{name:"divider"})),this.resizingColumnIndex!=null&&s("div",{class:"resize-overlay"}))}computeViewportRows(){const t=this.getLayoutHeight();const i=t!=null&&t>0&&!this.isComputingCellHeight;if(i){const i=Math.ceil(t/this.rowHeight);const s=Math.floor(this.scrollOffset/this.rowHeight);const e=s+i;const n=Math.max(0,s-this.overScanCount);const o=Math.min(this.totalRows-1,e+this.overScanCount);const r=this.getViewportRows(n,o);this.viewportStartIndex=n;this.viewportEndIndex=o;this.stateMap.viewportRows=r}}async computeAndUpdateViewportRows(){var t;this.computeViewportRows();if(((t=this.controller)===null||t===void 0?void 0:t.isConnected)&&this.totalRows>0){await this.controller.updateActiveRowRange(this.viewportStartIndex,this.viewportEndIndex)}}createPools(){if(this.stateMap.columnElementPools==null){this.stateMap.columnElementPools=this.columnElements.reduce(((t,i)=>t.set(i,new I(i,(()=>this.createColumnCellInstance(i))))),new WeakMap)}}recreateColumnPools(){this.columnElements.forEach((t=>{var i,s,e;if(((i=this.stateMap.columnElementPools)===null||i===void 0?void 0:i.get(t))==null){(s=this.stateMap.columnElementPools)===null||s===void 0?void 0:s.set(t,new I(t,(()=>this.createColumnCellInstance(t))))}else{(e=this.stateMap.columnElementPools.get(t))===null||e===void 0?void 0:e.updateElementFactory((()=>this.createColumnCellInstance(t)))}}))}iterateColumns(t){this.columnElements.forEach(((i,s)=>{var e;const n=(e=this.stateMap.columnElementPools)===null||e===void 0?void 0:e.get(i);if(n!=null){t(i,n,s)}else{throw new Error("Cannot find pool for column")}}))}ensureDividerTemplateDefined(){const t=this.hostEl.querySelector('template[slot="divider"]');if(t==null){const t=document.createElement("template");t.slot="divider";t.innerHTML=`\n <vertex-scene-tree-table-resize-divider slot="divider">\n </vertex-scene-tree-table-resize-divider>\n `;this.hostEl.appendChild(t)}}createHeaderInstance(t){const i=t.querySelector('template[slot="header"]');if(i!=null){return O(i)}}createDividerInstance(){const t=this.hostEl.querySelector('template[slot="divider"]');if(t!=null){return O(t)}else{throw new Error("Table is missing divider template element")}}createColumnCellInstance(t){const i=t.querySelector('template:not([slot="header"])');if(i!=null){return O(i)}else{throw new Error("Column is missing cell template element")}}addDividerDragListeners(){var t;this.stateMap.headerDividerListeners=(t=this.stateMap.headerDividerInstances)===null||t===void 0?void 0:t.map(((t,i)=>{const s=this.createDividerPointerDownHandler(i);t.element.addEventListener("pointerdown",s);return s}))}removeDividerDragListeners(){var t;if(this.stateMap.headerDividerListeners!=null){const i=this.stateMap.headerDividerListeners;(t=this.stateMap.headerDividerInstances)===null||t===void 0?void 0:t.forEach(((t,s)=>{const e=i[s];if(e!=null){t.element.removeEventListener("pointerdown",e)}}));this.stateMap.headerDividerListeners=undefined}}getViewportRows(t,i){const s=this.rows.slice(t,i+1);return s.map((t=>t!=null?this.populateRowData(t):t))}populateRowData(t){var i;if(this.rowData!=null&&t!=null){const s=((i=this.rowData)===null||i===void 0?void 0:i.call(this,t))||{};return Object.assign(Object.assign({},t),{data:s})}else{return t}}getLayoutHeight(){if(this.layoutHeight==null&&this.tableElement!=null){this.layoutHeight=c(this.tableElement)}return this.layoutHeight}getLayoutWidth(){if(this.layoutWidth==null){const t=Z(this.hostEl);if(t>0){this.layoutWidth=t}}return this.layoutWidth}clearLayoutHeight(){this.layoutHeight=undefined}clearLayoutWidth(){this.layoutWidth=undefined}get hostEl(){return n(this)}static get watchers(){return{rows:["handleViewportRowsPropsChanged"],totalRows:["handleViewportRowsPropsChanged"],rowHeight:["handleViewportRowsPropsChanged"]}}};S.style=K;const q=":host{--scene-tree-toolbar-content-gap:8px;display:flex;padding:0.5rem}.content{display:flex;align-items:center}.content-primary{width:100%}::slotted(:not(:first-child)){margin-left:var(--scene-tree-toolbar-content-gap)}";const G=class{constructor(i){t(this,i)}render(){return s(e,null,s("div",{class:"content"},s("slot",{name:"before"})),s("div",{class:"content content-primary"},s("slot",null)),s("div",{class:"content"},s("slot",{name:"after"})))}};G.style=q;export{f as vertex_scene_tree_notification_banner,m as vertex_scene_tree_search,S as vertex_scene_tree_table_layout,G as vertex_scene_tree_toolbar};
|
|
5
|
-
//# sourceMappingURL=p-629a5ae7.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["src/components/scene-tree-notification-banner/scene-tree-notification-banner.css?tag=vertex-scene-tree-notification-banner&encapsulation=shadow","src/components/scene-tree-notification-banner/scene-tree-notification-banner.tsx","src/components/scene-tree-search/scene-tree-search.css?tag=vertex-scene-tree-search&encapsulation=shadow","src/components/scene-tree-search/scene-tree-search.tsx","../html-templates/dist/bundle.esm.js","src/components/scene-tree-table-layout/lib/dom.ts","src/components/scene-tree-table-layout/lib/hover-controller.ts","src/components/scene-tree-table-layout/lib/window.ts","src/components/scene-tree-table-layout/scene-tree-table-layout.css?tag=vertex-scene-tree-table-layout&encapsulation=shadow","src/components/scene-tree-table-layout/scene-tree-table-layout.tsx","src/components/scene-tree-toolbar/scene-tree-toolbar.css?tag=vertex-scene-tree-toolbar&encapsulation=shadow","src/components/scene-tree-toolbar/scene-tree-toolbar.tsx"],"names":["sceneTreeNotificationBannerCss","SceneTreeNotificationBanner","[object Object]","h","Host","class","name","size","this","message","actionLabel","onClick","action","emit","sceneTreeSearchCss","SceneTreeSearch","hostRef","disabled","placeholder","undefined","value","focused","isSearching","handleTextInput","event","input","target","debounce","emitCurrentValue","handleTextFocus","handleTextBlur","_a","searchDisposable","dispose","lastEmittedValue","handleKeyPress","key","handleClear","preventDefault","setFocus","inputEl","focus","_b","controller","setupController","handleDebounceChanged","onStateChangeDisposable","slot","classNames","background","length","type","ref","onInput","onFocus","onBlur","onKeyPress","show","tabIndex","onMouseDown","emitter","debounceEvent","search","onStateChange","on","state","lowerCase","str","toLowerCase","DEFAULT_SPLIT_REGEXP","DEFAULT_STRIP_REGEXP","noCase","options","splitRegexp","stripRegexp","_c","transform","_d","delimiter","result","replace","start","end","charAt","slice","split","map","join","re","RegExp","reduce","pascalCaseTransform","index","firstChar","lowerChars","substr","toUpperCase","pascalCase","__assign","camelCaseTransform","camelCase","bindingRegEx","CollectionBinding","bindings","data","forEach","binding","bind","NodeBinding","node","expr","TextNodeBinding","super","newContent","replaceBindingString","textContent","AttributeBinding","attr","newValue","oldValue","getAttribute","setAttribute","PropertyBinding","prop","replaceBinding","EventHandlerBinding","eventName","path","extractBindingPath","disposable","listener","getBindableValue","addEventListener","removeEventListener","generateBindings","nodeType","Node","ELEMENT_NODE","el","bindableAttributes","getBindableAttributes","startsWith","push","propName","TEXT_NODE","test","i","childNodes","element","Array","from","attributes","filter","exec","toString","isHead","head","tail","ElementPool","container","elementFactory","instanceMap","Map","elements","count","sliced","splice","concat","diff","createElement","deleteElement","f","instance","get","updateElements","set","append","pop","delete","remove","generateInstanceFromTemplate","template","fragment","content","cloneNode","firstElementChild","getSceneTreeTableOffsetTop","getBoundingClientRect","top","getSceneTreeTableViewportWidth","clientWidth","scrollToTop","scrollTo","Object","assign","SceneTreeCellHoverController","EventDispatcher","id","restartTimeout","fn","existingTimeout","delay","window","clearTimeout","setTimeout","sceneTreeTableLayoutCss","SceneTreeTableLayout","rows","totalRows","rowHeight","overScanCount","layoutOffset","scrollOffset","viewportStartIndex","viewportEndIndex","columnGridLayout","columnGridFixedLayout","isComputingCellHeight","isScrolling","stateMap","viewportRows","columnWidths","columnWidthPercentages","lastStartIndex","columnElements","cellHoverController","layoutColumns","visibleRowCount","iterateColumns","col","pool","colIndex","swapHeadToTail","swapTailToHead","style","minHeight","cellPaddingLeft","depth","iterateElements","rowIndex","row","isLoadedRow","updateCell","cell","position","boxSizing","height","width","paddingLeft","tree","hoverController","updateLayoutPosition","readDOM","tableElement","recomputeColumnWidths","layoutWidth","getLayoutWidth","w","columnsResized","recomputeColumnPercentages","computeInitialColumnWidths","c","initialWidth","columnWidthSum","scaledColumnWidths","updateColumnElements","hostEl","querySelectorAll","computeCellHeight","async","dummyData","hex","expanded","selected","visible","partiallyVisible","isLeaf","columnsList","filterHit","phantom","endItem","metadata","createColumnCellInstance","visibility","appendChild","componentOnReady","clientHeight","Promise","resolve","computeHeaderHeight","headerHeight","headerElement","setProperty","computeColumnGridLayout","res","bindHeaderData","headerInstances","createHeaderInstance","paddingRight","gridColumnStart","gridColumnEnd","headerDividerInstances","_","createDividerInstance","right","pointerEvents","rebindHeaderData","removeDividerDragListeners","addDividerDragListeners","createDividerPointerDownHandler","stopPropagation","lastDividerPointerPosition","Point","create","Math","floor","clientX","clientY","resizingColumnIndex","classList","add","handleDividerPointerMove","handleDividerPointerUp","current","resizingIndex","subtract","abs","x","isValidResize","currentColumn","nextColumn","currentWidth","nextWidth","currentMinWidth","minWidth","currentMaxWidth","maxWidth","Number","MAX_SAFE_INTEGER","nextMinWidth","nextMaxWidth","currentIsValid","nextIsValid","handleScrollChanged","scrollTimer","scrollTop","computeAndUpdateViewportRows","createPools","headerResizeObserver","ResizeObserver","resizeObserver","clearLayoutHeight","clearLayoutWidth","ensureDividerTemplateDefined","passive","observe","layoutRendered","disconnect","gridTemplateColumns","display","onSlotchange","recreateColumnPools","viewportHeight","getLayoutHeight","canComputeIndices","viewportCount","ceil","startIndex","max","endIndex","min","getViewportRows","computeViewportRows","isConnected","updateActiveRowRange","columnElementPools","WeakMap","updateElementFactory","column","Error","querySelector","defaultDividerTemplate","document","innerHTML","headerDividerListeners","d","listeners","populateRowData","rowData","call","layoutHeight","getSceneTreeViewportHeight","computedWidth","sceneTreeToolbarCss","SceneTreeToolbar"],"mappings":";;;8TAAA,MAAMA,EAAiC,6nBCU1BC,EAA2B,8DAmB/BC,SACL,OACEC,EAACC,EAAI,KACHD,EAAA,MAAA,CAAKE,MAAM,uBACTF,EAAA,MAAA,CAAKE,MAAM,4BACTF,EAAA,qBAAA,CAAoBE,MAAM,OAAOC,KAAK,OAAOC,KAAK,OAClDJ,EAAA,IAAA,KAAIK,KAAKC,UAEVD,KAAKE,aAAe,MACnBP,EAAA,MAAA,CAAKE,MAAM,+BACTF,EAAA,SAAA,CACEE,MAAM,6BACNM,QAAS,IAAMH,KAAKI,OAAOC,QAE1BL,KAAKE,4BC3CtB,MAAMI,EAAqB,q+CC0BdC,EAAe,MAL5Bb,YAAAc,4CAuBSR,KAAAS,SAAW,MAMXT,KAAAU,YAAuBC,UAavBX,KAAAY,MAAQ,GAUPZ,KAAAa,QAAU,MAGVb,KAAAc,YAAc,MAyGdd,KAAAe,gBAAmBC,IACzB,MAAMC,EAAQD,EAAME,OACpBlB,KAAKY,MAAQK,EAAML,MAEnB,GAAIZ,KAAKmB,UAAY,MAAQnB,KAAKY,QAAU,GAAI,CAC9CZ,KAAKoB,qBAIDpB,KAAAqB,gBAAkB,KACxBrB,KAAKa,QAAU,MAGTb,KAAAsB,eAAiB,WACvBtB,KAAKa,QAAU,OAEfU,EAAAvB,KAAKwB,oBAAgB,MAAAD,SAAA,OAAA,EAAAA,EAAEE,UAEvB,GAAIzB,KAAKY,QAAUZ,KAAK0B,iBAAkB,CACxC1B,KAAKoB,qBAIDpB,KAAA2B,eAAkBX,UACxB,GAAIA,EAAMY,MAAQ,QAAS,EACzBL,EAAAvB,KAAKwB,oBAAgB,MAAAD,SAAA,OAAA,EAAAA,EAAEE,UACvBzB,KAAKoB,qBAIDpB,KAAA6B,YAAeb,UACrBA,EAAMc,iBAEN9B,KAAKY,MAAQ,IACbW,EAAAvB,KAAKwB,oBAAgB,MAAAD,SAAA,OAAA,EAAAA,EAAEE,UACvBzB,KAAKoB,mBACLpB,KAAK+B,YAlIArC,yBAEL,WAAW6B,EAAAvB,KAAKgC,WAAO,MAAAT,SAAA,OAAA,EAAAA,EAAEU,SAAU,WAAY,EAC7CC,EAAAlC,KAAKgC,WAAO,MAAAE,SAAA,OAAA,EAAAA,EAAED,SAQXvC,kBAAkByC,GACvBnC,KAAKoC,kBAMG1C,mBACRM,KAAKqC,wBAELrC,KAAKoC,kBAMG1C,8BACR6B,EAAAvB,KAAKsC,2BAAuB,MAAAf,SAAA,OAAA,EAAAA,EAAEE,UAOzB/B,cACLM,KAAKY,MAAQ,IACbW,EAAAvB,KAAKwB,oBAAgB,MAAAD,SAAA,OAAA,EAAAA,EAAEE,UACvBzB,KAAKoB,mBAMG1B,SACR,OACEC,EAACC,EAAI,KACHD,EAAA,MAAA,CAAKE,MAAM,QACTF,EAAA,MAAA,CAAKE,MAAM,4BACTF,EAAA,OAAA,CAAMG,KAAK,eACRE,KAAKc,YACJnB,EAAA,wBAAA,CAAuB4C,KAAK,cAAcxC,KAAK,OAE/CJ,EAAA,qBAAA,CAAoBG,KAAK,SAASC,KAAK,SAK7CJ,EAAA,QAAA,CACEE,MAAO2C,EAAW,QAAS,CACzBC,WAAYzC,KAAKa,SAAWb,KAAKY,MAAM8B,OAAS,IAElDC,KAAK,OACLC,IAAMA,GAAS5C,KAAKgC,QAAUY,EAC9BlC,YAAaV,KAAKU,YAClBD,SAAUT,KAAKS,SACfG,MAAOZ,KAAKY,MACZiC,QAAS7C,KAAKe,gBACd+B,QAAS9C,KAAKqB,gBACd0B,OAAQ/C,KAAKsB,eACb0B,WAAYhD,KAAK2B,iBAGnBhC,EAAA,MAAA,CACEE,MAAO2C,EAAW,wBAAyB,CACzCS,KAAMjD,KAAKY,MAAM8B,OAAS,KAG5B/C,EAAA,SAAA,CACEE,MAAM,iBACNqD,UAAW,EACXC,YAAanD,KAAK6B,YAClBpB,SAAUT,KAAKS,UAEfd,EAAA,OAAA,CAAMG,KAAK,cACTH,EAAA,qBAAA,CAAoBG,KAAK,eAAeC,KAAK,YAgDnDL,iCACN6B,EAAAvB,KAAKwB,oBAAgB,MAAAD,SAAA,OAAA,EAAAA,EAAEE,UAEvB,MAAM2B,EAAUC,EAAcrD,KAAKsD,QAAQpB,EAAAlC,KAAKmB,YAAQ,MAAAe,SAAA,EAAAA,EAAI,GAI5DlC,KAAKsD,OAASF,EACdpD,KAAKwB,iBAAmB4B,EAGlB1D,2BACN6B,EAAAvB,KAAKsC,2BAAuB,MAAAf,SAAA,OAAA,EAAAA,EAAEE,UAE9BzB,KAAKsC,yBAA0BJ,EAAAlC,KAAKmC,cAAU,MAAAD,SAAA,OAAA,EAAAA,EAAEqB,cAAcC,IAC3DC,IACCzD,KAAKc,YAAc2C,EAAM3C,eAKvBpB,mBACNM,KAAK0B,iBAAmB1B,KAAKY,MAC7BZ,KAAKsD,OAAOjD,KAAKL,KAAKY,kFC3O1B,SAAS8C,EAAUC,GACf,OAAOA,EAAIC,cAIf,IAAIC,EAAuB,CAAC,qBAAsB,wBAElD,IAAIC,EAAuB,eAI3B,SAASC,EAAO9C,EAAO+C,GACnB,GAAIA,SAAiB,EAAG,CAAEA,EAAU,GACpC,IAAIzC,EAAKyC,EAAQC,YAAaA,EAAc1C,SAAY,EAAIsC,EAAuBtC,EAAIW,EAAK8B,EAAQE,YAAaA,EAAchC,SAAY,EAAI4B,EAAuB5B,EAAIiC,EAAKH,EAAQI,UAAWA,EAAYD,SAAY,EAAIT,EAAYS,EAAIE,EAAKL,EAAQM,UAAWA,EAAYD,SAAY,EAAI,IAAMA,EACxS,IAAIE,EAASC,EAAQA,EAAQvD,EAAOgD,EAAa,UAAWC,EAAa,MACzE,IAAIO,EAAQ,EACZ,IAAIC,EAAMH,EAAO7B,OAEjB,MAAO6B,EAAOI,OAAOF,KAAW,KAC5BA,IACJ,MAAOF,EAAOI,OAAOD,EAAM,KAAO,KAC9BA,IAEJ,OAAOH,EAAOK,MAAMH,EAAOC,GAAKG,MAAM,MAAMC,IAAIV,GAAWW,KAAKT,GAKpE,SAASE,EAAQvD,EAAO+D,EAAIpE,GACxB,GAAIoE,aAAcC,OACd,OAAOhE,EAAMuD,QAAQQ,EAAIpE,GAC7B,OAAOoE,EAAGE,QAAO,SAAUjE,EAAO+D,GAAM,OAAO/D,EAAMuD,QAAQQ,EAAIpE,KAAWK,GAGhF,SAASkE,EAAoBlE,EAAOmE,GAChC,IAAIC,EAAYpE,EAAM0D,OAAO,GAC7B,IAAIW,EAAarE,EAAMsE,OAAO,GAAG3B,cACjC,GAAIwB,EAAQ,GAAKC,GAAa,KAAOA,GAAa,IAAK,CACnD,MAAO,IAAMA,EAAYC,EAE7B,MAAO,GAAKD,EAAUG,cAAgBF,EAE1C,SAASG,EAAWxE,EAAO+C,GACvB,GAAIA,SAAiB,EAAG,CAAEA,EAAU,GACpC,OAAOD,EAAO9C,EAAOyE,EAAS,CAAEpB,UAAW,GAAIF,UAAWe,GAAuBnB,IAGrF,SAAS2B,EAAmB1E,EAAOmE,GAC/B,GAAIA,IAAU,EACV,OAAOnE,EAAM2C,cACjB,OAAOuB,EAAoBlE,EAAOmE,GAEtC,SAASQ,EAAU3E,EAAO+C,GACtB,GAAIA,SAAiB,EAAG,CAAEA,EAAU,GACpC,OAAOyB,EAAWxE,EAAOyE,EAAS,CAAEtB,UAAWuB,GAAsB3B,IAGzE,MAAM6B,EAAe,WACrB,MAAMC,EACFpG,YAAYqG,GACR/F,KAAK+F,SAAWA,EAEpBrG,KAAKsG,GACDhG,KAAK+F,SAASE,SAASC,GAAYA,EAAQC,KAAKH,MAGxD,MAAMI,EACF1G,YAAY2G,EAAMC,GACdtG,KAAKqG,KAAOA,EACZrG,KAAKsG,KAAOA,GAGpB,MAAMC,UAAwBH,EAC1B1G,YAAY2G,EAAMC,GACdE,MAAMH,EAAMC,GAEhB5G,KAAKsG,GACD,MAAMS,EAAaC,EAAqBV,EAAMhG,KAAKsG,MACnD,GAAIG,IAAezG,KAAKqG,KAAKM,YAAa,CACtC3G,KAAKqG,KAAKM,YAAcF,IAIpC,MAAMG,UAAyBR,EAC3B1G,YAAY2G,EAAMC,EAAMO,GACpBL,MAAMH,EAAMC,GACZtG,KAAK6G,KAAOA,EAEhBnH,KAAKsG,GACD,MAAMc,EAAWJ,EAAqBV,EAAMhG,KAAKsG,MACjD,MAAMS,EAAW/G,KAAKqG,KAAKW,aAAahH,KAAK6G,MAC7C,GAAIE,IAAaD,EAAU,CACvB9G,KAAKqG,KAAKY,aAAajH,KAAK6G,KAAMC,KAI9C,MAAMI,UAAwBd,EAC1B1G,YAAY2G,EAAMC,EAAMa,GACpBX,MAAMH,EAAMC,GACZtG,KAAKmH,KAAOA,EAEhBzH,KAAKsG,GACD,MAAMc,EAAWM,EAAepB,EAAMhG,KAAKsG,MAE3C,MAAMS,EAAW/G,KAAKqG,KAAKrG,KAAKmH,MAChC,GAAIJ,IAAaD,EAAU,CACvB9G,KAAKqG,KAAKrG,KAAKmH,MAAQL,IAKnC,MAAMO,UAA4BjB,EAC9B1G,YAAY2G,EAAMC,EAAMgB,GACpBd,MAAMH,EAAMC,GACZtG,KAAKsH,UAAYA,EAErB5H,KAAKsG,GACD,IAAIzE,EACJ,MAAMgG,EAAOC,EAAmBxH,KAAKsG,MACrC,GAAIiB,GAAQ,KAAM,EACbhG,EAAKvB,KAAKyH,cAAgB,MAAQlG,SAAY,OAAS,EAAIA,EAAGE,UAC/D,MAAMiG,EAAWC,EAAiB3B,EAAMuB,EAAM,MAC9CvH,KAAKqG,KAAKuB,iBAAiB5H,KAAKsH,UAAWI,GAC3C1H,KAAKyH,WAAa,CACdhG,QAAS,KACLzB,KAAKqG,KAAKwB,oBAAoB7H,KAAKsH,UAAWI,OAMlE,SAASI,EAAiBzB,GACtB,MAAMN,EAAW,GACjB,GAAIM,EAAK0B,WAAaC,KAAKC,aAAc,CACrC,MAAMC,EAAK7B,EACX,MAAM8B,EAAqBC,EAAsBF,GACjDC,EAAmBlC,SAASY,IACxB,GAAIA,EAAK/G,KAAKuI,WAAW,UAAW,CAChC,MAAMf,EAAY1B,EAAUiB,EAAK/G,KAAK0E,QAAQ,SAAU,KACxDuB,EAASuC,KAAK,IAAIjB,EAAoBa,EAAIrB,EAAKjG,MAAO0G,SAErD,GAAIT,EAAK/G,KAAKuI,WAAW,SAAU,CACpCtC,EAASuC,KAAK,IAAI1B,EAAiBsB,EAAIrB,EAAKjG,MAAOiG,EAAK/G,KAAK0E,QAAQ,QAAS,WAE7E,GAAIqC,EAAK/G,KAAKuI,WAAW,SAAU,CACpC,MAAME,EAAW3C,EAAUiB,EAAK/G,KAAK0E,QAAQ,QAAS,KACtDuB,EAASuC,KAAK,IAAIpB,EAAgBgB,EAAIrB,EAAKjG,MAAO2H,aAIzD,GAAIlC,EAAK0B,WAAaC,KAAKQ,WAC5BnC,EAAKM,aAAe,MACpBd,EAAa4C,KAAKpC,EAAKM,aAAc,CACrCZ,EAASuC,KAAK,IAAI/B,EAAgBF,EAAMA,EAAKM,cAEjD,IAAK,IAAI+B,EAAI,EAAGA,EAAIrC,EAAKsC,WAAWjG,OAAQgG,IAAK,CAC7C3C,EAASuC,QAAQR,EAAiBzB,EAAKsC,WAAWD,KAEtD,OAAO3C,EAEX,SAASqC,EAAsBQ,GAC3B,OAAOC,MAAMC,KAAKF,EAAQG,YAAYC,QAAQnC,GAAShB,EAAa4C,KAAK5B,EAAKjG,SAElF,SAAS4G,EAAmBlB,GACxB,MAAM/B,EAASsB,EAAaoD,KAAK3C,GACjC,OAAO/B,GAAU,KAAOA,EAAO,GAAK5D,UAExC,SAAS+F,EAAqBV,EAAMM,GAChC,MAAMiB,EAAOC,EAAmBlB,GAChC,GAAIiB,GAAQ,KAAM,CACd,MAAM3G,EAAQ+G,EAAiB3B,EAAMuB,EAAM,MAC3C,OAAOjB,EAAK9B,QAAQ,KAAK+C,MAAU3G,IAAU,MAAQA,SAAe,OAAS,EAAIA,EAAMsI,gBAEtF,CACD,OAAO5C,GAIf,SAASc,EAAepB,EAAMM,GAC1B,MAAMiB,EAAOC,EAAmBlB,GAChC,GAAIiB,GAAQ,KAAM,CACd,MAAM3G,EAAQ+G,EAAiB3B,EAAMuB,EAAM,MAC3C,OAAO3G,MAEN,CACD,OAAO0F,GAGf,SAASqB,EAAiB3B,EAAMuB,EAAM4B,EAAS,OAG3C,MAAOC,KAASC,GAAQ9B,EAAK1C,MAAM,KACnC,GAAIsE,GAAUE,EAAK3G,SAAW,EAAG,CAC7B,OAAOsD,OAEN,GAAImD,GAAUE,EAAK3G,OAAS,EAAG,CAChC,OAAOiF,EAAiB3B,EAAMqD,EAAKtE,KAAK,KAAM,WAE7C,CACD,MAAMnE,EAAQoF,EAAKoD,GACnB,GAAIC,EAAK3G,OAAS,EAAG,CACjB,OAAOiF,EAAiB/G,EAAOyI,EAAKtE,KAAK,KAAM,WAE9C,CACD,OAAOnE,IAKnB,MAAM0I,EACF5J,YAAY6J,EAAWC,GACnBxJ,KAAKuJ,UAAYA,EACjBvJ,KAAKwJ,eAAiBA,EACtBxJ,KAAKyJ,YAAc,IAAIC,IACvB1J,KAAK2J,SAAW,GAEpBjK,eAAekK,GACX,MAAMC,EAAS7J,KAAK2J,SAASG,OAAO,EAAGF,GACvC5J,KAAK2J,SAASG,OAAO9J,KAAK2J,SAASjH,OAAQ,KAAMmH,GACjD,OAAO7J,KAAK2J,SAASI,SAEzBrK,eAAekK,GACX,MAAMC,EAAS7J,KAAK2J,SAASG,QAAQF,EAAOA,GAC5C5J,KAAK2J,SAASG,OAAO,EAAG,KAAMD,GAC9B,OAAO7J,KAAK2J,SAASI,SAEzBrK,eAAekK,GACX,MAAMI,EAAOJ,EAAQ5J,KAAK2J,SAASjH,OACnC,GAAIsH,EAAO,EAAG,CACV,IAAK,IAAItB,EAAI,EAAGA,EAAIsB,EAAMtB,IAAK,CAC3B1I,KAAKiK,qBAGR,CACD,IAAK,IAAIvB,EAAI,EAAGA,GAAKsB,EAAMtB,IAAK,CAC5B1I,KAAKkK,iBAGb,OAAOlK,KAAK2J,SAASI,SAEzBrK,WAAWyK,GACPnK,KAAK2J,SAAS1D,SAAQ,CAACiC,EAAIQ,KACvB,MAAM0B,EAAWpK,KAAKyJ,YAAYY,IAAInC,GACtC,MAAMlC,EAAOmE,EAAEzB,GACf0B,IAAa,MAAQA,SAAkB,OAAS,EAAIA,EAASrE,SAASI,KAAKH,MAGnFtG,qBAAqB8J,GACjBxJ,KAAKwJ,eAAiBA,EACtBxJ,KAAKsK,eAAe,GAExB5K,gBAAgByK,GACZnK,KAAK2J,SAAS1D,SAAQ,CAACiC,EAAIQ,KACvB,MAAM0B,EAAWpK,KAAKyJ,YAAYY,IAAInC,GAEtCiC,EAAEjC,EAAIkC,EAASrE,SAAU2C,MAGjChJ,gBACI,MAAM0K,EAAWpK,KAAKwJ,iBACtBxJ,KAAK2J,SAASrB,KAAK8B,EAASxB,SAC5B5I,KAAKyJ,YAAYc,IAAIH,EAASxB,QAASwB,GACvCpK,KAAKuJ,UAAUiB,OAAOJ,EAASxB,SAC/B,OAAOwB,EAEX1K,gBACI,MAAMkJ,EAAU5I,KAAK2J,SAASc,MAC9B,GAAI7B,GAAW,KAAM,CACjB5I,KAAKyJ,YAAYiB,OAAO9B,GACxBA,EAAQ+B,WAiBpB,SAASC,EAA6BC,GAClC,MAAMC,EAAWD,EAASE,QAAQC,UAAU,MAC5C,MAAMpC,EAAUkC,EAASG,kBACzB,MAAMlF,EAAW,IAAID,EAAkBgC,EAAiBgD,IACxD,MAAO,CAAElC,QAAAA,EAAS7C,SAAAA,YCxSNmF,EAA2BhD,SACzC,OAAO3G,EAAA2G,EAAGiD,wBAAwBC,OAAG,MAAA7J,SAAA,EAAAA,EAAI,WAG3B8J,EAA+BnD,GAC7C,OAAOA,EAAGoD,qBAGIC,EACdrD,EACAkD,EACApH,GAEAkE,EAAGsD,SAAQC,OAAAC,OAAA,CAAGN,IAAAA,GAAQpH,UCbX2H,EAAbjM,cACSM,KAAAuD,cAAgB,IAAIqI,EAEpBlM,WAAWmM,GAChB7L,KAAKuD,cAAclD,KAAKwL,GAGnBnM,aAAagI,GAClB,OAAO1H,KAAKuD,cAAcC,GAAGkE,aCVjBoE,EACdC,EACAC,EACAC,EAAQ,KAERC,OAAOC,aAAaH,GACpB,OAAOE,OAAOE,WAAWL,EAAIE,GCN/B,MAAMI,EAA0B,0pBCuDnBC,EAAoB,MALjC5M,YAAAc,2GAuBSR,KAAAuM,KAAc,GAMdvM,KAAAwM,UAAY,EAMZxM,KAAAyM,UAAY,GAWZzM,KAAA0M,cAAgB,GAsChB1M,KAAA2M,aAAe,EAMf3M,KAAA4M,aAAe,EAkBf5M,KAAA6M,mBAAqB,EAMrB7M,KAAA8M,iBAAmB,EAmBlB9M,KAAA+M,iBAAmB,MAGnB/M,KAAAgN,sBAAwB,GAGxBhN,KAAAiN,sBAAwB,KASxBjN,KAAAkN,YAAc,MAWdlN,KAAAmN,SAAqB,CAC3BC,aAAc,GACdC,aAAc,GACdC,uBAAwB,IAGlBtN,KAAAuN,eAAiB,EAMjBvN,KAAAwN,eAA0D,GAE1DxN,KAAAyN,oBAAsB,IAAI9B,EAsL1B3L,KAAA0N,cAAgB,KACtB,MAAMC,EAAkB3N,KAAK8M,iBAAmB9M,KAAK6M,mBAAqB,EAC1E,MAAM7C,EAAOhK,KAAK6M,mBAAqB7M,KAAKuN,eAC5CvN,KAAKuN,eAAiBvN,KAAK6M,mBAE3B7M,KAAK4N,gBAAe,CAACC,EAAKC,EAAMC,KAC9BD,EAAKxD,eAAeqD,GAEpB,GAAI3D,EAAO,EAAG,CACZ8D,EAAKE,eAAehE,OACf,CACL8D,EAAKG,gBAAgBjE,GAGvB6D,EAAIK,MAAMC,UAAY,GAAGnO,KAAKyM,UAAYzM,KAAKwM,cAE/C,MAAM4B,EACJL,IAAa,EACRM,GAAkB,QAAQA,cAC3B,IAAM,IAEZP,EAAKQ,iBAAgB,CAACpG,EAAIhC,EAASqI,KACjC,MAAMC,EAAMxO,KAAKmN,SAASC,aAAamB,GAEvC,GAAIE,EAAYD,GAAM,CACpBxO,KAAK0O,WAAWF,EAAKtG,EAAIhC,EAASqI,EAAUH,WAM5CpO,KAAA0O,WAAa,CACnBF,EACAG,EACAzI,EACAqI,EACAH,KAEAO,EAAKT,MAAMU,SAAW,WACtBD,EAAKT,MAAM9C,IAAM,IACdpL,KAAK6M,mBAAqB0B,GAAYvO,KAAKyM,cAE9CkC,EAAKT,MAAMW,UAAY,aACvBF,EAAKT,MAAMY,OAAS,GAAG9O,KAAKyM,cAC5BkC,EAAKT,MAAMa,MAAQ,OACnBJ,EAAKT,MAAMc,YAAcZ,EAAgBI,EAAInI,KAAKgI,OAGjDM,EAAaM,KAAOjP,KAAKiP,KACzBN,EAAatI,KAAOmI,EAAInI,KACxBsI,EAAaO,gBAAkBlP,KAAKyN,oBACpCkB,EAAazB,YAAclN,KAAKkN,YAGjChH,EAAQC,KAAKqI,IAGPxO,KAAAmP,qBAAuB,KAC7BC,GAAQ,KACN,GAAIpP,KAAKqP,cAAgB,KAAM,CAC7BrP,KAAK2M,aAAezB,EAA2BlL,KAAKqP,mBAKlDrP,KAAAsP,sBAAwB,KAC9B,MAAMC,EAAcvP,KAAKwP,iBACzB,GACED,GAAe,MACfvP,KAAKmN,SAASE,aAAa3K,SACzB1C,KAAKmN,SAASG,uBAAuB5K,OACvC,CACA1C,KAAKmN,SAASE,aAAerN,KAAKmN,SAASG,uBAAuBxI,KAC/D2K,GAAMA,EAAIF,IAGbvP,KAAK0P,eAAerP,KAAKL,KAAKmN,SAASE,gBAInCrN,KAAA2P,2BAA6B,KACnC,MAAMJ,EAAcvP,KAAKwP,iBACzB,GACED,GAAe,MACfvP,KAAKmN,SAASE,aAAa3K,SACzB1C,KAAKmN,SAASG,uBAAuB5K,OACvC,CACA1C,KAAKmN,SAASG,uBAAyBtN,KAAKmN,SAASE,aAAavI,KAC/D2K,GAAMA,EAAIF,MAKTvP,KAAA4P,2BAA6B,KACnC5P,KAAKmN,SAASE,aAAerN,KAAKwN,eAAe1I,KAC9C+K,IAAC,IAAAtO,EAAK,OAAAA,EAAAsO,EAAEC,gBAAY,MAAAvO,SAAA,EAAAA,EAAI,OAG3B,MAAMgO,EAAcvP,KAAKwP,iBACzB,GAAID,GAAe,KAAM,CACvB,MAAMQ,EAAiB/P,KAAKmN,SAASE,aAAanI,QAChD,CAACX,EAAQkL,IAAMlL,EAASkL,GACxB,GAEF,MAAMO,EAAqBhQ,KAAKmN,SAASE,aAAavI,KACnD2K,GAAMA,GAAKF,EAAcQ,KAG5B/P,KAAKmN,SAASG,uBAAyB0C,EAAmBlL,KACvD2K,GAAMA,EAAIF,IAEbvP,KAAKmN,SAASE,aAAe2C,IAIzBhQ,KAAAiQ,qBAAuB,KAC7BjQ,KAAKwN,eAAiB3E,MAAMC,KAC1B9I,KAAKkQ,OAAOC,iBAAiB,oCAmGzBnQ,KAAAoQ,kBAAoBC,gBAC1B,GAAIrQ,KAAKiN,uBAAyBjN,KAAKwN,eAAe9K,OAAS,EAAG,CAChE,MAAM4N,EAAuB,CAC3BlL,MAAO,EACPiB,KAAM,CACJwF,GAAI,CAAE0E,IAAK,IACXzQ,KAAM,YACN0Q,SAAU,MACVC,SAAU,MACVC,QAAS,MACTC,iBAAkB,MAClBC,OAAQ,MACRvC,MAAO,EACPwC,YAAa,GACbC,UAAW,MACXC,QAAS,MACTC,QAAS,OAEXC,SAAU,GACVjL,KAAM,IAER,MAAMD,SAAEA,EAAQ6C,QAAEA,GAAY5I,KAAKkR,yBACjClR,KAAKwN,eAAe,IAEtBzH,EAASI,KAAKmK,GACd1H,EAAQsF,MAAMiD,WAAa,UAE3B5P,EAAAvB,KAAKwN,eAAe,MAAE,MAAAjM,SAAA,OAAA,EAAAA,EAAE6P,YAAYxI,GAGpC,UAAYA,EAAgByI,mBAAqB,WAAY,OACpDzI,EAAgByI,mBAIzB,IAAIvC,EAASlG,EAAQ0I,aACrB,GAAIxC,IAAW,EAAG,CAChBA,QAAe,IAAIyC,SAASC,IAC1BpF,YAAW,IAAMoF,EAAQ5I,EAAQuC,wBAAwB2D,SAAS,MAItE9O,KAAKyM,UAAYqC,IAAM,MAANA,SAAM,EAANA,EAAU9O,KAAKyM,UAChC7D,EAAQ+B,SACR3K,KAAKiN,sBAAwBjN,KAAKyM,YAAc,IAI5CzM,KAAAyR,oBAAsB,WAC5B,GAAIzR,KAAKmN,SAASuE,cAAgB,KAAM,CACtC1R,KAAKmN,SAASuE,cACZnQ,EAAAvB,KAAK2R,iBAAa,MAAApQ,SAAA,OAAA,EAAAA,EAAE4J,wBAAwB2D,OAC9C9O,KAAKkQ,OAAOhC,MAAM0D,YAChB,kBACA,GAAG5R,KAAKmN,SAASuE,oBAKf1R,KAAA6R,wBAA0B,KAChC,GAAI7R,KAAKmN,SAASE,aAAa3K,SAAW,EAAG,CAC3C1C,KAAKmN,SAASE,aAAerN,KAAKwN,eAAe1I,KAC9C+K,IAAC,IAAAtO,EAAK,OAAAA,EAAAsO,EAAEC,gBAAY,MAAAvO,SAAA,EAAAA,EAAI,OAI7B,MAAMgO,EAAcvP,KAAKwP,iBACzB,GAAID,GAAe,KAAM,CACvB,GAAIvP,KAAKmN,SAASG,uBAAuB5K,SAAW,EAAG,CACrD1C,KAAKmN,SAASG,uBAAyBtN,KAAKwN,eAAe1I,KACxD+K,IAAC,IAAAtO,EAAK,QAACA,EAAAsO,EAAEC,gBAAY,MAAAvO,SAAA,EAAAA,EAAI,KAAOgO,MAavCvP,KAAK+M,iBAAmB,GAAG/M,KAAKmN,SAASE,aACtCzI,MAAM,GAAI,GACVM,QAAO,CAAC4M,EAAKrC,IAAM,GAAGqC,KAAOrC,OAAO,UAEvCzP,KAAKgN,sBAAwB,GAAGhN,KAAKmN,SAASE,aAAanI,QACzD,CAAC4M,EAAKrC,IAAM,GAAGqC,KAAOrC,OACtB,OAIIzP,KAAA+R,eAAiB,KACvB,GAAI/R,KAAKmN,SAAS6E,iBAAmB,KAAM,CACzChS,KAAKmN,SAAS6E,gBAAkBhS,KAAKwN,eAClC1I,KAAI,CAAC+K,EAAGnH,WACP,MAAM0B,EAAWpK,KAAKiS,qBAAqBpC,GAE3C,GAAIzF,GAAY,KAAM,CACpBA,EAASxB,QAAQsF,MAAMgE,aACrBxJ,IAAM1I,KAAKwN,eAAe9K,OAAS,EAC/B,IACA,qCACN0H,EAASxB,QAAQrG,KAAO,SACxB6H,EAASxB,QAAQsF,MAAMiE,gBAAkB,GAAGzJ,EAAI,IAChD0B,EAASxB,QAAQsF,MAAMkE,cAAgB,GAAG1J,EAAI,KAC9CnH,EAAAvB,KAAKkQ,UAAM,MAAA3O,SAAA,OAAA,EAAAA,EAAE6P,YAAYhH,EAASxB,SAGpC,OAAOwB,KAERpB,QAAQN,GAAMA,GAAK,OAGxB,GAAI1I,KAAKmN,SAASkF,wBAA0B,KAAM,CAChDrS,KAAKmN,SAASkF,uBAAyBrS,KAAKwN,eACzC5I,MAAM,GAAI,GACVE,KAAI,CAACwN,EAAG5J,WACP,MAAM0B,EAAWpK,KAAKuS,wBAEtBnI,EAASxB,QAAQrG,KAAO,UACxB6H,EAASxB,QAAQsF,MAAMU,SAAW,WAClCxE,EAASxB,QAAQsF,MAAMsE,MAAQ,IAC/BpI,EAASxB,QAAQsF,MAAMuE,cAAgB,OACvCrI,EAASxB,QAAQsF,MAAMiE,gBAAkB,GAAGzJ,EAAI,IAChD0B,EAASxB,QAAQsF,MAAMkE,cAAgB,GAAG1J,EAAI,KAC9CnH,EAAAvB,KAAKkQ,UAAM,MAAA3O,SAAA,OAAA,EAAAA,EAAE6P,YAAYhH,EAASxB,SAElC,OAAOwB,OAKPpK,KAAA0S,iBAAmB,aACzB1S,KAAK2S,8BAELpR,EAAAvB,KAAKmN,SAAS6E,mBAAe,MAAAzQ,SAAA,OAAA,EAAAA,EAAE0E,SAASyC,GAAMA,EAAEE,QAAQ+B,YACxDzI,EAAAlC,KAAKmN,SAASkF,0BAAsB,MAAAnQ,SAAA,OAAA,EAAAA,EAAE+D,SAASyC,GAAMA,EAAEE,QAAQ+B,WAC/D3K,KAAKmN,SAAS6E,gBAAkBrR,UAChCX,KAAKmN,SAASkF,uBAAyB1R,UAEvCX,KAAK+R,iBACL/R,KAAK4S,2BA4BC5S,KAAA6S,gCACNzN,GAEQpE,YACNA,EAAMc,iBACNd,EAAM8R,kBAEN9S,KAAK+S,2BAA6BC,EAAMC,OACtCC,KAAKC,MAAMnS,EAAMoS,SACjBF,KAAKC,MAAMnS,EAAMqS,UAEnBrT,KAAKsT,oBAAsBlO,GAC3BlD,GAAAX,EAAAvB,KAAKmN,SAASkF,0BAAsB,MAAA9Q,SAAA,OAAA,EAAAA,EAAG6D,MAAM,MAAAlD,SAAA,OAAA,EAAAA,EAAE0G,QAAQ2K,UAAUC,IAC/D,YAGFtH,OAAOtE,iBAAiB,cAAe5H,KAAKyT,0BAC5CvH,OAAOtE,iBAAiB,YAAa5H,KAAK0T,yBAItC1T,KAAAyT,yBAA4BzS,IAClC,MAAM2S,EAAUX,EAAMC,OACpBC,KAAKC,MAAMnS,EAAMoS,SACjBF,KAAKC,MAAMnS,EAAMqS,UAGnB,GACErT,KAAK+S,4BAA8B,MACnC/S,KAAKsT,qBAAuB,KAC5B,CACA,MAAMM,EAAgB5T,KAAKsT,oBAC3B,MAAMtJ,EAAOgJ,EAAMa,SAAS7T,KAAK+S,2BAA4BY,GAE7D,GAAIT,KAAKY,IAAI9J,EAAK+J,IAAM,GAAK/T,KAAKgU,cAAchK,EAAM4J,GAAgB,CACpE5T,KAAKmN,SAASE,aAAerN,KAAKmN,SAASE,aAAavI,KAAI,CAAC2K,EAAG/G,IAC9DA,IAAMkL,EAAgBnE,EAAIzF,EAAK+J,EAAItE,IAGrC,GAAImE,EAAgB,EAAI5T,KAAKmN,SAASE,aAAa3K,OAAQ,CACzD1C,KAAKmN,SAASE,aAAerN,KAAKmN,SAASE,aAAavI,KAAI,CAAC2K,EAAG/G,IAC9DA,IAAMkL,EAAgB,EAAInE,EAAIzF,EAAK+J,EAAItE,IAI3CzP,KAAK+S,2BAA6BY,EAClC3T,KAAK6R,6BAKH7R,KAAA0T,uBAAyB,aAC/B,GAAI1T,KAAKsT,qBAAuB,KAAM,EACpCpR,GAAAX,EAAAvB,KAAKmN,SAASkF,0BAAsB,MAAA9Q,SAAA,OAAA,EAAAA,EAClCvB,KAAKsT,wBACN,MAAApR,SAAA,OAAA,EAAAA,EAAE0G,QAAQ2K,UAAU5I,OAAO,YAE9B3K,KAAK+S,2BAA6BpS,UAClCX,KAAKsT,oBAAsB3S,UAE3BX,KAAK2P,6BACL3P,KAAKsP,wBAELpD,OAAOrE,oBAAoB,cAAe7H,KAAKyT,0BAC/CvH,OAAOrE,oBAAoB,YAAa7H,KAAK0T,yBAGvC1T,KAAAgU,cAAgB,CAAChK,EAAmB5E,iBAC1C,MAAM6O,EAAgBjU,KAAKwN,eAAepI,GAC1C,MAAM8O,EAAalU,KAAKwN,eAAepI,EAAQ,GAC/C,MAAM+O,EAAenU,KAAKmN,SAASE,aAAajI,GAChD,MAAMgP,EAAYpU,KAAKmN,SAASE,aAAajI,EAAQ,GACrD,MAAMiP,GAAkB9S,EAAA0S,EAAcK,YAAQ,MAAA/S,SAAA,EAAAA,EAAI,EAClD,MAAMgT,GAAkBrS,EAAA+R,EAAcO,YAAQ,MAAAtS,SAAA,EAAAA,EAAIuS,OAAOC,iBACzD,MAAMC,GAAexQ,EAAA+P,EAAWI,YAAQ,MAAAnQ,SAAA,EAAAA,EAAI,EAC5C,MAAMyQ,GAAevQ,EAAA6P,EAAWM,YAAQ,MAAAnQ,SAAA,EAAAA,EAAIoQ,OAAOC,iBAEnD,MAAMG,EACJV,EAAenK,EAAK+J,EAAIM,GACxBF,EAAenK,EAAK+J,EAAIQ,EAC1B,MAAMO,EACJZ,GAAc,KACVE,EAAYpK,EAAK+J,EAAIY,GAAgBP,EAAYpK,EAAK+J,EAAIa,EAC1D,KAEN,OAAOC,GAAkBC,GAGnB9U,KAAA+U,oBAAsB1E,MAAOrP,IACnChB,KAAKkN,YAAc,KAEnBlN,KAAKgV,YAAclJ,GAAe,KAChC9L,KAAKkN,YAAc,QAClBlN,KAAKgV,aAERhV,KAAK4M,aAAgB5L,EAAME,OAAuB+T,gBAC5CjV,KAAKkV,gCAvpBNxV,oBACLM,KAAKiQ,uBACLjQ,KAAKmV,cAELnV,KAAKoV,qBAAuB,IAAIC,gBAAe,KAC7CrV,KAAKmN,SAASuE,aAAe/Q,UAC7BX,KAAKyR,sBACLzR,KAAKmP,0BAGPnP,KAAKsV,eAAiB,IAAID,gBAAe,KACvCrV,KAAKmP,uBACLnP,KAAKuV,oBACLvV,KAAKwV,mBACLxV,KAAKsP,wBACLtP,KAAK6R,6BAIFnS,mCACLM,KAAK4P,6BACL5P,KAAK6R,0BACL7R,KAAKyV,+BACLzV,KAAKoQ,oBACLpQ,KAAKyR,sBACLzR,KAAK0S,oBAELnR,EAAAvB,KAAKqP,gBAAY,MAAA9N,SAAA,OAAA,EAAAA,EAAEqG,iBAAiB,SAAU5H,KAAK+U,oBAAqB,CACtEW,QAAS,OAGX,GAAI1V,KAAK2R,eAAiB,KAAM,EAC9BzP,EAAAlC,KAAKoV,wBAAoB,MAAAlT,SAAA,OAAA,EAAAA,EAAEyT,QAAQ3V,KAAK2R,gBAG1CxN,EAAAnE,KAAKsV,kBAAc,MAAAnR,SAAA,OAAA,EAAAA,EAAEwR,QAAQ3V,KAAKkQ,QAG7BxQ,kCACCM,KAAKkV,+BAGNxV,qBACLM,KAAK0N,gBAEL1N,KAAK4V,eAAevV,OAGfX,2BACL,GAAIM,KAAKiN,sBAAuB,OACxBjN,KAAKoQ,qBAIR1Q,kCACL6B,EAAAvB,KAAKqP,gBAAY,MAAA9N,SAAA,OAAA,EAAAA,EAAEsG,oBAAoB,SAAU7H,KAAK+U,qBACtD/U,KAAK2S,8BACLzQ,EAAAlC,KAAKoV,wBAAoB,MAAAlT,SAAA,OAAA,EAAAA,EAAE2T,cAC3B1R,EAAAnE,KAAKsV,kBAAc,MAAAnR,SAAA,OAAA,EAAAA,EAAE0R,aACrB7V,KAAKmN,SAASE,aAAe,GAC7BrN,KAAKmN,SAASG,uBAAyB,GAM/B5N,6CACFM,KAAKkV,+BAUNxV,uBACL0L,EACApH,GAEA,GAAIhE,KAAKqP,cAAgB,KAAM,CAC7B9D,EAAYvL,KAAKqP,aAAcjE,EAAKpH,IAYjCtE,iCACLM,KAAKoQ,oBAGA1Q,SACL,OACEC,EAACC,EAAI,KACHD,EAAA,MAAA,CACEE,MAAM,SACN+C,IAAMA,GAAS5C,KAAK2R,cAAgB/O,EACpCsL,MAAO,CACL4H,oBAAqB9V,KAAKgN,sBAC1B+I,QAAS/V,KAAKwN,eAAe9K,QAAU,EAAI,OAAS,SAGtD/C,EAAA,OAAA,CAAMG,KAAK,YAEbH,EAAA,MAAA,CACEE,MAAM,QACN+C,IAAMA,GAAS5C,KAAKqP,aAAezM,EACnCsL,MAAO,CACL4H,oBAAqB9V,KAAK+M,mBAG5BpN,EAAA,OAAA,CACEqW,aAAc,KACZhW,KAAKyV,+BACLzV,KAAKiQ,uBACLjQ,KAAKiW,sBACLjW,KAAK4P,6BACL5P,KAAK0S,mBACL1S,KAAK6R,8BAIXlS,EAAA,MAAA,CACEE,MAAM,kBACNqO,MAAO,CACL4H,oBAAqB9V,KAAKgN,wBAG5BrN,EAAA,OAAA,CAAMG,KAAK,aAEZE,KAAKsT,qBAAuB,MAAQ3T,EAAA,MAAA,CAAKE,MAAM,oBAK9CH,sBACN,MAAMwW,EAAiBlW,KAAKmW,kBAC5B,MAAMC,EACJF,GAAkB,MAClBA,EAAiB,IAChBlW,KAAKiN,sBAER,GAAImJ,EAAmB,CACrB,MAAMC,EAAgBnD,KAAKoD,KAAKJ,EAAiBlW,KAAKyM,WAEtD,MAAMI,EAAqBqG,KAAKC,MAAMnT,KAAK4M,aAAe5M,KAAKyM,WAC/D,MAAMK,EAAmBD,EAAqBwJ,EAE9C,MAAME,EAAarD,KAAKsD,IAAI,EAAG3J,EAAqB7M,KAAK0M,eACzD,MAAM+J,EAAWvD,KAAKwD,IACpB1W,KAAKwM,UAAY,EACjBM,EAAmB9M,KAAK0M,eAG1B,MAAMH,EAAOvM,KAAK2W,gBAAgBJ,EAAYE,GAE9CzW,KAAK6M,mBAAqB0J,EAC1BvW,KAAK8M,iBAAmB2J,EACxBzW,KAAKmN,SAASC,aAAeb,GAIzB7M,2CACNM,KAAK4W,sBAEL,KAAIrV,EAAAvB,KAAKmC,cAAU,MAAAZ,SAAA,OAAA,EAAAA,EAAEsV,cAAe7W,KAAKwM,UAAY,EAAG,OAChDxM,KAAKmC,WAAW2U,qBACpB9W,KAAK6M,mBACL7M,KAAK8M,mBA8HHpN,cACN,GAAIM,KAAKmN,SAAS4J,oBAAsB,KAAM,CAC5C/W,KAAKmN,SAAS4J,mBAAqB/W,KAAKwN,eAAetI,QACrD,CAACJ,EAAK+K,IACJ/K,EAAIyF,IACFsF,EACA,IAAIvG,EAAYuG,GAAG,IAAM7P,KAAKkR,yBAAyBrB,OAE3D,IAAImH,UAKFtX,sBACNM,KAAKwN,eAAevH,SAAS4J,cAC3B,KAAItO,EAAAvB,KAAKmN,SAAS4J,sBAAkB,MAAAxV,SAAA,OAAA,EAAAA,EAAE8I,IAAIwF,KAAM,KAAM,EACpD3N,EAAAlC,KAAKmN,SAAS4J,sBAAkB,MAAA7U,SAAA,OAAA,EAAAA,EAAEqI,IAChCsF,EACA,IAAIvG,EAAYuG,GAAG,IAAM7P,KAAKkR,yBAAyBrB,UAEpD,EACL1L,EAAAnE,KAAKmN,SAAS4J,mBACX1M,IAAIwF,MAAE,MAAA1L,SAAA,OAAA,EAAAA,EACL8S,sBAAqB,IAAMjX,KAAKkR,yBAAyBrB,SAK3DnQ,eACNyK,GAMAnK,KAAKwN,eAAevH,SAAQ,CAACiR,EAAQxO,WACnC,MAAMoF,GAAOvM,EAAAvB,KAAKmN,SAAS4J,sBAAkB,MAAAxV,SAAA,OAAA,EAAAA,EAAE8I,IAAI6M,GACnD,GAAIpJ,GAAQ,KAAM,CAChB3D,EAAE+M,EAAQpJ,EAAMpF,OACX,CACL,MAAM,IAAIyO,MAAM,mCAKdzX,+BACN,MAAMmL,EAAW7K,KAAKkQ,OAAOkH,cAC3B,4BAEF,GAAIvM,GAAY,KAAM,CACpB,MAAMwM,EAAyBC,SAASrN,cAAc,YACtDoN,EAAuB9U,KAAO,UAC9B8U,EAAuBE,UAAY,+HAInCvX,KAAKkQ,OAAOkB,YAAYiG,IAIpB3X,qBACNwX,GAEA,MAAMrM,EAAWqM,EAAOE,cACtB,2BAEF,GAAIvM,GAAY,KAAM,CACpB,OAAOD,EAA6BC,IAIhCnL,wBACN,MAAMmL,EAAW7K,KAAKkQ,OAAOkH,cAC3B,4BAEF,GAAIvM,GAAY,KAAM,CACpB,OAAOD,EAA6BC,OAC/B,CACL,MAAM,IAAIsM,MAAM,8CAIZzX,yBACNwX,GAEA,MAAMrM,EAAWqM,EAAOE,cACtB,iCAEF,GAAIvM,GAAY,KAAM,CACpB,OAAOD,EAA6BC,OAC/B,CACL,MAAM,IAAIsM,MAAM,4CAsJZzX,gCACNM,KAAKmN,SAASqK,wBACZjW,EAAAvB,KAAKmN,SAASkF,0BAAsB,MAAA9Q,SAAA,OAAA,EAAAA,EAAEuD,KAAI,CAAC2S,EAAG/O,KAC5C,MAAMhB,EAAW1H,KAAK6S,gCAAgCnK,GAEtD+O,EAAE7O,QAAQhB,iBAAiB,cAAeF,GAE1C,OAAOA,KAILhI,mCACN,GAAIM,KAAKmN,SAASqK,wBAA0B,KAAM,CAChD,MAAME,EAAY1X,KAAKmN,SAASqK,wBAEhCjW,EAAAvB,KAAKmN,SAASkF,0BAAsB,MAAA9Q,SAAA,OAAA,EAAAA,EAAE0E,SAAQ,CAACwR,EAAG/O,KAChD,MAAMhB,EAAWgQ,EAAUhP,GAC3B,GAAIhB,GAAY,KAAM,CACpB+P,EAAE7O,QAAQf,oBAAoB,cAAeH,OAGjD1H,KAAKmN,SAASqK,uBAAyB7W,WAuGnCjB,gBAAgB6W,EAAoBE,GAC1C,MAAMlK,EAAOvM,KAAKuM,KAAK3H,MAAM2R,EAAYE,EAAW,GACpD,OAAOlK,EAAKzH,KAAK0J,GAASA,GAAO,KAAOxO,KAAK2X,gBAAgBnJ,GAAOA,IAG9D9O,gBAAgB8O,SACtB,GAAIxO,KAAK4X,SAAW,MAAQpJ,GAAO,KAAM,CACvC,MAAMxI,IAAOzE,EAAAvB,KAAK4X,WAAO,MAAArW,SAAA,OAAA,EAAAA,EAAAsW,KAAZ7X,KAAewO,KAAQ,GACpC,OAAA/C,OAAAC,OAAAD,OAAAC,OAAA,GAAY8C,GAAG,CAAExI,KAAAA,QACZ,CACL,OAAOwI,GAIH9O,kBACN,GAAIM,KAAK8X,cAAgB,MAAQ9X,KAAKqP,cAAgB,KAAM,CAC1DrP,KAAK8X,aAAeC,EAA2B/X,KAAKqP,cAEtD,OAAOrP,KAAK8X,aAGNpY,iBACN,GAAIM,KAAKuP,aAAe,KAAM,CAC5B,MAAMyI,EAAgB3M,EAA+BrL,KAAKkQ,QAC1D,GAAI8H,EAAgB,EAAG,CACrBhY,KAAKuP,YAAcyI,GAGvB,OAAOhY,KAAKuP,YAGN7P,oBACNM,KAAK8X,aAAenX,UAGdjB,mBACNM,KAAKuP,YAAc5O,kNC/5BvB,MAAMsX,EAAsB,qOCafC,EAAgB,+BACjBxY,SACR,OACEC,EAACC,EAAI,KACHD,EAAA,MAAA,CAAKE,MAAM,WACTF,EAAA,OAAA,CAAMG,KAAK,YAEbH,EAAA,MAAA,CAAKE,MAAM,2BACTF,EAAA,OAAA,OAEFA,EAAA,MAAA,CAAKE,MAAM,WACTF,EAAA,OAAA,CAAMG,KAAK","sourcesContent":[".notification-banner {\n background-color: var(--blue-200);\n padding-top: 0px;\n padding-bottom: 0px;\n padding-right: 16px;\n padding-left: 8px;\n display: flex;\n justify-content: space-between;\n font-size: 0.875rem;\n line-height: 0.5;\n color: var(--neutral-600);\n}\n\n.notification-banner-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.notification-banner-info .icon {\n color: var(--blue-600);\n}\n\n.notification-banner-actions {\n display: flex;\n align-items: center;\n}\n\n.notification-banner-button {\n background: none;\n border: none;\n padding: 0;\n margin: 0;\n cursor: pointer;\n color: var(--blue-600);\n font-size: 0.875rem;\n display: flex;\n align-items: center;\n}\n\n.notification-banner-button:hover {\n color: var(--blue-800);\n}","import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\n\n/**\n * A notification banner that displays a message and an action button.\n */\n@Component({\n tag: 'vertex-scene-tree-notification-banner',\n styleUrl: 'scene-tree-notification-banner.css',\n shadow: true,\n})\nexport class SceneTreeNotificationBanner {\n /**\n * The message to display in the banner.\n */\n @Prop()\n public message?: string;\n\n /**\n * The label of the action button.\n */\n @Prop()\n public actionLabel?: string;\n\n /**\n * An event that is emitted when the action button is clicked.\n */\n @Event()\n public action!: EventEmitter<void>;\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"notification-banner\">\n <div class=\"notification-banner-info\">\n <vertex-viewer-icon class=\"icon\" name=\"info\" size=\"sm\" />\n <p>{this.message}</p>\n </div>\n {this.actionLabel != null && (\n <div class=\"notification-banner-actions\">\n <button\n class=\"notification-banner-button\"\n onClick={() => this.action.emit()}\n >\n {this.actionLabel}\n </button>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n","@import url('../../css/button-reset.css');\n\n:host {\n /**\n * @prop --scene-tree-search-search-icon-offset: A CSS length that specifies\n * the horizontal offset of the search icon\n */\n --scene-tree-search-search-icon-offset: 8px;\n\n /**\n * @prop --scene-tree-search-clear-button-offset: A CSS length that specifies\n * the horizontal offset of the clear button.\n */\n --scene-tree-search-clear-button-offset: 8px;\n\n /**\n * @prop --scene-tree-search-input-padding: A CSS padding value that specifies\n * horizontal and vertical lengths of the internal text input.\n */\n --scene-tree-search-input-padding: 0.5rem 32px;\n\n /**\n * @prop --scene-tree-search-input-border: A CSS border value that specifies\n * the border of the internal text input.\n */\n --scene-tree-search-input-border: none;\n\n /**\n * @prop --scene-tree-search-input-border-radius: A CSS length that specifies\n * the radius of the internal text input.\n */\n --scene-tree-search-input-border-radius: 0.25rem;\n\n /**\n * @prop --scene-tree-search-input-background: A CSS background that specifies\n * the background color or image of the internal text input.\n */\n --scene-tree-search-input-background: none;\n\n /**\n * @prop --scene-tree-search-focused-input-background: A CSS background value\n * that specifies the background of the internal text input when focused.\n */\n --scene-tree-search-focused-input-background: var(--neutral-200);\n\n /**\n * @prop --scene-tree-search-focused-input-outline: A CSS outline value that\n * specifies the outline of the internal text input when focused.\n */\n --scene-tree-search-focused-input-outline: none;\n\n display: block;\n width: 100%;\n font-size: 0.875rem;\n}\n\n.root {\n width: 100%;\n position: relative;\n}\n\n.input {\n background: var(--scene-tree-search-input-background);\n border: var(--scene-tree-search-input-border);\n border-radius: var(--scene-tree-search-input-border-radius);\n box-sizing: border-box;\n font-size: inherit;\n padding: var(--scene-tree-search-input-padding);\n outline: none;\n width: 100%;\n}\n\n.input.background {\n background: var(--scene-tree-search-focused-input-background);\n outline: var(--scene-tree-search-focused-input-outline);\n}\n\n.overlay {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.overlay-clear {\n display: none;\n right: var(--scene-tree-search-clear-button-offset);\n}\n\n.overlay-clear.show {\n display: flex;\n}\n\n.icon {\n color: var(--neutral-700);\n}\n\n.icon-search {\n position: absolute;\n left: var(--scene-tree-search-search-icon-offset);\n pointer-events: none;\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: initial;\n cursor: pointer;\n}\n.clear-btn:hover {\n color: var(--neutral-800);\n}\n.clear-btn:disabled {\n pointer-events: none;\n opacity: 0.5;\n}","import {\n Component,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { debounceEvent } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\n\n/**\n * @slot search-icon - A slot that replaces the component's default search icon.\n * @slot clear-icon - A slot that replaces the component's default clear icon.\n */\n@Component({\n tag: 'vertex-scene-tree-search',\n styleUrl: 'scene-tree-search.css',\n shadow: true,\n})\nexport class SceneTreeSearch {\n /**\n * Specifies the delay, in milliseconds, to emit `search` events after user\n * input.\n *\n * If this value is specified, searches will automatically occur after a\n * keystroke has occurred and the debounce threshold has elapsed.\n *\n * Defaults to `undefined`, and searches only occur on an `Enter` press\n * or a `blur` event.\n */\n @Prop()\n public debounce?: number;\n\n /**\n * If `true`, disables user interaction of the component.\n */\n @Prop()\n public disabled = false;\n\n /**\n * Placeholder text if `value` is empty.\n */\n @Prop()\n public placeholder?: string = undefined;\n\n /**\n * The scene tree controller\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * The current text value of the component. Value is updated on user\n * interaction.\n */\n @Prop({ mutable: true })\n public value = '';\n\n /**\n * An event that is emitted when a user has inputted or cleared the search\n * term. The event may be delayed according to the current `debounce` value.\n */\n @Event({ bubbles: true })\n public search!: EventEmitter<string>;\n\n @State()\n private focused = false;\n\n @State()\n private isSearching = false;\n\n private lastEmittedValue?: string;\n private inputEl?: HTMLInputElement;\n private onStateChangeDisposable?: Disposable;\n private searchDisposable?: Disposable;\n\n /**\n * Gives focus to the component's internal text input.\n */\n @Method()\n public async setFocus(): Promise<void> {\n // HTMLInputElement.focus() doesn't exist in tests.\n if (typeof this.inputEl?.focus === 'function') {\n this.inputEl?.focus();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n public controllerChanged(controller: SceneTreeController): void {\n this.setupController();\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.handleDebounceChanged();\n\n this.setupController();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.onStateChangeDisposable?.dispose();\n }\n\n /**\n * Clears the current search term and clears any debounced filters.\n */\n @Method()\n public clear(): void {\n this.value = '';\n this.searchDisposable?.dispose();\n this.emitCurrentValue();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"root\">\n <div class=\"overlay icon icon-search\">\n <slot name=\"search-icon\">\n {this.isSearching ? (\n <vertex-viewer-spinner slot=\"search-icon\" size=\"xs\" />\n ) : (\n <vertex-viewer-icon name=\"search\" size=\"sm\" />\n )}\n </slot>\n </div>\n\n <input\n class={classNames('input', {\n background: this.focused || this.value.length > 0,\n })}\n type=\"text\"\n ref={(ref) => (this.inputEl = ref)}\n placeholder={this.placeholder}\n disabled={this.disabled}\n value={this.value}\n onInput={this.handleTextInput}\n onFocus={this.handleTextFocus}\n onBlur={this.handleTextBlur}\n onKeyPress={this.handleKeyPress}\n />\n\n <div\n class={classNames('overlay overlay-clear', {\n show: this.value.length > 0,\n })}\n >\n <button\n class=\"clear-btn icon\"\n tabIndex={-1}\n onMouseDown={this.handleClear}\n disabled={this.disabled}\n >\n <slot name=\"clear-icon\">\n <vertex-viewer-icon name=\"close-circle\" size=\"sm\" />\n </slot>\n </button>\n </div>\n </div>\n </Host>\n );\n }\n\n private handleTextInput = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n\n if (this.debounce != null || this.value === '') {\n this.emitCurrentValue();\n }\n };\n\n private handleTextFocus = (): void => {\n this.focused = true;\n };\n\n private handleTextBlur = (): void => {\n this.focused = false;\n\n this.searchDisposable?.dispose();\n\n if (this.value !== this.lastEmittedValue) {\n this.emitCurrentValue();\n }\n };\n\n private handleKeyPress = (event: KeyboardEvent): void => {\n if (event.key === 'Enter') {\n this.searchDisposable?.dispose();\n this.emitCurrentValue();\n }\n };\n\n private handleClear = (event: MouseEvent): void => {\n event.preventDefault();\n\n this.value = '';\n this.searchDisposable?.dispose();\n this.emitCurrentValue();\n this.setFocus();\n };\n\n private handleDebounceChanged(): void {\n this.searchDisposable?.dispose();\n\n const emitter = debounceEvent(this.search, this.debounce ?? 0);\n\n // Track this emitter in two separate variables to maintain the `EventEmitter` typing for\n // `this.search`. This allows for correct generation of `CustomEvent` types.\n this.search = emitter;\n this.searchDisposable = emitter;\n }\n\n private setupController(): void {\n this.onStateChangeDisposable?.dispose();\n\n this.onStateChangeDisposable = this.controller?.onStateChange.on(\n (state) => {\n this.isSearching = state.isSearching;\n }\n );\n }\n\n private emitCurrentValue(): void {\n this.lastEmittedValue = this.value;\n this.search.emit(this.value);\n }\n}\n","import { __assign } from 'tslib';\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\n/**\n * Lower case as a function.\n */\nfunction lowerCase(str) {\n return str.toLowerCase();\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nvar DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n// Remove all non-word characters.\nvar DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nfunction noCase(input, options) {\n if (options === void 0) { options = {}; }\n var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? \" \" : _d;\n var result = replace(replace(input, splitRegexp, \"$1\\0$2\"), stripRegexp, \"\\0\");\n var start = 0;\n var end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n // Transform each token independently.\n return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input, re, value) {\n if (re instanceof RegExp)\n return input.replace(re, value);\n return re.reduce(function (input, re) { return input.replace(re, value); }, input);\n}\n\nfunction pascalCaseTransform(input, index) {\n var firstChar = input.charAt(0);\n var lowerChars = input.substr(1).toLowerCase();\n if (index > 0 && firstChar >= \"0\" && firstChar <= \"9\") {\n return \"_\" + firstChar + lowerChars;\n }\n return \"\" + firstChar.toUpperCase() + lowerChars;\n}\nfunction pascalCase(input, options) {\n if (options === void 0) { options = {}; }\n return noCase(input, __assign({ delimiter: \"\", transform: pascalCaseTransform }, options));\n}\n\nfunction camelCaseTransform(input, index) {\n if (index === 0)\n return input.toLowerCase();\n return pascalCaseTransform(input, index);\n}\nfunction camelCase(input, options) {\n if (options === void 0) { options = {}; }\n return pascalCase(input, __assign({ transform: camelCaseTransform }, options));\n}\n\nconst bindingRegEx = /{{(.+)}}/;\r\nclass CollectionBinding {\r\n constructor(bindings) {\r\n this.bindings = bindings;\r\n }\r\n bind(data) {\r\n this.bindings.forEach((binding) => binding.bind(data));\r\n }\r\n}\r\nclass NodeBinding {\r\n constructor(node, expr) {\r\n this.node = node;\r\n this.expr = expr;\r\n }\r\n}\r\nclass TextNodeBinding extends NodeBinding {\r\n constructor(node, expr) {\r\n super(node, expr);\r\n }\r\n bind(data) {\r\n const newContent = replaceBindingString(data, this.expr);\r\n if (newContent !== this.node.textContent) {\r\n this.node.textContent = newContent;\r\n }\r\n }\r\n}\r\nclass AttributeBinding extends NodeBinding {\r\n constructor(node, expr, attr) {\r\n super(node, expr);\r\n this.attr = attr;\r\n }\r\n bind(data) {\r\n const newValue = replaceBindingString(data, this.expr);\r\n const oldValue = this.node.getAttribute(this.attr);\r\n if (oldValue !== newValue) {\r\n this.node.setAttribute(this.attr, newValue);\r\n }\r\n }\r\n}\r\nclass PropertyBinding extends NodeBinding {\r\n constructor(node, expr, prop) {\r\n super(node, expr);\r\n this.prop = prop;\r\n }\r\n bind(data) {\r\n const newValue = replaceBinding(data, this.expr);\r\n /* eslint-disable @typescript-eslint/no-explicit-any */\r\n const oldValue = this.node[this.prop];\r\n if (oldValue !== newValue) {\r\n this.node[this.prop] = newValue;\r\n }\r\n /* eslint-enable @typescript-eslint/no-explicit-any */\r\n }\r\n}\r\nclass EventHandlerBinding extends NodeBinding {\r\n constructor(node, expr, eventName) {\r\n super(node, expr);\r\n this.eventName = eventName;\r\n }\r\n bind(data) {\r\n var _a;\r\n const path = extractBindingPath(this.expr);\r\n if (path != null) {\r\n (_a = this.disposable) === null || _a === void 0 ? void 0 : _a.dispose();\r\n const listener = getBindableValue(data, path, true);\r\n this.node.addEventListener(this.eventName, listener);\r\n this.disposable = {\r\n dispose: () => {\r\n this.node.removeEventListener(this.eventName, listener);\r\n },\r\n };\r\n }\r\n }\r\n}\r\nfunction generateBindings(node) {\r\n const bindings = [];\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const el = node;\r\n const bindableAttributes = getBindableAttributes(el);\r\n bindableAttributes.forEach((attr) => {\r\n if (attr.name.startsWith('event:')) {\r\n const eventName = camelCase(attr.name.replace('event:', ''));\r\n bindings.push(new EventHandlerBinding(el, attr.value, eventName));\r\n }\r\n else if (attr.name.startsWith('attr:')) {\r\n bindings.push(new AttributeBinding(el, attr.value, attr.name.replace('attr:', '')));\r\n }\r\n else if (attr.name.startsWith('prop:')) {\r\n const propName = camelCase(attr.name.replace('prop:', ''));\r\n bindings.push(new PropertyBinding(el, attr.value, propName));\r\n }\r\n });\r\n }\r\n else if (node.nodeType === Node.TEXT_NODE &&\r\n node.textContent != null &&\r\n bindingRegEx.test(node.textContent)) {\r\n bindings.push(new TextNodeBinding(node, node.textContent));\r\n }\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n bindings.push(...generateBindings(node.childNodes[i]));\r\n }\r\n return bindings;\r\n}\r\nfunction getBindableAttributes(element) {\r\n return Array.from(element.attributes).filter((attr) => bindingRegEx.test(attr.value));\r\n}\r\nfunction extractBindingPath(expr) {\r\n const result = bindingRegEx.exec(expr);\r\n return result != null ? result[1] : undefined;\r\n}\r\nfunction replaceBindingString(data, expr) {\r\n const path = extractBindingPath(expr);\r\n if (path != null) {\r\n const value = getBindableValue(data, path, true);\r\n return expr.replace(`{{${path}}}`, value === null || value === void 0 ? void 0 : value.toString());\r\n }\r\n else {\r\n return expr;\r\n }\r\n}\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nfunction replaceBinding(data, expr) {\r\n const path = extractBindingPath(expr);\r\n if (path != null) {\r\n const value = getBindableValue(data, path, true);\r\n return value;\r\n }\r\n else {\r\n return expr;\r\n }\r\n}\r\nfunction getBindableValue(data, path, isHead = false\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n) {\r\n const [head, ...tail] = path.split('.');\r\n if (isHead && tail.length === 0) {\r\n return data;\r\n }\r\n else if (isHead && tail.length > 0) {\r\n return getBindableValue(data, tail.join('.'), false);\r\n }\r\n else {\r\n const value = data[head];\r\n if (tail.length > 0) {\r\n return getBindableValue(value, tail.join('.'), false);\r\n }\r\n else {\r\n return value;\r\n }\r\n }\r\n}\n\nclass ElementPool {\r\n constructor(container, elementFactory) {\r\n this.container = container;\r\n this.elementFactory = elementFactory;\r\n this.instanceMap = new Map();\r\n this.elements = [];\r\n }\r\n swapHeadToTail(count) {\r\n const sliced = this.elements.splice(0, count);\r\n this.elements.splice(this.elements.length, 0, ...sliced);\r\n return this.elements.concat();\r\n }\r\n swapTailToHead(count) {\r\n const sliced = this.elements.splice(-count, count);\r\n this.elements.splice(0, 0, ...sliced);\r\n return this.elements.concat();\r\n }\r\n updateElements(count) {\r\n const diff = count - this.elements.length;\r\n if (diff > 0) {\r\n for (let i = 0; i < diff; i++) {\r\n this.createElement();\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < -diff; i++) {\r\n this.deleteElement();\r\n }\r\n }\r\n return this.elements.concat();\r\n }\r\n updateData(f) {\r\n this.elements.forEach((el, i) => {\r\n const instance = this.instanceMap.get(el);\r\n const data = f(i);\r\n instance === null || instance === void 0 ? void 0 : instance.bindings.bind(data);\r\n });\r\n }\r\n updateElementFactory(elementFactory) {\r\n this.elementFactory = elementFactory;\r\n this.updateElements(0);\r\n }\r\n iterateElements(f) {\r\n this.elements.forEach((el, i) => {\r\n const instance = this.instanceMap.get(el);\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n f(el, instance.bindings, i);\r\n });\r\n }\r\n createElement() {\r\n const instance = this.elementFactory();\r\n this.elements.push(instance.element);\r\n this.instanceMap.set(instance.element, instance);\r\n this.container.append(instance.element);\r\n return instance;\r\n }\r\n deleteElement() {\r\n const element = this.elements.pop();\r\n if (element != null) {\r\n this.instanceMap.delete(element);\r\n element.remove();\r\n }\r\n }\r\n}\n\nfunction append(container, element, data) {\r\n const bindings = new CollectionBinding(generateBindings(element));\r\n bindings.bind(data);\r\n container.appendChild(element);\r\n const created = container.lastElementChild;\r\n if (created != null) {\r\n return { element: created, bindings };\r\n }\r\n else {\r\n throw new Error('Failed to append element');\r\n }\r\n}\r\nfunction generateInstanceFromTemplate(template) {\r\n const fragment = template.content.cloneNode(true);\r\n const element = fragment.firstElementChild;\r\n const bindings = new CollectionBinding(generateBindings(fragment));\r\n return { element, bindings };\r\n}\n\nexport { AttributeBinding, CollectionBinding, ElementPool, EventHandlerBinding, NodeBinding, PropertyBinding, TextNodeBinding, append, generateBindings, generateInstanceFromTemplate };\n//# sourceMappingURL=bundle.esm.js.map\n","export type DomScrollToOptions = ScrollToOptions;\n\nexport function getSceneTreeTableOffsetTop(el: HTMLElement): number {\n return el.getBoundingClientRect().top ?? 0;\n}\n\nexport function getSceneTreeTableViewportWidth(el: HTMLElement): number {\n return el.clientWidth;\n}\n\nexport function scrollToTop(\n el: HTMLElement,\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>\n): void {\n el.scrollTo({ top, ...options });\n}\n","import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nexport class SceneTreeCellHoverController {\n public onStateChange = new EventDispatcher<string | undefined>();\n\n public setHovered(id?: string): void {\n this.onStateChange.emit(id);\n }\n\n public stateChanged(listener: Listener<string | undefined>): Disposable {\n return this.onStateChange.on(listener);\n }\n}\n","export function restartTimeout(\n fn: VoidFunction,\n existingTimeout?: number,\n delay = 200\n): number {\n window.clearTimeout(existingTimeout);\n return window.setTimeout(fn, delay);\n}\n",":host {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n font-size: 0.825rem;\n\n /**\n * @prop --scene-tree-table-row-padding: CSS lengths that specifies the amount of\n * padding between the row's border and content.\n */\n --scene-tree-table-row-padding: 2px 0px;\n\n /**\n * @prop --scene-tree-table-column-gap: CSS length that specifies the amount of\n * padding between columns in the table.\n */\n --scene-tree-table-column-gap: 0.5rem;\n\n /**\n * @prop --scene-tree-table-column-resize-cursor: A CSS cursor value that will\n * be displayed when resizing a column. Defaults to `col-resize`.\n */\n --scene-tree-table-column-resize-cursor: col-resize;\n}\n\n.header {\n position: relative;\n display: grid;\n width: 100%;\n border-bottom: var(--scene-tree-toolbar-separator);\n}\n\n.table {\n position: relative;\n display: grid;\n width: 100%;\n height: 100%;\n overflow: auto;\n}\n\n.resize-overlay {\n position: absolute;\n top: 0;\n cursor: var(--scene-tree-table-column-resize-cursor);\n z-index: 1000;\n width: 100%;\n height: 100%;\n}\n\n.divider-overlay {\n position: absolute;\n top: 0;\n display: grid;\n pointer-events: none;\n z-index: 2000;\n width: 100%;\n height: 100%;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport {\n Binding,\n ElementPool,\n generateInstanceFromTemplate,\n InstancedTemplate,\n} from '@vertexvis/html-templates';\n\nimport { readDOM } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\nimport { getSceneTreeViewportHeight } from '../scene-tree/lib/dom';\nimport { isLoadedRow, LoadedRow, Row } from '../scene-tree/lib/row';\nimport { RowDataProvider } from '../scene-tree/types';\nimport {\n DomScrollToOptions,\n getSceneTreeTableOffsetTop,\n getSceneTreeTableViewportWidth,\n scrollToTop,\n} from './lib/dom';\nimport { SceneTreeCellHoverController } from './lib/hover-controller';\nimport { restartTimeout } from './lib/window';\n\ninterface StateMap {\n columnElementPools?: WeakMap<\n HTMLVertexSceneTreeTableColumnElement,\n ElementPool\n >;\n headerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerListeners?: Array<(event: PointerEvent) => void>;\n\n viewportRows: Row[];\n\n headerHeight?: number;\n columnWidths: number[];\n columnWidthPercentages: number[];\n}\n\n@Component({\n tag: 'vertex-scene-tree-table-layout',\n styleUrl: 'scene-tree-table-layout.css',\n shadow: true,\n})\nexport class SceneTreeTableLayout {\n /**\n * A reference to the scene tree to perform operations for interactions. Such\n * as expansion, visibility and selection.\n */\n @Prop()\n public tree?: HTMLVertexSceneTreeElement;\n\n /**\n * @internal\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * @internal\n */\n @Prop()\n public rows: Row[] = [];\n\n /**\n * @internal\n */\n @Prop()\n public totalRows = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public rowHeight = 24;\n\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n *\n * This prop will be automatically populated based on the `overScanCount` prop\n * specified in the parent `<vertex-scene-tree />` element.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A callback that is invoked immediately before a row is about to be rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * This prop will be automatically populated based on the `rowData` prop\n * specified in the parent `<vertex-scene-tree />` element.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public scrollOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutHeight?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutWidth?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportStartIndex = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportEndIndex = 0;\n\n /**\n * @internal\n */\n @Event()\n public layoutRendered!: EventEmitter<void>;\n\n /**\n * An event that is emitted when the columns of this `<vertex-scene-tree-table-layout>`\n * are resized with an array containing the widths of the columns in pixels.\n */\n @Event({ bubbles: true })\n public columnsResized!: EventEmitter<number[]>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private columnGridLayout = '1fr';\n\n @State()\n private columnGridFixedLayout = '';\n\n @State()\n private isComputingCellHeight = true;\n\n @State()\n private lastDividerPointerPosition?: Point.Point;\n\n @State()\n private resizingColumnIndex?: number;\n\n @State()\n private isScrolling = false;\n\n @State()\n private scrollTimer: number | undefined;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n viewportRows: [],\n columnWidths: [],\n columnWidthPercentages: [],\n };\n\n private lastStartIndex = 0;\n private resizeObserver?: ResizeObserver;\n private headerResizeObserver?: ResizeObserver;\n\n private tableElement?: HTMLDivElement;\n private headerElement?: HTMLDivElement;\n private columnElements: HTMLVertexSceneTreeTableColumnElement[] = [];\n\n private cellHoverController = new SceneTreeCellHoverController();\n\n public componentWillLoad(): void {\n this.updateColumnElements();\n this.createPools();\n\n this.headerResizeObserver = new ResizeObserver(() => {\n this.stateMap.headerHeight = undefined;\n this.computeHeaderHeight();\n this.updateLayoutPosition();\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateLayoutPosition();\n this.clearLayoutHeight();\n this.clearLayoutWidth();\n this.recomputeColumnWidths();\n this.computeColumnGridLayout();\n });\n }\n\n public async componentDidLoad(): Promise<void> {\n this.computeInitialColumnWidths();\n this.computeColumnGridLayout();\n this.ensureDividerTemplateDefined();\n this.computeCellHeight();\n this.computeHeaderHeight();\n this.rebindHeaderData();\n\n this.tableElement?.addEventListener('scroll', this.handleScrollChanged, {\n passive: true,\n });\n\n if (this.headerElement != null) {\n this.headerResizeObserver?.observe(this.headerElement);\n }\n\n this.resizeObserver?.observe(this.hostEl);\n }\n\n public async componentWillRender(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n public componentDidRender(): void {\n this.layoutColumns();\n\n this.layoutRendered.emit();\n }\n\n public async componentDidUpdate(): Promise<void> {\n if (this.isComputingCellHeight) {\n await this.computeCellHeight();\n }\n }\n\n public disconnectedCallback(): void {\n this.tableElement?.removeEventListener('scroll', this.handleScrollChanged);\n this.removeDividerDragListeners();\n this.headerResizeObserver?.disconnect();\n this.resizeObserver?.disconnect();\n this.stateMap.columnWidths = [];\n this.stateMap.columnWidthPercentages = [];\n }\n\n @Watch('rows')\n @Watch('totalRows')\n @Watch('rowHeight')\n protected async handleViewportRowsPropsChanged(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n /**\n * Scrolls the table to the provided top value.\n *\n * @param top The position to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToPosition(\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>\n ): Promise<void> {\n if (this.tableElement != null) {\n scrollToTop(this.tableElement, top, options);\n }\n }\n\n /**\n * Attempts to compute the height of templated cells. Used for internals\n * or testing.\n *\n * @internal\n * @ignore\n */\n @Method()\n public async attemptComputeCellHeight(): Promise<void> {\n this.computeCellHeight();\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"header\"\n ref={(ref) => (this.headerElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n display: this.columnElements.length <= 1 ? 'none' : 'grid',\n }}\n >\n <slot name=\"header\" />\n </div>\n <div\n class=\"table\"\n ref={(ref) => (this.tableElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridLayout,\n }}\n >\n <slot\n onSlotchange={() => {\n this.ensureDividerTemplateDefined();\n this.updateColumnElements();\n this.recreateColumnPools();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n this.computeColumnGridLayout();\n }}\n />\n </div>\n <div\n class=\"divider-overlay\"\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n }}\n >\n <slot name=\"divider\" />\n </div>\n {this.resizingColumnIndex != null && <div class=\"resize-overlay\" />}\n </Host>\n );\n }\n\n private computeViewportRows(): void {\n const viewportHeight = this.getLayoutHeight();\n const canComputeIndices =\n viewportHeight != null &&\n viewportHeight > 0 &&\n !this.isComputingCellHeight;\n\n if (canComputeIndices) {\n const viewportCount = Math.ceil(viewportHeight / this.rowHeight);\n\n const viewportStartIndex = Math.floor(this.scrollOffset / this.rowHeight);\n const viewportEndIndex = viewportStartIndex + viewportCount;\n\n const startIndex = Math.max(0, viewportStartIndex - this.overScanCount);\n const endIndex = Math.min(\n this.totalRows - 1,\n viewportEndIndex + this.overScanCount\n );\n\n const rows = this.getViewportRows(startIndex, endIndex);\n\n this.viewportStartIndex = startIndex;\n this.viewportEndIndex = endIndex;\n this.stateMap.viewportRows = rows;\n }\n }\n\n private async computeAndUpdateViewportRows(): Promise<void> {\n this.computeViewportRows();\n\n if (this.controller?.isConnected && this.totalRows > 0) {\n await this.controller.updateActiveRowRange(\n this.viewportStartIndex,\n this.viewportEndIndex\n );\n }\n }\n\n private layoutColumns = (): void => {\n const visibleRowCount = this.viewportEndIndex - this.viewportStartIndex + 1;\n const diff = this.viewportStartIndex - this.lastStartIndex;\n this.lastStartIndex = this.viewportStartIndex;\n\n this.iterateColumns((col, pool, colIndex) => {\n pool.updateElements(visibleRowCount);\n\n if (diff > 0) {\n pool.swapHeadToTail(diff);\n } else {\n pool.swapTailToHead(-diff);\n }\n\n col.style.minHeight = `${this.rowHeight * this.totalRows}px`;\n\n const cellPaddingLeft =\n colIndex === 0\n ? (depth: number) => `calc(${depth} * 0.5rem)`\n : () => `0`;\n\n pool.iterateElements((el, binding, rowIndex) => {\n const row = this.stateMap.viewportRows[rowIndex];\n\n if (isLoadedRow(row)) {\n this.updateCell(row, el, binding, rowIndex, cellPaddingLeft);\n }\n });\n });\n };\n\n private updateCell = (\n row: LoadedRow,\n cell: HTMLElement,\n binding: Binding,\n rowIndex: number,\n cellPaddingLeft: (depth: number) => string\n ): void => {\n cell.style.position = 'absolute';\n cell.style.top = `${\n (this.viewportStartIndex + rowIndex) * this.rowHeight\n }px`;\n cell.style.boxSizing = 'border-box';\n cell.style.height = `${this.rowHeight}px`;\n cell.style.width = '100%';\n cell.style.paddingLeft = cellPaddingLeft(row.node.depth);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (cell as any).tree = this.tree;\n (cell as any).node = row.node;\n (cell as any).hoverController = this.cellHoverController;\n (cell as any).isScrolling = this.isScrolling;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n binding.bind(row);\n };\n\n private updateLayoutPosition = (): void => {\n readDOM(() => {\n if (this.tableElement != null) {\n this.layoutOffset = getSceneTreeTableOffsetTop(this.tableElement);\n }\n });\n };\n\n private recomputeColumnWidths = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidths = this.stateMap.columnWidthPercentages.map(\n (w) => w * layoutWidth\n );\n\n this.columnsResized.emit(this.stateMap.columnWidths);\n }\n };\n\n private recomputeColumnPercentages = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidthPercentages = this.stateMap.columnWidths.map(\n (w) => w / layoutWidth\n );\n }\n };\n\n private computeInitialColumnWidths = (): void => {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n const columnWidthSum = this.stateMap.columnWidths.reduce(\n (result, w) => result + w,\n 0\n );\n const scaledColumnWidths = this.stateMap.columnWidths.map(\n (w) => w * (layoutWidth / columnWidthSum)\n );\n\n this.stateMap.columnWidthPercentages = scaledColumnWidths.map(\n (w) => w / layoutWidth\n );\n this.stateMap.columnWidths = scaledColumnWidths;\n }\n };\n\n private updateColumnElements = (): void => {\n this.columnElements = Array.from(\n this.hostEl.querySelectorAll('vertex-scene-tree-table-column')\n ) as Array<HTMLVertexSceneTreeTableColumnElement>;\n };\n\n private createPools(): void {\n if (this.stateMap.columnElementPools == null) {\n this.stateMap.columnElementPools = this.columnElements.reduce(\n (map, c) =>\n map.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n ),\n new WeakMap()\n );\n }\n }\n\n private recreateColumnPools(): void {\n this.columnElements.forEach((c) => {\n if (this.stateMap.columnElementPools?.get(c) == null) {\n this.stateMap.columnElementPools?.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n );\n } else {\n this.stateMap.columnElementPools\n .get(c)\n ?.updateElementFactory(() => this.createColumnCellInstance(c));\n }\n });\n }\n\n private iterateColumns(\n f: (\n column: HTMLVertexSceneTreeTableColumnElement,\n pool: ElementPool,\n index: number\n ) => void\n ): void {\n this.columnElements.forEach((column, i) => {\n const pool = this.stateMap.columnElementPools?.get(column);\n if (pool != null) {\n f(column, pool, i);\n } else {\n throw new Error('Cannot find pool for column');\n }\n });\n }\n\n private ensureDividerTemplateDefined(): void {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template == null) {\n const defaultDividerTemplate = document.createElement('template');\n defaultDividerTemplate.slot = 'divider';\n defaultDividerTemplate.innerHTML = `\n <vertex-scene-tree-table-resize-divider slot=\"divider\">\n </vertex-scene-tree-table-resize-divider>\n `;\n this.hostEl.appendChild(defaultDividerTemplate);\n }\n }\n\n private createHeaderInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> | undefined {\n const template = column.querySelector(\n 'template[slot=\"header\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n }\n }\n\n private createDividerInstance(): InstancedTemplate<HTMLElement> {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Table is missing divider template element');\n }\n }\n\n private createColumnCellInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> {\n const template = column.querySelector(\n 'template:not([slot=\"header\"])'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Column is missing cell template element');\n }\n }\n\n private computeCellHeight = async (): Promise<void> => {\n if (this.isComputingCellHeight && this.columnElements.length > 0) {\n const dummyData: LoadedRow = {\n index: 0,\n node: {\n id: { hex: '' },\n name: 'Dummy row',\n expanded: false,\n selected: false,\n visible: false,\n partiallyVisible: false,\n isLeaf: false,\n depth: 0,\n columnsList: [],\n filterHit: false,\n phantom: false,\n endItem: false,\n },\n metadata: {},\n data: {},\n };\n const { bindings, element } = this.createColumnCellInstance(\n this.columnElements[0]\n );\n bindings.bind(dummyData);\n element.style.visibility = 'hidden';\n\n this.columnElements[0]?.appendChild(element);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (element as any).componentOnReady === 'function') {\n await (element as any).componentOnReady();\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n let height = element.clientHeight;\n if (height === 0) {\n height = await new Promise((resolve) => {\n setTimeout(() => resolve(element.getBoundingClientRect().height), 5);\n });\n }\n\n this.rowHeight = height ?? this.rowHeight;\n element.remove();\n this.isComputingCellHeight = this.rowHeight === 0;\n }\n };\n\n private computeHeaderHeight = (): void => {\n if (this.stateMap.headerHeight == null) {\n this.stateMap.headerHeight =\n this.headerElement?.getBoundingClientRect().height;\n this.hostEl.style.setProperty(\n '--header-height',\n `${this.stateMap.headerHeight}px`\n );\n }\n };\n\n private computeColumnGridLayout = (): void => {\n if (this.stateMap.columnWidths.length === 0) {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n }\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n if (this.stateMap.columnWidthPercentages.length === 0) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n }\n\n /**\n * This layout uses `1fr` instead of the final column width to\n * allow the final column to shrink when a scrollbar appears.\n *\n * This flex behavior is not desired for the header and divider\n * elements since they are not scrollable, and `columnGridFixedLayout`\n * should be used instead.\n */\n this.columnGridLayout = `${this.stateMap.columnWidths\n .slice(0, -1)\n .reduce((res, w) => `${res} ${w}px`, '')} 1fr`;\n\n this.columnGridFixedLayout = `${this.stateMap.columnWidths.reduce(\n (res, w) => `${res} ${w}px`,\n ''\n )}`;\n };\n\n private bindHeaderData = (): void => {\n if (this.stateMap.headerInstances == null) {\n this.stateMap.headerInstances = this.columnElements\n .map((c, i) => {\n const instance = this.createHeaderInstance(c);\n\n if (instance != null) {\n instance.element.style.paddingRight =\n i === this.columnElements.length - 1\n ? `0`\n : `var(--scene-tree-table-column-gap)`;\n instance.element.slot = 'header';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n }\n\n return instance;\n })\n .filter((i) => i != null) as Array<InstancedTemplate<HTMLElement>>;\n }\n\n if (this.stateMap.headerDividerInstances == null) {\n this.stateMap.headerDividerInstances = this.columnElements\n .slice(0, -1)\n .map((_, i) => {\n const instance = this.createDividerInstance();\n\n instance.element.slot = 'divider';\n instance.element.style.position = 'absolute';\n instance.element.style.right = '0';\n instance.element.style.pointerEvents = 'auto';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n\n return instance;\n });\n }\n };\n\n private rebindHeaderData = (): void => {\n this.removeDividerDragListeners();\n\n this.stateMap.headerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerDividerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerInstances = undefined;\n this.stateMap.headerDividerInstances = undefined;\n\n this.bindHeaderData();\n this.addDividerDragListeners();\n };\n\n private addDividerDragListeners(): void {\n this.stateMap.headerDividerListeners =\n this.stateMap.headerDividerInstances?.map((d, i) => {\n const listener = this.createDividerPointerDownHandler(i);\n\n d.element.addEventListener('pointerdown', listener);\n\n return listener;\n });\n }\n\n private removeDividerDragListeners(): void {\n if (this.stateMap.headerDividerListeners != null) {\n const listeners = this.stateMap.headerDividerListeners;\n\n this.stateMap.headerDividerInstances?.forEach((d, i) => {\n const listener = listeners[i];\n if (listener != null) {\n d.element.removeEventListener('pointerdown', listener);\n }\n });\n this.stateMap.headerDividerListeners = undefined;\n }\n }\n\n private createDividerPointerDownHandler = (\n index: number\n ): ((event: PointerEvent) => void) => {\n return (event: PointerEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.lastDividerPointerPosition = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n this.resizingColumnIndex = index;\n this.stateMap.headerDividerInstances?.[index]?.element.classList.add(\n 'dragging'\n );\n\n window.addEventListener('pointermove', this.handleDividerPointerMove);\n window.addEventListener('pointerup', this.handleDividerPointerUp);\n };\n };\n\n private handleDividerPointerMove = (event: PointerEvent): void => {\n const current = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n\n if (\n this.lastDividerPointerPosition != null &&\n this.resizingColumnIndex != null\n ) {\n const resizingIndex = this.resizingColumnIndex;\n const diff = Point.subtract(this.lastDividerPointerPosition, current);\n\n if (Math.abs(diff.x) >= 1 && this.isValidResize(diff, resizingIndex)) {\n this.stateMap.columnWidths = this.stateMap.columnWidths.map((w, i) =>\n i === resizingIndex ? w - diff.x : w\n );\n\n if (resizingIndex + 1 < this.stateMap.columnWidths.length) {\n this.stateMap.columnWidths = this.stateMap.columnWidths.map((w, i) =>\n i === resizingIndex + 1 ? w + diff.x : w\n );\n }\n\n this.lastDividerPointerPosition = current;\n this.computeColumnGridLayout();\n }\n }\n };\n\n private handleDividerPointerUp = (): void => {\n if (this.resizingColumnIndex != null) {\n this.stateMap.headerDividerInstances?.[\n this.resizingColumnIndex\n ]?.element.classList.remove('dragging');\n }\n this.lastDividerPointerPosition = undefined;\n this.resizingColumnIndex = undefined;\n\n this.recomputeColumnPercentages();\n this.recomputeColumnWidths();\n\n window.removeEventListener('pointermove', this.handleDividerPointerMove);\n window.removeEventListener('pointerup', this.handleDividerPointerUp);\n };\n\n private isValidResize = (diff: Point.Point, index: number): boolean => {\n const currentColumn = this.columnElements[index];\n const nextColumn = this.columnElements[index + 1];\n const currentWidth = this.stateMap.columnWidths[index];\n const nextWidth = this.stateMap.columnWidths[index + 1];\n const currentMinWidth = currentColumn.minWidth ?? 0;\n const currentMaxWidth = currentColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n const nextMinWidth = nextColumn.minWidth ?? 0;\n const nextMaxWidth = nextColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n\n const currentIsValid =\n currentWidth - diff.x > currentMinWidth &&\n currentWidth - diff.x < currentMaxWidth;\n const nextIsValid =\n nextColumn != null\n ? nextWidth + diff.x > nextMinWidth && nextWidth + diff.x < nextMaxWidth\n : true;\n\n return currentIsValid && nextIsValid;\n };\n\n private handleScrollChanged = async (event: Event): Promise<void> => {\n this.isScrolling = true;\n\n this.scrollTimer = restartTimeout(() => {\n this.isScrolling = false;\n }, this.scrollTimer);\n\n this.scrollOffset = (event.target as HTMLElement).scrollTop;\n await this.computeAndUpdateViewportRows();\n };\n\n private getViewportRows(startIndex: number, endIndex: number): Row[] {\n const rows = this.rows.slice(startIndex, endIndex + 1);\n return rows.map((row) => (row != null ? this.populateRowData(row) : row));\n }\n\n private populateRowData(row: Row): Row {\n if (this.rowData != null && row != null) {\n const data = this.rowData?.(row) || {};\n return { ...row, data };\n } else {\n return row;\n }\n }\n\n private getLayoutHeight(): number | undefined {\n if (this.layoutHeight == null && this.tableElement != null) {\n this.layoutHeight = getSceneTreeViewportHeight(this.tableElement);\n }\n return this.layoutHeight;\n }\n\n private getLayoutWidth(): number | undefined {\n if (this.layoutWidth == null) {\n const computedWidth = getSceneTreeTableViewportWidth(this.hostEl);\n if (computedWidth > 0) {\n this.layoutWidth = computedWidth;\n }\n }\n return this.layoutWidth;\n }\n\n private clearLayoutHeight(): void {\n this.layoutHeight = undefined;\n }\n\n private clearLayoutWidth(): void {\n this.layoutWidth = undefined;\n }\n}\n",":host {\n /**\n * @prop --scene-tree-toolbar-content-gap: A CSS length that specifies the\n * horizontal gap between slots.\n */\n --scene-tree-toolbar-content-gap: 8px;\n\n display: flex;\n padding: 0.5rem;\n}\n\n.content {\n display: flex;\n align-items: center;\n}\n\n.content-primary {\n width: 100%;\n}\n\n::slotted(:not(:first-child)) {\n margin-left: var(--scene-tree-toolbar-content-gap);\n}\n","import { Component, h, Host } from '@stencil/core';\n\n/**\n * @slot The primary content that will be placed in the center of the toolbar\n * and stretch to container's available width.\n * @slot before - Content that is placed before the primary content.\n * @slot after - Content that is placed after the primary content.\n */\n@Component({\n tag: 'vertex-scene-tree-toolbar',\n styleUrl: 'scene-tree-toolbar.css',\n shadow: true,\n})\nexport class SceneTreeToolbar {\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"content\">\n <slot name=\"before\" />\n </div>\n <div class=\"content content-primary\">\n <slot />\n </div>\n <div class=\"content\">\n <slot name=\"after\" />\n </div>\n </Host>\n );\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["src/lib/walk-mode/dom.ts","src/lib/walk-mode/interactions.ts","src/components/viewer-walk-mode-tool/viewer-walk-mode-tool.css?tag=vertex-viewer-walk-mode-tool&encapsulation=shadow","src/components/viewer-walk-mode-tool/viewer-walk-mode-tool.tsx"],"names":["targetIsElement","target","Element","WalkInteractionHandler","[object Object]","model","this","pressed","handleKeyUp","async","event","key","toLocaleLowerCase","Object","keys","filter","k","reduce","assign","length","interval","endInteraction","clearInterval","_a","api","handleKeyDown","bind","handleEnabledChange","restartInteraction","updateCamera","handlers","ViewerWalkModeOperation","MOVE_DOWN","moveDown","MOVE_UP","moveUp","PIVOT_DOWN","pivotDown","PIVOT_LEFT","pivotLeft","PIVOT_RIGHT","pivotRight","PIVOT_UP","pivotUp","WALK_BACKWARD","walkBackward","WALK_FORWARD","walkForward","WALK_LEFT","walkLeft","WALK_RIGHT","walkRight","enabledChangeDisposable","onEnabledChange","keyBindingsChangeDisposable","onKeyBindingsChange","configurationChangeDisposable","onConfigurationChange","disable","dispose","_b","_c","window","removeEventListener","_","getEnabled","addEventListener","toLowerCase","exclude","isElementExcluded","repeat","tryBeginInteraction","enabled","enable","someOperationMatches","beginInteraction","isInteracting","setInterval","getKeyboardRepeatInterval","undefined","forEach","op","operationMatches","some","pivotCamera","getKeyboardPivotDegrees","walk","Vector3","scale","relativeWalkSpeed","forward","back","left","right","down","up","getKeyboardWalkSpeed","viewerWalkModeToolCss","ViewerWalkModeTool","hostRef","WalkModeModel","stateMap","setupController","setupInteractionHandler","ensureTeleportToolConfigured","updateTeleportTool","setPivotInteractionMode","clearInteractionHandler","resetInteractionMode","controller","setEnabled","toggleInteractionMode","controllerChanged","emit","h","Host","name","onSlotchange","WalkModeController","updateModel","interactionHandlerDisposable","interactionHandler","viewer","registerInteractionHandler","hostEl","slotted","querySelector","slottedTeleportTool","tagName","teleportTool","slot","_e","_d","shadowRoot","document","createElement","appendChild","mode","teleportMode","baseInteractionHandler","getBaseInteractionHandler","interactionType","getPrimaryInteractionType","previousPrimaryInteractionType","setPrimaryInteractionType"],"mappings":"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","sourcesContent":["export function targetIsElement(target: EventTarget | null): target is Element {\n return target instanceof Element;\n}\n","import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionApiPerspective, InteractionHandler } from '../interactions';\nimport { targetIsElement } from './dom';\nimport { ViewerWalkModeOperation, WalkModeModel } from './model';\n\nexport class WalkInteractionHandler implements InteractionHandler {\n private api?: InteractionApiPerspective;\n\n private interval?: NodeJS.Timer;\n private pressed: Record<string, boolean> = {};\n private handlers: Record<ViewerWalkModeOperation, VoidFunction>;\n\n private enabledChangeDisposable?: Disposable;\n private keyBindingsChangeDisposable?: Disposable;\n private configurationChangeDisposable?: Disposable;\n\n public constructor(private model: WalkModeModel) {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.restartInteraction = this.restartInteraction.bind(this);\n this.updateCamera = this.updateCamera.bind(this);\n\n this.handlers = {\n [ViewerWalkModeOperation.MOVE_DOWN]: this.moveDown.bind(this),\n [ViewerWalkModeOperation.MOVE_UP]: this.moveUp.bind(this),\n [ViewerWalkModeOperation.PIVOT_DOWN]: this.pivotDown.bind(this),\n [ViewerWalkModeOperation.PIVOT_LEFT]: this.pivotLeft.bind(this),\n [ViewerWalkModeOperation.PIVOT_RIGHT]: this.pivotRight.bind(this),\n [ViewerWalkModeOperation.PIVOT_UP]: this.pivotUp.bind(this),\n [ViewerWalkModeOperation.WALK_BACKWARD]: this.walkBackward.bind(this),\n [ViewerWalkModeOperation.WALK_FORWARD]: this.walkForward.bind(this),\n [ViewerWalkModeOperation.WALK_LEFT]: this.walkLeft.bind(this),\n [ViewerWalkModeOperation.WALK_RIGHT]: this.walkRight.bind(this),\n };\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange\n );\n this.keyBindingsChangeDisposable = this.model.onKeyBindingsChange(\n this.restartInteraction\n );\n this.configurationChangeDisposable = this.model.onConfigurationChange(\n this.restartInteraction\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n this.keyBindingsChangeDisposable?.dispose();\n this.configurationChangeDisposable?.dispose();\n\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n public initialize(_: HTMLElement, api: InteractionApiPerspective): void {\n this.api = api;\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public enable(): void {\n this.disable();\n\n window.addEventListener('keydown', this.handleKeyDown);\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n public disable(): void {\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n\n const exclude =\n targetIsElement(event.target) &&\n this.model.isElementExcluded(event.target);\n\n if (!event.repeat && !exclude) {\n this.pressed = { ...this.pressed, [key]: true };\n\n this.tryBeginInteraction();\n }\n }\n\n private handleKeyUp = async (event: KeyboardEvent): Promise<void> => {\n const key = event.key.toLocaleLowerCase();\n\n this.pressed = Object.keys(this.pressed)\n .filter((k) => k !== key)\n .reduce((pressed, k) => ({ ...pressed, [k]: true }), {});\n\n if (Object.keys(this.pressed).length === 0 && this.interval != null) {\n this.endInteraction();\n }\n };\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private restartInteraction(): void {\n this.clearInterval();\n this.tryBeginInteraction();\n }\n\n private tryBeginInteraction(): void {\n if (Object.keys(this.pressed).length > 0 && this.someOperationMatches()) {\n this.beginInteraction();\n }\n }\n\n private beginInteraction(): void {\n if (!this.api?.isInteracting()) {\n this.api?.beginInteraction();\n }\n\n if (this.interval == null) {\n this.interval = setInterval(\n this.updateCamera,\n this.model.getKeyboardRepeatInterval()\n );\n }\n }\n\n private endInteraction = async (): Promise<void> => {\n this.clearInterval();\n await this.api?.endInteraction();\n };\n\n private clearInterval(): void {\n if (this.interval != null) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n private updateCamera(): void {\n Object.keys(this.handlers).forEach((key) => {\n const op = key as ViewerWalkModeOperation;\n\n if (this.model.operationMatches(op, this.pressed)) {\n this.handlers[op]();\n }\n });\n }\n\n private someOperationMatches(): boolean {\n return Object.keys(this.handlers).some((op) =>\n this.model.operationMatches(op as ViewerWalkModeOperation, this.pressed)\n );\n }\n\n private pivotLeft(): void {\n this.api?.pivotCamera(0, this.model.getKeyboardPivotDegrees());\n }\n\n private pivotRight(): void {\n this.api?.pivotCamera(0, -this.model.getKeyboardPivotDegrees());\n }\n\n private pivotUp(): void {\n this.api?.pivotCamera(-this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private pivotDown(): void {\n this.api?.pivotCamera(this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private walkForward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.forward()));\n }\n\n private walkBackward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.back()));\n }\n\n private walkLeft(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.left()));\n }\n\n private walkRight(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.right()));\n }\n\n private moveUp(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.down()));\n }\n\n private moveDown(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.up()));\n }\n\n private relativeWalkSpeed(): number {\n return this.model.getKeyboardWalkSpeed() / 500;\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionType } from '../../lib/interactions/baseInteractionHandler';\nimport { WalkModeController } from '../../lib/walk-mode/controller';\nimport { WalkInteractionHandler } from '../../lib/walk-mode/interactions';\nimport { ViewerTeleportMode, WalkModeModel } from '../../lib/walk-mode/model';\n\ninterface StateMap {\n teleportTool?: HTMLVertexViewerTeleportToolElement;\n previousPrimaryInteractionType?: InteractionType;\n}\n\n/**\n * The `<vertex-viewer-walk-mode-tool>` allows for additional interactions\n * intended for walking through a model instead of orbiting a model.\n */\n@Component({\n tag: 'vertex-viewer-walk-mode-tool',\n styleUrl: 'viewer-walk-mode-tool.css',\n shadow: true,\n})\nexport class ViewerWalkModeTool {\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The `WalkModeController` responsible for controlling `KeyBinding`s and excluded\n * elements, as well as updating the `WalkModeModel` with various configuration\n * settings.\n */\n @Prop({ mutable: true })\n public controller?: WalkModeController;\n\n /**\n * The `WalkModeModel` responsible for tracking configuration and emitting\n * events for interaction handlers to respond to.\n */\n @Prop({ mutable: true })\n public model: WalkModeModel = new WalkModeModel();\n\n /**\n * The type of teleportation to perform when clicking. This value is passed through\n * to a `<vertex-viewer-teleport-tool>`'s mode attribute.\n *\n * `teleport` - the camera's `position` is moved to the location of the hit result\n * constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated\n * to align to the plane represented by the hit result's position and normal.\n *\n * `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the\n * hit result constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `undefined` - no teleportation will occur when clicking.\n *\n * Defaults to `undefined`.\n */\n @Prop()\n public teleportMode?: ViewerTeleportMode;\n\n /**\n * Determines whether the interaction handlers for this tool should respond to events.\n * When set to `true`, the default viewer interaction mode will be overridden to use the\n * `pivot` camera interaction type, keyboard controls for movement will be added, and\n * setting the `teleportMode` will enable the tool.\n *\n * Defaults to `true`.\n */\n @Prop()\n public enabled = true;\n\n /**\n * Event emitted when the `WalkModeController` associated with this tool changes.\n */\n @Event()\n public controllerChanged!: EventEmitter<WalkModeController>;\n\n @Element()\n private hostEl?: HTMLElement;\n\n private interactionHandlerDisposable?: Disposable;\n private interactionHandler?: WalkInteractionHandler;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.setupController();\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n await this.ensureTeleportToolConfigured();\n this.updateTeleportTool();\n await this.setPivotInteractionMode();\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setPivotInteractionMode();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.resetInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('enabled')\n protected handleEnabledChanged(): void {\n this.controller?.setEnabled(this.enabled);\n this.toggleInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(): void {\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n this.updateTeleportTool();\n this.toggleInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('teleportMode')\n protected handleTeleportModeChanged(): void {\n this.updateTeleportTool();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(): void {\n this.updateTeleportTool();\n this.controllerChanged.emit(this.controller);\n }\n\n /**\n * @ignore\n */\n @Watch('model')\n protected handleModelChanged(): void {\n this.setupController();\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n }\n\n protected render(): JSX.Element {\n return (\n <Host>\n <slot\n name=\"teleport-tool\"\n onSlotchange={async () => {\n await this.ensureTeleportToolConfigured();\n this.updateTeleportTool();\n }}\n ></slot>\n </Host>\n );\n }\n\n private setupController(): void {\n if (this.controller == null) {\n this.controller = new WalkModeController(this.model);\n this.controllerChanged.emit(this.controller);\n } else {\n this.controller.updateModel(this.model);\n }\n }\n\n private clearInteractionHandler(): void {\n this.interactionHandlerDisposable?.dispose();\n this.interactionHandlerDisposable = undefined;\n this.interactionHandler?.dispose();\n this.interactionHandler = undefined;\n }\n\n private async setupInteractionHandler(): Promise<void> {\n if (this.interactionHandler == null) {\n this.interactionHandler = new WalkInteractionHandler(this.model);\n\n this.interactionHandlerDisposable =\n await this.viewer?.registerInteractionHandler(this.interactionHandler);\n }\n }\n\n private async ensureTeleportToolConfigured(): Promise<void> {\n if (this.hostEl != null) {\n const slotted: Element | undefined =\n this.hostEl?.querySelector(\n 'vertex-viewer-teleport-tool[slot=\"teleport-tool\"]'\n ) ?? undefined;\n const slottedTeleportTool =\n slotted?.tagName === 'VERTEX-VIEWER-TELEPORT-TOOL'\n ? (slotted as HTMLVertexViewerTeleportToolElement)\n : undefined;\n\n if (slottedTeleportTool != null) {\n this.stateMap.teleportTool = slottedTeleportTool;\n } else {\n const slot: HTMLSlotElement | undefined =\n this.hostEl?.shadowRoot?.querySelector(\n 'slot[name=\"teleport-tool\"]'\n ) ?? undefined;\n\n this.stateMap.teleportTool = document.createElement(\n 'vertex-viewer-teleport-tool'\n );\n slot?.appendChild(this.stateMap.teleportTool);\n }\n }\n }\n\n private updateTeleportTool(): void {\n if (this.stateMap.teleportTool != null) {\n this.stateMap.teleportTool.viewer = this.viewer;\n this.stateMap.teleportTool.controller = this.controller;\n this.stateMap.teleportTool.model = this.model;\n this.stateMap.teleportTool.mode = this.teleportMode;\n }\n }\n\n private toggleInteractionMode(): void {\n if (this.enabled) {\n this.setPivotInteractionMode();\n } else {\n this.resetInteractionMode();\n }\n }\n\n private async setPivotInteractionMode(): Promise<void> {\n const baseInteractionHandler =\n await this.viewer?.getBaseInteractionHandler();\n\n if (this.enabled && baseInteractionHandler != null) {\n const interactionType =\n baseInteractionHandler.getPrimaryInteractionType();\n this.stateMap.previousPrimaryInteractionType =\n interactionType === 'pivot'\n ? this.stateMap.previousPrimaryInteractionType\n : interactionType;\n baseInteractionHandler.setPrimaryInteractionType('pivot');\n }\n }\n\n private async resetInteractionMode(): Promise<void> {\n const baseInteractionHandler =\n await this.viewer?.getBaseInteractionHandler();\n\n if (\n baseInteractionHandler != null &&\n baseInteractionHandler.getPrimaryInteractionType() === 'pivot' &&\n this.stateMap.previousPrimaryInteractionType != null\n ) {\n baseInteractionHandler.setPrimaryInteractionType(\n this.stateMap.previousPrimaryInteractionType\n );\n this.stateMap.previousPrimaryInteractionType = undefined;\n }\n }\n}\n"]}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2026 Vertex Software LLC. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
import{h as i,F as t,r as n}from"./p-110f66c6.js";import{p as e,m as o,v as s}from"./p-9d26f24e.js";import"./p-6f1b22f0.js";import"./p-342dac8b.js";import"./p-7af4e8a6.js";import"./p-5ca72d4a.js";import"./p-36dcfc94.js";import"./p-e656bd4c.js";import"./p-e3945092.js";import"./p-0d971ad6.js";import{V as r}from"./p-148e5f47.js";import{g as a,i as l,b as d,P as p,a as h,c}from"./p-4637d762.js";import{c as v}from"./p-92793987.js";import"./p-2507658c.js";import"./p-e5cc48b6.js";import"./p-6b00f7cd.js";import"./p-e4f95584.js";import"./p-3060996e.js";const u=({pin:n,selected:e,occluded:o,detached:s})=>{const{primaryColor:r}=a(n);return i(t,null,d(n)&&i("div",{id:"pin-anchor",class:v("pin-anchor",{selected:e,"pin-occluded":o,"pin-detached":s}),style:{background:r}}),l(n)&&i("vertex-viewer-icon",{name:"pin-fill",size:"lg",class:v("pin",{"pin-selected":e,"pin-occluded":o,"pin-detached":s}),style:{color:r}}))};function w(i,t,n){const o={x:i.x+n.width/2,y:i.y};const s={x:i.x+n.width/2,y:i.y+n.height};const r={x:i.x+n.width,y:i.y+n.height/2};const a={x:i.x,y:i.y+n.height/2};const l=[o,s,a,r];const d=l.map((i=>e.distance(i,t)));const p=d.indexOf(Math.min(...d));return l[p]}const b=":host{--viewer-annotations-pin-primary-color:var(--blue-700);--viewer-annotations-pin-accent-color:var(--blue-200);--viewer-annotations-pin-dot-color:var(--viewer-annotations-pin-primary-color);--viewer-annotations-pin-color:var(--viewer-annotations-pin-primary-color);--viewer-annotations-pin-font-size:0.75rem;--viewer-annotations-pin-selected-stroke:var(--white);--viewer-annotations-pin-selected-border:2px solid var(--white);--viewer-annotations-pin-label-border:2px solid var(--black);--viewer-annotations-pin-selected-stroke:var(--white);font-size:var(--viewer-annotations-pin-font-size);position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;pointer-events:none}.pin-anchor{position:absolute;border-radius:50%;transform:translate(-50%, -50%);display:block;width:9px;height:9px;box-sizing:border-box;border:var(--viewer-annotations-pin-label-border);background:var(--viewer-annotations-pin-dot-color);pointer-events:auto;cursor:pointer}.selected{width:13px;height:13px;border:var(--viewer-annotations-pin-selected-border)}.pin{color:var(--viewer-annotations-pin-color);cursor:pointer;transition:opacity 0.3s ease-in}.pin-selected{stroke-width:1;stroke:var(--viewer-annotations-pin-selected-stroke)}.pin-occluded{opacity:.3;transition:opacity 0.3s ease-in}.pin-detached{visibility:hidden}";const m=class{constructor(i){n(this,i);this.matrix=o.makeIdentity();this.projectionViewMatrix=o.makeIdentity();this.pinModel=new p;this.selected=false;this.occluded=false;this.detached=false;this.invalidateStateCounter=0;this.invalidateState=()=>{this.invalidateStateCounter=this.invalidateStateCounter+1}}componentDidLoad(){var i;this.setLabelObserver();if(this.pinController==null){this.pinController=new h(this.pinModel)}if(this.selected){(i=this.labelEl)===null||i===void 0?void 0:i.setFocus()}}async handleOcclusionStateChanged(i){this.occluded=i.detail}async handleDetachedStateChanged(i){this.detached=i.detail}disconnectedCallback(){var i,t;(i=this.labelEl)===null||i===void 0?void 0:i.removeEventListener("labelChanged",this.invalidateState);(t=this.resizeObserver)===null||t===void 0?void 0:t.disconnect()}render(){var n;if(this.pin==null){throw new Error("Unable to draw pin")}const{pinPoint:e,labelPoint:o}=this.computePinPoints(this.pin);return i(t,null,i("vertex-viewer-dom-element",{"data-testid":`drawn-pin-${this.pin.id}`,position:this.pin.worldPosition,onPointerDown:async()=>{var i;await((i=this.labelEl)===null||i===void 0?void 0:i.submit());this.selectPin();this.handleAnchorPointerDown()},detachedOff:false},i(u,{pin:this.pin,selected:this.selected,occluded:this.occluded,detached:this.detached})),d(this.pin)&&!this.occluded&&!this.detached&&i(t,null,i("vertex-viewer-pin-label-line",{id:`pin-label-line-${(n=this.pin)===null||n===void 0?void 0:n.id}`,pinPoint:e,pin:this.pin,labelPoint:o,onPointerDown:()=>this.selectPin()}),i("vertex-viewer-pin-label",{pin:this.pin,ref:i=>this.labelEl=i,elementBounds:this.elementBounds,pinController:this.pinController,onPointerDown:()=>this.selectPin()})))}setLabelObserver(){if(this.labelEl!=null){this.labelEl.addEventListener("labelChanged",this.invalidateState);this.resizeObserver=new ResizeObserver((()=>this.invalidateState()));this.resizeObserver.observe(this.labelEl)}}computePinPoints(i){if(this.elementBounds!=null&&this.pin!=null){return d(this.pin)&&this.pin.label.point!=null?this.computeTextPinPoints(this.pin,this.elementBounds):this.computeDefaultPinPoints(this.pin,this.elementBounds)}return{pinPoint:i.worldPosition}}computeDefaultPinPoints(i,t){return{pinPoint:this.getFromWorldPosition(i.worldPosition,this.projectionViewMatrix,t)}}computeTextPinPoints(i,t){var n,e,o,s;const{pinPoint:r}=this.computeDefaultPinPoints(i,t);const a=c(i.label.point,t);const l=((e=(n=this.labelEl)===null||n===void 0?void 0:n.firstElementChild)===null||e===void 0?void 0:e.clientWidth)||0;const d=((s=(o=this.labelEl)===null||o===void 0?void 0:o.firstElementChild)===null||s===void 0?void 0:s.clientHeight)||0;return{pinPoint:r,labelPoint:w(a,r,{width:l,height:d})}}handleAnchorPointerDown(){var i,t;if(this.elementBounds!=null&&((i=this.pinController)===null||i===void 0?void 0:i.getToolMode())==="edit"&&this.pin!=null){(t=this.pinController)===null||t===void 0?void 0:t.setDraggable({id:this.pin.id})}}selectPin(){var i,t;(i=this.pinController)===null||i===void 0?void 0:i.setSelectedPinId((t=this.pin)===null||t===void 0?void 0:t.id)}getFromWorldPosition(i,t,n){const e=s.transformMatrix(i,t);return r.fromDimensions(n).transformVectorToViewport(e)}};m.style=b;export{m as vertex_viewer_pin_group};
|
|
5
|
-
//# sourceMappingURL=p-93960b4f.entry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/requestidlecallback-polyfill/index.js","src/components/scene-tree/errors.tsx","src/components/scene-tree/lib/viewer-ops.ts","src/components/scene-tree/scene-tree.css?tag=vertex-scene-tree&encapsulation=shadow","src/components/scene-tree/scene-tree.tsx"],"names":["window","requestIdleCallback","cb","start","Date","now","setTimeout","didTimeout","timeRemaining","Math","max","cancelIdleCallback","id","clearTimeout","SceneTreeError","details","children","h","class","message","link","Fragment","href","target","DEFAULT_SCENE_TREE_OP_ANIMATION_MS","async","showItem","viewer","suppliedCorrelationId","scene","elements","op","items","where","q","withItemId","show","execute","hideItem","hide","selectItem","append","all","deselect","select","selectRangeInSceneTree","end","withSceneTreeRange","selectFilterResults","filter","keys","exactMatch","removeHiddenResults","withMetadata","deselectItem","isolateItem","animationDurationMs","renderResult","camera","flyTo","render","animation","milliseconds","onAnimationCompleted","once","sceneTreeCss","MIN_CLEAR_UNUSED_DATA_MS","SceneTree","[object Object]","hostRef","this","overScanCount","configEnv","searchOptions","metadataSearchExactMatch","metadataSearchKeys","metadataKeys","operationAnimationDuration","rows","totalRows","showLoader","showEmptyResults","stateMap","componentLoaded","hasPartialFilterResults","refreshingResults","attemptingRetry","firstCellRendered","forceUpdate","getLayoutElement","index","options","animate","position","i","min","top","getScrollToPosition","scrollToPosition","behavior","undefined","itemId","rowsBeforeExpand","_a","controller","expandParentNodes","Promise","resolve","layoutEl","handleLayoutRendered","removeEventListener","scrollToIndex","addEventListener","expandAll","collapseAll","row","performRowOperation","node","expanded","expandNode","collapseNode","collapseItem","expandItem","visible","partiallyVisible","recurseParent","__rest","ancestors","fetchNodeAncestors","isInPath","_b","selectionPath","includes","nodeForRow","getNodeFromRowOrIndex","immediateParentNodeIsSelected","length","selected","nodeIsSelectedAndParentIsUnselected","nextNode","find","lastSelectedItemId","range","currentRowIndex","_c","previouslySelectedIndex","_d","map","hex","event","clientY","errorDetails","getSceneTreeContainsElement","el","isSceneTreeTableCellElement","getRowAtClientY","layoutOffset","floor","scrollOffset","rowHeight","getRowAtIndex","term","optionsAsFilterOptions","Object","assign","columns","columnsToSearch","getMetadataSearchKeys","definedMetadataKeys","shouldSearchExactMatch","shouldSearchRemoveHiddenItems","_f","_e","removeHiddenItems","fetchMetadataKeys","viewerDisposable","dispose","viewerSceneReadyDisposable","cancel","connectToViewer","sceneTreeHost","getConfig","network","client","SceneTreeAPIClient","flags","grpcUseStreamingWebSocketTransport","transport","webSocketSubscriptionTransportFactory","SceneTreeController","setMetadataKeys","onStateChangeDisposable","onStateChange","on","state","handleControllerStateChange","ensureLayoutDefined","updateLayoutElement","resizeObserver","ResizeObserver","invalidateRows","observe","SceneTreeErrorDetails","SceneTreeErrorCode","MISSING_VIEWER","Host","name","actionLabel","onAction","refreshFilter","renderError","size","code","SCENE_TREE_DISABLED","onClick","retryConnectToViewer","disabled","newViewer","oldViewer","newController","viewerSelector","document","querySelector","handleSceneReady","attemptComputeCellHeight","idleCallbackId","foo","remaining","call","startIndex","viewportStartIndex","endIndex","viewportEndIndex","getPageIndexesForRange","invalidatePagesOutsideRange","scheduleClearUnusedData","shouldShowLoading","shouldShowEmptyResults","isPartialFilterResponse","isSearching","connection","type","connectionError","emit","DISCONNECTED","rowOrIndex","Error","isLoadedRow","filterItems","detail","e","console","error","firstRowRendered","constrainedIndex","viewportHeight","layoutHeight","rowCenterY","rowBottomY","parseAndValidateConfig","config","layout","createElement","innerHTML","appendChild","tree","rowData","debug","SCENE_ITEM_NAME_METADATA_KEY"],"mappings":"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","sourcesContent":["window.requestIdleCallback =\n window.requestIdleCallback ||\n function(cb) {\n var start = Date.now();\n return setTimeout(function() {\n cb({\n didTimeout: false,\n timeRemaining: function() {\n return Math.max(0, 50 - (Date.now() - start));\n },\n });\n }, 1);\n };\n\nwindow.cancelIdleCallback =\n window.cancelIdleCallback ||\n function(id) {\n clearTimeout(id);\n };\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { Fragment, FunctionalComponent, h } from '@stencil/core';\n\nimport { SceneTreeErrorDetails } from './lib/errors';\n\ninterface SceneTreeErrorProps {\n details: SceneTreeErrorDetails;\n}\n\nexport const SceneTreeError: FunctionalComponent<SceneTreeErrorProps> = (\n { details },\n children\n) => {\n return (\n <div class=\"error\">\n <div class=\"error-section error-message\">\n <span>{details.message}</span>\n {details.link && (\n <Fragment>\n <span> See our </span>\n <a href={details.link} target=\"_blank\">\n documentation\n </a>{' '}\n <span> for more information.</span>\n </Fragment>\n )}\n </div>\n <div class=\"error-section\">{children}</div>\n </div>\n );\n};\n","export const DEFAULT_SCENE_TREE_OP_ANIMATION_MS = 500;\n\nexport interface ViewerItemOptions {\n suppliedCorrelationId?: string;\n}\nexport interface ViewerSelectItemOptions extends ViewerItemOptions {\n append?: boolean;\n range?: boolean;\n}\nexport interface ViewerIsolateItemOptions extends ViewerItemOptions {\n animationDurationMs?: number;\n}\n\nexport async function showItem(\n viewer: HTMLVertexViewerElement,\n id: string,\n { suppliedCorrelationId }: ViewerItemOptions = {}\n): Promise<void> {\n const scene = await viewer.scene();\n return scene\n .elements((op) => op.items.where((q) => q.withItemId(id)).show())\n .execute({ suppliedCorrelationId });\n}\n\nexport async function hideItem(\n viewer: HTMLVertexViewerElement,\n id: string,\n { suppliedCorrelationId }: ViewerItemOptions = {}\n): Promise<void> {\n const scene = await viewer.scene();\n return scene\n .elements((op) => op.items.where((q) => q.withItemId(id)).hide())\n .execute({\n suppliedCorrelationId,\n });\n}\n\nexport async function selectItem(\n viewer: HTMLVertexViewerElement,\n id: string,\n { append = false, suppliedCorrelationId }: ViewerSelectItemOptions\n): Promise<void> {\n const scene = await viewer.scene();\n return scene\n .elements((op) => [\n ...(append ? [] : [op.items.where((q) => q.all()).deselect()]),\n op.items.where((q) => q.withItemId(id)).select(),\n ])\n .execute({ suppliedCorrelationId });\n}\n\nexport async function selectRangeInSceneTree(\n viewer: HTMLVertexViewerElement,\n start: number,\n end: number,\n { append = true, suppliedCorrelationId }: ViewerSelectItemOptions\n): Promise<void> {\n const scene = await viewer.scene();\n return scene\n .elements((op) => [\n ...(append ? [] : [op.items.where((q) => q.all()).deselect()]),\n op.items.where((q) => q.withSceneTreeRange({ start, end })).select(),\n ])\n .execute({\n suppliedCorrelationId,\n });\n}\n\nexport async function selectFilterResults(\n viewer: HTMLVertexViewerElement,\n filter: string,\n keys: string[],\n exactMatch: boolean,\n removeHiddenResults: boolean,\n { append = false, suppliedCorrelationId }: ViewerSelectItemOptions\n): Promise<void> {\n const scene = await viewer.scene();\n return scene\n .elements((op) => [\n ...(append ? [] : [op.items.where((q) => q.all()).deselect()]),\n op.items\n .where((q) =>\n q.withMetadata(filter, keys, exactMatch, removeHiddenResults)\n )\n .select(),\n ])\n .execute({\n suppliedCorrelationId,\n });\n}\n\nexport async function deselectItem(\n viewer: HTMLVertexViewerElement,\n id: string,\n { suppliedCorrelationId }: ViewerItemOptions = {}\n): Promise<void> {\n const scene = await viewer.scene();\n return scene\n .elements((op) => op.items.where((q) => q.withItemId(id)).deselect())\n .execute({\n suppliedCorrelationId,\n });\n}\n\nexport async function isolateItem(\n viewer: HTMLVertexViewerElement,\n id: string,\n { suppliedCorrelationId, animationDurationMs }: ViewerIsolateItemOptions = {}\n): Promise<void> {\n const scene = await viewer.scene();\n await scene\n .elements((op) => [\n op.items.where((q) => q.all()).hide(),\n op.items.where((q) => q.withItemId(id)).show(),\n ])\n .execute({\n suppliedCorrelationId,\n });\n const renderResult = await scene\n .camera()\n .flyTo((q) => q.withItemId(id))\n .render({\n animation: {\n milliseconds: animationDurationMs ?? DEFAULT_SCENE_TREE_OP_ANIMATION_MS,\n },\n });\n await renderResult.onAnimationCompleted.once();\n}\n","@import url('../../css/button.css');\n\n:host {\n /**\n * @prop --scene-tree-toolbar-separator: A CSS border value that specifies the\n * border between scene tree toolbars.\n */\n --scene-tree-toolbar-separator: 1px solid var(--neutral-300);\n\n /**\n * @prop --scene-tree-default-font-family: The default font family to use for displaying\n * text within a <vertex-scene-tree>. Defaults to `unset`.\n */\n --scene-tree-default-font-family: unset;\n\n /**\n * @prop --scene-tree-default-font-size: The default font size to use for displaying\n * text within a <vertex-scene-tree>. Defaults to `unset`.\n */\n --scene-tree-default-font-size: unset;\n\n /**\n * @prop --scene-tree-default-font-color: The default font color to use for displaying\n * text within a <vertex-scene-tree>. Defaults to `unset`.\n */\n --scene-tree-default-font-color: unset;\n\n /**\n * @prop --scene-tree-secondary-font-color: The secondary font color to use for displaying\n * secondary text within a <vertex-scene-tree>. Defaults to `unset`.\n */\n --scene-tree-secondary-font-color: unset;\n\n /**\n * @prop --scene-tree-selected-row-background-color: The background color to use when\n * displaying selected rows. This value always takes precedence if the row is selected.\n * Defaults to `unset`.\n */\n --scene-tree-selected-row-background-color: unset;\n\n /**\n * @prop --scene-tree-hovered-row-background-color: The background color to use when\n * displaying hovered rows. This value takes precedence only if the row is not selected.\n * Defaults to `unset`.\n */\n --scene-tree-hovered-row-background-color: unset;\n\n /**\n * @prop --scene-tree-row-background-color: The default background color to use for displaying\n * rows within a <vertex-scene-tree>. Defaults to `unset`, and will be overridden\n * by any depth specific background configuration.\n */\n --scene-tree-row-background-color: unset;\n\n /**\n * @prop --scene-tree-row-background-color-depth-n: The background color to use for n-depth\n * rows, where `n` is replaced with the desired depth. Defaults to `unset` for all\n * depths.\n *\n * @example\n * The following definition will cause all rows representing items at a depth of 1\n * to display with a red background, leaving all other depths unchanged.\n * \n * --scene-tree-row-background-color-depth-1: #ff0000\n */\n --scene-tree-row-background-color-depth-n: unset;\n\n\n /**\n * @prop --scene-tree-overlay-z-index: A CSS z-index value that will\n * set the z-index of the tree overlays. Defaults to 3000.\n */\n --scene-tree-overlay-z-index: 3000;\n\n width: 300px;\n height: 100%;\n user-select: none;\n -webkit-user-select: none;\n cursor: default;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.rows-scroll {\n position: relative;\n height: var(--scene-tree-row-height, 0);\n flex-grow: 1;\n}\n\n.rows {\n position: relative;\n}\n\n.row {\n position: absolute;\n display: flex;\n align-items: center;\n width: 100%;\n height: var(--scene-tree-row-height);\n padding: var(--scene-tree-row-padding);\n box-sizing: border-box;\n}\n\n.row:hover {\n background-color: var(--scene-tree-row-hover-color);\n}\n\n.row.is-selected {\n background-color: var(--scene-tree-row-selected-color);\n}\n\n.expand-toggle {\n cursor: pointer;\n width: 16px;\n}\n\n.row-text {\n margin-left: 0.25rem;\n width: 100%;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n\n.visibility-btn {\n display: flex;\n align-items: center;\n visibility: hidden;\n padding: 4px;\n}\n\n.visibility-btn.is-hidden {\n visibility: visible;\n}\n\n.row:hover .visibility-btn {\n visibility: visible;\n}\n\n.error,\n.empty-results {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n font-size: 0.875rem;\n width: 100%;\n height: 100%;\n padding: 1rem;\n box-sizing: border-box;\n justify-content: center;\n background-color: white;\n z-index: var(--scene-tree-overlay-z-index);\n}\n\n.error-section {\n margin-top: 1rem;\n}\n\n.error-message {\n text-align: center;\n}\n\n.search-toolbar,\nslot[name='header']::slotted(*) {\n border-bottom: var(--scene-tree-toolbar-separator);\n}\n\nslot[name='footer']::slotted(:not(:last-child)) {\n border-top: var(--scene-tree-toolbar-separator);\n}\n\n.header {\n display: flex;\n flex-direction: column;\n}\n\n.footer {\n display: flex;\n flex-direction: column;\n}\n\n.loading {\n position: absolute;\n top: 150px;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n}\n","import 'requestidlecallback-polyfill';\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n forceUpdate,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { ElementPool } from '@vertexvis/html-templates';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport { SceneTreeAPIClient } from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable } from '@vertexvis/utils';\n\nimport {\n Config,\n parseAndValidateConfig,\n PartialConfig,\n} from '../../lib/config';\nimport { Environment } from '../../lib/environment';\nimport { isSceneTreeTableCellElement } from '../scene-tree-table-cell/utils';\nimport { SceneTreeError } from './errors';\nimport {\n FilterTreeOptions,\n SceneTreeController,\n SceneTreeState,\n} from './lib/controller';\nimport { getSceneTreeContainsElement } from './lib/dom';\nimport { SceneTreeErrorCode, SceneTreeErrorDetails } from './lib/errors';\nimport { webSocketSubscriptionTransportFactory } from './lib/grpc';\nimport { isLoadedRow, Row } from './lib/row';\nimport {\n deselectItem,\n hideItem,\n isolateItem,\n selectFilterResults,\n selectItem,\n selectRangeInSceneTree,\n showItem,\n} from './lib/viewer-ops';\nimport {\n FilterOptions,\n MetadataKey,\n RowArg,\n RowDataProvider,\n SCENE_ITEM_NAME_METADATA_KEY,\n SceneTreeOperationOptions,\n ScrollToOptions,\n SelectItemOptions,\n} from './types';\n\n/**\n * The minimum amount of time provided by requestIdleCallback to clear purged\n * data. A value too low may cause contention with browser rendering. A value\n * too high will cause too many items to be accumulated.\n */\nconst MIN_CLEAR_UNUSED_DATA_MS = 25;\n\ninterface StateMap {\n idleCallbackId?: number;\n resizeObserver?: ResizeObserver;\n componentLoaded: boolean;\n\n client?: SceneTreeAPIClient;\n jwt?: string;\n\n onStateChangeDisposable?: Disposable;\n subscribeDisposable?: Disposable;\n viewerDisposable?: Disposable;\n viewerSceneReadyDisposable?: Disposable;\n\n elementPool?: ElementPool;\n template?: HTMLTemplateElement;\n\n selectionPath?: string[];\n\n layoutEl?: HTMLVertexSceneTreeTableLayoutElement;\n}\n\ntype OperationHandler = (data: {\n viewer: HTMLVertexViewerElement;\n id: string;\n node: Node.AsObject;\n}) => void | Promise<void>;\n\n/**\n * @slot header - A slot that places content above the rows in the tree. By\n * default, a search toolbar will be placed in this slot. Elements can be\n * stacked by assigning multiple elements to this slot.\n * @slot footer - A slot that places content below the rows in the tree.\n * Elements can be stacked by assigning multiple elements to this slot.\n */\n@Component({\n tag: 'vertex-scene-tree',\n styleUrl: 'scene-tree.css',\n shadow: true,\n})\nexport class SceneTree {\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A CSS selector that points to a `<vertex-viewer>` element. Either this\n * property or `viewer` must be set.\n */\n @Prop()\n public viewerSelector?: string;\n\n /**\n * An instance of a `<vertex-viewer>` element. Either this property or\n * `viewerSelector` must be set.\n */\n @Prop({ reflect: true, mutable: true })\n public viewer?: HTMLVertexViewerElement | null;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * An object to configure the scene tree.\n */\n @Prop()\n public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n */\n @Prop()\n public configEnv: Environment = 'platprod';\n\n @Prop({ mutable: true })\n public controller?: SceneTreeController;\n\n /**\n * A set of options to configure scene tree searching behavior.\n */\n @Prop({ mutable: true })\n public searchOptions: FilterOptions = {};\n\n /**\n * @deprecated Use `searchOptions`\n * Indicates whether the metadata search should use an exact match.\n */\n @Prop({ mutable: true })\n public metadataSearchExactMatch = false;\n\n /**\n * @deprecated Use `searchOptions`\n * A list of the metadata keys that a scene tree search should be performed on.\n */\n @Prop({ mutable: true })\n public metadataSearchKeys: MetadataKey[] = [];\n\n /**\n * A list of part metadata keys that will be made available to each row. This\n * metadata can be used for data binding inside the scene tree's template.\n *\n * **Note:** for the values of these metadata keys to be evaluated for search,\n * they must be provided to the `metadataSearchKeys` specified in the `searchOptions`.\n * Otherwise, the search will only be performed against the item name.\n */\n @Prop()\n public metadataKeys: MetadataKey[] = [];\n\n /**\n * The duration of operations with animations, in milliseconds, when a user performs\n * an action that results in an animation such as isolate. Defaults to 500ms.\n */\n @Prop()\n public operationAnimationDuration = 500;\n\n /**\n * An event that is emitted when this <vertex-scene-tree> encounters a connection\n * error.\n */\n @Event()\n public connectionError!: EventEmitter<SceneTreeErrorDetails>;\n\n /**\n * An event that is emitted when the first row of this <vertex-scene-tree> has\n * been rendered.\n */\n @Event()\n public firstRowRendered!: EventEmitter<void>;\n\n @State()\n private rows: Row[] = [];\n\n @State()\n private totalRows = 0;\n\n @State()\n private showLoader = false;\n\n @State()\n private showEmptyResults = false;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n componentLoaded: false,\n };\n\n @State()\n private errorDetails: SceneTreeErrorDetails | undefined;\n\n @State()\n private hasPartialFilterResults = false;\n\n @State()\n private refreshingResults = false;\n\n @State()\n private attemptingRetry = false;\n\n @Element()\n private el!: HTMLElement;\n\n private lastSelectedItemId?: string;\n private firstCellRendered = false;\n\n /**\n * Schedules a render of the rows in the scene tree. Useful if any custom\n * data in your scene tree has changed, and you want to update the row's\n * contents.\n *\n * **Note:** This is an asynchronous operation. The update may happen on the\n * next frame.\n */\n @Method()\n public async invalidateRows(): Promise<void> {\n forceUpdate(this.getLayoutElement());\n }\n\n /**\n * Scrolls the tree to the given row index.\n *\n * @param index An index of the row to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToIndex(\n index: number,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const { animate, position = 'middle' } = options;\n const i = Math.max(0, Math.min(index, this.totalRows));\n\n const top = this.getScrollToPosition(i, position);\n\n await this.getLayoutElement().scrollToPosition(top, {\n behavior: animate ? 'smooth' : undefined,\n });\n }\n\n /**\n * Scrolls the tree to an item with the given ID. If the node for the item is\n * not expanded, the tree will expand each of its parent nodes.\n *\n * @param itemId An ID of an item to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n * @returns A promise that resolves when the operation is finished.\n */\n @Method()\n public async scrollToItem(\n itemId: string,\n options: ScrollToOptions = {}\n ): Promise<void> {\n const rowsBeforeExpand = this.totalRows;\n const index = await this.controller?.expandParentNodes(itemId);\n\n if (index != null && rowsBeforeExpand !== this.totalRows) {\n return new Promise((resolve) => {\n const layoutEl = this.getLayoutElement();\n const handleLayoutRendered = async (): Promise<void> => {\n layoutEl.removeEventListener('layoutRendered', handleLayoutRendered);\n await this.scrollToIndex(index, options);\n resolve();\n };\n\n layoutEl.addEventListener('layoutRendered', handleLayoutRendered);\n });\n } else if (index != null) {\n await this.scrollToIndex(index, options);\n }\n }\n\n /**\n * Performs an API call to expand all nodes in the tree.\n */\n @Method()\n public async expandAll(): Promise<void> {\n await this.controller?.expandAll();\n }\n\n /**\n * Performs an API call to collapse all nodes in the tree.\n */\n @Method()\n public async collapseAll(): Promise<void> {\n await this.controller?.collapseAll();\n }\n\n /**\n * Performs an API call that will expand the node associated to the specified\n * row or row index.\n *\n * @param row A row, row index, or node to expand.\n */\n @Method()\n public async expandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (!node.expanded) {\n await this.controller?.expandNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will collapse the node associated to the\n * specified row or row index.\n *\n * @param row A row, row index, or node to collapse.\n */\n @Method()\n public async collapseItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ id, node }) => {\n if (node.expanded) {\n await this.controller?.collapseNode(id);\n }\n });\n }\n\n /**\n * Performs an API call that will either expand or collapse the node\n * associated to the given row or row index.\n *\n * @param row The row, row index, or node to collapse or expand.\n */\n @Method()\n public async toggleExpandItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ node }) => {\n if (node.expanded) {\n await this.collapseItem(node);\n } else {\n await this.expandItem(node);\n }\n });\n }\n\n /**\n * Performs an API call that will either hide or show the item associated to\n * the given row or row index.\n *\n * @param row The row, row index, or node to toggle visibility.\n */\n @Method()\n public async toggleItemVisibility(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible || node.partiallyVisible) {\n await hideItem(viewer, id);\n } else {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will hide the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to hide.\n */\n @Method()\n public async hideItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.visible) {\n await hideItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will show the item associated to the given row\n * or row index.\n *\n * @param row The row, row index, or node to show.\n */\n @Method()\n public async showItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (!node.visible) {\n await showItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will select the item associated to the given row\n * or row index.\n *\n * This method supports a `recurseParent` option that allows for recursively\n * selecting the next unselected parent node. This behavior is considered\n * stateful. Each call to `selectItem` will track the ancestry of the passed\n * in `rowArg`. If calling `selectItem` with a row not belonging to the\n * ancestry of a previous selection, then this method will perform a standard\n * selection.\n *\n * @param row The row, row index or node to select.\n * @param options A set of options to configure selection behavior.\n */\n @Method()\n public async selectItem(\n row: RowArg,\n { recurseParent, ...options }: SelectItemOptions = {}\n ): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id }) => {\n const ancestors = (await this.controller?.fetchNodeAncestors(id)) || [];\n\n // The parent node should be selected if recurseParent is true and either\n // the given node is in the selection path (so was intentionally selected by clicking in the tree)\n // or if the given node is selected, but its immediate parent is not. The second case covers the\n // situation that the given node was selected as part of a previous ancestor selection and the\n // user wishes to clear the selection list and only select the given node.\n const isInPath = this.stateMap.selectionPath?.includes(id);\n\n const nodeForRow = this.getNodeFromRowOrIndex(row);\n const immediateParentNodeIsSelected =\n ancestors.length > 0 ? ancestors[0].selected : true;\n const nodeIsSelectedAndParentIsUnselected =\n nodeForRow.selected && !immediateParentNodeIsSelected;\n\n if (recurseParent && (isInPath || nodeIsSelectedAndParentIsUnselected)) {\n const nextNode = ancestors.find(({ selected }) => !selected);\n if (nextNode != null) {\n await this.selectItem(nextNode, options);\n this.lastSelectedItemId = id;\n } else {\n await selectItem(viewer, id, options);\n this.lastSelectedItemId = id;\n }\n } else if (options.range && this.lastSelectedItemId != null) {\n const currentRowIndex = await this.controller?.expandParentNodes(id);\n const previouslySelectedIndex =\n await this.controller?.expandParentNodes(this.lastSelectedItemId);\n\n if (previouslySelectedIndex && currentRowIndex) {\n const start = Math.min(previouslySelectedIndex, currentRowIndex);\n const end = Math.max(previouslySelectedIndex, currentRowIndex);\n await selectRangeInSceneTree(viewer, start, end, options);\n }\n } else {\n await selectItem(viewer, id, options);\n this.lastSelectedItemId = id;\n }\n\n this.stateMap.selectionPath = [\n ...ancestors.map(({ id }) => id?.hex || ''),\n id,\n ];\n });\n }\n\n /**\n * Performs an API call that will deselect the item associated to the given\n * row or row index.\n *\n * @param row The row, row index, or node to deselect.\n */\n @Method()\n public async deselectItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id, node }) => {\n if (node.selected) {\n this.lastSelectedItemId = undefined;\n await deselectItem(viewer, id);\n }\n });\n }\n\n /**\n * Performs an API call that will show only the item associated to\n * the given row or row index and fit the camera to the item's bounding box.\n *\n * @param row The row, row index, or node to isolate.\n */\n @Method()\n public async isolateItem(row: RowArg): Promise<void> {\n await this.performRowOperation(row, async ({ viewer, id }) => {\n await isolateItem(viewer, id, {\n animationDurationMs: this.operationAnimationDuration,\n });\n });\n }\n\n /**\n * Returns a row at the given index. If the row data has not been loaded,\n * returns `undefined`.\n *\n * @param index The index of the row.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowAtIndex(index: number): Promise<Row> {\n return this.rows[index];\n }\n\n /**\n * Returns the row with the given id. If there is not a row\n * matching the id, returns `undefined`.\n *\n * @param itemId An ID of an item to return the row for.\n * @returns A row, or `undefined` if a corresponding row doesn't exist\n */\n @Method()\n public async getRowForItemId(itemId: string): Promise<Row | undefined> {\n const index = await this.controller?.expandParentNodes(itemId);\n if (index != null) {\n return this.rows[index];\n } else {\n return undefined;\n }\n }\n\n /**\n * Returns the row data from the given mouse or pointer event. The event must\n * originate from a `vertex-scene-tree-table-cell` contained by this element,\n * otherwise `undefined` is returned.\n *\n * @param event A mouse or pointer event that originated from this component.\n * @returns A row, or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public async getRowForEvent(event: MouseEvent | PointerEvent): Promise<Row> {\n const { clientY, target } = event;\n\n if (\n target != null &&\n this.errorDetails == null &&\n getSceneTreeContainsElement(this.el, target as HTMLElement) &&\n isSceneTreeTableCellElement(target)\n ) {\n return this.getRowAtClientY(clientY);\n } else {\n return undefined;\n }\n }\n\n /**\n * Returns the row data from the given vertical client position.\n *\n * @param clientY The vertical client position.\n * @returns A row or `undefined` if the row hasn't been loaded.\n */\n @Method()\n public getRowAtClientY(clientY: number): Promise<Row> {\n const layoutEl = this.getLayoutElement();\n const top = layoutEl.layoutOffset;\n const index = Math.floor(\n (clientY - top + layoutEl.scrollOffset) / layoutEl.rowHeight\n );\n return this.getRowAtIndex(index);\n }\n\n /**\n * Performs an async request that will filter the displayed items in the tree\n * that match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n * @returns A promise that completes when the request has completed. Note,\n * items are displayed asynchronously. So the displayed items may not reflect\n * the result of this filter when the promise completes.\n */\n @Method()\n public async filterItems(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n const optionsAsFilterOptions: FilterOptions = {\n ...options,\n metadataSearchKeys: options.columns,\n };\n const columnsToSearch = this.getMetadataSearchKeys(optionsAsFilterOptions);\n\n return this.controller?.filter(term, {\n ...options,\n columns: columnsToSearch,\n });\n }\n\n /**\n * Performs an async request that will select the filtered items in the tree\n * that match the given term.\n *\n * @param term The filter term.\n * @returns A promise that completes when the request has completed.\n */\n @Method()\n public async selectFilteredItems(\n term: string,\n options?: SceneTreeOperationOptions\n ): Promise<void> {\n if (this.viewer != null) {\n const metadataSearchKeys =\n this.searchOptions?.metadataSearchKeys ?? this.metadataSearchKeys;\n const definedMetadataKeys =\n metadataSearchKeys.length > 0 ? metadataSearchKeys : this.metadataKeys;\n\n const columnsToSearch =\n definedMetadataKeys.length > 0\n ? definedMetadataKeys\n : ['VERTEX_SCENE_ITEM_NAME'];\n\n const shouldSearchExactMatch =\n this.searchOptions?.exactMatch ?? this.metadataSearchExactMatch;\n const shouldSearchRemoveHiddenItems =\n this.searchOptions?.removeHiddenItems ?? false;\n\n await selectFilterResults(\n this.viewer,\n term,\n columnsToSearch,\n shouldSearchExactMatch,\n shouldSearchRemoveHiddenItems,\n {\n append: false,\n ...options,\n }\n );\n }\n }\n\n /**\n * Fetches the metadata keys that are available to the scene tree. Metadata\n * keys can be assigned to the scene tree using the `metadataKeys` property.\n * The scene tree will fetch this metadata and make these values available\n * for data binding.\n *\n * @returns A promise that resolves with the names of available keys.\n */\n @Method()\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.controller?.fetchMetadataKeys() ?? [];\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.viewerDisposable?.dispose();\n this.stateMap.viewerSceneReadyDisposable?.dispose();\n this.controller?.cancel();\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n if (this.controller == null) {\n const { sceneTreeHost } = this.getConfig().network;\n const client = new SceneTreeAPIClient(\n sceneTreeHost,\n this.getConfig().flags.grpcUseStreamingWebSocketTransport\n ? {\n transport: webSocketSubscriptionTransportFactory,\n }\n : undefined\n );\n this.controller = new SceneTreeController(client, 100);\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n this.stateMap.onStateChangeDisposable = this.controller.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n this.ensureLayoutDefined();\n this.updateLayoutElement();\n\n const layoutEl = this.getLayoutElement();\n const resizeObserver = new ResizeObserver(() => {\n this.invalidateRows();\n });\n resizeObserver.observe(layoutEl);\n this.stateMap.resizeObserver = resizeObserver;\n\n this.stateMap.componentLoaded = true;\n\n this.controller?.setMetadataKeys(this.metadataKeys);\n\n if (this.viewer == null) {\n this.errorDetails = new SceneTreeErrorDetails(\n 'MISSING_VIEWER',\n SceneTreeErrorCode.MISSING_VIEWER\n );\n }\n }\n\n public componentWillRender(): void {\n // The controller can load data prior to the first render\n // ensure that this renders any time the state changes.\n this.updateLayoutElement();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"header\">\n <slot name=\"header\">\n <vertex-scene-tree-toolbar class=\"search-toolbar\">\n <vertex-scene-tree-search controller={this.controller} />\n </vertex-scene-tree-toolbar>\n </slot>\n </div>\n\n <slot name=\"partial-filter-results-banner\">\n {this.hasPartialFilterResults && (\n <vertex-scene-tree-notification-banner\n message={\n this.refreshingResults\n ? 'Refreshing results...'\n : 'Data loading, refresh for more.'\n }\n actionLabel=\"Refresh\"\n onAction={() => this.controller?.refreshFilter()}\n />\n )}\n </slot>\n\n {this.errorDetails != null && this.renderError(this.errorDetails)}\n\n {this.errorDetails == null && (\n <div class=\"rows-scroll\">\n {this.showLoader && (\n <slot name=\"loading\">\n <vertex-viewer-spinner class=\"loading\" size=\"md\" />\n </slot>\n )}\n <slot />\n {this.showEmptyResults && (\n <slot name=\"empty-results\">\n <div class=\"empty-results\">No Results Found.</div>\n </slot>\n )}\n </div>\n )}\n\n <div class=\"footer\">\n <slot name=\"footer\" />\n </div>\n </Host>\n );\n }\n\n private renderError(details: SceneTreeErrorDetails): h.JSX.IntrinsicElements {\n if (details.code !== SceneTreeErrorCode.SCENE_TREE_DISABLED) {\n return (\n <SceneTreeError details={details}>\n <button\n class=\"button button-secondary\"\n onClick={() => this.retryConnectToViewer()}\n disabled={this.attemptingRetry}\n >\n Retry\n </button>\n </SceneTreeError>\n );\n } else {\n return <SceneTreeError details={details} />;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer: HTMLVertexViewerElement | undefined,\n oldViewer: HTMLVertexViewerElement | undefined\n ): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.connectToViewer();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(newController: SceneTreeController): void {\n // StencilJS will invoke this callback even before the component has been\n // loaded. According to their docs, this shouldn't happen. Return if the\n // component hasn't been loaded.\n // See https://stenciljs.com/docs/reactive-data#watch-decorator\n if (!this.stateMap.componentLoaded) {\n return;\n }\n\n this.stateMap.onStateChangeDisposable?.dispose();\n\n this.stateMap.onStateChangeDisposable = newController.onStateChange.on(\n (state) => this.handleControllerStateChange(state)\n );\n\n newController.setMetadataKeys(this.metadataKeys);\n }\n\n /**\n * @ignore\n */\n @Watch('metadataKeys')\n protected handleMetadataKeysChanged(): void {\n this.controller?.setMetadataKeys(this.metadataKeys);\n }\n\n private retryConnectToViewer(): void {\n this.attemptingRetry = true;\n this.errorDetails = undefined;\n this.connectToViewer();\n }\n\n private connectToViewer(): void {\n this.stateMap.viewerDisposable?.dispose();\n this.stateMap.viewerSceneReadyDisposable?.dispose();\n\n if (this.viewer == null && this.viewerSelector != null) {\n this.viewer = document.querySelector(this.viewerSelector) as\n | HTMLVertexViewerElement\n | undefined;\n }\n\n if (this.viewer != null) {\n const handleSceneReady = async (): Promise<void> => {\n const layoutEl = this.getLayoutElement();\n\n await layoutEl.attemptComputeCellHeight();\n };\n\n this.viewer.addEventListener('sceneReady', handleSceneReady);\n this.stateMap.viewerDisposable = this.controller?.connectToViewer(\n this.viewer\n );\n this.stateMap.viewerSceneReadyDisposable = {\n dispose: () =>\n this.viewer?.removeEventListener('sceneReady', handleSceneReady),\n };\n } else {\n this.attemptingRetry = false;\n }\n }\n\n private scheduleClearUnusedData(): void {\n if (this.stateMap.idleCallbackId != null) {\n window.cancelIdleCallback(this.stateMap.idleCallbackId);\n }\n\n this.stateMap.idleCallbackId = window.requestIdleCallback((foo) => {\n const remaining = foo.timeRemaining?.();\n\n if (remaining == null || remaining >= MIN_CLEAR_UNUSED_DATA_MS) {\n const layoutEl = this.getLayoutElement();\n const startIndex = layoutEl.viewportStartIndex;\n const endIndex = layoutEl.viewportEndIndex;\n const [start, end] =\n this.controller?.getPageIndexesForRange(startIndex, endIndex) || [];\n\n if (start != null && end != null) {\n this.controller?.invalidatePagesOutsideRange(start, end, 50);\n }\n } else {\n this.scheduleClearUnusedData();\n }\n });\n }\n\n private handleControllerStateChange(state: SceneTreeState): void {\n this.showLoader = !!state.shouldShowLoading;\n this.showEmptyResults = !!state.shouldShowEmptyResults;\n this.rows = state.rows;\n this.totalRows = state.totalRows;\n this.hasPartialFilterResults = !!state.isPartialFilterResponse;\n this.refreshingResults = !!state.isSearching;\n\n if (state.connection.type === 'failure') {\n this.errorDetails = state.connection.details;\n this.connectionError.emit(state.connection.details);\n } else if (state.connection.type === 'disconnected') {\n this.errorDetails = new SceneTreeErrorDetails(\n 'DISCONNECTED',\n SceneTreeErrorCode.DISCONNECTED\n );\n } else {\n this.errorDetails = undefined;\n }\n\n if (\n state.connection.type === 'connected' ||\n state.connection.type === 'failure'\n ) {\n this.attemptingRetry = false;\n }\n }\n\n private getNodeFromRowOrIndex(\n rowOrIndex: number | Row | Node.AsObject\n ): Node.AsObject {\n const row =\n typeof rowOrIndex === 'number' ? this.rows[rowOrIndex] : rowOrIndex;\n\n if (row == null) {\n throw new Error(`Cannot perform scene tree operation. Row not found.`);\n }\n\n return isLoadedRow(row) ? row.node : row;\n }\n\n private async performRowOperation(\n rowOrIndex: number | Row | Node.AsObject,\n op: OperationHandler\n ): Promise<void> {\n const node = this.getNodeFromRowOrIndex(rowOrIndex);\n\n if (node.id == null) {\n throw new Error(`Cannot perform scene tree operation. ID is undefined.`);\n }\n\n if (this.viewer == null) {\n throw new Error(\n `Cannot perform scene tree operation. Cannot get reference to viewer.`\n );\n }\n\n await op({ viewer: this.viewer, id: node.id.hex, node });\n }\n\n @Listen('search')\n protected async handleSearch(event: CustomEvent<string>): Promise<void> {\n const columnsToSearch = this.getMetadataSearchKeys(this.searchOptions);\n\n const shouldSearchExactMatch =\n this.searchOptions?.exactMatch ?? this.metadataSearchExactMatch;\n const shouldSearchRemoveHiddenItems =\n this.searchOptions?.removeHiddenItems ?? false;\n\n try {\n await this.filterItems(event.detail, {\n columns: columnsToSearch,\n exactMatch: shouldSearchExactMatch,\n removeHiddenItems: shouldSearchRemoveHiddenItems,\n });\n } catch (e) {\n console.error('Failed to filter tree with exception: ', e);\n }\n }\n\n @Listen('cellLoaded')\n protected async handleCellLoaded(): Promise<void> {\n if (!this.firstCellRendered && this.rows.length > 0) {\n this.firstCellRendered = true;\n this.firstRowRendered.emit();\n }\n }\n\n private getScrollToPosition(\n index: number,\n position: ScrollToOptions['position']\n ): number {\n const layoutEl = this.getLayoutElement();\n const constrainedIndex = Math.max(0, Math.min(index, this.totalRows - 1));\n const viewportHeight = layoutEl.layoutHeight ?? 0;\n const rowHeight = layoutEl.rowHeight;\n\n if (position === 'start') {\n return constrainedIndex * rowHeight;\n } else if (position === 'middle') {\n const rowCenterY = constrainedIndex * rowHeight + rowHeight / 2;\n return rowCenterY - viewportHeight / 2;\n } else {\n const rowBottomY = constrainedIndex * rowHeight + rowHeight;\n return rowBottomY - viewportHeight;\n }\n }\n\n private getConfig(): Config {\n return parseAndValidateConfig(this.configEnv, this.config);\n }\n\n private ensureLayoutDefined(): void {\n let layout = this.el.querySelector('vertex-scene-tree-table-layout');\n if (layout == null) {\n layout = document.createElement('vertex-scene-tree-table-layout');\n layout.innerHTML = `\n <vertex-scene-tree-table-column>\n <template>\n <vertex-scene-tree-table-cell prop:value=\"{{row.node.name}}\" expand-toggle isolate-button visibility-toggle></vertex-scene-tree-table-cell>\n </template>\n </vertex-scene-tree-table-column>\n `;\n\n this.el.appendChild(layout);\n }\n this.stateMap.layoutEl = layout;\n }\n\n private updateLayoutElement(): void {\n const layout = this.stateMap.layoutEl;\n if (layout != null) {\n layout.rows = this.rows;\n layout.tree = this.el as HTMLVertexSceneTreeElement;\n layout.totalRows = this.totalRows;\n layout.controller = this.controller;\n layout.rowData = this.rowData;\n } else if (!this.stateMap.componentLoaded && this.totalRows > 0) {\n console.debug(\n 'Scene tree has rows, but the component has not yet rendered'\n );\n }\n }\n\n private getLayoutElement(): HTMLVertexSceneTreeTableLayoutElement {\n if (this.stateMap.layoutEl != null) {\n return this.stateMap.layoutEl;\n } else {\n throw new Error('Layout element is undefined');\n }\n }\n\n private getMetadataSearchKeys(options: FilterOptions): string[] | undefined {\n const metadataSearchKeys =\n options?.metadataSearchKeys ?? this.metadataSearchKeys;\n const shouldSearchExactMatch =\n options?.exactMatch ?? this.metadataSearchExactMatch;\n\n if (shouldSearchExactMatch) {\n // If we're performing an exact match search, we want to include the searched\n // metadata keys if provided. In the case that none have been provided, simply\n // fall back the item name.\n const definedMetadataKeys =\n metadataSearchKeys.length > 0\n ? metadataSearchKeys\n : [SCENE_ITEM_NAME_METADATA_KEY];\n\n return definedMetadataKeys;\n } else if (metadataSearchKeys.length > 0) {\n // If we're not performing an exact match search, and a set of metadata keys\n // to search against have been provided, we want to include those in the request.\n return metadataSearchKeys;\n }\n\n // If we're not performing an exact match search, and we have no provided metadata\n // search keys, we can perform a name-only search, and omit the array of keys.\n return undefined;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/@stencil/core/internal/client/shadow-css.js"],"names":["safeSelector","selector","placeholders","index","replace","_","keep","replaceBy","push","content","pseudo","exp","ss","restoreSafeSelector","_polyfillHost","_polyfillSlotted","_polyfillHostContext","_parenSuffix","_cssColonHostRe","RegExp","_cssColonHostContextRe","_cssColonSlottedRe","_polyfillHostNoCombinator","_polyfillHostNoCombinatorRe","_shadowDOMSelectorsRe","_selectorReSuffix","_polyfillHostRe","_colonHostRe","_colonSlottedRe","_colonHostContextRe","_commentRe","stripComments","input","_commentWithHashRe","extractCommentsWithHash","match","_ruleRe","_curlyRe","_selectorPartsRe","OPEN_CURLY","CLOSE_CURLY","BLOCK_PLACEHOLDER","processRules","ruleCallback","inputWithEscapedBlocks","escapeBlocks","nextBlockIndex","escapedString","m","suffix","contentPrefix","startsWith","blocks","substring","length","cssRule","rule","inputParts","split","resultParts","escapedBlocks","bracketCount","currentBlockParts","partIndex","part","join","strEscapedBlocks","insertPolyfillHostInCssText","convertColonRule","cssText","regExp","partReplacer","parts","r","i","p","trim","colonHostPartReplacer","host","convertColonHost","colonHostContextPartReplacer","indexOf","convertColonSlotted","slotScopeId","slotClass","selectors","compound","slottedSelector","prefixSelector","char","orgSelector","addedSelector","trimRight","updatedSelector","convertColonHostContext","convertShadowDOMSelectors","reduce","result","pattern","makeScopeMatcher","scopeSelector","lre","rre","selectorNeedsScoping","re","test","injectScopingSelector","scopingSelector","before","_colonGroup","colon","after","applySimpleSelectorScope","hostSelector","lastIndex","applyStrictSelectorScope","isRe","className","_scopeSelectorPart","scopedP","t","safeContent","scopedSelector","startIndex","res","sep","hasHost","shouldScope","exec","separator","slice","scopedPart","scopeSelectorText","slotSelector","map","shallowPart","scopeSelectors","commentOriginalSelector","scopeCssText","scopeId","hostScopeId","slotted","slottedSelectors","scopeCss","commentsWithHash","orgSelectors","processCommentedSelector","placeholder","comment","scoped","forEach"],"mappings":"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","sourcesContent":["/*\n Stencil Client Platform v2.16.1 | MIT Licensed | https://stenciljs.com\n */\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n *\n * This file is a port of shadowCSS from webcomponents.js to TypeScript.\n * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js\n * https://github.com/angular/angular/blob/master/packages/compiler/src/shadow_css.ts\n */\nconst safeSelector = (selector) => {\n const placeholders = [];\n let index = 0;\n // Replaces attribute selectors with placeholders.\n // The WS in [attr=\"va lue\"] would otherwise be interpreted as a selector separator.\n selector = selector.replace(/(\\[[^\\]]*\\])/g, (_, keep) => {\n const replaceBy = `__ph-${index}__`;\n placeholders.push(keep);\n index++;\n return replaceBy;\n });\n // Replaces the expression in `:nth-child(2n + 1)` with a placeholder.\n // WS and \"+\" would otherwise be interpreted as selector separators.\n const content = selector.replace(/(:nth-[-\\w]+)(\\([^)]+\\))/g, (_, pseudo, exp) => {\n const replaceBy = `__ph-${index}__`;\n placeholders.push(exp);\n index++;\n return pseudo + replaceBy;\n });\n const ss = {\n content,\n placeholders,\n };\n return ss;\n};\nconst restoreSafeSelector = (placeholders, content) => {\n return content.replace(/__ph-(\\d+)__/g, (_, index) => placeholders[+index]);\n};\nconst _polyfillHost = '-shadowcsshost';\nconst _polyfillSlotted = '-shadowcssslotted';\n// note: :host-context pre-processed to -shadowcsshostcontext.\nconst _polyfillHostContext = '-shadowcsscontext';\nconst _parenSuffix = ')(?:\\\\((' + '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' + ')\\\\))?([^,{]*)';\nconst _cssColonHostRe = new RegExp('(' + _polyfillHost + _parenSuffix, 'gim');\nconst _cssColonHostContextRe = new RegExp('(' + _polyfillHostContext + _parenSuffix, 'gim');\nconst _cssColonSlottedRe = new RegExp('(' + _polyfillSlotted + _parenSuffix, 'gim');\nconst _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';\nconst _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\\s]*)/;\nconst _shadowDOMSelectorsRe = [/::shadow/g, /::content/g];\nconst _selectorReSuffix = '([>\\\\s~+[.,{:][\\\\s\\\\S]*)?$';\nconst _polyfillHostRe = /-shadowcsshost/gim;\nconst _colonHostRe = /:host/gim;\nconst _colonSlottedRe = /::slotted/gim;\nconst _colonHostContextRe = /:host-context/gim;\nconst _commentRe = /\\/\\*\\s*[\\s\\S]*?\\*\\//g;\nconst stripComments = (input) => {\n return input.replace(_commentRe, '');\n};\nconst _commentWithHashRe = /\\/\\*\\s*#\\s*source(Mapping)?URL=[\\s\\S]+?\\*\\//g;\nconst extractCommentsWithHash = (input) => {\n return input.match(_commentWithHashRe) || [];\n};\nconst _ruleRe = /(\\s*)([^;\\{\\}]+?)(\\s*)((?:{%BLOCK%}?\\s*;?)|(?:\\s*;))/g;\nconst _curlyRe = /([{}])/g;\nconst _selectorPartsRe = /(^.*?[^\\\\])??((:+)(.*)|$)/;\nconst OPEN_CURLY = '{';\nconst CLOSE_CURLY = '}';\nconst BLOCK_PLACEHOLDER = '%BLOCK%';\nconst processRules = (input, ruleCallback) => {\n const inputWithEscapedBlocks = escapeBlocks(input);\n let nextBlockIndex = 0;\n return inputWithEscapedBlocks.escapedString.replace(_ruleRe, (...m) => {\n const selector = m[2];\n let content = '';\n let suffix = m[4];\n let contentPrefix = '';\n if (suffix && suffix.startsWith('{' + BLOCK_PLACEHOLDER)) {\n content = inputWithEscapedBlocks.blocks[nextBlockIndex++];\n suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1);\n contentPrefix = '{';\n }\n const cssRule = {\n selector,\n content,\n };\n const rule = ruleCallback(cssRule);\n return `${m[1]}${rule.selector}${m[3]}${contentPrefix}${rule.content}${suffix}`;\n });\n};\nconst escapeBlocks = (input) => {\n const inputParts = input.split(_curlyRe);\n const resultParts = [];\n const escapedBlocks = [];\n let bracketCount = 0;\n let currentBlockParts = [];\n for (let partIndex = 0; partIndex < inputParts.length; partIndex++) {\n const part = inputParts[partIndex];\n if (part === CLOSE_CURLY) {\n bracketCount--;\n }\n if (bracketCount > 0) {\n currentBlockParts.push(part);\n }\n else {\n if (currentBlockParts.length > 0) {\n escapedBlocks.push(currentBlockParts.join(''));\n resultParts.push(BLOCK_PLACEHOLDER);\n currentBlockParts = [];\n }\n resultParts.push(part);\n }\n if (part === OPEN_CURLY) {\n bracketCount++;\n }\n }\n if (currentBlockParts.length > 0) {\n escapedBlocks.push(currentBlockParts.join(''));\n resultParts.push(BLOCK_PLACEHOLDER);\n }\n const strEscapedBlocks = {\n escapedString: resultParts.join(''),\n blocks: escapedBlocks,\n };\n return strEscapedBlocks;\n};\nconst insertPolyfillHostInCssText = (selector) => {\n selector = selector\n .replace(_colonHostContextRe, _polyfillHostContext)\n .replace(_colonHostRe, _polyfillHost)\n .replace(_colonSlottedRe, _polyfillSlotted);\n return selector;\n};\nconst convertColonRule = (cssText, regExp, partReplacer) => {\n // m[1] = :host(-context), m[2] = contents of (), m[3] rest of rule\n return cssText.replace(regExp, (...m) => {\n if (m[2]) {\n const parts = m[2].split(',');\n const r = [];\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i].trim();\n if (!p)\n break;\n r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));\n }\n return r.join(',');\n }\n else {\n return _polyfillHostNoCombinator + m[3];\n }\n });\n};\nconst colonHostPartReplacer = (host, part, suffix) => {\n return host + part.replace(_polyfillHost, '') + suffix;\n};\nconst convertColonHost = (cssText) => {\n return convertColonRule(cssText, _cssColonHostRe, colonHostPartReplacer);\n};\nconst colonHostContextPartReplacer = (host, part, suffix) => {\n if (part.indexOf(_polyfillHost) > -1) {\n return colonHostPartReplacer(host, part, suffix);\n }\n else {\n return host + part + suffix + ', ' + part + ' ' + host + suffix;\n }\n};\nconst convertColonSlotted = (cssText, slotScopeId) => {\n const slotClass = '.' + slotScopeId + ' > ';\n const selectors = [];\n cssText = cssText.replace(_cssColonSlottedRe, (...m) => {\n if (m[2]) {\n const compound = m[2].trim();\n const suffix = m[3];\n const slottedSelector = slotClass + compound + suffix;\n let prefixSelector = '';\n for (let i = m[4] - 1; i >= 0; i--) {\n const char = m[5][i];\n if (char === '}' || char === ',') {\n break;\n }\n prefixSelector = char + prefixSelector;\n }\n const orgSelector = prefixSelector + slottedSelector;\n const addedSelector = `${prefixSelector.trimRight()}${slottedSelector.trim()}`;\n if (orgSelector.trim() !== addedSelector.trim()) {\n const updatedSelector = `${addedSelector}, ${orgSelector}`;\n selectors.push({\n orgSelector,\n updatedSelector,\n });\n }\n return slottedSelector;\n }\n else {\n return _polyfillHostNoCombinator + m[3];\n }\n });\n return {\n selectors,\n cssText,\n };\n};\nconst convertColonHostContext = (cssText) => {\n return convertColonRule(cssText, _cssColonHostContextRe, colonHostContextPartReplacer);\n};\nconst convertShadowDOMSelectors = (cssText) => {\n return _shadowDOMSelectorsRe.reduce((result, pattern) => result.replace(pattern, ' '), cssText);\n};\nconst makeScopeMatcher = (scopeSelector) => {\n const lre = /\\[/g;\n const rre = /\\]/g;\n scopeSelector = scopeSelector.replace(lre, '\\\\[').replace(rre, '\\\\]');\n return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');\n};\nconst selectorNeedsScoping = (selector, scopeSelector) => {\n const re = makeScopeMatcher(scopeSelector);\n return !re.test(selector);\n};\nconst injectScopingSelector = (selector, scopingSelector) => {\n return selector.replace(_selectorPartsRe, (_, before = '', _colonGroup, colon = '', after = '') => {\n return before + scopingSelector + colon + after;\n });\n};\nconst applySimpleSelectorScope = (selector, scopeSelector, hostSelector) => {\n // In Android browser, the lastIndex is not reset when the regex is used in String.replace()\n _polyfillHostRe.lastIndex = 0;\n if (_polyfillHostRe.test(selector)) {\n const replaceBy = `.${hostSelector}`;\n return selector\n .replace(_polyfillHostNoCombinatorRe, (_, selector) => injectScopingSelector(selector, replaceBy))\n .replace(_polyfillHostRe, replaceBy + ' ');\n }\n return scopeSelector + ' ' + selector;\n};\nconst applyStrictSelectorScope = (selector, scopeSelector, hostSelector) => {\n const isRe = /\\[is=([^\\]]*)\\]/g;\n scopeSelector = scopeSelector.replace(isRe, (_, ...parts) => parts[0]);\n const className = '.' + scopeSelector;\n const _scopeSelectorPart = (p) => {\n let scopedP = p.trim();\n if (!scopedP) {\n return '';\n }\n if (p.indexOf(_polyfillHostNoCombinator) > -1) {\n scopedP = applySimpleSelectorScope(p, scopeSelector, hostSelector);\n }\n else {\n // remove :host since it should be unnecessary\n const t = p.replace(_polyfillHostRe, '');\n if (t.length > 0) {\n scopedP = injectScopingSelector(t, className);\n }\n }\n return scopedP;\n };\n const safeContent = safeSelector(selector);\n selector = safeContent.content;\n let scopedSelector = '';\n let startIndex = 0;\n let res;\n const sep = /( |>|\\+|~(?!=))\\s*/g;\n // If a selector appears before :host it should not be shimmed as it\n // matches on ancestor elements and not on elements in the host's shadow\n // `:host-context(div)` is transformed to\n // `-shadowcsshost-no-combinatordiv, div -shadowcsshost-no-combinator`\n // the `div` is not part of the component in the 2nd selectors and should not be scoped.\n // Historically `component-tag:host` was matching the component so we also want to preserve\n // this behavior to avoid breaking legacy apps (it should not match).\n // The behavior should be:\n // - `tag:host` -> `tag[h]` (this is to avoid breaking legacy apps, should not match anything)\n // - `tag :host` -> `tag [h]` (`tag` is not scoped because it's considered part of a\n // `:host-context(tag)`)\n const hasHost = selector.indexOf(_polyfillHostNoCombinator) > -1;\n // Only scope parts after the first `-shadowcsshost-no-combinator` when it is present\n let shouldScope = !hasHost;\n while ((res = sep.exec(selector)) !== null) {\n const separator = res[1];\n const part = selector.slice(startIndex, res.index).trim();\n shouldScope = shouldScope || part.indexOf(_polyfillHostNoCombinator) > -1;\n const scopedPart = shouldScope ? _scopeSelectorPart(part) : part;\n scopedSelector += `${scopedPart} ${separator} `;\n startIndex = sep.lastIndex;\n }\n const part = selector.substring(startIndex);\n shouldScope = shouldScope || part.indexOf(_polyfillHostNoCombinator) > -1;\n scopedSelector += shouldScope ? _scopeSelectorPart(part) : part;\n // replace the placeholders with their original values\n return restoreSafeSelector(safeContent.placeholders, scopedSelector);\n};\nconst scopeSelector = (selector, scopeSelectorText, hostSelector, slotSelector) => {\n return selector\n .split(',')\n .map((shallowPart) => {\n if (slotSelector && shallowPart.indexOf('.' + slotSelector) > -1) {\n return shallowPart.trim();\n }\n if (selectorNeedsScoping(shallowPart, scopeSelectorText)) {\n return applyStrictSelectorScope(shallowPart, scopeSelectorText, hostSelector).trim();\n }\n else {\n return shallowPart.trim();\n }\n })\n .join(', ');\n};\nconst scopeSelectors = (cssText, scopeSelectorText, hostSelector, slotSelector, commentOriginalSelector) => {\n return processRules(cssText, (rule) => {\n let selector = rule.selector;\n let content = rule.content;\n if (rule.selector[0] !== '@') {\n selector = scopeSelector(rule.selector, scopeSelectorText, hostSelector, slotSelector);\n }\n else if (rule.selector.startsWith('@media') ||\n rule.selector.startsWith('@supports') ||\n rule.selector.startsWith('@page') ||\n rule.selector.startsWith('@document')) {\n content = scopeSelectors(rule.content, scopeSelectorText, hostSelector, slotSelector);\n }\n const cssRule = {\n selector: selector.replace(/\\s{2,}/g, ' ').trim(),\n content,\n };\n return cssRule;\n });\n};\nconst scopeCssText = (cssText, scopeId, hostScopeId, slotScopeId, commentOriginalSelector) => {\n cssText = insertPolyfillHostInCssText(cssText);\n cssText = convertColonHost(cssText);\n cssText = convertColonHostContext(cssText);\n const slotted = convertColonSlotted(cssText, slotScopeId);\n cssText = slotted.cssText;\n cssText = convertShadowDOMSelectors(cssText);\n if (scopeId) {\n cssText = scopeSelectors(cssText, scopeId, hostScopeId, slotScopeId);\n }\n cssText = cssText.replace(/-shadowcsshost-no-combinator/g, `.${hostScopeId}`);\n cssText = cssText.replace(/>\\s*\\*\\s+([^{, ]+)/gm, ' $1 ');\n return {\n cssText: cssText.trim(),\n slottedSelectors: slotted.selectors,\n };\n};\nconst scopeCss = (cssText, scopeId, commentOriginalSelector) => {\n const hostScopeId = scopeId + '-h';\n const slotScopeId = scopeId + '-s';\n const commentsWithHash = extractCommentsWithHash(cssText);\n cssText = stripComments(cssText);\n const orgSelectors = [];\n if (commentOriginalSelector) {\n const processCommentedSelector = (rule) => {\n const placeholder = `/*!@___${orgSelectors.length}___*/`;\n const comment = `/*!@${rule.selector}*/`;\n orgSelectors.push({ placeholder, comment });\n rule.selector = placeholder + rule.selector;\n return rule;\n };\n cssText = processRules(cssText, (rule) => {\n if (rule.selector[0] !== '@') {\n return processCommentedSelector(rule);\n }\n else if (rule.selector.startsWith('@media') ||\n rule.selector.startsWith('@supports') ||\n rule.selector.startsWith('@page') ||\n rule.selector.startsWith('@document')) {\n rule.content = processRules(rule.content, processCommentedSelector);\n return rule;\n }\n return rule;\n });\n }\n const scoped = scopeCssText(cssText, scopeId, hostScopeId, slotScopeId);\n cssText = [scoped.cssText, ...commentsWithHash].join('\\n');\n if (commentOriginalSelector) {\n orgSelectors.forEach(({ placeholder, comment }) => {\n cssText = cssText.replace(placeholder, comment);\n });\n }\n scoped.slottedSelectors.forEach((slottedSelector) => {\n cssText = cssText.replace(slottedSelector.orgSelector, slottedSelector.updatedSelector);\n });\n return cssText;\n};\n\nexport { scopeCss };\n"]}
|