@homebridge-plugins/homebridge-eufy-security 4.7.2 → 5.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/AUTHORS +4 -0
  2. package/CODE_OF_CONDUCT.md +30 -0
  3. package/CONTRIBUTING.md +77 -0
  4. package/README.md +152 -49
  5. package/SECURITY.md +30 -0
  6. package/config.schema.json +92 -3
  7. package/dist/account/ownership.js +290 -0
  8. package/dist/account/ownership.js.map +1 -0
  9. package/dist/account/persistence.js +274 -0
  10. package/dist/account/persistence.js.map +1 -0
  11. package/dist/account/temporary-authentication.js +348 -0
  12. package/dist/account/temporary-authentication.js.map +1 -0
  13. package/dist/configuration.js +167 -0
  14. package/dist/configuration.js.map +1 -0
  15. package/dist/device/member-evidence.js +66 -0
  16. package/dist/device/member-evidence.js.map +1 -0
  17. package/dist/device/member-trust.js +114 -0
  18. package/dist/device/member-trust.js.map +1 -0
  19. package/dist/device/snapshot.js +190 -0
  20. package/dist/device/snapshot.js.map +1 -0
  21. package/dist/diagnostics.js +2218 -0
  22. package/dist/diagnostics.js.map +1 -0
  23. package/dist/homekit/adapter.js +2 -0
  24. package/dist/homekit/adapter.js.map +1 -0
  25. package/dist/homekit/adapters/battery.js +208 -0
  26. package/dist/homekit/adapters/battery.js.map +1 -0
  27. package/dist/homekit/adapters/camera-controls.js +527 -0
  28. package/dist/homekit/adapters/camera-controls.js.map +1 -0
  29. package/dist/homekit/adapters/camera-streaming.js +1515 -0
  30. package/dist/homekit/adapters/camera-streaming.js.map +1 -0
  31. package/dist/homekit/adapters/contact.js +138 -0
  32. package/dist/homekit/adapters/contact.js.map +1 -0
  33. package/dist/homekit/adapters/doorbell.js +57 -0
  34. package/dist/homekit/adapters/doorbell.js.map +1 -0
  35. package/dist/homekit/adapters/information.js +55 -0
  36. package/dist/homekit/adapters/information.js.map +1 -0
  37. package/dist/homekit/adapters/lock.js +489 -0
  38. package/dist/homekit/adapters/lock.js.map +1 -0
  39. package/dist/homekit/adapters/motion.js +100 -0
  40. package/dist/homekit/adapters/motion.js.map +1 -0
  41. package/dist/homekit/adapters/registry.js +26 -0
  42. package/dist/homekit/adapters/registry.js.map +1 -0
  43. package/dist/homekit/adapters/security-system.js +425 -0
  44. package/dist/homekit/adapters/security-system.js.map +1 -0
  45. package/dist/homekit/adapters/siren.js +136 -0
  46. package/dist/homekit/adapters/siren.js.map +1 -0
  47. package/dist/homekit/adapters/smart-light.js +662 -0
  48. package/dist/homekit/adapters/smart-light.js.map +1 -0
  49. package/dist/homekit/coverage-matrix.js +119 -0
  50. package/dist/homekit/coverage-matrix.js.map +1 -0
  51. package/dist/homekit/device-control.js +175 -0
  52. package/dist/homekit/device-control.js.map +1 -0
  53. package/dist/homekit/reconciler.js +319 -0
  54. package/dist/homekit/reconciler.js.map +1 -0
  55. package/dist/homekit/representation.js +23 -0
  56. package/dist/homekit/representation.js.map +1 -0
  57. package/dist/index.js +4 -9
  58. package/dist/index.js.map +1 -1
  59. package/dist/media/contracts.js +2 -0
  60. package/dist/media/contracts.js.map +1 -0
  61. package/dist/media/last-successful-image.js +208 -0
  62. package/dist/media/last-successful-image.js.map +1 -0
  63. package/dist/media/live-stream.js +1003 -0
  64. package/dist/media/live-stream.js.map +1 -0
  65. package/dist/media/recording.js +560 -0
  66. package/dist/media/recording.js.map +1 -0
  67. package/dist/media/session-budget.js +39 -0
  68. package/dist/media/session-budget.js.map +1 -0
  69. package/dist/media/snapshot.js +406 -0
  70. package/dist/media/snapshot.js.map +1 -0
  71. package/dist/media/station-live-sessions.js +101 -0
  72. package/dist/media/station-live-sessions.js.map +1 -0
  73. package/dist/platform.js +97 -809
  74. package/dist/platform.js.map +1 -1
  75. package/dist/runtime/channel.js +375 -0
  76. package/dist/runtime/channel.js.map +1 -0
  77. package/dist/runtime/owner.js +682 -0
  78. package/dist/runtime/owner.js.map +1 -0
  79. package/dist/runtime/sdk-client.js +211 -0
  80. package/dist/runtime/sdk-client.js.map +1 -0
  81. package/dist/runtime/tracker.js +211 -0
  82. package/dist/runtime/tracker.js.map +1 -0
  83. package/dist/settings.js +1 -43
  84. package/dist/settings.js.map +1 -1
  85. package/dist/storage.js +59 -0
  86. package/dist/storage.js.map +1 -0
  87. package/dist/ui/dashboard.js +181 -0
  88. package/dist/ui/dashboard.js.map +1 -0
  89. package/dist/ui/device-image.js +22 -0
  90. package/dist/ui/device-image.js.map +1 -0
  91. package/dist/ui/runtime-channel-client.js +305 -0
  92. package/dist/ui/runtime-channel-client.js.map +1 -0
  93. package/dist/ui/server.js +259 -0
  94. package/dist/ui/server.js.map +1 -0
  95. package/homebridge-ui/public/app.css +1902 -0
  96. package/homebridge-ui/public/assets/devices/clean/clean-T1250.webp +0 -0
  97. package/homebridge-ui/public/assets/devices/clean/clean-T2070.webp +0 -0
  98. package/homebridge-ui/public/assets/devices/clean/clean-T2080.webp +0 -0
  99. package/homebridge-ui/public/assets/devices/clean/clean-T2081.webp +0 -0
  100. package/homebridge-ui/public/assets/devices/clean/clean-T2103.webp +0 -0
  101. package/homebridge-ui/public/assets/devices/clean/clean-T2117.webp +0 -0
  102. package/homebridge-ui/public/assets/devices/clean/clean-T2118.webp +0 -0
  103. package/homebridge-ui/public/assets/devices/clean/clean-T2119.webp +0 -0
  104. package/homebridge-ui/public/assets/devices/clean/clean-T211A.webp +0 -0
  105. package/homebridge-ui/public/assets/devices/clean/clean-T2120.webp +0 -0
  106. package/homebridge-ui/public/assets/devices/clean/clean-T2123.webp +0 -0
  107. package/homebridge-ui/public/assets/devices/clean/clean-T2128.webp +0 -0
  108. package/homebridge-ui/public/assets/devices/clean/clean-T2130.webp +0 -0
  109. package/homebridge-ui/public/assets/devices/clean/clean-T2132.webp +0 -0
  110. package/homebridge-ui/public/assets/devices/clean/clean-T2150.webp +0 -0
  111. package/homebridge-ui/public/assets/devices/clean/clean-T2181.webp +0 -0
  112. package/homebridge-ui/public/assets/devices/clean/clean-T2182.webp +0 -0
  113. package/homebridge-ui/public/assets/devices/clean/clean-T2190.webp +0 -0
  114. package/homebridge-ui/public/assets/devices/clean/clean-T2192.webp +0 -0
  115. package/homebridge-ui/public/assets/devices/clean/clean-T2193.webp +0 -0
  116. package/homebridge-ui/public/assets/devices/clean/clean-T2194.webp +0 -0
  117. package/homebridge-ui/public/assets/devices/clean/clean-T2210.webp +0 -0
  118. package/homebridge-ui/public/assets/devices/clean/clean-T2250.webp +0 -0
  119. package/homebridge-ui/public/assets/devices/clean/clean-T2251.webp +0 -0
  120. package/homebridge-ui/public/assets/devices/clean/clean-T2252.webp +0 -0
  121. package/homebridge-ui/public/assets/devices/clean/clean-T2253.webp +0 -0
  122. package/homebridge-ui/public/assets/devices/clean/clean-T2254.webp +0 -0
  123. package/homebridge-ui/public/assets/devices/clean/clean-T2255.webp +0 -0
  124. package/homebridge-ui/public/assets/devices/clean/clean-T2256.webp +0 -0
  125. package/homebridge-ui/public/assets/devices/clean/clean-T2257.webp +0 -0
  126. package/homebridge-ui/public/assets/devices/clean/clean-T2258.webp +0 -0
  127. package/homebridge-ui/public/assets/devices/clean/clean-T2259.webp +0 -0
  128. package/homebridge-ui/public/assets/devices/clean/clean-T2261.webp +0 -0
  129. package/homebridge-ui/public/assets/devices/clean/clean-T2262.webp +0 -0
  130. package/homebridge-ui/public/assets/devices/clean/clean-T2266.webp +0 -0
  131. package/homebridge-ui/public/assets/devices/clean/clean-T2267.webp +0 -0
  132. package/homebridge-ui/public/assets/devices/clean/clean-T2268.webp +0 -0
  133. package/homebridge-ui/public/assets/devices/clean/clean-T2270.webp +0 -0
  134. package/homebridge-ui/public/assets/devices/clean/clean-T2272.webp +0 -0
  135. package/homebridge-ui/public/assets/devices/clean/clean-T2273.webp +0 -0
  136. package/homebridge-ui/public/assets/devices/clean/clean-T2276.webp +0 -0
  137. package/homebridge-ui/public/assets/devices/clean/clean-T2277.webp +0 -0
  138. package/homebridge-ui/public/assets/devices/clean/clean-T2278.webp +0 -0
  139. package/homebridge-ui/public/assets/devices/clean/clean-T2280.webp +0 -0
  140. package/homebridge-ui/public/assets/devices/clean/clean-T2292.webp +0 -0
  141. package/homebridge-ui/public/assets/devices/clean/clean-T2320.webp +0 -0
  142. package/homebridge-ui/public/assets/devices/clean/clean-T2351.webp +0 -0
  143. package/homebridge-ui/public/assets/devices/clean/clean-T2352.webp +0 -0
  144. package/homebridge-ui/public/assets/devices/clean/clean-T2353.webp +0 -0
  145. package/homebridge-ui/public/assets/devices/life/life-T8L00.webp +0 -0
  146. package/homebridge-ui/public/assets/devices/life/life-T8L01.webp +0 -0
  147. package/homebridge-ui/public/assets/devices/life/life-T8L02.webp +0 -0
  148. package/homebridge-ui/public/assets/devices/life/life-T8L04.webp +0 -0
  149. package/homebridge-ui/public/assets/devices/life/life-T8L10.webp +0 -0
  150. package/homebridge-ui/public/assets/devices/life/life-T8L20.webp +0 -0
  151. package/homebridge-ui/public/assets/devices/life/life-T8L30.webp +0 -0
  152. package/homebridge-ui/public/assets/devices/life/life-T8L40.webp +0 -0
  153. package/homebridge-ui/public/assets/devices/mower/mower-T2801.webp +0 -0
  154. package/homebridge-ui/public/assets/devices/mower/mower-T280B.webp +0 -0
  155. package/homebridge-ui/public/assets/devices/mower/mower-T2880.webp +0 -0
  156. package/homebridge-ui/public/assets/devices/security/security-T7400.webp +0 -0
  157. package/homebridge-ui/public/assets/devices/security/security-T7401.webp +0 -0
  158. package/homebridge-ui/public/assets/devices/security/security-T8001.webp +0 -0
  159. package/homebridge-ui/public/assets/devices/security/security-T8002.webp +0 -0
  160. package/homebridge-ui/public/assets/devices/security/security-T8010.webp +0 -0
  161. package/homebridge-ui/public/assets/devices/security/security-T8021.webp +0 -0
  162. package/homebridge-ui/public/assets/devices/security/security-T8023.webp +0 -0
  163. package/homebridge-ui/public/assets/devices/security/security-T8025.webp +0 -0
  164. package/homebridge-ui/public/assets/devices/security/security-T8030.webp +0 -0
  165. package/homebridge-ui/public/assets/devices/security/security-T8110.webp +0 -0
  166. package/homebridge-ui/public/assets/devices/security/security-T8111.webp +0 -0
  167. package/homebridge-ui/public/assets/devices/security/security-T8112.webp +0 -0
  168. package/homebridge-ui/public/assets/devices/security/security-T8113.webp +0 -0
  169. package/homebridge-ui/public/assets/devices/security/security-T8114.webp +0 -0
  170. package/homebridge-ui/public/assets/devices/security/security-T8122.webp +0 -0
  171. package/homebridge-ui/public/assets/devices/security/security-T8123.webp +0 -0
  172. package/homebridge-ui/public/assets/devices/security/security-T8124.webp +0 -0
  173. package/homebridge-ui/public/assets/devices/security/security-T8130.webp +0 -0
  174. package/homebridge-ui/public/assets/devices/security/security-T8131.webp +0 -0
  175. package/homebridge-ui/public/assets/devices/security/security-T8134.webp +0 -0
  176. package/homebridge-ui/public/assets/devices/security/security-T8140.webp +0 -0
  177. package/homebridge-ui/public/assets/devices/security/security-T8141.webp +0 -0
  178. package/homebridge-ui/public/assets/devices/security/security-T8150.webp +0 -0
  179. package/homebridge-ui/public/assets/devices/security/security-T8151.webp +0 -0
  180. package/homebridge-ui/public/assets/devices/security/security-T8152.webp +0 -0
  181. package/homebridge-ui/public/assets/devices/security/security-T8153.webp +0 -0
  182. package/homebridge-ui/public/assets/devices/security/security-T8160.webp +0 -0
  183. package/homebridge-ui/public/assets/devices/security/security-T8161.webp +0 -0
  184. package/homebridge-ui/public/assets/devices/security/security-T8162.webp +0 -0
  185. package/homebridge-ui/public/assets/devices/security/security-T8170.webp +0 -0
  186. package/homebridge-ui/public/assets/devices/security/security-T8171.webp +0 -0
  187. package/homebridge-ui/public/assets/devices/security/security-T8172.webp +0 -0
  188. package/homebridge-ui/public/assets/devices/security/security-T8173.webp +0 -0
  189. package/homebridge-ui/public/assets/devices/security/security-T8200.webp +0 -0
  190. package/homebridge-ui/public/assets/devices/security/security-T8200X.webp +0 -0
  191. package/homebridge-ui/public/assets/devices/security/security-T8201.webp +0 -0
  192. package/homebridge-ui/public/assets/devices/security/security-T8203.webp +0 -0
  193. package/homebridge-ui/public/assets/devices/security/security-T8210.webp +0 -0
  194. package/homebridge-ui/public/assets/devices/security/security-T8213.webp +0 -0
  195. package/homebridge-ui/public/assets/devices/security/security-T8214.webp +0 -0
  196. package/homebridge-ui/public/assets/devices/security/security-T8222.webp +0 -0
  197. package/homebridge-ui/public/assets/devices/security/security-T8400.webp +0 -0
  198. package/homebridge-ui/public/assets/devices/security/security-T8401.webp +0 -0
  199. package/homebridge-ui/public/assets/devices/security/security-T8410.webp +0 -0
  200. package/homebridge-ui/public/assets/devices/security/security-T8411.webp +0 -0
  201. package/homebridge-ui/public/assets/devices/security/security-T8414.webp +0 -0
  202. package/homebridge-ui/public/assets/devices/security/security-T8416.webp +0 -0
  203. package/homebridge-ui/public/assets/devices/security/security-T8417.webp +0 -0
  204. package/homebridge-ui/public/assets/devices/security/security-T8419.webp +0 -0
  205. package/homebridge-ui/public/assets/devices/security/security-T8419N.webp +0 -0
  206. package/homebridge-ui/public/assets/devices/security/security-T8420.webp +0 -0
  207. package/homebridge-ui/public/assets/devices/security/security-T8420X.webp +0 -0
  208. package/homebridge-ui/public/assets/devices/security/security-T8422.webp +0 -0
  209. package/homebridge-ui/public/assets/devices/security/security-T8423.webp +0 -0
  210. package/homebridge-ui/public/assets/devices/security/security-T8424.webp +0 -0
  211. package/homebridge-ui/public/assets/devices/security/security-T8425.webp +0 -0
  212. package/homebridge-ui/public/assets/devices/security/security-T8441.webp +0 -0
  213. package/homebridge-ui/public/assets/devices/security/security-T8442.webp +0 -0
  214. package/homebridge-ui/public/assets/devices/security/security-T8452.webp +0 -0
  215. package/homebridge-ui/public/assets/devices/security/security-T84A0.webp +0 -0
  216. package/homebridge-ui/public/assets/devices/security/security-T84A1.webp +0 -0
  217. package/homebridge-ui/public/assets/devices/security/security-T8500.webp +0 -0
  218. package/homebridge-ui/public/assets/devices/security/security-T8502.webp +0 -0
  219. package/homebridge-ui/public/assets/devices/security/security-T8503.webp +0 -0
  220. package/homebridge-ui/public/assets/devices/security/security-T8504.webp +0 -0
  221. package/homebridge-ui/public/assets/devices/security/security-T8506.webp +0 -0
  222. package/homebridge-ui/public/assets/devices/security/security-T8510.webp +0 -0
  223. package/homebridge-ui/public/assets/devices/security/security-T8510P.webp +0 -0
  224. package/homebridge-ui/public/assets/devices/security/security-T8520.webp +0 -0
  225. package/homebridge-ui/public/assets/devices/security/security-T8520P.webp +0 -0
  226. package/homebridge-ui/public/assets/devices/security/security-T8530.webp +0 -0
  227. package/homebridge-ui/public/assets/devices/security/security-T8531.webp +0 -0
  228. package/homebridge-ui/public/assets/devices/security/security-T85D0.webp +0 -0
  229. package/homebridge-ui/public/assets/devices/security/security-T85L0.webp +0 -0
  230. package/homebridge-ui/public/assets/devices/security/security-T85P0.webp +0 -0
  231. package/homebridge-ui/public/assets/devices/security/security-T85V0.webp +0 -0
  232. package/homebridge-ui/public/assets/devices/security/security-T8600.webp +0 -0
  233. package/homebridge-ui/public/assets/devices/security/security-T86P2.webp +0 -0
  234. package/homebridge-ui/public/assets/devices/security/security-T8790.webp +0 -0
  235. package/homebridge-ui/public/assets/devices/security/security-T87B0.webp +0 -0
  236. package/homebridge-ui/public/assets/devices/security/security-T87B2.webp +0 -0
  237. package/homebridge-ui/public/assets/devices/security/security-T8900.webp +0 -0
  238. package/homebridge-ui/public/assets/devices/security/security-T8910.webp +0 -0
  239. package/homebridge-ui/public/assets/devices/security/security-T8920.webp +0 -0
  240. package/homebridge-ui/public/assets/devices/security/security-T8960.webp +0 -0
  241. package/homebridge-ui/public/assets/devices/security/security-T8B0.webp +0 -0
  242. package/homebridge-ui/public/assets/devices/security/security-T8E00.webp +0 -0
  243. package/homebridge-ui/public/assets/devices/security/security-T8N00.webp +0 -0
  244. package/homebridge-ui/public/assets/devices/security/security-T8W11C.webp +0 -0
  245. package/homebridge-ui/public/assets/devices/security/security-T90F0.webp +0 -0
  246. package/homebridge-ui/public/assets/devices/security/security-T90M0.webp +0 -0
  247. package/homebridge-ui/public/assets/devices/security/security-T90R0.webp +0 -0
  248. package/homebridge-ui/public/assets/devices/security/security-T90S0.webp +0 -0
  249. package/homebridge-ui/public/assets/icons/inventory.svg +1 -1
  250. package/homebridge-ui/public/assets/icons/troubleshoot.svg +1 -0
  251. package/homebridge-ui/public/assets/icons/warning.svg +1 -1
  252. package/homebridge-ui/public/assets/logo-dark.svg +10 -0
  253. package/homebridge-ui/public/assets/logo.svg +10 -0
  254. package/homebridge-ui/public/i18n/en.json +218 -0
  255. package/homebridge-ui/public/i18n/fr.json +218 -0
  256. package/homebridge-ui/public/index.html +377 -28
  257. package/homebridge-ui/public/js/app.js +1065 -0
  258. package/homebridge-ui/public/js/dashboard.js +385 -0
  259. package/homebridge-ui/public/js/legacy-settings.js +37 -0
  260. package/homebridge-ui/public/js/profile-wizard.js +68 -0
  261. package/homebridge-ui/server.js +2 -1393
  262. package/i18n/runtime/en.json +100 -0
  263. package/media/Snapshot-Unavailable.jpg +0 -0
  264. package/media/Snapshot-black.jpg +0 -0
  265. package/media/camera-disabled.jpg +0 -0
  266. package/media/camera-offline.jpg +0 -0
  267. package/package.json +29 -24
  268. package/.claude/CLAUDE.md +0 -175
  269. package/.claude/PRD.md +0 -241
  270. package/.claude/docs/debug-recording-lessons.md +0 -91
  271. package/.claude/docs/hksv-recording-fix.md +0 -160
  272. package/.claude/skills/architect/SKILL.md +0 -76
  273. package/.claude/skills/developer/SKILL.md +0 -59
  274. package/.claude/skills/new-device-support/SKILL.md +0 -212
  275. package/.claude/skills/new-device-support/check-device.mjs +0 -363
  276. package/.claude/skills/new-device-support/map-properties.mjs +0 -450
  277. package/.claude/skills/new-device-support/verify-device.mjs +0 -272
  278. package/.claude/skills/planner/SKILL.md +0 -100
  279. package/.claude/skills/qa/SKILL.md +0 -79
  280. package/.claude/skills/support/SKILL.md +0 -175
  281. package/.prettierignore +0 -7
  282. package/.prettierrc.json +0 -7
  283. package/FUNDING.yml +0 -1
  284. package/dist/accessories/AutoSyncStationAccessory.js +0 -157
  285. package/dist/accessories/AutoSyncStationAccessory.js.map +0 -1
  286. package/dist/accessories/BaseAccessory.js +0 -261
  287. package/dist/accessories/BaseAccessory.js.map +0 -1
  288. package/dist/accessories/CameraAccessory.js +0 -459
  289. package/dist/accessories/CameraAccessory.js.map +0 -1
  290. package/dist/accessories/Device.js +0 -65
  291. package/dist/accessories/Device.js.map +0 -1
  292. package/dist/accessories/EntrySensorAccessory.js +0 -48
  293. package/dist/accessories/EntrySensorAccessory.js.map +0 -1
  294. package/dist/accessories/GarageDoorAccessory.js +0 -160
  295. package/dist/accessories/GarageDoorAccessory.js.map +0 -1
  296. package/dist/accessories/LockAccessory.js +0 -142
  297. package/dist/accessories/LockAccessory.js.map +0 -1
  298. package/dist/accessories/MotionSensorAccessory.js +0 -48
  299. package/dist/accessories/MotionSensorAccessory.js.map +0 -1
  300. package/dist/accessories/SmartDropAccessory.js +0 -141
  301. package/dist/accessories/SmartDropAccessory.js.map +0 -1
  302. package/dist/accessories/StationAccessory.js +0 -373
  303. package/dist/accessories/StationAccessory.js.map +0 -1
  304. package/dist/config.js +0 -26
  305. package/dist/config.js.map +0 -1
  306. package/dist/controller/DebugRecordingManager.js +0 -402
  307. package/dist/controller/DebugRecordingManager.js.map +0 -1
  308. package/dist/controller/LocalLivestreamManager.js +0 -371
  309. package/dist/controller/LocalLivestreamManager.js.map +0 -1
  310. package/dist/controller/recordingDelegate.js +0 -252
  311. package/dist/controller/recordingDelegate.js.map +0 -1
  312. package/dist/controller/snapshotDelegate.js +0 -348
  313. package/dist/controller/snapshotDelegate.js.map +0 -1
  314. package/dist/controller/streamingDelegate.js +0 -389
  315. package/dist/controller/streamingDelegate.js.map +0 -1
  316. package/dist/interfaces.js +0 -2
  317. package/dist/interfaces.js.map +0 -1
  318. package/dist/media/Snapshot-Unavailable.png +0 -0
  319. package/dist/media/Snapshot-Unavailable.xcf +0 -0
  320. package/dist/media/Snapshot-black.png +0 -0
  321. package/dist/media/camera-disabled.png +0 -0
  322. package/dist/media/camera-offline.png +0 -0
  323. package/dist/media/media/Snapshot-Unavailable.png +0 -0
  324. package/dist/media/media/Snapshot-Unavailable.xcf +0 -0
  325. package/dist/media/media/Snapshot-black.png +0 -0
  326. package/dist/media/media/camera-disabled.png +0 -0
  327. package/dist/media/media/camera-offline.png +0 -0
  328. package/dist/utils/Talkback.js +0 -162
  329. package/dist/utils/Talkback.js.map +0 -1
  330. package/dist/utils/accessoriesStore.js +0 -210
  331. package/dist/utils/accessoriesStore.js.map +0 -1
  332. package/dist/utils/configTypes.js +0 -38
  333. package/dist/utils/configTypes.js.map +0 -1
  334. package/dist/utils/ffmpeg.js +0 -1111
  335. package/dist/utils/ffmpeg.js.map +0 -1
  336. package/dist/utils/interfaces.js +0 -8
  337. package/dist/utils/interfaces.js.map +0 -1
  338. package/dist/utils/utils.js +0 -224
  339. package/dist/utils/utils.js.map +0 -1
  340. package/dist/version.js +0 -2
  341. package/dist/version.js.map +0 -1
  342. package/homebridge-eufy-security.png +0 -0
  343. package/homebridge-ui/diagnosticsCrypto.js +0 -112
  344. package/homebridge-ui/public/app.js +0 -237
  345. package/homebridge-ui/public/assets/devices/4g_lte_cam_s330_large.png +0 -0
  346. package/homebridge-ui/public/assets/devices/4g_lte_starlight_large.jpg +0 -0
  347. package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C30.png +0 -0
  348. package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C31.png +0 -0
  349. package/homebridge-ui/public/assets/devices/batterydoorbell1080p_large.jpg +0 -0
  350. package/homebridge-ui/public/assets/devices/batterydoorbell2k_large.png +0 -0
  351. package/homebridge-ui/public/assets/devices/batterydoorbell2kdual_large.jpg +0 -0
  352. package/homebridge-ui/public/assets/devices/batterydoorbell_e340_large.png +0 -0
  353. package/homebridge-ui/public/assets/devices/eufy-security-client.png +0 -0
  354. package/homebridge-ui/public/assets/devices/eufyCamS4_large.png +0 -0
  355. package/homebridge-ui/public/assets/devices/eufycam2_large.png +0 -0
  356. package/homebridge-ui/public/assets/devices/eufycam2c_large.jpg +0 -0
  357. package/homebridge-ui/public/assets/devices/eufycam2cpro_large.jpg +0 -0
  358. package/homebridge-ui/public/assets/devices/eufycam2pro_large.jpg +0 -0
  359. package/homebridge-ui/public/assets/devices/eufycam3_large.jpg +0 -0
  360. package/homebridge-ui/public/assets/devices/eufycam3c_large.jpg +0 -0
  361. package/homebridge-ui/public/assets/devices/eufycam3pro_large.png +0 -0
  362. package/homebridge-ui/public/assets/devices/eufycam_large.jpg +0 -0
  363. package/homebridge-ui/public/assets/devices/eufycame330_large.jpg +0 -0
  364. package/homebridge-ui/public/assets/devices/flood_freeze_sensor_e20_t90F0_large.png +0 -0
  365. package/homebridge-ui/public/assets/devices/floodlight2_large.jpg +0 -0
  366. package/homebridge-ui/public/assets/devices/floodlight2pro_large.jpg +0 -0
  367. package/homebridge-ui/public/assets/devices/floodlight_large.jpg +0 -0
  368. package/homebridge-ui/public/assets/devices/floodlightcame340_large.jpg +0 -0
  369. package/homebridge-ui/public/assets/devices/garage_camera_t8452_large.png +0 -0
  370. package/homebridge-ui/public/assets/devices/homebase2_large.png +0 -0
  371. package/homebridge-ui/public/assets/devices/homebase3_large.png +0 -0
  372. package/homebridge-ui/public/assets/devices/homebase_large.jpg +0 -0
  373. package/homebridge-ui/public/assets/devices/homebasemini_large.png +0 -0
  374. package/homebridge-ui/public/assets/devices/indoorcamC210_large.png +0 -0
  375. package/homebridge-ui/public/assets/devices/indoorcamC220_large.png +0 -0
  376. package/homebridge-ui/public/assets/devices/indoorcamC220_t8419N_large.png +0 -0
  377. package/homebridge-ui/public/assets/devices/indoorcamE30_large.png +0 -0
  378. package/homebridge-ui/public/assets/devices/indoorcamc120_large.png +0 -0
  379. package/homebridge-ui/public/assets/devices/indoorcammini_large.jpg +0 -0
  380. package/homebridge-ui/public/assets/devices/indoorcamp24_large.png +0 -0
  381. package/homebridge-ui/public/assets/devices/indoorcams350_large.png +0 -0
  382. package/homebridge-ui/public/assets/devices/keypad_large.png +0 -0
  383. package/homebridge-ui/public/assets/devices/minibase_chime_T8023_large.jpg +0 -0
  384. package/homebridge-ui/public/assets/devices/motionsensor_large.png +0 -0
  385. package/homebridge-ui/public/assets/devices/nvr_s4_max_T8N00_large.png +0 -0
  386. package/homebridge-ui/public/assets/devices/pir_sensor_e20_large.png +0 -0
  387. package/homebridge-ui/public/assets/devices/poe_bullet_ptz_cam_s4_T8E00_large.png +0 -0
  388. package/homebridge-ui/public/assets/devices/sensor_large.png +0 -0
  389. package/homebridge-ui/public/assets/devices/siren_sensor_e20_large.png +0 -0
  390. package/homebridge-ui/public/assets/devices/smartdrop_t8790_large.png +0 -0
  391. package/homebridge-ui/public/assets/devices/smartlock_t8500_large.png +0 -0
  392. package/homebridge-ui/public/assets/devices/smartlock_t8500_wifibridge_large.jpg +0 -0
  393. package/homebridge-ui/public/assets/devices/smartlock_t8503_large.png +0 -0
  394. package/homebridge-ui/public/assets/devices/smartlock_t8504_large.jpg +0 -0
  395. package/homebridge-ui/public/assets/devices/smartlock_t8510P_t8520P_large.png +0 -0
  396. package/homebridge-ui/public/assets/devices/smartlock_t85D0_large.png +0 -0
  397. package/homebridge-ui/public/assets/devices/smartlock_t85L0_large.png +0 -0
  398. package/homebridge-ui/public/assets/devices/smartlock_t85P0_large.png +0 -0
  399. package/homebridge-ui/public/assets/devices/smartlock_t85V0_large.png +0 -0
  400. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8502_large.png +0 -0
  401. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8506_large.png +0 -0
  402. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8520_large.png +0 -0
  403. package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_large.png +0 -0
  404. package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_wifibridge_large.jpg +0 -0
  405. package/homebridge-ui/public/assets/devices/smartlock_video_t8530_large.png +0 -0
  406. package/homebridge-ui/public/assets/devices/smartlock_video_t8531_large.png +0 -0
  407. package/homebridge-ui/public/assets/devices/smartlockwifibridge_t8021_large.jpg +0 -0
  408. package/homebridge-ui/public/assets/devices/smartsafe_s10_t7400_large.png +0 -0
  409. package/homebridge-ui/public/assets/devices/smartsafe_s12_t7401_large.png +0 -0
  410. package/homebridge-ui/public/assets/devices/smarttrack_card_t87B2_large.png +0 -0
  411. package/homebridge-ui/public/assets/devices/smarttrack_link_t87B0_large.png +0 -0
  412. package/homebridge-ui/public/assets/devices/smoke_alarm_e10_t90S0_large.png +0 -0
  413. package/homebridge-ui/public/assets/devices/solocamc210_large.jpg +0 -0
  414. package/homebridge-ui/public/assets/devices/solocamc35_large.png +0 -0
  415. package/homebridge-ui/public/assets/devices/solocame20_large.jpg +0 -0
  416. package/homebridge-ui/public/assets/devices/solocame30_large.png +0 -0
  417. package/homebridge-ui/public/assets/devices/solocame40_large.jpg +0 -0
  418. package/homebridge-ui/public/assets/devices/solocame42_large.png +0 -0
  419. package/homebridge-ui/public/assets/devices/solocaml20_large.jpg +0 -0
  420. package/homebridge-ui/public/assets/devices/solocams220_large.jpg +0 -0
  421. package/homebridge-ui/public/assets/devices/solocams340_large.png +0 -0
  422. package/homebridge-ui/public/assets/devices/solocams40_large.jpg +0 -0
  423. package/homebridge-ui/public/assets/devices/soloindoorcamc24_large.jpg +0 -0
  424. package/homebridge-ui/public/assets/devices/solooutdoorcamc22_large.png +0 -0
  425. package/homebridge-ui/public/assets/devices/solooutdoorcamc24_large.jpg +0 -0
  426. package/homebridge-ui/public/assets/devices/unknown.png +0 -0
  427. package/homebridge-ui/public/assets/devices/walllight_s100_large.png +0 -0
  428. package/homebridge-ui/public/assets/devices/walllight_s120_large.png +0 -0
  429. package/homebridge-ui/public/assets/devices/water_freeze_sensor_t8920_large.png +0 -0
  430. package/homebridge-ui/public/assets/devices/wireddoorbell1080p_large.jpg +0 -0
  431. package/homebridge-ui/public/assets/devices/wireddoorbell2k_large.png +0 -0
  432. package/homebridge-ui/public/assets/devices/wireddoorbelldual_large.jpg +0 -0
  433. package/homebridge-ui/public/assets/icons/attach.svg +0 -1
  434. package/homebridge-ui/public/assets/icons/battery_0.svg +0 -1
  435. package/homebridge-ui/public/assets/icons/battery_1.svg +0 -1
  436. package/homebridge-ui/public/assets/icons/battery_2.svg +0 -1
  437. package/homebridge-ui/public/assets/icons/battery_3.svg +0 -1
  438. package/homebridge-ui/public/assets/icons/battery_4.svg +0 -1
  439. package/homebridge-ui/public/assets/icons/battery_5.svg +0 -1
  440. package/homebridge-ui/public/assets/icons/battery_6.svg +0 -1
  441. package/homebridge-ui/public/assets/icons/copy.svg +0 -1
  442. package/homebridge-ui/public/assets/icons/delete.svg +0 -1
  443. package/homebridge-ui/public/assets/icons/download.svg +0 -1
  444. package/homebridge-ui/public/assets/icons/info.svg +0 -1
  445. package/homebridge-ui/public/assets/icons/refresh.svg +0 -1
  446. package/homebridge-ui/public/assets/icons/satellite_alt.svg +0 -1
  447. package/homebridge-ui/public/assets/icons/solar_power.svg +0 -1
  448. package/homebridge-ui/public/components/device-card.js +0 -174
  449. package/homebridge-ui/public/components/guard-modes.js +0 -88
  450. package/homebridge-ui/public/components/number-input.js +0 -121
  451. package/homebridge-ui/public/components/select.js +0 -73
  452. package/homebridge-ui/public/components/toggle.js +0 -68
  453. package/homebridge-ui/public/services/api.js +0 -250
  454. package/homebridge-ui/public/services/config.js +0 -144
  455. package/homebridge-ui/public/style.css +0 -818
  456. package/homebridge-ui/public/utils/countries.js +0 -73
  457. package/homebridge-ui/public/utils/device-images.js +0 -102
  458. package/homebridge-ui/public/utils/helpers.js +0 -115
  459. package/homebridge-ui/public/views/dashboard.js +0 -226
  460. package/homebridge-ui/public/views/device-detail.js +0 -654
  461. package/homebridge-ui/public/views/diagnostics.js +0 -402
  462. package/homebridge-ui/public/views/login.js +0 -650
  463. package/homebridge-ui/public/views/recordings.js +0 -319
  464. package/homebridge-ui/public/views/settings.js +0 -197
  465. package/homebridge-ui/public/views/unsupported-detail.js +0 -296
  466. package/media/Snapshot-Unavailable.png +0 -0
  467. package/media/Snapshot-Unavailable.xcf +0 -0
  468. package/media/Snapshot-black.png +0 -0
  469. package/media/camera-disabled.png +0 -0
  470. package/media/camera-offline.png +0 -0
  471. package/scripts/decrypt-diagnostics.mjs +0 -257
