[css-inline-3] Split text-box-edge into two properties and create a s… · w3c/csswg-drafts@7869dc6 (original) (raw)

`@@ -957,7 +957,7 @@ Logical Heights and Inter-line Spacing

`

957

957

` The [=block-axis=] sizing of a [=line box=]

`

958

958

` depends on the sizes and [[#alignment|alignment]] of its [=inline-level=] contents.

`

959

959

` This sizing is controlled by

`

960

``

`-

the 'line-height', 'text-box-edge', 'text-box-trim', and 'inline-sizing' properties.

`

``

960

`+

the 'line-height' and 'line-fit-edge' properties.

`

961

961

``

962

962

`

`

963

963

`Line Spacing: the 'line-height' property

`

`@@ -1035,7 +1035,7 @@ Line Spacing: the 'line-height' property

`

1035

1035

` See also Issue 3118

`

1036

1036

` and Issue 2165.

`

1037

1037

``

1038

``

`-

Note: When 'text-box-edge' is ''text-box-edge/leading'',

`

``

1038

`+

Note: When 'line-fit-edge' is ''line-fit-edge/leading'',

`

1039

1039

` the margins, borders, and padding of [=inline boxes=]

`

1040

1040

` do not affect the line box’s height calculation.

`

1041

1041

` However, they are still rendered around these boxes.

`

`@@ -1045,11 +1045,11 @@ Line Spacing: the 'line-height' property

`

1045

1045

` potentially obscuring earlier content.

`

1046

1046

``

1047

1047

`

`

1048

``

`-

Inline Box Edge Metrics: the 'text-box-edge' property

`

``

1048

`+

Text Edge Metrics: the 'line-fit-edge' property

`

1049

1049

``

1050

1050

`

`

1051

``

`-

Name: text-box-edge

`

1052

``

`-

Value: leading | [ text | cap | ex | ideographic | ideographic-ink ] [ text | alphabetic | ideographic | ideographic-ink ]?

`

``

1051

`+

Name: line-fit-edge

`

``

1052

`+

Value: leading | <>

`

1053

1053

`Initial: leading

`

1054

1054

`Applies to: [=inline boxes=]

`

1055

1055

`Inherited: yes

`

`@@ -1062,37 +1062,35 @@ Inline Box Edge Metrics: the 'text-box-edge' property

`

1062

1062

` and might change significantly

`

1063

1063

` as design critiques and use cases are registered

`

1064

1064

` and various details and interactions with other properties are worked out.

`

1065

``

`-

Do not implement (yet).

`

``

1065

`+

Do not ship (yet).

`

1066

1066

``

1067

1067

`[=Inline boxes=], whose primary purpose is to contain text,

`

1068

1068

` are sized in the [=block axis=] based on their font metrics.

`

1069

``

`-

The 'text-box-edge' property controls which metrics are used.

`

1070

``

-

1071

``

`-

The chosen metrics are used as the basis

`

``

1069

`+

The 'line-fit-edge' property controls which metrics are used.

`

``

1070

`+

These chosen metrics are used as the basis

`

1072

1071

` for the [=layout bounds=] of the [=inline box=]

`

1073

``

`-

(if it is not the [=root inline box=]).

`

1074

``

`-

The 'text-box-trim' property can be used in conjunction

`

1075

``

`-

to match the [=content edges=] to these same metrics.

`

``

1072

`+

(if it is not the [=root inline box=]);

`

``

1073

`+

and also, by default, are the metrics used for 'text-box-trim'.

`

``

1074

+

``

1075

`+

The <> value,

`

``

1076

`+

which identifies specific font metrics,

`

``

1077

`+

expands to

`

``

1078

+

``

1079

`+


`

``

`1080`

`+

<> = [ text | cap | ex | ideographic | ideographic-ink ] [ text | alphabetic | ideographic | ideographic-ink ]?

`

``

`1081`

`+

 

`

1076

1082

``

1077

1083

` The first value specifies the text [=over=] edge;

`

1078

1084

` the second value specifies the text [=under=] edge.

`

1079

1085

` If only one value is specified,

`

1080

1086

` both edges are assigned that same keyword if possible;

`

1081

``

`-

else ''text-box-edge/text'' is assumed as the missing value.

`

``

1087

`+

else ''<>/text'' is assumed as the missing value.

`

1082

1088

``

1083

1089

` ISSUE(5236): Do we need [=longhands=] or is this shorthand enough?

`

1084

1090

``

1085

``

