| | |
| | | <div class="login-page"> |
| | | <main class="page"> |
| | | <section class="factory"> |
| | | <div class="brand"> |
| | | <div class="logo"> |
| | | <img :src="brandLogoUrl" :alt="`${companyName} logo`" class="logo-image" @error="handleLogoError" /> |
| | | </div> |
| | | <div class="brand-copy"> |
| | | <div class="brand-title">{{ companyName }}</div> |
| | | <small>{{ companySubtitle }}</small> |
| | | <div class="brand hero-brand"> |
| | | <div class="logo hero-logo"> |
| | | <img |
| | | :src="brandLogoUrl" |
| | | :alt="`${companyName} logo`" |
| | | class="logo-image hero-logo-image" |
| | | @error="handleLogoError" |
| | | /> |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | <form class="login-card" @submit.prevent="handleLogin"> |
| | | <div class="brand card-brand"> |
| | | <div class="logo"> |
| | | <img :src="brandLogoUrl" :alt="`${companyName} logo`" class="logo-image" @error="handleLogoError" /> |
| | | <img :src="brandIconUrl" :alt="`${companyName} icon`" class="logo-image card-logo-image" /> |
| | | </div> |
| | | <div class="brand-copy card-brand-copy"> |
| | | <div class="brand-title">{{ companyName }}</div> |
| | | <small>数字工厂统一入口</small> |
| | | </div> |
| | | <div class="brand-copy card-brand-copy"> |
| | | <div class="brand-title">{{ companyName }}</div> |
| | | <small>数字工厂统一入口</small> |
| | | </div> |
| | | </div> |
| | | |
| | | <h2>欢迎登录</h2> |
| | |
| | | const companySubtitle = String(import.meta.env.VITE_LOGIN_SUBTITLE || "Digital Factory Operation Center").trim() |
| | | const configuredLogo = String(import.meta.env.VITE_APP_LOGO || "").trim() |
| | | const logoModules = import.meta.glob("/src/assets/logo/*.png", { eager: true }) |
| | | const brandIconUrl = `${import.meta.env.BASE_URL}favicon.ico` |
| | | |
| | | const redirect = ref("") |
| | | const loading = ref(false) |
| | |
| | | .brand { |
| | | position: relative; |
| | | z-index: 2; |
| | | display: flex; |
| | | display: inline-flex; |
| | | align-items: center; |
| | | gap: 12px; |
| | | font-weight: 900; |
| | | letter-spacing: 0.4px; |
| | | } |
| | | |
| | | .logo { |
| | | width: 48px; |
| | | height: 48px; |
| | | width: 76px; |
| | | height: 76px; |
| | | border-radius: 14px; |
| | | display: grid; |
| | | place-items: center; |
| | |
| | | } |
| | | |
| | | .logo-image { |
| | | width: 70%; |
| | | height: 70%; |
| | | width: 82%; |
| | | height: 82%; |
| | | object-fit: contain; |
| | | } |
| | | |
| | | .brand-copy { |
| | | min-width: 0; |
| | | } |
| | | |
| | | .brand-title { |
| | | font-size: 16px; |
| | | font-weight: inherit; |
| | | line-height: 1.2; |
| | | word-break: break-word; |
| | | } |
| | | |
| | | .brand-copy small { |
| | | .hero-brand { |
| | | display: block; |
| | | margin-top: 3px; |
| | | font-size: 12px; |
| | | font-weight: 500; |
| | | color: rgba(255, 255, 255, 0.64); |
| | | word-break: break-word; |
| | | } |
| | | |
| | | .hero-logo { |
| | | width: 240px; |
| | | height: 84px; |
| | | border-radius: 0; |
| | | background: transparent; |
| | | box-shadow: none; |
| | | overflow: visible; |
| | | place-items: center start; |
| | | } |
| | | |
| | | .hero-logo-image { |
| | | width: 100%; |
| | | height: auto; |
| | | max-height: 100%; |
| | | object-fit: contain; |
| | | } |
| | | |
| | | .hero { |
| | |
| | | margin-bottom: 18px; |
| | | } |
| | | |
| | | .card-brand-copy .brand-title { |
| | | color: #0d2c5e; |
| | | font-size: 16px; |
| | | .card-brand .logo { |
| | | width: 52px; |
| | | height: 52px; |
| | | } |
| | | |
| | | .card-brand-copy small { |
| | | color: #7a8da8; |
| | | .card-brand-copy { |
| | | margin-left: 12px; |
| | | } |
| | | |
| | | .card-logo-image { |
| | | width: 100%; |
| | | height: 100%; |
| | | object-fit: contain; |
| | | } |
| | | |
| | | .card-brand .logo { |
| | | width: 68px; |
| | | height: 68px; |
| | | } |
| | | |
| | | .login-card h2 { |