1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Names this module's prose links to, resolved for rustdoc.
use crate::;
/// One labelled fact: what it is called, and what it says.
///
/// The definition-list pair every record screen has and no member named. Five
/// goingson panes were saying it as `list { row "Label" { meta value } }` --
/// the task pane's metadata, events, contacts, the mail reader and settings'
/// About -- and two of them carry a comment admitting the vocabulary had no
/// word for a definition list. The task pane's own doc calls a row "the nearest
/// thing the vocabulary has to a definition list", which is a workaround
/// describing itself.
///
/// # Why this is not a [`Column`] pair, or a one-row table
///
/// A table's columns are a promise about *many* rows: they earn their headings,
/// their sort, their narrowing rules and their floors because the same shape
/// repeats down the screen. A pane of facts has one of each, so every one of
/// those is machinery with nothing to do, and the heading row a table wants is
/// exactly what a facts pane must not draw.
///
/// The measured symptom, which is what makes this a member rather than a
/// preference: rendered as rows, each value starts after its own label, so
/// there is no value column and the eye cannot run down it. Four widths of a
/// ui-fuzz run found the same ragged edge on About, the event pane and the mail
/// reader.
///
/// # The rule a renderer owes it
///
/// **The values line up.** That is the whole point and the one thing a row list
/// cannot do: one label column wide enough for the longest label, every value
/// starting at the same place. A webview does it with a description list, a
/// terminal with two padded columns, egui with a two-column grid. None of them
/// may fall back to running the value straight after the label.
///
/// **The value is the fact and reads like one.** goingson had this backwards:
/// its values were drawn muted and its labels were not, so the part a person
/// came for was the quieter of the two. The label is the noun and reads back;
/// the value takes content. Same rule [`RowPart`] already states for a row's
/// primary against its meta, and the same one [`Figure`] states for a value
/// against its caption.
///
/// # What it is not
///
/// A form. A fact is read, not edited; the moment one of these needs to change
/// it is a `Field` and it belongs in a `form`. Nothing here carries a name to
/// submit under, deliberately, so the two cannot be confused at the call site.