@velor/remote-mouse 6.4.8

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 (316) hide show
  1. package/.artifacts/screenshots/remote-mobile-config.png +0 -0
  2. package/.artifacts/screenshots/remote-mobile-home.png +0 -0
  3. package/.artifacts/screenshots/remote-mobile-preferences.png +0 -0
  4. package/.artifacts/screenshots/remote-mobile-server-info.png +0 -0
  5. package/.artifacts/screenshots/remote-mobile-vlc.png +0 -0
  6. package/.env.example +93 -0
  7. package/README.md +370 -0
  8. package/bin/remote-mouse.js +19 -0
  9. package/client/core/dom.js +148 -0
  10. package/client/core/init-socket-io.js +117 -0
  11. package/client/core/socket-emit.js +6 -0
  12. package/client/core/window-events.js +23 -0
  13. package/client/i18n/apply-page-translations.js +18 -0
  14. package/client/i18n/constants.js +3 -0
  15. package/client/i18n/core.js +40 -0
  16. package/client/i18n/locale-registry.js +77 -0
  17. package/client/i18n/locales/de.js +227 -0
  18. package/client/i18n/locales/en.js +389 -0
  19. package/client/i18n/locales/es.js +228 -0
  20. package/client/i18n/locales/fr.js +389 -0
  21. package/client/i18n/locales/it.js +227 -0
  22. package/client/i18n/locales/ja.js +227 -0
  23. package/client/i18n/locales/pt.js +227 -0
  24. package/client/i18n/locales/ru.js +240 -0
  25. package/client/i18n/locales/zh.js +227 -0
  26. package/client/preferences/constants.js +15 -0
  27. package/client/preferences/effects.js +24 -0
  28. package/client/preferences/load.js +19 -0
  29. package/client/preferences/render.js +26 -0
  30. package/client/preferences/rows.js +78 -0
  31. package/client/preferences/state.js +29 -0
  32. package/client/preview/create-preview-frame-receiver.js +13 -0
  33. package/client/preview/draw.js +77 -0
  34. package/client/preview/parse-preview-frame.js +39 -0
  35. package/client/preview/preview-stream.js +152 -0
  36. package/client/services/app-state/appStateKeys.js +30 -0
  37. package/client/services/app-state/createAppStateService.js +216 -0
  38. package/client/services/app-state/createPersistStoreService.js +122 -0
  39. package/client/services/app-state/createStateStoreService.js +64 -0
  40. package/client/services/app-state/localStorageBinding.js +26 -0
  41. package/client/services/app-state/normalizers.js +74 -0
  42. package/client/services/app-state/resolveEffectiveStateValue.js +58 -0
  43. package/client/services/app-state/stateDefinitions.js +107 -0
  44. package/client/services/backend/createBackendService.js +55 -0
  45. package/client/services/config/ConfigView.js +45 -0
  46. package/client/services/config/createClientConfigService.js +122 -0
  47. package/client/services/config/defaultClientConfig.js +22 -0
  48. package/client/services/createServicesContainer.js +48 -0
  49. package/client/services/createServicesRegistry.js +26 -0
  50. package/client/services/i18n/createI18nService.js +86 -0
  51. package/client/services/notifications/createNotificationService.js +56 -0
  52. package/client/services/pubsub/createPubSubService.js +20 -0
  53. package/client/services/remotes/createRemotesService.js +20 -0
  54. package/client/services/transport/createSocketIoTransportService.js +50 -0
  55. package/client/touch/bindTouchPassthrough.js +94 -0
  56. package/client/touch/createTouchList.js +18 -0
  57. package/client/touch/dispatchSyntheticTouch.js +20 -0
  58. package/client/touch/gesture-zone.js +28 -0
  59. package/client/touch/throttle.js +46 -0
  60. package/client/touch/touch-handlers.js +193 -0
  61. package/client/touch/touchpad.js +231 -0
  62. package/client/ui/config/page.js +840 -0
  63. package/client/ui/main/applyRemoteVisibilityState.js +60 -0
  64. package/client/ui/main/bind-client-notifications.js +3 -0
  65. package/client/ui/main/bindings/bindAccordion.js +121 -0
  66. package/client/ui/main/bindings/bindActionButtons.js +13 -0
  67. package/client/ui/main/bindings/bindAdminDrawer.js +137 -0
  68. package/client/ui/main/bindings/bindAdminRemoteButtons.js +77 -0
  69. package/client/ui/main/bindings/bindAdminVersion.js +27 -0
  70. package/client/ui/main/bindings/bindBrowserRemoteButtons.js +119 -0
  71. package/client/ui/main/bindings/bindRemoteAccordion.js +23 -0
  72. package/client/ui/main/bindings/bindSamsungRemoteButtons.js +320 -0
  73. package/client/ui/main/bindings/bindSystemRemoteButtons.js +41 -0
  74. package/client/ui/main/bindings/bindVlcRemoteButtons.js +64 -0
  75. package/client/ui/main/canvas-ui.js +33 -0
  76. package/client/ui/main/connection-overlay.js +57 -0
  77. package/client/ui/main/init-ui.js +54 -0
  78. package/client/ui/main/keyboard-panel.js +271 -0
  79. package/client/ui/main/mouse-buttons.js +94 -0
  80. package/client/ui/main/page.js +21 -0
  81. package/client/ui/notifications/show-toast.js +48 -0
  82. package/client/ui/preferences/bindPreferenceSwitchers.js +49 -0
  83. package/client/ui/preferences/page.js +61 -0
  84. package/client/ui/preferences/switchers.js +200 -0
  85. package/index.js +9 -0
  86. package/package.json +41 -0
  87. package/public/admin-config.css +447 -0
  88. package/public/admin-config.html +63 -0
  89. package/public/apple-touch-icon.png +0 -0
  90. package/public/brave-icon.svg +13 -0
  91. package/public/favicon.svg +30 -0
  92. package/public/icon-192.png +0 -0
  93. package/public/icon-512.png +0 -0
  94. package/public/index.html +246 -0
  95. package/public/manifest.webmanifest +45 -0
  96. package/public/preferences.html +55 -0
  97. package/public/server-info.html +574 -0
  98. package/public/styles.css +1042 -0
  99. package/public/sw.js +103 -0
  100. package/scripts/codex-commit.sh +112 -0
  101. package/scripts/generate-mobile-screenshots.mjs +244 -0
  102. package/scripts/install-linux.sh +633 -0
  103. package/scripts/install-windows.ps1 +369 -0
  104. package/server/application/createApplicationLifecycle.js +15 -0
  105. package/server/application/logger.js +216 -0
  106. package/server/application/shutdown.js +81 -0
  107. package/server/application/start.js +95 -0
  108. package/server/application/state.js +19 -0
  109. package/server/connection/api/admin-actions.router.js +65 -0
  110. package/server/connection/api/admin-configs.router.js +165 -0
  111. package/server/connection/api/admin-remotes.router.js +61 -0
  112. package/server/connection/api/admin-subs.router.js +49 -0
  113. package/server/connection/api/client.router.js +15 -0
  114. package/server/connection/api/configs.js +96 -0
  115. package/server/connection/api/qr-page.handler.js +17 -0
  116. package/server/connection/api/remotes.router.js +30 -0
  117. package/server/connection/api/server-info.router.js +149 -0
  118. package/server/connection/api/session.middleware.js +93 -0
  119. package/server/connection/api/unauthorized-response.js +73 -0
  120. package/server/connection/socket/createConnectionRegistrar.js +23 -0
  121. package/server/connection/socket/createSocketSessionAuthMiddleware.js +49 -0
  122. package/server/connection/socket/socket-action-responder.js +12 -0
  123. package/server/connection/socket/socket.timestamp-middleware.js +51 -0
  124. package/server/index.js +12 -0
  125. package/server/init/bootstrapApi.js +87 -0
  126. package/server/init/bootstrapSocket.js +79 -0
  127. package/server/init/createAdminApiRouter.js +22 -0
  128. package/server/init/createAdminUiRouter.js +21 -0
  129. package/server/init/createSocketActionRegistrars.js +52 -0
  130. package/server/init/observers/startConfigObserver.js +51 -0
  131. package/server/init/observers/startDisplaySizeObserver.js +55 -0
  132. package/server/init/observers/startNotificationObserver.js +49 -0
  133. package/server/init/observers/startQrOverlayHoverObserver.js +89 -0
  134. package/server/init/observers/startQrOverlayRefreshObserver.js +53 -0
  135. package/server/os/darwin/app.js +45 -0
  136. package/server/os/darwin/applescript.js +51 -0
  137. package/server/os/darwin/cliSocket.js +53 -0
  138. package/server/os/darwin/url.js +9 -0
  139. package/server/os/darwin/window.js +10 -0
  140. package/server/os/linux/app.js +120 -0
  141. package/server/os/linux/cliSocket.js +53 -0
  142. package/server/os/linux/process.js +69 -0
  143. package/server/os/linux/screen.js +58 -0
  144. package/server/os/linux/systemd.js +139 -0
  145. package/server/os/linux/url.js +17 -0
  146. package/server/os/linux/windows.js +144 -0
  147. package/server/os/win32/app.js +66 -0
  148. package/server/os/win32/cliSocket.js +15 -0
  149. package/server/os/win32/powershell.js +70 -0
  150. package/server/os/win32/process.js +20 -0
  151. package/server/os/win32/service.js +95 -0
  152. package/server/os/win32/url.js +9 -0
  153. package/server/os/win32/window.js +10 -0
  154. package/server/remotes/admin/createAdminEventGuardMiddleware.js +29 -0
  155. package/server/remotes/admin/createForceUpdateCheckAction.js +39 -0
  156. package/server/remotes/admin/createInstallUpdateAction.js +64 -0
  157. package/server/remotes/admin/createOpenQrBrowserAction.js +63 -0
  158. package/server/remotes/admin/createOpenServerInfoBrowserAction.js +58 -0
  159. package/server/remotes/admin/createRestartServiceAction.js +20 -0
  160. package/server/remotes/admin/createRotateEntryTokenAction.js +43 -0
  161. package/server/remotes/admin/createToggleQrOverlayAction.js +38 -0
  162. package/server/remotes/admin/index.js +32 -0
  163. package/server/remotes/admin/notifyIfRestarted.js +102 -0
  164. package/server/remotes/admin/registrar.js +94 -0
  165. package/server/remotes/browser/actions/createFocusOrLaunchBrowserAction.js +22 -0
  166. package/server/remotes/browser/actions/openUrlOnHost.js +3 -0
  167. package/server/remotes/browser/browserCatalog.js +70 -0
  168. package/server/remotes/browser/index.js +15 -0
  169. package/server/remotes/browser/listBrowsersOnHost.js +23 -0
  170. package/server/remotes/browser/registrar.js +29 -0
  171. package/server/remotes/browser/spec.js +18 -0
  172. package/server/remotes/browser/state.js +5 -0
  173. package/server/remotes/input/registrar.js +39 -0
  174. package/server/remotes/preview/bgraToRgbaBuffer.js +20 -0
  175. package/server/remotes/preview/captureAroundCursor.js +19 -0
  176. package/server/remotes/preview/createPreviewStreamer.js +85 -0
  177. package/server/remotes/preview/registrar.js +34 -0
  178. package/server/remotes/samsung/createSamsungCommandService.js +203 -0
  179. package/server/remotes/samsung/createSamsungRemote.js +26 -0
  180. package/server/remotes/samsung/createSamsungRemoteGetter.js +46 -0
  181. package/server/remotes/samsung/createSamsungTvGetter.js +102 -0
  182. package/server/remotes/samsung/device-config.js +122 -0
  183. package/server/remotes/samsung/registrar.js +59 -0
  184. package/server/remotes/samsung/utils.js +56 -0
  185. package/server/remotes/vlc/index.js +39 -0
  186. package/server/remotes/vlc/registrar.js +94 -0
  187. package/server/remotes/vlc/spec.js +15 -0
  188. package/server/remotes/vlc/state.js +5 -0
  189. package/server/remotes/window/index.js +6 -0
  190. package/server/remotes/window/registrar.js +28 -0
  191. package/server/services/application/createApplicationDaemonService.js +144 -0
  192. package/server/services/application/getDaemonServiceAdapter.js +56 -0
  193. package/server/services/application/utils.js +29 -0
  194. package/server/services/config/bootstrapConfig.js +38 -0
  195. package/server/services/config/configPaths.js +42 -0
  196. package/server/services/config/configSchema.js +297 -0
  197. package/server/services/config/configService.js +89 -0
  198. package/server/services/config/defaultConfig.js +137 -0
  199. package/server/services/config/envConfig.js +49 -0
  200. package/server/services/config/index.js +9 -0
  201. package/server/services/config/logConfig.js +54 -0
  202. package/server/services/config/system-config.js +44 -0
  203. package/server/services/createServicesContainer.js +94 -0
  204. package/server/services/createServicesRegistry.js +48 -0
  205. package/server/services/input/createInputController.js +17 -0
  206. package/server/services/input/createKeyboardController.js +146 -0
  207. package/server/services/input/createMouseController.js +182 -0
  208. package/server/services/notifier/createClientNotifier.js +23 -0
  209. package/server/services/notifier/createHostNotifier.js +41 -0
  210. package/server/services/notifier/createNotifier.js +13 -0
  211. package/server/services/notifier/createNotifierComposite.js +122 -0
  212. package/server/services/notifier/handleOpenQrBrowserEvent.js +40 -0
  213. package/server/services/notifier/handleOpenServerInfoBrowserEvent.js +40 -0
  214. package/server/services/notifier/handleRestartServiceEvent.js +37 -0
  215. package/server/services/notifier/handleRotateEntryTokenEvent.js +42 -0
  216. package/server/services/notifier/handleSessionEvent.js +24 -0
  217. package/server/services/notifier/handleToggleQrOverlayEvent.js +21 -0
  218. package/server/services/notifier/host-notifier/createLinuxHostNotifier.js +23 -0
  219. package/server/services/notifier/host-notifier/createNodeNotifierHostNotifier.js +24 -0
  220. package/server/services/notifier/host-notifier/index.js +11 -0
  221. package/server/services/notifier/mapper/handleForceUpdateCheckEvent.js +24 -0
  222. package/server/services/notifier/mapper/handleInstallUpdateEvent.js +53 -0
  223. package/server/services/notifier/mapper/handleSocketEvent.js +40 -0
  224. package/server/services/notifier/mapper/handleUpdateManagerEvent.js +24 -0
  225. package/server/services/notifier/mapper/notify.js +7 -0
  226. package/server/services/os/index.js +23 -0
  227. package/server/services/os/platforms/createFallbackAdapter.js +31 -0
  228. package/server/services/os/platforms/darwin/app.js +6 -0
  229. package/server/services/os/platforms/darwin/index.js +21 -0
  230. package/server/services/os/platforms/darwin/scripts.js +4 -0
  231. package/server/services/os/platforms/darwin/url.js +1 -0
  232. package/server/services/os/platforms/darwin/window.js +4 -0
  233. package/server/services/os/platforms/linux/app.js +6 -0
  234. package/server/services/os/platforms/linux/index.js +33 -0
  235. package/server/services/os/platforms/linux/url.js +1 -0
  236. package/server/services/os/platforms/linux/windows.js +11 -0
  237. package/server/services/os/platforms/win32/app.js +6 -0
  238. package/server/services/os/platforms/win32/index.js +21 -0
  239. package/server/services/os/platforms/win32/overlay.js +6 -0
  240. package/server/services/os/platforms/win32/powershell.js +4 -0
  241. package/server/services/os/platforms/win32/url.js +1 -0
  242. package/server/services/os/platforms/win32/window.js +4 -0
  243. package/server/services/os/shared.js +2 -0
  244. package/server/services/overlay/createNoopOverlay.js +13 -0
  245. package/server/services/overlay/createQrOverlay.js +27 -0
  246. package/server/services/overlay/createQrOverlayWin32.js +158 -0
  247. package/server/services/overlay/createQrOverlayYad.js +178 -0
  248. package/server/services/overlay/renderQrPage.js +82 -0
  249. package/server/services/persistence/createConfigDao.js +106 -0
  250. package/server/services/persistence/createDatabaseProvider.js +23 -0
  251. package/server/services/persistence/createEntryTokenDao.js +140 -0
  252. package/server/services/persistence/createRestartLogDao.js +210 -0
  253. package/server/services/persistence/index.js +19 -0
  254. package/server/services/pubsub/createEventStore.js +54 -0
  255. package/server/services/pubsub/createPubSub.js +89 -0
  256. package/server/services/pubsub/createServiceEvents.js +29 -0
  257. package/server/services/pubsub/serviceEventConstants.js +39 -0
  258. package/server/services/remotes/createRemotes.js +25 -0
  259. package/server/services/server/createHttpsServer.js +12 -0
  260. package/server/services/server/createServer.js +66 -0
  261. package/server/services/sse/createSseService.js +96 -0
  262. package/server/services/sse/utils.js +7 -0
  263. package/server/services/system/createSystemService.js +170 -0
  264. package/server/services/system/getNetworkInfo.js +18 -0
  265. package/server/services/system/getScreenInfo.js +32 -0
  266. package/server/services/system/listNetworkInterfaces.js +27 -0
  267. package/server/services/task-manager/createTaskManager.js +68 -0
  268. package/server/services/task-runner/createTaskRunner.js +114 -0
  269. package/server/services/token-manager/createTokenManager.js +244 -0
  270. package/server/services/token-manager/token-format.js +7 -0
  271. package/server/services/token-manager/token-store-utils.js +8 -0
  272. package/server/services/update-manager/CommandUpdateSource.js +70 -0
  273. package/server/services/update-manager/NpmUpdateSource.js +34 -0
  274. package/server/services/update-manager/buildNpmGlobalUpdateCommand.js +15 -0
  275. package/server/services/update-manager/chooseUpdateCheckSource.js +20 -0
  276. package/server/services/update-manager/chooseUpdateInstallSource.js +5 -0
  277. package/server/services/update-manager/createUpdateManager.js +109 -0
  278. package/server/services/update-manager/resolveInstallUpdateCommand.js +42 -0
  279. package/server/term/cli/executeLocalServiceCommand.js +42 -0
  280. package/server/term/cli/getCliSocketPath.js +5 -0
  281. package/server/term/cli/parseCliArgs.js +110 -0
  282. package/server/term/cli/printCliResult.js +18 -0
  283. package/server/term/cli/runCliCmd.js +50 -0
  284. package/server/term/cli/sendCliCommand.js +76 -0
  285. package/server/term/cliSocket.js +29 -0
  286. package/server/term/srv/commands/configCommand.js +84 -0
  287. package/server/term/srv/commands/helpCommand.js +6 -0
  288. package/server/term/srv/commands/infoCommand.js +7 -0
  289. package/server/term/srv/commands/openQrCommand.js +7 -0
  290. package/server/term/srv/commands/samsungDetectCommand.js +52 -0
  291. package/server/term/srv/commands/serviceCommand.js +25 -0
  292. package/server/term/srv/commands/systemConfigCommand.js +7 -0
  293. package/server/term/srv/commands/tasksCommand.js +24 -0
  294. package/server/term/srv/commands/tokensCommand.js +15 -0
  295. package/server/term/srv/executeCliCommand.js +44 -0
  296. package/server/term/srv/executeCliRequest.js +38 -0
  297. package/server/term/srv/startCliServer.js +140 -0
  298. package/server/utils/createRandomToken.js +11 -0
  299. package/server/utils/env.js +155 -0
  300. package/server/utils/git.js +13 -0
  301. package/server/utils/http.js +7 -0
  302. package/server/utils/network.js +45 -0
  303. package/server/utils/paths.js +10 -0
  304. package/server/utils/process.js +57 -0
  305. package/server/utils/robot.js +11 -0
  306. package/server/utils/semver.js +33 -0
  307. package/server/utils/truncateText.js +7 -0
  308. package/utils/createLazy.js +13 -0
  309. package/utils/functional.js +48 -0
  310. package/utils/math.js +26 -0
  311. package/utils/notificationSettings.js +61 -0
  312. package/utils/object.utils.js +79 -0
  313. package/utils/predicates.js +17 -0
  314. package/utils/remoteCommands.js +40 -0
  315. package/utils/sync.js +3 -0
  316. package/velor-remote-mouse-6.4.8.tgz +0 -0
