diff --git a/.cursor/rules/ai-change-boundaries.mdc b/.cursor/rules/ai-change-boundaries.mdc index ea3a701..98a772e 100644 --- a/.cursor/rules/ai-change-boundaries.mdc +++ b/.cursor/rules/ai-change-boundaries.mdc @@ -27,6 +27,11 @@ alwaysApply: true - **同一列/並排多欄**:預設 **等高**(例如 flex 同列 `align-items: stretch`、grid 同列對齊高度),除非該次明講要頂對齊或其他非等高編排。 - **同一層級、同類可重複元件**(例如多張 **CARD**、同一 pattern 的 tile):預設 **等寬**(同一 breakpoint 下寬度一致),除非明講破格。 - **短字層**(站主慣稱「十字以內」——極短標、標籤、按鈕字、頂欄主標、區塊小標等;語意上不要硬拆成兩行):盡量 **單行、不換行**;**水平置中**。 +- **交付前必檢・置中**(每次改版面/新區塊/表單標題後**自動確認**,勿等站主提醒): + - 短字層、區塊主標、表單大標、按鈕列、圖示+標題並排:父層 `text-align: center` 或 `display: flex` + `justify-content: center` + `align-items: center`(必要時 `margin-inline: auto`)。 + - `::before`/`::after` 裝飾圖(含 SVG 背景)與文字同一行時:標題用 **`inline-flex` + `align-items: center` + `justify-content: center`**,勿只靠 `inline-block` + `vertical-align` 猜視覺置中。 + - 內文層 `p` 維持置左;僅容器可 `max-width` + `margin-inline: auto` 置中區塊本身。 + - 窄螢幕若標題過長:先縮字級或 `letter-spacing`,仍無法單行再與站主確認是否允許換行。 - **內文層(body)**(超過短字層——`

` 整段導語、說明、列表前引言):允許自然換行;**置左**對齊。規則敘述用「內文/body 層」,**不要**用某個 `*-lead`、`*-intro` 等 class 名當成這一層的定義。 - **怎麼判斷**:看**實際字數與語意**(是否明顯超過約十字、是否為段落內文),**不是**看 class 字串。HTML 裡的 `` 是**頁面作用範圍**,與「內文層」是兩件事,勿混為一談。 - **CSS 怎麼寫**:短字層 → 標題/按鈕等既有元件規則(多為置中)。內文層 → 在該頁 **`body.頁面類名` 底下**對**段落 `p`**(或該區 `section` 內 `p`)設 `text-align: left`;欄寬可 `max-width` + `margin-inline: auto`,但字仍左對齊。**禁止**在規則檔或新頁面把內文層綁死在自創 class 名上當唯一依據。 diff --git a/assets/svg/crystal-diamond.svg b/assets/svg/crystal-diamond.svg new file mode 100644 index 0000000..f365f20 --- /dev/null +++ b/assets/svg/crystal-diamond.svg @@ -0,0 +1,12 @@ + diff --git a/fansform.php b/fansform.php index 5891352..26b93cb 100644 --- a/fansform.php +++ b/fansform.php @@ -109,31 +109,52 @@ $favoriteSong = fansform_post('favorite_song'); } body.fansform-page .form-title { + display: flex; + flex-direction: column; + align-items: center; text-align: center; margin-bottom: 2.5rem; } body.fansform-page .form-title h2 { + --form-title-diamond: calc(1.15em * 0.8); + display: inline-flex; + align-items: center; + justify-content: center; + flex-wrap: nowrap; + gap: 0.35em; + max-width: 100%; + margin: 0; + padding: 0 0.5rem; font-size: clamp(1.6rem, 4vw, 2.25rem); + line-height: 1.15; font-weight: 900; color: var(--primary); - display: inline-block; letter-spacing: 0.12em; - padding: 0 1.5rem; + text-align: center; + white-space: nowrap; } body.fansform-page .form-title h2::before, body.fansform-page .form-title h2::after { - content: "💎"; - margin-inline: 0.35em; + content: ""; + flex: 0 0 var(--form-title-diamond); + align-self: center; + width: var(--form-title-diamond); + height: var(--form-title-diamond); + margin: 0; + background: url("assets/svg/crystal-diamond.svg") no-repeat center / contain; } body.fansform-page .form-title p { + width: 100%; + max-width: 28em; + margin: 0.65rem 0 0; font-size: 0.9rem; color: var(--dark-yellow); - margin-top: 0.65rem; font-weight: 600; letter-spacing: 0.15em; + text-align: center; } body.fansform-page .sechskies-form fieldset {