フレックスアイテムの自動最小サイズ仕様

対象実装: arm/v1/src/os_lib/layout/flex_min.rs 単体試験: arm/v1/tests/src/test_flex_min.rs

典拠(2026-07-28、ユーザ許可のうえ参照): CSS Flexible Box Layout Module Level 1 — https://www.w3.org/TR/css-flexbox-1/#algo-main-item (§4.5 Automatic Minimum Size of Flex Items、§9.7 Resolving Flexible Lengths)

なぜこの仕様書があるか

www.sugi-lab.net の再現中、ヒーロー見出しが過剰に折り返された。

<h1 class="hero-title">IoTで未来の暮らしを創造する</h1>   <!-- 改行なし・14文字 -->

.hero-content { max-width: 800px }、font-size 48px なので 14 文字 ≒ 672px は 800px に 1 行で収まる(実サイトでも 1 行)。ところが画面では 1 行あたり 約 5 文字(≒240px)で 3 行に折り返されていた。

折り返し幅は tree.rs:2476 付近で そのテキストノードの親ボックスの dimensions.content.width から取られる。 つまり .hero-content 系のボックス幅が ≒240px まで縮んでいた。

構造は .hero(display:flex, center) > .hero-overlay(display:flex, center) > .hero-content(max-width:800px) > h1.hero-title。

原典から確定した事項

実装の欠陥(確認済み)

tree.rs の flex-shrink 処理は、超過分を shrink 係数で按分したうえで

child.dimensions.content.width = (child.dimensions.content.width - cut).max(0);

と 0 までしか下限を設けていない。自動最小サイズ(コンテンツ由来の下限)も min-width 指定も一切参照していないため、アイテムは理論上 0 まで縮む。 これが .hero-content が 240px まで縮んだ原因。

不変条件

【2026-07-28 実装後の結果】画面は変わらなかった

flex_min.rs を作成し、tree.rs の flex-shrink 経路を distribute_shrink() へ置き換えた(単体試験 15 件・make test 536 件全通過、 cargo clippy --release エラー 0)。しかし実機の描画は一切変わらなかった。

→ .hero-content が 240px になる原因は flex-shrink 経路ではない、 または flex-shrink 経路自体がこのページで実行されていない。 規格違反そのものは実在し修正の価値はあるが、今回の症状の原因ではなかった。

【2026-07-28 実測で真因判明】幅ではなくフォントサイズの不一致だった

各段の dimensions.content.width / height をログ([BOXW])した結果:

[BOXW] depth=3 tag=section id="home"  w=924 h=529    ← ヒーロー全幅。正常
[BOXW] depth=6 tag=h1      id="_ta_51" w=640 h=19    ← 見出し。幅は十分、しかし高さ 19px

幅は 640px あり十分だった(240px という当初の見立ては誤り)。 問題は高さ 19px。font-size 48px なら行高は約 57px のはずで、 19px はレイアウトが既定の 16px でこの h1 を計算していることを意味する。 一方、描画側は以前の実測で fs=48 だった。

レイアウト: 14文字 × 16px ≒ 224px → 640px に収まる → 1 行・高さ 19px
描画:       14文字 × 48px ≒ 672px → 640px を超える → 3 行に折り返し

→ 真因は「レイアウトと描画でフォントサイズが食い違っている」。 .hero-title { font-size: 3rem } が描画側には効いているのに、 レイアウト側(tree.rs の内在サイズ計算)には届いていない。 高さ 19px しか確保されないため、描画された 2〜3 行目が後続要素へはみ出して重畳する。

次にやること: tree.rs がテキストの font-size をどこから取っているかを特定し、 rem を解決できているか確認する(css_units.rs::parse_font_size は rem 対応済みだが、 レイアウト側が別経路で解決している可能性が高い)。 get_vector_string_wrapped_size_ext へ渡している font_size の算出元を読むこと。

flex-shrink の下限無視は別件の実在バグとして修正済み(規格違反であることは確か)。 本件とは無関係だったため、以降は上記の font-size 経路を追うこと。

本実装の範囲と近似

flex 基準サイズ(flex base size)— 2026-09-05 追記

実サイト www.sugi-lab.net のヘッダ再現で見つかった 4 件。 いずれも仕様上の明確な誤りで、この 1 ページに限らず あらゆる flex レイアウトに影響する。

検証方法

レイアウトの試験(layout/selftest.rs)は selftest フィーチャ限定で 通常ビルドでは走らず、ホスト側の試験にも木構造のレイアウトは無い。 この 4 件は実機の描画と要素の矩形で確認した。 数値で確かめる手段が薄いのは弱点として残っている。

残っている差(2026-09-05 時点)