@homebridge-plugins/homebridge-eufy-security 5.0.0-beta.4 → 5.0.0-beta.41

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 (121) hide show
  1. package/CONTRIBUTING.md +9 -17
  2. package/config.schema.json +60 -0
  3. package/dist/account/ownership.js +16 -16
  4. package/dist/account/ownership.js.map +1 -1
  5. package/dist/account/persistence.js +24 -74
  6. package/dist/account/persistence.js.map +1 -1
  7. package/dist/account/temporary-authentication.js +5 -3
  8. package/dist/account/temporary-authentication.js.map +1 -1
  9. package/dist/configuration.js +50 -13
  10. package/dist/configuration.js.map +1 -1
  11. package/dist/device/member-evidence.js +11 -4
  12. package/dist/device/member-evidence.js.map +1 -1
  13. package/dist/device/member-trust.js +14 -32
  14. package/dist/device/member-trust.js.map +1 -1
  15. package/dist/device/snapshot.js +6 -18
  16. package/dist/device/snapshot.js.map +1 -1
  17. package/dist/diagnostics.js +966 -337
  18. package/dist/diagnostics.js.map +1 -1
  19. package/dist/homekit/adapter.js +4 -1
  20. package/dist/homekit/adapter.js.map +1 -1
  21. package/dist/homekit/adapters/battery.js +3 -3
  22. package/dist/homekit/adapters/battery.js.map +1 -1
  23. package/dist/homekit/adapters/camera-controls.js +15 -37
  24. package/dist/homekit/adapters/camera-controls.js.map +1 -1
  25. package/dist/homekit/adapters/camera-streaming.js +74 -48
  26. package/dist/homekit/adapters/camera-streaming.js.map +1 -1
  27. package/dist/homekit/adapters/contact.js +5 -5
  28. package/dist/homekit/adapters/contact.js.map +1 -1
  29. package/dist/homekit/adapters/doorbell.js +3 -15
  30. package/dist/homekit/adapters/doorbell.js.map +1 -1
  31. package/dist/homekit/adapters/lock.js +72 -221
  32. package/dist/homekit/adapters/lock.js.map +1 -1
  33. package/dist/homekit/adapters/motion.js +3 -3
  34. package/dist/homekit/adapters/motion.js.map +1 -1
  35. package/dist/homekit/adapters/package-sensor.js +63 -0
  36. package/dist/homekit/adapters/package-sensor.js.map +1 -0
  37. package/dist/homekit/adapters/registry.js +2 -0
  38. package/dist/homekit/adapters/registry.js.map +1 -1
  39. package/dist/homekit/adapters/security-system.js +106 -250
  40. package/dist/homekit/adapters/security-system.js.map +1 -1
  41. package/dist/homekit/adapters/siren.js +5 -33
  42. package/dist/homekit/adapters/siren.js.map +1 -1
  43. package/dist/homekit/adapters/smart-light.js +19 -217
  44. package/dist/homekit/adapters/smart-light.js.map +1 -1
  45. package/dist/homekit/coverage-matrix.js +8 -67
  46. package/dist/homekit/coverage-matrix.js.map +1 -1
  47. package/dist/homekit/device-control.js +249 -13
  48. package/dist/homekit/device-control.js.map +1 -1
  49. package/dist/homekit/reconciler.js +25 -9
  50. package/dist/homekit/reconciler.js.map +1 -1
  51. package/dist/media/last-successful-image.js +8 -23
  52. package/dist/media/last-successful-image.js.map +1 -1
  53. package/dist/media/live-preview.js +217 -0
  54. package/dist/media/live-preview.js.map +1 -0
  55. package/dist/media/live-stream.js +689 -160
  56. package/dist/media/live-stream.js.map +1 -1
  57. package/dist/media/recording.js +41 -118
  58. package/dist/media/recording.js.map +1 -1
  59. package/dist/media/snapshot.js +22 -17
  60. package/dist/media/snapshot.js.map +1 -1
  61. package/dist/media/station-live-sessions.js +40 -51
  62. package/dist/media/station-live-sessions.js.map +1 -1
  63. package/dist/platform.js +61 -10
  64. package/dist/platform.js.map +1 -1
  65. package/dist/runtime/channel.js +227 -40
  66. package/dist/runtime/channel.js.map +1 -1
  67. package/dist/runtime/device-settings.js +88 -0
  68. package/dist/runtime/device-settings.js.map +1 -0
  69. package/dist/runtime/owner.js +30 -5
  70. package/dist/runtime/owner.js.map +1 -1
  71. package/dist/runtime/sdk-client.js +21 -17
  72. package/dist/runtime/sdk-client.js.map +1 -1
  73. package/dist/runtime/tracker.js +8 -38
  74. package/dist/runtime/tracker.js.map +1 -1
  75. package/dist/storage.js +1 -1
  76. package/dist/storage.js.map +1 -1
  77. package/dist/ui/dashboard.js +36 -16
  78. package/dist/ui/dashboard.js.map +1 -1
  79. package/dist/ui/runtime-channel-client.js +155 -184
  80. package/dist/ui/runtime-channel-client.js.map +1 -1
  81. package/dist/ui/server.js +94 -41
  82. package/dist/ui/server.js.map +1 -1
  83. package/homebridge-ui/public/app.css +531 -239
  84. package/homebridge-ui/public/assets/icons/auto_fix_high.svg +1 -0
  85. package/homebridge-ui/public/assets/icons/battery_0.svg +1 -0
  86. package/homebridge-ui/public/assets/icons/battery_1.svg +1 -0
  87. package/homebridge-ui/public/assets/icons/battery_2.svg +1 -0
  88. package/homebridge-ui/public/assets/icons/battery_3.svg +1 -0
  89. package/homebridge-ui/public/assets/icons/battery_4.svg +1 -0
  90. package/homebridge-ui/public/assets/icons/battery_5.svg +1 -0
  91. package/homebridge-ui/public/assets/icons/battery_6.svg +1 -0
  92. package/homebridge-ui/public/assets/icons/battery_full.svg +1 -0
  93. package/homebridge-ui/public/assets/icons/contact_support.svg +1 -0
  94. package/homebridge-ui/public/assets/icons/delete.svg +1 -0
  95. package/homebridge-ui/public/assets/icons/download.svg +1 -0
  96. package/homebridge-ui/public/assets/icons/extension_off.svg +1 -0
  97. package/homebridge-ui/public/assets/icons/info.svg +1 -0
  98. package/homebridge-ui/public/assets/icons/key_off.svg +1 -0
  99. package/homebridge-ui/public/assets/icons/keyboard_arrow_left.svg +1 -0
  100. package/homebridge-ui/public/assets/icons/keyboard_arrow_right.svg +1 -0
  101. package/homebridge-ui/public/assets/icons/keyboard_double_arrow_left.svg +1 -0
  102. package/homebridge-ui/public/assets/icons/keyboard_double_arrow_right.svg +1 -0
  103. package/homebridge-ui/public/assets/icons/movie_off.svg +1 -0
  104. package/homebridge-ui/public/assets/icons/play_arrow.svg +1 -0
  105. package/homebridge-ui/public/assets/icons/refresh.svg +1 -0
  106. package/homebridge-ui/public/assets/icons/satellite_alt.svg +1 -0
  107. package/homebridge-ui/public/assets/icons/search_off.svg +1 -0
  108. package/homebridge-ui/public/assets/icons/sensors_off.svg +1 -0
  109. package/homebridge-ui/public/assets/icons/settings_photo_camera.svg +1 -0
  110. package/homebridge-ui/public/assets/icons/solar_power.svg +1 -0
  111. package/homebridge-ui/public/assets/icons/stop.svg +1 -0
  112. package/homebridge-ui/public/assets/icons/videocam_off.svg +1 -0
  113. package/homebridge-ui/public/i18n/en.json +161 -82
  114. package/homebridge-ui/public/i18n/fr.json +162 -83
  115. package/homebridge-ui/public/index.html +224 -96
  116. package/homebridge-ui/public/js/app.js +821 -435
  117. package/homebridge-ui/public/js/dashboard.js +148 -31
  118. package/i18n/runtime/en.json +10 -3
  119. package/package.json +10 -11
  120. package/homebridge-ui/public/js/legacy-settings.js +0 -37
  121. package/homebridge-ui/public/js/profile-wizard.js +0 -61
