Skip to content

feat: JS/TS「消えるブリッジ」層 jp-typeset/enhance を追加(縦書き対応・視覚回帰込み)#3

Merged
P4suta merged 1 commit into
mainfrom
feat/enhance-js-bridge
May 30, 2026
Merged

feat: JS/TS「消えるブリッジ」層 jp-typeset/enhance を追加(縦書き対応・視覚回帰込み)#3
P4suta merged 1 commit into
mainfrom
feat/enhance-js-bridge

Conversation

@P4suta

@P4suta P4suta commented May 30, 2026

Copy link
Copy Markdown
Owner

概要

CSS だけでは全ブラウザで揃わない JLReq 項目を、CSS.supports() で feature-detect して native が無い所だけ補い、native 対応が来たら自動で no-op になる「消えるブリッジ」 opt-in JS 層 jp-typeset/enhance を追加します。

CSS コア(. export)は実行時依存ゼロのまま不変。JS と budoux 依存は ./enhance export だけが背負う完全隔離で、CSS だけの利用者は一切コストを払いません。

機能(enhance(root?, options?))

オプション 既定 内容 native(no-op条件)
phrasing on BudouX 文節改行(見出し・短文に <wbr> 挿入、本文 p は対象外) word-break: auto-phrase
dialogueIndent off 始め括弧で始まる段落の先頭字下げを詰める(JLReq 精緻化) (CSS 等価なし)
hanging(実験) off ぶら下げ組(行頭開き括弧・行末句読点を版面外へ) hanging-punctuation: first
spacingTrim(実験) off 連続する全角約物のアキ詰め text-spacing-trim
observe off layout 依存ブリッジ(ぶら下げ)を resize 時に再適用

設計のポイント

  • 旗艦の文節改行は安定公開 API parser.parse() のみ使い、自前 DOM ウォーカーで <wbr> を挿入。ZWSP を使わないのでコピペ・スクリーンリーダー・検索を汚さず、ルビ・圏点などインライン要素も非破壊。冪等。
  • 実験ブリッジも同一 Bridge 契約・feature-gate・冪等に揃え、デフォルト挙動はクリーンに保つ(能力は最大・既定は最小)。
  • 縦書き(.jp-vertical)完全対応: 挿入余白はすべて論理プロパティ(margin-inline-* / text-indent)、ぶら下げの行末判定だけ computed writing-mode から軸を切替(縦組みは「列の下端=inline-end」)。横組みの挙動はバイト単位で不変。
  • 配布2形態: ESM(import { enhance }・tree-shakeable・budoux external+動的 import で native ブラウザはモデル未読込)+ CDN 自動初期化 IIFE(<script> 一発・budoux+日本語モデル内包)。Vite library mode 2 パス+ tsc --emitDeclarationOnly で型出力。

テスト(完備)

  • 決定論層 tests/enhance.spec.ts(ci:gate): in-page CSS.supports 基準のゲート/no-op・<wbr> 挿入・冪等・ルビ/圏点非破壊・縦書き全ブリッジ・IIFE 成果物に内包した BudouX の実動作を 3 エンジンで決定論アサート。
  • 視覚回帰層 tests/enhance.visual.spec.ts(test:visual・非ゲート): 横組み・縦組みの要素単位スクショ(基準画像コミット済み・安定性確認済み)。
  • gallery.preview.tsenhance / enhance-all(全ブリッジ・横/縦)プレビューを追加。

ローカルで CI 手順を完全再現(--frozen-lockfile install → ci:gatetest:visual)し、全エンジン緑を確認済み。生成された縦書き基準画像も目視で文節カラム・ぶら下げ・約物詰め・ルビ/圏点が正しいことを確認。

🤖 Generated with Claude Code

CSS だけでは全ブラウザで揃わない JLReq 項目を、CSS.supports で feature-detect し
native が無い所だけ補い、native 対応が来たら自動で no-op になる opt-in の JS 層を追加。
CSS コア(. export)は実行時依存ゼロのまま維持し、JS と budoux 依存は ./enhance
export だけが背負う完全隔離。

- 旗艦: BudouX 文節改行(word-break:auto-phrase の polyfill、見出し・短文限定で
  本文 p には当てない)。安定 API parser.parse() のみ使い自前 DOM ウォーカーで <wbr>
  を挿入(ZWSP 不使用でコピペ/AT/検索を汚さない・ルビ/圏点も非破壊)・冪等。
- 会話文字下げ Refinement(opt-in)、実験的 hanging/spacingTrim(既定 OFF・best-effort)
  も同一 Bridge 契約・feature-gate・冪等で実装。デフォルト挙動はクリーンに保つ。
- 縦書き(.jp-vertical)完全対応: 挿入余白は論理プロパティ(margin-inline-*/text-indent)、
  ぶら下げの行末判定だけ computed writing-mode から軸を切替(縦組みは列下端=inline-end)。
- 配布: ESM(enhance() 明示 API・budoux external・動的 import)+ CDN 自動初期化 IIFE
  (budoux+日本語モデル内包の単一ファイル)。Vite library mode 2 パス+ tsc で .d.ts 出力。
- テスト: enhance.spec.ts(in-page CSS.supports 基準のゲート/no-op・<wbr>・冪等・非破壊・
  縦書き・IIFE 内包 budoux の実動作を 3 エンジンで決定論検証、ci:gate)+
  enhance.visual.spec.ts(横/縦の視覚回帰、test:visual)。gallery.preview に enhance/
  enhance-all(全ブリッジ・横/縦)を追加。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@P4suta
P4suta merged commit 73bb692 into main May 30, 2026
1 check passed
@P4suta
P4suta deleted the feat/enhance-js-bridge branch May 30, 2026 20:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant