Files
Tstore/resources/views/storefront/layout.blade.php
T
浪子 04a2034975 前端极简黑白重设计,并纳入客户端注册、站点设置与后台相关改动
- storefront 全站改为极简黑白配色:直角、细线分隔、卡片 hover 浅底、深色模式(跟随系统+手动切换)
- 抽出 storefront/partials/card 复用卡片
- 一并提交此前暂存的客户端注册 API、站点设置、后台页面与测试

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-22 08:35:49 +08:00

197 lines
12 KiB
PHP

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ $title ?? ($storeSettings['site_name'] ?? config('app.name', 'Tstore')) }}</title>
<script>
(function(){try{var t=localStorage.getItem('tstore-theme');if(t){document.documentElement.setAttribute('data-theme',t);}}catch(e){}})();
</script>
<style>
:root{
--bg:#ffffff;--ink:#111111;--ink-soft:#6b6b6b;--ink-mute:#9a9a9a;
--line:#e7e7e7;--line-strong:#111111;--hover:#f5f5f5;--panel:#ffffff;
}
:root[data-theme="dark"]{
--bg:#0a0a0a;--ink:#f2f2f2;--ink-soft:#a3a3a3;--ink-mute:#6f6f6f;
--line:#262626;--line-strong:#f2f2f2;--hover:#171717;--panel:#0f0f0f;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--bg:#0a0a0a;--ink:#f2f2f2;--ink-soft:#a3a3a3;--ink-mute:#6f6f6f;
--line:#262626;--line-strong:#f2f2f2;--hover:#171717;--panel:#0f0f0f;
}
}
*{box-sizing:border-box}
body{margin:0;font:15px/1.7 "Inter","PingFang SC","Microsoft YaHei UI",-apple-system,sans-serif;color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased;transition:background .2s,color .2s}
a{color:inherit;text-decoration:none}
img{display:block;max-width:100%}
code{padding:2px 6px;background:var(--hover);border:1px solid var(--line);font-size:.9em}
.container{width:min(1080px,calc(100% - 48px));margin:0 auto}
/* 顶栏 */
.topbar{border-bottom:1px solid var(--line)}
.topbar-inner{display:flex;justify-content:space-between;align-items:center;height:64px;gap:12px}
.brand{display:flex;align-items:center;gap:10px;font-weight:600;font-size:16px}
.brand-mark{display:grid;place-items:center;width:24px;height:24px;background:var(--ink);color:var(--bg);font-size:11px;font-weight:700;letter-spacing:.02em}
.brand-copy strong{display:block;font-size:16px;line-height:1.1;font-weight:600}
.nav{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
.nav a{padding:7px 12px;color:var(--ink-soft);font-size:14px;font-weight:500;transition:background .15s,color .15s}
.nav a:hover{background:var(--hover);color:var(--ink)}
.nav a.active{color:var(--ink);background:var(--hover)}
.theme-toggle{display:grid;place-items:center;width:34px;height:34px;margin-left:6px;border:1px solid var(--line);background:transparent;color:var(--ink-soft);cursor:pointer;font-size:15px;line-height:1;transition:border-color .15s,color .15s}
.theme-toggle:hover{border-color:var(--ink);color:var(--ink)}
/* hero */
.hero{padding:80px 0 52px;border-bottom:1px solid var(--line)}
.eyebrow{display:inline-block;font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute)}
.headline{margin:18px 0 0;font-size:40px;line-height:1.12;letter-spacing:-.025em;font-weight:700}
.lede{margin:18px 0 0;max-width:44em;color:var(--ink-soft);font-size:16px;line-height:1.8}
.hero-actions{display:flex;gap:10px;margin-top:32px;flex-wrap:wrap}
/* 按钮 */
.btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;font-size:14px;font-weight:600;border:1px solid var(--line-strong);background:var(--ink);color:var(--bg);cursor:pointer;transition:opacity .15s,border-color .15s,background .15s}
.btn:hover{opacity:.82}
.btn.ghost{background:var(--panel);color:var(--ink);border-color:var(--line)}
.btn.ghost:hover{border-color:var(--ink);opacity:1}
.btn.sm{height:34px;padding:0 14px;font-size:13px}
/* 统计横排 */
.stats{display:flex;gap:52px;margin-top:44px;flex-wrap:wrap}
.stat strong{display:block;font-size:26px;font-weight:700;letter-spacing:-.015em}
.stat span{display:block;margin-top:3px;font-size:13px;color:var(--ink-mute)}
/* 区块 */
.section{padding:56px 0;border-bottom:1px solid var(--line)}
.section:last-of-type{border-bottom:0}
.section-head{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;margin-bottom:32px}
.section-head h2{margin:0;font-size:22px;font-weight:700;letter-spacing:-.015em}
.section-head p{margin:7px 0 0;color:var(--ink-soft);font-size:14px;max-width:46em}
.section-kicker{display:block;font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:10px}
/* 卡片网格 */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}
.card{display:flex;flex-direction:column;padding:22px;border:1px solid var(--line);background:var(--panel);transition:border-color .15s,background .15s}
.card:hover{border-color:var(--ink);background:var(--hover)}
.card-top{display:flex;gap:12px;align-items:center}
.card-icon{width:44px;height:44px;border:1px solid var(--line);object-fit:cover;flex:none;background:var(--hover)}
.card-placeholder{display:grid;place-items:center;font-weight:700;color:var(--ink-soft)}
.card-title{margin:0;font-size:16px;font-weight:600}
.card-meta{margin:3px 0 0;font-size:13px;color:var(--ink-mute)}
.card-summary{margin:18px 0 0;color:var(--ink-soft);font-size:14px;line-height:1.75;flex:1}
.tags{display:flex;gap:6px;flex-wrap:wrap;margin-top:18px}
.tag{font-size:12px;font-weight:500;padding:3px 9px;border:1px solid var(--line);color:var(--ink-soft)}
.tag.solid{background:var(--ink);color:var(--bg);border-color:var(--ink)}
.card-foot{display:flex;justify-content:space-between;align-items:center;margin-top:20px;padding-top:18px;border-top:1px solid var(--line)}
.card-foot .dl{font-size:13px;color:var(--ink-mute)}
/* 筛选表单 */
.filter-bar{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap;margin-top:28px}
.field{display:grid;gap:6px}
.field label{font-size:12px;font-weight:600;color:var(--ink-mute);letter-spacing:.06em;text-transform:uppercase}
.input,.select{height:40px;min-width:180px;width:100%;padding:0 12px;border:1px solid var(--line);background:var(--panel);color:var(--ink);font-size:14px;outline:none;transition:border-color .15s}
.input:focus,.select:focus{border-color:var(--ink)}
.input::placeholder{color:var(--ink-mute)}
/* 详情页 */
.detail-head{display:flex;gap:18px;align-items:flex-start}
.detail-icon{width:72px;height:72px;object-fit:cover;border:1px solid var(--line);background:var(--hover);flex:none}
.detail-placeholder{display:grid;place-items:center;font-size:26px;font-weight:700;color:var(--ink-soft)}
.detail-layout{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(300px,1fr);gap:32px}
.stack{display:grid;gap:28px}
.info-card + .info-card{padding-top:28px;border-top:1px solid var(--line)}
.info-card h3{margin:0 0 18px;font-size:18px;font-weight:700}
.rich-text{color:var(--ink-soft);line-height:1.9;white-space:pre-wrap}
.info-list{display:grid;gap:16px}
.info-item strong{display:block;font-size:12px;color:var(--ink-mute);letter-spacing:.06em;text-transform:uppercase}
.info-item span,.info-item a{display:block;margin-top:4px;color:var(--ink);word-break:break-word}
/* 版本记录 */
.version-list{display:grid;gap:0}
.version-item{padding:18px 0;border-top:1px solid var(--line)}
.version-item:first-child{border-top:0;padding-top:0}
.version-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}
.version-title{font-size:15px;font-weight:700}
.version-meta{margin-top:4px;color:var(--ink-mute);font-size:13px}
/* 截图 */
.shots{display:grid;gap:16px}
.shot-feature,.shot-card{margin:0;border:1px solid var(--line);overflow:hidden;background:var(--panel)}
.shot-feature img{width:100%;height:360px;object-fit:cover;border-bottom:1px solid var(--line)}
.shot-feature figcaption{display:grid;gap:5px;padding:14px 16px}
.shot-feature strong{font-size:15px;font-weight:600}
.shot-feature span{color:var(--ink-mute);font-size:13px;line-height:1.6}
.shot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px}
.shot-card img{width:100%;height:180px;object-fit:cover;border-bottom:1px solid var(--line)}
.shot-card figcaption{padding:10px 14px;color:var(--ink-mute);font-size:13px}
/* 空状态 */
.empty{padding:44px 22px;border:1px dashed var(--line);color:var(--ink-mute);text-align:center;font-size:14px}
/* footer */
.footer{padding:36px 0}
.footer-inner{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;color:var(--ink-mute);font-size:13px}
.footer-inner strong{color:var(--ink);font-weight:600}
/* 分页 */
nav[role="navigation"]{margin-top:36px}
nav[role="navigation"] > div:first-child{display:none}
nav[role="navigation"] > div:last-child{display:flex;justify-content:center;flex-wrap:wrap;gap:6px}
nav[role="navigation"] a,nav[role="navigation"] span{display:inline-flex;align-items:center;justify-content:center;min-width:38px;height:38px;padding:0 12px;border:1px solid var(--line);background:var(--panel);color:var(--ink);font-size:14px}
nav[role="navigation"] a:hover{border-color:var(--ink)}
nav[role="navigation"] span[aria-current="page"]{background:var(--ink);border-color:var(--ink);color:var(--bg)}
nav[role="navigation"] svg{display:none}
@media (max-width:820px){.detail-layout{grid-template-columns:1fr}}
@media (max-width:640px){
.container{width:min(100% - 32px,1080px)}
.hero{padding:56px 0 44px}
.headline{font-size:31px}
.stats{gap:32px;margin-top:36px}
.section{padding:44px 0}
.section-head{flex-direction:column;align-items:flex-start}
.shot-feature img{height:240px}
}
</style>
</head>
<body>
<header class="topbar">
<div class="container topbar-inner">
<a class="brand" href="{{ route('storefront.home') }}">
<span class="brand-mark">{{ mb_substr($storeSettings['site_name'] ?? 'T', 0, 1) }}</span>
<span class="brand-copy"><strong>{{ $storeSettings['site_name'] ?? config('app.name', 'Tstore') }}</strong></span>
</a>
<nav class="nav">
<a href="{{ route('storefront.home') }}" class="{{ request()->routeIs('storefront.home') ? 'active' : '' }}">首页</a>
<a href="{{ route('storefront.plugins') }}" class="{{ request()->routeIs('storefront.plugins') ? 'active' : '' }}">插件</a>
<a href="{{ route('storefront.themes') }}" class="{{ request()->routeIs('storefront.themes') ? 'active' : '' }}">主题</a>
<button type="button" class="theme-toggle" id="themeToggle" aria-label="切换深浅色">◐</button>
</nav>
</div>
</header>
@yield('hero')
<main>
@yield('content')
</main>
<footer class="footer">
<div class="container footer-inner">
<div><strong>{{ $storeSettings['site_name'] ?? config('app.name', 'Tstore') }}</strong> · {{ $storeSettings['site_tagline'] ?? 'Typecho Extension Directory' }}</div>
<div>Copyright © {{ date('Y') }} {{ $storeSettings['site_name'] ?? config('app.name', 'Tstore') }}. 版权所有。</div>
</div>
</footer>
<script>
(function(){
var btn=document.getElementById('themeToggle');
if(!btn)return;
var mql=window.matchMedia('(prefers-color-scheme:dark)');
function current(){var s=document.documentElement.getAttribute('data-theme');return s?s:(mql.matches?'dark':'light');}
btn.addEventListener('click',function(){
var next=current()==='dark'?'light':'dark';
document.documentElement.setAttribute('data-theme',next);
try{localStorage.setItem('tstore-theme',next);}catch(e){}
});
})();
</script>
</body>
</html>