@@ -17,6 +17,7 @@
17
17
  data-i18n-aria-label="menuDiagnostics"
18
18
  >
19
19
  <img src="assets/icons/bug-report.svg" alt="" />
20
+ <span class="diagnostics-capturing" data-i18n="diagnosticsCapturing"></span>
20
21
  </button>
21
22
  </header>
22
23
 
@@ -27,6 +28,7 @@
27
28
  <h2 id="legacy-notice-title" data-i18n="legacyTitle"></h2>
28
29
  <p data-i18n="legacySummary"></p>
29
30
  <p class="legacy-settings" data-legacy-settings></p>
31
+ <p role="status" data-legacy-status></p>
30
32
  </div>
31
33
  <button type="button" data-legacy-acknowledge data-i18n="acknowledge"></button>
32
34
  </aside>
@@ -61,13 +63,17 @@
61
63
  <p class="eyebrow" data-i18n="devicesEyebrow"></p>
62
64
  <h2 id="dashboard-title" data-dashboard-title></h2>
63
65
  </div>
64
- <button type="button" class="dashboard-diagnose" data-dashboard-diagnose hidden data-i18n="dashboardDiagnose"></button>
65
66
  <div class="dashboard-actions" role="group" data-i18n-aria-label="dashboardActionsLabel">