`-

Note: The ''text-box-edge/leading'' and ''text-box-edge/text'' values

`

1086

``

`-

rely on the font [=ascent=] and [=descent=] to make sure the text fits.

`

1087

``

`-

Other values are more likely to result in overlap or overflow

`

1088

``

`-

caused by ascents above the specified metrics

`

1089

``

`-

(such as for diacritics),

`

1090

``

`-

so authors using these values need to be careful

`

1091

``

`-

to provide sufficient spacing for the text.

`

1092

``

-

1093

1091

` Values have the following meanings:

`

1094

1092

``

1095

``

`-

`

``

1093

`+

`

1096

1094

`

leading

`

1097

1095

`

`

1098

1096

` Use the [=ascent=]/[=descent=] plus any positive [=half-leading=].

`

`@@ -1124,32 +1122,36 @@ Inline Box Edge Metrics: the 'text-box-edge' property

`

1124

1122

` Use the [=alphabetic baseline=].

`

1125

1123

`

`

1126

1124

``

1127

``

`-

Unless 'text-box-edge' is ''text-box-edge/leading''--

`

``

1125

`+

ISSUE(8067): Is ''line-fit-edge/text'' a reasonable name for the ascent/descent metrics,

`

``

1126

`+

or can we think of something better?

`

``

1127

`+

Ditto ''line-fit-edge/leading'' and the name of the property itself.

`

``

1128

+

``

1129

`+

Unless 'line-fit-edge' is ''line-fit-edge/leading''--

`

1128

1130

` in which case the box’s own 'line-height' is used to add spacing--

`

1129

1131

` the box’s margin, padding, and border also contribute

`

1130

1132

` to the [=layout bounds=].

`

1131

1133

``

1132

``

`-

Note: Although only ''text-box-edge/leading'' applies positive [=half-leading=],

`

1133

``

`-

in order to allow text to be set tightly,

`

1134

``

`-

all values apply negative [=half-leading=],

`

1135

``

`-

see [[#inline-height]].

`

1136

``

`-

Half-leading is applied equally to both sides of the text;

`

1137

``

`-

for more precise overlap control authors can use

`

1138

``

`-

''text-box-edge: text'' together with negative [=margins=]

`

1139

``

`-

on the affected text.

`

``

1134

`+

Note: The ''line-fit-edge/leading'' and ''line-fit-edge/text'' values

`

``

1135

`+

rely on the font [=ascent=] and [=descent=] to make sure the text fits.

`

``

1136

`+

Other values are more likely to result in overlap or overflow

`

``

1137

`+

caused by ascents above the specified metrics

`

``

1138

`+

(such as for diacritics),

`

``

1139

`+

so authors using these values need to be careful

`

``

1140

`+

to provide sufficient spacing for the text,

`

``

1141

`+

particularly in multi-lingual contexts.

`

1140

1142

``

1141

1143

`

`

1142

1144

`

`

1143

1145

` alt="Three different values of the text-box-edge property." >

`

1144

1146

`

`

1145

``

`-

The 'text-box-edge' property, showing values for ''text-box-edge/leading'',

`

1146

``

`-

''text-box-edge/cap'', and ''text-box-edge/ex''.

`

``

1147

`+

The 'line-fit-edge' property, showing values for ''line-fit-edge/leading'',

`

``

1148

`+

''line-fit-edge/cap'', and ''line-fit-edge/ex''.

`

1147

1149

` The red lines indicate the layout bounds of the inline box.

`

1148

1150

`

`

1149

1151

`

`

1150

1152

``

1151

1153

`

`

1152

``

`-

When 'text-box-edge' is ''text-box-edge/leading'',

`

``

1154

`+

When 'line-fit-edge' is ''line-fit-edge/leading'',

`

1153

1155

` vertical rhythm can be broken any time there is a change

`

1154

1156

` in font metrics or vertical alignment within a paragraph.

`

1155

1157

``

`@@ -1162,21 +1164,30 @@ Inline Box Edge Metrics: the 'text-box-edge' property

`

1162

1164

` to avoid overlap between lines.

`

1163

1165

`

`

1164

1166

``

``

1167

`+

Note: Although only ''line-fit-edge/leading'' applies positive [=half-leading=],

`

``

1168

`+

in order to allow text to be set tightly,

`

``

1169

`+

all values apply negative [=half-leading=],

`

``

1170

`+

see [[#inline-height]].

`

``

1171

`+

Half-leading is applied equally to both sides of the text;

`

``

1172

`+

for more precise overlap control authors can use

`

``

1173

