@ray-js/robot-map-sdk 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/bin/docs-server.js +205 -14
  2. package/dist-docs/404.html +3 -3
  3. package/dist-docs/assets/{app.3-ianRvb.js → app.CoDGIQ53.js} +1 -1
  4. package/dist-docs/assets/chunks/@localSearchIndexroot.DELY0TLT.js +1 -0
  5. package/dist-docs/assets/chunks/{BitmapFont.C8awBCd1.js → BitmapFont.DDRqV796.js} +1 -1
  6. package/dist-docs/assets/chunks/{BufferResource.C5TLxka4.js → BufferResource.aFEHKM_N.js} +1 -1
  7. package/dist-docs/assets/chunks/{CanvasRenderer.DyglCOE2.js → CanvasRenderer.BefGXFZ-.js} +1 -1
  8. package/dist-docs/assets/chunks/{RenderTargetSystem._cMCUdmu.js → RenderTargetSystem.CsgIm493.js} +1 -1
  9. package/dist-docs/assets/chunks/{VPLocalSearchBox.DYzATQt_.js → VPLocalSearchBox.CVEAMjKj.js} +1 -1
  10. package/dist-docs/assets/chunks/{WebGLRenderer.C_pauwH4.js → WebGLRenderer.p4DxJ1iF.js} +1 -1
  11. package/dist-docs/assets/chunks/{WebGPURenderer.DuRPdsh5.js → WebGPURenderer.BhOx1ll0.js} +1 -1
  12. package/dist-docs/assets/chunks/{browserAll.BebatlLr.js → browserAll.CXRAifqY.js} +1 -1
  13. package/dist-docs/assets/chunks/{index.DR0yN-kU.js → index.Dmmvsq5C.js} +4 -4
  14. package/dist-docs/assets/chunks/theme.Cii0G4Y-.js +4 -0
  15. package/dist-docs/assets/chunks/{webworkerAll.BAL0vGum.js → webworkerAll.CY0RXZhY.js} +1 -1
  16. package/dist-docs/assets/{guide_getting-started.md.DzTPTYGC.js → guide_getting-started.md.9hcfOAq4.js} +1 -1
  17. package/dist-docs/assets/plans_2026-03-11-simulator-logger-dump-implementation-plan.md.Ck5BGdoX.js +1 -0
  18. package/dist-docs/assets/plans_2026-03-11-simulator-logger-dump-implementation-plan.md.Ck5BGdoX.lean.js +1 -0
  19. package/dist-docs/assets/records_bugs_2026-03-11-render-result-runtime-sync-bugfix.md.DRNUuaFT.js +1 -0
  20. package/dist-docs/assets/records_bugs_2026-03-11-render-result-runtime-sync-bugfix.md.DRNUuaFT.lean.js +1 -0
  21. package/dist-docs/assets/records_plans_2026-03-11-docs-cli-ui-polish-plan.md.B8oZt_5R.js +1 -0
  22. package/dist-docs/assets/records_plans_2026-03-11-docs-cli-ui-polish-plan.md.B8oZt_5R.lean.js +1 -0
  23. package/dist-docs/assets/records_plans_2026-03-11-simulator-logger-dump-plan.md.CkjDCM2N.js +1 -0
  24. package/dist-docs/assets/records_plans_2026-03-11-simulator-logger-dump-plan.md.CkjDCM2N.lean.js +1 -0
  25. package/dist-docs/assets/records_plans_2026-03-11-simulator-style-tokenization-plan.md.D4BgkNlO.js +1 -0
  26. package/dist-docs/assets/records_plans_2026-03-11-simulator-style-tokenization-plan.md.D4BgkNlO.lean.js +1 -0
  27. package/dist-docs/assets/{style.DrlDtCux.css → style.hiWmcVfN.css} +1 -1
  28. package/dist-docs/guide/advanced-usage.html +4 -4
  29. package/dist-docs/guide/concepts.html +4 -4
  30. package/dist-docs/guide/getting-started.html +6 -6
  31. package/dist-docs/guide/mcp.html +4 -4
  32. package/dist-docs/hashmap.json +1 -1
  33. package/dist-docs/index.html +4 -4
  34. package/dist-docs/plans/2026-03-04-detected-objects-visibility-design.html +4 -4
  35. package/dist-docs/plans/2026-03-04-show-detected-objects-implementation-plan.html +4 -4
  36. package/dist-docs/plans/2026-03-10-simulator-debug-design.html +4 -4
  37. package/dist-docs/plans/2026-03-10-simulator-events-console-design.html +4 -4
  38. package/dist-docs/plans/2026-03-10-simulator-events-console-implementation-plan.html +4 -4
  39. package/dist-docs/plans/2026-03-10-simulator-runtime-controls-design.html +4 -4
  40. package/dist-docs/plans/2026-03-10-simulator-runtime-controls-implementation-plan.html +4 -4
  41. package/dist-docs/plans/2026-03-11-simulator-logger-dump-implementation-plan.html +25 -0
  42. package/dist-docs/records/bugs/2026-02-28-fix-pixi-bindgroup-webgpu-snapshot-whitescreen-bugfix.html +4 -4
  43. package/dist-docs/records/bugs/2026-03-10-events-drawer-toolbar-scroll-bugfix.html +4 -4
  44. package/dist-docs/records/bugs/2026-03-10-simulator-initial-render-layout-bugfix.html +4 -4
  45. package/dist-docs/records/bugs/2026-03-10-simulator-wheel-scroll-leak-bugfix.html +4 -4
  46. package/dist-docs/records/bugs/2026-03-11-docs-server-bin-clean-bugfix.html +4 -4
  47. package/dist-docs/records/bugs/2026-03-11-render-result-runtime-sync-bugfix.html +25 -0
  48. package/dist-docs/records/plans/2026-03-02-furniture-feature-plan.html +4 -4
  49. package/dist-docs/records/plans/2026-03-10-simulator-events-console-plan.html +4 -4
  50. package/dist-docs/records/plans/2026-03-10-simulator-last-successful-combo-cache-plan.html +4 -4
  51. package/dist-docs/records/plans/2026-03-10-simulator-map-parsed-view-plan.html +4 -4
  52. package/dist-docs/records/plans/2026-03-10-simulator-map-playground-refactor-plan.html +4 -4
  53. package/dist-docs/records/plans/2026-03-10-simulator-playground-plan.html +4 -4
  54. package/dist-docs/records/plans/2026-03-10-simulator-runtime-controls-plan.html +4 -4
  55. package/dist-docs/records/plans/2026-03-11-docs-cli-ui-polish-plan.html +25 -0
  56. package/dist-docs/records/plans/2026-03-11-simulator-logger-dump-plan.html +25 -0
  57. package/dist-docs/records/plans/2026-03-11-simulator-src-migration-implementation.html +4 -4
  58. package/dist-docs/records/plans/2026-03-11-simulator-src-migration-plan.html +4 -4
  59. package/dist-docs/records/plans/2026-03-11-simulator-style-tokenization-plan.html +25 -0
  60. package/dist-docs/reference/callbacks.html +4 -4
  61. package/dist-docs/reference/config.html +4 -4
  62. package/dist-docs/reference/data.html +4 -4
  63. package/dist-docs/reference/methods.html +4 -4
  64. package/dist-docs/reference/runtime.html +4 -4
  65. package/dist-docs/reference/types.html +4 -4
  66. package/dist-docs/reference/utils.html +4 -4
  67. package/dist-docs/simulator/index.html +4 -4
  68. package/package.json +1 -1
  69. package/dist-docs/assets/chunks/@localSearchIndexroot.l5uunL9n.js +0 -1
  70. package/dist-docs/assets/chunks/theme.Dn4kNa0x.js +0 -4
  71. /package/dist-docs/assets/{guide_getting-started.md.DzTPTYGC.lean.js → guide_getting-started.md.9hcfOAq4.lean.js} +0 -0
