diff --git a/frontend/src/composables/useSmsCountdown.ts b/frontend/src/composables/useSmsCountdown.ts new file mode 100644 index 0000000..fde1101 --- /dev/null +++ b/frontend/src/composables/useSmsCountdown.ts @@ -0,0 +1,69 @@ +import { onUnmounted, ref } from "vue"; +import { showToast } from "vant"; +import { sendSmsCode } from "@/api/auth"; + +export function useSmsCountdown() { + const countDown = ref(0); + const sending = ref(false); + let timer: ReturnType | null = null; + + function startCountDown() { + countDown.value = 60; + timer = setInterval(() => { + countDown.value--; + if (countDown.value <= 0) { + clearInterval(timer!); + timer = null; + } + }, 1000); + } + + onUnmounted(() => { + if (timer) { + clearInterval(timer); + timer = null; + } + }); + + async function handleSendCode(phone: string) { + if (!phone.trim()) { + showToast({ message: "请输入手机号", icon: "warning-o" }); + return false; + } + + sending.value = true; + try { + await sendSmsCode(phone); + showToast({ + message: "验证码已发送,开发环境请查看后端日志", + icon: "passed", + }); + startCountDown(); + return true; + } catch (error) { + showToast({ + message: readError(error, "验证码发送失败,请稍后重试"), + icon: "cross", + }); + return false; + } finally { + sending.value = false; + } + } + + function readError(error: unknown, fallback: string) { + if (typeof error === "object" && error && "response" in error) { + const response = (error as { response?: { data?: { message?: string } } }) + .response; + return response?.data?.message || fallback; + } + return fallback; + } + + return { + countDown, + sending, + handleSendCode, + readError, + }; +} diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 33365f3..a68bf46 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -2,6 +2,8 @@ import "element-plus/theme-chalk/el-message.css"; import "element-plus/theme-chalk/el-message-box.css"; import "vant/lib/index.css"; import "./styles/base.css"; +import "./styles/pc.css"; +import "./styles/admin.css"; import { createPinia } from "pinia"; import { createApp } from "vue"; diff --git a/frontend/src/styles/admin.css b/frontend/src/styles/admin.css new file mode 100644 index 0000000..166b6f1 --- /dev/null +++ b/frontend/src/styles/admin.css @@ -0,0 +1,241 @@ +.admin-shell { + display: grid; + min-height: 100vh; + grid-template-columns: 260px 1fr; + background: #f5f7fb; +} + +.admin-sidebar { + display: flex; + flex-direction: column; + min-width: 0; + border-right: 1px solid #dfe5ec; + background: #111827; + padding: 20px 16px; + color: #dbe4ee; +} + +.admin-brand { + display: flex; + align-items: center; + gap: 10px; + min-height: 44px; + color: #ffffff; + font-weight: 700; +} + +.admin-nav { + display: grid; + gap: 6px; + margin-top: 28px; +} + +.admin-nav-link { + display: flex; + align-items: center; + gap: 10px; + min-height: 42px; + border-radius: 8px; + padding: 0 12px; + color: #b7c3d2; +} + +.admin-nav-link.router-link-active { + background: #0f766e; + color: #ffffff; + font-weight: 600; +} + +.admin-workspace { + min-width: 0; + overflow: hidden; +} + +.admin-topbar { + display: flex; + align-items: center; + justify-content: space-between; + min-height: 64px; + border-bottom: 1px solid #e4e7ed; + background: #ffffff; + padding: 0 28px; +} + +.admin-topbar span { + display: block; + color: #6b7785; + font-size: 12px; +} + +.admin-topbar strong { + display: block; + margin-top: 3px; + color: #111827; +} + +.admin-main { + width: 100%; + min-width: 0; + padding: 28px clamp(18px, 2.4vw, 36px); +} + +.admin-main .page { + max-width: none; +} + +.admin-login-shell { + display: grid; + min-height: 100vh; + place-items: center; + background: linear-gradient( + 135deg, + rgba(15, 118, 110, 0.12), + rgba(17, 24, 39, 0.08) + ), + #f5f7fb; + padding: 24px; +} + +.admin-login-panel { + width: min(420px, 100%); + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 28px; + box-shadow: 0 20px 60px rgba(17, 24, 39, 0.1); +} + +.admin-login-brand { + display: inline-flex; + align-items: center; + gap: 10px; + color: #111827; + font-weight: 700; +} + +.admin-login-header { + margin: 28px 0 22px; +} + +.admin-login-header h1 { + font-size: 30px; +} + +.admin-login-header p:last-child { + margin: 10px 0 0; + color: #52616f; +} + +.admin-captcha-row { + display: grid; + grid-template-columns: 1fr 132px; + gap: 10px; + width: 100%; +} + +.captcha-image-button { + display: flex; + align-items: center; + justify-content: center; + height: 44px; + border: 1px solid #dcdfe6; + border-radius: 6px; + background: #ffffff; + padding: 0; + cursor: pointer; + overflow: hidden; +} + +.captcha-image-button:disabled { + cursor: wait; + opacity: 0.7; +} + +.captcha-image-button img { + display: block; + width: 132px; + height: 44px; +} + +@media (max-width: 1180px) { + .admin-shell { + grid-template-columns: 220px 1fr; + } + + .admin-sidebar { + padding: 18px 12px; + } + + .admin-nav-link { + padding: 0 10px; + } +} + +@media (max-width: 900px) { + .admin-shell { + grid-template-columns: 1fr; + } + + .admin-sidebar { + position: sticky; + top: 0; + z-index: 10; + border-right: 0; + border-bottom: 1px solid #1f2937; + padding: 12px 14px; + } + + .admin-brand { + min-height: 36px; + } + + .admin-nav { + grid-auto-flow: column; + grid-auto-columns: max-content; + gap: 8px; + margin-top: 12px; + overflow-x: auto; + padding-bottom: 2px; + } + + .admin-nav-link { + min-height: 38px; + white-space: nowrap; + } + + .admin-topbar { + min-height: 58px; + padding: 0 16px; + } + + .admin-main { + padding: 22px 16px; + } +} + +@media (max-width: 520px) { + .admin-topbar { + align-items: flex-start; + flex-direction: column; + justify-content: center; + gap: 10px; + padding: 12px 16px; + } + + .admin-topbar .el-button { + width: 100%; + } + + .dashboard-panels { + grid-template-columns: 1fr; + } + + .admin-captcha-row { + grid-template-columns: 1fr; + } + + .captcha-image-button, + .captcha-image-button img { + width: 100%; + } +} diff --git a/frontend/src/styles/base.css b/frontend/src/styles/base.css index 88ec32d..137a5ab 100644 --- a/frontend/src/styles/base.css +++ b/frontend/src/styles/base.css @@ -22,1384 +22,6 @@ a { text-decoration: none; } -.app-shell { - display: grid; - min-height: 100vh; - grid-template-columns: 248px 1fr; -} - -.sidebar { - border-right: 1px solid #e4e7ed; - background: #ffffff; - padding: 20px 16px; -} - -.brand { - display: flex; - align-items: center; - gap: 10px; - min-height: 44px; - font-weight: 700; -} - -.brand-mark { - display: inline-flex; - align-items: center; - justify-content: center; - width: 32px; - height: 32px; - border-radius: 8px; - background: #0f766e; - color: #ffffff; -} - -.nav { - display: grid; - gap: 6px; - margin-top: 24px; -} - -.nav-link { - display: flex; - align-items: center; - gap: 10px; - min-height: 40px; - border-radius: 8px; - padding: 0 12px; - color: #52616f; -} - -.nav-link.router-link-active { - background: #e8f5f2; - color: #0f766e; - font-weight: 600; -} - -.main { - min-width: 0; - padding: 32px; -} - -.admin-shell { - display: grid; - min-height: 100vh; - grid-template-columns: 260px 1fr; - background: #f5f7fb; -} - -.admin-sidebar { - display: flex; - flex-direction: column; - min-width: 0; - border-right: 1px solid #dfe5ec; - background: #111827; - padding: 20px 16px; - color: #dbe4ee; -} - -.admin-brand { - display: flex; - align-items: center; - gap: 10px; - min-height: 44px; - color: #ffffff; - font-weight: 700; -} - -.admin-nav { - display: grid; - gap: 6px; - margin-top: 28px; -} - -.admin-nav-link { - display: flex; - align-items: center; - gap: 10px; - min-height: 42px; - border-radius: 8px; - padding: 0 12px; - color: #b7c3d2; -} - -.admin-nav-link.router-link-active { - background: #0f766e; - color: #ffffff; - font-weight: 600; -} - -.admin-workspace { - min-width: 0; - overflow: hidden; -} - -.admin-topbar { - display: flex; - align-items: center; - justify-content: space-between; - min-height: 64px; - border-bottom: 1px solid #e4e7ed; - background: #ffffff; - padding: 0 28px; -} - -.admin-topbar span { - display: block; - color: #6b7785; - font-size: 12px; -} - -.admin-topbar strong { - display: block; - margin-top: 3px; - color: #111827; -} - -.admin-main { - width: 100%; - min-width: 0; - padding: 28px clamp(18px, 2.4vw, 36px); -} - -.admin-main .page { - max-width: none; -} - -.admin-login-shell { - display: grid; - min-height: 100vh; - place-items: center; - background: linear-gradient( - 135deg, - rgba(15, 118, 110, 0.12), - rgba(17, 24, 39, 0.08) - ), - #f5f7fb; - padding: 24px; -} - -.admin-login-panel { - width: min(420px, 100%); - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 28px; - box-shadow: 0 20px 60px rgba(17, 24, 39, 0.1); -} - -.admin-login-brand { - display: inline-flex; - align-items: center; - gap: 10px; - color: #111827; - font-weight: 700; -} - -.admin-login-header { - margin: 28px 0 22px; -} - -.admin-login-header h1 { - font-size: 30px; -} - -.admin-login-header p:last-child { - margin: 10px 0 0; - color: #52616f; -} - -.admin-captcha-row { - display: grid; - grid-template-columns: 1fr 132px; - gap: 10px; - width: 100%; -} - -.captcha-image-button { - display: flex; - align-items: center; - justify-content: center; - height: 44px; - border: 1px solid #dcdfe6; - border-radius: 6px; - background: #ffffff; - padding: 0; - cursor: pointer; - overflow: hidden; -} - -.captcha-image-button:disabled { - cursor: wait; - opacity: 0.7; -} - -.captcha-image-button img { - display: block; - width: 132px; - height: 44px; -} - -.page { - width: 100%; - max-width: 1440px; -} - -.page-header { - max-width: 720px; -} - -.eyebrow { - margin: 0 0 8px; - color: #0f766e; - font-size: 13px; - font-weight: 700; - text-transform: uppercase; -} - -h1 { - margin: 0; - font-size: 32px; - line-height: 1.2; -} - -.page-header p:last-child { - margin: 12px 0 0; - color: #52616f; - line-height: 1.7; -} - -.metric-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); - gap: 16px; - margin-top: 28px; -} - -.metric-card { - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 18px; -} - -.metric-card span { - display: block; - color: #6b7785; - font-size: 13px; -} - -.metric-card strong { - display: block; - margin-top: 8px; - font-size: 20px; -} - -.dashboard-metrics { - grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); -} - -.dashboard-panels { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); - gap: 16px; -} - -.dashboard-panel { - max-width: none; -} - -.pending-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - min-height: 40px; - border-top: 1px solid #e4e7ed; - color: #52616f; -} - -.pending-row:first-of-type { - border-top: 0; -} - -.pending-row strong { - color: #111827; -} - -.login-form { - max-width: 420px; - margin-top: 28px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 20px; -} - -.code-row { - display: grid; - grid-template-columns: 1fr 96px; - gap: 10px; - width: 100%; -} - -.notice { - max-width: 520px; - margin-top: 24px; -} - -.status-panel { - max-width: 520px; - margin-top: 24px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 18px; -} - -.status-panel span { - color: #6b7785; - font-size: 13px; -} - -.status-panel strong { - display: block; - margin-top: 6px; - color: #0f766e; - font-size: 22px; -} - -.status-panel p { - margin: 8px 0 0; - color: #52616f; -} - -.listing-grid { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 16px; - margin-top: 28px; -} - -.listing-card { - display: block; - min-height: 172px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 18px; -} - -.listing-card span { - color: #0f766e; - font-size: 13px; - font-weight: 700; -} - -.listing-card strong { - display: block; - margin-top: 10px; - font-size: 20px; -} - -.listing-card p { - color: #52616f; - line-height: 1.6; -} - -.listing-price { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - margin-top: 18px; -} - -.listing-price b { - color: #111827; -} - -.listing-price em { - color: #6b7785; - font-style: normal; -} - -.detail-grid { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 16px; - margin-top: 28px; -} - -.page-header-row { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 20px; - max-width: 100%; -} - -.table-panel, -.listing-form { - margin-top: 28px; -} - -.table-panel { - width: 100%; - overflow-x: auto; -} - -.table-panel .el-table__inner-wrapper { - min-width: 760px; -} - -.listing-form { - max-width: 860px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 20px; -} - -.form-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - column-gap: 16px; -} - -.order-panel { - max-width: min(100%, 560px); - margin-top: 28px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 20px; -} - -.order-panel p { - margin: 0 0 12px; - color: #52616f; -} - -.order-panel h2 { - margin: 0 0 14px; - font-size: 18px; -} - -.timeline-item { - border-top: 1px solid #e4e7ed; - padding: 14px 0; -} - -.timeline-item:first-of-type { - border-top: 0; -} - -.timeline-item strong { - display: block; -} - -.timeline-item span { - color: #6b7785; - font-size: 13px; -} - -.panel-action { - margin-top: 14px; -} - -.upload-line input { - width: 100%; -} - -.upload-stack { - display: grid; - gap: 10px; - width: 100%; -} - -.upload-line { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 10px; - align-items: center; - width: 100%; -} - -.evidence-list { - display: grid; - gap: 8px; -} - -.evidence-row { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 10px; - align-items: center; -} - -.evidence-row span { - overflow-wrap: anywhere; - color: #52616f; -} - -.full-control { - width: 100%; -} - -.dialog-body { - display: grid; - gap: 10px; -} - -.dialog-body p { - margin: 0; - color: #52616f; - line-height: 1.6; -} - -.toolbar-actions { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 10px; - justify-content: flex-end; -} - -.filter-panel { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 12px 16px; - margin-top: 24px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 16px; -} - -.filter-panel .el-form-item { - margin-bottom: 0; -} - -.table-subtext { - display: block; - margin-top: 4px; - color: #6b7785; - font-size: 12px; -} - -.code-panel { - max-width: none; -} - -.code-panel pre { - overflow-x: auto; - margin: 0; - border-radius: 6px; - background: #111827; - color: #dbe4ee; - padding: 14px; - line-height: 1.6; -} - -.notification-list { - display: grid; - gap: 12px; - margin-top: 28px; -} - -.notification-item { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 16px; - border: 1px solid #e4e7ed; - border-radius: 8px; - background: #ffffff; - padding: 16px; -} - -.notification-item.unread { - border-color: #0f766e; -} - -.notification-item span { - color: #0f766e; - font-size: 13px; - font-weight: 700; -} - -.notification-item h2 { - margin: 6px 0; - font-size: 18px; -} - -.notification-item p { - margin: 0 0 8px; - color: #52616f; -} - -.notification-item small { - color: #6b7785; -} - -.notification-actions { - display: flex; - flex-wrap: wrap; - gap: 8px; - justify-content: flex-end; -} -/* PC public marketplace */ -.pc-app-shell { - min-height: 100vh; - background: #f5f7fa; -} - -.pc-topbar { - position: sticky; - top: 0; - z-index: 20; - display: grid; - grid-template-columns: auto auto minmax(260px, 420px) auto; - align-items: center; - gap: 18px; - min-height: 66px; - border-bottom: 1px solid #e8edf3; - background: rgba(255, 255, 255, 0.94); - padding: 0 clamp(20px, 4vw, 56px); - backdrop-filter: blur(12px); -} - -.pc-brand, -.pc-nav, -.pc-user-actions, -.pc-search, -.pc-login-link, -.pc-post-link, -.pc-icon-link { - display: flex; - align-items: center; -} - -.pc-brand { - gap: 10px; - font-weight: 800; -} - -.pc-brand-mark { - display: inline-flex; - align-items: center; - justify-content: center; - width: 38px; - height: 38px; - border-radius: 12px; - background: #fff3e8; - color: #ff6a00; - font-size: 13px; - font-weight: 900; -} - -.pc-brand-text { - color: #111827; - font-size: 17px; -} - -.pc-nav { - gap: 6px; -} - -.pc-nav-link { - display: inline-flex; - align-items: center; - gap: 7px; - min-height: 40px; - border-radius: 999px; - padding: 0 14px; - color: #4b5563; - font-size: 14px; - font-weight: 600; -} - -.pc-nav-link.router-link-active, -.pc-nav-link:hover { - background: #fff3e8; - color: #ff6a00; -} - -.pc-search { - gap: 10px; - height: 40px; - border: 1px solid #edf1f6; - border-radius: 999px; - background: #f7f9fc; - padding: 0 16px; - color: #7b8798; -} - -.pc-search input { - width: 100%; - border: 0; - outline: 0; - background: transparent; - color: #111827; - font-size: 14px; -} - -.pc-user-actions { - justify-content: flex-end; - gap: 10px; -} - -.pc-icon-link, -.pc-login-link, -.pc-post-link { - justify-content: center; - min-height: 40px; - border-radius: 999px; - font-weight: 700; -} - -.pc-icon-link { - width: 40px; - border: 1px solid #e8edf3; - background: #ffffff; - color: #4b5563; -} - -.pc-login-link { - gap: 6px; - border: 1px solid #e8edf3; - background: #ffffff; - padding: 0 14px; - color: #111827; -} - -.pc-post-link { - gap: 6px; - background: #ff6a00; - padding: 0 16px; - color: #ffffff; - box-shadow: 0 10px 22px rgba(255, 106, 0, 0.18); -} - -.pc-post-link.large { - min-height: 44px; - padding: 0 22px; -} - -.pc-main { - width: min(1280px, calc(100% - 40px)); - margin: 0 auto; - padding: 18px 0 56px; -} - -.anti-fraud-strip { - display: flex; - align-items: center; - gap: 10px; - min-height: 44px; - border: 1px solid #fde68a; - border-radius: 14px; - background: linear-gradient(90deg, #fffbeb, #fef3c7); - padding: 10px 16px; - color: #92400e; - font-size: 14px; - font-weight: 600; -} - -.anti-fraud-strip.compact { - margin-bottom: 22px; -} - -.pc-hero { - display: grid; - grid-template-columns: minmax(0, 1fr) 340px; - gap: 24px; - margin-top: 18px; -} - -.pc-hero-content, -.pc-action-card, -.advanced-filter-card, -.resource-card, -.feature-card, -.pc-stat-card { - border: 1px solid rgba(229, 231, 235, 0.9); - background: rgba(255, 255, 255, 0.92); - box-shadow: 0 18px 44px rgba(17, 24, 39, 0.08); -} - -.pc-hero-content { - min-height: 360px; - border-radius: 28px; - background: linear-gradient( - 135deg, - rgba(17, 24, 39, 0.82), - rgba(120, 53, 15, 0.72) - ), - radial-gradient(circle at 82% 20%, rgba(251, 191, 36, 0.9), transparent 24%), - #111827; - padding: 48px; - color: #ffffff; - overflow: hidden; -} - -.pc-hero-content .eyebrow { - color: #fbbf24; -} - -.pc-hero h1 { - max-width: 620px; - font-size: clamp(40px, 5vw, 64px); - letter-spacing: -2px; -} - -.pc-hero-desc { - max-width: 560px; - margin: 18px 0 0; - color: rgba(255, 255, 255, 0.78); - font-size: 18px; - line-height: 1.8; -} - -.pc-hero-actions, -.hero-tags, -.sort-toolbar, -.resource-tags, -.resource-title-line { - display: flex; - align-items: center; -} - -.pc-hero-actions { - gap: 14px; - margin-top: 32px; -} - -.primary-cta, -.secondary-cta { - display: inline-flex; - align-items: center; - justify-content: center; - min-height: 46px; - border-radius: 999px; - padding: 0 22px; - font-weight: 800; -} - -.primary-cta { - gap: 8px; - background: #fbbf24; - color: #111827; -} - -.secondary-cta { - border: 1px solid rgba(255, 255, 255, 0.28); - color: #ffffff; -} - -.hero-tags { - flex-wrap: wrap; - gap: 10px; - margin-top: 34px; -} - -.hero-tags span { - border: 1px solid rgba(255, 255, 255, 0.22); - border-radius: 999px; - background: rgba(255, 255, 255, 0.1); - padding: 8px 12px; - color: #fde68a; - font-size: 13px; -} - -.pc-action-card { - border-radius: 24px; - padding: 22px; -} - -.pc-action-card h2 { - margin: 0 0 18px; - font-size: 20px; -} - -.action-row { - display: grid; - grid-template-columns: 42px 1fr; - gap: 12px; - align-items: center; - border: 1px solid #edf0f4; - border-radius: 16px; - background: #ffffff; - padding: 14px; -} - -.action-row + .action-row { - margin-top: 12px; -} - -.action-row .el-icon { - width: 42px; - height: 42px; - border-radius: 14px; - background: #fff7ed; - color: #ea580c; - font-size: 20px; -} - -.action-row strong, -.action-row span { - display: block; -} - -.action-row strong { - color: #111827; -} - -.action-row span { - margin-top: 4px; - color: #6b7280; - font-size: 13px; - line-height: 1.5; -} - -.action-row.highlight { - border-color: #fbbf24; - background: #fffbeb; -} - -.pc-stat-grid, -.pc-feature-row { - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 16px; - margin-top: 20px; -} - -.pc-stat-card, -.feature-card { - border-radius: 20px; - padding: 20px; -} - -.pc-stat-card span, -.feature-card span { - color: #6b7280; - font-size: 13px; -} - -.pc-stat-card strong, -.feature-card strong { - display: block; - margin-top: 8px; - color: #111827; - font-size: 24px; -} - -.pc-stat-card p { - margin: 8px 0 0; - color: #6b7280; -} - -.feature-card .el-icon { - color: #f59e0b; - font-size: 24px; -} - -.feature-card strong { - font-size: 18px; -} - -.listings-header { - align-items: center; - margin-bottom: 18px; -} - -.advanced-filter-card { - border-radius: 22px; - padding: 20px; -} - -.filter-title, -.sort-toolbar { - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; -} - -.filter-title strong { - color: #111827; - font-size: 18px; -} - -.filter-title span { - color: #6b7280; -} - -.pc-filter-grid { - display: grid; - grid-template-columns: 1.25fr repeat(4, minmax(0, 1fr)); - gap: 14px; - margin-top: 16px; -} - -.pc-filter-grid .el-form-item { - margin-bottom: 0; -} - -.sort-toolbar { - margin-top: 16px; -} - -.pc-resource-list { - display: grid; - gap: 14px; - margin-top: 18px; -} - -.resource-card { - display: grid; - grid-template-columns: 150px minmax(0, 1fr) 150px; - gap: 18px; - align-items: center; - border-radius: 22px; - padding: 14px; - transition: transform 0.18s ease, box-shadow 0.18s ease; -} - -.resource-card:hover { - transform: translateY(-2px); - box-shadow: 0 22px 50px rgba(17, 24, 39, 0.12); -} - -.resource-cover { - display: grid; - place-items: center; - height: 108px; - border-radius: 18px; - background: linear-gradient(135deg, #111827, #f59e0b); - color: #ffffff; - font-weight: 900; - overflow: hidden; -} - -.resource-cover img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.resource-title-line { - justify-content: space-between; - gap: 12px; -} - -.resource-title-line strong { - color: #111827; - font-size: 19px; -} - -.resource-title-line em { - border-radius: 999px; - background: #dcfce7; - padding: 4px 10px; - color: #166534; - font-size: 12px; - font-style: normal; - font-weight: 700; -} - -.resource-main p { - display: -webkit-box; - margin: 10px 0 0; - overflow: hidden; - color: #6b7280; - line-height: 1.6; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.resource-tags { - flex-wrap: wrap; - gap: 8px; - margin-top: 12px; -} - -.resource-tags span { - border-radius: 999px; - background: #f3f4f6; - padding: 5px 10px; - color: #4b5563; - font-size: 12px; -} - -.resource-price-box { - border-left: 1px solid #edf0f4; - padding-left: 18px; - text-align: right; -} - -.resource-price-box span, -.resource-price-box em, -.resource-price-box small { - display: block; - color: #6b7280; - font-style: normal; -} - -.resource-price-box strong { - display: block; - margin: 4px 0; - color: #ef4444; - font-size: 28px; -} - -.pc-detail-layout { - display: grid; - grid-template-columns: minmax(0, 1fr) 360px; - gap: 22px; -} - -.pc-detail-main, -.pc-order-card { - border: 1px solid rgba(229, 231, 235, 0.9); - border-radius: 24px; - background: #ffffff; - box-shadow: 0 18px 44px rgba(17, 24, 39, 0.08); -} - -.pc-detail-main { - overflow: hidden; -} - -.detail-cover { - display: grid; - place-items: center; - height: 300px; - background: linear-gradient(135deg, #111827, #92400e 54%, #f59e0b); - color: #ffffff; - font-size: 28px; - font-weight: 900; - letter-spacing: 1px; -} - -.detail-cover img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.detail-title { - padding: 28px; -} - -.pc-detail .detail-grid { - grid-template-columns: repeat(4, minmax(0, 1fr)); - margin: 0; - padding: 0 28px 28px; -} - -.pc-order-card { - position: sticky; - top: 96px; - align-self: start; - margin-top: 0; - padding: 24px; -} - -.pc-order-card h2 { - margin: 0 0 8px; - font-size: 22px; -} - -.order-safe-text { - margin: 0 0 18px; - color: #6b7280; - line-height: 1.7; -} - -.order-total-box { - border-radius: 18px; - background: #fffbeb; - margin-bottom: 16px; - padding: 16px; -} - -.order-total-box span, -.order-total-box em { - display: block; - color: #92400e; - font-style: normal; -} - -.order-total-box strong { - display: block; - margin: 4px 0; - color: #ef4444; - font-size: 30px; -} - -@media (max-width: 1180px) { - .pc-topbar { - grid-template-columns: auto 1fr auto; - } - - .pc-search { - display: none; - } - - .pc-hero, - .pc-filter-grid, - .pc-detail-layout, - .pc-detail .detail-grid { - grid-template-columns: 1fr; - } - - .pc-order-card { - position: static; - } - - .resource-card { - grid-template-columns: 120px minmax(0, 1fr); - } - - .resource-price-box { - grid-column: 2; - border-left: 0; - border-top: 1px solid #edf0f4; - padding: 12px 0 0; - text-align: left; - } -} - -@media (max-width: 1180px) { - .admin-shell { - grid-template-columns: 220px 1fr; - } - - .admin-sidebar { - padding: 18px 12px; - } - - .admin-nav-link { - padding: 0 10px; - } -} - -@media (max-width: 900px) { - .admin-shell { - grid-template-columns: 1fr; - } - - .admin-sidebar { - position: sticky; - top: 0; - z-index: 10; - border-right: 0; - border-bottom: 1px solid #1f2937; - padding: 12px 14px; - } - - .admin-brand { - min-height: 36px; - } - - .admin-nav { - grid-auto-flow: column; - grid-auto-columns: max-content; - gap: 8px; - margin-top: 12px; - overflow-x: auto; - padding-bottom: 2px; - } - - .admin-nav-link { - min-height: 38px; - white-space: nowrap; - } - - .admin-topbar { - min-height: 58px; - padding: 0 16px; - } - - .admin-main { - padding: 22px 16px; - } -} - -@media (max-width: 760px) { - .app-shell { - grid-template-columns: 1fr; - } - - .sidebar { - position: sticky; - top: 0; - z-index: 10; - border-right: 0; - border-bottom: 1px solid #e4e7ed; - } - - .nav { - grid-auto-flow: column; - grid-auto-columns: max-content; - overflow-x: auto; - } - - .main { - padding: 24px 16px; - } - - .metric-grid { - grid-template-columns: 1fr; - } - - .listing-grid, - .detail-grid, - .dashboard-metrics, - .dashboard-panels, - .form-grid { - grid-template-columns: 1fr; - } - - .page-header-row { - display: grid; - } - - .toolbar-actions { - justify-content: flex-start; - } -} - -@media (max-width: 520px) { - .admin-topbar { - align-items: flex-start; - flex-direction: column; - justify-content: center; - gap: 10px; - padding: 12px 16px; - } - - .admin-topbar .el-button { - width: 100%; - } - - .dashboard-panels { - grid-template-columns: 1fr; - } - - .admin-captcha-row, - .code-row { - grid-template-columns: 1fr; - } - - .captcha-image-button, - .captcha-image-button img { - width: 100%; - } -} - /* ── Vant Toast 保护规则 ────────────────────────────────── .van-popup 声明 background: var(--van-popup-background) = #fff (白色) .van-toast 声明 background: var(--van-toast-background) = rgba(0,0,0,.7) (黑色) diff --git a/frontend/src/styles/pc.css b/frontend/src/styles/pc.css new file mode 100644 index 0000000..e59c080 --- /dev/null +++ b/frontend/src/styles/pc.css @@ -0,0 +1,1135 @@ +.app-shell { + display: grid; + min-height: 100vh; + grid-template-columns: 248px 1fr; +} + +.sidebar { + border-right: 1px solid #e4e7ed; + background: #ffffff; + padding: 20px 16px; +} + +.brand { + display: flex; + align-items: center; + gap: 10px; + min-height: 44px; + font-weight: 700; +} + +.brand-mark { + display: inline-flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 8px; + background: #0f766e; + color: #ffffff; +} + +.nav { + display: grid; + gap: 6px; + margin-top: 24px; +} + +.nav-link { + display: flex; + align-items: center; + gap: 10px; + min-height: 40px; + border-radius: 8px; + padding: 0 12px; + color: #52616f; +} + +.nav-link.router-link-active { + background: #e8f5f2; + color: #0f766e; + font-weight: 600; +} + +.main { + min-width: 0; + padding: 32px; +} + +.page { + width: 100%; + max-width: 1440px; +} + +.page-header { + max-width: 720px; +} + +.eyebrow { + margin: 0 0 8px; + color: #0f766e; + font-size: 13px; + font-weight: 700; + text-transform: uppercase; +} + +h1 { + margin: 0; + font-size: 32px; + line-height: 1.2; +} + +.page-header p:last-child { + margin: 12px 0 0; + color: #52616f; + line-height: 1.7; +} + +.metric-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 16px; + margin-top: 28px; +} + +.metric-card { + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 18px; +} + +.metric-card span { + display: block; + color: #6b7785; + font-size: 13px; +} + +.metric-card strong { + display: block; + margin-top: 8px; + font-size: 20px; +} + +.dashboard-metrics { + grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); +} + +.dashboard-panels { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 16px; +} + +.dashboard-panel { + max-width: none; +} + +.pending-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + min-height: 40px; + border-top: 1px solid #e4e7ed; + color: #52616f; +} + +.pending-row:first-of-type { + border-top: 0; +} + +.pending-row strong { + color: #111827; +} + +.login-form { + max-width: 420px; + margin-top: 28px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 20px; +} + +.code-row { + display: grid; + grid-template-columns: 1fr 96px; + gap: 10px; + width: 100%; +} + +.notice { + max-width: 520px; + margin-top: 24px; +} + +.status-panel { + max-width: 520px; + margin-top: 24px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 18px; +} + +.status-panel span { + color: #6b7785; + font-size: 13px; +} + +.status-panel strong { + display: block; + margin-top: 6px; + color: #0f766e; + font-size: 22px; +} + +.status-panel p { + margin: 8px 0 0; + color: #52616f; +} + +.listing-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-top: 28px; +} + +.listing-card { + display: block; + min-height: 172px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 18px; +} + +.listing-card span { + color: #0f766e; + font-size: 13px; + font-weight: 700; +} + +.listing-card strong { + display: block; + margin-top: 10px; + font-size: 20px; +} + +.listing-card p { + color: #52616f; + line-height: 1.6; +} + +.listing-price { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-top: 18px; +} + +.listing-price b { + color: #111827; +} + +.listing-price em { + color: #6b7785; + font-style: normal; +} + +.detail-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; + margin-top: 28px; +} + +.page-header-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + max-width: 100%; +} + +.table-panel, +.listing-form { + margin-top: 28px; +} + +.table-panel { + width: 100%; + overflow-x: auto; +} + +.table-panel .el-table__inner-wrapper { + min-width: 760px; +} + +.listing-form { + max-width: 860px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 20px; +} + +.form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + column-gap: 16px; +} + +.order-panel { + max-width: min(100%, 560px); + margin-top: 28px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 20px; +} + +.order-panel p { + margin: 0 0 12px; + color: #52616f; +} + +.order-panel h2 { + margin: 0 0 14px; + font-size: 18px; +} + +.timeline-item { + border-top: 1px solid #e4e7ed; + padding: 14px 0; +} + +.timeline-item:first-of-type { + border-top: 0; +} + +.timeline-item strong { + display: block; +} + +.timeline-item span { + color: #6b7785; + font-size: 13px; +} + +.panel-action { + margin-top: 14px; +} + +.upload-line input { + width: 100%; +} + +.upload-stack { + display: grid; + gap: 10px; + width: 100%; +} + +.upload-line { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 10px; + align-items: center; + width: 100%; +} + +.evidence-list { + display: grid; + gap: 8px; +} + +.evidence-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 10px; + align-items: center; +} + +.evidence-row span { + overflow-wrap: anywhere; + color: #52616f; +} + +.full-control { + width: 100%; +} + +.dialog-body { + display: grid; + gap: 10px; +} + +.dialog-body p { + margin: 0; + color: #52616f; + line-height: 1.6; +} + +.toolbar-actions { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 8px; + justify-content: flex-end; +} + +.filter-panel { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 12px 16px; + margin-top: 24px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 16px; +} + +.filter-panel .el-form-item { + margin-bottom: 0; +} + +.table-subtext { + display: block; + margin-top: 4px; + color: #6b7785; + font-size: 12px; +} + +.code-panel { + max-width: none; +} + +.code-panel pre { + overflow-x: auto; + margin: 0; + border-radius: 6px; + background: #111827; + color: #dbe4ee; + padding: 14px; + line-height: 1.6; +} + +.notification-list { + display: grid; + gap: 12px; + margin-top: 28px; +} + +.notification-item { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + border: 1px solid #e4e7ed; + border-radius: 8px; + background: #ffffff; + padding: 16px; +} + +.notification-item.unread { + border-color: #0f766e; +} + +.notification-item span { + color: #0f766e; + font-size: 13px; + font-weight: 700; +} + +.notification-item h2 { + margin: 6px 0; + font-size: 18px; +} + +.notification-item p { + margin: 0 0 8px; + color: #52616f; +} + +.notification-item small { + color: #6b7785; +} + +.notification-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + justify-content: flex-end; +} + +/* PC public marketplace */ +.pc-app-shell { + min-height: 100vh; + background: #f5f7fa; +} + +.pc-topbar { + position: sticky; + top: 0; + z-index: 20; + display: grid; + grid-template-columns: auto auto minmax(260px, 420px) auto; + align-items: center; + gap: 18px; + min-height: 66px; + border-bottom: 1px solid #e8edf3; + background: rgba(255, 255, 255, 0.94); + padding: 0 clamp(20px, 4vw, 56px); + backdrop-filter: blur(12px); +} + +.pc-brand, +.pc-nav, +.pc-user-actions, +.pc-search, +.pc-login-link, +.pc-post-link, +.pc-icon-link { + display: flex; + align-items: center; +} + +.pc-brand { + gap: 10px; + font-weight: 800; +} + +.pc-brand-mark { + display: inline-flex; + align-items: center; + justify-content: center; + width: 38px; + height: 38px; + border-radius: 12px; + background: #fff3e8; + color: #ff6a00; + font-size: 13px; + font-weight: 900; +} + +.pc-brand-text { + color: #111827; + font-size: 17px; +} + +.pc-nav { + gap: 6px; +} + +.pc-nav-link { + display: inline-flex; + align-items: center; + gap: 7px; + min-height: 40px; + border-radius: 999px; + padding: 0 14px; + color: #4b5563; + font-size: 14px; + font-weight: 600; +} + +.pc-nav-link.router-link-active, +.pc-nav-link:hover { + background: #fff3e8; + color: #ff6a00; +} + +.pc-search { + gap: 10px; + height: 40px; + border: 1px solid #edf1f6; + border-radius: 999px; + background: #f7f9fc; + padding: 0 16px; + color: #7b8798; +} + +.pc-search input { + width: 100%; + border: 0; + outline: 0; + background: transparent; + color: #111827; + font-size: 14px; +} + +.pc-user-actions { + justify-content: flex-end; + gap: 10px; +} + +.pc-icon-link, +.pc-login-link, +.pc-post-link { + justify-content: center; + min-height: 40px; + border-radius: 999px; + font-weight: 700; +} + +.pc-icon-link { + width: 40px; + border: 1px solid #e8edf3; + background: #ffffff; + color: #4b5563; +} + +.pc-login-link { + gap: 6px; + border: 1px solid #e8edf3; + background: #ffffff; + padding: 0 14px; + color: #111827; +} + +.pc-post-link { + gap: 6px; + background: #ff6a00; + padding: 0 16px; + color: #ffffff; + box-shadow: 0 10px 22px rgba(255, 106, 0, 0.18); +} + +.pc-post-link.large { + min-height: 44px; + padding: 0 22px; +} + +.pc-main { + width: min(1280px, calc(100% - 40px)); + margin: 0 auto; + padding: 18px 0 56px; +} + +.anti-fraud-strip { + display: flex; + align-items: center; + gap: 10px; + min-height: 44px; + border: 1px solid #fde68a; + border-radius: 14px; + background: linear-gradient(90deg, #fffbeb, #fef3c7); + padding: 10px 16px; + color: #92400e; + font-size: 14px; + font-weight: 600; +} + +.anti-fraud-strip.compact { + margin-bottom: 22px; +} + +.pc-hero { + display: grid; + grid-template-columns: minmax(0, 1fr) 340px; + gap: 24px; + margin-top: 18px; +} + +.pc-hero-content, +.pc-action-card, +.advanced-filter-card, +.resource-card, +.feature-card, +.pc-stat-card { + border: 1px solid rgba(229, 231, 235, 0.9); + background: rgba(255, 255, 255, 0.92); + box-shadow: 0 18px 44px rgba(17, 24, 39, 0.08); +} + +.pc-hero-content { + min-height: 360px; + border-radius: 28px; + background: linear-gradient( + 135deg, + rgba(17, 24, 39, 0.82), + rgba(120, 53, 15, 0.72) + ), + radial-gradient(circle at 82% 20%, rgba(251, 191, 36, 0.9), transparent 24%), + #111827; + padding: 48px; + color: #ffffff; + overflow: hidden; +} + +.pc-hero-content .eyebrow { + color: #fbbf24; +} + +.pc-hero h1 { + max-width: 620px; + font-size: clamp(40px, 5vw, 64px); + letter-spacing: -2px; +} + +.pc-hero-desc { + max-width: 560px; + margin: 18px 0 0; + color: rgba(255, 255, 255, 0.78); + font-size: 18px; + line-height: 1.8; +} + +.pc-hero-actions, +.hero-tags, +.sort-toolbar, +.resource-tags, +.resource-title-line { + display: flex; + align-items: center; +} + +.pc-hero-actions { + gap: 14px; + margin-top: 32px; +} + +.primary-cta, +.secondary-cta { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 46px; + border-radius: 999px; + padding: 0 22px; + font-weight: 800; +} + +.primary-cta { + gap: 8px; + background: #fbbf24; + color: #111827; +} + +.secondary-cta { + border: 1px solid rgba(255, 255, 255, 0.28); + color: #ffffff; +} + +.hero-tags { + flex-wrap: wrap; + gap: 10px; + margin-top: 34px; +} + +.hero-tags span { + border: 1px solid rgba(255, 255, 255, 0.22); + border-radius: 999px; + background: rgba(255, 255, 255, 0.1); + padding: 8px 12px; + color: #fde68a; + font-size: 13px; +} + +.pc-action-card { + border-radius: 24px; + padding: 22px; +} + +.pc-action-card h2 { + margin: 0 0 18px; + font-size: 20px; +} + +.action-row { + display: grid; + grid-template-columns: 42px 1fr; + gap: 12px; + align-items: center; + border: 1px solid #edf0f4; + border-radius: 16px; + background: #ffffff; + padding: 14px; +} + +.action-row + .action-row { + margin-top: 12px; +} + +.action-row .el-icon { + width: 42px; + height: 42px; + border-radius: 14px; + background: #fff7ed; + color: #ea580c; + font-size: 20px; +} + +.action-row strong, +.action-row span { + display: block; +} + +.action-row strong { + color: #111827; +} + +.action-row span { + margin-top: 4px; + color: #6b7280; + font-size: 13px; + line-height: 1.5; +} + +.action-row.highlight { + border-color: #fbbf24; + background: #fffbeb; +} + +.pc-stat-grid, +.pc-feature-row { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; + margin-top: 20px; +} + +.pc-stat-card, +.feature-card { + border-radius: 20px; + padding: 20px; +} + +.pc-stat-card span, +.feature-card span { + color: #6b7280; + font-size: 13px; +} + +.pc-stat-card strong, +.feature-card strong { + display: block; + margin-top: 8px; + color: #111827; + font-size: 24px; +} + +.pc-stat-card p { + margin: 8px 0 0; + color: #6b7280; +} + +.feature-card .el-icon { + color: #f59e0b; + font-size: 24px; +} + +.feature-card strong { + font-size: 18px; +} + +.listings-header { + align-items: center; + margin-bottom: 18px; +} + +.advanced-filter-card { + border-radius: 22px; + padding: 20px; +} + +.filter-title, +.sort-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; +} + +.filter-title strong { + color: #111827; + font-size: 18px; +} + +.filter-title span { + color: #6b7280; +} + +.pc-filter-grid { + display: grid; + grid-template-columns: 1.25fr repeat(4, minmax(0, 1fr)); + gap: 14px; + margin-top: 16px; +} + +.pc-filter-grid .el-form-item { + margin-bottom: 0; +} + +.sort-toolbar { + margin-top: 16px; +} + +.pc-resource-list { + display: grid; + gap: 14px; + margin-top: 18px; +} + +.resource-card { + display: grid; + grid-template-columns: 150px minmax(0, 1fr) 150px; + gap: 18px; + align-items: center; + border-radius: 22px; + padding: 14px; + transition: transform 0.18s ease, box-shadow 0.18s ease; +} + +.resource-card:hover { + transform: translateY(-2px); + box-shadow: 0 22px 50px rgba(17, 24, 39, 0.12); +} + +.resource-cover { + display: grid; + place-items: center; + height: 108px; + border-radius: 18px; + background: linear-gradient(135deg, #111827, #f59e0b); + color: #ffffff; + font-weight: 900; + overflow: hidden; +} + +.resource-cover img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.resource-title-line { + justify-content: space-between; + gap: 12px; +} + +.resource-title-line strong { + color: #111827; + font-size: 19px; +} + +.resource-title-line em { + border-radius: 999px; + background: #dcfce7; + padding: 4px 10px; + color: #166534; + font-size: 12px; + font-style: normal; + font-weight: 700; +} + +.resource-main p { + display: -webkit-box; + margin: 10px 0 0; + overflow: hidden; + color: #6b7280; + line-height: 1.6; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.resource-tags { + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.resource-tags span { + border-radius: 999px; + background: #f3f4f6; + padding: 5px 10px; + color: #4b5563; + font-size: 12px; +} + +.resource-price-box { + border-left: 1px solid #edf0f4; + padding-left: 18px; + text-align: right; +} + +.resource-price-box span, +.resource-price-box em, +.resource-price-box small { + display: block; + color: #6b7280; + font-style: normal; +} + +.resource-price-box strong { + display: block; + margin: 4px 0; + color: #ef4444; + font-size: 28px; +} + +.pc-detail-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 360px; + gap: 22px; +} + +.pc-detail-main, +.pc-order-card { + border: 1px solid rgba(229, 231, 235, 0.9); + border-radius: 24px; + background: #ffffff; + box-shadow: 0 18px 44px rgba(17, 24, 39, 0.08); +} + +.pc-detail-main { + overflow: hidden; +} + +.detail-cover { + display: grid; + place-items: center; + height: 300px; + background: linear-gradient(135deg, #111827, #92400e 54%, #f59e0b); + color: #ffffff; + font-size: 28px; + font-weight: 900; + letter-spacing: 1px; +} + +.detail-cover img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.detail-title { + padding: 28px; +} + +.pc-detail .detail-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin: 0; + padding: 0 28px 28px; +} + +.pc-order-card { + position: sticky; + top: 96px; + align-self: start; + margin-top: 0; + padding: 24px; +} + +.pc-order-card h2 { + margin: 0 0 8px; + font-size: 22px; +} + +.order-safe-text { + margin: 0 0 18px; + color: #6b7280; + line-height: 1.7; +} + +.order-total-box { + border-radius: 18px; + background: #fffbeb; + margin-bottom: 16px; + padding: 16px; +} + +.order-total-box span, +.order-total-box em { + display: block; + color: #92400e; + font-style: normal; +} + +.order-total-box strong { + display: block; + margin: 4px 0; + color: #ef4444; + font-size: 30px; +} + +@media (max-width: 1180px) { + .pc-topbar { + grid-template-columns: auto 1fr auto; + } + + .pc-search { + display: none; + } + + .pc-hero, + .pc-filter-grid, + .pc-detail-layout, + .pc-detail .detail-grid { + grid-template-columns: 1fr; + } + + .pc-order-card { + position: static; + } + + .resource-card { + grid-template-columns: 120px minmax(0, 1fr); + } + + .resource-price-box { + grid-column: 2; + border-left: 0; + border-top: 1px solid #edf0f4; + padding: 12px 0 0; + text-align: left; + } +} + +@media (max-width: 760px) { + .app-shell { + grid-template-columns: 1fr; + } + + .sidebar { + position: sticky; + top: 0; + z-index: 10; + border-right: 0; + border-bottom: 1px solid #e4e7ed; + } + + .nav { + grid-auto-flow: column; + grid-auto-columns: max-content; + overflow-x: auto; + } + + .main { + padding: 24px 16px; + } + + .metric-grid { + grid-template-columns: 1fr; + } + + .listing-grid, + .detail-grid, + .dashboard-metrics, + .dashboard-panels, + .form-grid { + grid-template-columns: 1fr; + } + + .page-header-row { + display: grid; + } + + .toolbar-actions { + justify-content: flex-start; + } +} diff --git a/frontend/src/views/mobile/MobileLoginView.vue b/frontend/src/views/mobile/MobileLoginView.vue index aae5d4f..9df2b56 100644 --- a/frontend/src/views/mobile/MobileLoginView.vue +++ b/frontend/src/views/mobile/MobileLoginView.vue @@ -1,76 +1,22 @@