66
67
  <button type="button" class="dashboard-action" data-dashboard-authenticate data-i18n-aria-label="menuRelogin">
67
68
  <img src="assets/icons/settings_backup_restore.svg" alt="" />
68
69
  </button>
69
70
  <button type="button" class="dashboard-action" data-menu-diagnostics data-i18n-aria-label="menuDiagnostics">
70
71
  <img src="assets/icons/bug-report.svg" alt="" />
72
+ <span class="diagnostics-name" data-i18n="menuDiagnostics"></span>
73
+ <span class="diagnostics-capturing" data-i18n="diagnosticsCapturing"></span>
74
+ </button>
75
+ <button type="button" class="dashboard-action" data-menu-wizard data-i18n-aria-label="menuWizard">
76
+ <img src="assets/icons/auto_fix_high.svg" alt="" />
71
77
  </button>
72
78
  <button type="button" class="dashboard-action" data-menu-advanced data-i18n-aria-label="menuAdvanced">
73
79
  <img src="assets/icons/settings.svg" alt="" />
@@ -163,10 +169,141 @@
163
169
  <input type="text" data-advanced-ffmpeg />
164
170
  <small data-i18n="advancedFfmpegHelp"></small>
165
171
  </label>
172
+ <label>
173
+ <span data-i18n="advancedSmallVideoPacketsLabel"></span>
174
+ <input type="checkbox" data-advanced-small-video-packets />
175
+ <small data-i18n="advancedSmallVideoPacketsHelp"></small>
176
+ </label>
177
+ <label>
178
+ <span data-i18n="advancedLiveVideoPassthroughLabel"></span>
179
+ <input type="checkbox" data-advanced-live-video-passthrough />
180
+ <small data-i18n="advancedLiveVideoPassthroughHelp"></small>
181
+ </label>
182
+ <label>
183
+ <span data-i18n="advancedHardwareVideoEncoderLabel"></span>
184
+ <input type="checkbox" data-advanced-hardware-video-encoder />
185
+ <small data-i18n="advancedHardwareVideoEncoderHelp"></small>
186
+ </label>
187
+ <label>
188
+ <span data-i18n="advancedHdLiveVideoLabel"></span>
189
+ <input type="checkbox" data-advanced-hd-live-video />
190
+ <small data-i18n="advancedHdLiveVideoHelp"></small>
191
+ </label>
192
+ <label>
193
+ <span data-i18n="advancedIgnoreHomeBitRateLabel"></span>
194
+ <input type="checkbox" data-advanced-ignore-home-bit-rate />
195
+ <small data-i18n="advancedIgnoreHomeBitRateHelp"></small>
196
+ </label>
166
197
  </div>
