From 82d79acf4f52c3e8b0a839d8923a50bccdcaca3d Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Thu, 22 Jan 2026 22:28:31 -0300 Subject: [PATCH] onboarding: tighten stepper and confirm controls --- frontend/scripts/build_media_manifest.mjs | 26 ++++++++++++---- frontend/src/views/OnboardingView.vue | 37 +++++++++++++---------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/frontend/scripts/build_media_manifest.mjs b/frontend/scripts/build_media_manifest.mjs index 36d7cb4..0cb77d8 100644 --- a/frontend/scripts/build_media_manifest.mjs +++ b/frontend/scripts/build_media_manifest.mjs @@ -25,15 +25,29 @@ async function ensureDir(dir) { await fs.mkdir(dir, { recursive: true }); } +async function exists(dir) { + try { + await fs.access(dir); + return true; + } catch { + return false; + } +} + async function main() { try { + const sourceExists = await exists(SOURCE); + const rootExists = await exists(ROOT); + const source = sourceExists ? SOURCE : rootExists ? ROOT : null; await ensureDir(ROOT); - const files = await walk(SOURCE).catch(() => []); - for (const file of files) { - const src = path.join(SOURCE, file); - const dest = path.join(ROOT, file); - await ensureDir(path.dirname(dest)); - await fs.copyFile(src, dest); + const files = source ? await walk(source) : []; + if (source && source !== ROOT) { + for (const file of files) { + const src = path.join(source, file); + const dest = path.join(ROOT, file); + await ensureDir(path.dirname(dest)); + await fs.copyFile(src, dest); + } } const payload = { generated_at: new Date().toISOString(), diff --git a/frontend/src/views/OnboardingView.vue b/frontend/src/views/OnboardingView.vue index 55331c6..087ed33 100644 --- a/frontend/src/views/OnboardingView.vue +++ b/frontend/src/views/OnboardingView.vue @@ -29,16 +29,6 @@ -
-
- Username - -
-
-

Confirm your email

@@ -166,7 +156,7 @@ class="secondary" type="button" @click="nextSection" - :disabled="!hasNextSection || isSectionLocked(nextSectionItem)" + :disabled="!hasNextSection || isSectionLocked(nextSectionItem) || !sectionGateComplete(activeSection)" > Next @@ -209,7 +199,7 @@

@@ -1172,6 +1162,13 @@ button.secondary { font-weight: 600; } +button.primary:disabled, +button.secondary:disabled, +button.copy:disabled { + opacity: 0.45; + cursor: not-allowed; +} + .steps { margin-top: 16px; } @@ -1230,23 +1227,27 @@ button.secondary { display: flex; flex-direction: column; gap: 6px; + min-width: 0; } .stepper-title { font-weight: 700; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .stepper-meta { display: flex; align-items: center; - justify-content: space-between; - gap: 6px 10px; - flex-wrap: wrap; + justify-content: flex-start; + gap: 6px; + flex-wrap: nowrap; color: var(--text-muted); } .pill-compact { - padding: 6px 10px; + padding: 6px 8px; font-size: 12px; white-space: nowrap; max-width: 100%; @@ -1355,6 +1356,8 @@ button.secondary { border-radius: 14px; padding: 12px 12px 10px; background: rgba(255, 255, 255, 0.02); + display: flex; + flex-direction: column; } .step-card.blocked { @@ -1417,6 +1420,8 @@ button.secondary { display: flex; align-items: center; gap: 12px; + justify-content: flex-end; + margin-top: auto; } .recovery-verify {