@@ -0,0 +1,63 @@
1
+ <!doctype html>
2
+ <html data-i18n-page-title="adminConfig.pageTitle">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
6
+ <title>Remote Mouse Config</title>
7
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
+ <link rel="stylesheet" href="/admin-config.css?v=20260330a" />
9
+ </head>
10
+ <body>
11
+ <main class="config-page">
12
+ <header class="config-hero">
13
+ <div>
14
+ <p class="eyebrow" data-i18n="adminConfig.eyebrow">Administration</p>
15
+ <h1 data-i18n="adminConfig.title">Configuration persistante</h1>
16
+ <p class="hero-copy" data-i18n="adminConfig.copy">Les champs ci-dessous sont stockes en base de donnees et regroupes selon la structure de l'objet de configuration.</p>
17
+ </div>
18
+ <div class="hero-actions">
19
+ <a class="secondary-link" href="/" data-i18n="adminConfig.back">Retour remote</a>
20
+ <button id="reload-config" type="button" data-i18n="adminConfig.reload">Recharger</button>
21
+ <button id="restart-service" type="button" data-i18n="adminConfig.restart">Redemarrer le service</button>
22
+ </div>
23
+ </header>
24
+
25
+ <section class="status-bar" aria-live="polite">
26
+ <p id="config-status" data-i18n="adminConfig.loading">Chargement de la configuration...</p>
27
+ </section>
28
+
29
+ <form id="config-form" class="config-grid"></form>
30
+ </main>
31
+
32
+ <template id="section-template">
33
+ <section class="config-section">
34
+ <div class="section-header">
35
+ <div class="section-heading">
36
+ <div class="section-heading-copy">
37
+ <p class="section-key"></p>
38
+ <h2></h2>
39
+ <p class="section-description"></p>
40
+ </div>
41
+ <button class="section-toggle" type="button" aria-expanded="false" data-i18n="adminConfig.showSection" data-i18n-aria-label="adminConfig.showSectionLabel" data-i18n-title="adminConfig.showSectionLabel">Afficher</button>
42
+ </div>
43
+ </div>
44
+ <div class="section-fields"></div>
45
+ </section>
46
+ </template>
47
+
48
+ <template id="field-template">
49
+ <div class="field-card">
50
+ <span class="field-header">
51
+ <span class="field-label"></span>
52
+ <span class="field-path"></span>
53
+ </span>
54
+ <span class="field-body">
55
+ <span class="field-control"></span>
56
+ <button class="field-reset" type="button" data-i18n="adminConfig.defaultButton">Defaut</button>
57
+ </span>
58
+ </div>
59
+ </template>
60
+
61
+ <script type="module" src="/client/ui/config/page.js?v=20260330a"></script>
62
+ </body>
63
+ </html>
Binary file
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Brave">
2
+ <defs>
3
+ <linearGradient id="g" x1="0" x2="1" y1="0" y2="1">
4
+ <stop offset="0" stop-color="#ff7a1a"/>
5
+ <stop offset="1" stop-color="#ff4f1a"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <path fill="url(#g)" d="M32 4l10 4 8-1 5 8-2 9 3 8-6 8-8 16H22L14 40 8 32l3-8-2-9 5-8 8 1z"/>
9
+ <path fill="#fff" d="M19 29l5-9h16l5 9-2 11-6 7H27l-6-7z"/>
10
+ <path fill="#ff5a1f" d="M26 27l3 4h6l3-4-1 7-4 4h-2l-4-4z"/>
11
+ <circle cx="26" cy="26" r="1.5" fill="#ff5a1f"/>
12
+ <circle cx="38" cy="26" r="1.5" fill="#ff5a1f"/>
13
+ </svg>
@@ -0,0 +1,30 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Remote Mouse">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#1b2a35"/>
5
+ <stop offset="1" stop-color="#0c151d"/>
6
+ </linearGradient>
7
+ <linearGradient id="remote" x1="0" y1="0" x2="0" y2="1">
8
+ <stop offset="0" stop-color="#78e6ff"/>
9
+ <stop offset="0.48" stop-color="#47bbff"/>
10
+ <stop offset="1" stop-color="#227bff"/>
11
+ </linearGradient>
12
+ <linearGradient id="shine" x1="0" y1="0" x2="1" y2="1">
13
+ <stop offset="0" stop-color="#ffffff" stop-opacity="0.45"/>
14
+ <stop offset="1" stop-color="#ffffff" stop-opacity="0"/>
15
+ </linearGradient>
16
+ <filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
17
+ <feDropShadow dx="0" dy="2" stdDeviation="2.4" flood-color="#000000" flood-opacity="0.28"/>
18
+ </filter>
19
+ </defs>
20
+ <rect x="2" y="2" width="60" height="60" rx="17" fill="url(#bg)"/>
21
+ <g filter="url(#shadow)">
22
+ <rect x="12" y="8" width="40" height="48" rx="15" fill="url(#remote)"/>
23
+ <path d="M16 12c6-3 26-3 32 0v10c-4-5-10-7-16-7s-12 2-16 7z" fill="url(#shine)" opacity="0.55"/>
24
+ <rect x="30.7" y="11" width="2.6" height="42" rx="1.3" fill="#dff7ff" opacity="0.96"/>
25
+ <circle cx="24.5" cy="26" r="3.2" fill="#eefcff"/>
26
+ <circle cx="39.5" cy="26" r="3.2" fill="#eefcff"/>
27
+ <path d="M19 45c3.7-2.5 8-3.7 13-3.7S41.3 42.5 45 45" stroke="#eefcff" stroke-width="2.8" fill="none" stroke-linecap="round"/>
28
+ <path d="M17.5 44.8c4.4-5 24.6-5 29 0" stroke="#7fdcff" stroke-opacity="0.36" stroke-width="1.2" fill="none" stroke-linecap="round"/>
29
+ </g>
30
+ </svg>
Binary file
Binary file
@@ -0,0 +1,246 @@
1
+ <!doctype html>
2
+ <html data-i18n-page-title="main.pageTitle">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover" />
6
+ <title>Remote Mouse</title>
7
+ <meta name="theme-color" content="#101417" />
8
+ <meta name="mobile-web-app-capable" content="yes" />
9
+ <meta name="apple-mobile-web-app-capable" content="yes" />
10
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
11
+ <meta name="apple-mobile-web-app-title" content="Remote Mouse" />
12
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
13
+ <link rel="icon" type="image/png" sizes="192x192" href="/icon-192.png" />
14
+ <link rel="icon" type="image/png" sizes="512x512" href="/icon-512.png" />
15
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
16
+ <link rel="manifest" href="/manifest.webmanifest" />
17
+ <link rel="stylesheet" href="./styles.css?v=20260404a" />
18
+ </head>
19
+ <body>
20
+ <main id="app">
21
+ <section id="workspace" data-i18n-aria-label="main.workspaceAria">
22
+ <aside id="left-menu" data-i18n-aria-label="main.serverActionsAria">
23
+ <div class="admin-group admin-group-updates" data-i18n-aria-label="main.updatesAria">
24
+ <button id="btn-force-update-check" type="button" data-i18n="main.updateCheckButton" data-i18n-title="main.updateCheckButtonTitle" data-i18n-aria-label="main.updateCheckButtonTitle">Verifier MAJ</button>
25
+ <button id="btn-install-update" type="button" data-i18n="main.installUpdateButton" data-i18n-title="main.installUpdateButtonTitle" data-i18n-aria-label="main.installUpdateButtonTitle">Installer MAJ</button>
26
+ <button id="btn-restart-service" type="button" data-i18n="main.restartServiceButton" data-i18n-title="main.restartServiceButtonTitle" data-i18n-aria-label="main.restartServiceButtonTitle">Redemarrer service</button>
27
+ </div>
28
+ <hr class="admin-separator" aria-hidden="true" />
29
+ <div class="admin-group admin-group-display" data-i18n-aria-label="main.displayInfoAria">
30
+ <div class="admin-split-row">
31
+ <button id="btn-open-qr-browser-server" type="button" data-i18n="main.openQrServer" data-i18n-title="main.openQrServerTitle" data-i18n-aria-label="main.openQrServerTitle">QR serveur</button>
32
+ <button id="btn-open-qr-browser-client" type="button" data-i18n="main.openQrClient" data-i18n-title="main.openQrClientTitle" data-i18n-aria-label="main.openQrClientTitle">QR client</button>
33
+ </div>
34
+ <div class="admin-split-row">
35
+ <button id="btn-open-server-info-browser-server" type="button" data-i18n="main.openServerInfoServer" data-i18n-title="main.openServerInfoServerTitle" data-i18n-aria-label="main.openServerInfoServerTitle">Info serveur</button>
36
+ <button id="btn-open-server-info-browser-client" type="button" data-i18n="main.openServerInfoClient" data-i18n-title="main.openServerInfoClientTitle" data-i18n-aria-label="main.openServerInfoClientTitle">Info client</button>
37
+ </div>
38
+ <button id="btn-open-config-page" type="button" data-i18n="main.openConfig" data-i18n-title="main.openConfigTitle" data-i18n-aria-label="main.openConfigTitle">Configuration</button>
39
+ </div>
40
+ <hr class="admin-separator" aria-hidden="true" />
41
+ <div class="admin-group admin-group-access" data-i18n-aria-label="main.accessAria">
42
+ <button id="btn-toggle-qr-overlay" type="button" data-i18n="main.toggleQrOverlay" data-i18n-title="main.toggleQrOverlayTitle" data-i18n-aria-label="main.toggleQrOverlayTitle">Afficher QR</button>
43
+ <button id="btn-rotate-entry-token" type="button" data-i18n="main.rotateEntryToken" data-i18n-title="main.rotateEntryTokenTitle" data-i18n-aria-label="main.rotateEntryTokenTitle">Changer le jeton d'entree</button>
44
+ </div>
45
+ <hr class="admin-separator" aria-hidden="true" />
46
+ <button id="btn-open-preferences-page" type="button" data-i18n="main.openPreferences" data-i18n-title="main.openPreferencesTitle" data-i18n-aria-label="main.openPreferencesTitle">Preferences</button>
47
+ <div class="admin-drawer-footer">
48
+ <p id="admin-actions-disabled-message" class="admin-drawer-message hidden" data-i18n="main.adminActionsDisabledMessage">Les actions admin sont desactivees sur ce serveur.</p>
49
+ <div class="admin-version-row">
50
+ <img class="admin-version-icon" src="/icon-192.png" alt="" aria-hidden="true" width="18" height="18" />
51
+ <p id="admin-app-version" data-i18n-aria-label="common.version" data-i18n="main.adminAppVersion">Version: --</p>
52
+ </div>
53
+ </div>
54
+ </aside>
55
+
56
+ <section id="touch-area">
57
+ <div id="admin-drawer-scrim" aria-hidden="true"></div>
58
+ <img id="client-watermark" src="/icon-192.png" alt="" aria-hidden="true" width="34" height="34" />
59
+ <div id="touch-chrome">
60
+ <div id="remote-stack">
61
+ <section id="browser-shortcuts" class="remote-panel remote-panel-collapsible" data-i18n-aria-label="main.browserShortcutsAria">
62
+ <button class="remote-panel-toggle" type="button" aria-expanded="true">
63
+ <span class="remote-panel-title" data-i18n="main.browserShortcutsLabel">Navigateur</span>
64
+ <span class="remote-panel-chevron" aria-hidden="true"></span>
65
+ </button>
66
+ <div class="remote-panel-content">
67
+ <div class="remote-panel-content-inner">
68
+ <div class="browser-actions">
69
+ <div id="browser-launchers" class="remote-grid-row remote-browser-launchers"></div>
70
+ <div class="remote-grid-row">
71
+ <button id="btn-close-tab" type="button" data-i18n-aria-label="main.closeTab" data-i18n-title="main.shortcut.closeTab">✕</button>
72
+ <button id="btn-new-tab" type="button" data-i18n-aria-label="main.newTab" data-i18n-title="main.shortcut.newTab">+</button>
73
+ <button id="btn-fullscreen" type="button" data-i18n-aria-label="main.fullscreen" data-i18n-title="main.shortcut.fullscreen">⛶</button>
74
+ </div>
75
+ <div class="remote-grid-row">
76
+ <button id="btn-prev-tab" type="button" data-i18n-aria-label="main.prevTab" data-i18n-title="main.shortcut.prevTab">◀</button>
77
+ <button id="btn-next-tab" type="button" data-i18n-aria-label="main.nextTab" data-i18n-title="main.shortcut.nextTab">▶</button>
78
+ </div>
79
+ <div class="remote-grid-row">
80
+ <button id="btn-browser-back" type="button" data-i18n-aria-label="main.browserBack" data-i18n-title="main.shortcut.browserBack">⟵</button>
81
+ <button id="btn-browser-forward" type="button" data-i18n-aria-label="main.browserForward" data-i18n-title="main.shortcut.browserForward">⟶</button>
82
+ <button id="btn-address-bar" type="button" data-i18n-aria-label="main.addressBar" data-i18n-title="main.shortcut.addressBar">⌕</button>
83
+ <button id="btn-hard-reload" type="button" data-i18n-aria-label="main.reload" data-i18n-title="main.shortcut.reload">↻</button>
84
+ </div>
85
+ <div class="remote-grid-row">
86
+ <button id="btn-video-play-pause" type="button" data-i18n-aria-label="main.videoPlayPause" data-i18n-title="main.shortcut.videoPlayPause">⏯</button>
87
+ <button id="btn-video-mute" type="button" data-i18n-aria-label="main.videoMute" data-i18n-title="main.shortcut.videoMute">🔇︎</button>
88
+ <button id="btn-video-fullscreen" type="button" data-i18n-aria-label="main.videoFullscreen" data-i18n-title="main.shortcut.videoFullscreen">⤢</button>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </section>
94
+ <section id="tv-controls" class="remote-panel remote-panel-collapsible" data-i18n-aria-label="main.tvControlsAria">
95
+ <button class="remote-panel-toggle" type="button" aria-expanded="false">
96
+ <span class="remote-panel-title" data-i18n="main.tvSectionLabel">Samsung TV</span>
97
+ <span class="remote-panel-chevron" aria-hidden="true"></span>
98
+ </button>
99
+ <div class="remote-panel-content is-collapsed">
100
+ <div class="remote-panel-content-inner">
101
+ <div class="tv-actions">
102
+ <div class="remote-grid-row">
103
+ <button id="btn-samsung-on" type="button" data-i18n-aria-label="main.samsungOn">On</button>
104
+ <button id="btn-samsung-off" type="button" data-i18n-aria-label="main.samsungOff" data-samsung-requires-on="true">Off</button>
105
+ </div>
106
+ <div class="remote-grid-row">
107
+ <button id="btn-samsung-input" type="button" data-i18n-aria-label="main.samsungInput" data-samsung-requires-on="true">Source</button>
108
+ <button id="btn-samsung-enter" type="button" data-i18n-aria-label="main.samsungEnter" data-samsung-requires-on="true">Enter</button>
109
+ <button id="btn-samsung-pc-input" type="button" data-i18n-aria-label="main.samsungPcInput" data-samsung-requires-on="true">PC</button>
110
+ </div>
111
+ <div class="remote-grid-row">
112
+ <button id="btn-samsung-volup" type="button" data-i18n-aria-label="main.samsungVolUp" data-samsung-requires-on="true">Vol+</button>
113
+ <button id="btn-samsung-voldown" type="button" data-i18n-aria-label="main.samsungVolDown" data-samsung-requires-on="true">Vol-</button>
114
+ <button id="btn-samsung-mute" type="button" data-i18n-aria-label="main.samsungMute" data-samsung-requires-on="true">Mute</button>
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </section>
120
+ <section id="vlc-controls" class="remote-panel remote-panel-collapsible" data-i18n-aria-label="main.vlcControlsAria">
121
+ <button class="remote-panel-toggle" type="button" aria-expanded="false">
122
+ <span class="remote-panel-title" data-i18n="main.vlcSectionLabel">VLC</span>
123
+ <span class="remote-panel-chevron" aria-hidden="true"></span>
124
+ </button>
125
+ <div class="remote-panel-content is-collapsed">
126
+ <div class="remote-panel-content-inner">
127
+ <div class="tv-actions">
128
+ <div class="remote-grid-row">
129
+ <button id="btn-vlc-open" type="button" data-i18n="main.vlcOpen" data-i18n-title="main.vlcOpenTitle" data-i18n-aria-label="main.vlcOpenTitle">Ouvrir VLC</button>
130
+ </div>
131
+ <div class="remote-grid-row">
132
+ <button id="btn-vlc-window-toggle" type="button" data-i18n-title="main.windowToggleTitle" data-i18n-aria-label="main.windowToggleTitle">▣</button>
133
+ <button id="btn-vlc-window-close" type="button" data-i18n-title="main.windowCloseTitle" data-i18n-aria-label="main.windowCloseTitle">✕</button>
134
+ </div>
135
+ <div class="remote-grid-row">
136
+ <button id="btn-vlc-previous" type="button" data-i18n-aria-label="main.vlcPrevious" data-i18n-title="main.shortcut.vlcPrevious">⏮</button>
137
+ <button id="btn-vlc-play-pause" type="button" data-i18n-aria-label="main.vlcPlayPause" data-i18n-title="main.shortcut.vlcPlayPause">⏯</button>
138
+ <button id="btn-vlc-next" type="button" data-i18n-aria-label="main.vlcNext" data-i18n-title="main.shortcut.vlcNext">⏭</button>
139
+ </div>
140
+ <div class="remote-grid-row">
141
+ <button id="btn-vlc-seek-backward" type="button" data-i18n-aria-label="main.vlcSeekBackward" data-i18n-title="main.shortcut.vlcSeekBackward">↺10</button>
142
+ <button id="btn-vlc-stop" type="button" data-i18n-aria-label="main.vlcStop" data-i18n-title="main.shortcut.vlcStop">⏹</button>
143
+ <button id="btn-vlc-seek-forward" type="button" data-i18n-aria-label="main.vlcSeekForward" data-i18n-title="main.shortcut.vlcSeekForward">10↻</button>
144
+ </div>
145
+ <div class="remote-grid-row">
146
+ <button id="btn-vlc-volume-down" type="button" data-i18n-aria-label="main.vlcVolumeDown" data-i18n-title="main.shortcut.vlcVolumeDown">−</button>
147
+ <button id="btn-vlc-mute" type="button" data-i18n-aria-label="main.vlcMute" data-i18n-title="main.shortcut.vlcMute">🔇</button>
148
+ <button id="btn-vlc-volume-up" type="button" data-i18n-aria-label="main.vlcVolumeUp" data-i18n-title="main.shortcut.vlcVolumeUp">+</button>
149
+ </div>
150
+ <div class="remote-grid-row">
151
+ <button id="btn-vlc-fullscreen" type="button" data-i18n-aria-label="main.vlcFullscreen" data-i18n-title="main.shortcut.vlcFullscreen">⤢</button>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </section>
157
+ <section id="system-controls" class="remote-panel remote-panel-collapsible" data-i18n-aria-label="main.systemControlsAria">
158
+ <button class="remote-panel-toggle" type="button" aria-expanded="false">
159
+ <span class="remote-panel-title" data-i18n="main.systemSectionLabel">Systeme</span>
160
+ <span class="remote-panel-chevron" aria-hidden="true"></span>
161
+ </button>
162
+ <div class="remote-panel-content is-collapsed">
163
+ <div class="remote-panel-content-inner">
164
+ <div class="tv-actions">
165
+ <div class="remote-grid-row">
166
+ <button id="btn-system-show-desktop" type="button" data-i18n-aria-label="main.systemShowDesktop">Bureau</button>
167
+ <button id="btn-system-start-menu" type="button" data-i18n-aria-label="main.systemStartMenu">Start</button>
168
+ </div>
169
+ <div class="remote-grid-row">
170
+ <button id="btn-system-window-toggle" type="button" data-i18n-title="main.windowToggleTitle" data-i18n-aria-label="main.windowToggleTitle">▣</button>
171
+ <button id="btn-system-window-close" type="button" data-i18n-title="main.windowCloseTitle" data-i18n-aria-label="main.windowCloseTitle">✕</button>
172
+ </div>
173
+ <div class="remote-grid-row">
174
+ <button id="btn-system-window-left" type="button" data-i18n-aria-label="main.systemWindowLeft">◀</button>
175
+ <button id="btn-system-window-right" type="button" data-i18n-aria-label="main.systemWindowRight">▶</button>
176
+ </div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </section>
181
+ <div id="touchpad-hint" aria-hidden="true">
182
+ <p id="touchpad-hint-title" data-i18n="main.canvas.dragMouse">Glisser : souris</p>
183
+ <p id="touchpad-hint-subtitle" data-i18n="main.canvas.touchHelp">Touchez pour cliquer, maintenez pour glisser</p>
184
+ </div>
185
+ </div>
186
+ <div id="scroll-zone-indicator" aria-hidden="true">
187
+ <span id="scroll-zone-label" data-i18n="main.canvas.oneFingerScroll">SCROLL 1 DOIGT</span>
188
+ </div>
189
+ </div>
190
+ <canvas id="touchpad"></canvas>
191
+ <section id="cursor-preview" data-i18n-aria-label="main.cursorPreviewAria">
192
+ <canvas id="preview-canvas" width="128" height="84"></canvas>
193
+ </section>
194
+ </section>
195
+ </section>
196
+
197
+ <section id="keyboard-panel" class="hidden" data-i18n-aria-label="main.touchEntryPanelAria">
198
+ <div id="keyboard-panel-preview" class="is-empty" aria-hidden="true"></div>
199
+ <div id="keyboard-text-mode" class="keyboard-mode">
200
+ <div class="keyboard-text-entry-row">
201
+ <textarea id="text-input" data-i18n-placeholder="main.textInputPlaceholder" placeholder="Saisir du texte a envoyer"></textarea>
202
+ <button id="send-text" type="button" data-i18n="main.sendText">Envoyer</button>
203
+ </div>
204
+ </div>
205
+ <div id="keyboard-live-mode" class="keyboard-mode hidden">
206
+ <input id="live-text-input" type="text" enterkeyhint="done" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-i18n-placeholder="main.liveKeyboardPlaceholder" placeholder="Tapez ici" />
207
+ </div>
208
+ </section>
209
+
210
+ <section id="keyboard-shortcuts-bar" data-i18n-aria-label="main.touchEntryPanelAria">
211
+ <div class="keyboard-controls">
212
+ <button id="keyboard-esc" type="button" data-i18n="main.escape">Esc</button>
213
+ <button id="keyboard-tab" type="button" data-i18n="main.tab">Tab</button>
214
+ <button id="keyboard-enter" type="button" data-i18n="main.enter">Entree</button>
215
+ <button id="keyboard-shift" type="button" data-i18n="main.shift">Shift</button>
216
+ <button id="keyboard-alt" type="button" data-i18n="main.alt">Alt</button>
217
+ <button id="keyboard-ctrl" type="button" data-i18n="main.ctrl">Ctrl</button>
218
+ </div>
219
+ </section>
220
+
221
+ <nav id="menu" data-i18n-aria-label="main.menuAria">
222
+ <button id="btn-text-entry" type="button" data-i18n="main.textEntry">Saisie texte</button>
223
+ <button id="btn-live-keyboard" type="button" data-i18n="main.touchEntry">Saisie touches</button>
224
+ </nav>
225
+
226
+ <section id="connection-overlay" aria-live="polite">
227
+ <div class="connection-card">
228
+ <h2 data-connection-title data-i18n="main.connectionUnavailableTitle">Serveur inaccessible</h2>
229
+ <p data-connection-message data-i18n="main.connectionWaiting">En attente de connexion...</p>
230
+ </div>
231
+ </section>
232
+
233
+ <section id="client-notifications" aria-live="polite" data-i18n-aria-label="main.notificationsAria"></section>
234
+ </main>
235
+
236
+ <section id="orientation-lock-overlay" aria-live="polite">
237
+ <div class="connection-card">
238
+ <h2 data-i18n="main.orientationLockTitle">Orientation non supportee</h2>
239
+ <p data-i18n="main.orientationLockMessage">Repassez l'appareil en portrait pour utiliser la remote.</p>
240
+ </div>
241
+ </section>
242
+
243
+ <script src="/socket.io/socket.io.js"></script>
244
+ <script type="module" src="./client/ui/main/page.js?v=20260404a"></script>
245
+ </body>
246
+ </html>
@@ -0,0 +1,45 @@
1
+ {
2
+ "id": "/",
3
+ "name": "Remote Mouse",
4
+ "short_name": "Remote Mouse",
5
+ "start_url": "/",
6
+ "scope": "/",
7
+ "display": "standalone",
8
+ "display_override": ["fullscreen", "standalone", "minimal-ui"],
9
+ "orientation": "portrait",
10
+ "background_color": "#101417",
11
+ "theme_color": "#101417",
12
+ "description": "Controle souris/clavier a distance depuis mobile.",
13
+ "icons": [
14
+ {
15
+ "src": "/icon-192.png",
16
+ "sizes": "192x192",
17
+ "type": "image/png",
18
+ "purpose": "any"
19
+ },
20
+ {
21
+ "src": "/icon-192.png",
22
+ "sizes": "192x192",
23
+ "type": "image/png",
24
+ "purpose": "maskable"
25
+ },
26
+ {
27
+ "src": "/apple-touch-icon.png",
28
+ "sizes": "180x180",
29
+ "type": "image/png",
30
+ "purpose": "any"
31
+ },
32
+ {
33
+ "src": "/icon-512.png",
34
+ "sizes": "512x512",
35
+ "type": "image/png",
36
+ "purpose": "any"
37
+ },
38
+ {
39
+ "src": "/icon-512.png",
40
+ "sizes": "512x512",
41
+ "type": "image/png",
42
+ "purpose": "maskable"
43
+ }
44
+ ]
45
+ }
@@ -0,0 +1,55 @@
1
+ <!doctype html>
2
+ <html data-i18n-page-title="preferences.pageTitle">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
6
+ <title>Remote Mouse Preferences</title>
7
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
+ <link rel="stylesheet" href="/admin-config.css?v=20260405a" />
9
+ </head>
10
+ <body>
11
+ <main class="config-page">
12
+ <header class="config-hero">
13
+ <div>
14
+ <p class="eyebrow" data-i18n="preferences.eyebrow">Preferences</p>
15
+ <h1 data-i18n="preferences.title">Preferences locales</h1>
16
+ <p class="hero-copy" data-i18n="preferences.copy">Ces reglages sont stockes localement dans ce navigateur et ne modifient pas la configuration serveur.</p>
17
+ </div>
18
+ <div class="hero-actions">
19
+ <a class="secondary-link" href="/" data-i18n="preferences.back">Retour remote</a>
20
+ </div>
21
+ </header>
22
+
23
+ <section class="config-section">
24
+ <div class="section-heading-copy">
25
+ <p class="section-key" data-i18n="preferences.section.local.key">Local</p>
26
+ <h2 data-i18n="preferences.section.local.title">Preferences du navigateur</h2>
27
+ <p class="section-description" data-i18n="preferences.section.local.description">Choisissez la langue, le theme et la main dominante utilises sur cet appareil.</p>
28
+ </div>
29
+ <div class="page-toolbar-actions" data-client-prefs-host></div>
30
+ </section>
31
+
32
+ <section class="config-section">
33
+ <div class="section-heading-copy">
34
+ <p class="section-key" data-i18n="preferences.section.remotes.key">Remotes</p>
35
+ <h2 data-i18n="preferences.section.remotes.title">Affichage des remotes</h2>
36
+ <p class="section-description" data-i18n="preferences.section.remotes.description">Choisissez quelles remotes locales doivent etre affichees dans l’interface principale.</p>
37
+ </div>
38
+ <div class="page-toolbar-actions preferences-remotes-settings" data-remote-auto-hide-host></div>
39
+ <hr class="preferences-section-separator" aria-hidden="true" />
40
+ <div id="preferences-remotes" class="page-toolbar-actions preferences-remotes-list" aria-live="polite"></div>
41
+ </section>
42
+
43
+ <section class="config-section">
44
+ <div class="section-heading-copy">
45
+ <p class="section-key" data-i18n="preferences.section.browsers.key">Navigateurs</p>
46
+ <h2 data-i18n="preferences.section.browsers.title">Launchers navigateur</h2>
47
+ <p class="section-description" data-i18n="preferences.section.browsers.description">Choisissez quels navigateurs locaux peuvent etre affiches dans la remote navigateur.</p>
48
+ </div>
49
+ <div id="preferences-browsers" class="page-toolbar-actions preferences-remotes-list" aria-live="polite"></div>
50
+ </section>
51
+ </main>
52
+
53
+ <script type="module" src="/client/ui/preferences/page.js?v=20260405a"></script>
54
+ </body>
55
+ </html>