dsh-zen-remote 2.2.8 → 2.3.1
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 +2 -2
- package/README.zh-CN.md +2 -2
- package/docs/interface.md +1 -1
- package/docs/remote-access.md +20 -0
- package/lan-gate.mjs +11 -1
- package/lib/adapters/dsh-better-sidebar/index.js +6 -2
- package/lib/adapters/dsh-better-sidebar/index.js.map +1 -1
- package/lib/adapters/dsh-better-sidebar/methods.js +3 -0
- package/lib/adapters/dsh-better-sidebar/methods.js.map +1 -1
- package/lib/admin-routes.js +33 -2
- package/lib/admin-routes.js.map +1 -1
- package/lib/client-routes.js +52 -0
- package/lib/client-routes.js.map +1 -1
- package/lib/client.js +3390 -10
- package/lib/config.js +70 -0
- package/lib/config.js.map +1 -1
- package/lib/index.js +232 -2
- package/lib/index.js.map +1 -1
- package/lib/intercept.js +43 -3
- package/lib/intercept.js.map +1 -1
- package/lib/lan-gate-server.cjs +29 -3
- package/lib/merge-streams.js +42 -12
- package/lib/merge-streams.js.map +1 -1
- package/lib/relay-client.js +71 -0
- package/lib/relay-client.js.map +1 -1
- package/lib/types/adapters/dsh-better-sidebar/index.d.ts +1 -1
- package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
- package/lib/types/adapters/dsh-better-sidebar/methods.d.ts.map +1 -1
- package/lib/types/admin-routes.d.ts +13 -0
- package/lib/types/admin-routes.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +204 -1
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/wizard/GatewayWizard.d.ts +29 -0
- package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -0
- package/lib/types/client/wizard/WizardCard.d.ts +30 -0
- package/lib/types/client/wizard/WizardCard.d.ts.map +1 -0
- package/lib/types/client/wizard/cards/MigrateCard.d.ts +15 -0
- package/lib/types/client/wizard/cards/MigrateCard.d.ts.map +1 -0
- package/lib/types/client/wizard/cards/PortForwardCard.d.ts +15 -0
- package/lib/types/client/wizard/cards/PortForwardCard.d.ts.map +1 -0
- package/lib/types/client/wizard/cards/ProxyCard.d.ts +19 -0
- package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -0
- package/lib/types/client/wizard/cards/TokenCard.d.ts +20 -0
- package/lib/types/client/wizard/cards/TokenCard.d.ts.map +1 -0
- package/lib/types/client/wizard/register-wizard.d.ts +51 -0
- package/lib/types/client/wizard/register-wizard.d.ts.map +1 -0
- package/lib/types/client/wizard/wizard-css.d.ts +10 -0
- package/lib/types/client/wizard/wizard-css.d.ts.map +1 -0
- package/lib/types/client-data/qr.d.ts +20 -0
- package/lib/types/client-data/qr.d.ts.map +1 -0
- package/lib/types/client-data/remote-status.d.ts +39 -2
- package/lib/types/client-data/remote-status.d.ts.map +1 -1
- package/lib/types/client-data/settings-form.d.ts +7 -2
- package/lib/types/client-data/settings-form.d.ts.map +1 -1
- package/lib/types/client-data/wizard.d.ts +247 -0
- package/lib/types/client-data/wizard.d.ts.map +1 -0
- package/lib/types/client-routes.d.ts +19 -0
- package/lib/types/client-routes.d.ts.map +1 -1
- package/lib/types/config.d.ts +27 -0
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/intercept.d.ts.map +1 -1
- package/lib/types/merge-streams.d.ts.map +1 -1
- package/lib/types/relay-client.d.ts +10 -0
- package/lib/types/relay-client.d.ts.map +1 -1
- package/lib/types/wizard/binary-io.d.ts +111 -0
- package/lib/types/wizard/binary-io.d.ts.map +1 -0
- package/lib/types/wizard/binary.d.ts +118 -0
- package/lib/types/wizard/binary.d.ts.map +1 -0
- package/lib/types/wizard/caddy-process.d.ts +101 -0
- package/lib/types/wizard/caddy-process.d.ts.map +1 -0
- package/lib/types/wizard/caddy.d.ts +53 -0
- package/lib/types/wizard/caddy.d.ts.map +1 -0
- package/lib/types/wizard/cloudflare.d.ts +112 -0
- package/lib/types/wizard/cloudflare.d.ts.map +1 -0
- package/lib/types/wizard/cloudflared.d.ts +71 -0
- package/lib/types/wizard/cloudflared.d.ts.map +1 -0
- package/lib/types/wizard/probe.d.ts +66 -0
- package/lib/types/wizard/probe.d.ts.map +1 -0
- package/lib/types/wizard/proxy-snippets.d.ts +60 -0
- package/lib/types/wizard/proxy-snippets.d.ts.map +1 -0
- package/lib/types/wizard/routes.d.ts +152 -0
- package/lib/types/wizard/routes.d.ts.map +1 -0
- package/lib/types/wizard/source-detect.d.ts +53 -0
- package/lib/types/wizard/source-detect.d.ts.map +1 -0
- package/lib/types/wizard/status.d.ts +115 -0
- package/lib/types/wizard/status.d.ts.map +1 -0
- package/lib/types/wizard/token-store.d.ts +27 -0
- package/lib/types/wizard/token-store.d.ts.map +1 -0
- package/lib/types/wizard/tunnel-orchestrator.d.ts +90 -0
- package/lib/types/wizard/tunnel-orchestrator.d.ts.map +1 -0
- package/lib/types/wizard/verify.d.ts +97 -0
- package/lib/types/wizard/verify.d.ts.map +1 -0
- package/lib/wizard/binary-io.js +386 -0
- package/lib/wizard/binary-io.js.map +1 -0
- package/lib/wizard/binary.js +138 -0
- package/lib/wizard/binary.js.map +1 -0
- package/lib/wizard/caddy-process.js +162 -0
- package/lib/wizard/caddy-process.js.map +1 -0
- package/lib/wizard/caddy.js +80 -0
- package/lib/wizard/caddy.js.map +1 -0
- package/lib/wizard/cloudflare.js +334 -0
- package/lib/wizard/cloudflare.js.map +1 -0
- package/lib/wizard/cloudflared.js +158 -0
- package/lib/wizard/cloudflared.js.map +1 -0
- package/lib/wizard/probe.js +118 -0
- package/lib/wizard/probe.js.map +1 -0
- package/lib/wizard/proxy-snippets.js +112 -0
- package/lib/wizard/proxy-snippets.js.map +1 -0
- package/lib/wizard/routes.js +462 -0
- package/lib/wizard/routes.js.map +1 -0
- package/lib/wizard/source-detect.js +77 -0
- package/lib/wizard/source-detect.js.map +1 -0
- package/lib/wizard/status.js +94 -0
- package/lib/wizard/status.js.map +1 -0
- package/lib/wizard/token-store.js +71 -0
- package/lib/wizard/token-store.js.map +1 -0
- package/lib/wizard/tunnel-orchestrator.js +155 -0
- package/lib/wizard/tunnel-orchestrator.js.map +1 -0
- package/lib/wizard/verify.js +171 -0
- package/lib/wizard/verify.js.map +1 -0
- package/package.json +37 -37
- package/scripts/check-settings-form.mjs +5 -4
- package/scripts/check-wizard-ui.mjs +690 -0
- package/src/adapters/dsh-better-sidebar/index.ts +6 -2
- package/src/adapters/dsh-better-sidebar/methods.ts +3 -0
- package/src/admin-routes.ts +44 -2
- package/src/client/index.tsx +9 -0
- package/src/client/locales.ts +410 -2
- package/src/client/wizard/GatewayWizard.tsx +2220 -0
- package/src/client/wizard/WizardCard.tsx +81 -0
- package/src/client/wizard/cards/MigrateCard.tsx +42 -0
- package/src/client/wizard/cards/PortForwardCard.tsx +37 -0
- package/src/client/wizard/cards/ProxyCard.tsx +56 -0
- package/src/client/wizard/cards/TokenCard.tsx +81 -0
- package/src/client/wizard/register-wizard.ts +99 -0
- package/src/client/wizard/wizard-css.ts +948 -0
- package/src/client-data/qr.ts +284 -0
- package/src/client-data/remote-status.ts +128 -2
- package/src/client-data/settings-form.ts +12 -3
- package/src/client-data/wizard.ts +432 -0
- package/src/client-routes.ts +53 -0
- package/src/config.ts +87 -0
- package/src/index.ts +227 -2
- package/src/intercept.ts +43 -3
- package/src/merge-streams.ts +41 -12
- package/src/relay-client.ts +76 -0
- package/src/wizard/binary-io.ts +449 -0
- package/src/wizard/binary.ts +177 -0
- package/src/wizard/caddy-process.ts +228 -0
- package/src/wizard/caddy.ts +97 -0
- package/src/wizard/cloudflare.ts +413 -0
- package/src/wizard/cloudflared.ts +196 -0
- package/src/wizard/probe.ts +161 -0
- package/src/wizard/proxy-snippets.ts +128 -0
- package/src/wizard/routes.ts +537 -0
- package/src/wizard/source-detect.ts +87 -0
- package/src/wizard/status.ts +180 -0
- package/src/wizard/token-store.ts +73 -0
- package/src/wizard/tunnel-orchestrator.ts +197 -0
- package/src/wizard/verify.ts +236 -0
|
@@ -189,7 +189,7 @@ export declare const zh: {
|
|
|
189
189
|
readonly 'settings.client.deviceNameDefault': "桌面应用端";
|
|
190
190
|
readonly 'settings.client.fixDeviceName': "请先修正设备名称";
|
|
191
191
|
readonly 'settings.client.pairingCode': "配对码";
|
|
192
|
-
readonly 'settings.client.pairingCodeHint': "在服务端设置页生成「桌面应用端」配对码后填入(8
|
|
192
|
+
readonly 'settings.client.pairingCodeHint': "在服务端设置页生成「桌面应用端」配对码后填入(8 位,自动转大写并过滤 0/O/1/I/L 与符号)。";
|
|
193
193
|
readonly 'settings.client.pair': "配对";
|
|
194
194
|
readonly 'settings.client.pairing': "配对中…";
|
|
195
195
|
readonly 'settings.client.failInvalid': "服务端地址不合法";
|
|
@@ -287,6 +287,209 @@ export declare const zh: {
|
|
|
287
287
|
readonly downloadToLocal: "下载到本机";
|
|
288
288
|
readonly downloadBusy: "下载中…";
|
|
289
289
|
readonly downloadFailed: "下载失败";
|
|
290
|
+
readonly 'wizard.title': "远程访问与设备配对";
|
|
291
|
+
readonly 'wizard.subtitle': "配置本机作为服务端(开放手机与另一台电脑连入)或作为客户端连接远端主机";
|
|
292
|
+
readonly 'wizard.off': "局域网模式 / 待配置";
|
|
293
|
+
readonly 'wizard.step.pick': "选择角色与接入";
|
|
294
|
+
readonly 'wizard.step.configure': "填写连接参数";
|
|
295
|
+
readonly 'wizard.step.verify': "连通验证与配对";
|
|
296
|
+
readonly 'wizard.role.sectionTitle': "本机角色";
|
|
297
|
+
readonly 'wizard.role.host': "作为服务端(主机)";
|
|
298
|
+
readonly 'wizard.role.hostDesc': "本机运行主力会话与网关,允许手机或另一台 DSH 电脑连入并操作会话";
|
|
299
|
+
readonly 'wizard.role.client': "作为桌面客户端(从机)";
|
|
300
|
+
readonly 'wizard.role.clientDesc': "本机连接到另一台 DSH 服务端,在侧边栏直接查看与操作远端共享的会话";
|
|
301
|
+
readonly 'wizard.role.clientPickNote': "切为客户端后,本机将连接到远端服务端的网关(支持公网 HTTPS 域名或局域网 / Tailscale 地址)。点击「下一步」填写服务端地址与配对码。";
|
|
302
|
+
readonly 'wizard.ingressSectionTitle': "服务端接入方式";
|
|
303
|
+
readonly 'wizard.path.caddy': "内置 Caddy(推荐)";
|
|
304
|
+
readonly 'wizard.path.caddyDesc': "适合有公网 IP 的环境。自动下载 Caddy 并通过 Cloudflare DNS 申请证书,无需手写反代配置";
|
|
305
|
+
readonly 'wizard.path.external': "使用已有反向代理";
|
|
306
|
+
readonly 'wizard.path.externalDesc': "适合已部署 Nginx、Caddy 或 Lucky 的环境。提供现成转发规则,直接填入现有反代即可";
|
|
307
|
+
readonly 'wizard.path.cloudflared': "Cloudflare Tunnel 内网穿透";
|
|
308
|
+
readonly 'wizard.path.cloudflaredDesc': "无需公网 IP,也不必配置路由器端口映射。通过 Cloudflare 隧道直连本机,需域名已接入 Cloudflare";
|
|
309
|
+
readonly 'wizard.path.lan': "局域网 / Tailscale 直连";
|
|
310
|
+
readonly 'wizard.path.lanDesc': "在同一局域网或虚拟局域网内连接手机与另一台电脑,无需域名与公网证书";
|
|
311
|
+
readonly 'wizard.next': "下一步";
|
|
312
|
+
readonly 'wizard.back': "上一步";
|
|
313
|
+
readonly 'wizard.hostName': "服务端显示名称";
|
|
314
|
+
readonly 'wizard.hostNamePlaceholder': "例如:mac-mini";
|
|
315
|
+
readonly 'wizard.hostNameHint': "其他电脑或手机连入后在侧边栏看到的主机名称(可留空使用默认名称)";
|
|
316
|
+
readonly 'wizard.autoShare': "新建会话自动共享给已配对的桌面客户端";
|
|
317
|
+
readonly 'wizard.lanUrl': "局域网 / Tailscale 访问地址(可选)";
|
|
318
|
+
readonly 'wizard.lanUrlPlaceholder': "http://192.168.1.10:3088";
|
|
319
|
+
readonly 'wizard.lanUrlHint': "填写本机局域网或 Tailscale 地址(如 http://192.168.1.10:3088),方便下一步直接生成手机扫码二维码与客户端连接信息";
|
|
320
|
+
readonly 'wizard.domain': "访问域名";
|
|
321
|
+
readonly 'wizard.domainHint': "填写完整域名,如 dsh.example.com(不带 https:// 和路径)";
|
|
322
|
+
readonly 'wizard.httpsPort': "HTTPS 端口";
|
|
323
|
+
readonly 'wizard.cfToken': "Cloudflare API 令牌";
|
|
324
|
+
readonly 'wizard.cfTokenHint': "用于自动申请证书或配置隧道,以 0600 权限保存在本机,不写入配置文件";
|
|
325
|
+
readonly 'wizard.cfTokenHowTo': "如何获取 API 令牌";
|
|
326
|
+
readonly 'wizard.serverUrl': "反代后的公网地址";
|
|
327
|
+
readonly 'wizard.serverUrlHint': "填写完整 HTTPS 根地址,如 https://dsh.example.com(不支持子目录)";
|
|
328
|
+
readonly 'wizard.proxySnippet': "查看 Nginx / Caddy / Lucky 配置参考";
|
|
329
|
+
readonly 'wizard.badDomain': "域名格式无效,请填写如 dsh.example.com 的域名";
|
|
330
|
+
readonly 'wizard.badPort': "端口号需为 1–65535 之间的整数";
|
|
331
|
+
readonly 'wizard.missingToken': "请填写 Cloudflare API 令牌";
|
|
332
|
+
readonly 'wizard.badServerUrl': "请填写有效的根路径地址(公网需 https://,局域网可用 http://,不含子目录)";
|
|
333
|
+
readonly 'wizard.verify.gateway': "本地网关就绪";
|
|
334
|
+
readonly 'wizard.verify.public': "访问地址连通";
|
|
335
|
+
readonly 'wizard.verify.pairing': "设备配对状态";
|
|
336
|
+
readonly 'wizard.light.pass': "正常";
|
|
337
|
+
readonly 'wizard.light.pending': "待验证";
|
|
338
|
+
readonly 'wizard.light.fail': "异常";
|
|
339
|
+
readonly 'wizard.pairTarget.web': "配对手机 / 浏览器(扫码)";
|
|
340
|
+
readonly 'wizard.pairTarget.desktop': "配对另一台电脑(桌面客户端)";
|
|
341
|
+
readonly 'wizard.startVerify': "生成配对二维码";
|
|
342
|
+
readonly 'wizard.reverify': "重新生成二维码";
|
|
343
|
+
readonly 'wizard.pairingCode': "配对码";
|
|
344
|
+
readonly 'wizard.pairingSeconds': "有效期剩余 {seconds} 秒";
|
|
345
|
+
readonly 'wizard.qrHint': "用手机相机或浏览器扫码打开配对页,输入上方配对码完成连接";
|
|
346
|
+
readonly 'wizard.verifyPass': "配对成功,设备 {deviceId} 已连接";
|
|
347
|
+
readonly 'wizard.verifyCookieInsecure': "手机已完成配对,但反向代理未传递 X-Forwarded-Proto: https,导致安全 Cookie 未生效。请检查转发头后重试";
|
|
348
|
+
readonly 'wizard.verifyExpired': "配对码已过期,请点击下方按钮重新生成";
|
|
349
|
+
readonly 'wizard.verifyStale': "接入配置已变更,请重新生成二维码";
|
|
350
|
+
readonly 'wizard.verifyPending': "请用手机扫描二维码并在页面中输入配对码…";
|
|
351
|
+
readonly 'wizard.verifyNotStarted': "点击下方按钮验证访问地址并生成手机配对二维码";
|
|
352
|
+
readonly 'wizard.desktop.addressLabel': "服务端连接地址(供客户端填写)";
|
|
353
|
+
readonly 'wizard.desktop.addressFallback': "http://<本机局域网IP>:{port}";
|
|
354
|
+
readonly 'wizard.desktop.generate': "生成桌面客户端配对码";
|
|
355
|
+
readonly 'wizard.desktop.regenerate': "重新生成配对码";
|
|
356
|
+
readonly 'wizard.desktop.copyInfo': "复制地址与配对码";
|
|
357
|
+
readonly 'wizard.desktop.guide': "在另一台电脑打开本插件详情页,第 1 步选「作为桌面客户端」,第 2 步填入上方服务端地址与 8 位配对码即可完成连接。";
|
|
358
|
+
readonly 'wizard.desktop.pairedTitle': "已连接的桌面客户端({count})";
|
|
359
|
+
readonly 'wizard.desktop.pairedEmpty': "暂未配对桌面客户端";
|
|
360
|
+
readonly 'wizard.client.deviceName': "本机设备名称";
|
|
361
|
+
readonly 'wizard.client.deviceNamePlaceholder': "例如:macbook-pro";
|
|
362
|
+
readonly 'wizard.client.deviceNameHint': "配对后在服务端设备列表中显示的名称";
|
|
363
|
+
readonly 'wizard.client.serverUrl': "服务端地址";
|
|
364
|
+
readonly 'wizard.client.serverUrlPlaceholder': "https://dsh.example.com 或 http://192.168.1.10:3088";
|
|
365
|
+
readonly 'wizard.client.serverUrlHint': "填写服务端的公网 HTTPS 地址,或局域网 / Tailscale 下的 http://<服务端IP>:3088";
|
|
366
|
+
readonly 'wizard.client.pairingCode': "8 位桌面配对码";
|
|
367
|
+
readonly 'wizard.client.pairingCodePlaceholder': "在服务端向导第 3 步切到「配对另一台电脑」生成";
|
|
368
|
+
readonly 'wizard.client.pairingCodeHint': "输入服务端生成的 8 位桌面客户端专用配对码(自动转大写,自动过滤 0/O/1/I/L 及符号)";
|
|
369
|
+
readonly 'wizard.client.pairAndConnect': "配对并连接服务端";
|
|
370
|
+
readonly 'wizard.client.pairingBusy': "正在配对并连接…";
|
|
371
|
+
readonly 'wizard.client.skipToStatus': "已配对,查看连接状态";
|
|
372
|
+
readonly 'wizard.client.lightCredential': "本地配对凭证";
|
|
373
|
+
readonly 'wizard.client.lightConnection': "服务端连接";
|
|
374
|
+
readonly 'wizard.client.lightSync': "会话与插件同步";
|
|
375
|
+
readonly 'wizard.client.reconfigure': "更换服务端 / 重新配对";
|
|
376
|
+
readonly 'wizard.startFailed': "验证未通过:{reason}";
|
|
377
|
+
readonly 'wizard.startFailedProbe': "无法访问该连接地址({detail})";
|
|
378
|
+
readonly 'wizard.startFailedRuntime': "入口服务尚未运行,请先在上方启动";
|
|
379
|
+
readonly 'wizard.startFailedGateway': "本地网关未响应,请检查网关运行状态";
|
|
380
|
+
readonly 'wizard.startFailedPair': "无法生成配对码({detail})";
|
|
381
|
+
readonly 'wizard.startFailedUrl': "公网地址格式无效";
|
|
382
|
+
readonly 'wizard.remoteOnly': "安全限制:公网接入向导仅限在服务端本机操作";
|
|
383
|
+
readonly 'wizard.notWired': "当前服务端版本不支持此功能,请升级后重试";
|
|
384
|
+
readonly 'wizard.card.proxyTitle': "反向代理配置参考";
|
|
385
|
+
readonly 'wizard.card.tokenTitle': "获取 Cloudflare API 令牌";
|
|
386
|
+
readonly 'wizard.card.copy': "复制配置";
|
|
387
|
+
readonly 'wizard.card.copied': "已复制";
|
|
388
|
+
readonly 'wizard.card.close': "关闭";
|
|
389
|
+
readonly 'wizard.card.tokenStep1': "登录 Cloudflare 控制台(dash.cloudflare.com),进入右上角「我的个人资料 → API 令牌」(用户令牌,以 cfut_ 开头),或左侧「管理账户 → 账户 API 令牌」(账户令牌,以 cfat_ 开头)";
|
|
390
|
+
readonly 'wizard.card.tokenStep2': "点击「创建令牌」(Create Token),选择「编辑区域 DNS」(Edit zone DNS)模板";
|
|
391
|
+
readonly 'wizard.card.tokenStep3': "在「权限」中保留默认的「区域(Zone)· DNS · 编辑(Edit)」权限";
|
|
392
|
+
readonly 'wizard.card.tokenStep4': "在「区域资源」(Zone Resources)中选择「包括(Include)· 特定区域(Specific zone)· 你的域名」";
|
|
393
|
+
readonly 'wizard.card.tokenStep5': "若使用 Cloudflare Tunnel,点击「+ 添加更多权限」补充下方所列的隧道、账户设置与区域读取权限";
|
|
394
|
+
readonly 'wizard.card.tokenStep6': "点击「继续以显示摘要」(Continue to summary),核对无误后点击「创建令牌」(Create Token)";
|
|
395
|
+
readonly 'wizard.card.tokenStep7': "复制生成的 API 令牌密钥(仅在创建完成页显示一次,关闭后无法再次查看)";
|
|
396
|
+
readonly 'wizard.card.tokenStep8': "粘贴到下方输入框并点击「保存令牌」";
|
|
397
|
+
readonly 'wizard.card.tokenPerms': "所需权限对照";
|
|
398
|
+
readonly 'wizard.card.tokenPermDns': "区域 · DNS · 编辑";
|
|
399
|
+
readonly 'wizard.card.tokenPermDnsWhy': "必选,用于 DNS-01 证书签发与解析记录配置";
|
|
400
|
+
readonly 'wizard.card.tokenPermTunnel': "账户 · Cloudflare Tunnel · 编辑";
|
|
401
|
+
readonly 'wizard.card.tokenPermTunnelWhy': "仅 Cloudflare Tunnel 方式需要";
|
|
402
|
+
readonly 'wizard.card.tokenPermAccount': "账户 · 账户设置 · 读取";
|
|
403
|
+
readonly 'wizard.card.tokenPermAccountWhy': "仅 Cloudflare Tunnel 方式需要(读取账户 ID)";
|
|
404
|
+
readonly 'wizard.card.tokenPermZoneRead': "区域 · 区域 · 读取";
|
|
405
|
+
readonly 'wizard.card.tokenPermZoneReadWhy': "仅 Cloudflare Tunnel 方式需要(定位域名所属区域)";
|
|
406
|
+
readonly 'wizard.card.tokenPaste': "粘贴 API 令牌";
|
|
407
|
+
readonly 'wizard.card.tokenUse': "保存令牌";
|
|
408
|
+
readonly 'wizard.card.migrateTitle': "将域名接入 Cloudflare";
|
|
409
|
+
readonly 'wizard.card.migrateStep1': "在域名注册商后台关闭 DNSSEC(若已开启),并确认域名未锁定 NS(名称服务器)修改";
|
|
410
|
+
readonly 'wizard.card.migrateStep2': "登录 Cloudflare 控制台,在左侧导航进入「域(Domains)→ 概览」,点击「接入域」(Onboard a domain)";
|
|
411
|
+
readonly 'wizard.card.migrateStep3': "输入你的根域名(如 example.com),选择快速扫描 DNS 记录,点击继续并选择 Free 计划";
|
|
412
|
+
readonly 'wizard.card.migrateStep4': "核对扫描出的 DNS 解析记录后继续,复制 Cloudflare 分配的两个名称服务器(Nameservers)地址";
|
|
413
|
+
readonly 'wizard.card.migrateStep5': "前往域名注册商后台,将原有 NS 替换为 Cloudflare 分配的两个名称服务器地址";
|
|
414
|
+
readonly 'wizard.card.migrateStep6': "等待状态变为「活动(Active)」(通常数分钟至数小时),返回此处点击「重新检测域名状态」";
|
|
415
|
+
readonly 'wizard.card.migrateRecheck': "重新检测域名状态";
|
|
416
|
+
readonly 'wizard.card.proxyCheck': "已配置完成,去验证";
|
|
417
|
+
readonly 'wizard.card.portForwardTitle': "路由器端口映射说明";
|
|
418
|
+
readonly 'wizard.card.portForwardStep1': "登录路由器管理后台(常见地址为 192.168.1.1 或 192.168.0.1)";
|
|
419
|
+
readonly 'wizard.card.portForwardStep2': "进入「端口转发 / 虚拟服务器 / NAT」设置页面";
|
|
420
|
+
readonly 'wizard.card.portForwardStep3': "新增 TCP 转发规则:外部端口 {port} 指向本机内网 IP 的 {port} 端口";
|
|
421
|
+
readonly 'wizard.card.portForwardStep4': "保存规则后,使用手机移动网络(关闭 Wi-Fi)测试公网连接";
|
|
422
|
+
readonly 'wizard.portForwardEntry': "非 443 端口:查看路由器端口映射说明";
|
|
423
|
+
readonly 'wizard.migrateEntry': "域名尚未接入 Cloudflare?";
|
|
424
|
+
readonly 'wizard.ingress': "入口服务";
|
|
425
|
+
readonly 'wizard.caddy.start': "启动 Caddy";
|
|
426
|
+
readonly 'wizard.caddy.starting': "正在下载并启动…";
|
|
427
|
+
readonly 'wizard.caddy.stop': "停止";
|
|
428
|
+
readonly 'wizard.caddy.running': "Caddy 运行中";
|
|
429
|
+
readonly 'wizard.caddy.stopped': "Caddy 已停止";
|
|
430
|
+
readonly 'wizard.caddy.neverStarted': "Caddy 未启动";
|
|
431
|
+
readonly 'wizard.caddy.startOk': "Caddy 已启动";
|
|
432
|
+
readonly 'wizard.caddy.startFailed': "Caddy 启动失败:{reason}";
|
|
433
|
+
readonly 'wizard.caddy.failDownload': "自动下载失败,请手动安装后重试";
|
|
434
|
+
readonly 'wizard.caddy.failValidate': "生成的配置文件校验未通过";
|
|
435
|
+
readonly 'wizard.caddy.failAlreadyRunning': "服务已在运行中";
|
|
436
|
+
readonly 'wizard.caddy.failMissingToken': "请先在上一步保存 Cloudflare API 令牌";
|
|
437
|
+
readonly 'wizard.caddy.failNoDomain': "请先在上一步填写有效的访问域名";
|
|
438
|
+
readonly 'wizard.caddy.failBadConfig': "配置参数有误:{detail}";
|
|
439
|
+
readonly 'wizard.caddy.failSpawn': "无法拉起 Caddy 进程";
|
|
440
|
+
readonly 'wizard.token.saved': "已保存在本机";
|
|
441
|
+
readonly 'wizard.token.saveFailed': "令牌保存失败,请重试";
|
|
442
|
+
readonly 'wizard.tunnel.setup': "创建并启动隧道";
|
|
443
|
+
readonly 'wizard.tunnel.stop': "停止";
|
|
444
|
+
readonly 'wizard.tunnel.running': "隧道运行中";
|
|
445
|
+
readonly 'wizard.tunnel.stopped': "隧道已停止";
|
|
446
|
+
readonly 'wizard.tunnel.neverStarted': "隧道未启动";
|
|
447
|
+
readonly 'wizard.tunnel.ok': "Cloudflare 隧道已就绪并开始运行";
|
|
448
|
+
readonly 'wizard.tunnel.conflict': "检测到同名隧道,请选择要复用的隧道:";
|
|
449
|
+
readonly 'wizard.tunnel.useExisting': "复用隧道";
|
|
450
|
+
readonly 'wizard.tunnel.zoneNotFound': "当前令牌下未找到该域名所属的 Cloudflare 区域,请确认域名已接入该账号";
|
|
451
|
+
readonly 'wizard.tunnel.dnsConflict': "该域名已存在指向 {detail} 的 CNAME 记录,请先在 Cloudflare DNS 中清理后再试";
|
|
452
|
+
readonly 'wizard.tunnel.auth': "Cloudflare 认证失败,请检查令牌权限是否正确";
|
|
453
|
+
readonly 'wizard.tunnel.network': "无法连接 Cloudflare API,请检查网络";
|
|
454
|
+
readonly 'wizard.tunnel.api': "Cloudflare 接口报错:{detail}";
|
|
455
|
+
readonly 'wizard.tunnel.spawnFailed': "cloudflared 启动失败:{detail}";
|
|
456
|
+
readonly 'wizard.tunnel.noToken': "请先在上一步保存 Cloudflare API 令牌";
|
|
457
|
+
readonly 'wizard.tunnel.badDomain': "域名格式无效";
|
|
458
|
+
readonly 'wizard.tunnel.checking': "正在配置隧道并启动(首次自动下载 cloudflared)…";
|
|
459
|
+
readonly 'wizard.check.okOnCf': "已确认域名托管在 Cloudflare";
|
|
460
|
+
readonly 'wizard.check.okNotOnCf': "未在 Cloudflare 中找到该域名,请先完成域名接入";
|
|
461
|
+
readonly 'wizard.check.failed': "域名检测失败:{reason}";
|
|
462
|
+
readonly 'wizard.overview.roleLabel': "当前角色";
|
|
463
|
+
readonly 'wizard.overview.gatewayLabel': "本地网关";
|
|
464
|
+
readonly 'wizard.overview.gatewayReady': "运行正常 · 端口 {port}";
|
|
465
|
+
readonly 'wizard.overview.gatewayDown': "未响应";
|
|
466
|
+
readonly 'wizard.overview.ingressLabel': "接入方式与地址";
|
|
467
|
+
readonly 'wizard.overview.devicesLabel': "已配对设备";
|
|
468
|
+
readonly 'wizard.overview.devicesSummary': "手机/网页 {web} 台 · 桌面客户端 {desktop} 台";
|
|
469
|
+
readonly 'wizard.overview.devicesNone': "暂未配对设备";
|
|
470
|
+
readonly 'wizard.overview.clientCredLabel': "本地配对凭证";
|
|
471
|
+
readonly 'wizard.overview.clientConnLabel': "服务端连接";
|
|
472
|
+
readonly 'wizard.overview.clientServerLabel': "远端服务端地址";
|
|
473
|
+
readonly 'wizard.overview.startSetup': "开始配置向导";
|
|
474
|
+
readonly 'wizard.overview.reconfigure': "修改接入配置";
|
|
475
|
+
readonly 'wizard.overview.pairPhone': "配对手机 / 扫码";
|
|
476
|
+
readonly 'wizard.overview.pairDesktop': "配对另一台电脑";
|
|
477
|
+
readonly 'wizard.overview.clientDetail': "连接详情与配对向导";
|
|
478
|
+
readonly 'wizard.overview.emptyIntro': "尚未完成远程访问配置。点击右侧按钮启动向导,按步骤配置本机作为服务端(开放手机与另一台电脑连入)或作为桌面客户端连接远端主机。";
|
|
479
|
+
readonly 'wizard.modal.title': "远程访问与配对向导";
|
|
480
|
+
readonly 'wizard.modal.stepTag': "第 {num} 步";
|
|
481
|
+
readonly 'wizard.modal.step1Desc': "选择本机作为服务端还是桌面客户端;若作为服务端,选择外部设备的连入方式";
|
|
482
|
+
readonly 'wizard.modal.step2Desc': "根据上一步选择的方案,填写对应的连接地址、域名或配对凭证";
|
|
483
|
+
readonly 'wizard.modal.step3Desc': "检测连通状态,并扫码配对手机或生成桌面客户端配对码";
|
|
484
|
+
readonly 'wizard.modal.selectedPlan': "已选方案:{plan}";
|
|
485
|
+
readonly 'wizard.modal.cancel': "取消";
|
|
486
|
+
readonly 'wizard.modal.saveAndNext': "保存并进入验证";
|
|
487
|
+
readonly 'wizard.modal.finish': "完成";
|
|
488
|
+
readonly 'wizard.light.probing': "检测中…";
|
|
489
|
+
readonly 'wizard.overview.manageDevices': "管理设备";
|
|
490
|
+
readonly 'wizard.devicesModal.title': "已配对设备管理";
|
|
491
|
+
readonly 'wizard.devicesModal.subtitle': "查看与管理已配对的手机/网页设备及桌面客户端,支持改名、切换布局或吊销凭证";
|
|
492
|
+
readonly 'wizard.devicesModal.retest': "重新测试连通性";
|
|
290
493
|
};
|
|
291
494
|
/** English dictionary, key-identical to the Chinese source of truth. */
|
|
292
495
|
export declare const en: Record<MobileNavKey, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,EAAE,cAAc,CAAA;AAE7B,mEAAmE;AACnE,eAAO,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../src/client/locales.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,EAAE,cAAc,CAAA;AAE7B,mEAAmE;AACnE,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+fL,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CA2f3C,CAAA;AAED,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GatewayWizard (GW-10): the unified three-step remote-access & device-pairing
|
|
3
|
+
* guide at the top of the plugin detail page (`plugins.bundle.config`,
|
|
4
|
+
* `key: 'dsh-zen-remote'`).
|
|
5
|
+
*
|
|
6
|
+
* Covers both deployment roles in one entry point:
|
|
7
|
+
* - Server (`host`): choose the ingress method (Caddy / Reverse Proxy /
|
|
8
|
+
* Cloudflare Tunnel / LAN & Tailscale), configure parameters + server
|
|
9
|
+
* display name & auto-share, verify connectivity, and pair either a
|
|
10
|
+
* Phone/Browser (QR code) or another Desktop DSH Client (8-character
|
|
11
|
+
* desktop pairing code + live paired-client list).
|
|
12
|
+
* - Desktop Client (`client`): enter the server gateway URL + 8-character
|
|
13
|
+
* desktop pairing code to claim a device token, and verify live
|
|
14
|
+
* connection & session-sync status.
|
|
15
|
+
*/
|
|
16
|
+
import type { ReactNode } from 'react';
|
|
17
|
+
import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
18
|
+
import type { ZenRemoteSettingsForm } from '../../client-data/settings-form.ts';
|
|
19
|
+
import { NS } from '../locales.ts';
|
|
20
|
+
export interface GatewayWizardProps extends PropsRuntime<'plugins.bundle.config'>, PropsLocale<typeof NS> {
|
|
21
|
+
/** The row's staged-form controller — saved-role source of truth. */
|
|
22
|
+
config: ZenRemoteSettingsForm;
|
|
23
|
+
/** One atomic row write (the wiring stages through configForms.mutate). */
|
|
24
|
+
saveRowFields: (fields: Record<string, unknown>, options?: {
|
|
25
|
+
unset?: readonly string[];
|
|
26
|
+
}) => Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export declare function GatewayWizard(props: GatewayWizardProps): ReactNode;
|
|
29
|
+
//# sourceMappingURL=GatewayWizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GatewayWizard.d.ts","sourceRoot":"","sources":["../../../../src/client/wizard/GatewayWizard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAMV,qBAAqB,EACtB,MAAM,oCAAoC,CAAA;AAmD3C,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAMlC,MAAM,WAAW,kBAAmB,SAAQ,YAAY,CAAC,uBAAuB,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;IACvG,qEAAqE;IACrE,MAAM,EAAE,qBAAqB,CAAA;IAC7B,2EAA2E;IAC3E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3G;AAoGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,SAAS,CA++DlE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WizardCard (GW-10): the modal popup for steps the user must perform
|
|
3
|
+
* ELSEWHERE — creating the Cloudflare token, configuring their own
|
|
4
|
+
* reverse proxy. Numbered steps in the page locale, copy-to-clipboard for
|
|
5
|
+
* the value or snippet at hand, Esc / backdrop / button to close. Scoped
|
|
6
|
+
* under `[data-zen-remote="wizard-card"]`.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately NO react-dom portal: `react-dom` is not a seed word of the
|
|
9
|
+
* host browser module table (GW-fix-4 — `check-client-externals` gates the
|
|
10
|
+
* allowlist), so the overlay renders IN PLACE as a `position: fixed`
|
|
11
|
+
* layer. That keeps the plugin version-agnostic; the z-index floor of
|
|
12
|
+
* 1000 clears the Plugins page chrome, and no ancestor of the detail page
|
|
13
|
+
* establishes a containing block that could clip it.
|
|
14
|
+
*/
|
|
15
|
+
import type { ReactNode } from 'react';
|
|
16
|
+
export interface WizardCardProps {
|
|
17
|
+
title: string;
|
|
18
|
+
/** The card's body — numbered steps and/or a config snippet. */
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
/** The copy button's payload; absent means no copy button. */
|
|
21
|
+
copyText?: string | null;
|
|
22
|
+
copyLabel: string;
|
|
23
|
+
copiedLabel: string;
|
|
24
|
+
closeLabel: string;
|
|
25
|
+
/** Optional primary action button rendered alongside the close button. */
|
|
26
|
+
primaryAction?: ReactNode;
|
|
27
|
+
onClose: () => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function WizardCard({ title, children, copyText, copyLabel, copiedLabel, closeLabel, primaryAction, onClose }: WizardCardProps): ReactNode;
|
|
30
|
+
//# sourceMappingURL=WizardCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WizardCard.d.ts","sourceRoot":"","sources":["../../../../src/client/wizard/WizardCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,QAAQ,EAAE,SAAS,CAAA;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,eAAe,GAAG,SAAS,CAgDhJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MigrateCard (GW-11): the six-step domain-to-Cloudflare walkthrough for
|
|
3
|
+
* the tunnel path's precondition, with the 「重新检查」 button that closes
|
|
4
|
+
* the card so the user re-runs the form's own check.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactNode } from 'react';
|
|
7
|
+
import type { WizardT } from './TokenCard.tsx';
|
|
8
|
+
export interface MigrateCardProps {
|
|
9
|
+
t: WizardT;
|
|
10
|
+
/** Closes the card so the caller can re-run its precondition check. */
|
|
11
|
+
onRecheck: () => void;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function MigrateCard({ t, onRecheck, onClose }: MigrateCardProps): ReactNode;
|
|
15
|
+
//# sourceMappingURL=MigrateCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrateCard.d.ts","sourceRoot":"","sources":["../../../../../src/client/wizard/cards/MigrateCard.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,OAAO,CAAA;IACV,uEAAuE;IACvE,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAID,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,gBAAgB,GAAG,SAAS,CAsBlF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PortForwardCard (GW-11): the router port-forwarding steps for path A on
|
|
3
|
+
* a non-443 HTTPS port — the certificate rides DNS-01 (no inbound needed
|
|
4
|
+
* for issuance), but the HTTPS service port itself must be reachable.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactNode } from 'react';
|
|
7
|
+
import type { WizardT } from './TokenCard.tsx';
|
|
8
|
+
export interface PortForwardCardProps {
|
|
9
|
+
t: WizardT;
|
|
10
|
+
/** The HTTPS port to forward. */
|
|
11
|
+
port: number;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function PortForwardCard({ t, port, onClose }: PortForwardCardProps): ReactNode;
|
|
15
|
+
//# sourceMappingURL=PortForwardCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortForwardCard.d.ts","sourceRoot":"","sources":["../../../../../src/client/wizard/cards/PortForwardCard.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,OAAO,CAAA;IACV,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAID,wBAAgB,eAAe,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,oBAAoB,GAAG,SAAS,CAiBrF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProxyCard (GW-11): the reverse-proxy snippets for the user's OWN proxy,
|
|
3
|
+
* tabbed nginx / Caddy / Lucky, with the snippet copy button and the
|
|
4
|
+
* 「我配好了,检查」 button that hands control back to the wizard's
|
|
5
|
+
* verification step.
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from 'react';
|
|
8
|
+
import type { WizardT } from './TokenCard.tsx';
|
|
9
|
+
export interface ProxyCardProps {
|
|
10
|
+
t: WizardT;
|
|
11
|
+
/** Snippet inputs — the domain as typed, the gateway's ACTUAL port. */
|
|
12
|
+
domain: string;
|
|
13
|
+
upstreamPort: number;
|
|
14
|
+
/** 「我配好了,检查」: closes the card and starts the verification. */
|
|
15
|
+
onCheck: () => void;
|
|
16
|
+
onClose: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function ProxyCard({ t, domain, upstreamPort, onCheck, onClose }: ProxyCardProps): ReactNode;
|
|
19
|
+
//# sourceMappingURL=ProxyCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxyCard.d.ts","sourceRoot":"","sources":["../../../../../src/client/wizard/cards/ProxyCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,CAAA;IACV,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,SAAS,CAgClG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TokenCard (GW-11): the Cloudflare API-token creation walkthrough — eight
|
|
3
|
+
* numbered steps, the permission checklist as a small table, and a
|
|
4
|
+
* paste-in box that hands the token back to the wizard's form (`onUse`).
|
|
5
|
+
* The token never persists in component state beyond the box and never
|
|
6
|
+
* leaves this machine except inside the wizard's own POST.
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactNode } from 'react';
|
|
9
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
10
|
+
import { NS } from '../../locales.ts';
|
|
11
|
+
/** The wizard's translate function, straight from the shared locale contract. */
|
|
12
|
+
export type WizardT = PropsLocale<typeof NS>['t'];
|
|
13
|
+
export interface TokenCardProps {
|
|
14
|
+
t: WizardT;
|
|
15
|
+
/** Hands the pasted token back to the wizard's form field. */
|
|
16
|
+
onUse: (token: string) => void;
|
|
17
|
+
onClose: () => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function TokenCard({ t, onUse, onClose }: TokenCardProps): ReactNode;
|
|
20
|
+
//# sourceMappingURL=TokenCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenCard.d.ts","sourceRoot":"","sources":["../../../../../src/client/wizard/cards/TokenCard.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAGrC,iFAAiF;AACjF,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;AAEjD,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,CAAA;IACV,8DAA8D;IAC9D,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAID,wBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,SAAS,CAsD1E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wizard registration for the plugin DETAIL page — the piece that must
|
|
3
|
+
* run BEFORE apply's desktop-shell gate (same discipline as
|
|
4
|
+
* register-settings.ts, and for the same reason: the desktop app IS the
|
|
5
|
+
* main server, and the wizard is exactly where it is most useful).
|
|
6
|
+
*
|
|
7
|
+
* Registered on `plugins.bundle.config` (keyed by `'dsh-zen-remote'`), which
|
|
8
|
+
* `PackageDetail` renders as the FIRST section at the top of the bundle
|
|
9
|
+
* detail page (above `RowsSection`「插件组件」and `SourceSection`「来源」),
|
|
10
|
+
* and which `RowDetail` (the component detail page) never renders.
|
|
11
|
+
*
|
|
12
|
+
* `configForms` never joins the top-level inject: a composition without
|
|
13
|
+
* the settings service keeps the whole browser half loadable, and the lazy
|
|
14
|
+
* `ctx.inject(['configForms'], …)` below simply never fires there — a
|
|
15
|
+
* composition that cannot stage row edits has no use for a wizard that
|
|
16
|
+
* writes rows.
|
|
17
|
+
*/
|
|
18
|
+
import type { ClientContext } from '../compat/types.ts';
|
|
19
|
+
import type { GatewayWizard } from './GatewayWizard.tsx';
|
|
20
|
+
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
21
|
+
interface SlotMap {
|
|
22
|
+
/**
|
|
23
|
+
* One bundle's top configuration block on the plugin DETAIL page — a
|
|
24
|
+
* keyed seat (`key = pkg.name`) rendered at the top of `PackageDetail`
|
|
25
|
+
* above the component rows and source sections, and absent from
|
|
26
|
+
* `RowDetail` (structural mirror of the plugin-manager's declaration).
|
|
27
|
+
*/
|
|
28
|
+
'plugins.bundle.config': {
|
|
29
|
+
kind: 'keyed';
|
|
30
|
+
scope: 'root';
|
|
31
|
+
owner: {
|
|
32
|
+
readonly view: 'page';
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** `plugins.bundle.config` key: the bundle's package name. */
|
|
38
|
+
export declare const WIZARD_BUNDLE_KEY = "dsh-zen-remote";
|
|
39
|
+
export interface SaveRowFieldsOptions {
|
|
40
|
+
/** Field names to remove (`op: 'unset'`) in the same atomic mutation. */
|
|
41
|
+
unset?: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register the wizard stylesheet and (lazily, only where the settings
|
|
45
|
+
* service exists) the bundle detail-page top block.
|
|
46
|
+
* @param ctx - client root context.
|
|
47
|
+
* @param section - the block component; a parameter so this module stays
|
|
48
|
+
* JSX-free and importable under Node's type stripping.
|
|
49
|
+
*/
|
|
50
|
+
export declare function registerGatewayWizard(ctx: ClientContext, section: typeof GatewayWizard): void;
|
|
51
|
+
//# sourceMappingURL=register-wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-wizard.d.ts","sourceRoot":"","sources":["../../../../src/client/wizard/register-wizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAQvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf;;;;;WAKG;QACH,uBAAuB,EAAE;YACvB,IAAI,EAAE,OAAO,CAAA;YACb,KAAK,EAAE,MAAM,CAAA;YACb,KAAK,EAAE;gBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAA;SACjC,CAAA;KACF;CACF;AAED,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,mBAAmB,CAAA;AAEjD,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,aAAa,GAAG,IAAI,CAwC7F"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wizard-page CSS (GW-10), scoped end to end under the block's own
|
|
3
|
+
* `data-zen-remote` attributes — the desktop no-op rule in its CSS form:
|
|
4
|
+
* nothing here may reach a selector the wizard does not own, so the
|
|
5
|
+
* Plugins detail page at ≥1024px renders byte-identically whether or not
|
|
6
|
+
* the component mounts. Same transcription discipline as settings-css.ts
|
|
7
|
+
* (host design tokens only, no literal colors).
|
|
8
|
+
*/
|
|
9
|
+
export declare const WIZARD_CSS = "\n[data-plugin-detail=\"dsh-zen-remote\"] section[data-plugin-config]:empty {\n display: none;\n}\n\n[data-zen-remote=\"wizard\"] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 100%;\n box-sizing: border-box;\n margin-inline: auto;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n padding: 18px 20px;\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-headerText {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-subtitle {\n font-size: 12.5px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-statusBadge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-statusBadge[data-state=\"pass\"] {\n color: var(--dsw-alias-label-primary);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-notice {\n font-size: 12.5px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n padding: 9px 12px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-notice[data-tone=\"error\"] {\n border-color: var(--dsw-alias-state-error-primary, #d5304f);\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-notice[data-tone=\"ok\"] {\n border-color: var(--dsw-alias-state-success-primary, #16a34a);\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n\n/* Inline Status Overview Card (2x2 spacious layout, full text visibility) */\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewGrid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n@media (max-width: 560px) {\n [data-zen-remote=\"wizard\"] .zr-wizard-overviewGrid {\n grid-template-columns: 1fr;\n }\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewItem {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 13px 15px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewLabel {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewValue {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 13.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n line-height: 1.45;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-overviewSub {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n overflow-wrap: anywhere;\n word-break: break-word;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-emptyBanner {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n padding: 14px 16px;\n border-radius: 10px;\n border: 1px dashed var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-emptyText {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n line-height: 1.5;\n margin: 0;\n flex: 1;\n min-width: 220px;\n}\n\n/* Wizard Modal Dialog (above app chrome, below helper sub-cards) */\n[data-zen-remote=\"wizard-modal\"] {\n position: fixed;\n inset: 0;\n z-index: 950;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(2px);\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalDialog {\n width: min(680px, calc(100vw - 32px));\n max-height: min(88vh, 760px);\n display: flex;\n flex-direction: column;\n border-radius: 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n box-shadow: 0 20px 48px rgba(0, 0, 0, 0.28);\n overflow: hidden;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 16px 22px 14px;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalTitle {\n font-size: 15.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalBody {\n padding: 18px 22px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-modalFooter {\n padding: 14px 22px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* Non-clickable 3-step visual progress indicator */\n[data-zen-remote=\"wizard\"] .zr-wizard-stepper {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 13px 22px;\n margin: 0;\n list-style: none;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n border-top: 1px solid var(--dsw-alias-border-l2);\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n user-select: none;\n pointer-events: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepCircle {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n border: 1.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-tertiary);\n flex: none;\n transition: background-color 160ms ease, border-color 160ms ease, color 160ms ease, box-shadow 160ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepCircle {\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-2, #fff);\n box-shadow: 0 0 0 3px var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepCircle {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n border-color: var(--dsw-alias-state-success-primary, #16a34a);\n color: #fff;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepText {\n display: flex;\n flex-direction: column;\n gap: 1px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepTag {\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n line-height: 1.2;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepTag {\n color: var(--dsw-alias-label-secondary);\n font-weight: 500;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepTag {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepName {\n font-size: 13px;\n font-weight: 500;\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"current\"] .zr-wizard-stepName {\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepItem[data-state=\"done\"] .zr-wizard-stepName {\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepConnector {\n flex: 1;\n height: 2px;\n min-width: 18px;\n border-radius: 2px;\n background: var(--dsw-alias-border-l2);\n transition: background-color 200ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepConnector[data-done=\"true\"] {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-stepIntro {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-body {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* Step 1: 3-column path cards */\n[data-zen-remote=\"wizard\"] .zr-wizard-paths {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 10px;\n margin: 0;\n padding: 0;\n border: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path {\n display: flex;\n flex-direction: column;\n gap: 6px;\n text-align: left;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 10px;\n padding: 12px 14px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n cursor: pointer;\n font: inherit;\n color: inherit;\n transition: border-color 120ms ease, box-shadow 120ms ease;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path:hover:not(:disabled) {\n border-color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path[data-selected=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n box-shadow: 0 0 0 1px var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-path:disabled {\n cursor: not-allowed;\n opacity: 0.55;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathHead {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathRadio {\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 1.5px solid var(--dsw-alias-label-tertiary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathRadio[data-selected=\"true\"] {\n border-color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-label-primary);\n box-shadow: inset 0 0 0 2.5px var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathName {\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pathDesc {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-sectionTitle {\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-roleGrid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: 10px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-checkRow {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n user-select: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-checkRow input[type=\"checkbox\"] {\n margin: 0;\n cursor: pointer;\n}\n\n/* Step 2: form controls */\n[data-zen-remote=\"wizard\"] .zr-wizard-selectedBar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-selectedLabel {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-formStack {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-formGrid {\n display: grid;\n grid-template-columns: 1fr 120px;\n gap: 12px;\n align-items: start;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-labelRow {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-savedTag {\n font-size: 11px;\n padding: 1px 7px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n color: var(--dsw-alias-state-success-primary, #16a34a);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-hint {\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n margin: 0;\n line-height: 1.4;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-input {\n height: 34px;\n font: inherit;\n font-size: 13px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n width: 100%;\n box-sizing: border-box;\n}\n[data-zen-remote=\"wizard\"] code.zr-wizard-input {\n display: flex;\n align-items: center;\n min-height: 36px;\n height: auto;\n padding: 6px 12px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n line-height: 1.4;\n overflow-wrap: anywhere;\n word-break: break-all;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-input:focus {\n outline: none;\n border-color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-link {\n background: none;\n border: none;\n padding: 0;\n font: inherit;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n text-decoration: underline;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-link:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-linkBtn {\n font: inherit;\n font-size: 12px;\n padding: 4px 10px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-linkBtn:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-secondary);\n}\n\n/* Primary & Secondary action buttons + Footer */\n[data-zen-remote=\"wizard\"] .zr-wizard-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-footerHint {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn {\n font: inherit;\n font-size: 12.5px;\n font-weight: 500;\n height: 32px;\n padding: 0 14px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn:hover:not(:disabled),\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn:hover:not(:disabled) {\n border-color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btnPrimary,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btnPrimary {\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-bg-layer-2, #fff);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btnPrimary:hover:not(:disabled),\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btnPrimary:hover:not(:disabled) {\n opacity: 0.9;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-btn:disabled,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-btn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Step 3: service control bar, 3-column lights, and QR pairing panel */\n[data-zen-remote=\"wizard\"] .zr-wizard-serviceBar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-serviceInfo {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lights {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 8px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-light {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 9px 12px;\n border-radius: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n font-size: 12.5px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightMain {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightName {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState {\n font-size: 11.5px;\n color: var(--dsw-alias-label-tertiary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState[data-state=\"pass\"] {\n color: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-lightState[data-state=\"fail\"] {\n color: var(--dsw-alias-state-error-primary, #d5304f);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dsw-alias-label-tertiary);\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"pass\"] {\n background: var(--dsw-alias-state-success-primary, #16a34a);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"fail\"] {\n background: var(--dsw-alias-state-error-primary, #d5304f);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-dot[data-state=\"pending\"] {\n background: var(--dsw-alias-state-warning-primary, #b8860b);\n}\n\n[data-zen-remote=\"wizard\"] .zr-wizard-pairPanel {\n display: flex;\n align-items: center;\n gap: 18px;\n flex-wrap: wrap;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-pairMeta {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 180px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 24px;\n letter-spacing: 4px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 2px 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-countdown {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-qr {\n width: 156px;\n height: 156px;\n image-rendering: pixelated;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: #fff;\n display: block;\n flex: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-qr[data-usable=\"false\"] {\n display: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTabs {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 6px;\n padding: 4px;\n border-radius: 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTab {\n font: inherit;\n font-size: 12.5px;\n font-weight: 500;\n padding: 7px 12px;\n border-radius: 6px;\n border: 1px solid transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n text-align: center;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-targetTab[data-selected=\"true\"] {\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-primary);\n font-weight: 600;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-desktopBox,\n[data-zen-remote=\"wizard\"] .zr-wizard-clientBox {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceList {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceItem {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 14px;\n border-radius: 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n font-size: 12.5px;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceTitleRow {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n min-width: 0;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceBadge {\n font-size: 11px;\n font-weight: 500;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-deviceActions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n[data-zen-remote=\"wizard\"] .zr-wizard-select {\n height: 30px;\n font: inherit;\n font-size: 12px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n}\n\n/* The modal card: a body-level overlay, above the app chrome. */\n[data-zen-remote=\"wizard-card\"] {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.45);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardPanel {\n background: var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n width: min(560px, calc(100vw - 32px));\n max-height: min(82vh, 660px);\n overflow: auto;\n padding: 18px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTitle {\n font-size: 15px;\n font-weight: 600;\n margin: 0;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-cardCloseIcon,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCloseIcon {\n border: none;\n background: none;\n color: var(--dsw-alias-label-secondary);\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n border-radius: 6px;\n cursor: pointer;\n}\n[data-zen-remote=\"wizard-modal\"] .zr-wizard-cardCloseIcon:hover,\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCloseIcon:hover {\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardBody {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardSteps {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardSubhead {\n font-size: 12.5px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n margin: 4px 0 0;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n overflow: hidden;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l2);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTable tr:last-child td {\n border-bottom: none;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardPerm {\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardWhy {\n color: var(--dsw-alias-label-tertiary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTabs {\n display: flex;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTab {\n font: inherit;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 12px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardTab[data-selected=\"true\"] {\n color: var(--dsw-alias-bg-layer-2, #fff);\n background: var(--dsw-alias-label-primary);\n border-color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardStep {\n font-size: 12.5px;\n color: var(--dsw-alias-label-secondary);\n margin: 0;\n line-height: 1.45;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardCode {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n white-space: pre;\n background: var(--dsw-alias-bg-layer-3, rgba(127, 127, 127, 0.12));\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n padding: 10px 12px;\n overflow: auto;\n max-height: 260px;\n margin: 0;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-label {\n font-size: 12.5px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-input {\n height: 34px;\n font: inherit;\n font-size: 13px;\n padding: 0 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-module-platform));\n color: var(--dsw-alias-label-primary);\n width: 100%;\n box-sizing: border-box;\n}\n[data-zen-remote=\"wizard-card\"] .zr-wizard-cardActions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n";
|
|
10
|
+
//# sourceMappingURL=wizard-css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-css.d.ts","sourceRoot":"","sources":["../../../../src/client/wizard/wizard-css.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,UAAU,w42BA06BtB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal QR encoder (GW-10): byte mode, versions 1–5, ECC level L, fixed
|
|
3
|
+
* mask 0 — enough for any sane origin URL (106 bytes at v5) while keeping
|
|
4
|
+
* the whole implementation single-block (no interleave) and reviewable.
|
|
5
|
+
* Returns the module matrix (true = dark) or null when the text does not
|
|
6
|
+
* fit. Pure: the check script verifies it at decoder level (RS syndromes
|
|
7
|
+
* all-zero + data recovery + format-info BCH), which is stronger than any
|
|
8
|
+
* memorized reference vector.
|
|
9
|
+
*
|
|
10
|
+
* Standard QR constants only: sizes 21/25/29/33/37, data codewords
|
|
11
|
+
* 19/34/55/80/108, ECC codewords 7/10/15/20/26, alignment centers
|
|
12
|
+
* [6,18]/[6,22]/[6,26]/[6,30], Galois field 0x11d, format-info generator
|
|
13
|
+
* 0x537 XOR-mask 0x5412.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The QR matrix for `text` (UTF-8, byte mode), or null when it does not fit
|
|
17
|
+
* into a version-5-L symbol (106 bytes).
|
|
18
|
+
*/
|
|
19
|
+
export declare function qrMatrix(text: string): boolean[][] | null;
|
|
20
|
+
//# sourceMappingURL=qr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../src/client-data/qr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAqPH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,CAqBzD"}
|