diff --git a/frontend/src/styles/account.css b/frontend/src/styles/account.css new file mode 100644 index 0000000..52dc6ba --- /dev/null +++ b/frontend/src/styles/account.css @@ -0,0 +1,348 @@ +.page { + max-width: 1200px; + margin: 0 auto; + padding: 32px 22px 72px; +} + +.hero { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 18px; + margin-bottom: 12px; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + gap: 28px; +} + +.divider { + height: 1px; + background: rgba(255, 255, 255, 0.08); + margin: 18px 0; +} + +.subhead h3 { + margin: 0; + font-size: 16px; +} + +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + margin: 0 0 6px; + font-size: 13px; +} + +h1 { + margin: 0 0 6px; + font-size: 32px; +} + +.lede { + margin: 0; + color: var(--text-muted); + max-width: 640px; +} + +.account-grid { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 12px; + margin-top: 12px; + align-items: stretch; +} + +.account-column, +.account-stack { + display: grid; + gap: 12px; + align-content: start; +} + +.account-column .module, +.account-stack .module { + min-height: 0; + display: flex; + flex-direction: column; +} + +.module { + padding: 18px; +} + +.module-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.muted { + color: var(--text-muted); + margin: 10px 0 0; +} + +.kv { + margin-top: 12px; + border: 1px solid var(--card-border); + border-radius: 12px; + overflow: hidden; +} + +.row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 12px; + background: rgba(255, 255, 255, 0.02); + border-top: 1px solid rgba(255, 255, 255, 0.06); +} + +.row:first-child { + border-top: none; +} + +.k { + color: var(--text-muted); +} + +.v { + color: var(--text-strong); +} + +.link { + color: var(--accent-cyan); + text-decoration: none; +} + +.actions { + margin-top: 12px; + display: flex; + gap: 10px; +} + +button.primary { + background: linear-gradient(90deg, #4f8bff, #7dd0ff); + color: #0b1222; + padding: 10px 14px; + border: none; + border-radius: 10px; + cursor: pointer; + font-weight: 700; +} + +.secret-box { + margin-top: 12px; + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(255, 255, 255, 0.03); + padding: 12px; +} + +.secret-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-bottom: 8px; +} + +.secret-actions { + display: inline-flex; + align-items: center; + gap: 8px; +} + +.secret { + word-break: break-word; + color: var(--text-strong); +} + +.hint { + margin-top: 6px; + color: var(--text-muted); + font-size: 12px; +} + +.jellyfin-detail { + margin-top: auto; +} + +.copy { + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.14); + color: var(--text-primary); + border-radius: 10px; + padding: 6px 10px; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 8px; +} + +.copied { + font-size: 12px; + color: rgba(120, 255, 160, 0.9); +} + +.error-box { + margin-top: 12px; + border-radius: 12px; + border: 1px solid rgba(255, 87, 87, 0.5); + background: rgba(255, 87, 87, 0.06); + padding: 10px 12px; +} + +@media (max-width: 820px) { + .account-grid { + grid-template-columns: 1fr; + } + + .account-stack .module { + flex: none; + } + + .account-column .module { + flex: none; + } +} + +@media (max-width: 720px) { + .page { + padding: 24px 16px 56px; + } + + .hero { + flex-direction: column; + align-items: flex-start; + } + + .hero-actions { + width: 100%; + justify-content: flex-start; + gap: 12px; + } + + .row { + flex-direction: column; + align-items: flex-start; + } + + .actions { + flex-direction: column; + align-items: stretch; + } + + .secret-head { + flex-direction: column; + align-items: flex-start; + } + + .req-row { + grid-template-columns: 1fr; + } +} + +.admin { + margin-top: 12px; +} + +.requests { + margin-top: 12px; + display: grid; + gap: 10px; +} + +.req-row { + display: grid; + grid-template-columns: minmax(220px, 1.2fr) minmax(200px, 1fr) minmax(200px, 1fr) minmax(140px, 0.6fr); + gap: 16px; + align-items: start; + border: 1px solid rgba(255, 255, 255, 0.08); + background: rgba(0, 0, 0, 0.18); + border-radius: 14px; + padding: 10px 12px; +} + +.req-summary { + display: grid; + gap: 6px; +} + +.req-label { + color: var(--text-muted); + font-size: 11px; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +.req-flags { + display: grid; + gap: 8px; + align-content: start; +} + +.req-flag-grid { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.note { + color: var(--text-muted); +} + +.flag-pill { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 8px; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(0, 0, 0, 0.2); + font-size: 12px; +} + +.flag-pill input { + width: 14px; + height: 14px; +} + +.req-note .input { + width: 100%; + border-radius: 10px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(0, 0, 0, 0.22); + color: var(--text-primary); + padding: 8px 10px; +} + +.req-actions { + display: grid; + gap: 8px; + align-content: start; +} + +.req-action-stack { + display: grid; + gap: 8px; +} + +@media (max-width: 900px) { + .req-row { + grid-template-columns: 1fr; + gap: 12px; + align-items: start; + } + + .note { + white-space: normal; + } +} diff --git a/frontend/src/styles/onboarding.css b/frontend/src/styles/onboarding.css new file mode 100644 index 0000000..d410d69 --- /dev/null +++ b/frontend/src/styles/onboarding.css @@ -0,0 +1,653 @@ +.page { + max-width: 1080px; + margin: 0 auto; + padding: 32px 22px 72px; +} + +.hero { + margin-bottom: 12px; + padding: 18px; +} + +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + margin: 0 0 6px; + font-size: 13px; +} + +h1 { + margin: 0 0 6px; + font-size: 32px; +} + +.lede { + margin: 0; + color: var(--text-muted); + max-width: 640px; +} + +.module { + padding: 18px; +} + +.module-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; +} + +.status-form { + display: flex; + gap: 10px; + margin-top: 12px; +} + +.status-meta { + margin-top: 12px; + padding: 12px; + border-radius: 14px; + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(0, 0, 0, 0.18); +} + +.meta-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; +} + +.meta-row .label { + color: var(--text-muted); +} + +.input { + flex: 1; + padding: 10px 12px; + border-radius: 10px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(0, 0, 0, 0.25); + color: var(--text-primary); +} + +button.primary { + background: linear-gradient(90deg, #4f8bff, #7dd0ff); + color: #0b1222; + padding: 10px 14px; + border: none; + border-radius: 10px; + cursor: pointer; + font-weight: 700; +} + +button.secondary { + background: rgba(255, 255, 255, 0.08); + border: 1px solid rgba(255, 255, 255, 0.16); + color: var(--text-primary); + padding: 8px 12px; + border-radius: 10px; + cursor: pointer; + font-weight: 600; +} + +button.primary:disabled, +button.secondary:disabled, +button.copy:disabled { + opacity: 0.45; + cursor: not-allowed; +} + +.steps { + margin-top: 16px; +} + +.onboarding-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 14px; + margin-bottom: 8px; +} + +.section-stepper { + margin: 16px 0 18px; + list-style: none; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 10px; + padding: 0; +} + +.stepper-item { + min-width: 0; +} + +.stepper-card { + width: 100%; + text-align: left; + padding: 12px 12px 12px 36px; + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(0, 0, 0, 0.2); + color: var(--text-primary); + display: flex; + gap: 8px; + position: relative; +} + +.stepper-card::after { + display: none; +} + +.stepper-dot { + position: absolute; + left: 12px; + top: 12px; + width: 10px; + height: 10px; + border-radius: 999px; + border: 2px solid rgba(255, 255, 255, 0.22); + background: rgba(255, 255, 255, 0.16); + z-index: 1; +} + +.stepper-body { + 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: center; + gap: 6px 10px; + flex-wrap: wrap; + color: var(--text-muted); + width: 100%; +} + +.stepper-meta .pill { + padding: 4px 6px; + font-size: 11px; + white-space: nowrap; +} + +.pill-compact { + padding: 4px 6px; + font-size: 11px; + white-space: nowrap; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + +.stepper-card.active { + border-color: rgba(125, 208, 255, 0.5); + box-shadow: 0 0 0 1px rgba(79, 139, 255, 0.3); +} + +.stepper-card.active .stepper-dot { + background: rgba(125, 208, 255, 0.8); + border-color: rgba(125, 208, 255, 0.85); +} + +.stepper-card.done { + border-color: rgba(92, 214, 167, 0.35); + background: rgba(92, 214, 167, 0.08); +} + +.stepper-card.done .stepper-dot { + background: rgba(92, 214, 167, 0.9); + border-color: rgba(92, 214, 167, 0.95); +} + +.stepper-card.locked { + opacity: 0.6; +} + +@media (max-width: 1200px) { + .section-stepper { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +@media (max-width: 860px) { + .section-stepper { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 520px) { + .section-stepper { + grid-template-columns: 1fr; + } +} + +.credential-card { + margin-top: 14px; + padding: 14px; + border-radius: 14px; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(0, 0, 0, 0.2); +} + +.credential-head { + margin-bottom: 10px; +} + +.credential-head h4 { + margin: 0 0 4px; + font-size: 18px; +} + +.credential-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 14px; +} + +.credential-field .label { + display: block; + margin-bottom: 6px; + color: var(--text-muted); +} + +.credential-field .input[readonly] { + opacity: 0.8; +} + +.password-row { + display: flex; + gap: 8px; + align-items: center; +} + +.password-row .input { + flex: 1; +} + +.section-shell { + margin-top: 16px; + padding-top: 12px; + border-top: 1px solid rgba(255, 255, 255, 0.08); +} + +.section-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; +} + +.section-actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + width: 100%; + margin-top: 12px; +} + +.step-grid { + display: grid; + gap: 12px; +} + +.step-card { + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 14px; + padding: 12px 12px 10px; + background: rgba(255, 255, 255, 0.02); + display: flex; + flex-direction: column; +} + +.step-note { + margin-top: 8px; + padding: 8px 10px; + border-radius: 10px; + border: 1px solid rgba(0, 229, 197, 0.35); + background: rgba(0, 229, 197, 0.08); + color: var(--text-strong); + font-weight: 600; +} + +.step-card.blocked { + opacity: 0.55; + pointer-events: none; +} + +.step-card.done { + border-color: rgba(92, 214, 167, 0.35); + background: rgba(92, 214, 167, 0.05); +} + +.step-head { + display: flex; + align-items: center; + gap: 12px; +} + +.auto-pill { + margin-left: auto; + font-size: 12px; + padding: 3px 10px; + border-radius: 999px; +} + +.step-title { + font-weight: 650; + color: var(--text-strong); +} + +.step-label { + display: flex; + align-items: center; + gap: 10px; +} + +.step-label input { + width: 18px; + height: 18px; +} + +.step-bullets { + margin: 8px 0 0; + padding-left: 18px; + color: var(--text-muted); +} + +.step-links { + margin-top: 10px; + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 10px; +} + +.step-links a { + color: rgba(92, 214, 167, 0.95); + text-decoration: none; + font-weight: 600; + border-radius: 999px; + padding: 6px 14px; + border: 1px solid rgba(92, 214, 167, 0.35); + background: rgba(92, 214, 167, 0.12); + display: inline-flex; + align-items: center; + gap: 6px; +} + +.step-links a:hover { + text-decoration: none; + background: rgba(92, 214, 167, 0.2); +} + +.step-actions { + display: flex; + align-items: center; + gap: 12px; + justify-content: flex-end; + margin-top: auto; + padding-top: 10px; +} + +.recovery-verify { + display: flex; + gap: 10px; + margin-top: 10px; + align-items: stretch; +} + +.recovery-verify .input { + flex: 1; +} + +.guide-details { + margin-top: 10px; +} + +.guide-summary { + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 10px; + padding: 6px 12px; + border-radius: 999px; + border: 1px solid rgba(92, 214, 167, 0.5); + background: rgba(92, 214, 167, 0.15); + color: var(--text-strong); + font-weight: 600; +} + +.guide-summary::after { + content: "Tap to open"; + font-size: 12px; + color: var(--text-muted); +} + +.guide-details[open] .guide-summary::after { + content: "Tap to close"; +} + +.guide-summary::-webkit-details-marker { + display: none; +} + +.guide-groups { + display: grid; + gap: 12px; + margin-top: 8px; +} + +.guide-title { + margin: 0 0 6px; +} + +.guide-images { + display: grid; + gap: 10px; +} + +.guide-shot { + border-radius: 10px; + overflow: hidden; + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(0, 0, 0, 0.2); + padding: 0; + cursor: zoom-in; + display: flex; + flex-direction: column; + gap: 6px; +} + +.guide-shot figcaption { + margin: 0; + padding: 10px 12px 6px; + font-size: 18px; + font-weight: 600; + color: var(--text-strong); +} + +.guide-shot img { + display: block; + border-radius: 10px; + max-width: 100%; + width: auto; + height: auto; + max-height: min(60vh, 520px); + margin: 0 auto 10px; +} + +.guide-pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + flex-wrap: wrap; +} + +.guide-dots { + display: flex; + gap: 6px; + flex-wrap: wrap; +} + +.guide-dot { + border: 1px solid rgba(255, 255, 255, 0.18); + background: rgba(0, 0, 0, 0.3); + color: var(--text-muted); + border-radius: 999px; + padding: 4px 8px; + cursor: pointer; + font-size: 12px; +} + +.guide-dot.active { + border-color: rgba(120, 180, 255, 0.5); + color: var(--text-strong); +} + +.ready-box { + margin-top: 18px; + padding: 14px; + border-radius: 14px; + border: 1px solid rgba(92, 214, 167, 0.3); + background: rgba(92, 214, 167, 0.08); +} + +.task-list { + margin: 0; + padding: 0; + list-style: none; + display: grid; + gap: 8px; +} + +.task-row { + display: flex; + align-items: center; + gap: 12px; +} + +.task-name { + min-width: 180px; +} + +.task-detail { + color: var(--text-muted); +} + +.error-box { + margin-top: 12px; + padding: 12px; + border-radius: 14px; + border: 1px solid rgba(255, 120, 120, 0.4); + background: rgba(255, 70, 70, 0.1); +} + +.tooltip-wrap { + display: inline-flex; +} + +.lightbox { + position: fixed; + inset: 0; + background: rgba(6, 8, 12, 0.82); + display: flex; + align-items: center; + justify-content: center; + padding: 28px; + z-index: 2000; +} + +.lightbox-card { + width: min(1400px, 96vw); + max-height: 94vh; + background: rgba(10, 14, 24, 0.96); + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 16px; + padding: 16px; + display: flex; + flex-direction: column; + gap: 12px; +} + +.lightbox-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.lightbox-label { + color: var(--text-muted); +} + +.lightbox-card img { + width: 100%; + max-height: 82vh; + object-fit: contain; + border-radius: 12px; + background: rgba(0, 0, 0, 0.35); +} + +@media (max-width: 720px) { + .page { + padding: 24px 16px 56px; + } + + .status-form { + flex-direction: column; + } + + .onboarding-head { + flex-direction: column; + align-items: flex-start; + } + + .credential-grid { + grid-template-columns: 1fr; + } + + .step-head { + flex-direction: column; + align-items: flex-start; + } + + .auto-pill { + margin-left: 0; + } + + .section-actions { + flex-direction: column; + align-items: stretch; + } + + .step-actions { + justify-content: flex-start; + } + + .section-actions { + width: 100%; + justify-content: flex-start; + } + + .password-row { + flex-direction: column; + align-items: stretch; + } +} diff --git a/frontend/src/styles/request-access.css b/frontend/src/styles/request-access.css new file mode 100644 index 0000000..0e97cbf --- /dev/null +++ b/frontend/src/styles/request-access.css @@ -0,0 +1,254 @@ +.page { + max-width: 960px; + margin: 0 auto; + padding: 32px 22px 72px; +} + +.hero { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 18px; + margin-bottom: 12px; +} + +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--text-muted); + margin: 0 0 6px; + font-size: 13px; +} + +h1 { + margin: 0 0 6px; + font-size: 32px; +} + +.lede { + margin: 0; + color: var(--text-muted); + max-width: 640px; +} + +.module { + padding: 18px; +} + +.status-module { + margin-top: 14px; +} + +.module-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.muted { + color: var(--text-muted); + margin: 10px 0 0; +} + +.mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.form { + margin-top: 14px; + display: grid; + gap: 12px; +} + +.field { + display: grid; + gap: 6px; +} + +.availability { + display: flex; + align-items: center; + gap: 8px; +} + +.label { + color: var(--text-muted); + font-size: 12px; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.input, +.textarea { + width: 100%; + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.1); + background: rgba(0, 0, 0, 0.22); + color: var(--text); + padding: 10px 12px; + outline: none; +} + +.textarea { + resize: vertical; +} + +.actions { + display: flex; + align-items: center; + gap: 12px; + margin-top: 6px; +} + +button.primary, +a.primary { + background: linear-gradient(90deg, #4f8bff, #7dd0ff); + color: #0b1222; + padding: 10px 14px; + border: none; + border-radius: 10px; + cursor: pointer; + font-weight: 700; + text-decoration: none; + display: inline-flex; + align-items: center; + justify-content: center; +} + +button.primary:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.onboarding-actions { + margin-top: 18px; + flex-direction: column; + align-items: stretch; + padding: 14px; + border-radius: 14px; + border: 1px solid rgba(120, 180, 255, 0.2); + background: rgba(0, 0, 0, 0.24); +} + +.onboarding-copy { + display: grid; + gap: 6px; +} + +.onboarding-cta { + text-align: center; + width: 100%; +} + +.status-form { + display: flex; + gap: 10px; + margin-top: 12px; +} + +.hint { + color: var(--text-muted); + font-size: 12px; +} + +.error-box { + margin-top: 14px; + border: 1px solid rgba(255, 120, 120, 0.35); + background: rgba(255, 64, 64, 0.12); + border-radius: 14px; + padding: 12px; +} + +.success-box { + margin-top: 14px; + border: 1px solid rgba(120, 255, 160, 0.25); + background: rgba(48, 255, 160, 0.1); + border-radius: 14px; + padding: 12px; +} + +.request-code-row { + margin-top: 12px; + display: flex; + flex-direction: column; + gap: 6px; +} + +.copy { + display: inline-flex; + align-items: center; + gap: 10px; + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(0, 0, 0, 0.22); + color: var(--text); + padding: 10px 12px; + cursor: pointer; +} + +.copied { + font-size: 12px; + color: rgba(120, 255, 160, 0.9); +} + +.pill { + padding: 6px 10px; + border-radius: 999px; + font-size: 12px; +} + +.verify-box { + margin-top: 12px; + padding: 12px 14px; + border: 1px solid rgba(120, 200, 255, 0.35); + border-radius: 14px; + background: rgba(48, 120, 200, 0.16); + display: grid; + gap: 4px; +} + +.verify-title { + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.08em; + color: rgba(150, 220, 255, 0.95); +} + +.verify-body { + font-size: 13px; + color: var(--text); +} + +.task-box { + margin-top: 14px; + padding: 14px; + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 14px; + background: rgba(0, 0, 0, 0.25); +} + +.task-list { + list-style: none; + padding: 0; + margin: 0; + display: grid; + gap: 10px; +} + +.task-row { + display: grid; + gap: 6px; + grid-template-columns: 1fr auto; + align-items: center; +} + +.task-name { + color: var(--text); +} + +.task-detail { + grid-column: 1 / -1; + color: var(--text-muted); + font-size: 12px; +} diff --git a/frontend/src/views/AccountView.vue b/frontend/src/views/AccountView.vue index 2ab1089..0617aab 100644 --- a/frontend/src/views/AccountView.vue +++ b/frontend/src/views/AccountView.vue @@ -879,353 +879,4 @@ async function copy(key, text) { } - + diff --git a/frontend/src/views/OnboardingView.vue b/frontend/src/views/OnboardingView.vue index 711852c..bbf20ee 100644 --- a/frontend/src/views/OnboardingView.vue +++ b/frontend/src/views/OnboardingView.vue @@ -1239,658 +1239,4 @@ onMounted(async () => { }); - + diff --git a/frontend/src/views/RequestAccessView.vue b/frontend/src/views/RequestAccessView.vue index 8a8df12..a37fdd2 100644 --- a/frontend/src/views/RequestAccessView.vue +++ b/frontend/src/views/RequestAccessView.vue @@ -607,261 +607,4 @@ onMounted(async () => { }); - - - +