96f5ac32e1
下游回報:段落設 text-indent 時,標點附近冒出巨大間距。根因為聚珍把標點拆成 inline-block 原子,繼承屬性被每個原子重複套用(過套用),且裝飾盒跳過原子(欠套用)。 以「同類問題整體界定」原則統一在庫內修復,使原子對消費端段落樣式透明。 範圍(headless Chrome 逐屬性實測界定,非逐案補丁): 過套用(繼承屬性被 inline-block 原子各自重套),於原子歸零: - text-indent: 0——段落首行縮排傳入後每原子內部各縮排一次,shrink-to-fit 寬膨脹為 縮排量+字形。實測:歸零後段落首行縮排保持 2em、原子寬由 ~3em 回到 0.5em/1em。 - hanging-punctuation: none——同屬區塊容器首/末行機制;Chrome 未實作、Safari 觸發, 且與規劃中之標點懸掛相衝,按機制一併歸零。 欠套用(text-decoration 非繼承、由段落裝飾盒繪製並跳過原子致下劃線斷缺),令原子 inherit 自繪接續: - jz-char/jz-jinze 設 text-decoration: inherit;margin 模式 jz-inner 亦為 inline-block,於 _jiya.css 補一條。像素掃描實測:halt/margin 兩模式下劃線 coverage 由 ~0.25 回到 1.0,且 margin 下劃線隨半形收為 0.5em advance。 不處理者(實測不洩漏或本應逐字穿透):letter-spacing/word-spacing/text-align 系/ text-transform/line-height/color/font/word-break/overflow-wrap/hyphens/ white-space/tab-size/text-emphasis/text-shadow/font-variant/font-stretch。 - src/css/_normalize.css:過套用歸零 + text-decoration 透明(含原則與實測依據注釋)。 - src/css/_jiya.css:margin 模式 jz-inner 裝飾接續。 - test/juzhen.test.mjs:三項回歸斷言(51 測試通過)。 - README.md CSS 基礎設定第 8 項、ARCHITECTURE.md「原子透明原則」一節。 - dist/ 重建。
133 lines
3.1 KiB
CSS
133 lines
3.1 KiB
CSS
/* src/css/_normalize.css */
|
|
@supports (text-autospace: no-autospace) {
|
|
.juzhen {
|
|
text-autospace: no-autospace;
|
|
}
|
|
}
|
|
jz-char,
|
|
jz-inner,
|
|
jz-hws,
|
|
jz-cs,
|
|
jz-jinze,
|
|
jz-em {
|
|
font: inherit;
|
|
color: inherit;
|
|
text-indent: 0;
|
|
hanging-punctuation: none;
|
|
}
|
|
jz-char,
|
|
jz-jinze {
|
|
text-decoration: inherit;
|
|
}
|
|
|
|
/* src/css/_lang.css */
|
|
:where(.juzhen:lang(zh-Hans)),
|
|
:where(.juzhen [lang]:lang(zh-Hans)) {
|
|
font-family:
|
|
"Noto Serif SC",
|
|
"Noto Serif CJK SC",
|
|
"Source Han Serif SC",
|
|
serif;
|
|
}
|
|
:where(.juzhen:lang(zh-Hant)),
|
|
:where(.juzhen [lang]:lang(zh-Hant)) {
|
|
font-family:
|
|
"Noto Serif TC",
|
|
"Noto Serif CJK TC",
|
|
"Source Han Serif TC",
|
|
serif;
|
|
}
|
|
:where(.juzhen:lang(zh-HK)),
|
|
:where(.juzhen [lang]:lang(zh-HK)) {
|
|
font-family:
|
|
"Noto Serif HK",
|
|
"Noto Serif CJK HK",
|
|
"Noto Serif TC",
|
|
serif;
|
|
}
|
|
:where(.juzhen:lang(ja)),
|
|
:where(.juzhen [lang]:lang(ja)) {
|
|
font-family:
|
|
"Noto Serif JP",
|
|
"Noto Serif CJK JP",
|
|
serif;
|
|
}
|
|
|
|
/* src/css/_spacing.css */
|
|
jz-hws {
|
|
margin-right: 0.25em;
|
|
}
|
|
jz-hws.jz-hws-trim {
|
|
margin-right: 0;
|
|
}
|
|
|
|
/* src/css/_jiya.css */
|
|
jz-char {
|
|
display: inline-block;
|
|
vertical-align: baseline;
|
|
}
|
|
jz-inner {
|
|
display: inline;
|
|
}
|
|
[data-jz-atoms=inline] jz-char {
|
|
display: inline;
|
|
}
|
|
jz-char.jz-half jz-inner,
|
|
jz-char.jz-half-le jz-inner {
|
|
font-feature-settings: "halt" 1;
|
|
-webkit-font-feature-settings: "halt" 1;
|
|
}
|
|
[data-jz-halfwidth=margin] jz-char.jz-half jz-inner,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le jz-inner {
|
|
font-feature-settings: normal;
|
|
-webkit-font-feature-settings: normal;
|
|
}
|
|
[data-jz-halfwidth=margin] jz-char.jz-half.jz-ink-left,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half.jz-ink-center,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half.jz-ink-right,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le.jz-ink-left,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le.jz-ink-center,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le.jz-ink-right {
|
|
width: 0.5em;
|
|
overflow: visible;
|
|
}
|
|
[data-jz-halfwidth=margin] jz-char.jz-half.jz-ink-left jz-inner,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half.jz-ink-center jz-inner,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half.jz-ink-right jz-inner,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le.jz-ink-left jz-inner,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le.jz-ink-center jz-inner,
|
|
[data-jz-halfwidth=margin] jz-char.jz-half-le.jz-ink-right jz-inner {
|
|
display: inline-block;
|
|
}
|
|
[data-jz-halfwidth=margin] jz-char.jz-ink-center jz-inner {
|
|
margin-left: -0.25em;
|
|
}
|
|
[data-jz-halfwidth=margin] jz-char.jz-ink-right jz-inner {
|
|
margin-left: -0.5em;
|
|
}
|
|
[data-jz-halfwidth=margin] jz-char jz-inner {
|
|
text-decoration: inherit;
|
|
}
|
|
[data-jz-halfwidth=halt] jz-char.jz-half jz-inner,
|
|
[data-jz-halfwidth=halt] jz-char.jz-half-le jz-inner {
|
|
font-feature-settings: "halt" 1;
|
|
-webkit-font-feature-settings: "halt" 1;
|
|
margin-left: 0;
|
|
}
|
|
[data-jz-halfwidth=halt] jz-char.jz-half,
|
|
[data-jz-halfwidth=halt] jz-char.jz-half-le {
|
|
width: auto;
|
|
}
|
|
|
|
/* src/css/_jinze.css */
|
|
jz-jinze {
|
|
display: inline-block;
|
|
white-space: nowrap;
|
|
vertical-align: baseline;
|
|
}
|
|
[data-jz-atoms=inline] jz-jinze {
|
|
display: inline;
|
|
}
|
|
|
|
/* src/css/juzhen.css */
|