Skip to content

Commit 537f46d

Browse files
authored
[css-text-4][css-inline-3][css-text-decor-4] Introduce text-fit property (#13616)
* Initial commit for 'text-fit' property * Separate a paragraph into two, etc. * 'see below'
1 parent 33682af commit 537f46d

3 files changed

Lines changed: 188 additions & 10 deletions

File tree

css-inline-3/Overview.bs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,7 @@ Line Spacing: the 'line-height' property</h3>
952952
Initial: normal
953953
Applies to: non-replaced inline boxes and SVG <a>text content elements</a>
954954
Inherited: yes
955-
Percentages: computed relative to ''1em''
955+
Percentages: see below
956956
Computed value: the specified keyword, a number, or a computed <<length>> value
957957
Animation type: by computed value type
958958
</pre>
@@ -973,7 +973,7 @@ Line Spacing: the 'line-height' property</h3>
973973
<dt><dfn>normal</dfn>
974974
<dd>
975975
Determine the [=preferred line height=]
976-
automatically based on font metrics.
976+
automatically based on the metrics of the used font.
977977

978978
<dt><dfn><<length [0,∞]>></dfn>
979979
<dd>
@@ -983,14 +983,15 @@ Line Spacing: the 'line-height' property</h3>
983983
<dt><dfn><<number [0,∞]>></dfn>
984984
<dd>
985985
The [=preferred line height=] is this number
986-
multiplied by the element's computed 'font-size'.
986+
multiplied by the element's used 'font-size'.
987987
Negative values are illegal.
988988
The [=computed value=] is the same as the [=specified value=].
989989

990990
<dt><dfn><<percentage [0,∞]>></dfn>
991991
<dd>
992992
The [=preferred line height=]
993-
and [=computed value=] of the property
993+
is this percentage of the element's used 'font-size'.
994+
The [=computed value=] of the property
994995
is this percentage of the element's computed 'font-size'.
995996
Negative values are illegal.
996997
</dl>

css-text-4/Overview.bs

Lines changed: 179 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9737,6 +9737,174 @@ Aligning a block of text within its container: the 'text-group-align' property</
97379737
</wpt>
97389738
</dl>
97399739

9740+
<h3 id="text-fit-property">
9741+
Text fitting: the 'text-fit' property</h3>
9742+
9743+
<wpt title="
9744+
This section has no coverage yet.
9745+
"></wpt>
9746+
9747+
<pre class="propdef">
9748+
Name: text-fit
9749+
Value: [ none | grow | shrink ] [consistent | per-line | per-line-all]? <<percentage>>?
9750+
Initial: none
9751+
Applies to: <a>block containers</a>
9752+
Inherited: no
9753+
Percentages: N/A
9754+
Computed value: specified keywords or computed <<percentage>> value
9755+
Canonical order: per grammar
9756+
Animation type: discrete
9757+
</pre>
9758+
9759+
<p>The 'text-fit' property describes how [=inline-level=] contents are
9760+
scaled if they do not fit to the [=line box=].
9761+
9762+
<p>Values have the following meanings:
9763+
9764+
<dl dfn-for=text-fit dfn-type=value>
9765+
<dt><dfn>none</dfn>
9766+
<dd>
9767+
The user agent doesn't scale [=inline-level=] contents to fit to
9768+
the [=line box=].
9769+
</dd>
9770+
9771+
<dt><dfn>grow</dfn>
9772+
<dd>
9773+
The user agent scales up [=inline-level=] contents to fit to the
9774+
[=line box=].
9775+
</dd>
9776+
9777+
<dt><dfn>shrink</dfn>
9778+
<dd>
9779+
The user agent scales down [=inline-level=] contents to fit to the
9780+
[=line box=].
9781+
</dd>
9782+
9783+
<dt><dfn>consistent</dfn>
9784+
<dd>
9785+
Specifies that all lines in the container are scaled with a single
9786+
scaling factor.
9787+
This keyword has no effect if ''text-fit/none'' is specified.
9788+
If none of ''text-fit/consistent'', ''text-fit/per-line'', or
9789+
''text-fit/per-line-all'' are specified, ''text-fit/consistent'' is
9790+
assumed.
9791+
</dd>
9792+
9793+
<dt><dfn>per-line</dfn>
9794+
<dd>
9795+
Specifies that each line is scaled with its own scaling factor.
9796+
However, the last line of the block and lines that end in a forced
9797+
break are not scaled.
9798+
This keyword has no effect if ''text-fit/none'' is specified.
9799+
</dd>
9800+
9801+
<dt><dfn>per-line-all</dfn>
9802+
<dd>
9803+
Specifies that each line is scaled with its own scaling factor,
9804+
including the last line of the block and lines that end in a forced
9805+
break.
9806+
This keyword has no effect if ''text-fit/none'' is specified.
9807+
</dd>
9808+
9809+
<dt><dfn>&lt;percentage&gt;</dfn>
9810+
<dd>
9811+
Specifies the limit of the scaling factor.
9812+
If ''text-fit/grow'' is specified and the value is 100% or greater,
9813+
it is the maximum scaling factor.
9814+
If ''text-fit/shrink'' is specified and the value is between 0% and
9815+
100% inclusive, it is the minimum scaling factor.
9816+
Otherwise, or if this component is omitted, there is no limit on
9817+
the scaling factor.
9818+
</dd>
9819+
</dl>
9820+
9821+
<p>This property provides a functionality to make [=inline-level=] contents
9822+
exactly fill the inline size of the [=line box=].
9823+
Unlike ''text-align/justify'' of the 'text-align' property, which achieves
9824+
this by adjusting spacing between characters, this property scales the
9825+
font size.
9826+
9827+
<p>When ''text-fit/grow'' or ''text-fit/shrink'' is specified,
9828+
a [=line scaling factor=] is computed for each [=line box=].
9829+
If ''text-fit/consistent'' applies, all [=line boxes=] are scaled by the
9830+
smallest computed [=line scaling factor=].
9831+
Otherwise, each [=line box=] is scaled by its own [=line scaling factor=].
9832+
9833+
<p>This property does not affect the 'font-size' [=computed value=],
9834+
and thus does not affect font-size-relative <<length>> values of other properties.
9835+
For example, "line-height: 1.5em" and "letter-spacing: 0.1em" are not
9836+
affected by this scaling.
9837+
9838+
<p>The [=used value=] of the text 'font-size' is its [=computed value=]
9839+
multiplied by the [=line scaling factor=].
9840+
9841+
<p>Scaling can change the [=block size=] of a [=line box=],
9842+
which can in turn change its position along the [=block-axis=].
9843+
If any feature is active that would cause the [=inline size=] of the
9844+
[=line box=] to change based on its [=block-axis=] position (such as
9845+
'float' or 'initial-letter'), scaling is disabled for the block.
9846+
9847+
<div class="issue">
9848+
If the [=inline size=] of a block container depends on the size of
9849+
the viewport, its apparent [=inline size=] may not change even if
9850+
the user changes the page zoom level.
9851+
In that case, if text is fitted with this feature, the text size may
9852+
not change at all even though the zoom level has changed.
9853+
There is no agreement yet on how to deal with this issue. See
9854+
<a href="https://github.com/w3c/csswg-drafts/issues/12886">csswg#12886</a>.
9855+
</div>
9856+
9857+
<h4 id="text-fit-scaling-factor">Computing line scaling factor</h4>
9858+
9859+
<p>The parts of the [=line box=]'s contents that can be scaled by this
9860+
property are called <dfn>scalable parts</dfn>.
9861+
These include:
9862+
9863+
<ul>
9864+
<li>
9865+
Text, including text in [=inline boxes=], but excluding trailing
9866+
white space.
9867+
9868+
<li>
9869+
Spacing whose [=inline size=] is proportional to the 'font-size'
9870+
used value.
9871+
E.g. percentage-based 'letter-spacing' or 'word-spacing', and 'text-autospace'.
9872+
</ul>
9873+
9874+
<p class="note">
9875+
'text-indent', 'line-padding', non-percentage-based 'letter-spacing' and
9876+
'word-spacing', and [=atomic inlines=] are not [=scalable parts=].
9877+
The [=inline-axis=] 'padding', 'border', and 'margin' of inline boxes are
9878+
also not [=scalable parts=].
9879+
9880+
<p>A <dfn>line scaling factor</dfn> is the ratio by which the
9881+
[=scalable parts=] of a line must be scaled in order to make its
9882+
[=inline-level=] content exactly fit the [=line box=]’s [=inline size=].
9883+
9884+
<p>A [=line scaling factor=] is computed from:
9885+
9886+
<ul>
9887+
<li>The total [=inline size=] of the [=scalable parts=] in the line.
9888+
<li>
9889+
The remaining space in the [=line box=], including any trailing whitespace
9890+
(which may be negative if the content overflows the [=line box=]).
9891+
</ul>
9892+
9893+
<p>If a <<percentage>> is specified, it clamps the [=line scaling factor=].
9894+
9895+
<p class="note">
9896+
A simple calculation for the [=line scaling factor=] would be
9897+
<code>(A + B) / A</code>, where A is the total [=inline size=] of
9898+
[=scalable parts=] and B is the remaining space.
9899+
However, due to [[css-fonts-4#font-optical-sizing-def|optical sizing]], the
9900+
[=inline size=] of text might not be perfectly proportional to its
9901+
'font-size'.
9902+
The exact method for determining a reasonable [=line scaling factor=]
9903+
is up to the implementation.
9904+
9905+
<p>The [=line scaling factor=] for a [=line box=] with no
9906+
[=scalable parts=] is 1.
9907+
97409908

97419909
<h2 id="spacing">
97429910
Spacing</h2>
@@ -9779,7 +9947,7 @@ Word Spacing: the 'word-spacing' property</h3>
97799947
Initial: normal
97809948
Applies to: text
97819949
Inherited: yes
9782-
Percentages: relative to computed 'font-size', i.e. ''1em''
9950+
Percentages: relative to used 'font-size'
97839951
Computed value: an absolute length and/or a percentage
97849952
Animation type: by computed value type
97859953
Canonical order: n/a
@@ -9977,7 +10145,7 @@ Tracking: the 'letter-spacing' property</h3>
997710145
Initial: normal
997810146
Applies to: <a>inline boxes</a> and text
997910147
Inherited: yes
9980-
Percentages: relative to computed 'font-size', i.e. ''1em''
10148+
Percentages: relative to used 'font-size'
998110149
Computed value: an absolute length and/or a percentage
998210150
Animation type: by computed value type
998310151
Canonical order: n/a
@@ -10624,7 +10792,7 @@ Inter-script Spacing</h4>
1062410792
i.e. without any intervening non-zero [=margin=], [=border=], or [=padding=]
1062510793
or intervening characters (such as a quotation mark or a space).
1062610794
The amount of space introduced by these keywords is 1/8 of the CJK advance measure,
10627-
i.e ''0.125ic''.
10795+
i.e ''0.125ic'' if the [=used value=] of 'font-size' is same as its [=computed value=].
1062810796

1062910797
Note: Spacing conventions vary, but values typically range from 1/4ic to as low as 1/8ic,
1063010798
with 1/4ic being more common in historical contexts due to metal type limitations
@@ -12133,6 +12301,13 @@ Text Processing Order of Operations</h2>
1213312301
* 'letter-spacing', 'word-spacing', 'text-spacing', and 'line-padding'
1213412302
* [[#hanging-punctuation-property|hanging punctuation]]
1213512303

12304+
<li>
12305+
[[#text-fit-property|text fitting]]
12306+
12307+
* <a href="https://www.w3.org/TR/css-fonts-3/">font/glyph selection
12308+
and positioning</a> [[!CSS-FONTS-3]] may be done again
12309+
* 'letter-spacing', 'word-spacing', and 'text-spacing' may be updated.
12310+
1213612311
<li>
1213712312
[[#justification|justification]]
1213812313
(which may affect glyph selection and/or text wrapping, looping back into that step)
@@ -13303,7 +13478,7 @@ Changes</h2>
1330313478
Changes specific to Level 4 are listed below.
1330413479

1330513480
Significant changes since the <a href="https://www.w3.org/TR/2024/WD-css-text-4-2024052">29 May 2024 Working Draft</a> include:
13306-
* None yet.
13481+
* Add 'text-fit' property.
1330713482

1330813483
Significant changes since the <a href="https://www.w3.org/TR/2024/WD-css-text-4-20240219/">19 February 2024 Working Draft</a> include:
1330913484
* Renamed the 'text-spacing-trim' value <css>trim-auto</css> to ''trim-both''.

css-text-decor-4/Overview.bs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,8 @@ Text Decoration Line Thickness: the 'text-decoration-thickness' property</h3>
366366
Note: A length will inherit as a fixed value,
367367
and will not scale with the font.
368368

369-
A percentage value specifies the thickness of text decoration lines as a percentage of ''1em''.
369+
A percentage value specifies the thickness of text decoration lines as a percentage of
370+
the used 'font-size'.
370371

371372
Note: A percentage will inherit as a relative value,
372373
and will therefore scale with changes in the font as it inherits.
@@ -707,7 +708,8 @@ Text Underline Offset: the 'text-underline-offset' property</h3>
707708
Note: A length will inherit as a fixed value,
708709
and will not scale with the font.
709710

710-
A percentage value specifies the offset of underlines as a percentage of ''1em''.
711+
A percentage value specifies the offset of underlines as a percentage of the used
712+
'font-size'.
711713

712714
Note: A percentage will inherit as a relative value,
713715
and will therefore scale with changes in the font as it inherits.

0 commit comments

Comments
 (0)