167
198
  <p class="advanced-device-help" data-i18n="advancedDeviceHelp"></p>
168
199
  <p class="advanced-status" role="status" aria-live="polite" data-advanced-status></p>
169
200
  </section>
201
+
202
+ <section class="dashboard-panel wizard-panel" data-setup-wizard hidden aria-labelledby="wizard-title">
203
+ <div class="dashboard-panel-header">
204
+ <button type="button" class="dashboard-page-back" data-wizard-close data-i18n-aria-label="closeWizard">
205
+ <span aria-hidden="true">←</span>
206
+ </button>
207
+ <img class="dashboard-page-icon" src="assets/icons/auto_fix_high.svg" alt="" />
208
+ <div>
209
+ <p class="eyebrow" data-wizard-progress></p>
210
+ <h2 id="wizard-title" data-wizard-title></h2>
211
+ <p class="summary" data-wizard-eyebrow></p>
212
+ </div>
213
+ </div>
214
+ <p class="summary" data-wizard-restart hidden data-i18n="wizardRestartSummary"></p>
215
+ <nav class="wizard-map" data-wizard-map data-i18n-aria-label="wizardMapLabel"></nav>
216
+ <div class="wizard-stage" data-wizard-stage>
217
+ <div class="wizard-live" data-wizard-live>
218
+ <figure>
219
+ <img data-wizard-live-image alt="" draggable="false" hidden />
220
+ <figcaption class="wizard-live-label" data-wizard-live-camera data-i18n="wizardLiveCamera"></figcaption>
221
+ </figure>
222
+ <figure>
223
+ <img data-wizard-live-homekit alt="" draggable="false" hidden />
224
+ <span class="wizard-live-spinner" data-wizard-live-homekit-spinner hidden aria-hidden="true"></span>
225
+ <figcaption class="wizard-live-label" data-wizard-live-encoder></figcaption>
226
+ </figure>
227
+ <button type="button" class="wizard-live-play" data-wizard-live-play data-i18n-aria-label="wizardLivePlay">
228
+ <img src="assets/icons/play_arrow.svg" alt="" />
229
+ </button>
230
+ <button
231
+ type="button"
232
+ class="wizard-live-play wizard-live-stop"
233
+ data-wizard-live-stop
234
+ hidden
235
+ data-i18n-aria-label="wizardLiveStop"
236
+ >
237
+ <img src="assets/icons/stop.svg" alt="" />
238
+ </button>
239
+ <span class="wizard-live-spinner" data-wizard-live-spinner hidden aria-hidden="true"></span>
240
+ <p class="wizard-live-status" role="status" aria-live="polite" data-wizard-live-status></p>
241
+ </div>
242
+ </div>
243
+ <form class="wizard-card" data-wizard-live-controls hidden aria-labelledby="wizard-live-title">
244
+ <h3 id="wizard-live-title" data-i18n="wizardLiveTitle"></h3>
245
+ <p class="preference-note" data-i18n="wizardLiveHelp"></p>
246
+ <div class="preference-grid">
247
+ <label class="wizard-setting" data-setting>
248
+ <span class="setting-label" data-i18n="wizardLiveAsk"></span>
249
+ <select name="ask">
250
+ <option value="wifi" data-i18n="wizardLiveAskWifi"></option>
251
+ <option value="cellular" data-i18n="wizardLiveAskCellular"></option>
252
+ </select>
253
+ </label>
254
+ <p class="preference-representation" data-i18n="wizardLiveThisCamera"></p>
255
+ <div data-setting>
256
+ <label class="toggle">
257
+ <input type="checkbox" name="liveVideoPassthrough" />
258
+ <span class="setting-label" data-i18n="advancedLiveVideoPassthroughLabel"></span>
259
+ </label>
260
+ <p data-i18n="advancedLiveVideoPassthroughHelp"></p>
261
+ </div>
262
+ <div data-setting>
263
+ <label class="toggle">
264
+ <input type="checkbox" name="ignoreHomeBitRate" />
265
+ <span class="setting-label" data-i18n="advancedIgnoreHomeBitRateLabel"></span>
266
+ </label>
267
+ <p data-i18n="advancedIgnoreHomeBitRateHelp"></p>
268
+ </div>
269
+ <div class="wizard-nav">
270
+ <button type="button" data-wizard-live-save data-i18n="wizardLiveSave"></button>
271
+ </div>
272
+ <p class="preference-representation" data-i18n="wizardLiveAllCameras"></p>
273
+ <div data-setting>
274
+ <label class="toggle">
275
+ <input type="checkbox" name="hardwareVideoEncoder" />
276
+ <span class="setting-label" data-i18n="advancedHardwareVideoEncoderLabel"></span>
277
+ </label>
278
+ <p data-i18n="advancedHardwareVideoEncoderHelp"></p>
279
+ </div>
280
+ <div data-setting>
281
+ <label class="toggle">
282
+ <input type="checkbox" name="smallVideoPackets" />
283
+ <span class="setting-label" data-i18n="advancedSmallVideoPacketsLabel"></span>
284
+ </label>
285
+ <p data-i18n="advancedSmallVideoPacketsHelp"></p>
286
+ </div>
287
+ </div>
288
+ </form>
289
+ <p class="summary" data-wizard-live-diagnose hidden>
290
+ <span data-i18n="wizardLiveDiagnoseHelp"></span>
291
+ <button type="button" data-wizard-live-diagnose-start data-i18n="wizardLiveDiagnose"></button>
292
+ </p>
293
+ <section class="wizard-card" data-wizard-homekit aria-labelledby="wizard-homekit-title">
294
+ <h3 id="wizard-homekit-title" data-i18n="wizardHomeKitTitle"></h3>
295
+ <p class="preference-note" data-i18n="wizardHomeKitHelp"></p>
296
+ <div class="preference-grid" data-wizard-controls></div>
297
+ </section>
298
+ <section class="wizard-card" data-wizard-eufy hidden aria-labelledby="wizard-eufy-title">
299
+ <h3 id="wizard-eufy-title" data-i18n="wizardEufySettings"></h3>
300
+ <p class="preference-note" data-i18n="wizardEufyHelp"></p>
301
+ <div class="preference-grid" data-wizard-settings></div>
302
+ </section>
303
+ <div class="wizard-nav">
304
+ <button type="button" data-wizard-finish></button>
305
+ </div>
306
+ </section>
170
307
  </section>
