"#)
}
+/// The dashboard login's badge, reproduced square-for-square: the same 20
+/// white rects AnimatedLogo.vue draws, with the same 100ms stagger, inside
+/// the same gradient ring. Inline rather than an `` because the shipped
+/// `favico-black-v2.svg` bakes its own ring into the artwork — wrapping it in
+/// the CSS ring drew a ring inside a ring, which is not what /login shows.
+/// (x, y, width, height) as they appear in AnimatedLogo.vue.
+const LOGO_RECTS: [(f32, f32, f32, f32); 20] = [
+ (357.614, 318.0, 71.007, 70.936),
+ (436.152, 318.0, 72.082, 70.936),
+ (515.766, 318.0, 72.082, 70.936),
+ (595.379, 318.0, 71.007, 70.936),
+ (595.379, 396.46, 71.007, 72.011),
+ (673.917, 396.46, 72.083, 72.011),
+ (278.0, 475.994, 72.083, 72.012),
+ (357.614, 475.994, 71.007, 72.012),
+ (436.152, 475.994, 72.082, 72.012),
+ (515.766, 475.994, 72.082, 72.012),
+ (595.379, 475.994, 71.007, 72.012),
+ (673.917, 475.994, 72.083, 72.012),
+ (278.0, 555.529, 72.083, 70.936),
+ (357.614, 555.529, 71.007, 70.936),
+ (595.379, 555.529, 71.007, 70.936),
+ (673.917, 555.529, 72.083, 70.936),
+ (357.614, 633.989, 71.007, 72.011),
+ (436.152, 633.989, 72.082, 72.011),
+ (515.766, 633.989, 72.082, 72.011),
+ (595.379, 633.989, 71.007, 72.011),
+];
+
+fn logo_markup() -> String {
+ let rects: String = LOGO_RECTS
+ .iter()
+ .enumerate()
+ .map(|(i, (x, y, w, h))| {
+ format!(
+ r#""#,
+ delay = i * 100,
+ )
+ })
+ .collect();
+ format!(
+ r##""##
+ )
+}
+
+/// The main login's in-button spinner, verbatim from Login.vue.
+const SPINNER_SVG: &str = r#""#;
+
+/// Submit feedback: flip the pressed button into its loading face and stop a
+/// second press, exactly as /login does. This is the only script on the page,
+/// and the CSP admits it by hash — not `'unsafe-inline'` — so an injected
+/// `