feat: Relay 브랜드 로고·favicon 전면 적용
사이드바·인증 화면 'R' 텍스트 로고를 브랜드 더블 셰브론 마크(RelayMark)로 교체. favicon을 SVG+PNG+ICO 세트와 웹 매니페스트로 정비(create-vue 기본 아이콘 대체), 가운데 셰브론을 키워 작은 크기 가독성 개선. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 598 B After Width: | Height: | Size: 585 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 750 KiB After Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 46 KiB |
@@ -1,13 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="Relay app icon">
|
||||
<defs>
|
||||
<linearGradient id="relayGrad" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0" stop-color="#5b54f0"></stop>
|
||||
<stop offset="1" stop-color="#4338ca"></stop>
|
||||
<stop offset="0" stop-color="#5b54f0"/>
|
||||
<stop offset="1" stop-color="#4338ca"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect width="512" height="512" rx="143" fill="url(#relayGrad)"></rect>
|
||||
<svg x="160" y="160" width="192" height="192" viewBox="0 0 32 32">
|
||||
<path d="M8 8 L16 16 L8 24" fill="none" stroke="#ffffff" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
<path d="M16 8 L24 16 L16 24" fill="none" stroke="#ffffff" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
</svg>
|
||||
</svg>
|
||||
<rect width="512" height="512" rx="120" fill="url(#relayGrad)"/>
|
||||
<g fill="none" stroke="#ffffff" stroke-width="52" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M128 130 L256 256 L128 382"/>
|
||||
<path d="M256 130 L384 256 L256 382"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 765 B After Width: | Height: | Size: 591 B |
@@ -0,0 +1,35 @@
|
||||
<script setup lang="ts">
|
||||
// Relay 브랜드 마크(더블 셰브론) — 색상 로고 타일 안에 들어가는 심볼.
|
||||
// 색상/그라데이션 배경 타일에는 white, 흰/투명 배경에는 기본(인디고)을 사용한다.
|
||||
import markWhite from '@/assets/images/logo/svg/relay-mark-white.svg'
|
||||
import mark from '@/assets/images/logo/svg/relay-mark.svg'
|
||||
|
||||
withDefaults(defineProps<{ white?: boolean }>(), { white: false })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- 부모 타일이 어떤 정렬을 쓰든 중앙에 오도록 자체 중앙 정렬 -->
|
||||
<span class="relay-mark">
|
||||
<img
|
||||
:src="white ? markWhite : mark"
|
||||
alt=""
|
||||
aria-hidden="true"
|
||||
draggable="false"
|
||||
>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.relay-mark {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.relay-mark img {
|
||||
width: 66%;
|
||||
height: 66%;
|
||||
object-fit: contain;
|
||||
}
|
||||
</style>
|
||||
@@ -7,6 +7,7 @@ import { useRoute, useRouter, RouterLink } from 'vue-router'
|
||||
import { useAuthStore } from '@/stores/auth.store'
|
||||
import { useNotificationStore } from '@/stores/notification.store'
|
||||
import UserAvatar from '@/components/UserAvatar.vue'
|
||||
import RelayMark from '@/components/RelayMark.vue'
|
||||
import AgentChatPanel from '@/components/AgentChatPanel.vue'
|
||||
import type { NotificationView } from '@/types/notification'
|
||||
|
||||
@@ -96,7 +97,7 @@ async function onLogout() {
|
||||
title="Relay"
|
||||
>
|
||||
<div class="logo">
|
||||
R
|
||||
<RelayMark white />
|
||||
</div>
|
||||
<span class="brand-name">Relay</span>
|
||||
</RouterLink>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
// 브라우저가 스크립트의 창 닫기를 차단할 수 있으므로(사용자가 직접 연 탭),
|
||||
// 안내 문구를 함께 보여 사용자가 직접 닫고 기존 화면에서 로그인하도록 한다.
|
||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
|
||||
import RelayMark from '@/components/RelayMark.vue'
|
||||
import { useRoute, RouterLink } from 'vue-router'
|
||||
|
||||
const route = useRoute()
|
||||
@@ -30,7 +31,7 @@ onBeforeUnmount(() => {
|
||||
<div class="verified-wrap">
|
||||
<div class="card">
|
||||
<div class="brand">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
|
||||
<!-- 인증 성공 -->
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
// 이메일 입력(1단계) → 전송 완료 안내(2단계). 존재 여부는 노출하지 않는다.
|
||||
import { onBeforeUnmount, ref } from 'vue'
|
||||
import { RouterLink } from 'vue-router'
|
||||
import RelayMark from '@/components/RelayMark.vue'
|
||||
import { useAuth } from '@/composables/useAuth'
|
||||
|
||||
const { forgotPassword } = useAuth()
|
||||
@@ -66,7 +67,7 @@ onBeforeUnmount(() => {
|
||||
<div class="blob b2" />
|
||||
<div class="ring" />
|
||||
<div class="bp-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
<div class="bp-body">
|
||||
<div class="bp-head">
|
||||
@@ -106,7 +107,7 @@ onBeforeUnmount(() => {
|
||||
<main class="form-panel">
|
||||
<div class="auth-card">
|
||||
<div class="ac-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
|
||||
<!-- 1단계: 이메일 입력 -->
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// 로그인 — 좌측 브랜드 패널 + 우측 로그인 폼
|
||||
import { computed, ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import RelayMark from '@/components/RelayMark.vue'
|
||||
import { useAuthStore } from '@/stores/auth.store'
|
||||
|
||||
const route = useRoute()
|
||||
@@ -69,7 +70,7 @@ const points = [
|
||||
<div class="blob b2" />
|
||||
<div class="ring" />
|
||||
<div class="bp-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
<div class="bp-body">
|
||||
<div class="bp-head">
|
||||
@@ -110,7 +111,7 @@ const points = [
|
||||
<main class="form-panel">
|
||||
<div class="auth-card">
|
||||
<div class="ac-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
<h1 class="ac-title">
|
||||
로그인
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// 비밀번호 재설정 — 메일 링크의 token(쿼리)으로 새 비밀번호를 설정
|
||||
import { computed, ref } from 'vue'
|
||||
import { useRoute, useRouter, RouterLink } from 'vue-router'
|
||||
import RelayMark from '@/components/RelayMark.vue'
|
||||
import { useAuth } from '@/composables/useAuth'
|
||||
|
||||
const route = useRoute()
|
||||
@@ -45,7 +46,7 @@ async function onSubmit() {
|
||||
<div class="auth-simple">
|
||||
<div class="card">
|
||||
<div class="bp-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
|
||||
<!-- 토큰 없음 -->
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// 회원가입 — 가입 폼 → 인증 메일 발송 안내. 인증 메일의 링크를 눌러야 가입이 완료된다.
|
||||
import { computed, ref } from 'vue'
|
||||
import { RouterLink } from 'vue-router'
|
||||
import RelayMark from '@/components/RelayMark.vue'
|
||||
import { useAuthStore } from '@/stores/auth.store'
|
||||
import { useDialog } from '@/composables/useDialog'
|
||||
|
||||
@@ -98,7 +99,7 @@ const points = [
|
||||
<div class="blob b2" />
|
||||
<div class="ring" />
|
||||
<div class="bp-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
<div class="bp-body">
|
||||
<div class="bp-head">
|
||||
@@ -138,7 +139,7 @@ const points = [
|
||||
<main class="form-panel">
|
||||
<div class="auth-card">
|
||||
<div class="ac-logo">
|
||||
<span class="logo">R</span> Relay
|
||||
<span class="logo"><RelayMark white /></span> Relay
|
||||
</div>
|
||||
|
||||
<!-- 상태 1: 가입 폼 -->
|
||||
|
||||