171
308
 
172
309
  <section class="dashboard-panel diagnostics-panel" data-diagnostics hidden aria-labelledby="diagnostics-title">
@@ -186,121 +323,87 @@
186
323
  </div>
187
324
  </div>
188
325
  <div class="diagnostics-stage">
189
- <div class="diagnostics-wizard diagnostics-surface" data-diagnostics-wizard aria-live="polite">
326
+ <div class="diagnostics-wizard diagnostics-surface" data-diagnostics-wizard>
190
327
  <div class="diagnostics-question" data-diagnostics-question>
191
- <strong
328
+ <h3
192
329
  id="diagnostics-question-heading"
193
330
  tabindex="-1"
194
331
  data-diagnostics-question-text
195
332
  data-i18n="diagnosticsTilesHeading"
196
- ></strong>
333
+ ></h3>
334
+ <p class="diagnostics-note" data-i18n="diagnosticsPrivacy"></p>
197
335
  <div class="diagnostics-tiles" role="group" aria-labelledby="diagnostics-question-heading">
198
- <button type="button" data-diagnostics-tile="startup-authentication" data-i18n="diagnosticsProfileStartup"></button>
199
- <button type="button" data-diagnostics-tile="device-representation" data-i18n="diagnosticsProfileDevices"></button>
200
- <button type="button" data-diagnostics-tile="control-state" data-i18n="diagnosticsProfileControl"></button>
201
- <button type="button" data-diagnostics-tile="live-media" data-i18n="diagnosticsProfileLiveMedia"></button>
202
- <button type="button" data-diagnostics-tile="hksv-recording" data-i18n="diagnosticsProfileRecording"></button>
203
- <button type="button" data-diagnostics-tile="dashboard-ui" data-i18n="diagnosticsProfileDashboard"></button>
204
- <button type="button" data-diagnostics-tile="other" data-i18n="diagnosticsProfileOther"></button>
336
+ <button type="button" data-diagnostics-tile="startup-authentication">
337
+ <span data-i18n="diagnosticsProfileStartup"></span>
338
+ <small data-i18n="diagnosticsStartupSummary"></small>
339
+ </button>
340
+ <button type="button" data-diagnostics-tile="device-representation">
341
+ <span data-i18n="diagnosticsProfileDevices"></span>
342
+ <small data-i18n="diagnosticsDevicesSummary"></small>
343
+ </button>
344
+ <button type="button" data-diagnostics-tile="control-state">
345
+ <span data-i18n="diagnosticsProfileControl"></span>
346
+ <small data-i18n="diagnosticsControlSummary"></small>
347
+ </button>
348
+ <button type="button" data-diagnostics-tile="live-media">
349
+ <span data-i18n="diagnosticsProfileLiveMedia"></span>
350
+ <small data-i18n="diagnosticsLiveSummary"></small>
351
+ </button>
352
+ <button type="button" data-diagnostics-tile="hksv-recording">
353
+ <span data-i18n="diagnosticsProfileRecording"></span>
354
+ <small data-i18n="diagnosticsRecordingSummary"></small>
355
+ </button>
356
+ <button type="button" data-diagnostics-tile="dashboard-ui">
357
+ <span data-i18n="diagnosticsProfileDashboard"></span>
358
+ <small data-i18n="diagnosticsDashboardSummary"></small>
359
+ </button>
360
+ <button type="button" data-diagnostics-tile="other">
361
+ <span data-i18n="diagnosticsProfileOther"></span>
362
+ <small data-i18n="diagnosticsOtherSummary"></small>
363
+ </button>
205
364
  </div>
