Spaces:
Sleeping
Sleeping
Commit ·
7dd0d81
1
Parent(s): f9393f8
Revert to the bar-graph logo
Browse filesThe Dome/Clarity mark didn't land well in practice — reverting App.jsx,
AuthView, OnboardingView, HowItWorksView, ProfileView's empty state,
favicon.svg, generate-icons.html, and the extension icon PNGs to their
pre-dome-mark state, and removing the now-unused Logo.jsx.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- frontend/generate-icons.html +67 -50
- frontend/public/favicon.svg +16 -18
- frontend/public/icons/icon128.png +0 -0
- frontend/public/icons/icon16.png +0 -0
- frontend/public/icons/icon48.png +0 -0
- frontend/src/App.jsx +23 -2
- frontend/src/components/AuthView.jsx +18 -4
- frontend/src/components/HowItWorksView.jsx +18 -2
- frontend/src/components/Logo.jsx +0 -63
- frontend/src/components/OnboardingView.jsx +24 -2
- frontend/src/components/ProfileView.jsx +18 -2
frontend/generate-icons.html
CHANGED
|
@@ -73,68 +73,85 @@
|
|
| 73 |
ctx.closePath()
|
| 74 |
}
|
| 75 |
|
| 76 |
-
// Mirror.'s "Dome / Clarity" mark — see docs/Mirror_Canonical_Vision.md and
|
| 77 |
-
// frontend/src/components/Logo.jsx (the in-app source of truth this canvas
|
| 78 |
-
// version is kept in sync with by hand, since it has no build-time access
|
| 79 |
-
// to the React component). Dark rounded-square background, 7 individually
|
| 80 |
-
// placed gray dashes tracing the ghost dome's arc (exact coordinates in a
|
| 81 |
-
// 0-100 space, mirrored around the crown — matches Logo.jsx's DASH_COORDS
|
| 82 |
-
// exactly, not approximated via a dash pattern), a mirror line with a real
|
| 83 |
-
// gap on both sides, and a solid dome below glowing brighter at its center
|
| 84 |
-
// and deepening toward its edges (radial gradient).
|
| 85 |
-
const DASH_COORDS = [
|
| 86 |
-
[24.30, 38.39, 26.45, 33.21],
|
| 87 |
-
[29.17, 29.13, 33.13, 25.17],
|
| 88 |
-
[37.21, 22.45, 42.39, 20.30],
|
| 89 |
-
[47.20, 19.35, 52.80, 19.35],
|
| 90 |
-
[57.61, 20.30, 62.79, 22.45],
|
| 91 |
-
[66.87, 25.17, 70.83, 29.13],
|
| 92 |
-
[73.55, 33.21, 75.70, 38.39],
|
| 93 |
-
]
|
| 94 |
-
|
| 95 |
function drawIcon(size) {
|
| 96 |
const canvas = document.createElement('canvas')
|
| 97 |
canvas.width = size
|
| 98 |
canvas.height = size
|
| 99 |
const ctx = canvas.getContext('2d')
|
| 100 |
-
const s = size / 100 // scale factor: DASH_COORDS etc. are in 0-100 space
|
| 101 |
|
| 102 |
-
// Rounded background
|
| 103 |
-
const r = size * 0.
|
| 104 |
ctx.fillStyle = '#0f1117'
|
| 105 |
roundedRect(ctx, 0, 0, size, size, r)
|
| 106 |
ctx.fill()
|
| 107 |
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
ctx.lineCap = 'round'
|
| 112 |
-
DASH_COORDS.forEach(([x1, y1, x2, y2]) => {
|
| 113 |
-
ctx.beginPath()
|
| 114 |
-
ctx.moveTo(x1 * s, y1 * s)
|
| 115 |
-
ctx.lineTo(x2 * s, y2 * s)
|
| 116 |
-
ctx.stroke()
|
| 117 |
-
})
|
| 118 |
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
|
|
|
|
| 138 |
return canvas
|
| 139 |
}
|
| 140 |
|
|
|
|
| 73 |
ctx.closePath()
|
| 74 |
}
|
| 75 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
function drawIcon(size) {
|
| 77 |
const canvas = document.createElement('canvas')
|
| 78 |
canvas.width = size
|
| 79 |
canvas.height = size
|
| 80 |
const ctx = canvas.getContext('2d')
|
|
|
|
| 81 |
|
| 82 |
+
// Rounded background
|
| 83 |
+
const r = size * 0.18
|
| 84 |
ctx.fillStyle = '#0f1117'
|
| 85 |
roundedRect(ctx, 0, 0, size, size, r)
|
| 86 |
ctx.fill()
|
| 87 |
|
| 88 |
+
const grad = ctx.createLinearGradient(0, 0, size, 0)
|
| 89 |
+
grad.addColorStop(0, '#1d4ed8')
|
| 90 |
+
grad.addColorStop(1, '#0891b2')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
|
| 92 |
+
function bar(x, y, w, h, br, alpha) {
|
| 93 |
+
ctx.globalAlpha = alpha
|
| 94 |
+
ctx.fillStyle = grad
|
| 95 |
+
roundedRect(ctx, x, y, w, h, br)
|
| 96 |
+
ctx.fill()
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
if (size === 16) {
|
| 100 |
+
// Simplified 3-bar design — bold and crisp at tiny size
|
| 101 |
+
const mid = size / 2 // 8
|
| 102 |
+
// bar positions: left, center, right
|
| 103 |
+
// top bars
|
| 104 |
+
bar(2, 5, 2, 3, 1, 0.55) // left short
|
| 105 |
+
bar(7, 2, 2, 6, 1, 1.00) // center tall
|
| 106 |
+
bar(12, 5, 2, 3, 1, 0.55) // right short
|
| 107 |
+
// mirror line
|
| 108 |
+
ctx.globalAlpha = 1
|
| 109 |
+
ctx.strokeStyle = '#2a3050'
|
| 110 |
+
ctx.lineWidth = 1
|
| 111 |
+
ctx.beginPath(); ctx.moveTo(0, mid); ctx.lineTo(size, mid); ctx.stroke()
|
| 112 |
+
// reflection bars
|
| 113 |
+
bar(2, 9, 2, 3, 1, 0.22)
|
| 114 |
+
bar(7, 9, 2, 5, 1, 0.38)
|
| 115 |
+
bar(12, 9, 2, 3, 1, 0.22)
|
| 116 |
+
|
| 117 |
+
} else if (size === 48) {
|
| 118 |
+
// 5-bar design on a 48×48 grid — balanced
|
| 119 |
+
const mid = 24
|
| 120 |
+
bar(4, 18, 6, 6, 3, 0.40)
|
| 121 |
+
bar(12, 12, 6, 12, 3, 0.65)
|
| 122 |
+
bar(21, 6, 6, 18, 3, 1.00)
|
| 123 |
+
bar(30, 12, 6, 12, 3, 0.65)
|
| 124 |
+
bar(38, 18, 6, 6, 3, 0.40)
|
| 125 |
+
ctx.globalAlpha = 1
|
| 126 |
+
ctx.strokeStyle = '#2a3050'
|
| 127 |
+
ctx.lineWidth = 1.5
|
| 128 |
+
ctx.beginPath(); ctx.moveTo(0, mid); ctx.lineTo(size, mid); ctx.stroke()
|
| 129 |
+
bar(4, 25, 6, 6, 3, 0.18)
|
| 130 |
+
bar(12, 25, 6, 11, 3, 0.30)
|
| 131 |
+
bar(21, 25, 6, 17, 3, 0.38)
|
| 132 |
+
bar(30, 25, 6, 11, 3, 0.30)
|
| 133 |
+
bar(38, 25, 6, 6, 3, 0.18)
|
| 134 |
+
|
| 135 |
+
} else {
|
| 136 |
+
// 128px — full detailed design on 128×128 grid
|
| 137 |
+
const mid = 64
|
| 138 |
+
bar(8, 48, 16, 16, 8, 0.40)
|
| 139 |
+
bar(30, 32, 16, 32, 8, 0.65)
|
| 140 |
+
bar(56, 12, 16, 52, 8, 1.00)
|
| 141 |
+
bar(82, 32, 16, 32, 8, 0.65)
|
| 142 |
+
bar(104,48, 16, 16, 8, 0.40)
|
| 143 |
+
ctx.globalAlpha = 1
|
| 144 |
+
ctx.strokeStyle = '#2a3050'
|
| 145 |
+
ctx.lineWidth = 2
|
| 146 |
+
ctx.beginPath(); ctx.moveTo(0, mid); ctx.lineTo(size, mid); ctx.stroke()
|
| 147 |
+
bar(8, 66, 16, 16, 8, 0.18)
|
| 148 |
+
bar(30, 66, 16, 30, 8, 0.30)
|
| 149 |
+
bar(56, 66, 16, 50, 8, 0.38)
|
| 150 |
+
bar(82, 66, 16, 30, 8, 0.30)
|
| 151 |
+
bar(104,66, 16, 16, 8, 0.18)
|
| 152 |
+
}
|
| 153 |
|
| 154 |
+
ctx.globalAlpha = 1
|
| 155 |
return canvas
|
| 156 |
}
|
| 157 |
|
frontend/public/favicon.svg
CHANGED
|
|
|
|
frontend/public/icons/icon128.png
CHANGED
|
|
|
|
frontend/public/icons/icon16.png
CHANGED
|
|
|
|
frontend/public/icons/icon48.png
CHANGED
|
|
|
|
frontend/src/App.jsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
| 1 |
import { useState, useEffect } from "react"
|
| 2 |
import { supabase } from "./lib/supabase"
|
| 3 |
import api from "./lib/api"
|
| 4 |
-
import { LogoLockup } from "./components/Logo"
|
| 5 |
import AuthView from "./components/AuthView"
|
| 6 |
import OnboardingView from "./components/OnboardingView"
|
| 7 |
import ResultsView from "./components/ResultsView"
|
|
@@ -150,7 +149,29 @@ export default function App() {
|
|
| 150 |
{/* Header */}
|
| 151 |
<div style={{ marginBottom: 28, display: "flex",
|
| 152 |
justifyContent: "space-between", alignItems: "flex-start" }}>
|
| 153 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
|
| 155 |
<div style={{ display: "flex", alignItems: "center", gap: 8 }}>
|
| 156 |
{/* Open as full page — only in side panel */}
|
|
|
|
| 1 |
import { useState, useEffect } from "react"
|
| 2 |
import { supabase } from "./lib/supabase"
|
| 3 |
import api from "./lib/api"
|
|
|
|
| 4 |
import AuthView from "./components/AuthView"
|
| 5 |
import OnboardingView from "./components/OnboardingView"
|
| 6 |
import ResultsView from "./components/ResultsView"
|
|
|
|
| 149 |
{/* Header */}
|
| 150 |
<div style={{ marginBottom: 28, display: "flex",
|
| 151 |
justifyContent: "space-between", alignItems: "flex-start" }}>
|
| 152 |
+
<div style={{ display: "flex", alignItems: "center", gap: 10 }}>
|
| 153 |
+
<svg width="26" height="26" viewBox="0 0 32 32" fill="none">
|
| 154 |
+
<defs>
|
| 155 |
+
<linearGradient id="hdr-g" x1="0" y1="0" x2="32" y2="0" gradientUnits="userSpaceOnUse">
|
| 156 |
+
<stop stopColor="#1d4ed8"/><stop offset="1" stopColor="#0891b2"/>
|
| 157 |
+
</linearGradient>
|
| 158 |
+
</defs>
|
| 159 |
+
<rect x="2" y="12" width="4" height="4" rx="2" fill="url(#hdr-g)" opacity=".4"/>
|
| 160 |
+
<rect x="8" y="8" width="4" height="8" rx="2" fill="url(#hdr-g)" opacity=".65"/>
|
| 161 |
+
<rect x="14" y="4" width="4" height="12" rx="2" fill="url(#hdr-g)"/>
|
| 162 |
+
<rect x="20" y="8" width="4" height="8" rx="2" fill="url(#hdr-g)" opacity=".65"/>
|
| 163 |
+
<rect x="26" y="12" width="4" height="4" rx="2" fill="url(#hdr-g)" opacity=".4"/>
|
| 164 |
+
<line x1="0" y1="17.5" x2="32" y2="17.5" stroke="#1e2438" strokeWidth="1"/>
|
| 165 |
+
<rect x="2" y="18" width="4" height="4" rx="2" fill="url(#hdr-g)" opacity=".18"/>
|
| 166 |
+
<rect x="8" y="18" width="4" height="8" rx="2" fill="url(#hdr-g)" opacity=".3"/>
|
| 167 |
+
<rect x="14" y="18" width="4" height="12" rx="2" fill="url(#hdr-g)" opacity=".38"/>
|
| 168 |
+
<rect x="20" y="18" width="4" height="8" rx="2" fill="url(#hdr-g)" opacity=".3"/>
|
| 169 |
+
<rect x="26" y="18" width="4" height="4" rx="2" fill="url(#hdr-g)" opacity=".18"/>
|
| 170 |
+
</svg>
|
| 171 |
+
<h1 style={{ fontSize: 22, fontWeight: 700, margin: 0, letterSpacing: "-0.3px", color: "#f0eeff" }}>
|
| 172 |
+
mirror<span style={{ color: "#1d4ed8" }}>.</span>
|
| 173 |
+
</h1>
|
| 174 |
+
</div>
|
| 175 |
|
| 176 |
<div style={{ display: "flex", alignItems: "center", gap: 8 }}>
|
| 177 |
{/* Open as full page — only in side panel */}
|
frontend/src/components/AuthView.jsx
CHANGED
|
@@ -1,6 +1,5 @@
|
|
| 1 |
import { useState, useRef } from "react"
|
| 2 |
import { supabase } from "../lib/supabase"
|
| 3 |
-
import { DomeMark } from "./Logo"
|
| 4 |
|
| 5 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 6 |
|
|
@@ -131,9 +130,24 @@ export default function AuthView({ onAuth }) {
|
|
| 131 |
|
| 132 |
{/* Logo */}
|
| 133 |
<div style={{ textAlign: "center", marginBottom: 36 }}>
|
| 134 |
-
<
|
| 135 |
-
<
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
<h1 style={{ fontSize: 24, fontWeight: 700, margin: "0 0 6px",
|
| 138 |
letterSpacing: "-0.5px", color: "#f0eeff" }}>
|
| 139 |
mirror<span style={{ color: "#1d4ed8" }}>.</span>
|
|
|
|
| 1 |
import { useState, useRef } from "react"
|
| 2 |
import { supabase } from "../lib/supabase"
|
|
|
|
| 3 |
|
| 4 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 5 |
|
|
|
|
| 130 |
|
| 131 |
{/* Logo */}
|
| 132 |
<div style={{ textAlign: "center", marginBottom: 36 }}>
|
| 133 |
+
<svg width="48" height="48" viewBox="0 0 52 52" fill="none" style={{ marginBottom: 14 }}>
|
| 134 |
+
<defs>
|
| 135 |
+
<linearGradient id="auth-g" x1="0" y1="0" x2="52" y2="0" gradientUnits="userSpaceOnUse">
|
| 136 |
+
<stop stopColor="#1d4ed8"/><stop offset="1" stopColor="#0891b2"/>
|
| 137 |
+
</linearGradient>
|
| 138 |
+
</defs>
|
| 139 |
+
<rect x="2" y="20" width="6" height="6" rx="3" fill="url(#auth-g)" opacity=".35"/>
|
| 140 |
+
<rect x="11" y="13" width="6" height="13" rx="3" fill="url(#auth-g)" opacity=".6"/>
|
| 141 |
+
<rect x="20" y="6" width="8" height="20" rx="4" fill="url(#auth-g)"/>
|
| 142 |
+
<rect x="31" y="13" width="6" height="13" rx="3" fill="url(#auth-g)" opacity=".6"/>
|
| 143 |
+
<rect x="40" y="20" width="6" height="6" rx="3" fill="url(#auth-g)" opacity=".35"/>
|
| 144 |
+
<line x1="0" y1="28" x2="52" y2="28" stroke="#1e2438" strokeWidth="1.25"/>
|
| 145 |
+
<rect x="2" y="29" width="6" height="6" rx="3" fill="url(#auth-g)" opacity=".15"/>
|
| 146 |
+
<rect x="11" y="29" width="6" height="13" rx="3" fill="url(#auth-g)" opacity=".27"/>
|
| 147 |
+
<rect x="20" y="29" width="8" height="20" rx="4" fill="url(#auth-g)" opacity=".33"/>
|
| 148 |
+
<rect x="31" y="29" width="6" height="13" rx="3" fill="url(#auth-g)" opacity=".27"/>
|
| 149 |
+
<rect x="40" y="29" width="6" height="6" rx="3" fill="url(#auth-g)" opacity=".15"/>
|
| 150 |
+
</svg>
|
| 151 |
<h1 style={{ fontSize: 24, fontWeight: 700, margin: "0 0 6px",
|
| 152 |
letterSpacing: "-0.5px", color: "#f0eeff" }}>
|
| 153 |
mirror<span style={{ color: "#1d4ed8" }}>.</span>
|
frontend/src/components/HowItWorksView.jsx
CHANGED
|
@@ -1,5 +1,4 @@
|
|
| 1 |
import Reveal, { RevealItem } from "./Reveal"
|
| 2 |
-
import { DomeMark } from "./Logo"
|
| 3 |
|
| 4 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 5 |
|
|
@@ -98,7 +97,24 @@ export default function HowItWorksView({ onBack }) {
|
|
| 98 |
<Reveal>
|
| 99 |
<div style={{ textAlign: "center", marginBottom: 72 }}>
|
| 100 |
<div style={{ display: "flex", justifyContent: "center", marginBottom: 20 }}>
|
| 101 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
</div>
|
| 103 |
<h1 style={{ fontSize: 30, fontWeight: 800, margin: "0 0 6px",
|
| 104 |
letterSpacing: "-0.7px", lineHeight: 1.2, color: "#f0eeff" }}>
|
|
|
|
| 1 |
import Reveal, { RevealItem } from "./Reveal"
|
|
|
|
| 2 |
|
| 3 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 4 |
|
|
|
|
| 97 |
<Reveal>
|
| 98 |
<div style={{ textAlign: "center", marginBottom: 72 }}>
|
| 99 |
<div style={{ display: "flex", justifyContent: "center", marginBottom: 20 }}>
|
| 100 |
+
<svg width="52" height="52" viewBox="0 0 52 52" fill="none">
|
| 101 |
+
<defs>
|
| 102 |
+
<linearGradient id="hiw-g" x1="0" y1="0" x2="52" y2="0" gradientUnits="userSpaceOnUse">
|
| 103 |
+
<stop stopColor="#1d4ed8"/><stop offset="1" stopColor="#0891b2"/>
|
| 104 |
+
</linearGradient>
|
| 105 |
+
</defs>
|
| 106 |
+
<rect x="2" y="20" width="6" height="6" rx="3" fill="url(#hiw-g)" opacity=".35"/>
|
| 107 |
+
<rect x="11" y="13" width="6" height="13" rx="3" fill="url(#hiw-g)" opacity=".6"/>
|
| 108 |
+
<rect x="20" y="6" width="8" height="20" rx="4" fill="url(#hiw-g)"/>
|
| 109 |
+
<rect x="31" y="13" width="6" height="13" rx="3" fill="url(#hiw-g)" opacity=".6"/>
|
| 110 |
+
<rect x="40" y="20" width="6" height="6" rx="3" fill="url(#hiw-g)" opacity=".35"/>
|
| 111 |
+
<line x1="0" y1="28" x2="52" y2="28" stroke="#1e2438" strokeWidth="1.25"/>
|
| 112 |
+
<rect x="2" y="29" width="6" height="6" rx="3" fill="url(#hiw-g)" opacity=".15"/>
|
| 113 |
+
<rect x="11" y="29" width="6" height="13" rx="3" fill="url(#hiw-g)" opacity=".27"/>
|
| 114 |
+
<rect x="20" y="29" width="8" height="20" rx="4" fill="url(#hiw-g)" opacity=".33"/>
|
| 115 |
+
<rect x="31" y="29" width="6" height="13" rx="3" fill="url(#hiw-g)" opacity=".27"/>
|
| 116 |
+
<rect x="40" y="29" width="6" height="6" rx="3" fill="url(#hiw-g)" opacity=".15"/>
|
| 117 |
+
</svg>
|
| 118 |
</div>
|
| 119 |
<h1 style={{ fontSize: 30, fontWeight: 800, margin: "0 0 6px",
|
| 120 |
letterSpacing: "-0.7px", lineHeight: 1.2, color: "#f0eeff" }}>
|
frontend/src/components/Logo.jsx
DELETED
|
@@ -1,63 +0,0 @@
|
|
| 1 |
-
import { useId } from "react"
|
| 2 |
-
|
| 3 |
-
// Mirror.'s "Dome / Clarity" mark — single source of truth. Meaning, per
|
| 4 |
-
// docs/Mirror_Canonical_Vision.md: you can't quite see yourself directly (the
|
| 5 |
-
// faint, dashed dome above the line), but the reflection brings you into
|
| 6 |
-
// focus (the solid, complete dome below, glowing brighter at its center and
|
| 7 |
-
// deepening toward its edges). Every in-app usage should import from here
|
| 8 |
-
// rather than duplicating SVG — that drift is exactly what the old bar-graph
|
| 9 |
-
// logo suffered (5 independently hand-maintained copies).
|
| 10 |
-
//
|
| 11 |
-
// The 7 dash coordinates below are exact, individually computed points at
|
| 12 |
-
// 22.5° increments around the ghost dome's arc (radius 26.8, center 50,46),
|
| 13 |
-
// mirrored around the crown — deliberately not a stroke-dasharray, which
|
| 14 |
-
// can't guarantee true bilateral symmetry.
|
| 15 |
-
const DASH_COORDS = [
|
| 16 |
-
[24.30, 38.39, 26.45, 33.21],
|
| 17 |
-
[29.17, 29.13, 33.13, 25.17],
|
| 18 |
-
[37.21, 22.45, 42.39, 20.30],
|
| 19 |
-
[47.20, 19.35, 52.80, 19.35],
|
| 20 |
-
[57.61, 20.30, 62.79, 22.45],
|
| 21 |
-
[66.87, 25.17, 70.83, 29.13],
|
| 22 |
-
[73.55, 33.21, 75.70, 38.39],
|
| 23 |
-
]
|
| 24 |
-
|
| 25 |
-
export function DomeMark({
|
| 26 |
-
size = 48,
|
| 27 |
-
dashColor = "#6b6888",
|
| 28 |
-
lineColor = "#8b89aa",
|
| 29 |
-
domeBright = "#a5b4fc",
|
| 30 |
-
domeMid = "#1d4ed8",
|
| 31 |
-
domeDeep = "#1e3a8a",
|
| 32 |
-
}) {
|
| 33 |
-
const gradientId = useId()
|
| 34 |
-
return (
|
| 35 |
-
<svg width={size} height={size} viewBox="0 0 100 100" fill="none">
|
| 36 |
-
<defs>
|
| 37 |
-
<radialGradient id={gradientId} cx="50" cy="54" r="27" gradientUnits="userSpaceOnUse">
|
| 38 |
-
<stop offset="0%" stopColor={domeBright} />
|
| 39 |
-
<stop offset="55%" stopColor={domeMid} />
|
| 40 |
-
<stop offset="100%" stopColor={domeDeep} />
|
| 41 |
-
</radialGradient>
|
| 42 |
-
</defs>
|
| 43 |
-
<g stroke={dashColor} strokeWidth="4.2" strokeLinecap="round">
|
| 44 |
-
{DASH_COORDS.map(([x1, y1, x2, y2], i) => (
|
| 45 |
-
<line key={i} x1={x1} y1={y1} x2={x2} y2={y2} />
|
| 46 |
-
))}
|
| 47 |
-
</g>
|
| 48 |
-
<line x1="10" y1="50" x2="90" y2="50" stroke={lineColor} strokeWidth="3.2" />
|
| 49 |
-
<path d="M 23 54 A 27 27 0 0 0 77 54 Z" fill={`url(#${gradientId})`} />
|
| 50 |
-
</svg>
|
| 51 |
-
)
|
| 52 |
-
}
|
| 53 |
-
|
| 54 |
-
export function LogoLockup({ markSize = 26, fontSize = 22, gap = 10 }) {
|
| 55 |
-
return (
|
| 56 |
-
<div style={{ display: "flex", alignItems: "center", gap }}>
|
| 57 |
-
<DomeMark size={markSize} />
|
| 58 |
-
<h1 style={{ fontSize, fontWeight: 700, margin: 0, letterSpacing: "-0.3px", color: "#f0eeff" }}>
|
| 59 |
-
mirror<span style={{ color: "#1d4ed8" }}>.</span>
|
| 60 |
-
</h1>
|
| 61 |
-
</div>
|
| 62 |
-
)
|
| 63 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
frontend/src/components/OnboardingView.jsx
CHANGED
|
@@ -1,13 +1,35 @@
|
|
| 1 |
import { useState } from "react"
|
| 2 |
-
import { DomeMark } from "./Logo"
|
| 3 |
|
| 4 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
function StepConcept() {
|
| 7 |
return (
|
| 8 |
<div>
|
| 9 |
<div style={{ display: "flex", justifyContent: "center", marginBottom: 18 }}>
|
| 10 |
-
<
|
| 11 |
</div>
|
| 12 |
<h1 style={{
|
| 13 |
fontSize: 26, fontWeight: 700, color: "#f0eeff",
|
|
|
|
| 1 |
import { useState } from "react"
|
|
|
|
| 2 |
|
| 3 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 4 |
|
| 5 |
+
function MirrorLogo() {
|
| 6 |
+
return (
|
| 7 |
+
<svg width="48" height="48" viewBox="0 0 52 52" fill="none">
|
| 8 |
+
<defs>
|
| 9 |
+
<linearGradient id="onb-g" x1="0" y1="0" x2="52" y2="0" gradientUnits="userSpaceOnUse">
|
| 10 |
+
<stop stopColor="#1d4ed8"/><stop offset="1" stopColor="#0891b2"/>
|
| 11 |
+
</linearGradient>
|
| 12 |
+
</defs>
|
| 13 |
+
<rect x="2" y="20" width="6" height="6" rx="3" fill="url(#onb-g)" opacity=".35"/>
|
| 14 |
+
<rect x="11" y="13" width="6" height="13" rx="3" fill="url(#onb-g)" opacity=".6"/>
|
| 15 |
+
<rect x="20" y="6" width="8" height="20" rx="4" fill="url(#onb-g)"/>
|
| 16 |
+
<rect x="31" y="13" width="6" height="13" rx="3" fill="url(#onb-g)" opacity=".6"/>
|
| 17 |
+
<rect x="40" y="20" width="6" height="6" rx="3" fill="url(#onb-g)" opacity=".35"/>
|
| 18 |
+
<line x1="0" y1="28" x2="52" y2="28" stroke="#1e2438" strokeWidth="1.25"/>
|
| 19 |
+
<rect x="2" y="29" width="6" height="6" rx="3" fill="url(#onb-g)" opacity=".15"/>
|
| 20 |
+
<rect x="11" y="29" width="6" height="13" rx="3" fill="url(#onb-g)" opacity=".27"/>
|
| 21 |
+
<rect x="20" y="29" width="8" height="20" rx="4" fill="url(#onb-g)" opacity=".33"/>
|
| 22 |
+
<rect x="31" y="29" width="6" height="13" rx="3" fill="url(#onb-g)" opacity=".3"/>
|
| 23 |
+
<rect x="40" y="29" width="6" height="6" rx="3" fill="url(#onb-g)" opacity=".15"/>
|
| 24 |
+
</svg>
|
| 25 |
+
)
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
function StepConcept() {
|
| 29 |
return (
|
| 30 |
<div>
|
| 31 |
<div style={{ display: "flex", justifyContent: "center", marginBottom: 18 }}>
|
| 32 |
+
<MirrorLogo />
|
| 33 |
</div>
|
| 34 |
<h1 style={{
|
| 35 |
fontSize: 26, fontWeight: 700, color: "#f0eeff",
|
frontend/src/components/ProfileView.jsx
CHANGED
|
@@ -6,7 +6,6 @@ import {
|
|
| 6 |
} from "recharts"
|
| 7 |
import api from "../lib/api"
|
| 8 |
import Reveal, { RevealItem } from "./Reveal"
|
| 9 |
-
import { DomeMark } from "./Logo"
|
| 10 |
|
| 11 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 12 |
|
|
@@ -543,7 +542,24 @@ export default function ProfileView({ active }) {
|
|
| 543 |
return (
|
| 544 |
<div style={{ textAlign: "center", padding: "60px 20px" }}>
|
| 545 |
<div style={{ display: "flex", justifyContent: "center", marginBottom: 16 }}>
|
| 546 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 547 |
</div>
|
| 548 |
<h2 style={{ fontSize: 20, fontWeight: 700, margin: "0 0 10px", color: "#f0eeff" }}>
|
| 549 |
Your mirror is waiting
|
|
|
|
| 6 |
} from "recharts"
|
| 7 |
import api from "../lib/api"
|
| 8 |
import Reveal, { RevealItem } from "./Reveal"
|
|
|
|
| 9 |
|
| 10 |
const G = "linear-gradient(135deg, #1d4ed8 0%, #0891b2 100%)"
|
| 11 |
|
|
|
|
| 542 |
return (
|
| 543 |
<div style={{ textAlign: "center", padding: "60px 20px" }}>
|
| 544 |
<div style={{ display: "flex", justifyContent: "center", marginBottom: 16 }}>
|
| 545 |
+
<svg width="52" height="52" viewBox="0 0 52 52" fill="none">
|
| 546 |
+
<defs>
|
| 547 |
+
<linearGradient id="pv-empty-g" x1="0" y1="0" x2="52" y2="0" gradientUnits="userSpaceOnUse">
|
| 548 |
+
<stop stopColor="#1d4ed8"/><stop offset="1" stopColor="#0891b2"/>
|
| 549 |
+
</linearGradient>
|
| 550 |
+
</defs>
|
| 551 |
+
<rect x="2" y="20" width="6" height="6" rx="3" fill="url(#pv-empty-g)" opacity=".35"/>
|
| 552 |
+
<rect x="11" y="13" width="6" height="13" rx="3" fill="url(#pv-empty-g)" opacity=".6"/>
|
| 553 |
+
<rect x="20" y="6" width="8" height="20" rx="4" fill="url(#pv-empty-g)"/>
|
| 554 |
+
<rect x="31" y="13" width="6" height="13" rx="3" fill="url(#pv-empty-g)" opacity=".6"/>
|
| 555 |
+
<rect x="40" y="20" width="6" height="6" rx="3" fill="url(#pv-empty-g)" opacity=".35"/>
|
| 556 |
+
<line x1="0" y1="28" x2="52" y2="28" stroke="#1e2438" strokeWidth="1.25"/>
|
| 557 |
+
<rect x="2" y="29" width="6" height="6" rx="3" fill="url(#pv-empty-g)" opacity=".15"/>
|
| 558 |
+
<rect x="11" y="29" width="6" height="13" rx="3" fill="url(#pv-empty-g)" opacity=".27"/>
|
| 559 |
+
<rect x="20" y="29" width="8" height="20" rx="4" fill="url(#pv-empty-g)" opacity=".33"/>
|
| 560 |
+
<rect x="31" y="29" width="6" height="13" rx="3" fill="url(#pv-empty-g)" opacity=".27"/>
|
| 561 |
+
<rect x="40" y="29" width="6" height="6" rx="3" fill="url(#pv-empty-g)" opacity=".15"/>
|
| 562 |
+
</svg>
|
| 563 |
</div>
|
| 564 |
<h2 style={{ fontSize: 20, fontWeight: 700, margin: "0 0 10px", color: "#f0eeff" }}>
|
| 565 |
Your mirror is waiting
|