/* =====================================================================
   动物星球 apwol.com 前台样式（H5 移动端自适应）
   主题色系（需求 5）：淡色天空蓝
   统一通过变量控制，改这里即可整体换色，无需逐条调整规则。
   ===================================================================== */
:root {
  /* —— 主色：天空蓝 —— */
  --brand: #3d9bd1;            /* 主色：柔和天空蓝 */
  --brand-dark: #2b7aa8;       /* 深一档：标题/悬停 */
  --brand-deep: #1f5f87;       /* 更深：强调文字 */
  --brand-light: #eaf5fc;      /* 极浅：选中底、标签底 */
  --brand-lighter: #f5fafe;    /* 更浅：区块底 */
  --accent: #f0b661;           /* 辅助暖色（积分/徽章），保留以作对比 */
  --text: #22323d;             /* 正文 */
  --text-2: #55707f;           /* 次要文字 */
  --muted: #8ba3b0;            /* 弱化文字 */
  --line: #dceaf3;             /* 描边（淡蓝） */
  --bg: #f4fafe;               /* 页面底色（极淡天空蓝） */
  --white: #fff;
  --danger: #c0503f;
  --warn: #b8860b;
  --radius: 12px;
  --shadow: 0 2px 10px rgba(31, 95, 135, .07);
  --shadow-lg: 0 8px 28px rgba(31, 95, 135, .12);
}
* { box-sizing: border-box; }

/**
 * 全局兜底：[hidden] 必须真正隐藏
 * ---------------------------------------------------------------
 * hidden 属性本身只是浏览器默认样式 `[hidden] { display: none }`，
 * 一旦元素自己的 class 里写了 display（flex / block / inline-flex…），
 * 作者样式就会覆盖它，导致 hidden 失效、元素照常显示。
 *
 * 本项目已因此出现过两个真实故障：
 *   1. 可视化编辑弹窗以「空壳」形态常驻显示，点「取消」无任何反应
 *   2. 会员卡片里「这是你自己的头像」提示一直显示
 *
 * 加 !important 后，任何位置的 hidden 都能可靠生效。
 */
[hidden] { display: none !important; }