206
365
  </div>
207
- <div class="diagnostics-devices" data-diagnostics-devices hidden>
208
- <strong id="diagnostics-devices-heading" tabindex="-1" data-i18n="diagnosticsDevicesHeading"></strong>
209
- <p data-i18n="diagnosticsDevicesHint"></p>
210
- <div class="diagnostics-device-list" data-diagnostics-device-list role="group" aria-labelledby="diagnostics-devices-heading"></div>
211
- <div class="diagnostics-choice-actions">
212
- <button
213
- type="button"
214
- class="diagnostics-secondary-action"
215
- data-diagnostics-devices-every
216
- data-i18n="diagnosticsDevicesEvery"
217
- ></button>
218
- <button type="button" data-diagnostics-devices-chosen disabled data-i18n="diagnosticsDevicesChosen"></button>
219
- </div>
220
- </div>
221
- <div class="diagnostics-frequency" data-diagnostics-frequency hidden>
222
- <strong
223
- id="diagnostics-frequency-heading"
224
- tabindex="-1"
225
- data-i18n="diagnosticsQuestionReproduceNow"
226
- ></strong>
227
- <div class="diagnostics-choice-actions" role="group" aria-labelledby="diagnostics-frequency-heading">
228
- <button
229
- type="button"
230
- class="diagnostics-secondary-action"
231
- data-diagnostics-frequency-answer="intermittent"
232
- data-i18n="diagnosticsNo"
233
- ></button>
234
- <button type="button" data-diagnostics-frequency-answer="now" data-i18n="diagnosticsYes"></button>
235
- </div>
236
- <button
237
- type="button"
238
- class="diagnostics-quiet-action"
239
- data-diagnostics-frequency-back
240
- data-i18n="diagnosticsFrequencyBack"
241
- ></button>
242
- </div>
243
- <div class="diagnostics-match" data-diagnostics-match hidden>
244
- <p class="eyebrow" data-i18n="diagnosticsBestMatch"></p>
245
- <strong id="diagnostics-match-heading" tabindex="-1" data-diagnostics-guidance-title></strong>
246
- <p data-diagnostics-mode-summary></p>
247
- <div class="diagnostics-choice-actions" role="group" aria-labelledby="diagnostics-match-heading">
248
- <button
249
- type="button"
250
- class="diagnostics-secondary-action"
251
- data-diagnostics-reject
252
- data-i18n="diagnosticsChangeAnswers"
253
- ></button>
254
- <button type="button" data-diagnostics-authorize data-i18n="diagnosticsContinue"></button>
255
- </div>
256
- <p class="diagnostics-privacy" data-i18n="diagnosticsPrivacy"></p>
257
- </div>
258
366
  </div>
