Files
cjk-autospace/dist/juzhen.css
T
admin a3c94ddee5 refactor: 移除標點懸掛(機制級死路)——負 margin 程式碼/CSS/型別一併刪
標點懸掛經實測為**機制級死路**(純 CSS 之寬度守恆矛盾):行端標點盒保持非零寬則墨色
出去多少版心內就空多少(行末實義字無法齊邊);收為零寬則釋放一整字寬、斷行器把下一字
拉上本行與標點重疊(且 justifyAtoms 預設之 inline-block 下負 margin 被 justify 吸收)。
CSS hack 接觸不到斷行器,此恒等式無解。唯一正解為原生 hanging-punctuation(僅 Safari
支援、且 jz-char 為 inline-block 原子非文本,原生懸掛不作用),屬遠期「原生管線」新功能、
與此處無共享,故不保留休眠碼。

移除:
  lineedge.ts — jz-hang-* class、HANG_* 常量、applyEdge hang 分支、modeForChar、
    HANG_ENABLED 總開關;行端僅餘 squeeze(半形)。
  _jiya.css — jz-hang-* 三條規則(margin 半形 fallback 完整保留)。
  types.ts — LineEndMode 型別、ResolvedOptions.lineEnd、features.hanging。
  index.ts — lineEnd 鎖。
  hanging 公開選項保留為 @deprecated no-op(API 相容)。

文檔:README「標點懸掛」節、ARCHITECTURE §6.5(開頭/§6.5.2/§6.5.4/§6.5.5/§6.5.6)、
demo(showcase §三/resize-check)全部由「停用/休眠」改為「已移除」+寬度守恆論證。

測試:防逃逸測試改寫為「hanging 為 no-op、輸出與不傳一致、各路徑不產生 jz-hang-*」。
全綠 101。dist 已無 jz-hang/lineEnd/HANG 殘留。
2026-06-11 16:16:01 +08:00

105 lines
2.5 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/_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: "locl" 1, "halt" 1;
-webkit-font-feature-settings: "locl" 1, "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: "locl" 1, "halt" 1;
-webkit-font-feature-settings: "locl" 1, "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/_orphan.css */
jz-orphan {
white-space: nowrap;
}
/* src/css/juzhen.css */