/* ============================================================ 家书 FamilyBook · 界面样式 配色取自图标:宣纸米 / 砖红封面 / 深褐书脊 / 纸白 原则:扁平、留白充足、字重克制(正文 400,标题 500-600) ============================================================ */ :root { --paper: #F7F3EA; --surface: #FFFFFF; --ink: #2C231D; --muted: #7E6B5A; --faint: #A8988A; --brand: #A84A28; --brand-2: #C96F45; --brand-ink:#6E3820; --green: #6F9E5C; --red: #C0533F; --line: rgba(44, 35, 29, .10); --line-2: rgba(44, 35, 29, .06); --radius: 16px; --radius-s: 10px; --shadow: 0 1px 2px rgba(44, 35, 29, .05); --shadow-l: 0 4px 16px rgba(44, 35, 29, .08); } * { box-sizing: border-box; } html, body { height: 100%; } body { margin: 0; background: var(--paper); color: var(--ink); font: 15px/1.7 -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", sans-serif; -webkit-font-smoothing: antialiased; } a { color: var(--brand); text-decoration: none; } a:hover { text-decoration: underline; } /* ---------------- 顶栏 ---------------- */ .topbar { position: sticky; top: 0; z-index: 20; background: var(--surface); border-bottom: 1px solid var(--line); } .topbar-inner { max-width: 1080px; margin: 0 auto; padding: 0 24px; height: 60px; display: flex; align-items: center; gap: 24px; } .brand { display: flex; align-items: center; gap: 10px; color: var(--ink); } .brand:hover { text-decoration: none; } .brand img { width: 30px; height: 30px; border-radius: 8px; display: block; } .brand span { font-size: 16px; font-weight: 600; letter-spacing: .5px; } .nav { display: flex; gap: 4px; margin-left: 8px; } .nav a { padding: 6px 12px; border-radius: 999px; color: var(--muted); font-size: 14px; } .nav a:hover { background: var(--line-2); text-decoration: none; } .nav a.on { background: var(--brand); color: #fff; } .topbar-right { margin-left: auto; display: flex; align-items: center; gap: 12px; } .who { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 14px; } .who img { width: 30px; height: 30px; border-radius: 50%; object-fit: cover; } .link-quiet { color: var(--muted); font-size: 14px; } .link-quiet:hover { color: var(--brand); } /* 顶栏里的文字一律不许换行 —— 一换行就是「首/页」「名/册」竖排,很难看 */ .nav a, .topbar-right a, .who-name { white-space: nowrap; } /* ---------------- 布局 ---------------- */ .container { max-width: 1080px; margin: 0 auto; padding: 28px 24px 64px; } .container-narrow { max-width: 560px; margin: 0 auto; padding: 28px 24px 64px; } .page-head { display: flex; align-items: flex-end; gap: 16px; margin-bottom: 20px; } .page-head h1 { font-size: 22px; font-weight: 600; margin: 0; } .page-head .sub { color: var(--muted); font-size: 14px; } .page-head .actions { margin-left: auto; display: flex; gap: 8px; } .section { margin-top: 28px; } .section-title { display: flex; align-items: center; gap: 10px; font-size: 15px; font-weight: 600; margin: 0 0 12px; } .section-title .hint { font-weight: 400; color: var(--muted); font-size: 13px; } /* ---------------- 卡片 ---------------- */ .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); } .card-pad { padding: 20px; } /* 首页头图 */ .hero { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); padding: 26px 28px; display: flex; align-items: center; gap: 20px; flex-wrap: wrap; } .hero-logo { width: 64px; height: 64px; border-radius: 16px; flex: 0 0 auto; } .hero h1 { font-size: 24px; font-weight: 600; margin: 0 0 4px; } .hero .motto { color: var(--muted); margin: 0; font-size: 14px; } .hero-stats { margin-left: auto; display: flex; gap: 28px; } .stat { text-align: center; } .stat b { display: block; font-size: 24px; font-weight: 600; line-height: 1.2; } .stat span { font-size: 12px; color: var(--muted); } /* ---------------- 成员卡 ---------------- */ .people-grid { display: grid; gap: 16px; margin-top: 4px; grid-template-columns: repeat(auto-fill, minmax(168px, 1fr)); } .person { display: block; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); transition: transform .15s ease, box-shadow .15s ease; } .person:hover { transform: translateY(-2px); box-shadow: var(--shadow-l); text-decoration: none; } .person .ph { background: #F1E7D6; aspect-ratio: 1 / 1; overflow: hidden; } .person .ph img { width: 100%; height: 100%; object-fit: cover; display: block; } .person .pb { padding: 12px 14px 14px; } .person .pname { font-weight: 600; font-size: 15px; display: flex; align-items: center; gap: 6px; } .person .pmeta { color: var(--muted); font-size: 13px; margin-top: 2px; } .badge { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 11px; font-weight: 500; line-height: 1.7; background: var(--line-2); color: var(--muted); } .badge-admin { background: #F6E3D7; color: var(--brand-ink); } .badge-open { background: #E6F0DC; color: #4A7226; } /* 生日条 */ .bdays { display: flex; gap: 12px; flex-wrap: wrap; } .bday { display: flex; align-items: center; gap: 10px; background: var(--surface); border: 1px solid var(--line); border-radius: 999px; padding: 6px 16px 6px 6px; box-shadow: var(--shadow); } .bday img { width: 32px; height: 32px; border-radius: 50%; object-fit: cover; } .bday b { font-weight: 500; } .bday .d { color: var(--brand); font-size: 13px; } /* ---------------- 表单 ---------------- */ .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } .field { display: flex; flex-direction: column; gap: 6px; } .field.full { grid-column: 1 / -1; } .field label { font-size: 13px; color: var(--muted); font-weight: 500; } .field .tip { font-size: 12px; color: var(--muted); } .input, .select, textarea.input { width: 100%; padding: 10px 12px; font: inherit; font-size: 14px; color: var(--ink); background: #fff; border: 1px solid var(--line); border-radius: var(--radius-s); transition: border-color .15s ease, box-shadow .15s ease; } .input:focus, .select:focus, textarea.input:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(168, 74, 40, .12); } textarea.input { min-height: 76px; resize: vertical; } .err { color: var(--red); font-size: 12px; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 9px 16px; font: inherit; font-size: 14px; font-weight: 500; border-radius: var(--radius-s); border: 1px solid transparent; cursor: pointer; background: var(--brand); color: #fff; transition: background .15s ease; } .btn:hover { background: #944022; text-decoration: none; } .btn-ghost { background: #fff; color: var(--ink); border-color: var(--line); } .btn-ghost:hover { background: #FAF7F1; } .btn-danger { background: #fff; color: var(--red); border-color: rgba(192,83,63,.35); } .btn-danger:hover { background: #FDF1EE; } .btn-sm { padding: 5px 12px; font-size: 13px; } .btn-row { display: flex; gap: 10px; margin-top: 20px; } /* ---------------- 详情 ---------------- */ .detail { display: grid; grid-template-columns: 260px 1fr; gap: 24px; } .detail-photo { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px; text-align: center; box-shadow: var(--shadow); } .detail-photo img { width: 100%; aspect-ratio: 1/1; object-fit: cover; border-radius: 12px; display: block; } .detail-photo .name { font-size: 18px; font-weight: 600; margin: 14px 0 4px; } .detail-photo .sub { color: var(--muted); font-size: 13px; } .kv { display: flex; flex-direction: column; } .kv-row { display: grid; grid-template-columns: 96px 1fr; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--line-2); } .kv-row:last-child { border-bottom: 0; } .kv-row dt { color: var(--muted); font-size: 13px; } .kv-row dd { margin: 0; font-size: 14px; word-break: break-all; } .mono { font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; letter-spacing: .5px; } /* ---------------- 提示 ---------------- */ .flash { display: flex; flex-direction: column; gap: 8px; margin-bottom: 18px; } .flash-item { padding: 10px 14px; border-radius: var(--radius-s); font-size: 14px; background: #E6F0DC; color: #3D6B1F; } .flash-item.err { background: #F8DDDA; color: #A1341F; } .empty { background: var(--surface); border: 1px dashed var(--line); border-radius: var(--radius); padding: 40px 20px; text-align: center; color: var(--muted); } .empty b { display: block; color: var(--ink); font-weight: 500; margin-bottom: 4px; } /* ---------------- 登录 / 安装 ---------------- */ .auth-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 40px 20px; } .auth-card { width: 100%; max-width: 400px; background: var(--surface); border: 1px solid var(--line); border-radius: 20px; box-shadow: var(--shadow-l); padding: 32px; } .auth-card .logo { width: 56px; height: 56px; border-radius: 14px; margin-bottom: 14px; } .auth-card h1 { font-size: 20px; font-weight: 600; margin: 0 0 4px; } .auth-card .lead { color: var(--muted); font-size: 14px; margin: 0 0 24px; } .auth-card .btn { width: 100%; margin-top: 20px; } .auth-foot { margin-top: 18px; font-size: 13px; color: var(--muted); text-align: center; } /* ---------------- 其他 ---------------- */ .muted { color: var(--muted); } .small { font-size: 13px; } .nowrap { white-space: nowrap; } .search { display: flex; gap: 8px; margin-bottom: 16px; } .search .input { max-width: 260px; } @media (max-width: 720px) { /* 390px 宽度放不下整套顶栏:只留 图标 + 导航 + 头像 + 退出 */ .topbar-inner { gap: 8px; padding: 0 12px; height: 54px; } .brand img { width: 26px; height: 26px; } .nav { gap: 0; } .nav a { padding: 6px 9px; font-size: 14px; } .topbar-right { gap: 8px; } .who-name, .who-pwd { display: none; } /* 名字与「改密码」收起,设置页里都有 */ .who img { width: 26px; height: 26px; } .container, .container-narrow { padding: 20px 16px 48px; } .form-grid { grid-template-columns: 1fr; } .detail { grid-template-columns: 1fr; } .hero { padding: 20px; gap: 14px; } .hero h1 { font-size: 20px; } .hero-stats { margin-left: 0; gap: 20px; } .page-head { flex-wrap: wrap; align-items: center; } .page-head .actions { margin-left: 0; width: 100%; } .kv-row { grid-template-columns: 84px 1fr; } .search { flex-wrap: wrap; } .search .input { max-width: none; flex: 1 1 auto; } }