259
- <div class="diagnostics-guidance diagnostics-surface" data-diagnostics-guidance tabindex="-1" hidden>
260
- <strong data-diagnostics-phase-title></strong>
261
- <div data-diagnostics-guidance-before-section>
262
- <span class="guidance-label" data-i18n="diagnosticsBeforeLabel"></span>
263
- <p data-diagnostics-guidance-before></p>
264
- </div>
367
+ <div class="diagnostics-guidance diagnostics-surface" data-diagnostics-guidance hidden>
368
+ <h3 tabindex="-1" data-diagnostics-phase-title></h3>
265
369
  <div>
266
370
  <span class="guidance-label" data-i18n="diagnosticsActionLabel"></span>
267
371
  <p data-diagnostics-guidance-action></p>
268
372
  </div>
269
373
  <div class="diagnostics-actions" data-diagnostics-actions hidden>
270
- <button
271
- type="button"
272
- data-diagnostics-reproduction
273
- disabled
274
- data-i18n="diagnosticsStartRecording"
275
- ></button>
374
+ <button type="button" data-diagnostics-reproduction disabled data-i18n="diagnosticsNowFinish"></button>
375
+ <button type="button" class="diagnostics-quiet-action" data-diagnostics-cancel data-i18n="diagnosticsCancel"></button>
276
376
  </div>
377
+ <p class="diagnostics-note" data-diagnostics-capture-note></p>
277
378
  </div>
278
- <div class="diagnostics-result diagnostics-surface" data-diagnostics-result hidden>
279
- <strong tabindex="-1" data-diagnostics-result-heading data-i18n="diagnosticsEvidenceReady"></strong>
280
- <p data-i18n="diagnosticsArchiveReviewIntro"></p>
281
- <div class="diagnostics-manifest" data-diagnostics-manifest hidden></div>
282
- <label class="diagnostics-review-confirm" data-diagnostics-review-confirm-label hidden>
283
- <input type="checkbox" data-diagnostics-review-confirm />
284
- <span data-i18n="diagnosticsArchiveReviewConfirm"></span>
285
- </label>
286
- <p class="diagnostics-local-note" data-i18n="diagnosticsStaysLocal"></p>
379
+ <dialog class="blocking-dialog diagnostics-result" data-diagnostics-result aria-labelledby="diagnostics-result-heading">
380
+ <h2 id="diagnostics-result-heading" tabindex="-1" data-diagnostics-result-heading data-i18n="diagnosticsEvidenceReady"></h2>
381
+ <p data-diagnostics-handoff-note hidden></p>
287
382
  <button type="button" data-diagnostics-export disabled hidden data-i18n="diagnosticsArchiveExport"></button>
