groundfic_link-card-preview/styles.css
2026-07-19 17:27:09 +08:00

411 lines
11 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ============ 基底Apple 風格) ============ */
.lcp-card {
border: none; /* 無邊框2026-07-18 使用者要求,兩外掛同步) */
border-radius: 12px;
overflow: hidden;
/* 無邊框後的辨識度:底色混 4% 前景(白底上=淺灰卡、深色=亮一階)+ 極淡陰影 */
background: color-mix(in srgb, var(--text-normal) 4%, var(--background-primary));
box-shadow: 0 1px 3px rgba(0, 0, 0, .05);
margin: 0.75em 0;
max-width: 420px;
font-family: var(--font-interface);
cursor: pointer;
transition: background-color 0.15s ease;
}
.lcp-card:hover {
background: var(--background-secondary);
}
.lcp-card:active {
background: var(--background-modifier-hover);
}
.lcp-body {
display: flex;
flex-direction: column;
justify-content: center;
gap: 3px;
min-width: 0;
overflow: hidden;
}
.lcp-title {
font-size: 0.88em;
font-weight: 600;
line-height: 1.35;
color: var(--text-normal);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.lcp-desc {
font-size: 0.78em;
color: var(--text-muted);
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.lcp-domain {
display: flex;
align-items: center;
gap: 5px;
font-size: 0.74em;
color: var(--text-muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.lcp-favicon {
width: 14px;
height: 14px;
border-radius: 3px;
flex-shrink: 0;
object-fit: cover;
}
.lcp-favicon--fallback {
display: inline-flex;
color: var(--text-faint);
}
.lcp-favicon--fallback svg {
width: 13px;
height: 13px;
}
/* ============ 大卡圖上文下1.91:1 ============ */
.lcp-card--large .lcp-hero {
width: 100%;
aspect-ratio: 1.91 / 1;
background-size: cover;
background-position: center;
background-color: var(--background-secondary);
}
.lcp-card--large .lcp-hero--portrait {
aspect-ratio: 1 / 1; /* 直向圖裁方形:保留更多內容、卡片不過長 */
background-position: center top; /* 截圖類內容重點通常在上方 */
}
.lcp-card--large .lcp-body {
padding: 10px 12px 11px;
}
/* ============ 緊湊卡:文字左、方形縮圖右 ============ */
.lcp-card--compact {
display: flex;
align-items: stretch;
min-height: 76px;
}
.lcp-card--compact .lcp-body {
flex: 1;
padding: 10px 12px;
}
.lcp-thumb {
width: 76px;
min-width: 76px;
background-size: cover;
background-position: center;
background-color: var(--background-secondary);
border-left: 1px solid var(--background-modifier-border);
flex-shrink: 0;
}
/* ============ 純文字卡單列、favicon標題網域 ============ */
.lcp-card--text .lcp-body {
padding: 10px 12px;
}
.lcp-card--text .lcp-title {
-webkit-line-clamp: 1;
}
/* ============ Canvas填滿節點、圖上文下 ============ */
/* 隱藏 link node 上方的裸網址標籤——卡片已有標題與網域,標籤是重複資訊。
lcp-has-card 由插件在插入卡片時掛上(避免 has 偽類的效能疑慮) */
.canvas-node.lcp-has-card .canvas-node-label {
display: none;
}
.canvas-node-content .lcp-card--canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
max-width: none;
margin: 0;
display: flex;
flex-direction: column;
border: none;
border-radius: inherit;
min-height: 0;
transition: none; /* 平移縮放時避免 transition 觸發 repaint */
}
.lcp-card--canvas:hover,
.lcp-card--canvas:active {
background: var(--background-primary);
}
.lcp-card--canvas .lcp-hero {
width: 100%;
flex: 1 1 auto;
min-height: 0;
background-size: cover;
background-position: center;
background-color: var(--background-secondary);
}
.lcp-card--canvas .lcp-body {
flex: 0 0 auto;
padding: 11px 14px 12px;
gap: 4px;
}
.lcp-card--canvas-text .lcp-body {
flex: 1 1 auto;
justify-content: center;
padding: 16px 18px;
gap: 6px;
}
.lcp-card--canvas-text .lcp-title {
-webkit-line-clamp: 3;
font-size: 1em;
}
.lcp-card--canvas-text .lcp-desc {
-webkit-line-clamp: 4;
}
/* ============ 主色染色Apple 式) ============ */
.lcp-card--tinted {
background-color: rgba(var(--lcp-tint), 0.12);
border-color: rgba(var(--lcp-tint), 0.30);
}
.lcp-card--tinted:hover {
background-color: rgba(var(--lcp-tint), 0.18);
}
.lcp-card--tinted:active {
background-color: rgba(var(--lcp-tint), 0.25);
}
.lcp-card--tinted .lcp-hero,
.lcp-card--tinted .lcp-thumb {
background-color: rgba(var(--lcp-tint), 0.25);
}
.lcp-card--tinted .lcp-thumb {
border-left-color: rgba(var(--lcp-tint), 0.30);
}
.lcp-card--canvas.lcp-card--tinted,
.lcp-card--canvas.lcp-card--tinted:hover,
.lcp-card--canvas.lcp-card--tinted:active {
background-color: rgba(var(--lcp-tint), 0.12);
}
/* ============ icon 卡Canvas主色鋪滿、icon 置中、自適應文字 ============ */
.lcp-card--canvas-icon .lcp-icon-stage {
flex: 1 1 auto;
min-height: 0;
display: flex;
align-items: center;
justify-content: center;
}
.lcp-card--canvas-icon .lcp-icon-img {
width: 96px;
height: 96px;
object-fit: contain;
border-radius: 18px;
box-shadow: 0 2px 14px rgba(0, 0, 0, 0.18);
}
.lcp-card--canvas-icon .lcp-favicon {
display: none; /* icon 已是主角,網域列不再重複小圖示 */
}
.lcp-card--canvas-icon .lcp-body {
padding: 0 18px 16px;
}
.lcp-card--solid,
.lcp-card--solid:hover,
.lcp-card--solid:active {
background-color: rgb(var(--lcp-tint));
border-color: transparent;
}
.lcp-on-dark .lcp-title { color: #ffffff; }
.lcp-on-dark .lcp-desc { color: rgba(255, 255, 255, 0.78); }
.lcp-on-dark .lcp-domain { color: rgba(255, 255, 255, 0.72); }
.lcp-on-dark .lcp-favicon--fallback { color: rgba(255, 255, 255, 0.72); }
.lcp-on-light .lcp-title { color: rgba(0, 0, 0, 0.88); }
.lcp-on-light .lcp-desc { color: rgba(0, 0, 0, 0.6); }
.lcp-on-light .lcp-domain { color: rgba(0, 0, 0, 0.55); }
.lcp-on-light .lcp-favicon--fallback { color: rgba(0, 0, 0, 0.55); }
/* 筆記緊湊卡的 icon 縮圖:置中顯示在主色底上,不用 cover 放大糊掉 */
.lcp-thumb--icon {
background-size: 44px 44px;
background-repeat: no-repeat;
}
.lcp-card--tinted .lcp-thumb--icon {
background-color: rgba(var(--lcp-tint), 0.85);
}
/* ============ 骨架 ============ */
.lcp-skeleton-line {
border-radius: 4px;
background: linear-gradient(90deg,
var(--background-modifier-hover) 25%,
var(--background-modifier-border) 50%,
var(--background-modifier-hover) 75%
);
background-size: 200% 100%;
animation: lcp-shimmer 1.4s infinite;
}
.lcp-skeleton-line--title { height: 12px; width: 70%; }
.lcp-thumb--skeleton {
background: linear-gradient(90deg,
var(--background-modifier-hover) 25%,
var(--background-modifier-border) 50%,
var(--background-modifier-hover) 75%
);
background-size: 200% 100%;
animation: lcp-shimmer 1.4s infinite;
border-left: none;
}
.lcp-card--canvas.lcp-skeleton {
flex-direction: column-reverse;
}
.lcp-card--canvas.lcp-skeleton .lcp-thumb--skeleton {
width: 100%;
flex: 1 1 auto;
min-height: 0;
}
.lcp-card--canvas.lcp-skeleton .lcp-body {
flex: 0 0 auto;
padding: 11px 14px 12px;
}
@keyframes lcp-shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
@media (max-width: 480px) {
.lcp-card { max-width: 100%; }
}
/* ============ Live Preview ============ */
.lcp-lp-container {
padding: 2px 0;
}
.lcp-lp-inner {
position: relative;
max-width: 420px;
}
.lcp-lp-inner .lcp-card {
margin: 0.4em 0;
}
.lcp-open-btn {
position: absolute;
top: 14px;
right: 8px;
width: 26px;
height: 26px;
border-radius: 7px;
display: flex;
align-items: center;
justify-content: center;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
opacity: 0;
transition: opacity 0.12s ease;
cursor: pointer;
z-index: 2;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
}
.lcp-lp-inner:hover .lcp-open-btn {
opacity: 1;
}
.lcp-open-btn:hover {
color: var(--text-normal);
}
.lcp-open-btn svg {
width: 14px;
height: 14px;
}
.lcp-card--canvas .lcp-open-btn {
top: 8px;
right: 8px;
}
/* 行動端:沒有 hover 也沒有修飾鍵按鈕常駐並加大觸控目標44pt 原則) */
.is-mobile .lcp-open-btn {
opacity: 1;
width: 36px;
height: 36px;
border-radius: 9px;
}
.is-mobile .lcp-open-btn svg {
width: 17px;
height: 17px;
}
.is-mobile .lcp-lp-inner .lcp-open-btn {
top: 12px;
right: 6px;
}
/* 圖片載入前的底色:有主色就用主色打底,讓圖片淡入是同色過渡而非灰塊閃現 */
.lcp-card--tinted .lcp-hero,
.lcp-card--tinted .lcp-thumb {
background-color: rgba(var(--lcp-tint), 0.18);
}
/* 圖片以淡入呈現,消除「灰→圖」的突兀感 */
.lcp-hero,
.lcp-thumb {
transition: background-image 0.2s ease-in;
}
/* ============ Threads 貼文卡(仿官方 embed / iMessage 預覽,三段式) ============
作者列頭像帳號Threads 標誌)→ 貼文全文 → 貼文照片(有的話)→ 底部灰帶 */
.lcp-card--thread .lcp-thread-head {
display: flex; align-items: center; gap: 9px;
padding: 14px 16px 0;
}
.lcp-card--thread .lcp-thread-avatar {
width: 28px; height: 28px; border-radius: 50%;
object-fit: cover; flex: 0 0 auto;
background: var(--background-secondary);
}
.lcp-card--thread .lcp-thread-name {
flex: 1; min-width: 0;
font-weight: 700; font-size: 14px; letter-spacing: -0.01em;
color: var(--text-normal);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.lcp-card--thread .lcp-thread-logo {
flex: 0 0 auto; display: flex; align-items: center;
color: var(--text-normal); opacity: .85;
}
.lcp-card--thread .lcp-thread-logo svg { width: 17px; height: 17px; }
.lcp-card--thread .lcp-thread-text {
/* ⚠️ 用 margin 不用 paddingline-clamp 裁在 content box、overflow 裁在 padding box
若給 padding-bottom被截斷的下一行會在內距區露出半行字出格 */
margin: 10px 16px 14px;
font-size: 14px; line-height: 1.6; letter-spacing: .01em;
color: var(--text-normal);
white-space: pre-wrap; /* 保留貼文換行 */
display: -webkit-box; -webkit-line-clamp: 6; -webkit-box-orient: vertical;
overflow: hidden; /* 預覽不用全文:純文字貼文最多 6 行 */
}
/* 有照片的貼文:文字讓位給照片,最多 3 行 */
.lcp-card--thread:has(.lcp-thread-photo) .lcp-thread-text { -webkit-line-clamp: 3; }
/* 貼文照片(-15/ 系):內縮圓角、依實際比例顯示,過長截頂 */
.lcp-card--thread .lcp-thread-photo {
margin: 0 16px 14px;
border-radius: 10px;
background-size: cover;
background-position: center top;
background-color: var(--background-secondary);
max-height: 400px;
}
.lcp-card--thread .lcp-thread-photo:not([style*="aspect-ratio"]) { height: 240px; }
/* 底部灰帶:沿用 body標題網域列墊深一階 + 髮絲線 */
.lcp-card--thread .lcp-body {
background: color-mix(in srgb, var(--text-normal) 5%, transparent);
border-top: 1px solid color-mix(in srgb, var(--background-modifier-border) 60%, transparent);
padding: 9px 16px 10px;
}
.lcp-card--thread .lcp-body .lcp-title {
font-size: 12.5px; font-weight: 650;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}