`+

''line-fit-edge: text'' together with negative [=margins=]

`

``

1174

`+

on the affected text.

`

``

1175

+

1165

1176

`

`

1166

1177

`Calculating the Logical Height Contributions (“Layout Bounds”) of Inline Boxes

`

1167

1178

``

1168

1179

` The contribution of an [=inline box=] to the [=logical height=] of its [=line box=],

`

1169

1180

` here referred to as its layout bounds,

`

1170

1181

` is always calculated with respect to its own text metrics,

`

1171

1182

` as described below,

`

1172

``

`-

and is controlled by 'text-box-edge' and 'line-height'.

`

``

1183

`+

and is controlled by 'line-fit-edge' and 'line-height'.

`

1173

1184

` The sizes and positions of child boxes do not influence

`

1174

1185

` its [=layout bounds=]

`

1175

1186

` (nor its own [=logical height=], for that matter,

`

1176

1187

` see 'inline-sizing').

`

1177

1188

``

1178

1189

` Note: The [=layout bounds=] need not correspond

`

1179

``

`-

to the box’s edges.

`

``

1190

`+

to the box’s [=box/edges=].

`

1180

1191

``

1181

1192

` To find the [=layout bounds=] of an [=inline box=],

`

1182

1193

` the UA must first align

`

`@@ -1191,13 +1202,13 @@ Calculating the Logical Height Contributions (“Layout Bounds”) of Inline Box

`

1191

1202

` For each glyph (including the “strut”),

`

1192

1203

`A represents its ascent above the [=baseline=];

`

1193

1204

`D represents its descent below.

`

1194

``

`-

Unless 'text-box-edge' specifies a different metric to use,

`

``

1205

`+

Unless 'line-fit-edge' specifies a different metric to use,

`

1195

1206

`A refers to the [=ascent metric=]

`

1196

1207

` (for the given font at its given size)

`

1197

1208

` and D to the [=descent metric=],

`

1198

1209

` each adjusted to account for the [=dominant baseline=]’s offset from zero.

`

1199

1210

` If 'line-height' computes to ''line-height/normal''

`

1200

``

`-

and either 'text-box-edge' is ''text-box-edge/leading''

`

``

1211

`+

and either 'line-fit-edge' is ''line-fit-edge/leading''

`

1201

1212

` or this is the [=root inline box=],

`

1202

1213

` the font’s [=line gap metric=]

`

1203

1214

` may also be incorporated into A and D

`

`@@ -1225,7 +1236,7 @@ Calculating the Logical Height Contributions (“Layout Bounds”) of Inline Box

`

1225

1236

` giving an effective ascent above the baseline of

`

1226

1237

`A′ = A + L/2,

`

1227

1238

` and an effective descent of D′ = D + L/2.

`

1228

``

`-

However, if 'text-box-edge' is not ''text-box-edge/leading''

`

``

1239

`+

However, if 'line-fit-edge' is not ''text-box-edge/leading''

`

1229

1240

` and this is not the [=root inline box=],

`

1230

1241

` if the [=half-leading=] is positive, treat it as zero.

`

1231

1242

` The [=layout bounds=] exactly encloses

`

`@@ -1234,23 +1245,32 @@ Calculating the Logical Height Contributions (“Layout Bounds”) of Inline Box

`

1234

1245

` Note: L may be negative.

`

1235

1246

``

1236

1247

` Additionally,

`

1237

``

`-

when 'text-box-edge' is not ''text-box-edge/leading'',

`

``

1248

`+

when 'line-fit-edge' is not ''line-fit-edge/leading'',

`

1238

1249

` the [=layout bounds=] are inflated

`

1239

1250

` by the sum of the [=margin=], [=border=], and [=padding=]

`

1240

1251

` on each side.

`

1241

1252

` In order to allow negative [=margin=] values to have an actual effect,

`

1242

1253

` negative [=margins=] are also accumulated onto

`

1243

``

`-

the layout bounds of any descendant [=inline boxes=]

`

``

1254

`+

the [=layout bounds=] of any descendant [=inline boxes=]

`

1244

1255

` participating in the same [=inline formatting context=].

`

1245

1256

``

1246

1257

` In Quirks Mode [[!QUIRKS]],

`

1247

1258

` any [=inline box=] [=box fragment|fragment=]

`

1248

1259

` that has zero borders and padding and

`

1249

1260

` that does not directly contain text or preserved white space [[!CSS-TEXT-3]]

`

1250

``

`-

is ignored when sizing the line box.

`

