@rainbow-robotics/preview-host 0.1.2-dev.5 → 0.1.2-dev.51
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 +236 -26
- package/build.mjs +2 -1
- package/dist/assets/AmrCapabilityControl.V6oiR3_5.js +1 -0
- package/dist/assets/MapInfo.rg67lYW5.js +1 -0
- package/dist/assets/RBQrBarCodeGuideModal.CegVepfq.js +4939 -0
- package/dist/assets/{__federation_expose_App.B-7yegU_.js → __federation_expose_App.3JWLXa-B.js} +282 -249
- package/dist/assets/__federation_fn_import.DdkEuT6t.js +23 -0
- package/dist/assets/__federation_shared_@emotion/{styled.wOy85H_m.js → styled.ETfwMsQo.js} +1 -1
- package/dist/assets/__federation_shared_@tanstack/{react-query.BqXJhb-5.js → react-query.fVz8BOIk.js} +1 -1
- package/dist/assets/__federation_shared_react-dom.CHMAxKsQ.js +1 -0
- package/dist/assets/{__federation_shared_react-simple-keyboard.BDWRGEbM.js → __federation_shared_react-simple-keyboard.CycbmZUL.js} +3 -3
- package/dist/assets/__federation_shared_react.DhiB56zQ.js +1 -0
- package/dist/assets/{cssMode.BVhnq_6y.js → cssMode.DjVcPzO2.js} +1 -1
- package/dist/assets/{emotion-styled-base.browser.esm.JngGwqgu.js → emotion-styled-base.browser.esm.BIcjgOzg.js} +1 -1
- package/dist/assets/{freemarker2.DtoqwD_L.js → freemarker2.mNTQoAvE.js} +1 -1
- package/dist/assets/goalIconAtlas.B2lkzTN6.svg +39 -0
- package/dist/assets/goalIconAtlasReal.BcQvnHD9.svg +34 -0
- package/dist/assets/{handlebars.UmYoTOId.js → handlebars.DDPep_s9.js} +1 -1
- package/dist/assets/{html.DC0Vlx9N.js → html.DH07rbxJ.js} +1 -1
- package/dist/assets/{htmlMode.cZn_7xZQ.js → htmlMode.D4vSjjEU.js} +1 -1
- package/dist/assets/{index.CHuCXVak.js → index.B3zY1kf7.js} +1 -1
- package/dist/assets/index.BJIqBgjF.js +1 -0
- package/dist/assets/index.CvtWB-ew.js +1 -0
- package/dist/assets/index.DhDDHapK.js +1 -0
- package/dist/assets/index.P6snMalu.js +9 -0
- package/dist/assets/{javascript.CxVqa5p8.js → javascript.CZUgddiQ.js} +1 -1
- package/dist/assets/{jsonMode.BQsXaCAy.js → jsonMode.CY9WAc95.js} +1 -1
- package/dist/assets/jsx-runtime.CBqCNPYB.js +9 -0
- package/dist/assets/keymapTileIndex.worker-Bmd4Ukaf.js +1 -0
- package/dist/assets/{liquid.ctNTffmu.js → liquid.Ba2vu9Ao.js} +1 -1
- package/dist/assets/{lspLanguageFeatures.CIBenPTg.js → lspLanguageFeatures.DEJp1swJ.js} +1 -1
- package/dist/assets/{mdx.CEwN4-mU.js → mdx.BBxRS12e.js} +1 -1
- package/dist/assets/{python.DFiX7UCg.js → python.ByVSrJ02.js} +1 -1
- package/dist/assets/{razor.6V_1uJ45.js → razor.BMK5dFHT.js} +1 -1
- package/dist/assets/remoteEntry.js +1 -1
- package/dist/assets/{tsMode.CtIlnNw7.js → tsMode.BHfiTRXi.js} +1 -1
- package/dist/assets/{typescript.D1htxZ_X.js → typescript.BYhhxVkf.js} +1 -1
- package/dist/assets/{xml.D6hYgOkJ.js → xml.rVpDuqyV.js} +1 -1
- package/dist/assets/{yaml.BPMLV51E.js → yaml.ZkYtRBRB.js} +1 -1
- package/dist/imgs/nexus/forms/gripper/g7_grip_dir_0.png +0 -0
- package/dist/imgs/nexus/forms/gripper/g7_grip_dir_1.png +0 -0
- package/dist/imgs/nexus/forms/gripper/g7_offset.png +0 -0
- package/dist/imgs/nexus/forms/gripper/g7_orientation_0.png +0 -0
- package/dist/imgs/nexus/forms/gripper/g7_orientation_1.png +0 -0
- package/dist/imgs/nexus/forms/gripper/g7_tip_width.png +0 -0
- package/dist/imgs/nexus/forms/gripper/gripper_10.png +0 -0
- package/dist/imgs/nexus/forms/gripper/gripper_7.png +0 -0
- package/dist/imgs/nexus/forms/gripper/gripper_8.png +0 -0
- package/dist/imgs/nexus/forms/gripper/gripper_9.png +0 -0
- package/dist/index.html +11 -10
- package/dist/plugin-shared/plugin-ui_host-ui.js +3 -0
- package/dist/plugin-shared/plugin-ui_react.js +3 -0
- package/dist/plugin-shared/plugin-ui_sdk.js +3 -0
- package/dist/plugin-shared/plugin-ui_ws.js +3 -0
- package/dist/plugin-shared/react-dom.js +4 -0
- package/dist/plugin-shared/react-dom_client.js +3 -0
- package/dist/plugin-shared/react.js +4 -0
- package/dist/plugin-shared/react_jsx-dev-runtime.js +3 -0
- package/dist/plugin-shared/react_jsx-runtime.js +3 -0
- package/package.json +4 -4
- package/serve.mjs +95 -48
- package/dist/assets/AmrCapabilityControl.BppT8lfW.js +0 -1
- package/dist/assets/ConveyorBelt.DYgETvU-.png +0 -0
- package/dist/assets/FactoryMap.CBpf9N92.js +0 -4881
- package/dist/assets/MapInfo.Bit_2DfJ.js +0 -1
- package/dist/assets/__federation_fn_import.Drmbxo5T.js +0 -23
- package/dist/assets/__federation_shared_react-dom.znG_qyPl.js +0 -1
- package/dist/assets/__federation_shared_react.Wsh8dz5j.js +0 -1
- package/dist/assets/_commonjsHelpers.Cpj98o6Y.js +0 -1
- package/dist/assets/index.C3X9hmTL.js +0 -1
- package/dist/assets/index.ChsGqxH_.js +0 -9
- package/dist/assets/index.FxRLAiU5.js +0 -1
- package/dist/assets/index.ayADrA9_.js +0 -1
- package/dist/assets/jsx-runtime.CKZTQYsb.js +0 -9
- package/dist/assets/keymapTileIndex.worker-C2HCGd-D.js +0 -1
- package/dist/plugin-demo/assets/icon.svg +0 -3
- package/dist/plugin-demo/content.js +0 -9149
- package/dist/plugin-demo/manifest.json +0 -25
- package/dist/plugin-demo/sandbox.html +0 -10
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/chunks/chunk-AMCIKVG7.js +0 -1
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/chunks/chunk-GJWPOWHG.js +0 -1
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/chunks/chunk-JRCDA3EG.js +0 -1
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/connect.js +0 -1
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/elements.js +0 -1
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/react.js +0 -1
- package/dist/plugin-runtime/@rainbow-robotics/plugin-ui/sdk.js +0 -1
- package/dist/plugin-runtime/vendor/react-dom-client.js +0 -1
- package/dist/plugin-runtime/vendor/react-jsx-dev-runtime.js +0 -1
- package/dist/plugin-runtime/vendor/react-jsx-runtime.js +0 -1
- package/dist/plugin-runtime/vendor/react-runtime.js +0 -65
- package/dist/plugin-runtime/vendor/react.js +0 -1
package/README.md
CHANGED
|
@@ -1,44 +1,254 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@rainbow-robotics/preview-host`
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
robot and no back end**. Built from `apps/web/nexus` in `plugin-preview` mode.
|
|
3
|
+
`@rainbow-robotics/preview-host` is a standalone **mini-Muscat (nexus) shell** for previewing Muscat plugins without a robot or backend.
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
loads the developer's plugin via its manifest, and mocks every robot/back-end
|
|
8
|
-
dependency (API-failure toasts suppressed, query retries off, rb static assets
|
|
9
|
-
served locally).
|
|
5
|
+
It's built by building `apps/web/nexus` in `plugin-preview` mode.
|
|
10
6
|
|
|
11
|
-
This
|
|
12
|
-
|
|
7
|
+
This preview shell provides a UI as close as possible to the real Muscat environment.
|
|
8
|
+
|
|
9
|
+
* Real Header
|
|
10
|
+
* Real LNB
|
|
11
|
+
* Real panel structure
|
|
12
|
+
* Real `rb-components`
|
|
13
|
+
* Plugin manifest-based loading
|
|
14
|
+
|
|
15
|
+
Robot- and backend-related dependencies, on the other hand, are all mocked.
|
|
16
|
+
|
|
17
|
+
* No robot connection required
|
|
18
|
+
* No backend server required
|
|
19
|
+
* API-failure toasts hidden
|
|
20
|
+
* Query retry disabled
|
|
21
|
+
* RB static resources served locally
|
|
22
|
+
|
|
23
|
+
This package is used by `muscat-plugin-kit`'s:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
muscat-pk dev:ui
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
This lets external plugin developers preview their plugin in a Muscat-like environment without the `web-rainbow-ui` monorepo source.
|
|
13
30
|
|
|
14
31
|
## Build
|
|
15
32
|
|
|
16
33
|
```bash
|
|
17
|
-
node build.mjs
|
|
18
|
-
|
|
34
|
+
node build.mjs
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Builds `nexus` in `plugin-preview` mode, then assembles the files needed to run into the `./dist` directory.
|
|
38
|
+
|
|
39
|
+
If `nexus` has already been built, you can use:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node build.mjs --skip-build
|
|
19
43
|
```
|
|
20
44
|
|
|
21
|
-
`
|
|
22
|
-
|
|
45
|
+
This skips rebuilding `nexus` and only reassembles `./dist` from the existing build output.
|
|
46
|
+
|
|
47
|
+
The generated `dist/` directory is excluded from Git.
|
|
48
|
+
|
|
49
|
+
`dist/` is structured to be runnable standalone.
|
|
50
|
+
|
|
51
|
+
Main contents:
|
|
52
|
+
|
|
53
|
+
* nexus bundle
|
|
54
|
+
* RB static resources
|
|
55
|
+
* images
|
|
56
|
+
* fonts
|
|
57
|
+
* other runtime resources
|
|
58
|
+
|
|
59
|
+
Static resources are served at the same paths used at real runtime.
|
|
23
60
|
|
|
24
|
-
|
|
61
|
+
```text
|
|
62
|
+
/imgs
|
|
63
|
+
/fonts
|
|
64
|
+
...
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Run
|
|
25
68
|
|
|
26
69
|
```bash
|
|
27
70
|
rb-preview-host --plugin <built-plugin-dir> [--port 4180] [--dist <dir>]
|
|
28
71
|
```
|
|
29
72
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
73
|
+
### Options
|
|
74
|
+
|
|
75
|
+
`--plugin` points to a plugin build directory produced by `muscat-pk build`.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
rb-preview-host --plugin ./dist/plugin
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
`--port` sets the port preview-host runs on.
|
|
82
|
+
|
|
83
|
+
Defaults to `4180`.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
rb-preview-host \
|
|
87
|
+
--plugin ./dist/plugin \
|
|
88
|
+
--port 4180
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`--dist` overrides the preview-host static bundle directory.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
rb-preview-host \
|
|
95
|
+
--plugin ./dist/plugin \
|
|
96
|
+
--dist ./preview-host-dist
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The following options are also supported (all optional — `muscat-pk dev` fills them in internally).
|
|
100
|
+
|
|
101
|
+
* `--socket-url`: the Socket.IO URL the plugin connects to (`window.__RB_PLUGIN_PREVIEW_SOCKET_URL__`)
|
|
102
|
+
* `--robot-host`: robot host override (`window.__RB_ROBOT_HOST__`)
|
|
103
|
+
* `--dev-server-url`: the plugin's own Vite dev server URL (`window.__RB_PLUGIN_DEV_SERVER_URL__`) — used when mounting a `dev` UI entry directly
|
|
104
|
+
|
|
105
|
+
## Plugin build directory requirements
|
|
106
|
+
|
|
107
|
+
The directory passed to `--plugin` must be an output directory from `muscat-pk build`.
|
|
108
|
+
|
|
109
|
+
It must contain:
|
|
110
|
+
|
|
111
|
+
```text
|
|
112
|
+
manifest.json
|
|
113
|
+
<ui-entry>.js (e.g. content.js — one is generated per manifest contributes[].ui entry)
|
|
114
|
+
assets/
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The host mounts `<ui-entry>.js` by importing it directly as a plain ESM module — no `sandbox.html`/iframe is involved.
|
|
118
|
+
|
|
119
|
+
`assets/` is only present if the plugin uses its own static resources.
|
|
120
|
+
|
|
121
|
+
The plugin directory you specify is mounted in preview host at:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
/plugin-dev/
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The preview shell resolves the plugin and static-resource locations through the global variables `serve.mjs` injects.
|
|
128
|
+
|
|
129
|
+
## Global variables
|
|
33
130
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
131
|
+
### `window.__RB_PLUGIN_PREVIEW_HOST__`
|
|
132
|
+
|
|
133
|
+
Activates preview-host mode.
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
window.__RB_PLUGIN_PREVIEW_HOST__ = true;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
When set, nexus runs against a mock environment instead of the real backend.
|
|
140
|
+
|
|
141
|
+
Typical effects:
|
|
142
|
+
|
|
143
|
+
* Mocked robot connection
|
|
144
|
+
* Mocked backend API
|
|
145
|
+
* Suppressed API-failure toasts
|
|
146
|
+
* Disabled query retry
|
|
147
|
+
|
|
148
|
+
### `window.__RB_PLUGIN_PREVIEW_BASE__`
|
|
149
|
+
|
|
150
|
+
The base URL the plugin is served from.
|
|
151
|
+
|
|
152
|
+
Defaults to:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
/plugin-dev
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Example:
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
window.__RB_PLUGIN_PREVIEW_BASE__ = "/plugin-dev";
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The preview shell reads the following files relative to this path:
|
|
165
|
+
|
|
166
|
+
```text
|
|
167
|
+
/plugin-dev/manifest.json
|
|
168
|
+
/plugin-dev/<ui-entry>.js
|
|
169
|
+
/plugin-dev/assets/*
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### `window.__RB_ASSETS_BASE_URL__`
|
|
173
|
+
|
|
174
|
+
The origin RB static resources are served from.
|
|
175
|
+
|
|
176
|
+
Example:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
window.__RB_ASSETS_BASE_URL__ = "http://localhost:4180";
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
This lets preview host load the static resources used by nexus and `rb-components`.
|
|
183
|
+
|
|
184
|
+
Typical resource paths:
|
|
185
|
+
|
|
186
|
+
```text
|
|
187
|
+
/imgs
|
|
188
|
+
/fonts
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Global variable summary
|
|
192
|
+
|
|
193
|
+
| Global variable | Meaning |
|
|
194
|
+
| ----------------------------------- | --------------------------------------- |
|
|
195
|
+
| `window.__RB_PLUGIN_PREVIEW_HOST__` | Activates preview-host mode and mocks backend dependencies |
|
|
196
|
+
| `window.__RB_PLUGIN_PREVIEW_BASE__` | Base URL the plugin is mounted at. Defaults to `/plugin-dev` |
|
|
197
|
+
| `window.__RB_ASSETS_BASE_URL__` | Origin serving RB images, fonts, and other static resources |
|
|
198
|
+
|
|
199
|
+
## Relationship to dev mode
|
|
200
|
+
|
|
201
|
+
`muscat-pk dev:ui` runs nexus's Vite dev server directly.
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
vite --mode plugin-preview
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
This is a dev-mode preview-host runtime with HMR enabled.
|
|
208
|
+
|
|
209
|
+
In other words, `muscat-pk dev:ui` and `@rainbow-robotics/preview-host` aren't separate implementations — they're the same preview-host runtime used in two different forms.
|
|
210
|
+
|
|
211
|
+
### `muscat-pk dev:ui`
|
|
212
|
+
|
|
213
|
+
Runs the Vite dev server directly against the monorepo source.
|
|
214
|
+
|
|
215
|
+
Characteristics:
|
|
216
|
+
|
|
217
|
+
* Vite-based dev server
|
|
218
|
+
* HMR support
|
|
219
|
+
* Source changes reflected immediately
|
|
220
|
+
* Suited for development
|
|
221
|
+
|
|
222
|
+
### `@rainbow-robotics/preview-host`
|
|
223
|
+
|
|
224
|
+
The same runtime packaged as a static bundle for distribution.
|
|
225
|
+
|
|
226
|
+
Characteristics:
|
|
227
|
+
|
|
228
|
+
* No monorepo source required
|
|
229
|
+
* Uses a prebuilt nexus bundle
|
|
230
|
+
* Runs standalone
|
|
231
|
+
* Distributable to external plugin developers
|
|
232
|
+
|
|
233
|
+
The overall relationship:
|
|
234
|
+
|
|
235
|
+
```text
|
|
236
|
+
apps/web/nexus
|
|
237
|
+
└─ plugin-preview mode
|
|
238
|
+
├─ muscat-pk dev:ui
|
|
239
|
+
│ └─ runs the Vite dev server directly
|
|
240
|
+
│ └─ HMR support
|
|
241
|
+
│
|
|
242
|
+
└─ @rainbow-robotics/preview-host
|
|
243
|
+
└─ packaged as a static bundle
|
|
244
|
+
└─ runs without the monorepo source
|
|
245
|
+
```
|
|
39
246
|
|
|
40
|
-
|
|
247
|
+
As a result, external developers get a Muscat-like preview environment — without holding a copy of the `web-rainbow-ui` source — that includes:
|
|
41
248
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
249
|
+
* Real nexus layout
|
|
250
|
+
* Real Header and LNB
|
|
251
|
+
* Real panels
|
|
252
|
+
* Real `rb-components`
|
|
253
|
+
* Real manifest-based plugin loading
|
|
254
|
+
* Mocked robot and backend environment
|
package/build.mjs
CHANGED
|
@@ -22,10 +22,11 @@ const outDir = resolve(here, "dist");
|
|
|
22
22
|
const skipBuild = process.argv.includes("--skip-build");
|
|
23
23
|
|
|
24
24
|
if (!skipBuild) {
|
|
25
|
-
console.log("[preview-host] building
|
|
25
|
+
console.log("[preview-host] building mini-muscat (plugin-preview)…");
|
|
26
26
|
execSync("yarn workspace @app/nexus build:preview", {
|
|
27
27
|
cwd: repoRoot,
|
|
28
28
|
stdio: "inherit",
|
|
29
|
+
env: { ...process.env, VITE_PLUGIN_PREVIEW: "true" },
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{importShared as f}from"./__federation_fn_import.DdkEuT6t.js";import{dr as g,aE as s,_ as t,aM as v,dl as p,a0 as b,dk as c,cv as O,bL as E,aC as F,aL as B,cg as P,cs as w,aO as D,f1 as _,fJ as L}from"./RBQrBarCodeGuideModal.CegVepfq.js";import{f as T}from"./index.DhDDHapK.js";const{useQuery:M}=await f("@tanstack/react-query"),C=[{key:"dock",endpoint:"/{robot_model}/capability/dock",labelKey:"move.amr.rightPanel.capability.dock"},{key:"io",endpoint:"/{robot_model}/capability/Io",labelKey:"move.amr.rightPanel.capability.io"},{key:"camera",endpoint:"/{robot_model}/capability/camera",labelKey:"move.amr.rightPanel.capability.camera"},{key:"lidar2d",endpoint:"/{robot_model}/capability/lidar2d",labelKey:"move.amr.rightPanel.capability.lidar2d"},{key:"lidar3d",endpoint:"/{robot_model}/capability/lidar3d",labelKey:"move.amr.rightPanel.capability.lidar3d"},{key:"imu",endpoint:"/{robot_model}/capability/imu",labelKey:"move.amr.rightPanel.capability.imu"},{key:"safetyBumper",endpoint:"/{robot_model}/capability/safetyBumper",labelKey:"move.amr.rightPanel.capability.safetyBumper"},{key:"safetyInterlock",endpoint:"/{robot_model}/capability/safetyInterlock",labelKey:"move.amr.rightPanel.capability.safetyInterlock"},{key:"safetyObstacle",endpoint:"/{robot_model}/capability/safetyObstacle",labelKey:"move.amr.rightPanel.capability.safetyObstacle"},{key:"safetyOperationStop",endpoint:"/{robot_model}/capability/safetyOperationStop",labelKey:"move.amr.rightPanel.capability.safetyOperationStop"},{key:"safetySpeedControl",endpoint:"/{robot_model}/capability/safetySpeedControl",labelKey:"move.amr.rightPanel.capability.safetySpeedControl"},{key:"tabos",endpoint:"/{robot_model}/capability/tabos",labelKey:"move.amr.rightPanel.capability.tabos"}],R=e=>typeof e=="object"&&e!==null&&"enabled"in e&&e.enabled===!1,K=e=>{if(e instanceof Error)return e.message;if(typeof e=="object"&&e!==null&&"message"in e){const a=e.message;if(typeof a=="string")return a}},q=async({robot_model:e})=>{const a=await Promise.allSettled(C.map(l=>{const n=l.endpoint.replace("{robot_model}",e);return T.get(n)}));return C.map((l,n)=>{const r=a[n];return r.status==="fulfilled"?{...l,supported:!R(r.value),data:r.value}:{...l,supported:!1,data:null,errorMessage:K(r.reason)}})},$=({robot_model:e,enabled:a=!0})=>M({queryKey:["amrCapabilities",e],queryFn:()=>q({robot_model:e}),enabled:!!e&&a,staleTime:5*1e3,gcTime:60*1e3}),{useMutation:U}=await f("@tanstack/react-query"),V=()=>U({mutationFn:({robot_model:e,target:a,frequency:l})=>T.post(`/${e}/control/streamFrequency`,{target:a,frequency:Math.min(10,Math.max(0,l))})}),{useState:k}=await f("react"),j=4294967295,x=e=>{if(!(e==null||e===j))return`${e} ms`},z={0:"NONE",1:"CHARGING",2:"COMPLETE",3:"FAIL",4:"CANCEL"},G={0:"DEFAULT",1:"TABOS"},Y={0:"CABLE",1:"CONTACT",2:"INDUCTIVE"},H={0:"RPLIDAR",1:"SICK",2:"LAKI",3:"LIVOX",4:"HOKUYO"},Q={0:"ORBBEC"},i=({label:e,children:a})=>s(p,{className:"items-center justify-between gap-3",children:[t("span",{className:"typo-compact-xs-normal text-fg-subtle shrink-0",children:e}),t("span",{className:b("typo-compact-xs-normal text-right",a!=null?"text-fg-default":"text-fg-subtler"),children:a??"—"})]}),X={default:"gray",success:"green",warning:"orange",danger:"red"},y=({label:e,variant:a="default"})=>t(D,{type:"soft",color:X[a],children:e}),h=({label:e,value:a})=>t(i,{label:e,children:t(y,{label:a?"ON":"OFF",variant:a?"success":"default"})}),u=({label:e,bits:a})=>s(c,{className:"gap-1",children:[t("span",{className:"typo-compact-xs-normal text-fg-subtle",children:e}),a?.length?t(p,{className:"gap-1",children:a.map((l,n)=>t("div",{className:b("size-4 rounded-sm border text-center leading-4",l?"border-fg-success bg-fill-success-subtlest":"border-border-subtler bg-fill-disabled"),children:t("span",{className:b("typo-compact-2xs-normal",l?"text-fg-success":"text-fg-subtler"),children:n})},n))}):t("span",{className:"typo-compact-xs-normal text-fg-subtler",children:"—"})]}),N=({label:e,connection:a,rows:l,children:n})=>{const{t:r}=g();return s(c,{className:"bg-fill-disabled gap-1.5 rounded-md p-2.5",children:[s(p,{className:"items-center justify-between gap-3",children:[t("span",{className:"typo-compact-xs-semibold text-fg-default min-w-0 break-words",children:e}),t("span",{className:b("typo-compact-2xs-medium shrink-0",a?"text-fg-success":"text-fg-subtler"),children:r(a?"settings.amr.frs.status.connected":"settings.amr.frs.status.disconnected")})]}),l.map(({key:o,value:d})=>t(i,{label:o,children:d},o)),n]})},J=({label:e,value:a})=>t(D,{type:"soft",color:a?"green":"gray",children:s(p,{className:"items-center gap-1",children:[a?t(_,{className:"size-3"}):t(L,{className:"size-3"}),t("span",{children:e}),t("span",{className:"font-semibold",children:a?"On":"Off"})]})}),I=({flags:e})=>t(p,{className:"flex-wrap gap-1.5",children:e.map(({label:a,value:l})=>t(J,{label:a,value:l},a))}),W=({streams:e})=>e.length?s(c,{className:"border-subtle mt-0.5 gap-1 border-t pt-1.5",children:[t("span",{className:"typo-compact-xs-normal text-fg-subtle",children:"Streams"}),t(p,{className:"flex-wrap gap-1",children:e.map(a=>s(p,{className:"border-subtle bg-alt-1 items-center gap-1 rounded px-1.5 py-1",children:[t("span",{className:"typo-compact-2xs-semibold text-fg-default",children:a.quality}),s("span",{className:"typo-compact-2xs-normal text-fg-subtle",children:[a.width,"x",a.height]}),s("span",{className:"typo-compact-2xs-normal text-fg-subtler",children:[a.fps,"fps"]})]},`${a.camId}-${a.quality}`))})]}):null,Z=({data:e})=>{const a=z[e.chargeState??-1]??String(e.chargeState),l=e.chargeState===1?"success":e.chargeState===3?"danger":e.chargeState===4?"warning":"default";return s(c,{className:"gap-2",children:[s(c,{className:"bg-fill-disabled gap-2 rounded-md p-2.5",children:[t(h,{label:"Dock State",value:e.dockState}),t(i,{label:"Charge State",children:t(y,{label:a,variant:l})}),s(i,{label:"Battery",children:[e.batteryPercent?.toFixed(1)," %"]}),s(i,{label:"Charge Current",children:[e.chargeCurrent?.toFixed(2)," A"]}),s(i,{label:"Contact Voltage",children:[e.contactVoltage?.toFixed(2)," V"]}),t(i,{label:"Battery Type",children:t(y,{label:G[e.batteryType??0]??"—"})})]}),s(p,{className:"items-center gap-1.5 px-0.5",children:[t("span",{className:"typo-compact-xs-normal text-fg-subtle shrink-0",children:"Charge Type"}),e.chargeType?.length?t(p,{className:"flex-wrap gap-1.5",children:e.chargeType.map(n=>t(y,{label:Y[n]??String(n),variant:"default"},n))}):t("span",{className:"typo-compact-xs-normal text-fg-subtler",children:"—"})]})]})},ee=({data:e})=>s(c,{className:"gap-3 p-0.5",children:[t(u,{label:"MCU0 DIO",bits:e.mcu0Dio}),t(u,{label:"MCU1 DIO",bits:e.mcu1Dio}),t(u,{label:"MCU0 DIN",bits:e.mcu0Din}),t(u,{label:"MCU1 DIN",bits:e.mcu1Din})]}),ae=({data:e})=>s(c,{className:"gap-2",children:[t(I,{flags:[{label:"Obstacle",value:e.enabledObs},{label:"Depth",value:e.enabledDepth},{label:"Filter",value:e.enabledFilter}]}),e.info?.length?e.info.map((a,l)=>{const n=typeof a.type=="number"?Q[a.type]??String(a.type):a.type??"—",r=a.camId??a.index??l,o=e.rtspInfo?.filter(d=>d.camId===r)??[];return t(N,{label:`Camera ${r}${a.serial?` · ${a.serial}`:""}`,connection:a.connection,rows:[{key:"Type",value:n},{key:"TF",value:a.tf?.length?a.tf.map(d=>d.toFixed(2)).join(", "):void 0},{key:"Data Age",value:x(a.dataAgeMs)}],children:t(W,{streams:o})},l)}):t("span",{className:"typo-compact-xs-normal text-fg-subtler px-0.5",children:"—"})]}),A=({data:e,is3d:a=!1})=>s(c,{className:"gap-2",children:[t(I,{flags:[{label:"Obstacle",value:e.enabledObs}]}),e.info?.length?e.info.map((l,n)=>t(N,{label:`Lidar ${l.index??n}${l.serial?` · ${l.serial}`:""}`,connection:l.connection,rows:[{key:"Type",value:H[l.type]??String(l.type??"—")},...a?[]:[{key:"IP",value:l.ip}],{key:"Safety",value:l.safety!==void 0?l.safety?"Safety":"Normal":void 0},{key:"TF",value:l.tf?.length?l.tf.map(r=>r.toFixed(2)).join(", "):void 0},{key:"Data Age",value:x(l.dataAgeMs)}]},n)):t("span",{className:"typo-compact-xs-normal text-fg-subtler px-0.5",children:"—"})]}),te=({data:e})=>t(c,{className:"gap-2",children:e.info?.length?e.info.map((a,l)=>t(N,{label:`IMU ${a.index??l}${a.serial?` · ${a.serial}`:""}`,connection:a.connection,rows:[{key:"Type",value:a.type===1?"IMU":"DEFAULT"},{key:"Data Age",value:x(a.dataAgeMs)}]},l)):t("span",{className:"typo-compact-xs-normal text-fg-subtler px-0.5",children:"—"})}),le=({data:e})=>{const a=[{label:"Bumper State",value:e.bumperState},{label:"Interlock State",value:e.interlockState},{label:"Obstacle Detect",value:e.obsDetect},{label:"Operation Stop",value:e.operationStopState},{label:"Speed Control",value:e.speedControlState}].filter(l=>l.value!==void 0);return s(c,{className:"bg-fill-disabled gap-2 rounded-md p-2.5",children:[t(h,{label:"Enabled",value:e.enabled}),a.map(l=>t(h,{label:l.label,value:l.value},l.label))]})},se=({data:e})=>s(c,{className:"bg-fill-disabled gap-2 rounded-md p-2.5",children:[s(i,{label:"Voltage",children:[e.tabosVoltage?.toFixed(2)," V"]}),s(i,{label:"Current",children:[e.tabosCurrent?.toFixed(2)," A"]}),s(i,{label:"SOC",children:[e.tabosSoc?.toFixed(1)," %"]}),s(i,{label:"SOH",children:[e.tabosSoh?.toFixed(1)," %"]}),s(i,{label:"Temp",children:[e.tabosTemp?.toFixed(1)," °C"]})]}),ne=({capKey:e,data:a})=>{switch(e){case"dock":return t(Z,{data:a});case"io":return t(ee,{data:a});case"camera":return t(ae,{data:a});case"lidar2d":return t(A,{data:a});case"lidar3d":return t(A,{data:a,is3d:!0});case"imu":return t(te,{data:a});case"tabos":return t(se,{data:a});default:return t(le,{data:a})}},re=[{label:"LiDAR 2D",value:"lidar2d"},{label:"LiDAR 3D",value:"lidar3d"},{label:"OBS Map",value:"obsMap"}],ce=({robotModel:e})=>{const[a,l]=k("lidar2d"),[n,r]=k("1"),{mutate:o,isPending:d}=V();return s(c,{className:"gap-2 pb-1",children:[s(p,{className:"items-center justify-between gap-2",children:[t("span",{className:"typo-compact-xs-normal text-fg-subtle",children:"Target"}),t(F,{size:"2xs",variant:"brand",disabled:d,onClick:()=>{const m=Math.min(10,Math.max(0,Number(n)));o({robot_model:e,target:a,frequency:m})},children:"Set"})]}),t(P,{size:"sm",value:a,handleChange:m=>l(m),children:re.map(({label:m,value:S})=>t(B,{value:S,children:m},S))}),t(p,{className:"items-center gap-2",children:t(w,{className:"flex-1",size:"sm",value:n,step:1,digit:0,fixedDigit:0,min:"0",max:"10",handleChange:m=>r(m)})})]})},oe=({item:e})=>{const{t:a}=g();return e.supported?e.data?t("div",{className:"pb-1",children:t(ne,{capKey:e.key,data:e.data})}):null:t("p",{className:"typo-compact-xs-normal text-fg-disabled px-1 py-2",children:a("move.amr.rightPanel.capability.status.notSupported")})},ie=()=>{const{t:e}=g();return t(E,{className:"flex-1 [&_[data-slot='empty-view-section']]:h-full",type:"icon",icon:t(O,{size:20}),message:e("move.amr.rightPanel.capability.status.loading")})},ue=({className:e,robotModel:a})=>{const{t:l}=g(),{data:n,isLoading:r}=$({robot_model:a});return s(c,{className:b("AmrCapabilityControl h-full min-h-0",e),children:[r&&t(ie,{}),(n??[]).map(o=>t("div",{className:"border-subtler border-b px-1 py-1",children:t(v,{disabled:!o.supported,title:t(p,{className:"w-full items-center justify-between gap-2",children:t("span",{className:b("typo-compact-sm2-semibold min-w-0 truncate",o.supported?"text-fg-default":"text-fg-disabled"),children:l(o.labelKey)})}),children:t(oe,{item:o})})},o.key)),t("div",{className:"border-subtler border-b px-1 py-1",children:t(v,{title:t("span",{className:"typo-compact-sm2-semibold text-fg-default",children:l("move.amr.rightPanel.capability.streamFrequency")}),children:t(ce,{robotModel:a})})})]})};export{ue as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{fv as g,fw as C,fx as $,fy as M,du as z,dr as P,aE as s,dk as d,_ as e,fz as H,fA as X,dl as r,fB as Y,fC as A,aC as L,fD as D,fE as O,fF as _,fG as E,fH as I,fI as K}from"./RBQrBarCodeGuideModal.CegVepfq.js";class J extends g{centerToLegX=.19725;centerToLegY=.09;centerToHipX=.11493;hipToThigh=.10285;thighToKnee=.3;kneeToFoot=.294;rearRightLeg;rearLeftLeg;frontRightLeg;frontLeftLeg;constructor(){super(),this.name="RBQ10_Robot",this.userData.keep=!0,this.init()}loadObj(o){return new Promise((n,c)=>{new C().load(o,p=>n(p),void 0,p=>c(p))})}init(){const n=["fuselage","leg3","hip1","hip3","thigh_right","thigh_left","calf","foot"].map(c=>{const a=$(`/rbq10/${c}.obj`);return this.loadObj(a).then(p=>({name:c,obj:p}))});Promise.all(n).then(c=>{const a={};c.forEach(i=>{a[i.name]=i.obj}),this.name="rbq10";const p=a.fuselage.clone();p.name="fuselage",this.add(p),this.rotateX(M.degToRad(90)),this.rearRightLeg=this.createRearRightLeg(a),this.rearRightLeg.position.set(-this.centerToLegX,0,this.centerToLegY),this.add(this.rearRightLeg),this.rearLeftLeg=this.createRearLeftLeg(a),this.rearLeftLeg.position.set(-this.centerToLegX,0,-this.centerToLegY),this.add(this.rearLeftLeg),this.frontRightLeg=this.createFrontRightLeg(a),this.frontRightLeg.position.set(this.centerToLegX,0,this.centerToLegY),this.add(this.frontRightLeg),this.frontLeftLeg=this.createFrontLeftLeg(a),this.frontLeftLeg.position.set(this.centerToLegX,0,-this.centerToLegY),this.add(this.frontLeftLeg)}).catch(c=>{console.error("Error loading robot parts:",c)})}createRearRightLeg(o){const n=new g;n.name="rearRightLegGroup";const c=o.leg3.clone();c.name="rearRightLegReducer",n.add(c);const a=new g;a.name="rearRightHipGroup",a.position.set(-this.centerToHipX,0,0);const p=o.hip3.clone();p.name="rearRightHipMesh",p.rotateY(M.degToRad(180)),a.add(p),n.add(a);const i=new g;i.name="rearRightThighGroup",i.position.set(0,0,this.hipToThigh);const l=o.thigh_right.clone();l.name="rearRightThighMesh",i.add(l),a.add(i);const m=new g;m.name="rearRightCalfGroup",m.position.set(0,-this.thighToKnee,0);const u=o.calf.clone();u.name="rearRightCalfMesh",m.add(u),i.add(m);const t=new g;t.name="rearRightFootGroup",t.position.set(0,-this.kneeToFoot,0);const f=o.foot.clone();return f.name="rearRightFootMesh",t.add(f),m.add(t),n}createRearLeftLeg(o){const n=new g;n.name="rearLeftLegGroup";const c=o.leg3.clone();c.name="rearLeftLegReducer",n.add(c);const a=new g;a.name="rearLeftHipGroup",a.position.set(-this.centerToHipX,0,0);const p=o.hip1.clone();p.name="rearLeftHipMesh",a.add(p),n.add(a);const i=new g;i.name="rearLeftThighGroup",i.position.set(0,0,-this.hipToThigh);const l=o.thigh_left.clone();l.name="rearLeftThighMesh",i.add(l),a.add(i);const m=new g;m.name="rearLeftCalfGroup",m.position.set(0,-this.thighToKnee,0);const u=o.calf.clone();u.name="rearLeftCalfMesh",m.add(u),i.add(m);const t=new g;t.name="rearLeftFootGroup",t.position.set(0,-this.kneeToFoot,0);const f=o.foot.clone();return f.name="rearLeftFootMesh",t.add(f),m.add(t),n}createFrontRightLeg(o){const n=new g;n.name="frontRightLegGroup";const c=o.leg3.clone();c.name="frontRightLegReducer",n.add(c);const a=new g;a.name="frontRightHipGroup",a.position.set(this.centerToHipX,0,0);const p=o.hip1.clone();p.name="frontRightHipMesh",p.rotateY(M.degToRad(180)),a.add(p),n.add(a);const i=new g;i.name="frontRightThighGroup",i.position.set(0,0,this.hipToThigh);const l=o.thigh_right.clone();l.name="frontRightThighMesh",i.add(l),a.add(i);const m=new g;m.name="frontRightCalfGroup",m.position.set(0,-this.thighToKnee,0);const u=o.calf.clone();u.name="frontRightCalfMesh",m.add(u),i.add(m);const t=new g;t.name="frontRightFootGroup",t.position.set(0,-this.kneeToFoot,0);const f=o.foot.clone();return f.name="frontRightFootMesh",t.add(f),m.add(t),n}createFrontLeftLeg(o){const n=new g;n.name="frontLeftLegGroup";const c=o.leg3.clone();c.name="frontLeftLegReducer",n.add(c);const a=new g;a.name="frontLeftHipGroup",a.position.set(this.centerToHipX,0,0);const p=o.hip3.clone();p.name="frontLeftHipMesh",a.add(p),n.add(a);const i=new g;i.name="frontLeftThighGroup",i.position.set(0,0,-this.hipToThigh);const l=o.thigh_left.clone();l.name="frontLeftThighMesh",i.add(l),a.add(i);const m=new g;m.name="frontLeftCalfGroup",m.position.set(0,-this.thighToKnee,0);const u=o.calf.clone();u.name="frontLeftCalfMesh",m.add(u),i.add(m);const t=new g;t.name="frontLeftFootGroup",t.position.set(0,-this.kneeToFoot,0);const f=o.foot.clone();return f.name="frontLeftFootMesh",t.add(f),m.add(t),n}update(){}}const w=h=>{const o=Math.floor(h/3600).toString().padStart(2,"0"),n=Math.floor(h%3600/60).toString().padStart(2,"0"),c=Math.floor(h%60).toString().padStart(2,"0");return`${o}:${n}:${c}`},V=({mappingStatus:h="idle",elapsedSeconds:o=0,completedKeyframeCount:n=0,totalKeyframePoints:c=0,onStartMapping:a,onStopMapping:p,onSaveMapping:i,onDiscard:l,mapList:m})=>{const{modal:u}=z(),{t}=P(),f=h==="recording",b=h==="stopped"||h==="saving"||h==="discarding",y=h==="saving"||h==="discarding",x=n>0,T=t(x?"move.amr.rightPanel.map.mapping.readyToSave":"move.amr.rightPanel.map.mapping.cannotSaveYet"),v=x?null:t("move.amr.rightPanel.map.mapping.noKeyframeReceived"),G=async()=>{try{await a?.()}catch(N){console.error(N)}},S=async()=>{try{await p?.()}catch(N){console.error(N)}},j=async()=>{await l?.()},k=async N=>i?.(N)??{ok:!1,reason:"save-failed"},F=()=>{u({component:D,props:{onSaveMapping:k,completedKeyframeCount:n,totalKeyframePoints:c,durationSeconds:o,existingMapNames:m}})};return s(d,{className:"h-full overflow-y-auto p-3",children:[!f&&!b&&s(d,{className:"flex-1 items-center gap-1 pt-[4rem]",children:[e(H,{className:"text-fg-brand size-8"}),e("p",{className:"typo-compact-xs-semibold text-fg-brand",children:t("move.amr.rightPanel.map.mapping.readyToMap")}),s("p",{className:"typo-title-02-bold text-fg-default text-center",children:[t("move.amr.rightPanel.map.mapping.clickStartMapping"),e("br",{}),t("move.amr.rightPanel.map.mapping.toBegin")]})]}),f&&s(d,{className:"flex-1 pt-[4rem]",children:[s(d,{className:"items-center gap-1",children:[e(X,{className:"text-fg-danger size-8"}),e("p",{className:"typo-compact-xs-semibold text-fg-danger",children:t("move.amr.rightPanel.map.mapping.recordingActive")}),e("p",{className:"typo-title-02-bold text-fg-default text-center",children:t("move.amr.rightPanel.map.mapping.buildingKeyframes")})]}),s(d,{className:"gap-2 p-3",children:[e("p",{className:"typo-compact-xs2-semibold text-fg-default",children:t("move.amr.rightPanel.map.mapping.captureStatus")}),s(d,{className:"bg-bg-alt-1 gap-1 rounded-md p-2.5",children:[s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.map.mapping.saveStatus")}),e("p",{className:`typo-compact-xs-semibold text-right ${x?"text-fg-success":"text-fg-danger"}`,children:T})]}),v&&e("p",{className:"typo-compact-2xs-normal text-fg-subtler text-right",children:v}),s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.map.mapping.keyframesReceived")}),e("p",{className:"typo-compact-xs-semibold text-fg-default text-right",children:n.toLocaleString()})]}),s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.map.mapping.keyframePoints")}),e("p",{className:"typo-compact-xs-semibold text-fg-default text-right",children:t("move.amr.rightPanel.map.mapping.points",{count:c.toLocaleString()})})]}),s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.task.duration")}),e("p",{className:"typo-compact-xs-semibold text-fg-default text-right",children:w(o)})]})]})]})]}),b&&s(d,{className:"flex-1 pt-[4rem]",children:[s(d,{className:"items-center gap-1",children:[e(Y,{className:`${x?"text-fg-success":"text-fg-danger"} size-8`}),e("p",{className:`typo-compact-xs-semibold ${x?"text-fg-success":"text-fg-danger"}`,children:t(x?"move.amr.rightPanel.map.mapping.readyToSaveTitle":"move.amr.rightPanel.map.mapping.noKeyframeCaptured")}),e("p",{className:"typo-title-02-bold text-fg-default text-center",children:t(x?"move.amr.rightPanel.map.mapping.mapReadyToSave":"move.amr.rightPanel.map.mapping.cannotSaveRecording")}),e("p",{className:"typo-compact-xs-normal text-fg-subtler text-center",children:t(x?"move.amr.rightPanel.map.mapping.canSaveAsNewMap":"move.amr.rightPanel.map.mapping.keyframeRequired")})]}),s(d,{className:"gap-2 p-3",children:[e("p",{className:"typo-compact-xs2-semibold text-fg-default",children:t("move.amr.rightPanel.map.mapping.result")}),s(d,{className:"bg-bg-alt-1 gap-1 rounded-md p-2.5",children:[s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.map.mapping.saveStatus")}),e("p",{className:`typo-compact-xs-semibold text-right ${x?"text-fg-success":"text-fg-danger"}`,children:T})]}),v&&e("p",{className:"typo-compact-2xs-normal text-fg-subtler text-right",children:v}),s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.map.mapping.keyframesReceived")}),e("p",{className:"typo-compact-xs-semibold text-fg-default text-right",children:n.toLocaleString()})]}),s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.map.mapping.keyframePoints")}),e("p",{className:"typo-compact-xs-semibold text-fg-default text-right",children:t("move.amr.rightPanel.map.mapping.points",{count:c.toLocaleString()})})]}),s(r,{className:"items-center justify-between gap-3",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:t("move.amr.rightPanel.task.duration")}),e("p",{className:"typo-compact-xs-semibold text-fg-default text-right",children:w(o)})]})]})]})]}),!b&&s(r,{className:"shrink-0 justify-between gap-2",children:[e(L,{onClick:S,disabled:!f||y,className:"gap-1 px-3.5",leadingIcon:e(A,{}),variant:"danger",children:t("move.amr.rightPanel.common.stop")}),e(L,{onClick:G,disabled:f||y,className:"flex-1 gap-1 px-3.5",variant:"brand",children:t("move.amr.rightPanel.map.mapping.startMapping")})]}),b&&s(d,{className:"shrink-0 gap-2",children:[!x&&e(d,{className:"items-center",children:e("p",{className:"typo-compact-2xs-normal text-fg-danger",children:t("move.amr.rightPanel.map.mapping.keyframeRequired")})}),s(r,{className:"justify-between gap-2",children:[e(L,{onClick:j,disabled:y,className:"gap-1 px-3.5",children:t(h==="discarding"?"move.amr.rightPanel.map.mapping.discarding":"move.amr.rightPanel.common.discard")}),e(L,{onClick:F,disabled:!x||y,className:"flex-1 gap-1 px-3.5",variant:"brand",children:t(h==="saving"?"move.amr.rightPanel.common.saving":"move.amr.rightPanel.common.save")})]})]})]})},q=()=>({GOAL:0,ROUTE:0,ALIGN:0}),U=h=>h>=1e6?`${(h/1e6).toFixed(1)}M`:h>=1e3?`${(h/1e3).toFixed(1)}K`:`${h}`,R=h=>`${h<0?"-":"+"}${Math.abs(h).toFixed(1)}m`,B=({currentMapName:h,createdAt:o,lastModified:n,mapCloudCount:c,mapBounds:a,topologyCount:p,nodeTypeCounts:i})=>{const{t:l}=P(),m=a?`${R(a.minX)} ~ ${R(a.maxX)}`:"--",u=a?`${R(a.minY)} ~ ${R(a.maxY)}`:"--",t=a?Math.abs(a.maxX-a.minX)*Math.abs(a.maxY-a.minY):null,f=t===null?"--":`${t.toFixed(1)} m²`,b=i??q();return s(d,{className:"items-start overflow-y-auto",children:[s(d,{className:"border-border-subtler w-full gap-1.5 border-b-[1px] p-3",children:[s(d,{className:"gap-0.5 self-stretch",children:[e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.map.info.mapName")}),e("p",{className:"typo-compact-md-semibold text-fg-default",children:h})]}),s(d,{className:"items-start gap-1 self-stretch",children:[s(r,{className:"items-center justify-between self-stretch",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:l("move.amr.rightPanel.common.created")}),e("p",{className:"typo-compact-xs-normal text-fg-subtle",children:o??"--"})]}),s(r,{className:"items-center justify-between self-stretch",children:[e("p",{className:"typo-compact-xs-normal text-fg-subtler",children:l("move.amr.rightPanel.map.info.lastModified")}),e("p",{className:"typo-compact-xs-normal text-fg-subtle",children:n??"--"})]})]})]}),s(d,{className:"border-border-subtler w-full gap-2 border-b-[1px] p-3",children:[e("p",{className:"typo-compact-md-semibold text-fg-default",children:l("move.amr.rightPanel.map.info.statistics")}),s(r,{className:"items-center justify-between self-stretch",children:[s(r,{className:"items-center gap-[6px]",children:[e("div",{className:"bg-fill-subtler flex size-6 items-center justify-center rounded-full",children:e(O,{className:"text-fg-subtle size-4"})}),e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.map.info.nodes")})]}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:p})]}),s(r,{className:"items-center justify-between self-stretch",children:[e(r,{children:s(r,{className:"items-center gap-[6px]",children:[e("div",{className:"bg-fill-subtler flex size-6 items-center justify-center rounded-full",children:e(_,{className:"text-fg-subtle size-4"})}),e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.map.info.pointCloud")})]})}),s("p",{className:"typo-compact-xs2-normal text-fg-default",children:[U(c)," pts"]})]})]}),s(d,{className:"border-border-subtler w-full gap-2 border-b-[1px] p-3",children:[e("p",{className:"typo-compact-md-semibold text-fg-default",children:l("move.amr.rightPanel.map.info.mapBoundaries")}),s(r,{className:"items-center justify-between self-stretch",children:[e(r,{className:"items-center gap-[6px]",children:e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.map.info.xRange")})}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:m})]}),s(r,{className:"items-center justify-between self-stretch",children:[e(r,{children:e(r,{className:"items-center gap-[6px]",children:e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.map.info.yRange")})})}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:u})]}),s(r,{className:"items-center justify-between self-stretch",children:[e(r,{className:"items-center gap-[6px]",children:e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.map.info.totalArea")})}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:f})]})]}),s(d,{className:"border-border-subtler w-full gap-2 border-b-[1px] p-3",children:[e("p",{className:"typo-compact-md-semibold text-fg-default",children:l("move.amr.rightPanel.menu.topology")}),s(r,{className:"items-center justify-between self-stretch",children:[s(r,{className:"items-center gap-[6px]",children:[e("div",{className:"bg-fill-warning-subtler flex size-6 items-center justify-center rounded-full",children:e(E,{className:"text-fg-warning size-4"})}),e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.topology.nodeType.goal")})]}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:b.GOAL})]}),s(r,{className:"items-center justify-between self-stretch",children:[e(r,{children:s(r,{className:"items-center gap-[6px]",children:[e("div",{className:"bg-fill-brand-subtler flex size-6 items-center justify-center rounded-full",children:e(I,{className:"text-fg-brand size-4"})}),e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.topology.nodeType.route")})]})}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:b.ROUTE})]}),s(r,{className:"items-center justify-between self-stretch",children:[s(r,{className:"items-center gap-[6px]",children:[e("div",{className:"bg-fill-success-subtler flex size-6 items-center justify-center rounded-full",children:e(K,{className:"text-fg-success size-4"})}),e("p",{className:"typo-compact-xs2-normal text-fg-subtle",children:l("move.amr.rightPanel.topology.nodeType.align")})]}),e("p",{className:"typo-compact-xs2-normal text-fg-default",children:b.ALIGN})]})]})]})};export{B as M,J as R,V as a};
|