@@ -3,6 +3,7 @@
3
3
  import { createServer } from 'node:http'
4
4
  import { readFile, stat } from 'node:fs/promises'
5
5
  import { dirname, extname, join, normalize } from 'node:path'
6
+ import { spawn } from 'node:child_process'
6
7
  import process from 'node:process'
7
8
  import { fileURLToPath } from 'node:url'
8
9
 
@@ -26,17 +27,24 @@ const MIME_TYPES = {
26
27
 
27
28
  const HELP_TEXT = `
28
29
  Usage:
29
- robot-map-docs [--host <host>] [--port <port>]
30
+ robot-map-docs [--host <host>] [--port <port>] [--open]
30
31
 
31
32
  Options:
32
33
  --host, -H Host to bind (default: 127.0.0.1)
33
- --port, -p Port to listen on (default: 4173)
34
+ --port, -p Port to listen on (default: 5180)
35
+ --open, -o Open docs in browser after server starts
36
+ --no-open Disable browser auto-open
37
+ --quiet, -q Minimal logs (errors only)
34
38
  --help, -h Show this help message
35
39
  `
36
40
 
37
41
  const parseArgs = (argv) => {
38
42
  let host = '127.0.0.1'
39
- let port = 4173
43
+ let port = 5180
44
+ let shouldOpen =
45
+ process.env.ROBOT_MAP_DOCS_OPEN === '1' ||
46
+ process.env.ROBOT_MAP_DOCS_OPEN === 'true'
47
+ let quiet = false
40
48
 
41
49
  for (let i = 0; i < argv.length; i += 1) {
42
50
  const arg = argv[i]
@@ -62,9 +70,25 @@ const parseArgs = (argv) => {
62
70
  i += 1
63
71
  continue
64
72
  }
73
+
74
+ if (arg === '--open' || arg === '-o') {
75
+ shouldOpen = true
76
+ continue
77
+ }
78
+
79
+ if (arg === '--no-open') {
80
+ shouldOpen = false
81
+ continue
82
+ }
83
+
84
+ if (arg === '--quiet' || arg === '-q') {
85
+ quiet = true
86
+ continue
87
+ }
88
+
65
89
  }
66
90
 
67
- return { host, port }
91
+ return { host, port, shouldOpen, quiet }
68
92
  }
69
93
 
70
94
  const getSafePath = (rawPathname) => {
@@ -86,6 +110,110 @@ const getSafePath = (rawPathname) => {
86
110
  const currentFile = fileURLToPath(import.meta.url)
87
111
  const currentDir = dirname(currentFile)
88
112
  const docsRoot = join(currentDir, '..', 'dist-docs')
113
+ const packageRoot = join(currentDir, '..')
114
+
115
+ const isColorEnabled = () =>
116
+ process.stdout.isTTY &&
117
+ process.env.NO_COLOR !== '1' &&
118
+ process.env.FORCE_COLOR !== '0'
119
+
120
+ const color = {
121
+ reset: '\x1b[0m',
122
+ dim: '\x1b[2m',
123
+ accent: '\x1b[38;2;72;151;108m',
124
+ accentSoft: '\x1b[38;2;121;206;160m',
125
+ warn: '\x1b[38;2;214;162;64m',
126
+ danger: '\x1b[38;2;220;95;95m',
127
+ bold: '\x1b[1m',
128
+ }
129
+
130
+ const withColor = (value, style) => {
131
+ if (!isColorEnabled()) return value
132
+ return `${style}${value}${color.reset}`
133
+ }
134
+
135
+ const createLogger = ({ quiet }) => ({
136
+ info: (text) => {
137
+ if (!quiet) {
138
+ console.log(`${withColor('[docs]', color.accent)} ${text}`)
139
+ }
140
+ },
141
+ warn: (text) => {
142
+ if (!quiet) {
143
+ console.warn(`${withColor('[warn]', color.warn)} ${text}`)
144
+ }
145
+ },
146
+ error: (text) => {
147
+ console.error(`${withColor('[error]', color.danger)} ${text}`)
148
+ },
149
+ })
150
+
151
+ const formatDurationMs = (durationMs) => `${Math.max(0, durationMs)}ms`
152
+
153
+ const formatBorder = (title) =>
154
+ withColor(`+-------------------- ${title} --------------------+`, color.accent)
155
+
156
+ const renderBanner = ({
157
+ version,
158
+ host,
159
+ port,
160
+ startupMs,
161
+ openMode,
162
+ }) => {
163
+ const endpoint = `http://${host}:${String(port)}`
164
+ const lines = [
165
+ formatBorder('Robot Map Docs'),
166
+ `${withColor(' Package ', color.dim)} ${withColor(
167
+ `@ray-js/robot-map-sdk@${version}`,
168
+ color.bold,
169
+ )}`,
170
+ `${withColor(' URL ', color.dim)} ${withColor(endpoint, color.accentSoft)}`,
171
+ `${withColor(' Open ', color.dim)} ${openMode}`,
172
+ `${withColor(' Startup ', color.dim)} ${formatDurationMs(startupMs)}`,
173
+ withColor('+---------------------------------------------------+', color.accent),
174
+ withColor('Press Ctrl+C to stop', color.dim),
175
+ ]
176
+ return lines.join('\n')
177
+ }
178
+
179
+ const getPackageVersion = async () => {
180
+ try {
181
+ const content = await readFile(join(packageRoot, 'package.json'), 'utf-8')
182
+ const parsed = JSON.parse(content)
183
+ if (typeof parsed.version === 'string' && parsed.version.trim()) {
184
+ return parsed.version
185
+ }
186
+ } catch (_error) {
187
+ // Ignore and fall back to unknown.
188
+ }
189
+ return 'unknown'
190
+ }
191
+
192
+ const openBrowser = (url) => {
193
+ let cmd = ''
194
+ let args = []
195
+
196
+ if (process.platform === 'darwin') {
197
+ cmd = 'open'
198
+ args = [url]
199
+ } else if (process.platform === 'win32') {
200
+ cmd = 'cmd'
201
+ args = ['/c', 'start', '', url]
202
+ } else {
203
+ cmd = 'xdg-open'
204
+ args = [url]
205
+ }
206
+
207
+ return new Promise((resolve, reject) => {
208
+ const child = spawn(cmd, args, {
209
+ detached: true,
210
+ stdio: 'ignore',
211
+ })
212
+ child.on('error', reject)
213
+ child.unref()
214
+ resolve()
215
+ })
216
+ }
89
217
 
90
218
  const serveFile = async (filePath, response) => {
91
219
  const content = await readFile(filePath)
@@ -155,7 +283,10 @@ const createRequestHandler = () => async (request, response) => {
155
283
  }
156
284
 
157
285
  const main = async () => {
158
- const { host, port } = parseArgs(process.argv.slice(2))
286
+ const startTime = Date.now()
287
+ const { host, port, shouldOpen, quiet } = parseArgs(process.argv.slice(2))
288
+ const logger = createLogger({ quiet })
289
+ const packageVersion = await getPackageVersion()
159
290
 
160
291
  try {
161
292
  const rootStat = await stat(docsRoot)
@@ -169,22 +300,82 @@ const main = async () => {
169
300
  ? error.code
170
301
  : undefined
171
302
  if (String(maybeCode ?? '') !== 'ENOENT') {
172
- console.warn(
173
- `[robot-map-docs] docs root check warning: ${error.message}`,
174
- )
303
+ logger.warn(`docs root check warning: ${error.message}`)
175
304
  }
176
305
  }
177
- console.error(
178
- '[robot-map-docs] dist-docs not found. Please build docs before publish.',
179
- )
306
+ logger.error('dist-docs not found. Please build docs before publish.')
180
307
  process.exit(1)
181
308
  }
182
309
 
183
310
  const server = createServer(createRequestHandler())
311
+ const sockets = new Set()
312
+ let shuttingDown = false
313
+
314
+ server.on('connection', (socket) => {
315
+ sockets.add(socket)
316
+ socket.on('close', () => {
317
+ sockets.delete(socket)
318
+ })
319
+ })
320
+
321
+ server.on('error', (error) => {
322
+ const message = error instanceof Error ? error.message : String(error)
323
+ logger.error(`failed to start server: ${message}`)
324
+ if (String((error && error.code) ?? '') === 'EADDRINUSE') {
325
+ logger.warn(`port ${port} is already in use. Try "--port ${port + 1}".`)
326
+ }
327
+ process.exit(1)
328
+ })
329
+
184
330
  server.listen(port, host, () => {
185
- console.log(
186
- `[robot-map-docs] Serving dist-docs at http://${host}:${String(port)}`,
187
- )
331
+ const endpoint = `http://${host}:${String(port)}`
332
+ const startupMs = Date.now() - startTime
333
+ if (!quiet) {
334
+ console.log(
335
+ renderBanner({
336
+ version: packageVersion,
337
+ host,
338
+ port,
339
+ startupMs,
340
+ openMode: shouldOpen ? 'enabled' : 'disabled',
341
+ }),
342
+ )
343
+ } else {
344
+ logger.info(`serving dist-docs at ${endpoint}`)
345
+ }
346
+
347
+ if (shouldOpen) {
348
+ openBrowser(endpoint).catch((error) => {
349
+ const message = error instanceof Error ? error.message : String(error)
350
+ logger.warn(`failed to open browser automatically: ${message}`)
351
+ })
352
+ }
353
+ })
354
+
355
+ process.once('SIGINT', () => {
356
+ if (shuttingDown) {
357
+ logger.warn('force exit on repeated interrupt')
358
+ process.exit(130)
359
+ }
360
+
361
+ shuttingDown = true
362
+ logger.info('shutting down...')
363
+
364
+ server.close()
365
+
366
+ for (const socket of sockets) {
367
+ socket.destroy()
368
+ }
369
+
370
+ // Always terminate quickly in CLI usage; do not risk hanging on keep-alive.
371
+ setTimeout(() => {
372
+ process.exit(130)
373
+ }, 80)
374
+
375
+ setTimeout(() => {
376
+ logger.warn('shutdown timeout, forcing exit')
377
+ process.exit(130)
378
+ }, 1500).unref()
188
379
  })
189
380
  }
190
381
 
@@ -6,17 +6,17 @@
6
6
  <title>404 | Tuya Robot Map</title>
7
7
  <meta name="description" content="Not Found">
8
8
  <meta name="generator" content="VitePress v1.6.4">
9
- <link rel="preload stylesheet" href="/assets/style.DrlDtCux.css" as="style">
9
+ <link rel="preload stylesheet" href="/assets/style.hiWmcVfN.css" as="style">
10
10
  <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/assets/app.3-ianRvb.js"></script>
12
+ <script type="module" src="/assets/app.CoDGIQ53.js"></script>
13
13
  <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
14
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
15
15
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
16
16
  </head>
17
17
  <body>
18
18
  <div id="app"></div>
19
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"guide_advanced-usage.md\":\"COVLyRkA\",\"guide_concepts.md\":\"CJ87tk-r\",\"guide_getting-started.md\":\"DzTPTYGC\",\"guide_mcp.md\":\"CabCiX8Z\",\"index.md\":\"wTsFvv0N\",\"plans_2026-03-04-detected-objects-visibility-design.md\":\"Dqboot5W\",\"plans_2026-03-04-show-detected-objects-implementation-plan.md\":\"CDWwQtWj\",\"plans_2026-03-10-simulator-debug-design.md\":\"BZibn7uw\",\"plans_2026-03-10-simulator-events-console-design.md\":\"BVmEzCbR\",\"plans_2026-03-10-simulator-events-console-implementation-plan.md\":\"S2f1zs9-\",\"plans_2026-03-10-simulator-runtime-controls-design.md\":\"mqeNaYgg\",\"plans_2026-03-10-simulator-runtime-controls-implementation-plan.md\":\"BXG1UWFt\",\"records_bugs_2026-02-28-fix-pixi-bindgroup-webgpu-snapshot-whitescreen-bugfix.md\":\"BbQpA41Y\",\"records_bugs_2026-03-10-events-drawer-toolbar-scroll-bugfix.md\":\"DbHxPv4D\",\"records_bugs_2026-03-10-simulator-initial-render-layout-bugfix.md\":\"w7--2hvH\",\"records_bugs_2026-03-10-simulator-wheel-scroll-leak-bugfix.md\":\"B6gIem2P\",\"records_bugs_2026-03-11-docs-server-bin-clean-bugfix.md\":\"GGWCjkok\",\"records_plans_2026-03-02-furniture-feature-plan.md\":\"CqSsyNDo\",\"records_plans_2026-03-10-simulator-events-console-plan.md\":\"CfHLEHcc\",\"records_plans_2026-03-10-simulator-last-successful-combo-cache-plan.md\":\"Z2RoK239\",\"records_plans_2026-03-10-simulator-map-parsed-view-plan.md\":\"S9jPz75o\",\"records_plans_2026-03-10-simulator-map-playground-refactor-plan.md\":\"BuILlmcV\",\"records_plans_2026-03-10-simulator-playground-plan.md\":\"CQAR-T7p\",\"records_plans_2026-03-10-simulator-runtime-controls-plan.md\":\"DSVD-qCa\",\"records_plans_2026-03-11-simulator-src-migration-implementation.md\":\"FnB5Cx6R\",\"records_plans_2026-03-11-simulator-src-migration-plan.md\":\"BBfaeRrq\",\"reference_callbacks.md\":\"BIwuGR3s\",\"reference_config.md\":\"DHynhVxG\",\"reference_data.md\":\"B_XpUFrn\",\"reference_methods.md\":\"eH-UCMbE\",\"reference_runtime.md\":\"BEy8BhSZ\",\"reference_types.md\":\"hikiO8Cq\",\"reference_utils.md\":\"Dy6XKVWh\",\"simulator_index.md\":\"CF95Y_c9\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Tuya Robot Map\",\"description\":\"涂鸦扫地机地图组件\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"Tuya Robot Map\",\"outline\":{\"level\":[2,6],\"label\":\"页面导航\"},\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"指南\",\"link\":\"/guide/concepts\",\"activeMatch\":\"^/guide/\"},{\"text\":\"参考\",\"link\":\"/reference/data\",\"activeMatch\":\"^/reference/\"},{\"text\":\"模拟调试\",\"link\":\"/simulator/\",\"activeMatch\":\"^/simulator/\"}],\"sidebar\":{\"/guide/\":[{\"text\":\"指南\",\"items\":[{\"text\":\"基本概念\",\"link\":\"/guide/concepts\"},{\"text\":\"快速开始\",\"link\":\"/guide/getting-started\"},{\"text\":\"进阶使用\",\"link\":\"/guide/advanced-usage\"}]}],\"/reference/\":[{\"text\":\"组件Props\",\"items\":[{\"text\":\"数据\",\"link\":\"/reference/data\"},{\"text\":\"配置\",\"link\":\"/reference/config\"},{\"text\":\"运行时\",\"link\":\"/reference/runtime\"},{\"text\":\"地图事件回调\",\"link\":\"/reference/callbacks\"}]},{\"text\":\"方法\",\"items\":[{\"text\":\"地图方法\",\"link\":\"/reference/methods\"},{\"text\":\"工具方法\",\"link\":\"/reference/utils\"}]},{\"text\":\"类型定义\",\"items\":[{\"text\":\"类型定义\",\"link\":\"/reference/types\"}]}],\"/simulator/\":[{\"text\":\"模拟调试\",\"items\":[{\"text\":\"实时模拟调试\",\"link\":\"/simulator/\"}]}]},\"search\":{\"provider\":\"local\"},\"lastUpdated\":{\"text\":\"最后更新于\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"short\"}}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
19
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"guide_advanced-usage.md\":\"COVLyRkA\",\"guide_concepts.md\":\"CJ87tk-r\",\"guide_getting-started.md\":\"9hcfOAq4\",\"guide_mcp.md\":\"CabCiX8Z\",\"index.md\":\"wTsFvv0N\",\"plans_2026-03-04-detected-objects-visibility-design.md\":\"Dqboot5W\",\"plans_2026-03-04-show-detected-objects-implementation-plan.md\":\"CDWwQtWj\",\"plans_2026-03-10-simulator-debug-design.md\":\"BZibn7uw\",\"plans_2026-03-10-simulator-events-console-design.md\":\"BVmEzCbR\",\"plans_2026-03-10-simulator-events-console-implementation-plan.md\":\"S2f1zs9-\",\"plans_2026-03-10-simulator-runtime-controls-design.md\":\"mqeNaYgg\",\"plans_2026-03-10-simulator-runtime-controls-implementation-plan.md\":\"BXG1UWFt\",\"plans_2026-03-11-simulator-logger-dump-implementation-plan.md\":\"Ck5BGdoX\",\"records_bugs_2026-02-28-fix-pixi-bindgroup-webgpu-snapshot-whitescreen-bugfix.md\":\"BbQpA41Y\",\"records_bugs_2026-03-10-events-drawer-toolbar-scroll-bugfix.md\":\"DbHxPv4D\",\"records_bugs_2026-03-10-simulator-initial-render-layout-bugfix.md\":\"w7--2hvH\",\"records_bugs_2026-03-10-simulator-wheel-scroll-leak-bugfix.md\":\"B6gIem2P\",\"records_bugs_2026-03-11-docs-server-bin-clean-bugfix.md\":\"GGWCjkok\",\"records_bugs_2026-03-11-render-result-runtime-sync-bugfix.md\":\"DRNUuaFT\",\"records_plans_2026-03-02-furniture-feature-plan.md\":\"CqSsyNDo\",\"records_plans_2026-03-10-simulator-events-console-plan.md\":\"CfHLEHcc\",\"records_plans_2026-03-10-simulator-last-successful-combo-cache-plan.md\":\"Z2RoK239\",\"records_plans_2026-03-10-simulator-map-parsed-view-plan.md\":\"S9jPz75o\",\"records_plans_2026-03-10-simulator-map-playground-refactor-plan.md\":\"BuILlmcV\",\"records_plans_2026-03-10-simulator-playground-plan.md\":\"CQAR-T7p\",\"records_plans_2026-03-10-simulator-runtime-controls-plan.md\":\"DSVD-qCa\",\"records_plans_2026-03-11-docs-cli-ui-polish-plan.md\":\"B8oZt_5R\",\"records_plans_2026-03-11-simulator-logger-dump-plan.md\":\"CkjDCM2N\",\"records_plans_2026-03-11-simulator-src-migration-implementation.md\":\"FnB5Cx6R\",\"records_plans_2026-03-11-simulator-src-migration-plan.md\":\"BBfaeRrq\",\"records_plans_2026-03-11-simulator-style-tokenization-plan.md\":\"D4BgkNlO\",\"reference_callbacks.md\":\"BIwuGR3s\",\"reference_config.md\":\"DHynhVxG\",\"reference_data.md\":\"B_XpUFrn\",\"reference_methods.md\":\"eH-UCMbE\",\"reference_runtime.md\":\"BEy8BhSZ\",\"reference_types.md\":\"hikiO8Cq\",\"reference_utils.md\":\"Dy6XKVWh\",\"simulator_index.md\":\"CF95Y_c9\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Tuya Robot Map\",\"description\":\"涂鸦扫地机地图组件\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"Tuya Robot Map\",\"outline\":{\"level\":[2,6],\"label\":\"页面导航\"},\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"指南\",\"link\":\"/guide/concepts\",\"activeMatch\":\"^/guide/\"},{\"text\":\"参考\",\"link\":\"/reference/data\",\"activeMatch\":\"^/reference/\"},{\"text\":\"模拟调试\",\"link\":\"/simulator/\",\"activeMatch\":\"^/simulator/\"}],\"sidebar\":{\"/guide/\":[{\"text\":\"指南\",\"items\":[{\"text\":\"基本概念\",\"link\":\"/guide/concepts\"},{\"text\":\"快速开始\",\"link\":\"/guide/getting-started\"},{\"text\":\"进阶使用\",\"link\":\"/guide/advanced-usage\"}]}],\"/reference/\":[{\"text\":\"组件Props\",\"items\":[{\"text\":\"数据\",\"link\":\"/reference/data\"},{\"text\":\"配置\",\"link\":\"/reference/config\"},{\"text\":\"运行时\",\"link\":\"/reference/runtime\"},{\"text\":\"地图事件回调\",\"link\":\"/reference/callbacks\"}]},{\"text\":\"方法\",\"items\":[{\"text\":\"地图方法\",\"link\":\"/reference/methods\"},{\"text\":\"工具方法\",\"link\":\"/reference/utils\"}]},{\"text\":\"类型定义\",\"items\":[{\"text\":\"类型定义\",\"link\":\"/reference/types\"}]}],\"/simulator/\":[{\"text\":\"模拟调试\",\"items\":[{\"text\":\"实时模拟调试\",\"link\":\"/simulator/\"}]}]},\"search\":{\"provider\":\"local\"},\"lastUpdated\":{\"text\":\"最后更新于\",\"formatOptions\":{\"dateStyle\":\"short\",\"timeStyle\":\"short\"}}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
20
20
 
21
21
  </body>
22
22
  </html>
@@ -1 +1 @@
1
- import{R as p}from"./chunks/theme.Dn4kNa0x.js";import{R as s,ad as i,ae as u,af as c,ag as l,ah as f,ai as d,aj as m,ak as h,al as g,am as A,d as v,u as R,v as w,s as y,an as C,ao as P,ap as b,a7 as E}from"./chunks/framework.CBLqO2Q1.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),P(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=D(),a=j();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return A(S)}function D(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
1
+ import{R as p}from"./chunks/theme.Cii0G4Y-.js";import{R as s,ad as i,ae as u,af as c,ag as l,ah as f,ai as d,aj as m,ak as h,al as g,am as A,d as v,u as R,v as w,s as y,an as C,ao as P,ap as b,a7 as E}from"./chunks/framework.CBLqO2Q1.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=R();return w(()=>{y(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),P(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=D(),a=j();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return A(S)}function D(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};