@ohmykreee/dsh-remote-control 0.0.0-stage → 1.0.2

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 (373) hide show
  1. package/AGENTS.md +556 -0
  2. package/INSTALLATION.md +310 -0
  3. package/LICENSE +21 -0
  4. package/README.md +195 -2
  5. package/client.js +3 -0
  6. package/components.json +20 -0
  7. package/cordis.patch.yml +3 -0
  8. package/docs/README.en.md +196 -0
  9. package/docs/screenshots/en/overview.png +0 -0
  10. package/docs/screenshots/en/question.png +0 -0
  11. package/docs/screenshots/zh/overview.png +0 -0
  12. package/docs/screenshots/zh/question.png +0 -0
  13. package/icon.svg +24 -0
  14. package/index.js +2 -0
  15. package/lib/account.js +1 -0
  16. package/lib/app-mapping.js +1 -0
  17. package/lib/i18n.js +1 -0
  18. package/lib/media-enrich.js +1 -0
  19. package/lib/notifications.js +1 -0
  20. package/lib/performance.js +1 -0
  21. package/lib/platform/index.js +1 -0
  22. package/lib/probe-adapter.js +1 -0
  23. package/lib/probe-daemon.js +1 -0
  24. package/lib/probe.js +1 -0
  25. package/lib/qr.js +1 -0
  26. package/lib/runtime.js +1 -0
  27. package/lib/service.js +1 -0
  28. package/lib/sessions.js +1 -0
  29. package/lib/settings.js +1 -0
  30. package/lib/types.js +1 -0
  31. package/lib/util.js +1 -0
  32. package/lib/weather.js +1 -0
  33. package/lib/ws.js +1 -0
  34. package/locale/en.json +6 -0
  35. package/locale/zh.json +6 -0
  36. package/package.json +118 -4
  37. package/scripts/browser-shot.mjs +217 -0
  38. package/scripts/build-dsh.mjs +228 -0
  39. package/scripts/build-rust.mjs +319 -0
  40. package/scripts/build-web.mjs +17 -0
  41. package/scripts/check-npm-package.mjs +322 -0
  42. package/scripts/mock-preview.py +574 -0
  43. package/scripts/screenshot-compose.py +89 -0
  44. package/scripts/screenshot-device.sh +75 -0
  45. package/src/dsh/client/api.ts +68 -0
  46. package/src/dsh/client/i18n.ts +573 -0
  47. package/src/dsh/client/icons.ts +56 -0
  48. package/src/dsh/client/index.ts +95 -0
  49. package/src/dsh/client/logic.ts +310 -0
  50. package/src/dsh/client/panel.ts +483 -0
  51. package/src/dsh/client/sections/apps.ts +40 -0
  52. package/src/dsh/client/sections/balance.ts +38 -0
  53. package/src/dsh/client/sections/connection.ts +97 -0
  54. package/src/dsh/client/sections/notifications.ts +43 -0
  55. package/src/dsh/client/sections/pomodoro.ts +184 -0
  56. package/src/dsh/client/sections/preferences.ts +138 -0
  57. package/src/dsh/client/sections/system.ts +120 -0
  58. package/src/dsh/client/sections/weather.ts +276 -0
  59. package/src/dsh/client/styles.ts +1119 -0
  60. package/src/dsh/client/types.ts +366 -0
  61. package/src/dsh/client/ui.ts +142 -0
  62. package/src/dsh/index.ts +108 -0
  63. package/src/dsh/lib/account.ts +520 -0
  64. package/src/dsh/lib/app-mapping.ts +366 -0
  65. package/src/dsh/lib/i18n.ts +82 -0
  66. package/src/dsh/lib/media-enrich.ts +202 -0
  67. package/src/dsh/lib/notifications.ts +322 -0
  68. package/src/dsh/lib/performance.ts +279 -0
  69. package/src/dsh/lib/platform/index.ts +43 -0
  70. package/src/dsh/lib/probe-adapter.ts +275 -0
  71. package/src/dsh/lib/probe-daemon.ts +359 -0
  72. package/src/dsh/lib/probe.ts +395 -0
  73. package/src/dsh/lib/qr.ts +42 -0
  74. package/src/dsh/lib/runtime.ts +126 -0
  75. package/src/dsh/lib/service.ts +1645 -0
  76. package/src/dsh/lib/sessions.ts +907 -0
  77. package/src/dsh/lib/settings.ts +468 -0
  78. package/src/dsh/lib/types.ts +231 -0
  79. package/src/dsh/lib/util.ts +115 -0
  80. package/src/dsh/lib/weather.ts +532 -0
  81. package/src/dsh/lib/ws.ts +328 -0
  82. package/src/dsh/types/qrcode-generator.d.ts +16 -0
  83. package/src/rust/Cargo.lock +1431 -0
  84. package/src/rust/Cargo.toml +68 -0
  85. package/src/rust/src/cli.rs +233 -0
  86. package/src/rust/src/daemon.rs +140 -0
  87. package/src/rust/src/location/linux.rs +118 -0
  88. package/src/rust/src/location/macos.rs +26 -0
  89. package/src/rust/src/location/mod.rs +170 -0
  90. package/src/rust/src/location/windows.rs +205 -0
  91. package/src/rust/src/main.rs +42 -0
  92. package/src/rust/src/media/catalog.rs +454 -0
  93. package/src/rust/src/media/linux.rs +350 -0
  94. package/src/rust/src/media/macos/accessibility.rs +59 -0
  95. package/src/rust/src/media/macos.rs +366 -0
  96. package/src/rust/src/media/mod.rs +298 -0
  97. package/src/rust/src/media/vendor/apple_music.rs +90 -0
  98. package/src/rust/src/media/vendor/common.rs +186 -0
  99. package/src/rust/src/media/vendor/kugou.rs +52 -0
  100. package/src/rust/src/media/vendor/kuwo.rs +49 -0
  101. package/src/rust/src/media/vendor/mod.rs +75 -0
  102. package/src/rust/src/media/vendor/netease.rs +1715 -0
  103. package/src/rust/src/media/vendor/qishui.rs +36 -0
  104. package/src/rust/src/media/vendor/qqmusic.rs +33 -0
  105. package/src/rust/src/media/vendor/spotify.rs +46 -0
  106. package/src/rust/src/media/vendor/wesing.rs +39 -0
  107. package/src/rust/src/media/vendor/youtube_music.rs +49 -0
  108. package/src/rust/src/media/windows/accessibility.rs +85 -0
  109. package/src/rust/src/media/windows/audio.rs +116 -0
  110. package/src/rust/src/media/windows/private.rs +291 -0
  111. package/src/rust/src/media/windows.rs +775 -0
  112. package/src/rust/src/notifications/linux.rs +276 -0
  113. package/src/rust/src/notifications/macos.rs +382 -0
  114. package/src/rust/src/notifications/mod.rs +244 -0
  115. package/src/rust/src/notifications/windows.rs +565 -0
  116. package/src/rust/src/perf/common.rs +109 -0
  117. package/src/rust/src/perf/linux.rs +282 -0
  118. package/src/rust/src/perf/macos.rs +28 -0
  119. package/src/rust/src/perf/mod.rs +157 -0
  120. package/src/rust/src/perf/windows.rs +981 -0
  121. package/src/rust/src/util.rs +360 -0
  122. package/src/rust/src/volume/linux.rs +195 -0
  123. package/src/rust/src/volume/macos.rs +54 -0
  124. package/src/rust/src/volume/mod.rs +116 -0
  125. package/src/rust/src/volume/windows.rs +75 -0
  126. package/src/rust/tests/cli.rs +79 -0
  127. package/src/rust/tests/daemon.rs +107 -0
  128. package/src/svelte/App.svelte +385 -0
  129. package/src/svelte/index.html +18 -0
  130. package/src/svelte/lib/billing.svelte.ts +228 -0
  131. package/src/svelte/lib/components/BalanceCard.svelte +173 -0
  132. package/src/svelte/lib/components/ClockCard.svelte +183 -0
  133. package/src/svelte/lib/components/CountdownCard.svelte +261 -0
  134. package/src/svelte/lib/components/CpuMemoryCard.svelte +238 -0
  135. package/src/svelte/lib/components/EmptyState.svelte +34 -0
  136. package/src/svelte/lib/components/GpuCard.svelte +245 -0
  137. package/src/svelte/lib/components/HomePage.svelte +34 -0
  138. package/src/svelte/lib/components/MusicControls.svelte +256 -0
  139. package/src/svelte/lib/components/MusicCover.svelte +88 -0
  140. package/src/svelte/lib/components/MusicPage.svelte +116 -0
  141. package/src/svelte/lib/components/NotificationsCard.svelte +109 -0
  142. package/src/svelte/lib/components/Panel.svelte +22 -0
  143. package/src/svelte/lib/components/PerformancePage.svelte +55 -0
  144. package/src/svelte/lib/components/PomodoroCard.svelte +250 -0
  145. package/src/svelte/lib/components/QuestionSheet.svelte +354 -0
  146. package/src/svelte/lib/components/RadialGauge.svelte +99 -0
  147. package/src/svelte/lib/components/Rail.svelte +217 -0
  148. package/src/svelte/lib/components/SectionHeader.svelte +40 -0
  149. package/src/svelte/lib/components/SeekBar.svelte +421 -0
  150. package/src/svelte/lib/components/SessionList.svelte +364 -0
  151. package/src/svelte/lib/components/SessionStats.svelte +98 -0
  152. package/src/svelte/lib/components/SessionsPage.svelte +61 -0
  153. package/src/svelte/lib/components/SpendCard.svelte +105 -0
  154. package/src/svelte/lib/components/ThermalCard.svelte +249 -0
  155. package/src/svelte/lib/components/Toast.svelte +32 -0
  156. package/src/svelte/lib/components/WeatherIcon.svelte +40 -0
  157. package/src/svelte/lib/components/WeatherPanel.svelte +420 -0
  158. package/src/svelte/lib/components/ui/alert/alert-action.svelte +20 -0
  159. package/src/svelte/lib/components/ui/alert/alert-description.svelte +23 -0
  160. package/src/svelte/lib/components/ui/alert/alert-title.svelte +23 -0
  161. package/src/svelte/lib/components/ui/alert/alert.svelte +43 -0
  162. package/src/svelte/lib/components/ui/alert/index.ts +17 -0
  163. package/src/svelte/lib/components/ui/avatar/avatar-badge.svelte +26 -0
  164. package/src/svelte/lib/components/ui/avatar/avatar-fallback.svelte +20 -0
  165. package/src/svelte/lib/components/ui/avatar/avatar-group-count.svelte +23 -0
  166. package/src/svelte/lib/components/ui/avatar/avatar-group.svelte +23 -0
  167. package/src/svelte/lib/components/ui/avatar/avatar-image.svelte +17 -0
  168. package/src/svelte/lib/components/ui/avatar/avatar.svelte +26 -0
  169. package/src/svelte/lib/components/ui/avatar/index.ts +22 -0
  170. package/src/svelte/lib/components/ui/badge/badge.svelte +49 -0
  171. package/src/svelte/lib/components/ui/badge/index.ts +2 -0
  172. package/src/svelte/lib/components/ui/button/button.svelte +82 -0
  173. package/src/svelte/lib/components/ui/button/index.ts +17 -0
  174. package/src/svelte/lib/components/ui/card/card-action.svelte +23 -0
  175. package/src/svelte/lib/components/ui/card/card-content.svelte +20 -0
  176. package/src/svelte/lib/components/ui/card/card-description.svelte +20 -0
  177. package/src/svelte/lib/components/ui/card/card-footer.svelte +20 -0
  178. package/src/svelte/lib/components/ui/card/card-header.svelte +23 -0
  179. package/src/svelte/lib/components/ui/card/card-title.svelte +20 -0
  180. package/src/svelte/lib/components/ui/card/card.svelte +22 -0
  181. package/src/svelte/lib/components/ui/card/index.ts +25 -0
  182. package/src/svelte/lib/components/ui/dialog/dialog-close.svelte +11 -0
  183. package/src/svelte/lib/components/ui/dialog/dialog-content.svelte +48 -0
  184. package/src/svelte/lib/components/ui/dialog/dialog-description.svelte +17 -0
  185. package/src/svelte/lib/components/ui/dialog/dialog-footer.svelte +32 -0
  186. package/src/svelte/lib/components/ui/dialog/dialog-header.svelte +20 -0
  187. package/src/svelte/lib/components/ui/dialog/dialog-overlay.svelte +17 -0
  188. package/src/svelte/lib/components/ui/dialog/dialog-portal.svelte +7 -0
  189. package/src/svelte/lib/components/ui/dialog/dialog-title.svelte +17 -0
  190. package/src/svelte/lib/components/ui/dialog/dialog-trigger.svelte +11 -0
  191. package/src/svelte/lib/components/ui/dialog/dialog.svelte +7 -0
  192. package/src/svelte/lib/components/ui/dialog/index.ts +34 -0
  193. package/src/svelte/lib/components/ui/empty/empty-content.svelte +23 -0
  194. package/src/svelte/lib/components/ui/empty/empty-description.svelte +23 -0
  195. package/src/svelte/lib/components/ui/empty/empty-header.svelte +20 -0
  196. package/src/svelte/lib/components/ui/empty/empty-media.svelte +41 -0
  197. package/src/svelte/lib/components/ui/empty/empty-title.svelte +20 -0
  198. package/src/svelte/lib/components/ui/empty/empty.svelte +23 -0
  199. package/src/svelte/lib/components/ui/empty/index.ts +22 -0
  200. package/src/svelte/lib/components/ui/input/index.ts +7 -0
  201. package/src/svelte/lib/components/ui/input/input.svelte +48 -0
  202. package/src/svelte/lib/components/ui/progress/index.ts +7 -0
  203. package/src/svelte/lib/components/ui/progress/progress.svelte +27 -0
  204. package/src/svelte/lib/components/ui/scroll-area/index.ts +10 -0
  205. package/src/svelte/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte +30 -0
  206. package/src/svelte/lib/components/ui/scroll-area/scroll-area.svelte +43 -0
  207. package/src/svelte/lib/components/ui/separator/index.ts +7 -0
  208. package/src/svelte/lib/components/ui/separator/separator.svelte +21 -0
  209. package/src/svelte/lib/components/ui/sheet/index.ts +34 -0
  210. package/src/svelte/lib/components/ui/sheet/sheet-close.svelte +7 -0
  211. package/src/svelte/lib/components/ui/sheet/sheet-content.svelte +55 -0
  212. package/src/svelte/lib/components/ui/sheet/sheet-description.svelte +17 -0
  213. package/src/svelte/lib/components/ui/sheet/sheet-footer.svelte +20 -0
  214. package/src/svelte/lib/components/ui/sheet/sheet-header.svelte +20 -0
  215. package/src/svelte/lib/components/ui/sheet/sheet-overlay.svelte +20 -0
  216. package/src/svelte/lib/components/ui/sheet/sheet-portal.svelte +7 -0
  217. package/src/svelte/lib/components/ui/sheet/sheet-title.svelte +17 -0
  218. package/src/svelte/lib/components/ui/sheet/sheet-trigger.svelte +7 -0
  219. package/src/svelte/lib/components/ui/sheet/sheet.svelte +7 -0
  220. package/src/svelte/lib/components/ui/skeleton/index.ts +7 -0
  221. package/src/svelte/lib/components/ui/skeleton/skeleton.svelte +17 -0
  222. package/src/svelte/lib/components/ui/slider/index.ts +7 -0
  223. package/src/svelte/lib/components/ui/slider/slider.svelte +52 -0
  224. package/src/svelte/lib/components/ui/tooltip/index.ts +19 -0
  225. package/src/svelte/lib/components/ui/tooltip/tooltip-content.svelte +51 -0
  226. package/src/svelte/lib/components/ui/tooltip/tooltip-portal.svelte +7 -0
  227. package/src/svelte/lib/components/ui/tooltip/tooltip-provider.svelte +7 -0
  228. package/src/svelte/lib/components/ui/tooltip/tooltip-trigger.svelte +7 -0
  229. package/src/svelte/lib/components/ui/tooltip/tooltip.svelte +7 -0
  230. package/src/svelte/lib/countdown.svelte.ts +252 -0
  231. package/src/svelte/lib/format.ts +199 -0
  232. package/src/svelte/lib/i18n.svelte.ts +583 -0
  233. package/src/svelte/lib/media.ts +32 -0
  234. package/src/svelte/lib/pages.ts +18 -0
  235. package/src/svelte/lib/pomodoro.svelte.ts +223 -0
  236. package/src/svelte/lib/session-tree.ts +80 -0
  237. package/src/svelte/lib/state.svelte.ts +359 -0
  238. package/src/svelte/lib/timer-alarm.svelte.ts +319 -0
  239. package/src/svelte/lib/types.ts +306 -0
  240. package/src/svelte/lib/utils.ts +8 -0
  241. package/src/svelte/lib/weather.ts +84 -0
  242. package/src/svelte/lib/ws.ts +104 -0
  243. package/src/svelte/main.ts +13 -0
  244. package/src/svelte/styles/global.css +315 -0
  245. package/src/svelte/vite-env.d.ts +12 -0
  246. package/static/fonts/LICENSE.txt +287 -0
  247. package/static/icon.svg +24 -0
  248. package/static/manifest.webmanifest +18 -0
  249. package/svelte.config.js +5 -0
  250. package/tsconfig.dsh-client.json +18 -0
  251. package/tsconfig.dsh.json +21 -0
  252. package/tsconfig.json +20 -0
  253. package/vite.config.js +31 -0
  254. package/web/assets/index-DLdSfnJ3.css +1 -0
  255. package/web/assets/index-YNE8X0Uy.js +6 -0
  256. package/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  257. package/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  258. package/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  259. package/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  260. package/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  261. package/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  262. package/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  263. package/web/assets/jetbrains-mono-cyrillic-ext-wght-normal-EocZY2iu.woff2 +0 -0
  264. package/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  265. package/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  266. package/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  267. package/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  268. package/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  269. package/web/assets/noto-sans-sc-100-wght-normal-DluiXYzi.woff2 +0 -0
  270. package/web/assets/noto-sans-sc-101-wght-normal-CPkZHnw0.woff2 +0 -0
  271. package/web/assets/noto-sans-sc-102-wght-normal-gzIulUH6.woff2 +0 -0
  272. package/web/assets/noto-sans-sc-103-wght-normal-CJfSBxFo.woff2 +0 -0
  273. package/web/assets/noto-sans-sc-104-wght-normal-B3QMglgE.woff2 +0 -0
  274. package/web/assets/noto-sans-sc-105-wght-normal-xXh_OMfk.woff2 +0 -0
  275. package/web/assets/noto-sans-sc-106-wght-normal-B9n3jMjP.woff2 +0 -0
  276. package/web/assets/noto-sans-sc-107-wght-normal-D7fvVprN.woff2 +0 -0
  277. package/web/assets/noto-sans-sc-108-wght-normal-J0_LhxVo.woff2 +0 -0
  278. package/web/assets/noto-sans-sc-109-wght-normal-Dsp-De_0.woff2 +0 -0
  279. package/web/assets/noto-sans-sc-110-wght-normal-DE_6NUrb.woff2 +0 -0
  280. package/web/assets/noto-sans-sc-111-wght-normal-C4S-TlTn.woff2 +0 -0
  281. package/web/assets/noto-sans-sc-112-wght-normal-BcFuP3w6.woff2 +0 -0
  282. package/web/assets/noto-sans-sc-113-wght-normal-Dk932kmj.woff2 +0 -0
  283. package/web/assets/noto-sans-sc-114-wght-normal-CO_5Xo-i.woff2 +0 -0
  284. package/web/assets/noto-sans-sc-115-wght-normal-BWy07H14.woff2 +0 -0
  285. package/web/assets/noto-sans-sc-116-wght-normal-B4HVAfHo.woff2 +0 -0
  286. package/web/assets/noto-sans-sc-117-wght-normal-siZzFqgK.woff2 +0 -0
  287. package/web/assets/noto-sans-sc-118-wght-normal-xhBB7f6V.woff2 +0 -0
  288. package/web/assets/noto-sans-sc-119-wght-normal-Ck_g2FGz.woff2 +0 -0
  289. package/web/assets/noto-sans-sc-21-wght-normal-D0x9-yBt.woff2 +0 -0
  290. package/web/assets/noto-sans-sc-22-wght-normal-BBUVTShg.woff2 +0 -0
  291. package/web/assets/noto-sans-sc-23-wght-normal-Du1oYWkE.woff2 +0 -0
  292. package/web/assets/noto-sans-sc-24-wght-normal-CmWjJ0gt.woff2 +0 -0
  293. package/web/assets/noto-sans-sc-25-wght-normal-BFHiqilg.woff2 +0 -0
  294. package/web/assets/noto-sans-sc-26-wght-normal-C0sF2Z2f.woff2 +0 -0
  295. package/web/assets/noto-sans-sc-27-wght-normal-COFdrquJ.woff2 +0 -0
  296. package/web/assets/noto-sans-sc-28-wght-normal-DMgdNu1o.woff2 +0 -0
  297. package/web/assets/noto-sans-sc-29-wght-normal-Cmq8em30.woff2 +0 -0
  298. package/web/assets/noto-sans-sc-30-wght-normal-CZWqZ3yU.woff2 +0 -0
  299. package/web/assets/noto-sans-sc-31-wght-normal-Wfi_lutW.woff2 +0 -0
  300. package/web/assets/noto-sans-sc-32-wght-normal-BRJQ4PY5.woff2 +0 -0
  301. package/web/assets/noto-sans-sc-33-wght-normal-CUVQXNAJ.woff2 +0 -0
  302. package/web/assets/noto-sans-sc-34-wght-normal-Bspba0wC.woff2 +0 -0
  303. package/web/assets/noto-sans-sc-35-wght-normal-K8fX_YPG.woff2 +0 -0
  304. package/web/assets/noto-sans-sc-36-wght-normal-CkITyjoT.woff2 +0 -0
  305. package/web/assets/noto-sans-sc-37-wght-normal-WCZ2zfEe.woff2 +0 -0
  306. package/web/assets/noto-sans-sc-38-wght-normal-DeM7CUce.woff2 +0 -0
  307. package/web/assets/noto-sans-sc-39-wght-normal-BMZNLWQU.woff2 +0 -0
  308. package/web/assets/noto-sans-sc-4-wght-normal-AR5bdDjz.woff2 +0 -0
  309. package/web/assets/noto-sans-sc-40-wght-normal-BQ5xpS5j.woff2 +0 -0
  310. package/web/assets/noto-sans-sc-41-wght-normal-Hthm7FFi.woff2 +0 -0
  311. package/web/assets/noto-sans-sc-42-wght-normal-eaS2gKds.woff2 +0 -0
  312. package/web/assets/noto-sans-sc-43-wght-normal-o-T53XXV.woff2 +0 -0
  313. package/web/assets/noto-sans-sc-44-wght-normal-BJH5J4Ez.woff2 +0 -0
  314. package/web/assets/noto-sans-sc-45-wght-normal-BKuxSCOJ.woff2 +0 -0
  315. package/web/assets/noto-sans-sc-46-wght-normal-BR_5Mu6e.woff2 +0 -0
  316. package/web/assets/noto-sans-sc-47-wght-normal-CyY7gKNX.woff2 +0 -0
  317. package/web/assets/noto-sans-sc-48-wght-normal-BNMfTR6k.woff2 +0 -0
  318. package/web/assets/noto-sans-sc-49-wght-normal-DX-0y7wg.woff2 +0 -0
  319. package/web/assets/noto-sans-sc-5-wght-normal-CfWugllB.woff2 +0 -0
  320. package/web/assets/noto-sans-sc-50-wght-normal-DAOGW-Dr.woff2 +0 -0
  321. package/web/assets/noto-sans-sc-51-wght-normal-BlFLOjcP.woff2 +0 -0
  322. package/web/assets/noto-sans-sc-52-wght-normal-OZjrybnw.woff2 +0 -0
  323. package/web/assets/noto-sans-sc-53-wght-normal-CwyWNT6x.woff2 +0 -0
  324. package/web/assets/noto-sans-sc-54-wght-normal-DM0nRe18.woff2 +0 -0
  325. package/web/assets/noto-sans-sc-55-wght-normal-DBK2wUOR.woff2 +0 -0
  326. package/web/assets/noto-sans-sc-56-wght-normal-C-VKK1LS.woff2 +0 -0
  327. package/web/assets/noto-sans-sc-57-wght-normal-Cdbfh5kq.woff2 +0 -0
  328. package/web/assets/noto-sans-sc-58-wght-normal-CflMKARZ.woff2 +0 -0
  329. package/web/assets/noto-sans-sc-59-wght-normal-BS4Kwzxx.woff2 +0 -0
  330. package/web/assets/noto-sans-sc-6-wght-normal-ChnZIQfQ.woff2 +0 -0
  331. package/web/assets/noto-sans-sc-60-wght-normal-B7QOYsXJ.woff2 +0 -0
  332. package/web/assets/noto-sans-sc-61-wght-normal-C8JjQS7w.woff2 +0 -0
  333. package/web/assets/noto-sans-sc-62-wght-normal-bS4wq1Gg.woff2 +0 -0
  334. package/web/assets/noto-sans-sc-63-wght-normal-BJr8P-OB.woff2 +0 -0
  335. package/web/assets/noto-sans-sc-64-wght-normal-DVB11t7j.woff2 +0 -0
  336. package/web/assets/noto-sans-sc-65-wght-normal-DMPCXBvK.woff2 +0 -0
  337. package/web/assets/noto-sans-sc-66-wght-normal-BobaG10V.woff2 +0 -0
  338. package/web/assets/noto-sans-sc-67-wght-normal-Dzk7WhCR.woff2 +0 -0
  339. package/web/assets/noto-sans-sc-68-wght-normal-DGbCD9xu.woff2 +0 -0
  340. package/web/assets/noto-sans-sc-69-wght-normal-Ctrv1EqA.woff2 +0 -0
  341. package/web/assets/noto-sans-sc-70-wght-normal-RgTO941D.woff2 +0 -0
  342. package/web/assets/noto-sans-sc-71-wght-normal-D9sG-CWv.woff2 +0 -0
  343. package/web/assets/noto-sans-sc-72-wght-normal-C4oWy3ul.woff2 +0 -0
  344. package/web/assets/noto-sans-sc-73-wght-normal-B1ZoOTgM.woff2 +0 -0
  345. package/web/assets/noto-sans-sc-74-wght-normal-F7dH_rZJ.woff2 +0 -0
  346. package/web/assets/noto-sans-sc-75-wght-normal-Cp2wp4si.woff2 +0 -0
  347. package/web/assets/noto-sans-sc-76-wght-normal-B494D7xS.woff2 +0 -0
  348. package/web/assets/noto-sans-sc-77-wght-normal-B3MVY9Ax.woff2 +0 -0
  349. package/web/assets/noto-sans-sc-78-wght-normal-5jX7iNMC.woff2 +0 -0
  350. package/web/assets/noto-sans-sc-79-wght-normal-BIoZy8fr.woff2 +0 -0
  351. package/web/assets/noto-sans-sc-80-wght-normal-Bje1Fxy1.woff2 +0 -0
  352. package/web/assets/noto-sans-sc-81-wght-normal-B2NN7Qi3.woff2 +0 -0
  353. package/web/assets/noto-sans-sc-82-wght-normal-CUggNZi4.woff2 +0 -0
  354. package/web/assets/noto-sans-sc-83-wght-normal-99rD8YO-.woff2 +0 -0
  355. package/web/assets/noto-sans-sc-84-wght-normal-zMBmUocm.woff2 +0 -0
  356. package/web/assets/noto-sans-sc-85-wght-normal-CjI3qdxG.woff2 +0 -0
  357. package/web/assets/noto-sans-sc-86-wght-normal-BHY8TVEH.woff2 +0 -0
  358. package/web/assets/noto-sans-sc-87-wght-normal-DioZSHnU.woff2 +0 -0
  359. package/web/assets/noto-sans-sc-88-wght-normal-BXYxwf2t.woff2 +0 -0
  360. package/web/assets/noto-sans-sc-89-wght-normal-ClMFrFaL.woff2 +0 -0
  361. package/web/assets/noto-sans-sc-90-wght-normal-BnOlPreP.woff2 +0 -0
  362. package/web/assets/noto-sans-sc-91-wght-normal-DTr9RQcS.woff2 +0 -0
  363. package/web/assets/noto-sans-sc-97-wght-normal-9u6Aiav-.woff2 +0 -0
  364. package/web/assets/noto-sans-sc-98-wght-normal-BR-H2C0V.woff2 +0 -0
  365. package/web/assets/noto-sans-sc-99-wght-normal-BI6XPoxp.woff2 +0 -0
  366. package/web/assets/noto-sans-sc-cyrillic-wght-normal-BGmsQlw-.woff2 +0 -0
  367. package/web/assets/noto-sans-sc-latin-ext-wght-normal-DuJTpTg_.woff2 +0 -0
  368. package/web/assets/noto-sans-sc-latin-wght-normal-DDW8mKAR.woff2 +0 -0
  369. package/web/assets/noto-sans-sc-vietnamese-wght-normal-Bi3ATJ76.woff2 +0 -0
  370. package/web/fonts/LICENSE.txt +287 -0
  371. package/web/icon.svg +24 -0
  372. package/web/index.html +19 -0
  373. package/web/manifest.webmanifest +18 -0