``

1261

`+

is ignored when sizing the [=line box=].

`

1251

1262

``

1252

``

`-

`

1253

``

`-

Half-Leading Control: the 'text-box-trim' property

`

``

1263

`+

`

``

1264

`+

Trimming Leading Over/Under Text

`

``

1265

+

``

1266

`+

ISSUE: This is a draft of a proposal,

`

``

1267

`+

and may change significantly

`

``

1268

`+

as design critiques and use cases are registered.

`

``

1269

`+

Values and property names may be added, dropped, and/or renamed,

`

``

1270

`+

and the overall syntax or behavior may change,

`

``

1271

`+

particularly in response to authoring and robustness considerations

`

``

1272

`+

for handling descendant boxes.

`

``

1273

`+

Do not ship (yet).

`

1254

1274

``

1255

1275

` To ensure consistent spacing in the basic case of running text,

`

1256

1276

` CSS line layout introduces leading both above and below

`

`@@ -1264,13 +1284,13 @@ Half-Leading Control: the 'text-box-trim' property

`

1264

1284

` However, all this extra spacing interferes with visual alignment

`

1265

1285

` and with control over effective (visually-apparent) spacing.

`

1266

1286

``

1267

``

`-

The 'text-box-trim' property allows trimming

`

``

1287

`+

The 'text-box' property allows trimming

`

1268

1288

` this additional space above and below

`

1269

1289

` the first and last lines of a block,

`

1270

1290

` allowing more precise control over spacing around the glyphs.

`

1271

``

`-

Moreover, by relying on font metrics rather than hard-coded lengths,

`

1272

``

`-

it allows content to be resized, rewrapped, and rendered in a variety of fonts

`

1273

``

`-

while maintaining that spacing.

`

``

1291

`+

By relying on font metrics rather than hard-coded lengths,

`

``

1292

`+

this feature allows content to be resized, rewrapped, and rendered in a variety of fonts

`

``

1293

`+

while maintaining that precise spacing.

`

1274

1294

``

1275

1295

`

`

1276

1296

`

`

`@@ -1332,6 +1352,42 @@ Half-Leading Control: the 'text-box-trim' property

`

1332

1352

`

`

1333

1353

`

`

1334

1354

``

``

1355

`+

`

``

1356

`+

Shorthand for Text Box Trimming: the 'text-box' property

`

``

1357

+

``

1358

`+

ISSUE: This propdef table is fully expanded to evaluate and adjust the shorthand's value space.

`

``

1359

`+

It simplifies down to <> || <>

`

``

1360

`+

minus the ''text-box-trim/none'' and ''text-box-edge/auto'' keywords.

`

``

1361

+

``

1362

`+


`

``

`1363`

`+

Name: text-box

`

``

`1364`

`+

Value: normal | [ start | end | both ] || [ text | cap | ex | ideographic | ideographic-ink ] [ text | alphabetic | ideographic | ideographic-ink ]?

`

``

`1365`

`+

Initial: normal

`

``

`1366`

`+

Applies to: [=block containers=] and [=inline boxes=]

`

``

`1367`

`+

Inherited: no

`

``

`1368`

`+

Percentages: N/A

`

``

`1369`

`+

Computed value: the specified keyword

`

``

`1370`

`+

Animation type: discrete

`

``

`1371`

`+

 

`

``

1372

+

``

1373

`+

This property is a [=shorthand=] for setting the 'text-box-trim' and 'text-box-edge' properties

`

``

1374

`+

in a single declaration.

`

``

1375

+

``

1376

`+

If the single keyword ''text-box-edge/normal'' is specified,

`

``

1377

`+

it sets 'text-box-trim' to ''text-box-trim/none''

`

``

1378

`+

and 'text-box-edge' to ''text-box-edge/auto''.

`

``

1379

`+

Otherwise, omitting the 'text-box-trim' value sets it to ''text-box-trim/both'' (not the initial value),

`

``

1380

`+

while omitting the 'text-box-edge' value sets it to ''text-box-edge/auto'' (the initial value).

`

``

1381

+

``

1382

`+

ISSUE(8067): We should rename the 'text-box-trim' values to add ''trim-*'' prefixes.

`

``

1383

`+

This would make the shorthand clearer,

`

``

1384

`+

and also make its value space consistent with 'text-spacing'.

`

``

1385

+

``

1386

`+

ISSUE: Add examples.

`

``

1387

+

``

1388

`+

`

``

1389

`+

Trimming Over/Under Text: the 'text-box-trim' property

`