@@ -1,818 +0,0 @@
1
- /* ===== Eufy Security Plugin - Custom UI Styles ===== */
2
- /* Bootstrap 5 is auto-injected by Homebridge UI */
3
-
4
- :root {
5
- --eufy-primary: #2d6ff7;
6
- --eufy-primary-hover: #1a5ae0;
7
- --eufy-success: #28a745;
8
- --eufy-danger: #dc3545;
9
- --eufy-warning: #ffc107;
10
- --eufy-muted: #6c757d;
11
- --eufy-card-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
12
- --eufy-card-hover-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
13
- --eufy-border-radius: 12px;
14
- --eufy-transition: all 0.2s ease;
15
- }
16
-
17
- /* ===== Instant Tooltip ===== */
18
- .eufy-tooltip {
19
- position: relative;
20
- }
21
- .eufy-tooltip::after {
22
- content: attr(data-tooltip);
23
- position: absolute;
24
- top: calc(100% + 6px);
25
- left: 50%;
26
- transform: translateX(-50%);
27
- padding: 4px 8px;
28
- background: rgba(0, 0, 0, 0.8);
29
- color: #fff;
30
- font-size: 0.75rem;
31
- white-space: nowrap;
32
- border-radius: 4px;
33
- pointer-events: none;
34
- opacity: 0;
35
- transition: opacity 0.1s ease;
36
- z-index: 10;
37
- }
38
- .eufy-tooltip:hover::after {
39
- opacity: 1;
40
- }
41
- .d-flex > .eufy-tooltip:last-child::after {
42
- left: auto;
43
- right: 0;
44
- transform: none;
45
- }
46
-
47
- /* ===== Layout ===== */
48
- #app {
49
- max-width: 960px;
50
- margin: 0 auto;
51
- padding: 0 12px;
52
- }
53
-
54
- /* ===== Header ===== */
55
- .eufy-header {
56
- display: flex;
57
- align-items: center;
58
- justify-content: space-between;
59
- padding: 16px 0;
60
- margin-bottom: 8px;
61
- border-bottom: 1px solid rgba(0, 0, 0, 0.08);
62
- }
63
-
64
- .eufy-header h4 {
65
- margin: 0;
66
- font-weight: 600;
67
- font-size: 1.25rem;
68
- }
69
-
70
- .eufy-header__right {
71
- display: flex;
72
- align-items: center;
73
- gap: 12px;
74
- }
75
-
76
- .eufy-cache-date {
77
- font-size: 0.75rem;
78
- color: #888;
79
- white-space: nowrap;
80
- }
81
-
82
- .eufy-header .btn-group .btn {
83
- padding: 6px 10px;
84
- font-size: 0.85rem;
85
- }
86
-
87
- /* ===== Device Cards ===== */
88
- .device-card {
89
- border: 1px solid rgba(0, 0, 0, 0.1);
90
- border-radius: var(--eufy-border-radius);
91
- box-shadow: var(--eufy-card-shadow);
92
- transition: var(--eufy-transition);
93
- cursor: pointer;
94
- overflow: hidden;
95
- height: 100%;
96
- background: var(--bs-body-bg, #fff);
97
- }
98
-
99
- .device-card:hover:not(.device-card--disabled) {
100
- box-shadow: var(--eufy-card-hover-shadow);
101
- transform: translateY(-2px);
102
- }
103
-
104
- .device-card--unsupported {
105
- opacity: 0.65;
106
- cursor: pointer;
107
- }
108
-
109
- .device-card__hint {
110
- font-size: 0.7rem;
111
- color: var(--eufy-primary);
112
- margin-top: 4px;
113
- font-style: italic;
114
- }
115
-
116
- /* ===== Unsupported Detail View ===== */
117
- .unsupported-detail {
118
- padding: 16px 0;
119
- }
120
-
121
- .unsupported-detail__table {
122
- width: 100%;
123
- font-size: 0.85rem;
124
- margin: 16px 0;
125
- border-collapse: collapse;
126
- }
127
-
128
- .unsupported-detail__table td {
129
- padding: 8px 12px;
130
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
131
- }
132
-
133
- .unsupported-detail__table td:first-child {
134
- font-weight: 600;
135
- width: 40%;
136
- color: var(--eufy-muted);
137
- }
138
-
139
- .unsupported-detail__steps {
140
- margin-top: 20px;
141
- }
142
-
143
- .unsupported-stepper {
144
- display: flex;
145
- align-items: center;
146
- justify-content: center;
147
- gap: 0;
148
- margin-bottom: 14px;
149
- }
150
-
151
- .unsupported-stepper__step {
152
- display: flex;
153
- flex-direction: column;
154
- align-items: center;
155
- gap: 4px;
156
- flex: 0 0 auto;
157
- }
158
-
159
- .unsupported-stepper__circle {
160
- width: 28px;
161
- height: 28px;
162
- border-radius: 50%;
163
- color: #fff;
164
- display: flex;
165
- align-items: center;
166
- justify-content: center;
167
- font-size: 0.78rem;
168
- font-weight: 700;
169
- background: var(--eufy-primary);
170
- }
171
-
172
- .unsupported-stepper__circle--success {
173
- background: var(--bs-success, #198754);
174
- }
175
-
176
- .unsupported-stepper__circle--primary {
177
- background: var(--bs-primary, #0d6efd);
178
- }
179
-
180
- .unsupported-stepper__circle--warning {
181
- background: var(--bs-warning, #ffc107);
182
- }
183
-
184
- .unsupported-stepper__circle--danger {
185
- background: var(--bs-danger, #dc3545);
186
- }
187
-
188
- .unsupported-stepper__label {
189
- font-size: 0.72rem;
190
- font-weight: 600;
191
- color: var(--eufy-muted);
192
- text-transform: uppercase;
193
- letter-spacing: 0.03em;
194
- }
195
-
196
- .unsupported-stepper__line {
197
- flex: 1;
198
- height: 2px;
199
- background: var(--eufy-border, #dee2e6);
200
- margin: 0 8px;
201
- align-self: flex-start;
202
- margin-top: 13px;
203
- }
204
-
205
- .unsupported-detail__actions {
206
- display: flex;
207
- gap: 12px;
208
- }
209
-
210
- .unsupported-detail__actions .btn {
211
- flex: 1;
212
- text-align: center;
213
- }
214
-
215
- .unsupported-detail__paste-note {
216
- font-size: 0.8rem;
217
- color: var(--eufy-muted);
218
- margin-top: 12px;
219
- padding: 8px 12px;
220
- background: rgba(255, 193, 7, 0.1);
221
- border-left: 3px solid var(--bs-warning, #ffc107);
222
- border-radius: 4px;
223
- }
224
-
225
- .unsupported-detail__info {
226
- font-size: 0.82rem;
227
- padding: 12px 14px;
228
- margin: 16px 0;
229
- background: rgba(45, 111, 247, 0.06);
230
- border-left: 3px solid var(--eufy-primary);
231
- border-radius: 4px;
232
- line-height: 1.6;
233
- }
234
-
235
- .unsupported-detail__info a {
236
- color: var(--eufy-primary);
237
- }
238
-
239
- .unsupported-detail__dump-wrap {
240
- position: relative;
241
- }
242
-
243
- .unsupported-detail__copy-btn {
244
- position: absolute;
245
- top: 8px;
246
- right: 8px;
247
- padding: 3px 10px;
248
- font-size: 0.72rem;
249
- border: 1px solid rgba(0, 0, 0, 0.15);
250
- border-radius: 6px;
251
- background: var(--bs-body-bg, #fff);
252
- color: var(--eufy-muted);
253
- cursor: pointer;
254
- transition: var(--eufy-transition);
255
- z-index: 1;
256
- }
257
-
258
- .unsupported-detail__copy-btn:hover {
259
- border-color: var(--eufy-primary);
260
- color: var(--eufy-primary);
261
- }
262
-
263
- .unsupported-detail__dump {
264
- background: rgba(0, 0, 0, 0.04);
265
- border: 1px solid rgba(0, 0, 0, 0.1);
266
- border-radius: 8px;
267
- padding: 12px 16px;
268
- font-size: 0.78rem;
269
- max-height: 100px;
270
- overflow-y: auto;
271
- white-space: pre-wrap;
272
- word-break: break-word;
273
- margin-bottom: 8px;
274
- }
275
-
276
- .device-card--ignored {
277
- opacity: 0.6;
278
- }
279
-
280
- .device-card__image-wrap {
281
- display: flex;
282
- align-items: center;
283
- justify-content: center;
284
- padding: 16px 16px 8px;
285
- height: 120px;
286
- }
287
-
288
- .device-card__image-wrap img {
289
- max-height: 100%;
290
- max-width: 100%;
291
- object-fit: contain;
292
- }
293
-
294
- .device-card__body {
295
- padding: 8px 16px 14px;
296
- }
297
-
298
- .device-card__name {
299
- font-weight: 600;
300
- font-size: 0.9rem;
301
- margin-bottom: 4px;
302
- white-space: nowrap;
303
- overflow: hidden;
304
- text-overflow: ellipsis;
305
- }
306
-
307
- .device-card__meta-row {
308
- display: flex;
309
- align-items: center;
310
- justify-content: space-between;
311
- gap: 8px;
312
- }
313
-
314
- .device-card__meta {
315
- font-size: 0.75rem;
316
- color: var(--eufy-muted);
317
- white-space: nowrap;
318
- overflow: hidden;
319
- text-overflow: ellipsis;
320
- min-width: 0;
321
- }
322
-
323
- .device-card__footer {
324
- display: flex;
325
- align-items: center;
326
- justify-content: space-between;
327
- padding: 0 16px 12px;
328
- }
329
-
330
- /* ===== Badges ===== */
331
- .badge-unsupported {
332
- font-size: 0.7rem;
333
- background-color: var(--eufy-warning) !important;
334
- color: #000;
335
- }
336
-
337
- /* ===== Toggle Switch ===== */
338
- .eufy-toggle {
339
- display: flex;
340
- align-items: center;
341
- justify-content: space-between;
342
- padding: 12px 0;
343
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
344
- }
345
-
346
- .eufy-toggle:last-child {
347
- border-bottom: none;
348
- }
349
-
350
- .eufy-toggle__label {
351
- display: flex;
352
- align-items: center;
353
- gap: 8px;
354
- font-size: 0.9rem;
355
- font-weight: 500;
356
- }
357
-
358
- .eufy-toggle__help {
359
- display: inline-flex;
360
- align-items: center;
361
- justify-content: center;
362
- width: 18px;
363
- height: 18px;
364
- border-radius: 50%;
365
- background: rgba(0, 0, 0, 0.08);
366
- color: var(--eufy-muted);
367
- font-size: 0.65rem;
368
- cursor: help;
369
- font-weight: 700;
370
- flex-shrink: 0;
371
- }
372
-
373
- /* ===== Discovery / Loading ===== */
374
- .discovery-screen {
375
- text-align: center;
376
- padding: 60px 20px;
377
- }
378
-
379
- .discovery-screen__icon {
380
- font-size: 3rem;
381
- margin-bottom: 16px;
382
- animation: pulse 2s ease-in-out infinite;
383
- }
384
-
385
- .discovery-screen__title {
386
- font-size: 1.2rem;
387
- font-weight: 600;
388
- margin-bottom: 8px;
389
- }
390
-
391
- .discovery-screen__subtitle {
392
- color: var(--eufy-muted);
393
- font-size: 0.9rem;
394
- margin-bottom: 24px;
395
- }
396
-
397
- @keyframes pulse {
398
- 0%, 100% { opacity: 1; transform: scale(1); }
399
- 50% { opacity: 0.6; transform: scale(1.05); }
400
- }
401
-
402
- /* ===== Login ===== */
403
- .login-card {
404
- margin: 0px auto;
405
- }
406
-
407
- .login-card .input-group {
408
- overflow: visible;
409
- }
410
-
411
- .login-card .input-group > .eufy-tooltip::after {
412
- left: auto;
413
- right: 0;
414
- transform: none;
415
- }
416
-
417
- .login-section-title {
418
- font-size: 1.2rem;
419
- font-weight: 600;
420
- margin-bottom: 16px;
421
- padding-bottom: 12px;
422
- border-bottom: 1px solid rgba(0, 0, 0, 0.08);
423
- }
424
-
425
- /* ===== Detail View ===== */
426
- .detail-header {
427
- display: flex;
428
- align-items: center;
429
- gap: 16px;
430
- padding: 16px 0;
431
- margin-bottom: 8px;
432
- border-bottom: 1px solid rgba(0, 0, 0, 0.08);
433
- }
434
-
435
- .detail-header__image {
436
- width: 64px;
437
- height: 64px;
438
- object-fit: contain;
439
- }
440
-
441
- .detail-header__info h5 {
442
- margin: 0 0 4px;
443
- font-weight: 600;
444
- }
445
-
446
- .detail-header__info small {
447
- color: var(--eufy-muted);
448
- }
449
-
450
- .detail-section {
451
- margin-bottom: 16px;
452
- }
453
-
454
- .detail-section__title {
455
- font-size: 0.8rem;
456
- text-transform: uppercase;
457
- letter-spacing: 0.5px;
458
- color: var(--eufy-muted);
459
- font-weight: 600;
460
- margin-bottom: 4px;
461
- padding: 8px 0;
462
- }
463
-
464
- /* ===== Advanced Toggle ===== */
465
- .advanced-toggle {
466
- display: flex;
467
- align-items: center;
468
- gap: 6px;
469
- color: var(--eufy-muted);
470
- cursor: pointer;
471
- font-size: 0.85rem;
472
- padding: 12px 0;
473
- border: none;
474
- background: none;
475
- width: 100%;
476
- text-align: left;
477
- }
478
-
479
- .advanced-toggle:hover {
480
- color: var(--eufy-primary);
481
- }
482
-
483
- .advanced-toggle__chevron {
484
- transition: transform 0.2s;
485
- font-size: 0.7rem;
486
- }
487
-
488
- .advanced-toggle__chevron--open {
489
- transform: rotate(90deg);
490
- }
491
-
492
- /* ===== Settings ===== */
493
- .settings-section {
494
- padding: 16px 0;
495
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
496
- }
497
-
498
- .settings-section:last-child {
499
- border-bottom: none;
500
- }
501
-
502
- .settings-btn-row {
503
- display: flex;
504
- flex-wrap: wrap;
505
- gap: 8px;
506
- padding: 12px 0;
507
- }
508
-
509
- /* ===== Guard Modes ===== */
510
- .guard-mode-grid {
511
- display: grid;
512
- grid-template-columns: 1fr 1fr;
513
- gap: 12px;
514
- }
515
-
516
- .guard-mode-grid .form-group label {
517
- font-size: 0.85rem;
518
- font-weight: 500;
519
- margin-bottom: 4px;
520
- }
521
-
522
- .guard-mode-grid .form-control,
523
- .guard-mode-grid .form-select {
524
- font-size: 0.85rem;
525
- }
526
-
527
- /* ===== Welcome Banner ===== */
528
- .welcome-banner {
529
- text-align: center;
530
- padding: 24px 20px 16px;
531
- }
532
-
533
- .welcome-banner__title {
534
- font-size: 1.1rem;
535
- font-weight: 600;
536
- margin-bottom: 8px;
537
- }
538
-
539
- .welcome-banner__text {
540
- color: var(--eufy-muted);
541
- font-size: 0.85rem;
542
- line-height: 1.5;
543
- max-width: 360px;
544
- margin: 0 auto;
545
- }
546
-
547
- /* ===== Alert overrides ===== */
548
- .alert-admin {
549
- border-radius: var(--eufy-border-radius);
550
- overflow-wrap: break-word;
551
- word-break: break-word;
552
- max-width: 100%;
553
- box-sizing: border-box;
554
- }
555
-
556
- /* ===== Node.js Version Warning Banner ===== */
557
- .node-version-banner {
558
- display: flex;
559
- align-items: flex-start;
560
- gap: 12px;
561
- padding: 14px 16px;
562
- margin-bottom: 16px;
563
- background: #fff3cd;
564
- border: 1px solid #ffc107;
565
- border-radius: var(--eufy-border-radius);
566
- font-size: 0.85rem;
567
- line-height: 1.5;
568
- }
569
-
570
- .node-version-banner__icon {
571
- font-size: 1.3rem;
572
- flex-shrink: 0;
573
- margin-top: 1px;
574
- }
575
-
576
- .node-version-banner__content > strong {
577
- display: block;
578
- margin-bottom: 4px;
579
- color: #664d03;
580
- }
581
-
582
- .node-version-banner__text {
583
- color: #664d03;
584
- }
585
-
586
- .node-version-banner__text code {
587
- background: rgba(0, 0, 0, 0.08);
588
- padding: 1px 4px;
589
- border-radius: 3px;
590
- font-size: 0.8rem;
591
- }
592
-
593
- .node-version-banner__text a {
594
- color: #664d03;
595
- font-weight: 500;
596
- }
597
-
598
- /* ===== Number Input ===== */
599
- .number-input-group {
600
- display: flex;
601
- align-items: center;
602
- gap: 4px;
603
- }
604
-
605
- .number-input-group .btn {
606
- padding: 4px 10px;
607
- font-size: 0.85rem;
608
- line-height: 1;
609
- }
610
-
611
- .number-input-group input {
612
- width: 70px;
613
- text-align: center;
614
- font-size: 0.85rem;
615
- }
616
-
617
- /* ===== Progress bar for log download ===== */
618
- .log-progress {
619
- margin-top: 12px;
620
- }
621
-
622
- .log-progress .progress {
623
- height: 8px;
624
- border-radius: 4px;
625
- }
626
-
627
- /* ===== Responsive ===== */
628
- @media (max-width: 576px) {
629
- .welcome-actions {
630
- flex-direction: column;
631
- }
632
-
633
- .guard-mode-grid {
634
- grid-template-columns: 1fr;
635
- }
636
-
637
- .device-card__image-wrap {
638
- height: 90px;
639
- padding: 12px 12px 4px;
640
- }
641
- }
642
-
643
- /* ===== Dark mode support ===== */
644
- /* Homebridge UI applies .dark-mode on the body inside the plugin iframe */
645
- body.dark-mode {
646
- --eufy-card-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
647
- --eufy-card-hover-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
648
- --eufy-muted: #9ea7b3;
649
- }
650
-
651
- body.dark-mode .device-card {
652
- border-color: rgba(255, 255, 255, 0.08);
653
- background: rgba(255, 255, 255, 0.05);
654
- }
655
-
656
- body.dark-mode .device-card:hover:not(.device-card--disabled) {
657
- box-shadow: var(--eufy-card-hover-shadow);
658
- }
659
-
660
- body.dark-mode .eufy-header {
661
- border-bottom-color: rgba(255, 255, 255, 0.1);
662
- }
663
-
664
- body.dark-mode .eufy-toggle {
665
- border-bottom-color: rgba(255, 255, 255, 0.08);
666
- }
667
-
668
- body.dark-mode .eufy-toggle__help {
669
- background: rgba(255, 255, 255, 0.1);
670
- color: rgba(255, 255, 255, 0.5);
671
- }
672
-
673
- body.dark-mode .detail-header {
674
- border-bottom-color: rgba(255, 255, 255, 0.1);
675
- }
676
-
677
- body.dark-mode .login-section-title {
678
- border-bottom-color: rgba(255, 255, 255, 0.1);
679
- }
680
-
681
- body.dark-mode .settings-section {
682
- border-bottom-color: rgba(255, 255, 255, 0.08);
683
- }
684
-
685
- /* ===== Diagnostics Steps ===== */
686
- .diag-step {
687
- padding: 16px;
688
- margin-bottom: 12px;
689
- border-left: 3px solid var(--eufy-primary);
690
- background: rgba(0, 0, 0, 0.02);
691
- border-radius: 0 var(--eufy-border-radius) var(--eufy-border-radius) 0;
692
- }
693
-
694
- .diag-step__header {
695
- display: flex;
696
- align-items: center;
697
- gap: 10px;
698
- margin-bottom: 8px;
699
- }
700
-
701
- .diag-step__badge {
702
- display: inline-flex;
703
- align-items: center;
704
- justify-content: center;
705
- width: 26px;
706
- height: 26px;
707
- border-radius: 50%;
708
- background: var(--eufy-primary);
709
- color: #fff;
710
- font-size: 0.8rem;
711
- font-weight: 700;
712
- flex-shrink: 0;
713
- }
714
-
715
- body.dark-mode .diag-step {
716
- background: rgba(255, 255, 255, 0.04);
717
- border-left-color: var(--eufy-primary);
718
- }
719
-
720
- body.dark-mode .advanced-toggle {
721
- color: rgba(255, 255, 255, 0.5);
722
- }
723
-
724
- body.dark-mode .advanced-toggle:hover {
725
- color: var(--eufy-primary);
726
- }
727
-
728
- body.dark-mode .device-card__meta {
729
- color: var(--eufy-muted);
730
- }
731
-
732
- body.dark-mode .detail-header__info small {
733
- color: var(--eufy-muted);
734
- }
735
-
736
- body.dark-mode .detail-section__title {
737
- color: var(--eufy-muted);
738
- }
739
-
740
- body.dark-mode .welcome-banner__text {
741
- color: var(--eufy-muted);
742
- }
743
-
744
- body.dark-mode .discovery-screen__subtitle {
745
- color: var(--eufy-muted);
746
- }
747
-
748
- body.dark-mode .discovery-screen__title {
749
- color: rgba(255, 255, 255, 0.9);
750
- }
751
-
752
- body.dark-mode .discovery-screen .text-muted {
753
- color: var(--eufy-muted) !important;
754
- }
755
-
756
- body.dark-mode .text-muted {
757
- color: rgba(255, 255, 255, 0.55) !important;
758
- }
759
-
760
- body.dark-mode .diag-step strong {
761
- color: rgba(255, 255, 255, 0.9);
762
- }
763
-
764
- body.dark-mode .node-version-banner {
765
- background: rgba(255, 193, 7, 0.12);
766
- border-color: rgba(255, 193, 7, 0.3);
767
- }
768
-
769
- body.dark-mode .node-version-banner__content strong {
770
- color: #ffda6a;
771
- }
772
-
773
- body.dark-mode .node-version-banner__text {
774
- color: #ffe69c;
775
- }
776
-
777
- body.dark-mode .node-version-banner__text code {
778
- background: rgba(255, 255, 255, 0.1);
779
- color: #ffe69c;
780
- }
781
-
782
- body.dark-mode .node-version-banner__text a {
783
- color: #ffda6a;
784
- }
785
-
786
- /* Invert dark-filled SVG icons so they render white on dark backgrounds */
787
- body.dark-mode img[src*="assets/icons/"] {
788
- filter: brightness(0) invert(1);
789
- }
790
-
791
- /* ── Diagnostics step visibility ── */
792
- .diag-step-reveal {
793
- display: none;
794
- }
795
-
796
- .diag-debug-steps--active .diag-step-reveal {
797
- display: block;
798
- }
799
-
800
- /* Step 3 stays hidden until download completes (JS removes this class) */
801
- .diag-debug-steps--active .diag-step-3 {
802
- display: none;
803
- }
804
-
805
- .diag-download-row {
806
- display: flex;
807
- align-items: center;
808
- gap: 12px;
809
- }
810
-
811
- .diag-encrypt-label {
812
- display: flex;
813
- align-items: center;
814
- gap: 4px;
815
- margin: 0;
816
- cursor: pointer;
817
- font-size: 0.85rem;
818
- }