html, body { margin: 0; padding: 0; }
body {
  font-family: "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Helvetica Neue", Arial, sans-serif;
  color: var(--text);
  background: var(--bg);
  line-height: 1.72;
  font-size: 15px;
  -webkit-text-size-adjust: 100%;
}
a { color: var(--brand); text-decoration: none; }
a:hover { color: var(--brand-dark); text-decoration: underline; }
img { max-width: 100%; height: auto; display: block; }
h1, h2, h3, h4 { margin: 0 0 .5em; line-height: 1.35; font-weight: 700; }
p { margin: 0 0 .8em; }
ul, ol { margin: 0 0 .8em; padding-left: 1.4em; }
code { background: #eef5fb; padding: 1px 5px; border-radius: 4px; font-size: .92em; color: #3a5f56; }
hr.pm-hr { border: 0; border-top: 1px solid var(--line); margin: 16px 0; }

.pm-container { max-width: 1180px; margin: 0 auto; padding: 0 18px; }
.pm-container--narrow { max-width: 860px; }
.pm-muted { color: var(--muted); }
.pm-small { font-size: 13px; }
.pm-center { text-align: center; }
.pm-center-block { margin: 0 auto; }
.pm-plus { color: #2e8b57; font-weight: 700; }
.pm-minus { color: var(--danger); font-weight: 700; }
.pm-req { color: var(--danger); }

/* ------------------------------- 头部 ------------------------------- */
.pm-header { background: var(--white); border-bottom: 1px solid var(--line); position: sticky; top: 0; z-index: 50; }
.pm-header__inner { display: flex; align-items: center; gap: 18px; min-height: 64px; }
.pm-logo { display: flex; align-items: center; gap: 8px; font-weight: 800; font-size: 19px; color: var(--brand-dark); }
.pm-logo:hover { text-decoration: none; }
/* 官方 logo：竖直比例较高，按高度约束并限制最大宽度，避免把导航挤下去 */
.pm-logo__img { height: 42px; width: auto; max-width: 78px; object-fit: contain; display: block; flex-shrink: 0; }
.pm-logo__mark { font-size: 22px; }
.pm-nav { display: flex; gap: 4px; margin-left: 8px; flex-wrap: wrap; }
.pm-nav a { padding: 7px 12px; border-radius: 8px; color: var(--text-2); font-weight: 500; }
.pm-nav a:hover { background: var(--brand-light); text-decoration: none; }
.pm-nav a.is-active { color: var(--brand-dark); background: var(--brand-light); font-weight: 700; }
.pm-header__actions { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.pm-nav-toggle { display: none; background: none; border: 1px solid var(--line); border-radius: 8px; font-size: 18px; padding: 4px 10px; cursor: pointer; }

/* 城市选择器 */
.pm-city-picker { position: relative; }
.pm-city-picker__btn { background: var(--brand-light); border: 1px solid transparent; color: var(--brand-dark); border-radius: 999px; padding: 6px 14px; cursor: pointer; font-size: 14px; font-weight: 600; }
.pm-city-picker__panel { position: absolute; right: 0; top: 44px; width: 330px; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-lg); padding: 14px; z-index: 60; }
.pm-city-picker__search { display: flex; gap: 8px; }
.pm-city-picker__search input { flex: 1; border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; font-size: 14px; }
.pm-city-picker__search button { border: 0; background: var(--brand); color: #fff; border-radius: 8px; padding: 8px 14px; cursor: pointer; }
.pm-city-picker__title { display: block; font-size: 12px; color: var(--muted); margin: 12px 0 6px; }
.pm-city-picker__tags { display: flex; flex-wrap: wrap; gap: 6px; }
.pm-city-picker__result { margin-top: 10px; max-height: 200px; overflow: auto; }
.pm-city-picker__result a { display: block; padding: 6px 8px; border-radius: 6px; font-size: 14px; }
.pm-city-picker__result a:hover { background: var(--brand-light); text-decoration: none; }
.pm-city-picker__tags a { background: #f2f8fd; border-radius: 999px; padding: 4px 10px; font-size: 13px; color: var(--text-2); }
.pm-city-picker__tags a:hover { background: var(--brand-light); text-decoration: none; }

/* ------------------------------- 按钮 ------------------------------- */
.pm-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; border: 1px solid transparent; border-radius: 9px; padding: 9px 18px; font-size: 14px; font-weight: 600; cursor: pointer; transition: .18s; background: #f1f5f4; color: var(--text); text-align: center; }
.pm-btn:hover { text-decoration: none; filter: brightness(.97); }
.pm-btn--primary { background: var(--brand); color: #fff; }
.pm-btn--primary:hover { background: var(--brand-dark); color: #fff; }
.pm-btn--ghost { background: var(--white); border-color: var(--line); color: var(--text-2); }
.pm-btn--ghost:hover { border-color: var(--brand); color: var(--brand); }
.pm-btn--danger { background: #fbeceb; color: var(--danger); }
.pm-btn--sm { padding: 5px 12px; font-size: 13px; border-radius: 7px; }
.pm-btn--lg { padding: 12px 26px; font-size: 16px; }
.pm-btn--block { display: flex; width: 100%; }
.pm-btn:disabled { opacity: .55; cursor: not-allowed; }

/* ------------------------------- 提示条 ------------------------------- */
.pm-flash { position: fixed; left: 50%; top: 14px; transform: translateX(-50%); z-index: 200; background: #2e8b57; color: #fff; padding: 10px 18px; border-radius: 10px; box-shadow: var(--shadow-lg); display: flex; gap: 12px; align-items: center; }
.pm-flash--error { background: var(--danger); }
.pm-flash button { background: none; border: 0; color: #fff; font-size: 18px; cursor: pointer; }

.pm-alert { border-radius: var(--radius); padding: 12px 16px; margin: 0 0 16px; background: var(--brand-light); border-left: 4px solid var(--brand); }
.pm-alert--error { background: #fbeceb; border-left-color: var(--danger); color: #7d2d22; }
.pm-alert--warn { background: #fdf6e3; border-left-color: var(--accent); color: #6d5211; }
.pm-alert--info { background: #eef4fb; border-left-color: #4a7fc1; color: #26486f; }
.pm-alert ul { margin: 0; }
.pm-notice { color: var(--text-2); background: #f2f8fd; border-radius: 10px; padding: 12px 16px; }

/* ------------------------------- 主体 ------------------------------- */
.pm-main { min-height: 60vh; padding-bottom: 40px; }
.pm-section { padding: 34px 0; }
.pm-section--alt { background: var(--white); }
.pm-section__title { font-size: 22px; margin-bottom: 18px; position: relative; padding-left: 14px; }
.pm-section__title::before { content: ''; position: absolute; left: 0; top: .28em; width: 5px; height: 1em; border-radius: 3px; background: var(--brand); }
.pm-section__head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.pm-more { font-size: 14px; }
.pm-page-title { font-size: 26px; margin-bottom: 10px; }
.pm-page-desc { color: var(--text-2); max-width: 900px; margin-bottom: 20px; }
.pm-breadcrumb { font-size: 13px; color: var(--muted); padding: 14px 0; display: flex; flex-wrap: wrap; gap: 6px; }
.pm-breadcrumb a { color: var(--text-2); }

/* ------------------------------- 首页 Hero ------------------------------- */
.pm-hero { background: linear-gradient(135deg, #eaf5fc 0%, #d9ede7 100%); padding: 46px 0; }
.pm-hero .pm-container { display: flex; align-items: center; gap: 30px; }
.pm-hero__text { flex: 1; min-width: 0; }
.pm-hero h1 { font-size: 30px; }
.pm-hero__sub { color: var(--text-2); font-size: 15.5px; max-width: 720px; }
.pm-hero__actions { display: flex; flex-wrap: wrap; gap: 10px; margin: 18px 0; }
.pm-hero__stats { display: flex; flex-wrap: wrap; gap: 20px; font-size: 13.5px; color: var(--text-2); margin: 0; }
.pm-hero__stats strong { color: var(--brand-dark); font-size: 16px; }
.pm-hero__art { width: 380px; max-width: 40%; flex-shrink: 0; }
.pm-hero--memorial { background: linear-gradient(135deg, #f2effa 0%, #e4dff3 100%); }
.pm-city-hero { background: linear-gradient(135deg, #eef3fb 0%, #dde8f8 100%); padding: 40px 0; }
.pm-page-head { background: linear-gradient(135deg, #f2f8fd 0%, #e3efeb 100%); padding: 38px 0; }

/* ------------------------------- 卡片网格 ------------------------------- */
.pm-cards3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.pm-entry { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 22px; display: block; color: var(--text); box-shadow: var(--shadow); transition: .2s; }
.pm-entry:hover { text-decoration: none; transform: translateY(-3px); box-shadow: var(--shadow-lg); border-color: #cfe4dd; }
.pm-entry__icon { font-size: 26px; display: block; margin-bottom: 8px; }
.pm-entry h3 { font-size: 17px; margin-bottom: 6px; }
.pm-entry p { color: var(--text-2); font-size: 14px; margin: 0; }

.pm-city-grid { display: flex; flex-wrap: wrap; gap: 10px; }
.pm-city-chip { background: var(--white); border: 1px solid var(--line); border-radius: 999px; padding: 7px 18px; font-size: 14px; color: var(--text-2); }
.pm-city-chip:hover { border-color: var(--brand); color: var(--brand); text-decoration: none; }

.pm-article-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.pm-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); }
.pm-card__link { display: block; color: var(--text); }
.pm-card__link:hover { text-decoration: none; }
.pm-card__cover { width: 100%; height: 160px; object-fit: cover; }
.pm-card__body { padding: 16px; }
.pm-card__body h3 { font-size: 16px; margin: 8px 0 6px; }
.pm-meta { font-size: 12.5px; color: var(--muted); display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.pm-tag { display: inline-block; background: var(--brand-light); color: var(--brand-dark); border-radius: 6px; padding: 2px 9px; font-size: 12px; font-weight: 600; }
.pm-tag--sm { font-size: 11.5px; padding: 1px 7px; }
.pm-tag--city { background: #eef4fb; color: #2f5c8f; }
.pm-tag--ok { background: #e8f3fc; color: #3d9bd1; }
.pm-tag--lg { font-size: 14px; padding: 7px 16px; }
.pm-tag-row { display: flex; flex-wrap: wrap; gap: 10px; }

.pm-provider-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.pm-provider-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; box-shadow: var(--shadow); }
.pm-provider-card h3 { font-size: 17px; margin-bottom: 8px; }
.pm-provider-card__tags { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }
.pm-provider-card__foot { margin: 10px 0 0; }
.pm-provider-card p { margin-bottom: 6px; }
.pm-link { font-weight: 600; }

/* ------------------------------- 列表 ------------------------------- */
.pm-list { list-style: none; padding: 0; }
.pm-list li { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding: 11px 0; border-bottom: 1px dashed var(--line); flex-wrap: wrap; }
.pm-list li:last-child { border-bottom: 0; }

.pm-article-list { display: flex; flex-direction: column; gap: 16px; }
.pm-article-item { display: flex; gap: 18px; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; box-shadow: var(--shadow); }
.pm-article-item__cover { width: 200px; flex-shrink: 0; border-radius: 10px; overflow: hidden; }
.pm-article-item__cover img { width: 100%; height: 130px; object-fit: cover; }
.pm-article-item__body { flex: 1; min-width: 0; }
.pm-article-item h3 { font-size: 17px; margin-bottom: 6px; }

.pm-layout { display: grid; grid-template-columns: 1fr 300px; gap: 26px; align-items: start; }
.pm-layout__side { display: flex; flex-direction: column; gap: 16px; position: sticky; top: 80px; }
.pm-side-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px; box-shadow: var(--shadow); }
.pm-side-card h3 { font-size: 15px; margin-bottom: 10px; }
.pm-side-card--notice { background: #fdf6e3; border-color: #f0e0b0; }
.pm-side-list { list-style: none; padding: 0; margin: 0; }
.pm-side-list li { margin-bottom: 4px; }
.pm-side-list a { display: block; padding: 6px 10px; border-radius: 7px; font-size: 14px; color: var(--text-2); }
.pm-side-list a:hover, .pm-side-list a.is-active { background: var(--brand-light); color: var(--brand-dark); text-decoration: none; }
.pm-side-card__tel { font-size: 20px; font-weight: 800; color: var(--brand-dark); margin: 0 0 6px; }

/* ------------------------------- 筛选 ------------------------------- */
.pm-filter { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px 16px; margin-bottom: 20px; }
.pm-filter__row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; padding: 6px 0; }
.pm-filter__label { font-size: 13px; color: var(--muted); }
.pm-filter__item { font-size: 13.5px; padding: 4px 12px; border-radius: 999px; color: var(--text-2); background: #f3f7f6; }
.pm-filter__item:hover { text-decoration: none; background: var(--brand-light); }
.pm-filter__item.is-active { background: var(--brand); color: #fff; font-weight: 600; }
.pm-filter__search { display: flex; gap: 8px; margin-top: 10px; }
.pm-filter__search input { flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: 8px; padding: 8px 12px; font-size: 14px; }

/* ------------------------------- 文章正文 ------------------------------- */
.pm-article { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 26px; box-shadow: var(--shadow); }
.pm-article__meta { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; font-size: 13px; color: var(--muted); padding-bottom: 14px; border-bottom: 1px solid var(--line); margin-bottom: 18px; }
.pm-article__cover { border-radius: 10px; margin-bottom: 18px; }
.pm-article__content { font-size: 16px; line-height: 1.9; }
.pm-article__content h3 { font-size: 18px; margin: 24px 0 10px; padding-left: 12px; border-left: 4px solid var(--brand); }
.pm-article__content h4 { font-size: 16px; margin: 18px 0 8px; }
.pm-article__content ul, .pm-article__content ol { padding-left: 1.5em; }
.pm-article__content li { margin-bottom: 4px; }
.pm-article__content blockquote { margin: 14px 0; padding: 10px 16px; background: var(--brand-light); border-left: 4px solid var(--brand); border-radius: 8px; color: var(--text-2); }
.pm-article__content table { width: 100%; border-collapse: collapse; margin: 14px 0; }
.pm-article__content th, .pm-article__content td { border: 1px solid var(--line); padding: 8px 10px; }
.pm-article__cta { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; background: var(--brand-light); border-radius: var(--radius); padding: 18px; margin-top: 24px; }
.pm-article__cta h3 { margin-bottom: 4px; font-size: 17px; }

.pm-disclaimer { background: #fdf6e3; border: 1px solid #f0e0b0; border-radius: var(--radius); padding: 14px 18px; margin: 24px 0; font-size: 13.5px; color: #6d5211; }
.pm-disclaimer p { margin: 4px 0 0; }
.pm-agreement { white-space: pre-wrap; background: #f4fafe; border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; font-size: 14px; }

/* ------------------------------- 表单 ------------------------------- */
.pm-form fieldset { border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; margin: 0 0 20px; background: var(--white); }
.pm-form legend { font-weight: 700; padding: 0 8px; font-size: 15px; }
.pm-field { margin-bottom: 16px; }
.pm-field > label { display: block; font-size: 13.5px; font-weight: 600; color: var(--text-2); margin-bottom: 6px; }
.pm-field input[type=text], .pm-field input[type=password], .pm-field input[type=email], .pm-field input[type=tel],
.pm-field input[type=number], .pm-field input[type=date], .pm-field select, .pm-field textarea {
  width: 100%; border: 1px solid var(--line); border-radius: 9px; padding: 9px 12px; font-size: 14.5px; font-family: inherit; background: var(--white); color: var(--text);
}
.pm-field textarea { resize: vertical; line-height: 1.7; }
.pm-field input:focus, .pm-field select:focus, .pm-field textarea:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(47, 125, 110, .12); }
.pm-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.pm-hint { font-size: 12.5px; color: var(--muted); margin: 4px 0 0; }
.pm-form__actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 20px 0; }
.pm-form--compact .pm-field { margin-bottom: 10px; }
.pm-form--inline { display: flex; gap: 10px; align-items: flex-end; flex-wrap: wrap; }
.pm-inline-form { display: inline-block; margin: 0; }
.pm-checks { display: flex; flex-wrap: wrap; gap: 12px; }
.pm-check { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 400; color: var(--text); }
.pm-check--agree { display: flex; align-items: flex-start; background: #f4fafe; border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 14px; font-size: 13.5px; }
.pm-radio-group { display: flex; flex-direction: column; gap: 10px; }
.pm-radio { display: flex; align-items: flex-start; gap: 8px; font-size: 14px; }

.pm-captcha-row { display: flex; gap: 10px; align-items: center; }
.pm-captcha { height: 40px; width: 120px; border-radius: 8px; border: 1px solid var(--line); cursor: pointer; }

.pm-table { width: 100%; border-collapse: collapse; background: var(--white); border-radius: var(--radius); overflow: hidden; margin-bottom: 16px; }
.pm-table th, .pm-table td { border-bottom: 1px solid var(--line); padding: 10px 12px; text-align: left; font-size: 14px; }
.pm-table thead th { background: #f2f8fd; font-size: 13px; color: var(--text-2); }
.pm-table tbody tr:last-child td { border-bottom: 0; }

/* ------------------------------- 上传 ------------------------------- */
.pm-upload { margin-bottom: 16px; }
.pm-upload > label { display: block; font-size: 13.5px; font-weight: 600; color: var(--text-2); margin-bottom: 6px; }
.pm-upload__box { border: 2px dashed #cfe0da; border-radius: var(--radius); padding: 22px; text-align: center; color: var(--muted); cursor: pointer; background: #fbfdff; transition: .18s; }
.pm-upload__box:hover { border-color: var(--brand); color: var(--brand); background: var(--brand-light); }
.pm-upload__preview { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; }
.pm-upload__preview figure, .pm-upload__preview .pm-upload__item { position: relative; margin: 0; }
.pm-upload__preview img { width: 110px; height: 110px; object-fit: cover; border-radius: 10px; border: 1px solid var(--line); }
.pm-upload__del { position: absolute; right: -6px; top: -6px; background: var(--danger); color: #fff; border: 0; border-radius: 50%; width: 22px; height: 22px; cursor: pointer; line-height: 1; }
.pm-upload-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }

/* ------------------------------- 服务商详情 ------------------------------- */
.pm-detail-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin-bottom: 20px; }
.pm-detail-item { background: var(--white); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
.pm-detail-item span { display: block; font-size: 12.5px; color: var(--muted); }
.pm-detail-item strong { font-size: 15px; }
.pm-detail-text { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px; }
.pm-map { width: 100%; height: 360px; background: #eef5fb; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; position: relative; }
.pm-map__placeholder { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; text-align: center; padding: 20px; color: var(--text-2); }
.pm-gallery { display: flex; flex-wrap: wrap; gap: 12px; }
.pm-gallery figure { margin: 0; }
.pm-gallery img { width: 170px; height: 130px; object-fit: cover; border-radius: 10px; border: 1px solid var(--line); }
.pm-gallery figcaption { font-size: 12px; color: var(--muted); text-align: center; margin-top: 4px; }
.pm-gallery--memorial img { width: 190px; height: 190px; }
.pm-actions-row { display: flex; gap: 10px; flex-wrap: wrap; margin: 16px 0; }
.pm-report { margin: 20px 0; background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px 18px; }
.pm-report summary { cursor: pointer; font-weight: 600; color: var(--text-2); }
.pm-report form { margin-top: 14px; }

/* ------------------------------- 灵堂 ------------------------------- */
.pm-memorial-cta { display: flex; align-items: center; gap: 26px; background: linear-gradient(135deg, #f2effa, #e7e2f5); border-radius: var(--radius); padding: 28px; }
.pm-memorial-cta__art { width: 240px; flex-shrink: 0; }
.pm-item-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 14px; }
.pm-item-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px; text-align: center; box-shadow: var(--shadow); }
.pm-item-card img { width: 100%; height: 96px; object-fit: contain; margin-bottom: 8px; }
.pm-item-card h3 { font-size: 14.5px; margin-bottom: 4px; }
.pm-item-card__points { font-size: 13px; color: var(--brand-dark); margin: 6px 0; }
.pm-item-card__points strong { font-size: 17px; }
.pm-item-grid--shop { grid-template-columns: repeat(4, 1fr); }
.pm-rules { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 22px; margin-bottom: 20px; }
.pm-rules ul { margin: 0; }
.pm-rules--compact { background: #f4fafe; border: 1px solid var(--line); border-radius: var(--radius); padding: 14px; text-align: left; margin-top: 16px; }
.pm-shop-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; flex-wrap: wrap; margin-bottom: 18px; }
.pm-shop-balance { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px 20px; text-align: center; box-shadow: var(--shadow); }
.pm-shop-balance > span { display: block; font-size: 12.5px; color: var(--muted); }
.pm-shop-balance > strong { font-size: 30px; color: var(--brand-dark); display: block; line-height: 1.2; }
.pm-alert--strong { font-size: 14px; }
.pm-memorial-detail { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 24px; box-shadow: var(--shadow); }
.pm-memorial-head { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; align-items: flex-start; border-bottom: 1px solid var(--line); padding-bottom: 14px; margin-bottom: 18px; }
.pm-memorial-head h1 { font-size: 24px; margin-bottom: 8px; }
.pm-memorial-head__actions { display: flex; gap: 8px; flex-wrap: wrap; }
.pm-memorial-stage-wrap { margin-bottom: 20px; }
.pm-place-stage { position: relative; width: 100%; height: 420px; border-radius: var(--radius); overflow: hidden; border: 1px solid var(--line); background: linear-gradient(180deg, #f6f4fb 0%, #ece8f6 70%, #e2dcef 100%); }
.pm-place-stage--view { height: 380px; }
.pm-place-stage__bg { position: absolute; inset: 0; background-image: radial-gradient(circle at 20% 30%, rgba(255,255,255,.8) 0, transparent 22%), radial-gradient(circle at 78% 24%, rgba(255,255,255,.7) 0, transparent 18%); }
.pm-place-stage__hint { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); color: #9a92b5; font-size: 14px; text-align: center; pointer-events: none; }
.pm-placed { position: absolute; transform: translate(-50%, -50%); width: 68px; text-align: center; cursor: grab; }
.pm-placed img { width: 68px; height: 68px; object-fit: contain; filter: drop-shadow(0 4px 8px rgba(70,60,110,.25)); }
.pm-placed--view { cursor: default; }
.pm-placed__del { position: absolute; right: -4px; top: -4px; background: var(--danger); color: #fff; border: 0; border-radius: 50%; width: 20px; height: 20px; cursor: pointer; line-height: 1; font-size: 13px; }
.pm-place-layout { display: grid; grid-template-columns: 1fr 300px; gap: 22px; align-items: start; }
.pm-place-bag { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px; }
.pm-bag-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.pm-bag-grid--sm { grid-template-columns: repeat(4, 1fr); }
.pm-bag-item { position: relative; border: 1px solid var(--line); border-radius: 10px; padding: 8px; text-align: center; cursor: grab; background: #fbfdff; }
.pm-bag-item.is-used { opacity: .6; }
.pm-bag-item img { width: 100%; height: 56px; object-fit: contain; }
.pm-bag-item__name { display: block; font-size: 12px; color: var(--text-2); margin-top: 4px; }
.pm-bag-item__flag { position: absolute; right: 4px; top: 4px; background: var(--brand); color: #fff; font-size: 10px; border-radius: 4px; padding: 0 4px; }
.pm-memorial-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
.pm-memorial-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; box-shadow: var(--shadow); }
.pm-memorial-card__head { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.pm-memorial-card__head h2 { font-size: 18px; margin: 0; }
.pm-memorial-card__actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
.pm-badge { display: inline-block; border-radius: 999px; padding: 2px 10px; font-size: 12px; font-weight: 600; background: #eef2f1; color: var(--text-2); }
.pm-badge--ok { background: #e8f3fc; color: #3d9bd1; }
.pm-badge--err { background: #fbeceb; color: var(--danger); }
.pm-badge--wait { background: #fdf6e3; color: var(--warn); }

.pm-center-head { display: flex; justify-content: space-between; gap: 20px; flex-wrap: wrap; align-items: flex-start; margin-bottom: 20px; }
.pm-points-box { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 20px; min-width: 260px; box-shadow: var(--shadow); }
.pm-points-box > span { font-size: 12.5px; color: var(--muted); }
.pm-points-box > strong { display: block; font-size: 30px; color: var(--brand-dark); line-height: 1.2; }
.pm-points-box__actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.pm-dashboard-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.pm-panel { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 18px; box-shadow: var(--shadow); }
.pm-panel h2 { font-size: 16px; }
.pm-rules-list { list-style: none; padding: 0; margin: 0; }
.pm-rules-list li { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px dashed var(--line); }
.pm-rules-list li span:first-child { flex: 1; }
.pm-rules-list strong { color: var(--brand-dark); }

.pm-auth { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 30px; box-shadow: var(--shadow); max-width: 460px; margin: 30px auto; }
.pm-auth h1 { font-size: 22px; }
.pm-auth__foot { text-align: center; margin-top: 14px; font-size: 14px; }
.pm-center-block { padding: 30px 18px; }
.pm-success, .pm-locked, .pm-unavailable, .pm-error-page { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 36px 28px; box-shadow: var(--shadow); text-align: center; max-width: 640px; margin: 24px auto; }
.pm-success__icon, .pm-locked__icon, .pm-unavailable__icon { font-size: 42px; margin-bottom: 10px; }
.pm-error-page__code { font-size: 64px; font-weight: 800; color: var(--brand); line-height: 1; }
.pm-error-page__links { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; margin-top: 20px; font-size: 14px; }
.pm-empty { background: var(--white); border: 1px dashed var(--line); border-radius: var(--radius); padding: 40px 20px; text-align: center; color: var(--text-2); }

.pm-tool-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.pm-tool-card { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 20px; box-shadow: var(--shadow); }
.pm-tool-card h2 { font-size: 17px; }
.pm-checklist { padding-left: 1.2em; margin: 0; }
.pm-checklist li { margin-bottom: 6px; font-size: 14px; color: var(--text-2); }

.pm-static-content { background: var(--white); border: 1px solid var(--line); border-radius: var(--radius); padding: 26px; box-shadow: var(--shadow); }
.pm-static-content h2 { font-size: 18px; margin-top: 22px; }
.pm-static-content h2:first-child { margin-top: 0; }
.pm-link-list { list-style: none; padding: 0; }
.pm-link-list li { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-bottom: 1px dashed var(--line); flex-wrap: wrap; }
.pm-link-list img { height: 28px; width: auto; }
.pm-contact-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.pm-contact-item { border: 1px solid var(--line); border-radius: 10px; padding: 16px; }
.pm-contact-item h3 { font-size: 15.5px; }
.pm-info-list { list-style: none; padding: 0; }
.pm-info-list li { display: flex; gap: 14px; padding: 8px 0; border-bottom: 1px dashed var(--line); }
.pm-info-list span { color: var(--muted); min-width: 96px; font-size: 14px; }
.pm-links-block { margin-top: 20px; }

/* ------------------------------- Banner ------------------------------- */
.pm-banner { padding: 18px 18px 0; max-width: 1180px; margin: 0 auto; display: flex; gap: 12px; flex-wrap: wrap; }
.pm-banner__item { display: block; flex: 1 1 320px; border-radius: var(--radius); overflow: hidden; }
.pm-banner__item img { width: 100%; height: auto; }

/* ------------------------------- 分页 ------------------------------- */
.pm-pagination { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; margin: 24px 0; }
.pm-pagination a, .pm-pagination span { padding: 6px 12px; border-radius: 8px; border: 1px solid var(--line); background: var(--white); font-size: 13.5px; color: var(--text-2); }
.pm-pagination a:hover { border-color: var(--brand); color: var(--brand); text-decoration: none; }
.pm-pagination .is-current { background: var(--brand); color: #fff; border-color: var(--brand); font-weight: 700; }
.pm-pagination .is-disabled { color: #c3cfcb; }
.pm-pagination__dots { border: 0 !important; background: none !important; }
.pm-pagination__total { border: 0 !important; background: none !important; color: var(--muted); font-size: 12.5px; }

/* ------------------------------- 全国城市地图 ------------------------------- */
.pm-map-layout { display: grid; grid-template-columns: 1fr 300px; gap: 22px; align-items: start; }
.pm-map-layout__side { display: flex; flex-direction: column; gap: 16px; }
.pm-map-toolbar { display: flex; justify-content: space-between; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 12px; }
.pm-map-toolbar__search { display: flex; gap: 8px; flex: 1; min-width: 260px; }
.pm-map-toolbar__search input { flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: 9px; padding: 9px 12px; font-size: 14px; font-family: inherit; }
.pm-map-toolbar__meta { font-size: 13px; color: var(--text-2); }
.pm-map--nation { height: 560px; }
.pm-province-list { display: flex; flex-wrap: wrap; gap: 6px; max-height: 340px; overflow-y: auto; }
.pm-province-chip { display: inline-flex; align-items: center; gap: 4px; background: #f3f7f6; border-radius: 999px; padding: 4px 10px; font-size: 12.5px; color: var(--text-2); }
.pm-province-chip:hover { background: var(--brand-light); text-decoration: none; }
.pm-province-chip.is-active { background: var(--brand); color: #fff; font-weight: 600; }
.pm-province-chip__count { background: rgba(0, 0, 0, .08); border-radius: 999px; padding: 0 6px; font-size: 11px; }
.pm-province-chip.is-active .pm-province-chip__count { background: rgba(255, 255, 255, .25); }
.pm-province-block { margin-bottom: 18px; }
.pm-province-block h3 { font-size: 15.5px; margin-bottom: 8px; padding-left: 10px; border-left: 3px solid var(--brand); }
.pm-city-chip.is-hot { border-color: var(--brand); color: var(--brand-dark); font-weight: 600; }
.pm-map-info { font-size: 13px; line-height: 1.6; }
.pm-map-info a { font-weight: 600; }
.pm-map-info__meta { color: var(--muted); font-size: 12px; }

@media (max-width: 900px) {
  .pm-map-layout { grid-template-columns: 1fr; }
  .pm-map--nation { height: 420px; }
}

/* ------------------------------- 底部 ------------------------------- */
.pm-footer { background: #22322e; color: #c9d6d2; margin-top: 40px; padding: 34px 0 20px; font-size: 13.5px; }
.pm-footer a { color: #cfe4dd; }
.pm-footer a:hover { color: #fff; }
.pm-footer__grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 24px; }
.pm-footer__col h4 { color: #fff; font-size: 14.5px; margin-bottom: 10px; }
.pm-footer__links { list-style: none; padding: 0; margin: 0; }
.pm-footer__links li { margin-bottom: 6px; }
.pm-footer__qr { display: flex; gap: 14px; }
.pm-footer__qr figure { margin: 0; text-align: center; }
.pm-footer__qr img { width: 92px; height: 92px; object-fit: contain; background: #fff; border-radius: 8px; padding: 4px; }
.pm-footer__qr figcaption { font-size: 12px; margin-top: 4px; }
.pm-footer__links-row { border-top: 1px solid #37473f; margin-top: 22px; padding-top: 14px; display: flex; gap: 10px; flex-wrap: wrap; }
.pm-footer__bottom { border-top: 1px solid #37473f; margin-top: 14px; padding-top: 14px; }
.pm-footer__bottom p { display: flex; gap: 16px; flex-wrap: wrap; margin: 0 0 6px; }
.pm-footer__notice { color: #93a5a0; font-size: 12.5px; }
.pm-footer .pm-muted { color: #93a5a0; }

/* ------------------------------- 响应式 ------------------------------- */
@media (max-width: 1080px) {
  .pm-item-grid { grid-template-columns: repeat(3, 1fr); }
  .pm-item-grid--shop { grid-template-columns: repeat(3, 1fr); }
  .pm-provider-grid, .pm-article-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 900px) {
  .pm-layout { grid-template-columns: 1fr; }
  .pm-layout__side { position: static; }
  .pm-place-layout { grid-template-columns: 1fr; }
  .pm-footer__grid { grid-template-columns: 1fr 1fr; }
  .pm-hero .pm-container { flex-direction: column; align-items: flex-start; }
  .pm-hero__art { width: 100%; max-width: 100%; }
  .pm-cards3 { grid-template-columns: 1fr; }
  .pm-tool-grid, .pm-dashboard-grid, .pm-contact-grid, .pm-detail-grid { grid-template-columns: 1fr; }
  .pm-memorial-list { grid-template-columns: 1fr; }
}
@media (max-width: 768px) {
  body { font-size: 14.5px; }
  .pm-nav-toggle { display: block; margin-left: auto; }
  .pm-nav { display: none; flex-basis: 100%; order: 3; }
  .pm-nav.is-open { display: flex; flex-direction: column; }
  .pm-header__inner { flex-wrap: wrap; padding: 10px 0; }
  .pm-header__actions { margin-left: 0; order: 2; }
  .pm-city-picker__panel { right: auto; left: 0; width: min(92vw, 330px); }
  .pm-hero { padding: 30px 0; }
  .pm-hero h1 { font-size: 23px; }
  .pm-section__title { font-size: 19px; }
  .pm-page-title { font-size: 21px; }
  .pm-article { padding: 18px; }
  .pm-provider-grid, .pm-article-grid, .pm-item-grid, .pm-item-grid--shop { grid-template-columns: repeat(2, 1fr); }
  .pm-article-item { flex-direction: column; }
  .pm-article-item__cover { width: 100%; }
  .pm-article-item__cover img { height: 170px; }
  .pm-field-row, .pm-upload-grid { grid-template-columns: 1fr; }
  .pm-bag-grid, .pm-bag-grid--sm { grid-template-columns: repeat(3, 1fr); }
  .pm-place-stage { height: 320px; }
  .pm-memorial-cta { flex-direction: column; }
  .pm-memorial-cta__art { width: 100%; }
  .pm-footer__grid { grid-template-columns: 1fr; }
  .pm-table { display: block; overflow-x: auto; white-space: nowrap; }
}
@media (max-width: 480px) {
  .pm-container { padding: 0 12px; }
  .pm-item-grid, .pm-item-grid--shop, .pm-provider-grid { grid-template-columns: 1fr 1fr; }
  .pm-form__actions .pm-btn { width: 100%; }
}

/* ==================== 服务商展示位：虚位以待 / 置顶推荐 ==================== */
.pm-provider-card { position: relative; }
.pm-provider-card--vacant {
  border: 1px dashed #bcd9ec;
  background: linear-gradient(180deg, #f7fbfa 0%, #eef5f3 100%);
  box-shadow: none;
}
.pm-provider-card--vacant:hover { border-color: #3d9bd1; box-shadow: 0 6px 18px rgba(47,125,110,.10); }
.pm-provider-card--vacant h3 a { color: #3d9bd1; }
.pm-vacant-badge {
  position: absolute; top: 12px; right: 12px;
  background: #e6f2ee; color: #3d9bd1; border: 1px solid #bcd9ec;
  font-size: 11.5px; padding: 2px 8px; border-radius: 20px; letter-spacing: .5px;
}
.pm-top-badge {
  position: absolute; top: 12px; right: 12px;
  background: #fff3e0; color: #b26a00; border: 1px solid #f0cfa0;
  font-size: 11.5px; padding: 2px 8px; border-radius: 20px;
}
.pm-vacant-cta { margin: 8px 0 0; }
.pm-section__sub { color: #8ba3b0; font-size: 13px; margin: -6px 0 14px; }

/* ==================== 顶栏自适应（新增栏目后避免换行挤压） ==================== */
.pm-header__inner { flex-wrap: nowrap; gap: 12px; }
.pm-nav { flex-wrap: nowrap; margin-left: 4px; overflow: hidden; }
.pm-nav a { padding: 7px 9px; white-space: nowrap; font-size: 14.5px; }
.pm-header__actions { margin-left: auto; flex-shrink: 0; display: flex; align-items: center; gap: 8px; }
.pm-city-picker__btn { white-space: nowrap; }
@media (max-width: 1320px) {
  .pm-nav a { padding: 7px 7px; font-size: 14px; }
}
@media (max-width: 1200px) {
  .pm-nav a { padding: 7px 6px; font-size: 13.5px; }
}

/* ==================== 城市内页广告位（需求 E） ==================== */
.pm-ad-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
.pm-ad-cell { position: relative; display: flex; flex-direction: column; gap: 4px; padding: 14px 16px; border-radius: 10px; background: #fff; border: 1px solid var(--line); text-decoration: none; color: var(--text); transition: .16s; min-height: 86px; }
.pm-ad-cell:hover { border-color: var(--brand); box-shadow: 0 4px 14px rgba(47,125,110,.10); text-decoration: none; }
.pm-ad-cell--vacant { border: 1px dashed #bcd9ec; background: linear-gradient(180deg,#f8fbfa,#eef5f3); cursor: default; }
.pm-ad-cell--vacant:hover { box-shadow: none; border-color: #bcd9ec; }
.pm-ad-cell__badge { position: absolute; top: 10px; right: 12px; font-size: 11px; color: #3d9bd1; background: #e6f2ee; border: 1px solid #bcd9ec; border-radius: 20px; padding: 1px 8px; }
.pm-ad-cell__no { font-size: 11.5px; color: #8ba3b0; letter-spacing: .5px; }
.pm-ad-cell__title { font-weight: 600; font-size: 14.5px; line-height: 1.4; }
.pm-ad-cell__hint { font-size: 12.5px; color: #8ba3b0; margin-top: auto; }
.pm-medal { position: absolute; top: 12px; right: 12px; display: inline-flex; align-items: center; gap: 3px; font-size: 11.5px; padding: 2px 8px; border-radius: 20px; border: 1px solid; }
.pm-medal--gold { background: #fff8e1; border-color: #f0d27a; color: #a07800; }
.pm-medal--silver { background: #f5f7f9; border-color: #c9d3da; color: #5f7480; }
.pm-medal--bronze { background: #fdf1e7; border-color: #e0b48c; color: #a05a1e; }
.pm-medal__icon { font-size: 13px; }
.pm-points { color: #c26a00; }
.pm-table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.pm-table th, .pm-table td { padding: 8px 10px; border-bottom: 1px solid var(--line); text-align: left; }
.pm-table th { background: #f5fafe; color: #55707f; font-weight: 600; }
.pm-bid-layout, .pm-merchant-layout, .pm-contract-layout { display: grid; grid-template-columns: minmax(0,1fr) 320px; gap: 24px; align-items: start; }
.pm-slot-strip { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px,1fr)); gap: 8px; }
.pm-slot-cell { border: 1px solid var(--line); border-radius: 8px; padding: 8px 10px; font-size: 12.5px; display: flex; flex-direction: column; gap: 2px; }
.pm-slot-cell.is-vacant { border-style: dashed; color: #8ba3b0; }
.pm-slot-cell__no { color: #8ba3b0; font-size: 11px; }
.pm-check-list { margin: 0; padding-left: 20px; }
.pm-check-list li { margin-bottom: 5px; font-size: 14px; }
.pm-checkbox-group { display: flex; flex-wrap: wrap; gap: 10px 18px; }
.pm-checkbox { display: flex; align-items: center; gap: 6px; font-size: 14px; }
.pm-contract-body { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 26px 30px; line-height: 1.9; font-size: 14.5px; }
.pm-contract-body h3 { margin: 20px 0 8px; font-size: 15.5px; color: var(--brand-dark); }
.pm-contract-agree { margin: 18px 0; padding: 14px 16px; background: #f5fafe; border: 1px solid var(--line); border-radius: 10px; }
.pm-field__hint { font-size: 12.5px; color: #8ba3b0; margin: 4px 0 0; }
.pm-form__title { margin: 22px 0 12px; font-size: 16px; padding-left: 10px; border-left: 4px solid var(--brand); }
.pm-form__actions--stack { flex-direction: column; align-items: stretch; }
.pm-card--warn { border-color: #f0cfa0; background: #fffdf7; }
.pm-alert--success { background: #e8f3fc; border-color: #b7ddc4; }
@media (max-width: 980px) {
  .pm-bid-layout, .pm-merchant-layout, .pm-contract-layout { grid-template-columns: 1fr; }
}

/* ==================== 文章页广告位（前台） ==================== */
.pm-article__ad { margin: 18px 0; }
.pm-article__ad--bottom { margin: 22px 0; }
.pm-side-card--ad { padding: 0; overflow: hidden; border: 0; background: transparent; }
.pm-brand-anchor { margin-top: 8px; font-size: 13px; color: #55707f; }

/* ==================== 首页视觉升级：更大气、国际化（需求 ④） ==================== */
:root {
  --ink: #16211e;
  --ink-2: #2b3a36;
  --brand-deep: #1c5a4e;
  --brand-bright: #4fb0dd;
  --sand: #f7f4ee;
}

/* 顶栏：更细分隔与更稳的视觉重心 */
.pm-header { background: rgba(255,255,255,.92); backdrop-filter: saturate(180%) blur(10px); border-bottom: 1px solid rgba(226,235,232,.9); }

/**
 * 站点名（顶栏 logo 右侧文字）
 * ---------------------------------------------------------------
 * 必须**始终不换行**、字号随视口收缩 —— 否则窄屏上会被 logo 与导航
 * 挤成两行（真实出现过「动物星 / 球」）。
 * 注意：这条必须写在基础层，不能只写在媒体查询里，
 * 否则宽屏（不匹配媒体查询）时不生效 —— 这正是之前的 bug。
 */
.pm-logo__text {
  font-size: clamp(14px, 1.25vw, 19px);
  white-space: nowrap;
  flex-shrink: 0;
  letter-spacing: .2px;
}

/* Hero：更大留白、更强层次、国际化排版 */
.pm-hero {
  position: relative;
  overflow: hidden;
  background:
    radial-gradient(1100px 460px at 84% -8%, rgba(55,160,139,.16), transparent 62%),
    radial-gradient(760px 360px at 6% 8%, rgba(120,190,175,.14), transparent 60%),
    linear-gradient(180deg, #fbfdff 0%, #f4f9fe 100%);
  padding: 74px 0 0;
  border-bottom: 1px solid rgba(226,235,232,.8);
}
.pm-hero__glow { position: absolute; inset: auto -10% -40% -10%; height: 300px; background: radial-gradient(closest-side, rgba(55,160,139,.12), transparent); pointer-events: none; }
/*
 * Hero 网格：**保持原有两列样式，不要改动**。
 * ---------------------------------------------------------------------
 * ⚠️ 教训（2026-10-17，站长明确要求「原样式不要动」）：
 *   曾为了放"萌宠指路区"把这里改成三列、又改成"指南区独占整行"，
 *   结果 hero 高度从 753px 涨到 1123px、整块被拉得很长，
 *   破坏了原来的版面美观。现已**完全回滚**为原样式。
 *   萌宠指路区改为放入 hero 内**原有的空白列**里（见 .pm-guide 的定位），
 *   不再参与这里的网格定义。
 */
.pm-hero .pm-container {
  display: grid;
  grid-template-columns: minmax(0, 1.12fr) minmax(0, .88fr);
  align-items: center;
  gap: 48px;
  position: relative;
}

.pm-hero .pm-hero__text { grid-column: 1; grid-row: 1; }
.pm-hero .pm-hero-board { grid-column: 2; grid-row: 1; }

.pm-hero__eyebrow {
  display: inline-flex; align-items: center; gap: 9px;
  font-size: 13.5px; color: var(--brand-deep);
  background: rgba(255,255,255,.85); border: 1px solid rgba(55,160,139,.28);
  border-radius: 999px; padding: 7px 16px; margin: 0 0 22px;
  box-shadow: 0 1px 2px rgba(22,33,30,.04);
}
.pm-hero__eyebrow strong { color: var(--brand-deep); }
.pm-hero__dot { width: 7px; height: 7px; border-radius: 50%; background: #4fb0dd; box-shadow: 0 0 0 4px rgba(55,160,139,.16); }

.pm-hero__title {
  font-size: clamp(30px, 3.5vw, 50px);
  line-height: 1.2;
  letter-spacing: -.6px;
  color: var(--ink);
  margin: 0 0 20px;
  font-weight: 800;
}
.pm-hero__title-accent {
  background: linear-gradient(96deg, var(--brand-deep) 8%, var(--brand-bright) 78%);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.pm-hero__sub { font-size: 16.5px; line-height: 1.95; color: var(--ink-2); max-width: 620px; margin: 0 0 30px; }

.pm-hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 34px; }
.pm-hero__actions .pm-btn { border-radius: 999px; }

.pm-hero__stats {
  list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 14px; margin: 0; padding: 22px 0 0; border-top: 1px solid rgba(226,235,232,.95);
}
.pm-hero__stats li { display: flex; flex-direction: column; gap: 2px; }
.pm-hero__stats strong { font-size: 27px; color: var(--brand-deep); letter-spacing: -.5px; font-variant-numeric: tabular-nums; }
.pm-hero__stats span { font-size: 13px; color: #7e97a5; }

.pm-hero__art img { width: 100%; max-width: 520px; display: block; margin-left: auto; }
.pm-hero__art { position: relative; }

.pm-hero__trust { margin-top: 46px; background: rgba(255,255,255,.75); border-top: 1px solid rgba(226,235,232,.95); backdrop-filter: blur(6px); }
.pm-hero__trust .pm-container { display: flex; flex-wrap: wrap; gap: 10px 30px; padding: 15px 20px; justify-content: center; }
.pm-hero__trust-item { font-size: 13px; color: #55707f; white-space: nowrap; }

/* 区块标题：更克制的国际化样式 */
.pm-section__title { font-size: 22px; letter-spacing: -.2px; }

/* 首页卡片：更柔和的层次与悬停反馈 */
.pm-entry, .pm-city-card, .pm-landing-card, .pm-news-card, .pm-provider-card, .pm-ad-cell {
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.pm-entry:hover, .pm-city-card:hover, .pm-landing-card:hover, .pm-news-card:hover { transform: translateY(-2px); }

@media (max-width: 980px) {
  .pm-hero { padding-top: 46px; }
  .pm-hero .pm-container { grid-template-columns: 1fr; gap: 26px; }
  .pm-hero__art { order: -1; max-width: 320px; margin: 0 auto; }
  .pm-hero__art img { margin: 0 auto; }
  .pm-hero__sub { font-size: 15.5px; }
  .pm-hero__trust .pm-container { padding: 12px 16px; gap: 8px 16px; }
  .pm-hero__trust-item { font-size: 12.5px; }
}

/* 修正：旧样式 .pm-hero__art{max-width:40%} 会压小 Hero 配图，这里覆盖为固定宽度 */
.pm-hero .pm-hero__art { width: 100%; max-width: none; flex-shrink: 1; }
.pm-hero__art img { max-width: 100%; }

/* ==================== 城市快速检索组件（需求 2） ==================== */
.pm-city-select { display: flex; flex-direction: column; gap: 8px; }
.pm-city-select__filter { width: 100%; padding: 9px 12px; border: 1px solid var(--line); border-radius: 8px; font-size: 14.5px; }
.pm-city-select__filter:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(47,125,110,.12); }
.pm-city-select select { width: 100%; padding: 9px 12px; border: 1px solid var(--line); border-radius: 8px; font-size: 14.5px; background: #fff; max-height: 240px; }
.pm-city-select__tip { margin: 0; }
.pm-city-select__tip.pm-minus { color: #a43a2b; }
.pm-card--wide { grid-column: 1 / -1; }
.pm-panel--merchant { border-left: 4px solid var(--brand); }
.pm-panel__actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.pm-merchant-edit { max-width: 100%; }

/* ==================== 文章页侧边轮播广告位（需求 5） ==================== */
.pm-carousel { padding: 0; overflow: hidden; border: 1px solid var(--line); border-radius: 12px; background: #fff; }
.pm-carousel__track { position: relative; width: 100%; aspect-ratio: 300 / 250; background: #f5fafe; }
.pm-carousel__slide { position: absolute; inset: 0; opacity: 0; transition: opacity .45s ease; pointer-events: none; }
.pm-carousel__slide.is-active { opacity: 1; pointer-events: auto; }
.pm-carousel__slide img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-carousel__dots { display: flex; justify-content: center; gap: 6px; padding: 8px 0 10px; }
.pm-carousel__dot { width: 8px; height: 8px; border-radius: 50%; border: 0; background: #d5e3df; cursor: pointer; padding: 0; }
.pm-carousel__dot.is-active { background: var(--brand); transform: scale(1.25); }
@media (prefers-reduced-motion: reduce) {
  .pm-carousel__slide { transition: none; }
}

/* ==================== 商家入驻协议：3 秒阅读门槛（需求 6） ==================== */
.pm-read-gate { background: #fff; border: 1px solid var(--line); border-left: 4px solid var(--brand); border-radius: 10px; padding: 14px 18px; margin: 0 0 18px; position: sticky; top: 8px; z-index: 5; }
.pm-read-gate__bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 8px; }
.pm-read-gate__timer { font-size: 13.5px; color: #b26a00; }
.pm-read-gate__timer b { color: #d2691e; }
.pm-read-gate__progress { height: 6px; background: #eef5fb; border-radius: 999px; overflow: hidden; }
.pm-read-gate__fill { height: 100%; width: 0; background: linear-gradient(90deg, #4fb0dd, #3d9bd1); transition: width .2s linear; }
.pm-agreement-layout { display: grid; grid-template-columns: minmax(0,1fr) 320px; gap: 24px; align-items: start; }
.pm-agreement-body { max-height: 72vh; overflow-y: auto; }
.pm-agreement-end { margin-top: 20px; padding-top: 14px; border-top: 1px dashed var(--line); text-align: center; color: #8ba3b0; }
.pm-checkbox.is-locked { opacity: .55; cursor: not-allowed; }
.pm-agree__title { margin: 0 0 12px; font-size: 15.5px; }
@media (max-width: 980px) {
  .pm-agreement-layout { grid-template-columns: 1fr; }
  .pm-agreement-body { max-height: none; }
  .pm-read-gate { position: static; }
}

/* ==================== 城市商家地图（需求 1） ==================== */
.pm-map--city { height: 460px; border-radius: 12px; overflow: hidden; border: 1px solid var(--line); background: #f5fafe; }
.pm-map--city .pm-map__loading { display: flex; align-items: center; justify-content: center; height: 100%; color: #8ba3b0; font-size: 14px; }
.pm-map-notice { background: #fffdf7; border: 1px solid #f0cfa0; border-radius: 10px; padding: 16px 20px; }
.pm-map-pin { width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; }
.pm-map-pin__dot { width: 16px; height: 16px; border-radius: 50%; background: #3d9bd1; border: 3px solid #fff; box-shadow: 0 2px 6px rgba(0,0,0,.28); }
.pm-map-pin--top .pm-map-pin__dot { background: #d9822b; width: 19px; height: 19px; box-shadow: 0 2px 8px rgba(217,130,43,.5); }
.pm-map-info { padding: 8px 10px; font-size: 13px; line-height: 1.7; max-width: 250px; }
.pm-map-info strong { font-size: 14px; }
.pm-map-info__badge { display: inline-block; margin-left: 6px; background: #fff3e0; color: #b26a00; border: 1px solid #f0cfa0; border-radius: 20px; padding: 0 7px; font-size: 11.5px; }
.pm-map-info__tags { color: #55707f; margin: 4px 0; }
.pm-map-info p { margin: 3px 0; }
.pm-city-provider-list { margin-top: 18px; }
.pm-city-provider-list__title { font-size: 15.5px; margin: 0 0 10px; }
.pm-city-provider-list__ul { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; }
.pm-city-provider-list__ul li { background: #fff; border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }

/* ==================== 行政区划字典（AreaCity 数据集） ==================== */
.pm-area-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 10px; margin: 0 0 18px; }
.pm-area-stat { background: #f5fafe; border: 1px solid var(--line); border-radius: 10px; padding: 12px 10px; text-align: center; }
.pm-area-stat strong { display: block; font-size: 21px; color: var(--brand); font-variant-numeric: tabular-nums; }
.pm-area-stat span { font-size: 12.5px; color: #7e97a5; }
.pm-admin-pager { display: flex; align-items: center; gap: 12px; justify-content: center; margin-top: 16px; }
.pm-city-select__tip.pm-ok { color: #3d9bd1; }

/* ==================== 需求 7：活跃度排行榜 ==================== */
.pm-activity-head { display: flex; flex-wrap: wrap; gap: 18px; justify-content: space-between; align-items: center;
  background: linear-gradient(120deg, #eff6fd, #f5fbfe); border: 1px solid var(--line); border-radius: 14px; padding: 18px 22px; margin: 0 0 20px; }
.pm-activity-head__week { display: flex; flex-direction: column; gap: 2px; }
.pm-activity-head__week strong { font-size: 22px; color: var(--brand-deep); letter-spacing: .5px; }
.pm-activity-head__mine { text-align: right; }
.pm-activity-head__mine strong { font-size: 26px; color: var(--brand); display: block; }
.pm-activity-head__today { margin-top: 4px; }

.pm-rank-table { border: 1px solid var(--line); border-radius: 12px; overflow: hidden; background: #fff; }
.pm-rank-row { display: grid; grid-template-columns: 72px minmax(0,1fr) 130px 190px; align-items: center; gap: 10px; padding: 12px 16px; border-bottom: 1px solid #eef5fb; }
.pm-rank-row:last-child { border-bottom: 0; }
.pm-rank-row--head { background: #f4fafe; font-size: 13px; color: #6d817c; font-weight: 600; }
.pm-rank-row--gold { background: linear-gradient(90deg, #fffaf0, #fff); box-shadow: inset 3px 0 0 #e0a800; }
.pm-rank-row--silver { background: linear-gradient(90deg, #fafbfc, #fff); box-shadow: inset 3px 0 0 #b6c2cb; }
.pm-rank-row--bronze { background: linear-gradient(90deg, #fffaf5, #fff); box-shadow: inset 3px 0 0 #cf8b53; }
.pm-rank-no { font-size: 20px; font-weight: 700; text-align: center; color: #6d817c; }
.pm-rank-member { display: flex; align-items: center; gap: 8px; }
.pm-rank-member a { display: flex; align-items: center; gap: 8px; font-weight: 600; color: var(--ink); }
.pm-avatar { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.pm-avatar--sm { width: 30px; height: 30px; }
.pm-avatar--xl { width: 88px; height: 88px; }
.pm-avatar--text { display: inline-flex; align-items: center; justify-content: center; background: var(--brand); color: #fff; font-weight: 700; font-size: 15px; }
.pm-avatar--xl.pm-avatar--text { font-size: 34px; }
/*
 * 头像唯一配色（v1..v10）
 * =====================================================================
 * 【为什么需要】站长反馈「排行榜头像显示错乱」。实测根因：
 *   虚拟会员与赛季占位账号共用同一个 AVATARS 池，而池里**只有 5 张图**，
 *   榜单却显示 10 人 → **10 人必然出现重复头像**（实测 9 人共用 cat.jpg）。
 *   而且池里是**宠物照片**（猫/狗/兔/鸟/鱼）被当作人类会员头像，
 *   语义也不对（"林小岚"配一张鸟图）。
 *
 * 【修正】统一改为"首字 + 稳定唯一配色"的生成式头像：
 *   · 10 人 10 色，视觉上清晰可辨，从根上消除重复；
 *   · 零图片请求、零缓存问题（也顺带避开图片坏图风险）；
 *   · 颜色由 account/id 哈希决定 → 同一会员永远同一色，不会每次刷新跳变。
 * 颜色取自同一明度区间，保证白字在任何一色上都有足够对比度。
 */
.pm-avatar--text.pm-av-v1  { background: #3b82c4; }
.pm-avatar--text.pm-av-v2  { background: #d97742; }
.pm-avatar--text.pm-av-v3  { background: #4f9d6b; }
.pm-avatar--text.pm-av-v4  { background: #9b5fc0; }
.pm-avatar--text.pm-av-v5  { background: #c4566b; }
.pm-avatar--text.pm-av-v6  { background: #2f8f9d; }
.pm-avatar--text.pm-av-v7  { background: #b0873a; }
.pm-avatar--text.pm-av-v8  { background: #5a6fb5; }
.pm-avatar--text.pm-av-v9  { background: #a8552f; }
.pm-avatar--text.pm-av-v10 { background: #4a8b3f; }
.pm-avatar--text.pm-av-v11 { background: #8e5aa8; }
.pm-avatar--text.pm-av-v12 { background: #327a9e; }
.pm-avatar--text.pm-av-v13 { background: #c05a8f; }
.pm-avatar--text.pm-av-v14 { background: #6b8f3a; }
.pm-avatar--text.pm-av-v15 { background: #7a5cc4; }
.pm-avatar--text.pm-av-v16 { background: #bf7440; }
.pm-avatar--text.pm-av-v17 { background: #3f8f7a; }
.pm-avatar--text.pm-av-v18 { background: #a34d5c; }
.pm-avatar--text.pm-av-v19 { background: #4a7fb5; }
.pm-avatar--text.pm-av-v20 { background: #8a7a30; }
.pm-rank-value { text-align: right; }
.pm-rank-value strong { font-size: 19px; }
.pm-rank-reward { text-align: right; font-size: 13px; }
.pm-medal-showcase { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; }
.pm-medal-showcase__item { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 18px; text-align: center; display: flex; flex-direction: column; gap: 4px; }
.pm-medal--gold, .pm-medal--silver, .pm-medal--bronze { font-size: 40px; line-height: 1.1; }

/* ==================== 需求 10：规则页 ==================== */
.pm-quick-tasks { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 12px; }
.pm-quick-task { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 16px; display: flex; flex-direction: column; gap: 4px; transition: transform .18s ease, box-shadow .18s ease; }
.pm-quick-task:hover { transform: translateY(-2px); box-shadow: 0 6px 18px rgba(28,90,78,.08); }
.pm-quick-task > span:first-child { font-size: 24px; }

/* ==================== 需求 8：分享中心 ==================== */
.pm-share-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; margin: 0 0 20px; }
.pm-share-stat { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 14px; text-align: center; }
.pm-share-stat strong { display: block; font-size: 22px; color: var(--brand-deep); font-variant-numeric: tabular-nums; }
.pm-share-stat span { font-size: 12.5px; color: #7e97a5; }
.pm-copy-box { display: flex; gap: 10px; margin: 0 0 10px; }
.pm-copy-box__input { flex: 1; padding: 10px 12px; border: 1px solid var(--line); border-radius: 8px; font-size: 13.5px; background: #f8fbfa; }
.pm-share-channels { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; margin: 14px 0; }
.pm-share-channel { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 16px 14px; display: flex; flex-direction: column; gap: 5px; align-items: flex-start; cursor: pointer; text-align: left; transition: transform .18s ease, border-color .18s ease; }
.pm-share-channel:hover { transform: translateY(-2px); border-color: var(--brand); }
.pm-share-channel__icon { font-size: 24px; }
.pm-share-confirm { background: #f5fbfe; border: 1px solid var(--brand); border-radius: 12px; padding: 16px 18px; margin: 14px 0; }
.pm-share-confirm__text { margin: 0 0 12px; font-size: 14px; }
.pm-share-confirm__actions { display: flex; flex-wrap: wrap; gap: 10px; }
.pm-share-result { border-radius: 10px; padding: 12px 16px; margin: 12px 0; font-size: 14px; }
.pm-share-result--ok { background: #eff7fe; border: 1px solid #a5d5f0; color: #2b7aa8; }
.pm-share-result--warn { background: #fffaf0; border: 1px solid #f0d29a; color: #8a6100; }
.pm-share-suggest { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 12px; }
.pm-share-suggest__item { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 16px; display: flex; flex-direction: column; gap: 4px; }
.pm-invite-page { max-width: 820px; }
.pm-invite-card { background: linear-gradient(150deg, #f2faf7, #ffffff); border: 1px solid var(--line); border-radius: 18px; padding: 34px 30px; text-align: center; }
.pm-invite-card__from { display: flex; align-items: center; justify-content: center; gap: 10px; margin-bottom: 14px; }
.pm-invite-card__title { font-size: 30px; margin: 0 0 6px; color: var(--brand-deep); letter-spacing: -.5px; }
.pm-invite-card__sub { color: #55707f; margin: 0 0 20px; }
.pm-invite-card__list { list-style: none; padding: 0; margin: 0 0 24px; display: grid; gap: 10px; text-align: left; max-width: 460px; margin-left: auto; margin-right: auto; }
.pm-invite-card__cta { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; margin-bottom: 16px; }

/* ==================== 需求 9/12：宠物乐园 ==================== */
.pm-pet-hero { display: grid; grid-template-columns: minmax(0,1.15fr) minmax(0,.85fr); gap: 30px; align-items: center;
  background: radial-gradient(700px 320px at 88% 0%, rgba(55,160,139,.15), transparent 65%), linear-gradient(160deg,#f7fcfa,#eff6fd);
  border: 1px solid var(--line); border-radius: 18px; padding: 30px; margin-bottom: 24px; }
.pm-pet-hero__eyebrow { display: inline-block; font-size: 13px; color: var(--brand-deep); background: #fff; border: 1px solid rgba(55,160,139,.3); border-radius: 999px; padding: 6px 14px; margin: 0 0 16px; }
.pm-pet-hero__actions { display: flex; flex-wrap: wrap; gap: 10px; margin: 18px 0 16px; }
.pm-pet-hero__meta { list-style: none; padding: 0; margin: 0; display: grid; gap: 6px; font-size: 13.5px; color: #55707f; }
.pm-pet-hero__orbs { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.pm-pet-orb { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 16px; border: 1px solid var(--line); background: #fff; }
.pm-species-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; }
.pm-species-card { background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: 14px; display: flex; flex-direction: column; gap: 8px; }
.pm-species-card__media { aspect-ratio: 1; border-radius: 10px; overflow: hidden; background: #f4faf8; }
.pm-species-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-species-card__name { margin: 0; font-size: 16px; }
.pm-species-card__meta { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; }
.pm-species-card__form { display: flex; flex-direction: column; gap: 8px; margin-top: auto; }
.pm-input-inline { padding: 7px 10px; border: 1px solid var(--line); border-radius: 8px; font-size: 13.5px; }
.pm-mypet-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 16px; }
.pm-mypet { background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: 16px; display: flex; flex-direction: column; gap: 12px; }
.pm-mypet__head { display: flex; gap: 12px; align-items: center; }
.pm-mypet__avatar { width: 64px; height: 64px; border-radius: 12px; object-fit: cover; flex-shrink: 0; }
.pm-mypet__name { margin: 0 0 2px; font-size: 17px; }
.pm-statbars { display: grid; gap: 8px; }
.pm-statbar { display: grid; grid-template-columns: 62px minmax(0,1fr) 40px; align-items: center; gap: 8px; font-size: 13px; }
.pm-statbar__track { height: 10px; background: #eef3f1; border-radius: 999px; overflow: hidden; }
.pm-statbar__fill { display: block; height: 100%; border-radius: 999px; transition: width .3s ease; }
.pm-statbar__value { text-align: right; font-variant-numeric: tabular-nums; }
.pm-mypet__actions { display: flex; flex-wrap: wrap; gap: 8px; }
.pm-mypet__bag { border-top: 1px dashed var(--line); padding-top: 10px; }
.pm-useitems { display: flex; flex-wrap: wrap; gap: 8px; }
.pm-mood--good { color: #3d9bd1; }
.pm-mood--normal { color: #8a6100; }
.pm-mood--warn { color: #b26a00; }
.pm-mood--danger { color: #a43a2b; }
.pm-item-strip { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 12px; }
.pm-item-mini { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 10px; text-align: center; display: flex; flex-direction: column; gap: 4px; }
.pm-item-mini img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 8px; }
.pm-item-mini__name { font-size: 13px; color: var(--ink); }
.pm-item-mini__price { font-size: 12.5px; color: var(--brand); font-weight: 600; }
.pm-shop-bar { display: flex; flex-wrap: wrap; gap: 16px; justify-content: space-between; align-items: center; margin: 0 0 20px; }
.pm-shop-bar__points { display: flex; align-items: baseline; gap: 8px; font-size: 13.5px; }
.pm-shop-bar__points strong { font-size: 24px; }
.pm-shop-bar__cats { display: flex; flex-wrap: wrap; gap: 8px; }
.pm-chip { border: 1px solid var(--line); border-radius: 999px; padding: 5px 14px; font-size: 13px; background: #fff; color: #4e6878; }
.pm-chip.is-active { background: var(--brand); border-color: var(--brand); color: #fff; }
.pm-mybag { background: #f5fbfe; border: 1px solid var(--line); border-radius: 12px; padding: 16px; margin-bottom: 20px; }
.pm-mybag__grid { display: flex; flex-wrap: wrap; gap: 12px; }
.pm-mybag__item { background: #fff; border: 1px solid var(--line); border-radius: 10px; padding: 8px; width: 96px; text-align: center; font-size: 12.5px; }
.pm-mybag__item img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: 6px; }
.pm-mybag__item span { display: block; margin-top: 4px; }
.pm-item-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 16px; }
.pm-item-card { background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: 14px; display: flex; flex-direction: column; gap: 7px; }
.pm-item-card__media { position: relative; aspect-ratio: 1; border-radius: 10px; overflow: hidden; background: #f5fafe; }
.pm-item-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-item-card__slot { position: absolute; right: 6px; top: 6px; background: rgba(28,90,78,.82); color: #fff; font-size: 11px; border-radius: 20px; padding: 2px 8px; }
.pm-item-card__name { margin: 0; font-size: 15px; }
.pm-item-card__cat { margin: 0; font-size: 12.5px; color: #7e97a5; }
.pm-item-card__effect { margin: 0; font-size: 13px; color: var(--brand-deep); }
.pm-item-card__price { margin: 0; display: flex; align-items: baseline; gap: 8px; font-size: 13px; }
.pm-item-card__form { display: flex; gap: 8px; margin-top: auto; }
.pm-tag--free { background: #eff7fe; border-color: #a5d5f0; color: #2b7aa8; }

/* ==================== 需求 13：会员主页 ==================== */
.pm-profile__head { display: flex; flex-wrap: wrap; gap: 20px; align-items: center; background: #fff; border: 1px solid var(--line); border-radius: 16px; padding: 22px; margin-bottom: 22px; }
.pm-profile__name { margin: 0 0 4px; font-size: 24px; display: flex; align-items: center; gap: 10px; }
.pm-profile__social { display: flex; gap: 18px; margin: 8px 0; font-size: 14px; color: #55707f; }
.pm-profile__social strong { color: var(--brand-deep); font-size: 17px; }
.pm-profile__actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.pm-medal-wall { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; }
.pm-medal-wall__item { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 18px; text-align: center; display: flex; flex-direction: column; gap: 4px; }
.pm-medal-wall--gold { box-shadow: inset 0 3px 0 #e0a800; }
.pm-medal-wall--silver { box-shadow: inset 0 3px 0 #b6c2cb; }
.pm-medal-wall--bronze { box-shadow: inset 0 3px 0 #cf8b53; }
.pm-memorial-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 14px; }
.pm-memorial-card { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 10px; display: flex; flex-direction: column; gap: 4px; }
.pm-memorial-card__media { aspect-ratio: 1; border-radius: 8px; overflow: hidden; background: #f5fafe; display: flex; align-items: center; justify-content: center; }
.pm-memorial-card__media img { width: 100%; height: 100%; object-fit: cover; }
.pm-memorial-card__ph { font-size: 34px; }

/* ==================== 需求 12：治愈星球右侧宠物乐园入口 ==================== */
.pm-game-hero__park { background: #fff; border: 1px solid var(--line); border-radius: 16px; padding: 22px; display: flex; flex-direction: column; gap: 14px; }
.pm-game-park__badge { display: inline-block; font-size: 12px; background: #eff7fe; border: 1px solid #a5d5f0; color: #2b7aa8; border-radius: 999px; padding: 3px 10px; }
.pm-game-park__title { margin: 8px 0 2px; font-size: 22px; color: var(--brand-deep); }
.pm-game-park__sub { margin: 0; font-size: 13.5px; color: #7e97a5; }
.pm-game-park__orbit { position: relative; display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 8px 0; }
.pm-game-park__pet { border-radius: 12px; overflow: hidden; border: 1px solid var(--line); background: #f5fafe; aspect-ratio: 1; }
.pm-game-park__pet img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-game-park__meta { list-style: none; padding: 0; margin: 0; display: grid; gap: 6px; font-size: 13px; color: #55707f; }
.pm-game-park__actions { display: flex; flex-wrap: wrap; gap: 10px; }

@media (max-width: 980px) {
  .pm-pet-hero { grid-template-columns: 1fr; }
  .pm-rank-row { grid-template-columns: 56px minmax(0,1fr) 92px; }
  .pm-rank-row > .pm-rank-reward { display: none; }
  .pm-activity-head { flex-direction: column; align-items: flex-start; }
  .pm-activity-head__mine { text-align: left; }
}

/* ==================== 需求 2：注册区分个人/商家 ==================== */
.pm-auth--wide { max-width: 720px; }
.pm-reg-tabs { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 18px 0; }
.pm-reg-tab { background: #fff; border: 2px solid var(--line); border-radius: 14px; padding: 16px; cursor: pointer; text-align: left; display: flex; flex-direction: column; gap: 4px; transition: border-color .18s ease, background .18s ease; }
.pm-reg-tab.is-active { border-color: var(--brand); background: #f7fcfa; }
.pm-reg-tab__icon { font-size: 24px; }
.pm-reg-tab strong { font-size: 16px; color: var(--ink); }
.pm-reg-compare { background: #f5fbfe; border: 1px solid var(--line); border-radius: 12px; padding: 14px 18px; margin-bottom: 18px; }
.pm-reg-compare__title { margin: 0 0 8px; font-weight: 600; font-size: 14.5px; }
.pm-merchant-reg { border: 1px solid var(--brand); border-radius: 12px; padding: 16px 18px; margin: 4px 0 16px; background: #fbfefd; }
.pm-merchant-reg legend { padding: 0 8px; font-weight: 600; font-size: 14.5px; color: var(--brand-deep); }

/* ==================== 需求 13：右上角会员头像（不显示名称） ==================== */
.pm-member-chip { position: relative; }
.pm-member-chip__avatar { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px;
  border-radius: 50%; overflow: hidden; border: 2px solid #fff; box-shadow: 0 0 0 1px var(--line); background: var(--brand);
  color: #fff; font-weight: 700; font-size: 15px; text-decoration: none; }
.pm-member-chip__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-member-chip__avatar .pm-avatar--text { display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 100%; }
.pm-member-chip__menu { position: absolute; right: 0; top: calc(100% + 8px); min-width: 190px; background: #fff;
  border: 1px solid var(--line); border-radius: 12px; box-shadow: 0 10px 28px rgba(22,33,30,.14); padding: 12px 14px;
  opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity .18s ease, transform .18s ease, visibility .18s; z-index: 60; }
.pm-member-chip.is-open .pm-member-chip__menu { opacity: 1; visibility: visible; transform: translateY(0); }
.pm-member-chip__name { margin: 0; font-weight: 700; font-size: 14.5px; color: var(--ink); }
.pm-member-chip__menu ul { list-style: none; margin: 8px 0 0; padding: 8px 0 0; border-top: 1px solid #eef5fb; display: grid; gap: 6px; }
.pm-member-chip__menu ul a { font-size: 13.5px; color: #4e6878; }
.pm-member-chip__menu ul a:hover { color: var(--brand); }

/* ==================== 需求 7：首页活跃度排行榜 ==================== */
/**
 * 本周会员活跃度排行榜（1-10 名）
 * ---------------------------------------------------------------
 * 需求：固定 **5 列 × 2 排**，把 1-10 名整齐排成两排，
 * 而不是随窗口宽度自动折行（原来的 auto-fill 会排成一长排或忽多忽少）。
 * 窄屏依次降为 4 / 3 / 2 列，保证手机上也能看。
 */
.pm-home-rank { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 12px; }
@media (max-width: 1100px) { .pm-home-rank { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 820px) { .pm-home-rank { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 560px) { .pm-home-rank { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.pm-home-rank__item { background: #fff; border: 1px solid var(--line); border-radius: 14px; padding: 14px; display: flex;
  flex-direction: column; align-items: center; gap: 6px; text-decoration: none; transition: transform .18s ease, box-shadow .18s ease; }
.pm-home-rank__item:hover { transform: translateY(-3px); box-shadow: 0 8px 22px rgba(28,90,78,.10); }
/**
 * 前三名高亮（需求：背景色加深，让前三名更突出）
 * 原来用的是接近白色的渐变（#fffdf5 / #fbfcfd / #fffbf7），
 * 在浅色页面上几乎看不出差别。
 * 现在改为**明显的色底**：渐变整体下压、色条更重，前三名一眼可辨。
 */
.pm-home-rank__item--gold {
  border-color: #dcae1e;
  box-shadow: inset 0 4px 0 #cf9c07, 0 7px 20px rgba(207, 156, 7, .22);
  background: linear-gradient(180deg, #ffeaad, #ffd977);
}
.pm-home-rank__item--silver {
  border-color: #9aa9b6;
  box-shadow: inset 0 4px 0 #8695a3, 0 7px 20px rgba(134, 149, 163, .22);
  background: linear-gradient(180deg, #e6ecf2, #cdd8e2);
}
.pm-home-rank__item--bronze {
  border-color: #c07c3c;
  box-shadow: inset 0 4px 0 #ad6a2c, 0 7px 20px rgba(173, 106, 44, .22);
  background: linear-gradient(180deg, #fbdcc0, #f2c096);
}
/* 前三名的名次与分数同步加深，强化视觉层级 */
.pm-home-rank__item--gold .pm-home-rank__no,
.pm-home-rank__item--gold .pm-home-rank__value { color: #a97a00; }
.pm-home-rank__item--silver .pm-home-rank__no,
.pm-home-rank__item--silver .pm-home-rank__value { color: #5d6b78; }
.pm-home-rank__item--bronze .pm-home-rank__no,
.pm-home-rank__item--bronze .pm-home-rank__value { color: #94571f; }
.pm-home-rank__item--gold .pm-home-rank__name,
.pm-home-rank__item--silver .pm-home-rank__name,
.pm-home-rank__item--bronze .pm-home-rank__name { color: #2b3a44; }
.pm-home-rank__no { font-size: 20px; font-weight: 700; color: #8ba3b0; }
.pm-home-rank__avatar { width: 48px; height: 48px; border-radius: 50%; overflow: hidden; background: var(--brand);
  display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 700; }
.pm-home-rank__avatar img { width: 100%; height: 100%; object-fit: cover; }
.pm-home-rank__name { font-size: 13.5px; color: var(--ink); font-weight: 600; text-align: center;
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pm-home-rank__value { font-size: 20px; font-weight: 700; color: var(--brand); font-variant-numeric: tabular-nums; }
.pm-home-rank__unit { margin-top: -4px; }

/* ==================== 需求 8：首页分享横幅 ==================== */
.pm-share-banner { display: flex; flex-wrap: wrap; gap: 18px; justify-content: space-between; align-items: center;
  background: radial-gradient(600px 240px at 90% 0%, rgba(55,160,139,.16), transparent 60%), linear-gradient(120deg,#f4fbf8,#eff6fd);
  border: 1px solid var(--line); border-radius: 16px; padding: 22px 26px; }
.pm-share-banner__title { margin: 0 0 6px; font-size: 19px; color: var(--brand-deep); }
.pm-share-banner__text { max-width: 620px; }
.pm-share-banner__actions { display: flex; flex-wrap: wrap; gap: 10px; }

/* ==================== 需求 3：赛季勋章与开关 ==================== */
.pm-avatar-medals { position: absolute; bottom: -4px; left: 50%; transform: translateX(-50%); display: flex; gap: 1px; }
.pm-member-chip__avatar { position: relative; overflow: visible; }
.pm-member-chip__avatar img, .pm-member-chip__avatar .pm-avatar--text { border-radius: 50%; overflow: hidden; }
.pm-avatar-medal { display: inline-flex; align-items: center; justify-content: center; min-width: 15px; height: 15px;
  padding: 0 3px; border-radius: 8px; font-size: 10.5px; font-weight: 700; color: #fff; border: 1.5px solid #fff; line-height: 1; }
.pm-avatar-medal--gold { background: #e0a800; }
.pm-avatar-medal--silver { background: #9aa9b3; }
.pm-avatar-medal--bronze { background: #c07a3f; }
.pm-medal-line { margin: 4px 0 0; color: #8a6100; }

.pm-season-status { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; border-radius: 12px; padding: 12px 16px; margin: 0 0 18px; border: 1px solid var(--line); }
.pm-season-status.is-on { background: #f2fbf5; border-color: #a5d5f0; }
.pm-season-status.is-off { background: #fffaf0; border-color: #f0d29a; }
.pm-season-status__dot { width: 9px; height: 9px; border-radius: 50%; }
.pm-season-status.is-on .pm-season-status__dot { background: #2e9e5b; box-shadow: 0 0 0 4px rgba(46,158,91,.18); }
.pm-season-status.is-off .pm-season-status__dot { background: #d8a63a; box-shadow: 0 0 0 4px rgba(216,166,58,.18); }

.pm-my-medals { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; background: #fff; border: 1px solid var(--line);
  border-radius: 12px; padding: 14px 18px; margin: 0 0 18px; }
.pm-medal-chip { display: inline-flex; align-items: center; gap: 4px; border-radius: 999px; padding: 4px 12px; font-size: 13px; font-weight: 600; }
.pm-medal-chip--gold { background: #fff8e1; color: #a07800; border: 1px solid #e6c34a; }
.pm-medal-chip--silver { background: #f6f8f9; color: #5d6b74; border: 1px solid #cbd5dc; }
.pm-medal-chip--bronze { background: #fdf3ea; color: #9a5c28; border: 1px solid #dcb28a; }

.pm-medal-top { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; }
.pm-medal-top__item { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 14px;
  display: flex; flex-direction: column; align-items: center; gap: 6px; }
.pm-medal-top__no { font-size: 13px; color: #8ba3b0; font-weight: 700; }
.pm-medal-top__name { font-size: 13.5px; font-weight: 600; color: var(--ink); }
.pm-medal-top__counts { display: flex; flex-wrap: wrap; gap: 4px; justify-content: center; }

/* 后台活动管理：一键开关卡片 */
.pm-switch-card { display: flex; flex-wrap: wrap; gap: 20px; justify-content: space-between; align-items: center;
  border-radius: 14px; padding: 22px 26px; margin: 0 0 20px; border: 2px solid var(--line); }
.pm-switch-card.is-on { background: linear-gradient(120deg,#f0fbf4,#f7fdfa); border-color: #6ecf9a; }
.pm-switch-card.is-off { background: linear-gradient(120deg,#fffaf0,#fffdf8); border-color: #f0cfa0; }
.pm-switch-card__label { display: flex; align-items: center; gap: 10px; font-size: 17px; margin-bottom: 6px; }
.pm-switch-card__dot { width: 14px; height: 14px; border-radius: 50%; }
.pm-switch-card.is-on .pm-switch-card__dot { background: #2e9e5b; box-shadow: 0 0 0 5px rgba(46,158,91,.2); }
.pm-switch-card.is-off .pm-switch-card__dot { background: #d8a63a; box-shadow: 0 0 0 5px rgba(216,166,58,.2); }
.pm-switch-card__main { max-width: 700px; }

/* ==================== 需求 1：首页活跃度榜单展示区 ==================== */
.pm-hero-board { background: #fff; border: 1px solid var(--line); border-radius: 16px; padding: 18px 20px;
  box-shadow: 0 10px 30px rgba(28,90,78,.06); display: flex; flex-direction: column; min-height: 340px; }
.pm-hero-board__head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px;
  padding-bottom: 12px; border-bottom: 1px solid #eef5fb; margin-bottom: 10px; }
.pm-hero-board__title { margin: 0; font-size: 16.5px; font-weight: 700; color: var(--brand-deep); }
.pm-hero-board__sub { margin: 2px 0 0; font-size: 12.5px; color: #8ba3b0; }
.pm-hero-board__more { font-size: 13px; color: var(--brand); white-space: nowrap; }
.pm-hero-board__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; flex: 1; }
.pm-hero-board__item { display: grid; grid-template-columns: 34px minmax(0,1fr) 46px; align-items: center; gap: 8px;
  padding: 5px 6px; border-radius: 9px; }
.pm-hero-board__item.is-gold { background: linear-gradient(90deg,#fffaf0,#fff); box-shadow: inset 3px 0 0 #e0a800; }
.pm-hero-board__item.is-silver { background: linear-gradient(90deg,#fafbfc,#fff); box-shadow: inset 3px 0 0 #b6c2cb; }
.pm-hero-board__item.is-bronze { background: linear-gradient(90deg,#fffaf5,#fff); box-shadow: inset 3px 0 0 #cf8b53; }
.pm-hero-board__rank { font-size: 15px; font-weight: 700; color: #8ba3b0; text-align: center; }
.pm-hero-board__member { display: flex; align-items: center; gap: 8px; min-width: 0; }
.pm-hero-board__avatar { width: 26px; height: 26px; border-radius: 50%; overflow: hidden; flex-shrink: 0;
  background: var(--brand); display: flex; align-items: center; justify-content: center; color: #fff; font-size: 12px; font-weight: 700; }
.pm-hero-board__avatar img { width: 100%; height: 100%; object-fit: cover; }
.pm-hero-board__name { font-size: 13.5px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pm-hero-board__value { text-align: right; font-size: 14px; font-weight: 700; color: var(--brand); font-variant-numeric: tabular-nums; }
.pm-hero-board__empty { flex: 1; display: flex; flex-direction: column; gap: 8px; justify-content: center; }
.pm-hero-board__empty-title { margin: 0; font-size: 15px; font-weight: 600; color: var(--ink); }
.pm-hero-board__tasks { display: flex; flex-wrap: wrap; gap: 6px; margin: 4px 0; }
.pm-hero-board__tasks a { font-size: 12.5px; background: #f4f9fe; border: 1px solid #d6e9f6; border-radius: 999px; padding: 4px 10px; color: var(--brand-deep); }
.pm-hero-board__foot { margin: 10px 0 0; padding-top: 8px; border-top: 1px solid #eef5fb; }

/* ==================== 需求 2：热门城市「更多城市」入口（与标题上下居中对齐） ==================== */
.pm-section__head--cities { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
.pm-section__head--cities .pm-section__title { margin: 0; }
.pm-city-more { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 600;
  padding: 6px 14px; border: 1px solid var(--line); border-radius: 999px; background: #fff;
  transition: border-color .18s ease, color .18s ease, transform .18s ease; }
.pm-city-more:hover { border-color: var(--brand); color: var(--brand); transform: translateX(2px); }
.pm-city-more__arrow { transition: transform .18s ease; }
.pm-city-more:hover .pm-city-more__arrow { transform: translateX(3px); }

/* ==================== 需求 4：会员中心头像管理 ==================== */
.pm-avatar-manage { display: flex; flex-wrap: wrap; gap: 20px; align-items: flex-start; margin-bottom: 8px; }
.pm-avatar-manage__preview { text-align: center; flex-shrink: 0; }
.pm-avatar-manage__form { flex: 1; min-width: 260px; }
.pm-panel__sub { margin: 0 0 10px; font-size: 15px; color: var(--brand-deep); }

/* ==================== 需求 1：站内通知列表 ==================== */
.pm-notice-list { display: grid; gap: 12px; }
.pm-notice { display: flex; gap: 14px; background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 16px 18px; }
.pm-notice.is-read { background: #fafcfb; opacity: .82; }
.pm-notice__icon { font-size: 24px; flex-shrink: 0; }
.pm-notice__body { flex: 1; min-width: 0; }
.pm-notice__head { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 6px; }
.pm-notice__head strong { font-size: 15px; }
.pm-notice__time { margin-left: auto; }
.pm-notice__content { font-size: 13.8px; color: #4e6878; line-height: 1.85; white-space: pre-wrap; margin-bottom: 8px; }

/* ==================== 需求 5：通知铃铛与会员悬浮卡片 ==================== */
.pm-notice-bell { position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border-radius: 50%; background: #fff; border: 1px solid var(--line); font-size: 15px; }
.pm-notice-bell:hover { border-color: var(--brand); }
.pm-notice-bell__dot { position: absolute; top: -4px; right: -4px; min-width: 17px; height: 17px; padding: 0 4px;
  border-radius: 9px; background: #e04a4a; color: #fff; font-size: 10.5px; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center; border: 1.5px solid #fff; }
.pm-member-chip__hobby { margin: 4px 0 0; color: #6d8798; }
.pm-member-chip__social { display: flex; gap: 8px; margin-top: 8px; }
.pm-member-chip__menu { min-width: 220px; }

/* ==================== 需求 1：操作提示条自动关闭（进度条 + 淡出） ==================== */
.pm-flash { position: relative; overflow: hidden; transition: opacity .26s ease, transform .26s ease; }
.pm-flash.is-hiding { opacity: 0; transform: translateX(-50%) translateY(-10px); }
.pm-flash__bar { position: absolute; left: 0; bottom: 0; height: 3px; width: 100%;
  background: rgba(255, 255, 255, .55); transform-origin: left center; transform: scaleX(1);
  border-radius: 0 0 10px 10px; }

/* ==================== 需求 2：宠物乐园与治愈星球里的动物园展示 ==================== */
.pm-zoo-hero { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 18px; align-items: center;
  background: linear-gradient(120deg, #eef7fe, #f8fcff); border: 1px solid #cfe6f7; border-radius: 16px;
  padding: 20px 22px; }
@media (max-width: 820px) { .pm-zoo-hero { grid-template-columns: 1fr; } }
.pm-zoo-hero__badge { display: inline-block; margin: 0 0 8px; font-size: 11.5px; font-weight: 700;
  color: #1f5f87; background: #fff; border: 1px solid #cfe6f7; border-radius: 999px; padding: 3px 11px; }
.pm-zoo-hero__name { margin: 0 0 4px; font-size: 20px; color: var(--brand-deep, #1f5f87); }
.pm-zoo-hero__owner { margin: 0 0 12px; font-size: 13px; color: var(--text-2, #55707f); }
.pm-zoo-hero__stat { list-style: none; display: flex; flex-wrap: wrap; gap: 20px; margin: 0 0 14px; padding: 0; }
.pm-zoo-hero__stat li { display: flex; flex-direction: column; }
.pm-zoo-hero__stat strong { font-size: 19px; color: var(--brand, #3d9bd1); font-variant-numeric: tabular-nums; }
.pm-zoo-hero__stat span { font-size: 11.5px; color: var(--muted, #8ba3b0); }
.pm-zoo-hero__pets { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 14px; }
.pm-zoo-hero__pet { position: relative; width: 54px; text-align: center; }
.pm-zoo-hero__pet img { width: 48px; height: 48px; object-fit: contain; background: #fff;
  border: 1px solid #dceaf3; border-radius: 10px; }
.pm-zoo-hero__pet em { display: block; font-style: normal; font-size: 10.5px; color: var(--muted, #8ba3b0);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pm-zoo-hero__pet i { position: absolute; right: -2px; top: -4px; font-style: normal; font-size: 13px; }
.pm-zoo-hero__actions { display: flex; flex-wrap: wrap; gap: 9px; margin: 0 0 10px; }

/* 场地缩略预览（写实微缩） */
.pm-zoo-hero__preview { min-width: 0; }
.pm-zoo-mini { position: relative; width: 100%; aspect-ratio: 16 / 10; border-radius: 14px; overflow: hidden;
  border: 1px solid #cfe4f2; box-shadow: 0 8px 22px rgba(31, 95, 135, .12); }
.pm-zoo-mini__sky { position: absolute; inset: 0 0 46% 0;
  background: linear-gradient(180deg, #bfe3f8, #e6f5fd); }
.pm-zoo-mini__ground { position: absolute; left: 0; right: 0; bottom: 0; height: 46%;
  background: linear-gradient(180deg, #a8ddb2, #74bd86); }
.pm-zoo-mini__decor { position: absolute; width: 26%; transform: translateX(-50%); }
.pm-zoo-mini__pet { position: absolute; width: 17%; transform: translateX(-50%); }

.pm-zoo-cta { background: #f8fcff; border: 1px dashed #a5d5f0; border-radius: 14px; padding: 22px;
  text-align: center; }
.pm-zoo-cta p { margin: 4px 0; font-size: 14px; color: var(--text-2, #55707f); }

/* 治愈星球里的动物园小卡 */
.pm-game-park__zoo { margin: 12px 0; padding: 11px 13px; background: rgba(255, 255, 255, .72);
  border: 1px solid rgba(61, 155, 209, .28); border-radius: 12px; }
.pm-game-park__zoo-badge { margin: 0 0 5px; font-size: 11px; font-weight: 700; color: #1f5f87; }
.pm-game-park__zoo-name { margin: 0 0 8px; font-size: 13.5px; color: var(--text, #22323d); }
.pm-game-park__zoo-name span { color: #8ba3b0; font-size: 12px; }
.pm-game-park__zoo-pets { display: flex; gap: 6px; flex-wrap: wrap; }
.pm-game-park__zoo-pets img { width: 40px; height: 40px; object-fit: contain; background: #fff;
  border: 1px solid #dceaf3; border-radius: 9px; }

/* ==================== 需求 6：城市广告位图片 ==================== */
.pm-ad-cell__img { width: 100%; max-height: 96px; object-fit: cover; border-radius: 8px; margin-bottom: 6px; display: block; }

/* ==================== 需求 7：宠物百科 ==================== */
.pm-wiki-nav { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin: 16px 0 6px; }
.pm-wiki-nav__item { display: flex; align-items: center; gap: 8px; padding: 10px 13px; background: #fff;
  border: 1px solid var(--line, #dceaf3); border-radius: 12px; text-decoration: none; color: var(--text, #22323d);
  transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease; }
.pm-wiki-nav__item:hover { border-color: var(--brand, #3d9bd1); transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(61, 155, 209, .14); }
.pm-wiki-nav__item.is-active { border-color: var(--brand, #3d9bd1); background: var(--brand-light, #eaf5fc); font-weight: 700; }
.pm-wiki-nav__icon { font-size: 20px; line-height: 1; }
.pm-wiki-nav__name { flex: 1; min-width: 0; font-size: 14px; }
.pm-wiki-nav__count { font-size: 11.5px; color: var(--muted, #8ba3b0); }

.pm-wiki-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 14px; }
.pm-wiki-grid--wide { grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); }
.pm-wiki-card { display: flex; gap: 12px; padding: 12px; background: #fff; border: 1px solid var(--line, #dceaf3);
  border-radius: 14px; text-decoration: none; color: inherit; transition: border-color .18s ease, box-shadow .18s ease, transform .18s ease; }
.pm-wiki-card:hover { border-color: var(--brand, #3d9bd1); box-shadow: 0 10px 24px rgba(61, 155, 209, .14); transform: translateY(-2px); }
.pm-wiki-card__media { flex: 0 0 72px; width: 72px; height: 72px; border-radius: 10px; overflow: hidden;
  background: var(--brand-light, #eaf5fc); display: flex; align-items: center; justify-content: center; }
.pm-wiki-card__media img { width: 100%; height: 100%; object-fit: contain; }
.pm-wiki-card__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
.pm-wiki-card__body strong { font-size: 15px; color: var(--brand-deep, #1f5f87); }
.pm-wiki-card__body em { font-style: normal; font-size: 11.5px; color: var(--muted, #8ba3b0); }
.pm-wiki-card__sum { font-size: 12px; color: var(--text-2, #55707f); line-height: 1.6;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.pm-wiki-card__facts { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 2px; }
.pm-wiki-card__facts i { font-style: normal; font-size: 11px; color: var(--text-2, #55707f);
  background: var(--brand-light, #eaf5fc); border-radius: 999px; padding: 1px 8px; }

.pm-wiki-group { margin-bottom: 22px; }
.pm-wiki-group__title { font-size: 15px; color: var(--brand-deep, #1f5f87); margin: 0 0 10px;
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pm-wiki-chips { display: flex; flex-wrap: wrap; gap: 9px; }
.pm-wiki-chip { display: inline-flex; align-items: center; gap: 6px; padding: 5px 12px 5px 5px; background: #fff;
  border: 1px solid var(--line, #dceaf3); border-radius: 999px; text-decoration: none; color: var(--text, #22323d); font-size: 13px;
  transition: border-color .16s ease, background .16s ease; }
.pm-wiki-chip:hover { border-color: var(--brand, #3d9bd1); background: var(--brand-light, #eaf5fc); }
.pm-wiki-chip img { width: 24px; height: 24px; object-fit: contain; border-radius: 50%; background: var(--brand-light, #eaf5fc); }
.pm-wiki-chip--inline { padding: 6px 14px; }

.pm-wiki-detail { background: #fff; border: 1px solid var(--line, #dceaf3); border-radius: 18px;
  padding: 24px; margin-top: 8px; }
.pm-wiki-detail__head { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; align-items: start;
  padding-bottom: 20px; border-bottom: 1px dashed var(--line, #dceaf3); }
@media (max-width: 820px) { .pm-wiki-detail__head { grid-template-columns: 1fr; } }
.pm-wiki-detail__media { border-radius: 16px; overflow: hidden; background: var(--brand-light, #eaf5fc);
  display: flex; align-items: center; justify-content: center; aspect-ratio: 1 / 1; }
.pm-wiki-detail__img { width: 100%; height: 100%; object-fit: contain; }
.pm-wiki-detail__latin { margin: 2px 0 6px; font-size: 14px; color: var(--muted, #8ba3b0); font-style: italic; }
.pm-wiki-detail__cat { margin: 8px 0 12px; }
.pm-wiki-facts { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 10px; margin: 0 0 12px; }
.pm-wiki-facts div { background: var(--brand-light, #eaf5fc); border-radius: 10px; padding: 8px 12px; }
.pm-wiki-facts dt { font-size: 11px; color: var(--muted, #8ba3b0); }
.pm-wiki-facts dd { margin: 2px 0 0; font-size: 13.5px; font-weight: 600; color: var(--brand-deep, #1f5f87); }
.pm-wiki-detail__body { padding-top: 18px; }
.pm-wiki-table { width: 100%; border-collapse: collapse; margin: 12px 0 6px; font-size: 14px; }
.pm-wiki-table th, .pm-wiki-table td { border: 1px solid var(--line, #dceaf3); padding: 8px 12px; text-align: left; vertical-align: top; }
.pm-wiki-table th { width: 130px; background: var(--brand-light, #eaf5fc); color: var(--brand-deep, #1f5f87); font-weight: 600; }
.pm-brand-anchor { background: var(--brand-light, #eaf5fc); border-radius: 10px; padding: 12px 16px; font-size: 13.5px; }
.pm-disclaimer { margin-top: 22px; padding: 14px 16px; background: #f8fbfd; border: 1px dashed var(--line, #dceaf3); border-radius: 12px; }
.pm-disclaimer p { margin: 0 0 8px; font-size: 12.5px; color: var(--text-2, #55707f); line-height: 1.8; }
.pm-disclaimer p:last-child { margin-bottom: 0; }

/* 宠物百科搜索框（比通用搜索框宽一些，便于输入较长的宠物名） */
.pm-wiki-search { display: flex; gap: 10px; flex-wrap: wrap; margin: 14px 0 6px; }
.pm-wiki-search input[type="text"] { flex: 1 1 420px; min-width: 240px; max-width: 620px;
  padding: 11px 15px; border: 1px solid var(--line, #dceaf3); border-radius: 10px; font-size: 14.5px;
  background: #fff; color: var(--text, #22323d); }
.pm-wiki-search input[type="text"]:focus { outline: none; border-color: var(--brand, #3d9bd1);
  box-shadow: 0 0 0 3px rgba(61, 155, 209, .16); }

/* ==================== 「常见宠物百科」城市入口提示 ==================== */
/* 城市分站访问百科时说明「内容全国通用」，避免用户误以为离开了城市分站 */
.pm-wiki-cityhint { margin: 0 0 14px; padding: 10px 14px; font-size: 13.5px; line-height: 1.7;
  color: var(--brand-deep, #1f5f87); background: var(--brand-light, #eaf5fc);
  border: 1px solid #cfe6f7; border-left: 4px solid var(--brand, #3d9bd1); border-radius: 10px; }
.pm-wiki-cityhint a { font-weight: 600; }

/* ==================== 百科内容防复制 ==================== */
/*
  仅在 JS 成功加载后才生效（JS 在 <html> 上加 data-copyguard="on"）。
  这样即使脚本出错或被禁用，页面依然完全可正常阅读与操作，
  不会出现「整页无法选中」的副作用。
  注意：搜索框、表单、可视化编辑器元素不受影响（见 JS 的 isExempt）。
*/
html[data-copyguard="on"] .pm-wiki-detail {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  -webkit-touch-callout: none;
}
/* 允许选中的例外：表单与显式标注的元素 */
html[data-copyguard="on"] .pm-wiki-detail input,
html[data-copyguard="on"] .pm-wiki-detail textarea,
html[data-copyguard="on"] .pm-wiki-detail select,
html[data-copyguard="on"] .pm-copyguard-allow,
html[data-copyguard="on"] .pm-wiki-detail [contenteditable="true"] {
  -webkit-user-select: text;
  user-select: text;
}
/* 图片禁止拖拽保存（仍可通过右键另存，仅提高随手复制的成本） */
html[data-copyguard="on"] .pm-wiki-detail img { -webkit-user-drag: none; user-drag: none; }

/* 轻提示 */
.pm-copyguard-tip {
  position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%) translateY(10px);
  max-width: min(92vw, 520px); padding: 10px 16px; border-radius: 10px;
  background: rgba(31, 95, 135, .95); color: #fff; font-size: 13px; line-height: 1.7;
  box-shadow: 0 10px 30px rgba(0, 0, 0, .22); text-align: center;
  opacity: 0; pointer-events: none; transition: opacity .2s ease, transform .2s ease; z-index: 9999;
}
.pm-copyguard-tip.is-show { opacity: 1; transform: translateX(-50%) translateY(0); }

/* 打印来源说明：屏幕上隐藏，打印时显示 */
.pm-copyguard-print { display: none; }
@media print {
  .pm-copyguard-print { display: block; margin-top: 18px; padding-top: 10px;
    border-top: 1px solid #ccc; font-size: 12px; color: #444; }
  /* 打印时恢复可选中，便于读者摘录与引用（也保证打印排版正常） */
  html[data-copyguard="on"] .pm-wiki-detail { -webkit-user-select: text; user-select: text; }
}

/* ==================== 百科法律告知（合规展示） ==================== */
/* 站长要求：必须明确告知读者「不要随意饲养、先了解当地条例、避免饲养保护动物」 */
.pm-legal-title { color: #a5312a !important; border-left: 4px solid #d9534f !important; }
.pm-legal-warn {
  margin: 14px 0 20px; padding: 14px 16px; border-radius: 12px;
  background: #fff8f7; border: 1px solid #f3c2bd; border-left: 4px solid #d9534f;
  font-size: 13.5px; line-height: 1.9; color: #5a3028;
}
.pm-legal-warn strong { color: #a5312a; }
.pm-legal-warn ul { margin: 8px 0 8px; padding-left: 20px; }
.pm-legal-warn li { margin-bottom: 6px; }
.pm-legal-warn .pm-small { color: #8a6a63; }

/* 百科首页顶部的法律提示条 */
.pm-wiki-legalbar {
  display: flex; gap: 10px; align-items: flex-start;
  margin: 0 0 16px; padding: 12px 15px; border-radius: 12px;
  background: #fff8f7; border: 1px solid #f3c2bd; border-left: 4px solid #d9534f;
  font-size: 13.5px; line-height: 1.8; color: #5a3028;
}
.pm-wiki-legalbar__icon { font-size: 18px; line-height: 1.4; flex-shrink: 0; }
.pm-wiki-legalbar strong { color: #a5312a; }
.pm-wiki-legalbar a { font-weight: 600; }

/* ==================== 侧边悬浮工具条（需求 4） ==================== */
/*
  设计约束：可见但不影响阅读 ——
  · 固定在右下角，宽度仅 56px，不覆盖正文主体；
  · 回到顶部按钮未滚动时完全隐藏（opacity 0 + pointer-events none），
    绝不会拦住下面的链接点击；
  · 移动端进一步缩小并上移，避免遮挡底部按钮。
*/
.pm-sidebar {
  position: fixed; right: 18px; bottom: 88px; z-index: 900;
  display: flex; flex-direction: column; gap: 10px; align-items: flex-end;
}
.pm-sidebar__group { position: relative; }

.pm-sidebar__btn {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 2px; width: 52px; height: 52px; padding: 0; cursor: pointer;
  border: 1px solid rgba(31, 95, 135, .18); border-radius: 14px;
  background: rgba(255, 255, 255, .88); color: #1f5f87;
  box-shadow: 0 6px 18px rgba(20, 60, 90, .14);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  transition: transform .18s ease, box-shadow .18s ease, background .18s ease, opacity .22s ease;
}
.pm-sidebar__btn:hover { transform: translateY(-2px); box-shadow: 0 10px 24px rgba(20, 60, 90, .2); background: #fff; }
.pm-sidebar__btn:active { transform: translateY(0); }
.pm-sidebar__btn:focus-visible { outline: 2px solid #1f5f87; outline-offset: 2px; }
.pm-sidebar__label { font-size: 10px; line-height: 1; letter-spacing: .5px; }

/* 回到顶部：默认隐藏且不可点击，滚动后才淡入 */
.pm-sidebar__btn--top { opacity: 0; pointer-events: none; transform: translateY(6px); }
.pm-sidebar__btn--top.is-show { opacity: 1; pointer-events: auto; transform: translateY(0); }

/* QQ 客服按钮：展开时高亮 */
.pm-sidebar__btn--qq { background: rgba(18, 183, 245, .92); color: #fff; border-color: rgba(18, 183, 245, .5); }
.pm-sidebar__btn--qq:hover { background: #12b7f5; }
.pm-sidebar__btn--qq.is-open { box-shadow: 0 0 0 3px rgba(18, 183, 245, .25); }

/* 客服面板：从按钮左侧弹出 */
.pm-sidebar__panel {
  position: absolute; right: 62px; bottom: 0; width: 236px; padding: 14px 15px;
  border: 1px solid rgba(31, 95, 135, .16); border-radius: 14px;
  background: #fff; box-shadow: 0 14px 36px rgba(20, 60, 90, .2);
  animation: pmSidebarIn .16s ease;
}
@keyframes pmSidebarIn { from { opacity: 0; transform: translateX(8px); } to { opacity: 1; transform: translateX(0); } }
.pm-sidebar__title { margin: 0 0 4px; font-size: 14px; font-weight: 700; color: #1f3a4d; }
.pm-sidebar__time { margin: 0 0 8px; font-size: 12px; color: #6b8494; }
.pm-sidebar__qqlist { list-style: none; margin: 0; padding: 0; }
.pm-sidebar__qqlist li + li { margin-top: 6px; }
.pm-sidebar__qq {
  display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 9px;
  background: #f2f8fc; text-decoration: none; color: #1f3a4d; font-size: 13px;
  transition: background .15s ease;
}
.pm-sidebar__qq:hover { background: #e3f2fb; }
.pm-sidebar__qqicon {
  flex-shrink: 0; width: 22px; height: 22px; border-radius: 50%; background: #12b7f5; color: #fff;
  font-size: 10px; font-weight: 700; display: flex; align-items: center; justify-content: center;
}
.pm-sidebar__qqno { font-weight: 600; letter-spacing: .3px; }
.pm-sidebar__qqtag { margin-left: auto; font-size: 11px; color: #7c94a3; }
.pm-sidebar__tip { margin: 9px 0 0; font-size: 11px; line-height: 1.6; color: #8fa4b1; }

@media (max-width: 768px) {
  .pm-sidebar { right: 10px; bottom: 72px; }
  .pm-sidebar__btn { width: 46px; height: 46px; border-radius: 12px; }
  .pm-sidebar__panel { right: 54px; width: min(78vw, 230px); }
}
@media (prefers-reduced-motion: reduce) {
  .pm-sidebar__btn, .pm-sidebar__panel { transition: none; animation: none; }
}

/* ==================== 首页中栏广告位（需求 6） ==================== */
.pm-section--ad { padding-top: 8px; padding-bottom: 8px; }
.pm-home-join {
  display: flex; align-items: center; gap: 18px; justify-content: space-between;
  padding: 20px 26px; border-radius: 16px; text-decoration: none;
  background: linear-gradient(100deg, #eaf6fd 0%, #dff0fb 40%, #f6fbfe 100%);
  border: 1px solid rgba(31, 95, 135, .16); border-left: 5px solid #1f5f87;
  transition: transform .18s ease, box-shadow .18s ease;
}
.pm-home-join:hover { transform: translateY(-2px); box-shadow: 0 12px 28px rgba(20, 60, 90, .13); }
.pm-home-join__title { margin: 0 0 6px; font-size: 17px; font-weight: 700; color: #17475f; }
.pm-home-join__desc { margin: 0; font-size: 13.5px; line-height: 1.7; color: #4d6a7c; }
.pm-home-join__cta {
  flex-shrink: 0; padding: 11px 22px; border-radius: 999px;
  background: #1f5f87; color: #fff; font-size: 14px; font-weight: 600; white-space: nowrap;
}
.pm-home-join__note { margin: 8px 2px 0; }
@media (max-width: 768px) {
  .pm-home-join { flex-direction: column; align-items: flex-start; gap: 12px; padding: 16px 18px; }
  .pm-home-join__cta { width: 100%; text-align: center; }
}

/* ==================== 宠物乐园道具：广告位覆盖层 ==================== */
/*
  需求：虚拟道具也要能替换 LOGO，且广告位圈要够大（原来太小，真图看不清）。
  做法：不再把圈烤进底图，而是用真实 HTML 覆盖层 ——
        可上传、可点击、尺寸可调，也不影响后台换道具主图。
*/
.pm-item-card__media { position: relative; }

/* 未上传时的预留圈：虚线 + 提示，方便站长按尺寸备素材 */
.pm-item-card__adslot {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: 62%; aspect-ratio: 1 / 1; max-width: 200px;
  display: flex; align-items: center; justify-content: center;
  border: 2px dashed rgba(31, 95, 135, .42); border-radius: 50%;
  background: rgba(255, 255, 255, .55); color: #4a7c98;
  font-size: 11px; letter-spacing: .5px; text-align: center; line-height: 1.35;
  pointer-events: none;
}
/* 已上传：实圈显示真实 LOGO（放大后能看清品牌信息） */
.pm-item-card__adslot--filled {
  border: 2px solid rgba(255, 255, 255, .9); background: #fff;
  box-shadow: 0 4px 14px rgba(20, 60, 90, .18);
  overflow: hidden; pointer-events: auto; text-decoration: none;
}
.pm-item-card__adslot--filled img {
  width: 100%; height: 100%; object-fit: contain; border-radius: 50%; display: block;
}
a.pm-item-card__adslot--filled:hover { box-shadow: 0 6px 20px rgba(20, 60, 90, .28); }
/* 广告主名称：显示在道具图下方，署名清晰 */
.pm-item-card__adname {
  position: absolute; left: 50%; bottom: 6px; transform: translateX(-50%);
  max-width: 92%; padding: 2px 9px; border-radius: 999px;
  background: rgba(31, 95, 135, .88); color: #fff;
  font-size: 10.5px; line-height: 1.7; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
@media (max-width: 768px) {
  .pm-item-card__adslot { width: 58%; font-size: 10px; }
}

/* ===================================================================
   服务商地图区块（三级降级渲染，见 services/provider-map.js）
   =================================================================== */
.pm-map-figure { margin: 0 0 12px; }
.pm-map-img { width: 100%; max-width: 600px; height: auto; border-radius: 10px;
  border: 1px solid var(--pm-line, #e6e8ee); display: block; background: #f3f5f9; }
.pm-map-figure figcaption { margin-top: 8px; }

/* L3 无 Key 时的地址卡片（替代原来的空白框） */
.pm-map-fallback { display: flex; gap: 14px; align-items: flex-start;
  padding: 18px 20px; border: 1px solid var(--pm-line, #e6e8ee); border-radius: 12px;
  background: linear-gradient(135deg, #f8fafc 0%, #eef2f8 100%); }
.pm-map-fallback__pin { font-size: 30px; line-height: 1; flex: 0 0 auto; }
.pm-map-fallback__body { min-width: 0; }
.pm-map-fallback__name { display: block; font-size: 16px; margin-bottom: 4px; }
.pm-map-fallback__addr { margin: 0 0 6px; color: #33415c; word-break: break-all; }

/* 一键打开外部地图（无需 API Key） */
.pm-map-links { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 14px; }
.pm-map-links__label { font-size: 13px; color: #6b7280; }
.pm-map-link { display: inline-block; padding: 7px 14px; border-radius: 999px;
  border: 1px solid var(--pm-primary, #2f7d5d); color: var(--pm-primary, #2f7d5d);
  font-size: 13px; text-decoration: none; transition: all .18s ease; }
.pm-map-link:hover { background: var(--pm-primary, #2f7d5d); color: #fff; }

/* ===================================================================
   文章分享（裂变传播）—— 微信/QQ/微博/复制链接/系统分享
   =================================================================== */
.pm-share { margin: 22px 0 6px; padding: 16px 18px; border-radius: 12px;
  border: 1px solid var(--pm-line, #e6e8ee); background: #fbfcfe; }
.pm-share__title { font-size: 14px; font-weight: 600; color: #33415c; margin: 0 0 12px;
  display: flex; align-items: center; gap: 6px; }
.pm-share__list { display: flex; flex-wrap: wrap; gap: 10px; margin: 0; padding: 0; list-style: none; }
.pm-share__btn { display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 15px; border-radius: 999px; font-size: 13px; cursor: pointer;
  border: 1px solid var(--pm-line, #e6e8ee); background: #fff; color: #33415c;
  text-decoration: none; transition: all .18s ease; line-height: 1; }
.pm-share__btn:hover { border-color: var(--pm-primary, #2f7d5d); color: var(--pm-primary, #2f7d5d); }
.pm-share__btn--wechat { border-color: #07c160; color: #07c160; }
.pm-share__btn--wechat:hover { background: #07c160; color: #fff; border-color: #07c160; }
.pm-share__btn--qq { border-color: #12b7f5; color: #12b7f5; }
.pm-share__btn--qq:hover { background: #12b7f5; color: #fff; border-color: #12b7f5; }
.pm-share__btn--weibo { border-color: #e6162d; color: #e6162d; }
.pm-share__btn--weibo:hover { background: #e6162d; color: #fff; border-color: #e6162d; }
.pm-share__btn--ok { border-color: #07c160; background: #07c160; color: #fff; }
/* 微信扫码浮层：微信不支持网页直接分享，只能用二维码引导"扫一扫" */
.pm-share__qr { display: none; position: fixed; inset: 0; z-index: 9999;
  background: rgba(15, 23, 42, .45); align-items: center; justify-content: center; }
.pm-share__qr.is-open { display: flex; }
.pm-share__qr-box { background: #fff; border-radius: 14px; padding: 22px 24px 18px;
  text-align: center; max-width: 300px; box-shadow: 0 18px 48px rgba(15, 23, 42, .22); }
.pm-share__qr-box h4 { margin: 0 0 6px; font-size: 15px; }
.pm-share__qr-box p { margin: 0 0 12px; font-size: 12px; color: #6b7280; }
.pm-share__qr-box img { width: 190px; height: 190px; display: block; margin: 0 auto 10px;
  border: 1px solid var(--pm-line, #e6e8ee); border-radius: 8px; }

/* =====================================================================
   H5 内测预览页（/h5-test/，站长自用，不索引）
   =====================================================================
   布局：左侧页面清单 + 右侧真实手机视口 iframe。
   电脑上即可看到手机端效果，避免"截图看不全、没法给修改意见"。
   ===================================================================== */
.pm-h5test { max-width: 1400px; margin: 0 auto; padding: 16px 18px 40px; }
.pm-h5test__bar {
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px;
  padding: 12px 16px; margin-bottom: 16px;
  background: #fff; border: 1px solid var(--line, #e6e8ee); border-radius: 12px;
}
.pm-h5test__title { font-size: 17px; font-weight: 700; color: #253044; display: flex; align-items: center; gap: 8px; }
.pm-h5test__badge {
  font-size: 11px; font-weight: 500; color: #b45309;
  background: #fef3c7; border-radius: 999px; padding: 3px 9px;
}
.pm-h5test__sizes { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pm-h5test__sizes-label { font-size: 13px; color: #6b7280; }
.pm-h5test__size {
  min-height: 34px; padding: 0 12px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--line, #e6e8ee); background: #fff; color: #33415c; font-size: 13px;
}
.pm-h5test__size.is-active { background: var(--brand, #2f7d5d); border-color: var(--brand, #2f7d5d); color: #fff; }
.pm-h5test__actions { margin-left: auto; display: flex; gap: 8px; }
.pm-h5test__btn {
  display: inline-flex; align-items: center; min-height: 36px; padding: 0 14px;
  border-radius: 8px; font-size: 13px; text-decoration: none; cursor: pointer;
  background: var(--brand, #2f7d5d); color: #fff; border: 1px solid var(--brand, #2f7d5d);
}
.pm-h5test__btn--ghost { background: #fff; color: #33415c; border-color: var(--line, #e6e8ee); }
.pm-h5test__body { display: flex; gap: 20px; align-items: flex-start; }
.pm-h5test__list {
  flex: 0 0 250px; background: #fff; border: 1px solid var(--line, #e6e8ee);
  border-radius: 12px; padding: 14px 12px;
}
.pm-h5test__list-title { margin: 0 0 10px; font-size: 13px; color: #6b7280; }
.pm-h5test__list ul { list-style: none; margin: 0; padding: 0; }
.pm-h5test__list li + li { margin-top: 2px; }
.pm-h5test__list a {
  display: block; min-height: 38px; line-height: 38px; padding: 0 10px;
  border-radius: 8px; font-size: 13.5px; color: #33415c; text-decoration: none;
}
.pm-h5test__list a:hover { background: #f4f7fb; }
.pm-h5test__list a.is-active { background: var(--brand, #2f7d5d); color: #fff; font-weight: 600; }
.pm-h5test__tips { margin-top: 14px; padding-top: 12px; border-top: 1px solid #f1f3f7; font-size: 12px; color: #6b7280; }
.pm-h5test__tips strong { display: block; color: #33415c; margin-bottom: 6px; font-size: 13px; }
.pm-h5test__tips code {
  display: inline-block; background: #f4f7fb; border-radius: 6px;
  padding: 3px 6px; font-size: 12px; color: #1f3b6e; word-break: break-all;
}
.pm-h5test__hint { margin: 8px 0 0; }
.pm-h5test__stage { flex: 1 1 auto; display: flex; flex-direction: column; align-items: center; }
.pm-h5test__phone {
  width: 390px; max-width: 100%; height: 844px;
  background: #111827; border-radius: 34px; padding: 10px;
  box-shadow: 0 18px 50px rgba(15, 23, 42, .25);
  position: relative; transition: width .2s ease;
}
.pm-h5test__notch {
  position: absolute; top: 6px; left: 50%; transform: translateX(-50%);
  width: 96px; height: 18px; background: #111827; border-radius: 0 0 12px 12px; z-index: 2;
}
.pm-h5test__phone iframe {
  width: 100%; height: 100%; border: 0; border-radius: 26px; background: #fff; display: block;
}
.pm-h5test__url { margin: 12px 0 0; font-size: 12.5px; color: #6b7280; }
/* 窄屏（手机上看本页）：堆叠显示，隐藏手机外壳只留内容 */
@media (max-width: 760px) {
  .pm-h5test__body { flex-direction: column; }
  .pm-h5test__list { flex: 1 1 auto; width: 100%; }
  .pm-h5test__phone { width: 100% !important; height: 640px; border-radius: 14px; padding: 6px; }
  .pm-h5test__notch { display: none; }
}

/* =====================================================================
   横版广告位轮播（views/partials/banner.ejs）
   =====================================================================
   【需求】「所有横版的中栏广告位均增加轮播功能，这样除了正常的本站宣传，
           还可以接广告宣传。」
   【实现】banner 组件在"多于 1 张"时自动输出轮播标记，复用站点已有的
          [data-carousel] 逻辑（site.js），因此这里只需补齐横版轮播的样式：
          容器相对定位、slide 绝对定位叠放（只显示 is-active 那张）、
          圆点居中排在图片下方。
   【单张不受影响】只有 1 张广告时不输出轮播标记，样式与原来完全一致。
   ===================================================================== */
/* ⚠️ 2026-10-19 修（站长实测：开启轮播后首页出现大面积留白，刷新无效）
   =====================================================================
   根因：`.pm-banner` 本身是 `display:flex`（单张时三张并排）。
   一旦切成轮播，`.pm-banner__track` 变成 flex 子项，而它内部的 slide 全是
   `position:absolute` —— flex 子项的高度由内容撑，内容又全脱离了文档流，
   高度计算进入"循环依赖"，浏览器给出一个异常大/异常小的值，
   表现就是：横幅下面拖出一大片空白，且圆点被推到很下面。
   修法：轮播模式整体改为**块级**，高度由 `aspect-ratio` 锁定，不再依赖图片加载。

   另外站长反馈「位置占的太大了」：横版横幅锁定 1200:220 比例 + 最大高度 180px，
   比原来铺满整行的巨幅缩小约 25%，更贴合"中栏"观感，也减少首屏图片压力。 */
/* =====================================================================
   轮播横幅：硬高度锁定（站长 2026-10-19 第二次修，第一次的 aspect-ratio 方案不够）
   =====================================================================
   实测现象：开启轮播后横幅下面拖出数百像素白块，轮播圆点被推到很远处，
   刷新无效。说明容器高度被某个"内容高度"撑开了，且不是截图里的第一张图造成。

   病根（两条叠加）：
     ① `.pm-banner` 本身是 display:flex（单张时三张并排用）；
        切轮播后 track 成了 flex 子项，内部 slide 又是 absolute，
        高度计算出现循环依赖 —— 不同浏览器会给出完全不同的诡异高度。
     ② 图片 `loading="lazy"` + `height:auto`：懒加载未触发时图片内在尺寸为 0，
        `aspect-ratio` 的参考高度不稳定。

   结论：**不用 aspect-ratio 了，直接给死高度**。
     容器、slide、img 三层全部写成固定 180px，任何一层都不可能再撑大；
     `overflow:hidden` 兜底，图片比例不对就裁，但版面绝不可能失控。
   180px 的依据：站长反馈「位置占的太大了」，原 1200×220 按 1180 宽铺满是 216px，
   压到 180px 观感更接近"中栏小横幅"，同时减少首屏图片解码压力。
   ===================================================================== */
.pm-banner--carousel {
  display: block !important;     /* 覆盖 .pm-banner 的 display:flex */
  position: relative;
  max-width: 1180px;
  margin: 0 auto;
  padding: 12px 18px 0 !important;
}
.pm-banner--carousel .pm-banner__track {
  position: relative;
  width: 100%;
  height: 180px;                 /* 硬高度：容器 */
  overflow: hidden;
  border-radius: var(--radius, 14px);
}
.pm-banner--carousel .pm-carousel__slide {
  position: absolute;
  inset: 0;
  height: 180px;                 /* 硬高度：每张 slide */
  opacity: 0;
  transition: opacity .45s ease;
  pointer-events: none;
}
.pm-banner--carousel .pm-carousel__slide.is-active {
  opacity: 1;
  pointer-events: auto;
}
.pm-banner--carousel .pm-carousel__slide img {
  width: 100%;
  height: 180px !important;      /* 硬高度：图片 */
  object-fit: cover;
  display: block;
  max-height: 180px;
}/* 轮播里的链接/容器不该再套 .pm-banner__item 的 flex 规则（那是并排三张用的） */
.pm-banner--carousel .pm-banner__item { flex: none; display: block; width: 100%; }
/* 圆点：压在图片下缘中间，半透明底保证在浅色图上也可见 */
.pm-banner--carousel .pm-carousel__dots {
  position: absolute; left: 0; right: 0; bottom: 8px;
  display: flex; justify-content: center; gap: 6px; z-index: 2;
}
.pm-banner--carousel .pm-carousel__dot {
  width: 7px; height: 7px; padding: 0; border: 0; border-radius: 50%;
  background: rgba(255, 255, 255, .55); cursor: pointer;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .25);
}
.pm-banner--carousel .pm-carousel__dot.is-active { background: #fff; width: 16px; border-radius: 4px; }
@media (max-width: 900px) {
  .pm-banner--carousel .pm-carousel__dot { width: 6px; height: 6px; }
  .pm-banner--carousel .pm-carousel__dot.is-active { width: 14px; }
}

/* =====================================================================
   站内搜索框（views/partials/search-box.ejs）
   =====================================================================
   设计依据：微信小程序设计指南「减少输入」——搜索是手机上最需要的功能，
   因此放在列表页首屏显眼位置，并做足够大的点击区域（≥44px）。
   ===================================================================== */
.pm-search {
  display: flex; align-items: center; gap: 0;
  max-width: 560px; margin: 0 0 14px;
  background: #fff; border: 1px solid var(--line, #e6e8ee);
  border-radius: 999px; padding: 4px 4px 4px 14px;
  box-shadow: 0 1px 3px rgba(15, 23, 42, .04);
}
.pm-search__icon { flex: 0 0 auto; width: 18px; height: 18px; color: #98a2b3; margin-right: 8px; }
.pm-search__icon svg { width: 100%; height: 100%; display: block; }
.pm-search__input {
  flex: 1 1 auto; min-width: 0; border: 0; outline: 0; background: transparent;
  font-size: 15px; color: #253044; padding: 10px 0;
  /* 16px 以下 iOS 会自动放大页面，这里用 15px 但配合 viewport 固定缩放，实测无放大 */
  -webkit-appearance: none;
}
.pm-search__input::placeholder { color: #aab3c0; }
.pm-search__clear {
  flex: 0 0 auto; width: 28px; height: 28px; line-height: 28px; text-align: center;
  border-radius: 50%; color: #98a2b3; text-decoration: none; font-size: 13px;
}
.pm-search__btn {
  flex: 0 0 auto; min-height: 38px; padding: 0 18px; border: 0; cursor: pointer;
  border-radius: 999px; background: var(--brand, #2f7d5d); color: #fff;
  font-size: 14px; font-weight: 500;
}
.pm-search__btn:active { opacity: .8; }
.pm-search__hint {
  margin: -6px 0 14px; font-size: 13px; color: #6b7280;
}
.pm-search__hint strong { color: var(--brand, #2f7d5d); }
.pm-search__hint a { color: #6b7280; margin-left: 6px; }
@media (max-width: 900px) {
  .pm-search { max-width: none; margin-bottom: 12px; }
  .pm-search__input { font-size: 16px; }   /* 手机上提到 16px，避免 iOS 自动放大 */
  .pm-search__btn { min-height: 40px; padding: 0 16px; }
}

/* =====================================================================
   侧边分享面板（含折叠二维码）
   =====================================================================
   站长要求：「二维码完全可以折叠到侧边，点击再显示二维码，不点就贴边。」
   因此侧边只常驻一个 48px 圆球，面板点击才展开；二维码**首次展开时才加载**。
   ===================================================================== */
.pm-sidebar__panel--share { min-width: 210px; text-align: center; }
.pm-sidebar__qrbox { margin: 8px 0 10px; }
.pm-sidebar__qrbox img {
  width: 160px; height: 160px; display: block; margin: 0 auto;
  border: 1px solid #eef1f6; border-radius: 10px; background: #fff;
}
.pm-sidebar__qrtip { margin: 6px 0 0; font-size: 11.5px; color: #98a2b3; }
.pm-sidebar__sharegrid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 6px;
}
.pm-sidebar__shareitem {
  display: flex; align-items: center; justify-content: center;
  min-height: 38px; border-radius: 8px; border: 1px solid var(--line, #e6e8ee);
  background: #fafbfd; color: #33415c; font-size: 12.5px;
  text-decoration: none; cursor: pointer;
}
.pm-sidebar__shareitem:active { opacity: .7; }
/* 轻提示（复制成功等） */
.pm-sidebar-toast {
  position: fixed; left: 50%; bottom: 140px; transform: translateX(-50%) translateY(8px);
  background: rgba(15, 23, 42, .9); color: #fff;
  padding: 8px 15px; border-radius: 999px; font-size: 12.5px;
  opacity: 0; pointer-events: none; transition: opacity .2s ease, transform .2s ease;
  z-index: 999; max-width: 78vw; text-align: center;
}
.pm-sidebar-toast.is-show { opacity: 1; transform: translateX(-50%) translateY(0); }

/* =====================================================================
   侧边打赏面板（话术谦卑、默认关闭、未配置不渲染）
   ===================================================================== */
.pm-sidebar__panel--donate { min-width: 210px; text-align: center; }
.pm-sidebar__btn--donate { color: #e0574f; }
.pm-sidebar__tip--donate {
  text-align: left; line-height: 1.75; color: #5a6b85;
}

/* =====================================================================
   道具商城切换标签（融合乐园 / 灵堂两个商城）
   =====================================================================
   站长要求：「手机端你帮我融合一下，做成可选择的两个积分道具商城。」
   用并排两个大按钮切换，每个按钮带副标题说明用途，避免用户混淆。
   ===================================================================== */
.pm-shoptabs {
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
  margin: 0 0 8px;
}
.pm-shoptabs__item {
  display: flex; flex-direction: column; gap: 3px;
  padding: 12px 14px; border-radius: 12px; text-decoration: none;
  background: #fff; border: 1.5px solid var(--line, #e6e8ee);
  min-height: 64px; justify-content: center;
}
.pm-shoptabs__item.is-active {
  border-color: var(--brand, #2f7d5d);
  background: #f2f9f5;
  box-shadow: 0 2px 10px rgba(47, 125, 93, .1);
}
.pm-shoptabs__label { font-size: 14.5px; font-weight: 600; color: #253044; }
.pm-shoptabs__item.is-active .pm-shoptabs__label { color: var(--brand, #2f7d5d); }
.pm-shoptabs__desc { font-size: 11.5px; color: #98a2b3; }
.pm-shoptabs__note {
  margin: 0 0 16px; font-size: 12.5px; color: #6b7280; line-height: 1.7;
}
@media (max-width: 900px) {
  .pm-shoptabs__item { padding: 11px 12px; min-height: 60px; }
  .pm-shoptabs__label { font-size: 14px; }
}

/* =====================================================================
   分享激励广告语（分享区）+ 商城分享引导
   ===================================================================== */
.pm-share__promo {
  margin: 10px 0 12px; padding: 11px 13px;
  background: linear-gradient(135deg, #fff8e8 0%, #fff4e0 100%);
  border: 1px solid #ffe2ab; border-radius: 10px;
}
.pm-share__promo-line { margin: 0 0 5px; font-size: 13.5px; color: #8a5a00; line-height: 1.6; }
.pm-share__promo-line strong { color: #b45309; }
.pm-share__promo-sub { margin: 0; font-size: 12.5px; color: #8a6a3a; line-height: 1.75; }
.pm-share__promo-sub a { color: #b45309; text-decoration: underline; }
.pm-share__promo-login { margin: 7px 0 0; font-size: 12.5px; color: #8a6a3a; }
.pm-share__promo-login a { color: #b45309; font-weight: 600; }

/* 商城顶部：分享得积分引导 */
.pm-shoptabs__share {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 0 0 10px; padding: 12px 14px;
  background: linear-gradient(135deg, #fff8e8 0%, #fff4e0 100%);
  border: 1px solid #ffe2ab; border-radius: 12px;
}
.pm-shoptabs__share-ico { font-size: 20px; line-height: 1.2; flex: 0 0 auto; }
.pm-shoptabs__share-t { margin: 0 0 3px; font-size: 13.5px; font-weight: 600; color: #8a5a00; }
.pm-shoptabs__share-s { margin: 0; font-size: 12px; color: #8a6a3a; line-height: 1.7; }
.pm-shoptabs__share-s strong { color: #b45309; }
.pm-shoptabs__share-s a { color: #b45309; text-decoration: underline; }

/* 地图备用入口（站长反馈"落点随机"后新增：按名称再找一个） */
.pm-map-link--alt {
  background: transparent !important;
  border-style: dashed !important;
  color: #6b7280 !important;
  font-size: 12.5px !important;
}

/* =====================================================================
   城市页：服务商位置导航列表（纯服务端渲染，零 JS / 零图片）
   =====================================================================
   站长要求"不嵌入地图图层，只给地址 + 地图按钮"后重写。
   好处：页面最快、无外部脚本、内容进 HTML 可被搜索引擎收录。
   ===================================================================== */
.pm-city-provider-hint { margin: 0 0 14px; line-height: 1.75; }
.pm-city-provider-list { list-style: none; margin: 0; padding: 0; }
.pm-city-provider-item {
  display: flex; flex-wrap: wrap; gap: 12px 16px;
  align-items: center; justify-content: space-between;
  padding: 14px 0; border-bottom: 1px solid var(--line, #e6e8ee);
}
.pm-city-provider-item:last-child { border-bottom: 0; }
.pm-city-provider-item__main { flex: 1 1 300px; min-width: 0; }
.pm-city-provider-item__name {
  font-size: 15.5px; font-weight: 600; color: #253044; text-decoration: none;
}
.pm-city-provider-item__name:active { color: var(--brand, #2f7d5d); }
.pm-city-provider-item__addr {
  margin: 5px 0 0; font-size: 13px; color: #5a6b85; line-height: 1.65;
}
.pm-city-provider-item__addr.pm-muted { color: #98a2b3; }
.pm-city-provider-item__phone { margin: 5px 0 0; font-size: 13px; color: #5a6b85; }
.pm-city-provider-item__phone a { color: var(--brand, #2f7d5d); text-decoration: none; }
.pm-city-provider-item__nav { display: flex; flex-wrap: wrap; gap: 8px; flex: 0 0 auto; }
@media (max-width: 900px) {
  .pm-city-provider-item { flex-direction: column; align-items: stretch; }
  .pm-city-provider-item__nav { justify-content: flex-start; }
  .pm-city-provider-item__name { font-size: 15px; }
}

/* =====================================================================
   文章可视化编辑器（后台文章编辑页，views/admin/article.ejs）
   =====================================================================
   零依赖自研：工具栏 + contenteditable 正文区 + 隐藏 textarea 兜底提交。
   上传压缩由后端 /admin/upload/editor 完成（见 services/upload.js）。
   ===================================================================== */
.pm-editor {
  border: 1px solid var(--line, #d9dde5);
  border-radius: 10px; overflow: hidden; background: #fff;
}
.pm-editor__toolbar {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
  padding: 8px 10px; background: #f7f9fc; border-bottom: 1px solid var(--line, #e6e8ee);
  position: sticky; top: 0; z-index: 5;
}
.pm-editor__btn {
  min-height: 32px; padding: 0 10px;
  border: 1px solid #dfe4ec; background: #fff; border-radius: 6px;
  font-size: 13px; color: #33415c; cursor: pointer; line-height: 30px;
}
.pm-editor__btn:hover { background: #eef3fa; border-color: #c7d4e6; }
.pm-editor__btn.is-active { background: #2f7d5d; border-color: #2f7d5d; color: #fff; }
.pm-editor__btn--primary { background: #2f7d5d; border-color: #2f7d5d; color: #fff; font-weight: 500; }
.pm-editor__btn--primary:hover { background: #276b4f; }
.pm-editor__btn--ghost { background: #fff; color: #6b7280; }
.pm-editor__sep { width: 1px; height: 20px; background: #dfe4ec; margin: 0 4px; }

/* 正文编辑区：排版尽量贴近前台文章页，所见即所得 */
.pm-editor__body {
  min-height: 460px; max-height: 70vh; overflow-y: auto;
  padding: 18px 20px; font-size: 15px; line-height: 1.85; color: #253044;
  outline: none; background: #fff;
}
.pm-editor__body:focus { box-shadow: inset 0 0 0 2px rgba(47, 125, 93, .12); }
.pm-editor__body p { margin: 0 0 14px; }
.pm-editor__body h2 { font-size: 20px; margin: 22px 0 12px; color: #1f2b41; }
.pm-editor__body h3 { font-size: 17px; margin: 18px 0 10px; color: #1f2b41; }
.pm-editor__body ul, .pm-editor__body ol { margin: 0 0 14px; padding-left: 22px; }
.pm-editor__body li { margin-bottom: 6px; }
.pm-editor__body blockquote {
  margin: 0 0 14px; padding: 10px 14px; border-left: 3px solid #2f7d5d;
  background: #f4f9f6; color: #3c4a5f;
}
.pm-editor__body a { color: #2f6fed; text-decoration: underline; }
.pm-editor__body hr { border: 0; border-top: 1px dashed #d9dde5; margin: 20px 0; }
/* 正文图片：等比缩放、不溢出，与前台保持一致 */
.pm-editor__body img {
  max-width: 100%; height: auto; display: block;
  margin: 14px auto; border-radius: 8px; cursor: pointer;
}
.pm-editor__body img.is-selected { box-shadow: 0 0 0 3px rgba(47, 125, 93, .5); }

/* 源码模式：显示原始 textarea（默认隐藏） */
.pm-editor__source--show {
  display: block; width: 100%; border: 0; border-radius: 0;
  padding: 16px 18px; min-height: 460px;
  font-family: ui-monospace, Consolas, monospace; font-size: 13px; line-height: 1.7;
}
.pm-editor__status {
  padding: 7px 12px; font-size: 12.5px; color: #6b7280;
  background: #fafbfd; border-top: 1px solid var(--line, #eef1f6); min-height: 17px;
}
.pm-editor__status.is-ok { color: #2f7d5d; }
.pm-editor__status.is-err { color: #d92d20; background: #fef3f2; }
.pm-editor.is-source .pm-editor__body { display: none; }
@media (max-width: 760px) {
  .pm-editor__toolbar { position: static; }
  .pm-editor__body { min-height: 360px; padding: 14px; font-size: 15px; }
  .pm-editor__btn { min-height: 34px; }   /* 手机上保证可点区域 */
}

/* =====================================================================
   侧边客服面板 · 站长个人二维码（站长要求）
   =====================================================================
   「初创之期担任客服，偶尔收到打赏费用用于维持。」—— 站长原话
   ===================================================================== */
.pm-sidebar__support {
  margin-top: 10px; padding-top: 10px;
  border-top: 1px solid var(--line, #eef1f6);
  text-align: center;
}
.pm-sidebar__support-t { margin: 0 0 8px; font-size: 13px; font-weight: 600; color: #33415c; }
.pm-sidebar__support img {
  width: 150px; height: 150px; display: block; margin: 0 auto;
  border: 1px solid #eef1f6; border-radius: 10px; background: #fff;
}
.pm-sidebar__support-s {
  margin: 8px 0 0; font-size: 11.5px; color: #98a2b3; line-height: 1.7; text-align: left;
}

/* =====================================================================
   游戏 AI 仿真图片（站长要求：把矢量图换成仿真高质量 AI 图）
   =====================================================================
   pet-graphics.js 的 pick()/foodPick() 输出 <img class="pm-game-petimg">，
   图片加载失败时用 onerror 换回内联 SVG（绝不开天窗）。
   这里只负责"让图片在卡片/网格里正确缩放居中"。
   ===================================================================== */
.pm-game-petimg {
  display: block;
  width: 100%;
  height: auto;
  max-width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border-radius: 10px;
  /* 仿真照片放进卡片时的轻微内阴影，避免与卡片背景糊在一起 */
  box-shadow: inset 0 0 0 1px rgba(15, 23, 42, .06);
}
/* 记忆翻牌卡片正面：图片铺满上半，名字在下 */
.pm-game-mem-card__front .pm-game-petimg {
  width: 74%;
  margin: 0 auto;
  border-radius: 50%;     /* 照片裁成圆形，卡片更精致 */
  box-shadow: 0 2px 8px rgba(15, 23, 42, .14);
}
@media (max-width: 760px) {
  .pm-game-mem-card__front .pm-game-petimg { width: 80%; }
}

/* =====================================================================
   热门标记（小图标）与无障碍辅助类
   =====================================================================
   【站长反馈】「文章热贴应该是标签，不要写成热字……全改成小图标」
   原因：裸露的"热"字既不易理解，也会被搜索引擎当作页面正文单字，
   存在关键词堆砌误判风险。故改为 SVG 火焰图标 + 视觉隐藏语义文本。
   ===================================================================== */
.pm-hot-ico {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  vertical-align: -2px;
  margin-right: 5px;
  width: 18px;
  height: 18px;
  border-radius: 5px;
  /* 暖色底衬，让它在标题前既醒目又不像文字 */
  background: linear-gradient(160deg, #fff2e0 0%, #ffe2c2 100%);
  color: #e0574f;
  flex: 0 0 auto;
}
.pm-hot-ico svg { display: block; }

/* 视觉隐藏但可被屏幕阅读器读到（无障碍标准做法） */
.pm-sr-only {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* 后台：热置顶按钮（已置顶状态用暖色区分） */
.pm-link-btn--hot {
  color: #d9480f !important;
  font-weight: 600;
}
.pm-link-btn--hot:hover { color: #b93a08 !important; }

/* =====================================================================
   文章页侧边：广告位兜底宣传图 + 打赏卡片
   =====================================================================
   站长要求：「任意文章界面没有打赏标识，右边原先给过指令加广告位，但一直没实现」。
   实现说明见 views/article/detail.ejs 内注释：广告位未投放时不留空，
   改显站内宣传图；打赏卡片常显（无收款码时只留文字邀请）。
   ===================================================================== */
.pm-side-promo {
  display: block;
  position: relative;
  border-radius: 10px;
  overflow: hidden;
  text-decoration: none;
}
.pm-side-promo img { width: 100%; height: auto; display: block; }
.pm-side-promo__tag {
  position: absolute; left: 8px; top: 8px;
  padding: 2px 8px; border-radius: 999px;
  background: rgba(15, 23, 42, .62);
  color: #fff; font-size: 11px; line-height: 1.7;
}
.pm-side-donate__qr { text-align: center; margin: 6px 0 8px; }
.pm-side-donate__qr img {
  display: inline-block; border: 1px solid #eef1f6; border-radius: 10px; background: #fff;
}
.pm-side-donate__text { line-height: 1.75; }
.pm-side-card--donate {
  /* 暖色左线，让"支持"卡片在侧栏里一眼可辨，但不刺眼 */
  border-left: 3px solid #f0b775;
}

/* 积分获取引导（积分规则页 / 治愈星球共用风格） */
.pm-points-earn {
  margin: 16px 0;
  padding: 14px 16px;
  background: linear-gradient(135deg, #f4fbf7 0%, #eef7ff 100%);
  border: 1px solid #d9ece2;
  border-radius: 12px;
}
.pm-points-earn > strong { display: block; margin-bottom: 8px; font-size: 15px; color: #22684c; }
.pm-points-earn ul { margin: 0; padding-left: 20px; }
.pm-points-earn li { margin-bottom: 7px; font-size: 13.5px; line-height: 1.75; color: #33415c; }
.pm-points-earn a { color: #2f7d5d; }
.pm-points-earn__more {
  margin: 10px 0 0; padding-top: 10px; border-top: 1px dashed #cfe6da;
  font-size: 13px; line-height: 1.8; color: #4a5b76;
}
.pm-points-earn__more strong { color: #22684c; }

/* 治愈星球 hero 的积分说明 */
.pm-game-hero__points {
  margin: 12px 0 0;
  padding: 12px 14px;
  background: rgba(255, 255, 255, .72);
  border: 1px solid rgba(47, 125, 93, .18);
  border-radius: 12px;
  font-size: 13.5px;
  line-height: 1.8;
  color: #33415c;
}
.pm-game-hero__points strong { color: #22684c; }
.pm-game-hero__points a { color: #2f7d5d; }

/* 登录/注册页的紧凑版积分引导 */
.pm-points-earn--compact { margin: 14px 0 10px; padding: 12px 14px; }
.pm-points-earn--compact li { font-size: 13px; margin-bottom: 5px; }

/* =====================================================================
   文章正文配图（figure）
   =====================================================================
   【为什么必须补这个样式】
   站长实测反馈「文章插图乱码」——排查发现有两层问题：
     ① 图片文件本身被自研压缩器编坏（已改用原图修复）；
     ② **.pm-article-figure 这个类根本没有样式** ——
        2048px 宽的原图在正文里**不缩放**，会横向溢出，
        在小屏上只看到画面一角，观感就像"坏图"。
   这里补上宽度约束，保证任何尺寸的配图都能自适应正文宽度。
   ===================================================================== */
.pm-article-figure {
  margin: 18px 0;
  text-align: center;
}
.pm-article-figure img {
  max-width: 100%;
  width: 100%;
  height: auto;
  border-radius: 10px;
  display: block;
  margin: 0 auto;
}
/* 宣传配图：略收窄，避免在宽屏正文里过于抢眼 */
.pm-article-figure--promo img { max-width: 760px; }
@media (max-width: 900px) {
  .pm-article-figure { margin: 14px 0; }
  .pm-article-figure img { border-radius: 8px; }
  .pm-article-figure--promo img { max-width: 100%; }
}

/* =====================================================================
   文章末尾「赏」字图标（站长 2026-10-16 要求）
   =====================================================================
   站长原话：「将每篇文章结束处生成一个赏字图标，鼠标移上去显示二维码，
             允许管理员后台上传此处二维码，作为网站生存途径之一。」
   实现说明：
     · **纯 CSS 悬停展开**（:hover / :focus-within），不依赖 JS ——
       脚本失败或未加载时二维码依然可以查看；
     · 触屏无 hover，故用 :focus-within 支持点击展开；
     · 默认不占空间（tip 绝对定位），不打断正文阅读节奏；
     · 未配置二维码时模板根本不渲染本组件（见 article/detail.ejs）。
   ===================================================================== */
.pm-reward {
  position: relative;
  margin: 26px 0 8px;
  text-align: center;
}
.pm-reward__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  padding: 0;
  border: 1px solid #e3d2b0;
  border-radius: 50%;
  background: #fffaf0;
  color: #b8860b;
  font-family: "KaiTi", "STKaiti", "SimSun", serif;
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  transition: transform .15s ease, box-shadow .15s ease, background .15s ease;
}
.pm-reward__char { transform: translateY(-1px); }
.pm-reward__btn:hover,
.pm-reward__btn:focus-visible {
  background: #fff3dc;
  box-shadow: 0 2px 10px rgba(184, 134, 11, .22);
  transform: translateY(-1px);
  outline: none;
}
.pm-reward__tip {
  position: absolute;
  left: 50%;
  bottom: calc(100% + 10px);
  transform: translateX(-50%) translateY(6px);
  padding: 10px 10px 8px;
  background: #fff;
  border: 1px solid #eee;
  border-radius: 10px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, .12);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
  z-index: 30;
  width: 172px;
}
/* 悬停/聚焦展开：鼠标移到图标上即可看到二维码 */
.pm-reward:hover .pm-reward__tip,
.pm-reward:focus-within .pm-reward__tip {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}
.pm-reward__tip img {
  display: block;
  width: 150px;
  height: 150px;
  margin: 0 auto 6px;
  border-radius: 6px;
}
.pm-reward__text {
  margin: 0;
  font-size: 12px;
  line-height: 1.5;
  color: #8a7a5c;
  text-align: center;
}
@media (max-width: 900px) {
  .pm-reward { margin: 20px 0 6px; }
}

/* ==================== 登录页双栏（站长 2026-10-17：两侧空白太多）==================== */
/*
 * 容器本来就是 860px，但原来的 .pm-auth 只有 460px，
 * 于是左右各空 200px。这里改成左右双栏：
 *   左 420px 登录表单（.pm-auth--inline 取消原来的 auto 居中与外边距）
 *   右 1fr   欢迎面板（吉祥物男声朗读 + 注册引导 + 快捷入口）
 * 页面 HTML 结构没变，只是多了一个右栏容器，因此对旧样式零破坏。
 */
.pm-auth2 {
  display: grid;
  grid-template-columns: minmax(0, 420px) minmax(0, 1fr);
  gap: 24px;
  align-items: start;
}
/* 左栏：沿用 .pm-auth 的卡片外观，但不再自己居中 */
.pm-auth.pm-auth--inline {
  max-width: none;
  margin: 0;
  width: 100%;
}
.pm-auth2__welcome {
  position: relative;
  background: linear-gradient(165deg, #f2fbf8 0%, #e6f5f0 60%, #dff2ec 100%);
  border: 1px solid rgba(95, 178, 158, .38);
  border-radius: var(--radius, 12px);
  padding: 22px 22px 18px;
  box-shadow: var(--shadow, 0 6px 18px rgba(0, 0, 0, .06));
  overflow: hidden;
}
/* 右侧淡色装饰圆 */
.pm-auth2__welcome::after {
  content: '';
  position: absolute;
  right: -60px;
  top: -60px;
  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .55);
  pointer-events: none;
}
.pm-auth2__mascot { text-align: center; }
.pm-auth2__mascot img {
  width: auto;
  max-width: 150px;
  max-height: 176px;
  height: auto;
  object-fit: contain;
  filter: drop-shadow(0 10px 18px rgba(22, 60, 52, .18));
}
.pm-auth2__say {
  margin: 10px 0 12px;
  padding: 10px 13px;
  min-height: 3.4em;
  background: rgba(255, 255, 255, .92);
  border: 1px solid rgba(95, 178, 158, .3);
  border-radius: 12px 12px 12px 3px;
  color: #29423c;
  line-height: 1.7;
  position: relative;
  z-index: 1;
}
.pm-auth2__btns { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; position: relative; z-index: 1; }
.pm-auth2__links { list-style: none; margin: 0 0 10px; padding: 0; display: grid; gap: 6px; position: relative; z-index: 1; }
.pm-auth2__links a {
  display: block;
  padding: 8px 11px;
  background: rgba(255, 255, 255, .86);
  border: 1px solid rgba(95, 178, 158, .28);
  border-radius: 10px;
  font-size: 13.5px;
  color: #24564c;
  text-decoration: none;
  transition: background .18s, transform .18s;
}
.pm-auth2__links a:hover { background: #fff; transform: translateX(2px); }
.pm-auth2__note { margin: 0; position: relative; z-index: 1; }
@media (max-width: 820px) {
  .pm-auth2 { grid-template-columns: minmax(0, 1fr); }
  /* 手机上把欢迎面板放到表单下面，先让用户看到登录框 */
  .pm-auth2__welcome { order: 2; }
}

/* ==================== 广告标识（《广告法》第十四条 · 站长 2026-10-17）====================
 * 法律依据：「广告应当具有可识别性，能够使消费者辨明其为广告。
 *   通过知识介绍、体验分享、消费测评等形式推销商品或服务，并附有购物链接的，
 *   应当显著标明『广告』。」
 *
 * 【原先的缺口】全站广告位只写了 `<img alt="广告">` —— 那是**图片替代文本**，
 *   普通用户看不见，不满足"显著标明"。
 *
 * 【设计取舍】
 *   · 必须"显著"：用**实色底 + 白字**，放在广告的**左上角**（视觉起点，不易忽略）；
 *   · 但不能喧宾夺主：字号小、圆角、不遮挡主图关键区域；
 *   · 只对**商业广告**渲染（第三方/付费竞价/站外链接），
 *     本站自宣传（引导入驻、站内活动）不标 —— 那不是广告，标了反而误导。
 *   · 用「广告」二字，不用"赞助/推广"：后者不满足法定标识要求。
 */
.pm-ad-badge {
  position: absolute;
  top: 6px;
  left: 6px;
  z-index: 2;
  padding: 1px 6px;
  border-radius: 4px;
  background: rgba(40, 46, 58, .82);
  color: #fff;
  font-size: 11px;
  line-height: 16px;
  font-weight: 600;
  letter-spacing: .5px;
  pointer-events: none;   /* 标识不拦截点击，避免挡住广告本身的可点区域 */
  user-select: none;
}
/* 卡片型广告位（服务商卡 / 城市广告格）：卡片本身是定位上下文 */
.pm-provider-card,
.pm-ad-cell { position: relative; }
.pm-ad-badge--card,
.pm-ad-badge--cell { top: 8px; left: 8px; }
/* 横幅轮播：标识挂在区块角上，切换幻灯片时保持可见 */
.pm-banner { position: relative; }
.pm-banner > .pm-ad-badge { top: 8px; left: 8px; }

/* 移动端字号不缩小，保证"显著"（手机上更容易被忽略） */
@media (max-width: 680px) {
  .pm-ad-badge { font-size: 11px; padding: 1px 5px; }
}

/* ==================== 认领商家（《站长 2026-10-17》需求）====================
 * 场景：收录的公开信息**大多没有电话**（政府公示表常只列地址与许可编号）。
 * 但没有电话**反而是最好的认领入口**：
 *   商家在百度搜自己 → 搜到我们的条目 → 发现客户联系不上他 → 主动来认领。
 * 所以标签要显眼（但不像广告），入口要出现在**联系信息旁边**（他最有动力的时刻）。
 *
 * 【设计取舍】
 *   · 用暖色描边而非实色填充：避免像"促销按钮"让人反感；
 *   · 卡片右上角小标签 + 详情页联系区下方邀请条，两个位置覆盖两种浏览路径；
 *   · 未认领条目**不留"暂未提供"空档**，直接换成认领说明（既解释又引导）。
 */
/* 认领商家：右上角蓝色方形图标（站长 2026-10-19 改）
   ---------------------------------------------------------------
   原来是一枚橙色胶囊**文字**标签（"认领商家" 4 个字，约 60px 宽），
   企业名称较长时会顶到它下面 —— 站长截图反馈「有的企业名称长的遮挡了勋章」。
   现改为 26×26 蓝色圆角方块 + 白色单字「认」：
     · 体积极小，不再压住企业名称与 V 标；
     · 名称那一行用 padding-right 让位（见 .pm-provider-card h3），永不重叠；
     · 蓝色系 + 方形，与 V 标（灰/蓝/橙/发光）区分开，不干扰 VIP 等级表达；
     · 方形比胶囊更像"按钮"，点击意图更明确。
   类名保持不变（首页 index.ejs 与 provider-card.ejs 两处复用）。 */
.pm-claim-badge {
  position: absolute;
  top: 10px;
  right: 10px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  padding: 0;
  border: 0;
  border-radius: 7px;
  background: linear-gradient(180deg, #4a9bff, #2470e8);
  color: #fff;
  font-size: 13px;
  font-weight: 700;
  line-height: 1;
  text-decoration: none;
  white-space: nowrap;
  box-shadow: 0 2px 6px rgba(36, 112, 232, 0.3);
}
.pm-claim-badge:hover { background: linear-gradient(180deg, #5aa8ff, #1a60d0); color: #fff; }

/* 名称行给右上角图标留出位置（长企业名自动换行，不再钻到图标下面） */
.pm-provider-card h3 { padding-right: 34px; word-break: break-word; }

/* 勋章展示行（站长 2026-10-19：「未来还会大量引入各种勋章玩法，要有位置展示勋章」）
   固定放在卡片底部、详情链接上方的一条 flex 行：
     · 现在没有勋章数据 → 空节点，:empty 直接不占高度，不破坏现有版式；
     · 以后各种勋章按顺序往里塞即可，自带换行与间距，不会再和其它元素抢位置。 */
.pm-card-badge-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin: 2px 0 8px;
}
.pm-card-badge-row:empty { display: none; }

.pm-claim-invite {
  display: flex;
  align-items: center;
  gap: 14px;
  flex-wrap: wrap;
  justify-content: space-between;
  margin: 14px 0 0;
  padding: 12px 14px;
  border: 1px solid #f0d9a8;
  border-left: 4px solid #e0a33e;
  border-radius: 10px;
  background: #fffdf7;
}
.pm-claim-invite__main { flex: 1 1 320px; }
.pm-claim-invite__main strong { display: block; margin-bottom: 2px; }
.pm-claim-invite__main p { margin: 0; }
.pm-claim-invite--muted {
  border-color: #e6e9f0;
  border-left-color: #c2c8d4;
  background: #fafbfe;
}

/* 认领页的信息展示表（复用 kv 样式，若未定义则补一份最小实现） */
.pm-kv { width: 100%; border-collapse: collapse; font-size: 14px; }
.pm-kv th, .pm-kv td { padding: 7px 10px; border-bottom: 1px solid #eef1f7; text-align: left; vertical-align: top; }
.pm-kv th { width: 106px; color: #6b7385; font-weight: 600; white-space: nowrap; }

@media (max-width: 680px) {
  .pm-claim-invite { flex-direction: column; align-items: stretch; }
  .pm-claim-invite .pm-btn { width: 100%; text-align: center; }
  /* 站长 2026-10-19：认领徽章已改为固定 26×26 方形图标，
     移动端不能再改 padding/font-size（会把方块压成歪的胶囊），只缩小一点点。 */
  .pm-claim-badge { width: 24px; height: 24px; font-size: 12px; }
  .pm-provider-card h3 { padding-right: 32px; }
}

/* ==================== 核验状态标签（站长 2026-10-17）====================
 * 原详情页写死「资料已核验」，但政府公示收录的条目**我们并没有电话核实过** ——
 * 这是与事实不符的表述，一旦用户打不通就会认为平台在骗人。
 * 因此按真实核验状态显示：
 *   · 已与官方公示核对 / 已电话核实 → pm-tag--ok（蓝）
 *   · 公开信息收录 · 未电话核实     → pm-tag--warn（**琥珀色，一眼能看出差别**）
 * 用暖色而不是红色：不是"错误"，只是"未核验"，红色会造成不必要的恐慌。
 */
.pm-tag--warn { background: #fff6e6; color: #a9741a; border: 1px solid #f0dcb4; }

/* ==================== 商家 VIP 等级标识（站长 2026-10-17）====================
 * 需求原话：「后台做好蓝、橙、灰，V字体发光三种标识，默认全部灰色不发光，
 *            留着以后符合商业运营条件了，允许商家升级vip享受服务」
 *
 * 【设计原则】
 *   · **默认灰 V 不发光**：灰是中性色，不承诺任何资质；
 *     如果所有商家都上彩色，颜色就失去区分度，VIP 也就卖不出去。
 *   · 彩色是**稀缺资源**：蓝=已认证（营业执照审核过）、橙=金牌（付费/合作）、
 *     发光=旗舰（最高级）。
 *   · 尺寸克制：紧贴商家名称最后一个字，不抢标题注意力，但一眼能分辨等级。
 *
 * 【合规提示】
 *   灰 V 的 title 只写"平台已收录"，**不写"已认证"** ——
 *   否则等于平台替商家背书，信息出错时无法辩解（见 services/provider-vip.js 注释）。
 */
.pm-vip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 17px;
  height: 17px;
  margin-left: 5px;
  border-radius: 50%;
  font-size: 11px;
  font-weight: 800;
  line-height: 1;
  vertical-align: 1px;
  font-family: -apple-system, "Segoe UI", Arial, sans-serif;
  cursor: help;
  user-select: none;
  /* 轻微上移，让它贴着名称最后一个字，而不是把行高撑开 */
  position: relative;
  top: -1px;
}
/* 0 灰：默认，不发光 */
.pm-vip--gray { background: #eef1f7; color: #98a2b3; border: 1px solid #dfe4ee; }
/* 1 蓝：已认证 */
.pm-vip--blue { background: #2f7ff0; color: #fff; box-shadow: 0 1px 3px rgba(47,127,240,.28); }
/* 2 橙：金牌商家 */
.pm-vip--orange { background: #f08a24; color: #fff; box-shadow: 0 1px 3px rgba(240,138,36,.28); }
/* 3 发光：旗舰商家（动效最后给，保证不支持动画的环境也正常显示为金色） */
.pm-vip--glow {
  background: linear-gradient(135deg, #ffd76e, #ffab2e);
  color: #7a4a00;
  box-shadow: 0 0 0 1px rgba(255,186,64,.8), 0 0 8px rgba(255,186,64,.75);
  animation: pm-vip-glow 2.4s ease-in-out infinite;
}
@keyframes pm-vip-glow {
  0%, 100% { box-shadow: 0 0 0 1px rgba(255,186,64,.8), 0 0 6px rgba(255,186,64,.55); }
  50%      { box-shadow: 0 0 0 1px rgba(255,200,90,.95), 0 0 14px rgba(255,186,64,.95); }
}
/* 尊重"减少动效"偏好：系统开了 reduce motion 就不闪 */
@media (prefers-reduced-motion: reduce) {
  .pm-vip--glow { animation: none; }
}

/* 内联的奖牌/推荐标识（原来绝对定位，会和右上角认领徽章重叠） */
.pm-medal--inline {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  margin-left: 5px;
  padding: 0 5px;
  height: 18px;
  border-radius: 9px;
  font-size: 11px;
  font-weight: 600;
  vertical-align: 1px;
  white-space: nowrap;
}
.pm-top-badge--inline {
  display: inline-block;
  margin-left: 5px;
  padding: 0 6px;
  height: 18px;
  line-height: 18px;
  border-radius: 9px;
  font-size: 11px;
  font-weight: 600;
  vertical-align: 1px;
  background: #fff1e6;
  color: #b26a1b;
  border: 1px solid #f5d9bb;
  white-space: nowrap;
}
/* 移动端字号不缩，保证等级仍可辨识 */
@media (max-width: 680px) {
  .pm-vip { width: 16px; height: 16px; font-size: 10px; margin-left: 4px; }
}

/* ==================== 长链接/长串折行（站长 2026-10-17）====================
 * 站长反馈：「内页有链接显示溢出，按图折叠到下一排即可，
 *            不要撑出本身的格子区域，影响美观。」
 *
 * 【原因】商家「信息来源」里带政府公示的**原始 URL**（很长且没有空格），
 *   浏览器默认只在空白处断行，于是整条 URL 撑破侧栏卡片（两侧溢出）。
 *
 * 【方案】overflow-wrap: anywhere + word-break: break-word
 *   · 用 anywhere 而不是 break-all：break-all 会把**中文也打散**，
 *     排版变难看；anywhere 只在"实在放不下"时才断，中文正常。
 *   · min-width:0 是 Flex/Grid 子项的关键 —— 没有它，
 *     子项默认最小宽度是内容宽度，加了折行也依然会撑破父容器。
 *     这个坑很隐蔽：只写 overflow-wrap 是**不够**的。
 */
.pm-breakable {
  overflow-wrap: anywhere;
  word-break: break-word;
  /* 表里/弹性盒里的长串也能正确收缩 */
  min-width: 0;
  max-width: 100%;
  line-height: 1.6;
}
/* 链接本身也允许折行，避免 <a> 撑破容器 */
.pm-breakable a,
a.pm-breakable {
  overflow-wrap: anywhere;
  word-break: break-word;
}
/* 来源说明里的 URL 用等宽字体 + 更小字号，视觉上明显是"来源地址"而不是正文 */
.pm-breakable code {
  font-size: 11px;
  word-break: break-all;
  white-space: normal;
}
/* 侧栏卡片兜底：任何子元素都不允许横向撑破 */
.pm-side-card { min-width: 0; overflow-wrap: anywhere; }

/* ==================== 全局长串兜底（站长 2026-10-17）====================
 * 除了商家「信息来源」里显式加的 .pm-breakable，这里再加一层**全局兜底**，
 * 防止其它地方（后台表格里的跳转链接、音乐 URL、来源说明等）也出现溢出。
 *
 * 【为什么用 overflow-wrap:break-word 而不是 anywhere】
 *   · break-word 只在"单个词放不下"时才断，**中文排版完全不受影响**；
 *   · anywhere 会影响 min-content 宽度计算，放全局可能影响某些布局。
 *   所以：全局用 break-word 兜底，确实需要强断的地方（长 URL）才用 .pm-breakable。
 *
 * 【为什么只对链接/代码/表格单元格加强制断行】
 *   普通文本里出现 200 字符长词的概率极低，只有 URL 会；
 *   对 a / code / td 加强断，精准且无副作用。
 */
body { overflow-wrap: break-word; }
a[href^="http"], a[href^="//"] { overflow-wrap: anywhere; word-break: break-word; }
.pm-admin-panel, .pm-admin-panel td, .pm-admin-table td {
  min-width: 0;
  overflow-wrap: anywhere;
}
/* 后台已有的省略样式再兜一层：确保最小宽度可为 0，否则 ellipsis 不生效 */
.pm-admin-ellipsis { min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
