@thatopen/services 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -46
- package/dist/built-in/index.d.ts +486 -563
- package/dist/cli/lib/npmrc.d.ts +28 -0
- package/dist/cli/lib/npmrc.test.d.ts +1 -0
- package/dist/cli.js +91 -7
- package/dist/core/client.d.ts +10 -0
- package/dist/index.cjs.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +42 -32
- package/dist/types/npm.d.ts +14 -0
- package/dist/vite-env.d.ts +1 -1
- package/docs/builtin/paths.json +74 -70
- package/docs/cli/create.md +28 -28
- package/docs/cli/local-server.md +38 -38
- package/docs/cli/login.md +32 -32
- package/docs/cli/publish.md +31 -31
- package/docs/cli/run.md +26 -26
- package/docs/cli/serve.md +43 -43
- package/docs/cli/swap.md +30 -30
- package/package.json +100 -100
- package/resources/AGENTS.md +40 -40
- package/src/built-in/CDEManager/example.ts +214 -214
- package/src/built-in/CDEManager/examples/FileEditing/example.ts +226 -226
- package/src/built-in/CDEManager/examples/FileMoves/example.ts +186 -186
- package/src/built-in/CDEManager/examples/FileOperations/example.ts +295 -295
- package/src/built-in/CDEManager/examples/FileTransfers/example.ts +210 -210
- package/src/built-in/CDEManager/examples/FolderManagement/example.ts +230 -230
- package/src/built-in/CDEManager/examples/MetadataSchema/example.ts +230 -230
- package/src/built-in/CDEManager/examples/MetadataViews/example.ts +166 -166
- package/src/built-in/CDEManager/examples/ProjectConfig/example.ts +177 -177
- package/src/built-in/UIManager/src/app/example.ts +99 -99
- package/src/built-in/UIManager/src/app/examples/AppState/example.ts +142 -142
- package/src/built-in/UIManager/src/app/examples/Banner/example.ts +161 -0
- package/src/built-in/UIManager/src/app/examples/Contexts/example.ts +125 -125
- package/src/built-in/UIManager/src/app/examples/FileDrop/example.ts +126 -0
- package/src/built-in/UIManager/src/app/examples/FloatingLayout/example.ts +92 -92
- package/src/built-in/UIManager/src/app/examples/Modal/example.ts +165 -0
- package/src/built-in/UIManager/src/app/examples/Notifications/example.ts +135 -161
- package/src/built-in/UIManager/src/app/examples/Sidebar/example.ts +104 -104
- package/src/built-in/index.ts +649 -755
- package/src/cli/templates/app/README.md +241 -241
- package/src/cli/templates/app/index.html +35 -27
- package/src/cli/templates/app/package.json +31 -27
- package/src/cli/templates/app/src/app.ts +37 -0
- package/src/cli/templates/app/src/assets/tool-placeholder.ts +50 -0
- package/src/cli/templates/app/src/bim-components/CloudRunner/index.ts +95 -87
- package/src/cli/templates/app/src/bim-components/CloudRunner/src/index.ts +1 -1
- package/src/cli/templates/app/src/bim-components/CloudRunner/src/types.ts +5 -5
- package/src/cli/templates/app/src/bim-components/index.ts +1 -1
- package/src/cli/templates/app/src/globals.ts +1 -0
- package/src/cli/templates/app/src/main.ts +340 -56
- package/src/cli/templates/app/src/setups/active-tool-hud.ts +69 -0
- package/src/cli/templates/app/src/setups/camera-tools.ts +63 -0
- package/src/cli/templates/app/src/setups/camera-views.ts +201 -0
- package/src/cli/templates/app/src/setups/card-header.ts +35 -0
- package/src/cli/templates/app/src/setups/clipper-panel.ts +167 -0
- package/src/cli/templates/app/src/setups/clipper-tool.ts +754 -0
- package/src/cli/templates/app/src/setups/clipper.ts +75 -0
- package/src/cli/templates/app/src/setups/cloud-runner.ts +13 -9
- package/src/cli/templates/app/src/setups/commands-panel.ts +239 -0
- package/src/cli/templates/app/src/setups/data-table-panel.ts +2224 -0
- package/src/cli/templates/app/src/setups/exploded-view.ts +246 -0
- package/src/cli/templates/app/src/setups/file-format-icons.ts +95 -0
- package/src/cli/templates/app/src/setups/files-panel.ts +1503 -0
- package/src/cli/templates/app/src/setups/fps-indicator.ts +63 -0
- package/src/cli/templates/app/src/setups/graphics-panel.ts +490 -0
- package/src/cli/templates/app/src/setups/helper-panel.ts +88 -0
- package/src/cli/templates/app/src/setups/hider.ts +98 -0
- package/src/cli/templates/app/src/setups/index.ts +33 -3
- package/src/cli/templates/app/src/setups/inspection.ts +136 -0
- package/src/cli/templates/app/src/setups/measurement-panel.ts +188 -0
- package/src/cli/templates/app/src/setups/measurement-settings-panel.ts +161 -0
- package/src/cli/templates/app/src/setups/measurement-tool.ts +570 -0
- package/src/cli/templates/app/src/setups/measurements.ts +133 -0
- package/src/cli/templates/app/src/setups/model-tree.ts +797 -0
- package/src/cli/templates/app/src/setups/navigation-gizmo.ts +316 -0
- package/src/cli/templates/app/src/setups/objects-panel.ts +127 -0
- package/src/cli/templates/app/src/setups/plans-panel.ts +619 -0
- package/src/cli/templates/app/src/setups/properties-panel.ts +1048 -0
- package/src/cli/templates/app/src/setups/reality-capture/lib/hidden-tiles-plugin.ts +88 -0
- package/src/cli/templates/app/src/setups/reality-capture/lib/point-tile-plugin.ts +166 -0
- package/src/cli/templates/app/src/setups/reality-capture/lib/render-frame.ts +31 -0
- package/src/cli/templates/app/src/setups/reality-capture/lib/splat-tile-plugin.ts +51 -0
- package/src/cli/templates/app/src/setups/reality-capture-viewer.ts +1383 -0
- package/src/cli/templates/app/src/setups/right-sidebar.ts +178 -0
- package/src/cli/templates/app/src/setups/settings-panel.ts +94 -0
- package/src/cli/templates/app/src/setups/styles-panel.ts +110 -0
- package/src/cli/templates/app/src/setups/styles.ts +375 -0
- package/src/cli/templates/app/src/setups/tool-mode-manager.ts +150 -0
- package/src/cli/templates/app/src/setups/tool-mode.ts +23 -0
- package/src/cli/templates/app/src/setups/toolbar.ts +229 -0
- package/src/cli/templates/app/src/setups/ui-manager.ts +27 -0
- package/src/cli/templates/app/src/setups/visibility-toolbar.ts +498 -0
- package/src/cli/templates/app/src/setups/walkthrough.ts +528 -0
- package/src/cli/templates/app/src/ui-components/app-info-section/index.ts +26 -0
- package/src/cli/templates/app/src/ui-components/app-info-section/src/index.ts +1 -0
- package/src/cli/templates/app/src/ui-components/app-info-section/src/types.ts +15 -0
- package/src/cli/templates/app/src/ui-components/cloud-runner-section/index.ts +37 -0
- package/src/cli/templates/app/src/ui-components/cloud-runner-section/src/index.ts +1 -0
- package/src/cli/templates/app/src/ui-components/cloud-runner-section/src/types.ts +14 -0
- package/src/cli/templates/app/src/ui-components/index.ts +2 -1
- package/src/cli/templates/app/tsconfig.json +16 -17
- package/src/cli/templates/app/vite.config.js +45 -42
- package/src/cli/templates/cloud-component/README.md +205 -205
- package/src/cli/templates/cloud-component/_thatopen +5 -5
- package/src/cli/templates/cloud-component/declarations.json +4 -4
- package/src/cli/templates/cloud-component/package.json +21 -21
- package/src/cli/templates/cloud-component/src/main.ts +70 -70
- package/src/cli/templates/cloud-component/tsconfig.json +16 -16
- package/src/cli/templates/cloud-component/vite.config.js +46 -46
- package/src/cli/templates/shared/AGENTS.md +8 -8
- package/src/cli/templates/shared/CLAUDE.md +1 -1
- package/src/cli/templates/shared/_gitignore +5 -4
- package/src/built-in/AppManager/example.ts +0 -86
- package/src/built-in/FileList/example.ts +0 -107
- package/src/built-in/TabbedNavigation/example.ts +0 -115
- package/src/built-in/ViewportsManager/example.ts +0 -106
- package/src/cli/templates/app/src/setups/fragments.ts +0 -18
- package/src/cli/templates/app/src/setups/ifc-loader.ts +0 -12
- package/src/cli/templates/app/src/ui-components/AppPanel/index.ts +0 -160
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import * as THREE from "three";
|
|
2
|
-
import * as OBC from "@thatopen/components";
|
|
3
|
-
import * as BUI from "@thatopen/ui";
|
|
4
|
-
|
|
5
|
-
import appManagerDef from "../AppManager/index";
|
|
6
|
-
import viewportManagerDef from "./index";
|
|
7
|
-
|
|
8
|
-
const AppManager = appManagerDef.componentDefinition;
|
|
9
|
-
const ViewportManager = viewportManagerDef.componentDefinition;
|
|
10
|
-
|
|
11
|
-
// ── App type ──────────────────────────────────────────────────────────
|
|
12
|
-
|
|
13
|
-
type PanelState = { components: OBC.Components };
|
|
14
|
-
|
|
15
|
-
interface ViewportApp {
|
|
16
|
-
icons: ["LOAD", "VIEW", "SPLIT"];
|
|
17
|
-
grid: BUI.Grid<
|
|
18
|
-
["Viewer", "Split"],
|
|
19
|
-
[
|
|
20
|
-
{ name: "viewer"; state: null },
|
|
21
|
-
{ name: "panel"; state: PanelState }
|
|
22
|
-
]
|
|
23
|
-
>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ── Initialise OBC & BUI ──────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
BUI.Manager.init();
|
|
29
|
-
const components = new OBC.Components();
|
|
30
|
-
|
|
31
|
-
const app = components.get(AppManager<ViewportApp>);
|
|
32
|
-
const viewports = components.get(ViewportManager);
|
|
33
|
-
|
|
34
|
-
// ── Create a viewport ─────────────────────────────────────────────────
|
|
35
|
-
|
|
36
|
-
const { element: viewerElement, world } = await viewports.create({
|
|
37
|
-
backgroundColor: "#202932",
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// ── Add a simple cube to the scene ────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
const geometry = new THREE.BoxGeometry(3, 3, 3);
|
|
43
|
-
const material = new THREE.MeshStandardMaterial({ color: "#6528D7" });
|
|
44
|
-
const cube = new THREE.Mesh(geometry, material);
|
|
45
|
-
cube.position.set(0, 1.5, 0);
|
|
46
|
-
world.scene.three.add(cube);
|
|
47
|
-
|
|
48
|
-
await world.camera.controls.setLookAt(10, 8, 10, 0, 1.5, 0);
|
|
49
|
-
|
|
50
|
-
// Load a sample model
|
|
51
|
-
const loadModel = async () => {
|
|
52
|
-
const fragments = components.get(OBC.FragmentsManager);
|
|
53
|
-
const file = await fetch(
|
|
54
|
-
"https://thatopen.github.io/engine_components/resources/frags/school_arq.frag",
|
|
55
|
-
);
|
|
56
|
-
const buffer = await file.arrayBuffer();
|
|
57
|
-
await fragments.core.load(buffer, { modelId: "school_arq" });
|
|
58
|
-
await fragments.core.update(true);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// ── Templates ─────────────────────────────────────────────────────────
|
|
62
|
-
|
|
63
|
-
const panelTemplate: BUI.StatefullComponent<PanelState> = (_state) => {
|
|
64
|
-
return BUI.html`
|
|
65
|
-
<bim-panel active label="App Info">
|
|
66
|
-
<bim-panel-section label="Actions">
|
|
67
|
-
<bim-button @click=${loadModel} label="Load School Model"></bim-button>
|
|
68
|
-
</bim-panel-section>
|
|
69
|
-
<bim-panel-section label="Info">
|
|
70
|
-
<bim-label>Use the sidebar to switch layouts.</bim-label>
|
|
71
|
-
</bim-panel-section>
|
|
72
|
-
</bim-panel>
|
|
73
|
-
`;
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
// ── Init ──────────────────────────────────────────────────────────────
|
|
77
|
-
|
|
78
|
-
app.init({
|
|
79
|
-
icons: {
|
|
80
|
-
LOAD: "solar:upload-bold",
|
|
81
|
-
VIEW: "mdi:monitor",
|
|
82
|
-
SPLIT: "solar:settings-bold",
|
|
83
|
-
},
|
|
84
|
-
grid: (grid) => {
|
|
85
|
-
grid.elements = {
|
|
86
|
-
viewer: viewerElement,
|
|
87
|
-
panel: { template: panelTemplate, initialState: { components } },
|
|
88
|
-
};
|
|
89
|
-
grid.layouts = {
|
|
90
|
-
Viewer: {
|
|
91
|
-
template: `"viewer" 1fr / 1fr`,
|
|
92
|
-
icon: app.icons.VIEW,
|
|
93
|
-
},
|
|
94
|
-
Split: {
|
|
95
|
-
template: `"panel viewer" 1fr / 20rem 1fr`,
|
|
96
|
-
icon: app.icons.SPLIT,
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
grid.layout = "Viewer";
|
|
100
|
-
},
|
|
101
|
-
container: document.getElementById("container")!,
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
app.showSidebar = true;
|
|
105
|
-
|
|
106
|
-
components.init();
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as OBC from "@thatopen/components";
|
|
2
|
-
import * as FRAGS from "@thatopen/fragments";
|
|
3
|
-
|
|
4
|
-
export const initFragments = async (components: OBC.Components): Promise<void> => {
|
|
5
|
-
const fragments = components.get(OBC.FragmentsManager);
|
|
6
|
-
|
|
7
|
-
const moduleWorkerUrl = await FRAGS.FragmentsModels.getWorker();
|
|
8
|
-
const workerUrl = await FRAGS.toClassicWorker(moduleWorkerUrl);
|
|
9
|
-
fragments.init(workerUrl, { classicWorker: true });
|
|
10
|
-
|
|
11
|
-
fragments.core.models.materials.list.onItemSet.add(({ value: material }) => {
|
|
12
|
-
if (!("isLodMaterial" in material && material.isLodMaterial)) {
|
|
13
|
-
material.polygonOffset = true;
|
|
14
|
-
material.polygonOffsetUnits = 1;
|
|
15
|
-
material.polygonOffsetFactor = Math.random();
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import * as OBC from "@thatopen/components";
|
|
2
|
-
|
|
3
|
-
export const initIfcLoader = async (components: OBC.Components): Promise<void> => {
|
|
4
|
-
const ifcLoader = components.get(OBC.IfcLoader);
|
|
5
|
-
await ifcLoader.setup({
|
|
6
|
-
autoSetWasm: false,
|
|
7
|
-
wasm: {
|
|
8
|
-
path: "https://unpkg.com/web-ifc@0.0.77/",
|
|
9
|
-
absolute: true,
|
|
10
|
-
},
|
|
11
|
-
});
|
|
12
|
-
};
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { LitElement, html } from "lit";
|
|
2
|
-
import { state } from "lit/decorators.js";
|
|
3
|
-
import { consume, createContext } from "@lit/context";
|
|
4
|
-
import * as OBC from "@thatopen/components";
|
|
5
|
-
import * as BUI from "@thatopen/ui";
|
|
6
|
-
import { PlatformClient } from "@thatopen/services";
|
|
7
|
-
import type { Item } from "@thatopen/services";
|
|
8
|
-
import { CloudRunner } from "../../bim-components";
|
|
9
|
-
|
|
10
|
-
const componentsContext = createContext<OBC.Components | undefined>("obc-components");
|
|
11
|
-
const clientContext = createContext<PlatformClient | undefined>("platform-client");
|
|
12
|
-
|
|
13
|
-
type FileRow = { Name: string; Extension: string; Load: string };
|
|
14
|
-
|
|
15
|
-
export class AppPanel extends LitElement {
|
|
16
|
-
@consume({ context: componentsContext, subscribe: true })
|
|
17
|
-
@state() private _components?: OBC.Components;
|
|
18
|
-
|
|
19
|
-
@consume({ context: clientContext, subscribe: true })
|
|
20
|
-
@state() private _client?: PlatformClient;
|
|
21
|
-
|
|
22
|
-
@state() private _files: Item[] = [];
|
|
23
|
-
@state() private _loaded = new Set<string>();
|
|
24
|
-
@state() private _loading = new Set<string>();
|
|
25
|
-
|
|
26
|
-
@state() private _runnerStatus = "Idle";
|
|
27
|
-
@state() private _runnerProgress = 0;
|
|
28
|
-
@state() private _runnerMessages: string[] = [];
|
|
29
|
-
@state() private _runnerComponentId = "your-component-id";
|
|
30
|
-
@state() private _running = false;
|
|
31
|
-
|
|
32
|
-
private _runner?: CloudRunner;
|
|
33
|
-
|
|
34
|
-
async updated(changed: Map<string, unknown>) {
|
|
35
|
-
if ((changed.has("_components") || changed.has("_client")) && this._components && this._client) {
|
|
36
|
-
if (!this._runner) {
|
|
37
|
-
this._runner = this._components.get(CloudRunner);
|
|
38
|
-
this._runner.client = this._client;
|
|
39
|
-
this._runner.onExecutionUpdated.add(({ status, progress, messages }) => {
|
|
40
|
-
this._runnerStatus = status;
|
|
41
|
-
this._runnerProgress = progress;
|
|
42
|
-
this._runnerMessages = messages;
|
|
43
|
-
if (status.startsWith("SUCCESS") || status.startsWith("ERROR") || status.startsWith("WARNING")) {
|
|
44
|
-
this._running = false;
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
} else {
|
|
48
|
-
this._runner.client = this._client;
|
|
49
|
-
}
|
|
50
|
-
await this._fetchFiles();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
private async _fetchFiles() {
|
|
55
|
-
const projectId = (window as any).__THATOPEN_CONTEXT__?.projectId;
|
|
56
|
-
if (!this._client || !projectId) return;
|
|
57
|
-
const all = await this._client.listFiles({ projectId });
|
|
58
|
-
this._files = all.filter(f => f.fileExtension === "ifc" || f.fileExtension === "frag");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
private async _toggleModel(file: Item) {
|
|
62
|
-
const id = file._id;
|
|
63
|
-
if (this._loaded.has(id)) {
|
|
64
|
-
await this._components!.get(OBC.FragmentsManager).core.disposeModel(id).catch(() => {});
|
|
65
|
-
this._loaded = new Set([...this._loaded].filter(x => x !== id));
|
|
66
|
-
} else {
|
|
67
|
-
this._loading = new Set([...this._loading, id]);
|
|
68
|
-
try {
|
|
69
|
-
const response = await this._client!.downloadFile(id);
|
|
70
|
-
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
71
|
-
if (file.fileExtension === "frag") {
|
|
72
|
-
await this._components!.get(OBC.FragmentsManager).core.load(bytes, { modelId: id });
|
|
73
|
-
} else {
|
|
74
|
-
await this._components!.get(OBC.IfcLoader).load(bytes, true, id);
|
|
75
|
-
}
|
|
76
|
-
this._loaded = new Set([...this._loaded, id]);
|
|
77
|
-
} finally {
|
|
78
|
-
this._loading = new Set([...this._loading].filter(x => x !== id));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private async _run(useLocal: boolean) {
|
|
84
|
-
if (!this._runner) return;
|
|
85
|
-
this._runner.componentId = this._runnerComponentId;
|
|
86
|
-
this._running = true;
|
|
87
|
-
await this._runner.run(useLocal);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
private get _tableData(): BUI.TableGroupData<FileRow>[] {
|
|
91
|
-
return this._files.map(f => ({
|
|
92
|
-
data: { Name: f.name, Extension: f.fileExtension ?? "", Load: f._id },
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private get _dataTransform(): BUI.TableDataTransform<FileRow> {
|
|
97
|
-
return {
|
|
98
|
-
Load: (fileId) => {
|
|
99
|
-
const file = this._files.find(f => f._id === fileId)!;
|
|
100
|
-
const loaded = this._loaded.has(fileId);
|
|
101
|
-
const loading = this._loading.has(fileId);
|
|
102
|
-
return BUI.html`
|
|
103
|
-
<bim-button
|
|
104
|
-
.label=${loaded ? "Unload" : "Load"}
|
|
105
|
-
.icon=${loaded ? "solar:eye-closed-bold" : "solar:eye-bold"}
|
|
106
|
-
.loading=${loading}
|
|
107
|
-
@click=${() => this._toggleModel(file)}
|
|
108
|
-
></bim-button>
|
|
109
|
-
`;
|
|
110
|
-
},
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
render() {
|
|
115
|
-
return html`
|
|
116
|
-
<bim-tabs>
|
|
117
|
-
<bim-tab name="models" label="Models" icon="solar:folder-bold">
|
|
118
|
-
<bim-panel-section label="Project Files">
|
|
119
|
-
<bim-table
|
|
120
|
-
.columns=${["Name", "Extension", "Load"]}
|
|
121
|
-
.data=${this._tableData}
|
|
122
|
-
.dataTransform=${this._dataTransform}
|
|
123
|
-
></bim-table>
|
|
124
|
-
</bim-panel-section>
|
|
125
|
-
</bim-tab>
|
|
126
|
-
<bim-tab name="runner" label="Cloud Runner" icon="solar:code-bold">
|
|
127
|
-
<bim-panel>
|
|
128
|
-
<bim-panel-section label="Component">
|
|
129
|
-
<bim-text-input
|
|
130
|
-
label="Component ID"
|
|
131
|
-
value=${this._runnerComponentId}
|
|
132
|
-
@change=${(e: Event) => { this._runnerComponentId = (e.target as HTMLInputElement).value; }}
|
|
133
|
-
></bim-text-input>
|
|
134
|
-
<div style="display:flex;gap:0.5rem;">
|
|
135
|
-
<bim-button
|
|
136
|
-
label="Run"
|
|
137
|
-
.icon=${"solar:play-bold"}
|
|
138
|
-
.loading=${this._running}
|
|
139
|
-
@click=${() => this._run(false)}
|
|
140
|
-
></bim-button>
|
|
141
|
-
<bim-button
|
|
142
|
-
label="Run Local"
|
|
143
|
-
.icon=${"solar:server-bold"}
|
|
144
|
-
.loading=${this._running}
|
|
145
|
-
@click=${() => this._run(true)}
|
|
146
|
-
></bim-button>
|
|
147
|
-
</div>
|
|
148
|
-
</bim-panel-section>
|
|
149
|
-
<bim-panel-section label="Status">
|
|
150
|
-
<bim-label>${this._runnerStatus}</bim-label>
|
|
151
|
-
${this._runnerMessages.map(m => html`<bim-label>${m}</bim-label>`)}
|
|
152
|
-
</bim-panel-section>
|
|
153
|
-
</bim-panel>
|
|
154
|
-
</bim-tab>
|
|
155
|
-
</bim-tabs>
|
|
156
|
-
`;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
customElements.define("app-panel", AppPanel);
|