diff --git a/assets/style.css b/assets/style.css index ce84360..ae892fd 100644 --- a/assets/style.css +++ b/assets/style.css @@ -352,19 +352,8 @@ hr { border: 0; border-top: 1px solid var(--border); margin: 20px 0; } .card-body h3 a { color: var(--text); } .card-body h3 a:hover { color: var(--accent); text-decoration: none; } -/* 封面是按 16:9 裁的(activities/form.php 里的 Cropper aspectRatio 就是 16/9), - 展示端必须同比例 —— 不然辛苦裁好的构图在这里又被切掉一块。 - ⚠️ 别再加 max-height:容器比例一旦被改,object-fit: cover 就重新裁一次图。 */ -.activity-cover { - position: relative; border-radius: var(--radius-lg); overflow: hidden; - margin-bottom: 20px; background: var(--bg-soft); - aspect-ratio: 16 / 9; -} -.activity-cover img { width: 100%; height: 100%; object-fit: cover; display: block; } -.activity-cover .cover-placeholder { - width: 100%; height: 100%; - display: flex; align-items: center; justify-content: center; -} +/* 批 21:详情页顶部不再放整幅 16:9 大封面(原大图容器样式已删), + 改用列表同款 .act-row(含 .act-row-cover,仍是 16:9)—— 见「活动列表」一节。 */ /* ── 8. 时间轴与节点卡片 ─────────────────────────────────────────────────── */ .timeline-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: start; } @@ -923,7 +912,7 @@ video.video-thumb.video-thumb-mini { ⚠️ width / height / object-fit 必须写在 **img** 上,不能写在外层 div 上 —— 写错地方图片就完全不受约束,会按原始尺寸铺出来:头像 400×400、封面 1920×1080,直接把下面的表单盖住(这就是「头像非常大、整页错位」的根)。 - 对照写对了的 .card-cover img / .activity-cover img。 */ + 对照写对了的 .card-cover img / .act-row-cover img。 */ .avatar-preview { position: relative; flex: none; width: 84px; height: 84px; border-radius: 50%; @@ -979,6 +968,8 @@ video.video-thumb.video-thumb-mini { .avatar-preview, .cover-preview { transition: border-color .15s, background .15s; } .avatar-upload:hover .avatar-preview, .cover-upload:hover .cover-preview { border-color: var(--accent); background: var(--accent-soft); } +/* 批 21:把图片拖进上传区时给个高亮反馈(松手即走原有的裁剪流程) */ +.cover-upload.dragover .cover-preview { border-color: var(--accent); background: var(--accent-soft); } .avatar-upload-actions, .cover-upload-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin-top: 0; @@ -1393,31 +1384,23 @@ video.video-thumb.video-thumb-mini { .act-member-more { font-size: 12.5px; color: var(--text-mute); align-self: center; } .act-row-meta { display: flex; flex-wrap: wrap; gap: 4px 14px; } +/* 批 21:详情页顶部复用列表行样式展示「小封面 + 参与人/统计」。 + 它不是链接(详情页就在这儿),压掉 hover 反馈、留出与标题区的间距。 */ +.act-row-static { margin-bottom: 20px; cursor: default; } +.act-row-static:hover { border-color: var(--border); box-shadow: none; } + @media (max-width: 560px) { .act-row { grid-template-columns: 104px 1fr; gap: 12px; padding: 10px; } } -/* ── 23. 地图铺满整屏(批 18)──────────────────────────────────────────── */ -/* 行程路线 / 旅行地图:**突破正文版心,占满整个视口宽度**; - 高度跟着视口高度走 —— 屏幕越大容器越大,地图显示的地理范围也越大 - (AMap 填满容器,fitView 按当前视野重算,等于跟着分辨率自动缩放)。 - ⚠️ 左右出血的 margin **由 JS 给**:版心留白是 `max(gutter, (100% - 1080px)/2)`, - 而这个 100% 在**使用它的元素**上解析 —— 直接写「负的版心留白」在地图元素上 - 算出来只有 -gutter(实测 156px vs 该有的 180px),铺不满。 - 所以改成读 container 实际渲染出来的 padding-left 再取负(见模板里的 bleed())。 - ⚠️ 更不能写 `width: 100vw`:它含滚动条宽度,会让整页横向溢出。 - ⚠️ 已经贴着视口边缘了,就不要左右边框和圆角了(看着才像一整屏)。 */ +/* ── 23. 地图尺寸(批 21 调整)──────────────────────────────────────────── */ +/* 行程路线 / 旅行地图:**与正文版心同宽**。 + 批 18 曾让它突破版心铺满整个视口(JS 负 margin 出血),用户反馈 + 「上面正文固定宽、下面地图铺满屏」看着奇怪,批 21 改回一致 —— + 宽度跟随 .container 的内容区,模板里的 bleed() 已删,这里也不再有 + border-radius/border 的去边框覆盖(恢复 .route-map 默认圆角与描边)。 + 高度仍跟着视口高度走 —— 屏幕越大容器越大,地图显示的地理范围也越大。 */ #home-panel-map .route-map, #route-panel-map .route-map { height: clamp(460px, calc(100vh - 190px), 1000px); - border-radius: 0; - border-left: 0; - border-right: 0; -} -/* 地图下面那句说明:跟着一起出血,只留一个 gutter - (不然会孤零零悬在离地图左边缘很远的地方) */ -#home-panel-map .route-map-hint, -#route-panel-map .route-map-hint { - padding-left: var(--gutter); - padding-right: var(--gutter); } diff --git a/src/Controllers/ActivityController.php b/src/Controllers/ActivityController.php index 1aa25d1..d2772f7 100644 --- a/src/Controllers/ActivityController.php +++ b/src/Controllers/ActivityController.php @@ -348,12 +348,17 @@ class ActivityController array_column($realityNodes, 'id') )); + // 批 21:详情页顶部改用列表同款「封面行」(小封面 + 参与人/统计), + // 复用与列表同一份聚合口径(collectStats),不另写一套查询 + $actStats = $this->collectStats([$id]); + view('activities/show', [ 'activity' => $activity, 'planNodes' => $planNodes, 'realityNodes' => $realityNodes, 'executedPlanIds' => $executedPlanIds, 'nodeMembers' => $nodeMembers, + 'actStats' => $actStats, // 路线地图:每个执行节点第一张图片附件 id(圆形标记用),一条 GROUP BY 防止 N+1 'nodeFirstImage' => Attachments::firstImageIdsForNodes(array_column($realityNodes, 'id')), // 批 19:路线地图标记图标按出行方式映射(回退节点类型图标) diff --git a/templates/activities/form.php b/templates/activities/form.php index b828a5a..fa31f7d 100644 --- a/templates/activities/form.php +++ b/templates/activities/form.php @@ -29,7 +29,7 @@ $coverPreview = ($isEdit && $cover !== '') ? media_cover((int)$activity['id']) :