288
- <a
289
- data-diagnostics-issue
383
+ <div class="diagnostics-handoff" data-diagnostics-handoff hidden>
384
+ <a data-diagnostics-issue target="_blank" rel="noopener noreferrer" data-i18n="diagnosticsOpenIssue"></a>
385
+ <a
386
+ data-diagnostics-existing-issue
387
+ target="_blank"
388
+ rel="noopener noreferrer"
389
+ data-i18n="diagnosticsExistingIssue"
390
+ ></a>
391
+ </div>
392
+ <button
393
+ type="button"
394
+ class="diagnostics-quiet-action"
395
+ data-diagnostics-download-again
290
396
  hidden
291
- target="_blank"
292
- rel="noopener noreferrer"
293
- aria-describedby="diagnostics-issue-hint"
294
- data-i18n="diagnosticsOpenIssue"
295
- ></a>
296
- <p class="diagnostics-step-hint" id="diagnostics-issue-hint" data-diagnostics-issue-hint></p>
397
+ data-i18n="diagnosticsDownloadAgain"
398
+ ></button>
297
399
  <button
298
400
  type="button"
299
- class="diagnostics-secondary-action"
401
+ class="diagnostics-quiet-action"
300
402
  data-diagnostics-start-another
301
403
  data-i18n="diagnosticsStartAnother"
302
404
  ></button>
303
- </div>
405
+ <p class="diagnostics-status" role="status" aria-live="polite" data-diagnostics-result-status></p>
406
+ </dialog>
304
407
  <p class="diagnostics-status" role="status" aria-live="polite" data-diagnostics-status></p>
305
408
  </div>
306
409
  </section>
@@ -339,7 +442,7 @@
339
442
  <div class="field-row">
340
443
  <label>
341
444
  <span data-i18n="countryLabel"></span>
342
- <input type="text" inputmode="text" maxlength="2" required data-country />
445
+ <input type="text" inputmode="text" maxlength="2" pattern="[A-Za-z]{2}" required data-country />
343
446
  </label>
344
447
  <label>
345
448
  <span data-i18n="trustedDeviceLabel"></span>
@@ -361,9 +464,34 @@
361
464
  </section>
362
465
 
363
466
  <p class="footnote" data-i18n="footnote"></p>
467
+
468
+ <dialog class="blocking-dialog" data-reauth-dialog aria-labelledby="reauth-title" aria-describedby="reauth-summary">
469
+ <h2 id="reauth-title" data-i18n="reauthTitle"></h2>
470
+ <p id="reauth-summary" data-i18n="reauthSummary"></p>
471
+ <button type="button" data-reauth-action data-i18n="reauthAction"></button>
472
+ </dialog>
473
+
474
+ <dialog
475
+ class="blocking-dialog"
476
+ closedby="any"
477
+ data-attention-dialog
478
+ aria-labelledby="attention-title"
479
+ aria-describedby="attention-summary"
480
+ >
481
+ <h2 id="attention-title" data-attention-title></h2>
482
+ <p id="attention-summary" data-attention-summary></p>
483
+ <p class="diagnostics-note" data-i18n="diagnosticsPrivacy"></p>
484
+ <div class="diagnostics-choice-actions">
485
+ <button
486
+ type="button"
487
+ class="diagnostics-secondary-action"
488
+ data-attention-choose
489
+ data-i18n="attentionChooseAnother"
490
+ ></button>
491
+ <button type="button" data-attention-diagnose data-i18n="attentionDiagnose"></button>
492
+ </div>
493
+ </dialog>
364
494
  </main>
365
495
 
366
496
  <script src="js/dashboard.js"></script>
367
- <script src="js/legacy-settings.js"></script>
368
- <script src="js/profile-wizard.js"></script>
369
497
  <script src="js/app.js"></script>