Jump to content
切換選單
切換偏好設定選單
切換個人選單
尚未登入
如果您進行編輯,系統將會為您建立一個臨時帳戶。

模板:UI/styles.css

出自幻跡百科
/*
 * BenWiki 通用 UI primitive 樣式
 *
 * 供任何內容類型共用的排版骨架:
 * - Hero(圖片欄+內容欄+橫跨全寬的 footer)
 * - Tabs(模組:UI/Tabs 輸出)
 * - 卡片網格(模板:UI/卡片網格)
 * - 分類連結群組(模板:UI/分類連結群組)
 * - 標籤列(模板:UI/標籤列)
 *
 * 本檔案只處理「排版骨架」與 Citizen semantic token 顏色,
 * 不含任何領域專屬的強調色/視覺風格;領域專屬視覺放在各自的
 * TemplateStyles(例如 模板:裏番/styles.css)。
 *
 * TemplateStyles 限制:
 * - 不宣告 CSS custom properties。
 * - var() 只用於接受單一 color 的屬性(border-color 等 shorthand 不行,
 *   一律拆成 border-top-color / border-right-color / border-bottom-color /
 *   border-left-color 四個 longhand)。
 * - 連結一律使用 wikitext 連結語法([url text] / [[Page|text]])產生,
 *   不直接在模板原始碼中寫 <a href="...">(Sanitizer 不允許)。
 * - 標題文字一律用 <div> 呈現、不用 <h1>-<h6>:MediaWiki 會把任何
 *   <h1>-<h6> 標籤當成正式章節標題塞進整頁目次,同一頁重複出現多筆
 *   (例如卡片網格裡的每張卡片)就會把目次塞爆,因此一律改用 <div>
 *   搭配 CSS 呈現標題感。
 */


/* ==========================================================
 * Hero
 *
 * 兩列 grid:第一列是圖片欄+內容欄,第二列是橫跨全寬的 footer
 * (通常放 tabs nav、標籤列這類「屬於整個 Hero、不屬於單一欄位」的東西)。
 * ========================================================== */

.benwiki-ui-hero {
	display: grid;

	grid-template-columns:
		minmax(0, 3fr)
		minmax(300px, 2fr);

	grid-template-rows: auto auto;

	gap: 1.5rem;

	overflow: hidden;

	border-width: 1px;
	border-style: solid;

	border-top-color: var(--border-color-base);
	border-right-color: var(--border-color-base);
	border-bottom-color: var(--border-color-base);
	border-left-color: var(--border-color-base);

	border-radius: 1rem;

	background-color: var(--background-color-neutral-subtle);
}


.benwiki-ui-hero__poster {
	min-width: 0;

	grid-column: 1;
	grid-row: 1;
}


.benwiki-ui-hero__poster img {
	display: block;

	width: 100%;
	height: 100%;

	object-fit: cover;
}


.benwiki-ui-hero__content {
	min-width: 0;

	padding: 1.5rem 1.5rem 0 0;

	grid-column: 2;
	grid-row: 1;
}


.benwiki-ui-hero__footer {
	display: flex;

	flex-direction: column;

	align-items: center;

	gap: 0.75rem;

	padding: 0 1.5rem 1.5rem;

	grid-column: 1 / -1;
	grid-row: 2;
}


@media ( max-width: 780px ) {
	.benwiki-ui-hero {
		grid-template-columns: minmax( 0, 1fr );
		grid-template-rows: auto auto auto;
	}

	.benwiki-ui-hero__poster {
		grid-row: auto;
	}

	.benwiki-ui-hero__content {
		grid-column: 1;
		grid-row: auto;

		padding: 0 1.25rem;
	}

	.benwiki-ui-hero__footer {
		grid-row: auto;

		padding: 1.25rem;
	}
}


/* ==========================================================
 * Tabs
 * ========================================================== */

.benwiki-ui-tabs__nav {
	display: flex;
	flex-wrap: wrap;

	gap: 0.4rem;

    margin-top: 0.9rem;
	margin-bottom: 0.9rem;
}


.benwiki-ui-tabs__nav:empty {
	display: none;
}


.benwiki-ui-tab-button {
	padding: 0.4rem 0.85rem;

	border-width: 1px;
	border-style: solid;

	border-top-color: var(--border-color-base);
	border-right-color: var(--border-color-base);
	border-bottom-color: var(--border-color-base);
	border-left-color: var(--border-color-base);

	border-radius: 999px;

	color: var(--color-subtle);

	background-color: var(--background-color-neutral-subtle);

	font-weight: 600;
	font-size: 0.85rem;

	cursor: pointer;
}


.benwiki-ui-tab-button:hover {
	color: var(--color-emphasized);
}


.benwiki-ui-tab-button[aria-selected="true"] {
	color: var(--color-inverted-fixed);

	background-color: var(--background-color-progressive);

	border-top-color: transparent;
	border-right-color: transparent;
	border-bottom-color: transparent;
	border-left-color: transparent;
}