@@ -0,0 +1,1119 @@
1
+ /**
2
+ * The remote console's stylesheet.
3
+ *
4
+ * It intentionally mirrors DSH's settings dialog rather than inventing a new
5
+ * visual language: a 188px navigation rail, a 54px header row, the same type
6
+ * scale, hairline rows instead of cards, and the shared `--dsw-*` tokens. The
7
+ * `--drc-*` aliases only supply fallbacks for tokens missing from older DSH
8
+ * builds, so the page inherits the host theme in both light and dark modes.
9
+ */
10
+
11
+ export const CSS = `
12
+ .drc-page {
13
+ --drc-text: var(--dsw-alias-label-primary);
14
+ --drc-muted: var(--dsw-alias-label-secondary);
15
+ --drc-tertiary: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));
16
+ --drc-border: var(--dsw-alias-border-l2, var(--dsw-alias-border-l1));
17
+ --drc-hairline: var(--dsw-alias-border-l4, var(--dsw-alias-border-l1));
18
+ --drc-card-border: var(--dsw-alias-border-l1, var(--dsw-alias-border-l2));
19
+ --drc-surface: var(--dsw-alias-bg-layer-1);
20
+ --drc-surface-2: var(--dsw-alias-bg-layer-2);
21
+ --drc-surface-3: var(--dsw-alias-bg-layer-3, var(--dsw-alias-bg-layer-1));
22
+ --drc-hover: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));
23
+ --drc-accent: var(--dsw-alias-brand-primary);
24
+ --drc-success: var(--dsw-alias-state-success-primary);
25
+ --drc-error: var(--dsw-alias-state-error-primary);
26
+ --drc-radius: var(--dsw-radius-md, 8px);
27
+ --drc-radius-sm: var(--dsw-radius-sm, 6px);
28
+ --drc-card-radius: var(--dsw-radius-lg, 12px);
29
+ height: 100%;
30
+ max-height: none;
31
+ min-height: 0;
32
+ display: flex;
33
+ flex-direction: column;
34
+ overflow: hidden;
35
+ color: var(--drc-text);
36
+ background: var(--dsw-alias-bg-base);
37
+ font-family: inherit;
38
+ font-size: 14px;
39
+ line-height: 22px;
40
+ }
41
+
42
+ .drc-shell {
43
+ flex: 1 1 auto;
44
+ min-height: 0;
45
+ display: grid;
46
+ grid-template-columns: 188px minmax(0, 1fr);
47
+ grid-template-rows: 54px minmax(0, 1fr);
48
+ grid-template-areas:
49
+ 'title head'
50
+ 'nav main';
51
+ }
52
+
53
+ .drc-nav-title {
54
+ grid-area: title;
55
+ padding: 22px 12px 8px 24px;
56
+ overflow: hidden;
57
+ color: var(--drc-text);
58
+ font-size: 16px;
59
+ font-weight: 500;
60
+ line-height: 24px;
61
+ white-space: nowrap;
62
+ text-overflow: ellipsis;
63
+ }
64
+
65
+ .drc-head {
66
+ grid-area: head;
67
+ display: flex;
68
+ align-items: flex-start;
69
+ justify-content: flex-end;
70
+ gap: 8px;
71
+ min-width: 0;
72
+ height: 54px;
73
+ padding: 10px 20px 14px 10px;
74
+ box-sizing: border-box;
75
+ }
76
+
77
+ .drc-head-actions {
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: flex-end;
81
+ flex-wrap: wrap;
82
+ gap: 8px;
83
+ margin-left: auto;
84
+ min-width: 0;
85
+ }
86
+
87
+ .drc-nav {
88
+ grid-area: nav;
89
+ min-width: 0;
90
+ min-height: 0;
91
+ padding: 10px 12px 0;
92
+ overflow-y: auto;
93
+ box-sizing: border-box;
94
+ }
95
+
96
+ .drc-nav-list {
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: 4px;
100
+ min-height: 0;
101
+ }
102
+
103
+ .drc-nav-item {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 8px;
107
+ width: 100%;
108
+ height: 40px;
109
+ padding: 9px 16px 9px 12px;
110
+ box-sizing: border-box;
111
+ border: 0;
112
+ border-radius: var(--drc-radius);
113
+ background: transparent;
114
+ color: var(--drc-text);
115
+ font: inherit;
116
+ font-size: 14px;
117
+ font-weight: 400;
118
+ line-height: 22px;
119
+ text-align: left;
120
+ cursor: pointer;
121
+ }
122
+
123
+ .drc-nav-item svg {
124
+ width: 16px;
125
+ height: 16px;
126
+ flex: 0 0 auto;
127
+ }
128
+
129
+ .drc-nav-item:hover {
130
+ background: var(--drc-hover);
131
+ }
132
+
133
+ .drc-nav-item.is-active {
134
+ background: var(--dsw-specific-sidebar-nav-item-active, var(--dsw-alias-bg-layer-2));
135
+ font-weight: 500;
136
+ }
137
+
138
+ .drc-nav-label {
139
+ flex: 1;
140
+ min-width: 0;
141
+ overflow: hidden;
142
+ white-space: nowrap;
143
+ text-overflow: ellipsis;
144
+ }
145
+
146
+ .drc-nav-compact {
147
+ padding: 0 16px 12px;
148
+ }
149
+
150
+ .drc-nav-select-wrap {
151
+ position: relative;
152
+ width: 100%;
153
+ }
154
+
155
+ .drc-nav-select {
156
+ width: 100%;
157
+ height: 40px;
158
+ padding: 0 36px 0 12px;
159
+ box-sizing: border-box;
160
+ border: 0.5px solid var(--drc-hairline);
161
+ border-radius: var(--drc-radius);
162
+ outline: none;
163
+ appearance: none;
164
+ background: var(--dsw-alias-bg-layer-1, var(--drc-surface));
165
+ color: var(--drc-text);
166
+ font: inherit;
167
+ font-size: 14px;
168
+ line-height: 22px;
169
+ cursor: pointer;
170
+ }
171
+
172
+ .drc-nav-select:focus-visible {
173
+ outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary, var(--drc-accent)));
174
+ outline-offset: 1px;
175
+ }
176
+
177
+ .drc-nav-select-wrap::after {
178
+ content: '';
179
+ position: absolute;
180
+ top: 50%;
181
+ right: 14px;
182
+ width: 7px;
183
+ height: 7px;
184
+ border-right: 1.5px solid var(--drc-muted);
185
+ border-bottom: 1.5px solid var(--drc-muted);
186
+ transform: translateY(-70%) rotate(45deg);
187
+ pointer-events: none;
188
+ }
189
+
190
+ .drc-main {
191
+ grid-area: main;
192
+ min-width: 0;
193
+ min-height: 0;
194
+ padding: 0 24px 24px;
195
+ overflow-y: auto;
196
+ box-sizing: border-box;
197
+ scrollbar-width: thin;
198
+ }
199
+
200
+ .drc-main::-webkit-scrollbar { width: 8px; }
201
+ .drc-main::-webkit-scrollbar-thumb { background: var(--drc-border); border-radius: 999px; }
202
+
203
+ .drc-section {
204
+ width: 100%;
205
+ max-width: 760px;
206
+ display: flex;
207
+ flex-direction: column;
208
+ gap: 10px;
209
+ color: var(--drc-text);
210
+ }
211
+
212
+ .drc-section-head {
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: 4px;
216
+ margin-bottom: 2px;
217
+ }
218
+
219
+ .drc-section-title {
220
+ margin: 0;
221
+ font-size: 18px;
222
+ font-weight: 600;
223
+ line-height: 26px;
224
+ }
225
+
226
+ .drc-intro {
227
+ margin: 0;
228
+ color: var(--drc-tertiary);
229
+ font-size: 13px;
230
+ line-height: 20px;
231
+ }
232
+
233
+ .drc-group {
234
+ display: flex;
235
+ flex-direction: column;
236
+ min-width: 0;
237
+ padding: 0 16px;
238
+ border: 0.5px solid var(--drc-card-border);
239
+ border-radius: var(--drc-card-radius);
240
+ background: var(--dsw-alias-bg-layer-1, var(--drc-surface));
241
+ box-sizing: border-box;
242
+ }
243
+
244
+ .drc-group + .drc-group { margin-top: 0; }
245
+
246
+ .drc-group-head {
247
+ display: flex;
248
+ flex-direction: column;
249
+ gap: 4px;
250
+ padding: 16px 0 4px;
251
+ }
252
+
253
+ .drc-group-title {
254
+ margin: 0;
255
+ font-size: 14px;
256
+ font-weight: 500;
257
+ line-height: 22px;
258
+ }
259
+
260
+ .drc-group-desc {
261
+ margin: 0;
262
+ color: var(--drc-tertiary);
263
+ font-size: 12px;
264
+ line-height: 18px;
265
+ }
266
+
267
+ /* Separator between distinct setting groups inside one card. Never use it
268
+ * directly under the card header or between a control and its own action. */
269
+ .drc-divider {
270
+ height: 0;
271
+ margin: 8px 0;
272
+ border-top: 0.5px solid var(--drc-border);
273
+ }
274
+
275
+ /* List rows keep a separator, but inset from both sides so it reads lighter
276
+ * than the card border instead of touching the card edge. */
277
+ .drc-list-row + .drc-list-row,
278
+ .drc-order-row + .drc-order-row,
279
+ .drc-status-row + .drc-status-row,
280
+ .drc-map-row + .drc-map-row,
281
+ .drc-client + .drc-client {
282
+ position: relative;
283
+ }
284
+
285
+ .drc-list-row + .drc-list-row::before,
286
+ .drc-order-row + .drc-order-row::before,
287
+ .drc-status-row + .drc-status-row::before,
288
+ .drc-map-row + .drc-map-row::before,
289
+ .drc-client + .drc-client::before {
290
+ content: '';
291
+ position: absolute;
292
+ top: 0;
293
+ right: 12px;
294
+ left: 12px;
295
+ height: 0.5px;
296
+ background: var(--drc-border);
297
+ }
298
+
299
+ .drc-row {
300
+ display: flex;
301
+ align-items: center;
302
+ justify-content: space-between;
303
+ gap: 24px;
304
+ padding: 10px 0;
305
+ }
306
+
307
+ /* A card without a header (for example the pomodoro timer group) starts
308
+ * directly with its first row; keep the same top breathing room as a card
309
+ * header would give it. */
310
+ .drc-group > .drc-row:first-child { padding-top: 16px; }
311
+
312
+ .drc-row-main {
313
+ flex: 1;
314
+ min-width: 0;
315
+ display: flex;
316
+ flex-direction: column;
317
+ gap: 4px;
318
+ }
319
+
320
+ .drc-row-title {
321
+ font-size: 14px;
322
+ line-height: 22px;
323
+ font-weight: 400;
324
+ }
325
+
326
+ .drc-row-desc {
327
+ color: var(--drc-tertiary);
328
+ font-size: 12px;
329
+ line-height: 18px;
330
+ }
331
+
332
+ .drc-row-control {
333
+ flex: 0 0 auto;
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 8px;
337
+ }
338
+
339
+ .drc-btn {
340
+ box-sizing: border-box;
341
+ display: inline-flex;
342
+ align-items: center;
343
+ justify-content: center;
344
+ gap: 4px;
345
+ height: 36px;
346
+ padding: 0 14px;
347
+ border: 0;
348
+ border-radius: var(--drc-radius);
349
+ background: transparent;
350
+ color: var(--drc-text);
351
+ box-shadow: inset 0 0 0 0.5px var(--dsw-alias-border-l3, var(--drc-border));
352
+ font: inherit;
353
+ font-size: 14px;
354
+ font-weight: 400;
355
+ line-height: 22px;
356
+ white-space: nowrap;
357
+ cursor: pointer;
358
+ }
359
+
360
+ .drc-btn:hover:not(:disabled) { background: var(--drc-hover); }
361
+
362
+ .drc-btn.is-primary {
363
+ background: var(--dsw-alias-button-primary-fill, var(--dsw-alias-label-primary));
364
+ color: var(--dsw-alias-label-primary-foreground, var(--dsw-alias-bg-layer-3));
365
+ box-shadow: none;
366
+ }
367
+
368
+ .drc-btn.is-primary:hover:not(:disabled) {
369
+ background: var(--dsw-alias-button-primary-hover, var(--dsw-alias-label-primary));
370
+ }
371
+
372
+ .drc-btn.is-danger {
373
+ color: var(--drc-error);
374
+ box-shadow: inset 0 0 0 0.5px color-mix(in srgb, var(--drc-error) 35%, transparent);
375
+ }
376
+
377
+ .drc-btn.is-danger:hover:not(:disabled) {
378
+ background: color-mix(in srgb, var(--drc-error) 10%, transparent);
379
+ }
380
+
381
+ .drc-btn.is-sm {
382
+ height: 28px;
383
+ padding: 0 10px;
384
+ border-radius: var(--drc-radius-sm);
385
+ font-size: 12px;
386
+ line-height: 18px;
387
+ }
388
+
389
+ .drc-btn:disabled { opacity: 0.4; cursor: not-allowed; }
390
+
391
+ .drc-btn:focus-visible,
392
+ .drc-nav-item:focus-visible,
393
+ .drc-toggle:focus-visible,
394
+ .drc-seg button:focus-visible,
395
+ .drc-city-option:focus-visible,
396
+ .drc-app:focus-visible {
397
+ outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary, var(--drc-accent)));
398
+ outline-offset: 1px;
399
+ }
400
+
401
+ .drc-toggle {
402
+ position: relative;
403
+ flex: 0 0 auto;
404
+ width: 36px;
405
+ height: 20px;
406
+ padding: 2px;
407
+ border: 0;
408
+ border-radius: 999px;
409
+ corner-shape: round;
410
+ background: var(--dsw-alias-border-l3, var(--drc-border));
411
+ cursor: pointer;
412
+ }
413
+
414
+ .drc-toggle i {
415
+ position: absolute;
416
+ top: 2px;
417
+ left: 2px;
418
+ width: 16px;
419
+ height: 16px;
420
+ border-radius: 50%;
421
+ corner-shape: round;
422
+ background: var(--dsw-alias-switch-thumb, var(--drc-muted));
423
+ transition: transform 120ms ease, background 120ms ease;
424
+ }
425
+
426
+ .drc-toggle.is-on { background: var(--drc-accent); }
427
+ .drc-toggle.is-on i {
428
+ transform: translateX(16px);
429
+ background: var(--dsw-alias-label-primary-foreground, #fff);
430
+ }
431
+
432
+ .drc-seg {
433
+ display: inline-grid;
434
+ grid-auto-flow: column;
435
+ grid-auto-columns: 1fr;
436
+ gap: 2px;
437
+ max-width: 100%;
438
+ padding: 4px;
439
+ border-radius: var(--drc-radius);
440
+ background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));
441
+ box-sizing: border-box;
442
+ }
443
+
444
+ .drc-seg button {
445
+ height: 28px;
446
+ padding: 0 16px;
447
+ border: 0;
448
+ border-radius: var(--drc-radius-sm);
449
+ background: transparent;
450
+ color: var(--drc-muted);
451
+ font: inherit;
452
+ font-size: 13px;
453
+ font-weight: 500;
454
+ line-height: 20px;
455
+ white-space: nowrap;
456
+ cursor: pointer;
457
+ transition: background 120ms ease, color 120ms ease;
458
+ }
459
+
460
+ .drc-seg button.is-active {
461
+ background: var(--dsw-alias-bg-layer-1);
462
+ color: var(--drc-text);
463
+ box-shadow: var(--dsw-elevation-soft, 0 1px 2px rgb(0 0 0 / 8%));
464
+ }
465
+
466
+ .drc-seg button[aria-pressed='false']:hover { color: var(--drc-text); }
467
+
468
+ .drc-fields {
469
+ display: flex;
470
+ flex-wrap: wrap;
471
+ gap: 16px;
472
+ padding: 10px 0;
473
+ }
474
+
475
+ /* Countdown presets are a vertical list: one preset per row, the input grows
476
+ * and the remove action stays on the same line. */
477
+ .drc-preset-row {
478
+ display: flex;
479
+ align-items: center;
480
+ gap: 12px;
481
+ min-width: 0;
482
+ padding: 8px 0;
483
+ }
484
+
485
+ .drc-preset-main {
486
+ display: flex;
487
+ align-items: center;
488
+ gap: 12px;
489
+ flex: 1 1 auto;
490
+ min-width: 0;
491
+ }
492
+
493
+ .drc-preset-label {
494
+ flex: 0 0 auto;
495
+ min-width: 96px;
496
+ color: var(--drc-text);
497
+ font-size: 13px;
498
+ font-weight: 500;
499
+ line-height: 20px;
500
+ white-space: nowrap;
501
+ }
502
+
503
+ /* Countdown presets read as "x 分 y 秒": two compact fields with unit labels. */
504
+ .drc-preset-duration {
505
+ display: flex;
506
+ align-items: center;
507
+ gap: 6px;
508
+ flex: 1 1 auto;
509
+ min-width: 0;
510
+ }
511
+
512
+ .drc-preset-row .drc-preset-part {
513
+ flex: 0 1 92px;
514
+ width: 92px;
515
+ min-width: 0;
516
+ text-align: right;
517
+ font-variant-numeric: tabular-nums;
518
+ }
519
+
520
+ .drc-preset-unit {
521
+ flex: 0 0 auto;
522
+ color: var(--drc-tertiary);
523
+ font-size: 12px;
524
+ line-height: 18px;
525
+ white-space: nowrap;
526
+ }
527
+
528
+ .drc-preset-count {
529
+ color: var(--drc-tertiary);
530
+ font-size: 12px;
531
+ line-height: 18px;
532
+ font-variant-numeric: tabular-nums;
533
+ }
534
+
535
+ .drc-field {
536
+ flex: 1 1 190px;
537
+ min-width: 0;
538
+ display: flex;
539
+ flex-direction: column;
540
+ gap: 6px;
541
+ }
542
+
543
+ .drc-field > span {
544
+ color: var(--drc-text);
545
+ font-size: 13px;
546
+ font-weight: 500;
547
+ line-height: 20px;
548
+ }
549
+
550
+ .drc-field input {
551
+ width: 100%;
552
+ height: 34px;
553
+ padding: 0 12px;
554
+ box-sizing: border-box;
555
+ border: 0.5px solid var(--drc-hairline);
556
+ border-radius: var(--drc-radius);
557
+ outline: none;
558
+ background: var(--drc-surface-3);
559
+ color: var(--drc-text);
560
+ font: inherit;
561
+ font-size: 13px;
562
+ line-height: 20px;
563
+ }
564
+
565
+ .drc-field input::placeholder { color: var(--dsw-alias-label-dimmed, var(--drc-tertiary)); }
566
+ .drc-field input:focus { border-color: var(--dsw-alias-state-business-primary, var(--drc-accent)); }
567
+ .drc-field input:disabled { opacity: 0.5; cursor: not-allowed; }
568
+
569
+ /* City combobox: the field keeps the normal label/input layout and hosts the
570
+ * suggestion list in an absolutely positioned popover so the card never
571
+ * reflows while typing. */
572
+ .drc-city { position: relative; }
573
+
574
+ .drc-city-menu {
575
+ position: absolute;
576
+ top: calc(100% + 4px);
577
+ right: 0;
578
+ left: 0;
579
+ z-index: 30;
580
+ max-height: 236px;
581
+ padding: 4px;
582
+ overflow-y: auto;
583
+ border: 0.5px solid var(--drc-card-border);
584
+ border-radius: var(--drc-radius);
585
+ background: var(--dsw-alias-bg-layer-1, var(--drc-surface));
586
+ box-shadow: var(--dsw-elevation-soft, 0 12px 32px rgb(0 0 0 / 18%));
587
+ box-sizing: border-box;
588
+ scrollbar-width: thin;
589
+ }
590
+
591
+ .drc-city-option {
592
+ display: flex;
593
+ flex-direction: column;
594
+ gap: 1px;
595
+ width: 100%;
596
+ padding: 7px 10px;
597
+ border: 0;
598
+ border-radius: var(--drc-radius-sm);
599
+ background: transparent;
600
+ color: var(--drc-text);
601
+ font: inherit;
602
+ text-align: left;
603
+ cursor: pointer;
604
+ }
605
+
606
+ .drc-city-option.is-active { background: var(--drc-hover); }
607
+
608
+ .drc-city-name {
609
+ font-size: 13px;
610
+ font-weight: 500;
611
+ line-height: 20px;
612
+ }
613
+
614
+ .drc-city-meta {
615
+ color: var(--drc-tertiary);
616
+ font-size: 11px;
617
+ line-height: 17px;
618
+ }
619
+
620
+ .drc-city-empty {
621
+ padding: 8px 10px;
622
+ color: var(--drc-tertiary);
623
+ font-size: 12px;
624
+ line-height: 18px;
625
+ }
626
+
627
+ .drc-city-empty.is-error { color: var(--drc-error); }
628
+
629
+ .drc-city-error-title,
630
+ .drc-city-error-detail { display: block; }
631
+
632
+ .drc-city-error-detail {
633
+ margin-top: 2px;
634
+ color: var(--drc-tertiary);
635
+ font-size: 10px;
636
+ line-height: 15px;
637
+ overflow-wrap: anywhere;
638
+ }
639
+
640
+ .drc-list {
641
+ display: flex;
642
+ flex-direction: column;
643
+ }
644
+
645
+ .drc-list-row {
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 12px;
649
+ padding: 8px 0;
650
+ font-size: 13px;
651
+ line-height: 20px;
652
+ }
653
+
654
+ .drc-list-row label {
655
+ display: flex;
656
+ align-items: center;
657
+ gap: 8px;
658
+ flex: 1;
659
+ min-width: 0;
660
+ cursor: pointer;
661
+ }
662
+
663
+ .drc-list-row input[type='checkbox'] {
664
+ width: 16px;
665
+ height: 16px;
666
+ margin: 0;
667
+ accent-color: var(--drc-accent);
668
+ cursor: inherit;
669
+ }
670
+
671
+ .drc-code {
672
+ color: var(--drc-tertiary);
673
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
674
+ font-size: 11px;
675
+ line-height: 17px;
676
+ overflow-wrap: anywhere;
677
+ }
678
+
679
+ .drc-actions {
680
+ display: flex;
681
+ align-items: center;
682
+ flex-wrap: wrap;
683
+ gap: 8px;
684
+ padding: 8px 0;
685
+ }
686
+
687
+ .drc-actions-stack {
688
+ flex-direction: column;
689
+ align-items: flex-start;
690
+ }
691
+
692
+ .drc-qr {
693
+ display: flex;
694
+ align-items: center;
695
+ gap: 24px;
696
+ flex-wrap: wrap;
697
+ padding: 4px 0 12px;
698
+ }
699
+
700
+ .drc-qr-frame {
701
+ flex: 0 0 auto;
702
+ width: 176px;
703
+ height: 176px;
704
+ padding: 8px;
705
+ box-sizing: border-box;
706
+ display: grid;
707
+ place-items: center;
708
+ border-radius: var(--drc-radius);
709
+ background: #fff;
710
+ box-shadow: var(--dsw-elevation-soft, 0 8px 24px rgb(0 0 0 / 14%));
711
+ }
712
+
713
+ .drc-qr-frame img {
714
+ display: block;
715
+ width: 160px;
716
+ height: 160px;
717
+ image-rendering: pixelated;
718
+ }
719
+
720
+ .drc-qr-copy { flex: 1 1 280px; min-width: 220px; }
721
+
722
+ .drc-url {
723
+ display: block;
724
+ max-height: 62px;
725
+ margin-top: 12px;
726
+ padding: 8px 10px;
727
+ overflow: hidden;
728
+ border: 0.5px solid var(--drc-hairline);
729
+ border-radius: var(--drc-radius);
730
+ background: var(--drc-surface-3);
731
+ color: var(--drc-muted);
732
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
733
+ font-size: 11px;
734
+ line-height: 1.45;
735
+ white-space: pre-wrap;
736
+ word-break: break-all;
737
+ overflow-wrap: anywhere;
738
+ }
739
+
740
+ .drc-apps {
741
+ display: flex;
742
+ flex-wrap: wrap;
743
+ gap: 8px;
744
+ padding: 8px 0;
745
+ }
746
+
747
+ .drc-app {
748
+ display: inline-flex;
749
+ align-items: center;
750
+ gap: 6px;
751
+ height: 28px;
752
+ padding: 0 10px;
753
+ border: 0.5px solid var(--drc-hairline);
754
+ border-radius: 999px;
755
+ background: transparent;
756
+ color: var(--drc-muted);
757
+ font: inherit;
758
+ font-size: 12px;
759
+ line-height: 18px;
760
+ cursor: pointer;
761
+ }
762
+
763
+ .drc-app i {
764
+ width: 6px;
765
+ height: 6px;
766
+ border-radius: 50%;
767
+ background: currentColor;
768
+ opacity: 0.55;
769
+ }
770
+
771
+ .drc-app.is-on {
772
+ border-color: transparent;
773
+ background: color-mix(in srgb, var(--drc-accent) 10%, transparent);
774
+ color: var(--drc-text);
775
+ }
776
+
777
+ .drc-app.is-on i { background: var(--drc-accent); opacity: 1; }
778
+
779
+ .drc-map-row {
780
+ display: flex;
781
+ align-items: center;
782
+ justify-content: space-between;
783
+ gap: 12px;
784
+ padding: 8px 0;
785
+ }
786
+
787
+ .drc-map-main {
788
+ flex: 1;
789
+ min-width: 0;
790
+ display: flex;
791
+ flex-direction: column;
792
+ gap: 4px;
793
+ }
794
+
795
+ .drc-map-input {
796
+ width: 100%;
797
+ height: 34px;
798
+ padding: 0 12px;
799
+ box-sizing: border-box;
800
+ border: 0.5px solid var(--drc-hairline);
801
+ border-radius: var(--drc-radius);
802
+ outline: none;
803
+ background: var(--drc-surface-3);
804
+ color: var(--drc-text);
805
+ font: inherit;
806
+ font-size: 13px;
807
+ line-height: 20px;
808
+ }
809
+
810
+ .drc-map-input:focus { border-color: var(--dsw-alias-state-business-primary, var(--drc-accent)); }
811
+
812
+ .drc-map-key {
813
+ overflow: hidden;
814
+ white-space: nowrap;
815
+ text-overflow: ellipsis;
816
+ }
817
+
818
+ .drc-map-meta {
819
+ flex: 0 0 auto;
820
+ display: flex;
821
+ align-items: center;
822
+ gap: 8px;
823
+ }
824
+
825
+ .drc-tag {
826
+ display: inline-flex;
827
+ align-items: center;
828
+ padding: 1px 8px;
829
+ border-radius: 999px;
830
+ corner-shape: round;
831
+ background: var(--dsw-alias-bg-module-platform, var(--drc-surface-2));
832
+ color: var(--drc-muted);
833
+ font-size: 11px;
834
+ font-weight: 500;
835
+ line-height: 17px;
836
+ white-space: nowrap;
837
+ }
838
+
839
+ .drc-tag[data-tone='outline'] {
840
+ border: 0.5px solid var(--drc-hairline);
841
+ background: transparent;
842
+ color: var(--drc-tertiary);
843
+ }
844
+
845
+ .drc-tag[data-tone='success'] {
846
+ background: color-mix(in srgb, var(--drc-success) 10%, transparent);
847
+ color: var(--drc-success);
848
+ }
849
+
850
+ .drc-tag[data-tone='warning'] {
851
+ background: color-mix(in srgb, var(--dsw-alias-state-warn-primary, var(--drc-accent)) 12%, transparent);
852
+ color: var(--dsw-alias-state-warn-primary, var(--drc-accent));
853
+ }
854
+
855
+ .drc-tag[data-tone='danger'] {
856
+ background: color-mix(in srgb, var(--drc-error) 10%, transparent);
857
+ color: var(--drc-error);
858
+ }
859
+
860
+ .drc-order-row {
861
+ display: flex;
862
+ align-items: center;
863
+ gap: 8px;
864
+ padding: 8px 10px;
865
+ font-size: 13px;
866
+ line-height: 20px;
867
+ cursor: grab;
868
+ touch-action: none;
869
+ transition: opacity 150ms ease;
870
+ }
871
+
872
+ .drc-order-row.is-dragging {
873
+ position: absolute;
874
+ width: 0;
875
+ height: 0;
876
+ min-height: 0;
877
+ margin: 0;
878
+ padding: 0;
879
+ border: 0;
880
+ opacity: 0;
881
+ visibility: hidden;
882
+ overflow: hidden;
883
+ pointer-events: none;
884
+ transition: none;
885
+ }
886
+
887
+ .drc-order-row b {
888
+ width: 18px;
889
+ color: var(--drc-tertiary);
890
+ font-family: ui-monospace, monospace;
891
+ font-size: 11px;
892
+ font-weight: 500;
893
+ }
894
+
895
+ .drc-order-row .drc-order-label { flex: 1; min-width: 0; }
896
+
897
+ .drc-drag-handle {
898
+ color: var(--drc-tertiary);
899
+ font-size: 12px;
900
+ letter-spacing: -2px;
901
+ cursor: grab;
902
+ }
903
+
904
+ .drc-order-placeholder {
905
+ display: flex;
906
+ align-items: center;
907
+ gap: 8px;
908
+ height: 41px;
909
+ padding: 0 12px;
910
+ border: 1px dashed var(--drc-accent);
911
+ border-radius: var(--drc-radius);
912
+ background: color-mix(in srgb, var(--drc-accent) 9%, transparent);
913
+ pointer-events: none;
914
+ }
915
+
916
+ .drc-order-placeholder-title {
917
+ color: var(--drc-accent);
918
+ font-size: 13px;
919
+ font-weight: 500;
920
+ }
921
+
922
+ .drc-order-placeholder .drc-drag-handle {
923
+ color: var(--drc-accent);
924
+ cursor: grabbing;
925
+ }
926
+
927
+ body.drc-sorting,
928
+ body.drc-sorting * {
929
+ user-select: none !important;
930
+ cursor: grabbing !important;
931
+ }
932
+
933
+ .drc-order-end { height: 8px; }
934
+
935
+ .drc-status-row {
936
+ display: flex;
937
+ align-items: center;
938
+ justify-content: space-between;
939
+ gap: 16px;
940
+ padding: 8px 0;
941
+ }
942
+
943
+ .drc-status-main {
944
+ flex: 1;
945
+ min-width: 0;
946
+ display: flex;
947
+ flex-direction: column;
948
+ gap: 2px;
949
+ }
950
+
951
+ .drc-status-label {
952
+ font-size: 13px;
953
+ line-height: 20px;
954
+ }
955
+
956
+ .drc-status-detail {
957
+ color: var(--drc-tertiary);
958
+ font-size: 11px;
959
+ line-height: 17px;
960
+ overflow-wrap: anywhere;
961
+ }
962
+
963
+ .drc-status {
964
+ flex: 0 0 auto;
965
+ display: inline-flex;
966
+ align-items: center;
967
+ gap: 8px;
968
+ color: var(--drc-muted);
969
+ font-size: 12px;
970
+ line-height: 18px;
971
+ }
972
+
973
+ .drc-dot {
974
+ position: relative;
975
+ display: inline-block;
976
+ flex: 0 0 auto;
977
+ width: 10px;
978
+ height: 10px;
979
+ color: var(--dsw-alias-state-idle-primary);
980
+ }
981
+
982
+ .drc-dot::after {
983
+ content: '';
984
+ position: absolute;
985
+ inset: 20%;
986
+ border-radius: 50%;
987
+ background: currentColor;
988
+ }
989
+
990
+ .drc-dot.ok { color: var(--drc-success); }
991
+ .drc-dot.bad { color: var(--drc-error); }
992
+
993
+ .drc-client {
994
+ display: flex;
995
+ align-items: center;
996
+ justify-content: space-between;
997
+ gap: 12px;
998
+ padding: 8px 0;
999
+ }
1000
+
1001
+ .drc-client-main {
1002
+ min-width: 0;
1003
+ display: flex;
1004
+ flex-direction: column;
1005
+ gap: 2px;
1006
+ }
1007
+
1008
+ .drc-client strong {
1009
+ display: block;
1010
+ font-size: 13px;
1011
+ font-weight: 500;
1012
+ line-height: 20px;
1013
+ }
1014
+
1015
+ .drc-client small {
1016
+ display: block;
1017
+ color: var(--drc-tertiary);
1018
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1019
+ font-size: 11px;
1020
+ line-height: 17px;
1021
+ }
1022
+
1023
+ .drc-banner {
1024
+ margin: 0 0 12px;
1025
+ padding: 8px 12px;
1026
+ border-radius: var(--drc-radius);
1027
+ background: var(--drc-surface-2);
1028
+ font-size: 12px;
1029
+ line-height: 18px;
1030
+ }
1031
+
1032
+ .drc-banner.is-error {
1033
+ background: color-mix(in srgb, var(--drc-error) 10%, transparent);
1034
+ color: var(--drc-error);
1035
+ }
1036
+
1037
+ .drc-banner.is-ok {
1038
+ background: color-mix(in srgb, var(--drc-success) 10%, transparent);
1039
+ color: var(--drc-success);
1040
+ }
1041
+
1042
+ .drc-fact-columns {
1043
+ display: grid;
1044
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1045
+ gap: 0 32px;
1046
+ padding: 2px 0 0;
1047
+ }
1048
+
1049
+ .drc-fact-column { min-width: 0; }
1050
+
1051
+ .drc-fact-row {
1052
+ position: relative;
1053
+ display: flex;
1054
+ align-items: baseline;
1055
+ justify-content: space-between;
1056
+ gap: 16px;
1057
+ padding: 8px 0;
1058
+ min-width: 0;
1059
+ }
1060
+
1061
+ .drc-fact-row + .drc-fact-row::before,
1062
+ .drc-fact-columns + .drc-fact-row::before {
1063
+ content: '';
1064
+ position: absolute;
1065
+ top: 0;
1066
+ right: 12px;
1067
+ left: 12px;
1068
+ height: 0.5px;
1069
+ background: var(--drc-border);
1070
+ }
1071
+
1072
+ .drc-fact-key {
1073
+ flex: 0 0 auto;
1074
+ color: var(--drc-tertiary);
1075
+ font-size: 11px;
1076
+ line-height: 17px;
1077
+ }
1078
+
1079
+ .drc-fact-value {
1080
+ min-width: 0;
1081
+ color: var(--drc-muted);
1082
+ font-size: 11px;
1083
+ line-height: 17px;
1084
+ text-align: right;
1085
+ overflow-wrap: anywhere;
1086
+ }
1087
+
1088
+ .drc-backends {
1089
+ display: flex;
1090
+ flex-wrap: wrap;
1091
+ gap: 6px;
1092
+ padding: 4px 0 8px;
1093
+ }
1094
+
1095
+ .drc-empty {
1096
+ margin: 0;
1097
+ padding: 12px 0;
1098
+ color: var(--drc-tertiary);
1099
+ font-size: 12px;
1100
+ line-height: 18px;
1101
+ }
1102
+
1103
+ @media (max-width: 767px) {
1104
+ .drc-shell {
1105
+ grid-template-columns: minmax(0, 1fr) auto;
1106
+ grid-template-rows: auto auto minmax(0, 1fr);
1107
+ grid-template-areas:
1108
+ 'title head'
1109
+ 'nav nav'
1110
+ 'main main';
1111
+ }
1112
+
1113
+ .drc-nav-title { padding: 22px 0 0 16px; }
1114
+ .drc-head { height: auto; padding: 20px 16px 8px 10px; }
1115
+ .drc-nav { padding: 0; }
1116
+ .drc-nav-compact { padding: 0 16px 12px; }
1117
+ .drc-main { padding: 0 16px 24px; }
1118
+ }
1119
+ `;