``

1390

+

1335

1391

`

`

1336

1392

`Name: text-box-trim

`

1337

1393

`Value: none | start | end | both

`

`@@ -1343,15 +1399,6 @@ Half-Leading Control: the 'text-box-trim' property

`

1343

1399

`Animation type: discrete

`

1344

1400

`

`

1345

1401

``

1346

``

`-

ISSUE: This is an early draft of a proposal,

`

1347

``

`-

and is likely to change significantly

`

1348

``

`-

as design critiques and use cases are registered.

`

1349

``

`-

Values and property names may be added, dropped, and/or renamed,

`

1350

``

`-

and the overall syntax or behavior may change,

`

1351

``

`-

particularly in response to authoring and robustness considerations

`

1352

``

`-

for handling descendant boxes.

`

1353

``

`-

Do not implement (yet).

`

1354

``

-

1355

1402

` On [=inline boxes=],

`

1356

1403

` specifies whether to trim the [=content box=]

`

1357

1404

` to match its corresponding 'text-box-edge' metric.

`

`@@ -1365,12 +1412,6 @@ Half-Leading Control: the 'text-box-trim' property

`

1365

1412

` to the corresponding 'text-box-edge' metric

`

1366

1413

` to better match the box’s [=content edge=] to its text content.

`

1367

1414

``

1368

``

`-

Note: Content and ink overflowing a box

`

1369

``

`-

due to non-initial values of 'text-box-trim'

`

1370

``

`-

is handled the same as content that would overflow the box or line box otherwise.

`

1371

``

-

1372

``

`-

This property has no effect when 'text-box-edge' is ''text-box-edge/leading''.

`

1373

``

-

1374

1415

` Values have the following meanings:

`

1375

1416

``

1376

1417

`

`

`@@ -1422,6 +1463,36 @@ Half-Leading Control: the 'text-box-trim' property

`

1422

1463

` Note: The [=block-end=] side does not coincide with the [=line-under=] side

`

1423

1464

` when 'writing-mode' is ''vertical-lr''.

`

1424

1465

``

``

1466

`+

Note: Content and ink overflowing a box

`

``

1467

`+

due to non-initial values of 'text-box-trim'

`

``

1468

`+

is handled the same as content that would overflow the box or line box otherwise.

`

``

1469

+

``

1470

`+

`

``

1471

`+

Text Trimming Metrics: the 'text-box-edge' property

`

``

1472

+

``

1473

`+


`

``

`1474`

`+

Name: text-box-edge

`

``

`1475`

`+

Value: auto | <>

`

``

`1476`

`+

Initial: auto

`

``

`1477`

`+

Applies to: [=block containers=] and [=inline boxes=]

`

``

`1478`

`+

Inherited: no

`

``

`1479`

`+

Percentages: N/A

`

``

`1480`

`+

Computed value: the specified keyword

`

``

`1481`

`+

Animation type: discrete

`

``

`1482`

`+

 

`

``

1483

+

``

1484

`+

This property specifies the metrics to use for 'text-box-trim' effects.

`

``

1485

`+

Values have the same meanings as for 'line-fit-edge';

`

``

1486

`+

the auto keyword

`

``

1487

`+

computes to the value of 'line-fit-edge',

`

``

1488

`+

interpreting ''line-fit-edge/leading'' (the [=initial value=]) as ''line-fit-edge/text''.

`

``

1489

+

``

1490

`+

Note: This property can be set together with 'text-box-trim'

`

``

1491

`+

in the 'text-box' [=shorthand=].

`

``

1492

`+

Unlike 'line-fit-edge', it does not inherit;

`

``

1493

`+

however its [=initial value=] copies from 'line-fit-edge',

`

``

1494

`+

which does inherit.

`

``

1495

+

1425

1496

`

`

1426

1497

`Inline Box Drawing Height: the 'inline-sizing' property

`

1427

1498

``

`@@ -1437,6 +1508,7 @@ Inline Box Drawing Height: the 'inline-sizing' property

`

1437

1508

`

`

1438

1509

``

1439

1510

` ISSUE(5189): This has a confusing name. We need a new name.

`

``

1511

`+

Alternatively, incorporate this into 'text-box-trim'?

`

1440

1512

``

1441

1513

` This property specifies how the logical height

`

1442

1514

` of the content area of an inline box

`

`@@ -2982,6 +3054,11 @@ Changes

`

2982

3054

` Changes since the

`

2983

3055

`1 April 2023 Working Draft:

`

2984

3056

`