.benwiki-ui-tabs__panel[hidden] {
	display: none;
}


/* ==========================================================
 * Card grid
 *
 * 卡片內容常來自 SMW deferred query。deferred query 解析完成後,
 * 實際結果會被包在好幾層 SMW 自己產生的容器裡(.smw-deferred-query、
 * #deferred-output、內部再包一層 .mw-parser-output),卡片因此變成
 * grid 的孫層或曾孫層而不是直接子層——CSS Grid 只認直接子層,所以
 * 這裡用「後代選擇器」(不限定巢狀深度)把這些容器全部設成
 * display:contents,讓它們在版面上「消失」,卡片才能真正參與 grid。
 * ========================================================== */

.benwiki-ui-card-grid {
	display: grid;

	grid-template-columns: repeat( auto-fit, minmax( 260px, 1fr ) );

	gap: 1rem;
}


.benwiki-ui-card-grid--narrow {
	grid-template-columns: repeat( auto-fit, minmax( 200px, 1fr ) );
}


.benwiki-ui-card-grid--wide {
	grid-template-columns: repeat( auto-fit, minmax( 380px, 1fr ) );
}


.benwiki-ui-card-grid .smw-deferred-query,
.benwiki-ui-card-grid [id="deferred-output"],
.benwiki-ui-card-grid .smw-deferred-query .mw-parser-output {
	display: contents;
}


.benwiki-ui-card-grid [id="deferred-control"] {
	display: none;
}


/* ==========================================================
 * Categorized link group
 *
 * 每一列(.benwiki-ui-link-group__row)可能被一個 <a>(wikitext
 * [網址 ...] 語法產生)包住,也可能沒有連結、單純是展示用的 <div>——
 * 兩種情況下 .list 的直接子元素巢狀深度不同(有連結時是
 * .list > a > .row,沒連結時是 .list > .row),所以分隔線改用
 * .list > * + *(無論子元素是 a 還是 div 都適用),不掛在 .row 自己的
 * :last-child 上。連結顏色/hover 效果同理,一律以 .list 為基準用
 * 「a.external」比對,不假設 <a> 是 .row 的子層。
 * ========================================================== */

.benwiki-ui-link-group {
	min-width: 0;

	overflow: hidden;

	border-width: 1px;
	border-style: solid;

	border-top-color: var(--border-color-base);
	border-right-color: var(--border-color-base);
	border-bottom-color: var(--border-color-base);
	border-left-color: var(--border-color-base);

	border-radius: 0.75rem;

	background-color: var(--background-color-neutral-subtle);
}


.benwiki-ui-link-group__heading {
	padding: 0.75rem 1rem;

	border-bottom-width: 1px;
	border-bottom-style: solid;
	border-bottom-color: var(--border-color-subtle);
}


.benwiki-ui-link-group__heading-text {
	color: var(--color-emphasized);

	font-size: 1rem;
	font-weight: 700;
}


.benwiki-ui-link-group__list {
	min-width: 0;
}


.benwiki-ui-link-group__list > * + * {
	border-top-width: 1px;
	border-top-style: solid;
	border-top-color: var(--border-color-subtle);
}


.benwiki-ui-link-group__row {
	display: flex;

	align-items: center;
	justify-content: space-between;

	gap: 0.75rem;

	padding: 0.65rem 1rem;
}


.benwiki-ui-link-group__copy {
	display: flex;

	flex-direction: column;

	gap: 0.2rem;

	min-width: 0;
}


.benwiki-ui-link-group__list a.external {
	display: block;

	color: inherit;

	text-decoration: none;
}


.benwiki-ui-link-group__list a.external:hover .benwiki-ui-link-group__row {
	background-color: var(--background-color-neutral);
}


.benwiki-ui-link-group__type {
	min-width: 0;

	color: var(--color-subtle);

	font-size: 0.68rem;
	font-weight: 700;

	letter-spacing: 0.04em;
}


.benwiki-ui-link-group__name {
	min-width: 0;

	color: var(--color-base);

	font-weight: 600;
}


.benwiki-ui-link-group__arrow {
	flex: 0 0 auto;

	color: var(--color-progressive);

	font-size: 0.85rem;
}


/* ==========================================================
 * Tag list
 * ========================================================== */

.benwiki-ui-tag-list {
	display: flex;
	flex-wrap: wrap;

	gap: 0.4rem;
}


.benwiki-ui-tag-list__item {
	display: inline-flex;

	padding: 0.28rem 0.6rem;

	border-width: 1px;
	border-style: solid;

	border-top-color: var(--border-color-base);
	border-right-color: var(--border-color-base);
	border-bottom-color: var(--border-color-base);
	border-left-color: var(--border-color-base);

	border-radius: 999px;

	color: var(--color-subtle);

	font-size: 0.72rem;
	font-weight: 600;
}